readUint64() {
    let low32 = 0,
      high32 = 0,
      shift = 0
    while (this.offset < this.buf.byteLength && shift <= 28) {
      const nextByte = this.buf[this.offset]
      low32 = (low32 | ((nextByte & 0x7f) << shift)) >>> 0 // right shift to interpret value as unsigned
      if (shift === 28) {
        high32 = (nextByte & 0x70) >>> 4
      }
      shift += 7
      this.offset++
      if ((nextByte & 0x80) === 0) return { high32, low32 }
    }

    shift = 3
    while (this.offset < this.buf.byteLength) {
      const nextByte = this.buf[this.offset]
      if (shift === 31 && (nextByte & 0xfe) !== 0) {
        // more than 10 bytes, or value > 2^64 - 1
        throw new RangeError("number out of range")
      }
      high32 = (high32 | ((nextByte & 0x7f) << shift)) >>> 0
      shift += 7
      this.offset++
      if ((nextByte & 0x80) === 0) return { high32, low32 }
    }
    throw new RangeError("buffer ended with incomplete number")
  }
Reads a LEB128-encoded unsigned integer from the current position in the
buffer. Throws an exception if the value doesn't fit in a 64-bit unsigned
int. Returns the number in two 32-bit halves, as an object of the form
`{high32, low32}`.