#include <bits/stdc++.h>   using namespace std;   long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }   template <class T1, class T2>   struct cmpf {     bool rev;     inline bool operator()(const pair<T1, T2>& a, const pair<T1, T2>& b) const {       return (a.first < b.first) ^ rev;     }     cmpf(bool b = false) { rev = b; }   };   template <class T1, class T2>   struct cmps {     bool rev;     inline bool operator()(const pair<T1, T2>& a, const pair<T1, T2>& b) const {       return (a.second < b.second) ^ rev;     }     cmps(bool b = false) { rev = b; }   };   string to_string(const char& c) { return string(1, c); }   string to_string(const string& s) { return     + s +    ; }   string to_string(const char* s) { return to_string((string)s); }   string to_string(const bool& b) { return (b ?  true  :  false ); }   string to_string(const vector<bool>& v, const string& sep =    ) {     string s =  [ ;     for (int i = 0; i < v.size(); i++) {       if (i) {         s += sep;       }       s += to_string(v[i]);     }     return s +  ] ;   }   template <size_t N>   string to_string(const bitset<N>& v) {     string s =  [ ;     for (size_t i = 0; i < N; i++) s += v[i] ?  1  :  0 ;     return s +  ] ;   }   template <class T1, class T2>   string to_string(const pair<T1, T2>& p, const string& sep =  , );   template <class T>   string to_string(const T& v, const string& sep =    ) {     bool first = true;     string s =  { ;     for (const auto& x : v) {       if (!first)         s += sep;       else         first = false;       s += to_string(x);     }     return s +  } ;   }   template <class T>   string to_string(const T& v, const int& sz, const string& sep =    ) {     string s =  [ ;     for (int i = 0; i < sz; i++) {       if (i) {         s += sep;       }       s += to_string(v[i]);     }     return s +  ] ;   }   template <class T1, class T2>   string to_string(const pair<T1, T2>& p, const string& sep) {     return  (  + to_string(p.first) + sep + to_string(p.second) +  ) ;   }   long long binpow(const long long& x, const long long& p, const long long& mod) {     assert(mod > 0);     if (p == 0) return 1;     if (p == 1) return x % mod;     if (p & 1) return (binpow((x * x) % mod, p / 2, mod) * x) % mod;     return binpow((x * x) % mod, p / 2, mod) % mod;   }   template <class T>   void chmn(T& a, const T& b) {     if (a > b) a = b;   }   template <class T>   void chmx(T& a, const T& b) {     if (a < b) a = b;   }   void setIO() {     ios_base::sync_with_stdio(false);     cin.tie(nullptr);     cout.tie(nullptr);   }   int chr[8] = {-1, 0, 1, 0, -1, -1, 1, 1};   int chc[8] = {0, 1, 0, -1, -1, 1, -1, 1};   const long long MOD = 1e9 + 7;   const int INIT = 1001001001;   const int MN = 255;   bool mat[MN][MN];   int N, M;   inline const bool out(int r, int c) {     return r <= 0 || r > N || c <= 0 || c > M;   }   inline const bool ok(int r, int c, int skip1, int skip2, int n) {     if (out(r, c) || !mat[r][c]) return false;     for (int i = 0; i < n; i++) {       if (i != skip1 && i != skip2) {         if (mat[r + chr[i]][c + chc[i]]) return false;       }     }     return true;   }   bool side_square(int r, int c, int len) {     if (!ok(r, c, 1, 2, 4)) return false;     if (mat[r - 1][c - 1]) return false;     r++;     for (int i = 0; i + 2 < len; i++) {       if (!ok(r, c, 0, 2, 4)) return false;       r++;     }     if (!ok(r, c, 0, 1, 4)) return false;     if (mat[r + 1][c - 1]) return false;     c++;     for (int i = 0; i + 2 < len; i++) {       if (!ok(r, c, 1, 3, 4)) return false;       c++;     }     if (!ok(r, c, 0, 3, 4)) return false;     if (mat[r + 1][c + 1]) return false;     r--;     for (int i = 0; i + 2 < len; i++) {       if (!ok(r, c, 0, 2, 4)) return false;       r--;     }     if (!ok(r, c, 2, 3, 4)) return false;     if (mat[r - 1][c + 1]) return false;     c--;     for (int i = 0; i + 2 < len; i++) {       if (!ok(r, c, 1, 3, 4)) return false;       c--;     }     return true;   }   bool diag_square(int r, int c, int len) {     if (!ok(r, c, 6, 7, 8)) return false;     r++;     c--;     for (int i = 0; i + 2 < len; i++) {       if (!ok(r, c, 5, 6, 8)) return false;       r++;       c--;     }     if (!ok(r, c, 5, 7, 8)) return false;     r++;     c++;     for (int i = 0; i + 2 < len; i++) {       if (!ok(r, c, 4, 7, 8)) return false;       r++;       c++;     }     if (!ok(r, c, 4, 5, 8)) return false;     r--;     c++;     for (int i = 0; i + 2 < len; i++) {       if (!ok(r, c, 5, 6, 8)) return false;       r--;       c++;     }     if (!ok(r, c, 4, 6, 8)) return false;     r--;     c--;     for (int i = 0; i + 2 < len; i++) {       if (!ok(r, c, 4, 7, 8)) return false;       r--;       c--;     }     return true;   }   void solve() {     cin >> N >> M;     for (int i = 0; i < N + 5; i++) {       for (int j = 0; j < M + 5; j++) {         mat[i][j] = false;       }     }     char c;     for (int i = 1; i <= N; i++) {       for (int j = 1; j <= M; j++) {         cin >> c;         mat[i][j] = c ==  1 ;       }     }     long long ans = 0;     for (int i = 1; i <= N; i++) {       for (int j = 1; j <= M; j++) {         if (mat[i][j]) {           bool stop = false;           for (int len = 2; i + len - 1 <= N && j + len - 1 <= M; len++) {             if (side_square(i, j, len)) {               ++ans;               stop = true;             }             if (diag_square(i, j, len)) {               ++ans;               stop = true;             }             if (stop) break;           }         }       }     }     cout << ans <<   n ;   }   int main() {     setIO();     long long T = 1;     cin >> T;     while (T--) solve();     return 0;   }