@neo-one/monitor
Version:
NEO•ONE monitoring.
162 lines (160 loc) • 20.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("./utils");
class MetricProxy {
constructor(metric, labelNames = []) {
this.metric = metric;
this.labelNames = labelNames;
}
getLabelNames() {
return this.labelNames;
}
getLabels(countOrLabels) {
if (countOrLabels !== undefined && typeof countOrLabels === 'object') {
return utils_1.convertMetricLabels(countOrLabels);
}
return countOrLabels;
}
}
exports.MetricProxy = MetricProxy;
class CounterProxy extends MetricProxy {
inc(countOrLabels, count) {
if (this.metric !== undefined) {
this.metric.inc(this.getLabels(countOrLabels), count);
}
}
}
exports.CounterProxy = CounterProxy;
class GaugeProxy extends MetricProxy {
inc(countOrLabels, count) {
if (this.metric !== undefined) {
this.metric.inc(this.getLabels(countOrLabels), count);
}
}
dec(countOrLabels, count) {
if (this.metric !== undefined) {
this.metric.dec(this.getLabels(countOrLabels), count);
}
}
set(countOrLabels, count) {
if (this.metric !== undefined) {
this.metric.set(this.getLabels(countOrLabels), count);
}
}
}
exports.GaugeProxy = GaugeProxy;
class HistogramProxy extends MetricProxy {
observe(countOrLabels, count) {
if (this.metric !== undefined) {
this.metric.observe(this.getLabels(countOrLabels), count);
}
}
}
exports.HistogramProxy = HistogramProxy;
class SummaryProxy extends MetricProxy {
observe(countOrLabels, count) {
if (this.metric !== undefined) {
this.metric.observe(this.getLabels(countOrLabels), count);
}
}
}
exports.SummaryProxy = SummaryProxy;
class MetricsFactoryProxy {
constructor() {
this.mutableCounters = {};
this.mutableHistograms = {};
this.mutableGauges = {};
this.mutableSummaries = {};
}
reset_forTest() {
this.mutableCounters = {};
this.mutableHistograms = {};
this.mutableGauges = {};
this.mutableSummaries = {};
}
createCounter(options) {
let counter = this.mutableCounters[options.name];
if (counter === undefined) {
counter = this.createCounterHelper(options);
this.mutableCounters[options.name] = counter;
}
return counter;
}
createGauge(options) {
let gauge = this.mutableGauges[options.name];
if (gauge === undefined) {
gauge = this.createGaugeHelper(options);
this.mutableGauges[options.name] = gauge;
}
return gauge;
}
createHistogram(options) {
let histogram = this.mutableHistograms[options.name];
if (histogram === undefined) {
histogram = this.createHistogramHelper(options);
this.mutableHistograms[options.name] = histogram;
}
return histogram;
}
createSummary(options) {
let summary = this.mutableSummaries[options.name];
if (summary === undefined) {
summary = this.createSummaryHelper(options);
this.mutableSummaries[options.name] = summary;
}
return summary;
}
setFactory(mutableFactory) {
this.mutableFactory = mutableFactory;
}
createCounterInternal(_options) {
return new CounterProxy();
}
createGaugeInternal(_options) {
return new GaugeProxy();
}
createHistogramInternal(_options) {
return new HistogramProxy();
}
createSummaryInternal(_options) {
return new SummaryProxy();
}
getMetricConstruct(options) {
const { name, help = 'placeholder', labelNames: labelNamesIn = [] } = options;
const labelNames = labelNamesIn.map(utils_1.convertMetricLabel);
let construct = { name, help, labelNames };
if ('percentiles' in options && options.percentiles !== undefined) {
construct = { name, help, labelNames, percentiles: [...options.percentiles] };
}
else if ('buckets' in options && options.buckets !== undefined) {
construct = { name, help, labelNames, buckets: [...options.buckets] };
}
return construct;
}
createCounterHelper(options) {
if (this.mutableFactory !== undefined) {
return this.mutableFactory.createCounter(options);
}
return this.createCounterInternal(options);
}
createGaugeHelper(options) {
if (this.mutableFactory !== undefined) {
return this.mutableFactory.createGauge(options);
}
return this.createGaugeInternal(options);
}
createHistogramHelper(options) {
if (this.mutableFactory !== undefined) {
return this.mutableFactory.createHistogram(options);
}
return this.createHistogramInternal(options);
}
createSummaryHelper(options) {
if (this.mutableFactory !== undefined) {
return this.mutableFactory.createSummary(options);
}
return this.createSummaryInternal(options);
}
}
exports.MetricsFactoryProxy = MetricsFactoryProxy;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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Q0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU8sbUJBQW1CLENBQUMsT0FBaUM7UUFDM0QsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLFNBQVMsRUFBRTtZQUNyQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ25EO1FBRUQsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUNGO0FBekhELGtEQXlIQyIsImZpbGUiOiJuZW8tb25lLW1vbml0b3Ivc3JjL01ldHJpY3NGYWN0b3J5UHJveHkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCdWNrZXRlZE1ldHJpY09wdGlvbnMsXG4gIENvdW50ZXIsXG4gIENvdW50ZXJCYXNlLFxuICBHYXVnZSxcbiAgR2F1Z2VCYXNlLFxuICBIaXN0b2dyYW0sXG4gIEhpc3RvZ3JhbUJhc2UsXG4gIExhYmVscyxcbiAgTWV0cmljT3B0aW9ucyxcbiAgTWV0cmljc0ZhY3RvcnksXG4gIFBlcmNlbnRpbGVkTWV0cmljT3B0aW9ucyxcbiAgU3VtbWFyeSxcbiAgU3VtbWFyeUJhc2UsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQgeyBjb252ZXJ0TWV0cmljTGFiZWwsIGNvbnZlcnRNZXRyaWNMYWJlbHMgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNDb25zdHJ1Y3Qge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhlbHA6IHN0cmluZztcbiAgLy8gdHNsaW50OmRpc2FibGUgcmVhZG9ubHktYXJyYXlcbiAgcmVhZG9ubHkgbGFiZWxOYW1lczogc3RyaW5nW107XG4gIHJlYWRvbmx5IGJ1Y2tldHM/OiBudW1iZXJbXTtcbiAgcmVhZG9ubHkgcGVyY2VudGlsZXM/OiBudW1iZXJbXTtcbiAgLy8gdHNsaW50OmVuYWJsZSByZWFkb25seS1hcnJheVxufVxuXG5leHBvcnQgY2xhc3MgTWV0cmljUHJveHk8VD4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWV0cmljOiBUIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbGFiZWxOYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG1ldHJpYz86IFQgfCB1bmRlZmluZWQsIGxhYmVsTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10pIHtcbiAgICB0aGlzLm1ldHJpYyA9IG1ldHJpYztcbiAgICB0aGlzLmxhYmVsTmFtZXMgPSBsYWJlbE5hbWVzO1xuICB9XG5cbiAgcHVibGljIGdldExhYmVsTmFtZXMoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmxhYmVsTmFtZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TGFiZWxzKGNvdW50T3JMYWJlbHM/OiBMYWJlbHMgfCBudW1iZXIpOiBMYWJlbHMgfCBudW1iZXIgfCB2b2lkIHtcbiAgICBpZiAoY291bnRPckxhYmVscyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBjb3VudE9yTGFiZWxzID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGNvbnZlcnRNZXRyaWNMYWJlbHMoY291bnRPckxhYmVscyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50T3JMYWJlbHM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvdW50ZXJQcm94eSBleHRlbmRzIE1ldHJpY1Byb3h5PENvdW50ZXJCYXNlPiBpbXBsZW1lbnRzIENvdW50ZXIge1xuICBwdWJsaWMgaW5jKGNvdW50T3JMYWJlbHM/OiBMYWJlbHMgfCBudW1iZXIsIGNvdW50PzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWV0cmljICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubWV0cmljLmluYyh0aGlzLmdldExhYmVscyhjb3VudE9yTGFiZWxzKSBhcyBMYWJlbHMsIGNvdW50KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdhdWdlUHJveHkgZXh0ZW5kcyBNZXRyaWNQcm94eTxHYXVnZUJhc2U+IGltcGxlbWVudHMgR2F1Z2Uge1xuICBwdWJsaWMgaW5jKGNvdW50T3JMYWJlbHM/OiBMYWJlbHMgfCBudW1iZXIsIGNvdW50PzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWV0cmljICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubWV0cmljLmluYyh0aGlzLmdldExhYmVscyhjb3VudE9yTGFiZWxzKSBhcyBMYWJlbHMsIGNvdW50KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGVjKGNvdW50T3JMYWJlbHM/OiBMYWJlbHMgfCBudW1iZXIsIGNvdW50PzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWV0cmljICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubWV0cmljLmRlYyh0aGlzLmdldExhYmVscyhjb3VudE9yTGFiZWxzKSBhcyBMYWJlbHMsIGNvdW50KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0KGNvdW50T3JMYWJlbHM6IExhYmVscyB8IG51bWJlciwgY291bnQ/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZXRyaWMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5tZXRyaWMuc2V0KHRoaXMuZ2V0TGFiZWxzKGNvdW50T3JMYWJlbHMpIGFzIExhYmVscywgY291bnQgYXMgbnVtYmVyKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhpc3RvZ3JhbVByb3h5IGV4dGVuZHMgTWV0cmljUHJveHk8SGlzdG9ncmFtQmFzZT4gaW1wbGVtZW50cyBIaXN0b2dyYW0ge1xuICBwdWJsaWMgb2JzZXJ2ZShjb3VudE9yTGFiZWxzOiBMYWJlbHMgfCBudW1iZXIsIGNvdW50PzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWV0cmljICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubWV0cmljLm9ic2VydmUodGhpcy5nZXRMYWJlbHMoY291bnRPckxhYmVscykgYXMgTGFiZWxzLCBjb3VudCBhcyBudW1iZXIpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VtbWFyeVByb3h5IGV4dGVuZHMgTWV0cmljUHJveHk8U3VtbWFyeUJhc2U+IGltcGxlbWVudHMgU3VtbWFyeSB7XG4gIHB1YmxpYyBvYnNlcnZlKGNvdW50T3JMYWJlbHM6IExhYmVscyB8IG51bWJlciwgY291bnQ/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZXRyaWMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5tZXRyaWMub2JzZXJ2ZSh0aGlzLmdldExhYmVscyhjb3VudE9yTGFiZWxzKSBhcyBMYWJlbHMsIGNvdW50IGFzIG51bWJlcik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNZXRyaWNzRmFjdG9yeVByb3h5IGltcGxlbWVudHMgTWV0cmljc0ZhY3Rvcnkge1xuICBwcm90ZWN0ZWQgbXV0YWJsZUNvdW50ZXJzOiB7IFtLIGluIHN0cmluZ10/OiBDb3VudGVyIH0gPSB7fTtcbiAgcHJvdGVjdGVkIG11dGFibGVIaXN0b2dyYW1zOiB7IFtLIGluIHN0cmluZ10/OiBIaXN0b2dyYW0gfSA9IHt9O1xuICBwcm90ZWN0ZWQgbXV0YWJsZUdhdWdlczogeyBbSyBpbiBzdHJpbmddPzogR2F1Z2UgfSA9IHt9O1xuICBwcm90ZWN0ZWQgbXV0YWJsZVN1bW1hcmllczogeyBbSyBpbiBzdHJpbmddPzogU3VtbWFyeSB9ID0ge307XG5cbiAgcHJpdmF0ZSBtdXRhYmxlRmFjdG9yeTogTWV0cmljc0ZhY3RvcnkgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIHJlc2V0X2ZvclRlc3QoKTogdm9pZCB7XG4gICAgdGhpcy5tdXRhYmxlQ291bnRlcnMgPSB7fTtcbiAgICB0aGlzLm11dGFibGVIaXN0b2dyYW1zID0ge307XG4gICAgdGhpcy5tdXRhYmxlR2F1Z2VzID0ge307XG4gICAgdGhpcy5tdXRhYmxlU3VtbWFyaWVzID0ge307XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlQ291bnRlcihvcHRpb25zOiBNZXRyaWNPcHRpb25zKTogQ291bnRlciB7XG4gICAgbGV0IGNvdW50ZXIgPSB0aGlzLm11dGFibGVDb3VudGVyc1tvcHRpb25zLm5hbWVdO1xuICAgIGlmIChjb3VudGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvdW50ZXIgPSB0aGlzLmNyZWF0ZUNvdW50ZXJIZWxwZXIob3B0aW9ucyk7XG4gICAgICB0aGlzLm11dGFibGVDb3VudGVyc1tvcHRpb25zLm5hbWVdID0gY291bnRlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gY291bnRlcjtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVHYXVnZShvcHRpb25zOiBNZXRyaWNPcHRpb25zKTogR2F1Z2Uge1xuICAgIGxldCBnYXVnZSA9IHRoaXMubXV0YWJsZUdhdWdlc1tvcHRpb25zLm5hbWVdO1xuICAgIGlmIChnYXVnZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBnYXVnZSA9IHRoaXMuY3JlYXRlR2F1Z2VIZWxwZXIob3B0aW9ucyk7XG4gICAgICB0aGlzLm11dGFibGVHYXVnZXNbb3B0aW9ucy5uYW1lXSA9IGdhdWdlO1xuICAgIH1cblxuICAgIHJldHVybiBnYXVnZTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVIaXN0b2dyYW0ob3B0aW9uczogTWV0cmljT3B0aW9ucyk6IEhpc3RvZ3JhbSB7XG4gICAgbGV0IGhpc3RvZ3JhbSA9IHRoaXMubXV0YWJsZUhpc3RvZ3JhbXNbb3B0aW9ucy5uYW1lXTtcbiAgICBpZiAoaGlzdG9ncmFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhpc3RvZ3JhbSA9IHRoaXMuY3JlYXRlSGlzdG9ncmFtSGVscGVyKG9wdGlvbnMpO1xuICAgICAgdGhpcy5tdXRhYmxlSGlzdG9ncmFtc1tvcHRpb25zLm5hbWVdID0gaGlzdG9ncmFtO1xuICAgIH1cblxuICAgIHJldHVybiBoaXN0b2dyYW07XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlU3VtbWFyeShvcHRpb25zOiBNZXRyaWNPcHRpb25zKTogU3VtbWFyeSB7XG4gICAgbGV0IHN1bW1hcnkgPSB0aGlzLm11dGFibGVTdW1tYXJpZXNbb3B0aW9ucy5uYW1lXTtcbiAgICBpZiAoc3VtbWFyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdW1tYXJ5ID0gdGhpcy5jcmVhdGVTdW1tYXJ5SGVscGVyKG9wdGlvbnMpO1xuICAgICAgdGhpcy5tdXRhYmxlU3VtbWFyaWVzW29wdGlvbnMubmFtZV0gPSBzdW1tYXJ5O1xuICAgIH1cblxuICAgIHJldHVybiBzdW1tYXJ5O1xuICB9XG5cbiAgcHVibGljIHNldEZhY3RvcnkobXV0YWJsZUZhY3Rvcnk6IE1ldHJpY3NGYWN0b3J5KTogdm9pZCB7XG4gICAgdGhpcy5tdXRhYmxlRmFjdG9yeSA9IG11dGFibGVGYWN0b3J5O1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUNvdW50ZXJJbnRlcm5hbChfb3B0aW9uczogTWV0cmljT3B0aW9ucyk6IENvdW50ZXIge1xuICAgIHJldHVybiBuZXcgQ291bnRlclByb3h5KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlR2F1Z2VJbnRlcm5hbChfb3B0aW9uczogTWV0cmljT3B0aW9ucyk6IEdhdWdlIHtcbiAgICByZXR1cm4gbmV3IEdhdWdlUHJveHkoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVIaXN0b2dyYW1JbnRlcm5hbChfb3B0aW9uczogQnVja2V0ZWRNZXRyaWNPcHRpb25zKTogSGlzdG9ncmFtIHtcbiAgICByZXR1cm4gbmV3IEhpc3RvZ3JhbVByb3h5KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlU3VtbWFyeUludGVybmFsKF9vcHRpb25zOiBQZXJjZW50aWxlZE1ldHJpY09wdGlvbnMpOiBTdW1tYXJ5IHtcbiAgICByZXR1cm4gbmV3IFN1bW1hcnlQcm94eSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldE1ldHJpY0NvbnN0cnVjdChcbiAgICBvcHRpb25zOiBNZXRyaWNPcHRpb25zIHwgQnVja2V0ZWRNZXRyaWNPcHRpb25zIHwgUGVyY2VudGlsZWRNZXRyaWNPcHRpb25zLFxuICApOiBNZXRyaWNDb25zdHJ1Y3Qge1xuICAgIGNvbnN0IHsgbmFtZSwgaGVscCA9ICdwbGFjZWhvbGRlcicsIGxhYmVsTmFtZXM6IGxhYmVsTmFtZXNJbiA9IFtdIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGxhYmVsTmFtZXMgPSBsYWJlbE5hbWVzSW4ubWFwKGNvbnZlcnRNZXRyaWNMYWJlbCk7XG4gICAgbGV0IGNvbnN0cnVjdDogTWV0cmljQ29uc3RydWN0ID0geyBuYW1lLCBoZWxwLCBsYWJlbE5hbWVzIH07XG4gICAgaWYgKCdwZXJjZW50aWxlcycgaW4gb3B0aW9ucyAmJiBvcHRpb25zLnBlcmNlbnRpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0cnVjdCA9IHsgbmFtZSwgaGVscCwgbGFiZWxOYW1lcywgcGVyY2VudGlsZXM6IFsuLi5vcHRpb25zLnBlcmNlbnRpbGVzXSB9O1xuICAgIH0gZWxzZSBpZiAoJ2J1Y2tldHMnIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5idWNrZXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0cnVjdCA9IHsgbmFtZSwgaGVscCwgbGFiZWxOYW1lcywgYnVja2V0czogWy4uLm9wdGlvbnMuYnVja2V0c10gfTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uc3RydWN0O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb3VudGVySGVscGVyKG9wdGlvbnM6IE1ldHJpY09wdGlvbnMpOiBDb3VudGVyIHtcbiAgICBpZiAodGhpcy5tdXRhYmxlRmFjdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5tdXRhYmxlRmFjdG9yeS5jcmVhdGVDb3VudGVyKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUNvdW50ZXJJbnRlcm5hbChvcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlR2F1Z2VIZWxwZXIob3B0aW9uczogTWV0cmljT3B0aW9ucyk6IEdhdWdlIHtcbiAgICBpZiAodGhpcy5tdXRhYmxlRmFjdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5tdXRhYmxlRmFjdG9yeS5jcmVhdGVHYXVnZShvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVHYXVnZUludGVybmFsKG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVIaXN0b2dyYW1IZWxwZXIob3B0aW9uczogQnVja2V0ZWRNZXRyaWNPcHRpb25zKTogSGlzdG9ncmFtIHtcbiAgICBpZiAodGhpcy5tdXRhYmxlRmFjdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5tdXRhYmxlRmFjdG9yeS5jcmVhdGVIaXN0b2dyYW0ob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlSGlzdG9ncmFtSW50ZXJuYWwob3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVN1bW1hcnlIZWxwZXIob3B0aW9uczogUGVyY2VudGlsZWRNZXRyaWNPcHRpb25zKTogU3VtbWFyeSB7XG4gICAgaWYgKHRoaXMubXV0YWJsZUZhY3RvcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMubXV0YWJsZUZhY3RvcnkuY3JlYXRlU3VtbWFyeShvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTdW1tYXJ5SW50ZXJuYWwob3B0aW9ucyk7XG4gIH1cbn1cbiJdfQ==