function parse(input) {
const numBags = str => {
const matches = str.match(/(\d+) (.+) /);
return matches ? [matches[2], Number(matches[1])] : null;
};
return Object.fromEntries(
input
.split('\n')
.map(str => str.match(/(.+) bag. contain (no.+|\d+ .+)[.]/).slice(1))
.map(strs => [strs[0], strs[1].split(', ').map(numBags)])
);
}