function parse(bin){
const {version, type } = parseHeader(bin)
let value = 0
let lengthType = 0
let length = 6
let subs = ""
let subpackets = []
if (type == 4){
let bits = []
let i = 0
do {
bits.push(bin.slice(i*5+6+1, i*5+6+5))
i++
} while (bin.slice((i-1)*5+6, (i-1)*5+6 + 1) != 0)
length += i*5
value = parseInt(bits.join(""), 2)
} else {
lengthType = parseInt(bin.slice(6, 7), 2)
length += 1
if (lengthType == 0){
const l = parseInt(bin.slice(7, 7+15), 2)
length += 15
subs = bin.slice(length)
let total = 0
while(total < l){
let sub = parse(subs)
subpackets.push(sub)
total += sub.length
subs = subs.slice(sub.length)
}
length += total
} else {
const l = parseInt(bin.slice(7, 7+11), 2)
length += 11
subs = bin.slice(length)
for (let i = 0; i < l; i++){
let sub = parse(subs)
subpackets.push(sub)
length += sub.length
subs = subs.slice(sub.length)
}
}
if (type == 0) value = d3.sum(subpackets.map(x => x.value))
else if (type == 1) value = subpackets.reduce((p,c) => p * c.value, 1)
else if (type == 2) value = d3.min(subpackets.map(x => x.value))
else if (type == 3) value = d3.max(subpackets.map(x => x.value))
else if (type == 5) value = (subpackets[0].value > subpackets[1].value) ? 1 : 0
else if (type == 6) value = (subpackets[0].value < subpackets[1].value) ? 1 : 0
else if (type == 7) value = (subpackets[0].value == subpackets[1].value) ? 1 : 0
}
return { value, subs, length, lengthType, version, type, bin, subpackets }
}