Problem: You are given an integer N. Determine if there exists a tree with 2N vertices numbered 1 to 2N satisfying the following condition, and show one such tree if the answer is yes.

* Assume that, for each integer i between 1 and N (inclusive), Vertex i and N+i have the weight i. Then, for each integer i between 1 and N, the bitwise XOR of the weights of the vertices on the path between Vertex i and N+i (including themselves) is i.

Constraints

* N is an integer.
* 1 \leq N \leq 10^{5}

Input

Input is given from Standard Input in the following format:


N


Output

If there exists a tree satisfying the condition in the statement, print `Yes`; otherwise, print `No`. Then, if such a tree exists, print the 2N-1 edges of such a tree in the subsequent 2N-1 lines, in the following format:


a_{1} b_{1}
\vdots
a_{2N-1} b_{2N-1}


Here each pair (a_i, b_i) means that there is an edge connecting Vertex a_i and b_i. The edges may be printed in any order.

Examples

Input

3


Output

Yes
1 2
2 3
3 4
4 5
5 6


Input

1


Output

No

Solution (in JAVA):

Solution:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String[] args) throws IOException {
		MyScanner sc = new MyScanner();
		PrintWriter out = new PrintWriter(System.out);
		int N = sc.nextInt();
		int pot = 1;
		while (2 * pot - 1 <= N) pot = 2 * pot;
		if (pot != N && N != 1) {
			out.println("Yes");
			for (int i = 1; i + 1 <= pot - 1; i++) {
				out.println(i + " " + (i + 1));
			}
			out.println((pot - 1) + " " + (N + 1));
			for (int i = 1; i + 1 <= pot - 1; i++) {
				out.println((N + i) + " " + (N + i + 1));
			}
			int xor = 0;
			for (int i = pot; i <= N; i++) {
				xor ^= i;
			}
			int from = pot;
			if ((xor & pot) != 0) {
				xor ^= pot;
				from++;
			}
			int first = xor, last = xor;
			if (xor == 0) {
				first = 1;
				last = pot - 1;
			}
			for (int i = from; i + 1 <= N; i++) {
				out.println(i + " " + (i + 1));
			}
			if (pot - 1 < N) {
				out.println(N + " " + first);
				out.println(last + " " + (from + N));
			}
			for (int i = from; i + 1 <= N; i++) {
				out.println((N + i) + " " + (N + i + 1));
			}
			if (from != pot) {
				int nxor = pot ^ N ^ first;
				out.println(pot + " " + N);
				int curPos = first;
				while (nxor != 0) {
					if (curPos > N + pot - 1) throw new RuntimeException();
					if (curPos == pot -1) curPos = 1 + N;
					else curPos++;
					int toXor = curPos;
					if (toXor > N) toXor -= N;
					nxor ^= toXor;
				}
				out.println(curPos + " " + (pot + N));
			}
		} else {
			out.println("No");
		}
		
		out.flush();
	}
	
	static class MyScanner {
		private BufferedReader br;
		private StringTokenizer tokenizer;
		
		public MyScanner() {
			br = new BufferedReader(new InputStreamReader(System.in));
		}
		
		public String next() {
			while (tokenizer == null || !tokenizer.hasMoreTokens()) {
				try {
					tokenizer = new StringTokenizer(br.readLine());
				} catch (IOException e) {
					throw new RuntimeException(e);
				}
			}
			return tokenizer.nextToken();
		}
		
		public int nextInt() {
			return Integer.parseInt(next());
		}
		
		public long nextLong() {
			return Long.parseLong(next());
		}
	}
}