flatOrbits = function (map) {
let endMatch, startMatch;
return map.reduce((a, d) => {
endMatch = a.filter(v => v.slice(-1) == d[0]);
startMatch = a.filter(v => v[0] == d[1]);
return a.concat([
d,
...endMatch.map(v => v.concat(d[1])),
...startMatch.map(v => d.concat(v.slice(1))),
...endMatch.map(e => startMatch.map(s => e.concat(s)))
.reduce((a, pair) => a.concat(pair), [])
])}, []);
}