#include using namespace std; const int MaxN = (int)2e5 + 10; const int INF = (int)1e9; const int MOD = (int)1e9 + 7; const int add = 1005; int n, m; char s[305][305]; int mat[2 * add][2 * add]; long long diff[605]; inline int get(int xl, int yl, int xr, int yr) { xl = max(xl, 1); xr = min(xr, 2 * add - 1); yl = max(yl, 1); yr = min(yr, 2 * add - 1); return mat[xr][yr] - mat[xl - 1][yr] - mat[xr][yl - 1] + mat[xl - 1][yl - 1]; } void solve() { scanf("%d%d\n", &n, &m); for (int i = 1; i <= n; ++i) { scanf("%s\n", s[i] + 1); } memset(mat, 0, sizeof(mat)); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { if (s[i][j] == '1') { mat[i - j + add][i + j + add / 2] = 1; } } } for (int i = 1; i < 2 * add; ++i) { for (int j = 1; j < 2 * add; ++j) { mat[i][j] += mat[i - 1][j]; mat[i][j] += mat[i][j - 1]; mat[i][j] -= mat[i - 1][j - 1]; } } memset(diff, 0, sizeof(diff)); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { if (s[i][j] == '0') { continue; } int x = i - j + add, y = i + j + add / 2; for (int k = 0; k <= n + m - 2; ++k) { diff[k] += get(x - k, y - k, x + k, y + k); } } } for (int i = n + m - 2; i >= 1; --i) { diff[i] -= diff[i - 1]; } for (int i = 1; i <= n + m - 2; ++i) { printf("%lld%c", diff[i] / 2, i == n + m - 2 ? '\n' : ' '); } } int main() { // freopen("input.txt", "r", stdin); int t; scanf("%d\n", &t); while (t --> 0) { solve(); } return 0; }