com.phloxui
Version:
PhloxUI Ng2+ Framework
315 lines (314 loc) • 28.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ SUB_TOPIC_NAME = 'side-slide-panel';
var /** @type {?} */ TOPIC_NAME_PREFIX = 'side-slide-panel.';
var /** @type {?} */ SHOW_SUFFIX = 'show';
var /** @type {?} */ HIDE_SUFFIX = 'hide';
var /** @type {?} */ CMD_SUFFIX = 'cmd';
var /** @type {?} */ SHOW_TOPIC_NAME = TOPIC_NAME_PREFIX + SHOW_SUFFIX;
var /** @type {?} */ HIDE_TOPIC_NAME = TOPIC_NAME_PREFIX + HIDE_SUFFIX;
var /** @type {?} */ CMD_TOPIC_NAME = TOPIC_NAME_PREFIX + CMD_SUFFIX;
/**
* <p style="text-indent: 2em;">
* An abstract base class for side slide panel component. This class will automatically publish <code>hide</code> and <code>
* show</code> events to [[ObservableManager]] on topic name <code>side-slide-panel.[sub-topic-name].show</code> and <code>
* side-slide-panel.[sub-topic-name].hide</code> respectively. You can also control the show/hide state of this component
* via [[ObservableManager]] by publishing <code>boolean</code> to <code>side-slide-panel.[sub-topic-name].cmd</code> topic.
* This class provides the default implementation for method [[onLostFocus]] to automatically hide this component when focus lost.
* </p>
*
* @author shiorin, tee4cute
* @see [[ObservableManager]]
* @see [[INeedFocus]]
* @abstract
*/
var AbstractSideSlidePanel = /** @class */ (function () {
function AbstractSideSlidePanel(phloxAppService, observableMgr, needFocusService, subTopicName) {
if (phloxAppService !== null && typeof phloxAppService !== 'undefined') {
this.phloxAppService = phloxAppService;
}
this.observableMgr = observableMgr;
this.needFocusService = needFocusService;
this.active = false;
this.subTopicName = subTopicName;
this.showSubjects = [];
this.hideSubjects = [];
}
/**
* @param {?} subTopicName
* @return {?}
*/
AbstractSideSlidePanel.getShowTopicName = /**
* @param {?} subTopicName
* @return {?}
*/
function (subTopicName) {
if (subTopicName === null || typeof subTopicName === 'undefined' || subTopicName === '') {
return AbstractSideSlidePanel.SHOW_TOPIC_NAME;
}
if (subTopicName.charAt(0) === '.') {
subTopicName = subTopicName.substring(1);
}
if (subTopicName === '') {
return AbstractSideSlidePanel.SHOW_TOPIC_NAME;
}
if (subTopicName.charAt(subTopicName.length - 1) !== '.') {
subTopicName += '.';
}
return TOPIC_NAME_PREFIX + subTopicName + SHOW_SUFFIX;
};
/**
* @param {?} subTopicName
* @return {?}
*/
AbstractSideSlidePanel.getHideTopicName = /**
* @param {?} subTopicName
* @return {?}
*/
function (subTopicName) {
if (subTopicName === null || typeof subTopicName === 'undefined' || subTopicName === '') {
return AbstractSideSlidePanel.HIDE_TOPIC_NAME;
}
if (subTopicName.charAt(0) === '.') {
subTopicName = subTopicName.substring(1);
}
if (subTopicName === '') {
return AbstractSideSlidePanel.HIDE_TOPIC_NAME;
}
if (subTopicName.charAt(subTopicName.length - 1) !== '.') {
subTopicName += '.';
}
return TOPIC_NAME_PREFIX + subTopicName + HIDE_SUFFIX;
};
/**
* @param {?} subTopicName
* @return {?}
*/
AbstractSideSlidePanel.getCmdTopicName = /**
* @param {?} subTopicName
* @return {?}
*/
function (subTopicName) {
if (subTopicName === null || typeof subTopicName === 'undefined' || subTopicName === '') {
return AbstractSideSlidePanel.CMD_TOPIC_NAME;
}
if (subTopicName.charAt(0) === '.') {
subTopicName = subTopicName.substring(1);
}
if (subTopicName === '') {
return AbstractSideSlidePanel.CMD_TOPIC_NAME;
}
if (subTopicName.charAt(subTopicName.length - 1) !== '.') {
subTopicName += '.';
}
return TOPIC_NAME_PREFIX + subTopicName + CMD_SUFFIX;
};
Object.defineProperty(AbstractSideSlidePanel.prototype, "app", {
get: /**
* @return {?}
*/
function () {
if (this.phloxAppService === null || typeof this.phloxAppService === 'undefined') {
return null;
}
return this.phloxAppService.getInstance();
},
enumerable: true,
configurable: true
});
/**
* @param {?} showTopic
* @param {?} hideTopic
* @param {?} showCmdTopic
* @return {?}
*/
AbstractSideSlidePanel.prototype.initSideSlideEventTopics = /**
* @param {?} showTopic
* @param {?} hideTopic
* @param {?} showCmdTopic
* @return {?}
*/
function (showTopic, hideTopic, showCmdTopic) {
var _this = this;
// Create change event observable topics
if (showTopic !== null && typeof showTopic === 'string') {
this.showSubjects.push(this.observableMgr.createSubject(showTopic));
}
if (hideTopic !== null && typeof hideTopic === 'string') {
this.hideSubjects.push(this.observableMgr.createSubject(hideTopic));
}
// Subscribe on CMD topics
if (showCmdTopic !== null && typeof showCmdTopic === 'string') {
this.observableMgr.subscribe(showCmdTopic, function (show) {
if (typeof show === 'boolean') {
_this.active = show;
}
});
}
};
/**
* @return {?}
*/
AbstractSideSlidePanel.prototype.ngOnInit = /**
* @return {?}
*/
function () {
// Init super class event topics
this.initSideSlideEventTopics(AbstractSideSlidePanel.SHOW_TOPIC_NAME, AbstractSideSlidePanel.HIDE_TOPIC_NAME, AbstractSideSlidePanel.CMD_TOPIC_NAME);
if (this.subTopicName !== null && this.subTopicName !== '' || typeof this.subTopicName !== 'undefined') {
// Init sub topic event topics
this.initSideSlideEventTopics(AbstractSideSlidePanel.getShowTopicName(this.subTopicName), AbstractSideSlidePanel.getHideTopicName(this.subTopicName), AbstractSideSlidePanel.getCmdTopicName(this.subTopicName));
}
};
/**
* @return {?}
*/
AbstractSideSlidePanel.prototype.getApplication = /**
* @return {?}
*/
function () {
return this.app;
};
/**
* <p style="text-indent: 1em;">
* Show this component. This method also publishes an event to topic <code>side-slide-panel.[sub-topic-name].show</code>.
* </p>
* @return {?}
*/
AbstractSideSlidePanel.prototype.show = /**
* <p style="text-indent: 1em;">
* Show this component. This method also publishes an event to topic <code>side-slide-panel.[sub-topic-name].show</code>.
* </p>
* @return {?}
*/
function () {
var _this = this;
this.active = true;
if (Array.isArray(this.showSubjects)) {
// Emit change event
this.showSubjects.forEach(function (obsv, idx) {
obsv.next(_this);
});
}
};
/**
* <p style="text-indent: 1em;">
* Hide this component. This method also publishes an event to topic <code>side-slide-panel.[sub-topic-name].hide</code>.
* </p>
* @return {?}
*/
AbstractSideSlidePanel.prototype.hide = /**
* <p style="text-indent: 1em;">
* Hide this component. This method also publishes an event to topic <code>side-slide-panel.[sub-topic-name].hide</code>.
* </p>
* @return {?}
*/
function () {
var _this = this;
this.active = false;
if (Array.isArray(this.hideSubjects)) {
// Emit change event
this.hideSubjects.forEach(function (obsv, idx) {
obsv.next(_this);
});
}
};
/**
* <p style="text-indent: 1em;">
* Toggle show/hide this component. This method also publishes an event to topic <code>side-slide-panel.[sub-topic-name].show</code>
* and <code>side-slide-panel.[sub-topic-name].hide</code> when the component is shown or hidden respectively.
* </p>
* @param {?} event
* @return {?}
*/
AbstractSideSlidePanel.prototype.onToggle = /**
* <p style="text-indent: 1em;">
* Toggle show/hide this component. This method also publishes an event to topic <code>side-slide-panel.[sub-topic-name].show</code>
* and <code>side-slide-panel.[sub-topic-name].hide</code> when the component is shown or hidden respectively.
* </p>
* @param {?} event
* @return {?}
*/
function (event) {
if (this.active) {
this.hide();
this.needFocusService.resetFocusingComponent();
}
else {
this.show();
this.needFocusService.setFocusingComponent(this);
}
};
/**
* @param {?} event
* @return {?}
*/
AbstractSideSlidePanel.prototype.onFocus = /**
* @param {?} event
* @return {?}
*/
function (event) {
};
/**
* @param {?} event
* @return {?}
*/
AbstractSideSlidePanel.prototype.onLostFocus = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.hide();
};
/**
* @return {?}
*/
AbstractSideSlidePanel.prototype.isActive = /**
* @return {?}
*/
function () {
return this.active;
};
/**
* @return {?}
*/
AbstractSideSlidePanel.prototype.getSubTopicName = /**
* @return {?}
*/
function () {
return this.subTopicName;
};
AbstractSideSlidePanel.SUB_TOPIC_NAME = SUB_TOPIC_NAME;
AbstractSideSlidePanel.SHOW_TOPIC_NAME = SHOW_TOPIC_NAME;
AbstractSideSlidePanel.HIDE_TOPIC_NAME = HIDE_TOPIC_NAME;
AbstractSideSlidePanel.CMD_TOPIC_NAME = CMD_TOPIC_NAME;
return AbstractSideSlidePanel;
}());
export { AbstractSideSlidePanel };
function AbstractSideSlidePanel_tsickle_Closure_declarations() {
/** @type {?} */
AbstractSideSlidePanel.SUB_TOPIC_NAME;
/** @type {?} */
AbstractSideSlidePanel.SHOW_TOPIC_NAME;
/** @type {?} */
AbstractSideSlidePanel.HIDE_TOPIC_NAME;
/** @type {?} */
AbstractSideSlidePanel.CMD_TOPIC_NAME;
/** @type {?} */
AbstractSideSlidePanel.prototype.phloxAppService;
/** @type {?} */
AbstractSideSlidePanel.prototype.observableMgr;
/** @type {?} */
AbstractSideSlidePanel.prototype.needFocusService;
/** @type {?} */
AbstractSideSlidePanel.prototype.active;
/** @type {?} */
AbstractSideSlidePanel.prototype.subTopicName;
/** @type {?} */
AbstractSideSlidePanel.prototype.showSubjects;
/** @type {?} */
AbstractSideSlidePanel.prototype.hideSubjects;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RTaWRlU2xpZGVQYW5lbC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9BYnN0cmFjdFNpZGVTbGlkZVBhbmVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFRQSxxQkFBTSxjQUFjLEdBQVcsa0JBQWtCLENBQUM7QUFDbEQscUJBQU0saUJBQWlCLEdBQVcsbUJBQW1CLENBQUM7QUFDdEQscUJBQU0sV0FBVyxHQUFXLE1BQU0sQ0FBQztBQUNuQyxxQkFBTSxXQUFXLEdBQVcsTUFBTSxDQUFDO0FBQ25DLHFCQUFNLFVBQVUsR0FBVyxLQUFLLENBQUM7QUFDakMscUJBQU0sZUFBZSxHQUFXLGlCQUFpQixHQUFHLFdBQVcsQ0FBQztBQUNoRSxxQkFBTSxlQUFlLEdBQVcsaUJBQWlCLEdBQUcsV0FBVyxDQUFDO0FBQ2hFLHFCQUFNLGNBQWMsR0FBVyxpQkFBaUIsR0FBRyxVQUFVLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7SUFpRzFELGdDQUFZLGVBQWdDLEVBQUUsYUFBZ0MsRUFBRSxnQkFBa0MsRUFBRSxZQUFvQjtRQUNwSSxFQUFFLENBQUMsQ0FBQyxlQUFlLEtBQUssSUFBSSxJQUFJLE9BQU8sZUFBZSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7U0FDMUM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7UUFDekMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7S0FDMUI7Ozs7O0lBckZhLHVDQUFnQjs7OztjQUFDLFlBQW9C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QUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixFQUFFLENBQUM7U0FDbEQ7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNKLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwRDs7Ozs7O0lBR0Usd0NBQU87Ozs7Y0FBQyxLQUFVOzs7Ozs7SUFJbEIsNENBQVc7Ozs7Y0FBQyxLQUFVO1FBQ3pCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7Ozs7SUFHVCx5Q0FBUTs7OztRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDOzs7OztJQUdkLGdEQUFlOzs7O1FBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDOzs0Q0FsTXFCLGNBQWM7NkNBQ2IsZUFBZTs2Q0FDZixlQUFlOzRDQUNoQixjQUFjO2lDQW5DbEU7O1NBOEJzQixzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzL1N1YmplY3QnO1xuXG5pbXBvcnQgeyBQaGxveEFwcCB9IGZyb20gJy4vUGhsb3hBcHAuY29tcG9uZW50JztcbmltcG9ydCB7IElBcHBsaWNhdGlvbkF3YXJlIH0gZnJvbSAnLi9JQXBwbGljYXRpb25Bd2FyZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlTWFuYWdlciwgUGhsb3hBcHBTZXJ2aWNlLCBOZWVkRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBJTmVlZEZvY3VzIH0gZnJvbSAnLi4vY29tcG9uZW50L2NvbXBvbmVudHMnO1xuXG5jb25zdCBTVUJfVE9QSUNfTkFNRTogc3RyaW5nID0gJ3NpZGUtc2xpZGUtcGFuZWwnO1xuY29uc3QgVE9QSUNfTkFNRV9QUkVGSVg6IHN0cmluZyA9ICdzaWRlLXNsaWRlLXBhbmVsLic7XG5jb25zdCBTSE9XX1NVRkZJWDogc3RyaW5nID0gJ3Nob3cnO1xuY29uc3QgSElERV9TVUZGSVg6IHN0cmluZyA9ICdoaWRlJztcbmNvbnN0IENNRF9TVUZGSVg6IHN0cmluZyA9ICdjbWQnO1xuY29uc3QgU0hPV19UT1BJQ19OQU1FOiBzdHJpbmcgPSBUT1BJQ19OQU1FX1BSRUZJWCArIFNIT1dfU1VGRklYO1xuY29uc3QgSElERV9UT1BJQ19OQU1FOiBzdHJpbmcgPSBUT1BJQ19OQU1FX1BSRUZJWCArIEhJREVfU1VGRklYO1xuY29uc3QgQ01EX1RPUElDX05BTUU6IHN0cmluZyA9IFRPUElDX05BTUVfUFJFRklYICsgQ01EX1NVRkZJWDtcblxuLyoqXG4gKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAyZW07XCI+XG4gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBzaWRlIHNsaWRlIHBhbmVsIGNvbXBvbmVudC4gVGhpcyBjbGFzcyB3aWxsIGF1dG9tYXRpY2FsbHkgcHVibGlzaCA8Y29kZT5oaWRlPC9jb2RlPiBhbmQgPGNvZGU+XG4gKiBzaG93PC9jb2RlPiBldmVudHMgdG8gW1tPYnNlcnZhYmxlTWFuYWdlcl1dIG9uIHRvcGljIG5hbWUgPGNvZGU+c2lkZS1zbGlkZS1wYW5lbC5bc3ViLXRvcGljLW5hbWVdLnNob3c8L2NvZGU+IGFuZCA8Y29kZT5cbiAqIHNpZGUtc2xpZGUtcGFuZWwuW3N1Yi10b3BpYy1uYW1lXS5oaWRlPC9jb2RlPiByZXNwZWN0aXZlbHkuIFlvdSBjYW4gYWxzbyBjb250cm9sIHRoZSBzaG93L2hpZGUgc3RhdGUgb2YgdGhpcyBjb21wb25lbnRcbiAqIHZpYSBbW09ic2VydmFibGVNYW5hZ2VyXV0gYnkgcHVibGlzaGluZyA8Y29kZT5ib29sZWFuPC9jb2RlPiB0byA8Y29kZT5zaWRlLXNsaWRlLXBhbmVsLltzdWItdG9waWMtbmFtZV0uY21kPC9jb2RlPiB0b3BpYy5cbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIG1ldGhvZCBbW29uTG9zdEZvY3VzXV0gdG8gYXV0b21hdGljYWxseSBoaWRlIHRoaXMgY29tcG9uZW50IHdoZW4gZm9jdXMgbG9zdC5cbiAqIDwvcD5cbiAqXG4gKiBAYXV0aG9yIHNoaW9yaW4sIHRlZTRjdXRlXG4gKiBAc2VlIFtbT2JzZXJ2YWJsZU1hbmFnZXJdXVxuICogQHNlZSBbW0lOZWVkRm9jdXNdXVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTaWRlU2xpZGVQYW5lbCBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbkF3YXJlLCBPbkluaXQsIElOZWVkRm9jdXMge1xuXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBTVUJfVE9QSUNfTkFNRTogc3RyaW5nID0gU1VCX1RPUElDX05BTUU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBTSE9XX1RPUElDX05BTUU6IHN0cmluZyA9IFNIT1dfVE9QSUNfTkFNRTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEhJREVfVE9QSUNfTkFNRTogc3RyaW5nID0gSElERV9UT1BJQ19OQU1FO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ01EX1RPUElDX05BTUU6IHN0cmluZyA9IENNRF9UT1BJQ19OQU1FO1xuXG4gICAgcHVibGljIHN0YXRpYyBnZXRTaG93VG9waWNOYW1lKHN1YlRvcGljTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHN1YlRvcGljTmFtZSA9PT0gbnVsbCB8fCB0eXBlb2Ygc3ViVG9waWNOYW1lID09PSAndW5kZWZpbmVkJyB8fCBzdWJUb3BpY05hbWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gQWJzdHJhY3RTaWRlU2xpZGVQYW5lbC5TSE9XX1RPUElDX05BTUU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ViVG9waWNOYW1lLmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgICAgICBzdWJUb3BpY05hbWUgPSBzdWJUb3BpY05hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1YlRvcGljTmFtZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBBYnN0cmFjdFNpZGVTbGlkZVBhbmVsLlNIT1dfVE9QSUNfTkFNRTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdWJUb3BpY05hbWUuY2hhckF0KHN1YlRvcGljTmFtZS5sZW5ndGggLSAxKSAhPT0gJy4nKSB7XG4gICAgICAgICAgICBzdWJUb3BpY05hbWUgKz0gJy4nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFRPUElDX05BTUVfUFJFRklYICsgc3ViVG9waWNOYW1lICsgU0hPV19TVUZGSVg7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRIaWRlVG9waWNOYW1lKHN1YlRvcGljTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHN1YlRvcGljTmFtZSA9PT0gbnVsbCB8fCB0eXBlb2Ygc3ViVG9waWNOYW1lID09PSAndW5kZWZpbmVkJyB8fCBzdWJUb3BpY05hbWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gQWJzdHJhY3RTaWRlU2xpZGVQYW5lbC5ISURFX1RPUElDX05BTUU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ViVG9waWNOYW1lLmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgICAgICBzdWJUb3BpY05hbWUgPSBzdWJUb3BpY05hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1YlRvcGljTmFtZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBBYnN0cmFjdFNpZGVTbGlkZVBhbmVsLkhJREVfVE9QSUNfTkFNRTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdWJUb3BpY05hbWUuY2hhckF0KHN1YlRvcGljTmFtZS5sZW5ndGggLSAxKSAhPT0gJy4nKSB7XG4gICAgICAgICAgICBzdWJUb3BpY05hbWUgKz0gJy4nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFRPUElDX05BTUVfUFJFRklYICsgc3ViVG9waWNOYW1lICsgSElERV9TVUZGSVg7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDbWRUb3BpY05hbWUoc3ViVG9waWNOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoc3ViVG9waWNOYW1lID09PSBudWxsIHx8IHR5cGVvZiBzdWJUb3BpY05hbWUgPT09ICd1bmRlZmluZWQnIHx8IHN1YlRvcGljTmFtZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBBYnN0cmFjdFNpZGVTbGlkZVBhbmVsLkNNRF9UT1BJQ19OQU1FO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1YlRvcGljTmFtZS5jaGFyQXQoMCkgPT09ICcuJykge1xuICAgICAgICAgICAgc3ViVG9waWNOYW1lID0gc3ViVG9waWNOYW1lLnN1YnN0cmluZygxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdWJUb3BpY05hbWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gQWJzdHJhY3RTaWRlU2xpZGVQYW5lbC5DTURfVE9QSUNfTkFNRTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdWJUb3BpY05hbWUuY2hhckF0KHN1YlRvcGljTmFtZS5sZW5ndGggLSAxKSAhPT0gJy4nKSB7XG4gICAgICAgICAgICBzdWJUb3BpY05hbWUgKz0gJy4nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFRPUElDX05BTUVfUFJFRklYICsgc3ViVG9waWNOYW1lICsgQ01EX1NVRkZJWDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcGhsb3hBcHBTZXJ2aWNlOiBQaGxveEFwcFNlcnZpY2U7XG4gICAgcHJvdGVjdGVkIG9ic2VydmFibGVNZ3I6IE9ic2VydmFibGVNYW5hZ2VyO1xuICAgIHByb3RlY3RlZCBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlO1xuICAgIHByb3RlY3RlZCBhY3RpdmU6IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIHN1YlRvcGljTmFtZTogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBzaG93U3ViamVjdHM6IFN1YmplY3Q8YW55PltdO1xuICAgIHByb3RlY3RlZCBoaWRlU3ViamVjdHM6IFN1YmplY3Q8YW55PltdO1xuXG4gICAgcHJpdmF0ZSBnZXQgYXBwKCk6IFBobG94QXBwIHtcbiAgICAgICAgaWYgKHRoaXMucGhsb3hBcHBTZXJ2aWNlID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLnBobG94QXBwU2VydmljZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBobG94QXBwU2VydmljZS5nZXRJbnN0YW5jZSgpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHBobG94QXBwU2VydmljZTogUGhsb3hBcHBTZXJ2aWNlLCBvYnNlcnZhYmxlTWdyOiBPYnNlcnZhYmxlTWFuYWdlciwgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSwgc3ViVG9waWNOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHBobG94QXBwU2VydmljZSAhPT0gbnVsbCAmJiB0eXBlb2YgcGhsb3hBcHBTZXJ2aWNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5waGxveEFwcFNlcnZpY2UgPSBwaGxveEFwcFNlcnZpY2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vYnNlcnZhYmxlTWdyID0gb2JzZXJ2YWJsZU1ncjtcbiAgICAgICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlID0gbmVlZEZvY3VzU2VydmljZTtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdWJUb3BpY05hbWUgPSBzdWJUb3BpY05hbWU7XG4gICAgICAgIHRoaXMuc2hvd1N1YmplY3RzID0gW107XG4gICAgICAgIHRoaXMuaGlkZVN1YmplY3RzID0gW107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0U2lkZVNsaWRlRXZlbnRUb3BpY3Moc2hvd1RvcGljOiBzdHJpbmcsIGhpZGVUb3BpYzogc3RyaW5nLCBzaG93Q21kVG9waWM6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICAvLyBDcmVhdGUgY2hhbmdlIGV2ZW50IG9ic2VydmFibGUgdG9waWNzXG4gICAgICAgIGlmIChzaG93VG9waWMgIT09IG51bGwgJiYgdHlwZW9mIHNob3dUb3BpYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aGlzLnNob3dTdWJqZWN0cy5wdXNoKHRoaXMub2JzZXJ2YWJsZU1nci5jcmVhdGVTdWJqZWN0KHNob3dUb3BpYykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoaWRlVG9waWMgIT09IG51bGwgJiYgdHlwZW9mIGhpZGVUb3BpYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aGlzLmhpZGVTdWJqZWN0cy5wdXNoKHRoaXMub2JzZXJ2YWJsZU1nci5jcmVhdGVTdWJqZWN0KGhpZGVUb3BpYykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3Vic2NyaWJlIG9uIENNRCB0b3BpY3NcbiAgICAgICAgaWYgKHNob3dDbWRUb3BpYyAhPT0gbnVsbCAmJiB0eXBlb2Ygc2hvd0NtZFRvcGljID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZU1nci5zdWJzY3JpYmUoc2hvd0NtZFRvcGljLCAoc2hvdzogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2hvdyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IHNob3c7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgLy8gSW5pdCBzdXBlciBjbGFzcyBldmVudCB0b3BpY3NcbiAgICAgICAgdGhpcy5pbml0U2lkZVNsaWRlRXZlbnRUb3BpY3MoXG4gICAgICAgICAgICBBYnN0cmFjdFNpZGVTbGlkZVBhbmVsLlNIT1dfVE9QSUNfTkFNRSxcbiAgICAgICAgICAgIEFic3RyYWN0U2lkZVNsaWRlUGFuZWwuSElERV9UT1BJQ19OQU1FLFxuICAgICAgICAgICAgQWJzdHJhY3RTaWRlU2xpZGVQYW5lbC5DTURfVE9QSUNfTkFNRVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aGlzLnN1YlRvcGljTmFtZSAhPT0gbnVsbCAmJiB0aGlzLnN1YlRvcGljTmFtZSAhPT0gJycgfHwgdHlwZW9mIHRoaXMuc3ViVG9waWNOYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gSW5pdCBzdWIgdG9waWMgZXZlbnQgdG9waWNzXG4gICAgICAgICAgICB0aGlzLmluaXRTaWRlU2xpZGVFdmVudFRvcGljcyhcbiAgICAgICAgICAgICAgICBBYnN0cmFjdFNpZGVTbGlkZVBhbmVsLmdldFNob3dUb3BpY05hbWUodGhpcy5zdWJUb3BpY05hbWUpLFxuICAgICAgICAgICAgICAgIEFic3RyYWN0U2lkZVNsaWRlUGFuZWwuZ2V0SGlkZVRvcGljTmFtZSh0aGlzLnN1YlRvcGljTmFtZSksXG4gICAgICAgICAgICAgICAgQWJzdHJhY3RTaWRlU2xpZGVQYW5lbC5nZXRDbWRUb3BpY05hbWUodGhpcy5zdWJUb3BpY05hbWUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFwcGxpY2F0aW9uKCk6IFBobG94QXBwIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDFlbTtcIj5cbiAgICAgKiBTaG93IHRoaXMgY29tcG9uZW50LiBUaGlzIG1ldGhvZCBhbHNvIHB1Ymxpc2hlcyBhbiBldmVudCB0byB0b3BpYyA8Y29kZT5zaWRlLXNsaWRlLXBhbmVsLltzdWItdG9waWMtbmFtZV0uc2hvdzwvY29kZT4uXG4gICAgICogPC9wPlxuICAgICAqL1xuICAgIHB1YmxpYyBzaG93KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zaG93U3ViamVjdHMpKSB7XG4gICAgICAgICAgICAvLyBFbWl0IGNoYW5nZSBldmVudFxuICAgICAgICAgICAgdGhpcy5zaG93U3ViamVjdHMuZm9yRWFjaCgob2JzdiwgaWR4KSA9PiB7XG4gICAgICAgICAgICAgICAgb2Jzdi5uZXh0KHRoaXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAxZW07XCI+XG4gICAgICogSGlkZSB0aGlzIGNvbXBvbmVudC4gVGhpcyBtZXRob2QgYWxzbyBwdWJsaXNoZXMgYW4gZXZlbnQgdG8gdG9waWMgPGNvZGU+c2lkZS1zbGlkZS1wYW5lbC5bc3ViLXRvcGljLW5hbWVdLmhpZGU8L2NvZGU+LlxuICAgICAqIDwvcD5cbiAgICAgKi9cbiAgICBwdWJsaWMgaGlkZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmhpZGVTdWJqZWN0cykpIHtcbiAgICAgICAgICAgIC8vIEVtaXQgY2hhbmdlIGV2ZW50XG4gICAgICAgICAgICB0aGlzLmhpZGVTdWJqZWN0cy5mb3JFYWNoKChvYnN2LCBpZHgpID0+IHtcbiAgICAgICAgICAgICAgICBvYnN2Lm5leHQodGhpcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDFlbTtcIj5cbiAgICAgKiBUb2dnbGUgc2hvdy9oaWRlIHRoaXMgY29tcG9uZW50LiAgVGhpcyBtZXRob2QgYWxzbyBwdWJsaXNoZXMgYW4gZXZlbnQgdG8gdG9waWMgPGNvZGU+c2lkZS1zbGlkZS1wYW5lbC5bc3ViLXRvcGljLW5hbWVdLnNob3c8L2NvZGU+XG4gICAgICogYW5kIDxjb2RlPnNpZGUtc2xpZGUtcGFuZWwuW3N1Yi10b3BpYy1uYW1lXS5oaWRlPC9jb2RlPiB3aGVuIHRoZSBjb21wb25lbnQgaXMgc2hvd24gb3IgaGlkZGVuIHJlc3BlY3RpdmVseS5cbiAgICAgKiA8L3A+XG4gICAgICovXG4gICAgcHVibGljIG9uVG9nZ2xlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2UucmVzZXRGb2N1c2luZ0NvbXBvbmVudCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgICAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2Uuc2V0Rm9jdXNpbmdDb21wb25lbnQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25Gb2N1cyhldmVudDogYW55KTogdm9pZCB7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgb25Mb3N0Rm9jdXMoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN1YlRvcGljTmFtZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuc3ViVG9waWNOYW1lO1xuICAgIH1cbn1cbiJdfQ==