"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.asyncfilter = asyncfilter; exports.asyncify = asyncify; exports.asyncmap = asyncmap; exports.longSleep = longSleep; exports.nodeify = nodeify; exports.nodeifyAll = nodeifyAll; exports.parallel = void 0; exports.retry = retry; exports.retryInterval = retryInterval; exports.sleep = sleep; exports.waitForCondition = waitForCondition; require("source-map-support/register"); var _bluebird = _interopRequireDefault(require("bluebird")); var _lodash = _interopRequireDefault(require("lodash")); const LONG_SLEEP_THRESHOLD = 5000; async function sleep(ms) { return await _bluebird.default.delay(ms); } async function longSleep(ms, { thresholdMs = LONG_SLEEP_THRESHOLD, intervalMs = 1000, progressCb = null } = {}) { if (ms < thresholdMs) { return await sleep(ms); } const endAt = Date.now() + ms; let timeLeft; let elapsedMs = 0; do { const pre = Date.now(); await sleep(intervalMs); const post = Date.now(); timeLeft = endAt - post; elapsedMs = elapsedMs + (post - pre); if (_lodash.default.isFunction(progressCb)) { progressCb({ elapsedMs, timeLeft, progress: elapsedMs / ms }); } } while (timeLeft > 0); } async function retry(times, fn, ...args) { let tries = 0; let done = false; let res = null; while (!done && tries < times) { tries++; try { res = await fn(...args); done = true; } catch (err) { if (tries >= times) { throw err; } } } return res; } async function retryInterval(times, sleepMs, fn, ...args) { let count = 0; let wrapped = async () => { count++; let res; try { res = await fn(...args); } catch (e) { if (count !== times) { await sleep(sleepMs); } throw e; } return res; }; return await retry(times, wrapped); } const parallel = _bluebird.default.all; exports.parallel = parallel; function nodeify(promisey, cb) { return _bluebird.default.resolve(promisey).nodeify(cb); } function nodeifyAll(promiseyMap) { let cbMap = {}; for (const [name, fn] of _lodash.default.toPairs(promiseyMap)) { cbMap[name] = function (...args) { const _cb = args.slice(-1)[0]; args = args.slice(0, -1); nodeify(fn(...args), _cb); }; } return cbMap; } function asyncify(fn, ...args) { _bluebird.default.resolve(fn(...args)).done(); } async function asyncmap(coll, mapper, runInParallel = true) { if (runInParallel) { return parallel(coll.map(mapper)); } let newColl = []; for (let item of coll) { newColl.push(await mapper(item)); } return newColl; } async function asyncfilter(coll, filter, runInParallel = true) { let newColl = []; if (runInParallel) { let bools = await parallel(coll.map(filter)); for (let i = 0; i < coll.length; i++) { if (bools[i]) { newColl.push(coll[i]); } } } else { for (let item of coll) { if (await filter(item)) { newColl.push(item); } } } return newColl; } async function waitForCondition(condFn, options = {}) { const opts = _lodash.default.defaults(options, { waitMs: 5000, intervalMs: 500 }); const debug = opts.logger ? opts.logger.debug.bind(opts.logger) : _lodash.default.noop; const error = opts.error; const begunAt = Date.now(); const endAt = begunAt + opts.waitMs; const spin = async function spin() { const result = await condFn(); if (result) { return result; } const now = Date.now(); const waited = now - begunAt; const remainingTime = endAt - now; if (now < endAt) { debug(`Waited for ${waited} ms so far`); await _bluebird.default.delay(Math.min(opts.intervalMs, remainingTime)); return await spin(); } throw error ? _lodash.default.isString(error) ? new Error(error) : error : new Error(`Condition unmet after ${waited} ms. Timing out.`); }; return await spin(); }require('source-map-support').install(); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2FzeW5jYm94LmpzIiwibmFtZXMiOlsiTE9OR19TTEVFUF9USFJFU0hPTEQiLCJzbGVlcCIsIm1zIiwiQiIsImRlbGF5IiwibG9uZ1NsZWVwIiwidGhyZXNob2xkTXMiLCJpbnRlcnZhbE1zIiwicHJvZ3Jlc3NDYiIsImVuZEF0IiwiRGF0ZSIsIm5vdyIsInRpbWVMZWZ0IiwiZWxhcHNlZE1zIiwicHJlIiwicG9zdCIsIl8iLCJpc0Z1bmN0aW9uIiwicHJvZ3Jlc3MiLCJyZXRyeSIsInRpbWVzIiwiZm4iLCJhcmdzIiwidHJpZXMiLCJkb25lIiwicmVzIiwiZXJyIiwicmV0cnlJbnRlcnZhbCIsInNsZWVwTXMiLCJjb3VudCIsIndyYXBwZWQiLCJlIiwicGFyYWxsZWwiLCJhbGwiLCJub2RlaWZ5IiwicHJvbWlzZXkiLCJjYiIsInJlc29sdmUiLCJub2RlaWZ5QWxsIiwicHJvbWlzZXlNYXAiLCJjYk1hcCIsIm5hbWUiLCJ0b1BhaXJzIiwiX2NiIiwic2xpY2UiLCJhc3luY2lmeSIsImFzeW5jbWFwIiwiY29sbCIsIm1hcHBlciIsInJ1bkluUGFyYWxsZWwiLCJtYXAiLCJuZXdDb2xsIiwiaXRlbSIsInB1c2giLCJhc3luY2ZpbHRlciIsImZpbHRlciIsImJvb2xzIiwiaSIsImxlbmd0aCIsIndhaXRGb3JDb25kaXRpb24iLCJjb25kRm4iLCJvcHRpb25zIiwib3B0cyIsImRlZmF1bHRzIiwid2FpdE1zIiwiZGVidWciLCJsb2dnZXIiLCJiaW5kIiwibm9vcCIsImVycm9yIiwiYmVndW5BdCIsInNwaW4iLCJyZXN1bHQiLCJ3YWl0ZWQiLCJyZW1haW5pbmdUaW1lIiwiTWF0aCIsIm1pbiIsImlzU3RyaW5nIiwiRXJyb3IiXSwic291cmNlUm9vdCI6Ii4uLy4uIiwic291cmNlcyI6WyJsaWIvYXN5bmNib3guanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1haW5cblxuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuY29uc3QgTE9OR19TTEVFUF9USFJFU0hPTEQgPSA1MDAwOyAvLyBhbnl0aGluZyBvdmVyIDUwMDBtcyB3aWxsIHR1cm4gaW50byBhIHNwaW5cblxuLyoqXG4gKiBBbiBhc3luYy9hd2FpdCB2ZXJzaW9uIG9mIHNldFRpbWVvdXRcbiAqIEBwYXJhbSB7bnVtYmVyfSBtc1xuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwIChtcykge1xuICByZXR1cm4gYXdhaXQgQi5kZWxheShtcyk7XG59XG5cbi8qKlxuICogU29tZXRpbWVzIGBQcm9taXNlLmRlbGF5YCBvciBgc2V0VGltZW91dGAgYXJlIGluYWNjdXJhdGUgZm9yIGxhcmdlIHdhaXRcbiAqIHRpbWVzLiBUbyBzYWZlbHkgd2FpdCBmb3IgdGhlc2UgbG9uZyB0aW1lcyAoZS5nLiBpbiB0aGUgNSsgbWludXRlIHJhbmdlKSwgeW91XG4gKiBjYW4gdXNlIGBsb25nU2xlZXBgLlxuICpcbiAqIHNZb3UgY2FuIGFsc28gcGFzcyBhIGBwcm9ncmVzc0NiYCBvcHRpb24gd2hpY2ggaXMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0XG4gKiByZWNlaXZlcyBhbiBvYmplY3Qgd2l0aCB0aGUgcHJvcGVydGllcyBgZWxhcHNlZE1zYCwgYHRpbWVMZWZ0YCwgYW5kXG4gKiBgcHJvZ3Jlc3NgLiBUaGlzIHdpbGwgYmUgY2FsbGVkIG9uIGV2ZXJ5IHdhaXQgaW50ZXJ2YWwgc28geW91IGNhbiBkbyB5b3VyXG4gKiB3YWl0IGxvZ2dpbmcgb3Igd2hhdGV2ZXIuXG4gKiBAcGFyYW0ge251bWJlcn0gbXNcbiAqIEBwYXJhbSB7TG9uZ1NsZWVwT3B0aW9uc30gW29wdHNdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9uZ1NsZWVwIChtcywge1xuICB0aHJlc2hvbGRNcyA9IExPTkdfU0xFRVBfVEhSRVNIT0xELFxuICBpbnRlcnZhbE1zID0gMTAwMCxcbiAgcHJvZ3Jlc3NDYiA9IG51bGwsXG59ID0ge30pIHtcbiAgaWYgKG1zIDwgdGhyZXNob2xkTXMpIHtcbiAgICByZXR1cm4gYXdhaXQgc2xlZXAobXMpO1xuICB9XG4gIGNvbnN0IGVuZEF0ID0gRGF0ZS5ub3coKSArIG1zO1xuICBsZXQgdGltZUxlZnQ7XG4gIGxldCBlbGFwc2VkTXMgPSAwO1xuICBkbyB7XG4gICAgY29uc3QgcHJlID0gRGF0ZS5ub3coKTtcbiAgICBhd2FpdCBzbGVlcChpbnRlcnZhbE1zKTtcbiAgICBjb25zdCBwb3N0ID0gRGF0ZS5ub3coKTtcbiAgICB0aW1lTGVmdCA9IGVuZEF0IC0gcG9zdDtcbiAgICBlbGFwc2VkTXMgPSBlbGFwc2VkTXMgKyAocG9zdCAtIHByZSk7XG4gICAgaWYgKF8uaXNGdW5jdGlvbihwcm9ncmVzc0NiKSkge1xuICAgICAgcHJvZ3Jlc3NDYih7ZWxhcHNlZE1zLCB0aW1lTGVmdCwgcHJvZ3Jlc3M6IGVsYXBzZWRNcyAvIG1zfSk7XG4gICAgfVxuICB9IHdoaWxlICh0aW1lTGVmdCA+IDApO1xufVxuXG4vKipcbiAqIEFuIGFzeW5jL2F3YWl0IHdheSBvZiBydW5uaW5nIGEgbWV0aG9kIHVudGlsIGl0IGRvZXNuJ3QgdGhyb3cgYW4gZXJyb3JcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZXNcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPFQ+fSBmblxuICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUPz59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJldHJ5ICh0aW1lcywgZm4sIC4uLmFyZ3MpIHtcbiAgbGV0IHRyaWVzID0gMDtcbiAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgbGV0IHJlcyA9IG51bGw7XG4gIHdoaWxlICghZG9uZSAmJiB0cmllcyA8IHRpbWVzKSB7XG4gICAgdHJpZXMrKztcbiAgICB0cnkge1xuICAgICAgcmVzID0gYXdhaXQgZm4oLi4uYXJncyk7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh0cmllcyA+PSB0aW1lcykge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICogWW91IGNhbiBhbHNvIHVzZSBgcmV0cnlJbnRlcnZhbGAgdG8gYWRkIGEgc2xlZXAgaW4gYmV0d2VlbiByZXRyaWVzLiBUaGlzIGNhblxuICogYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHRocm90dGxlIGhvdyBmYXN0IHdlIHJldHJ5LlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lc1xuICogQHBhcmFtIHtudW1iZXJ9IHNsZWVwTXNcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPFQ+fSBmblxuICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUPz59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJldHJ5SW50ZXJ2YWwgKHRpbWVzLCBzbGVlcE1zLCBmbiwgLi4uYXJncykge1xuICBsZXQgY291bnQgPSAwO1xuICBsZXQgd3JhcHBlZCA9IGFzeW5jICgpID0+IHtcbiAgICBjb3VudCsrO1xuICAgIGxldCByZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGF3YWl0IGZuKC4uLmFyZ3MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGRvIG5vdCBwYXVzZSB3aGVuIGZpbmlzaGVkIHRoZSBsYXN0IHJldHJ5XG4gICAgICBpZiAoY291bnQgIT09IHRpbWVzKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTXMpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcbiAgcmV0dXJuIGF3YWl0IHJldHJ5KHRpbWVzLCB3cmFwcGVkKTtcbn1cblxuY29uc3QgcGFyYWxsZWwgPSBCLmFsbDtcblxuLyoqXG4gKiBFeHBvcnQgYXN5bmMgZnVuY3Rpb25zIChQcm9taXNlcykgYW5kIGltcG9ydCB0aGlzIHdpdGggeW91ciBFUzUgY29kZSB0byB1c2VcbiAqIGl0IHdpdGggTm9kZS5cbiAqIEB0ZW1wbGF0ZSBbUj1hbnldXG4gKiBAcGFyYW0ge2FueX0gcHJvbWlzZXlcbiAqIEBwYXJhbSB7KGVycjogYW55LCB2YWx1ZT86IFIpID0+IHZvaWR9IGNiXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSPn1cbiAqL1xuZnVuY3Rpb24gbm9kZWlmeSAocHJvbWlzZXksIGNiKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tY2FsbGJhY2tzXG4gIHJldHVybiBCLnJlc29sdmUocHJvbWlzZXkpLm5vZGVpZnkoY2IpO1xufVxuXG4vKipcbiAqIE5vZGUtaWZ5IGFuIGVudGlyZSBvYmplY3Qgb2YgYFByb21pc2VgLXJldHVybmluZyBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywoLi4uYXJnczogYW55W10pID0+IGFueT59IHByb21pc2V5TWFwXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywoLi4uYXJnczogYW55W10pPT52b2lkPn1cbiAqL1xuZnVuY3Rpb24gbm9kZWlmeUFsbCAocHJvbWlzZXlNYXApIHtcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCguLi5hcmdzOiBhbnlbXSk9PnZvaWQ+fSAqL1xuICBsZXQgY2JNYXAgPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgZm5dIG9mIF8udG9QYWlycyhwcm9taXNleU1hcCkpIHtcbiAgICBjYk1hcFtuYW1lXSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICBjb25zdCBfY2IgPSBhcmdzLnNsaWNlKC0xKVswXTtcbiAgICAgIGFyZ3MgPSBhcmdzLnNsaWNlKDAsIC0xKTtcbiAgICAgIG5vZGVpZnkoZm4oLi4uYXJncyksIF9jYik7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gY2JNYXA7XG59XG5cbi8qKlxuICogQHBhcmFtIHsoLi4uYXJnczogYW55W10pID0+IGFueXxQcm9taXNlPGFueT59IGZuXG4gKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3NcbiAqL1xuZnVuY3Rpb24gYXN5bmNpZnkgKGZuLCAuLi5hcmdzKSB7XG4gIEIucmVzb2x2ZShmbiguLi5hcmdzKSkuZG9uZSgpO1xufVxuXG4vKipcbiAqIFNpbWlsYXIgdG8gYEFycmF5LnByb3RvdHlwZS5tYXBgOyBydW5zIGluIHNlcmlhbFxuICogQHBhcmFtIHthbnlbXX0gY29sbFxuICogQHBhcmFtIHsodmFsdWU6IGFueSkgPT4gYW55fFByb21pc2U8YW55Pn0gbWFwcGVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxhbnlbXT59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFzeW5jbWFwIChjb2xsLCBtYXBwZXIsIHJ1bkluUGFyYWxsZWwgPSB0cnVlKSB7XG4gIGlmIChydW5JblBhcmFsbGVsKSB7XG4gICAgcmV0dXJuIHBhcmFsbGVsKGNvbGwubWFwKG1hcHBlcikpO1xuICB9XG5cbiAgbGV0IG5ld0NvbGwgPSBbXTtcbiAgZm9yIChsZXQgaXRlbSBvZiBjb2xsKSB7XG4gICAgbmV3Q29sbC5wdXNoKGF3YWl0IG1hcHBlcihpdGVtKSk7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbGw7XG59XG5cbi8qKlxuICogU2ltaWxhciB0byBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmBcbiAqIEBwYXJhbSB7YW55W119IGNvbGxcbiAqIEBwYXJhbSB7KHZhbHVlOiBhbnkpID0+IGFueXxQcm9taXNlPGFueT59IGZpbHRlclxuICogQHBhcmFtIHtib29sZWFufSBydW5JblBhcmFsbGVsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxhbnlbXT59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFzeW5jZmlsdGVyIChjb2xsLCBmaWx0ZXIsIHJ1bkluUGFyYWxsZWwgPSB0cnVlKSB7XG4gIGxldCBuZXdDb2xsID0gW107XG4gIGlmIChydW5JblBhcmFsbGVsKSB7XG4gICAgbGV0IGJvb2xzID0gYXdhaXQgcGFyYWxsZWwoY29sbC5tYXAoZmlsdGVyKSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYm9vbHNbaV0pIHtcbiAgICAgICAgbmV3Q29sbC5wdXNoKGNvbGxbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNvbGwpIHtcbiAgICAgIGlmIChhd2FpdCBmaWx0ZXIoaXRlbSkpIHtcbiAgICAgICAgbmV3Q29sbC5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3Q29sbDtcbn1cblxuLyoqXG4gKiBUYWtlcyBhIGNvbmRpdGlvbiAoYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBib29sZWFuIG9yIGJvb2xlYW4gcHJvbWlzZSksIGFuZFxuICogd2FpdHMgdW50aWwgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLlxuICpcbiAqIFRocm93cyBhIGAvQ29uZGl0aW9uIHVubWV0L2AgZXJyb3IgaWYgdGhlIGNvbmRpdGlvbiBoYXMgbm90IGJlZW4gc2F0aXNmaWVkXG4gKiB3aXRoaW4gdGhlIGFsbG9jYXRlZCB0aW1lLCB1bmxlc3MgYW4gZXJyb3IgaXMgcHJvdmlkZWQgaW4gdGhlIG9wdGlvbnMsIGFzIHRoZVxuICogYGVycm9yYCBwcm9wZXJ0eSwgd2hpY2ggaXMgZWl0aGVyIHRocm93biBpdHNlbGYsIG9yIHVzZWQgYXMgdGhlIG1lc3NhZ2UuXG4gKlxuICogVGhlIGNvbmRpdGlvbiByZXN1bHQgaXMgcmV0dXJuZWQgaWYgaXQgaXMgbm90IGZhbHN5LiBJZiB0aGUgY29uZGl0aW9uIHRocm93cyBhblxuICogZXJyb3IgdGhlbiB0aGlzIGV4Y2VwdGlvbiB3aWxsIGJlIGltbWVkaWF0ZWx5IHBhc3NlZCB0aHJvdWdoLlxuICpcbiAqIFRoZSBkZWZhdWx0IG9wdGlvbnMgYXJlOiBgeyB3YWl0TXM6IDUwMDAsIGludGVydmFsTXM6IDUwMCB9YFxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPnxUfSBjb25kRm5cbiAqIEBwYXJhbSB7V2FpdEZvckNvbmRpdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1Byb21pc2U8VD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JDb25kaXRpb24gKGNvbmRGbiwgb3B0aW9ucyA9IHt9KSB7XG4gIC8qKiBAdHlwZSB7V2FpdEZvckNvbmRpdGlvbk9wdGlvbnMgJiB7d2FpdE1zOiBudW1iZXIsIGludGVydmFsTXM6IG51bWJlcn19ICovXG4gIGNvbnN0IG9wdHMgPSBfLmRlZmF1bHRzKG9wdGlvbnMsIHtcbiAgICB3YWl0TXM6IDUwMDAsXG4gICAgaW50ZXJ2YWxNczogNTAwLFxuICB9KTtcbiAgY29uc3QgZGVidWcgPSBvcHRzLmxvZ2dlciA/IG9wdHMubG9nZ2VyLmRlYnVnLmJpbmQob3B0cy5sb2dnZXIpIDogXy5ub29wO1xuICBjb25zdCBlcnJvciA9IG9wdHMuZXJyb3I7XG4gIGNvbnN0IGJlZ3VuQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCBlbmRBdCA9IGJlZ3VuQXQgKyBvcHRzLndhaXRNcztcbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAqL1xuICBjb25zdCBzcGluID0gYXN5bmMgZnVuY3Rpb24gc3BpbiAoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29uZEZuKCk7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB3YWl0ZWQgPSBub3cgLSBiZWd1bkF0O1xuICAgIGNvbnN0IHJlbWFpbmluZ1RpbWUgPSBlbmRBdCAtIG5vdztcbiAgICBpZiAobm93IDwgZW5kQXQpIHtcbiAgICAgIGRlYnVnKGBXYWl0ZWQgZm9yICR7d2FpdGVkfSBtcyBzbyBmYXJgKTtcbiAgICAgIGF3YWl0IEIuZGVsYXkoTWF0aC5taW4ob3B0cy5pbnRlcnZhbE1zLCByZW1haW5pbmdUaW1lKSk7XG4gICAgICByZXR1cm4gYXdhaXQgc3BpbigpO1xuICAgIH1cbiAgICAvLyBpZiB0aGVyZSBpcyBhbiBlcnJvciBvcHRpb24sIGl0IGlzIGVpdGhlciBhIHN0cmluZyBtZXNzYWdlIG9yIGFuIGVycm9yIGl0c2VsZlxuICAgIHRocm93IGVycm9yXG4gICAgICA/IChfLmlzU3RyaW5nKGVycm9yKSA/IG5ldyBFcnJvcihlcnJvcikgOiBlcnJvcilcbiAgICAgIDogbmV3IEVycm9yKGBDb25kaXRpb24gdW5tZXQgYWZ0ZXIgJHt3YWl0ZWR9IG1zLiBUaW1pbmcgb3V0LmApO1xuICB9O1xuICByZXR1cm4gYXdhaXQgc3BpbigpO1xufVxuXG5leHBvcnQge1xuICBzbGVlcCwgcmV0cnksIG5vZGVpZnksIG5vZGVpZnlBbGwsIHJldHJ5SW50ZXJ2YWwsIGFzeW5jaWZ5LCBwYXJhbGxlbCxcbiAgYXN5bmNtYXAsIGFzeW5jZmlsdGVyLCB3YWl0Rm9yQ29uZGl0aW9uLCBsb25nU2xlZXAsXG59O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB3YWl0Rm9yQ29uZGl0aW9ufVxuICogQHR5cGVkZWYgV2FpdEZvckNvbmRpdGlvbk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbd2FpdE1zXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtpbnRlcnZhbE1zXVxuICogQHByb3BlcnR5IHt7ZGVidWc6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZH19IFtsb2dnZXJdXG4gKiBAcHJvcGVydHkge3N0cmluZ3xFcnJvcn0gW2Vycm9yXVxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGxvbmdTbGVlcH1cbiAqIEB0eXBlZGVmIExvbmdTbGVlcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGhyZXNob2xkTXNdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2ludGVydmFsTXNdXG4gKiBAcHJvcGVydHkge1Byb2dyZXNzQ2FsbGJhY2s/fSBbcHJvZ3Jlc3NDYl1cbiAqL1xuXG4vKipcbiAqIFBhcmFtZXRlciBwcm92aWRlZCB0byBhIHtAbGluayBQcm9ncmVzc0NhbGxiYWNrfVxuICogQHR5cGVkZWYgUHJvZ3Jlc3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlbGFwc2VkTXNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lTGVmdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHByb2dyZXNzXG4gKi9cblxuLyoqXG4gKiBQcm9ncmVzcyBjYWxsYmFjayBmb3Ige0BsaW5rIGxvbmdTbGVlcH1cbiAqIEBjYWxsYmFjayBQcm9ncmVzc0NhbGxiYWNrXG4gKiBAcGFyYW0ge1Byb2dyZXNzfSBwcm9ncmVzc1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7QUFDQTs7QUFFQSxNQUFNQSxvQkFBb0IsR0FBRyxJQUFJOztBQU9qQyxlQUFlQyxLQUFLLENBQUVDLEVBQUUsRUFBRTtFQUN4QixPQUFPLE1BQU1DLGlCQUFDLENBQUNDLEtBQUssQ0FBQ0YsRUFBRSxDQUFDO0FBQzFCOztBQWVBLGVBQWVHLFNBQVMsQ0FBRUgsRUFBRSxFQUFFO0VBQzVCSSxXQUFXLEdBQUdOLG9CQUFvQjtFQUNsQ08sVUFBVSxHQUFHLElBQUk7RUFDakJDLFVBQVUsR0FBRztBQUNmLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtFQUNOLElBQUlOLEVBQUUsR0FBR0ksV0FBVyxFQUFFO0lBQ3BCLE9BQU8sTUFBTUwsS0FBSyxDQUFDQyxFQUFFLENBQUM7RUFDeEI7RUFDQSxNQUFNTyxLQUFLLEdBQUdDLElBQUksQ0FBQ0MsR0FBRyxFQUFFLEdBQUdULEVBQUU7RUFDN0IsSUFBSVUsUUFBUTtFQUNaLElBQUlDLFNBQVMsR0FBRyxDQUFDO0VBQ2pCLEdBQUc7SUFDRCxNQUFNQyxHQUFHLEdBQUdKLElBQUksQ0FBQ0MsR0FBRyxFQUFFO0lBQ3RCLE1BQU1WLEtBQUssQ0FBQ00sVUFBVSxDQUFD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