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.util.*;
import java.math.*;
import java.io.*;
import java.lang.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        boolean b = false;
        if (Algorithm.isNibeki((n))){
            Algorithm.prYesNo(0);
        }else {
            Algorithm.prYesNo(1);
            System.out.println(1 +" " + 2);
            System.out.println(1 +" " + 3);
            System.out.println(3 +" " + (n+2));
            System.out.println((n+1) +" " + (n+2));
            System.out.println(2 +" " + (n+3));
            for (int i = 4; i <= n; i++) {
                if(i == n && i % 2 == 0){
                    b = true;
                    break;
                }
                    System.out.println(1 + " " + i);
            }
            for (int i = n+4; i <=2*n; i++) {
                if(n%2 == 0 && i == 2*n){
                    break;
                }
                if (Algorithm.isOdd(i-n)){
                    System.out.println(i + " " + (i-n-1));
                }else{
                    System.out.println(i + " " + (i-n+1));
                }
            }

            if(b){
                int nn = n;
                int k = 1;
                while(nn != 1){
                    nn = nn>>1;
                    k = k<<1;
                }
                System.out.println(n + " " + k);
                System.out.println(2*n + " " + (n^1^k) );
            }
        }


        sc.close();
    }
}

class Algorithm{
    public static void prYesNo(int y){
        System.out.println(y == 1 ? "Yes" : "No");
    }
    public static boolean isOdd(int n){
        return n % 2 == 1;
    }

    public static boolean isNibeki(int n){
        if (n==1){
            return true;
        }
        if(n%2==0){
            return isNibeki(n/2);
        }else {
            return false;
        }
    }
}