import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.WeekFields;
import java.util.Locale;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
 
public class Main {
	public static void main
(String[] args
) { 		// Let's test
		System.
out.
println("-+-+-+-+-+-+-+-+-+-+-+-+-+-"); 	}
 
		LocalDate localDate = LocalDate.now();
		YearMonth ym = YearMonth.of(localDate.getYear(), localDate.getMonthValue());
		StringBuilder sb = new StringBuilder();
 
		// First day of week
		DayOfWeek firstDayOfWeek = WeekFields.of(locale).getFirstDayOfWeek();
 
		LocalDate date = localDate.with(TemporalAdjusters.dayOfWeekInMonth(0, firstDayOfWeek));
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE", locale);
		sb.append(
					IntStream.rangeClosed(0, 6)
					.mapToObj(i -> dtf.format(date.plusDays(i)))
					.collect(Collectors.joining(" "))
		)
		.
append(System.
lineSeparator()); 
		int counter = 1;
 
		// Print as many space as the difference between the day of week of 1st date of
		// the month and the first day of the week in that Locale
		int dayValue = localDate.withDayOfMonth(1).getDayOfWeek().getValue() - firstDayOfWeek.getValue();
		dayValue = dayValue < 0 ? 7 + dayValue : dayValue;
		for (int i = 0; i < dayValue; i++, counter++) {
			sb.
append(String.
format("%-4s", 
""));		}
 
		for (int i = 1; i <= ym.getMonth().length(ym.isLeapYear()); i++, counter++) {
			sb.
append(String.
format("%-4d", i
)); 
			// Break the line if the value of the counter is multiple of 7
			if (counter % 7 == 0) {
				sb.
append(System.
lineSeparator());			}
		}
 
		return sb.toString();
	}
}
				aW1wb3J0IGphdmEudGltZS5EYXlPZldlZWs7CmltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlOwppbXBvcnQgamF2YS50aW1lLlllYXJNb250aDsKaW1wb3J0IGphdmEudGltZS5mb3JtYXQuRGF0ZVRpbWVGb3JtYXR0ZXI7CmltcG9ydCBqYXZhLnRpbWUudGVtcG9yYWwuVGVtcG9yYWxBZGp1c3RlcnM7CmltcG9ydCBqYXZhLnRpbWUudGVtcG9yYWwuV2Vla0ZpZWxkczsKaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKCnB1YmxpYyBjbGFzcyBNYWluIHsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCQkvLyBMZXQncyB0ZXN0CgkJU3lzdGVtLm91dC5wcmludGxuKGdldE1vbnRoQ2FsZW5kYXIoTG9jYWxlLlVLKSk7CgkJU3lzdGVtLm91dC5wcmludGxuKCItKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0iKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0TW9udGhDYWxlbmRhcihMb2NhbGUuVVMpKTsKCX0KCglzdGF0aWMgU3RyaW5nIGdldE1vbnRoQ2FsZW5kYXIoTG9jYWxlIGxvY2FsZSkgewoJCUxvY2FsRGF0ZSBsb2NhbERhdGUgPSBMb2NhbERhdGUubm93KCk7CgkJWWVhck1vbnRoIHltID0gWWVhck1vbnRoLm9mKGxvY2FsRGF0ZS5nZXRZZWFyKCksIGxvY2FsRGF0ZS5nZXRNb250aFZhbHVlKCkpOwoJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwoKCQkvLyBGaXJzdCBkYXkgb2Ygd2VlawoJCURheU9mV2VlayBmaXJzdERheU9mV2VlayA9IFdlZWtGaWVsZHMub2YobG9jYWxlKS5nZXRGaXJzdERheU9mV2VlaygpOwoKCQlMb2NhbERhdGUgZGF0ZSA9IGxvY2FsRGF0ZS53aXRoKFRlbXBvcmFsQWRqdXN0ZXJzLmRheU9mV2Vla0luTW9udGgoMCwgZmlyc3REYXlPZldlZWspKTsKCQlEYXRlVGltZUZvcm1hdHRlciBkdGYgPSBEYXRlVGltZUZvcm1hdHRlci5vZlBhdHRlcm4oIkVFRSIsIGxvY2FsZSk7CgkJc2IuYXBwZW5kKAoJCQkJCUludFN0cmVhbS5yYW5nZUNsb3NlZCgwLCA2KQoJCQkJCS5tYXBUb09iaihpIC0+IGR0Zi5mb3JtYXQoZGF0ZS5wbHVzRGF5cyhpKSkpCgkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIgIikpCgkJKQoJCS5hcHBlbmQoU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSk7CgoJCWludCBjb3VudGVyID0gMTsKCgkJLy8gUHJpbnQgYXMgbWFueSBzcGFjZSBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBkYXkgb2Ygd2VlayBvZiAxc3QgZGF0ZSBvZgoJCS8vIHRoZSBtb250aCBhbmQgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayBpbiB0aGF0IExvY2FsZQoJCWludCBkYXlWYWx1ZSA9IGxvY2FsRGF0ZS53aXRoRGF5T2ZNb250aCgxKS5nZXREYXlPZldlZWsoKS5nZXRWYWx1ZSgpIC0gZmlyc3REYXlPZldlZWsuZ2V0VmFsdWUoKTsKCQlkYXlWYWx1ZSA9IGRheVZhbHVlIDwgMCA/IDcgKyBkYXlWYWx1ZSA6IGRheVZhbHVlOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF5VmFsdWU7IGkrKywgY291bnRlcisrKSB7CgkJCXNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlLTRzIiwgIiIpKTsKCQl9CgoJCWZvciAoaW50IGkgPSAxOyBpIDw9IHltLmdldE1vbnRoKCkubGVuZ3RoKHltLmlzTGVhcFllYXIoKSk7IGkrKywgY291bnRlcisrKSB7CgkJCXNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlLTRkIiwgaSkpOwoKCQkJLy8gQnJlYWsgdGhlIGxpbmUgaWYgdGhlIHZhbHVlIG9mIHRoZSBjb3VudGVyIGlzIG11bHRpcGxlIG9mIDcKCQkJaWYgKGNvdW50ZXIgJSA3ID09IDApIHsKCQkJCXNiLmFwcGVuZChTeXN0ZW0ubGluZVNlcGFyYXRvcigpKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Cgl9Cn0=