# include <iostream>//想想结构体行不行(一个字符,另一个表示周围雷数)
using namespace std;
struct lei
{
int weilei = 0;
char i;
};
void saolei(struct lei * p,int n,int m)//边输入边扫边加
{
int i;
for(i=0;i<n*m;i++)
{
cin >> ((p+i)->i);
if (((p+i)->i) == '*')
{ if (i == 0)//第一个
{
(p+i+1)->weilei++;
(p+i+n)->weilei++;
(p+i+n+1)->weilei++;
}
else if (i == (m-1))//第一行最后一个
{
(p+i-1)->weilei++;
(p+i+n)->weilei++;
(p+i+n-1)->weilei++;
}
else if (i == (m*(n-1) - 1))//最后一行第一个
{
(p+i+1)->weilei++;
(p+i-n)->weilei++;
(p+i+n+1)->weilei++;
}
else if (i == (n*m-1))//最后一个
{
(p+i-1)->weilei++;
(p+i+n)->weilei++;
(p+i+n-1)->weilei++;
}
else if (i/(m) == 0)//第一行
{
(p+i+1)->weilei++;//不是边边角角时
(p+i-1)->weilei++;
(p+i+n)->weilei++;
(p+i+n+1)->weilei++;
(p+i+n-1)->weilei++;
}
else if (i%(m) == 0)//第一列
{
(p+i+1)->weilei++;//不是边边角角时
(p+i+n)->weilei++;
(p+i+n+1)->weilei++;
(p+i-n)->weilei++;
(p+i-n+1)->weilei++;
}
else if ((i/m) == (n-1))//最后一行
{
(p+i+1)->weilei++;//不是边边角角时
(p+i-1)->weilei++;
(p+i-n)->weilei++;
(p+i-n+1)->weilei++;
(p+i-n-1)->weilei++;
}
else if ((i%m) == (m-1))//最后一列
{
//不是边边角角时
(p+i-1)->weilei++;
(p+i+n)->weilei++;
(p+i+n-1)->weilei++;
(p+i-n)->weilei++;
(p+i-n-1)->weilei++;
}
else
{
(p+i+1)->weilei++;//不是边边角角时
(p+i-1)->weilei++;
(p+i+n)->weilei++;
(p+i+n+1)->weilei++;
(p+i+n-1)->weilei++;
(p+i-n)->weilei++;
(p+i-n+1)->weilei++;
(p+i-n-1)->weilei++;
}
}
if (((p+i)->i) == '?')
{
;
}
}
return;
}
int main()
{
int i;
int n,m;
struct lei * p;
cin >> n >> m;
p = (struct lei *) malloc(sizeof(struct lei)* n*m);
saolei(p,n,m);
for (i = 0;i<n*m;i++)
{
if ((p+i)->i == '*')
printf("%c",(p+i)->i);
else
printf("%d",(p+i)->weilei);
if((i%m) == (m-1))
cout << endl;
}
return 0;
}