#include <bits/stdc++.h>   using namespace std;   int main() {     int n;     scanf( %d , &n);     int m = (n << 1) - 1;     vector<int> a(m);     int first = -1;     for (int i = 0; i < m; ++i) {       scanf( %d , &a[i]);       --a[i];       if (!~first && ~a[i]) {         first = i;       }     }     if (!~first) {       puts( yes );       printf( 1 );       for (int i = 1; i < n; ++i) {         printf(  %d 1 , i + 1);       }       putchar(10);       return 0;     }     if (first) {       vector<int> temp;       for (int i = first; i < m; ++i) {         temp.push_back(a[i]);       }       for (int i = 0; i < first; ++i) {         temp.push_back(a[i]);       }       a = temp;     }     if (~a.back() && a.back() != a[0]) {       puts( no );       return 0;     }     a.back() = a[0];     vector<int> free, parity(n, -1);     for (int i = 0; i < m; ++i) {       if (~a[i]) {         if (~parity[a[i]]) {           if (parity[a[i]] != (i & 1)) {             puts( no );             return 0;           }         } else {           parity[a[i]] = i & 1;         }       }     }     for (int i = 0; i < n; ++i) {       if (!~parity[i]) {         free.push_back(i);       }     }     vector<int> prev(m), next(m);     for (int i = 0; i < m; ++i) {       prev[i] = i - 1;       next[i] = i + 1;     }     auto erase = [&](int x) {       if (next[x] != m) {         prev[next[x]] = prev[x];       }       if (~prev[x]) {         next[prev[x]] = next[x];       }     };     auto solve = [&](int l, int r) {       for (int i = next[l]; i < r;) {         if (~a[i] && ~a[next[i]] && !~a[prev[i]]) {           a[prev[i]] = a[next[i]];           erase(i);           erase(next[i]);           i = prev[i];           if (i > l) {             i = prev[i];           }           if (i == l) {             i = next[i];           }         } else if (~a[i] && ~a[prev[i]] && !~a[next[i]]) {           a[next[i]] = a[prev[i]];           erase(i);           erase(next[i]);           i = prev[i];           if (i == l) {             i = next[i];           }         } else {           i = next[i];         }       }       for (int i = next[l]; i < r; i = next[i]) {         erase(i);       }       erase(r);     };     vector<bool> not_first(n), ban(n);     for (int i = 0; i < m; ++i) {       if (~a[i]) {         if (not_first[a[i]]) {           if (ban[a[i]]) {             puts( no );             return 0;           }           int left = prev[i], right = i, numbers = 1, total = 1;           while (a[left] != a[right]) {             if (~a[left]) {               ban[a[left]] = true;               ++numbers;             }             ++total;             left = prev[left];           }           int need = (total >> 1) + 1 - numbers;           if (need < 0) {             puts( no );             return 0;           }           for (int j = left; j < right; j = next[j]) {             if (!~a[j] && need) {               if (free.empty()) {                 puts( no );                 return 0;               } else {                 a[j] = free.back();                 --need;                 free.pop_back();               }             }           }           solve(left, right);         } else {           not_first[a[i]] = true;         }       }     }     puts( yes );     if (first) {       vector<int> temp;       for (int i = m - 1 - first; i < m - 1; ++i) {         temp.push_back(a[i]);       }       for (int i = 0; i < m - 1 - first; ++i) {         temp.push_back(a[i]);       }       temp.push_back(a[m - 1 - first]);       a = temp;     }     for (int i = 0; i < m; ++i) {       printf( %d%c , a[i] + 1, i == m - 1 ?   n  :    );     }     return 0;   }