code: @CanIgnoreReturnValue
    public static long parseUnsignedLong(String string, int radix) {
      checkNotNull(string);
      if (string.length() == 0) {
        throw new NumberFormatException("empty string");
      }
      if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) {
        throw new NumberFormatException("illegal radix: " + radix);
      }
  
      int maxSafePos = maxSafeDigits[radix] - 1;
      long value = 0;
      for (int pos = 0; pos < string.length(); pos++) {
        int digit = Character.digit(string.charAt(pos), radix);
        if (digit == -1) {
          throw new NumberFormatException(string);
        }
        if (pos > maxSafePos && overflowInParse(value, digit, radix)) {
          throw new NumberFormatException("Too large for unsigned long: " + string);
        }
        value = (value * radix) + digit;
      }
  
      return value;
    }
docs: Returns the unsigned {@code long} value represented by a string with the given radix.
  
  @param s the string containing the unsigned {@code long} representation to be parsed.
  @param radix the radix to use while parsing {@code string}
  @throws NumberFormatException if the string does not contain a valid unsigned {@code long} with
  the given radix, or if {@code radix} is not between {@link Character#MIN_RADIX} and
  {@link Character#MAX_RADIX}.
  @throws NullPointerException if {@code string} is null (in contrast to
  {@link Long#parseLong(String)})