ng-devui
Version:
DevUI components based on Angular
147 lines • 20.3 kB
JavaScript
import { Directive, ElementRef, HostListener, Input } from '@angular/core';
import * as i0 from "@angular/core";
export class MovableDirective {
constructor(el) {
this.el = el;
this.topStart = 0;
this.leftStart = 0;
this._allowDrag = false;
this.checkHandleTarget = 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 (Object.prototype.hasOwnProperty.call(element.children, 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;
};
}
ngOnInit() {
this.element = this.moveEl || this.el.nativeElement;
// css changes
if (this._allowDrag) {
this.element.style.position = 'relative';
}
}
ngOnChanges(changes) {
const { moveEl, handle } = changes;
if (moveEl) {
this.element = this.moveEl || this.el.nativeElement;
}
if (handle) {
this.allowDrag = this._allowDrag;
}
}
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', '');
}
onMouseUp(event) {
this.md = false;
}
onMouseMove(event) {
if (typeof window !== 'undefined' && this.md && this._allowDrag) {
// 阻止拖动过程中文字被选中
event.stopPropagation();
event.preventDefault();
// 判断边界条件
const modalRect = this.element.getBoundingClientRect();
const parentRect = this.element.parentNode.getBoundingClientRect();
const [translateX, translateY] = this.element.style.transform.match(/\d+/g)?.map((item) => Number(item)) || [0, 0];
// 当前偏移量
let currentTop = event.clientY - this.topStart;
let currentLeft = event.clientX - this.leftStart;
// 计算上下距离,按照parentNode的位置计算偏移量,后续parentNode存在偏移量,需要考虑偏移量
const maxTop = window.innerHeight - parentRect.top - modalRect.height;
currentTop =
(parentRect.top + currentTop + translateY <= 0 && -parentRect.top - translateY) ||
(maxTop - currentTop - translateY <= 0 && maxTop - translateY) ||
currentTop;
const halfWidth = (window.innerWidth - modalRect.width) / 2;
// 计算左右距离,默认居中,后续parentNode存在偏移量,需要考虑偏移量
currentLeft =
(currentLeft + halfWidth + translateX <= 0 && -halfWidth - translateX) ||
(halfWidth - currentLeft - translateX <= 0 && halfWidth - translateX) ||
currentLeft;
this.element.style.top = currentTop + 'px';
this.element.style.left = currentLeft + 'px';
}
}
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();
}
onTouchEnd() {
this.md = false;
}
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();
}
set allowDrag(value) {
this._allowDrag = value;
if (this._allowDrag && this.handle) {
this.handle.style.cursor = 'move';
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MovableDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: MovableDirective, selector: "[dMovable]", inputs: { handle: "handle", moveEl: "moveEl", allowDrag: ["dMovable", "allowDrag"] }, host: { listeners: { "mousedown": "onMouseDown($event)", "document:mouseup": "onMouseUp($event)", "document:mousemove": "onMouseMove($event)", "touchstart": "onTouchStart($event)", "document:touchend": "onTouchEnd()", "document:touchmove": "onTouchMove($event)" } }, usesOnChanges: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MovableDirective, decorators: [{
type: Directive,
args: [{
selector: '[dMovable]',
}]
}], ctorParameters: () => [{ type: i0.ElementRef }], 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']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92YWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS9tb2RhbC9tb3ZhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFvQyxNQUFNLGVBQWUsQ0FBQzs7QUFLN0csTUFBTSxPQUFPLGdCQUFnQjtJQVMzQixZQUFtQixFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQVJqQyxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLGVBQVUsR0FBRyxLQUFLLENBQUM7UUE2Rm5CLHNCQUFpQixHQUFHLFVBQVUsTUFBTSxFQUFFLE9BQU87WUFDM0MsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNiLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELGlHQUFpRztZQUNqRyx3QkFBd0I7WUFDeEIsaUNBQWlDO1lBQ2pDLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDakMsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsMERBQTBEO1lBQzFELElBQUksT0FBTyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUN2QixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCw2Q0FBNkM7WUFDN0MsS0FBSyxNQUFNLGdCQUFnQixDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3RELElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDbEUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxD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VSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQXdCTixXQUFXO3NCQURWLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVdyQyxTQUFTO3NCQURSLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTTVDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkErQjlDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBU3RDLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxtQkFBbUI7Z0JBTWpDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFxQzFDLFNBQVM7c0JBRFosS0FBSzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbZE1vdmFibGVdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE1vdmFibGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgdG9wU3RhcnQgPSAwO1xyXG4gIGxlZnRTdGFydCA9IDA7XHJcbiAgX2FsbG93RHJhZyA9IGZhbHNlO1xyXG4gIG1kOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGhhbmRsZTogSFRNTEVsZW1lbnQ7XHJcbiAgQElucHV0KCkgbW92ZUVsOiBIVE1MRWxlbWVudDtcclxuICBwdWJsaWMgZWxlbWVudDogYW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWw6IEVsZW1lbnRSZWYpIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5lbGVtZW50ID0gdGhpcy5tb3ZlRWwgfHwgdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgLy8gY3NzIGNoYW5nZXNcclxuICAgIGlmICh0aGlzLl9hbGxvd0RyYWcpIHtcclxuICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGNvbnN0IHsgbW92ZUVsLCBoYW5kbGUgfSA9IGNoYW5nZXM7XHJcbiAgICBpZiAobW92ZUVsKSB7XHJcbiAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMubW92ZUVsIHx8IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuICAgIGlmIChoYW5kbGUpIHtcclxuICAgICAgdGhpcy5hbGxvd0RyYWcgPSB0aGlzLl9hbGxvd0RyYWc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxyXG4gIG9uTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAyIHx8ICF0aGlzLmNoZWNrSGFuZGxlVGFyZ2V0KGV2ZW50LnRhcmdldCwgdGhpcy5oYW5kbGUpKSB7XHJcbiAgICAgIHJldHVybjsgLy8gcHJldmVudHMgcmlnaHQgY2xpY2sgZHJhZywgcmVtb3ZlIGhpcyBpZiB5b3UgZG9uJ3Qgd2FudCBpdFxyXG4gICAgfVxyXG4gICAgdGhpcy5tZCA9IHRydWU7XHJcbiAgICB0aGlzLnRvcFN0YXJ0ID0gZXZlbnQuY2xpZW50WSAtIHRoaXMuZWxlbWVudC5zdHlsZS50b3AucmVwbGFjZSgncHgnLCAnJyk7XHJcbiAgICB0aGlzLmxlZnRTdGFydCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLmVsZW1lbnQuc3R5bGUubGVmdC5yZXBsYWNlKCdweCcsICcnKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNldXAnLCBbJyRldmVudCddKVxyXG4gIG9uTW91c2VVcChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgdGhpcy5tZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vtb3ZlJywgWyckZXZlbnQnXSlcclxuICBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubWQgJiYgdGhpcy5fYWxsb3dEcmFnKSB7XHJcbiAgICAgIC8vIOmYu+atouaLluWKqOi/h+eoi+S4reaWh+Wtl+iiq+mAieS4rVxyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgLy8g5Yik5pat6L6555WM5p2h5Lu2XHJcbiAgICAgIGNvbnN0IG1vZGFsUmVjdCA9IHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgY29uc3QgcGFyZW50UmVjdCA9IHRoaXMuZWxlbWVudC5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBjb25zdCBbdHJhbnNsYXRlWCwgdHJhbnNsYXRlWV0gPSB0aGlzLmVsZW1lbnQuc3R5bGUudHJhbnNmb3JtLm1hdGNoKC9cXGQrL2cpPy5tYXAoKGl0ZW0pID0+IE51bWJlcihpdGVtKSkgfHwgWzAsIDBdO1xyXG4gICAgICAvLyDlvZPliY3lgY/np7vph49cclxuICAgICAgbGV0IGN1cnJlbnRUb3AgPSBldmVudC5jbGllbnRZIC0gdGhpcy50b3BTdGFydDtcclxuICAgICAgbGV0IGN1cnJlbnRMZWZ0ID0gZXZlbnQuY2xpZW50WCAtIHRoaXMubGVmdFN0YXJ0O1xyXG4gICAgICAvLyDorqHnrpfkuIrkuIvot53nprvvvIzmjInnhadwYXJlbnROb2Rl55qE5L2N572u6K6h566X5YGP56e76YeP77yM5ZCO57utcGFyZW50Tm9kZeWtmOWcqOWBj+enu+mHj++8jOmcgOimgeiAg+iZkeWBj+enu+mHj1xyXG4gICAgICBjb25zdCBtYXhUb3AgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSBwYXJlbnRSZWN0LnRvcCAtIG1vZGFsUmVjdC5oZWlnaHQ7XHJcbiAgICAgIGN1cnJlbnRUb3AgPVxyXG4gICAgICAgIChwYXJlbnRSZWN0LnRvcCArIGN1cnJlbnRUb3AgKyB0cmFuc2xhdGVZIDw9IDAgJiYgLXBhcmVudFJlY3QudG9wIC0gdHJhbnNsYXRlWSkgfHxcclxuICAgICAgICAobWF4VG9wIC0gY3VycmVudFRvcCAtIHRyYW5zbGF0ZVkgPD0gMCAmJiBtYXhUb3AgLSB0cmFuc2xhdGVZKSB8fFxyXG4gICAgICAgIGN1cnJlbnRUb3A7XHJcbiAgICAgIGNvbnN0IGhhbGZXaWR0aCA9ICh3aW5kb3cuaW5uZXJXaWR0aCAtIG1vZGFsUmVjdC53aWR0aCkgLyAyO1xyXG4gICAgICAvLyDorqHnrpflt6blj7Pot53nprvvvIzpu5jorqTlsYXkuK3vvIzlkI7nu61wYXJlbnROb2Rl5a2Y5Zyo5YGP56e76YeP77yM6ZyA6KaB6ICD6JmR5YGP56e76YePXHJcbiAgICAgIGN1cnJlbnRMZWZ0ID1cclxuICAgICAgICAoY3VycmVudExlZnQgKyBoYWxmV2lkdGggKyB0cmFuc2xhdGVYIDw9IDAgJiYgLWhhbGZXaWR0aCAtIHRyYW5zbGF0ZVgpIHx8XHJcbiAgICAgICAgKGhhbGZXaWR0aCAtIGN1cnJlbnRMZWZ0IC0gdHJhbnNsYXRlWCA8PSAwICYmIGhhbGZXaWR0aCAtIHRyYW5zbGF0ZVgpIHx8XHJcbiAgICAgICAgY3VycmVudExlZnQ7XHJcbiAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS50b3AgPSBjdXJyZW50VG9wICsgJ3B4JztcclxuICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmxlZnQgPSBjdXJyZW50TGVmdCArICdweCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSlcclxuICBvblRvdWNoU3RhcnQoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5tZCA9IHRydWU7XHJcbiAgICB0aGlzLnRvcFN0YXJ0ID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSAtIHRoaXMuZWxlbWVudC5zdHlsZS50b3AucmVwbGFjZSgncHgnLCAnJyk7XHJcbiAgICB0aGlzLmxlZnRTdGFydCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFggLSB0aGlzLmVsZW1lbnQuc3R5bGUubGVmdC5yZXBsYWNlKCdweCcsICcnKTtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6dG91Y2hlbmQnKVxyXG4gIG9uVG91Y2hFbmQoKSB7XHJcbiAgICB0aGlzLm1kID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDp0b3VjaG1vdmUnLCBbJyRldmVudCddKVxyXG4gIG9uVG91Y2hNb3ZlKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLm1kICYmIHRoaXMuX2FsbG93RHJhZykge1xyXG4gICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudG9wID0gYCR7ZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSAtIHRoaXMudG9wU3RhcnR9cHhgO1xyXG4gICAgICB0aGlzLmVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2V2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFggLSB0aGlzLmxlZnRTdGFydH1weGA7XHJcbiAgICB9XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIGNoZWNrSGFuZGxlVGFyZ2V0ID0gZnVuY3Rpb24gKHRhcmdldCwgZWxlbWVudCkge1xyXG4gICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIENoZWNrcyBpZiB0aGUgdGFyZ2V0IGlzIHRoZSBlbGVtZW50IGNsaWNrZWQsIHRoZW4gY2hlY2tzIGVhY2ggY2hpbGQgZWxlbWVudCBvZiBlbGVtZW50IGFzIHdlbGxcclxuICAgIC8vIElnbm9yZXMgYnV0dG9uIGNsaWNrc1xyXG4gICAgLy8gSWdub3JlIGVsZW1lbnRzIG9mIHR5cGUgYnV0dG9uXHJcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnQlVUVE9OJykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBJZiB0aGUgdGFyZ2V0IHdhcyBmb3VuZCwgcmV0dXJuIHRydWUgKGhhbmRsZSB3YXMgZm91bmQpXHJcbiAgICBpZiAoZWxlbWVudCA9PT0gdGFyZ2V0KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLy8gUmVjdXJzaXZlbHkgaXRlcmF0ZSB0aGlzIGVsZW1lbnRzIGNoaWxkcmVuXHJcbiAgICBmb3IgKGNvbnN0IC8qKiBAdHlwZSB7P30gKi8gY2hpbGQgaW4gZWxlbWVudC5jaGlsZHJlbikge1xyXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVsZW1lbnQuY2hpbGRyZW4sIGNoaWxkKSkge1xyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrSGFuZGxlVGFyZ2V0KHRhcmdldCwgZWxlbWVudC5jaGlsZHJlbltjaGlsZF0pKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEhhbmRsZSB3YXMgbm90IGZvdW5kIGluIHRoaXMgbGluZWFnZVxyXG4gICAgLy8gTm90ZTogcmV0dXJuIGZhbHNlIGlzIGlnbm9yZSB1bmxlc3MgaXQgaXMgdGhlIHBhcmVudCBlbGVtZW50XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfTtcclxuXHJcbiAgQElucHV0KCdkTW92YWJsZScpXHJcbiAgc2V0IGFsbG93RHJhZyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fYWxsb3dEcmFnID0gdmFsdWU7XHJcbiAgICBpZiAodGhpcy5fYWxsb3dEcmFnICYmIHRoaXMuaGFuZGxlKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlLnN0eWxlLmN1cnNvciA9ICdtb3ZlJztcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19