#include <iostream>
#include<string>
#include<math.h>
#include<vector>
#include<algorithm>
#include<array>
#include<functional>
#include<iomanip>
#include<ios>
using namespace std;
#define FOR(i,n) for(int (i)=0;(i)<(n);(i)++)

typedef int value_type; /* ソートするキーの型 */

value_type med3(value_type x, value_type y, value_type z)
/* x, y, z の中間値を返す */
{
    if (x < y)
        if (y < z) return y; else if (z < x) return x; else return z; else
        if (z < y) return y; else if (x < z) return x; else return z;
}

void quicksort(value_type a[], int left, int right,value_type index[])
/* クイックソート
 * a     : ソートする配列 
 * left  : ソートするデータの開始位置
 * right : ソートするデータの終了位置
 * index: index配列
 */
{
    if (left < right) {
        int i = left, j = right;
        value_type tmp, pivot = med3(a[i], a[i + (j - i) / 2], a[j]); /* (i+j)/2ではオーバーフローしてしまう */
        while (1) { /* a[] を pivot 以上と以下の集まりに分割する */
            while (a[i] < pivot) i++; /* a[i] >= pivot となる位置を検索 */
            while (pivot < a[j]) j--; /* a[j] <= pivot となる位置を検索 */
            if (i >= j) break;
            tmp = a[i]; a[i] = a[j]; a[j] = tmp; /* a[i],a[j] を交換 */
            tmp = index[i]; index[i] = index[j]; index[j] = tmp;
            i++; j--;
        }
        quicksort(a, left, i - 1,index);  /* 分割した左を再帰的にソート */
        quicksort(a, j + 1, right,index); /* 分割した右を再帰的にソート */
    }
}

bool is753(int n){
    bool x[3]={false,false,false};

    while(n>0){
        switch (n%10){
            case 3:
                x[0]=true;
                break;
            case 5:
                x[1]=true;
                break;
            case 7:
                x[2]=true;
                break;
            default:
            return false;
        }
        n/=10;
    }
    if(x[0]&& x[1]&&x[2]){
        return true;
    }else{
        return false;
    }

}

int dfs(int n,int N){
    if (n>N){
        return 0;
    }
    

    int ret;
    if(is753(n)){
        ret=1;
    }else{
        ret=0;
    }
    FOR(i,3){
        ret+=dfs(10*n + (2*i+3),N);
    }
    return ret;
}


int main(){
    int H,W;

    cin >> H >> W;
    string S[H+2];
    string T[H];
    S[0]="";
    S[H+1]="";
    FOR(i,W+2){
        S[0]=S[0]+'.';
        S[H+1]=S[H+1]+'.';
    }
    for(int i=1;i<H+1;i++){
        cin >>S[i];
        S[i]='.'+S[i]+'.';
    }
    for(int i=1;i<H+1;i++){
        for(int j=1;j<W+1;j++){
            string here;
            if(S[i][j]=='.'){
                int tmp=0;
                if(S[i-1][j-1]=='#'){
                    tmp++;
                }
                if(S[i-1][j]=='#'){
                    tmp++;
                }
                if(S[i-1][j+1]=='#'){
                    tmp++;
                }
                if(S[i][j-1]=='#'){
                    tmp++;
                }
                if(S[i][j+1]=='#'){
                    tmp++;
                }
                if(S[i+1][j-1]=='#'){
                    tmp++;
                }
                if(S[i+1][j]=='#'){
                    tmp++;
                }
                if(S[i+1][j+1]=='#'){
                    tmp++;
                }
                here=to_string(tmp);
            }else{
                here='#';
            }
            T[i-1]+=here;
        }
    }

    FOR(i,H){
        cout << T[i]<<endl;
    }

    return 0;

}

Measured memory_bytes: 256