ngx-ace-icy
Version:
angular9+版本以上ace语法编辑器
513 lines • 31.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: ngx-ace.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, EventEmitter, Output, ElementRef, Input, forwardRef, NgZone } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
var NgxAceComponent = /** @class */ (function () {
function NgxAceComponent(elementRef, zone) {
var _this = this;
this.elementRef = elementRef;
this.zone = zone;
this.textChanged = new EventEmitter();
this.textChange = new EventEmitter();
this.placeholder = '请输入内容';
this.style = {};
// tslint:disable-next-line:variable-name
this._options = {};
// tslint:disable-next-line:variable-name
this._readOnly = false;
// tslint:disable-next-line:variable-name
this._theme = 'monokai';
// tslint:disable-next-line:variable-name
this._mode = 'sql';
// tslint:disable-next-line:variable-name
this._autoUpdateContent = true;
// tslint:disable-next-line:variable-name
this._durationBeforeCallback = 0;
// tslint:disable-next-line:variable-name
this._text = '';
// tslint:disable-next-line:variable-name
// private _onChange = (_: any) => {
// }
this.onChange = (/**
* @return {?}
*/
function () { return null; });
// tslint:disable-next-line:variable-name
// private _onTouched = () => {
// }
this.onTouched = (/**
* @return {?}
*/
function () { return null; });
/** @type {?} */
var el = elementRef.nativeElement;
this.zone.runOutsideAngular((/**
* @return {?}
*/
function () {
// tslint:disable-next-line:no-string-literal
_this._editor = ace['edit'](el);
}));
this._editor.setOptions({
enableBasicAutocompletion: true,
enableSnippets: true,
enableLiveAutocompletion: true,
minLines: 1,
maxLines: Infinity,
});
this._editor.$blockScrolling = Infinity;
this._editor.setShowPrintMargin(false);
}
/**
* @return {?}
*/
NgxAceComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.init();
this.initEvents();
};
/**
* @return {?}
*/
NgxAceComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this._editor.destroy();
};
/**
* @return {?}
*/
NgxAceComponent.prototype.init = /**
* @return {?}
*/
function () {
this.setOptions(this._options || {});
this.setTheme(this._theme);
this.setMode(this._mode);
this.setReadOnly(this._readOnly);
};
/**
* @return {?}
*/
NgxAceComponent.prototype.initEvents = /**
* @return {?}
*/
function () {
var _this = this;
this._editor.on('change', (/**
* @return {?}
*/
function () { return _this.updateText(); }));
this._editor.on('paste', (/**
* @return {?}
*/
function () { return _this.updateText(); }));
};
/**
* @return {?}
*/
NgxAceComponent.prototype.updateText = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var newVal = this._editor.getValue();
if (newVal === this.oldText) {
return;
}
if (!this._durationBeforeCallback) {
this._text = newVal;
this.zone.run((/**
* @return {?}
*/
function () {
_this.textChange.emit(newVal);
_this.textChanged.emit(newVal);
_this.onChange(newVal);
}));
}
else {
if (this.timeoutSaving) {
clearTimeout(this.timeoutSaving);
}
this.timeoutSaving = setTimeout((/**
* @return {?}
*/
function () {
_this._text = newVal;
_this.zone.run((/**
* @return {?}
*/
function () {
_this.textChange.emit(newVal);
_this.textChanged.emit(newVal);
}));
_this.timeoutSaving = null;
}), this._durationBeforeCallback);
}
this.oldText = newVal;
this.emptyMessage();
};
Object.defineProperty(NgxAceComponent.prototype, "options", {
set: /**
* @param {?} options
* @return {?}
*/
function (options) {
this.setOptions(options);
},
enumerable: true,
configurable: true
});
/**
* @param {?} options
* @return {?}
*/
NgxAceComponent.prototype.setOptions = /**
* @param {?} options
* @return {?}
*/
function (options) {
this._options = options;
this._editor.setOptions(options || {});
};
Object.defineProperty(NgxAceComponent.prototype, "readOnly", {
set: /**
* @param {?} readOnly
* @return {?}
*/
function (readOnly) {
this.setReadOnly(readOnly);
},
enumerable: true,
configurable: true
});
/**
* @param {?} readOnly
* @return {?}
*/
NgxAceComponent.prototype.setReadOnly = /**
* @param {?} readOnly
* @return {?}
*/
function (readOnly) {
this._readOnly = readOnly;
this._editor.setReadOnly(readOnly);
};
Object.defineProperty(NgxAceComponent.prototype, "theme", {
set: /**
* @param {?} theme
* @return {?}
*/
function (theme) {
this.setTheme(theme);
},
enumerable: true,
configurable: true
});
/**
* @param {?} theme
* @return {?}
*/
NgxAceComponent.prototype.setTheme = /**
* @param {?} theme
* @return {?}
*/
function (theme) {
this._theme = theme;
this._editor.setTheme("ace/theme/" + theme);
};
Object.defineProperty(NgxAceComponent.prototype, "mode", {
set: /**
* @param {?} mode
* @return {?}
*/
function (mode) {
this.setMode(mode);
},
enumerable: true,
configurable: true
});
/**
* @param {?} mode
* @return {?}
*/
NgxAceComponent.prototype.setMode = /**
* @param {?} mode
* @return {?}
*/
function (mode) {
this._mode = mode;
if (typeof this._mode === 'object') {
this._editor.getSession().setMode(this._mode);
}
else {
this._editor.getSession().setMode("ace/mode/" + this._mode);
}
};
Object.defineProperty(NgxAceComponent.prototype, "value", {
get: /**
* @return {?}
*/
function () {
return this.text;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.setText(value);
},
enumerable: true,
configurable: true
});
/**
* @param {?} value
* @return {?}
*/
NgxAceComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.setText(value);
};
/**
* @param {?} fn
* @return {?}
*/
NgxAceComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
NgxAceComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
Object.defineProperty(NgxAceComponent.prototype, "text", {
get: /**
* @return {?}
*/
function () {
return this._text;
},
set: /**
* @param {?} text
* @return {?}
*/
function (text) {
this.setText(text);
},
enumerable: true,
configurable: true
});
/**
* @param {?} text
* @return {?}
*/
NgxAceComponent.prototype.setText = /**
* @param {?} text
* @return {?}
*/
function (text) {
if (text === null || text === undefined) {
text = '';
}
if (this._text !== text && this._autoUpdateContent === true) {
this._text = text;
this._editor.setValue(text);
this.onChange(text);
this._editor.clearSelection();
}
this.emptyMessage();
};
Object.defineProperty(NgxAceComponent.prototype, "autoUpdateContent", {
set: /**
* @param {?} status
* @return {?}
*/
function (status) {
this.setAutoUpdateContent(status);
},
enumerable: true,
configurable: true
});
/**
* @param {?} status
* @return {?}
*/
NgxAceComponent.prototype.setAutoUpdateContent = /**
* @param {?} status
* @return {?}
*/
function (status) {
this._autoUpdateContent = status;
};
Object.defineProperty(NgxAceComponent.prototype, "durationBeforeCallback", {
set: /**
* @param {?} num
* @return {?}
*/
function (num) {
this.setDurationBeforeCallback(num);
},
enumerable: true,
configurable: true
});
/**
* @param {?} num
* @return {?}
*/
NgxAceComponent.prototype.setDurationBeforeCallback = /**
* @param {?} num
* @return {?}
*/
function (num) {
this._durationBeforeCallback = num;
};
/** 为空时增加placeholder提示信息 */
/**
* 为空时增加placeholder提示信息
* @private
* @return {?}
*/
NgxAceComponent.prototype.emptyMessage = /**
* 为空时增加placeholder提示信息
* @private
* @return {?}
*/
function () {
/** @type {?} */
var shouldShow = !this._text.length;
/** @type {?} */
var node = this._editor.renderer.emptyMessageNode;
if (!shouldShow && node) {
this._editor.renderer.scroller.removeChild(this._editor.renderer.emptyMessageNode);
this._editor.renderer.emptyMessageNode = null;
}
else if (shouldShow && !node) {
node = this._editor.renderer.emptyMessageNode = document.createElement('div');
node.textContent = this.placeholder;
node.className = 'ace_emptyMessage';
node.style.padding = '0 9px';
node.style.position = 'absolute';
node.style.zIndex = 9;
node.style.opacity = 0.5;
this._editor.renderer.scroller.appendChild(node);
}
};
/**
* @return {?}
*/
NgxAceComponent.prototype.getEditor = /**
* @return {?}
*/
function () {
return this._editor;
};
NgxAceComponent.decorators = [
{ type: Component, args: [{
selector: 'c-ngx-ace',
template: '',
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return NgxAceComponent; })),
multi: true
}],
styles: [':host { display:block;box-sizing: content-box;}']
}] }
];
/** @nocollapse */
NgxAceComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: NgZone }
]; };
NgxAceComponent.propDecorators = {
textChanged: [{ type: Output }],
textChange: [{ type: Output }],
placeholder: [{ type: Input }],
style: [{ type: Input }],
options: [{ type: Input }],
readOnly: [{ type: Input }],
theme: [{ type: Input }],
mode: [{ type: Input }],
value: [{ type: Input }],
text: [{ type: Input }],
autoUpdateContent: [{ type: Input }],
durationBeforeCallback: [{ type: Input }]
};
return NgxAceComponent;
}());
export { NgxAceComponent };
if (false) {
/** @type {?} */
NgxAceComponent.prototype.textChanged;
/** @type {?} */
NgxAceComponent.prototype.textChange;
/** @type {?} */
NgxAceComponent.prototype.placeholder;
/** @type {?} */
NgxAceComponent.prototype.style;
/** @type {?} */
NgxAceComponent.prototype._options;
/** @type {?} */
NgxAceComponent.prototype._readOnly;
/** @type {?} */
NgxAceComponent.prototype._theme;
/** @type {?} */
NgxAceComponent.prototype._mode;
/** @type {?} */
NgxAceComponent.prototype._autoUpdateContent;
/** @type {?} */
NgxAceComponent.prototype._editor;
/** @type {?} */
NgxAceComponent.prototype._durationBeforeCallback;
/** @type {?} */
NgxAceComponent.prototype._text;
/** @type {?} */
NgxAceComponent.prototype.oldText;
/** @type {?} */
NgxAceComponent.prototype.timeoutSaving;
/**
* @type {?}
* @private
*/
NgxAceComponent.prototype.onChange;
/**
* @type {?}
* @private
*/
NgxAceComponent.prototype.onTouched;
/**
* @type {?}
* @private
*/
NgxAceComponent.prototype.elementRef;
/**
* @type {?}
* @private
*/
NgxAceComponent.prototype.zone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWFjZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYWNlLWljeS8iLCJzb3VyY2VzIjpbIm5neC1hY2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFxQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUgsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBSXpFO0lBbUNFLHlCQUFvQixVQUFzQixFQUFVLElBQVk7UUFBaEUsaUJBZUM7UUFmbUIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUFVLFNBQUksR0FBSixJQUFJLENBQVE7UUF2QnRELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQyxnQkFBVyxHQUFHLE9BQU8sQ0FBQztRQUN0QixVQUFLLEdBQVEsRUFBRSxDQUFDOztRQUV6QixhQUFRLEdBQVEsRUFBRSxDQUFDOztRQUVuQixjQUFTLEdBQUcsS0FBSyxDQUFDOztRQUVsQixXQUFNLEdBQUcsU0FBUyxDQUFDOztRQUVuQixVQUFLLEdBQVEsS0FBSyxDQUFDOztRQUVuQix1QkFBa0IsR0FBRyxJQUFJLENBQUM7O1FBSTFCLDRCQUF1QixHQUFHLENBQUMsQ0FBQzs7UUFFNUIsVUFBSyxHQUFHLEVBQUUsQ0FBQzs7OztRQWdJSCxhQUFROzs7UUFBNEIsY0FBTSxPQUFBLElBQUksRUFBSixDQUFJLEVBQUM7Ozs7UUFTL0MsY0FBUzs7O1FBQWUsY0FBTSxPQUFBLElBQUksRUFBSixDQUFJLEVBQUM7O1lBcEluQyxFQUFFLEdBQUcsVUFBVSxDQUFDLGFBQWE7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUI7OztRQUFDO1lBQzFCLDZDQUE2QztZQUM3QyxL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QWlEO2lCQU0zRDs7OztnQkFkeUMsVUFBVTtnQkFBd0MsTUFBTTs7OzhCQWlCL0YsTUFBTTs2QkFDTixNQUFNOzhCQUNOLEtBQUs7d0JBQ0wsS0FBSzswQkF3RkwsS0FBSzsyQkFTTCxLQUFLO3dCQVNMLEtBQUs7dUJBU0wsS0FBSzt3QkFpQkwsS0FBSzt1QkErQkwsS0FBSztvQ0FrQkwsS0FBSzt5Q0FRTCxLQUFLOztJQStCUixzQkFBQztDQUFBLEFBM09ELElBMk9DO1NBak9ZLGVBQWU7OztJQUUxQixzQ0FBMkM7O0lBQzNDLHFDQUEwQzs7SUFDMUMsc0NBQStCOztJQUMvQixnQ0FBeUI7O0lBRXpCLG1DQUFtQjs7SUFFbkIsb0NBQWtCOztJQUVsQixpQ0FBbUI7O0lBRW5CLGdDQUFtQjs7SUFFbkIsNkNBQTBCOztJQUUxQixrQ0FBYTs7SUFFYixrREFBNEI7O0lBRTVCLGdDQUFXOztJQUNYLGtDQUFhOztJQUNiLHdDQUFtQjs7Ozs7SUE4SG5CLG1DQUF1RDs7Ozs7SUFTdkQsb0NBQTJDOzs7OztJQXJJL0IscUNBQThCOzs7OztJQUFFLCtCQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIEVsZW1lbnRSZWYsIElucHV0LCBmb3J3YXJkUmVmLCBPbkluaXQsIE9uRGVzdHJveSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmRlY2xhcmUgdmFyIGFjZTogYW55O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjLW5neC1hY2UnLFxuICB0ZW1wbGF0ZTogJycsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6YmxvY2s7Ym94LXNpemluZzogY29udGVudC1ib3g7fSddLFxuICBwcm92aWRlcnM6IFt7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmd4QWNlQ29tcG9uZW50KSxcbiAgICBtdWx0aTogdHJ1ZVxuICB9XVxufSlcbmV4cG9ydCBjbGFzcyBOZ3hBY2VDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBPdXRwdXQoKSB0ZXh0Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHRleHRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ+ivt+i+k+WFpeWGheWuuSc7XG4gIEBJbnB1dCgpIHN0eWxlOiBhbnkgPSB7fTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgX29wdGlvbnM6IGFueSA9IHt9O1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICBfcmVhZE9ubHkgPSBmYWxzZTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgX3RoZW1lID0gJ21vbm9rYWknO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICBfbW9kZTogYW55ID0gJ3NxbCc7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIF9hdXRvVXBkYXRlQ29udGVudCA9IHRydWU7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIF9lZGl0b3I6IGFueTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgX2R1cmF0aW9uQmVmb3JlQ2FsbGJhY2sgPSAwO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICBfdGV4dCA9ICcnO1xuICBvbGRUZXh0OiBhbnk7XG4gIHRpbWVvdXRTYXZpbmc6IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgem9uZTogTmdab25lKSB7XG4gICAgY29uc3QgZWwgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zdHJpbmctbGl0ZXJhbFxuICAgICAgdGhpcy5fZWRpdG9yID0gYWNlWydlZGl0J10oZWwpO1xuICAgIH0pO1xuICAgIHRoaXMuX2VkaXRvci5zZXRPcHRpb25zKHtcbiAgICAgIGVuYWJsZUJhc2ljQXV0b2NvbXBsZXRpb246IHRydWUsXG4gICAgICBlbmFibGVTbmlwcGV0czogdHJ1ZSxcbiAgICAgIGVuYWJsZUxpdmVBdXRvY29tcGxldGlvbjogdHJ1ZSxcbiAgICAgIG1pbkxpbmVzOiAxLFxuICAgICAgbWF4TGluZXM6IEluZmluaXR5LFxuICAgIH0pO1xuICAgIHRoaXMuX2VkaXRvci4kYmxvY2tTY3JvbGxpbmcgPSBJbmZpbml0eTtcbiAgICB0aGlzLl9lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdCgpO1xuICAgIHRoaXMuaW5pdEV2ZW50cygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZWRpdG9yLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgdGhpcy5zZXRPcHRpb25zKHRoaXMuX29wdGlvbnMgfHwge30pO1xuICAgIHRoaXMuc2V0VGhlbWUodGhpcy5fdGhlbWUpO1xuICAgIHRoaXMuc2V0TW9kZSh0aGlzLl9tb2RlKTtcbiAgICB0aGlzLnNldFJlYWRPbmx5KHRoaXMuX3JlYWRPbmx5KTtcbiAgfVxuXG4gIGluaXRFdmVudHMoKSB7XG4gICAgdGhpcy5fZWRpdG9yLm9uKCdjaGFuZ2UnLCAoKSA9PiB0aGlzLnVwZGF0ZVRleHQoKSk7XG4gICAgdGhpcy5fZWRpdG9yLm9uKCdwYXN0ZScsICgpID0+IHRoaXMudXBkYXRlVGV4dCgpKTtcbiAgfVxuXG4gIHVwZGF0ZVRleHQoKSB7XG4gICAgY29uc3QgbmV3VmFsID0gdGhpcy5fZWRpdG9yLmdldFZhbHVlKCk7XG4gICAgaWYgKG5ld1ZhbCA9PT0gdGhpcy5vbGRUZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5fZHVyYXRpb25CZWZvcmVDYWxsYmFjaykge1xuICAgICAgdGhpcy5fdGV4dCA9IG5ld1ZhbDtcbiAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnRleHRDaGFuZ2UuZW1pdChuZXdWYWwpO1xuICAgICAgICB0aGlzLnRleHRDaGFuZ2VkLmVtaXQobmV3VmFsKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShuZXdWYWwpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnRpbWVvdXRTYXZpbmcpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFNhdmluZyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudGltZW91dFNhdmluZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl90ZXh0ID0gbmV3VmFsO1xuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnRleHRDaGFuZ2UuZW1pdChuZXdWYWwpO1xuICAgICAgICAgIHRoaXMudGV4dENoYW5nZWQuZW1pdChuZXdWYWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50aW1lb3V0U2F2aW5nID0gbnVsbDtcbiAgICAgIH0sIHRoaXMuX2R1cmF0aW9uQmVmb3JlQ2FsbGJhY2spO1xuICAgIH1cbiAgICB0aGlzLm9sZFRleHQgPSBuZXdWYWw7XG4gICAgdGhpcy5lbXB0eU1lc3NhZ2UoKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBvcHRpb25zKG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuXG4gIHNldE9wdGlvbnMob3B0aW9uczogYW55KSB7XG4gICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5fZWRpdG9yLnNldE9wdGlvbnMob3B0aW9ucyB8fCB7fSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcmVhZE9ubHkocmVhZE9ubHk6IGFueSkge1xuICAgIHRoaXMuc2V0UmVhZE9ubHkocmVhZE9ubHkpO1xuICB9XG5cbiAgc2V0UmVhZE9ubHkocmVhZE9ubHk6IGFueSkge1xuICAgIHRoaXMuX3JlYWRPbmx5ID0gcmVhZE9ubHk7XG4gICAgdGhpcy5fZWRpdG9yLnNldFJlYWRPbmx5KHJlYWRPbmx5KTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCB0aGVtZSh0aGVtZTogYW55KSB7XG4gICAgdGhpcy5zZXRUaGVtZSh0aGVtZSk7XG4gIH1cblxuICBzZXRUaGVtZSh0aGVtZTogYW55KSB7XG4gICAgdGhpcy5fdGhlbWUgPSB0aGVtZTtcbiAgICB0aGlzLl9lZGl0b3Iuc2V0VGhlbWUoYGFjZS90aGVtZS8ke3RoZW1lfWApO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IG1vZGUobW9kZTogYW55KSB7XG4gICAgdGhpcy5zZXRNb2RlKG1vZGUpO1xuICB9XG5cbiAgc2V0TW9kZShtb2RlOiBhbnkpIHtcbiAgICB0aGlzLl9tb2RlID0gbW9kZTtcbiAgICBpZiAodHlwZW9mIHRoaXMuX21vZGUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLl9lZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUodGhpcy5fbW9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2VkaXRvci5nZXRTZXNzaW9uKCkuc2V0TW9kZShgYWNlL21vZGUvJHt0aGlzLl9tb2RlfWApO1xuICAgIH1cbiAgfVxuXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0O1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFRleHQodmFsdWUpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5zZXRUZXh0KHZhbHVlKTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIC8vIHByaXZhdGUgX29uQ2hhbmdlID0gKF86IGFueSkgPT4ge1xuICAvLyB9XG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkID0gKCkgPT4gbnVsbDtcblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICAvLyBwcml2YXRlIF9vblRvdWNoZWQgPSAoKSA9PiB7XG4gIC8vIH1cbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiBudWxsO1xuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgZ2V0IHRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RleHQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgdGV4dCh0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFRleHQodGV4dCk7XG4gIH1cblxuICBzZXRUZXh0KHRleHQ6IGFueSkge1xuICAgIGlmICh0ZXh0ID09PSBudWxsIHx8IHRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGV4dCA9ICcnO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGV4dCAhPT0gdGV4dCAmJiB0aGlzLl9hdXRvVXBkYXRlQ29udGVudCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7XG4gICAgICB0aGlzLl9lZGl0b3Iuc2V0VmFsdWUodGV4dCk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRleHQpO1xuICAgICAgdGhpcy5fZWRpdG9yLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuZW1wdHlNZXNzYWdlKCk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgYXV0b1VwZGF0ZUNvbnRlbnQoc3RhdHVzOiBhbnkpIHtcbiAgICB0aGlzLnNldEF1dG9VcGRhdGVDb250ZW50KHN0YXR1cyk7XG4gIH1cblxuICBzZXRBdXRvVXBkYXRlQ29udGVudChzdGF0dXM6IGFueSkge1xuICAgIHRoaXMuX2F1dG9VcGRhdGVDb250ZW50ID0gc3RhdHVzO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGR1cmF0aW9uQmVmb3JlQ2FsbGJhY2sobnVtOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldER1cmF0aW9uQmVmb3JlQ2FsbGJhY2sobnVtKTtcbiAgfVxuXG4gIHNldER1cmF0aW9uQmVmb3JlQ2FsbGJhY2sobnVtOiBudW1iZXIpIHtcbiAgICB0aGlzLl9kdXJhdGlvbkJlZm9yZUNhbGxiYWNrID0gbnVtO1xuICB9XG5cbiAgLyoqIOS4uuepuuaXtuWinuWKoHBsYWNlaG9sZGVy5o+Q56S65L+h5oGvICovXG4gIHByaXZhdGUgZW1wdHlNZXNzYWdlKCk6IHZvaWQge1xuICAgIGNvbnN0IHNob3VsZFNob3cgPSAhdGhpcy5fdGV4dC5sZW5ndGg7XG4gICAgbGV0IG5vZGUgPSB0aGlzLl9lZGl0b3IucmVuZGVyZXIuZW1wdHlNZXNzYWdlTm9kZTtcbiAgICBpZiAoIXNob3VsZFNob3cgJiYgbm9kZSkge1xuICAgICAgdGhpcy5fZWRpdG9yLnJlbmRlcmVyLnNjcm9sbGVyLnJlbW92ZUNoaWxkKHRoaXMuX2VkaXRvci5yZW5kZXJlci5lbXB0eU1lc3NhZ2VOb2RlKTtcbiAgICAgIHRoaXMuX2VkaXRvci5yZW5kZXJlci5lbXB0eU1lc3NhZ2VOb2RlID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHNob3VsZFNob3cgJiYgIW5vZGUpIHtcbiAgICAgIG5vZGUgPSB0aGlzLl9lZGl0b3IucmVuZGVyZXIuZW1wdHlNZXNzYWdlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgbm9kZS50ZXh0Q29udGVudCA9IHRoaXMucGxhY2Vob2xkZXI7XG4gICAgICBub2RlLmNsYXNzTmFtZSA9ICdhY2VfZW1wdHlNZXNzYWdlJztcbiAgICAgIG5vZGUuc3R5bGUucGFkZGluZyA9ICcwIDlweCc7XG4gICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgIG5vZGUuc3R5bGUuekluZGV4ID0gOTtcbiAgICAgIG5vZGUuc3R5bGUub3BhY2l0eSA9IDAuNTtcbiAgICAgIHRoaXMuX2VkaXRvci5yZW5kZXJlci5zY3JvbGxlci5hcHBlbmRDaGlsZChub2RlKTtcbiAgICB9XG4gIH1cblxuICBnZXRFZGl0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRvcjtcbiAgfVxuXG59XG4iXX0=