UNPKG

benchpress

Version:

Benchpress - a framework for e2e performance tests

100 lines 14.1 kB
import { isPresent, isBlank } from 'angular2/src/facade/lang'; import { PromiseWrapper } from 'angular2/src/facade/async'; import { bind } from 'angular2/src/core/di'; import { Metric } from './metric'; import { Validator } from './validator'; import { Reporter } from './reporter'; import { WebDriverAdapter } from './web_driver_adapter'; import { Options } from './common_options'; import { MeasureValues } from './measure_values'; /** * The Sampler owns the sample loop: * 1. calls the prepare/execute callbacks, * 2. gets data from the metric * 3. asks the validator for a valid sample * 4. reports the new data to the reporter * 5. loop until there is a valid sample */ export class Sampler { constructor({ driver, metric, reporter, validator, prepare, execute, now } = {}) { this._driver = driver; this._metric = metric; this._reporter = reporter; this._validator = validator; this._prepare = prepare; this._execute = execute; this._now = now; } // TODO(tbosch): use static values when our transpiler supports them static get BINDINGS() { return _PROVIDERS; } sample() { var loop; loop = (lastState) => { return this._iterate(lastState).then((newState) => { if (isPresent(newState.validSample)) { return newState; } else { return loop(newState); } }); }; return loop(new SampleState([], null)); } _iterate(lastState) { var resultPromise; if (isPresent(this._prepare)) { resultPromise = this._driver.waitFor(this._prepare); } else { resultPromise = PromiseWrapper.resolve(null); } if (isPresent(this._prepare) || lastState.completeSample.length === 0) { resultPromise = resultPromise.then((_) => this._metric.beginMeasure()); } return resultPromise.then((_) => this._driver.waitFor(this._execute)) .then((_) => this._metric.endMeasure(isBlank(this._prepare))) .then((measureValues) => this._report(lastState, measureValues)); } _report(state, metricValues) { var measureValues = new MeasureValues(state.completeSample.length, this._now(), metricValues); var completeSample = state.completeSample.concat([measureValues]); var validSample = this._validator.validate(completeSample); var resultPromise = this._reporter.reportMeasureValues(measureValues); if (isPresent(validSample)) { resultPromise = resultPromise.then((_) => this._reporter.reportSample(completeSample, validSample)); } return resultPromise.then((_) => new SampleState(completeSample, validSample)); } } export class SampleState { constructor(completeSample, validSample) { this.completeSample = completeSample; this.validSample = validSample; } } var _PROVIDERS = [ bind(Sampler) .toFactory((driver, metric, reporter, validator, prepare, execute, now) => new Sampler({ driver: driver, reporter: reporter, validator: validator, metric: metric, // TODO(tbosch): DI right now does not support null/undefined objects // Mostly because the cache would have to be initialized with a // special null object, which is expensive. prepare: prepare !== false ? prepare : null, execute: execute, now: now }), [ WebDriverAdapter, Metric, Reporter, Validator, Options.PREPARE, Options.EXECUTE, Options.NOW ]) ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtcGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRpZmZpbmdfcGx1Z2luX3dyYXBwZXItb3V0cHV0X3BhdGgteEJMSUJyVlIudG1wL2JlbmNocHJlc3Mvc3JjL3NhbXBsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ik9BQU8sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFvQixNQUFNLDBCQUEwQjtPQUN2RSxFQUFDLGNBQWMsRUFBQyxNQUFNLDJCQUEyQjtPQUNqRCxFQUFDLElBQUksRUFBaUMsTUFBTSxzQkFBc0I7T0FFbEUsRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVO09BQ3hCLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYTtPQUM5QixFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVk7T0FDNUIsRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHNCQUFzQjtPQUU5QyxFQUFDLE9BQU8sRUFBQyxNQUFNLGtCQUFrQjtPQUNqQyxFQUFDLGFBQWEsRUFBQyxNQUFNLGtCQUFrQjtBQUU5Qzs7Ozs7OztHQU9HO0FBQ0g7SUFZRSxZQUFZLEVBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFDLEdBUXBFLEVBQUU7UUFDSixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBM0JELG9FQUFvRTtJQUNwRSxXQUFXLFFBQVEsS0FBaUIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUE0QnhELE1BQU07UUFDSixJQUFJLElBQUksQ0FBQztRQUNULElBQUksR0FBRyxDQUFDLFNBQVM7WUFDZixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRO2dCQUM1QyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDcEMsTUFBTSxDQUFDLFFBQVEsQ0FBQztnQkFDbEIsQ0FBQztnQkFBQyxJQUFJLENBQUMsQ0FBQztvQkFDTixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN4QixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxRQUFRLENBQUMsU0FBUztRQUNoQixJQUFJLGFBQTJCLENBQUM7UUFDaEMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixhQUFhLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLGFBQWEsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2hFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7YUFDNUQsSUFBSSxDQUFDLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFrQixFQUFFLFlBQWtDO1FBQzVELElBQUksYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM5RixJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDM0QsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0RSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLGFBQWE7Z0JBQ1QsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQTtRQUN6RixDQUFDO1FBQ0QsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxXQUFXLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztBQUNILENBQUM7QUFFRDtJQUNFLFlBQW1CLGNBQXFCLEVBQVMsV0FBa0I7UUFBaEQsbUJBQWMsR0FBZCxjQUFjLENBQU87UUFBUyxnQkFBVyxHQUFYLFdBQVcsQ0FBTztJQUFHLENBQUM7QUFDekUsQ0FBQztBQUVELElBQUksVUFBVSxHQUFHO0lBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUNSLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsS0FBSyxJQUFJLE9BQU8sQ0FBQztRQUMxRSxNQUFNLEVBQUUsTUFBTTtRQUNkLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLE1BQU0sRUFBRSxNQUFNO1FBQ2QscUVBQXFFO1FBQ3JFLCtEQUErRDtRQUMvRCwyQ0FBMkM7UUFDM0MsT0FBTyxFQUFFLE9BQU8sS0FBSyxLQUFLLEdBQUcsT0FBTyxHQUFHLElBQUk7UUFDM0MsT0FBTyxFQUFFLE9BQU87UUFDaEIsR0FBRyxFQUFFLEdBQUc7S0FDVCxDQUFDLEVBQ0Y7UUFDRSxnQkFBZ0I7UUFDaEIsTUFBTTtRQUNOLFFBQVE7UUFDUixTQUFTO1FBQ1QsT0FBTyxDQUFDLE9BQU87UUFDZixPQUFPLENBQUMsT0FBTztRQUNmLE9BQU8sQ0FBQyxHQUFHO0tBQ1osQ0FBQztDQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc1ByZXNlbnQsIGlzQmxhbmssIERhdGUsIERhdGVXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtQcm9taXNlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge2JpbmQsIHByb3ZpZGUsIFByb3ZpZGVyLCBPcGFxdWVUb2tlbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuXG5pbXBvcnQge01ldHJpY30gZnJvbSAnLi9tZXRyaWMnO1xuaW1wb3J0IHtWYWxpZGF0b3J9IGZyb20gJy4vdmFsaWRhdG9yJztcbmltcG9ydCB7UmVwb3J0ZXJ9IGZyb20gJy4vcmVwb3J0ZXInO1xuaW1wb3J0IHtXZWJEcml2ZXJBZGFwdGVyfSBmcm9tICcuL3dlYl9kcml2ZXJfYWRhcHRlcic7XG5cbmltcG9ydCB7T3B0aW9uc30gZnJvbSAnLi9jb21tb25fb3B0aW9ucyc7XG5pbXBvcnQge01lYXN1cmVWYWx1ZXN9IGZyb20gJy4vbWVhc3VyZV92YWx1ZXMnO1xuXG4vKipcbiAqIFRoZSBTYW1wbGVyIG93bnMgdGhlIHNhbXBsZSBsb29wOlxuICogMS4gY2FsbHMgdGhlIHByZXBhcmUvZXhlY3V0ZSBjYWxsYmFja3MsXG4gKiAyLiBnZXRzIGRhdGEgZnJvbSB0aGUgbWV0cmljXG4gKiAzLiBhc2tzIHRoZSB2YWxpZGF0b3IgZm9yIGEgdmFsaWQgc2FtcGxlXG4gKiA0LiByZXBvcnRzIHRoZSBuZXcgZGF0YSB0byB0aGUgcmVwb3J0ZXJcbiAqIDUuIGxvb3AgdW50aWwgdGhlcmUgaXMgYSB2YWxpZCBzYW1wbGVcbiAqL1xuZXhwb3J0IGNsYXNzIFNhbXBsZXIge1xuICAvLyBUT0RPKHRib3NjaCk6IHVzZSBzdGF0aWMgdmFsdWVzIHdoZW4gb3VyIHRyYW5zcGlsZXIgc3VwcG9ydHMgdGhlbVxuICBzdGF0aWMgZ2V0IEJJTkRJTkdTKCk6IFByb3ZpZGVyW10geyByZXR1cm4gX1BST1ZJREVSUzsgfVxuXG4gIF9kcml2ZXI6IFdlYkRyaXZlckFkYXB0ZXI7XG4gIF9tZXRyaWM6IE1ldHJpYztcbiAgX3JlcG9ydGVyOiBSZXBvcnRlcjtcbiAgX3ZhbGlkYXRvcjogVmFsaWRhdG9yO1xuICBfcHJlcGFyZTogRnVuY3Rpb247XG4gIF9leGVjdXRlOiBGdW5jdGlvbjtcbiAgX25vdzogRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioe2RyaXZlciwgbWV0cmljLCByZXBvcnRlciwgdmFsaWRhdG9yLCBwcmVwYXJlLCBleGVjdXRlLCBub3d9OiB7XG4gICAgZHJpdmVyPzogV2ViRHJpdmVyQWRhcHRlcixcbiAgICBtZXRyaWM/OiBNZXRyaWMsXG4gICAgcmVwb3J0ZXI/OiBSZXBvcnRlcixcbiAgICB2YWxpZGF0b3I/OiBWYWxpZGF0b3IsXG4gICAgcHJlcGFyZT86IEZ1bmN0aW9uLFxuICAgIGV4ZWN1dGU/OiBGdW5jdGlvbixcbiAgICBub3c/OiBGdW5jdGlvblxuICB9ID0ge30pIHtcbiAgICB0aGlzLl9kcml2ZXIgPSBkcml2ZXI7XG4gICAgdGhpcy5fbWV0cmljID0gbWV0cmljO1xuICAgIHRoaXMuX3JlcG9ydGVyID0gcmVwb3J0ZXI7XG4gICAgdGhpcy5fdmFsaWRhdG9yID0gdmFsaWRhdG9yO1xuICAgIHRoaXMuX3ByZXBhcmUgPSBwcmVwYXJlO1xuICAgIHRoaXMuX2V4ZWN1dGUgPSBleGVjdXRlO1xuICAgIHRoaXMuX25vdyA9IG5vdztcbiAgfVxuXG4gIHNhbXBsZSgpOiBQcm9taXNlPFNhbXBsZVN0YXRlPiB7XG4gICAgdmFyIGxvb3A7XG4gICAgbG9vcCA9IChsYXN0U3RhdGUpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLl9pdGVyYXRlKGxhc3RTdGF0ZSkudGhlbigobmV3U3RhdGUpID0+IHtcbiAgICAgICAgaWYgKGlzUHJlc2VudChuZXdTdGF0ZS52YWxpZFNhbXBsZSkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGxvb3AobmV3U3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBsb29wKG5ldyBTYW1wbGVTdGF0ZShbXSwgbnVsbCkpO1xuICB9XG5cbiAgX2l0ZXJhdGUobGFzdFN0YXRlKTogUHJvbWlzZTxTYW1wbGVTdGF0ZT4ge1xuICAgIHZhciByZXN1bHRQcm9taXNlOiBQcm9taXNlPGFueT47XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl9wcmVwYXJlKSkge1xuICAgICAgcmVzdWx0UHJvbWlzZSA9IHRoaXMuX2RyaXZlci53YWl0Rm9yKHRoaXMuX3ByZXBhcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRQcm9taXNlID0gUHJvbWlzZVdyYXBwZXIucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl9wcmVwYXJlKSB8fCBsYXN0U3RhdGUuY29tcGxldGVTYW1wbGUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXN1bHRQcm9taXNlID0gcmVzdWx0UHJvbWlzZS50aGVuKChfKSA9PiB0aGlzLl9tZXRyaWMuYmVnaW5NZWFzdXJlKCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0UHJvbWlzZS50aGVuKChfKSA9PiB0aGlzLl9kcml2ZXIud2FpdEZvcih0aGlzLl9leGVjdXRlKSlcbiAgICAgICAgLnRoZW4oKF8pID0+IHRoaXMuX21ldHJpYy5lbmRNZWFzdXJlKGlzQmxhbmsodGhpcy5fcHJlcGFyZSkpKVxuICAgICAgICAudGhlbigobWVhc3VyZVZhbHVlcykgPT4gdGhpcy5fcmVwb3J0KGxhc3RTdGF0ZSwgbWVhc3VyZVZhbHVlcykpO1xuICB9XG5cbiAgX3JlcG9ydChzdGF0ZTogU2FtcGxlU3RhdGUsIG1ldHJpY1ZhbHVlczoge1trZXk6IHN0cmluZ106IGFueX0pOiBQcm9taXNlPFNhbXBsZVN0YXRlPiB7XG4gICAgdmFyIG1lYXN1cmVWYWx1ZXMgPSBuZXcgTWVhc3VyZVZhbHVlcyhzdGF0ZS5jb21wbGV0ZVNhbXBsZS5sZW5ndGgsIHRoaXMuX25vdygpLCBtZXRyaWNWYWx1ZXMpO1xuICAgIHZhciBjb21wbGV0ZVNhbXBsZSA9IHN0YXRlLmNvbXBsZXRlU2FtcGxlLmNvbmNhdChbbWVhc3VyZVZhbHVlc10pO1xuICAgIHZhciB2YWxpZFNhbXBsZSA9IHRoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZShjb21wbGV0ZVNhbXBsZSk7XG4gICAgdmFyIHJlc3VsdFByb21pc2UgPSB0aGlzLl9yZXBvcnRlci5yZXBvcnRNZWFzdXJlVmFsdWVzKG1lYXN1cmVWYWx1ZXMpO1xuICAgIGlmIChpc1ByZXNlbnQodmFsaWRTYW1wbGUpKSB7XG4gICAgICByZXN1bHRQcm9taXNlID1cbiAgICAgICAgICByZXN1bHRQcm9taXNlLnRoZW4oKF8pID0+IHRoaXMuX3JlcG9ydGVyLnJlcG9ydFNhbXBsZShjb21wbGV0ZVNhbXBsZSwgdmFsaWRTYW1wbGUpKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0UHJvbWlzZS50aGVuKChfKSA9PiBuZXcgU2FtcGxlU3RhdGUoY29tcGxldGVTYW1wbGUsIHZhbGlkU2FtcGxlKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNhbXBsZVN0YXRlIHtcbiAgY29uc3RydWN0b3IocHVibGljIGNvbXBsZXRlU2FtcGxlOiBhbnlbXSwgcHVibGljIHZhbGlkU2FtcGxlOiBhbnlbXSkge31cbn1cblxudmFyIF9QUk9WSURFUlMgPSBbXG4gIGJpbmQoU2FtcGxlcilcbiAgICAgIC50b0ZhY3RvcnkoKGRyaXZlciwgbWV0cmljLCByZXBvcnRlciwgdmFsaWRhdG9yLCBwcmVwYXJlLCBleGVjdXRlLCBub3cpID0+IG5ldyBTYW1wbGVyKHtcbiAgICAgICAgICAgICAgICAgICBkcml2ZXI6IGRyaXZlcixcbiAgICAgICAgICAgICAgICAgICByZXBvcnRlcjogcmVwb3J0ZXIsXG4gICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yOiB2YWxpZGF0b3IsXG4gICAgICAgICAgICAgICAgICAgbWV0cmljOiBtZXRyaWMsXG4gICAgICAgICAgICAgICAgICAgLy8gVE9ETyh0Ym9zY2gpOiBESSByaWdodCBub3cgZG9lcyBub3Qgc3VwcG9ydCBudWxsL3VuZGVmaW5lZCBvYmplY3RzXG4gICAgICAgICAgICAgICAgICAgLy8gTW9zdGx5IGJlY2F1c2UgdGhlIGNhY2hlIHdvdWxkIGhhdmUgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCBhXG4gICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBudWxsIG9iamVjdCwgd2hpY2ggaXMgZXhwZW5zaXZlLlxuICAgICAgICAgICAgICAgICAgIHByZXBhcmU6IHByZXBhcmUgIT09IGZhbHNlID8gcHJlcGFyZSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgZXhlY3V0ZTogZXhlY3V0ZSxcbiAgICAgICAgICAgICAgICAgICBub3c6IG5vd1xuICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgIFdlYkRyaXZlckFkYXB0ZXIsXG4gICAgICAgICAgICAgICAgICAgTWV0cmljLFxuICAgICAgICAgICAgICAgICAgIFJlcG9ydGVyLFxuICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvcixcbiAgICAgICAgICAgICAgICAgICBPcHRpb25zLlBSRVBBUkUsXG4gICAgICAgICAgICAgICAgICAgT3B0aW9ucy5FWEVDVVRFLFxuICAgICAgICAgICAgICAgICAgIE9wdGlvbnMuTk9XXG4gICAgICAgICAgICAgICAgIF0pXG5dO1xuIl19