UNPKG

ngx-materialize

Version:

An Angular wrap around Materialize library

297 lines (296 loc) 29.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { ChangeDetectorRef, Directive, ElementRef, EventEmitter, Input, Output, Renderer, } from '@angular/core'; import { HandlePropChanges } from '../shared/index'; export class MzSelectDirective extends HandlePropChanges { /** * @param {?} elementRef * @param {?} changeDetectorRef * @param {?} renderer */ constructor(elementRef, changeDetectorRef, renderer) { super(); this.elementRef = elementRef; this.changeDetectorRef = changeDetectorRef; this.renderer = renderer; this.update = new EventEmitter(); this.suspend = false; } /** * @return {?} */ get inputElement() { return this.selectElement.siblings('input.select-dropdown'); } /** * @return {?} */ ngOnInit() { 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 {?} */ ngOnDestroy() { this.renderer.invokeElementMethod(this.selectElement, 'material_select', ['destroy']); this.selectElement.off(); this.mutationObserver.disconnect(); } /** * @return {?} */ initHandlers() { this.handlers = { disabled: () => this.handleDisabled(), label: () => this.handleLabel(), placeholder: () => this.handlePlaceholder(), }; } /** * @return {?} */ initElements() { 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 * @return {?} */ initFilledIn() { this.checkboxElements = this.selectContainerElement.find(':checkbox'); this.handlers['filledIn'] = () => this.handleFilledIn(); this.handleFilledIn(); } /** * @return {?} */ initMaterialSelect() { 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. * @return {?} */ initOnChange() { this.selectElement.on('change', (event) => { if (!this.suspend) { this.suspend = true; const /** @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', () => { this.suspend = false; }); } /** * @return {?} */ handleDOMEvents() { this.inputElement.on('blur focus', (event) => { const /** @type {?} */ customEvent = document.createEvent('CustomEvent'); customEvent.initCustomEvent(event.type, true, false, event.target); this.selectElement[0].dispatchEvent(customEvent); }); } /** * @return {?} */ createLabelElement() { const /** @type {?} */ labelElement = document.createElement('label'); labelElement.setAttribute('for', this.id); this.renderer.invokeElementMethod(this.selectElement, 'after', [labelElement]); return $(labelElement); } /** * @return {?} */ handleProperties() { 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.executePropHandlers(); } /** * @return {?} */ initSelectedOption() { const /** @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 {?} */ handleDisabled() { // 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 {?} */ handleLabel() { if (this.label != null) { this.renderer.invokeElementMethod(this.labelElement, 'text', [this.label]); } } /** * @return {?} */ handleFilledIn() { if (this.checkboxElements.length > 0) { this.checkboxElements.toArray().forEach(checkboxElement => { this.renderer.setElementClass(checkboxElement, 'filled-in', !!this.filledIn); }); } } /** * @return {?} */ handlePlaceholder() { const /** @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 const /** @type {?} */ placeholderText = document.createTextNode(this.placeholder); const /** @type {?} */ placeholderOption = document.createElement('option'); placeholderOption.disabled = true; placeholderOption.value = null; placeholderOption.appendChild(placeholderText); this.renderer.invokeElementMethod(this.selectElement, 'prepend', [placeholderOption]); } } this.initMaterialSelect(); } /** * @return {?} */ listenOptionChanges() { const /** @type {?} */ mutationObserverConfiguration = { childList: true, subtree: true, }; this.mutationObserver = new MutationObserver((mutations) => { this.updateMaterialSelect(); }); this.mutationObserver.observe(this.selectElement[0], mutationObserverConfiguration); } /** * @return {?} */ updateMaterialSelect() { this.initMaterialSelect(); if (this.filledIn) { this.initFilledIn(); } this.handleDOMEvents(); // wait for materialize select to be initialized // /!\ race condition warning /!\ setTimeout(() => this.update.emit()); } } MzSelectDirective.decorators = [ { type: Directive, args: [{ selector: 'select[mzSelect], select[mz-select]', },] }, ]; /** @nocollapse */ MzSelectDirective.ctorParameters = () => [ { 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 },], }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tYXRlcmlhbGl6ZS8iLCJzb3VyY2VzIjpbInNyYy9zZWxlY3Qvc2VsZWN0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUNOLFFBQVEsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUtwRCxNQUFNLHdCQUF5QixTQUFRLGlCQUFpQjs7Ozs7O0lBdUJ0RCxZQUNVLFlBQ0QsbUJBQ0E7UUFFUCxLQUFLLEVBQUUsQ0FBQztRQUpBLGVBQVUsR0FBVixVQUFVO1FBQ1gsc0JBQWlCLEdBQWpCLGlCQUFpQjtRQUNqQixhQUFRLEdBQVIsUUFBUTtzQkFqQkUsSUFBSSxZQUFZLEVBQUU7dUJBWTNCLEtBQUs7S0FRZDs7OztJQWJELElBQUksWUFBWTtRQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0tBQzdEOzs7O0lBYUQsUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztRQUd4QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs7UUFHMUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7O1FBRzFCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7S0FDeEI7Ozs7SUFFRCxXQUFXO1FBQ1QsSUFBSSxD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QUFHLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxTQUEyQixFQUFFLEVBQUU7WUFDM0UsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLDZCQUE2QixDQUFDLENBQUM7S0FDckY7Ozs7SUFFRCxvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFMUIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDOzs7UUFJdkIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztLQUN0Qzs7O1lBbE9GLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUscUNBQXFDO2FBQ2hEOzs7O1lBZkMsVUFBVTtZQUZWLGlCQUFpQjtZQVNqQixRQUFROzs7bUJBV1AsS0FBSzt5QkFDTCxLQUFLOzRCQUNMLEtBQUs7c0JBR0wsS0FBSzt5QkFDTCxLQUFLO3VCQUNMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIE91dHB1dCxcclxuICBSZW5kZXJlcixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBIYW5kbGVQcm9wQ2hhbmdlcyB9IGZyb20gJy4uL3NoYXJlZC9pbmRleCc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ3NlbGVjdFttelNlbGVjdF0sIHNlbGVjdFttei1zZWxlY3RdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE16U2VsZWN0RGlyZWN0aXZlIGV4dGVuZHMgSGFuZGxlUHJvcENoYW5nZXMgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgLy8gbmF0aXZlIHByb3BlcnRpZXNcclxuICBASW5wdXQoKSBpZDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XHJcblxyXG4gIC8vIGRpcmVjdGl2ZSBwcm9wZXJ0aWVzXHJcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcclxuICBASW5wdXQoKSBmaWxsZWRJbjogYm9vbGVhbjtcclxuICBAT3V0cHV0KCkgdXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBjaGVja2JveEVsZW1lbnRzOiBKUXVlcnk7XHJcbiAgbGFiZWxFbGVtZW50OiBKUXVlcnk7XHJcbiAgc2VsZWN0RWxlbWVudDogSlF1ZXJ5O1xyXG4gIHNlbGVjdENvbnRhaW5lckVsZW1lbnQ6IEpRdWVyeTtcclxuXHJcbiAgZ2V0IGlucHV0RWxlbWVudCgpOiBKUXVlcnkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0RWxlbWVudC5zaWJsaW5ncygnaW5wdXQuc2VsZWN0LWRyb3Bkb3duJyk7XHJcbiAgfVxyXG5cclxuICBtdXRhdGlvbk9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xyXG4gIHN1c3BlbmQgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwdWJsaWMgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcixcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuaW5pdEhhbmRsZXJzKCk7XHJcbiAgICB0aGlzLmluaXRFbGVtZW50cygpO1xyXG4gICAgdGhpcy5pbml0T25DaGFuZ2UoKTtcclxuICAgIHRoaXMuaGFuZGxlUHJvcGVydGllcygpO1xyXG5cclxuICAgIC8vIG11c3QgYmUgZG9uZSBhZnRlciBoYW5kbGVQbGFjZWhvbGRlclxyXG4gICAgdGhpcy5pbml0U2VsZWN0ZWRPcHRpb24oKTtcclxuXHJcbiAgICAvLyBtdXN0IGJlIGRvbmUgYWZ0ZXIgaGFuZGxlUHJvcGVydGllc1xyXG4gICAgdGhpcy5pbml0TWF0ZXJpYWxTZWxlY3QoKTtcclxuXHJcbiAgICAvLyBtdXN0IGJlIGRvbmUgYWZ0ZXIgaW5pdE1hdGVyaWFsU2VsZWN0XHJcbiAgICB0aGlzLmxpc3Rlbk9wdGlvbkNoYW5nZXMoKTtcclxuICAgIHRoaXMuaW5pdEZpbGxlZEluKCk7XHJcbiAgICB0aGlzLmhhbmRsZURPTUV2ZW50cygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5zZWxlY3RFbGVtZW50LCAnbWF0ZXJpYWxfc2VsZWN0JywgWydkZXN0cm95J10pO1xyXG4gICAgdGhpcy5zZWxlY3RFbGVtZW50Lm9mZigpO1xyXG4gICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICB9XHJcblxyXG4gIGluaXRIYW5kbGVycygpIHtcclxuICAgIHRoaXMuaGFuZGxlcnMgPSB7XHJcbiAgICAgIGRpc2FibGVkOiAoKSA9PiB0aGlzLmhhbmRsZURpc2FibGVkKCksXHJcbiAgICAgIGxhYmVsOiAoKSA9PiB0aGlzLmhhbmRsZUxhYmVsKCksXHJcbiAgICAgIHBsYWNlaG9sZGVyOiAoKSA9PiB0aGlzLmhhbmRsZVBsYWNlaG9sZGVyKCksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgaW5pdEVsZW1lbnRzKCkge1xyXG4gICAgdGhpcy5zZWxlY3RFbGVtZW50ID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XHJcbiAgICB0aGlzLnNlbGVjdENvbnRhaW5lckVsZW1lbnQgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5wYXJlbnRzKCcuaW5wdXQtZmllbGQnKTtcclxuICAgIHRoaXMubGFiZWxFbGVtZW50ID0gdGhpcy5jcmVhdGVMYWJlbEVsZW1lbnQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5lZWQgdG8gYmUgZG9uZSBhZnRlciBtYXRlcmlhbF9zZWxlY3QgaGFzIGJlZW4gaW52b2tlZCBvciBlbHNlIHRoZSBtdWx0aS1zZWxlY3RcclxuICAgKiBvcHRpb25zIGFyZSBub3QgeWV0IGluIHRoZSBET00gYXMgaXQgbG9vcHMgb24gcmVuZGVyZWQgb3B0aW9uc1xyXG4gICAqL1xyXG4gIGluaXRGaWxsZWRJbigpIHtcclxuICAgIHRoaXMuY2hlY2tib3hFbGVtZW50cyA9IHRoaXMuc2VsZWN0Q29udGFpbmVyRWxlbWVudC5maW5kKCc6Y2hlY2tib3gnKTtcclxuICAgIHRoaXMuaGFuZGxlcnNbJ2ZpbGxlZEluJ10gPSAoKSA9PiB0aGlzLmhhbmRsZUZpbGxlZEluKCk7XHJcbiAgICB0aGlzLmhhbmRsZUZpbGxlZEluKCk7XHJcbiAgfVxyXG5cclxuICBpbml0TWF0ZXJpYWxTZWxlY3QoKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5zZWxlY3RFbGVtZW50LCAnbWF0ZXJpYWxfc2VsZWN0Jyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmlnZ2VyIHRoZSBuYXRpdmUgY2hhbmdlIGV2ZW50IGZyb20gc2VsZWN0IGVsZW1lbnQgaW5zdGVhZCBvZiB0aGUgSlF1ZXJ5LlxyXG4gICAqIEFuIGlzc3VlIG9uIEdpdGh1YiBpcyBvcGVuIGFib3V0IHRoaXMgcHJvYmxlbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2dmYWxvL21hdGVyaWFsaXplL2lzc3Vlcy8yODQzXHJcbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB0aGlzIGlzc3VlIGlzIHJldm9sdmVkLlxyXG4gICAqL1xyXG4gIGluaXRPbkNoYW5nZSgpIHtcclxuICAgIHRoaXMuc2VsZWN0RWxlbWVudC5vbignY2hhbmdlJywgKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLnN1c3BlbmQpIHtcclxuICAgICAgICB0aGlzLnN1c3BlbmQgPSB0cnVlO1xyXG5cclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xyXG4gICAgICAgIGN1c3RvbUV2ZW50LmluaXRDdXN0b21FdmVudCgnY2hhbmdlJywgdHJ1ZSwgZmFsc2UsIGV2ZW50LnRhcmdldC52YWx1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuaW52b2tlRWxlbWVudE1ldGhvZCh0aGlzLnNlbGVjdEVsZW1lbnRbMF0sICdkaXNwYXRjaEV2ZW50JywgW2N1c3RvbUV2ZW50XSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFN0b3AgdGhlIHByb3BhZ2F0aW9uIG9mIGNoYW5nZSBldmVudFxyXG4gICAgdGhpcy5zZWxlY3RFbGVtZW50WzBdLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcclxuICAgICAgdGhpcy5zdXNwZW5kID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZURPTUV2ZW50cygpIHtcclxuICAgIHRoaXMuaW5wdXRFbGVtZW50Lm9uKCdibHVyIGZvY3VzJywgKGV2ZW50OiBKUXVlcnkuRXZlbnQpID0+IHtcclxuICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcclxuICAgICAgY3VzdG9tRXZlbnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50LnR5cGUsIHRydWUsIGZhbHNlLCBldmVudC50YXJnZXQpO1xyXG4gICAgICB0aGlzLnNlbGVjdEVsZW1lbnRbMF0uZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUxhYmVsRWxlbWVudCgpIHtcclxuICAgIGNvbnN0IGxhYmVsRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XHJcbiAgICBsYWJlbEVsZW1lbnQuc2V0QXR0cmlidXRlKCdmb3InLCB0aGlzLmlkKTtcclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5zZWxlY3RFbGVtZW50LCAnYWZ0ZXInLCBbbGFiZWxFbGVtZW50XSk7XHJcblxyXG4gICAgcmV0dXJuICQobGFiZWxFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVByb3BlcnRpZXMoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RDb250YWluZXJFbGVtZW50Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdTZWxlY3Qgd2l0aCBtei1zZWxlY3QgZGlyZWN0aXZlIG11c3QgYmUgcGxhY2UgaW5zaWRlIGEgW216LXNlbGVjdC1jb250YWluZXJdIHRhZycsIHRoaXMuc2VsZWN0RWxlbWVudCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHN1cGVyLmV4ZWN1dGVQcm9wSGFuZGxlcnMoKTtcclxuICB9XHJcblxyXG4gIGluaXRTZWxlY3RlZE9wdGlvbigpIHtcclxuICAgIGNvbnN0IGZpcnN0T3B0aW9uRWxlbWVudCA9IHRoaXMuc2VsZWN0RWxlbWVudC5jaGlsZHJlbigpLmZpcnN0KCk7XHJcbiAgICBpZiAoZmlyc3RPcHRpb25FbGVtZW50Lmxlbmd0aCA+IDBcclxuICAgICAgJiYgdGhpcy5zZWxlY3RFbGVtZW50LmNoaWxkcmVuKCdvcHRpb25bc2VsZWN0ZWRdJykubGVuZ3RoID09PSAwXHJcbiAgICAgICYmICF0aGlzLnNlbGVjdEVsZW1lbnRbMF0uaGFzQXR0cmlidXRlKCdtdWx0aXBsZScpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50QXR0cmlidXRlKGZpcnN0T3B0aW9uRWxlbWVudFswXSwgJ3NlbGVjdGVkJywgJycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRGlzYWJsZWQoKSB7XHJcbiAgICAvLyB3aGVuIGRpc2FibGVkIGlzIG51bGwvdW5kZWZpbmVkIHRoYXQgbWVhbnMgdGhlIHByb3BlcnR5IGhhcyBub3QgYmVlbiB1c2VkIG9uIHRoZSBlbGVtZW50XHJcbiAgICAvLyBidXQgaXQgbWlnaHQgYmUgc2V0IGJ5IGFub3RoZXIgcHJvY2VzcyAoZm9yIGV4YW1wbGUgcmVhY3RpdmUgZm9ybSBhcHBsaWVzIGRpc2FibGVkIGF0dHJpYnV0ZSBpdHNlbGYpXHJcbiAgICAvLyB0aGVyZWZvcmUgd2UgZG9uJ3Qgd2FudCB0byByZW1vdmUgb3IgYWRkIGl0IGhlcmVcclxuICAgIGlmICh0aGlzLmRpc2FibGVkICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50UHJvcGVydHkodGhpcy5zZWxlY3RFbGVtZW50WzBdLCAnZGlzYWJsZWQnLCAhIXRoaXMuZGlzYWJsZWQpO1xyXG4gICAgICB0aGlzLnVwZGF0ZU1hdGVyaWFsU2VsZWN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVMYWJlbCgpIHtcclxuICAgIGlmICh0aGlzLmxhYmVsICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKHRoaXMubGFiZWxFbGVtZW50LCAndGV4dCcsIFt0aGlzLmxhYmVsXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVGaWxsZWRJbigpIHtcclxuICAgIGlmICh0aGlzLmNoZWNrYm94RWxlbWVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmNoZWNrYm94RWxlbWVudHMudG9BcnJheSgpLmZvckVhY2goY2hlY2tib3hFbGVtZW50ID0+IHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyhjaGVja2JveEVsZW1lbnQsICdmaWxsZWQtaW4nLCAhIXRoaXMuZmlsbGVkSW4pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVBsYWNlaG9sZGVyKCkge1xyXG4gICAgY29uc3QgcGxhY2Vob2xkZXJFbGVtZW50ID0gdGhpcy5zZWxlY3RFbGVtZW50LmNoaWxkcmVuKCc6ZGlzYWJsZWQnKS5maXJzdCgpO1xyXG5cclxuICAgIC8vIGlmIHBsYWNlaG9sZGVyIGVsZW1lbnQgZXhpc3RzXHJcbiAgICBpZiAocGxhY2Vob2xkZXJFbGVtZW50Lmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyKSB7XHJcbiAgICAgICAgLy8gdXBkYXRlIGV4aXN0aW5nIHBsYWNlaG9sZGVyIGVsZW1lbnRcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QocGxhY2Vob2xkZXJFbGVtZW50LCAndGV4dCcsIFt0aGlzLnBsYWNlaG9sZGVyXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gcmVtb3ZlIGV4aXN0aW5nIHBsYWNlaG9sZGVyIGVsZW1lbnRcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QocGxhY2Vob2xkZXJFbGVtZW50LCAncmVtb3ZlJyk7XHJcbiAgICAgICAgLy8gRm9yY2UgdHJpZ2dlciBjaGFuZ2UgZXZlbnQgc2luY2UgaXQncyBub3QgdHJpZ2dlcmVkIHdoZW4gdmFsdWUgY2hhbmdlIHByb2dyYW1tYXRpY2FsbHlcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5zZWxlY3RFbGVtZW50LCAnY2hhbmdlJyk7XHJcbiAgICAgICAgLy8gUmVxdWlyZWQgaWYgd2UgZG9uJ3Qgd2FudCBleGNlcHRpb24gXCJFeHByZXNzaW9uIGhhcyBjaGFuZ2VkIGFmdGVyIGl0IHdhcyBjaGVja2VkLlwiIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzYwMDVcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMucGxhY2Vob2xkZXIpIHtcclxuICAgICAgICAvLyBhZGQgcGxhY2Vob2xkZXIgZWxlbWVudFxyXG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyVGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMucGxhY2Vob2xkZXIpO1xyXG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyT3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XHJcbiAgICAgICAgcGxhY2Vob2xkZXJPcHRpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIHBsYWNlaG9sZGVyT3B0aW9uLnZhbHVlID0gbnVsbDtcclxuICAgICAgICBwbGFjZWhvbGRlck9wdGlvbi5hcHBlbmRDaGlsZChwbGFjZWhvbGRlclRleHQpO1xyXG5cclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5zZWxlY3RFbGVtZW50LCAncHJlcGVuZCcsIFtwbGFjZWhvbGRlck9wdGlvbl0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbml0TWF0ZXJpYWxTZWxlY3QoKTtcclxuICB9XHJcblxyXG4gIGxpc3Rlbk9wdGlvbkNoYW5nZXMoKSB7XHJcbiAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyQ29uZmlndXJhdGlvbjogTXV0YXRpb25PYnNlcnZlckluaXQgPSB7XHJcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcclxuICAgICAgc3VidHJlZTogdHJ1ZSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9uczogTXV0YXRpb25SZWNvcmRbXSkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZU1hdGVyaWFsU2VsZWN0KCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLm11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLnNlbGVjdEVsZW1lbnRbMF0sIG11dGF0aW9uT2JzZXJ2ZXJDb25maWd1cmF0aW9uKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZU1hdGVyaWFsU2VsZWN0KCkge1xyXG4gICAgdGhpcy5pbml0TWF0ZXJpYWxTZWxlY3QoKTtcclxuXHJcbiAgICBpZiAodGhpcy5maWxsZWRJbikge1xyXG4gICAgICB0aGlzLmluaXRGaWxsZWRJbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGFuZGxlRE9NRXZlbnRzKCk7XHJcblxyXG4gICAgLy8gd2FpdCBmb3IgbWF0ZXJpYWxpemUgc2VsZWN0IHRvIGJlIGluaXRpYWxpemVkXHJcbiAgICAvLyAvIVxcIHJhY2UgY29uZGl0aW9uIHdhcm5pbmcgLyFcXFxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZS5lbWl0KCkpO1xyXG4gIH1cclxufVxyXG4iXX0=