Problem: Takahashi has an N \times M grid, with N horizontal rows and M vertical columns. Determine if we can place A 1 \times 2 tiles (1 vertical, 2 horizontal) and B 2 \times 1 tiles (2 vertical, 1 horizontal) satisfying the following conditions, and construct one arrangement of the tiles if it is possible:

* All the tiles must be placed on the grid.
* Tiles must not stick out of the grid, and no two different tiles may intersect.
* Neither the grid nor the tiles may be rotated.
* Every tile completely covers exactly two squares.

Constraints

* 1 \leq N,M \leq 1000
* 0 \leq A,B \leq 500000
* N, M, A and B are integers.

Input

Input is given from Standard Input in the following format:


N M A B


Output

If it is impossible to place all the tiles, print `NO`. Otherwise, print the following:


YES
c_{11}...c_{1M}
:
c_{N1}...c_{NM}


Here, c_{ij} must be one of the following characters: `.`, `<`, `>`, `^` and `v`. Represent an arrangement by using each of these characters as follows:

* When c_{ij} is `.`, it indicates that the square at the i-th row and j-th column is empty;
* When c_{ij} is `<`, it indicates that the square at the i-th row and j-th column is covered by the left half of a 1 \times 2 tile;
* When c_{ij} is `>`, it indicates that the square at the i-th row and j-th column is covered by the right half of a 1 \times 2 tile;
* When c_{ij} is `^`, it indicates that the square at the i-th row and j-th column is covered by the top half of a 2 \times 1 tile;
* When c_{ij} is `v`, it indicates that the square at the i-th row and j-th column is covered by the bottom half of a 2 \times 1 tile.

Examples

Input

3 4 4 2


Output

YES
<><>
^<>^
v<>v


Input

4 5 5 3


Output

YES
<>..^
^.<>v
v<>.^
<><>v


Input

7 9 20 20


Output

NO

Solution (in CPP):

Solution:
#include<bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//using namespace __gnu_pbds;
//#define eps 1e-8
//#define eq(x,y) (fabs((x)-(y)) < eps)
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int>pii;
const ll mod = 998244353;
long double PI = acosl(-1);
const ll infl = 3e18+10;
const int inf = 1e9+10;
const int nmax = 2e5+5;
const int MAXLG = log2(nmax)+1;
//mt19937 rng(chrono::system_clock::now().time_since_epoch().count());
//typedef tree< int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ost;

void NA(){
    cout<<"NO";
    exit(0);
}

int main(){
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

    int n,m,a,b;
    cin>>n>>m>>a>>b;
    vector<vector<char> >g(n, vector<char>(m, '.') );

    if(n%2){
        for(int j=0; j<m-1; j+=2){
            if(a>0){
                g[n-1][j] = '<';
                g[n-1][j+1] = '>';
                a--;
            }
            else break;
        }
    }
    if(m%2){
        for(int i=0; i<n-1; i+=2){
            if(b>0){
                g[i][m-1] = '^';
                g[i+1][m-1] = 'v';
                b--;
            }
            else break;
        }
    }

    for(int i=0; i<n-1; i+=2){
        for(int j=0; j<m-1; j+=2){
            if(n%2 and m%2 and i==n-3 and j==m-3) break;
            if(a>1){
                a-=2;
                g[i][j] = g[i+1][j] = '<';
                g[i][j+1] = g[i+1][j+1] = '>';
            }
            else if(b>1){
                b-=2;
                g[i][j] = g[i][j+1] = '^';
                g[i+1][j] = g[i+1][j+1] = 'v';
            }
            else if(a>0){
                a--;
                g[i][j] = '<';
                g[i][j+1] = '>';
            }
            else if(b>0){
                b--;
                g[i][j] = '^';
                g[i+1][j] = 'v';
            }
        }
    }

    if(n%2 and m%2){
        int i = n-3, j = m-3;
        if(a>0 and b>0){
            a--, b--;
            g[i][j] = g[i+2][j+1] = '<';
            g[i][j+1] = g[i+2][j+2] = '>';
            g[i+1][j] = '^', g[i+2][j] = 'v';
        }
        else if(a>0){
            a--;
            g[i][j] = '<', g[i][j+1] = '>';
            if(a>0){
                a--;
                g[i+1][j] = '<', g[i+1][j+1] = '>';
            }
        }
        else if(b>0){
            b--;
            g[i][j] = '^', g[i+1][j] = 'v';
            if(b>0){
                b--;
                g[i][j+1] = '^', g[i+1][j+1] = 'v';
            }
        }
    }

    if(a>0 or b>0) NA();
    cout<<"YES\n";
    for(auto z : g){
        for(char ch : z)
            cout<<ch;
        cout<<"\n";
    }
}
/*
*/