@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
195 lines • 19.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: movable.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, HostListener, ElementRef, Input } from '@angular/core';
export class MovableDirective {
/**
* @param {?} el
*/
constructor(el) {
this.el = el;
this.topStart = 0;
this.leftStart = 0;
this._allowDrag = false;
this.checkHandleTarget = (/**
* @param {?} target
* @param {?} element
* @return {?}
*/
function (target, element) {
if (!element) {
return false;
}
// Checks if the target is the element clicked, then checks each child element of element as well
// Ignores button clicks
// Ignore elements of type button
if (element.tagName === 'BUTTON') {
return false;
}
// If the target was found, return true (handle was found)
if (element === target) {
return true;
}
// Recursively iterate this elements children
for (const /** @type {?} */ child in element.children) {
if (element.children.hasOwnProperty(child)) {
if (this.checkHandleTarget(target, element.children[child])) {
return true;
}
}
}
// Handle was not found in this lineage
// Note: return false is ignore unless it is the parent element
return false;
});
}
/**
* @return {?}
*/
ngOnInit() {
this.element = this.moveEl || this.el.nativeElement;
// css changes
if (this._allowDrag) {
this.element.style.position = 'relative';
}
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes['moveEl']) {
this.element = this.moveEl || this.el.nativeElement;
}
}
/**
* @param {?} event
* @return {?}
*/
onMouseDown(event) {
if (event.button === 2 || !this.checkHandleTarget(event.target, this.handle)) {
return; // prevents right click drag, remove his if you don't want it
}
this.md = true;
this.topStart = event.clientY - this.element.style.top.replace('px', '');
this.leftStart = event.clientX - this.element.style.left.replace('px', '');
}
/**
* @param {?} event
* @return {?}
*/
onMouseUp(event) {
this.md = false;
}
/**
* @param {?} event
* @return {?}
*/
onMouseMove(event) {
if (this.md && this._allowDrag) {
// 阻止拖动过程中文字被选中
event.stopPropagation();
event.preventDefault();
// 判断边界条件
/** @type {?} */
const modalRect = this.element.getBoundingClientRect();
/** @type {?} */
const parentRect = this.element.parentNode.getBoundingClientRect();
// 当前偏移量
/** @type {?} */
let currentTop = event.clientY - this.topStart;
/** @type {?} */
let currentLeft = event.clientX - this.leftStart;
// 计算上下距离,按照parentNode的位置计算偏移量,后续parentNode存在偏移量,需要考虑偏移量
/** @type {?} */
const maxTop = window.innerHeight - parentRect.top - modalRect.height;
currentTop = ((parentRect.top + currentTop) <= 0 && -parentRect.top) || ((maxTop - currentTop <= 0) && maxTop) || currentTop;
/** @type {?} */
const halfWidth = (window.innerWidth - modalRect.width) / 2;
// 计算左右距离,默认居中,后续parentNode存在偏移量,需要考虑偏移量
currentLeft = ((currentLeft + halfWidth) <= 0 && -halfWidth) || ((halfWidth - currentLeft) <= 0 && halfWidth) || currentLeft;
this.element.style.top = currentTop + 'px';
this.element.style.left = currentLeft + 'px';
}
}
/**
* @param {?} event
* @return {?}
*/
onTouchStart(event) {
this.md = true;
this.topStart = event.changedTouches[0].clientY - this.element.style.top.replace('px', '');
this.leftStart = event.changedTouches[0].clientX - this.element.style.left.replace('px', '');
event.stopPropagation();
}
/**
* @return {?}
*/
onTouchEnd() {
this.md = false;
}
/**
* @param {?} event
* @return {?}
*/
onTouchMove(event) {
if (this.md && this._allowDrag) {
this.element.style.top = (event.changedTouches[0].clientY - this.topStart) + 'px';
this.element.style.left = (event.changedTouches[0].clientX - this.leftStart) + 'px';
}
event.stopPropagation();
}
/**
* @param {?} value
* @return {?}
*/
set allowDrag(value) {
this._allowDrag = value;
if (this._allowDrag) {
this.handle.style.cursor = 'move';
}
}
}
MovableDirective.decorators = [
{ type: Directive, args: [{
selector: '[dMovable]'
},] }
];
/** @nocollapse */
MovableDirective.ctorParameters = () => [
{ type: ElementRef }
];
MovableDirective.propDecorators = {
handle: [{ type: Input }],
moveEl: [{ type: Input }],
onMouseDown: [{ type: HostListener, args: ['mousedown', ['$event'],] }],
onMouseUp: [{ type: HostListener, args: ['document:mouseup', ['$event'],] }],
onMouseMove: [{ type: HostListener, args: ['document:mousemove', ['$event'],] }],
onTouchStart: [{ type: HostListener, args: ['touchstart', ['$event'],] }],
onTouchEnd: [{ type: HostListener, args: ['document:touchend',] }],
onTouchMove: [{ type: HostListener, args: ['document:touchmove', ['$event'],] }],
allowDrag: [{ type: Input, args: ['dMovable',] }]
};
if (false) {
/** @type {?} */
MovableDirective.prototype.topStart;
/** @type {?} */
MovableDirective.prototype.leftStart;
/** @type {?} */
MovableDirective.prototype._allowDrag;
/** @type {?} */
MovableDirective.prototype.md;
/** @type {?} */
MovableDirective.prototype.handle;
/** @type {?} */
MovableDirective.prototype.moveEl;
/** @type {?} */
MovableDirective.prototype.element;
/** @type {?} */
MovableDirective.prototype.checkHandleTarget;
/** @type {?} */
MovableDirective.prototype.el;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92YWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9tb2RhbC8iLCJzb3VyY2VzIjpbIm1vdmFibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFVLEtBQUssRUFBMkIsTUFBTSxlQUFlLENBQUM7QUFLM0csTUFBTSxPQUFPLGdCQUFnQjs7OztJQVN6QixZQUFtQixFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQVJqQyxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFrRm5CLHNCQUFpQjs7Ozs7UUFBRyxVQUFVLE1BQU0sRUFBRSxPQUFPO1lBQzNDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osT0FBTyxLQUFLLENBQUM7YUFDZDtZQUNELGlHQUFpRztZQUNqRyx3QkFBd0I7WUFDeEIsaUNBQWlDO1lBQ2pDLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUU7Z0JBQzlCLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBQ0QsMERBQTBEO1lBQzFELElBQUksT0FBTyxLQUFLLE1BQU0sRUFBRTtnQkFDcEIsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUNELDZDQUE2QztZQUM3QyxLQUFLLE1BQU0sZ0JBQWdCLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7Z0JBQ25ELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3hDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7d0JBQ3pELE9BQU8sSUFBSSxDQUFDO3FCQUNmO2lCQUNKO2FBQ0o7WUFDRCx1Q0FBdUM7WUFDdkMsK0RB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QUUsR0FBRyxJQUFJLENBQUM7U0FDdkY7UUFDRCxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDMUIsQ0FBQzs7Ozs7SUE2QkQsSUFDSSxTQUFTLENBQUMsS0FBYztRQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztTQUNuQztJQUNILENBQUM7OztZQXpISixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLFlBQVk7YUFDdkI7Ozs7WUFKZ0MsVUFBVTs7O3FCQVV0QyxLQUFLO3FCQUNMLEtBQUs7MEJBbUJMLFlBQVksU0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7d0JBVXBDLFlBQVksU0FBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQzswQkFLM0MsWUFBWSxTQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDOzJCQXVCN0MsWUFBWSxTQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQzt5QkFRckMsWUFBWSxTQUFDLG1CQUFtQjswQkFLaEMsWUFBWSxTQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDO3dCQW9DN0MsS0FBSyxTQUFDLFVBQVU7Ozs7SUEvR2pCLG9DQUFhOztJQUNiLHFDQUFjOztJQUNkLHNDQUFtQjs7SUFDbkIsOEJBQVk7O0lBQ1osa0NBQTZCOztJQUM3QixrQ0FBNkI7O0lBQzdCLG1DQUFvQjs7SUE4RXBCLDZDQXlCRTs7SUFyR1UsOEJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgT25Jbml0LCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2RNb3ZhYmxlXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIE1vdmFibGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgICB0b3BTdGFydCA9IDA7XHJcbiAgICBsZWZ0U3RhcnQgPSAwO1xyXG4gICAgX2FsbG93RHJhZyA9IGZhbHNlO1xyXG4gICAgbWQ6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBoYW5kbGU6IEhUTUxFbGVtZW50O1xyXG4gICAgQElucHV0KCkgbW92ZUVsOiBIVE1MRWxlbWVudDtcclxuICAgIHB1YmxpYyBlbGVtZW50OiBhbnk7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIGVsOiBFbGVtZW50UmVmKSB7fVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICB0aGlzLmVsZW1lbnQgPSB0aGlzLm1vdmVFbCB8fCB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgIC8vIGNzcyBjaGFuZ2VzXHJcbiAgICAgIGlmICh0aGlzLl9hbGxvd0RyYWcpIHtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICBpZiAoY2hhbmdlc1snbW92ZUVsJ10pIHtcclxuICAgICAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMubW92ZUVsIHx8IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXHJcbiAgICBvbk1vdXNlRG93bihldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAyIHx8ICF0aGlzLmNoZWNrSGFuZGxlVGFyZ2V0KGV2ZW50LnRhcmdldCwgdGhpcy5oYW5kbGUpKSB7XHJcbiAgICAgICAgcmV0dXJuOyAvLyBwcmV2ZW50cyByaWdodCBjbGljayBkcmFnLCByZW1vdmUgaGlzIGlmIHlvdSBkb24ndCB3YW50IGl0XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tZCA9IHRydWU7XHJcbiAgICAgIHRoaXMudG9wU3RhcnQgPSBldmVudC5jbGllbnRZIC0gdGhpcy5lbGVtZW50LnN0eWxlLnRvcC5yZXBsYWNlKCdweCcsICcnKTtcclxuICAgICAgdGhpcy5sZWZ0U3RhcnQgPSBldmVudC5jbGllbnRYIC0gdGhpcy5lbGVtZW50LnN0eWxlLmxlZnQucmVwbGFjZSgncHgnLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcsIFsnJGV2ZW50J10pXHJcbiAgICBvbk1vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgdGhpcy5tZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlbW92ZScsIFsnJGV2ZW50J10pXHJcbiAgICBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICBpZiAodGhpcy5tZCAmJiB0aGlzLl9hbGxvd0RyYWcpIHtcclxuICAgICAgICAvLyDpmLvmraLmi5bliqjov4fnqIvkuK3mloflrZfooqvpgInkuK1cclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIC8vIOWIpOaWrei+ueeVjOadoeS7tlxyXG4gICAgICAgIGNvbnN0IG1vZGFsUmVjdCA9IHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBwYXJlbnRSZWN0ID0gdGhpcy5lbGVtZW50LnBhcmVudE5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgLy8g5b2T5YmN5YGP56e76YePXHJcbiAgICAgICAgbGV0IGN1cnJlbnRUb3AgPSBldmVudC5jbGllbnRZIC0gdGhpcy50b3BTdGFydDtcclxuICAgICAgICBsZXQgY3VycmVudExlZnQgPSBldmVudC5jbGllbnRYIC0gdGhpcy5sZWZ0U3RhcnQ7XHJcbiAgICAgICAgLy8g6K6h566X5LiK5LiL6Led56a777yM5oyJ54WncGFyZW50Tm9kZeeahOS9jee9ruiuoeeul+WBj+enu+mHj++8jOWQjue7rXBhcmVudE5vZGXlrZjlnKjlgY/np7vph4/vvIzpnIDopoHogIPomZHlgY/np7vph49cclxuICAgICAgICBjb25zdCBtYXhUb3AgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSBwYXJlbnRSZWN0LnRvcCAtIG1vZGFsUmVjdC5oZWlnaHQ7XHJcbiAgICAgICAgY3VycmVudFRvcCA9ICgocGFyZW50UmVjdC50b3AgKyBjdXJyZW50VG9wKSA8PSAwICAmJiAtcGFyZW50UmVjdC50b3ApIHx8ICgobWF4VG9wIC0gY3VycmVudFRvcCA8PSAwICkgJiYgbWF4VG9wKSB8fCBjdXJyZW50VG9wO1xyXG4gICAgICAgIGNvbnN0IGhhbGZXaWR0aCA9ICh3aW5kb3cuaW5uZXJXaWR0aCAtIG1vZGFsUmVjdC53aWR0aCkgLyAyO1xyXG4gICAgICAgIC8vIOiuoeeul+W3puWPs+i3neemu++8jOm7mOiupOWxheS4re+8jOWQjue7rXBhcmVudE5vZGXlrZjlnKjlgY/np7vph4/vvIzpnIDopoHogIPomZHlgY/np7vph49cclxuICAgICAgICBjdXJyZW50TGVmdCA9ICgoY3VycmVudExlZnQgKyBoYWxmV2lkdGgpIDw9IDAgJiYgLWhhbGZXaWR0aCkgfHwgKChoYWxmV2lkdGggLSBjdXJyZW50TGVmdCkgPD0gMCAmJiBoYWxmV2lkdGgpIHx8IGN1cnJlbnRMZWZ0O1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS50b3AgPSBjdXJyZW50VG9wICsgJ3B4JztcclxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUubGVmdCA9IGN1cnJlbnRMZWZ0ICsgJ3B4JztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBbJyRldmVudCddKVxyXG4gICAgb25Ub3VjaFN0YXJ0KGV2ZW50OiBhbnkpIHtcclxuICAgICAgdGhpcy5tZCA9IHRydWU7XHJcbiAgICAgIHRoaXMudG9wU3RhcnQgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIC0gdGhpcy5lbGVtZW50LnN0eWxlLnRvcC5yZXBsYWNlKCdweCcsICcnKTtcclxuICAgICAgdGhpcy5sZWZ0U3RhcnQgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5lbGVtZW50LnN0eWxlLmxlZnQucmVwbGFjZSgncHgnLCAnJyk7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OnRvdWNoZW5kJylcclxuICAgIG9uVG91Y2hFbmQoKSB7XHJcbiAgICAgIHRoaXMubWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDp0b3VjaG1vdmUnLCBbJyRldmVudCddKVxyXG4gICAgb25Ub3VjaE1vdmUoZXZlbnQ6IGFueSkge1xyXG4gICAgICBpZiAodGhpcy5tZCAmJiB0aGlzLl9hbGxvd0RyYWcpIHtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudG9wID0gKCBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIC0gdGhpcy50b3BTdGFydCApICsgJ3B4JztcclxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUubGVmdCA9ICggZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMubGVmdFN0YXJ0ICkgKyAncHgnO1xyXG4gICAgICB9XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSGFuZGxlVGFyZ2V0ID0gZnVuY3Rpb24gKHRhcmdldCwgZWxlbWVudCkge1xyXG4gICAgICBpZiAoIWVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgLy8gQ2hlY2tzIGlmIHRoZSB0YXJnZXQgaXMgdGhlIGVsZW1lbnQgY2xpY2tlZCwgdGhlbiBjaGVja3MgZWFjaCBjaGlsZCBlbGVtZW50IG9mIGVsZW1lbnQgYXMgd2VsbFxyXG4gICAgICAvLyBJZ25vcmVzIGJ1dHRvbiBjbGlja3NcclxuICAgICAgLy8gSWdub3JlIGVsZW1lbnRzIG9mIHR5cGUgYnV0dG9uXHJcbiAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdCVVRUT04nKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgLy8gSWYgdGhlIHRhcmdldCB3YXMgZm91bmQsIHJldHVybiB0cnVlIChoYW5kbGUgd2FzIGZvdW5kKVxyXG4gICAgICBpZiAoZWxlbWVudCA9PT0gdGFyZ2V0KSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBSZWN1cnNpdmVseSBpdGVyYXRlIHRoaXMgZWxlbWVudHMgY2hpbGRyZW5cclxuICAgICAgZm9yIChjb25zdCAvKiogQHR5cGUgez99ICovIGNoaWxkIGluIGVsZW1lbnQuY2hpbGRyZW4pIHtcclxuICAgICAgICAgIGlmIChlbGVtZW50LmNoaWxkcmVuLmhhc093blByb3BlcnR5KGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrSGFuZGxlVGFyZ2V0KHRhcmdldCwgZWxlbWVudC5jaGlsZHJlbltjaGlsZF0pKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBIYW5kbGUgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGxpbmVhZ2VcclxuICAgICAgLy8gTm90ZTogcmV0dXJuIGZhbHNlIGlzIGlnbm9yZSB1bmxlc3MgaXQgaXMgdGhlIHBhcmVudCBlbGVtZW50XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH07XHJcblxyXG4gICAgQElucHV0KCdkTW92YWJsZScpXHJcbiAgICBzZXQgYWxsb3dEcmFnKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgIHRoaXMuX2FsbG93RHJhZyA9IHZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5fYWxsb3dEcmFnKSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGUuc3R5bGUuY3Vyc29yID0gJ21vdmUnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19