#include <bits/stdc++.h>
using namespace std;
inline int in() {
  int x;
  scanf("%d", &x);
  return x;
}
inline void priv(vector<int> a) {
  for (int i = 0; i < ((int)(a).size()); ++i)
    printf("%d%c", a[i], i == (int)(a).size() - 1 ? '\n' : ' ');
}
template <typename T>
istream& operator>>(istream& i, vector<T>& v) {
  for (int j = 0; j < ((int)(v).size()); ++j) i >> v[j];
  return i;
}
template <typename T>
string join(vector<T>& v) {
  stringstream s;
  for (int i = 0; i < ((int)(v).size()); ++i) s << ' ' << v[i];
  return s.str().substr(1);
}
template <typename T>
ostream& operator<<(ostream& o, vector<T>& v) {
  if ((int)(v).size()) o << join(v);
  return o;
}
template <typename T1, typename T2>
istream& operator>>(istream& i, pair<T1, T2>& v) {
  return i >> v.first >> v.second;
}
template <typename T1, typename T2>
ostream& operator<<(ostream& o, pair<T1, T2>& v) {
  return o << v.first << "," << v.second;
}
const int MX = 100005, INF = 1001001001;
const long long int LINF = 1e18;
const double eps = 1e-10;
bool ok;
int f(int x) {
  for (long long int i = 0; i < MX; ++i)
    if (i * (i - 1) / 2 == x) return i;
  ok = false;
  return 0;
}
bool solve(long long int a, long long int b, long long int ab,
           long long int ba) {
  if (ab + ba != a * b) return false;
  if (!a && !b) return false;
  if (!a) {
    cout << string(b, '1') << endl;
    return true;
  }
  if (!b) {
    cout << string(a, '0') << endl;
    return true;
  }
  string s;
  int x = ba / b, y = a - x;
  int l = 0;
  if (ba % b) {
    y--;
    l = ba % b;
  }
  s += string(y, '0');
  s += string(l, '1');
  if (ba % b) s += '0';
  s += string(b - l, '1');
  s += string(x, '0');
  cout << s << endl;
  return true;
}
int main() {
  vector<int> x(4);
  cin >> x;
  ok = true;
  int a = f(x[0]), b = f(x[3]);
  if (!ok) {
    puts("Impossible");
    return 0;
  };
  for (int i = 0; i < (2); ++i)
    for (int j = 0; j < (2); ++j) {
      if (a && i) continue;
      if (b && j) continue;
      if (solve(a + i, b + j, x[1], x[2])) return 0;
    }
  {
    puts("Impossible");
    return 0;
  };
  return 0;
}

### Prompt

Generate a CPP solution to the following problem:

For each string s consisting of characters '0' and '1' one can define four integers a00, a01, a10 and a11, where axy is the number of subsequences of length 2 of the string s equal to the sequence {x, y}. 

In these problem you are given four integers a00, a01, a10, a11 and have to find any non-empty string s that matches them, or determine that there is no such string. One can prove that if at least one answer exists, there exists an answer of length no more than 1 000 000.

Input

The only line of the input contains four non-negative integers a00, a01, a10 and a11. Each of them doesn't exceed 109.

Output

If there exists a non-empty string that matches four integers from the input, print it in the only line of the output. Otherwise, print "Impossible". The length of your answer must not exceed 1 000 000.

Examples

Input

1 2 3 4


Output

Impossible


Input

1 2 2 1


Output

0110

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
inline int in() {
  int x;
  scanf("%d", &x);
  return x;
}
inline void priv(vector<int> a) {
  for (int i = 0; i < ((int)(a).size()); ++i)
    printf("%d%c", a[i], i == (int)(a).size() - 1 ? '\n' : ' ');
}
template <typename T>
istream& operator>>(istream& i, vector<T>& v) {
  for (int j = 0; j < ((int)(v).size()); ++j) i >> v[j];
  return i;
}
template <typename T>
string join(vector<T>& v) {
  stringstream s;
  for (int i = 0; i < ((int)(v).size()); ++i) s << ' ' << v[i];
  return s.str().substr(1);
}
template <typename T>
ostream& operator<<(ostream& o, vector<T>& v) {
  if ((int)(v).size()) o << join(v);
  return o;
}
template <typename T1, typename T2>
istream& operator>>(istream& i, pair<T1, T2>& v) {
  return i >> v.first >> v.second;
}
template <typename T1, typename T2>
ostream& operator<<(ostream& o, pair<T1, T2>& v) {
  return o << v.first << "," << v.second;
}
const int MX = 100005, INF = 1001001001;
const long long int LINF = 1e18;
const double eps = 1e-10;
bool ok;
int f(int x) {
  for (long long int i = 0; i < MX; ++i)
    if (i * (i - 1) / 2 == x) return i;
  ok = false;
  return 0;
}
bool solve(long long int a, long long int b, long long int ab,
           long long int ba) {
  if (ab + ba != a * b) return false;
  if (!a && !b) return false;
  if (!a) {
    cout << string(b, '1') << endl;
    return true;
  }
  if (!b) {
    cout << string(a, '0') << endl;
    return true;
  }
  string s;
  int x = ba / b, y = a - x;
  int l = 0;
  if (ba % b) {
    y--;
    l = ba % b;
  }
  s += string(y, '0');
  s += string(l, '1');
  if (ba % b) s += '0';
  s += string(b - l, '1');
  s += string(x, '0');
  cout << s << endl;
  return true;
}
int main() {
  vector<int> x(4);
  cin >> x;
  ok = true;
  int a = f(x[0]), b = f(x[3]);
  if (!ok) {
    puts("Impossible");
    return 0;
  };
  for (int i = 0; i < (2); ++i)
    for (int j = 0; j < (2); ++j) {
      if (a && i) continue;
      if (b && j) continue;
      if (solve(a + i, b + j, x[1], x[2])) return 0;
    }
  {
    puts("Impossible");
    return 0;
  };
  return 0;
}

```