ngx-materialize
Version:
An Angular wrap around Materialize library
373 lines (372 loc) • 32.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { ChangeDetectorRef, Directive, ElementRef, EventEmitter, Input, Output, Renderer, } from '@angular/core';
import { HandlePropChanges } from '../shared/index';
var MzSelectDirective = /** @class */ (function (_super) {
tslib_1.__extends(MzSelectDirective, _super);
function MzSelectDirective(elementRef, changeDetectorRef, renderer) {
var _this = _super.call(this) || this;
_this.elementRef = elementRef;
_this.changeDetectorRef = changeDetectorRef;
_this.renderer = renderer;
_this.update = new EventEmitter();
_this.suspend = false;
return _this;
}
Object.defineProperty(MzSelectDirective.prototype, "inputElement", {
get: /**
* @return {?}
*/
function () {
return this.selectElement.siblings('input.select-dropdown');
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
MzSelectDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.initHandlers();
this.initElements();
this.initOnChange();
this.handleProperties();
// must be done after handlePlaceholder
this.initSelectedOption();
// must be done after handleProperties
this.initMaterialSelect();
// must be done after initMaterialSelect
this.listenOptionChanges();
this.initFilledIn();
this.handleDOMEvents();
};
/**
* @return {?}
*/
MzSelectDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.renderer.invokeElementMethod(this.selectElement, 'material_select', ['destroy']);
this.selectElement.off();
this.mutationObserver.disconnect();
};
/**
* @return {?}
*/
MzSelectDirective.prototype.initHandlers = /**
* @return {?}
*/
function () {
var _this = this;
this.handlers = {
disabled: function () { return _this.handleDisabled(); },
label: function () { return _this.handleLabel(); },
placeholder: function () { return _this.handlePlaceholder(); },
};
};
/**
* @return {?}
*/
MzSelectDirective.prototype.initElements = /**
* @return {?}
*/
function () {
this.selectElement = $(this.elementRef.nativeElement);
this.selectContainerElement = $(this.elementRef.nativeElement).parents('.input-field');
this.labelElement = this.createLabelElement();
};
/**
* Need to be done after material_select has been invoked or else the multi-select
* options are not yet in the DOM as it loops on rendered options
*/
/**
* Need to be done after material_select has been invoked or else the multi-select
* options are not yet in the DOM as it loops on rendered options
* @return {?}
*/
MzSelectDirective.prototype.initFilledIn = /**
* Need to be done after material_select has been invoked or else the multi-select
* options are not yet in the DOM as it loops on rendered options
* @return {?}
*/
function () {
var _this = this;
this.checkboxElements = this.selectContainerElement.find(':checkbox');
this.handlers['filledIn'] = function () { return _this.handleFilledIn(); };
this.handleFilledIn();
};
/**
* @return {?}
*/
MzSelectDirective.prototype.initMaterialSelect = /**
* @return {?}
*/
function () {
this.renderer.invokeElementMethod(this.selectElement, 'material_select');
};
/**
* Trigger the native change event from select element instead of the JQuery.
* An issue on Github is open about this problem : https://github.com/Dogfalo/materialize/issues/2843
* This method should be removed when this issue is revolved.
*/
/**
* Trigger the native change event from select element instead of the JQuery.
* An issue on Github is open about this problem : https://github.com/Dogfalo/materialize/issues/2843
* This method should be removed when this issue is revolved.
* @return {?}
*/
MzSelectDirective.prototype.initOnChange = /**
* Trigger the native change event from select element instead of the JQuery.
* An issue on Github is open about this problem : https://github.com/Dogfalo/materialize/issues/2843
* This method should be removed when this issue is revolved.
* @return {?}
*/
function () {
var _this = this;
this.selectElement.on('change', function (event) {
if (!_this.suspend) {
_this.suspend = true;
var /** @type {?} */ customEvent = document.createEvent('CustomEvent');
customEvent.initCustomEvent('change', true, false, event.target.value);
_this.renderer.invokeElementMethod(_this.selectElement[0], 'dispatchEvent', [customEvent]);
}
});
// Stop the propagation of change event
this.selectElement[0].addEventListener('change', function () {
_this.suspend = false;
});
};
/**
* @return {?}
*/
MzSelectDirective.prototype.handleDOMEvents = /**
* @return {?}
*/
function () {
var _this = this;
this.inputElement.on('blur focus', function (event) {
var /** @type {?} */ customEvent = document.createEvent('CustomEvent');
customEvent.initCustomEvent(event.type, true, false, event.target);
_this.selectElement[0].dispatchEvent(customEvent);
});
};
/**
* @return {?}
*/
MzSelectDirective.prototype.createLabelElement = /**
* @return {?}
*/
function () {
var /** @type {?} */ labelElement = document.createElement('label');
labelElement.setAttribute('for', this.id);
this.renderer.invokeElementMethod(this.selectElement, 'after', [labelElement]);
return $(labelElement);
};
/**
* @return {?}
*/
MzSelectDirective.prototype.handleProperties = /**
* @return {?}
*/
function () {
if (this.selectContainerElement.length === 0) {
console.error('Select with mz-select directive must be place inside a [mz-select-container] tag', this.selectElement);
return;
}
_super.prototype.executePropHandlers.call(this);
};
/**
* @return {?}
*/
MzSelectDirective.prototype.initSelectedOption = /**
* @return {?}
*/
function () {
var /** @type {?} */ firstOptionElement = this.selectElement.children().first();
if (firstOptionElement.length > 0
&& this.selectElement.children('option[selected]').length === 0
&& !this.selectElement[0].hasAttribute('multiple')) {
this.renderer.setElementAttribute(firstOptionElement[0], 'selected', '');
}
};
/**
* @return {?}
*/
MzSelectDirective.prototype.handleDisabled = /**
* @return {?}
*/
function () {
// when disabled is null/undefined that means the property has not been used on the element
// but it might be set by another process (for example reactive form applies disabled attribute itself)
// therefore we don't want to remove or add it here
if (this.disabled != null) {
this.renderer.setElementProperty(this.selectElement[0], 'disabled', !!this.disabled);
this.updateMaterialSelect();
}
};
/**
* @return {?}
*/
MzSelectDirective.prototype.handleLabel = /**
* @return {?}
*/
function () {
if (this.label != null) {
this.renderer.invokeElementMethod(this.labelElement, 'text', [this.label]);
}
};
/**
* @return {?}
*/
MzSelectDirective.prototype.handleFilledIn = /**
* @return {?}
*/
function () {
var _this = this;
if (this.checkboxElements.length > 0) {
this.checkboxElements.toArray().forEach(function (checkboxElement) {
_this.renderer.setElementClass(checkboxElement, 'filled-in', !!_this.filledIn);
});
}
};
/**
* @return {?}
*/
MzSelectDirective.prototype.handlePlaceholder = /**
* @return {?}
*/
function () {
var /** @type {?} */ placeholderElement = this.selectElement.children(':disabled').first();
// if placeholder element exists
if (placeholderElement.length > 0) {
if (this.placeholder) {
// update existing placeholder element
this.renderer.invokeElementMethod(placeholderElement, 'text', [this.placeholder]);
}
else {
// remove existing placeholder element
this.renderer.invokeElementMethod(placeholderElement, 'remove');
// Force trigger change event since it's not triggered when value change programmatically
this.renderer.invokeElementMethod(this.selectElement, 'change');
// Required if we don't want exception "Expression has changed after it was checked." https://github.com/angular/angular/issues/6005
this.changeDetectorRef.detectChanges();
}
}
else {
if (this.placeholder) {
// add placeholder element
var /** @type {?} */ placeholderText = document.createTextNode(this.placeholder);
var /** @type {?} */ placeholderOption = document.createElement('option');
placeholderOption.disabled = true;
placeholderOption.value = null;
placeholderOption.appendChild(placeholderText);
this.renderer.invokeElementMethod(this.selectElement, 'prepend', [placeholderOption]);
}
}
this.initMaterialSelect();
};
/**
* @return {?}
*/
MzSelectDirective.prototype.listenOptionChanges = /**
* @return {?}
*/
function () {
var _this = this;
var /** @type {?} */ mutationObserverConfiguration = {
childList: true,
subtree: true,
};
this.mutationObserver = new MutationObserver(function (mutations) {
_this.updateMaterialSelect();
});
this.mutationObserver.observe(this.selectElement[0], mutationObserverConfiguration);
};
/**
* @return {?}
*/
MzSelectDirective.prototype.updateMaterialSelect = /**
* @return {?}
*/
function () {
var _this = this;
this.initMaterialSelect();
if (this.filledIn) {
this.initFilledIn();
}
this.handleDOMEvents();
// wait for materialize select to be initialized
// /!\ race condition warning /!\
setTimeout(function () { return _this.update.emit(); });
};
MzSelectDirective.decorators = [
{ type: Directive, args: [{
selector: 'select[mzSelect], select[mz-select]',
},] },
];
/** @nocollapse */
MzSelectDirective.ctorParameters = function () { return [
{ type: ElementRef, },
{ type: ChangeDetectorRef, },
{ type: Renderer, },
]; };
MzSelectDirective.propDecorators = {
"id": [{ type: Input },],
"disabled": [{ type: Input },],
"placeholder": [{ type: Input },],
"label": [{ type: Input },],
"filledIn": [{ type: Input },],
"update": [{ type: Output },],
};
return MzSelectDirective;
}(HandlePropChanges));
export { MzSelectDirective };
function MzSelectDirective_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
MzSelectDirective.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
MzSelectDirective.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
MzSelectDirective.propDecorators;
/** @type {?} */
MzSelectDirective.prototype.id;
/** @type {?} */
MzSelectDirective.prototype.disabled;
/** @type {?} */
MzSelectDirective.prototype.placeholder;
/** @type {?} */
MzSelectDirective.prototype.label;
/** @type {?} */
MzSelectDirective.prototype.filledIn;
/** @type {?} */
MzSelectDirective.prototype.update;
/** @type {?} */
MzSelectDirective.prototype.checkboxElements;
/** @type {?} */
MzSelectDirective.prototype.labelElement;
/** @type {?} */
MzSelectDirective.prototype.selectElement;
/** @type {?} */
MzSelectDirective.prototype.selectContainerElement;
/** @type {?} */
MzSelectDirective.prototype.mutationObserver;
/** @type {?} */
MzSelectDirective.prototype.suspend;
/** @type {?} */
MzSelectDirective.prototype.elementRef;
/** @type {?} */
MzSelectDirective.prototype.changeDetectorRef;
/** @type {?} */
MzSelectDirective.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tYXRlcmlhbGl6ZS8iLCJzb3VyY2VzIjpbInNyYy9zZWxlY3Qvc2VsZWN0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFDTixRQUFRLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7O0lBS2IsNkNBQWlCO0lBdUJ0RCwyQkFDVSxZQUNELG1CQUNBO1FBSFQsWUFLRSxpQkFBTyxTQUNSO1FBTFMsZ0JBQVUsR0FBVixVQUFVO1FBQ1gsdUJBQWlCLEdBQWpCLGlCQUFpQjtRQUNqQixjQUFRLEdBQVIsUUFBUTt1QkFqQkUsSUFBSSxZQUFZLEVBQUU7d0JBWTNCLEtBQUs7O0tBUWQ7SUFiRCxzQkFBSSwyQ0FBWTs7OztRQUFoQjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1NBQzdEOzs7T0FBQTs7OztJQWFELG9DQUFROzs7SUFBUjtRQUNFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztRQUd4QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs7UUFHMUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7O1FBRzFCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7S0FDeEI7Ozs7SUFFRCx1Q0FBVzs7O0lB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ICBEaXJlY3RpdmUsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPcHRpb25hbCxcclxuICBPdXRwdXQsXHJcbiAgUmVuZGVyZXIsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGZyb21FdmVudCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgSGFuZGxlUHJvcENoYW5nZXMgfSBmcm9tICcuLi9zaGFyZWQvaW5kZXgnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdzZWxlY3RbbXpTZWxlY3RdLCBzZWxlY3RbbXotc2VsZWN0XScsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNelNlbGVjdERpcmVjdGl2ZSBleHRlbmRzIEhhbmRsZVByb3BDaGFuZ2VzIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8vIG5hdGl2ZSBwcm9wZXJ0aWVzXHJcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xyXG5cclxuICAvLyBkaXJlY3RpdmUgcHJvcGVydGllc1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZmlsbGVkSW46IGJvb2xlYW47XHJcbiAgQE91dHB1dCgpIHVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgY2hlY2tib3hFbGVtZW50czogSlF1ZXJ5O1xyXG4gIGxhYmVsRWxlbWVudDogSlF1ZXJ5O1xyXG4gIHNlbGVjdEVsZW1lbnQ6IEpRdWVyeTtcclxuICBzZWxlY3RDb250YWluZXJFbGVtZW50OiBKUXVlcnk7XHJcblxyXG4gIGdldCBpbnB1dEVsZW1lbnQoKTogSlF1ZXJ5IHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdEVsZW1lbnQuc2libGluZ3MoJ2lucHV0LnNlbGVjdC1kcm9wZG93bicpO1xyXG4gIH1cclxuXHJcbiAgbXV0YXRpb25PYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcclxuICBzdXNwZW5kID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgcHVibGljIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHB1YmxpYyByZW5kZXJlcjogUmVuZGVyZXIsXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmluaXRIYW5kbGVycygpO1xyXG4gICAgdGhpcy5pbml0RWxlbWVudHMoKTtcclxuICAgIHRoaXMuaW5pdE9uQ2hhbmdlKCk7XHJcbiAgICB0aGlzLmhhbmRsZVByb3BlcnRpZXMoKTtcclxuXHJcbiAgICAvLyBtdXN0IGJlIGRvbmUgYWZ0ZXIgaGFuZGxlUGxhY2Vob2xkZXJcclxuICAgIHRoaXMuaW5pdFNlbGVjdGVkT3B0aW9uKCk7XHJcblxyXG4gICAgLy8gbXVzdCBiZSBkb25lIGFmdGVyIGhhbmRsZVByb3BlcnRpZXNcclxuICAgIHRoaXMuaW5pdE1hdGVyaWFsU2VsZWN0KCk7XHJcblxyXG4gICAgLy8gbXVzdCBiZSBkb25lIGFmdGVyIGluaXRNYXRlcmlhbFNlbGVjdFxyXG4gICAgdGhpcy5saXN0ZW5PcHRpb25DaGFuZ2VzKCk7XHJcbiAgICB0aGlzLmluaXRGaWxsZWRJbigpO1xyXG4gICAgdGhpcy5oYW5kbGVET01FdmVudHMoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKHRoaXMuc2VsZWN0RWxlbWVudCwgJ21hdGVyaWFsX3NlbGVjdCcsIFsnZGVzdHJveSddKTtcclxuICAgIHRoaXMuc2VsZWN0RWxlbWVudC5vZmYoKTtcclxuICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgfVxyXG5cclxuICBpbml0SGFuZGxlcnMoKSB7XHJcbiAgICB0aGlzLmhhbmRsZXJzID0ge1xyXG4gICAgICBkaXNhYmxlZDogKCkgPT4gdGhpcy5oYW5kbGVEaXNhYmxlZCgpLFxyXG4gICAgICBsYWJlbDogKCkgPT4gdGhpcy5oYW5kbGVMYWJlbCgpLFxyXG4gICAgICBwbGFjZWhvbGRlcjogKCkgPT4gdGhpcy5oYW5kbGVQbGFjZWhvbGRlcigpLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGluaXRFbGVtZW50cygpIHtcclxuICAgIHRoaXMuc2VsZWN0RWxlbWVudCA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgdGhpcy5zZWxlY3RDb250YWluZXJFbGVtZW50ID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkucGFyZW50cygnLmlucHV0LWZpZWxkJyk7XHJcbiAgICB0aGlzLmxhYmVsRWxlbWVudCA9IHRoaXMuY3JlYXRlTGFiZWxFbGVtZW50KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOZWVkIHRvIGJlIGRvbmUgYWZ0ZXIgbWF0ZXJpYWxfc2VsZWN0IGhhcyBiZWVuIGludm9rZWQgb3IgZWxzZSB0aGUgbXVsdGktc2VsZWN0XHJcbiAgICogb3B0aW9ucyBhcmUgbm90IHlldCBpbiB0aGUgRE9NIGFzIGl0IGxvb3BzIG9uIHJlbmRlcmVkIG9wdGlvbnNcclxuICAgKi9cclxuICBpbml0RmlsbGVkSW4oKSB7XHJcbiAgICB0aGlzLmNoZWNrYm94RWxlbWVudHMgPSB0aGlzLnNlbGVjdENvbnRhaW5lckVsZW1lbnQuZmluZCgnOmNoZWNrYm94Jyk7XHJcbiAgICB0aGlzLmhhbmRsZXJzWydmaWxsZWRJbiddID0gKCkgPT4gdGhpcy5oYW5kbGVGaWxsZWRJbigpO1xyXG4gICAgdGhpcy5oYW5kbGVGaWxsZWRJbigpO1xyXG4gIH1cclxuXHJcbiAgaW5pdE1hdGVyaWFsU2VsZWN0KCkge1xyXG4gICAgdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKHRoaXMuc2VsZWN0RWxlbWVudCwgJ21hdGVyaWFsX3NlbGVjdCcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJpZ2dlciB0aGUgbmF0aXZlIGNoYW5nZSBldmVudCBmcm9tIHNlbGVjdCBlbGVtZW50IGluc3RlYWQgb2YgdGhlIEpRdWVyeS5cclxuICAgKiBBbiBpc3N1ZSBvbiBHaXRodWIgaXMgb3BlbiBhYm91dCB0aGlzIHByb2JsZW0gOiBodHRwczovL2dpdGh1Yi5jb20vRG9nZmFsby9tYXRlcmlhbGl6ZS9pc3N1ZXMvMjg0M1xyXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSByZW1vdmVkIHdoZW4gdGhpcyBpc3N1ZSBpcyByZXZvbHZlZC5cclxuICAgKi9cclxuICBpbml0T25DaGFuZ2UoKSB7XHJcbiAgICB0aGlzLnNlbGVjdEVsZW1lbnQub24oJ2NoYW5nZScsIChldmVudDogYW55KSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5zdXNwZW5kKSB7XHJcbiAgICAgICAgdGhpcy5zdXNwZW5kID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcclxuICAgICAgICBjdXN0b21FdmVudC5pbml0Q3VzdG9tRXZlbnQoJ2NoYW5nZScsIHRydWUsIGZhbHNlLCBldmVudC50YXJnZXQudmFsdWUpO1xyXG5cclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5zZWxlY3RFbGVtZW50WzBdLCAnZGlzcGF0Y2hFdmVudCcsIFtjdXN0b21FdmVudF0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBTdG9wIHRoZSBwcm9wYWdhdGlvbiBvZiBjaGFuZ2UgZXZlbnRcclxuICAgIHRoaXMuc2VsZWN0RWxlbWVudFswXS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3VzcGVuZCA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVET01FdmVudHMoKSB7XHJcbiAgICB0aGlzLmlucHV0RWxlbWVudC5vbignYmx1ciBmb2N1cycsIChldmVudDogSlF1ZXJ5LkV2ZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XHJcbiAgICAgIGN1c3RvbUV2ZW50LmluaXRDdXN0b21FdmVudChldmVudC50eXBlLCB0cnVlLCBmYWxzZSwgZXZlbnQudGFyZ2V0KTtcclxuICAgICAgdGhpcy5zZWxlY3RFbGVtZW50WzBdLmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVMYWJlbEVsZW1lbnQoKSB7XHJcbiAgICBjb25zdCBsYWJlbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xyXG4gICAgbGFiZWxFbGVtZW50LnNldEF0dHJpYnV0ZSgnZm9yJywgdGhpcy5pZCk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKHRoaXMuc2VsZWN0RWxlbWVudCwgJ2FmdGVyJywgW2xhYmVsRWxlbWVudF0pO1xyXG5cclxuICAgIHJldHVybiAkKGxhYmVsRWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQcm9wZXJ0aWVzKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0Q29udGFpbmVyRWxlbWVudC5sZW5ndGggPT09IDApIHtcclxuICAgICAgY29uc29sZS5lcnJvcignU2VsZWN0IHdpdGggbXotc2VsZWN0IGRpcmVjdGl2ZSBtdXN0IGJlIHBsYWNlIGluc2lkZSBhIFttei1zZWxlY3QtY29udGFpbmVyXSB0YWcnLCB0aGlzLnNlbGVjdEVsZW1lbnQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBzdXBlci5leGVjdXRlUHJvcEhhbmRsZXJzKCk7XHJcbiAgfVxyXG5cclxuICBpbml0U2VsZWN0ZWRPcHRpb24oKSB7XHJcbiAgICBjb25zdCBmaXJzdE9wdGlvbkVsZW1lbnQgPSB0aGlzLnNlbGVjdEVsZW1lbnQuY2hpbGRyZW4oKS5maXJzdCgpO1xyXG4gICAgaWYgKGZpcnN0T3B0aW9uRWxlbWVudC5sZW5ndGggPiAwXHJcbiAgICAgICYmIHRoaXMuc2VsZWN0RWxlbWVudC5jaGlsZHJlbignb3B0aW9uW3NlbGVjdGVkXScpLmxlbmd0aCA9PT0gMFxyXG4gICAgICAmJiAhdGhpcy5zZWxlY3RFbGVtZW50WzBdLmhhc0F0dHJpYnV0ZSgnbXVsdGlwbGUnKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudEF0dHJpYnV0ZShmaXJzdE9wdGlvbkVsZW1lbnRbMF0sICdzZWxlY3RlZCcsICcnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZURpc2FibGVkKCkge1xyXG4gICAgLy8gd2hlbiBkaXNhYmxlZCBpcyBudWxsL3VuZGVmaW5lZCB0aGF0IG1lYW5zIHRoZSBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gdXNlZCBvbiB0aGUgZWxlbWVudFxyXG4gICAgLy8gYnV0IGl0IG1pZ2h0IGJlIHNldCBieSBhbm90aGVyIHByb2Nlc3MgKGZvciBleGFtcGxlIHJlYWN0aXZlIGZvcm0gYXBwbGllcyBkaXNhYmxlZCBhdHRyaWJ1dGUgaXRzZWxmKVxyXG4gICAgLy8gdGhlcmVmb3JlIHdlIGRvbid0IHdhbnQgdG8gcmVtb3ZlIG9yIGFkZCBpdCBoZXJlXHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudFByb3BlcnR5KHRoaXMuc2VsZWN0RWxlbWVudFswXSwgJ2Rpc2FibGVkJywgISF0aGlzLmRpc2FibGVkKTtcclxuICAgICAgdGhpcy51cGRhdGVNYXRlcmlhbFNlbGVjdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlTGFiZWwoKSB7XHJcbiAgICBpZiAodGhpcy5sYWJlbCAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuaW52b2tlRWxlbWVudE1ldGhvZCh0aGlzLmxhYmVsRWxlbWVudCwgJ3RleHQnLCBbdGhpcy5sYWJlbF0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRmlsbGVkSW4oKSB7XHJcbiAgICBpZiAodGhpcy5jaGVja2JveEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5jaGVja2JveEVsZW1lbnRzLnRvQXJyYXkoKS5mb3JFYWNoKGNoZWNrYm94RWxlbWVudCA9PiB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3MoY2hlY2tib3hFbGVtZW50LCAnZmlsbGVkLWluJywgISF0aGlzLmZpbGxlZEluKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQbGFjZWhvbGRlcigpIHtcclxuICAgIGNvbnN0IHBsYWNlaG9sZGVyRWxlbWVudCA9IHRoaXMuc2VsZWN0RWxlbWVudC5jaGlsZHJlbignOmRpc2FibGVkJykuZmlyc3QoKTtcclxuXHJcbiAgICAvLyBpZiBwbGFjZWhvbGRlciBlbGVtZW50IGV4aXN0c1xyXG4gICAgaWYgKHBsYWNlaG9sZGVyRWxlbWVudC5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICBpZiAodGhpcy5wbGFjZWhvbGRlcikge1xyXG4gICAgICAgIC8vIHVwZGF0ZSBleGlzdGluZyBwbGFjZWhvbGRlciBlbGVtZW50XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKHBsYWNlaG9sZGVyRWxlbWVudCwgJ3RleHQnLCBbdGhpcy5wbGFjZWhvbGRlcl0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIHJlbW92ZSBleGlzdGluZyBwbGFjZWhvbGRlciBlbGVtZW50XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKHBsYWNlaG9sZGVyRWxlbWVudCwgJ3JlbW92ZScpO1xyXG4gICAgICAgIC8vIEZvcmNlIHRyaWdnZXIgY2hhbmdlIGV2ZW50IHNpbmNlIGl0J3Mgbm90IHRyaWdnZXJlZCB3aGVuIHZhbHVlIGNoYW5nZSBwcm9ncmFtbWF0aWNhbGx5XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKHRoaXMuc2VsZWN0RWxlbWVudCwgJ2NoYW5nZScpO1xyXG4gICAgICAgIC8vIFJlcXVpcmVkIGlmIHdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIFwiRXhwcmVzc2lvbiBoYXMgY2hhbmdlZCBhZnRlciBpdCB3YXMgY2hlY2tlZC5cIiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy82MDA1XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyKSB7XHJcbiAgICAgICAgLy8gYWRkIHBsYWNlaG9sZGVyIGVsZW1lbnRcclxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlclRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLnBsYWNlaG9sZGVyKTtcclxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlck9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xyXG4gICAgICAgIHBsYWNlaG9sZGVyT3B0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICBwbGFjZWhvbGRlck9wdGlvbi52YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgcGxhY2Vob2xkZXJPcHRpb24uYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXJUZXh0KTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKHRoaXMuc2VsZWN0RWxlbWVudCwgJ3ByZXBlbmQnLCBbcGxhY2Vob2xkZXJPcHRpb25dKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5pdE1hdGVyaWFsU2VsZWN0KCk7XHJcbiAgfVxyXG5cclxuICBsaXN0ZW5PcHRpb25DaGFuZ2VzKCkge1xyXG4gICAgY29uc3QgbXV0YXRpb25PYnNlcnZlckNvbmZpZ3VyYXRpb246IE11dGF0aW9uT2JzZXJ2ZXJJbml0ID0ge1xyXG4gICAgICBjaGlsZExpc3Q6IHRydWUsXHJcbiAgICAgIHN1YnRyZWU6IHRydWUsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMubXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnM6IE11dGF0aW9uUmVjb3JkW10pID0+IHtcclxuICAgICAgdGhpcy51cGRhdGVNYXRlcmlhbFNlbGVjdCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy5zZWxlY3RFbGVtZW50WzBdLCBtdXRhdGlvbk9ic2VydmVyQ29uZmlndXJhdGlvbik7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVNYXRlcmlhbFNlbGVjdCgpIHtcclxuICAgIHRoaXMuaW5pdE1hdGVyaWFsU2VsZWN0KCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZmlsbGVkSW4pIHtcclxuICAgICAgdGhpcy5pbml0RmlsbGVkSW4oKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmhhbmRsZURPTUV2ZW50cygpO1xyXG5cclxuICAgIC8vIHdhaXQgZm9yIG1hdGVyaWFsaXplIHNlbGVjdCB0byBiZSBpbml0aWFsaXplZFxyXG4gICAgLy8gLyFcXCByYWNlIGNvbmRpdGlvbiB3YXJuaW5nIC8hXFxcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGUuZW1pdCgpKTtcclxuICB9XHJcbn1cclxuIl19