```ts
/**
 * Decodes a list of byte values into a list of unsigned base-128 varints.
 * @param data - An array of integers representing byte values.
 * @returns An array of decoded numbers.
 */
export function decodeVarints(data: number[]): number[] {
  if (!Array.isArray(data)) {
    throw new Error("Input must be an array.");
  }

  const result: number[] = [];
  let currentNumber = 0;
  let shift = 0;

  for (let i = 0; i < data.length; i++) {
    const byte = data[i];

    if (!Number.isInteger(byte) || byte < 0 || byte > 255) {
      throw new Error("All elements must be integers between 0 and 255.");
    }

    currentNumber |= (byte & 0x7F) << shift;
    shift += 7;

    if ((byte & 0x80) === 0) {
      if (shift !== 0 && byte === 0) {
        throw new Error("Overlong encoding detected.");
      }
      result.push(currentNumber);
      currentNumber = 0;
      shift = 0;
    }
  }

  if (shift !== 0) {
    throw new Error("Varint sequence ends unexpectedly.");
  }

  return result;
}
```