#include <bits/stdc++.h>
using namespace std;
const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, -1, 1};
const int max_n = 1000;
char a[max_n][max_n];
int res[max_n][max_n], val[max_n * max_n];
vector<pair<int, int> > comp[max_n * max_n];
bool used[10];
bool range(int x, int l, int r) { return ((l <= x) && (x <= r)); }
int main() {
  int n, m, r = 0;
  scanf("%d%d\n", &n, &m);
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) scanf("%c", &a[i][j]);
    scanf("\n");
  }
  memset(res, -1, sizeof(res));
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j)
      if (a[i][j] == '.')
        if ((j < m - 1) && (a[i][j + 1] == '.')) {
          res[i][j] = res[i][j + 1] = r++, a[i][j] = a[i][j + 1] = '~';
        } else if ((i < n - 1) && (a[i + 1][j] == '.'))
          res[i][j] = res[i + 1][j] = r++, a[i][j] = a[i + 1][j] = '~';
        else {
          for (int d = 0; d < 4; ++d)
            if (range(i + dx[d], 0, n - 1) && range(j + dy[d], 0, m - 1) &&
                (a[i + dx[d]][j + dy[d]] != '#')) {
              res[i][j] = res[i + dx[d]][j + dy[d]];
              break;
            }
          if (res[i][j] != -1) continue;
          printf("-1\n");
          return 0;
        }
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j)
      if (res[i][j] != -1) comp[res[i][j]].push_back(make_pair(i, j));
  for (int rc = 0; rc < r; ++rc) {
    memset(used, 0, sizeof(used));
    for (int k = 0; k < (int)comp[rc].size(); ++k)
      for (int d = 0; d < 4; ++d) {
        int cur = res[comp[rc][k].first + dx[d]][comp[rc][k].second + dy[d]];
        if (cur < rc) used[val[cur]] = true;
      }
    for (int k = 0; k < 10; ++k)
      if (!used[k]) {
        val[rc] = k;
        break;
      }
  }
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j)
      printf("%c", res[i][j] == -1 ? '#' : '0' + val[res[i][j]]);
    printf("\n");
  }
  return 0;
}
