@neocomplexx/ngx-neo-directives-mat
Version:
331 lines • 42.1 kB
JavaScript
// tslint:disable:indent
import { __awaiter, __decorate, __generator, __metadata } from "tslib";
import { Directive, Input, ElementRef, InjectionToken, Renderer2 } from '@angular/core';
import { Subject, BehaviorSubject, combineLatest, timer } from 'rxjs';
import { map, tap, filter, switchMap } from 'rxjs/operators';
import { OnReturnDirective } from '../onReturn.directive';
export var COMMAND_CONFIG = new InjectionToken('COMMAND_CONFIG');
export var COMMAND_DEFAULT_CONFIG = {
executingCssClass: 'executing',
};
/*
export function provideConfig(config: CommandOptions): any {
return Object.assign({}, COMMAND_DEFAULT_CONFIG, config);
} */
/**
*
* ### Example with options
* ```html
* <button [command]='saveCmd' [commandOptions]='{executingCssClass: 'in-progress'}'>Save</button>
* ```
*/
var CommandDirective = /** @class */ (function () {
function CommandDirective(renderer, element) {
this.renderer = renderer;
this.element = element;
this.stopPropagation = false;
// @HostBinding('disabled') isDisabled: boolean;
this.setEnabled = true;
this.config = COMMAND_DEFAULT_CONFIG;
this.ownDisabledState = false;
this.commandDisabledChanged = false;
}
CommandDirective.prototype.ngOnInit = function () {
var _this = this;
// console.log('[commandDirective::init]');
this.commandOptions = Object.assign({}, this.config, this.commandOptions);
if (!this.command) {
throw new Error('[commandDirective] command should be defined!');
}
else {
this.command.verifyCommandExecutionPipe();
this.command.setNextFocus(this.commandNextFocus);
this.command.setEnabledValue(this.setEnabled);
}
// if (this.element.nativeElement.localName === 'button') {
// let thisAux = this; // Set up a new observer
// var observer = new MutationObserver(function(mutations) {
// mutations.forEach(function(mutation) {
// // Check the modified attributeName is "disabled"
// if(!thisAux.commandDisabledChanged) {
// if (mutation.attributeName === "disabled") {
// thisAux.ownDisabledState = thisAux.element.nativeElement.disabled;
// }
// } else {
// thisAux.commandDisabledChanged = false;
// }
// });
// });
// // Configure to only listen to attribute changes
// var config = { attributes: true };
// // Start observing myElem
// observer.observe(this.element.nativeElement, config);
// }
this.canExecute$$ = this.command.canExecute$.pipe(tap(function (x) {
if (_this.element.nativeElement.localName === 'button') {
_this.commandDisabledChanged = true;
if (_this.commandValue == _this.command.executingParam) {
_this.element.nativeElement.disabled = !x;
// } else {
// this.element.nativeElement.disabled = !(!this.ownDisabledState && x);
}
}
})).subscribe();
this.isExecuting$$ = this.command.isExecuting$.pipe(tap(function (x) {
// console.log('[commandDirective::isExecuting$]', x);
x ? _this.renderer.addClass(_this.element.nativeElement, _this.commandOptions.executingCssClass) : _this.renderer.removeClass(_this.element.nativeElement, _this.commandOptions.executingCssClass);
})).subscribe();
if (this.isMobileOperatingSystem()) {
this.element.nativeElement.addEventListener('touchstart', function (event) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
event.preventDefault();
event.stopPropagation();
if (this.element.nativeElement.localName === 'input') {
return [2 /*return*/];
}
this.executeCommand();
return [2 /*return*/];
});
}); });
this.element.nativeElement.addEventListener('focusin', function (event) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
event.preventDefault();
event.stopPropagation();
this.executeCommand();
return [2 /*return*/];
});
}); });
}
else {
this.element.nativeElement.addEventListener('keydown', function (event) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
if ((event.which === 13 || event.keyCode === 13)) {
event.preventDefault();
event.stopPropagation();
this.executeCommand();
}
return [2 /*return*/];
});
}); });
this.element.nativeElement.addEventListener('click', function (event) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
if (this.element.nativeElement.localName === 'input') {
return [2 /*return*/];
}
event.preventDefault();
if (this.stopPropagation) {
event.stopPropagation();
}
this.executeCommand();
return [2 /*return*/];
});
}); });
}
};
CommandDirective.prototype.executeCommand = function () {
if (!this.element.nativeElement.disabled)
this.command.canExecute = true;
this.command.verifyCommandExecutionPipe();
this.command.execute(this.commandValue);
};
CommandDirective.prototype.ngOnDestroy = function () {
if (this.command) {
this.command.destroy();
}
if (this.canExecute$$) {
this.canExecute$$.unsubscribe();
}
if (this.isExecuting$$) {
this.isExecuting$$.unsubscribe();
}
};
CommandDirective.prototype.isMobileOperatingSystem = function () {
var isMobile = false;
var userAgent = navigator.userAgent || navigator.vendor;
// Windows Phone must come first because its UA also contains "Android"
if (/windows phone/i.test(userAgent)) {
isMobile = true; // "Windows Phone";
}
else if (/android/i.test(userAgent)) {
isMobile = true; // "Android";
}
else if (/iPad|iPhone|iPod/.test(userAgent)) {
// iOS detection from: http://stackoverflow.com/a/9039885/177710
isMobile = true; // "iOS";
}
isMobile = false;
return isMobile; // "unknown";
};
CommandDirective.ctorParameters = function () { return [
{ type: Renderer2 },
{ type: ElementRef }
]; };
__decorate([
Input(),
__metadata("design:type", Object)
], CommandDirective.prototype, "command", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CommandDirective.prototype, "commandOptions", void 0);
__decorate([
Input(),
__metadata("design:type", Boolean)
], CommandDirective.prototype, "commandCanExecute", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CommandDirective.prototype, "commandValue", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CommandDirective.prototype, "commandNextFocus", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CommandDirective.prototype, "stopPropagation", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CommandDirective.prototype, "setEnabled", void 0);
CommandDirective = __decorate([
Directive({
// tslint:disable-next-line:directive-selector
selector: '[command]'
}),
__metadata("design:paramtypes", [Renderer2,
ElementRef])
], CommandDirective);
return CommandDirective;
}());
export { CommandDirective };
/**
* Command object used to encapsulate information which is needed to perform an action.
*/
var Command = /** @class */ (function () {
/**
* Creates an instance of Command.
*/
function Command(executeParam, canExecute$, isAsync, delay) {
var _this = this;
this.executeParam = executeParam;
this.isAsync = isAsync;
this.delay = delay;
this.isExecuting = false;
this.isExecuting$ = new BehaviorSubject(false);
this.canExecute = true;
this.executionPipe$ = new Subject();
this.setEnabled = true;
if (canExecute$) {
this.canExecute$ = combineLatest(this.isExecuting$, canExecute$, function (isExecuting, canExecuteResult) {
// console.log('[command::combineLatest$] update!', { isExecuting, canExecuteResult });
_this.isExecuting = isExecuting;
_this.canExecute = !isExecuting && canExecuteResult;
return _this.canExecute;
});
this.canExecute$$ = this.canExecute$.subscribe();
}
else {
this.canExecute$ = this.isExecuting$.pipe(map(function (x) {
var canExecute = !x;
_this.canExecute = canExecute;
return canExecute;
}));
this.isExecuting$$ = this.isExecuting$.pipe(tap(function (x) { return _this.isExecuting = x; }))
.subscribe();
}
this.buildExecutionPipe(executeParam, isAsync, delay);
}
Command.prototype.verifyCommandExecutionPipe = function () {
if (this.executionPipe$.observers.length === 0) {
this.buildExecutionPipe(this.executeParam, this.isAsync, this.delay);
}
};
Command.prototype.execute = function (value) {
this.executingParam = value;
this.executionPipe$.next(value);
};
Command.prototype.executeWithResult = function (value) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
this.executingParam = value;
this.executionPipe$.next(value);
return [4 /*yield*/, this.result];
case 1: return [2 /*return*/, _a.sent()];
}
});
});
};
Command.prototype.destroy = function () {
if (this.executionPipe$$) {
this.executionPipe$$.unsubscribe();
}
if (this.canExecute$$) {
this.canExecute$$.unsubscribe();
}
if (this.isExecuting$$) {
this.isExecuting$$.unsubscribe();
}
if (this.isExecuting$) {
this.isExecuting$.complete();
}
if (this.asyncAction != null) {
this.asyncAction = null;
this.resultAsyncAction = null;
}
};
Command.prototype.buildExecutionPipe = function (executeParm, isAsync, delay) {
var _this = this;
var pipe$ = this.executionPipe$.pipe(filter(function () { return _this.canExecute; }), tap(function () {
_this.isExecuting$.next(true);
if (isAsync && _this.asyncAction != null) {
_this.resultAsyncAction = _this.asyncAction(undefined);
}
}));
pipe$ = isAsync
? pipe$.pipe(switchMap(function (value) {
if (delay && delay > 0) {
if (_this.delaySubscribe) {
_this.delaySubscribe.unsubscribe();
}
var delayTimer = timer(delay);
_this.delaySubscribe = delayTimer.subscribe(function (t) { executeParm(value); });
return Promise.resolve(null);
}
else {
var result = executeParm(value);
return Promise.resolve(result);
}
}))
: pipe$.pipe(tap(function (value) { executeParm(value); }));
pipe$ = pipe$.pipe(tap(function () {
// console.log('[command::excutionPipe$] do#2 - set idle');
_this.isExecuting$.next(false);
_this.executingParam = undefined;
if (isAsync && _this.asyncAction != null) {
_this.resultAsyncAction = _this.asyncAction(_this.resultAsyncAction);
}
OnReturnDirective.setNextFocus(_this.elementNextFocus, _this.setEnabled);
}, function (e) {
console.log('[command::excutionPipe$] do#2 error - set idle' + e.toString());
_this.isExecuting$.next(false);
_this.executingParam = undefined;
if (isAsync && _this.asyncAction != null) {
_this.resultAsyncAction = _this.asyncAction(_this.resultAsyncAction);
}
_this.buildExecutionPipe(executeParm, isAsync, delay);
}));
this.executionPipe$$ = pipe$.subscribe();
};
Command.prototype.setNextFocus = function (element) {
this.elementNextFocus = element;
};
Command.prototype.setEnabledValue = function (enabled) {
this.setEnabled = enabled;
};
return Command;
}());
export { Command };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmVvY29tcGxleHgvbmd4LW5lby1kaXJlY3RpdmVzLW1hdC8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtY29tbWFuZC9jb21tYW5kLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3QkFBd0I7O0FBRXhCLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZGLE9BQU8sRUFBNEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxNQUFNLENBQUMsSUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQVMsZ0JBQWdCLENBQUMsQ0FBQztBQUUzRSxNQUFNLENBQUMsSUFBTSxzQkFBc0IsR0FBbUI7SUFDckQsaUJBQWlCLEVBQUUsV0FBVztDQUM5QixDQUFDO0FBQ0Y7OztJQUdJO0FBR0o7Ozs7OztHQU1HO0FBS0g7SUFrQkMsMEJBQ1MsUUFBbUIsRUFDbkIsT0FBbUI7UUFEbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBYm5CLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLGdEQUFnRDtRQUN2QyxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBSW5CLFdBQU0sR0FBbUIsc0JBQXNCLENBQUM7UUFFaEQscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLDJCQUFzQixHQUFHLEtBQUssQ0FBQztJQUtsQyxDQUFDO0lBRU4sbUNBQVEsR0FBUjtRQUFBLGlCQW1GQztRQWxGQSwy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LENBQUM7UUFDeEUsQ0FBQyxFQUNBLFVBQUMsQ0FBQztZQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0RBQWdELEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDN0UsS0FBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUIsS0FBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7WUFDaEMsSUFBSSxPQUFPLElBQUksS0FBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLEVBQUU7Z0JBQUUsS0FBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUksQ0FBQyxXQUFXLENBQUMsS0FBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7YUFBRTtZQUMvRyxLQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVNLDhCQUFZLEdBQW5CLFVBQW9CLE9BQVk7UUFDL0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQztJQUNqQyxDQUFDO0lBQ00saUNBQWUsR0FBdEIsVUFBdUIsT0FBTztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQztJQUMzQixDQUFDO0lBQ0YsY0FBQztBQUFELENBQUMsQUE1SUQsSUE0SUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0c2xpbnQ6ZGlzYWJsZTppbmRlbnRcclxuXHJcbmltcG9ydCB7RGlyZWN0aXZlLCBJbnB1dCwgRWxlbWVudFJlZiwgSW5qZWN0aW9uVG9rZW4sIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIE9ic2VydmFibGUsIFN1YmplY3QsIEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgdGltZXIgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCB0YXAsIGZpbHRlciwgc3dpdGNoTWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBPblJldHVybkRpcmVjdGl2ZSB9IGZyb20gJy4uL29uUmV0dXJuLmRpcmVjdGl2ZSc7XHJcblxyXG5leHBvcnQgY29uc3QgQ09NTUFORF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPignQ09NTUFORF9DT05GSUcnKTtcclxuXHJcbmV4cG9ydCBjb25zdCBDT01NQU5EX0RFRkFVTFRfQ09ORklHOiBDb21tYW5kT3B0aW9ucyA9IHtcclxuXHRleGVjdXRpbmdDc3NDbGFzczogJ2V4ZWN1dGluZycsXHJcbn07XHJcbi8qXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlQ29uZmlnKGNvbmZpZzogQ29tbWFuZE9wdGlvbnMpOiBhbnkge1xyXG5cdHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBDT01NQU5EX0RFRkFVTFRfQ09ORklHLCBjb25maWcpO1xyXG59ICovXHJcblxyXG5cclxuLyoqXHJcbiAqXHJcbiAqICMjIyBFeGFtcGxlIHdpdGggb3B0aW9uc1xyXG4gKiBgYGBodG1sXHJcbiAqIDxidXR0b24gW2NvbW1hbmRdPSdzYXZlQ21kJyBbY29tbWFuZE9wdGlvbnNdPSd7ZXhlY3V0aW5nQ3NzQ2xhc3M6ICdpbi1wcm9ncmVzcyd9Jz5TYXZlPC9idXR0b24+XHJcbiAqIGBgYFxyXG4gKi9cclxuQERpcmVjdGl2ZSh7XHJcblx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxyXG5cdHNlbGVjdG9yOiAnW2NvbW1hbmRdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29tbWFuZERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcblx0QElucHV0KCkgY29tbWFuZDogSUNvbW1hbmQ7XHJcblx0QElucHV0KCkgY29tbWFuZE9wdGlvbnM6IENvbW1hbmRPcHRpb25zO1xyXG5cdEBJbnB1dCgpIGNvbW1hbmRDYW5FeGVjdXRlOiBib29sZWFuO1xyXG5cdEBJbnB1dCgpIGNvbW1hbmRWYWx1ZTogYW55O1xyXG5cdEBJbnB1dCgpIGNvbW1hbmROZXh0Rm9jdXM6IGFueTtcclxuXHRASW5wdXQoKSBzdG9wUHJvcGFnYXRpb24gPSBmYWxzZTtcclxuXHQvLyBASG9zdEJpbmRpbmcoJ2Rpc2FibGVkJykgaXNEaXNhYmxlZDogYm9vbGVhbjtcclxuXHRASW5wdXQoKSBzZXRFbmFibGVkID0gdHJ1ZTtcclxuXHRwcml2YXRlIGNhbkV4ZWN1dGUkJDogU3Vic2NyaXB0aW9uO1xyXG5cdHByaXZhdGUgaXNFeGVjdXRpbmckJDogU3Vic2NyaXB0aW9uO1xyXG5cclxuXHRwcml2YXRlIGNvbmZpZzogQ29tbWFuZE9wdGlvbnMgPSBDT01NQU5EX0RFRkFVTFRfQ09ORklHO1xyXG5cclxuXHRwcml2YXRlIG93bkRpc2FibGVkU3RhdGUgPSBmYWxzZTtcclxuXHRwcml2YXRlIGNvbW1hbmREaXNhYmxlZENoYW5nZWQgPSBmYWxzZTtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcblx0XHRwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWZcclxuXHQpIHsgIH1cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblx0XHQvLyBjb25zb2xlLmxvZygnW2NvbW1hbmREaXJlY3RpdmU6OmluaXRdJyk7XHJcblx0XHQgdGhpcy5jb21tYW5kT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY29uZmlnLCB0aGlzLmNvbW1hbmRPcHRpb25zKTtcclxuXHJcblx0XHRpZiAoIXRoaXMuY29tbWFuZCkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1tjb21tYW5kRGlyZWN0aXZlXSBjb21tYW5kIHNob3VsZCBiZSBkZWZpbmVkIScpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5jb21tYW5kLnZlcmlmeUNvbW1hbmRFeGVjdXRpb25QaXBlKCk7XHJcblx0XHRcdHRoaXMuY29tbWFuZC5zZXROZXh0Rm9jdXModGhpcy5jb21tYW5kTmV4dEZvY3VzKTtcclxuXHRcdFx0dGhpcy5jb21tYW5kLnNldEVuYWJsZWRWYWx1ZSh0aGlzLnNldEVuYWJsZWQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGlmICh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5sb2NhbE5hbWUgPT09ICdidXR0b24nKSB7XHJcblx0XHQvLyBcdGxldCB0aGlzQXV4ID0gdGhpcztcdC8vIFNldCB1cCBhIG5ldyBvYnNlcnZlclxyXG5cdFx0Ly8gXHR2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnMpIHtcclxuXHRcdC8vIFx0XHRtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbihtdXRhdGlvbikge1xyXG5cdFx0Ly8gXHRcdFx0Ly8gQ2hlY2sgdGhlIG1vZGlmaWVkIGF0dHJpYnV0ZU5hbWUgaXMgXCJkaXNhYmxlZFwiXHJcblx0XHQvLyBcdFx0XHRpZighdGhpc0F1eC5jb21tYW5kRGlzYWJsZWRDaGFuZ2VkKSB7XHJcblx0XHQvLyBcdFx0XHRcdGlmIChtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSBcImRpc2FibGVkXCIpIHtcclxuXHRcdC8vIFx0XHRcdFx0XHR0aGlzQXV4Lm93bkRpc2FibGVkU3RhdGUgPSB0aGlzQXV4LmVsZW1lbnQubmF0aXZlRWxlbWVudC5kaXNhYmxlZDtcclxuXHRcdC8vIFx0XHRcdFx0fVxyXG5cdFx0Ly8gXHRcdFx0fSBlbHNlIHtcclxuXHRcdC8vIFx0XHRcdFx0dGhpc0F1eC5jb21tYW5kRGlzYWJsZWRDaGFuZ2VkID0gZmFsc2U7XHJcblx0XHQvLyBcdFx0XHR9XHJcblx0XHQvLyBcdFx0fSk7XHJcblx0XHQvLyBcdH0pO1xyXG5cdFx0Ly8gXHQvLyBDb25maWd1cmUgdG8gb25seSBsaXN0ZW4gdG8gYXR0cmlidXRlIGNoYW5nZXNcclxuXHRcdC8vIFx0dmFyIGNvbmZpZyA9IHsgYXR0cmlidXRlczogdHJ1ZSB9O1xyXG5cdFx0Ly8gXHQvLyBTdGFydCBvYnNlcnZpbmcgbXlFbGVtXHJcblx0XHQvLyBcdG9ic2VydmVyLm9ic2VydmUodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGNvbmZpZyk7XHJcblx0XHQvLyB9XHJcblxyXG5cdFx0dGhpcy5jYW5FeGVjdXRlJCQgPSB0aGlzLmNvbW1hbmQuY2FuRXhlY3V0ZSQucGlwZShcclxuXHRcdFx0dGFwKHggPT4ge1xyXG5cdFx0XHRcdGlmICh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5sb2NhbE5hbWUgPT09ICdidXR0b24nKSB7XHJcblx0XHRcdFx0XHR0aGlzLmNvbW1hbmREaXNhYmxlZENoYW5nZWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tbWFuZFZhbHVlID09IHRoaXMuY29tbWFuZC5leGVjdXRpbmdQYXJhbSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5kaXNhYmxlZCA9ICF4O1xyXG5cdFx0XHRcdFx0XHQvLyB9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQvLyBcdHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmRpc2FibGVkID0gISghdGhpcy5vd25EaXNhYmxlZFN0YXRlICYmIHgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSkpLnN1YnNjcmliZSgpO1xyXG5cdFx0dGhpcy5pc0V4ZWN1dGluZyQkID0gdGhpcy5jb21tYW5kLmlzRXhlY3V0aW5nJC5waXBlKFxyXG5cdFx0XHR0YXAoeCA9PiB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1tjb21tYW5kRGlyZWN0aXZlOjppc0V4ZWN1dGluZyRdJywgeCk7XHJcbiAgICAgICAgeCA/IHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMuY29tbWFuZE9wdGlvbnMuZXhlY3V0aW5nQ3NzQ2xhc3MpIDogdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgdGhpcy5jb21tYW5kT3B0aW9ucy5leGVjdXRpbmdDc3NDbGFzcyk7XHJcblx0XHRcdH0pKS5zdWJzY3JpYmUoKTtcclxuXHJcblx0XHRpZiAodGhpcy5pc01vYmlsZU9wZXJhdGluZ1N5c3RlbSgpKSB7XHJcblx0XHRcdHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBhc3luYyAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHRcdGlmICh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5sb2NhbE5hbWUgPT09ICdpbnB1dCcpIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dGhpcy5leGVjdXRlQ29tbWFuZCgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0dGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIGFzeW5jIChldmVudCkgPT4ge1xyXG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdFx0dGhpcy5leGVjdXRlQ29tbWFuZCgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBhc3luYyAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuXHRcdFx0XHRpZiAoKGV2ZW50LndoaWNoID09PSAxMyB8fCBldmVudC5rZXlDb2RlID09PSAxMykpIHtcclxuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0XHRcdHRoaXMuZXhlY3V0ZUNvbW1hbmQoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG5cdFx0XHRcdGlmICh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5sb2NhbE5hbWUgPT09ICdpbnB1dCcpIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRpZiAodGhpcy5zdG9wUHJvcGFnYXRpb24pIHtcclxuXHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0aGlzLmV4ZWN1dGVDb21tYW5kKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGV4ZWN1dGVDb21tYW5kKCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5kaXNhYmxlZCkgdGhpcy5jb21tYW5kLmNhbkV4ZWN1dGUgPSB0cnVlO1xyXG5cdFx0dGhpcy5jb21tYW5kLnZlcmlmeUNvbW1hbmRFeGVjdXRpb25QaXBlKCk7XHJcblx0XHR0aGlzLmNvbW1hbmQuZXhlY3V0ZSh0aGlzLmNvbW1hbmRWYWx1ZSk7XHJcblx0fVxyXG5cclxuXHRuZ09uRGVzdHJveSgpIHtcclxuXHRcdGlmICh0aGlzLmNvbW1hbmQpIHsgdGhpcy5jb21tYW5kLmRlc3Ryb3koKTsgfVxyXG5cdFx0aWYgKHRoaXMuY2FuRXhlY3V0ZSQkKSB7IHRoaXMuY2FuRXhlY3V0ZSQkLnVuc3Vic2NyaWJlKCk7IH1cclxuXHRcdGlmICh0aGlzLmlzRXhlY3V0aW5nJCQpIHsgdGhpcy5pc0V4ZWN1dGluZyQkLnVuc3Vic2NyaWJlKCk7IH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgaXNNb2JpbGVPcGVyYXRpbmdTeXN0ZW0oKTogYm9vbGVhbiB7XHJcblx0XHRsZXQgaXNNb2JpbGUgPSBmYWxzZTtcclxuXHRcdGNvbnN0IHVzZXJBZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQgfHwgbmF2aWdhdG9yLnZlbmRvcjtcclxuXHJcblx0XHQvLyBXaW5kb3dzIFBob25lIG11c3QgY29tZSBmaXJzdCBiZWNhdXNlIGl0cyBVQSBhbHNvIGNvbnRhaW5zIFwiQW5kcm9pZFwiXHJcblx0XHRpZiAoL3dpbmRvd3MgcGhvbmUvaS50ZXN0KHVzZXJBZ2VudCkpIHtcclxuXHRcdFx0aXNNb2JpbGUgPSB0cnVlOyAvLyBcIldpbmRvd3MgUGhvbmVcIjtcclxuXHRcdH0gZWxzZSBpZiAoL2FuZHJvaWQvaS50ZXN0KHVzZXJBZ2VudCkpIHtcclxuXHRcdFx0aXNNb2JpbGUgPSB0cnVlOyAvLyBcIkFuZHJvaWRcIjtcclxuXHRcdH0gZWxzZSBpZiAoL2lQYWR8aVBob25lfGlQb2QvLnRlc3QodXNlckFnZW50KSkge1xyXG5cdFx0XHQvLyBpT1MgZGV0ZWN0aW9uIGZyb206IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzkwMzk4ODUvMTc3NzEwXHJcblx0XHRcdGlzTW9iaWxlID0gdHJ1ZTsgLy8gXCJpT1NcIjtcclxuXHRcdH1cclxuXHJcblx0XHRpc01vYmlsZSA9IGZhbHNlO1xyXG5cclxuXHRcdHJldHVybiBpc01vYmlsZTsgLy8gXCJ1bmtub3duXCI7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRPcHRpb25zIHtcclxuXHQvKipcclxuXHQgKiBDc3MgQ2xhc3Mgd2hpY2ggZ2V0cyBhZGRlZC9yZW1vdmVkIG9uIHRoZSBDb21tYW5kIGVsZW1lbnQncyBob3N0IHdoaWxlIENvbW1hbmQgaXNFeGVjdXRpbmckLlxyXG5cdCAqXHJcblx0ICovXHJcblx0ZXhlY3V0aW5nQ3NzQ2xhc3M6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29tbWFuZCB7XHJcblxyXG5cdGV4ZWN1dGluZ1BhcmFtOiBhbnk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgY29tbWFuZCBpcyBjdXJyZW50bHkgZXhlY3V0aW5nLlxyXG5cdCAqL1xyXG5cdGlzRXhlY3V0aW5nOiBib29sZWFuO1xyXG5cdGlzRXhlY3V0aW5nJD86IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcblx0LyoqXHJcblx0ICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb21tYW5kIGNhbiBleGVjdXRlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjYW5FeGVjdXRlOiBib29sZWFuO1xyXG5cdGNhbkV4ZWN1dGUkPzogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuXHQvKipcclxuXHQgKiBFeGVjdXRlIGZ1bmN0aW9uIHRvIGludm9rZS5cclxuXHQgKi9cclxuXHRleGVjdXRlKHZhbHVlPzogYW55KTogdm9pZDtcclxuXHJcblx0LyoqXHJcblx0ICogRXhlY3V0ZSBmdW5jdGlvbiB0byBpbnZva2UgYW5kIHJldHVybiBhIHJlc3VsdCBpbiBQcm9taXNlLlxyXG5cdCAqL1xyXG5cdGV4ZWN1dGVXaXRoUmVzdWx0KHZhbHVlPzogYW55KTogUHJvbWlzZTxhbnk+O1xyXG5cdC8qKlxyXG5cdCAqIERpc3Bvc2VzIGFsbCByZXNvdXJjZXMgaGVsZCBieSBzdWJzY3JpcHRpb25zLlxyXG5cdCAqL1xyXG5cdGRlc3Ryb3koKTogdm9pZDtcclxuXHJcblx0dmVyaWZ5Q29tbWFuZEV4ZWN1dGlvblBpcGUoKTtcclxuXHJcblx0c2V0TmV4dEZvY3VzKGVsZW1lbnQ6IGFueSk7XHJcblxyXG5cdHNldEVuYWJsZWRWYWx1ZShlbmFibGU6IGJvb2xlYW4pO1xyXG5cclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBDb21tYW5kIG9iamVjdCB1c2VkIHRvIGVuY2Fwc3VsYXRlIGluZm9ybWF0aW9uIHdoaWNoIGlzIG5lZWRlZCB0byBwZXJmb3JtIGFuIGFjdGlvbi5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBDb21tYW5kIGltcGxlbWVudHMgSUNvbW1hbmQge1xyXG5cclxuXHRpc0V4ZWN1dGluZyA9IGZhbHNlO1xyXG5cdGlzRXhlY3V0aW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cdGNhbkV4ZWN1dGUgPSB0cnVlO1xyXG5cdGNhbkV4ZWN1dGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG5cclxuXHRwcml2YXRlIGV4ZWN1dGlvblBpcGUkID0gbmV3IFN1YmplY3Q8e30+KCk7XHJcblx0cHJpdmF0ZSBpc0V4ZWN1dGluZyQkOiBTdWJzY3JpcHRpb247XHJcblx0cHJpdmF0ZSBjYW5FeGVjdXRlJCQ6IFN1YnNjcmlwdGlvbjtcclxuXHRwcml2YXRlIGV4ZWN1dGlvblBpcGUkJDogU3Vic2NyaXB0aW9uO1xyXG5cclxuXHRwcml2YXRlIGVsZW1lbnROZXh0Rm9jdXM6IGFueTtcclxuXHJcblx0cHVibGljIHJlc3VsdDogUHJvbWlzZTxhbnk+O1xyXG5cclxuXHRwdWJsaWMgYXN5bmNBY3Rpb246IChhbnkpID0+IGFueTtcclxuXHRwdWJsaWMgcmVzdWx0QXN5bmNBY3Rpb246IGFueTtcclxuXHJcblx0cHVibGljIGV4ZWN1dGluZ1BhcmFtOiBhbnk7XHJcblxyXG5cdHByaXZhdGUgZGVsYXlTdWJzY3JpYmU6IFN1YnNjcmlwdGlvbjtcclxuXHJcblx0cHJpdmF0ZSBzZXRFbmFibGVkID0gdHJ1ZTtcclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDb21tYW5kLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJpdmF0ZSBleGVjdXRlUGFyYW06IChhbnk/KSA9PiBhbnksXHJcblx0XHRjYW5FeGVjdXRlJD86IE9ic2VydmFibGU8Ym9vbGVhbj4sXHJcblx0XHRwcml2YXRlIGlzQXN5bmM/OiBib29sZWFuLFxyXG5cdFx0cHJpdmF0ZSBkZWxheT86IG51bWJlclxyXG5cdCkge1xyXG5cdFx0aWYgKGNhbkV4ZWN1dGUkKSB7XHJcblx0XHRcdHRoaXMuY2FuRXhlY3V0ZSQgPSBjb21iaW5lTGF0ZXN0KFxyXG5cdFx0XHRcdHRoaXMuaXNFeGVjdXRpbmckLFxyXG5cdFx0XHRcdGNhbkV4ZWN1dGUkXHJcblx0XHRcdFx0LCAoaXNFeGVjdXRpbmcsIGNhbkV4ZWN1dGVSZXN1bHQpID0+IHtcclxuXHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKCdbY29tbWFuZDo6Y29tYmluZUxhdGVzdCRdIHVwZGF0ZSEnLCB7IGlzRXhlY3V0aW5nLCBjYW5FeGVjdXRlUmVzdWx0IH0pO1xyXG5cdFx0XHRcdFx0dGhpcy5pc0V4ZWN1dGluZyA9IGlzRXhlY3V0aW5nO1xyXG5cdFx0XHRcdFx0dGhpcy5jYW5FeGVjdXRlID0gIWlzRXhlY3V0aW5nICYmIGNhbkV4ZWN1dGVSZXN1bHQ7XHJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jYW5FeGVjdXRlO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLmNhbkV4ZWN1dGUkJCA9IHRoaXMuY2FuRXhlY3V0ZSQuc3Vic2NyaWJlKCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmNhbkV4ZWN1dGUkID0gdGhpcy5pc0V4ZWN1dGluZyQucGlwZShtYXAoeCA9PiB7XHJcblx0XHRcdFx0Y29uc3QgY2FuRXhlY3V0ZSA9ICF4O1xyXG5cdFx0XHRcdHRoaXMuY2FuRXhlY3V0ZSA9IGNhbkV4ZWN1dGU7XHJcblx0XHRcdFx0cmV0dXJuIGNhbkV4ZWN1dGU7XHJcblx0XHRcdH0pKTtcclxuXHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQkID0gdGhpcy5pc0V4ZWN1dGluZyQucGlwZShcclxuXHRcdFx0XHR0YXAoeCA9PiB0aGlzLmlzRXhlY3V0aW5nID0geCkpXHJcblx0XHRcdFx0LnN1YnNjcmliZSgpO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5idWlsZEV4ZWN1dGlvblBpcGUoZXhlY3V0ZVBhcmFtLCBpc0FzeW5jLCBkZWxheSk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgdmVyaWZ5Q29tbWFuZEV4ZWN1dGlvblBpcGUoKSB7XHJcblx0XHRpZiAodGhpcy5leGVjdXRpb25QaXBlJC5vYnNlcnZlcnMubGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdHRoaXMuYnVpbGRFeGVjdXRpb25QaXBlKHRoaXMuZXhlY3V0ZVBhcmFtLCB0aGlzLmlzQXN5bmMsIHRoaXMuZGVsYXkpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZXhlY3V0ZSh2YWx1ZT86IGFueSkge1xyXG5cdFx0dGhpcy5leGVjdXRpbmdQYXJhbSA9IHZhbHVlO1xyXG5cdFx0dGhpcy5leGVjdXRpb25QaXBlJC5uZXh0KHZhbHVlKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIGV4ZWN1dGVXaXRoUmVzdWx0KHZhbHVlPzogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuXHRcdHRoaXMuZXhlY3V0aW5nUGFyYW0gPSB2YWx1ZTtcclxuXHRcdHRoaXMuZXhlY3V0aW9uUGlwZSQubmV4dCh2YWx1ZSk7XHJcblx0XHRyZXR1cm4gYXdhaXQgdGhpcy5yZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRkZXN0cm95KCkge1xyXG5cdFx0aWYgKHRoaXMuZXhlY3V0aW9uUGlwZSQkKSB7XHJcblx0XHRcdHRoaXMuZXhlY3V0aW9uUGlwZSQkLnVuc3Vic2NyaWJlKCk7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5jYW5FeGVjdXRlJCQpIHtcclxuXHRcdFx0dGhpcy5jYW5FeGVjdXRlJCQudW5zdWJzY3JpYmUoKTtcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLmlzRXhlY3V0aW5nJCQpIHtcclxuXHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQkLnVuc3Vic2NyaWJlKCk7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5pc0V4ZWN1dGluZyQpIHtcclxuXHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQuY29tcGxldGUoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5hc3luY0FjdGlvbiAhPSBudWxsKSB7XHJcblx0XHRcdHRoaXMuYXN5bmNBY3Rpb24gPSBudWxsO1xyXG5cdFx0XHR0aGlzLnJlc3VsdEFzeW5jQWN0aW9uID0gbnVsbDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYnVpbGRFeGVjdXRpb25QaXBlKGV4ZWN1dGVQYXJtOiAoYW55PykgPT4gYW55LCBpc0FzeW5jPzogYm9vbGVhbiwgZGVsYXk/OiBudW1iZXIpIHtcclxuXHRcdGxldCBwaXBlJCA9IHRoaXMuZXhlY3V0aW9uUGlwZSQucGlwZShcclxuXHRcdFx0ZmlsdGVyKCgpID0+IHRoaXMuY2FuRXhlY3V0ZSksXHJcblx0XHRcdHRhcCgoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQubmV4dCh0cnVlKTtcclxuXHRcdFx0XHRpZiAoaXNBc3luYyAmJiB0aGlzLmFzeW5jQWN0aW9uICE9IG51bGwpIHsgdGhpcy5yZXN1bHRBc3luY0FjdGlvbiA9IHRoaXMuYXN5bmNBY3Rpb24odW5kZWZpbmVkKTsgfVxyXG5cdFx0XHR9KSk7XHJcblxyXG5cdFx0cGlwZSQgPSBpc0FzeW5jXHJcblx0XHRcdD8gcGlwZSQucGlwZShzd2l0Y2hNYXAoKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0aWYgKGRlbGF5ICYmIGRlbGF5ID4gMCkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuZGVsYXlTdWJzY3JpYmUpIHsgdGhpcy5kZWxheVN1YnNjcmliZS51bnN1YnNjcmliZSgpOyB9XHJcblx0XHRcdFx0XHRjb25zdCBkZWxheVRpbWVyID0gdGltZXIoZGVsYXkpO1xyXG5cdFx0XHRcdFx0dGhpcy5kZWxheVN1YnNjcmliZSA9IGRlbGF5VGltZXIuc3Vic2NyaWJlKHQgPT4geyBleGVjdXRlUGFybSh2YWx1ZSk7IH0pO1xyXG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gZXhlY3V0ZVBhcm0odmFsdWUpO1xyXG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSkpXHJcblx0XHRcdDogcGlwZSQucGlwZSh0YXAoKHZhbHVlKSA9PiB7IGV4ZWN1dGVQYXJtKHZhbHVlKTsgfSkpO1xyXG5cclxuXHRcdHBpcGUkID0gcGlwZSQucGlwZSh0YXAoKCkgPT4ge1xyXG5cdFx0XHQvLyBjb25zb2xlLmxvZygnW2NvbW1hbmQ6OmV4Y3V0aW9uUGlwZSRdIGRvIzIgLSBzZXQgaWRsZScpO1xyXG5cdFx0XHR0aGlzLmlzRXhlY3V0aW5nJC5uZXh0KGZhbHNlKTtcclxuXHRcdFx0dGhpcy5leGVjdXRpbmdQYXJhbSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0aWYgKGlzQXN5bmMgJiYgdGhpcy5hc3luY0FjdGlvbiAhPSBudWxsKSB7IHRoaXMucmVzdWx0QXN5bmNBY3Rpb24gPSB0aGlzLmFzeW5jQWN0aW9uKHRoaXMucmVzdWx0QXN5bmNBY3Rpb24pOyB9XHJcblx0XHRcdE9uUmV0dXJuRGlyZWN0aXZlLnNldE5leHRGb2N1cyh0aGlzLmVsZW1lbnROZXh0Rm9jdXMsIHRoaXMuc2V0RW5hYmxlZCk7XHJcblx0XHR9LFxyXG5cdFx0XHQoZSkgPT4ge1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKCdbY29tbWFuZDo6ZXhjdXRpb25QaXBlJF0gZG8jMiBlcnJvciAtIHNldCBpZGxlJyArIGUudG9TdHJpbmcoKSk7XHJcblx0XHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQubmV4dChmYWxzZSk7XHJcblx0XHRcdFx0dGhpcy5leGVjdXRpbmdQYXJhbSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRpZiAoaXNBc3luYyAmJiB0aGlzLmFzeW5jQWN0aW9uICE9IG51bGwpIHsgdGhpcy5yZXN1bHRBc3luY0FjdGlvbiA9IHRoaXMuYXN5bmNBY3Rpb24odGhpcy5yZXN1bHRBc3luY0FjdGlvbik7IH1cclxuXHRcdFx0XHR0aGlzLmJ1aWxkRXhlY3V0aW9uUGlwZShleGVjdXRlUGFybSwgaXNBc3luYywgZGVsYXkpO1xyXG5cdFx0XHR9KSk7XHJcblx0XHR0aGlzLmV4ZWN1dGlvblBpcGUkJCA9IHBpcGUkLnN1YnNjcmliZSgpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHNldE5leHRGb2N1cyhlbGVtZW50OiBhbnkpIHtcclxuXHRcdHRoaXMuZWxlbWVudE5leHRGb2N1cyA9IGVsZW1lbnQ7XHJcblx0fVxyXG5cdHB1YmxpYyBzZXRFbmFibGVkVmFsdWUoZW5hYmxlZCkge1xyXG5cdFx0dGhpcy5zZXRFbmFibGVkID0gZW5hYmxlZDtcclxuXHR9XHJcbn1cclxuIl19