UNPKG

sports-schedule-generator

Version:
216 lines (167 loc) 24 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.initGameday = initGameday; exports.generateGameday = generateGameday; exports.generateGamedays = generateGamedays; exports.generateSchedule = generateSchedule; var R = _interopRequireWildcard(require("ramda")); var _gameday = _interopRequireDefault(require("./gameday")); var _match3 = _interopRequireDefault(require("./match")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function initGameday(allTeams) { var gameday = new _gameday["default"](); var bucketCount = allTeams.length / 2 - 1; var rightJokerMatch = new _match3["default"](); rightJokerMatch.away = R.last(allTeams); gameday.rightJoker = rightJokerMatch; var teams = R.init(allTeams); for (var i = 0; i < bucketCount; i++) { var firstTeam = R.head(teams); var lastTeam = R.last(teams); var match = new _match3["default"](); match.home = firstTeam; match.away = lastTeam; gameday.buckets.push(match); teams = R.init(R.tail(teams)); } rightJokerMatch.home = teams[0]; // assign last remaining team return gameday; } function shiftToLeft(previousGameday) { var _R$last; var gameday = new _gameday["default"](); var leftJokerMatch = new _match3["default"](); leftJokerMatch.home = previousGameday.rightJoker && previousGameday.rightJoker.away; leftJokerMatch.away = previousGameday.buckets[0].home; gameday.leftJoker = leftJokerMatch; for (var i = 0; i < previousGameday.buckets.length - 1; i++) { var match = new _match3["default"](); match.home = previousGameday.buckets[i + 1].home; match.away = previousGameday.buckets[i].away; gameday.buckets.push(match); } var lastMatch = new _match3["default"](); lastMatch.home = previousGameday.rightJoker && previousGameday.rightJoker.home; lastMatch.away = (_R$last = R.last(previousGameday.buckets)) === null || _R$last === void 0 ? void 0 : _R$last.away; gameday.buckets.push(lastMatch); delete gameday.rightJoker; return gameday; } function shiftToRight(previousGameday) { var _R$last2; var gameday = new _gameday["default"](); var rightJokerMatch = new _match3["default"](); rightJokerMatch.home = (_R$last2 = R.last(previousGameday.buckets)) === null || _R$last2 === void 0 ? void 0 : _R$last2.away; rightJokerMatch.away = previousGameday.leftJoker && previousGameday.leftJoker.home; gameday.rightJoker = rightJokerMatch; for (var i = 1; i < previousGameday.buckets.length; i++) { var match = new _match3["default"](); match.away = previousGameday.buckets[i - 1].away; match.home = previousGameday.buckets[i].home; gameday.buckets.push(match); } var firstMatch = new _match3["default"](); firstMatch.home = previousGameday.buckets[0].home; firstMatch.away = previousGameday.leftJoker && previousGameday.leftJoker.away; gameday.buckets = R.prepend(firstMatch, gameday.buckets); delete gameday.leftJoker; return gameday; } function generateGameday(previousGameday) { if (!previousGameday.leftJoker) { return shiftToLeft(previousGameday); } return shiftToRight(previousGameday); } function generateGamedays(teams) { var schedule = []; var firstGameday = initGameday(teams); schedule.push(firstGameday); var previousGameday = firstGameday; var gamedayCount = teams.length % 2 == 0 ? teams.length - 1 : teams.length; for (var i = 1; i < gamedayCount; i++) { var gameday = generateGameday(previousGameday); schedule.push(gameday); previousGameday = gameday; } return schedule; } function createMatch(match) { var switchSides = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var createdMatch = R.clone(match); if (switchSides) { createdMatch.home = match.away; createdMatch.away = match.home; } return createdMatch; } function gamedayToMatchArray(gameday, switchSides) { var matches = []; if (gameday.leftJoker) { var match = createMatch(gameday.leftJoker, false); if (match.home && match.away) { matches.push(match); // jokers already swept by algorithm } } if (gameday.rightJoker) { var _match = createMatch(gameday.rightJoker, false); if (_match.home && _match.away) { matches.push(_match); // jokers already swept by algorithm } } var _iterator = _createForOfIteratorHelper(gameday.buckets), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var bucketMatch = _step.value; var _match2 = createMatch(bucketMatch, switchSides); if (_match2.home && _match2.away) { matches.push(_match2); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return matches; } function createRematchSchedule(schedule) { var rematchSchedule = []; var _iterator2 = _createForOfIteratorHelper(schedule), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var matches = _step2.value; var rematches = R.map(createMatch, matches); rematchSchedule.push(rematches); } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } return rematchSchedule; } function generateSchedule(teams) { var rematch = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var schedule = []; var gamedays = generateGamedays(teams); for (var i = 0; i < gamedays.length; i++) { var switchSides = i % 2 == 0; schedule.push(gamedayToMatchArray(gamedays[i], switchSides)); } if (rematch) { schedule = R.concat(schedule, createRematchSchedule(schedule)); } return schedule; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6WyJpbml0R2FtZWRheSIsImFsbFRlYW1zIiwiZ2FtZWRheSIsIkdhbWVkYXkiLCJidWNrZXRDb3VudCIsImxlbmd0aCIsInJpZ2h0Sm9rZXJNYXRjaCIsIk1hdGNoIiwiYXdheSIsIlIiLCJsYXN0IiwicmlnaHRKb2tlciIsInRlYW1zIiwiaW5pdCIsImkiLCJmaXJzdFRlYW0iLCJoZWFkIiwibGFzdFRlYW0iLCJtYXRjaCIsImhvbWUiLCJidWNrZXRzIiwicHVzaCIsInRhaWwiLCJzaGlmdFRvTGVmdCIsInByZXZpb3VzR2FtZWRheSIsImxlZnRKb2tlck1hdGNoIiwibGVmdEpva2VyIiwibGFzdE1hdGNoIiwic2hpZnRUb1JpZ2h0IiwiZmlyc3RNYXRjaCIsInByZXBlbmQiLCJnZW5lcmF0ZUdhbWVkYXkiLCJnZW5lcmF0ZUdhbWVkYXlzIiwic2NoZWR1bGUiLCJmaXJzdEdhbWVkYXkiLCJnYW1lZGF5Q291bnQiLCJjcmVhdGVNYXRjaCIsInN3aXRjaFNpZGVzIiwiY3JlYXRlZE1hdGNoIiwiY2xvbmUiLCJnYW1lZGF5VG9NYXRjaEFycmF5IiwibWF0Y2hlcyIsImJ1Y2tldE1hdGNoIiwiY3JlYXRlUmVtYXRjaFNjaGVkdWxlIiwicmVtYXRjaFNjaGVkdWxlIiwicmVtYXRjaGVzIiwibWFwIiwiZ2VuZXJhdGVTY2hlZHVsZSIsInJlbWF0Y2giLCJnYW1lZGF5cyIsImNvbmNhdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBRU8sU0FBU0EsV0FBVCxDQUF3QkMsUUFBeEIsRUFBbUQ7QUFDeEQsTUFBTUMsT0FBTyxHQUFHLElBQUlDLG1CQUFKLEVBQWhCO0FBQ0EsTUFBTUMsV0FBVyxHQUFHSCxRQUFRLENBQUNJLE1BQVQsR0FBa0IsQ0FBbEIsR0FBc0IsQ0FBMUM7QUFDQSxNQUFNQyxlQUFlLEdBQUcsSUFBSUMsa0JBQUosRUFBeEI7QUFDQUQsRUFB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QUFtQlUscUJBQXFCLENBQUNWLFFBQUQsQ0FBeEMsQ0FBWDtBQUNEOztBQUNELFNBQU9BLFFBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFIgZnJvbSBcInJhbWRhXCI7XG5pbXBvcnQgR2FtZWRheSBmcm9tIFwiLi9nYW1lZGF5XCI7XG5pbXBvcnQgTWF0Y2ggZnJvbSBcIi4vbWF0Y2hcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRHYW1lZGF5PFQ+KGFsbFRlYW1zOiBUW10pOiBHYW1lZGF5PFQ+IHtcbiAgY29uc3QgZ2FtZWRheSA9IG5ldyBHYW1lZGF5PFQ+KCk7XG4gIGNvbnN0IGJ1Y2tldENvdW50ID0gYWxsVGVhbXMubGVuZ3RoIC8gMiAtIDE7XG4gIGNvbnN0IHJpZ2h0Sm9rZXJNYXRjaCA9IG5ldyBNYXRjaDxUPigpO1xuICByaWdodEpva2VyTWF0Y2guYXdheSA9IFIubGFzdChhbGxUZWFtcyk7XG4gIGdhbWVkYXkucmlnaHRKb2tlciA9IHJpZ2h0Sm9rZXJNYXRjaDtcbiAgbGV0IHRlYW1zID0gUi5pbml0KGFsbFRlYW1zKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWNrZXRDb3VudDsgaSsrKSB7XG4gICAgY29uc3QgZmlyc3RUZWFtID0gUi5oZWFkKHRlYW1zKTtcbiAgICBjb25zdCBsYXN0VGVhbSA9IFIubGFzdCh0ZWFtcyk7XG4gICAgY29uc3QgbWF0Y2ggPSBuZXcgTWF0Y2g8VD4oKTtcbiAgICBtYXRjaC5ob21lID0gZmlyc3RUZWFtO1xuICAgIG1hdGNoLmF3YXkgPSBsYXN0VGVhbTtcbiAgICBnYW1lZGF5LmJ1Y2tldHMucHVzaChtYXRjaCk7XG4gICAgdGVhbXMgPSBSLmluaXQoUi50YWlsKHRlYW1zKSk7XG4gIH1cbiAgcmlnaHRKb2tlck1hdGNoLmhvbWUgPSB0ZWFtc1swXTsgLy8gYXNzaWduIGxhc3QgcmVtYWluaW5nIHRlYW1cbiAgcmV0dXJuIGdhbWVkYXk7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0VG9MZWZ0PFQ+KHByZXZpb3VzR2FtZWRheTogR2FtZWRheTxUPik6IEdhbWVkYXk8VD4ge1xuICBjb25zdCBnYW1lZGF5ID0gbmV3IEdhbWVkYXk8VD4oKTtcbiAgY29uc3QgbGVmdEpva2VyTWF0Y2ggPSBuZXcgTWF0Y2g8VD4oKTtcbiAgbGVmdEpva2VyTWF0Y2guaG9tZSA9IHByZXZpb3VzR2FtZWRheS5yaWdodEpva2VyICYmIHByZXZpb3VzR2FtZWRheS5yaWdodEpva2VyLmF3YXk7XG4gIGxlZnRKb2tlck1hdGNoLmF3YXkgPSBwcmV2aW91c0dhbWVkYXkuYnVja2V0c1swXS5ob21lO1xuICBnYW1lZGF5LmxlZnRKb2tlciA9IGxlZnRKb2tlck1hdGNoO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZpb3VzR2FtZWRheS5idWNrZXRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IG1hdGNoID0gbmV3IE1hdGNoPFQ+KCk7XG4gICAgbWF0Y2guaG9tZSA9IHByZXZpb3VzR2FtZWRheS5idWNrZXRzW2kgKyAxXS5ob21lO1xuICAgIG1hdGNoLmF3YXkgPSBwcmV2aW91c0dhbWVkYXkuYnVja2V0c1tpXS5hd2F5O1xuICAgIGdhbWVkYXkuYnVja2V0cy5wdXNoKG1hdGNoKTtcbiAgfVxuICBjb25zdCBsYXN0TWF0Y2ggPSBuZXcgTWF0Y2g8VD4oKTtcbiAgbGFzdE1hdGNoLmhvbWUgPSBwcmV2aW91c0dhbWVkYXkucmlnaHRKb2tlciAmJiBwcmV2aW91c0dhbWVkYXkucmlnaHRKb2tlci5ob21lO1xuICBsYXN0TWF0Y2guYXdheSA9IFIubGFzdChwcmV2aW91c0dhbWVkYXkuYnVja2V0cyk/LmF3YXk7XG4gIGdhbWVkYXkuYnVja2V0cy5wdXNoKGxhc3RNYXRjaCk7XG4gIGRlbGV0ZSBnYW1lZGF5LnJpZ2h0Sm9rZXI7XG4gIHJldHVybiBnYW1lZGF5O1xufVxuXG5mdW5jdGlvbiBzaGlmdFRvUmlnaHQ8VD4ocHJldmlvdXNHYW1lZGF5OiBHYW1lZGF5PFQ+KTogR2FtZWRheTxUPiB7XG4gIGNvbnN0IGdhbWVkYXkgPSBuZXcgR2FtZWRheTxUPigpO1xuICBjb25zdCByaWdodEpva2VyTWF0Y2ggPSBuZXcgTWF0Y2g8VD4oKTtcbiAgcmlnaHRKb2tlck1hdGNoLmhvbWUgPSBSLmxhc3QocHJldmlvdXNHYW1lZGF5LmJ1Y2tldHMpPy5hd2F5O1xuICByaWdodEpva2VyTWF0Y2guYXdheSA9IHByZXZpb3VzR2FtZWRheS5sZWZ0Sm9rZXIgJiYgcHJldmlvdXNHYW1lZGF5LmxlZnRKb2tlci5ob21lO1xuICBnYW1lZGF5LnJpZ2h0Sm9rZXIgPSByaWdodEpva2VyTWF0Y2g7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgcHJldmlvdXNHYW1lZGF5LmJ1Y2tldHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBtYXRjaCA9IG5ldyBNYXRjaDxUPigpO1xuICAgIG1hdGNoLmF3YXkgPSBwcmV2aW91c0dhbWVkYXkuYnVja2V0c1tpIC0gMV0uYXdheTtcbiAgICBtYXRjaC5ob21lID0gcHJldmlvdXNHYW1lZGF5LmJ1Y2tldHNbaV0uaG9tZTtcbiAgICBnYW1lZGF5LmJ1Y2tldHMucHVzaChtYXRjaCk7XG4gIH1cbiAgY29uc3QgZmlyc3RNYXRjaCA9IG5ldyBNYXRjaDxUPigpO1xuICBmaXJzdE1hdGNoLmhvbWUgPSBwcmV2aW91c0dhbWVkYXkuYnVja2V0c1swXS5ob21lO1xuICBmaXJzdE1hdGNoLmF3YXkgPSBwcmV2aW91c0dhbWVkYXkubGVmdEpva2VyICYmIHByZXZpb3VzR2FtZWRheS5sZWZ0Sm9rZXIuYXdheTtcbiAgZ2FtZWRheS5idWNrZXRzID0gUi5wcmVwZW5kKGZpcnN0TWF0Y2gsIGdhbWVkYXkuYnVja2V0cyk7XG4gIGRlbGV0ZSBnYW1lZGF5LmxlZnRKb2tlcjtcbiAgcmV0dXJuIGdhbWVkYXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUdhbWVkYXk8VD4ocHJldmlvdXNHYW1lZGF5OiBHYW1lZGF5PFQ+KTogR2FtZWRheTxUPiB7XG4gIGlmICghcHJldmlvdXNHYW1lZGF5LmxlZnRKb2tlcikge1xuICAgIHJldHVybiBzaGlmdFRvTGVmdChwcmV2aW91c0dhbWVkYXkpO1xuICB9XG4gIHJldHVybiBzaGlmdFRvUmlnaHQocHJldmlvdXNHYW1lZGF5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlR2FtZWRheXM8VD4odGVhbXM6IFRbXSk6IEdhbWVkYXk8VD5bXSB7XG4gIGNvbnN0IHNjaGVkdWxlOiBHYW1lZGF5PFQ+W10gPSBbXTtcbiAgY29uc3QgZmlyc3RHYW1lZGF5ID0gaW5pdEdhbWVkYXkodGVhbXMpO1xuICBzY2hlZHVsZS5wdXNoKGZpcnN0R2FtZWRheSk7XG4gIGxldCBwcmV2aW91c0dhbWVkYXkgPSBmaXJzdEdhbWVkYXk7XG4gIGNvbnN0IGdhbWVkYXlDb3VudCA9IHRlYW1zLmxlbmd0aCAlIDIgPT0gMCA/IHRlYW1zLmxlbmd0aCAtIDEgOiB0ZWFtcy5sZW5ndGg7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgZ2FtZWRheUNvdW50OyBpKyspIHtcbiAgICBjb25zdCBnYW1lZGF5ID0gZ2VuZXJhdGVHYW1lZGF5KHByZXZpb3VzR2FtZWRheSk7XG4gICAgc2NoZWR1bGUucHVzaChnYW1lZGF5KTtcbiAgICBwcmV2aW91c0dhbWVkYXkgPSBnYW1lZGF5O1xuICB9XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWF0Y2g8VD4obWF0Y2g6IE1hdGNoPFQ+LCBzd2l0Y2hTaWRlcyA9IHRydWUpOiBNYXRjaDxUPiB7XG4gIGNvbnN0IGNyZWF0ZWRNYXRjaCA9IFIuY2xvbmUobWF0Y2gpO1xuICBpZiAoc3dpdGNoU2lkZXMpIHtcbiAgICBjcmVhdGVkTWF0Y2guaG9tZSA9IG1hdGNoLmF3YXk7XG4gICAgY3JlYXRlZE1hdGNoLmF3YXkgPSBtYXRjaC5ob21lO1xuICB9XG4gIHJldHVybiBjcmVhdGVkTWF0Y2g7XG59XG5cbmZ1bmN0aW9uIGdhbWVkYXlUb01hdGNoQXJyYXk8VD4oZ2FtZWRheTogR2FtZWRheTxUPiwgc3dpdGNoU2lkZXM6IGJvb2xlYW4pOiBNYXRjaDxUPltdIHtcbiAgY29uc3QgbWF0Y2hlczogTWF0Y2g8VD5bXSA9IFtdO1xuXG4gIGlmIChnYW1lZGF5LmxlZnRKb2tlcikge1xuICAgIGNvbnN0IG1hdGNoID0gY3JlYXRlTWF0Y2goZ2FtZWRheS5sZWZ0Sm9rZXIsIGZhbHNlKTtcbiAgICBpZiAobWF0Y2guaG9tZSAmJiBtYXRjaC5hd2F5KSB7XG4gICAgICBtYXRjaGVzLnB1c2gobWF0Y2gpOyAvLyBqb2tlcnMgYWxyZWFkeSBzd2VwdCBieSBhbGdvcml0aG1cbiAgICB9XG4gIH1cbiAgaWYgKGdhbWVkYXkucmlnaHRKb2tlcikge1xuICAgIGNvbnN0IG1hdGNoID0gY3JlYXRlTWF0Y2goZ2FtZWRheS5yaWdodEpva2VyLCBmYWxzZSk7XG4gICAgaWYgKG1hdGNoLmhvbWUgJiYgbWF0Y2guYXdheSkge1xuICAgICAgbWF0Y2hlcy5wdXNoKG1hdGNoKTsgLy8gam9rZXJzIGFscmVhZHkgc3dlcHQgYnkgYWxnb3JpdGhtXG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgYnVja2V0TWF0Y2ggb2YgZ2FtZWRheS5idWNrZXRzKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBjcmVhdGVNYXRjaChidWNrZXRNYXRjaCwgc3dpdGNoU2lkZXMpO1xuICAgIGlmIChtYXRjaC5ob21lICYmIG1hdGNoLmF3YXkpIHtcbiAgICAgIG1hdGNoZXMucHVzaChtYXRjaCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXRjaGVzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSZW1hdGNoU2NoZWR1bGU8VD4oc2NoZWR1bGU6IE1hdGNoPFQ+W11bXSk6IE1hdGNoPFQ+W11bXSB7XG4gIGNvbnN0IHJlbWF0Y2hTY2hlZHVsZTogTWF0Y2g8VD5bXVtdID0gW107XG4gIGZvciAoY29uc3QgbWF0Y2hlcyBvZiBzY2hlZHVsZSkge1xuICAgIGNvbnN0IHJlbWF0Y2hlczogTWF0Y2g8VD5bXSA9IFIubWFwKGNyZWF0ZU1hdGNoLCBtYXRjaGVzKTtcbiAgICByZW1hdGNoU2NoZWR1bGUucHVzaChyZW1hdGNoZXMpO1xuICB9XG4gIHJldHVybiByZW1hdGNoU2NoZWR1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjaGVkdWxlPFQ+KHRlYW1zOiBUW10sIHJlbWF0Y2ggPSBmYWxzZSk6IE1hdGNoPFQ+W11bXSB7XG4gIGxldCBzY2hlZHVsZTogTWF0Y2g8VD5bXVtdID0gW107XG4gIGNvbnN0IGdhbWVkYXlzID0gZ2VuZXJhdGVHYW1lZGF5cyh0ZWFtcyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZ2FtZWRheXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzd2l0Y2hTaWRlcyA9IGkgJSAyID09IDA7XG4gICAgc2NoZWR1bGUucHVzaChnYW1lZGF5VG9NYXRjaEFycmF5KGdhbWVkYXlzW2ldLCBzd2l0Y2hTaWRlcykpO1xuICB9XG4gIGlmIChyZW1hdGNoKSB7XG4gICAgc2NoZWR1bGUgPSBSLmNvbmNhdChzY2hlZHVsZSwgY3JlYXRlUmVtYXRjaFNjaGVkdWxlKHNjaGVkdWxlKSk7XG4gIH1cbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuIl19