in app/scripts/modules/core/utils/later/later.js [658:699]
function getInstances(dir, count, startDate, endDate, isRange) {
let compare = compareFn(dir), loopCount = count, maxAttempts = 1e3, schedStarts = [], exceptStarts = [], next, end, results = [], isForward = dir === "next", lastResult, rStart = isForward ? 0 : 1, rEnd = isForward ? 1 : 0;
startDate = startDate ? new Date(startDate) : new Date();
if (!startDate || !startDate.getTime()) throw new Error("Invalid start date.");
setNextStarts(dir, schedules, schedStarts, startDate);
setRangeStarts(dir, exceptions, exceptStarts, startDate);
while (maxAttempts-- && loopCount && (next = findNext(schedStarts, compare))) {
if (endDate && compare(next, endDate)) {
break;
}
if (exceptionsLen) {
updateRangeStarts(dir, exceptions, exceptStarts, next);
if (end = calcRangeOverlap(dir, exceptStarts, next)) {
updateNextStarts(dir, schedules, schedStarts, end);
continue;
}
}
if (isRange) {
let maxEndDate = calcMaxEndDate(exceptStarts, compare);
end = calcEnd(dir, schedules, schedStarts, next, maxEndDate);
let r = isForward ? [ new Date(Math.max(startDate, next)), end ? new Date(endDate ? Math.min(end, endDate) : end) : undefined ] : [ end ? new Date(endDate ? Math.max(endDate, end.getTime() + later.SEC) : end.getTime() + later.SEC) : undefined, new Date(Math.min(startDate, next.getTime() + later.SEC)) ];
if (lastResult && r[rStart].getTime() === lastResult[rEnd].getTime()) {
lastResult[rEnd] = r[rEnd];
loopCount++;
} else {
lastResult = r;
results.push(lastResult);
}
if (!end) break;
updateNextStarts(dir, schedules, schedStarts, end);
} else {
results.push(isForward ? new Date(Math.max(startDate, next)) : getStart(schedules, schedStarts, next, endDate));
tickStarts(dir, schedules, schedStarts, next);
}
loopCount--;
}
for (let i = 0, len = results.length; i < len; i++) {
let result = results[i];
results[i] = Object.prototype.toString.call(result) === "[object Array]" ? [ cleanDate(result[0]), cleanDate(result[1]) ] : cleanDate(result);
}
return results.length === 0 ? later.NEVER : count === 1 ? results[0] : results;
}