Problem: You're given an integer n. For every integer i from 2 to n, assign a positive integer a_i such that the following conditions hold:

  * For any pair of integers (i,j), if i and j are coprime, a_i ≠ a_j. 
  * The maximal value of all a_i should be minimized (that is, as small as possible). 



A pair of integers is called [coprime](https://en.wikipedia.org/wiki/Coprime_integers) if their [greatest common divisor](https://en.wikipedia.org/wiki/Greatest_common_divisor) is 1.

Input

The only line contains the integer n (2 ≤ n ≤ 10^5).

Output

Print n-1 integers, a_2, a_3, …, a_n (1 ≤ a_i ≤ n). 

If there are multiple solutions, print any of them.

Examples

Input


4


Output


1 2 1 

Input


3


Output


2 1

Note

In the first example, notice that 3 and 4 are coprime, so a_3 ≠ a_4. Also, notice that a=[1,2,3] satisfies the first condition, but it's not a correct answer because its maximal value is 3.

Solution (in JAVA):

Solution:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Objects;
import java.util.StringTokenizer;
import java.util.TreeSet;

public class C {
	static InputReader in = new InputReader(System.in);
	static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) {

		int n = in.nextInt();
		int[] ans = new int[n + 1];
		int cur = 1;
		for (int i = 2; i * i <= n; i++)
			if (ans[i] == 0) {
				ans[i] = cur++;
				for (int j = i; j <= n; j += i)
					if (ans[j] == 0)
						ans[j] = ans[i];
			}
		for (int i = 2; i <= n; i++) {
			if (ans[i] == 0)
				ans[i] = cur++;
			if (i > 2)
				sb.append(' ');
			sb.append(ans[i]);
		}

		System.out.println(sb);
	}

	static class Pair<E extends Comparable, F extends Comparable> implements Comparable {
		E first;
		F second;

		public Pair(E first, F second) {
			this.first = first;
			this.second = second;
		}

		public int compareTo(Object o) {
			Pair p = (Pair) o;
			if (first.compareTo(p.first) == 0)
				return second.compareTo(p.second);
			return first.compareTo(p.first);
		}

		public int hashCode() {
			return Objects.hash(first, second);
		}

		public boolean equals(Object o) {
			Pair p = (Pair) o;
			return first.compareTo(p.first) == 0 && second.compareTo(p.second) == 0;
		}

		public String toString() {
			return String.format("(%s,%s)", first.toString(), second.toString());
		}

	}

	static class InputReader {
		private BufferedReader reader;
		private StringTokenizer tokenizer;

		public InputReader(InputStream stream) {
			reader = new BufferedReader(new InputStreamReader(stream));
		}

		public String nextLine() {
			try {
				return reader.readLine();
			} catch (Exception e) {
				return tokenizer.nextToken();
			}
		}

		public String next() {
			while (tokenizer == null || !tokenizer.hasMoreTokens()) {
				try {
					tokenizer = new StringTokenizer(reader.readLine());
				} catch (Exception e) {
				}
			}
			return tokenizer.nextToken();
		}

		public int nextInt() {
			return Integer.parseInt(next());
		}

		public double nextDouble() {
			return Double.parseDouble(next());
		}

		public long nextLong() {
			return Long.parseLong(next());
		}

		public int[] nextIntArray(int n) {
			int[] array = new int[n];
			for (int i = 0; i < n; i++)
				array[i] = nextInt();
			return array;
		}

		public double[] nextDoubleArray(int n) {
			double[] array = new double[n];
			for (int i = 0; i < n; i++)
				array[i] = nextDouble();
			return array;
		}

		public long[] nextLongArray(int n) {
			long[] array = new long[n];
			for (int i = 0; i < n; i++)
				array[i] = nextLong();
			return array;
		}

	}

	static class OutputWriter {
		private PrintWriter writer;

		public OutputWriter(OutputStream outputStream) {
			writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream)));
		}

		public void print(Object o) {
			writer.print(o.toString());
		}

		public void println(Object o) {
			writer.print(o.toString());
			writer.print('\n');
		}

		public void flush() {
			writer.flush();
		}

	}
}