com.phloxui
Version:
PhloxUI Ng2+ Framework
427 lines (426 loc) • 34.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { EventEmitter } from '@angular/core';
import { Option } from '../decorator/Option.decorator';
import { EventUtils } from '../share/utils/EventUtils';
import { FOCUS_EVENT, BEFORE_LOST_FOCUS_EVENT, BEFORE_FOCUS_EVENT } from '../share/CustomEventType';
import { AbstractI18NApplicable } from '../share/AbstractI18NApplicable';
/**
* <p style="text-indent: 2em;">
* An abstract base class of clickable component (such as buttons) playing <code>ripple</code> effect when it is clicked.
* </p>
*
* @author shiorin, tee4cute
* @abstract
*/
var AbstractRippleButton = /** @class */ (function (_super) {
tslib_1.__extends(AbstractRippleButton, _super);
function AbstractRippleButton(phloxAppService, needFocusService) {
var _this = _super.call(this) || this;
if (phloxAppService !== null && typeof phloxAppService !== 'undefined') {
_this.phloxAppService = phloxAppService;
}
_this.needFocusService = needFocusService;
_this.beforeLostFocusEvent = new EventEmitter();
_this.beforeFocusEvent = new EventEmitter();
_this.lostFocusEvent = new EventEmitter();
_this.focusEvent = new EventEmitter();
return _this;
}
Object.defineProperty(AbstractRippleButton.prototype, "app", {
get: /**
* @return {?}
*/
function () {
if (this.phloxAppService === null || typeof this.phloxAppService === 'undefined') {
return null;
}
return this.phloxAppService.getInstance();
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
AbstractRippleButton.prototype.getApplication = /**
* @return {?}
*/
function () {
return this.app;
};
/**
* @param {?=} $event
* @return {?}
*/
AbstractRippleButton.prototype.emitBeforeFocusEvent = /**
* @param {?=} $event
* @return {?}
*/
function ($event) {
// emit event
var /** @type {?} */ data = null;
var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_FOCUS_EVENT, this, data, $event);
if (this.beforeFocusEvent !== null && this.beforeFocusEvent !== undefined) {
this.beforeFocusEvent.emit(ev);
}
};
/**
* @param {?} $event
* @return {?}
*/
AbstractRippleButton.prototype.emitFocusEvent = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ data = null;
var /** @type {?} */ ev = EventUtils.newCustomEvent(FOCUS_EVENT, this, data, $event);
if (this.focusEvent !== null && this.focusEvent !== undefined) {
this.focusEvent.emit(ev);
}
};
/**
* @param {?=} $event
* @return {?}
*/
AbstractRippleButton.prototype.emitBeforeLostFocusEvent = /**
* @param {?=} $event
* @return {?}
*/
function ($event) {
// emit event
var /** @type {?} */ data = null;
var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_LOST_FOCUS_EVENT, this, data, $event);
if (this.beforeLostFocusEvent !== null && this.beforeLostFocusEvent !== undefined) {
this.beforeLostFocusEvent.emit(ev);
}
};
/**
* @param {?} $event
* @return {?}
*/
AbstractRippleButton.prototype.emitLostFocusEvent = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ data = null;
var /** @type {?} */ ev = EventUtils.newCustomEvent(FOCUS_EVENT, this, data, $event);
if (this.lostFocusEvent !== null && this.lostFocusEvent !== undefined) {
this.lostFocusEvent.emit(ev);
}
};
/**
* @param {?} $event
* @param {?=} fireEvent
* @return {?}
*/
AbstractRippleButton.prototype.onLostFocus = /**
* @param {?} $event
* @param {?=} fireEvent
* @return {?}
*/
function ($event, fireEvent) {
var _this = this;
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeLostFocusEvent', $event, fireEvent, function ($event) {
// doEvent
// doEvent
_this.doLostFocus($event);
}, function ($event) {
// emitBeforeEvent
// emitBeforeEvent
_this.emitBeforeLostFocusEvent($event);
}, function ($event) {
// emitAfterEvent
// emitAfterEvent
_this.emitLostFocusEvent($event);
}, function ($event) {
// doPrevented
setTimeout(function () {
_this.doFocus($event);
}, 5);
});
};
/**
* @param {?} $event
* @param {?=} fireEvent
* @return {?}
*/
AbstractRippleButton.prototype.onFocus = /**
* @param {?} $event
* @param {?=} fireEvent
* @return {?}
*/
function ($event, fireEvent) {
var _this = this;
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeFocusEvent', $event, fireEvent, function ($event) {
// doEvent
// doEvent
_this.doFocus($event);
}, function ($event) {
// emitBeforeEvent
// emitBeforeEvent
_this.emitBeforeFocusEvent($event);
}, function ($event) {
// emitAfterEvent
// emitAfterEvent
_this.emitFocusEvent($event);
}, function ($event) {
// doPrevented
setTimeout(function () {
_this.doLostFocus($event);
}, 5);
});
};
/**
* <p style="text-indent: 1em;">
* Play a <code>ripple</code> effect at the position specified in <code><b>event</b></code> object.
* </p>
*
* @param {?} event A mouse event causing the <code>ripple</code> effect to be played. For example, a mouse click event, etc.
* @param {?=} target A target DOM element to display the effect. By default, this should be an element causing an event to
* occur (<code>event.target</code>).
* @return {?}
*/
AbstractRippleButton.prototype.playRippleEffect = /**
* <p style="text-indent: 1em;">
* Play a <code>ripple</code> effect at the position specified in <code><b>event</b></code> object.
* </p>
*
* @param {?} event A mouse event causing the <code>ripple</code> effect to be played. For example, a mouse click event, etc.
* @param {?=} target A target DOM element to display the effect. By default, this should be an element causing an event to
* occur (<code>event.target</code>).
* @return {?}
*/
function (event, target) {
var _this = this;
if (target === null || typeof target === 'undefined') {
target = event.target;
}
return new Promise(function (resolve, reject) {
try {
var /** @type {?} */ $div_1 = $('<div/>');
var /** @type {?} */ btnOffset = $(target).offset();
var /** @type {?} */ xPos = event.pageX - btnOffset.left;
var /** @type {?} */ yPos = event.pageY - btnOffset.top;
var /** @type {?} */ customBG = $(target).data("ripple-color");
$div_1.addClass('phlox-ripple-effect');
// dynamically set annimation duration from app settings
// dynamically set annimation duration from app settings
$div_1.css('animation', 'phlox-ripple-animation ' + _this.app.getAppInfo().settings.RIPPLE_EFFECT_DURATION + 's');
$div_1.css("height", $(target).height() * _this.app.getAppInfo().settings.RIPPLE_EFFECT_HEIGHT_RATIO);
$div_1.css("width", $(target).height() * _this.app.getAppInfo().settings.RIPPLE_EFFECT_WIDTH_RATIO);
$div_1.css({
top: yPos - ($div_1.height() / 2),
left: xPos - ($div_1.width() / 2)
});
if (customBG !== null && typeof customBG !== 'undefined') {
$div_1.css('background', customBG);
}
$div_1.appendTo($(target));
setTimeout(function () {
try {
$div_1.remove();
if (typeof resolve === 'function') {
resolve();
}
}
catch (/** @type {?} */ e) {
if (typeof reject === 'function') {
reject(e);
}
}
}, _this.app.getAppInfo().settings.RIPPLE_EFFECT_REMOVE_DURATION * 1000);
}
catch (/** @type {?} */ e) {
if (typeof reject === 'function') {
reject(e);
}
}
});
};
/**
* <p style="text-indent: 1em;">
* A default implementation of <code>click</code> <code>handler</code> method which automatcially plays a <code>ripple</code> effect
* ([[playRippleEffect]]) at the position specified in <code><b>event</b></code> object.
* </p>
* @param {?} event
* @return {?}
*/
AbstractRippleButton.prototype.onClick = /**
* <p style="text-indent: 1em;">
* A default implementation of <code>click</code> <code>handler</code> method which automatcially plays a <code>ripple</code> effect
* ([[playRippleEffect]]) at the position specified in <code><b>event</b></code> object.
* </p>
* @param {?} event
* @return {?}
*/
function (event) {
// Prevent event's default
event.preventDefault();
this.playRippleEffect(event);
};
/**
* @param {?} $event
* @return {?}
*/
AbstractRippleButton.prototype.onFocusing = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.needFocusService.setFocusingComponent(this, $event);
};
/**
* @param {?} $event
* @return {?}
*/
AbstractRippleButton.prototype.onLostFocusing = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.needFocusService.resetFocusingComponent($event);
};
/**
* @return {?}
*/
AbstractRippleButton.prototype.getBeforeLostFocusEvent = /**
* @return {?}
*/
function () {
return this.beforeLostFocusEvent;
};
/**
* @param {?} event
* @return {?}
*/
AbstractRippleButton.prototype.setBeforeLostFocusEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.beforeLostFocusEvent = event;
};
/**
* @return {?}
*/
AbstractRippleButton.prototype.getLostFocusEvent = /**
* @return {?}
*/
function () {
return this.lostFocusEvent;
};
/**
* @param {?} event
* @return {?}
*/
AbstractRippleButton.prototype.setLostFocusEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.lostFocusEvent = event;
};
/**
* @return {?}
*/
AbstractRippleButton.prototype.getBeforeFocusEvent = /**
* @return {?}
*/
function () {
return this.beforeFocusEvent;
};
/**
* @param {?} event
* @return {?}
*/
AbstractRippleButton.prototype.setBeforeFocusEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.beforeFocusEvent = event;
};
/**
* @return {?}
*/
AbstractRippleButton.prototype.getFocusEvent = /**
* @return {?}
*/
function () {
return this.focusEvent;
};
/**
* @param {?} event
* @return {?}
*/
AbstractRippleButton.prototype.setFocusEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.focusEvent = event;
};
tslib_1.__decorate([
Option('beforeFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractRippleButton.prototype, "beforeFocusEvent", void 0);
tslib_1.__decorate([
Option('focus'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractRippleButton.prototype, "focusEvent", void 0);
tslib_1.__decorate([
Option('beforeLostFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractRippleButton.prototype, "beforeLostFocusEvent", void 0);
tslib_1.__decorate([
Option('lostFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractRippleButton.prototype, "lostFocusEvent", void 0);
tslib_1.__decorate([
Option('beforeChange'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractRippleButton.prototype, "beforeChangeEvent", void 0);
return AbstractRippleButton;
}(AbstractI18NApplicable));
export { AbstractRippleButton };
function AbstractRippleButton_tsickle_Closure_declarations() {
/** @type {?} */
AbstractRippleButton.prototype.beforeFocusEvent;
/** @type {?} */
AbstractRippleButton.prototype.focusEvent;
/** @type {?} */
AbstractRippleButton.prototype.beforeLostFocusEvent;
/** @type {?} */
AbstractRippleButton.prototype.lostFocusEvent;
/** @type {?} */
AbstractRippleButton.prototype.beforeChangeEvent;
/** @type {?} */
AbstractRippleButton.prototype.phloxAppService;
/** @type {?} */
AbstractRippleButton.prototype.needFocusService;
/**
* @abstract
* @param {?} $event
* @return {?}
*/
AbstractRippleButton.prototype.doFocus = function ($event) { };
/**
* @abstract
* @param {?} $event
* @return {?}
*/
AbstractRippleButton.prototype.doLostFocus = function ($event) { };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RSaXBwbGVCdXR0b24uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvQWJzdHJhY3RSaXBwbGVCdXR0b24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBTTdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUNhLFdBQVcsRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFDM0UsTUFBTSwwQkFBMEIsQ0FBQztBQUVsQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7Ozs7OztJQVl0QixnREFBc0I7SUFzQnZFLDhCQUFZLGVBQWdDLEVBQUUsZ0JBQWtDO1FBQWhGLFlBQ0UsaUJBQU8sU0FZUjtRQVZDLEVBQUUsQ0FBQyxDQUFDLGVBQWUsS0FBSyxJQUFJLElBQUksT0FBTyxlQUFlLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztZQUN2RSxLQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztTQUN4QztRQUVELEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUV6QyxLQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMvQyxLQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQyxLQUFJLENBQUMsY0FBYyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDekMsS0FBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDOztLQUN0QzswQkFwQlcscUNBQUc7Ozs7O1lBQ2IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJ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Q0FBQyxXQUFXLENBQUM7MENBQ00sWUFBWTs7O1FBQ3JDLE1BQU0sQ0FBQyxjQUFjLENBQUM7MENBQ00sWUFBWTs7K0JBbkMzQztFQXdCbUQsc0JBQXNCO1NBQW5ELG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUFwcGxpY2F0aW9uQXdhcmUgfSBmcm9tICcuL0lBcHBsaWNhdGlvbkF3YXJlJztcbmltcG9ydCB7IFBobG94QXBwIH0gZnJvbSAnLi9QaGxveEFwcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGhsb3hBcHBTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9QaGxveEFwcFNlcnZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBOZWVkRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9OZWVkRm9jdXNTZXJ2aWNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSU5lZWRGb2N1cyB9IGZyb20gJy4uL2NvbXBvbmVudC9JTmVlZEZvY3VzJztcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcbmltcG9ydCB7XG4gIExPU1RfRk9DVVNfRVZFTlQsIEZPQ1VTX0VWRU5ULCBCRUZPUkVfTE9TVF9GT0NVU19FVkVOVCwgQkVGT1JFX0ZPQ1VTX0VWRU5UXG59IGZyb20gJy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0STE4TkFwcGxpY2FibGUgfSBmcm9tICcuLi9zaGFyZS9BYnN0cmFjdEkxOE5BcHBsaWNhYmxlJztcblxuLy8gRGVjbGFyZSBqUXVlcnkgdmFyXG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cbi8qKlxuICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMmVtO1wiPlxuICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBjbGlja2FibGUgY29tcG9uZW50IChzdWNoIGFzIGJ1dHRvbnMpIHBsYXlpbmcgPGNvZGU+cmlwcGxlPC9jb2RlPiBlZmZlY3Qgd2hlbiBpdCBpcyBjbGlja2VkLlxuICogPC9wPlxuICpcbiAqIEBhdXRob3Igc2hpb3JpbiwgdGVlNGN1dGVcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmlwcGxlQnV0dG9uIGV4dGVuZHMgQWJzdHJhY3RJMThOQXBwbGljYWJsZSBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbkF3YXJlLCBJTmVlZEZvY3VzIHtcblxuICBAT3B0aW9uKCdiZWZvcmVGb2N1cycpXG4gIHByb3RlY3RlZCBiZWZvcmVGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignZm9jdXMnKVxuICBwcm90ZWN0ZWQgZm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2JlZm9yZUxvc3RGb2N1cycpXG4gIHByb3RlY3RlZCBiZWZvcmVMb3N0Rm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2xvc3RGb2N1cycpXG4gIHByb3RlY3RlZCBsb3N0Rm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2JlZm9yZUNoYW5nZScpXG4gIHByb3RlY3RlZCBiZWZvcmVDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIHByb3RlY3RlZCBwaGxveEFwcFNlcnZpY2U6IFBobG94QXBwU2VydmljZTtcbiAgcHJvdGVjdGVkIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2U7XG5cbiAgcHJpdmF0ZSBnZXQgYXBwKCk6IFBobG94QXBwIHtcbiAgICBpZiAodGhpcy5waGxveEFwcFNlcnZpY2UgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMucGhsb3hBcHBTZXJ2aWNlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBobG94QXBwU2VydmljZS5nZXRJbnN0YW5jZSgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocGhsb3hBcHBTZXJ2aWNlOiBQaGxveEFwcFNlcnZpY2UsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKHBobG94QXBwU2VydmljZSAhPT0gbnVsbCAmJiB0eXBlb2YgcGhsb3hBcHBTZXJ2aWNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5waGxveEFwcFNlcnZpY2UgPSBwaGxveEFwcFNlcnZpY2U7XG4gICAgfVxuXG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlID0gbmVlZEZvY3VzU2VydmljZTtcblxuICAgIHRoaXMuYmVmb3JlTG9zdEZvY3VzRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5iZWZvcmVGb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMubG9zdEZvY3VzRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5mb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICB9XG5cbiAgcHVibGljIGdldEFwcGxpY2F0aW9uKCk6IFBobG94QXBwIHtcbiAgICByZXR1cm4gdGhpcy5hcHA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZUZvY3VzRXZlbnQoJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgLy8gZW1pdCBldmVudFxuICAgIGxldCBkYXRhOiBhbnkgPSBudWxsO1xuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0ZPQ1VTX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuYmVmb3JlRm9jdXNFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmJlZm9yZUZvY3VzRXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5iZWZvcmVGb2N1c0V2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0Rm9jdXNFdmVudCgkZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGxldCBkYXRhOiBhbnkgPSBudWxsO1xuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoRk9DVVNfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XG5cbiAgICBpZiAodGhpcy5mb2N1c0V2ZW50ICE9PSBudWxsICYmIHRoaXMuZm9jdXNFdmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZvY3VzRXZlbnQuZW1pdChldik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVMb3N0Rm9jdXNFdmVudCgkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICAvLyBlbWl0IGV2ZW50XG4gICAgbGV0IGRhdGE6IGFueSA9IG51bGw7XG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfTE9TVF9GT0NVU19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmJlZm9yZUxvc3RGb2N1c0V2ZW50ICE9PSBudWxsICYmIHRoaXMuYmVmb3JlTG9zdEZvY3VzRXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5iZWZvcmVMb3N0Rm9jdXNFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdExvc3RGb2N1c0V2ZW50KCRldmVudDogYW55KTogdm9pZCB7XG4gICAgbGV0IGRhdGE6IGFueSA9IG51bGw7XG5cbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEZPQ1VTX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMubG9zdEZvY3VzRXZlbnQgIT09IG51bGwgJiYgdGhpcy5sb3N0Rm9jdXNFdmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvc3RGb2N1c0V2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVtaXQgZW5kIHZhbGlkYXRlXG4gIHB1YmxpYyBvbkxvc3RGb2N1cygkZXZlbnQ6IGFueSwgZmlyZUV2ZW50PzogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZUxvc3RGb2N1c0V2ZW50JywgJGV2ZW50LCBmaXJlRXZlbnQsICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb0V2ZW50XG4gICAgICB0aGlzLmRvTG9zdEZvY3VzKCRldmVudCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxuICAgICAgdGhpcy5lbWl0QmVmb3JlTG9zdEZvY3VzRXZlbnQoJGV2ZW50KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcbiAgICAgIHRoaXMuZW1pdExvc3RGb2N1c0V2ZW50KCRldmVudCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvUHJldmVudGVkXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5kb0ZvY3VzKCRldmVudCk7XG4gICAgICB9LCA1KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkZvY3VzKCRldmVudDogYW55LCBmaXJlRXZlbnQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGZpcmVFdmVudCA9PT0gbnVsbCB8fCBmaXJlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlRm9jdXNFdmVudCcsICRldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZG9FdmVudFxuICAgICAgdGhpcy5kb0ZvY3VzKCRldmVudCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxuICAgICAgdGhpcy5lbWl0QmVmb3JlRm9jdXNFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBlbWl0QWZ0ZXJFdmVudFxuICAgICAgdGhpcy5lbWl0Rm9jdXNFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb1ByZXZlbnRlZFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZG9Mb3N0Rm9jdXMoJGV2ZW50KTtcbiAgICAgIH0sIDUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDFlbTtcIj5cbiAgICogUGxheSBhIDxjb2RlPnJpcHBsZTwvY29kZT4gZWZmZWN0IGF0IHRoZSBwb3NpdGlvbiBzcGVjaWZpZWQgaW4gPGNvZGU+PGI+ZXZlbnQ8L2I+PC9jb2RlPiBvYmplY3QuXG4gICAqIDwvcD5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IEEgbW91c2UgZXZlbnQgY2F1c2luZyB0aGUgPGNvZGU+cmlwcGxlPC9jb2RlPiBlZmZlY3QgdG8gYmUgcGxheWVkLiBGb3IgZXhhbXBsZSwgYSBtb3VzZSBjbGljayBldmVudCwgZXRjLlxuICAgKiBAcGFyYW0gdGFyZ2V0IEEgdGFyZ2V0IERPTSBlbGVtZW50IHRvIGRpc3BsYXkgdGhlIGVmZmVjdC4gQnkgZGVmYXVsdCwgdGhpcyBzaG91bGQgYmUgYW4gZWxlbWVudCBjYXVzaW5nIGFuIGV2ZW50IHRvXG4gICAqIG9jY3VyICg8Y29kZT5ldmVudC50YXJnZXQ8L2NvZGU+KS5cbiAgICovXG4gIHB1YmxpYyBwbGF5UmlwcGxlRWZmZWN0KGV2ZW50OiBNb3VzZUV2ZW50LCB0YXJnZXQ/OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0YXJnZXQgPT09IG51bGwgfHwgdHlwZW9mIHRhcmdldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0ICRkaXY6IGFueSA9ICQoJzxkaXYvPicpO1xuICAgICAgICBsZXQgYnRuT2Zmc2V0OiBhbnkgPSAkKHRhcmdldCkub2Zmc2V0KCk7XG4gICAgICAgIGxldCB4UG9zOiBhbnkgPSBldmVudC5wYWdlWCAtIGJ0bk9mZnNldC5sZWZ0O1xuICAgICAgICBsZXQgeVBvczogYW55ID0gZXZlbnQucGFnZVkgLSBidG5PZmZzZXQudG9wO1xuICAgICAgICBsZXQgY3VzdG9tQkc6IGFueSA9ICQodGFyZ2V0KS5kYXRhKFwicmlwcGxlLWNvbG9yXCIpO1xuXG4gICAgICAgICRkaXYuYWRkQ2xhc3MoJ3BobG94LXJpcHBsZS1lZmZlY3QnKTtcblxuICAgICAgICAvLyBkeW5hbWljYWxseSBzZXQgYW5uaW1hdGlvbiBkdXJhdGlvbiBmcm9tIGFwcCBzZXR0aW5nc1xuICAgICAgICAkZGl2LmNzcygnYW5pbWF0aW9uJywgJ3BobG94LXJpcHBsZS1hbmltYXRpb24gJyArIHRoaXMuYXBwLmdldEFwcEluZm8oKS5zZXR0aW5ncy5SSVBQTEVfRUZGRUNUX0RVUkFUSU9OICsgJ3MnKTtcbiAgICAgICAgJGRpdi5jc3MoXCJoZWlnaHRcIiwgJCh0YXJnZXQpLmhlaWdodCgpICogdGhpcy5hcHAuZ2V0QXBwSW5mbygpLnNldHRpbmdzLlJJUFBMRV9FRkZFQ1RfSEVJR0hUX1JBVElPKTtcbiAgICAgICAgJGRpdi5jc3MoXCJ3aWR0aFwiLCAkKHRhcmdldCkuaGVpZ2h0KCkgKiB0aGlzLmFwcC5nZXRBcHBJbmZvKCkuc2V0dGluZ3MuUklQUExFX0VGRkVDVF9XSURUSF9SQVRJTyk7XG4gICAgICAgICRkaXYuY3NzKHtcbiAgICAgICAgICB0b3A6IHlQb3MgLSAoJGRpdi5oZWlnaHQoKSAvIDIpLFxuICAgICAgICAgIGxlZnQ6IHhQb3MgLSAoJGRpdi53aWR0aCgpIC8gMilcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjdXN0b21CRyAhPT0gbnVsbCAmJiB0eXBlb2YgY3VzdG9tQkcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgJGRpdi5jc3MoJ2JhY2tncm91bmQnLCBjdXN0b21CRyk7XG4gICAgICAgIH1cbiAgICAgICAgJGRpdi5hcHBlbmRUbygkKHRhcmdldCkpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICRkaXYucmVtb3ZlKCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzb2x2ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWplY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5hcHAuZ2V0QXBwSW5mbygpLnNldHRpbmdzLlJJUFBMRV9FRkZFQ1RfUkVNT1ZFX0RVUkFUSU9OICogMTAwMCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVqZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMWVtO1wiPlxuICAgKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+Y2xpY2s8L2NvZGU+IDxjb2RlPmhhbmRsZXI8L2NvZGU+IG1ldGhvZCB3aGljaCBhdXRvbWF0Y2lhbGx5IHBsYXlzIGEgPGNvZGU+cmlwcGxlPC9jb2RlPiBlZmZlY3RcbiAgICogKFtbcGxheVJpcHBsZUVmZmVjdF1dKSBhdCB0aGUgcG9zaXRpb24gc3BlY2lmaWVkIGluIDxjb2RlPjxiPmV2ZW50PC9iPjwvY29kZT4gb2JqZWN0LlxuICAgKiA8L3A+XG4gICAqL1xuICBwdWJsaWMgb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgZXZlbnQncyBkZWZhdWx0XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMucGxheVJpcHBsZUVmZmVjdChldmVudCk7XG4gIH1cblxuICBwdWJsaWMgb25Gb2N1c2luZygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnNldEZvY3VzaW5nQ29tcG9uZW50KHRoaXMsICRldmVudCk7XG4gIH1cblxuICBwdWJsaWMgb25Mb3N0Rm9jdXNpbmcoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5yZXNldEZvY3VzaW5nQ29tcG9uZW50KCRldmVudCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmVmb3JlTG9zdEZvY3VzRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJlZm9yZUxvc3RGb2N1c0V2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldEJlZm9yZUxvc3RGb2N1c0V2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pikge1xuICAgIHRoaXMuYmVmb3JlTG9zdEZvY3VzRXZlbnQgPSBldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb3N0Rm9jdXNFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMubG9zdEZvY3VzRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0TG9zdEZvY3VzRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5sb3N0Rm9jdXNFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldEJlZm9yZUZvY3VzRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJlZm9yZUZvY3VzRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QmVmb3JlRm9jdXNFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLmJlZm9yZUZvY3VzRXZlbnQgPSBldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGb2N1c0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5mb2N1c0V2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldEZvY3VzRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c0V2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZG9Gb2N1cygkZXZlbnQ6IEV2ZW50KTogdm9pZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZG9Mb3N0Rm9jdXMoJGV2ZW50OiBFdmVudCk6IHZvaWQ7XG5cbn1cbiJdfQ==