#define h 46  /***************** "Burning calling card" ***********************/
#define w 158  /*                                                             */
#include<stdio.h>/*               simon@datakod.se                            */
#include  <fcntl.h>/*             https://datakod.se                          */ 
#define  S(  _)   #_/*                                                        */
#include <stdlib.h>  /*           Usage: gcc calling_card.c -o card && ./card */
#include <unistd.h> /** \         Tested in xterm, mate-terminal, gnome-      */
#define   o(_,__) __ ## _/*       terminal and konsole                        */
#define i(_) S(\xe2\x96) S(_)/*                                               */
#define m(_,u,o) ((uc *)(_))[(u)*w+o]/*                                       */
#define g(_) o(uts,fp)( S(_),o(dout, st))/*                                   */
#define t(_,aa, l, a)  o(or, f) (_ = a; aa ;l) /*                             */
typedef unsigned char uc; typedef unsigned u; o(c,u) F = -1; u x,k, y[1+(uc)-1];
uc B[w*h*2] ;o(har,c)M[ w*h]; char r5[] = ".:/LS[@ headmost plink"i(\x98)i(\x9d)
i(\x80)i(\x96)i(\x84)i(\x84) i(\x84)i(\x97)i(\x9a)i(\x90) "A2A:;B51AB96;@:C<A:;"
S(B498=8C;9.<7:6==?</0098=8C;)S(9.<73);u snr(u _,u x,u r) {return _<<16^x<<8^r;}
uc cl(int i){ return i<=(i>>1)?0:(i&~F?F : i); } void ec(){g(\x1b[?25h\x1b[0m\n)
;}char*r6=r5+52; char*_w(char *p,int n,int z){char*q=p;t(x,x,x/=10,100){if(!(x-1
)|| n/x||q-p){*q++='0'+n/x;}n%=x;}if(z>>5)*q++=z;else q += z;return q;}void wa(u
q,u c) {c=y[c]; o(ar,ch)B[27]=S(\x1b[_8;2;);fwrite(B,_w(_w(_w(_w(B+2,q,4),c>>16,
';'),(c>>8)&F,';'),c&F,'m')-B,1,stdout);}int fs(int*_v) {u s=0,m=~1;t(x,x &15,x=
(x*8)^(x>>7),312) {int _s[] [2]={{0,0},{0,0}},xd =0;t(k,k-4,++k,0){int*q=_s[ ((x
>> k)&1)];q[0]+=_v[k];q[1]++;}**_s/=(*_s)[1];*_s[1]/=_s[1][1];t(k,k-4,++k,0){int
d=_v[k]-*_s[((x>>k)&1)];xd+=d*d;}if(xd<m)m=xd, (s=snr(*_s[1],**_s,22+3*((x&15)-1
)));}return s;}void pc(int r, int c, int*o){if(c!=*o){wa(r,c);*o=c; }} u ib(u i,
u j){ return i<h&&j<w; }uc *C=B,*P=B+w*h,*T;u va(u i,u j){return C[i*w +j];}u r;
u R(u q){return(r=(0x19660d*r+0x3c6ef35f),(q&F>>2)+r%(q>>6));}int main(){long x,
i=h-16,j,q[3]; const char *p,*e;u k,l;t(p,(l=r5[*p-46]-'['),i+=2,r6)o(or,f) (e=l
+ ++p,j=(w/2-l)/2;p-e;++p){M[i*w+2*(j++)]=*p-45;}fcntl(0,F_SETFL,fcntl(0,F_GETFL
,0)|O_NONBLOCK);g(\x1b[2J\x1b[?25l);atexit(ec); t(i,i<=F,i++,0){y[i]=(cl(i*16-80
)<<16)|(cl(i*7-65)<<8)|(i>60?F:0);}while(1>read(0,1+M,1)){T=C;C=P;P=T;t(j,w>j,++
j,0)if((m(P,h-1,j)<40?m(P,h-1,j)=40:0),!R(4160)){int r[]={R(643),R(132),R(2435)}
;t(k,k-j<*r,++k, j-*r/2)t(l,l>h-1-r[1],-- l,h-1)if(ib(l,k))m(P,l,k)=cl(m(P,l,k)+
r[2]);} t(i,i<h,++i,0)t(j,j<w,++j,0){t(x,x,x>>=5, (*q=q[1]=q[2]=0, o(39456a48c41
,0xe6b1))){ k=i+((x>>3)&3);l=j+((x&7)-2); if(k<h&&l<w) {*q+=m(P,k,l); q[1]++; }}
*q= (*q*R(442)) >> 6;q[2]=q[1]>0?*q/q[1]:0;m( C, i, j) =* q&7?q[2]:cl(q[2]-1); }
wa(4,0);g(\x1b[1;1H);int o[]={-1,-1};t(i,i< h,i+=2,0){t(j,j<w,j+=2,0) { int v[]=
{va(i,j),va(i,j+1),va(i+1,j) ,va(i+1,j+1) };p=&M[i*w+j];x=*p?snr(0,(v[0]+v[1]+v[
2]+v[3])>>2,*p-1):(v[0]==v[1] && v[0]==v[2]&&v[0]==v[3]?snr(*v,*v,7):fs(v)); pc(
3,x>>16,o);pc(4,(x>>8)&F,1+o); p=&r5[(x)&F]; fwrite(p,*p&(F<<7)?3:1,1, stdout);}
g(\n);usleep(3000);}wa(3,0);wa(4,0); g(\x1b[D\x1b[B); fflush(stdout);}return 0;}
