igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
202 lines • 18.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Inject, Injectable, NgZone } from '@angular/core';
import { DOCUMENT, ɵgetDOM as getDOM } from '@angular/platform-browser';
/** @type {?} */
const EVENT_SUFFIX = 'precise';
/**
* Touch gestures manager based on Hammer.js
* Use with caution, this will track references for single manager per element. Very TBD. Much TODO.
* @hidden
*/
export class HammerGesturesManager {
/**
* @param {?} _zone
* @param {?} doc
*/
constructor(_zone, doc) {
this._zone = _zone;
this.doc = doc;
/**
* Event option defaults for each recognizer, see http://hammerjs.github.io/api/ for API listing.
*/
this.hammerOptions = {
// D.P. #447 Force TouchInput due to PointerEventInput bug (https://github.com/hammerjs/hammer.js/issues/1065)
// see https://github.com/IgniteUI/igniteui-angular/issues/447#issuecomment-324601803
inputClass: Hammer.TouchInput,
recognizers: [
[Hammer.Pan, { threshold: 0 }],
[Hammer.Pinch, { enable: true }],
[Hammer.Rotate, { enable: true }],
[Hammer.Swipe, {
direction: Hammer.DIRECTION_HORIZONTAL
}]
]
};
this._hammerManagers = [];
}
/**
* @param {?} eventName
* @return {?}
*/
supports(eventName) {
return eventName.toLowerCase().endsWith('.' + EVENT_SUFFIX);
}
/**
* Add listener extended with options for Hammer.js. Will use defaults if none are provided.
* Modeling after other event plugins for easy future modifications.
* @param {?} element
* @param {?} eventName
* @param {?} eventHandler
* @param {?=} options
* @return {?}
*/
addEventListener(element, eventName, eventHandler, options = null) {
// Creating the manager bind events, must be done outside of angular
return this._zone.runOutsideAngular(() => {
/** @type {?} */
let mc = this.getManagerForElement(element);
if (mc === null) {
// new Hammer is a shortcut for Manager with defaults
mc = new Hammer(element, this.hammerOptions);
this.addManagerForElement(element, mc);
}
/** @type {?} */
const handler = (eventObj) => { this._zone.run(() => { eventHandler(eventObj); }); };
mc.on(eventName, handler);
return () => { mc.off(eventName, handler); };
});
}
/**
* Add listener extended with options for Hammer.js. Will use defaults if none are provided.
* Modeling after other event plugins for easy future modifications.
*
* @param {?} target Can be one of either window, body or document(fallback default).
* @param {?} eventName
* @param {?} eventHandler
* @return {?}
*/
addGlobalEventListener(target, eventName, eventHandler) {
/** @type {?} */
const element = this.getGlobalEventTarget(target);
// Creating the manager bind events, must be done outside of angular
return this.addEventListener((/** @type {?} */ (element)), eventName, eventHandler);
}
/**
* Exposes [Dom]Adapter.getGlobalEventTarget to get global event targets.
* Supported: window, document, body. Defaults to document for invalid args.
* @param {?} target Target name
* @return {?}
*/
getGlobalEventTarget(target) {
return getDOM().getGlobalEventTarget(this.doc, target);
}
/**
* Set HammerManager options.
*
* @param {?} element The DOM element used to create the manager on.
*
* ### Example
*
* ```ts
* manager.setManagerOption(myElem, "pan", { pointers: 1 });
* ```
* @param {?} event
* @param {?} options
* @return {?}
*/
setManagerOption(element, event, options) {
/** @type {?} */
const manager = this.getManagerForElement(element);
manager.get(event).set(options);
}
/**
* Add an element and manager map to the internal collection.
*
* @param {?} element The DOM element used to create the manager on.
* @param {?} manager
* @return {?}
*/
addManagerForElement(element, manager) {
this._hammerManagers.push({ element, manager });
}
/**
* Get HammerManager for the element or null
*
* @param {?} element The DOM element used to create the manager on.
* @return {?}
*/
getManagerForElement(element) {
/** @type {?} */
const result = this._hammerManagers.filter((value, index, array) => {
return value.element === element;
});
return result.length ? result[0].manager : null;
}
/**
* Destroys the HammerManager for the element, removing event listeners in the process.
*
* @param {?} element The DOM element used to create the manager on.
* @return {?}
*/
removeManagerForElement(element) {
/** @type {?} */
let index = null;
for (let i = 0; i < this._hammerManagers.length; i++) {
if (element === this._hammerManagers[i].element) {
index = i;
break;
}
}
if (index !== null) {
/** @type {?} */
const item = this._hammerManagers.splice(index, 1)[0];
// destroy also
item.manager.destroy();
}
}
/**
* Destroys all internally tracked HammerManagers, removing event listeners in the process.
* @return {?}
*/
destroy() {
for (const item of this._hammerManagers) {
item.manager.destroy();
}
this._hammerManagers = [];
}
}
HammerGesturesManager.decorators = [
{ type: Injectable }
];
/** @nocollapse */
HammerGesturesManager.ctorParameters = () => [
{ type: NgZone },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
];
if (false) {
/**
* Event option defaults for each recognizer, see http://hammerjs.github.io/api/ for API listing.
* @type {?}
* @protected
*/
HammerGesturesManager.prototype.hammerOptions;
/**
* @type {?}
* @private
*/
HammerGesturesManager.prototype._hammerManagers;
/**
* @type {?}
* @private
*/
HammerGesturesManager.prototype._zone;
/**
* @type {?}
* @private
*/
HammerGesturesManager.prototype.doc;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG91Y2guanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2NvcmUvdG91Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sSUFBSSxNQUFNLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7TUFFbEUsWUFBWSxHQUFHLFNBQVM7Ozs7OztBQVE5QixNQUFNLE9BQU8scUJBQXFCOzs7OztJQW9COUIsWUFBb0IsS0FBYSxFQUE0QixHQUFRO1FBQWpELFVBQUssR0FBTCxLQUFLLENBQVE7UUFBNEIsUUFBRyxHQUFILEdBQUcsQ0FBSzs7OztRQWhCM0Qsa0JBQWEsR0FBa0I7OztZQUdyQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7WUFDN0IsV0FBVyxFQUFFO2dCQUNULENBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBRTtnQkFDaEMsQ0FBRSxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFFO2dCQUNsQyxDQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUU7Z0JBQ25DLENBQUUsTUFBTSxDQUFDLEtBQUssRUFBRTt3QkFDWixTQUFTLEVBQUUsTUFBTSxDQUFDLG9CQUFvQjtxQkFDekMsQ0FBQzthQUNMO1NBQ0osQ0FBQztRQUVNLG9CQUFlLEdBQTZELEVBQUUsQ0FBQztJQUd2RixDQUFDOzs7OztJQUVNLFFBQVEsQ0FBQyxTQUFpQjtRQUM3QixPQUFPLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBQ2hFLENBQUM7Ozs7Ozs7Ozs7SUFNTSxnQkFBZ0Is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Q1Q7U0FDSjtRQUNELElBQUksS0FBSyxLQUFLLElBQUksRUFBRTs7a0JBQ1YsSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsZUFBZTtZQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDMUI7SUFDTCxDQUFDOzs7OztJQUdNLE9BQU87UUFDVixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMxQjtRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzlCLENBQUM7OztZQXhJSixVQUFVOzs7O1lBVmtCLE1BQU07NENBK0JLLE1BQU0sU0FBQyxRQUFROzs7Ozs7OztJQWhCbkQsOENBWUU7Ozs7O0lBRUYsZ0RBQXVGOzs7OztJQUUzRSxzQ0FBcUI7Ozs7O0lBQUUsb0NBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERPQ1VNRU5ULCDJtWdldERPTSBhcyBnZXRET00gfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcblxuY29uc3QgRVZFTlRfU1VGRklYID0gJ3ByZWNpc2UnO1xuXG4vKipcbiAqIFRvdWNoIGdlc3R1cmVzIG1hbmFnZXIgYmFzZWQgb24gSGFtbWVyLmpzXG4gKiBVc2Ugd2l0aCBjYXV0aW9uLCB0aGlzIHdpbGwgdHJhY2sgcmVmZXJlbmNlcyBmb3Igc2luZ2xlIG1hbmFnZXIgcGVyIGVsZW1lbnQuIFZlcnkgVEJELiBNdWNoIFRPRE8uXG4gKiBAaGlkZGVuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBIYW1tZXJHZXN0dXJlc01hbmFnZXIge1xuICAgIC8qKlxuICAgICAqIEV2ZW50IG9wdGlvbiBkZWZhdWx0cyBmb3IgZWFjaCByZWNvZ25pemVyLCBzZWUgaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby9hcGkvIGZvciBBUEkgbGlzdGluZy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFtbWVyT3B0aW9uczogSGFtbWVyT3B0aW9ucyA9IHtcbiAgICAgICAgLy8gRC5QLiAjNDQ3IEZvcmNlIFRvdWNoSW5wdXQgZHVlIHRvIFBvaW50ZXJFdmVudElucHV0IGJ1ZyAoaHR0cHM6Ly9naXRodWIuY29tL2hhbW1lcmpzL2hhbW1lci5qcy9pc3N1ZXMvMTA2NSlcbiAgICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9JZ25pdGVVSS9pZ25pdGV1aS1hbmd1bGFyL2lzc3Vlcy80NDcjaXNzdWVjb21tZW50LTMyNDYwMTgwM1xuICAgICAgICBpbnB1dENsYXNzOiBIYW1tZXIuVG91Y2hJbnB1dCxcbiAgICAgICAgcmVjb2duaXplcnM6IFtcbiAgICAgICAgICAgIFsgSGFtbWVyLlBhbiwgeyB0aHJlc2hvbGQ6IDAgfSBdLFxuICAgICAgICAgICAgWyBIYW1tZXIuUGluY2gsIHsgZW5hYmxlOiB0cnVlIH0gXSxcbiAgICAgICAgICAgIFsgSGFtbWVyLlJvdGF0ZSwgeyBlbmFibGU6IHRydWUgfSBdLFxuICAgICAgICAgICAgWyBIYW1tZXIuU3dpcGUsIHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IEhhbW1lci5ESVJFQ1RJT05fSE9SSVpPTlRBTFxuICAgICAgICAgICAgfV1cbiAgICAgICAgXVxuICAgIH07XG5cbiAgICBwcml2YXRlIF9oYW1tZXJNYW5hZ2VyczogQXJyYXk8eyBlbGVtZW50OiBFdmVudFRhcmdldCwgbWFuYWdlcjogSGFtbWVyTWFuYWdlcjsgfT4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX3pvbmU6IE5nWm9uZSwgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2M6IGFueSkge1xuICAgIH1cblxuICAgIHB1YmxpYyBzdXBwb3J0cyhldmVudE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy4nICsgRVZFTlRfU1VGRklYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgbGlzdGVuZXIgZXh0ZW5kZWQgd2l0aCBvcHRpb25zIGZvciBIYW1tZXIuanMuIFdpbGwgdXNlIGRlZmF1bHRzIGlmIG5vbmUgYXJlIHByb3ZpZGVkLlxuICAgICAqIE1vZGVsaW5nIGFmdGVyIG90aGVyIGV2ZW50IHBsdWdpbnMgZm9yIGVhc3kgZnV0dXJlIG1vZGlmaWNhdGlvbnMuXG4gICAgICovXG4gICAgcHVibGljIGFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRIYW5kbGVyOiAoZXZlbnRPYmopID0+IHZvaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogb2JqZWN0ID0gbnVsbCk6ICgpID0+IHZvaWQge1xuXG4gICAgICAgIC8vIENyZWF0aW5nIHRoZSBtYW5hZ2VyIGJpbmQgZXZlbnRzLCBtdXN0IGJlIGRvbmUgb3V0c2lkZSBvZiBhbmd1bGFyXG4gICAgICAgIHJldHVybiB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtYzogSGFtbWVyTWFuYWdlciA9IHRoaXMuZ2V0TWFuYWdlckZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICBpZiAobWMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBuZXcgSGFtbWVyIGlzIGEgc2hvcnRjdXQgZm9yIE1hbmFnZXIgd2l0aCBkZWZhdWx0c1xuICAgICAgICAgICAgICAgIG1jID0gbmV3IEhhbW1lcihlbGVtZW50LCB0aGlzLmhhbW1lck9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkTWFuYWdlckZvckVsZW1lbnQoZWxlbWVudCwgbWMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChldmVudE9iaikgPT4geyB0aGlzLl96b25lLnJ1bigoKSA9PiB7IGV2ZW50SGFuZGxlcihldmVudE9iaik7IH0pOyB9O1xuICAgICAgICAgICAgbWMub24oZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7IG1jLm9mZihldmVudE5hbWUsIGhhbmRsZXIpOyB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgbGlzdGVuZXIgZXh0ZW5kZWQgd2l0aCBvcHRpb25zIGZvciBIYW1tZXIuanMuIFdpbGwgdXNlIGRlZmF1bHRzIGlmIG5vbmUgYXJlIHByb3ZpZGVkLlxuICAgICAqIE1vZGVsaW5nIGFmdGVyIG90aGVyIGV2ZW50IHBsdWdpbnMgZm9yIGVhc3kgZnV0dXJlIG1vZGlmaWNhdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IENhbiBiZSBvbmUgb2YgZWl0aGVyIHdpbmRvdywgYm9keSBvciBkb2N1bWVudChmYWxsYmFjayBkZWZhdWx0KS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkR2xvYmFsRXZlbnRMaXN0ZW5lcih0YXJnZXQ6IHN0cmluZywgZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50SGFuZGxlcjogKGV2ZW50T2JqKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEdsb2JhbEV2ZW50VGFyZ2V0KHRhcmdldCk7XG5cbiAgICAgICAgLy8gQ3JlYXRpbmcgdGhlIG1hbmFnZXIgYmluZCBldmVudHMsIG11c3QgYmUgZG9uZSBvdXRzaWRlIG9mIGFuZ3VsYXJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50IGFzIEhUTUxFbGVtZW50LCBldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhwb3NlcyBbRG9tXUFkYXB0ZXIuZ2V0R2xvYmFsRXZlbnRUYXJnZXQgdG8gZ2V0IGdsb2JhbCBldmVudCB0YXJnZXRzLlxuICAgICAqIFN1cHBvcnRlZDogd2luZG93LCBkb2N1bWVudCwgYm9keS4gRGVmYXVsdHMgdG8gZG9jdW1lbnQgZm9yIGludmFsaWQgYXJncy5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0IFRhcmdldCBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGdldEdsb2JhbEV2ZW50VGFyZ2V0KHRhcmdldDogc3RyaW5nKTogRXZlbnRUYXJnZXQge1xuICAgICAgICByZXR1cm4gZ2V0RE9NKCkuZ2V0R2xvYmFsRXZlbnRUYXJnZXQodGhpcy5kb2MsIHRhcmdldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IEhhbW1lck1hbmFnZXIgb3B0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBET00gZWxlbWVudCB1c2VkIHRvIGNyZWF0ZSB0aGUgbWFuYWdlciBvbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIG1hbmFnZXIuc2V0TWFuYWdlck9wdGlvbihteUVsZW0sIFwicGFuXCIsIHsgcG9pbnRlcnM6IDEgfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldE1hbmFnZXJPcHRpb24oZWxlbWVudDogRXZlbnRUYXJnZXQsIGV2ZW50OiBzdHJpbmcsIG9wdGlvbnM6IGFueSkge1xuICAgICAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5nZXRNYW5hZ2VyRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgbWFuYWdlci5nZXQoZXZlbnQpLnNldChvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYW4gZWxlbWVudCBhbmQgbWFuYWdlciBtYXAgdG8gdGhlIGludGVybmFsIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgRE9NIGVsZW1lbnQgdXNlZCB0byBjcmVhdGUgdGhlIG1hbmFnZXIgb24uXG4gICAgICovXG4gICAgcHVibGljIGFkZE1hbmFnZXJGb3JFbGVtZW50KGVsZW1lbnQ6IEV2ZW50VGFyZ2V0LCBtYW5hZ2VyOiBIYW1tZXJNYW5hZ2VyKSB7XG4gICAgICAgIHRoaXMuX2hhbW1lck1hbmFnZXJzLnB1c2goe2VsZW1lbnQsIG1hbmFnZXJ9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgSGFtbWVyTWFuYWdlciBmb3IgdGhlIGVsZW1lbnQgb3IgbnVsbFxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIERPTSBlbGVtZW50IHVzZWQgdG8gY3JlYXRlIHRoZSBtYW5hZ2VyIG9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNYW5hZ2VyRm9yRWxlbWVudChlbGVtZW50OiBFdmVudFRhcmdldCk6IEhhbW1lck1hbmFnZXIge1xuICAgICAgICBjb25zdCByZXN1bHQgPSAgdGhpcy5faGFtbWVyTWFuYWdlcnMuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIGFycmF5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuZWxlbWVudCA9PT0gZWxlbWVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID8gcmVzdWx0WzBdLm1hbmFnZXIgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoZSBIYW1tZXJNYW5hZ2VyIGZvciB0aGUgZWxlbWVudCwgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzIGluIHRoZSBwcm9jZXNzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIERPTSBlbGVtZW50IHVzZWQgdG8gY3JlYXRlIHRoZSBtYW5hZ2VyIG9uLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVNYW5hZ2VyRm9yRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICBsZXQgaW5kZXg6IG51bWJlciA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5faGFtbWVyTWFuYWdlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50ID09PSB0aGlzLl9oYW1tZXJNYW5hZ2Vyc1tpXS5lbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hhbW1lck1hbmFnZXJzLnNwbGljZShpbmRleCwgMSlbMF07XG4gICAgICAgICAgICAvLyBkZXN0cm95IGFsc29cbiAgICAgICAgICAgIGl0ZW0ubWFuYWdlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRGVzdHJveXMgYWxsIGludGVybmFsbHkgdHJhY2tlZCBIYW1tZXJNYW5hZ2VycywgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzIGluIHRoZSBwcm9jZXNzLiAqL1xuICAgIHB1YmxpYyBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5faGFtbWVyTWFuYWdlcnMpIHtcbiAgICAgICAgICAgIGl0ZW0ubWFuYWdlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faGFtbWVyTWFuYWdlcnMgPSBbXTtcbiAgICB9XG59XG4iXX0=