#include <bits/stdc++.h>   using namespace std;   int n, m;   char matr[1010][1010];   int dx[] = {-1, 0, 1, 0};   int dy[] = {0, -1, 0, 1};   bool Field(int x, int y) {     if (x < 1 || x > n) return false;     if (y < 1 || y > m) return false;     return true;   }   int color[1010][1010];   int ans[1010][1010];   int f[10];   int H;   void Solve() {     int i, j, o;     int x2, y2;     for (j = 1; j <= m; j++) {       for (i = 1; i <= n; i++) {         if (color[j][i]) continue;         if (matr[j][i] ==  . ) {           for (o = 0; o <= 3; o++) {             x2 = i + dx[o];             y2 = j + dy[o];             if (!Field(x2, y2)) continue;             if (color[y2][x2]) continue;             if (matr[y2][x2] !=  . ) continue;             color[j][i] = 1;             color[y2][x2] = 1;             memset(f, 0, sizeof(f));             ;             ans[j][i] = H;             ans[y2][x2] = H;             H++;             color[j][i] = 1;             color[y2][x2] = 1;             break;           }         }       }     }   }   int C;   int dfs(int x, int y) {     int o;     int x2, y2;     int res;     res = 1;     color[y][x] = C;     for (o = 0; o <= 3; o++) {       x2 = x + dx[o];       y2 = y + dy[o];       if (!Field(x2, y2)) continue;       if (color[y2][x2] == C) continue;       if (ans[y2][x2] != ans[y][x]) continue;       if (matr[y2][x2] !=  . ) continue;       res += dfs(x2, y2);     }     return res;   }   void Solve2() {     int i, j, o;     int x2, y2;     memset(color, 0, sizeof(color));     ;     int flag;     for (j = 1; j <= m; j++) {       for (i = 1; i <= n; i++) {         if (matr[j][i] ==  .  && ans[j][i] == -1) {           flag = 0;           for (o = 0; o <= 3; o++) {             x2 = i + dx[o];             y2 = j + dy[o];             if (!Field(x2, y2)) continue;             if (ans[y2][x2] == -1) continue;             C++;             if (dfs(x2, y2) < 5) {               ans[j][i] = ans[y2][x2];               flag = 1;               break;             }           }           if (!flag) {             printf( -1 n );             exit(0);           }         }       }     }   }   vector<pair<int, int> > t;   void dfs2(int x, int y) {     int o;     int x2, y2;     color[y][x] = C;     t.push_back(make_pair(x, y));     for (o = 0; o <= 3; o++) {       x2 = x + dx[o];       y2 = y + dy[o];       if (!Field(x2, y2)) continue;       if (color[y2][x2] == C) continue;       if (matr[y2][x2] !=  . ) continue;       if (ans[y2][x2] >= 0 && ans[y2][x2] <= 9) {         f[ans[y2][x2]] = 1;       }       if (ans[y2][x2] != ans[y][x]) continue;       dfs2(x2, y2);     }   }   void Solve3() {     int i, j, o;     int k;     for (j = 1; j <= m; j++) {       for (i = 1; i <= n; i++) {         if (ans[j][i] >= 10) {           memset(f, 0, sizeof(f));           ;           C++;           t.clear();           dfs2(i, j);           k = 0;           for (o = 0; o <= 9; o++) {             if (!f[o]) {               k = o;               break;             }           }           for (o = 0; o <= (int)t.size() - 1; o++) {             ans[t[o].second][t[o].first] = k;           }         }       }     }   }   int main() {     int i, j;     scanf( %d %d , &m, &n);     for (j = 1; j <= m; j++) {       scanf( %s , matr[j] + 1);     }     memset(ans, -1, sizeof(ans));     Solve();     Solve2();     Solve3();     for (j = 1; j <= m; j++) {       for (i = 1; i <= n; i++) {         if (matr[j][i] ==  . ) {           printf( %d , ans[j][i]);         } else {           printf( %c , matr[j][i]);         }       }       printf(  n );     }     return 0;   }