docs: public byte[] join(Map<Integer, byte[]> parts) {
      checkArgument(parts.size() > 0, "No parts provided");
      final int[] lengths = parts.values().stream().mapToInt(v -> v.length).distinct().toArray();
      checkArgument(lengths.length == 1, "Varying lengths of part values");
      final byte[] secret = new byte[lengths[0]];
      for (int i = 0; i < secret.length; i++) {
        final byte[][] points = new byte[parts.size()][2];
        int j = 0;
        for (Map.Entry<Integer, byte[]> part : parts.entrySet()) {
          points[j][0] = part.getKey().byteValue();
          points[j][1] = part.getValue()[i];
          j++;
        }
        secret[i] = GF256.interpolate(points);
      }
      return secret;
    }