class IdWithProgress {
        private final Progress progress;
        private final String id;

        IdWithProgress(String id, Progress progress) {
            this.id = id;
            this.progress = progress;
        }

        public String getId() {
            return id;
        }

        public Progress getProgress() {
            return progress;
        }
    }

    /**
     * @param sinceRevision start revision ID
     * @return immutable list of revision IDs denoting the intervals
     * @throws HistoryException if there is problem traversing the changesets in the repository
     */
    public synchronized List<String> getBoundaryChangesetIDs(String sinceRevision) throws HistoryException {<FILL_FUNCTION_BODY>

        reset();

        Level logLevel = Level.FINE;

        LOGGER.log(logLevel, "getting boundary changesets for {0}", repository);
        Statistics stat = new Statistics();

        try (Progress progress = new Progress(LOGGER, String.format("changesets visited of %s", this.repository),
                logLevel)) {
            repository.accept(sinceRevision, this::visit, progress);
        }

        // The changesets need to go from oldest to newest.
        Collections.reverse(result);

        stat.report(LOGGER, logLevel,
                String.format("Done getting boundary changesets for %s (%d entries)",
                        repository, result.size()));

        return List.copyOf(result);
    
<no_super_class>