#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;


int main()
{
	long long H = 0, W = 0;
	vector<string> list;

	cin >> H >> W;
	for (int i = 0; i < H; i++) {
		string str;
		cin >> str;
		list.push_back(str);
	}

	for (int iH = 0; iH < H; iH++) {
		for (int iW = 0; iW < W; iW++) {
			if (list[iH][iW] == '.') {
				int count = 0;

				for (int iY = iH - 1; iY <= iH + 1; iY++) {
					if (iY < 0 || iY >= H) {
						continue;
					}

					for (int iX = iW - 1; iX <= iW + 1; iX++) {
						if (iX < 0 || iX >= W) {
							continue;
						}

						if (list[iY][iX] == '#') {
							count++;
						}
					}
				}

				list[iH][iW] = 0x30 + count;
			}
		}
	}

	for (int i = 0; i < H; i++) {
		cout << list[i] << endl;
	}
}


//int main()
//{
//	int N;
//	static int t[100010];
//	static int x[100010];
//	static int y[100010];
//
//	cin >> N;
//	t[0] = 0;
//	x[0] = 0;
//	y[0] = 0;
//	for (int i = 0; i < N; i++) {
//		cin >> t[i + 1] >> x[i + 1] >> y[i + 1];
//	}
//
//	bool enabled = true;
//
//	for (int i = 0; i < N; i++) {
//		int span = t[i + 1] - t[i];
//		int x_dist = std::abs(x[i + 1] - x[i]);
//		int y_dist = std::abs(y[i + 1] - y[i]);
//
//		if (span >= x_dist + y_dist && (span - x_dist - y_dist) % 2 == 0) {
//			//ok
//		}
//		else
//		{
//			enabled = false;
//			break;
//		}
//	}
//
//	if (enabled) {
//		cout << "Yes" << endl;
//	}
//	else {
//		cout << "No" << endl;
//	}
//}

//int main()
//{
//	string str;
//
//	cin >> str;
//
//	bool enabled = false;
//
//	while (true) {
//		long long length = str.length();
//
//		if (length == 0) {
//			enabled = true;
//			break;
//		}
//
//		if (length >= 7 && str.rfind("dreamer") == length - 7) {
//			str.erase(str.end() - 7, str.end());
//		}
//		else if (length >= 6 && str.rfind("eraser") == length - 6) {
//			str.erase(str.end() - 6, str.end());
//		}
//		else if (length >= 5 && str.rfind("dream") == length - 5) {
//			str.erase(str.end() - 5, str.end());
//		}
//		else if (length >= 5 && str.rfind("erase") == length - 5) {
//			str.erase(str.end() - 5, str.end());
//		}
//		else{
//			break;
//		}
//	}
//
//	if (enabled){
//		cout << "YES" << endl;
// 	}
//	else {
//		cout << "NO" << endl;
//	}
//}

//int main()
//{
//	unsigned long long n, y;
//
//	cin >> n >> y;
//
//	y /= 1000;
//	
//	unsigned long long a = 0, b = 0;
//	bool valid = false;
//	for (a = 0; a <= n; a++)
//	{
//		for (b = 0; b <= n - a; b++)
//		{
//			long long sum = a * 10 + b * 5 + (n - a - b);
//			if (sum == y)
//			{
//				valid = true;
//				break;
//			}
//		}
//
//		if (valid)
//		{
//			break;
//		}
//	}
//
//	if (valid)
//	{
//		cout << a << " " <<  b << " " << n - a - b << endl;
//	}
//	else
//	{
//		cout << "-1 -1 -1" << endl;
//	}
//}

//int main()
//{
//	unsigned long long n;
//	vector<long long> list;
//
//	cin >> n;
//	for (unsigned long iN = 1; iN <= n; iN++)
//	{
//		long long num;
//		cin >> num;
//		list.push_back(num);
//	}
//
//	std::sort(list.begin(), list.end(), std::greater<int>());
//
//	long long level = 0;
//	long long prev = 0;
//	for (int i = 0; i < n; i++)
//	{
//		if (list[i] != prev)
//		{
//			prev = list[i];
//			level++;
//		}
//	}
//
//	cout << level << endl;
//}

//int main()
//{
//	unsigned long long n;
//	vector<long long> list;
//
//	cin >> n;
//	for (unsigned long iN = 1; iN <= n; iN++)
//	{
//		long long num;
//		cin >> num;
//		list.push_back(num);
//	}
//
//	std::sort(list.begin(), list.end(), std::greater<int>());
//
//	long long result = 0;
//	for (int i = 0; i < n; i++)
//	{
//		if (i % 2 == 0)
//		{
//			result += list[i];
//		}
//		else
//		{
//			result -= list[i];
//		}
//	}
//
//	cout << result << endl;
//}

//int main()
//{
//	unsigned long n, a, b;
//
//	cin >> n >> a >> b;
//
//	unsigned long sum = 0;
//	for (unsigned long iN = 1; iN <= n; iN++)
//	{
//		unsigned long last = iN;
//
//		unsigned long rank10000 = last / 10000;
//		last -= rank10000 * 10000;
//
//		unsigned long rank1000 = last / 1000;
//		last -= rank1000 * 1000;
//
//		unsigned long rank100 = last / 100;
//		last -= rank100 * 100;
//
//		unsigned long rank10 = last / 10;
//		last -= rank10 * 10;
//
//		unsigned long rank1 = last;
//
//		unsigned long temp_sum = rank10000 + rank1000 + rank100 + rank10 + rank1;
//		if (temp_sum >= a && temp_sum <= b)
//		{
//			sum += iN;
//		}
//	}
//
//	cout << sum << endl;
//}

//int main()
//{
//	int coin500, coin100, coin50;
//	int x;
//
//	cin >> coin500 >> coin100 >> coin50 >> x;
//
//	int count_pattern = 0;
//	for (int i500 = 0; i500 <= coin500; i500++)
//	{
//		for (int i100 = 0; i100 <= coin100; i100++)
//		{
//			for (int i50 = 0; i50 <= coin50; i50++)
//			{
//				if (i500 * 500 + i100 * 100 + i50 * 50 == x)
//				{
//					count_pattern++;
//				}
//			}
//		}
//	}
//
//	cout << count_pattern << endl;
//}

//int main()
//{
//	int n;
//	vector<int> list;
//
//	cin >> n;
//
//	for (int i = 0; i < n; i++)
//	{
//		int num;
//		cin >> num;
//		list.push_back(num);
//	}
//
//	int proc_count = 0;
//	while (true)
//	{
//		bool valid = true;
//		for (int i = 0; i < n; i++)
//		{
//			if (list[i] % 2 > 0)
//			{
//				valid = false;
//				break;
//			}
//			else
//			{
//				list[i] /= 2;
//			}
//		}
//
//		if (valid == true)
//		{
//			proc_count++;
//		}
//		else
//		{
//			break;
//		}
//	}
//
//	cout << proc_count << endl;
//}

//int main()
//{
//	string str;
//
//	cin >> str;
//
//	int count_one = 0;
//
//	if (str[0] == '1')
//	{
//		count_one++;
//	}
//	
//	if (str[1] == '1')
//	{
//		count_one++;
//	}
//
//	if (str[2] == '1')
//	{
//		count_one++;
//	}
//
//	cout << count_one << endl;
//}


//int main()
//{
//	int a, b;
//
//	cin >> a >> b;
//
//	int c = a * b;
//
//	if (c % 2 == 0)
//	{
//		cout << "Even" << endl;
//	}
//	else
//	{
//		cout << "Odd" << endl;
//	}
//}

Measured memory_bytes: 256