#include<iostream>
using namespace std;
const int N=1010;
int n,m;
char a[N][N];
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)//从1开始,并且数组的长度比n,m都大,我们就不用考虑越界的情况了
    {
        for(int j=1;j<=m;j++)cin>>a[i][j];
    }
    int x[8]={-1,-1,-1,0,1,1,1,0},y[8]={-1,0,1,1,1,0,-1,-1};//遍历周围8个格子,x是i需要加减的值,y是j需要加减的值
    int l;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            l=0;//该格子开始的地雷数量为0
            if(a[i][j]=='*')//如果该格子是雷:直接输出并跳过此次循环
            {
                printf("*");
                continue;
            }
            for(int k=0;k<8;k++)//侦查周围8个格子有没有雷
            {
                if(a[i+x[k]][j+y[k]]=='*')l++;
            }
            printf("%d",l);
        }
        puts("");
    }
    return 0;
}