@bi8/am-dyn-form
Version:
ng update @angular/cli yarn add @angular/cli
437 lines • 56.6 kB
JavaScript
import * as tslib_1 from "tslib";
import { Subject, Observable, ReplaySubject, BehaviorSubject } from 'rxjs';
import { filter, map, takeWhile, tap } from 'rxjs/operators';
import { of } from 'rxjs/internal/observable/of';
import { pipeFromArray } from 'rxjs/internal/util/pipe';
export var NotificationType;
(function (NotificationType) {
NotificationType["init"] = "init";
NotificationType["busy"] = "busy";
NotificationType["idle"] = "idle";
NotificationType["paramFunc"] = "paramFunc";
NotificationType["inputNext"] = "inputNext";
NotificationType["inputComplete"] = "inputComplete";
NotificationType["inputError"] = "inputError";
NotificationType["outputFuncError"] = "outputFuncError";
NotificationType["outputNext"] = "outputNext";
NotificationType["outputError"] = "outputError";
NotificationType["outputComplete"] = "outputComplete";
NotificationType["close"] = "close";
NotificationType["enable"] = "enable";
NotificationType["disable"] = "disable";
})(NotificationType || (NotificationType = {}));
var Channel = /** @class */ (function () {
function Channel(fn, options) {
var _this = this;
this.fn = fn;
this.closed = false;
this.enabled = true;
if (options) {
this.input = options.input || new Subject();
this.output = options.output || new ReplaySubject(1);
this.enabled = options.enabled || true;
this.name = options.name || 'channel';
this.debug = options.debug || false;
this.paramFn = options.paramFn;
this.notificationFn = options.notificationFn;
}
else {
this.input = new Subject();
this.output = new ReplaySubject(1);
this.enabled = true;
this.name = 'channel';
this.debug = false;
}
this.notifications = new BehaviorSubject({ type: NotificationType.init });
//this.observeNotifications().subscribe();
if (this.notificationFn) {
this.observeNotifications().subscribe(this.notificationFn);
}
this.input.pipe(takeWhile(function (value) { return !_this.closed; }), filter(function (value) { return _this.enabled; }), map(function (input) {
_this.emitNotification({ type: NotificationType.busy });
if (_this.paramFn) {
var result = _this.paramFn(input);
_this.emitNotification({ type: NotificationType.paramFunc, data: { before: input, after: result } });
return result;
}
else {
return input;
}
}), tap(function (data) {
_this.inputBusy = true;
_this.emitNotification({ type: NotificationType.inputNext, data: data });
})).subscribe({
next: function (value) {
try {
_this.outputBusy = true;
var observable = _this.fn(value);
observable.pipe(tap(function (data) {
_this.emitNotification({ type: NotificationType.outputNext, data: data });
})).subscribe({
next: function (response) { return _this.output.next(response); },
error: function (err) {
_this.emitNotification({ type: NotificationType.outputError, error: err });
_this.output.error(err);
},
complete: function () {
_this.outputBusy = false;
_this.emitNotification({ type: NotificationType.outputComplete });
_this.emitNotification({ type: NotificationType.idle });
}
});
}
catch (err) {
_this.emitNotification({ type: NotificationType.outputFuncError, error: err });
_this.outputBusy = false;
}
},
error: function (err) {
_this.emitNotification({ type: NotificationType.outputFuncError, error: err });
},
complete: function () {
_this.inputBusy = false;
}
});
}
Channel.prototype.isBusy = function () {
return this.inputBusy || this.outputBusy;
};
Channel.prototype.isInputBusy = function () {
return this.inputBusy;
};
Channel.prototype.isOutputBusy = function () {
return this.outputBusy;
};
Channel.prototype.next = function (value) {
this.input.next(value);
return this;
};
Channel.prototype.emit = function (value) {
this.output.next(value);
};
Channel.prototype.observe = function (value) {
var _this = this;
var ops = [];
for (var _i = 1; _i < arguments.length; _i++) {
ops[_i - 1] = arguments[_i];
}
setInterval(function () {
_this.next(value);
});
return this.output.pipe(pipeFromArray(tslib_1.__spread(ops)));
};
Channel.prototype.link = function (observer) {
var _this = this;
var ops = [];
for (var _i = 1; _i < arguments.length; _i++) {
ops[_i - 1] = arguments[_i];
}
observer.pipe(pipeFromArray(tslib_1.__spread(ops))).subscribe(function (value) { return _this.next(value); });
};
Channel.prototype.pipe = function (observer) {
var _this = this;
var ops = [];
for (var _i = 1; _i < arguments.length; _i++) {
ops[_i - 1] = arguments[_i];
}
observer.pipe(pipeFromArray(tslib_1.__spread(ops))).subscribe(function (value) { return _this.emit(value); });
};
Channel.prototype.asObservable = function () {
return this.output.asObservable();
};
Channel.prototype.observeNotifications = function () {
return this.notifications.asObservable();
};
Channel.prototype.emitNotification = function (notification) {
notification.name = this.name;
if (this.debug) {
switch (notification.type) {
case NotificationType.inputError:
case NotificationType.outputError:
case NotificationType.outputFuncError:
console.error("[" + notification.name + ":" + notification.type + "] ", notification.error || '');
break;
default:
console.debug("[" + notification.name + ":" + notification.type + "] ", notification.data || '');
break;
}
}
this.notifications.next(notification);
};
Channel.prototype.enable = function () {
this.enabled = false;
return this;
};
Channel.prototype.disable = function () {
this.enabled = true;
return this;
};
Channel.prototype.close = function () {
this.closed = true;
this.input.unsubscribe();
this.output.unsubscribe();
};
return Channel;
}());
export { Channel };
var ChannelSwitch = /** @class */ (function () {
function ChannelSwitch() {
var _this = this;
var channels = [];
for (var _i = 0; _i < arguments.length; _i++) {
channels[_i] = arguments[_i];
}
this.channels = new Map();
channels.forEach(function (config) {
_this.channels.set(config.key, config.channel);
});
}
ChannelSwitch.prototype.set = function (key, channel) {
this.channels.set(key, channel);
return channel;
};
ChannelSwitch.prototype.get = function (key) {
return this.channels.get(key);
};
ChannelSwitch.prototype.isBusy = function (key) {
var channel = this.channels.get(key);
return channel ? channel.isBusy() : false;
};
ChannelSwitch.prototype.isInputBusy = function (key) {
var channel = this.channels.get(key);
return channel ? channel.isInputBusy() : false;
};
ChannelSwitch.prototype.isOutputBusy = function (key) {
var channel = this.channels.get(key);
return channel ? channel.isOutputBusy() : false;
};
ChannelSwitch.prototype.next = function (key, value) {
var channel = this.channels.get(key);
return channel ? channel.next(value) : null;
};
ChannelSwitch.prototype.emit = function (key, value) {
var channel = this.channels.get(key);
return channel ? channel.emit(value) : false;
};
ChannelSwitch.prototype.observe = function (key, value) {
var ops = [];
for (var _i = 2; _i < arguments.length; _i++) {
ops[_i - 2] = arguments[_i];
}
var channel = this.channels.get(key);
return channel ? channel.observe.apply(channel, tslib_1.__spread([value], ops)) : null;
};
ChannelSwitch.prototype.link = function (key, observer) {
var ops = [];
for (var _i = 2; _i < arguments.length; _i++) {
ops[_i - 2] = arguments[_i];
}
var channel = this.channels.get(key);
if (channel) {
channel.link.apply(channel, tslib_1.__spread([observer], ops));
}
};
ChannelSwitch.prototype.pipe = function (key, observer) {
var ops = [];
for (var _i = 2; _i < arguments.length; _i++) {
ops[_i - 2] = arguments[_i];
}
var channel = this.channels.get(key);
if (channel) {
channel.pipe.apply(channel, tslib_1.__spread([observer], ops));
}
};
ChannelSwitch.prototype.asObservable = function (key) {
var channel = this.channels.get(key);
return channel ? channel.asObservable() : null;
};
ChannelSwitch.prototype.observeNotifications = function (key) {
var channel = this.channels.get(key);
return channel ? channel.observeNotifications() : null;
};
ChannelSwitch.prototype.enable = function (key) {
var channel = this.channels.get(key);
return channel ? channel.enable() : null;
};
ChannelSwitch.prototype.disable = function (key) {
var channel = this.channels.get(key);
return channel ? channel.disable() : null;
};
ChannelSwitch.prototype.close = function (key) {
var channel = this.channels.get(key);
return channel ? channel.close() : null;
};
return ChannelSwitch;
}());
export { ChannelSwitch };
var DSPipe = /** @class */ (function () {
function DSPipe(ds, key, obs, ops, enabled) {
if (enabled === void 0) { enabled = true; }
this.ds = ds;
this.key = key;
this.obs = obs;
this.ops = ops;
this.enabled = enabled;
this.connect();
}
DSPipe.prototype.isConnected = function () {
return !(!this.sub);
};
DSPipe.prototype.connect = function () {
var _this = this;
if (this.isConnected()) {
return;
}
this.sub = this.obs.pipe(pipeFromArray(tslib_1.__spread(this.ops))).subscribe(function (value) {
console.log("----> pipe (" + _this.key + ")", value);
_this.ds.next(_this.key, value);
});
};
DSPipe.prototype.disconnect = function () {
if (!this.isConnected()) {
return;
}
this.sub.unsubscribe();
};
DSPipe.prototype.setOperators = function () {
var ops = [];
for (var _i = 0; _i < arguments.length; _i++) {
ops[_i] = arguments[_i];
}
this.disconnect();
this.ops = ops;
this.connect();
};
DSPipe.prototype.enable = function () {
this.enabled = true;
};
DSPipe.prototype.disable = function () {
this.enabled = false;
};
return DSPipe;
}());
export { DSPipe };
var ObservableDS = /** @class */ (function () {
function ObservableDS(options) {
this.connected = false;
this.fnMap = new Map();
this.subjectMap = new Map();
this.input$ = new Subject();
this.inputSub = null;
this.events$ = new Subject();
this.pipes = [];
if (options) {
if (options.autoconnect) {
this.connect();
}
if (options.key && options.obs) {
this.addObservable(options.key, options.obs);
}
}
else {
// we connect by default
this.connect();
}
}
ObservableDS.prototype.isConnected = function () {
return !(!this.inputSub);
};
ObservableDS.prototype.connect = function () {
var _this = this;
if (this.isConnected()) {
return;
}
this.inputSub = this.input$.pipe(filter(function (input) {
if (_this.fnMap.has(input.id)) {
return true;
}
console.error("[obs] observable with id '" + input.id + "' not found");
return false;
}), map(function (input) {
var obsFn = _this.fnMap.get(input.id);
return { event: input, fn: obsFn(input.value), sub: _this.subjectMap.get(input.id) };
}))
.subscribe(function (input) { return _this.relay(input.event, input.fn, input.sub); });
this.connected = true;
};
ObservableDS.prototype.relay = function (event, obs, subject) {
var _this = this;
//console.log(`-----> relay (${subject}: `, event);
obs.pipe(takeWhile(function () { return _this.connected; }),
//tap((response) => { console.log(`-----> tap relay: `, response); subject.next(response) }),
tap(function (response) { return _this.emit({ input: event, output: response }); })).subscribe();
};
ObservableDS.prototype.emit = function (event) {
this.events$.next(event);
};
ObservableDS.prototype.asObservable = function () {
return this.events$.asObservable();
};
ObservableDS.prototype.disconnect = function () {
if (!this.isConnected()) {
return;
}
this.inputSub.unsubscribe();
var bla = of([1, 2, 3]);
var blaf = bla.subscribe();
blaf.add(blaf);
var duff = new Subject();
blaf.add(duff.asObservable().subscribe());
};
ObservableDS.prototype.next = function (key, value, options) {
if (!this.connected) {
return;
}
var event = { id: key, options: options, value: value };
//console.log(`-----> next (${event})`, event);
this.input$.next(event);
};
ObservableDS.prototype.addPipe = function (obs, key) {
var operators = [];
for (var _i = 2; _i < arguments.length; _i++) {
operators[_i - 2] = arguments[_i];
}
var pipe = new DSPipe(this, key, obs, operators);
this.pipes.push(pipe);
return pipe;
};
ObservableDS.prototype.clearPipes = function () {
var pipes = [];
for (var _i = 0; _i < arguments.length; _i++) {
pipes[_i] = arguments[_i];
}
pipes.forEach(function (pipe, index) {
pipe.disconnect();
pipes = pipes.splice(index, 1);
});
};
ObservableDS.prototype.clearAllPipes = function () {
this.clearPipes.apply(this, tslib_1.__spread(this.pipes));
};
ObservableDS.prototype.getPipes = function () {
return this.pipes;
};
ObservableDS.prototype.addObservable = function (key, obs, options) {
if (!options) {
options = { behave: true };
}
this.fnMap.set(key, obs instanceof Observable ? function () { return obs; } : obs);
this.subjectMap.set(key, options.behave ? new BehaviorSubject([]) : new Subject());
};
ObservableDS.prototype.observe = function (key, value, options) {
var subject = this.subjectMap.get(key);
try {
return subject.asObservable();
}
finally {
if (value) {
this.next(key, value);
}
}
};
ObservableDS.prototype.destroy = function () {
};
return ObservableDS;
}());
export { ObservableDS };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluLWRhdGFzb3VyY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYmk4L2FtLWR5bi1mb3JtLyIsInNvdXJjZXMiOlsiYXBwL21vZHVsZXMvYW0tZHluLWZvcm0vZHluLWRhdGFzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBa0MsZUFBZSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3pHLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFFL0MsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBTXRELE1BQU0sQ0FBTixJQUFZLGdCQWVYO0FBZkQsV0FBWSxnQkFBZ0I7SUFDMUIsaUNBQWEsQ0FBQTtJQUNiLGlDQUFhLENBQUE7SUFDYixpQ0FBYSxDQUFBO0lBQ2IsMkNBQXVCLENBQUE7SUFDdkIsMkNBQXVCLENBQUE7SUFDdkIsbURBQStCLENBQUE7SUFDL0IsNkNBQXlCLENBQUE7SUFDekIsdURBQW1DLENBQUE7SUFDbkMsNkNBQXlCLENBQUE7SUFDekIsK0NBQTJCLENBQUE7SUFDM0IscURBQWlDLENBQUE7SUFDakMsbUNBQWUsQ0FBQTtJQUNmLHFDQUFpQixDQUFBO0lBQ2pCLHVDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFmVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBZTNCO0FBaUJEO0lBYUUsaUJBQW9CLEVBQXNCLEVBQUUsT0FRM0M7UUFSRCxpQkFtRkM7UUFuRm1CLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBWmxDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFHeEIsWUFBTyxHQUFZLElBQUksQ0FBQztRQWtCOUIsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FB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SUFBSSxFQUFDLENBQUM7U0FDMUI7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxZQUFZLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBTSxPQUFBLEdBQUcsRUFBSCxDQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQU8sQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFRCw4QkFBTyxHQUFQLFVBQVEsR0FBUSxFQUFFLEtBQVcsRUFBRSxPQUF5QjtRQUN0RCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxJQUFJO1lBQ0YsT0FBTyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDL0I7Z0JBQVM7WUFDUixJQUFJLEtBQUssRUFBRTtnQkFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN2QjtTQUNGO0lBQ0gsQ0FBQztJQUVELDhCQUFPLEdBQVA7SUFDQSxDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQUFDLEFBdElELElBc0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTdWJqZWN0LCBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBTdWJzY3JpcHRpb24sIE9wZXJhdG9yRnVuY3Rpb24sIEJlaGF2aW9yU3ViamVjdH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7ZmlsdGVyLCBtYXAsIHRha2VXaGlsZSwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7b2Z9IGZyb20gJ3J4anMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9vZic7XHJcbmltcG9ydCB7cGlwZX0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7cGlwZUZyb21BcnJheX0gZnJvbSAncnhqcy9pbnRlcm5hbC91dGlsL3BpcGUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBPYnNlcnZhYmxlRm48QSwgVD4ge1xyXG4gIChwYXJhbT86IEEpOiBPYnNlcnZhYmxlPFQ+O1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBOb3RpZmljYXRpb25UeXBlIHtcclxuICBpbml0ID0gJ2luaXQnLFxyXG4gIGJ1c3kgPSAnYnVzeScsXHJcbiAgaWRsZSA9ICdpZGxlJyxcclxuICBwYXJhbUZ1bmMgPSAncGFyYW1GdW5jJyxcclxuICBpbnB1dE5leHQgPSAnaW5wdXROZXh0JyxcclxuICBpbnB1dENvbXBsZXRlID0gJ2lucHV0Q29tcGxldGUnLFxyXG4gIGlucHV0RXJyb3IgPSAnaW5wdXRFcnJvcicsXHJcbiAgb3V0cHV0RnVuY0Vycm9yID0gJ291dHB1dEZ1bmNFcnJvcicsXHJcbiAgb3V0cHV0TmV4dCA9ICdvdXRwdXROZXh0JyxcclxuICBvdXRwdXRFcnJvciA9ICdvdXRwdXRFcnJvcicsXHJcbiAgb3V0cHV0Q29tcGxldGUgPSAnb3V0cHV0Q29tcGxldGUnLFxyXG4gIGNsb3NlID0gJ2Nsb3NlJyxcclxuICBlbmFibGUgPSAnZW5hYmxlJyxcclxuICBkaXNhYmxlID0gJ2Rpc2FibGUnXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbm5lbE5vdGlmaWNhdGlvbiB7XHJcbiAgdHlwZTogTm90aWZpY2F0aW9uVHlwZSxcclxuICBuYW1lPzogc3RyaW5nLFxyXG4gIGRhdGE/OiBhbnksXHJcbiAgZXJyb3I/OiBhbnksXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uRm4ge1xyXG4gIChpbnB1dDogQ2hhbm5lbE5vdGlmaWNhdGlvbilcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQYXJhbWV0ZXJGbjxBLCBUPiB7XHJcbiAgKGlucHV0OiBBKTogVFxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ2hhbm5lbDxBIGV4dGVuZHMgYW55LCBUIGV4dGVuZHMgYW55PiB7XHJcbiAgcHJpdmF0ZSBjbG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGlucHV0OiBTdWJqZWN0PEE+O1xyXG4gIHByaXZhdGUgb3V0cHV0OiBTdWJqZWN0PFQ+O1xyXG4gIHByaXZhdGUgZW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBpbnB1dEJ1c3k6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBvdXRwdXRCdXN5OiBib29sZWFuO1xyXG4gIHByaXZhdGUgbmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgbm90aWZpY2F0aW9ucztcclxuICBwcml2YXRlIGRlYnVnOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcGFyYW1GbjogUGFyYW1ldGVyRm48YW55LCBhbnk+O1xyXG4gIHByaXZhdGUgbm90aWZpY2F0aW9uRm46IE5vdGlmaWNhdGlvbkZuO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZuOiBPYnNlcnZhYmxlRm48QSwgVD4sIG9wdGlvbnM/OiB7XHJcbiAgICBpbnB1dD86IFN1YmplY3Q8QT4sXHJcbiAgICBvdXRwdXQ/OiBTdWJqZWN0PFQ+LFxyXG4gICAgZW5hYmxlZD86IGJvb2xlYW4sXHJcbiAgICBuYW1lPzogc3RyaW5nLFxyXG4gICAgZGVidWc/OiBib29sZWFuLFxyXG4gICAgcGFyYW1Gbj86IFBhcmFtZXRlckZuPGFueSwgYW55PixcclxuICAgIG5vdGlmaWNhdGlvbkZuPzogTm90aWZpY2F0aW9uRm5cclxuICB9KSB7XHJcbiAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICB0aGlzLmlucHV0ID0gb3B0aW9ucy5pbnB1dCB8fCBuZXcgU3ViamVjdDxBPigpO1xyXG4gICAgICB0aGlzLm91dHB1dCA9IG9wdGlvbnMub3V0cHV0IHx8IG5ldyBSZXBsYXlTdWJqZWN0PFQ+KDEpO1xyXG4gICAgICB0aGlzLmVuYWJsZWQgPSBvcHRpb25zLmVuYWJsZWQgfHwgdHJ1ZTtcclxuICAgICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lIHx8ICdjaGFubmVsJztcclxuICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgfHwgZmFsc2U7XHJcbiAgICAgIHRoaXMucGFyYW1GbiA9IG9wdGlvbnMucGFyYW1GbjtcclxuICAgICAgdGhpcy5ub3RpZmljYXRpb25GbiA9IG9wdGlvbnMubm90aWZpY2F0aW9uRm47XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbnB1dCA9IG5ldyBTdWJqZWN0PEE+KCk7XHJcbiAgICAgIHRoaXMub3V0cHV0ID0gbmV3IFJlcGxheVN1YmplY3Q8VD4oMSk7XHJcbiAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMubmFtZSA9ICdjaGFubmVsJztcclxuICAgICAgdGhpcy5kZWJ1ZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubm90aWZpY2F0aW9ucyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hhbm5lbE5vdGlmaWNhdGlvbj4oe3R5cGU6IE5vdGlmaWNhdGlvblR5cGUuaW5pdH0pO1xyXG4gICAgLy90aGlzLm9ic2VydmVOb3RpZmljYXRpb25zKCkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMubm90aWZpY2F0aW9uRm4pIHtcclxuICAgICAgdGhpcy5vYnNlcnZlTm90aWZpY2F0aW9ucygpLnN1YnNjcmliZSh0aGlzLm5vdGlmaWNhdGlvbkZuKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlucHV0LnBpcGUoXHJcbiAgICAgIHRha2VXaGlsZSgodmFsdWU6IEEpID0+ICF0aGlzLmNsb3NlZCksXHJcbiAgICAgIGZpbHRlcigodmFsdWU6IEEpID0+IHRoaXMuZW5hYmxlZCksXHJcbiAgICAgIG1hcCgoaW5wdXQpID0+IHtcclxuICAgICAgICB0aGlzLmVtaXROb3RpZmljYXRpb24oe3R5cGU6IE5vdGlmaWNhdGlvblR5cGUuYnVzeX0pO1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtRm4pIHtcclxuICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnBhcmFtRm4oaW5wdXQpO1xyXG4gICAgICAgICAgdGhpcy5lbWl0Tm90aWZpY2F0aW9uKHt0eXBlOiBOb3RpZmljYXRpb25UeXBlLnBhcmFtRnVuYywgZGF0YToge2JlZm9yZTogaW5wdXQsIGFmdGVyOiByZXN1bHR9fSk7XHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gaW5wdXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgdGFwKChkYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pbnB1dEJ1c3kgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZW1pdE5vdGlmaWNhdGlvbih7dHlwZTogTm90aWZpY2F0aW9uVHlwZS5pbnB1dE5leHQsIGRhdGE6IGRhdGF9KTtcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHZhbHVlOiBBKSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMub3V0cHV0QnVzeSA9IHRydWU7XHJcbiAgICAgICAgICBsZXQgb2JzZXJ2YWJsZSA9IHRoaXMuZm4odmFsdWUpO1xyXG5cclxuICAgICAgICAgIG9ic2VydmFibGUucGlwZSh0YXAoKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0Tm90aWZpY2F0aW9uKHt0eXBlOiBOb3RpZmljYXRpb25UeXBlLm91dHB1dE5leHQsIGRhdGE6IGRhdGF9KTtcclxuXHJcbiAgICAgICAgICB9KSkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB0aGlzLm91dHB1dC5uZXh0KHJlc3BvbnNlKSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmVtaXROb3RpZmljYXRpb24oe3R5cGU6IE5vdGlmaWNhdGlvblR5cGUub3V0cHV0RXJyb3IsIGVycm9yOiBlcnJ9KTtcclxuICAgICAgICAgICAgICB0aGlzLm91dHB1dC5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMub3V0cHV0QnVzeSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMuZW1pdE5vdGlmaWNhdGlvbih7dHlwZTogTm90aWZpY2F0aW9uVHlwZS5vdXRwdXRDb21wbGV0ZX0pO1xyXG4gICAgICAgICAgICAgIHRoaXMuZW1pdE5vdGlmaWNhdGlvbih7dHlwZTogTm90aWZpY2F0aW9uVHlwZS5pZGxlfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgdGhpcy5lbWl0Tm90aWZpY2F0aW9uKHt0eXBlOiBOb3RpZmljYXRpb25UeXBlLm91dHB1dEZ1bmNFcnJvciwgZXJyb3I6IGVycn0pO1xyXG4gICAgICAgICAgdGhpcy5vdXRwdXRCdXN5ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5lbWl0Tm90aWZpY2F0aW9uKHt0eXBlOiBOb3RpZmljYXRpb25UeXBlLm91dHB1dEZ1bmNFcnJvciwgZXJyb3I6IGVycn0pO1xyXG4gICAgICB9LFxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW5wdXRCdXN5ID0gZmFsc2VcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpc0J1c3koKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pbnB1dEJ1c3kgfHwgdGhpcy5vdXRwdXRCdXN5O1xyXG4gIH1cclxuXHJcbiAgaXNJbnB1dEJ1c3koKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pbnB1dEJ1c3k7XHJcbiAgfVxyXG5cclxuICBpc091dHB1dEJ1c3koKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vdXRwdXRCdXN5O1xyXG4gIH1cclxuXHJcbiAgbmV4dCh2YWx1ZT86IEEpOiBDaGFubmVsPEEsIFQ+IHtcclxuICAgIHRoaXMuaW5wdXQubmV4dCh2YWx1ZSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIGVtaXQodmFsdWU6IFQpIHtcclxuICAgIHRoaXMub3V0cHV0Lm5leHQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgb2JzZXJ2ZSh2YWx1ZT86IEEsIC4uLm9wczogT3BlcmF0b3JGdW5jdGlvbjxhbnksIGFueT5bXSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLm5leHQodmFsdWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMub3V0cHV0LnBpcGUocGlwZUZyb21BcnJheShbLi4ub3BzXSkpO1xyXG4gIH1cclxuXHJcbiAgbGluayhvYnNlcnZlcjogT2JzZXJ2YWJsZTxBPiwgLi4ub3BzOiBPcGVyYXRvckZ1bmN0aW9uPGFueSwgYW55PltdKSB7XHJcbiAgICBvYnNlcnZlci5waXBlKHBpcGVGcm9tQXJyYXkoWy4uLm9wc10pKS5zdWJzY3JpYmUoKHZhbHVlOiBBKSA9PiB0aGlzLm5leHQodmFsdWUpKTtcclxuICB9XHJcblxyXG4gIHBpcGUob2JzZXJ2ZXI6IE9ic2VydmFibGU8VD4sIC4uLm9wczogT3BlcmF0b3JGdW5jdGlvbjxhbnksIGFueT5bXSkge1xyXG4gICAgb2JzZXJ2ZXIucGlwZShwaXBlRnJvbUFycmF5KFsuLi5vcHNdKSkuc3Vic2NyaWJlKCh2YWx1ZTogVCkgPT4gdGhpcy5lbWl0KHZhbHVlKSk7XHJcbiAgfVxyXG5cclxuICBhc09ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICByZXR1cm4gdGhpcy5vdXRwdXQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBvYnNlcnZlTm90aWZpY2F0aW9ucygpOiBPYnNlcnZhYmxlPENoYW5uZWxOb3RpZmljYXRpb24+IHtcclxuICAgIHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbnMuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdE5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IENoYW5uZWxOb3RpZmljYXRpb24pIHtcclxuICAgIG5vdGlmaWNhdGlvbi5uYW1lID0gdGhpcy5uYW1lO1xyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgc3dpdGNoIChub3RpZmljYXRpb24udHlwZSkge1xyXG4gICAgICAgIGNhc2UgTm90aWZpY2F0aW9uVHlwZS5pbnB1dEVycm9yOlxyXG4gICAgICAgIGNhc2UgTm90aWZpY2F0aW9uVHlwZS5vdXRwdXRFcnJvcjpcclxuICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUub3V0cHV0RnVuY0Vycm9yOlxyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihgWyR7bm90aWZpY2F0aW9uLm5hbWV9OiR7bm90aWZpY2F0aW9uLnR5cGV9XSBgLCBub3RpZmljYXRpb24uZXJyb3IgfHwgJycpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGNvbnNvbGUuZGVidWcoYFske25vdGlmaWNhdGlvbi5uYW1lfToke25vdGlmaWNhdGlvbi50eXBlfV0gYCwgbm90aWZpY2F0aW9uLmRhdGEgfHwgJycpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMubm90aWZpY2F0aW9ucy5uZXh0KG5vdGlmaWNhdGlvbik7XHJcbiAgfVxyXG5cclxuICBlbmFibGUoKTogQ2hhbm5lbDxBLCBUPiB7XHJcbiAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgZGlzYWJsZSgpOiBDaGFubmVsPEEsIFQ+IHtcclxuICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIGNsb3NlKCkge1xyXG4gICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5pbnB1dC51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5vdXRwdXQudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDaGFubmVsU3dpdGNoIHtcclxuICBwcml2YXRlIGNoYW5uZWxzID0gbmV3IE1hcDxhbnksIENoYW5uZWw8YW55LCBhbnk+PigpO1xyXG5cclxuICBjb25zdHJ1Y3RvciguLi5jaGFubmVsczogeyBrZXk6IGFueSwgY2hhbm5lbDogQ2hhbm5lbDxhbnksIGFueT4gfVtdKSB7XHJcbiAgICBjaGFubmVscy5mb3JFYWNoKChjb25maWcpID0+IHtcclxuICAgICAgdGhpcy5jaGFubmVscy5zZXQoY29uZmlnLmtleSwgY29uZmlnLmNoYW5uZWwpO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHNldChrZXk6IGFueSwgY2hhbm5lbDogQ2hhbm5lbDxhbnksIGFueT4pOiBDaGFubmVsPGFueSwgYW55PiB7XHJcbiAgICB0aGlzLmNoYW5uZWxzLnNldChrZXksIGNoYW5uZWwpO1xyXG4gICAgcmV0dXJuIGNoYW5uZWw7XHJcbiAgfVxyXG5cclxuICBnZXQoa2V5OiBhbnkpOiBDaGFubmVsPGFueSwgYW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGFubmVscy5nZXQoa2V5KTtcclxuICB9XHJcblxyXG4gIGlzQnVzeShrZXk6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmdldChrZXkpO1xyXG4gICAgcmV0dXJuIGNoYW5uZWwgPyBjaGFubmVsLmlzQnVzeSgpIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBpc0lucHV0QnVzeShrZXk6IGFueSkge1xyXG4gICAgbGV0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmdldChrZXkpO1xyXG4gICAgcmV0dXJuIGNoYW5uZWwgPyBjaGFubmVsLmlzSW5wdXRCdXN5KCkgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGlzT3V0cHV0QnVzeShrZXk6IGFueSkge1xyXG4gICAgbGV0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmdldChrZXkpO1xyXG4gICAgcmV0dXJuIGNoYW5uZWwgPyBjaGFubmVsLmlzT3V0cHV0QnVzeSgpIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBuZXh0KGtleTogYW55LCB2YWx1ZT86IGFueSk6IENoYW5uZWw8YW55LCBhbnk+IHtcclxuICAgIGxldCBjaGFubmVsID0gdGhpcy5jaGFubmVscy5nZXQoa2V5KTtcclxuICAgIHJldHVybiBjaGFubmVsID8gY2hhbm5lbC5uZXh0KHZhbHVlKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBlbWl0KGtleTogYW55LCB2YWx1ZTogYW55KSB7XHJcbiAgICBsZXQgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMuZ2V0KGtleSk7XHJcbiAgICByZXR1cm4gY2hhbm5lbCA/IGNoYW5uZWwuZW1pdCh2YWx1ZSkgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIG9ic2VydmUoa2V5OiBhbnksIHZhbHVlPzogYW55LCAuLi5vcHM6IE9wZXJhdG9yRnVuY3Rpb248YW55LCBhbnk+W10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgbGV0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmdldChrZXkpO1xyXG4gICAgcmV0dXJuIGNoYW5uZWwgPyBjaGFubmVsLm9ic2VydmUodmFsdWUsIC4uLm9wcykgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgbGluayhrZXk6IGFueSwgb2JzZXJ2ZXI6IE9ic2VydmFibGU8YW55PiwgLi4ub3BzOiBPcGVyYXRvckZ1bmN0aW9uPGFueSwgYW55PltdKSB7XHJcbiAgICBsZXQgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMuZ2V0KGtleSk7XHJcbiAgICBpZiAoY2hhbm5lbCkge1xyXG4gICAgICBjaGFubmVsLmxpbmsob2JzZXJ2ZXIsIC4uLm9wcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwaXBlKGtleTogYW55LCBvYnNlcnZlcjogT2JzZXJ2YWJsZTxhbnk+LCAuLi5vcHM6IE9wZXJhdG9yRnVuY3Rpb248YW55LCBhbnk+W10pIHtcclxuICAgIGxldCBjaGFubmVsID0gdGhpcy5jaGFubmVscy5nZXQoa2V5KTtcclxuICAgIGlmIChjaGFubmVsKSB7XHJcbiAgICAgIGNoYW5uZWwucGlwZShvYnNlcnZlciwgLi4ub3BzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzT2JzZXJ2YWJsZShrZXk6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBsZXQgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMuZ2V0KGtleSk7XHJcbiAgICByZXR1cm4gY2hhbm5lbCA/IGNoYW5uZWwuYXNPYnNlcnZhYmxlKCkgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgb2JzZXJ2ZU5vdGlmaWNhdGlvbnMoa2V5OiBhbnkpOiBPYnNlcnZhYmxlPENoYW5uZWxOb3RpZmljYXRpb24+IHtcclxuICAgIGxldCBjaGFubmVsID0gdGhpcy5jaGFubmVscy5nZXQoa2V5KTtcclxuICAgIHJldHVybiBjaGFubmVsID8gY2hhbm5lbC5vYnNlcnZlTm90aWZpY2F0aW9ucygpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGVuYWJsZShrZXk6IGFueSk6IENoYW5uZWw8YW55LCBhbnk+IHtcclxuICAgIGxldCBjaGFubmVsID0gdGhpcy5jaGFubmVscy5nZXQoa2V5KTtcclxuICAgIHJldHVybiBjaGFubmVsID8gY2hhbm5lbC5lbmFibGUoKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBkaXNhYmxlKGtleTogYW55KTogQ2hhbm5lbDxhbnksIGFueT4ge1xyXG4gICAgbGV0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmdldChrZXkpO1xyXG4gICAgcmV0dXJuIGNoYW5uZWwgPyBjaGFubmVsLmRpc2FibGUoKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBjbG9zZShrZXk6IGFueSkge1xyXG4gICAgbGV0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmdldChrZXkpO1xyXG4gICAgcmV0dXJuIGNoYW5uZWwgPyBjaGFubmVsLmNsb3NlKCkgOiBudWxsO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEU09ic2VydmFibGVGbiB7XHJcbiAgKHZhbHVlPzogYW55KTogT2JzZXJ2YWJsZTxhbnk+O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERTT3BlcmF0b3Ige1xyXG4gIG9wZXJhdG9yOiBPcGVyYXRvckZ1bmN0aW9uPGFueSwgYW55PixcclxuICBpZDogYW55XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU9ic2VydmVPcHRpb25zIHtcclxuICBiZWhhdmU6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRFNJbnB1dE9wdGlvbnMge1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERTT3V0cHV0T3B0aW9ucyB7XHJcbiAgYmVoYXZlOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERTSW5wdXRFdmVudCB7XHJcbiAgaWQ6IGFueTtcclxuICBvcHRpb25zPzogRFNJbnB1dE9wdGlvbnMsXHJcbiAgdmFsdWU/OiBhbnlcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEU0V2ZW50IHtcclxuICBpbnB1dDogRFNJbnB1dEV2ZW50LFxyXG4gIG91dHB1dDogYW55O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRFNQaXBlIHtcclxuXHJcbiAgcHJpdmF0ZSBzdWI6IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkczogSU9ic2VydmFibGVEUyxcclxuICAgICAgICAgICAgICBwcml2YXRlIGtleTogYW55LFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgb2JzOiBPYnNlcnZhYmxlPGFueT4sXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBvcHM6IE9wZXJhdG9yRnVuY3Rpb248YW55LCBhbnk+W10sXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBlbmFibGVkOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgfVxyXG5cclxuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhKCF0aGlzLnN1Yik7XHJcbiAgfVxyXG5cclxuICBjb25uZWN0KCkge1xyXG4gICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdWIgPSB0aGlzLm9icy5waXBlKHBpcGVGcm9tQXJyYXkoWy4uLnRoaXMub3BzXSkpLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coYC0tLS0+IHBpcGUgKCR7dGhpcy5rZXl9KWAsIHZhbHVlKTtcclxuICAgICAgdGhpcy5kcy5uZXh0KHRoaXMua2V5LCB2YWx1ZSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZGlzY29ubmVjdCgpIHtcclxuICAgIGlmICghdGhpcy5pc0Nvbm5lY3RlZCgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBzZXRPcGVyYXRvcnMoLi4ub3BzOiBPcGVyYXRvckZ1bmN0aW9uPGF