diff --git a/1984/1984.tar.bz2 b/1984/1984.tar.bz2 new file mode 100644 index 000000000..434251ffa Binary files /dev/null and b/1984/1984.tar.bz2 differ diff --git a/1984/Makefile b/1984/Makefile new file mode 100644 index 000000000..ce90d35a8 --- /dev/null +++ b/1984/Makefile @@ -0,0 +1,72 @@ +#!/usr/bin/env make +# +# Orwellian 1984 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############### +# IOCCC winners +############### +# +WINNERS= anonymous laman decot mullender + +################### +# build all entries +################### +# +all: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + + +############### +# utility rules +############### +# +clean: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +clobber: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +install: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done diff --git a/1984/README b/1984/README new file mode 100644 index 000000000..a3877917c --- /dev/null +++ b/1984/README @@ -0,0 +1,12 @@ +In 1984, the first contest was held. The name of the contest was simply +``Obfuscated C Code Contest''. + +Restrictions against machine dependent code were not in the rules in 1984. +The source file size restriction was only 512 bytes. Rules and results +were posted to net.lang.c and net.unix-wizards. + +Copyright (c) 1984, Landon Curt Noll. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1984/anonymous/Makefile b/1984/anonymous/Makefile new file mode 100644 index 000000000..834267ef0 --- /dev/null +++ b/1984/anonymous/Makefile @@ -0,0 +1,26 @@ +# %W% %G% %U% +# +# 1984 makefile +# +# Copyright (c) 1984, Landon Curt Noll. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= anonymous + +all: ${WINNERS} + +anonymous: anonymous.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} + +install: all + @echo are you kidding'??' diff --git a/1984/anonymous/anonymous.c b/1984/anonymous/anonymous.c new file mode 100644 index 000000000..a8681d1e5 --- /dev/null +++ b/1984/anonymous/anonymous.c @@ -0,0 +1,2 @@ +int i;main(){for(;i["]Dishonorable mention + +

Anonymous

+ +

Judges' comments:

+ +

The author was too embarrassed that he/she could write such trash, so I +promised to protect their identity. I will say that the author of this +program has a well known connection with the C programming language.

+ +

This program is a unique variation on the age old “Hello, world” +program. What reads like a read may be written like a write!

+ +

Copyright © 1984, Landon Curt Noll. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1984/anonymous/hint.text b/1984/anonymous/hint.text new file mode 100644 index 000000000..512eff0c8 --- /dev/null +++ b/1984/anonymous/hint.text @@ -0,0 +1,18 @@ +# Dishonorable mention + +Anonymous + +## Judges' comments: + +The author was too embarrassed that he/she could write such trash, so I +promised to protect their identity. I will say that the author of this +program has a well known connection with the C programming language. + +This program is a unique variation on the age old "Hello, world" +program. What reads like a read may be written like a write! + +Copyright (c) 1984, Landon Curt Noll. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1984/decot/Makefile b/1984/decot/Makefile new file mode 100644 index 000000000..ea8d415eb --- /dev/null +++ b/1984/decot/Makefile @@ -0,0 +1,26 @@ +# %W% %G% %U% +# +# 1984 makefile +# +# Copyright (c) 1984, Landon Curt Noll. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= decot + +all: ${WINNERS} + +decot: decot.c + cc $? -o $@ -lm + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} + +install: all + @echo are you kidding'??' diff --git a/1984/decot/decot.c b/1984/decot/decot.c new file mode 100644 index 000000000..031519b57 --- /dev/null +++ b/1984/decot/decot.c @@ -0,0 +1,32 @@ +#define x = +#define double(a,b) int +#define char k['a'] +#define union static struct + +extern int floor; +double (x1, y1) b, +char x {sizeof( + double(%s,%D)(*)()) +,}; +struct tag{int x0,*xO;} + +*main(i, dup, signal) { +{ + for(signal=0;*k *x * __FILE__ *i;) do { + (printf(&*"'\",x); /*\n\\", (*((double(tag,u)(*)())&floor))(i))); + goto _0; + +_O: while (!(char < xO));/*} + ; +} + +*/}}} diff --git a/1984/decot/hint.html b/1984/decot/hint.html new file mode 100644 index 000000000..88cceaf70 --- /dev/null +++ b/1984/decot/hint.html @@ -0,0 +1,30 @@ +

Second place award

+ +

Dave Decot

+ +

Compile with:

+ +
cc decot.c -o decot -lm
+
+ +

Judges' comments:

+ +

Some new compilers disliked line 15 of the source, so we changed it from:

+ +
for(signal=0;*k * x * __FILE__ *i;) do {
+
+ +

to:

+ +
for(signal=0;*k *x * __FILE__ *i;) do {
+
+ +

This program prints out a string of garbage.

+ +

The judges also offer this one comment: understand comments!

+ +

Copyright © 1984, Landon Curt Noll. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1984/decot/hint.text b/1984/decot/hint.text new file mode 100644 index 000000000..bb06c6243 --- /dev/null +++ b/1984/decot/hint.text @@ -0,0 +1,27 @@ +# Second place award + +Dave Decot + +## Compile with: + + cc decot.c -o decot -lm + +## Judges' comments: + +Some new compilers disliked line 15 of the source, so we changed it from: + + for(signal=0;*k * x * __FILE__ *i;) do { + +to: + + for(signal=0;*k *x * __FILE__ *i;) do { + +This program prints out a string of garbage. + +The judges also offer this one comment: understand comments! + +Copyright (c) 1984, Landon Curt Noll. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1984/laman/Makefile b/1984/laman/Makefile new file mode 100644 index 000000000..bb88cb113 --- /dev/null +++ b/1984/laman/Makefile @@ -0,0 +1,26 @@ +# %W% %G% %U% +# +# 1984 makefile +# +# Copyright (c) 1984, Landon Curt Noll. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= laman + +all: ${WINNERS} + +laman: laman.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} + +install: all + @echo are you kidding'??' diff --git a/1984/laman/hint.html b/1984/laman/hint.html new file mode 100644 index 000000000..5839b164d --- /dev/null +++ b/1984/laman/hint.html @@ -0,0 +1,34 @@ +

Third place

+ +

Mike Laman

+ +

Judges' comments:

+ +

Some new compilers dislike lines 6 and 10 of the source, so we changed +them from:

+ +
;++f)a[     b<<5|c]     =d++,b+     =e;for(     f=0;f<O
+<<5|c]^     =a[b<<5     |c]^=a[     (k-(b+1     ))<<5|c]
+
+ +

to:

+ +
;++f)a[     b<<5|c]     =d++,b+=    e;for(      f=0;f<O
+<<5|c]^=    a[b<<5      |c]^=a[     (k-(b+1     ))<<5|c]
+
+ +

I hope you have the C beautifier! The program accepts ONE positive +argument. Seeing is believing, so try things like:

+ +
laman 4
+laman 9
+laman 16
+
+ +

This code should run you in circles.

+ +

Copyright © 1984, Landon Curt Noll. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1984/laman/hint.text b/1984/laman/hint.text new file mode 100644 index 000000000..f82371a52 --- /dev/null +++ b/1984/laman/hint.text @@ -0,0 +1,31 @@ +# Third place + +Mike Laman + +## Judges' comments: + +Some new compilers dislike lines 6 and 10 of the source, so we changed +them from: + + ;++f)a[ b<<5|c] =d++,b+ =e;for( f=0;f>1) ;for(h= 0;h*h<= +g;++h); --h;c=( (h+=g>h *(h+1)) -1)>>1; +while(d <=g){ ++O;for (f=0;f< O&&d<=g +;++f)a[ b<<5|c] =d++,b+= e;for( f=0;fThe Grand Prize + +

Sjoerd Mullender

+ +

Robbert van Renesse

+ +

Judges' comments:

+ +

Without question, this C program is the most obfuscated C program that +has ever been received! Like all great contest entries, they result +in a change of rules for the following year. To prevent a flood of +similar programs, we requested that programs be non machine specific.

+ +

This program was selected for the 1987 t-shirt collection.

+ +

NOTE: If your machine is not a Vax-11 or pdp-11, this program will +not execute correctly. In later years, machine dependent +code was discouraged.

+ +

The C startup routine (via crt0.o) transfers control to a location +named main. In this case, main just happens to be in the data area. +The array of shorts, which has been further obfuscated by use of +different data types, just happens to form a meaningful set of PDP-11 +and Vax instructions. The first word is a PDP-11 branch instruction +that branches to the rest of the PDP code. On the Vax main is called with +the calls instruction which uses the first word of the subroutine as a +mask of registers to be saved. So on the Vax the first word can be anything. +The real Vax code starts with the second word. This small program +makes direct calls to the write() Unix system call to produce a +message on the screen. Can you guess what is printed? We knew you +couldn’t! :-)

+ +

Copyright © 1984, Landon Curt Noll. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1984/mullender/hint.text b/1984/mullender/hint.text new file mode 100644 index 000000000..e77256278 --- /dev/null +++ b/1984/mullender/hint.text @@ -0,0 +1,37 @@ +# The Grand Prize + +Sjoerd Mullender + +Robbert van Renesse + +## Judges' comments: + +Without question, this C program is the most obfuscated C program that +has ever been received! Like all great contest entries, they result +in a change of rules for the following year. To prevent a flood of +similar programs, we requested that programs be non machine specific. + +This program was selected for the 1987 t-shirt collection. + +> NOTE: If your machine is not a Vax-11 or pdp-11, this program will +> not execute correctly. In later years, machine dependent +> code was discouraged. + +The C startup routine (via crt0.o) transfers control to a location +named main. In this case, main just happens to be in the data area. +The array of shorts, which has been further obfuscated by use of +different data types, just happens to form a meaningful set of PDP-11 +and Vax instructions. The first word is a PDP-11 branch instruction +that branches to the rest of the PDP code. On the Vax main is called with +the calls instruction which uses the first word of the subroutine as a +mask of registers to be saved. So on the Vax the first word can be anything. +The real Vax code starts with the second word. This small program +makes direct calls to the write() Unix system call to produce a +message on the screen. Can you guess what is printed? We knew you +couldn't! :-) + +Copyright (c) 1984, Landon Curt Noll. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1984/mullender/mullender.c b/1984/mullender/mullender.c new file mode 100644 index 000000000..bc6135aca --- /dev/null +++ b/1984/mullender/mullender.c @@ -0,0 +1,10 @@ +short main[] = { + 277, 04735, -4129, 25, 0, 477, 1019, 0xbef, 0, 12800, + -113, 21119, 0x52d7, -1006, -7151, 0, 0x4bc, 020004, + 14880, 10541, 2056, 04010, 4548, 3044, -6716, 0x9, + 4407, 6, 5568, 1, -30460, 0, 0x9, 5570, 512, -30419, + 0x7e82, 0760, 6, 0, 4, 02400, 15, 0, 4, 1280, 4, 0, + 4, 0, 0, 0, 0x8, 0, 4, 0, ',', 0, 12, 0, 4, 0, '#', + 0, 020, 0, 4, 0, 30, 0, 026, 0, 0x6176, 120, 25712, + 'p', 072163, 'r', 29303, 29801, 'e' +}; diff --git a/1984/rules b/1984/rules new file mode 100644 index 000000000..819a4bafa --- /dev/null +++ b/1984/rules @@ -0,0 +1,44 @@ +Copyright (c) 1984, Landon Curt Noll. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + +I'm sure you have all seen gross, or down right structurally obscene C +source code before. Some people who deal with various parts of the +UN*X source wonder if some folks try rather hard to produce such +down right smelly code. + +Now you have the chance to compete with the worst C hackers around +by sending in your own obfuscated C program. Just follow the contest +rules below: + 1) the source file must be no more than 512 bytes long + + 2) mail your source to: hplabs!nsc!chongo + no later than April 11, 1984. entries posted to + the net will NOT be accepted. please give your + letter the subject of: obfuscated C code contest. + + 3) winning entries will be posted to net.lang.c after + April 12, 1894. (thats the prize folks) + + 4) indicate your net address in the text of your + entry, this will be used to give credit unless + you indicate that you want to remain anonymous. + + 5) entries must be of original work. (dont send anything + that might upset Big Brother Bell) all entries are + public domain. (who would want to own them anyway?!) + +Entries will be judged for: violations of structured programming, non-clarity, +and use of "by the K&R book" C. (use of local mods to C are not encouraged) +extra credit if they can be compiled using the 4.2BSD C compiler on our VAX 780, +but dont let the lack of a 780 or 4.2 discourage you! + +chongo /\CC/\ + +UN*X is a trademark of Usenet Hackers Anonymous + +WARNING: The rules and mailing address for the contest change from year + to year. Be sure that you consult the current set of rules + before submitting entries. diff --git a/1985/1985.tar.bz2 b/1985/1985.tar.bz2 new file mode 100644 index 000000000..6c181285e Binary files /dev/null and b/1985/1985.tar.bz2 differ diff --git a/1985/Makefile b/1985/Makefile new file mode 100644 index 000000000..d6a342dcd --- /dev/null +++ b/1985/Makefile @@ -0,0 +1,72 @@ +#!/usr/bin/env make +# +# 1985 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############### +# IOCCC winners +############### +# +WINNERS= applin august lycklama shapiro sicherman + +################### +# build all entries +################### +# +all: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + + +############### +# utility rules +############### +# +clean: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +clobber: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +install: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done diff --git a/1985/README b/1985/README new file mode 100644 index 000000000..586b3376b --- /dev/null +++ b/1985/README @@ -0,0 +1,13 @@ +185 marked the second year of the Obfuscated C Code Contest. + +Hints against machine dependent code were added to the rules to avoid +another 1984 style winner. Rules and results were posted to net.lang.c +and net.unix-wizards. Larry Bassel was invited to help in the +judging. Awards were given to 5 classes of programs since we were +unable to select only the best 4. + +Copyright (c) 1985, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1985/applin/Makefile b/1985/applin/Makefile new file mode 100644 index 000000000..f1f526851 --- /dev/null +++ b/1985/applin/Makefile @@ -0,0 +1,26 @@ +# %W% %G% %U% +# +# 1985 makefile +# +# Copyright (c) 1985, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= applin + +all: ${WINNERS} + +applin: applin.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} + +install: all + @echo are you kidding'??' diff --git a/1985/applin/applin.c b/1985/applin/applin.c new file mode 100644 index 000000000..3a376f1ab --- /dev/null +++ b/1985/applin/applin.c @@ -0,0 +1 @@ +main(v,c)char**c;{for(v[c++]="Hello, world!\n)";(!!c)[*c]&&(v--||--c&&execlp(*c,*c,c[!!c]+!!c,!c));**c=!c)write(!!*c,*c,!!**c);} diff --git a/1985/applin/hint.html b/1985/applin/hint.html new file mode 100644 index 000000000..02ab784d8 --- /dev/null +++ b/1985/applin/hint.html @@ -0,0 +1,14 @@ +

Best one liner

+ +

Jack Applin [with help from Robert Heckendorn]

+ +

Judges' comments:

+ +

One liner programs are short but twisted. This “Hello, World” version +certainly takes its time saying hello.

+ +

Copyright © 1985, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1985/applin/hint.text b/1985/applin/hint.text new file mode 100644 index 000000000..ba9d0b225 --- /dev/null +++ b/1985/applin/hint.text @@ -0,0 +1,14 @@ +# Best one liner + +Jack Applin [with help from Robert Heckendorn] + +## Judges' comments: + +One liner programs are short but twisted. This "Hello, World" version +certainly takes its time saying hello. + +Copyright (c) 1985, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1985/august/Makefile b/1985/august/Makefile new file mode 100644 index 000000000..281da421f --- /dev/null +++ b/1985/august/Makefile @@ -0,0 +1,26 @@ +# %W% %G% %U% +# +# 1985 makefile +# +# Copyright (c) 1985, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= august + +all: ${WINNERS} + +august: august.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} + +install: all + @echo are you kidding'??' diff --git a/1985/august/august.c b/1985/august/august.c new file mode 100644 index 000000000..e2c7c6316 --- /dev/null +++ b/1985/august/august.c @@ -0,0 +1,14 @@ +#define p struct c +#define q struct b +#define h a->a +#define i a->b +#define e i->c +#define o a=(*b->a)(b->b,b->c) +#define s return a;}q* +#define n (d,b)p*b;{q*a;p*c; +#define z(t)(t*)malloc(sizeof(t)) +q{int a;p{q*(*a)();int b;p*c;}*b;};q*u n a=z(q);h=d;i=z(p);i->a=u;i->b=d+1;s +v n c=b;do o,b=i;while(!(h%d));i=c;i->a=v;i->b=d;e=b;s +w n o;c=i;i=b;i->a=w;e=z(p);e->a=v;e->b=h;e->c=c;s +t n for(;;)o,main(-h),b=i;}main(b){p*a;if(b>0)a=z(p),h=w,a->c=z(p),a->c->a=u, +a->c->b=2,t(0,a);putchar(b?main(b/2),-b%2+'0':10);} diff --git a/1985/august/hint.html b/1985/august/hint.html new file mode 100644 index 000000000..3c3226380 --- /dev/null +++ b/1985/august/hint.html @@ -0,0 +1,20 @@ +

The most obscure program

+ +

Lennart Augustsson +<chalmers!augustss>

+ +

Judges' comments:

+ +

An interesting use of a recursive call to main. Compile and execute +without args. What is the initial value of b, and does it alter the +action of the program?

+ +

If you let it, the program will continue to print a numerical sequence +(can you guess in what base it is printed?) until you run out of +memory or until they sell your computer, which ever comes first.

+ +

Copyright © 1985, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1985/august/hint.text b/1985/august/hint.text new file mode 100644 index 000000000..e37f47223 --- /dev/null +++ b/1985/august/hint.text @@ -0,0 +1,20 @@ +# The most obscure program + +Lennart Augustsson + + +## Judges' comments: + +An interesting use of a recursive call to main. Compile and execute +without args. What is the initial value of b, and does it alter the +action of the program? + +If you let it, the program will continue to print a numerical sequence +(can you guess in what base it is printed?) until you run out of +memory or until they sell your computer, which ever comes first. + +Copyright (c) 1985, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1985/lycklama/Makefile b/1985/lycklama/Makefile new file mode 100644 index 000000000..c8449115a --- /dev/null +++ b/1985/lycklama/Makefile @@ -0,0 +1,26 @@ +# %W% %G% %U% +# +# 1985 makefile +# +# Copyright (c) 1985, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= lycklama + +all: ${WINNERS} + +lycklama: lycklama.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} + +install: all + @echo are you kidding'??' diff --git a/1985/lycklama/hint.html b/1985/lycklama/hint.html new file mode 100644 index 000000000..a1f7b329d --- /dev/null +++ b/1985/lycklama/hint.html @@ -0,0 +1,16 @@ +

The strangest appearing program

+ +

Ed Lycklama

+ +

Judges' comments:

+ +

Run the program without any arguments. Type in some very long lines +and notice how it redisplays it.

+ +

The program itself looks like tty noise. Notice that even ‘define’ in #define can be defined.

+ +

Copyright © 1985, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1985/lycklama/hint.text b/1985/lycklama/hint.text new file mode 100644 index 000000000..459cdd09d --- /dev/null +++ b/1985/lycklama/hint.text @@ -0,0 +1,16 @@ +# The strangest appearing program + +Ed Lycklama + +## Judges' comments: + +Run the program without any arguments. Type in some very long lines +and notice how it redisplays it. + +The program itself looks like tty noise. Notice that even 'define' in #define can be defined. + +Copyright (c) 1985, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1985/lycklama/lycklama.c b/1985/lycklama/lycklama.c new file mode 100644 index 000000000..d7a3776fd --- /dev/null +++ b/1985/lycklama/lycklama.c @@ -0,0 +1,17 @@ +#define o define +#o ___o write +#o ooo (unsigned) +#o o_o_ 1 +#o _o_ char +#o _oo goto +#o _oo_ read +#o o_o for +#o o_ main +#o o__ if +#o oo_ 0 +#o _o(_,__,___)(void)___o(_,__,ooo(___)) +#o __o (o_o_<<((o_o_<<(o_o_< +---end of program--- + 5) The C program must be written in common C. + That is, K&R plus common extensions (say 4.2 or Sys V C) + 6) The program must be of original work. + 7) The program must be a complete program. (i.e., not just a fragment) + 8) Entries must be received by me on or before June 8, 1985. + +POINTS: Each entry will be judged for its non-clarity. I will attempt to + run each of them on a Vax 780/4.2BSD system. Don't let the lack + of such a system stop you! Try to avoid operating system/machine + specific code if you do not have such a system. Extra points will + be given for program that: + + a) Able to pass lint without complaint + b) Actually does something interesting (not just exit) + c) are portable (i.e., no special calls of local features) + (long variable names will be allowed as needed) + +The names of the winners will be posted to net.lang.c. The winning +sources will be posted to net.sources. + +If you have any questions on the rules/points above, just ask via mail! + +chongo /\??/\ diff --git a/1985/shapiro/Makefile b/1985/shapiro/Makefile new file mode 100644 index 000000000..ce7ede796 --- /dev/null +++ b/1985/shapiro/Makefile @@ -0,0 +1,26 @@ +# %W% %G% %U% +# +# 1985 makefile +# +# Copyright (c) 1985, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= shapiro + +all: ${WINNERS} + +shaprio: shaprio.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} + +install: all + @echo are you kidding'??' diff --git a/1985/shapiro/hint.html b/1985/shapiro/hint.html new file mode 100644 index 000000000..ecd26c1f2 --- /dev/null +++ b/1985/shapiro/hint.html @@ -0,0 +1,20 @@ +

Grand prize for most well-rounded in confusion

+ +

Carl Shapiro

+ +

Judges' comments:

+ +

As submitted, this program was 3 lines (2 of defines and 1 of code). +To make news & mail happy we split the last line into 7. Join them +back without the newlines to get the original version.

+ +

This program was selected for the 1987 t-shirt collection.

+ +

We found this program is be simply amazeing! Run this program without +arguments and notice the output.

+ +

Copyright © 1985, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1985/shapiro/hint.text b/1985/shapiro/hint.text new file mode 100644 index 000000000..27e7fa750 --- /dev/null +++ b/1985/shapiro/hint.text @@ -0,0 +1,20 @@ +# Grand prize for most well-rounded in confusion + +Carl Shapiro + +## Judges' comments: + +As submitted, this program was 3 lines (2 of defines and 1 of code). +To make news & mail happy we split the last line into 7. Join them +back without the newlines to get the original version. + +This program was selected for the 1987 t-shirt collection. + +We found this program is be simply a**maze**ing! Run this program without +arguments and notice the output. + +Copyright (c) 1985, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1985/shapiro/shapiro.c b/1985/shapiro/shapiro.c new file mode 100644 index 000000000..9c8e4f35c --- /dev/null +++ b/1985/shapiro/shapiro.c @@ -0,0 +1,9 @@ +#define P(X)j=write(1,X,1) +#define C 39 +int M[5000]={2},*u=M,N[5000],R=22,a[4],l[]={0,-1,C-1,-1},m[]={1,-C,-1,C},*b=N, +*d=N,c,e,f,g,i,j,k,s;main(){for(M[i=C*R-1]=24;f|d>=b;){c=M[g=i];i=e;for(s=f=0; +s<4;s++)if((k=m[s]+g)>=0&&k=16!=M[k]>=16))a[f++ +]=s;if(f){f=M[e=m[s=a[rand()/(1+2147483647/f)]]+g];j=jb++?b[-1]:e;}P(" ");for(s=C;--s;P("_") +)P(" ");for(;P("\n"),R--;P("|"))for(e=C;e--;P("_ "+(*u++/8)%2))P("| "+(*u/4)%2 +);} diff --git a/1985/sicherman/Makefile b/1985/sicherman/Makefile new file mode 100644 index 000000000..a4a4eab16 --- /dev/null +++ b/1985/sicherman/Makefile @@ -0,0 +1,26 @@ +# %W% %G% %U% +# +# 1985 makefile +# +# Copyright (c) 1985, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= sicherman + +all: ${WINNERS} + +scherman: sicherman.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} + +install: all + @echo are you kidding'??' diff --git a/1985/sicherman/hint.html b/1985/sicherman/hint.html new file mode 100644 index 000000000..b385116a8 --- /dev/null +++ b/1985/sicherman/hint.html @@ -0,0 +1,30 @@ +

The worst abuse of the C preprocessor

+ +

Col. G. L. Sicherman

+ +

Judges' comments:

+ +

This program abuses the C preprocessor so much that some /lib/cpp’s fail to +strip out all of the comments on the first pass! If you were able to +understand Decot’s entry in 1984, you will have a head start on this +one.

+ +

Be sure to run this program through lint! If your lint works +correctly, it should warn you that the argument ‘Manual’ isn’t used. +Like the program says, what’s that mean?

+ +

Run the program without arguments and enter the letters ‘a’ thru ’m' +on a line. Now enter the letters ‘n’ thru ‘z’. But to borrow a quote +from Richard Stallman: If you think you understand what this code +does, then you don’t, so read it again! Explain why:

+ +
sicherman < sicherman.c | sicherman | diff - sicherman.c
+
+ +

results in diff reporting a difference on some machines.

+ +

Copyright © 1985, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1985/sicherman/hint.text b/1985/sicherman/hint.text new file mode 100644 index 000000000..d468db5f1 --- /dev/null +++ b/1985/sicherman/hint.text @@ -0,0 +1,29 @@ +# The worst abuse of the C preprocessor + +Col. G. L. Sicherman + +## Judges' comments: + +This program abuses the C preprocessor so much that some /lib/cpp's fail to +strip out all of the comments on the first pass! If you were able to +understand Decot's entry in 1984, you will have a head start on this +one. + +Be sure to run this program through lint! If your lint works +correctly, it should warn you that the argument 'Manual' isn't used. +Like the program says, what's that mean? + +Run the program without arguments and enter the letters 'a' thru 'm' +on a line. Now enter the letters 'n' thru 'z'. But to borrow a quote +from Richard Stallman: If you think you understand what this code +does, then you don't, so read it again! Explain why: + + sicherman < sicherman.c | sicherman | diff - sicherman.c + +results in diff reporting a difference on some machines. + +Copyright (c) 1985, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1985/sicherman/sicherman.c b/1985/sicherman/sicherman.c new file mode 100644 index 000000000..5070cc8de --- /dev/null +++ b/1985/sicherman/sicherman.c @@ -0,0 +1,23 @@ +#define C_C_(_)~' '&_ +#define _C_C(_)('\b'b'\b'>=C_C>'\t'b'\n') +#define C_C _|_ +#define b * +#define C /b/ +#define V _C_C( +main(C,V) +char **V; +/* C program. (If you don't + * understand it look it + */ up.) (In the C Manual) +{ + char _,__; + while (read(0,&__,1) & write((_=(_=C_C_(__),C)), + _C_,1)) _=C-V+subr(&V); +} +subr(C) +char *C; +{ + C="Lint says "argument Manual isn't used." What's that + mean?"; while (write((read(C_C('"'-'/*"'/*"*/))?__:__-_+ + '\b'b'\b'|((_-52)%('\b'b'\b'+C_C_('\t'b'\n'))+1),1),&_,1)); +} diff --git a/1986/1986.tar.bz2 b/1986/1986.tar.bz2 new file mode 100644 index 000000000..26c84f25a Binary files /dev/null and b/1986/1986.tar.bz2 differ diff --git a/1986/Makefile b/1986/Makefile new file mode 100644 index 000000000..81055fe8b --- /dev/null +++ b/1986/Makefile @@ -0,0 +1,72 @@ +#!/usr/bin/env make +# +# 1986 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############### +# IOCCC winners +############### +# +WINNERS= marshall hague applin bright stein holloway august pawka wall + +################### +# build all entries +################### +# +all: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + + +############### +# utility rules +############### +# +clean: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +clobber: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +install: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done diff --git a/1986/README b/1986/README new file mode 100644 index 000000000..25a232ac4 --- /dev/null +++ b/1986/README @@ -0,0 +1,20 @@ +The 1986 contest was named: "The Third International Obfuscated C Code Contest" + +Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + +The rules for 1986 suggested categories due to the success of the 1985 +judging method. The maximum size was increased from 512 to 1024 bytes. +Larry Bassel joined as the second official judge. + +A poll was taken for the worst code for BSD and System V program. +The Bourne Shell (/bin/sh) won for both systems. The BSD finger +program took third place. + +Rules and results were posted to net.lang.c and net.unix-wizards. +Micro/Systems Journal published started regular publishing of the winners. +The practice of making first announcement of the winners at the Summer +Usenix BOF started this year. A notice was posted to net.announce. diff --git a/1986/applin/Makefile b/1986/applin/Makefile new file mode 100644 index 000000000..00dd75078 --- /dev/null +++ b/1986/applin/Makefile @@ -0,0 +1,25 @@ +# %W% %G% %U% +# +# 1986 makefile +# +# Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= applin + +all: ${WINNERS} + +applin: applin.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} a.out +install: all + @echo are you kidding'??' diff --git a/1986/applin/applin.c b/1986/applin/applin.c new file mode 100644 index 000000000..2211eedf2 --- /dev/null +++ b/1986/applin/applin.c @@ -0,0 +1,15 @@ +cat =13 /*/ >/dev/null 2>&1; echo "Hello, world!"; exit +* +* This program works under cc, f77, and /bin/sh. +* +*/; main() { + write( +cat-~-cat + /*,'( +*/ + ,"Hello, world!" + , +cat); putchar(~-~-~-cat); } /* + ,)') + end +*/ diff --git a/1986/applin/hint.html b/1986/applin/hint.html new file mode 100644 index 000000000..e7cd86fef --- /dev/null +++ b/1986/applin/hint.html @@ -0,0 +1,21 @@ +

Most adaptable program

+ +

Jack Applin
+Hewlett-Packard
+Ft. Collins
+Colorado
+USA

+ +

Judges' comments:

+ +

Compile and/or execute as directed by the documentation.

+ +

The judges were so amused by this little program that we created an +award just for it. This program is portable to the C and Fortran 77 +compilers as well as executable by the bourne shell!

+ +

Copyright © 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1986/applin/hint.text b/1986/applin/hint.text new file mode 100644 index 000000000..ff9913ead --- /dev/null +++ b/1986/applin/hint.text @@ -0,0 +1,21 @@ +# Most adaptable program + +Jack Applin +Hewlett-Packard +Ft. Collins +Colorado +USA + +## Judges' comments: + +Compile and/or execute as directed by the documentation. + +The judges were so amused by this little program that we created an +award just for it. This program is portable to the C and Fortran 77 +compilers as well as executable by the bourne shell! + +Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1986/august/Makefile b/1986/august/Makefile new file mode 100644 index 000000000..31d45683b --- /dev/null +++ b/1986/august/Makefile @@ -0,0 +1,25 @@ +# %W% %G% %U% +# +# 1986 makefile +# +# Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= august + +all: ${WINNERS} + +august: august.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} a.out +install: all + @echo are you kidding'??' diff --git a/1986/august/august.c b/1986/august/august.c new file mode 100644 index 000000000..1a21ff692 --- /dev/null +++ b/1986/august/august.c @@ -0,0 +1,26 @@ +typedef struct n{int a:3, +b:29;struct n*c;}t;t* +f();r(){}m(u)t*u;{t*w,*z; +z=u->c,q(z),u->b=z->b*10, +w=u->c=f(),w->a=1,w->c=z-> +c;}t*k;g(u)t*u;{t*z,*v,*p, +*x;z=u->c,q(z),u->b=z->b,v +=z->c,z->a=2,x=z->c=f(),x +->a=3,x->b=2,p=x->c=f(),p +->c=f(),p->c->a=1,p->c->c= +v;}int i;h(u)t*u;{t*z,*v,* +w;int c,e;z=u->c,v=z->c,q( +v),c=u->b,e=v->b,u->b=z->b +,z->a=3,z->b=c+1,e+9>=c&&( +q(z),e=z->b,u->b+=e/c,w=f( +),w->b=e%c,w->c=z->c,u->c= +w);}int(*y[4])()={r,m,g,h}; +char *sbrk();main(){t*e,*p,*o; +o=f(),o->c=o,o->b=1,e=f(), +e->a=2,p=e->c=f(),p->b=2, +p->c=o,q(e),e=e->c,(void)write +(1,"2.",2);for(;;e=e->c){q(e), +e->b=write(1,&e->b["0123456789"], +1);}}t*f(){return i||(i=1000, +k=(t*)sbrk(i*sizeof(t))),k+--i; +}q(p)t*p;{(*y[p->a])(p);} diff --git a/1986/august/hint.html b/1986/august/hint.html new file mode 100644 index 000000000..b87cbde13 --- /dev/null +++ b/1986/august/hint.html @@ -0,0 +1,23 @@ +

Best complex task done in a complex way

+ +

Lennart Augustsson
+Dept. of Comp. Sci.
+Chalmers University of Technology,
+412 96 Gothenburg
+Sweden

+ +

Judges' comments:

+ +

This program computes a specific mathematical value. Simply compile +and give it an infinite amount of stack space and cpu time. Otherwise +just be satisfied with the approximation displayed just before the core +dump.

+ +

This program will pass lint on your system assuming your lint is brave +enough to try and parse it correctly.

+ +

Copyright © 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1986/august/hint.text b/1986/august/hint.text new file mode 100644 index 000000000..d74780046 --- /dev/null +++ b/1986/august/hint.text @@ -0,0 +1,23 @@ +# Best complex task done in a complex way + +Lennart Augustsson +Dept. of Comp. Sci. +Chalmers University of Technology, +412 96 Gothenburg +Sweden + +## Judges' comments: + +This program computes a specific mathematical value. Simply compile +and give it an infinite amount of stack space and cpu time. Otherwise +just be satisfied with the approximation displayed just before the core +dump. + +This program will pass lint on your system assuming your lint is brave +enough to try and parse it correctly. + +Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1986/bright/Makefile b/1986/bright/Makefile new file mode 100644 index 000000000..702b66c73 --- /dev/null +++ b/1986/bright/Makefile @@ -0,0 +1,25 @@ +# %W% %G% %U% +# +# 1986 makefile +# +# Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= bright + +all: ${WINNERS} + +bright: bright.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} a.out +install: all + @echo are you kidding'??' diff --git a/1986/bright/bright.c b/1986/bright/bright.c new file mode 100644 index 000000000..8c0481856 --- /dev/null +++ b/1986/bright/bright.c @@ -0,0 +1,47 @@ +#include +#define O1O printf +#define OlO putchar +#define O10 exit +#define Ol0 strlen +#define QLQ fopen +#define OlQ fgetc +#define O1Q abs +#define QO0 for +typedef char lOL; + +lOL*QI[] = {"Use:\012\011dump file\012","Unable to open file '\x25s'\012", + "\012"," ",""}; + +main(I,Il) +lOL*Il[]; +{ FILE *L; + unsigned lO; + int Q,OL[' '^'0'],llO = EOF, + + O=1,l=0,lll=O+O+O+l,OQ=056; + lOL*llL="%2x "; + (I != 1<<1&&(O1O(QI[0]),O10(1011-1010))), + ((L = QLQ(Il[O],"r"))==0&&(O1O(QI[O],Il[O]),O10(O))); + lO = I-(O<=' '&&l<='\~'; +} diff --git a/1986/bright/hint.html b/1986/bright/hint.html new file mode 100644 index 000000000..99f81b119 --- /dev/null +++ b/1986/bright/hint.html @@ -0,0 +1,22 @@ +

Most useful obfuscation

+ +

Walter Bright

+ +

Judges' comments:

+ +

Compile this program and give filenames as arguments. For example try:

+ +
bright bright.c
+bright bright
+
+ +

Mr. Bright exploits the c pre-processor, similar variables and +excessive shifting to obfuscate an otherwise useful binary display +program. This gives you a small example of what it is like to +maintain the Bourne shell! :-}

+ +

Copyright © 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1986/bright/hint.text b/1986/bright/hint.text new file mode 100644 index 000000000..b387080de --- /dev/null +++ b/1986/bright/hint.text @@ -0,0 +1,21 @@ +# Most useful obfuscation + +Walter Bright + +## Judges' comments: + +Compile this program and give filenames as arguments. For example try: + + bright bright.c + bright bright + +Mr. Bright exploits the c pre-processor, similar variables and +excessive shifting to obfuscate an otherwise useful binary display +program. This gives you a small example of what it is like to +maintain the Bourne shell! :-} + +Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1986/hague/Makefile b/1986/hague/Makefile new file mode 100644 index 000000000..b4ff6518f --- /dev/null +++ b/1986/hague/Makefile @@ -0,0 +1,25 @@ +# %W% %G% %U% +# +# 1986 makefile +# +# Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= hague + +all: ${WINNERS} + +hague: hague.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} a.out +install: all + @echo are you kidding'??' diff --git a/1986/hague/hague.c b/1986/hague/hague.c new file mode 100644 index 000000000..bf43532b3 --- /dev/null +++ b/1986/hague/hague.c @@ -0,0 +1,28 @@ +#define DIT ( +#define DAH ) +#define __DAH ++ +#define DITDAH * +#define DAHDIT for +#define DIT_DAH malloc +#define DAH_DIT gets +#define _DAHDIT char +_DAHDIT _DAH_[]="ETIANMSURWDKGOHVFaLaPJBXCYZQb54a3d2f16g7c8a90l?e'b.s;i,d:" +;main DIT DAH{_DAHDIT +DITDAH _DIT,DITDAH DAH_,DITDAH DIT_, +DITDAH _DIT_,DITDAH DIT_DAH DIT +DAH,DITDAH DAH_DIT DIT DAH;DAHDIT +DIT _DIT=DIT_DAH DIT 81 DAH,DIT_=_DIT +__DAH;_DIT==DAH_DIT DIT _DIT DAH;__DIT +DIT'\n'DAH DAH DAHDIT DIT DAH_=_DIT;DITDAH +DAH_;__DIT DIT DITDAH +_DIT_?_DAH DIT DITDAH DIT_ DAH:'?'DAH,__DIT +DIT' 'DAH,DAH_ __DAH DAH DAHDIT DIT +DITDAH DIT_=2,_DIT_=_DAH_; DITDAH _DIT_&&DIT +DITDAH _DIT_!=DIT DITDAH DAH_>='a'? DITDAH +DAH_&223:DITDAH DAH_ DAH DAH; DIT +DITDAH DIT_ DAH __DAH,_DIT_ __DAH DAH +DITDAH DIT_+= DIT DITDAH _DIT_>='a'? DITDAH _DIT_-'a':0 +DAH;}_DAH DIT DIT_ DAH{ __DIT DIT +DIT_>3?_DAH DIT DIT_>>1 DAH:'\0'DAH;return +DIT_&1?'-':'.';}__DIT DIT DIT_ DAH _DAHDIT +DIT_;{DIT void DAH write DIT 1,&DIT_,1 DAH;} diff --git a/1986/hague/hint.html b/1986/hague/hint.html new file mode 100644 index 000000000..4a023947d --- /dev/null +++ b/1986/hague/hint.html @@ -0,0 +1,25 @@ +

Worst abuse of the C preprocessor

+ +

Jim Hague
+University of Kent at Canterbury
+Canterbury, Kent
+UK

+ +

Judges' comments:

+ +

Compile this program and feed ascii text into standard input. This +program is known to pass lint on some systems and abort lint on +others.

+ +

This program was selected for the 1987 t-shirt collection.

+ +

Think morse code when you ponder this program. Note how use of +similar variables can be obfuscating! The author notes that this +program implements the international morse standard. Now for extra +credit, what morse message does the program spell out?

+ +

Copyright © 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1986/hague/hint.text b/1986/hague/hint.text new file mode 100644 index 000000000..050805d2a --- /dev/null +++ b/1986/hague/hint.text @@ -0,0 +1,25 @@ +# Worst abuse of the C preprocessor + +Jim Hague +University of Kent at Canterbury +Canterbury, Kent +UK + +## Judges' comments: + +Compile this program and feed ascii text into standard input. This +program is known to pass lint on some systems and abort lint on +others. + +This program was selected for the 1987 t-shirt collection. + +Think morse code when you ponder this program. Note how use of +similar variables can be obfuscating! The author notes that this +program implements the international morse standard. Now for extra +credit, what morse message does the program spell out? + +Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1986/holloway/Makefile b/1986/holloway/Makefile new file mode 100644 index 000000000..ab6ecf887 --- /dev/null +++ b/1986/holloway/Makefile @@ -0,0 +1,25 @@ +# %W% %G% %U% +# +# 1986 makefile +# +# Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= holloway + +all: ${WINNERS} + +holloway: holloway.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} a.out +install: all + @echo are you kidding'??' diff --git a/1986/holloway/hint.html b/1986/holloway/hint.html new file mode 100644 index 000000000..1291ac5af --- /dev/null +++ b/1986/holloway/hint.html @@ -0,0 +1,19 @@ +

Best simple task performed in a complex way

+ +

Bruce Holloway
+Digital Research, Inc.
+Monterey, CA
+USA

+ +

Judges' comments:

+ +

Believe it or not, this is the old standard “Hello, world” program +performed in a very complex way. The judges and the author defy you +do determine how it does it. It is a good thing that K&R didn’t use +this version as the first C program!

+ +

Copyright © 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1986/holloway/hint.text b/1986/holloway/hint.text new file mode 100644 index 000000000..72b5ba013 --- /dev/null +++ b/1986/holloway/hint.text @@ -0,0 +1,19 @@ +# Best simple task performed in a complex way + +Bruce Holloway +Digital Research, Inc. +Monterey, CA +USA + +## Judges' comments: + +Believe it or not, this is the old standard "Hello, world" program +performed in a very complex way. The judges and the author defy you +do determine how it does it. It is a good thing that K&R didn't use +this version as the first C program! + +Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1986/holloway/holloway.c b/1986/holloway/holloway.c new file mode 100644 index 000000000..e894200f0 --- /dev/null +++ b/1986/holloway/holloway.c @@ -0,0 +1,33 @@ +#include "stdio.h" +#define e 3 +#define g (e/e) +#define h ((g+e)/2) +#define f (e-g-h) +#define j (e*e-g) +#define k (j-h) +#define l(x) tab2[x]/h +#define m(n,a) ((n&(a))==(a)) + +long tab1[]={ 989L,5L,26L,0L,88319L,123L,0L,9367L }; +int tab2[]={ 4,6,10,14,22,26,34,38,46,58,62,74,82,86 }; + +main(m1,s) char *s; { + int a,b,c,d,o[k],n=(int)s; + if(m1==1){ char b[2*j+f-g]; main(l(h+e)+h+e,b); printf(b); } + else switch(m1-=h){ + case f: + a=(b=(c=(d=g)<=e)for(b=g<Best layout + +

Eric Marshall
+System Development Corporation, a Burroughs Company
+P.O. Box 517
+Paoli, PA.
+19301

+ +

Judges' comments:

+ +

This program prints the name of the picture. The layout is somewhat +pretty through it is not the usual sort of output one would expect +from printing a program!

+ +

This program was selected for the 1987 t-shirt collection.

+ +

This program is known to give some C compilers a problems.

+ +

Copyright © 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1986/marshall/hint.text b/1986/marshall/hint.text new file mode 100644 index 000000000..ac079f839 --- /dev/null +++ b/1986/marshall/hint.text @@ -0,0 +1,23 @@ +# Best layout + +Eric Marshall +System Development Corporation, a Burroughs Company +P.O. Box 517 +Paoli, PA. +19301 + +# Judges' comments: + +This program prints the name of the picture. The layout is somewhat +pretty through it is not the usual sort of output one would expect +from printing a program! + +This program was selected for the 1987 t-shirt collection. + +This program is known to give some C compilers a problems. + +Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1986/marshall/marshall.c b/1986/marshall/marshall.c new file mode 100644 index 000000000..b4484035a --- /dev/null +++ b/1986/marshall/marshall.c @@ -0,0 +1,14 @@ + extern int + errno + ;char + grrr + ;main( r, + argv, argc ) int argc , + r ; char *argv[];{int P( ); +#define x int i, j,cc[4];printf(" choo choo\n" ) ; +x ;if (P( ! i ) | cc[ ! j ] +& P(j )>2 ? j : i ){* argv[i++ +!-i] +; for (i= 0;; i++ ); +_exit(argv[argc- 2 / cc[1*argc]|-1<<4 ] ) ;printf("%d",P(""));}} + P ( a ) char a ; { a ; while( a > " B " + /* - by E ricM arsh all- */); } diff --git a/1986/pawka/Makefile b/1986/pawka/Makefile new file mode 100644 index 000000000..166227697 --- /dev/null +++ b/1986/pawka/Makefile @@ -0,0 +1,25 @@ +# %W% %G% %U% +# +# 1986 makefile +# +# Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= pawka + +all: ${WINNERS} + +pawka: pawka.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} a.out +install: all + @echo are you kidding'??' diff --git a/1986/pawka/hint.html b/1986/pawka/hint.html new file mode 100644 index 000000000..5b728de6d --- /dev/null +++ b/1986/pawka/hint.html @@ -0,0 +1,18 @@ +

Most illegible code

+ +

Michael H. Pawka
+Naval Ocean Systems Center
+San Diego, Ca
+92152

+ +

Judges' comments:

+ +

The judges found this entry to be one of hardest to read without the +aid of /lib/cpp and a good editor. When run, the program asks if it +is obfuscated, of all things!

+ +

Copyright © 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1986/pawka/hint.text b/1986/pawka/hint.text new file mode 100644 index 000000000..aac527ffa --- /dev/null +++ b/1986/pawka/hint.text @@ -0,0 +1,18 @@ +# Most illegible code + +Michael H. Pawka +Naval Ocean Systems Center +San Diego, Ca +92152 + +## Judges' comments: + +The judges found this entry to be one of hardest to read without the +aid of `/lib/cpp` and a good editor. When run, the program asks if it +is obfuscated, of all things! + +Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1986/pawka/pawka.c b/1986/pawka/pawka.c new file mode 100644 index 000000000..8ba9e9d95 --- /dev/null +++ b/1986/pawka/pawka.c @@ -0,0 +1,18 @@ +#include "stdio.h" +#define xyxx char +#define xyyxx putchar +#define xyyyxx while +#define xxyyyx int +#define xxxyyx main +#define xyxyxy if +#define xyyxyy '\n' +xyxx *xyx [] = { +"]I^x[I]k\\I^o[IZ~\\IZ~[I^|[I^l[I^j[I^}[I^n[I]m\\I]h", +"]IZx\\IZx[IZk\\IZk[IZo_IZ~\\IZ~[IZ|_IZl_IZj\\IZj]IZ}]IZn_IZm\\IZm_IZh", +"]IZx\\IZx[I^k[I\\o]IZ~\\IZ~\\I]|[IZl_I^j]IZ}]I^n[IZm\\IZm_IZh", +"]IZx\\IZx[IZk\\IZk[IZo_IZ~\\IZ~_IZ|[IZl_IZj\\IZj]IZ}]IZn_IZm\\IZm]IZh", +"]I^x[I]k\\IZo_I^~[I^|[I^l[IZj\\IZj]IZ}]I^n[I]m^IZh",'\0'};/*xyyxyxyxxxyxxxyy*/ +xyxx *xyyx; xxyyyx xyyyx,xyyyyx,xyyyyyx=0x59,xyyyyyyx=0x29,/*yxxyxyyyxxyyyxyy*/ +xxyx=0x68;xxxyyx(){xyyyyx=0;xyyyxx(xyx[xyyyyx]){xyyx=xyx[xyyyyx++];/*xyyyxxyx*/ +xyyyxx(*xyyx){xyyyx= *xyyx++-xyyyyyx;xyyyxx(xyyyx--)xyyxx(*xyyx-xyyyyyyx);/*x*/ +xyxyxy(*xyyx==xxyx)xyyxx(xyyxyy);*xyyx++;}}}/*xyxyxyyyyxxyxxxyyyxyyyxyxxyyy*/ diff --git a/1986/rules b/1986/rules new file mode 100644 index 000000000..d22441650 --- /dev/null +++ b/1986/rules @@ -0,0 +1,109 @@ +Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + +WARNING: The rules and mailing address for the contest change from year + to year. Be sure that you consult the current set of rules + before submitting entries. +------------------------------------------------------------------------------- + +Subject: Third International Obfuscated C Code Contest Rules +Newsgroups: net.lang.c +Keywords: rules,1986,obfuscate,contest + +GOAL: To write the most Obscure working C program following the rules below: + +RULES: 1) The source must be 1024 bytes or less. NO exceptions! + + 2) Include in your letter: + a) Name (or anonymous), Company/School, City, State and Country. + b) Your path from a major network site, if applicable. + c) A brief statement of what the program should do. + d) The Machine(s)/Operating system(s) on which it runs. + e) Enclose your source between the following lines: + ---start of program--- + + ---end of program--- + + 3) The entry should be written in common C. (K&R + common extensions) + + 4) The program must be of original work. All programs must be + in the public domain. All copyrighted programs will be rejected. + + 5) Entries must be received between 31-Mar-86 and 30-May-86 0:00 GMT. + Email your entries to: + + decwrl!nsc!obfuscate + + Entries sent by UUCP Email will be confirmed starting 1-May-86. + People are encouraged to submit entries via Email, however one may + mail entries the following address: + + International Obfuscated C Code Contest + National Semiconductor + Attn: Landon Noll Mail Stop: 7c266 + 1135 Kern Ave. + Sunnyvale, CA 94086 + U.S.A. + +AWARDS: Winners of each category and the best of Show will be posted to + net.announce as well as being published in the May 86 issue of the + "Micro/Systems Journal". Winners also get to receive international + fame/flame for their efforts! + +JUDGING: Awards will be given to the best entry in a number of categories. + The actual category list will vary depending on the types of entries + we receive. At the moment, we are considering using the following: + + * The most obscure algorithm + * The worst abuse of the C preprocessor + * The strangest source layout + * The best small one line program + * The most useful program + * + + Judging will be done by myself, Larry Bassel and other local people + who are willing to help out. + + We will attempt to run each of them on a Vax 785/4.2BSD system. + Don't let the lack of such a system stop you! Try to avoid operating + system/machine specific code if you do not have such a system. + Extra points will be given for programs which: + + a) pass lint without complaint + b) do something quasi-interesting + c) are portable + + A larger program size was selected to allow for a wider range of + program ideas. However if you don't need 1024 bytes don't use them. + Given two programs with similar techniques and similar levels of + obfuscation, we will tend to favor the more concise entry. + +POLL: We want to know what you think is the most poorly coded utility + released with 4.xBSD and/or Sys V. The top results plus the + best flames will be posted along with the contest results. + To vote, please follow the guidelines below: + + 1) Include at the top of the letter: + a) Name (or anonymous), Company/School, City, State and Country. + b) Your path from a major network site, if applicable. + c) the name of the poorly coded utility + d) the name of the operating system on which it is found + e) the line: <<>> + f) up to 1024 bytes of flames + g) the line: <<>> + + 2) Confine your vote to the standard set of commands. I.e., don't + flame about local commands or user contributed software. + + 3) Submit your votes via Email to: + + for 4.xBSD: decwrl!nsc!bsd_util + for Sys V: decwrl!nsc!sysV_util + + or, you may send your votes by letter to the same address used by + the contest. Please place your votes on different sheets of paper. + +chongo /\cc/\ diff --git a/1986/stein/Makefile b/1986/stein/Makefile new file mode 100644 index 000000000..87b3fdf16 --- /dev/null +++ b/1986/stein/Makefile @@ -0,0 +1,27 @@ +# %W% %G% %U% +# +# 1986 makefile +# +# Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= stein + +all: ${WINNERS} + +stein: stein.c + -rm -f a.out + cc $? -o $@ + -ln $@ a.out + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} a.out +install: all + @echo are you kidding'??' diff --git a/1986/stein/hint.html b/1986/stein/hint.html new file mode 100644 index 000000000..96c048ae3 --- /dev/null +++ b/1986/stein/hint.html @@ -0,0 +1,25 @@ +

Best one liner

+ +

Jan Stein

+ +

Judges' comments:

+ +

NOTE: to avoid problems with news and mail, the single line was split +into 3 lines. Join all lines into a single line to recreate +the original file.

+ +

Compile and link to a filename called ‘a.out’. Try the program with the +following argument:

+ +
a.out ^N^N
+
+ +

(^N is ASCII control-N). One some machines, ^ML is needed to get it to +output cleanly. Your system may require another set of characters. +In time, you will figure out what it does. :-)

+ +

Copyright © 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1986/stein/hint.text b/1986/stein/hint.text new file mode 100644 index 000000000..367b9f068 --- /dev/null +++ b/1986/stein/hint.text @@ -0,0 +1,24 @@ +# Best one liner + +Jan Stein + +Judges' comments: + +> NOTE: to avoid problems with news and mail, the single line was split +> into 3 lines. Join all lines into a single line to recreate +> the original file. + +Compile and link to a filename called 'a.out'. Try the program with the +following argument: + + a.out ^N^N + +(^N is ASCII control-N). One some machines, ^M^L is needed to get it to +output cleanly. Your system may require another set of characters. +In time, you will figure out what it does. :-) + +Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1986/stein/stein.c b/1986/stein/stein.c new file mode 100644 index 000000000..cf731c84a --- /dev/null +++ b/1986/stein/stein.c @@ -0,0 +1,3 @@ +typedef char*z;O;o;_=33303285;main(b,Z)z Z;{b=(b>=0||(main(b+1,Z+1),*Z=O%(o=(_% +25))+'0',O/=o,_/=25))&&(b<1||(O=time(&b)%0250600,main(~5,*(z*)Z),write(1,*(z*)Z +,9)));} diff --git a/1986/wall/Makefile b/1986/wall/Makefile new file mode 100644 index 000000000..77b894c02 --- /dev/null +++ b/1986/wall/Makefile @@ -0,0 +1,25 @@ +# %W% %G% %U% +# +# 1986 makefile +# +# Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= wall + +all: ${WINNERS} + +wall: wall.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} a.out +install: all + @echo are you kidding'??' diff --git a/1986/wall/hint.html b/1986/wall/hint.html new file mode 100644 index 000000000..d80b57e07 --- /dev/null +++ b/1986/wall/hint.html @@ -0,0 +1,25 @@ +

The grand prize in most well-rounded in confusion

+ +

Larry Wall
+System Development Corporation
+Santa Monica
+California
+US of A

+ +

Judges' comments:

+ +

The original version did not have a ‘;’ character in the first line. +This caused a number of System V C pre-preprocessors to gripe about a +syntax error.

+ +

This program is a masterpiece of obfuscation and humor. Larry Wall +(the hacker who gave us rn and patch) asks you to compile and consider +the warning message generated by the C compiler. Then execute the +program and type charters into its standard input. You will see why +the compiler documents the program.

+ +

Copyright © 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1986/wall/hint.text b/1986/wall/hint.text new file mode 100644 index 000000000..ed0eb46f6 --- /dev/null +++ b/1986/wall/hint.text @@ -0,0 +1,25 @@ +# The grand prize in most well-rounded in confusion + +Larry Wall +System Development Corporation +Santa Monica +California +US of A + +## Judges' comments: + +The original version did not have a ';' character in the first line. +This caused a number of System V C pre-preprocessors to gripe about a +syntax error. + +This program is a masterpiece of obfuscation and humor. Larry Wall +(the hacker who gave us rn and patch) asks you to compile and consider +the warning message generated by the C compiler. Then execute the +program and type charters into its standard input. You will see why +the compiler documents the program. + +Copyright (c) 1986, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1986/wall/wall.c b/1986/wall/wall.c new file mode 100644 index 000000000..836cb51d5 --- /dev/null +++ b/1986/wall/wall.c @@ -0,0 +1,78 @@ +#define _c(C)_ (C)&('|'+3):c_()(C)>>('\n'-3) __; /**/ +#define C char* +#define keyboard ",,B3-u;.(&*5., /(b*(1\036!a%\031m,,,,,\r\n" +#define main(o,oo)oo(o){ +#define _ ;case +C +#define c_(cc)c cc= +#define C_(sand)_O(sand)witch +o=keyboard; +#define __ ;break; +C +ccc( +cc) +C +cc; +{ +C +cccc= +cc;int +#ifndef lint +#define keyboard "dijs QH.soav Vdtnsaoh DmfpaksoQz;kkt oa, -dijs" +#endif +c; +main(;c_(=(*cc);*cc++)c,for); +#define _O(s)s +main(0xb+(c>>5),C_(s)) +_'\v' +:__ _'\f': +main(c,C_(s)); +_c(8098)_c(6055)_c(14779)_c(10682) +#define O_(O)_O(O)stem(ccc( +_c(15276)_c(11196)_c(15150) +#define _C ;return +_c(11070)_c(15663)_c(11583) +} +__ +default +:c_(+)o[c&__LINE__-007]; +main(c_(-)'-'-1,C_(s))_ +0214 +:_ +0216 +:c_(+)025 _ +0207 +:c_(-)4 _ +0233 +:c_(+)' '-1; +}}c_(&)'z'+5; +}_C cccc; +}main(,cc) +C +#define O write(1, +c="O"; +O_(sy) keyboard)); +main(;;,for); +read(0, +c,1);* +c_(&)'~'+1 +;O ccc( +c), +'\0'); +main(*c, +C_(s));_ +4 +:O_(sy)";kkt -oa, dijszdijs QQ"))_C +_ +13 +:O o+' ', +3 +) +#undef main +__ _ 127:O"\b \b",3)__ +default +:O +c,1) +__}}}main(){ +cc(); +} diff --git a/1987/1987.tar.bz2 b/1987/1987.tar.bz2 new file mode 100644 index 000000000..37cd2ae20 Binary files /dev/null and b/1987/1987.tar.bz2 differ diff --git a/1987/Makefile b/1987/Makefile new file mode 100644 index 000000000..5948a73e0 --- /dev/null +++ b/1987/Makefile @@ -0,0 +1,77 @@ +#!/usr/bin/env make +# +# 1987 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# for System V style systems +OPSYS= -Dindex=strchr +# for BSD style systems +#OPSYS= + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############### +# IOCCC winners +############### +# +WINNERS= heckbert wall westley hines korn biggar lievaart + +################### +# build all entries +################### +# +all: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) OPSYS=${OPSYS} $@)"; \ + (cd $$i && $(MAKE) "OPSYS=${OPSYS}" $@); \ + done + + +############### +# utility rules +############### +# +clean: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +clobber: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +install: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done diff --git a/1987/README b/1987/README new file mode 100644 index 000000000..672af5387 --- /dev/null +++ b/1987/README @@ -0,0 +1,21 @@ +1987 marked the "The Fourth International Obfuscated C Code Contest" + +Copyright (c) 1987, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + +The rules for 1987 suggested even more categories than in 1986. Hints +for what to do and not to do were also given in the rules. For +example, a simple excessive abuse of /lib/cpp was discouraged unless +the abuse was unusual. The mailboxes for the contest were moved from +nsc to amdahl. The practice of posting a preliminary set of rules for +the next year was started this year. + +Rules and results were posted to comp.lang.c, comp.unix.wizards with +an announcement in news.announce.important. Micro/Systems Journal +published the 1987 winners. Mark Horton included a version of the 1987 +winners in an appendix of his C book. The first announcement of +winners at the Summer 87 Usenix was helped by a small fly that +danced all over the foils. diff --git a/1987/biggar/Makefile b/1987/biggar/Makefile new file mode 100644 index 000000000..ada5c3cd3 --- /dev/null +++ b/1987/biggar/Makefile @@ -0,0 +1,32 @@ +# %W% %G% %U% +# +# 1987 makefile +# +# Copyright (c) 1987, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= biggar + +# for System V style systems +OPSYS= -Dindex=strchr +# for BSD style systems +#OPSYS= + +all: ${WINNERS} + +biggar: biggar.c + cc -DC="R>0" -DI="if(T)O" -DO="c=write(1,&c,1);" \ + -DP="main(){X}" -DR="read(0,&c,1)" -DT="c!=015" \ + -DW="while(C)I" -DX="char c;W" $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} +install: all + @echo are you kidding'??' diff --git a/1987/biggar/biggar.c b/1987/biggar/biggar.c new file mode 100644 index 000000000..650e9c7b2 --- /dev/null +++ b/1987/biggar/biggar.c @@ -0,0 +1 @@ +P; diff --git a/1987/biggar/hint.html b/1987/biggar/hint.html new file mode 100644 index 000000000..cdcb5e963 --- /dev/null +++ b/1987/biggar/hint.html @@ -0,0 +1,44 @@ +

Best Abuse of the Rules

+ +

Mark Biggar
+UNiSYS - System Development Group, Santa Monica
+2525 Colorado AV MD 91-01
+Santa Monica, CA
+90406

+ +

Judges' comments:

+ +

To build:

+ +
cc -DC="R>0" -DI="if(T)O" -DO="c=write(1,&c,1);" -DP="main(){X}"\
+-DR="read(0,&c,1)" -DT="c!=015" -DW="while(C)I" -DX="char c;W" markb.c
+
+ +

Passes BSD and UTS lint. At least one version of lint is thrown into +an infinite loop by this entry.

+ +

Try:

+ +
... | markb | od -c (remember to compile as indicated above)
+
+ +

By changing the compile line you can make this program do anything you +want. This is a very efficient way to transfer source, though it +increases the size of Makefiles.

+ +

With only slight variations, this program can be set to many uses. +Consider how easy it would be to release Un*x source in this form; +so what if the make files grow a little! :-)

+ +

One vendor’s lint got hung in an infinite loop over this entry!

+ +

FYI: We will let Mark get away with this truly sick entry this time, but +for the future on we have placed a limit on the size of a compile line.

+ +

Also see our comment in Larry Wall’s entry regarding Mark’s contribution.

+ +

Copyright © 1987, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1987/biggar/hint.text b/1987/biggar/hint.text new file mode 100644 index 000000000..91cf8b559 --- /dev/null +++ b/1987/biggar/hint.text @@ -0,0 +1,43 @@ +# Best Abuse of the Rules + +Mark Biggar +UNiSYS - System Development Group, Santa Monica +2525 Colorado AV MD 91-01 +Santa Monica, CA +90406 + +## Judges' comments: + +### To build: + + cc -DC="R>0" -DI="if(T)O" -DO="c=write(1,&c,1);" -DP="main(){X}"\ + -DR="read(0,&c,1)" -DT="c!=015" -DW="while(C)I" -DX="char c;W" markb.c + +Passes BSD and UTS lint. At least one version of lint is thrown into +an infinite loop by this entry. + +### Try: + + ... | markb | od -c (remember to compile as indicated above) + + +By changing the compile line you can make this program do anything you +want. This is a very efficient way to transfer source, though it +increases the size of Makefiles. + +With only slight variations, this program can be set to many uses. +Consider how easy it would be to release Un*x source in this form; +so what if the make files grow a little! :-) + +One vendor's lint got hung in an infinite loop over this entry! + +> FYI: We will let Mark get away with this truly sick entry this time, but +> for the future on we have placed a limit on the size of a compile line. + +Also see our comment in Larry Wall's entry regarding Mark's contribution. + +Copyright (c) 1987, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1987/heckbert/Makefile b/1987/heckbert/Makefile new file mode 100644 index 000000000..286328f3b --- /dev/null +++ b/1987/heckbert/Makefile @@ -0,0 +1,30 @@ +# %W% %G% %U% +# +# 1987 makefile +# +# Copyright (c) 1987, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= heckbert + +# for System V style systems +OPSYS= -Dindex=strchr +# for BSD style systems +#OPSYS= + +all: ${WINNERS} + +heckbert: heckbert.c + cc ${OPSYS} $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} +install: all + @echo are you kidding'??' diff --git a/1987/heckbert/heckbert.c b/1987/heckbert/heckbert.c new file mode 100644 index 000000000..ccdb7e0b7 --- /dev/null +++ b/1987/heckbert/heckbert.c @@ -0,0 +1,18 @@ +#include +#include +#define _ define +#_ A putchar +#_ B return +#_ C index +char*r,c[300001],*d=">=<=!===||&&->++-->><<",*i,*l,*j,*m,*k,*n,*h,*y;e,u=1,v,w, +f=1,p,s,x;main(a,b)char**b;{p=a>1?atoi(b[1]):79;r=c+read(0,j=l=i=c,300000);v=g( +j,&m);for(k=m;v!=2;j=k,m=n,v=w,k=m){w=g(k,&n);if(v==1&&m-j==1&&*j==35)e&&A(10), +e=f=0;if(!f&&v==3&&(char*)C(j,10)2&&(u||w)&&(f||u)&& +(l-i>1||*i!=61||n-k>1||!C("-*&",*k)))continue;else if(v==3)if(f&&e+1+n-k>p&&e)A +(10),e=0;else A(32),e++;else{if(f&&e+m-j>p&&e)A(10),e=0;e+=m-j;k=j;while(k=r)B*m=j,2;s=isdigit(*j)|| +*j==46&&isdigit(j[1]);for(h=j;hj)B*m=h,0;x=1;for(h=j;hj)h--,x=3;if(*j==34||*j==39)for(h=j+1;hBest Obfuscator of Programs + +

Paul Heckbert
+Pixar

+ +

Judges' comments:

+ +

Try:

+ +
ph 40 < ph.c > foo.c; cc foo.c -o ph
+ph 20 < a_C_prog.c > bar.c; cc bar.c
+
+ +

The judges used this program to fold up very long lines which the +BSD fold(1) was unable to process. This program has been added +to the contest tool chest.

+ +

On System V systems, compile with: -Dindex=strchr +To compile on a 16 bit machine, change 300000’s to 30000.

+ +

Copyright © 1987, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1987/heckbert/hint.text b/1987/heckbert/hint.text new file mode 100644 index 000000000..445b201e4 --- /dev/null +++ b/1987/heckbert/hint.text @@ -0,0 +1,24 @@ +# Best Obfuscator of Programs + +Paul Heckbert +Pixar + +## Judges' comments: + + +### Try: + ph 40 < ph.c > foo.c; cc foo.c -o ph + ph 20 < a_C_prog.c > bar.c; cc bar.c + +The judges used this program to fold up very long lines which the +BSD fold(1) was unable to process. This program has been added +to the contest tool chest. + +On System V systems, compile with: `-Dindex=strchr` +To compile on a 16 bit machine, change 300000's to 30000. + +Copyright (c) 1987, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1987/hines/Makefile b/1987/hines/Makefile new file mode 100644 index 000000000..11abeda39 --- /dev/null +++ b/1987/hines/Makefile @@ -0,0 +1,30 @@ +# %W% %G% %U% +# +# 1987 makefile +# +# Copyright (c) 1987, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= hines + +# for System V style systems +OPSYS= -Dindex=strchr +# for BSD style systems +#OPSYS= + +all: ${WINNERS} + +hines: hines.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} +install: all + @echo are you kidding'??' diff --git a/1987/hines/hines.c b/1987/hines/hines.c new file mode 100644 index 000000000..9b6beea39 --- /dev/null +++ b/1987/hines/hines.c @@ -0,0 +1,19 @@ +#include +#include +main(togo,toog) +int togo; +char *toog[]; +{char *ogto, tgoo[80];FILE *ogot; int oogt=0, ootg, otog=79, +ottg=1;if ( togo== ottg) goto gogo; goto goog; ggot: +if ( fgets( tgoo, otog, ogot)) goto gtgo; goto gott; +gtot: exit(); ogtg: ++oogt; goto ogoo; togg: if ( ootg > 0) +goto oggt; goto ggot; ogog: if ( !ogot) goto gogo; +goto ggto; gtto: printf( "%d goto \'s\n", oogt); goto +gtot; oggt: if ( !memcmp( ogto, "goto", 4)) goto otgg; +goto gooo; gogo: exit( ottg); tggo: ootg= strlen(tgoo); +goto tgog; oogo: --ootg; goto togg; gooo: ++ogto; goto +oogo; gott: fclose( ogot); goto gtto; otgg: ogto= ogto +3; +goto ogtg; tgog: ootg-=4;goto togg; gtgo: ogto= tgoo; +goto tggo; ogoo: ootg-=3;goto gooo; goog: ogot= fopen( +toog[ ottg], "r"); goto ogog; ggto: ogto= tgoo; goto +ggot;} diff --git a/1987/hines/hint.html b/1987/hines/hint.html new file mode 100644 index 000000000..25adc4180 --- /dev/null +++ b/1987/hines/hint.html @@ -0,0 +1,29 @@ +

Worst Style

+ +

Spencer Hines
+OnLine Computer Systems
+4200 Farragut Street
+Hyattsville, MD
+20781
+USA

+ +

Judges' comments:

+ +

Try:

+ +
hines hines.c
+
+ +

This program was designed to maximize the bother function for +structured programmers. This program takes goto statements to their +logical conclusion. The layout and choice of names are classic.

+ +

We consider this to be a beautiful counter-example for Frank Rubin’s +letter to ACM form titled: “GOTO Considered Harmful” Considered Harmful. +See the Communications of the ACM, March 1987, Page 195-196.

+ +

Copyright © 1987, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1987/hines/hint.text b/1987/hines/hint.text new file mode 100644 index 000000000..640c73a24 --- /dev/null +++ b/1987/hines/hint.text @@ -0,0 +1,28 @@ +# Worst Style + +Spencer Hines +OnLine Computer Systems +4200 Farragut Street +Hyattsville, MD +20781 +USA + +## Judges' comments: + +### Try: + + hines hines.c + +This program was designed to maximize the bother function for +structured programmers. This program takes goto statements to their +logical conclusion. The layout and choice of names are classic. + +We consider this to be a beautiful counter-example for Frank Rubin's +letter to ACM form titled: *"GOTO Considered Harmful" Considered Harmful*. +See the Communications of the ACM, March 1987, Page 195-196. + +Copyright (c) 1987, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1987/korn/Makefile b/1987/korn/Makefile new file mode 100644 index 000000000..30c4e2b00 --- /dev/null +++ b/1987/korn/Makefile @@ -0,0 +1,30 @@ +# %W% %G% %U% +# +# 1987 makefile +# +# Copyright (c) 1987, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= korn + +# for System V style systems +OPSYS= -Dindex=strchr +# for BSD style systems +#OPSYS= + +all: ${WINNERS} + +korn: korn.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} +install: all + @echo are you kidding'??' diff --git a/1987/korn/hint.html b/1987/korn/hint.html new file mode 100644 index 000000000..8d87b6b6b --- /dev/null +++ b/1987/korn/hint.html @@ -0,0 +1,56 @@ +

Best One Liner

+ +

David Korn
+AT&T Bell Labs
+MH 3C-526B, AT&T Bell Labs
+Murray Hill, NJ
+07974
+USA

+ +

Judges' comments:

+ +

The Judges believe that this is the best one line entry ever received. +Compile on a UN*X system, or at least using a C implementation that +fakes it. Very few people are able to determine what this program +does by visual inspection. I suggest that you stop reading this +section right now and see if you are one of the few people who can.

+ +

Several points are important to understand in this program:

+ +

1) What is the symbol ‘unix’ and what is its value in the program? + Clearly ‘unix’ is not a function, and since ‘unix’ is not declared + to be a data type (such as int, char, struct foo, enum, …) + what must ‘unix’ be?

+ +

2) What is the value of the symbol “have”? (hint: the value is + NOT 4 characters, or ‘h’, or a string) Consider the fact that:

+ +
    char *x;
+
+ +

defines a pointer to a character (i.e. an address), and that + the ‘=’ assigns things is compatible types. Since:

+ +
    x = "have";
+
+ +

is legal C, what type of value is “have”?

+ +

3) Note that the following expressions yield the same value:

+ +
    x[3]    *(x+3)    *(3+x)
+
+ +

since addition is communitive. What can be said about the value:

+ +
    3[x]
+
+ +

David Korn’s /bin/ksh provides us with a greatly improved version of +the /bin/sh. The source for v7’s /bin/sh greatly inspired this contest.

+ +

Copyright © 1987, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1987/korn/hint.text b/1987/korn/hint.text new file mode 100644 index 000000000..1f748e0e5 --- /dev/null +++ b/1987/korn/hint.text @@ -0,0 +1,52 @@ +# Best One Liner + +David Korn +AT&T Bell Labs +MH 3C-526B, AT&T Bell Labs +Murray Hill, NJ +07974 +USA + +## Judges' comments: + +The Judges believe that this is the best one line entry ever received. +Compile on a UN*X system, or at least using a C implementation that +fakes it. Very few people are able to determine what this program +does by visual inspection. I suggest that you stop reading this +section right now and see if you are one of the few people who can. + +Several points are important to understand in this program: + +1) What is the symbol 'unix' and what is its value in the program? + Clearly 'unix' is not a function, and since 'unix' is not declared + to be a data type (such as int, char, struct foo, enum, ...) + what must 'unix' be? + +2) What is the value of the symbol "have"? (hint: the value is + NOT 4 characters, or 'h', or a string) Consider the fact that: + + char *x; + + defines a pointer to a character (i.e. an address), and that + the '=' assigns things is compatible types. Since: + + x = "have"; + + is legal C, what type of value is "have"? + +3) Note that the following expressions yield the same value: + + x[3] *(x+3) *(3+x) + + since addition is communitive. What can be said about the value: + + 3[x] + +David Korn's /bin/ksh provides us with a greatly improved version of +the /bin/sh. The source for v7's /bin/sh greatly inspired this contest. + +Copyright (c) 1987, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1987/korn/korn.c b/1987/korn/korn.c new file mode 100644 index 000000000..c21ebc49b --- /dev/null +++ b/1987/korn/korn.c @@ -0,0 +1 @@ + main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);} diff --git a/1987/lievaart/Makefile b/1987/lievaart/Makefile new file mode 100644 index 000000000..06208e66b --- /dev/null +++ b/1987/lievaart/Makefile @@ -0,0 +1,33 @@ +# %W% %G% %U% +# +# 1987 makefile +# +# Copyright (c) 1987, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= lievaart lievaart2 + +# for System V style systems +OPSYS= -Dindex=strchr +# for BSD style systems +#OPSYS= + +all: ${WINNERS} + +lievaart: lievaart.c + cc $? -o $@ +# not an official entry +lievaart2: lievaart2.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} +install: all + @echo are you kidding'??' diff --git a/1987/lievaart/hint.html b/1987/lievaart/hint.html new file mode 100644 index 000000000..855a0f5de --- /dev/null +++ b/1987/lievaart/hint.html @@ -0,0 +1,36 @@ +

Grand Prize

+ +

Roemer B. Lievaart
+VU Informatica
+Churchilllaan 173-IV
+Amsterdam, The Netherlands

+ +

Judges' remarks:

+ +

We believe that you too will be amazed at just how much power Mr. Lievaart +packed into 1024 bytes!

+ +

This Plays the game of reversi (Othello)! Compile and run. It then +asks for a playing level. Enter 0-10 (easy-hard). It then asks for +your move. A move is a number within 11-88, or a 99 to pass. Illegal +moves (except for an illegal pass) are rejected. Then the computer +does its move (or a 0 to pass), until the board is full.

+ +

It plays rather well, for such a small program! Lievaart had to leave out the +board printing routine, so you’ll have to take a real game board to +play it. … Also due to space-limitations (the rules for 1987 had a +limit of 1024 byes), Lievaart took out the passing-handler, which +makes its ending-game rather poor. But further it knows all the +rules, uses alpha-beta pruning, and it plays f.i. on mobility(!). +Most important: it can play a pretty good game of Reversi!

+ +

The Author was kind enough to supply the fully functional version of the +program. The file lievaart2.c contains what the program would have +been without the size restriction. This version has the full end game +logic and displays the board after each move!

+ +

Copyright © 1987, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1987/lievaart/hint.text b/1987/lievaart/hint.text new file mode 100644 index 000000000..753f85a42 --- /dev/null +++ b/1987/lievaart/hint.text @@ -0,0 +1,37 @@ +# Grand Prize + +Roemer B. Lievaart +VU Informatica +Churchilllaan 173-IV +Amsterdam, The Netherlands + + +## Judges' remarks: + +We believe that you too will be amazed at just how much power Mr. Lievaart +packed into 1024 bytes! + +This Plays the game of reversi (Othello)! Compile and run. It then +asks for a playing level. Enter 0-10 (easy-hard). It then asks for +your move. A move is a number within 11-88, or a 99 to pass. Illegal +moves (except for an illegal pass) are rejected. Then the computer +does its move (or a 0 to pass), until the board is full. + +It plays rather well, for such a small program! Lievaart had to leave out the +board printing routine, so you'll have to take a real game board to +play it. ... Also due to space-limitations (the rules for 1987 had a +limit of 1024 byes), Lievaart took out the passing-handler, which +makes its ending-game rather poor. But further it knows all the +rules, uses alpha-beta pruning, and it plays f.i. on mobility(!). +Most important: it can play a pretty good game of Reversi! + +The Author was kind enough to supply the fully functional version of the +program. The file lievaart2.c contains what the program would have +been without the size restriction. This version has the full end game +logic and displays the board after each move! + +Copyright (c) 1987, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1987/lievaart/lievaart.c b/1987/lievaart/lievaart.c new file mode 100644 index 000000000..0a2473823 --- /dev/null +++ b/1987/lievaart/lievaart.c @@ -0,0 +1,20 @@ +#define D define +#D Y return +#D R for +#D e while +#D I printf +#D l int +#D C y=v+111;H(x,v)*y++= *x +#D H(a,b)R(a=b+11;au){R(w=i=0;i<4;i++)w+=(m=v[h[i]])==f?300:m==q?-300:(t=v[ih[i]])==f?-50 +:t==q?50:0;return w;}H(z,0){if(GZ(v,z,f,100)){c++;w= -S(d+1,n,q,-b,-bw);if(w>bw +){zb=z;bw=w;if(w>=b||w>=8003)Y w;}}}if(!c){bz=0;C;Y-S(d+1,n,q,-b,-bw);}bz=zb;Y +d>=u-1?bw+(c<<3):bw;}main(){R(;t<1100;t+=100)R(m=0;m<100;m++)V[t+m]=m<11||m>88 +||(m+1)%10<2?3:0;V[44]=V[55]=1;V[45]=V[54]=2;I("Level:");s(u);e(lv>0){do{I("Yo\ +u:");s(m);}e(!GZ(V,m,2,0)&&m!=99);if(m!=99)lv--;if(lv<15&&u<10)u+=2;I("Wait\n") +;I("Value:%d\n",S(0,V,1,-9000,9000));I("move: %d\n",(lv-=GZ(V,bz,1,0),bz));}}GZ +(v,z,f,o)l*v;{l*j,q=3-f,g=0,i,h,*k=v+z;if(*k==0)R(i=7;i>=0;i--){j=k+(h=r[i]);e( +*j==q)j+=h;if(*j==f&&j-h!=k){if(!g){g=1;C;}e(j!=k)*((j-=h)+o)=f;}}Y g;} diff --git a/1987/lievaart/lievaart2.c b/1987/lievaart/lievaart2.c new file mode 100644 index 000000000..086799bca --- /dev/null +++ b/1987/lievaart/lievaart2.c @@ -0,0 +1,25 @@ +#define D define +#D Y return +#D R for +#D e while +#D I printf +#D l int +#D W if +#D C y=v+111;H(x,v)*y++= *x +#D H(a,b)R(a=b+11;au){R(w=i=0;i<4;i++)w+=(m=v[h[i]])==f?300:m==q?-300:(t=v[ih[i]])==f?-50: +t==q?50:0;Y w;}H(z,0){W(E(v,z,f,100)){c++;w= -S(d+1,n,q,0,-b,-j);W(w>j){g=bz=z; +j=w;W(w>=b||w>=8003)Y w;}}}W(!c){g=0;W(_){H(x,v)c+= *x==f?1:*x==3-f?-1:0;Y c>0? +8000+c:c-8000;}C;j= -S(d+1,n,q,1,-b,-j);}bz=g;Y d>=u-1?j+(c<<3):j;}main(){R(;t< +1600;t+=100)R(m=0;m<100;m++)V[t+m]=m<11||m>88||(m+1)%10<2?3:0;I("Level:");V[44] +=V[55]=1;V[45]=V[54]=2;s(u);e(lv>0){Z do{I("You:");s(m);}e(!E(V,m,2,0)&&m!=99); +W(m!=99)lv--;W(lv<15&&u<10)u+=2;U("Wait\n");I("Value:%d\n",S(0,V,1,0,-9000,9000 +));I("move: %d\n",(lv-=E(V,bz,1,0),bz));}}E(v,z,f,o)l*v;{l*j,q=3-f,g=0,i,w,*k=v ++z;W(*k==0)R(i=7;i>=0;i--){j=k+(w=r[i]);e(*j==q)j+=w;W(*j==f&&j-w!=k){W(!g){g=1 +;C;}e(j!=k)*((j-=w)+o)=f;}}Y g;} diff --git a/1987/rules b/1987/rules new file mode 100644 index 000000000..be61d175a --- /dev/null +++ b/1987/rules @@ -0,0 +1,167 @@ +Copyright (c) 1987, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + +WARNING: The rules and mailing address for the contest change from year + to year. Be sure that you consult the current set of rules + before submitting entries. +------------------------------------------------------------------------------ + +Subject: 4th International Obfuscated C Code Contest Rules +Newsgroups: comp.lang.c,comp.unix.wizards +Keywords: rules,1987,obfuscate,contest + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show what should NOT be done in C programs. + * To provide a safe forum for poor C code. :-) + +RULES: + 1) The source must be 1024 characters long or less. NO EXCEPTIONS! + + 2) To help us process your entries, we ask that you submit entries + in the following format: (please include the --- lines) + +---start of header items--- +name: +org: +email address: +postal address: +environment: +remarks: +---start of entry--- +X +X +X +X +X +X +---end of entry--- + + 3) Regarding the header items: + + * All header items except 'remark' are optional. If you do not + wish to answer an item, indicate so by the string: ***NONE*** + Any text outside of the above format will be kept confidential. + + * You can remain anonymous. If the name item is: ***ANONYMOUS*** + all items except the 'remarks' item will not be relased. + + * Indicate the name of your Company or School in the 'org' item. + + * The 'email address' item asks for a network path from a major + site (such as amdahl) to your mailbox. + + * If you give a 'postal address', please include your Country. + + * Give the machine and operating system (i.e., Un*x version) on + which your program ran. + + * The 'remarks' item is not optional. Please indicate: + - how to execute or compile if something special is required + - type of input or argument needed, if applicable + - what this program does + - any other remarks you wish to make + + * If you need more than one line on a header item, place + tab or space characters at the beginning of each additional line. + + 4) The entry should be written in a common C. (K&R + common extensions) + + 5) The program must be of original work. All programs must be + in the public domain. All copyrighted programs will be rejected. + + 6) Entries must be received before 30-May-87 0:00 GMT. + Email your entries to: + + ...!amdahl!obfuscate + + Amdahl talks to hplabs, decwrl, pyramid, seismo and cbosgd. + We will attempt to Email a confirmation of receipt of contest + entries, however since Email is not reliable you may not receive it. + People are encouraged to submit entries via Email, however + one may mail entries the following postal address: + + Landon Curt Noll + Amdahl Corp. + 1250 E. Arques Ave. M/S 316 + P.O. Box 3470 + Sunnyvale, CA + 94088-3470 + U.S.A. + + Write the words: "International Obfuscated C Code Contest" near the + bottom left corner of the envelope. + + 8) Contest entries sent in by post should indicate where TAB characters + are to be placed, otherwise space characters will be assumed. Each + line will be assumed to contain a newline character. The leading + 'X' will serve to indicate where each source line starts. + + 9) Each person may submit up to 5 entries. Multiple entries must + be sent in separate Email letters or postal envelopes. + + 10) People are encouraged to examine winners of the previous + contests. A copy of these entries was posted to mod.sources + on or about 12-Mar-87. Contact the mod.sources moderator + if you missed that article. Keep in mind that rules change from + year to year, so some winning entries may not be valid + entries this year. Also what was unique and novel one + year can get 'old' the next year. + + +ANNOUNCEMENT OF WINNERS: + + * First announcement will be at the Summer 87 Usenix BOF. + + * An announcement will be posted to mod.announce near + mid June 1987 stating to which newsgroup the winners + have been posted. + + * An article containing the winning entries will be published + in a future issue of the "Micro/Systems Journal". + + * Winners receive international fame and flames! :-) + + +JUDGING: + Awards will be given to the best entry in a number of categories. + The actual category list will vary depending on the types of entries + we receive. At the moment, we are considering using the following: + + * The best small one line program + * The most obscure algorithm + * The worst abuse of the C preprocessor (note warnings below) + * The strangest source layout + * The most useful obfuscated program + * + + Extra points will be given for programs which: + + * pass lint without complaint + * do something quasi-interesting + * are portable + * are unique in their obfuscation style + * are concise + + Points will be taken away for programs that: + + * are very hardware or Un*x version specific + * dump core or have compiler warnings + (we won't take points away if you warn us in the remark item) + * fail to compile + * obfuscate only by overuse of #defines + (you should do this ONLY if your use is unusual) + * are similar to previous winners + * are similar to previous losers :-) + + The Judging will be done by Landon Noll and Larry Bassel. + Comments & questions (not entries) about the contest can be Emailed to: + + ...!amdahl!judges + +chongo /\cc/\ +Larry Bassel diff --git a/1987/wall/Makefile b/1987/wall/Makefile new file mode 100644 index 000000000..6b28cdcb5 --- /dev/null +++ b/1987/wall/Makefile @@ -0,0 +1,30 @@ +# %W% %G% %U% +# +# 1987 makefile +# +# Copyright (c) 1987, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= wall + +# for System V style systems +OPSYS= -Dindex=strchr +# for BSD style systems +#OPSYS= + +all: ${WINNERS} + +wall: wall.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} +install: all + @echo are you kidding'??' diff --git a/1987/wall/hint.html b/1987/wall/hint.html new file mode 100644 index 000000000..62a3cdc69 --- /dev/null +++ b/1987/wall/hint.html @@ -0,0 +1,35 @@ +

Most Useful Obfuscation

+ +

Larry Wall
+Unisys - System Development Group Santa Monica
+9132 Kester Ave
+Panorama City, CA 91402 USA

+ +

Judges' comments:

+ +

Try:

+ +
lwall | bc | lwall
+input:  x*x
+input:  c^2
+
+ +

Also try:

+ +
lwall | bc   and   lwall | cat
+
+ +

What we found amazing was how the flow of control was transferred +between subroutines. Careful inspection will show that the array of +pointers to functions named ‘vi’ refers to functions which seem to not +be directly called. Even so, these pointers to functions are being +used as an argument to signal. Can you determine why this is being +done and how it is being exploited?

+ +

Some compilers complained about this file, so we changed: ‘=++I’ to ‘= ++I’.

+ +

Copyright © 1987, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1987/wall/hint.text b/1987/wall/hint.text new file mode 100644 index 000000000..63903a1c1 --- /dev/null +++ b/1987/wall/hint.text @@ -0,0 +1,31 @@ +# Most Useful Obfuscation + +Larry Wall +Unisys - System Development Group Santa Monica +9132 Kester Ave +Panorama City, CA 91402 USA + +## Judges' comments: + +### Try: + lwall | bc | lwall + input: x*x + input: c^2 + +### Also try: + lwall | bc and lwall | cat + +What we found amazing was how the flow of control was transferred +between subroutines. Careful inspection will show that the array of +pointers to functions named 'vi' refers to functions which seem to not +be directly called. Even so, these pointers to functions are being +used as an argument to signal. Can you determine why this is being +done and how it is being exploited? + +Some compilers complained about this file, so we changed: '=++I' to '= ++I'. + +Copyright (c) 1987, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1987/wall/wall.c b/1987/wall/wall.c new file mode 100644 index 000000000..8ba1c5458 --- /dev/null +++ b/1987/wall/wall.c @@ -0,0 +1,18 @@ +#define iv 4 +#define v ;(void +#define XI(xi)int xi[iv*'V']; +#define L(c,l,i)c(){d(l);m(i);} +#include +int*cc,c,i,ix='\t',exit(),X='\n'*'\d';XI(VI)XI(xi)extern(*vi[])(),(* +signal())();char*V,cm,D['x'],M='\n',I,*gets();L(MV,V,(c+='d',ix))m(x){v) +signal(X/'I',vi[x]);}d(x)char*x;{v)write(i,x,i);}L(MC,V,M+I)xv(){c>=i?m( +c/M/M+M):(d(&M),m(cm));}L(mi,V+cm,M)L(md,V,M)MM(){c=c*M%X;V-=cm;m(ix);} +LXX(){gets(D)||(vi[iv])();c=atoi(D);while(c>=X){c-=X;d("m");}V="ivxlcdm" ++iv;m(ix);}LV(){c-=c;while((i=cc[*D=getchar()])>-I)i?(c?(c>I;cc[-I]-=ix v)close(*VI);cc[M]-=M;}main(){ +(*vi)();for(;v)write(VI[I],V,M));}l(xl,lx)char*lx;{v)printf(lx,xl)v) +fflush(stdout);}L(xx,V+I,(c-=X/cm,ix))int(*vi[])()={ii,li,LXX,LV,exit,l, +d,l,d,xv,MM,md,MC,ml,MV,xx,xx,xx,xx,MV,mi}; diff --git a/1987/westley/Makefile b/1987/westley/Makefile new file mode 100644 index 000000000..6681478ee --- /dev/null +++ b/1987/westley/Makefile @@ -0,0 +1,30 @@ +# %W% %G% %U% +# +# 1987 makefile +# +# Copyright (c) 1987, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL= /bin/sh +WINNERS= westley + +# for System V style systems +OPSYS= -Dindex=strchr +# for BSD style systems +#OPSYS= + +all: ${WINNERS} + +westley: westley.c + cc $? -o $@ + +clean: + rm -f core +clobber: clean + rm -f ${WINNERS} +install: all + @echo are you kidding'??' diff --git a/1987/westley/hint.html b/1987/westley/hint.html new file mode 100644 index 000000000..78b5d5d56 --- /dev/null +++ b/1987/westley/hint.html @@ -0,0 +1,23 @@ +

Best Layout

+ +

Brian Westley (aka Merlyn Leroy on usenet)
+Starfire Consulting
+1121 Hamline Ave. N. #17
+St. Paul, MN
+55108
+USA

+ +

Judges' comments:

+ +

Putchar must exist in the C library and not just as a macro. +If it fails to compile, add the line: #include <stdio.h> at the +top of the program.

+ +

Line by line symmetry performed better than any C beautifier. Think +of if it as a C ink blot. :-)

+ +

Copyright © 1987, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel.

diff --git a/1987/westley/hint.text b/1987/westley/hint.text new file mode 100644 index 000000000..501780b4e --- /dev/null +++ b/1987/westley/hint.text @@ -0,0 +1,23 @@ +# Best Layout + +Brian Westley (aka Merlyn Leroy on usenet) +Starfire Consulting +1121 Hamline Ave. N. #17 +St. Paul, MN +55108 +USA + +## Judges' comments: + +Putchar must exist in the C library and not just as a macro. +If it fails to compile, add the line: `#include ` at the +top of the program. + +Line by line symmetry performed better than any C beautifier. Think +of if it as a C ink blot. :-) + +Copyright (c) 1987, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1987/westley/westley.c b/1987/westley/westley.c new file mode 100644 index 000000000..57500810d --- /dev/null +++ b/1987/westley/westley.c @@ -0,0 +1,48 @@ + char rahc + [ ] + = + "\n/" + , + redivider + [ ] + = + "Able was I ere I saw elbA" + , + * + deliver,reviled + = + 1+1 + , + niam ; main + ( ) + {/*\} + \*/ + int tni + = + 0x0 + , + rahctup,putchar + ( ) + ,LACEDx0 = 0xDECAL, + rof ; for + (;(int) (tni);) + (int) (tni) + = reviled ; deliver = + redivider + ; +for ((int)(tni)++,++reviled;reviled* *deliver;deliver++,++(int)(tni)) rof + = + (int) -1- (tni) + ;reviled--;--deliver; + (tni) = (int) + - 0xDECAL + LACEDx0 - + rof ; for + (reviled--,(int)--(tni);(int) (tni);(int)--(tni),--deliver) + rahctup = putchar + (reviled* *deliver) + ; + rahctup * putchar + ((char) * (rahc)) + ; + /*\ + {\*/} diff --git a/1988/1988.tar.bz2 b/1988/1988.tar.bz2 new file mode 100644 index 000000000..a77f18b03 Binary files /dev/null and b/1988/1988.tar.bz2 differ diff --git a/1988/Makefile b/1988/Makefile new file mode 100644 index 000000000..b85fd9cc0 --- /dev/null +++ b/1988/Makefile @@ -0,0 +1,87 @@ +# %W% %G% %U% +# +# 1988 makefile +# +# Copyright (c) 1988, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL=/bin/sh +CFLAGS=-O +CC=cc +CPP=/lib/cpp +# you may need a version of cpp that is faster and/or allows more symbols +# than the standard cpp. If so, adjust the BIG_CPP below. +# +# If you have the GNU cpp, you should use it below as it is MUCH faster +# than the standard cpp and does not have problems with memory usage. +# However you should note that the non-ANSI nature of defining symbols +# that start with '#' prevents GNU cpp from doing the initial pass. +# Thus you should not use the GNU cpp for the ${CPP} symbol. +BIG_CPP=${CPP} + +WINNERS=dale phillipps robison westley reddy isaak \ + litmaath spinellis zsmall + +all: ${WINNERS} + +dale: dale.c + ${CC} ${CFLAGS} $? -o $@ +phillipps: phillipps.c + ${CC} ${CFLAGS} $? -o $@ +robison: robison.c + ${CC} ${CFLAGS} $? -o $@ +westley: westley.c + ${CC} ${CFLAGS} $? -o $@ +reddy: reddy.c + ${CC} ${CFLAGS} $? -o $@ +isaak: isaak.c + ${CC} ${CFLAGS} -DI=B -DO=- -Dy $? -o $@ +litmaath: litmaath.c + ${CC} ${CFLAGS} $? -o $@ +spinellis: spinellis.c spinellis.data + @echo This program can not be portably compiled with a makefile + @echo because it reads from /dev/tty. + @echo Compile this program with: cc spinellis.c -o spinellis + @echo and type the following text followed by an EOF '(^D)'. + @cat spinellis.data + @-if [ ! -f spinellis ]; then \ + touch spinellis; \ + fi + +# not an official entry +# +# The 'zsmall.c' program was obtained from 'applin.c' by reducing its recursion +# and running it thru the initial /lib/cpp. That is, 'zsmall.c' is a small +# version of the 'z.c' file as produced by the 'applin' make rule below. +zsmall: zsmall.c + @echo this reduced version of applin.c can take some time to compile... + ${CC} ${CFLAGS} zsmall.c -o $@ + +# This entry took 75 minutes to compile on a Amdahl 5980-300E +# (a 55658 Dhyrstone/sec/cpu machine) using the System V cpp. +# (The GNU cpp when defined as BIG_CPP took only 45 seconds) +# Your cpp may not be able to compile it due to a common bug +# that results in ${CPP} running out of space. The routine +# 'zsmall' is a smaller version of the applin.c entry. +applin: applin.c + ${CPP} '-DM=#include "z.c"' '-DR=#include' '-DF=#if' \ + '-DI=#ifdef' '-DL=#else' '-DE=#endif' '-DN=#ifndef' \ + '-DD=#define' '-DU=#undef' applin.c z.c + @echo this is going to take a very very long time to C-preprocess + @echo perhaps you should do: make zsmall instead + ${BIG_CPP} z.c > large.c + @echo now for the real compile... + ${CC} ${CFLAGS} large.c -o $@ + +clean: + rm -f core *.o +clobber: clean + rm -f ${WINNERS} applin +nuke: clobber + rm -f large.c z.c +install: all + cat ${WINNERS} > /dev/null diff --git a/1988/README b/1988/README new file mode 100644 index 000000000..06a6287b7 --- /dev/null +++ b/1988/README @@ -0,0 +1,23 @@ +1988 marked the "The Fifth International Obfuscated C Code Contest" + +Copyright (c) 1988, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + +The maximum size of entries was raised from 1024 to 1536 bytes, however +smaller entries were encouraged. Due to the "Best Abuse of the Rules" +winner of 1987, a limit of 160 chars in the compile line was introduced. + +This year, the Grand Prize was given to the most unusual entry and best +abuse of the C Preprocessor rather than the most well rounded entry. + +Rules and results were posted to comp.lang.c, comp.sources.unix and +alt.sources. The 1988 winners will be published in the Micro/Systems +Journal. + +Winning entries for previous years were repackaged with each year +being in its own directory. Make files and hints were also provided. +The package was posted to the: comp.sources.unix newsgroup. They are +also available on a wide number of Usenet archive sites. diff --git a/1988/applin.c b/1988/applin.c new file mode 100644 index 000000000..f023cb96b --- /dev/null +++ b/1988/applin.c @@ -0,0 +1,193 @@ +I a +U a +I b +U b +I c +U c +I d +U d +I e +U e +I f +U f +I g +U g +I h +U h +I i +U i +I j +U j +I k +U k +I l +U l +I m +U m +L +D m +E +L +D l +E +L +D k +E +L +D j +E +L +D i +E +L +D h +E +L +D g +E +L +D f +E +L +D e +E +L +D d +E +L +D c +E +L +D b +E +L +D a +E +I m +D n (1<<9) +L +D n 0 +E +I l +D o (1<<8) +L +D o 0 +E +I k +D p (1<<7) +L +D p 0 +E +I j +D q (1<<6) +L +D q 0 +E +I i +D r (1<<5) +L +D r 0 +E +I h +D s (1<<4) +L +D s 0 +E +I g +D t (1<<3) +L +D t 0 +E +I f +D u (1<<2) +L +D u 0 +E +I e +D v (1<<1) +L +D v 0 +E +D vv (n+o+p+q+r+s+t+u+v+1) +D ff (defined(d)*16+defined(c)*8+defined(b)*4+defined(a)*2+1) +F vv==1 +U vv +D vv 2 +E +F ff +main(){ +E +N z +M +M +M +M +M +M +M +M +M +M +M +M +M +M +M +E +I z +U z +L +I y +U y +L +I x +U x +L +I w +U w +} +E +E +E +E diff --git a/1988/applin.hint b/1988/applin.hint new file mode 100644 index 000000000..f84a2a06f --- /dev/null +++ b/1988/applin.hint @@ -0,0 +1,34 @@ +Best of show: + + Jack Applin + Hewlett-Packard + 3404 E. Harmony Rd + Ft. Collins, CO + 80525 + USA + +Compile and execute with no argument, if you can! + +This entry is by far the most unusual abuse of the C preprocessor that +we have received thus far. Nearly all of the real work is done in the +preprocessor! + +When we compiled applin.c on an Amdahl 5890-300E, we found that it +spent over 75 minutes in the System V C preprocessor! Besides showing +that the standard System V cpp is slow, it showed that it contained a +memory usage problem. The applin.c only uses 29 different preprocessor +symbols (besides and yet the preprocessor ran out of space! + +The GNU C preprocessor took less than 45 seconds to perform the 2nd pass +on the Amdahl 5890-300E. But due to the ANSI-ness of GNU cpp (v. 1-21), +it was not able to cleanly substitute a symbol that began with a '#'. +Clearly the GNU C preprocessor is faster. + +A smaller version of applin.c can be found in zsmall.c. Your machine +may have an easier time with this program. See the Makefile for details. + +Copyright (c) 1988, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1988/dale.c b/1988/dale.c new file mode 100644 index 000000000..29a27ea59 --- /dev/null +++ b/1988/dale.c @@ -0,0 +1,26 @@ +#define _ define +#_ P char +#_ p int +#_ O close( +#_ H strlen(* +#_ h case_2 +#_ case_3 default +#_ while switch +#_ L if +#_ I goto +#_ l 1 +#_ f write +#_ J else +#_ a(x)get/***/x/***/id()) +P z[l<<(1< diff --git a/1988/isaak.c b/1988/isaak.c new file mode 100644 index 000000000..f40536e05 --- /dev/null +++ b/1988/isaak.c @@ -0,0 +1,34 @@ +main(){} +#define P define +#P U ifdef +#P main Si +#U y +#undef y +#include "isaak.c" +Pb +#else +char*K="4499999;8 9+jW*':'TZhD m:*h.4-j'9(z7Q>r*:G#FS]mATIdMZY^HaKFZZ\ +JyJw:X49@eJj1,Z'\\c^jGU@IXTF@9P2i:gAZx0pD*W3\\ diff --git a/1988/isaak.encode b/1988/isaak.encode new file mode 100644 index 000000000..b5fdbcbf1 --- /dev/null +++ b/1988/isaak.encode @@ -0,0 +1,68 @@ +begin 666 isaak.output +M*RTM+2L@(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @ +M(" @(" @(" @(" @(" @(" @(" @(" K+2TM*PI\,2 @?" @(" @(" @(" @ +M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @ +M(" @(" @('PR("!\"GQ(("!\(" @(" @(" @(" @(" @(" @(" @(" @(" @ +M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @?$AE('P*?" @ +M,7P@(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @ +M(" @(" @(" @(" @(" @(" @("!\(" T? HK+2TM*RTM+2L@(" @(" @(" @ +M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" K+2TM*RTM+2LM+2TK+2TM +M*RTM+2LM+2TK"GPS("!\-" @?" @(" @(" @(" @(" @(" @(" @(" @(" @ +M(" @(" @(" @(" @('PU("!\-B @?#<@('PX("!\.2 @?#$P('P*?$QI('Q" +M92!\(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @?$(@ +M('Q#("!\3B @?$\@('Q&("!\3F4@? I\(" W?" @.7P@(" @(" @(" @(" @ +M(" @(" @(" @(" @(" @(" @(" @(" @("!\(#$Q?" Q,GP@,31\(#$V?" Q +M.7P@,C!\"BLM+2TK+2TM*R @(" @(" @(" @(" @(" @(" @(" @(" @(" @ +M(" @(" @(" @("LM+2TK+2TM*RTM+2LM+2TK+2TM*RTM+2L*?#$Q('PQ,B!\ +M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @?#$S('PQ +M-"!\,34@?#$V('PQ-R!\,3@@? I\3F$@?$UG('P@(" @(" @(" @(" @(" @ +M(" @(" @(" @(" @(" @(" @(" @("!\06P@?%-I('Q0("!\4R @?$-L('Q! +M +is given on the last line. Why is this needed? Note the unusual calls +to sprintf. + +NOTE: The program relies heavily on ASCII. Don't even think of + running it on an EBCDIC machine. If you name the file anything + other than "isaak.c", you must change the #include on line 7. + +NOTE: The use of null comments to separate macros to construct different + tokens from a single macro (e.g., "O/**/O" creates either "++" or "--" + by defining "O" to be "+" or "-") may cause some strict ANSI + C preprocessors to object. + +NOTE: Most System V machines will not be able to execute this program + correctly due to the fact that BSD style systems have an sprintf() + that returns a char *. + +Due to the above problems, we have replaced the output of this program +in the file: isaak.encode. To read this file do: + + uudecode < isaak.encode + cat isaak.output + +FYI: We are likely to be more strict about portability in the future. + +Copyright (c) 1988, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1988/litmaath.c b/1988/litmaath.c new file mode 100644 index 000000000..a9000cbdf --- /dev/null +++ b/1988/litmaath.c @@ -0,0 +1,10 @@ +main(argc, argv) +int argc; +char **argv; +{ + while (*argv != argv[1] && (*argv = argv[1]) && (argc = 0) || (*++argv + && (**argv && ((++argc)[*argv] && (**argv <= argc[*argv] || + (**argv += argc[*argv] -= **argv = argc[*argv] - **argv)) && + --argv || putchar(**argv) && ++*argv--) || putchar(10)))) + ; +} diff --git a/1988/litmaath.hint b/1988/litmaath.hint new file mode 100644 index 000000000..bf45afb33 --- /dev/null +++ b/1988/litmaath.hint @@ -0,0 +1,36 @@ +Best small program: + + Maarten Litmaath + Free University (VU) Amsterdam + Department of computer science + Uilenstede 72 + 1183 AK Amstelveen + The Netherlands + +Try: litmaath eschew obfuscation + +Note the unusual structure: + + while () + ; + +Did you notice that the body is empty? + +The best one can do to understand how the program works is to give it +two small strings as arguments, and follow the program closely. One +could make the body of the 'while' loop an 'fprintf' with interesting +variables like: + + fprintf(stderr, + "argv=%lo *argv=%lo **argv=%c argv[1]=%lo *argv[1]=%c argc=%d\n", + (long) argv, (long) *argv, *argv && **argv ? **argv : '@', + (long) argv[1], argv[1] && *argv[1] ? *argv[1] : '@', argc); + +Furthermore, it's interesting to note that only two variables are +used to achieve everything. + +Copyright (c) 1988, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1988/phillipps.c b/1988/phillipps.c new file mode 100644 index 000000000..7c48f19cb --- /dev/null +++ b/1988/phillipps.c @@ -0,0 +1,53 @@ +main(t,_,a ) +char +* +a; +{ + return! + +0 +#include +#define w printf +#define p while +#define t(s) (W=T(s)) +char*X,*B,*L,I[99];M,W,V;D(){W==9?(w("`%.*s' is ",V,X),t(0)):W==40?(t(0),D(),t(41)):W==42?(t(0),D(),w("ptr to ")):0;p(W==40?(t(0),w("func returning "),t(41)):W==91?(t(0)==32?(w("array[0..%d] of ",atoi(X)-1),t(0)):w("array of "),t(93)):0);}main(){p(w("input: "),B=gets(I))if(t(0)==9)L=X,M=V,t(0),D(),w("%.*s.\n\n",M,L);}T(s){if(!s||s==W){p(*B==9||*B==32)B++;X=B;V=0;if(W=isalpha(*B)?9:isdigit(*B)?32:*B++)if(W<33)p(isalnum(*B))B++,V++;}return W;} diff --git a/1988/reddy.hint b/1988/reddy.hint new file mode 100644 index 000000000..3baa0b56e --- /dev/null +++ b/1988/reddy.hint @@ -0,0 +1,22 @@ +Most useful Obfuscated C program: + + Amperif Corporation + 9232 Eton Avenue + Chatsworth, CA + 91311 + U.S.A. + + +Compile and give the following line as input: + + char *(*(fun[16])(); + +This is a somewhat restricted version of a useful program that has been +posted to Usenet. What is unusual is what it is able to do so much +in such little space. + +Copyright (c) 1988, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1988/robison.c b/1988/robison.c new file mode 100644 index 000000000..e8ff9c44d --- /dev/null +++ b/1988/robison.c @@ -0,0 +1,40 @@ +#include +unsigned char w,h,i,l,e,x,y=10,z=10,E[256]; +#define whi1e(j,k) printf(j,k); fflush(stdout) +#define o E[w] + +main (c,v) char *v[]; { +while (c>=2 ){z = atoi(v[1]),--c; +while (c>=2 )y = atoi(v[2]),--c;} +whi1e ("%s" ,"2."); +while (--y) --x; +while (--x) --e,--y; +while (--z) --x; +while (--x) --e,--z; +while (--w) { +while (--x) --o;} +while (--z) { +while (--x) --w; +while (--o) ; +while (--w) ; +while (--e) --x; +while (--x) --w,--e; +while (--w) { +while (--l) ; +while (--i) --l;--l; +while (--h) ; +while (--y) --x; +while (--x) --h,--y; +while (--x) --h; +while (--h) { +while (--o) --x; +while (--x) --l,--o; +while (l>=w ){--i; +while (--w) --l,--x; +while (--x) --w;--l;}} +while (--o) ; +while (--l) --x; +while (--x) --o;} +while (--i) --h; +whi1e ("%x" ,--h);--e;} +whi1e ("%s" ,"\n");} diff --git a/1988/robison.hint b/1988/robison.hint new file mode 100644 index 000000000..837de9db1 --- /dev/null +++ b/1988/robison.hint @@ -0,0 +1,41 @@ +Best abuse of C constructs: + + Arch D. Robison + University of Illinois at Urbana-Champaign + 1304 W. Springfield Ave. + Urbana IL + 61801 + USA + +Try: robison 80 10 + robison 40 16 + +The first and second parameters are optional. You might also try: + + robison 80 2 <--- can you find the bug? + robison 80 -246 + +The author says: + + This program shows that C has many unnecessary constructs, in fact + only "while","--", and ">=" are required. (The two assignments at + the beginning could be avoided if "atoi" was rewritten with this + new paradigm.) Note that the lack of both the controversial "goto" + and assignment statements makes the meaning crystal clear. The current + ANSI committee should look into this practical simplification of C. + +The following might make an interesting benchmark: + + robison 100 + +[Amdahl 5890-300E with System V cc: 8.40 seconds] + +We suggest that you C preprocess and perhaps C-beautify this program. +All is not what it may appear to be in this program. When does a whi1e +not take a while to execute? + +Copyright (c) 1988, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1988/rules b/1988/rules new file mode 100644 index 000000000..a1f940f8b --- /dev/null +++ b/1988/rules @@ -0,0 +1,213 @@ +Subject: 5th International Obfuscated C Code Contest Rules +Newsgroups: comp.lang.c,comp.unix.wizards +Keywords: rules,1988,obfuscate,contest + +Copyright (c) 1988, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: Their emotions obfuscated their + judgement. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show what should NOT be done in C programs. + * To provide a safe forum for poor C code. :-) + +RULES: + + To help us handle the vast volume of entries, we ask that you + follow the rules below. Sorry for the length, but we need all + the help we can get! + + 1) Your source MUST be 1536 bytes or less, and it must be a complete + program, not just a subroutine. NOTE the new maximum size. + + 2) To help us process your entries, we ask that you submit entries + in the following format. Please be sure to include the --- lines, + otherwise our extraction program may skip your entry! + +---header items--- +name: Your name, of course! +org: School/Company/Organization +email address: Email address from a well known site +postal address: Postal address, include your country as well +environment: Indicate the Hardware & OS under which your program was tested +entry: A of B +remarks: +---how to compile--- +X Give the command(s) needed to compile your program. +X Follow the same rules as given for the program below except that the +X command size must be 160 characters or less. +---program--- +X Place obfuscated source of 1536 characters or less in this section. +X Add a leading X to each line to avoid problems with mailers. +X Some mailers don't like files with very long lines. If your entry contains C +C lines longer 80 chars we ask you to form continuation line sets. To form C +C a continuation line set, place a 'C' character at the point of a split C +C and place a C (instead of an X) at the beginning of the next line. C +C Finally, end the continuation line set as normal. +X The C\nC's and leading X's will be removed prior to extraction and thus C +C they don't contribute toward the source character count. All other C +C characters are considered to be source. +X Newlines count as 1 character. Assume a standard 8 character tab stop. +---end--- + + 3) Regarding the header items: + + * Any text outside of the above format will be kept confidential. + + * All header lines are required, but you may use 'annonymous' + for any header line other than 'remarks' or 'entry'. + + * In the 'remarks' please include: + - what this program does + - why you think the program is obfuscated + - any other remarks you wish to make + + 4) Your entry should be written in common C. (K&R + common extensions) + Due to the lack of ANSI C compilers, it is suggested, but not + required, that you avoid use of constructs unque to ANSI C. + + 5) The program must be of original work. All programs must be + in the public domain. All copyrighted programs will be rejected. + + 6) Entries must be received between 15-Mar-88 0:00 GMT and + 25-May-88 0:00 GMT. Email your entries to: + + ...!amdahl!obfuscate + + Amdahl talks to hplabs, decwrl, pyramid, sun, uunet, cbosgd, ... + We will attempt to Email a confirmation of receipt of contest + entries, however since Email is not reliable you may not receive it. + People are strongly encouraged to submit entries via Email, however + one may mail entries the following postal address: + + Landon Curt Noll + Amdahl Corp. + 1250 E. Arques Ave. M/S 316 + P.O. Box 3470 + Sunnyvale, CA + 94088-3470 + U.S.A. + + Write the words: "International Obfuscated C Code Contest" near the + bottom left corner of the envelope. + + 7) Each person may submit up to 8 entries. Multiple entries must + be sent in separate Email letters or postal envelopes. + + +ANNOUNCEMENT OF WINNERS: + + * First announcement will be at the Summer 88 Usenix BOF. + + * Winning entries will be posted to comp.sources.unix + as well as news groups where these rules were posted + in mid June 1988. (depending on the judges work load ;-}) + + * An article containing the winning entries will be published + in a future issue of the "Micro/Systems Journal". + + * Winners receive international fame and flames! :-) + + +JUDGING: + + Awards will be given to the best entry in a number of categories. + The actual category list will vary depending on the types of entries + we receive. As a guide, consider using the following: + + * The best small one line program + * The most obscure algorithm + * The strangest source layout + * The most useful obfuscated program + * The most creatively obfuscated program + * Best obfuscated entry smaller than 256 bytes + * Best obfuscated entry smaller than 1024 bytes + * + +POINTS TO PONDER: + + People are encouraged to examine winners of the previous contests. A + copy of these entries was posted to comp.sources.unix on or about + 15-Mar-88. Contact the comp.sources.unix moderator, or some archive + site if you missed that posting. Keep in mind that rules change from + year to year, so some winning entries may not be valid entries this + year. What was unique and novel one year might be 'old' the next + year. In short, use your best judgement. + + We examine each entry on several levels of confusion. For example + each entry is judged when we: + + * look at the original source + * run it through; sed -e ',^#[ ]*define,d' | /lib/cpp + * run it through a C beautifier + * examine the algorithm + * compile and lint it + * execute it + + One line programs are best when they are short, obscure and concise. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS or Un*x version specific + (index/strchr differences are ok, but + socket/streams specific code is likely not to be) + * dump core or have compiler warnings + (it is ok only if you warn us in the 'remark' header item) + * won't compile under both BSD or SYS V Un*x + * use an excessively long compile line to get around the + size limit + * are longer than they need to be + * are similar to previous winners + * are similar to previous losers :-) + + Simply abusing #defines or -Dfoo=bar won't go as far as a program + that is more well rounded in confusion. + + Unless you are crampt for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + We like programs that: + + * are as concise and small as they need to be + * do something quasi-interesting + * pass lint without complaint + * are portable + * are unique or novel in their obfuscation style + * use a number of different types of obfuscation + * make us laugh and/or throw up :-) + + Some types of programs can't excel in some areas. We try to account + for this by giving awards to programs in a number of areas. Of course, + your program doesn't have to excel in all areas, but doing well in a + few helps. + + Be creative! + + The Judging will be done by Landon Noll and Larry Bassel. If you have + any QUESTIONS or COMMENTS, please feel free to send them to: + + ...!amdahl!judges + + however contest entries should be sent to: + + ...!amdahl!obfuscate + + +chongo /\cc/\ {decwrl,sun,uunet}!amdahl!chongo +Larry Bassel {amdahl,ucbvax,cbosgd}|sun!lab + +p.s. The 1988 contest has been dedicated to Bill the Cat. |\_.^ + (@ o) + *Ackpt!* {:} + U diff --git a/1988/spinellis.c b/1988/spinellis.c new file mode 100644 index 000000000..72c77aa2e --- /dev/null +++ b/1988/spinellis.c @@ -0,0 +1 @@ +#include "/dev/tty" diff --git a/1988/spinellis.data b/1988/spinellis.data new file mode 100644 index 000000000..75f3ad022 --- /dev/null +++ b/1988/spinellis.data @@ -0,0 +1,4 @@ +main() +{ + printf("Hello world\n"); +} diff --git a/1988/spinellis.hint b/1988/spinellis.hint new file mode 100644 index 000000000..f6ed25b50 --- /dev/null +++ b/1988/spinellis.hint @@ -0,0 +1,36 @@ +Best abuse of the rules: + + Diomidis Spinellis (currently at Imperial College, London, England) + 1 Myrsinis Str. + GR-145 62 Kifissia + GREECE + +How to compile: + + /lib/cpp spinellis.c > spin.c + +and type the following text followed by an EOF ('^D'): + + main() + { + printf("Hello world\n"); + } + +The author says: + + This program can be configured to do almost everything. + The configuration is done during compile time by typing + in, C code, that one would like the program to perform. + A trivial example is given in the `how to compile' section + but the possibilities are clearly limited only by your + imagination and programming skills. + +FYI: We enjoyed this entry this year, however in the future programs + must be able to be compiled from within a makefile without the + need of human intervention. + +Copyright (c) 1988, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1988/westley.c b/1988/westley.c new file mode 100644 index 000000000..8398d5f7a --- /dev/null +++ b/1988/westley.c @@ -0,0 +1,20 @@ +#define _ -F<00||--F-OO--; +int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO() +{ + _-_-_-_ + _-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_ + _-_-_-_ +} diff --git a/1988/westley.fix.c b/1988/westley.fix.c new file mode 100644 index 000000000..2bcf1123e --- /dev/null +++ b/1988/westley.fix.c @@ -0,0 +1,20 @@ +#define _ F-->00||-F-OO--; +int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO() +{ + _-_-_-_ + _-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_-_-_-_-_ + _-_-_-_-_-_-_-_ + _-_-_-_ +} diff --git a/1988/westley.hint b/1988/westley.hint new file mode 100644 index 000000000..b3ae95715 --- /dev/null +++ b/1988/westley.hint @@ -0,0 +1,32 @@ +Best layout: + + Merlyn LeRoy (Brian Westley) + Rosemount, Inc. + 1121 Hamline Ave. N. #17 + St. Paul, MN + 55108 + U.S.A. + +Compile and execute without arguments. + +Note: Your compiler must parse + + #define _ -a + -_ + + as "--a" and not "-(-a)" or some other tokenized form. Some strictly + conforming ANSI C Preprocessors may object to this: for such + compilers, you can elide the nonstandard token-pasting requirement + by changing the #define line to: + + #define _ F-->00||F-OO--; + +You might enjoy looking at the output of: + + cc -E westley.c + +Copyright (c) 1988, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1988/zsmall.c b/1988/zsmall.c new file mode 100644 index 000000000..5305cc1d5 --- /dev/null +++ b/1988/zsmall.c @@ -0,0 +1,160 @@ +#ifdef a +#undef a +#ifdef b +#undef b +#ifdef c +#undef c +#ifdef e +#undef e +#ifdef f +#undef f +#ifdef g +#undef g +#ifdef h +#undef h +#ifdef i +#undef i +#ifdef j +#undef j +#ifdef k +#undef k +#else +#define k +#endif +#else +#define j +#endif +#else +#define i +#endif +#else +#define h +#endif +#else +#define g +#endif +#else +#define f +#endif +#else +#define e +#endif +#else +#define c +#endif +#else +#define b +#endif +#else +#define a +#endif +#ifdef k +#define p (1<<7) +#else +#define p 0 +#endif +#ifdef j +#define q (1<<6) +#else +#define q 0 +#endif +#ifdef i +#define r (1<<5) +#else +#define r 0 +#endif +#ifdef h +#define s (1<<4) +#else +#define s 0 +#endif +#ifdef g +#define t (1<<3) +#else +#define t 0 +#endif +#ifdef f +#define u (1<<2) +#else +#define u 0 +#endif +#ifdef e +#define v (1<<1) +#else +#define v 0 +#endif +#define vv (p+q+r+s+t+u+v+1) +#define ff \ + (defined(c)*8+defined(b)*4+defined(a)*2+1) +#if vv==1 +#undef vv +#define vv 2 +#endif +#if ff +main(){ +#endif +#ifndef z +#include "zsmall.c" +#include "zsmall.c" +#include "zsmall.c" +#include "zsmall.c" +#include "zsmall.c" +#include "zsmall.c" +#include "zsmall.c" +#include "zsmall.c" +#endif +#ifdef z +#undef z +#else +#ifdef y +#undef y +#else +#ifdef x +#undef x +#else +#ifdef w +#undef w +} +#endif +#endif +#endif +#endif diff --git a/1989/1989.tar.bz2 b/1989/1989.tar.bz2 new file mode 100644 index 000000000..d5d046584 Binary files /dev/null and b/1989/1989.tar.bz2 differ diff --git a/1989/Makefile b/1989/Makefile new file mode 100644 index 000000000..51237183d --- /dev/null +++ b/1989/Makefile @@ -0,0 +1,90 @@ +# %W% %G% %U% +# +# 1989 makefile +# +# Copyright (c) 1989, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL=/bin/sh +CFLAGS=-O +CC=cc + +WINNERS=ovdluhe jar.1 jar.2 fubar westley paul robison roemer vanb tromp.bsd +ALTERNATE=jar.1.orig fubar.orig tromp.s5 + +all: ${WINNERS} + +ovdluhe: ovdluhe.c + ${CC} ${CFLAGS} $? -o $@ + +# NOTE: jar.1.c outputs its string in one section +# this program may not print well on some terminals +jar.1: jar.1.c jar.1.sh + rm -f jar.1 + cp jar.1.sh jar.1 + chmod +x jar.1 +# NOTE: The jar.1.orig file is the original entry +jar.1.orig: jar.1.orig.c jar.1.orig.sh + rm -f jar.1.orig + cp jar.1.sh jar.1.orig + chmod +x jar.1.orig + +jar.2: jar.2.c + ${CC} ${CFLAGS} $? -o $@ + +# NOTE: fubar.c uses the /bin/sh shell +fubar: fubar.c fubar.sh + rm -f fubar + cp fubar.sh fubar + chmod +x fubar +# NOTE: The fubar.orig.c file is the original entry +fubar.orig: fubar.orig.c fubar.orig.sh + rm -f fubar.orig + cp fubar.orig.sh fubar.orig + chmod +x fubar.orig + +westley: westley.c + ${CC} ${CFLAGS} -Dtrgpune=putchar $? -o $@ + +paul: paul.c + ${CC} ${CFLAGS} $? -o $@ + +robison: robison.c + ${CC} ${CFLAGS} $? -o $@ + +roemer: roemer.c + ${CC} ${CFLAGS} $? -o $@ + +# NOTE: this version requires BSD style signals and setitimer +# this may not work well on low baud rate terminals +# the file tromp.bsd.c is the original version +tromp: tromp.bsd.c + ${CC} ${CFLAGS} $? -o $@ + touch HI + -chmod 0666 HI +# NOTE: sites without BSD style signals and setitimer (e.g. System V.3) +# should use this version +tromp.s5: tromp.s5.c + ${CC} ${CFLAGS} $? -o $@ + touch HI + -chmod 0666 HI + +vanb: vanb.c + ${CC} ${CFLAGS} $? -o $@ + +clean: + rm -f ovdluhe.o jar.2.o fubar.o westley.o paul.o robison.o + rm -f roemer.o tromp.o vanb.o + rm -f x x1 ouroboros.c ouroboros.o fubar.orig.o tromp.bsd.o tromp.s5.o core +clobber: clean + rm -f ${WINNERS} + rm -f jar.1.o HI + rm -f ${ALTERNATE} +nuke: clobber + @true +install: all + cat ${WINNERS} > /dev/null diff --git a/1989/README b/1989/README new file mode 100644 index 000000000..d71136be8 --- /dev/null +++ b/1989/README @@ -0,0 +1,32 @@ +1989 marked the "The Sixth International Obfuscated C Code Contest" + +Copyright (c) 1989, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + +Instructions for use: Run make to compile entries (it is possible +that on System V or non-unix systems the makefile needs to be +changed). Look at the source and try to figure out what the programs +do, and run them with various inputs. If you want to, look at the +hints files for (minor) spoilers. + +This year, the Grand Prize was given to the most useful program. + +The "Strangest abuse of the rules" award was given this year to stress +the fact that starting in 1990, compiling entries must result an +executable regular file. + +In two other cases, we included System V portable versions of winning +programs. The makefile always uses the portable version of the "Best +self modifying program" because there as no loss of functionality in +using it. In the case of the "Best game" winner, however, some +functionality is lost in the portable version and so the makefile uses +the original program. System V users may need to change the makefile +to use the s5 version. See the hint files or the Makefile for details. + +Rules and results were posted to comp.lang.c, comp.sources.unix, and +alt.sources. They have been made available on a wide number of Usenet +archive sites such as uunet. The 1989 winners will be published in the +Micro/Systems Journal. diff --git a/1989/fubar.c b/1989/fubar.c new file mode 100644 index 000000000..51d90b022 --- /dev/null +++ b/1989/fubar.c @@ -0,0 +1,19 @@ + +#include +#define QQ 1 +#define TT 1 +#define cc main(c,v) int c; char **v;{char tt[12],qq[7]; int q=0,o=1,l=1,m=1;struct {int c;} f; +#define ouroboros qq[6]='\0';tt[11]='\0';if(QQ==atoi(v[1])+1){(void)fprintf(stderr,"%s factorial = %d\n",v[1], TT);exit(1);}o=c+f +#define x ;while(EOF!=(o=getchar())){if(l && q=='Q' && o=='Q'){l=0;(void)getchar();(void)fread(qq,6,1,stdin);(void)printf("Q %6d",atoi(qq)+1);}else +if(m && q=='T' && o=='T'){m=0;(void)fread(tt,11,1,stdin);(void)printf("T %9d\n",atoi(tt)*QQ);}else {q=o;(void)putchar(o);}}exit(0);} +cc ouroboros.c -o x +#define zxc ;{/* +cat ouroboros.c | x $1 > x1 +if [ $? -ne 0 ]; then +exit +fi +mv x1 ouroboros.c +chmod +x ouroboros.c +exec ouroboros.c $1 +exit +*/ diff --git a/1989/fubar.hint b/1989/fubar.hint new file mode 100644 index 000000000..aec2ed9c6 --- /dev/null +++ b/1989/fubar.hint @@ -0,0 +1,60 @@ +Best self-modifying program: + + Jay Vosburgh + Sequent Computer Systems, Inc + 15450 SW Koll Parkway + Beaverton, OR + 97006 + USA + +Judges notes: + + Run this with a single digit argument (or wait a long time). + + There are 2 versions of this program, the one that was entered, + and one that was changed by the judges to be more portable. The + makefile runs the latter version by default. + + The blank line at the beginning of the source is mandatory. + Do you know why? + + The shell script run by the makefile joins lines that may be + cut up by mailers. The file "fubar.orig.c", for example, needs + the 6th and 7th lines joined together (with a space between + them) to recreate the original entry. If you fix the file, you + will need to change the last 8 linnes of "fubar.orig.sh" to read: + + cp fubar.orig.c ouroboros.c + chmod +x ouroboros.c + csh ouroboros.c $1 + rm -f ouroboros.c x1 x + + The more portable version, "fubar.c", can be fixed by joining the + 7th and 8th lines in the same way. As well, if you fix "fubar.c" + you will need to also change the last 8 lines to "fubar.sh" to read: + + cp fubar.c ouroboros.c + chmod +x ouroboros.c + csh ouroboros.c $1 + rm -f ouroboros.c x1 x + +Selected notes from the author: + + In a nutshell, this is probably the slowest and most + obnoxious factorial program ever written. Unfortunately, + the name of the C source must be "ouroboros.c"; the name is + hard-coded into the program. + + The source is a legal shell script and a legal C program. + The shell script compiles itself, and then executes the + resulting binary, giving the source as input. The program + works by successively modifying #define lines each pass through. + + Both "indent" and "cb" will damage the program, "indent" + much more so. + +Copyright (c) 1989, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1989/fubar.orig.c b/1989/fubar.orig.c new file mode 100644 index 000000000..d566c64ca --- /dev/null +++ b/1989/fubar.orig.c @@ -0,0 +1,18 @@ +#include +#define QQ 1 +#define TT 1 +#define cc main(c,v) int c; char **v;{char tt[12],qq[7]; int q=0,o=1,l=1,m=1;struct {int c;} f; +#define incest qq[6]='\0';tt[11]='\0';if(QQ==atoi(v[1])+1){(void)fprintf(stderr,"%s factorial = %d\n",v[1], TT);exit(1);}o=c+f +#define x ;while(EOF!=(o=getchar())){if(l && q=='Q' && o=='Q'){l=0;(void)getchar();(void)fread(qq,6,1,stdin);(void)printf("Q %6d",atoi(qq)+1);}else +if(m && q=='T' && o=='T'){m=0;(void)fread(tt,11,1,stdin);(void)printf("T %9d\n",atoi(tt)*QQ);}else {q=o;(void)putchar(o);}}exit(0);} +cc incest.c -o x +#define zxc ;{/* +cat incest.c | x $1 >! x1 +if ($status != 0) then +exit +endif +mv x1 incest.c +chmod +x incest.c +exec incest.c $1 +exit +*/ diff --git a/1989/fubar.sh b/1989/fubar.sh new file mode 100644 index 000000000..52e1136e3 --- /dev/null +++ b/1989/fubar.sh @@ -0,0 +1,19 @@ +: +# to run fubar in the 'proper' way + +# parse args +if [ $# -ne 1 ]; then + echo "usage: $0 number" 1>&2 + exit 1 +fi + +# run/compile it +rm -f ouroboros.c x1 x +ex - < +#a +#a +#d p char* +#d P ,(p) +#d T(E) !strcmp(E,"()") +#d U return +#d W while +#d X sbrk(199) +#d z atof +#d e isspace +#d D A(_) +#d E S(C(_)) +#d B(y) p y(_)p _;{ +#d G(y,V) B(y)p i;U sprintf(i=X,"%lf",z(E)V z(S(C(D)))),i;} + + p sbrk(),*S(),*j(),*O,*H;K,Y,M=14;double + z();Q(_)p _;{int V=0;W(e(*_))_++;H=_;W(V|!(e + (*H)|*H==')'||(*H=='('&&H-_)))V+=(*H=='(')-(*H== + ')'),H++;U H-_;}B(C)U _++,Y=Q(_),_=strncpy(X,_,Y),_[ + Y]=0,_;}B(A)_++,_+=Q(_);W(e(*_))_++;U O=X,*O='(',strcpy( + O+1,_),O;}B(Z)U _;}B(c)U C(E);}B(q)U A(E);}B(t)p i=E;U H=S(C +(D)),sprintf(O=X,T(H )?"(%s)":"(%s %s",i,H+1) + + ,O;}B(F)U S(C(A(T(E)?D:_)));}L(i,s)p + +i,*s;{U isdigit(*i) ? z(i)!=z(s):strcmp(i,s);} + B(b)U L(E,S(C(D)))?"()":"t";}B(R)U E;}B(o)U z(E) +typedef char ape +#define D define +#D EA register +#D EP unsigned +#D A 1 +#D AP (A<>A) +#D APE {EA EP ape ea=AE;while(ea--) e[ea]=E;} +;ape a[PE+A],ap,*ae,p[P+A],e[AE]; +main(){ape pe,*ep=a;srand((EP)time((long)E)); +while(((*(ep++)=getchar())!=-A)&&((ep-a) +#define f int +#define v (void)printf( +#define x ),exit(1); +#define y ){if(n)c=z(n,u),u=n,n=c;o[i]=n?'0'+(1&*n):'0';} +#define z(a,b) (f*)(~1&*a^(f)b) +#define k(l) if(!(l=(f*)malloc(sizeof(l))))v 23+m x if(1&(f)l)v 39+m x*l= +r(p,q,d)f*p,*q;{char o[81];f*n=p,i=39,*c,*u=d?q:z(p,q);o[40]='0'+(1&*p); +for(;i>=0;i--y u=d?z(p,q):q;n=p;for(i=41;i<79;i++y o[i++]='\r';o[i++]=0; +v o);(void)fflush(stdout);sleep(1);} +main(a,c)char**c;{char*u,*malloc(),*m= +"Usage: black [string]\n\0No more memory\n\0Unusable memory alignment\n\0jt,s@m@ (beleY%XX&Yz {z&z}i|R(|)*((.)i)hiniFiGJ%FG.JJgJ: ;;&;z {z&z}-RS/ROiOV OP+PsaPh+ijainnjmamfmfAlnnnnphppopv%vvgv.aABiB1/BVP11/1.%..&.OhrR-WV V1#1VP1CcC0R\ +\n\n'CVP0\n!\n\n'\nEaEEnEamat!akckk'kwaww'wz,zzozEit +", +*n=m;f*q,*p=0,*g,b=3,d; +if(a>2)v m x n=a>1?c[1]:n; +/*v"\t\t\t\t\tV\n");*/ +k(q)0;u=n;a=~1&'j'; +while(a!='x'){ + /*r(q,p,b);*/ + for(;;u+=3){ + u= *u?u:n; + if((~1&*u)==a&&(1&*q)<<1==(2&u[2]))break; + } + a=~1&u[1]; + d=(8&u[2])>>3; + if(16&u[2])putchar(u[3]); + if(4&u[2])*q|=1;else*q&=~1; + if(b==d)g=p;else{ + g=z(q,p); + if(!g){k(g)(f)q;*q^=(f)g;} + } + p=q;q=g;b=1-d; +} +/*r(q,p,b);v"\n");*/exit(0); +} diff --git a/1989/paul.hint b/1989/paul.hint new file mode 100644 index 000000000..0e65d3c0c --- /dev/null +++ b/1989/paul.hint @@ -0,0 +1,109 @@ +Most complex algorithm: + + Paul E. Black + CIRRUS LOGIC, Inc. + 1463 Centre Pointe Dr. + Milpitas, CA + 95035 + USA + +Judges notes: + + The original source contained a long line which caused many + mailers to barf. The original file may be re-constructed by + removeing the trailing "\" on line 12 and joining lines 12 and + 13 together without a space. + + WHAT FOLLOWS IS A DETAILED PROGRAM EXPLINATION AND SPOILER. + IF YOU WANT A REAL CHALLENGE, DON'T READ ANY FURTHER AND TRY + TO UNDERSTAND THE PROGRAM VIA THE SOURCE. + + +Selected notes from the author: + + This programs computes and prints Fibonacci numbers by + simulating a Turing machine with the proper program. + Understanding the C program, i.e., a Turing machine simulator, + is only the first and simplest step. The Turing machine + program must be understood, too! (it is trivial, perhaps even + natural to write incredibly obscure Turing programs.) + + If the program is invoked with an operand, the operand is used + as the Turing program. It includes a "trace" facility, + subroutine r (commented out for obscurity), to help write and + debug Turing programs. Just the thing for some fun in a Theory + of Computation class. + + The Turing machine tape is represented as a doubly linked list + of pointers. The forward and backward links are XOR'd together + and stored in one pointer. If we always keep one of the links + on hand, we can recover the other link at any time. The + variable q is the scan head (and a pointer at some tape cell), + and p is a "previous" link. The state of the tape is stored in + the low order bit of the pointer. Since we always allocate an + even number of bytes, the low order bit carries no information + (see portability below.) Memory representing a tape cell is + allocated when the cell is first scanned. Thus the simulation + begins with a tape effectively the size of virtual memory set + to all zeros. Since a header can be added to any Turing + program to write initial data and position the scan head, this + is little loss of generality. + + The simulated Turing machine has a single tape with either an 1 + or a 0 in each cell. The Turing machine language format is a + string of three bytes. The first byte is the current state. + The second byte is the next state. (The last bit of states is + ignored, e.g., B and C are the same state, in an attempt to be + able to have interesting words in the program.) The third byte + is composed of bits. Bit 1 (2&byte) is the symbol scanned, + i.e. an instruction is selected for state and for a match with + the symbol under the scan head. Bit 2 (4&byte) is the new + symbol to be written to the cell. Bit 3 (8&byte) is the + direction to move the scan head: 0 for left and 1 for right. + If bit 4 (16&byte) is true, the next character is sent to + stdout. (I added this feature so programs could print + results.) + + The Turing machine has next state 'j' when it begins. The + cycle is 1) exit if the state is 'x', 2) find the next + instruction (given the state and the character under the scan + head). [The program string is searched forward for the next + matching instruction. If the end of the string is reached, the + search begins again at the first of the string. Thus states + can be used as local labels in different places.] 3) change to + the next state, 4) print a character if indicated, 5) write the + tape symbol, and 6) move the scan head. The cycle then repeats + with step 1. A call to the trace routine is just before step + 2, but is commented out. + + The following ROT13'ed text is a quick outline of the actual + Turing program: + + Urer vf n dhvpx bhgyvar bs gur Ghevat cebtenz: gur + cerivbhf naq pheerag Svobanppv ahzoref ner xrcg va onfr + 1 sbez jvgu gur pheerag ba gur evtug. Gur svefg guerr + fgrcf frg hc gur svefg gjb ahzoref, 1 naq 1. Gura + [ortvaavat jvgu "@ ("] n znexre bs VVV vf perngrq naq + gur pheerag ahzore vf pbcvrq gb gur evtug bs gur + znexre. Gura [ortvaavat jvgu "BI "] gur ahzore vf + pbairegrq gb ovanel ol ercrngrq qvivqvat ol 2 yrnivat V + sbe erznvaqre 1, naq VV sbe erznvaqre 0. Arkg + [ortvaavat jvgu "JI "] gur ovanel ercerfragngvba vf + cevagrq naq vgf flzobyf naq gur znexre ner renfrq. + Svanyyl [ortvaavat jvgu "RRa"] gur gjb ahzoref ner + nqqrq naq gur pheerag ahzore pbcvrq gb gur yrsg gb + orpbzr gur cerivbhf. Gura gur plpyr ercrngf. + + The program requires that the lowest bit of a pointer to be 0. + + I could have squeezed the program under 1024 bytes without the + trace subroutine, but I felt it was important for understanding + the program. Besides it is fun to watch the tape zooming back + and forth as the program runs. A much better debugger or trace + could easily be added. + +Copyright (c) 1989, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1989/robison.c b/1989/robison.c new file mode 100644 index 000000000..3a3a72cb0 --- /dev/null +++ b/1989/robison.c @@ -0,0 +1,33 @@ + typedef struct A*B,*(*C)();struct A{C(*d)();B e;}*v(),*b;C n[256]; +# include +#define a (d->e) +#define o (B)printf +#define X(_){return _;} +#define Y(_,A)B _(d,e)B d,e;X(A) +#define Z(P)C P(f,g,h,i)C f,g,h,i;X(P) +#define c(_)(b=(B)malloc(sizeof(*b)),b->d=_,b->e=d,b) +#define _(D,E,F,G,H)B D();Y(D/**/f,E)Y(D/**/g,F)Y(D/**/h,G)Y(D/**/i,H)Y(D,(*(*d->d)(D/**/f,D/**/g,D/**/h,D/**/i))(d,e)) +Z(f) +Z(g) +Z(h) +Z(i) +_(j,d,d,j a,j a) +_(k,d,c(h),c(h),c(h)) +_(l,c(i),d,c(i),c(i)) +_(m,c(g),c(f),l(m a),k(m a)) +_(p,d,l(m(d)),k(p a),l(m a)) +_(q,l(p(d)),m(d),l a,k(q a)) +_(r,m(d),k(mf a),l(r a),k a) +_(s,d,e,o("0",s a),o("1",s a)) +_(t,d,p(e),k(t(a,e)),v(k(t(a,e)),e)) +_(u,k(e),l(r(e)),k(v(a,e)),l(v(a,e))) +_(v,e,r(e),u(e,a),u(q(e),a)) +_(w,o("0"),d,s(d),s(d)) +_(x,(*n[getchar()])(d),o("-1"),w(p(d,o("-"))),xh(d)) +_(y,xf(mg()),v(d,p(yf())),v(d,yf()),t(d,yf())) +_(z,xf(yf()),(*(*j(d)->d)(w,x))(d),xf(k(d)),xf(l(d))) +main(){ +n['(']=zf;n['x']=yi;n['-']=yg; +n['+']=yh;n['0']=zh;n['1']=zi; +n[' ']=xf;n[')']=n['\n']=kf; +o("\n",zg(yf()));} diff --git a/1989/robison.hint b/1989/robison.hint new file mode 100644 index 000000000..e044ce8bc --- /dev/null +++ b/1989/robison.hint @@ -0,0 +1,51 @@ +Best minimal use of C: + + Arch D. Robison + University of Illinois + 1304 W. Springfield Ave. + Urbana, IL + 61801 + USA + +Judges notes: + + Sites with punch card facilities will be happy to note that + the source deck can be re-collated with an ASCII sort. + + Note that this program uses only a small subset of the + constructs that the C language supports. + +Selected notes from the author: + + This program is a handy picoAPL interpreter written in C--. It + outputs the evaluation of an APL expression from standard + input. Functions are limited to dyadic +,-,x, and unary -; + numerals must be binary. Parentheses may be used for + grouping. For example: + + 101x111-100 + + prints: + + 1111 + + That is 5x(7-4) is 15. (APL groups from right to left.) + Extending it to the full APL language should be trivial. + + The C-- language improves the C language by removing superfluous + and confusing features: arithmetic, logical operations, shifts, + relationals, address-of, and flow control. In fact, the only + expressions retained are function calls, indirection, array + assignments, the ',' operator, and sizeof. Despite these + restrictions, the C-- program does arithmetic on arbitrarily + large binary numbers. + + To obtain a C-- reference, simply rip out the irrelevant pages + from your K&R C manual. To obtain a C-- compiler, simply rip + out the irrelevant bytes from your cc compiler. + +Copyright (c) 1989, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1989/roemer.c b/1989/roemer.c new file mode 100644 index 000000000..3e476f597 --- /dev/null +++ b/1989/roemer.c @@ -0,0 +1,36 @@ + + + char + _3141592654[3141 + ],__3141[3141];_314159[31415],_3141[31415];main(){register char* + _3_141,*_3_1415, *_3__1415; register int _314,_31415,__31415,*_31, + _3_14159,__3_1415;*_3141592654=__31415=2,_3141592654[0][_3141592654 + -1]=1[__3141]=5;__3_1415=1;do{_3_14159=_314=0,__31415++;for( _31415 + =0;_31415<(3,14-4)*__31415;_31415++)_31415[_3141]=_314159[_31415]= - +1;_3141[*_314159=_3_14159]=_314;_3_141=_3141592654+__3_1415;_3_1415= +__3_1415 +__3141;for (_31415 = 3141- + __3_1415 ; _31415;_31415-- + ,_3_141 ++, _3_1415++){_314 + +=_314<<2 ; _314<<=1;_314+= + *_3_1415;_31 =_314159+_314; + if(!(*_31+1) )* _31 =_314 / + __31415,_314 [_3141]=_314 % + __31415 ;* ( _3__1415=_3_141 + )+= *_3_1415 = *_31;while(* + _3__1415 >= 31415/3141 ) * + _3__1415+= - 10,(*--_3__1415 + )++;_314=_314 [_3141]; if ( ! + _3_14159 && * _3_1415)_3_14159 + =1,__3_1415 = 3141-_31415;}if( + _314+(__31415 >>1)>=__31415 ) + while ( ++ * _3_141==3141/314 + )*_3_141--=0 ;}while(_3_14159 + ) ; { char * __3_14= "3.1415"; + write((3,1), (--*__3_14,__3_14 + ),(_3_14159 ++,++_3_14159))+ + 3.1415926; } for ( _31415 = 1; + _31415<3141- 1;_31415++)write( + 31415% 314-( 3,14),_3141592654[ + _31415 ] + "0123456789","314" + [ 3]+1)-_314; puts((*_3141592654=0 +,_3141592654)) ;_314= *"3.141592";} diff --git a/1989/roemer.hint b/1989/roemer.hint new file mode 100644 index 000000000..9f3eea6d0 --- /dev/null +++ b/1989/roemer.hint @@ -0,0 +1,29 @@ +Best layout: + + Lievaart, Roemer B. + VU-Informatica, Amsterdam + Marcusstraat 29/2, + NL 1091 TJ Amsterdam + Netherlands + +Judges notes: + + Do you know what this program does? If you do, look again, + there is more here than meets the PI. + +Selected notes from the author: + + Passes lint, but not with the strictest options, for it + contains some "null-statements", as well two identifiers + which are, if compilers only take 6 characters, the same. It + also uses write(2), so not totally system independent. + + You are very much invited to pass this program through a + C-beautifier. (First strip newlines and tabs, if your cb can't + do that.) + +Copyright (c) 1989, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1989/rules b/1989/rules new file mode 100644 index 000000000..d5ee51c00 --- /dev/null +++ b/1989/rules @@ -0,0 +1,211 @@ +Subject: 6th International Obfuscated C Code Contest Rules +Newsgroups: comp.lang.c,comp.unix.wizards +Keywords: rules,1989,obfuscate,contest,IOCCC + +Copyright (c) 1989, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: Their emotions obfuscated their + judgement. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show what should NOT be done in C programs. + * To provide a safe forum for poor C code. :-) + +RULES: + + To help us handle the vast volume of entries, we ask that you + follow the rules below. Sorry for the length, but we need all + the help we can get! + + 1) Your source MUST be 1536 bytes or less, and it must be a complete + program, not just a subroutine. + + 2) To help us process your entries, we ask that you submit entries + in the following format. Please be sure to include the --- lines, + otherwise our extraction program may skip your entry! + +---header items--- +name: Your name, of course! +org: School/Company/Organization +email address: Email address from a well known site, or in a registered domain +postal address: Postal address + include your country as well +environment: Indicate the Hardware + and OS under which your program was tested +entry: 5 +remarks: +---how to compile--- +X Give the command(s) needed to compile your program. +X Follow the same rules as given for the program below except that the +X command size must be 160 characters or less. +---program--- +X Place obfuscated source of 1536 characters or less in this section. +X Add a leading X to each line to avoid problems with mailers. +X Some mailers don't like files with very long lines. If your entry contains E +C lines longer 80 chars we ask you to form continuation line sets. To form E +C a continuation line set, place an 'E' character at the point of a split E +C and place a C (instead of an X) at the beginning of the next line. E +C Finally, end the continuation line set as normal. +X The E\nC's and leading X's will be removed prior to extraction and thus E +C they don't contribute toward the source character count. All other E +C characters are considered to be source. Whitespace after 'X' or 'C' E +C and before the 'E' is significant, we added it here for readability. +X Newlines and tabs each count as 1 character. Assume 8 character tab stops. +X If your entry does not end in a newline, leave a final 'E' on the end. E +---end--- + + 3) Regarding the header items: + + * Any text outside of the above format will be kept confidential. + + * All header lines are required, but you may use 'anonymous' + for any header line other than 'remarks' or 'entry'. + + * In the 'remarks' please include: + - what this program does + - why you think the program is obfuscated + - any other remarks you wish to make + + 4) Your entry should be written in common C. (K&R + common extensions) + Due to the lack of ANSI C compilers, it is suggested, but not + required, that you avoid use of constructs unique to ANSI C. + + 5) The program must be of original work. All programs must be + in the public domain. All copyrighted programs will be rejected. + + 6) Entries must be received between 26-Mar-89 0:00 GMT and + 26-May-89 0:00 GMT. Email your entries to: + + ...!{sun,pacbell,uunet,pyramid,amdahl}!hoptoad!obfuscate + + We will attempt to Email a confirmation of receipt of contest + entries, however since Email is not reliable you may not receive it. + We regret that we can no longer accept entries via postal mail. + + 7) Each person may submit up to 8 entries. Multiple entries must + be sent in separate Email letters. + + 8) Entries that can not be built automatically in a portable makefile + are not allowed. (e.g., don't use #include "/dev/tty") + + +ANNOUNCEMENT OF WINNERS: + + * First announcement will be at the Summer 89 Usenix BOF. + + * Winning entries will be posted in mid June 1989 to + comp.sources.unix as well as news groups where these rules + were posted. (depending on the judges work load) + + * Winning entries will be deposited into the uunet archives. + + * An article containing the winning entries will be published + in a future issue of the "Micro/Systems Journal". + + * Winners receive international fame and flames! :-) + + +JUDGING: + + Awards will be given to the best entry in a number of categories. + The actual category list will vary depending on the types of entries + we receive. As a guide, consider using the following: + + * The best small one line program + * The most obscure algorithm + * The strangest source layout + * The most useful obfuscated program + * The most creatively obfuscated program + * Best obfuscated entry smaller than 256 bytes + * Best obfuscated entry smaller than 1024 bytes + * + +POINTS TO PONDER: + + People are encouraged to examine winners of the previous + contests. A copy of these entries was posted to + comp.sources.unix. Contact the comp.sources.unix moderator, or + some archive site (such as uunet). Keep in mind that rules + change from year to year, so some winning entries may not be + valid entries this year. What was unique and novel one year + might be 'old' the next year. In short, use your best judgement. + + We examine each entry on several levels of confusion. For example + each entry is judged when we: + + * look at the original source + * run it through: sed -e ',^#[ ]*define,d' | /lib/cpp + * run it through a C beautifier + * examine the algorithm + * compile and lint it + * execute it + + One line programs are best when they are short, obscure and concise. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS or Un*x version specific + (index/strchr differences are ok, but + socket/streams specific code is likely not to be) + * dump core or have compiler warnings + (it is ok only if you warn us in the 'remark' header item) + * won't compile under both BSD or SYS V Un*x + * use an excessively long compile line to get around the + size limit + * are longer than they need to be + * are similar to previous winners + * are similar to previous losers :-) + + Simply abusing #defines or -Dfoo=bar won't go as far as a program + that is more well rounded in confusion. + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + We like programs that: + + * are as concise and small as they need to be + * do something quasi-interesting + * pass lint without complaint + * are portable + * are unique or novel in their obfuscation style + * use a number of different types of obfuscation + * make us laugh and/or throw up :-) + + Some types of programs can't excel in some areas. We try to account + for this by giving awards to programs in a number of areas. Of course, + your program doesn't have to excel in all areas, but doing well in + several helps. + + Be creative! + + The Judging will be done by Landon Noll and Larry Bassel. If you have + any QUESTIONS or COMMENTS, please feel free to send them to: + + ...!{sun,pacbell,uunet,pyramid,amdahl}!hoptoad!judges + judges@toad.com + + however contest entries should be sent to: + + ...!{sun,pacbell,uunet,pyramid,amdahl}!hoptoad!obfuscate + obfuscate@toad.com + + +chongo /\cc/\ hoptoad!chongo +Larry Bassel {amdahl,ucbvax,cbosgd}|sun!lab + +p.s. The 1989 contest is being dedicated to the |\_.^ + brain that was removed from Bill the Cat. (@ o) + *Ackpt!* {:} + U diff --git a/1989/tromp.bsd.c b/1989/tromp.bsd.c new file mode 100644 index 000000000..9285810f5 --- /dev/null +++ b/1989/tromp.bsd.c @@ -0,0 +1,19 @@ +long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}c,d,l,v[]={(int)t,0,2},w,s,I,K +=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1, +12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12, +1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12, +12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i<264;)if((k=q[i])-Q[i] +){Q[i]=k;if(i-++I||i%12<1)printf("\033[%d;%dH",(I=i)/12,i%12*2+28);printf( +"\033[%dm "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+ +n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char* +*V,*a;{h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i< +25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigvec(14,v, +0);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+ +12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){ +for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c +=a[5]);}}if(c==*a)G(--x)||++x;if(c==a[1])n=f+4**(m=n),G(x)||(n=m);if(c==a[2])G +(++x)||--x;if(c==a[3])for(;G(x+12);++w)x+=12;if(c==a[4]||c==a[5]){s=sigblock( +8192);printf("\033[H\033[J\033[0m%d\n",w);if(c==a[5])break;for(j=264;j--;Q[j]= +0);while(getchar()-a[4]);puts("\033[H\033[J\033[7m");sigsetmask(s);}}d=popen( +"stty -cbreak echo stop \023;cat - HI|sort -rn|head -20>/tmp/$$;mv /tmp/$$ HI\ +;cat HI","w");fprintf(d,"%4d on level %1d by %s\n",w,l,getlogin());pclose(d);} diff --git a/1989/tromp.hint b/1989/tromp.hint new file mode 100644 index 000000000..57313d5cb --- /dev/null +++ b/1989/tromp.hint @@ -0,0 +1,115 @@ +Best game: + + John Tromp + Centre for Mathematics and Computer Science (CWI) + Oetgensstraat 7 + 1701CK Heerhugowaard + Netherlands + +Judges notes: + + This is a character terminal version of the TETRIS program. + It runs on a VT100 compatible terminal or emulator. It is + best used at 4800 baud or more. + + Usage: + + tromp [drops_per_sec [cmd_string]] + tromp.s5 [1 [cmd_string]] + + By default, "drops_per_sec", the number of times an object + will drop in a second, is 2. The default "cmd_string" is + "jkl pq". The first 6 characters of "cmd_string" relate + to the following 6 game commands: + + j - left + k - rotate + l - right + - drop + p - pause + q - quit + + Specifying "cmd_string" allows one to re-define the commands. + The pause command pauses the game, clears the screen and + prints the current score. To un-pause, type the pause + character again, which by default is "p". + + This original program requires a BSD-style interval timer and + and new BSD signal interface. If you are using System V.3 + or earlier, for example, you will need to make "tromp.s5" + instead of "tromp". You can change the default make rule + by changing "tromp" to "tromp.s5" in the "WINNERS=..." line + of the Makefile. + + The "tromp.s5" version is not as functional as "tromp". + The "drops_per_sec" is ignored and defaults to 1. The level + is always reported as 0. + + As was stated last year, we are likely to be more strict about + portability in the future. [ We mean it this time :-) ] + +Selected notes from the author: + + This program plays the familiar game of `TETRIS' with the + following features: + + * outputs vt100-like escape-sequences for cursor + positioning and normal/reverse video in curses + like fashion (minimal output for screen updates) + + * continuously increasing speed (except in pause) + + * start speed selectable by giving n as first argument, + where n is the number of drops per second (default=2). + + * controls also selectable by giving as the second argument + a string of 6 characters. By default they are "jkl pq". + + * screen is blanked during the pause and the score is shown + + * maintains a high-score table + + Giving a full path name for the table will result in a + system-wide hiscore allowing a competition between users. + +The author provided us with the following notes and new version of +the program: + + Here is a somewhat improved version of my tetris entry. All the + changes are in the popen() at the end. Formerly a move was done + to the HI score file which is not permitted for other users. Now + other users can change the HI score file. The extra option -m is + passed to sort, so that it knows that its input files are already + sorted. The -o output option of sort is used instead of a + temporary file. + + You may also want to consider giving just the raw option to stty + at the start and -raw at the end. This further reduces the size of + the program, but has the possible disadvantage that the program + can only by stopped by 'q' or by the `kill -9' command. + +long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}c,d,l,v[]={(int)t,0,2},w,s,I,K +=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1, +12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12, +1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12, +12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i<264;)if((k=q[i])-Q[i] +){Q[i]=k;if(i-++I||i%12<1)printf("\033[%d;%dH",(I=i)/12,i%12*2+28);printf( +"\033[%dm "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+ +n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char* +*V,*a;{h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i< +25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigvec(14,v, +0);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+ +12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){ +for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c +=a[5]);}}if(c==*a)G(--x)||++x;if(c==a[1])n=f+4**(m=n),G(x)||(n=m);if(c==a[2])G +(++x)||--x;if(c==a[3])for(;G(x+12);++w)x+=12;if(c==a[4]||c==a[5]){s=sigblock( +8192);printf("\033[H\033[J\033[0m%d\n",w);if(c==a[5])break;for(j=264;j--;Q[j]= +0);while(getchar()-a[4]);puts("\033[H\033[J\033[7m");sigsetmask(s);}}d=popen( +"stty -cbreak echo stop \023;sort -mnr -o HI - HI;cat HI","w");fprintf(d, +"%4d from level %1d by %s\n",w,l,getlogin());pclose(d);} + +Copyright (c) 1989, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1989/tromp.s5.c b/1989/tromp.s5.c new file mode 100644 index 000000000..7e5b7fe9e --- /dev/null +++ b/1989/tromp.s5.c @@ -0,0 +1,19 @@ +long h[4];E[80],S;t(){signal(14,t);if(S)longjmp(E,1);}c,d,l,v[]={(int)t,0,2}, +w,s,I,K=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9 +,-1,1,12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13, +10,-12,1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,- +11,-12,12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i<264;)if((k=q[i +])-Q[i]){Q[i]=k;if(i-++I||i%12<1)printf("\033[%d;%dH",(I=i)/12,i%12*2+28); +printf("\033[%dm "+(K-k?0:5),k);K=k;}alarm(1);Q[263]=c=((S=1)&&!setjmp(E))? +getchar():-1;alarm(0);}G(b){for(i=4;i--;)if(q[i?b+n[i]:b])return 0;return 1;}g +(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char**V,*a;{for(a=C>2?V[2]: +"jkl pq";i;i--)*n++=i<25||i%12<2?7:0;srand(getpid());system("stty raw -echo"); +signal(14,t);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c< +0){if(G(x+12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if( +j%12==10){for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G +(x=17)||(c=a[5]);}}if(c==*a)G(--x)||++x;if(c==a[1])n=f+4**(m=n),G(x)||(n=m);if +(c==a[2])G(++x)||--x;if(c==a[3])for(;G(x+12);++w)x+=12;if(c==a[4]||c==a[5]){ +printf("\033[H\033[J\033[0m%d\n",w);if(c==a[5])break;for(j=264;j--;Q[j]=0); +while(getchar()-a[4]);puts("\033[H\033[J\033[7m");}}system("stty cooked echo") +;d=popen("cat - HI|sort -rn|sed -n 1,20p>/tmp/$$;mv /tmp/$$ HI;cat HI","w"); +fprintf(d,"%4d on level %1d by %s\n",w,l,getlogin());pclose(d);} diff --git a/1989/vanb.c b/1989/vanb.c new file mode 100644 index 000000000..f6b8ebf3e --- /dev/null +++ b/1989/vanb.c @@ -0,0 +1 @@ +main(Q,O)char**O;{if(--Q){main(Q,O);O[Q][0]^=0X80;for(O[0][0]=0;O[++O[0][0]]!=0;)if(O[O[0][0]][0]>0)puts(O[O[0][0]]);puts("----------");main(Q,O);}} diff --git a/1989/vanb.hint b/1989/vanb.hint new file mode 100644 index 000000000..ec50b14d7 --- /dev/null +++ b/1989/vanb.hint @@ -0,0 +1,40 @@ +Best one liner: + + David Van Brackle + Department of Computer Science + University of Central Florida + Orlando, Florida + 32816 + USA + +Judges notes: + + This program computes all proper subsets of the set of + arguments passed to it. Each subset is printed with one + element on each line, followed by a line of ten dashes. + + Try: + + vanb the rug gary lent + vanb unix is better than os/2 + +Selected notes from the author: + + The program has the following charming and possibly + non-portable features: + + * It has no local or global variables, + only the command-line parameters. + + * It calls main recursively. + + * It alters the command-line parameters. + + * It uses the fact that if the high bit is set in a character + variable, the value is negative. + +Copyright (c) 1989, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1989/westley.c b/1989/westley.c new file mode 100644 index 000000000..852ea848b --- /dev/null +++ b/1989/westley.c @@ -0,0 +1,24 @@ + +/**//*/};)/**/main(/*//**/tang ,gnat/**//*/,ABBA~,0-0(avnz;)0-0,tang,raeN +,ABBA(niam&&)))2-]--tang-[kri - =raeN(&&0<)/*clerk*/,noon,raeN){(!tang&& +noon!=-1&&(gnat&2)&&((raeN&&( getchar(noon+0)))||(1-raeN&&(trgpune(noon +)))))||tang&&znva(/*//**/tang ,tang,tang/**|**//*/((||)))0(enupgrt=raeN +(&&tang!(||)))0(rahcteg=raeN( &&1==tang((&&1-^)gnat=raeN(;;;)tang,gnat +,ABBA,0(avnz;)gnat:46+]552&)191+gnat([kri?0>]652%)191+gnat([kri=gnat +(&&)1-^gnat(&&)1& ABBA(!;)raeN,tang,gnat,ABBA(avnz&&0>ABBA{)raeN +,/**/);}znva(/*//**/tang,gnat,ABBA/**//*/(niam;}1-,78-,611-,321 +-,321-,001-,64-,43-,801-,001-,301-,321-,511-,53-,54,44,34,24 +,14,04,93,83,73,63,53,43,33,85,75,65,55,45,35,25,15,05,94,84 +,74,64,0,0,0,0,0,0,/**/){ABBA='N'==65;(ABBA&&(gnat=trgpune +(0)))||(!ABBA&&(gnat=getchar(0-0)));(--tang&1)&&(gnat='n'<= +gnat&&gnat<='z'||'a'<=gnat&&gnat<='m'||'N'<=gnat&&gnat<='Z' +||'A'<=gnat&&gnat<='M'?(((gnat&/*//**/31/**//*/,21,11,01,9,8 +,7,6,5,4,3,2,1,62,52,42,/**/)+12)%26)+(gnat&/*//**/32/**//*/, +22,12,02,91,81,71,61,51,41{=]652[kri};)/*pry*/)+65:gnat);main +(/*//**\**/tang^tang/**//*/,/* */,~/*//*-*/tang,gnat,ABBA- +0/**//*/(niam&&ABBA||))))tang( rahcteg&&1-1= ver0.c + westley 1 < westley.c > ver1.c + westley 1 2 < westley.c > ver2.c + westley 1 2 3 < westley.c > ver3.c + + Try compiling and running the 4 resulting programs. + +Selected notes from the author: + + This is a filter. If it is run with no arguments, it copies + stdin to stdout. With one argument, it ROT13's stdin to + stdout. With two arguments, it reverses stdin to stdout. With + three arguments, it does both. It requires the ASCII character + set, with all characters being in 0..255, and EOF must be -1. + Also requires two's complement (I think). + + The source code will run if ROT13'ed and/or reversed, using a + different algorithm for each version (hereafter referred to as + ver0 (original), ver1 (ROT13), ver2 (reversed), and ver3 + (ROT13 and reversed)). + + When compiling these versions, one needs to define 'trgpune' + in the compile line. Example: + + cc -Dtrgpune=putchar ver3.c -o ver3 + + "trgpune" is the ROT13 of getchar(), so getchar() and putchar() + are exchanged in the ROT13 counterpart. It is easy to see that + this is unavoidable. I must have a #define for a library + function; otherwise I would have an unidentifed extern for the + ROT13 version. If I then define this function, it won't link + in the library version for the ORIGINAL code, since my + definition will supercede the library function. Hence, the + compiler option gives me putchar(), and allows me to use + getchar(). I pass a dummy argument to getchar() to eliminate + "variable number of args" from lint (unless it checks against + the library). Otherwise, all versions lint reasonably (main + returns random value & constant in conditional context [when I + check for ROT13 version] is all it complains about). + + ver0 and ver1 use a range check and a calculation to do ROT13, + while ver2 and ver3 use table lookup. All versions contain + main() and it's ROT13 fn, znva(). ver0/ver1 [ver2/ver3] are + (of course) syntactically identical, since the syntax is in the + non-alphabetic characters. However, since one program starts + at main() while it's ROT13 counterpart starts at znva(), znva() + calls main (znva() is also used for output). + + All versions use recursion to work. If the program is NOT + reversing it's output, it prints out the (possibly ROT13'd) + character before recursing, otherwise it prints it out + afterward (or doesn't recurse at all when EOF is reached). + Since most of this code is identical, it is put into znva() and + called with a first parameter of 0 as a flag (as "main()", it's + first argument (argc) must be at least one). + + I can't use any flow control. If I used if(), I would have a + function vs() to define in the ROT13 version. But a function + called vs() turns into a function called if() in the original, + so it can't be done. Therefore, I do: + + expr1 && expr2 && (expr3=etc); + + which is the same as: + + if (expr1 && expr2) expr3=etc; + + A/UX on the Macintosh doesn't get this right; it evaluates ALL + expressions if they aren't in an assignment or conditional + statement. This might warrant a warning, since other compilers + may do this. I found MANY compilers botched: + + expr1 && (expr2,expr3); + + expr2 was OFTEN evaluated even if expr1 was false. I removed + such statements to make it more portable. + + The variable names are worth noting: + + 'irk' and 'vex' are ROT13 pairs and are synonyms. + 'Near' and 'Arne' are ROT13 pairs and are anagrams. + 'NOON' and 'ABBA' are ROT13 pairs and are palindromes. + 'tang' and 'gnat' are both ROT13 and palindrome pairs! + + Normally (!), a reversible C program is done thus: + + /**/ forward code /*/ edoc drawkcab /**/ + + If your compiler nests comments, it will get this wrong. + However, I have made some bits of the code palindromic, + (or different, but reversible) so it is more like: + + /**/forward/*//**/ palindromic /**//*/drawkcab/**/ + + The code can therefore be interlaced. There are eight + such palindromic bits. You can find them within the + /*//**/ /**//*/ pairs. + + The body of the code of ver0 and ver1 is a large lumpy 'K' (for + Kernighan); the code of ver2 and ver3 is a flat-topped and + lumpier 'R' (for Ritchie). Judicious use of spaces and tabs + helped here. It barely fits on an 80x24 screen. Squint. Note + that the code must start with a blank line, or the reversed version + will lack a terminating newline. + +Copyright (c) 1989, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1990/1990.tar.bz2 b/1990/1990.tar.bz2 new file mode 100644 index 000000000..420cf08dd Binary files /dev/null and b/1990/1990.tar.bz2 differ diff --git a/1990/LANDER.BAS b/1990/LANDER.BAS new file mode 100644 index 000000000..1b515ba6f --- /dev/null +++ b/1990/LANDER.BAS @@ -0,0 +1,71 @@ +10 REM Lunar Lander +20 REM By Diomidis Spinellis +30 PRINT "You aboard the Lunar Lander about to leave the spacecraft." +60 GOSUB 4000 +70 GOSUB 1000 +80 GOSUB 2000 +90 GOSUB 3000 +100 H = H - V +110 V = ((V + G) * 10 - U * 2) / 10 +120 F = F - U +130 IF H > 0 THEN 80 +135 H = 0 +140 GOSUB 2000 +150 IF V > 5 THEN 200 +160 PRINT "Congratulations! This was a very good landing." +170 GOSUB 5000 +180 GOTO 10 +200 PRINT "You have crashed." +210 GOTO 170 +1000 REM Initialise +1010 V = 70 +1020 F = 500 +1030 H = 1000 +1040 G = 2 +1050 RETURN +2000 REM Print values +2010 PRINT " Meter readings" +2015 PRINT " --------------" +2020 PRINT "Fuel (gal):" +2030 PRINT F +2040 GOSUB 2100 + 100 * (H <> 0) +2050 PRINT V +2060 PRINT "Height (m):" +2070 PRINT H +2080 RETURN +2100 PRINT "Landing velocity (m/sec):" +2110 RETURN +2200 PRINT "Velocity (m/sec):" +2210 RETURN +3000 REM User input +3005 IF F = 0 THEN 3070 +3010 PRINT "How much fuel will you use?" +3020 INPUT U +3025 IF U < 0 THEN 3090 +3030 IF U <= F THEN 3060 +3040 PRINT "Sorry, you have not got that much fuel!" +3050 GOTO 3010 +3060 RETURN +3070 U = 0 +3080 RETURN +3090 PRINT "No cheating please! Fuel must be >= 0." +3100 GOTO 3010 +4000 REM Detachment +4005 PRINT "Ready for detachment" +4007 PRINT "-- COUNTDOWN --" +4010 FOR I = 1 TO 11 +4020 PRINT 11 - I +4025 GOSUB 4500 +4030 NEXT I +4035 PRINT "You have left the spacecraft." +4037 PRINT "Try to land with velocity less than 5 m/sec." +4040 RETURN +4500 REM Delay +4510 FOR J = 1 TO 500 +4520 NEXT J +4530 RETURN +5000 PRINT "Do you want to play again? (0 = no, 1 = yes)" +5010 INPUT Y +5020 IF Y = 0 THEN 5040 +5030 RETURN +5040 PRINT "Have a nice day." diff --git a/1990/Makefile b/1990/Makefile new file mode 100644 index 000000000..52737000f --- /dev/null +++ b/1990/Makefile @@ -0,0 +1,73 @@ +# %W% %G% %U% +# +# 1990 makefile +# +# Copyright (c) 1990, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL=/bin/sh +MAKE=make +MAKEFLAGS=e + +# uncomment the line to select the preferred type of compile +# +# You should also check the ansi.mk or common.mk for the +# proper compiler name and flags. +# +# NOTE ==> USE=ansi compile with an ANSI compiler by default +#USE=ansi +# NOTE ==> USE=common compile with a common K&R compiler by default +#USE=common + +WINNERS=cmills pjr westley stig tbr db dds theorem baruch jaw scjones + +all: + -@if [ "${USE}" = "common" ]; then \ + echo ${MAKE} -k -f common.mk all; \ + ${MAKE} -k -f common.mk all; \ + elif [ "${USE}" = "ansi" ]; then \ + echo ${MAKE} -k -f ansi.mk all; \ + ${MAKE} -k -f ansi.mk all; \ + else \ + echo "set USE= in Makefile to be ansi or common as desired"; \ + echo "or type: make -f ansi.mk for ansi makes"; \ + echo "or type: make -f common.mk for common K&R makes"; \ + exit 1; \ + fi + +ansi: + ${MAKE} -f ansi.mk all + +common: + ${MAKE} -f common.mk all + +${WINNERS}: + -@if [ "${USE}" = "common" ]; then \ + echo ${MAKE} -k -f common.mk $@; \ + ${MAKE} -k -f common.mk $@; \ + elif [ "${USE}" = "ansi" ]; then \ + echo ${MAKE} -k -f ansi.mk $@; \ + ${MAKE} -k -f ansi.mk $@; \ + else \ + echo "set USE= in Makefile to be ansi or common as desired"; \ + echo "or type: make -f ansi.mk for ansi makes"; \ + echo "or type: make -f common.mk for common K&R makes"; \ + exit 1;\ + fi + +clean: + ${MAKE} -f ansi.mk clean + ${MAKE} -f common.mk clean +clobber: + ${MAKE} -f ansi.mk clobber + ${MAKE} -f common.mk clobber +nuke: clobber + ${MAKE} -f ansi.mk nuke + ${MAKE} -f common.mk nuke +install: + ${MAKE} -f ansi.mk install + ${MAKE} -f common.mk install diff --git a/1990/README b/1990/README new file mode 100644 index 000000000..1cf585dd9 --- /dev/null +++ b/1990/README @@ -0,0 +1,33 @@ +1990 marked the "The Seventh International Obfuscated C Code Contest" + +Copyright (c) 1990, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + +Instructions for use: Run make to compile entries (it is possible that +on System V or non-unix systems the makefile needs to be changed). The +ansi.mk may need to be changed if your ANSI C compiler is not gcc. + +Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +(minor) spoilers. + +This year, the Grand Prize won a standing ovation at USENIX. + +The "Strangest abuse of the rules" award was given this year to stress +the fact that starting in 1991, entries should be shell-specific. + +This year was the first year that we accepted ANSI C entries. It was +interesting to note that the ANSI C entries were as a whole less +portable than the K&R C entries. We hope that in future contests +people will enter more obfuscated and challenging ANSI C programs. + +We would like to thank Barbara Frezza (loving wife of Larry Bassel) for +her role as official chef of the contest. Her opinions regarding +some of the contest entries were appreciated. + +Rules and results were posted to comp.lang.c, comp.sources.unix, and +alt.sources. They have been made available on a wide number of Usenet +archive sites such as uunet. diff --git a/1990/ansi.mk b/1990/ansi.mk new file mode 100644 index 000000000..09ecbeff8 --- /dev/null +++ b/1990/ansi.mk @@ -0,0 +1,86 @@ +# %W% %G% %U% +# +# 1990 makefile + +SHELL=/bin/sh + +# flags for ANSI compiles +# +# These flags are setup for gcc, change as/if needed +# +PEDANTIC=-pedantic +CFLAGS=-O -ansi +CHMOD=chmod +CC=gcc +CP=cp +RM=rm +LN=ln + +# winners that may be ok to compile with ANSI +# +WINNERS=cmills pjr westley stig tbr dg baruch jaw scjones + +all: ${WINNERS} + +ansi: all + +common: + @echo "wrong makefile, use common.mk" + exit 1 + +cmills: cmills.c + ${CC} ${CFLAGS} -DM=500 -DN=52 -DX="srand((int)time(0L))" -DV=void \ + -o cmills cmills.c + +pjr: pjr.c + ${CC} ${CFLAGS} pjr.c -o pjr + +westley: westley.c + ${CC} ${CFLAGS} westley.c -o westley + +stig: stig.c stig.ksh + @echo "run the Korn shell, and source stig.ksh" + @echo "or read stig.hint and create your own aliases" + +scjones: scjones.c + ${CC} ${CFLAGS} scjones.c -o scjones + +tbr: tbr.c + ${CC} ${CFLAGS} tbr.c -o tbr + +dg: dg.c + ${CC} ${CFLAGS} dg.c -Dindex=strchr -o dg + # compile with the following if you don't have strchr() + #${CC} ${CFLAGS} dg.c -o dg + +dds: dds.c LANDER.BAS + ${CC} ${CFLAGS} dds.c -o dds + +theorem: theorem.c + ${CC} ${CFLAGS} theorem.c -o theorem + ${RM} -f sorter.c + -./theorem -r 0 0 0 0 < theorem.c > sorter.c + ${CC} ${CFLAGS} sorter.c -o sorter + ${RM} -f fibonacci.c + -./sorter 0 0 0 0 < theorem.c > fibonacci.c + ${CC} ${CFLAGS} fibonacci.c -o fibonacci + +baruch: baruch.c + ${CC} ${CFLAGS} baruch.c -o baruch + +jaw: jaw.c shark.sh + ${RM} -f ./zcat ./atob ./jaw + ${CC} ${CFLAGS} ${PEDANTIC} jaw.c -o zcat + ${LN} zcat atob + echo 'PATH=;export PATH;atob|zcat' > jaw + ${CHMOD} 0555 ./jaw + +clean: + ${RM} -f *.o a.out core +clobber: clean + ${RM} -f ${WINNERS} sorter.c sorter + ${RM} -f fibonacci.c fibonacci atob zcat +nuke: clobber + @true +install: all + cat ${WINNERS} > /dev/null diff --git a/1990/baruch.c b/1990/baruch.c new file mode 100644 index 000000000..16f5cc08a --- /dev/null +++ b/1990/baruch.c @@ -0,0 +1,6 @@ +v,i,j,k,l,s,a[99]; +main() +{ + for(scanf("%d",&s);*a-s;v=a[j*=v]-a[i],k=i=s*k&&++a[--i]) + ; +} diff --git a/1990/baruch.hint b/1990/baruch.hint new file mode 100644 index 000000000..bc0668103 --- /dev/null +++ b/1990/baruch.hint @@ -0,0 +1,74 @@ +Best Small Program: + + Doron Osovlanski + CADTECH - CAD/CAM Systems Ltd + 24 Ben-Yosef st. + Givat-Shmuel 51905 + Israel + + Baruch Nissenbaum + Tel-Aviv University + The Faculty of Engineering + Tel-Aviv + Israel + + +Judges' comments: + + Compile. Try: + + echo 4 | baruch + echo 7 | baruch + + This program reads an integer between 4 and 99 from the stdin. + + NOTE: The original program did not have a newline at the end of + the file. We added a final newline to the file to make + unpacking easy. + + +Selected notes from the author: + + The goal of this work was to write a program that solves the + classic n-queen problem, with a board size of up to 99x99, while + keeping the program as short as possible. + + The program finds all possibilities to place N chess queens on + a NxN chess board so that no queen is in range of any other queen + (not in the same column row or diagonal). For each solution the + chess board and the place of the queens is printed to stdout. + + + This program is about as simple and as readable as possible. + To make things even more simple we used a very limited subset of C: + + No pre-processor statements + Only one, harmless, 'for' statement + No ifs + No breaks + No cases + No functions + No gotos + No structures + + In short, it contains no C language that might confuse the + innocent reader. :-) + + + This program demonstrates the claim that in C, any program + can be written using a single 'for' statement, as long as it is + long enough.. + +The authors further note: + + For PC users: + In order to compile the program under Turbo-C or MSC, 'int ' + should be inserted at the beginning of the program. + For better looking results it is recommended to replace the " #Q" + string with " \261\2". + +Copyright (c) 1990, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1990/cmills.c b/1990/cmills.c new file mode 100644 index 000000000..6848175d5 --- /dev/null +++ b/1990/cmills.c @@ -0,0 +1,30 @@ +#include +#include +#define S(q)B(*e=0),q,p); +#define W(w)if((w)<22)v= -v;else v-=10;else +#define F for(r=d;r1;){if(r-d>N*3/4){B(8));F++r)*r=c[(r-d)%13];F)w= +*(g=d+rand()%N),*g= +*r,*r++=w;r=d;}for(;;){B(3),y);if(!gets(l)||(w=atoi(l))<1)exit(0);if(w&1||w>M||w>y)B(1),y=w/2&&u(5)&&(y+=(3*(h(0,1[q])==10)-1)*w/2);if(x==-21)goto +_;if(v==-21){y+=w/2;goto +_;}while(x>-17&&x<17)H(x,g)while((v==20||*p==-1[e])&&y>=w&&u(6)){y-=w;++s;for(g=e++;2[g]= +*g,g!=p;)--g;*g++= +*e;*g=' ';i:v=h(h(0,*p),*e++= +*r++);S(t)if(*p=='A'&&-1[e]!= +*p)goto +_;}if(f=y>=w&&u(7))y-=w,H(v,e)while(!f&&v<22&&u(4)){H(v,e)if(v<22)S(t)}_:x<0&&(x= +-x);v<0&&(v= +-v);if(v<22)if(v==x)j+=w*++f;else +if(x>21||v>x)j+=w*2*++f;if(s--){*e++=' ';*e++= +*p;*e=0;for(e=p;*e=2[e];)e++;goto +i;}y+=j;S(q)};} diff --git a/1990/cmills.hint b/1990/cmills.hint new file mode 100644 index 000000000..e17fd0c91 --- /dev/null +++ b/1990/cmills.hint @@ -0,0 +1,45 @@ +Best Game: + + Chris Mills + Wyse Technology + 3471 N. 1st St. + San Jose CA 95134 + USA + + +Judges notes: + + Compile notes: + + cc -DM=500 -DN=52 -DX="srand((int)time(0L))" -DV=void -o cmills cmills.c + + -DM= + -DN=<52 * number of decks used> + -DX= + -DV= + + Usage: cmills [starting_cash] + + +Selected notes from the author: + + This is a blackjack program. It does splits, doubling down, + insurance, etc. + + As best I can figure, it should be ANSI-compliant, as well as + portable to BSD & sysV (as well as the irritating compiler I + was using which assumes x=*p++ means x*=p++!). It is + reasonably robust in its error handling---it won't let you + split, double, etc. unless you actually have the cash, etc. To + terminate the program, hit EOF or type 0 or a negative number + for you wager. + + The way it deals with splits is particularly cool (IMHO). You + can split many times, and it will show all hands as they are + played. + +Copyright (c) 1990, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1990/common.mk b/1990/common.mk new file mode 100644 index 000000000..e1ef763d6 --- /dev/null +++ b/1990/common.mk @@ -0,0 +1,104 @@ +# %W% %G% %U% +# +# 1990 makefile + +SHELL=/bin/sh +CHMOD=chmod +CC=gcc +CP=cp +RM=rm +SED=sed +LN=ln + +# flags for common K&R compiles +# +CFLAGS=-O +CC=cc + +# winners that may be ok to compile with common K&R +# +WINNERS=cmills pjr westley tbr dg dds theorem baruch jaw scjones + +all: ${WINNERS} + +ansi: + @echo "wrong makefile, use ansi.mk" + exit 1 + +common: all + +cmills: cmills.c + ${CC} ${CFLAGS} -DM=500 -DN=52 -DX="srand((int)time(0L))" -DV=int \ + -o cmills cmills.c + +pjr: pjr.c + ${CC} ${CFLAGS} pjr.c -o pjr + +westley: westley.alt.c + ${CC} ${CFLAGS} westley.alt.c -o westley + +westley.alt.c: westley.c + ${RM} -f westley.alt.c + -${SED} -e 's/signed//' -e 's/1s/1/g' -e 's/^ #/#/' \ + westley.c > westley.alt.c + +stig: stig.c stig.ksh + @echo "run the Korn shell, and source stig.ksh" + @echo "or read stig.hint and create your own aliases" + +tbr: tbr.c + ${CC} ${CFLAGS} tbr.c -o tbr + +dg: dg.c + ${CC} ${CFLAGS} dg.c -Dindex=strchr -o dg + # compile with the following if you don't have strchr() + #${CC} ${CFLAGS} dg.c -o dg + +dds: dds.c LANDER.BAS + ${CC} ${CFLAGS} dds.c -o dds + +theorem: theorem.c + ${CC} ${CFLAGS} theorem.c -o theorem + ${RM} -f sorter.c + -./theorem -r 0 0 0 0 < theorem.c > sorter.c + ${CC} ${CFLAGS} sorter.c -o sorter + ${RM} -f fibonacci.c + -./sorter 0 0 0 0 < theorem.c > fibonacci.c + ${CC} ${CFLAGS} fibonacci.c -o fibonacci + +baruch: baruch.c + ${CC} ${CFLAGS} baruch.c -o baruch + +jaw: jaw.c + ${RM} -f ./zcat ./atob ./jaw + ${CC} ${CFLAGS} jaw.c -o zcat + ${LN} zcat atob + echo 'PATH=;export PATH;atob|zcat' > jaw + ${CHMOD} 0555 ./jaw + +scjones: scjones.alt.c stdlib.h + ${CC} ${CFLAGS} -I. scjones.alt.c -o scjones + +# NOTE: scjones.alt.c is just a de-ANSI-fied scjones.c for example only +# +scjones.alt.c: scjones.c + ${RM} -f scjones.alt.c + -${SED} -e 's#??/#\\#g' -e 's/??=/#/g' -e 's/??(/[/g' -e 's/??)/]/g' \ + -e "s/??'/^/g" -e 's/??/}/g' \ + -e 's/??-/~/g' scjones.c > scjones.alt.c + +stdlib.h: + ${RM} -f stdlib.h + echo "#define EXIT_SUCCESS 0" >stdlib.h + echo "#define EXIT_FAILURE 1" >>stdlib.h + echo "void exit(); /* may need to be int on some systems */" >>stdlib.h + +clean: + rm -f *.o a.out core +clobber: clean + ${RM} -f ${WINNERS} sorter.c sorter westley.alt.c stdlib.h + ${RM} -f fibonacci.c fibonacci atob zcat scjonds.alt.c +nuke: clobber + @true +install: all + cat ${WINNERS} > /dev/null diff --git a/1990/dds.c b/1990/dds.c new file mode 100644 index 000000000..176b266ae --- /dev/null +++ b/1990/dds.c @@ -0,0 +1,24 @@ +#define O(b,f,u,s,c,a)b(){int o=f();switch(*p++){X u:_ o s b();X c:_ o a b();default:p--;_ o;}} +#define t(e,d,_,C)X e:f=fopen(B+d,_);C;fclose(f) +#define U(y,z)while(p=Q(s,y))*p++=z,*p=' ' +#define N for(i=0;i<11*R;i++)m[i]&& +#define I "%d %s\n",i,m[i] +#define X ;break;case +#define _ return +#define R 999 +typedef char*A;int*C,E[R],L[R],M[R],P[R],l,i,j;char B[R],F[2];A m[12*R],malloc +(),p,q,x,y,z,s,d,f,fopen();A Q(s,o)A s,o;{for(x=s;*x;x++){for(y=x,z=o;*z&&*y== +*z;y++)z++;if(z>o&&!*z)_ x;}_ 0;}main(){m[11*R]="E";while(puts("Ok"),gets(B) +)switch(*B){X'R':C=E;l=1;for(i=0;i",'#');U("<=",'$');U(">=",'!');}d=B;while(*F=*s){*s=='"'&&j +++;if(j&1||!Q(" \t",F))*d++=*s;s++;}*d--=j=0;if(B[1]!='=')switch(*B){X'E':l=-1 +X'R':B[2]!='M'&&(l=*--C)X'I':B[1]=='N'?gets(p=B),P[*d]=S():(*(q=Q(B,"TH"))=0,p +=B+2,S()&&(p=q+4,l=S()-1))X'P':B[5]=='"'?*d=0,puts(B+6):(p=B+5,printf("%d\n",S +()))X'G':p=B+4,B[2]=='S'&&(*C++=l,p++),l=S()-1 X'F':*(q=Q(B,"TO"))=0;p=B+5;P[i +=B[3]]=S();p=q+2;M[i]=S();L[i]=l X'N':++P[*d]<=M[*d]&&(l=L[*d]);}else p=B+2,P[ +*B]=S();l++;}X'L':N printf(I)X'N':N free(m[i]),m[i]=0 X'B':_ 0 t('S',5,"w",N +fprintf(f,I))t('O',4,"r",while(fgets(B,R,f))(*Q(B,"\n")=0,G()))X 0:default:G() +;}_ 0;}G(){l=atoi(B);m[l]&&free(m[l]);(p=Q(B," "))?strcpy(m[l]=malloc(strlen(p +)),p+1):(m[l]=0,0);}O(S,J,'=',==,'#',!=)O(J,K,'<',<,'>',>)O(K,V,'$',<=,'!',>=) +O(V,W,'+',+,'-',-)O(W,Y,'*',*,'/',/)Y(){int o;_*p=='-'?p++,-Y():*p>='0'&&*p<= +'9'?strtol(p,&p,0):*p=='('?p++,o=S(),p++,o:P[*p++];} diff --git a/1990/dds.hint b/1990/dds.hint new file mode 100644 index 000000000..8b4130f75 --- /dev/null +++ b/1990/dds.hint @@ -0,0 +1,100 @@ +Best Language Tool: + + Diomidis Spinellis + Imperial College, University of London + Myrsinis 1 + GR-145 62 Kifissia + Greece + + +Judges' comments: + + Compile and run. Give the following lines as input: + + OLD LANDER.BAS + RUN + + Be sure not to run out of fuel! + + +Selected notes from the author: + + This is the DDS-BASIC Interpreter (Version 1.00). + + Immediate commands: + + RUN LIST NEW OLD filename + BYE SAVE filename + + Program commands: + + variable names a to z variables initialized to 0 on RUN + FOR var = exp TO exp NEXT variable + GOSUB exp RETURN + GOTO exp IF exp THEN exp + INPUT variable PRINT string + PRINT exp var = exp + REM any text END + + Expressions (ranked by precedence): + + Bracketed expressions + number (leading 0 for octal, 0x for hex, else decimal), variable + Unary - + * / + + - + = <> + > < + <= >= + (* and + are also used for boolean AND and boolean OR) + Boolean expressions evaluate to 0 for false and 1 for true + + Editing: + + - Line editor using line re-entry. + - A line number with nothing following it, deletes the line. + + Input format: + + - Free format positioning of tokens on the line. + - No space is allowed before the line number. + - Exactly one space is needed between the OLD or SAVE command and + the filename. + - ALL INPUT MUST BE UPPERCASE. + + Limits: + + Line numbers 1-10000 + Line length 999 characters + FOR nesting 26 + GOSUB 999 levels + Program Dynamically allocated + Expressions -32768 - 32767 for 16 bit machines, + -2147483648 - 2147483647 for 32 bit machines + + Error checking / error reports: + + No error checking is performed. + The message `core dumped' signifies a syntax or semantic error. + + Hosting Environment: + + ANSI C, traditional K&R C or OSF ANDF + ASCII or EBCIDIC character set + 48K bytes memory + + The Speed of DDS-BASIC Interpreter (Version 1.00). relative to + Microsoft Advanced BASIC 3.31 is Approximately 60%. + + The code size could be further reduced by doing ugly things like + not declaring the return type of functions, not freeing memory, + #defining define, and joining lines. In its present 1536 character + form the program is reasonably portable (it may fail to run in a + tagged object architecture) and nicely formatted (it fits in an + 80*25 screen). + +Copyright (c) 1990, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1990/dg.c b/1990/dg.c new file mode 100644 index 000000000..348efd2e8 --- /dev/null +++ b/1990/dg.c @@ -0,0 +1,69 @@ +#include + +#define d define + +#d b12(x) 12 x +#d a13(x) x 13 +#d a16(x) x 16 +#d a32(x) x 32 +#d acb(x) x] +#d acc(x) x} +#d aco(x) x: +#d bco(x) :x +#d acp(x) x) +#d bef(x) EOF x +#d aeq(x) x= +#d afo(x) x for +#d age(x) x fgetc +#d asi(x) x stdin +#d aso(x) x stdout +#d bgt(x) >x +#d ai(x) x i +#d aj(x) x j +#d al(x) x l +#d ami(x) x- +#d bne(x) !=x +#d aob(x) x[ +#d aop(x) x( +#d apl(x) x+ +#d bpu(x) fputc x +#d bqm(x) ?x +#d aqm(x) x? +#d aqu(x) x' +#d ase(x) x; +#d awh(x) x while +#d axo(x) x^ +#d a0(x) x 0 +#d b13(x) 13 x +#d b16(x) 16 x +#d b19(x) 19 x +#d b48(x) 48 x +#d a64(x) x 64 +#d b66(x) 66 x +#d bcb(x) ]x +#d bch(x) char x +#d bcm(x) ,x +#d acm(x) x, +#d bcp(x) )x +#d beq(x) =x +#d bex(x) extern x +#d bi(x) i x +#d bin(x) int x +#d bix(x) index x +#d bj(x) j x +#d bl(x) l x +#d alt(x) x< +#d bma(x) main x +#d bob(x) [x +#d boc(x) {x +#d bop(x) (x +#d bpl(x) +x +#d app(x) x++ +#d bqu(x) 'x +#d bse(x) ;x +#d bst(x) *x + +bma(acp(bop(app(bcp(ai(boc(ase(bch(a16(bl(alt(bob(ai(b66(ase(bcb(a0(bcm(aeq(bst(acb(bj(a64(bse(aob(bin(al(bi(aeq(bse(ai(bex(aop(bch(afo(bst(ase(bix(()))))))))))))))))))))))))))))))))))))))) +bl(ai(bob(aob(bi(al(bcb(aop(beq(apl(b13(a13(bpl(aeq(bop(acb(bl(bob(a32(bi(bpl(apl(b16(bcb(ai(beq(b19(aob(bpl(bop(l)))))))))))))))))))))))))))))) +bpl(acp(b48(acp(asi(bcb(aop(beq(age(bop(aeq(bi(ai(bgt(aop(b12(aop(bqm(awh(b12(ase(bco(acp(bi(acp(bcp(acp(bpl(aqu(bqu(A)))))))))))))))))))))))))))))) +bne(acc(bef(ase(bcp(acp(aso(bpu(acm(ai(bop(aco(bop(acb(bj(al(beq(ami(bix(aj(axo(bop(a16(aob(bl(al(aqm(bcm(acp(acp(i)))))))))))))))))))))))))))))) diff --git a/1990/dg.hint b/1990/dg.hint new file mode 100644 index 000000000..f9c55b7f6 --- /dev/null +++ b/1990/dg.hint @@ -0,0 +1,57 @@ +Best Abuse of the C Preprocessor: + + David Goodenough + anonymous organization + 541 Commonwealth Ave, + Newton, MA 02159 + USA + +Judges' comments: + + Compile and run. Try: + + echo "to C or not to C" | dg + + Some C preprocessors get confused about single quotes in certain cases. + In particular, the following source line: + + Cb12(ase(bco(acp(bi(acp(bcp(acp(bpl(aqu(bqu(A)))))))))))))))))))))))))))))) + + may need to be changed to: + + Cb12(ase(bco(acp(bi(acp(bcp(acp(bpl('A')))))))))))))))))))))))))))) + + if your C preprocessor botches single quotes in cpp expansions. + + Systems that have index() and don't strchr() (e.g., BSD) should + compile with without -Dindex=strchr. + +Selected notes from the author: + + If my preprocessor could hack it, I could write this as one single + line rather than 4, but when I do that I get a complaint "defines + nested too deeply". + + Spoiler: (rot13 to read) + + Guvf vf nabgure ebg13 wbo (oryvrir vg be abg) - gur #qrsvarf ner n + abiry jnl bs nqqvat gbxraf: '#qrsvar o12(k) 12 k' zrnaf gung ng + fbzr cbvag va gur fbhepr n 12 vf sbyybjrq ol gur pbzcerffrq arfgrq + qrsvarf. Gur o12 trgf gur cerivbhf pbzcerffvba nf na nethzrag, naq + cercraqf gur 12, guhf znxvat nabgure fgrc va gur erperngvba bs gur + fbhepr. Gur nkk() qrsvarf qb gur fnzr, ohg nqq gbxraf nsgre. + + Nf sbe gur ebg13 nytbevguz, vg eryvrf ba vaqrk() gb svaq vs gur + punenpgre vf va gur frg N-Mn-m. y[] vf na neenl gung trgf svyyrq + jvgu: + + "abcdefghijklmmmmnopqrstuvwxyzzzzABCDEFGHIJKLMMMMNOPQRSTUVWXYZZZZ" + + Vs vaqrk() fnlf gur pune vf va gur nycunorg, gura kbe gur bssfrg + jvgu 16 gb genafyngr, naq bhgchg, bgurejvfr cnff vg hapunatrq. + +Copyright (c) 1990, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1990/jaw.c b/1990/jaw.c new file mode 100644 index 000000000..6ab37e147 --- /dev/null +++ b/1990/jaw.c @@ -0,0 +1,22 @@ +#define C char +#define F X,perror("oops"),1 +#define G getchar() +#define I ;if( +#define P putchar +#define Q 256 +#define W ;while( +#define X return 0 +#include +long M,N,c,f,m,o,r,s,w;y(l){o^=l;m+=l+1;f=f*2+l+(f>>31&1);}int +O,S,e,i,k,n,q,t[69001];b(g){k=4 W g>--k*8)&255));w=0;}C D[Q*Q],h +[Q*Q];main(g,V)C**V;{I**V-97)X,a()W G-10)W(g=G)+1&&g-'x')if(g-10){I +432&g<'v')w=w*85+g-33,++k;else{I +g-'z'|k)F;w=0;k=5;}}W G-78)I scanf("%ld%lx E%lx S%lx R%lx ",&M,&N,&c,&s,&r)-5)F +I M){b(g=3-(M-1&3))W g--)y(0);}I(M-N|c-o|s-m|r-f)&4294967295)F;X;}long +g(){C*p I m=S){O=0;S=fread(D,1,n,stdin)*8 I +S<8)X-1;S-=n-1;}p=D+O/8;q=O&7;O+=n;X,(1<<8-q)-1&*p>>q|m&((15>7&1;k&=31 I k>16)F;w=Q +W w--)t[w]=0,h[w]=w;n=8;f=Q+e;i=o=w=g()I o<0)X,1;P(i)W(w=g())+1){I +w==Q&e){W w--)t[w]=0;m=n=8;f=Q I(w=g())<0)X;}c=w +I w>=f)*p++=i,w=o W w>=Q)*p++=h[w],w=t[w];P(i=h[w])W +p>D+Q)P(*--p)I(w=f)<1L< receive + + The resulting file, 'receive', unpacks the input files + even if the receiver lacks 'uncompress' and 'atob': + + mkdir test + cd test + sh ../receive + cmp ../jaw.c jaw.c + cmp ../jaw.hint jaw.hint + +Selected notes from the authors: + + ABSTRACT + + Minimal, Universal File Bundling + (or, Functional Obfuscation in a Self-Decoding Unix Shell Archive) + + James A. Woods + Universities Space Research Association + NASA Ames Research Center + + + "Use an algorithm, go to jail." + [anon., circa 1988, pre-Morris worm era] + + + Myriad formats have been proposed for network-mailable + data. A major difficulty undermining the popularity of most + file/message bundlers is that the sender assumes prior + installation of the computational dual of such bundling + software by the receiver. Command shell archives alleviate + this problem somewhat, but still require standardization for + the function of data compression and mail-transparency + encoding. On Unix, these coding format quandaries are over- + come by planting a novel Trojan Horse in the archive header + to perform negotiationless decoding. + + Specifically, we outline the development of an extraor- + dinarily compact portable (un)bundler to (dis)assemble + data-compressed, binary-to-ASCII-converted, length-split, + and checksummed directory structures using standard Unix + tools. Miniature versions of counterparts to a Lempel-Ziv + coder ('compress' or 'squeeze') and an efficient bit packet- + izer ('btoa') are compiled on-the-fly at mail destination + sites where they may not already exist. These are written + in purposefully obfuscated-C to accompany similarly-shrunk + shell command glue. This resulting shell archiver is dubbed + 'shark'. + + 'Shark' procedure overhead consumes as few as three + dozen shell lines (or ~1100 bytes), commensurate with the + size of many Internet mail headers; it amortizes favorably + with message size. 'Shark' is portable across Unix vari- + ants, while the underlying technique is inherently general- + izable to other encoding schemes. + + In the function-theoretic sense of minimal + Chaitin/Kolmogorov complexity, and within a modified Shannon + model of communication, the 'shark' effort aims to construct + a "shortest program" for source decoding in the Turing- + universal Unix environment. + + ---------------------------------------------- + + Oh, the shark has pretty teeth, dear-- + And he shows them pearly white + Just a jackknife has Macheath, dear-- + And he keeps it out of sight. + + [Bertolt Brecht, Threepenny Opera] + + ---------------------------------------------- + + We have ported this program to a wide variety of systems. Among + these are: + + SunOS 4.1 / Sun Sparcstation 1 (using both 'cc' and 'gcc 1.37.1') + SunOS 4.0.3 / Sun 3 + BSD 4.3 / VAX 8650 + SEIUX / Sumitomo Electric Ustation/S + Sony NEWS-OS 3.3 / Sony NEWS (fairly vanilla 4.3BSD) + System V.? / Hitachi 2050 + System V.? / NEC EWS 4800 + UNIOS-B / Omron Luna + Dynix / Sequent Balance ('cc' for Natl. Semi. base + 'gcc 1.36') + Unicos / Cray 2 + + We (the authors) feel this program is obfuscated for the + following reasons: + + (0) This is one of the few programs you'll see WHOSE VERY UTILITY + DEPENDS ON ITS OBFUSCATION! + + (1) The contest entry may be used to send its wonderful self to + anyone in the Unix world! Virus writers need not apply... + + (2) The basic idea is twisted enough to be patentable, but is, + out of the kindness of our hearts (as well as to maintain + eligibility for the large IOCCC prize fund), dedicated to + the public domain. Claude Shannon, meet Alan Turing. + + (3) Meta-obfuscation is via obfuscated description (see ABSTRACT). + + (4) "Literary" allusion. Production code contains a reference to + self-reference, preserved at amazing cost for sheer perversity. + + (5) Many, many micro obfuscations below, honed over three years + time, in shell as well as C. Ask about the 'tar' pit escape, + the argv[0] flip, Paul's &4294967295 portability hack, the + "void where prohibited by flaw" fix, the scanf() spacesaver, + shift shenanigans, signal madness, exit()ing stage left, and + source-to-source transformations galore. + + For extra credit: + + Construct 'sharkmail', to auto-split sharkives into mailable + segments and mail them. Here's a simple one, which could be + extended to enable auto-reassembly with one shell cmd at the + far end. + + ------------------------ cut here for sharkmail ----------------------- + #!/bin/sh + m=$1; shift + shark $* | split -800 - /tmp/shark$$ + n=`ls /tmp/shark$$* | wc -l | sed 's/ *//'` + p=0 + for f in `ls /tmp/shark$$*` + do + p=`expr $p + 1` + mail -s "bundle ($p of $n) from '`whoami`'" $m < $f + done + rm /tmp/shark$$* + ------------------------ end of sharkmail ----------------------------- + + +Shark history: + + May 1987: Karl Fox introduces 1023-byte zcat.c to USENET. + It's too late for the 4th IOCCC. + + May 21, 1987: James A. Woods extends idea to construct self + decompressing shar Trojan horse, utilizing 'cc', 'shar', + 'zcat', & 'atob'; size: 2303 bytes. + + May 23, 1987: 'jaw' trims 250 bytes without much thought. + + June 2, 1987: 52 lines of shell, 1991 bytes, now made with 'tar', + short-circuit C-compile at far end, dual-use main.c, + portability mods. (jaw) + + Mar-May 1988: abortive run at 5th IOCCC. + jaw.c - 1529 bytes. compile line: 152 bytes. + generated funny code with execvp() to invoke shell. + + Aug 29, 1988: production version, now at 1830 bytes. + + Jan 1990: Paul Eggert does tour-de-force shark re-engineering. + + May 24, 1990: collaboration yields 999-byte jaw.c core (see above) + and 1530-byte production shell code (w/comments). + Eggert comes through with lion's share of improvements. + 7th IOCCC code now faster than the atob/zcat it replaces. + + May 1990: 'jaw' develops experimental replacement using + Dan Bernstein's high-compression 'squeeze'. + + +To which we add: + + June 1990: 'shark' wins the IOCCC, finally! :-) + +Copyright (c) 1990, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1990/pjr.c b/1990/pjr.c new file mode 100644 index 000000000..5392db2e1 --- /dev/null +++ b/1990/pjr.c @@ -0,0 +1,14 @@ +#include +#define A(a) G a(); +#define B(a) G (*a)(); +#define C(a,b) G a() { printf(b); return X; } +typedef struct F G;A(a)A(b)A(c)A(d)A(e)A(f)A(g)A(h)A(i)A(j)A(k)A(l)A(m)A(n)A( +o)A(p)A(q)A(r)A(s)A(t)A(u)A(v)A(w)A(x)A(y)A(z)A(S)A(N)void Q();struct F{B(a)B +(b)B(c)B(d)B(e)B(f)B(g)B(h)B(i)B(j)B(k)B(l)B(m)B(n)B(o)B(p)B(q)B(r)B(s)B(t)B( +u)B(v)B(w)B(x)B(y)B(z)B(S)B(N)void(*Q)();}X={a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p, +q,r,s,t,u,v,w,x,y,z,S,N,Q};C(a,"z")C(b,"y")C(c,"x")C(d,"w")C(e,"v")C(f,"u")C( +g,"t")C(h,"s")C(i,"r")C(j,"q")C(k,"p")C(l,"o")C(m,"n")C(n,"m")C(o,"l")C(p,"k" +)C(q,"j")C(r,"i")C(s,"h")C(t,"g")C(u,"f")C(v,"e")C(w,"d")C(x,"c")C(y,"b")C(z, +"a")C(S," ")C(N,"\n") void Q(){}main(){X=g().s().v().S().j().f().r().x().p(). +S().y().i().l().d().m().S().u().l().c().S().q().f().n().k().v().w().S().l().e +().v().i().S().g().s().v().S().o().z().a().b().S().w().l().t().N();} diff --git a/1990/pjr.hint b/1990/pjr.hint new file mode 100644 index 000000000..2eb3ecb48 --- /dev/null +++ b/1990/pjr.hint @@ -0,0 +1,65 @@ +Most Unusual Data Structure: + + Peter J Ruczynski. + Pyramid Technology Ltd. + Pyramid House, + Solatron Road + Farnborough. + Hants GU14 7PL + England, U.K. + + +Judges' comments: + + This program prints out a string. Can you figure out how + it is done? + + By use of pointers to functions returning a struct of pointers + to functions! + + Note that some compilers will be unable to compile the + expression 'X=g()...' in main due to lack of temporary + value space. One might want to try replacing main with: + + main(){X=s().v().o().o().l().S().d().l().i().o().w().N();} + + if this is a problem. + + +Spoiler: (rot13 to read) + + Guvf cebtenz cevagf bhg gur fgevat: + + gur dhvpx oebja sbk whzcrq bire gur ynml qbt + + ol hfr bs cbvagref gb shapgvbaf ergheavat n fgehpg bs cbvagref + gb shapgvbaf! + + +Selected notes from the author: (rot13 to read) + + Vg vf fvzcyr gb znxr gur cebtenz cevag bgure fgevatf. Rnpu + nycunorgvpny punenpgre sebz n gb m vf cevagrq bhg nf vgf + bccbfvgr: + + n->m o->l p->k rgp + + Gb rapbqr n arj fgevat vachg gur fgevat nf vg vf zrnag gb pbzr bhg: + + K=f().i().b().b().y().F().q().y().v().b().j().A(); + + Abgr: F() ercerfragf n fcnpr naq A() n arjyvar. Guvf jvyy abj + cebqhpr... + + uryyb jbeyq + + By the way, there is actually a piece of code which is not used + in the original program! I leave it as an intellectual exercise + to the reader to find out what it is. + + +Copyright (c) 1990, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1990/rules b/1990/rules new file mode 100644 index 000000000..caed06767 --- /dev/null +++ b/1990/rules @@ -0,0 +1,224 @@ +7th International Obfuscated C Code Contest Rules + +Copyright (c) 1990, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: Their emotions obfuscated their + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show what should NOT be done in C programs. + * To provide a safe forum for poor C code. :-) + +DEDICATION: + + The 1990 International Obfuscated C Code Contest is dedicated to ANSI C. + +RULES: + + To help us handle the vast volume of entries, we ask that you + follow the rules below. Sorry for the length, but we need all + the help we can get! + + 1) Your source MUST be 1536 bytes or less, and it must be a complete + program, not just a subroutine. + + 2) To help us process your entries, we ask that you submit entries + in the following format. Please be sure to include ALL --- lines, + otherwise our extraction program may skip your entry! + +---header items--- +name: Your name, of course! +org: School/Company/Organization +email address: Email address from a well known site, or in a registered domain +postal address: Postal address + include your country as well +environment: Indicate the Hardware + and OS under which your program was tested +entry: 5 +remarks: Remarks may be continued with leading whitespace until the + line ---how to compile-- is encountered. (see #3 below) +---how to ANSI compile--- +X Give the command(s) needed to compile your program using an ANSI C +X compiler. If you program should not be compiled under an ANSI C compiler, +X leave this section blank. Follow the format rules for the program +X section below, except that command size must be 160 characters or less. +---how to common compile--- +X Give the command(s) needed to compile your program using an K&R/traditional +X C compiler. If you program should not be compiled under a K&R style C, +X leave this section blank. Follow the format rules for the program section +X below, except that command size must be 160 characters or less. +---program--- +X Place obfuscated source of 1536 characters or less in this section. +X Add a leading X to each line to avoid problems with mailers. +X Some mailers don't like files with very long lines. If your entry contains E +C lines longer 80 chars we ask you to form continuation line sets. To form E +C a continuation line set, place an 'E' character at the point of a split E +C and place a C (instead of an X) at the beginning of the next line. E +C Finally, end the continuation line set as normal. +X The E\nC's and leading X's will be removed prior to extraction and thus E +C they don't contribute toward the source character count. All other E +C characters are considered to be source. Whitespace after 'X' or 'C' E +C and before the 'E' is significant, we added it here for readability. +X Newlines and tabs each count as 1 character. Assume 8 character tab stops. +X If your entry does not end in a newline, leave a final 'E' on the end. E +---end--- + + 3) Regarding the header items: + + * Any text outside of the above format will be kept confidential. + + * All header lines are required, but you may use 'anonymous' + for any header line other than 'remarks' or 'entry'. + + * In the 'remarks' please include: + - what this program does + - why you think the program is obfuscated + - any other remarks (humorous or otherwise) + + 4) Your entry should be written in common C (K&R + common extensions) + or ANSI C. If your program will NOT compile under an ANSI C or + K&R C compiler, leave the particular 'how to' section blank. + + You do not have to fill in both 'how to' sections, though you must + fill in at least one 'how to' section. + + If you leave a 'how to' section blank, include the '---' line, but + but having no command lines after it. + + 5) The program must be of original work. All programs must be + in the public domain. All copyrighted programs will be rejected. + + 6) Entries must be received between 16-Mar-90 0:00 GMT and + 26-May-90 0:00 GMT. Email your entries to: + + ...!{sun,pacbell,uunet,utzoo,pyramid,amdahl}!hoptoad!obfuscate + + We will attempt to Email a confirmation of receipt of contest + entries, however since Email is not reliable you may not receive it. + We regret that we can no longer accept entries via postal mail. + + 7) Each person may submit up to 8 entries. Multiple entries must + be sent in separate Email letters. + + 8) Entries that can not be built automatically in a portable makefile + are not allowed. (e.g., don't use #include "/dev/tty") + + 9) Starting this year, compiling entries must result an regular file + which can be executed. (No -o /dev/tty or similar compile lines) + + +ANNOUNCEMENT OF WINNERS: + + * First announcement will likely be at the Summer 90 Usenix BOF. + + * Winning entries will be posted in mid June 1990 to + comp.sources.unix as well as news groups where these rules + were posted. (depending on the judges work load) + + * Winning entries will be deposited into the uunet archives. + + * An article containing the winning entries will be published + in a future issue of the "Micro/Systems Journal". + + * Winners receive international fame and flames! :-) + + +JUDGING: + + Awards will be given to the best entry in a number of categories. + The actual category list will vary depending on the types of entries + we receive. As a guide, consider using the following: + + * The best small one line program + * The strangest source layout + * The most useful obfuscated program + * The most creatively obfuscated program + * Best obfuscated entry smaller than 256 bytes + * Best obfuscated entry smaller than 1024 bytes + * Best abuse of ANSI + * Worse abuse of the rules (no abuse of entry format please!) + * + +POINTS TO PONDER: + + People are encouraged to examine winners of the previous + contests. A copy of these entries was posted to + comp.sources.unix. Contact the comp.sources.unix moderator, or + some archive site (such as uunet). Keep in mind that rules + change from year to year, so some winning entries may not be + valid entries this year. What was unique and novel one year + might be 'old' the next year. In short, use your best judgment. + + We examine each entry on several levels of confusion. For example + each entry is judged when we: + + * look at the original source + * run it through: sed -e ',^#[ ]*define,d' | /lib/cpp + * run it through: sed -e ',^#[ ]*include,d' | /lib/cpp + * run it through a C beautifier + * examine the algorithm + * compile and lint it + * execute it + + One line programs are best when they are short, obscure and concise. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS or Un*x version specific + (index/strchr differences are ok, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is ok only if you warn us in the 'remark' header item) + * won't compile under both BSD or SYS V Un*x + * use an excessively long compile line to get around the size limit + * are longer than they need to be + * are similar to previous winners + * are similar to previous losers :-) + + Simply abusing #defines or -Dfoo=bar won't go as far as a program + that is more well rounded in confusion. + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + We like programs that: + + * are as concise and small as they need to be + * do something quasi-interesting + * pass lint without complaint (particularly strict ANSI ones) + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION + * make us laugh and/or throw up :-) + + Some types of programs can't excel in some areas. Of course, your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + Be creative! + + The Judging will be done by Landon Noll and Larry Bassel. If you have + any QUESTIONS or COMMENTS, please feel free to send them to: + + ...!{sun,pacbell,uunet,pyramid,amdahl}!hoptoad!judges + judges@toad.com + + however contest entries should be sent to: + + ...!{sun,pacbell,uunet,pyramid,amdahl}!hoptoad!obfuscate + obfuscate@toad.com + + +chongo /\cc/\ hoptoad!chongo +Larry Bassel {amdahl,ucbvax,cbosgd}|sun!lab diff --git a/1990/scjones.c b/1990/scjones.c new file mode 100644 index 000000000..133a395b1 --- /dev/null +++ b/1990/scjones.c @@ -0,0 +1,46 @@ +char*a??(??)=??< +"??=include", +"??=include", +"??=define o stdout", +"??=define b break;case", +"??=define s(p)fputs(p,o);", +"??=define c(p)fputc(p,o);", +"void t(p,f)char*p;??':s(??/"???/??/?>??/")b'??(':s(??/"???/??/?(??/")b'??)'", +":s(??/"???/??/?)??/")b'??/??/??/??/':f&&s(??/"???/??/?/??/")", +"s(??/"???/??/?/??/")b'??/??/n':if(f)s(??/"???/??/?/n??/")", +"else case'??/"':if(f)s(??/"???/??/?/??/??/??/"??/")", +"else default:c(*p)??>??>??>main()??;??/",0);for(p=a", +";*p;p++)t(*p,0);exit(!ferror(o)&&", +"!fclose(o)?EXIT_SUCCESS", +":EXIT_FAILURE);", +"/*NOTREACHED*/", +"??>", +0??>; +??=include +??=include +??=define o stdout +??=define b break;case +??=define s(p)fputs(p,o); +??=define c(p)fputc(p,o); +void t(p,f)char*p;??':s("???/?>")b'??(':s("???/?(")b'??)' +:s("???/?)")b'??/??/':f&&s("???/?/") +s("???/?/")b'??/n':if(f)s("???/?/n") +else case'"':if(f)s("???/?/??/"") +else default:c(*p)??>??>??>main()??;",0);for(p=a +;*p;p++)t(*p,0);exit(!ferror(o)&& +!fclose(o)?EXIT_SUCCESS +:EXIT_FAILURE); +/*NOTREACHED*/ +??> diff --git a/1990/scjones.hint b/1990/scjones.hint new file mode 100644 index 000000000..b836472ce --- /dev/null +++ b/1990/scjones.hint @@ -0,0 +1,65 @@ +ANSI Committee's Worst Abuse of C: + + Larry Jones + SDRC + 2000 Eastman Dr + Milford, OH 45150 + USA + + +Judges' comments: + + The addition of trigraphs has made it easier to make programs + hard to read. It was a dark and stormy night for C when the + ANSI C committee added trigraphs to the standard. Too bad + that they didn't just simply require a more reasonable ISO + character set. + + The common.mk (non-ANSI) makefile uses sed to form scjones.alt.c. + The scjones.alt.c is similar to the original scjones.c source, + but with all the trigraphs converted. You might want to try: + + make -f common.mk scjones.alt.c + + even if you only have an ANSI compiler, just to see how + the trigrapsh are converted. + +WARNING: In the future, we will be passing ANSI programs through a + trigraph filter before reading. Trigraph-ifacation will + not be a major consideration in future contests. People + should exploit more interesting features of ANSI C. + + +Selected notes from the author: + + Since this year's contest is dedicated to ANSI C, here is a + strictly conforming entry. In accordance with the ANSI + definition of a strictly conforming program it does not produce + output dependent on any unspecified, undefined, or implementation + defined behavior, and it does not exceed any of the minimum + implementation limits. It adheres to all of the syntactic and + semantic constraints of the standard, #includes the relevant + headers for the functions it uses, and uses the EXIT_SUCCESS and + EXIT_FAILURE macros to return a correct success/fail status to + the invoking program. It also uses trigraphs for characters + which are not in the Invariant Code Set of ISO 646:1983, so it + will be portable to machines with deficient (from C's standpoint) + character sets. In short, it should be very widely portable. As + an extra added attraction, all of the lines are under 72 + characters long, which would allow for sequence numbers to be + punched in columns 73-80 :-). + + [[ The Author sent us this note after he was informed that he won ]] + + Although I am quite grateful for the "ANSI Committee's Worst Abuse + of C" title (were you aware that I am a member of the committee or + is the double meaning unintentional?), I was really hoping for + something more along the lines of "Closest Resemblance to Line Noise." :-) + + [[ ... it was unintentional ]] + +Copyright (c) 1990, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1990/shark.sh b/1990/shark.sh new file mode 100644 index 000000000..38689a128 --- /dev/null +++ b/1990/shark.sh @@ -0,0 +1,47 @@ +for i in "${@?${usage?$0 file...}}";do<"$i"||exit;done +(cat&&tar cbf 1 - "$@"|compress|btoa&&echo w)<<\Z +#!/bin/sh +# +# GENTLE READER -- write this message to file [no headers!]; run "sh file". +# +# [un]shark: By James A. Woods. +# Seed planted by Karl Fox; code intensified by Paul Eggert. +# +# "Cleverly he dialed from within." -- D. Van Vliet, "Trout Mask Replica" +# +PATH=$PATH:. a=atob m=unshark z=zcat +r="rm -f $a $m* $z" v="cc -o $z $m.c" +trap "$r;exit 1" 1 2 13 15 +echo decoding... +(:|compress|btoa|$a|$z)2>$m>&2||(sed '1,9s/./#define & / +s/@/[w]/g +s/C/char /g +s/I/;if(/g +s/W/;while(/g +s/Y/%lx /g +s/}/;}/g'>$m.c<<_&& +FX,perror("$m bite: resend"),1; +GgetC() +H(w=g()) +K[69001] +PputC +Q256 +U*p +Xreturn 0 +Zw=QWw--)t@=0 +#include +long M,N,c,f,m,o,r,s,w;y(l){o^=l;m+=l+1;f=f*2+l+(f>>31&1)}int +O,S,e,i,k,n,q,t K;b(g){k=4Wg>--k*8)&255));w=0}CD K,h +K;main(g,V)C**V;{I**V-97)X,a()WG-10)W(g=G)+1&&g-'x')if(g-10) +{I432&g<'v')w=w*85+g-33,++k;else{Ig-'z'|k)F +w=0;k=5}}WG-78)Iscanf("%ldYEYSYRY",&M,&N,&c,&s,&r)-5)F +IM){b(g=3-(M-1&3))Wg--)y(0)}I(M-N|c-o|s-m|r-f)&4294967295)F X}long +g(){CUIm=S){O=0;S=fread(D,1,n,stdin)*8IS<8)X-1; +S-=n-1}p=D+O/8;q=O&7;O+=n;X,(1<<8-q)-1&U>>q|m&((15>7&1;k&=31Ik>16)F +Z,h@=w;n=8;f=Q+e;i=o=HIo<0)X,1;P(i)WH+1){Iw==Q&e){Z;m=n=8;f=QIH<0)X} +c=wIw>=f)U++=i,w=oWw>=Q)U++=h@,w=t@;P(i=h@)Wp>D+Q)P(*--p) +I(w=f)<1l<$m-&&$z<$m->$m&&tar xvf $m&&$r +Z diff --git a/1990/stig.c b/1990/stig.c new file mode 100644 index 000000000..f2ad6c76f --- /dev/null +++ b/1990/stig.c @@ -0,0 +1 @@ +c diff --git a/1990/stig.hint b/1990/stig.hint new file mode 100644 index 000000000..d6633b332 --- /dev/null +++ b/1990/stig.hint @@ -0,0 +1,62 @@ +Strangest Abuse of the Rules: + + Stig Hemmer + Norwegian Institute of Technology + N-7034 Trondheim-NTH + Norway + +Judges' comments: + + We changed the alias that the author's suggested alias from a + C-shell alias to a Korn shell alias because many C-shells + did not allow Stig Hemmer's form of aliasing. (The error + may have also been due to some uucp site corrupting his + entry) Below is the author's 'how to compile' sections as + mailed to us: + + ---how to ANSI compile--- + Xecho alias c cc -E -o o.c shst.c -"\''Dc=main(){printf("\"N%sested E + Ccomments allowed.\\n\",'/*/*/0*/**/'1?\"\":\"o n\"");}'\'';cc -o c o.c' + Xsource shst.c"|csh + ---how to common compile--- + Xecho alias c cc -E -o o.c shst.c -"\''Dc=main(){printf("\"N%sested E + Ccomments allowed.\\n\",'/*/*/0*/**/'1?\"\":\"o n\"");}'\'';cc -o c o.c' + Xsource shst.c"|csh + + Note that shst.c is renamed to stig.c in the distribution. + + Producing an equivalent C-shell alias or /bin/sh function + is left as an exercise to the reader. + +WARNING: This program's 'how to compile' is too specific to a particular + shell. The obfuscation of this program to more related to + shell obfuscation than C obfuscation. This type of entry will + not be permitted in future contests. + +Selected notes from the author: + + If you like shell programming you may also admire my + creative quoting. (I use echo to create an alias + which when run calls cc with the -D option to create a + C macro with double quotes in it. ARRRRRGGGHHH!) + + The program is totally portable, but the compile + commands are very shell specific so don't be TOO mad + at me if they don't work for you. + + If you want to put these commands in a Makefile you + must add 4 - four - backslashes at the end on first + line. (At least that's what works here.) + + If everything works correctly it create an executable + named c which checks whether your compiler supports + nested comments. I've stolen the "/*/*/0*/**/1" from + somewhere so don't give me any points for it. Of + course neither ANSI nor K&R support nested comments + when properly implemented, but what the heck. + +Copyright (c) 1990, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1990/stig.ksh b/1990/stig.ksh new file mode 100644 index 000000000..d2df5e156 --- /dev/null +++ b/1990/stig.ksh @@ -0,0 +1 @@ +alias c="cc -E stig.c -Dc='main(){printf(\"N%sested comments allowed.\\n"'",/*/*/0*/**/1?"":"o n"'");}'|grep -v '^#'>o.c;cc -o o o.c;o" diff --git a/1990/tbr.c b/1990/tbr.c new file mode 100644 index 000000000..44e342e08 --- /dev/null +++ b/1990/tbr.c @@ -0,0 +1,23 @@ + +#define D ,close( + +char *c,q [512 ],m[ 256 +],*v[ 99], **u, *i[3];int f[2],p;main (){for + (m[m [60]= m[62 ]=32 ]=m[* m=124 [m]= 9]=6; + e(-8) ,gets (1+( c=q) )|| exit (0); r(0,0) + )for( ;*++ c;); }r(t, o){ *i=i [2]= 0;for + (u=v +98 ;m[*--c] ^9;m [*c] &32 ?i[*c + &2]= *u,u- v^98 &&++u: + + 3 )if(!m[*c]){for(*++c=0;!m[*--c];); + * --u= ++c;}u-v^98?strcmp(*u,"cd")?*c?pipe(f),o=f[ + 1 ]: + 4 ,(p=fork())?e(p),o?r(o,0)D o)D*f): + 1 ,wait(0):(o?dup2(*f,0)D*f)D o):*i? + 5 D 0),e(open(*i,0)): + 9 ,t?dup2(t,1)D t):i[ + 2 ]? + 6 D 1),e(creat(i[2],438)): + 5 ,e(execvp(*u,u))):e(chdir(u[1])*2): + 3 ;}e(x){x<0?write(2,"?\n$ "-x/4,2),x+1||exit(1): + 5 ;} diff --git a/1990/tbr.hint b/1990/tbr.hint new file mode 100644 index 000000000..b38a571d0 --- /dev/null +++ b/1990/tbr.hint @@ -0,0 +1,90 @@ +Best Utility: + + Byron Rakitzis Sean Dorward + Princeton University Princeton University + 5707 Old Lodge Dr. 10274 Burleigh Cottage Lane + Houston, TX 77066 Ellicott City, MD 21043 + USA USA + +Judges' comments: + + This program implements a subject a well known Un*x utility whose + original source was considered to be extremely obfuscated by many + people, excluding its author. In fact, this utility one a major + inspiration for the formation of this contest. + + The author supplied us with a slightly smaller unformatted version + of the program which we include below: + + #define D ,close( + char*c,q[512],m[256],*v[99],**u,*i[3];int f[2],p;main(){for(m[m[60]=m[62]= + 32]=m[*m=124[m]=9]=6;e(-8),gets(1+(c=q))||exit(0);r(0,0))for(;*++c;);} + r(t,o){*i=i[2]=0;for(u=v+98;m[*--c]^9;m[*c]&32?i[*c&2]= + *u,u-v^98&&++u:3)if(!m[*c]){for(*++c=0;!m[*--c];);*--u= + ++c;}u-v^98?strcmp(*u,"cd")?*c?pipe(f),o=f[1]:1,(p=fork())?e(p),o? + r(o,0)D o)D*f):4,wait(0):(o?dup2(*f,0)D*f)D o):*i?1 D + 0),e(open(*i,0)):5,t?dup2(t,1)D t):i[2]?9 D + 1),e(creat(i[2],438)):2,e(execvp(*u,u))):e(chdir(u[1])*2):6;} + e(x){x<0?write(2,"?\n$ "-x/4,2),x+1||exit(1):5;} + +Selected notes from the author: (rot13 to read) + + Guvf cebtenz vf n ehqvzragnel furyy. Vg qbrf v/b erqverpgvba, cvcrf + naq pq. Vg syntf reebef ba snvyrq puqve'f, bcra'f, perng'f + rkrpic'f, sbex'f naq n srj flagnk reebef. + + Guvf cebtenz vf boshfpngrq va n srj abgnoyr jnlf: ncneg sebz gur + ynlbhg (na hasbeznggrq (ohg pehapurq) irefvba vf vapyhqrq sbe + crbcyr jub jnag gb chg guvf guebhtu po) vg znxrf pyrire hfr bs n + jevgr fgngrzrag, fb gung gur fnzr fgngrzrag pna or hfrq gb cevag + reebef naq gur cebzcg. Ol pnyyvat gur reebe shapgvba jvgu gur inyhr + -8, gur cbvagre bssfrg va gur rkcerffvba "?\a$ "-k/4 tbrf sebz 0 gb + 2. Cerfgb! N cebzcg. Sbe reebef jvgu ahzoref fznyyre guna -4 + (v.r., HAVK flfgrz pnyyf) n dhrfgvba znex vf cevagrq. + + Gur reebe inyhr bs puqve vf qbhoyrq fb gung jr qba'g rkvg sebz gur + cnerag furyy ba n puqve reebe (fvapr r() rkvgf ba -1 reebef bayl). + Nyy bgure flfgrz pnyy snvyherf rkvg fvapr gurl ner sebz fhofuryyf. + + Erphefvba vf farnxvyl rzcyblrq gb nibvq n frpbaq pnyy gb sbex(), + naq gur yvar vf cnefrq va n snveyl ovmneer snfuvba: onpxjneqf. Gur + urneg bs gur cebtenz, gung vf, gur cneg juvpu cresbezf nyy sbexf, + rkrpf, bcraf, rgp. vf BAR P FGNGRZRAG. + + Gur zrgn-inyhrf neenl vf vavgvnyvmrq va n ovmneer snfuvba, naq gur + fhofrdhrag purpxf sbe gur '<' naq '>' ner cresbezrq va n fvatyr + fgngrzrag hfvat n znfx, fvapr lbh xabj gung '>'&2 vf 0, jurernf + '<'&2 vf 2. Bgure fhpu zvpeb-boshfpngvbaf nobhaq. + + Svanyyl, vg vf abgnoyr gung gur pbqr jnf unpxrq sbe zvavznyvgl. Vs + lbh ybbx ng gur pbzcerffrq irefvba, lbh jvyy or uneq-cerffrq gb + ryvzvangr zber guna n srj punenpgref (jr pna'g frr ubj gb znxr vg + nal fznyyre!). 550 punenpgref vf cerggl yrna sbe n furyy gung qbrf + guvf zhpu. + + OHTF + + Gur flagnk bs gur furyy unf abg orra shyyl rkcyberq, ohg vs lbh gel + gb erqverpg va gur fnzr qverpgvba zber guna bapr, bayl bar + erqverpgvba vf cresbezrq. Guvf vf n "srngher" bs gur jnl gur yvar + vf cnefrq; n cbvagre gb gur fgnpx bs nethzragf vf nffvtarq naq na + nethzrag vf fgbyra rirel gvzr n ">" be "<" vf rapbhagrerq. Gur + furyy syntf na reebe vs ab nethzragf ner ba gur fgnpx. Guhf, sbe + rknzcyr: + png > sbb > one + pngf gb sbb, fvapr vg jnf chfurq ynfg, ohg + png > > sbb one + pngf gb one, fvapr one jnf chfurq haqre sbb. (erzrzore jr'er + cnefvat evtug-yrsg) + + Qrcraqvat ba lbhe synibe bs HA*K, pq jvgubhg na nethzrag jvyy + rvgure cebqhpr na reebe be whfg qb abguvat. + + Gurer vf whfg bar reebe zrffntr, gur dhrfgvba znex, ohg url, gung'f + nyy rq qbrf gbb. + +Copyright (c) 1990, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1990/theorem.c b/1990/theorem.c new file mode 100644 index 000000000..f87198817 --- /dev/null +++ b/1990/theorem.c @@ -0,0 +1,93 @@ +#include +#include +#define X +#define Y {} +#define C } +#define o { +#undef main +char m[500][99],v[99],R; +int*a,b,n,i,j,W,A; +float Q,G,D,M,T,B,O,U,V,N,y,e(); +P(g,R,u)float*g,R,u;{int c;for(*g=1,c=u;c--;*g*=R);} +X +K(g,R,u)float*g,u;char R; +o +if(R=='+')*g+=u; +if(R=='-')*g-=u; +if(R=='*')*g*=u; +if(R=='/')*g/=u; +if(R=='^')P(g,*g,u); +C +w(g,R,u)float*g,u;char R; +/**/{int b,f;A=atoi(*++a);b=atoi(*++a);while((f=A+b)<15000){printf("%d\n",f);A=b;b=f;}} +main(A,a)int A;char*a[]; +o o +if(!strcmp(*++a,"-r"))S(); +D=atof(*++a); +T=atof(*++a); +B=atof(*++a); +M=atof(*(4+(a-=3))); +C +while(D0) +j=i; +strcpy(v,i+m); +C +for(i=(W/=3)-1;++i='0')&&(*f<='9'))K(&O,R,(float)*f-'0'); +else if(*f=='x')K(&O,R,D); +else if(1)R=*f; +if(1); +return O; +for(j=0;j +#include diff --git a/1990/theorem.hint b/1990/theorem.hint new file mode 100644 index 000000000..cb013d83c --- /dev/null +++ b/1990/theorem.hint @@ -0,0 +1,96 @@ +Best of Show: + + Adrian Mariano + University of Washington + 2729 72nd Ave SE + Mercer Island, WA 98040 + USA + + +Judges' comments: + + The program's source implements four functions, all from the + same source file! + + Usage: + + theorem expression x1 x2 h y1 + + where: + expression - function f(x,y) (see below) + x1 - start of interval + x2 - end of interval + h - step size + y1 - initial value (y(x1) == y1) + + When you compile theorem.c as is and run with 5 args, it numerically + solves the equation y'=f(x,y), with a step size of h, over the interval + x=[x1,x2], with the initial condition of y(x1)=y1. + + The 'expression' f(x,y), is any function of 'x' and 'y' with the + operators: + + + - * / ^ + + The symbol '^' is the power operator. Note that it only supports + integer powers. Also note that all expressions are evaluated strictly + left to right. (i.e., parenthesis aren't supported). + + Try running the program with the following args: + + theorem y 0 1 0.1 1 + theorem 1/x 1 2 0.1 0 + theorem 'x^2/y+x' 0 1 0.1 6 + + But wait, there is more! You also get, free of charge, a + reversing filter! Try: + + theorem -r 0 0 0 0 < theorem.c > sorter.c + + Still not impressed? The author throws in for free, a + sort program! Try: + + cc sorter.c -o sorter + ls | sorter + + This program is safe for home use as well. The author has + included a safety feature in case you misplace the original + program source: + + sorter -r 0 0 0 0 < sorter.c > theorem_bkp.c + + And finally, as a special offer to users of this entry, + the author provides a Fibonacci sequence generator! Try: + + sorter 0 0 0 0 < theorem.c > fibonacci.c + cc fibonacci.c -o fibonacci + fibonacci 1 1 + fibonacci 2 1 + + Program available 9 track and cartridge cassette. Gensu knife + not included! :-) + + When this program was first shown at the 1990 Summer Usenix + conference, it received a standing ovation; a first for + a contest entry. + + It should be noted that the 4 trailing args '0 0 0 0', are + required on systems that dump core when NULL is dereferenced. + + +Selected notes from the author: + + Differential equations are solved via the Runge-Kutta method, + which guarantees local error proportional to h^5, and total + error across a finite interval is at most a constant times h^4. + + Sorting is accomplished with a standard shell sort. + + Note that the sorting and reversing is limited to files with + fewer than 500 lines, each less than 99 characters long. + +Copyright (c) 1990, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1990/westley.c b/1990/westley.c new file mode 100644 index 000000000..5d63757cc --- /dev/null +++ b/1990/westley.c @@ -0,0 +1,107 @@ +char*lie; + + double time, me= !0XFACE, + + not; int rested, get, out; + + main(ly, die) char ly, **die ;{ + + signed char lotte, + + +dear; (char)lotte--; + + for(get= !me;; not){ + + 1 - out & out ;lie;{ + + char lotte, my= dear, + + **let= !!me *!not+ ++die; + + (char*)(lie= + + +"The gloves are OFF this time, I detest you, snot\n\0sed GEEK!"); + + do {not= *lie++ & 0xF00L* !me; + + #define love (char*)lie - + + love 1s *!(not= atoi(let + + [get -me? + + (char)lotte- + + +(char)lotte: my- *love - + + 'I' - *love - 'U' - + + 'I' - (long) - 4 - 'U' ])- !! + + (time =out= 'a'));} while( my - dear + + && 'I'-1l -get- 'a'); break;}} + + (char)*lie++; + + +(char)*lie++, (char)*lie++; hell:0, (char)*lie; + + get *out* (short)ly -0-'R'- get- 'a'^rested; + + do {auto*eroticism, + + that; puts(*( out + + - 'c' + +-('P'-'S') +die+ -2 ));}while(!"you're at it"); + + +for (*((char*)&lotte)^= + + (char)lotte; (love ly) [(char)++lotte+ + + !!0xBABE];){ if ('I' -lie[ 2 +(char)lotte]){ 'I'-1l ***die; } + + else{ if ('I' * get *out* ('I'-1l **die[ 2 ])) *((char*)&lotte) -= + + '4' - ('I'-1l); not; for(get=! + + +get; !out; (char)*lie & 0xD0- !not) return!! + + (char)lotte;} + + +(char)lotte; + + do{ not* putchar(lie [out + + *!not* !!me +(char)lotte]); + + not; for(;!'a';);}while( + + love (char*)lie);{ + + +register this; switch( (char)lie + + [(char)lotte] -1s *!out) { + + char*les, get= 0xFF, my; case' ': + + *((char*)&lotte) += 15; !not +(char)*lie*'s'; + + this +1s+ not; default: 0xF +(char*)lie;}}} + + get - !out; + + if (not--) + + goto hell; + + exit( (char)lotte);} diff --git a/1990/westley.hint b/1990/westley.hint new file mode 100644 index 000000000..5d8e01807 --- /dev/null +++ b/1990/westley.hint @@ -0,0 +1,54 @@ +Best Layout: + + Brian Westley (Merlyn LeRoy on usenet) + DigiBoard, Inc. + 1026 Blair Ave. + St. Paul, MN 55104 + USA + +Judges' comments: + + usage: westley + + If you would rather "Daisy" someone other than Westley, rename + the program as needed. :-) + + Read each block of code as if it were a piece of correspondence. + For example, the first block of code would read: + + charlie, + doubletime me, OXFACE! + not interested, get out + mainly die, charly, *die* + signed charlotte + + The original source had control-L's after each code block. To + make it easier on news readers, we converted each control-L to + a blank line. + + Some ANSI compilers will not accept '1s' as a short integer - for + these compilers replace the '1s' with '1'. + + +Selected notes from the author: + + This is a "Picking the Daisy" simulation. Now, instead of mangling a + daisy, simply run this program with the number of petals desired as + the argument. + + This is a good counter-example to peoples' complaints that C doesn't + have an "English-like" syntax. + + Lint complains about everything - null effect, xxx may be used before + set, statement not reached, return(e) and return. Lint dumps core + on some systems. My personal favorite lint complaint is + + "warning: eroticism unused in function main". + + Also obviously, (char)lotte and (char*)lie are incompatible types... + +Copyright (c) 1990, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1991/1991.tar.bz2 b/1991/1991.tar.bz2 new file mode 100644 index 000000000..097a93534 Binary files /dev/null and b/1991/1991.tar.bz2 differ diff --git a/1991/LANDER.BAS b/1991/LANDER.BAS new file mode 100644 index 000000000..30ea040d0 --- /dev/null +++ b/1991/LANDER.BAS @@ -0,0 +1,74 @@ +10 REM Lunar Lander +20 REM By Diomidis Spinellis +25 REM Compiler version +30 PRINT "You aboard the Lunar Lander about to leave the spacecraft." +60 GOSUB 4000 +70 GOSUB 1000 +80 GOSUB 2000 +90 GOSUB 3000 +100 LET H = H - V +110 LET V = ((V + G) * 10 - U * 2) / 10 +120 LET F = F - U +130 IF H > 0 THEN 80 +135 LET H = 0 +140 GOSUB 2000 +150 IF V > 5 THEN 200 +160 PRINT "Congratulations! This was a very good landing." +170 GOSUB 5000 +180 GOTO 10 +200 PRINT "You have crashed." +210 GOTO 170 +1000 REM Initialise +1010 LET V = 70 +1020 LET F = 500 +1030 LET H = 1000 +1040 LET G = 2 +1050 RETURN +2000 REM Print values +2010 PRINT " Meter readings" +2015 PRINT " --------------" +2020 PRINT "Fuel (gal):" +2030 PRINT F +2040 GOSUB 2100 + 100 * (H != 0) +2050 PRINT V +2060 PRINT "Height (m):" +2070 PRINT H +2080 RETURN +2100 PRINT "Landing velocity (m/sec):" +2110 RETURN +2200 PRINT "Velocity (m/sec):" +2210 RETURN +3000 REM User input +3005 IF F == 0 THEN 3070 +3010 PRINT "How much fuel will you use?" +3020 INPUT U +3025 IF U < 0 THEN 3090 +3030 IF U <= F THEN 3060 +3040 PRINT "Sorry, you have not got that much fuel!" +3045 PRINT F +3050 GOTO 3010 +3060 RETURN +3070 LET U = 0 +3080 RETURN +3090 PRINT "No cheating please! Fuel must be >= 0." +3100 GOTO 3010 +4000 REM Detachment +4005 PRINT "Ready for detachment" +4007 PRINT "-- COUNTDOWN --" +4010 FOR I = 1 TO 11 +4020 PRINT 11 - I +4025 GOSUB 4500 +4030 NEXT I +4035 PRINT "You have left the spacecraft." +4037 PRINT "Try to land with velocity less than 5 m/sec." +4040 RETURN +4500 REM Delay +4510 FOR J = 1 TO 500 +4520 NEXT J +4530 RETURN +5000 PRINT "Do you want to play again? (0 = no, 1 = yes)" +5010 INPUT Y +5020 IF Y == 0 THEN 5040 +5030 RETURN +5040 PRINT "Have a nice day." +5050 END diff --git a/1991/Makefile b/1991/Makefile new file mode 100644 index 000000000..57c7302a6 --- /dev/null +++ b/1991/Makefile @@ -0,0 +1,129 @@ +# %W% %G% %U% +# +# 1991 makefile +# +# Copyright (c) 1991, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL=/bin/sh +MAKE=make +MAKEFLAGS=e + +# uncomment the line to select the preferred type of compile +# +# You should also check the ansi.mk or common.mk for the +# proper compiler name and flags. +# +# NOTE ==> USE=ansi compile with an ANSI compiler by default +#USE=ansi +# NOTE ==> USE=common compile with a common K&R compiler by default +#USE=common + +WINNERS= ant brnstnd buzzard cdupont davidguy dds fine rince westley + +all: + -@if [ "${USE}" = "common" ]; then \ + echo ${MAKE} -k -f common.mk all; \ + ${MAKE} -k -f common.mk all; \ + elif [ "${USE}" = "ansi" ]; then \ + echo ${MAKE} -k -f ansi.mk all; \ + ${MAKE} -k -f ansi.mk all; \ + else \ + echo "set USE= in Makefile to be ansi or common as desired"; \ + echo "or type: make -f ansi.mk for ansi makes"; \ + echo "or type: make -f common.mk for common K&R makes"; \ + exit 1; \ + fi + +ansi: + ${MAKE} -f ansi.mk all + +common: + ${MAKE} -f common.mk all + +${WINNERS} merlyn.c nextmove.c ttt_game.c: + -@if [ "${USE}" = "common" ]; then \ + echo ${MAKE} -f common.mk $@; \ + ${MAKE} -f common.mk $@; \ + elif [ "${USE}" = "ansi" ]; then \ + echo ${MAKE} -f ansi.mk $@; \ + ${MAKE} -f ansi.mk $@; \ + else \ + echo "set USE= in Makefile to be ansi or common as desired"; \ + echo "or type: make -f ansi.mk for ansi makes"; \ + echo "or type: make -f common.mk for common K&R makes"; \ + exit 1;\ + fi + +ttt: ttt.sh + -@if [ "${USE}" = "common" ]; then \ + echo ${MAKE} -f common.mk $@; \ + ${MAKE} -f common.mk $@; \ + elif [ "${USE}" = "ansi" ]; then \ + echo ${MAKE} -f ansi.mk $@; \ + ${MAKE} -f ansi.mk $@; \ + else \ + echo "set USE= in Makefile to be ansi or common as desired"; \ + echo "or type: make -f ansi.mk for ansi makes"; \ + echo "or type: make -f common.mk for common K&R makes"; \ + exit 1;\ + fi + +merlyn: merlyn.c + -@if [ "${USE}" = "common" ]; then \ + echo ${MAKE} -f common.mk $@; \ + ${MAKE} -f common.mk $@; \ + elif [ "${USE}" = "ansi" ]; then \ + echo ${MAKE} -f ansi.mk $@; \ + ${MAKE} -f ansi.mk $@ \ + else \ + echo "set USE= in Makefile to be ansi or common as desired"; \ + echo "or type: make -f ansi.mk for ansi makes"; \ + echo "or type: make -f common.mk for common K&R makes"; \ + exit 1;\ + fi + +ttt_game: ttt_game.c + -@if [ "${USE}" = "common" ]; then \ + echo ${MAKE} -f common.mk $@; \ + ${MAKE} -f common.mk $@; \ + elif [ "${USE}" = "ansi" ]; then \ + echo ${MAKE} -f ansi.mk $@; \ + ${MAKE} -f ansi.mk $@; \ + else \ + echo "set USE= in Makefile to be ansi or common as desired"; \ + echo "or type: make -f ansi.mk for ansi makes"; \ + echo "or type: make -f common.mk for common K&R makes"; \ + exit 1;\ + fi + +nextmove: nextmove.c + -@if [ "${USE}" = "common" ]; then \ + echo ${MAKE} -f common.mk $@; \ + ${MAKE} -f common.mk $@; \ + elif [ "${USE}" = "ansi" ]; then \ + echo ${MAKE} -f ansi.mk $@; \ + ${MAKE} -f ansi.mk $@; \ + else \ + echo "set USE= in Makefile to be ansi or common as desired"; \ + echo "or type: make -f ansi.mk for ansi makes"; \ + echo "or type: make -f common.mk for common K&R makes"; \ + exit 1;\ + fi + +clean: + ${MAKE} -f ansi.mk clean + ${MAKE} -f common.mk clean +clobber: + ${MAKE} -f ansi.mk clobber + ${MAKE} -f common.mk clobber +nuke: clobber + ${MAKE} -f ansi.mk nuke + ${MAKE} -f common.mk nuke +install: + ${MAKE} -f ansi.mk install + ${MAKE} -f common.mk install diff --git a/1991/README b/1991/README new file mode 100644 index 000000000..df2d624c4 --- /dev/null +++ b/1991/README @@ -0,0 +1,88 @@ +1991 marked the "The Eighth International Obfuscated C Code Contest" + +Copyright (c) 1991, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + +Instructions for use: Run make to compile entries. It is possible that +on BSD or non-unix systems the makefile needs to be changed. + +Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +(minor) spoilers. + +This year, we did not single out an entry that was better than all of +the rest. We selected 3 entries that were, in our opinion, went beyond +all of the other entries this year: + + Grand Prize by Brian Westley + Most Well Rounded by Diomidis Spinellis + Best Of Show by Daniel J. Bernstein + +Name and address information are separated from the actual program +prior to judging. This eliminates any chance that we would bias our +judging for/against any person or group. In the end, we are surprised +as you are to see who as won. Even so, it is worth noting that +Brian Westley has submitted a winning entry for the past 5 years! + + +A few notes regarding possible changes to the contest: + +We did not give awards to some traditional contest categories such as +"Best Layout" or "Worst Abuse of the Rules". We felt that to do so +would deny awards to more deserving entries. These categories have not +been eliminated, and will likely be considered in future years. + +A number of entries made use of the following C pre-processor feature: + + #define X define + #X foo bar + +This is not permitted under ANSI C. Some ANSI C compilers do allow +this. In the future, we do not want programs to use this feature. +Because this request was not stated in the 1991 rules, we did not +reject entries of this type. However we provided more portable +versions so that more people could compile these programs. + +This year we received entries that made use of the X Window System. +This functionality is now available on many systems, we feel that +programs that use these are now portable enough to be valid entries. + +We may allow programs to make use of the X Window System libs and include +files, provided that they can operate with a system running at the level +of at least X11r4. Requiring the use of imake, a specific window manager, +specific display hardware, or a specific user interface (Openl**k, +M*tif, ...) is likely not to be allowed. We will provide a more detailed +explanation of our viewpoint in next year's rules. + +In order to encourage more 'normal' looking C programs, we are considering +the following change to the maximum size rule: + + Your source, not counting any , , and a character, + and not counting any ';', '{' and '}' character followed by a + character, must be 1536 bytes or less. The entire source, counting all + characters, be 4096 bytes or less. + +Some thought has been given to adding some c++ categories, however this +is not likely to happen soon. We are waiting until c++ compilers become +common place on a wide number of systems. We also need time to brace +ourselves for what obfuscation c++ could wield! + +Be sure to wait until the 1992 rules are posted before submitting entries. +We may fine tune the rules to reflect the some ideas above. + +Please send us comments and suggestions what we have expressed above. +Also include anything else that you would like to see in future contests. +Send such email to: + + ...!{sun,pacbell,uunet,pyramid}!hoptoad!judges + judges@toad.com + + +Credits: + +We would like to thank Barbara Frezza for her role as official chef +of the contest. Landon Noll appreciated the opportunity to serve +as assistant pizza chef. Larry Bassel was official taste tester. Yummo! diff --git a/1991/ansi.mk b/1991/ansi.mk new file mode 100644 index 000000000..c87fa6875 --- /dev/null +++ b/1991/ansi.mk @@ -0,0 +1,156 @@ +# %W% %G% %U% +# +# 1991 makefile + +SHELL=/bin/sh +CHMOD=chmod +CP=cp +RM=rm +SED=sed +LN=ln + +# flags for ansi compiles +# +# NOTE: Some ANSI compilers make use of -Xa to turn on ANSI mode, +# others such as gcc may want -ansi, others may want nothing +# at all. Adjust the CFLAGS line as needed. +# +CFLAGS=-O -Xa +CC=cc + +# winners that may be ok to compile with common K&R +# +WINNERS= ant brnstnd buzzard cdupont davidguy dds fine westley rince + +all: ${WINNERS} + +common: + @echo "wrong makefile, use ansi.mk" + exit 1 + +ansi: all + +# NOTE: some systems may need: +# +# old SYS V: +# cc ${CFLAGS} -DMODE=0600 -DBUF=32767 -o ant ant.c -lcurses +# ATARI ST: +# cc -DMODE=0 -DBUF=32767 -o ant.ttp ant.c curses.a +# PC class: +# wcl -mc -DMODE=0 -DBUF=32767 ant.c curses.lib +# +ant: ant.c + ${CC} ${CFLAGS} -DMODE=0600 -DBUF=32767 ant.c -o ant -lcurses -ltermcap + +brnstnd: brnstnd_ansi.c + ${CC} ${CFLAGS} -DM=malloc -DX=free -Do=250 brnstnd_ansi.c -o brnstnd + +buzzard: buzzard.c + ${CC} ${CFLAGS} buzzard.c -o buzzard + +cdupont: cdupont_ansi.c + ${CC} ${CFLAGS} -Ds=\"cdupont.c\" -Dt=\"r\" cdupont_ansi.c -o cdupont + +# NOTE: some systems may need: +# +# ${CC} ${CFLAGS} davidguy.c -o davidguy +# or: +# ${CC} ${CFLAGS} davidguy.c -o davidguy -linet +# +davidguy: davidguy.c + ${CC} ${CFLAGS} davidguy.c -o davidguy -lsocket -lnsl + +# NOTE: this is the original program that won the contest +# +# BSD: +# ${CC} ${CFLAGS} davidguy.orig.c -o davidguy.orig +# +davidguy.orig: davidguy.orig.c + ${CC} ${CFLAGS} davidguy.orig.c -o davidguy.orig -lsocket -lnsl + +dds: dds.ansi.c LANDER.BAS + ${CC} ${CFLAGS} dds.ansi.c -o dds + +fine: fine.c + ${CC} ${CFLAGS} fine.c -o fine + +westley: westley.c ttt + ${CC} ${CFLAGS} -DP=putchar -DN="P(10)" -DQ="P(34)" -DF="S(&X)" \ + -DJ=z[4] -DK=J[14] \ + -DH="w[]={146,7,292,73,448,56,84,273,325,297,108,324,22,40,48,40,17,325}" \ + westley.c -o westley + +# the hint file gives nextmove.c as an example, provide a build rule for it +# +nextmove: nextmove.c ttt + ${CC} ${CFLAGS} -DP=putchar -DN="P(10)" -DQ="P(34)" -DF="S(&X)" \ + -DJ=z[4] -DK=J[14] \ + -DH="w[]={146,7,292,73,448,56,84,273,325,297,108,324,22,40,48,40,17,325}" \ + nextmove.c -o nextmove + +# the ttt script has been added by the judges to make playing westley easy +# +ttt: ttt.sh + rm -f ttt + cp ttt.sh ttt + chmod +x ttt + +# used by the ttt shell script when playing westley +# +# The ttt script controls what goes into merlyn.c, and how it is used. +# The merlyn program and source represent the best (hopefully) state that +# the program has evolved into thus far. The ttt_game program and source +# represent the current state of the game. +# +merlyn: merlyn.c ttt + @${CC} ${CFLAGS} -DP=putchar -DN="P(10)" -DQ="P(34)" -DF="S(&X)" \ + -DJ=z[4] -DK=J[14] \ + -DH="w[]={146,7,292,73,448,56,84,273,325,297,108,324,22,40,48,40,17,325}" \ + merlyn.c -o merlyn +ttt_game: ttt_game.c ttt + @${CC} ${CFLAGS} -DP=putchar -DN="P(10)" -DQ="P(34)" -DF="S(&X)" \ + -DJ=z[4] -DK=J[14] \ + -DH="w[]={146,7,292,73,448,56,84,273,325,297,108,324,22,40,48,40,17,325}" \ + ttt_game.c -o ttt_game + +# The upper level makefile wants to make these source files if they don't +# already exist. +# +merlyn.c: westley.c + rm -f merlyn.c + cp westley.c merlyn.c + chmod +w merlyn.c +nextmove.c: westley.c + rm -f nextmove.c + cp westley.c nextmove.c + chmod +w nextmove.c +ttt_game.c: westley.c + rm -f ttt_game.c + cp westley.c ttt_game.c + chmod +w ttt_game.c + +# NOTE: some systems may need: +# +# old SYS V: +# cc ${CFLAGS} -o rince rince.c -lcurses +# +# The original source is found in rince.orig.c. Many ANSI compilers have +# problems with it, so by default we use rince_ansi.c. +# +# GNU CC users can compile this with: +# +# gcc -ansi rince.orig.c -o rince -lcurses -ltermcap +# +rince: rince.c + ${CC} ${CFLAGS} rince_ansi.c -o rince -lcurses -ltermcap + +clean: + ${RM} -f *.o a.out core merlyn new_merlyn.c +clobber: clean + ${RM} -f ${WINNERS} a.c a.out davidguy.orig ttt + ${RM} -f merlyn merlyn.c nextmove.c nextmove.c + ${RM} -f ttt_game ttt_game.c ttt_old.c ttt_new.c nextmove +nuke: clobber + @true +install: all + cat ${WINNERS} > /dev/null diff --git a/1991/ant.c b/1991/ant.c new file mode 100644 index 000000000..6ad47ce86 --- /dev/null +++ b/1991/ant.c @@ -0,0 +1,28 @@ +#include +#include +#define T isspace(*(t=Z(p)))&& +#define V return +#define _ while +int d,i,j,m,n,p,q,x,y;char*c,b[BUF],*f,*g=b,*h,k[]="hjklHJKL[]tbixWRQ",*t; +char*Z(a){if(a<0)V b;V b+a+(b+a>");move(y,x); +refresh();}main(u,v)char**v;{h=c=b+BUF;if(u<2)V +2;initscr();d=LINES;raw();noecho();idlok(stdscr,1);if(0<(i=open(f= *++v,0))){ +g+=read(i,b,BUF);g=g +#define D define +#D H(x,y,z) f(p){--p;c=x-_+1];f(c>0){y+1]=z[c];z[c]=y];y]=y+1];}} +#D O(x,y) F(x,int U;int T=0;d=M(U=1);W{f(c==y)b g[T++]=c;f(T==U)g=realloc(g,U<<=1);}g[T]=0;) +#D W Y((c=k?K[--k]:getchar())-EOF) +#D S i[q +#D F(w,z) f(c==w){z h} +#D f if +#D P p>1&&(c=u, +#D _ s[p +#D C =G +#D g S] +#D J(x,y) F(I[x],y) +#D Q P e +#D Y while +#D b break; +#D u _--] +#D m p&& +#D R char* +#D l Z[c] +#D L strlen +#D d i[++q] +#D G c) +#D h ;continue; +#D N s[++p] +#D e _] +#D j x;{R r=M(L( +#D v return +#D w [256] +#D V f(k>o||p>o||q>o)v 2; +R I="I'd love ta win: the most useful !$>%`/#<&*|^ _OBFUSCATED_ utility. Pleez?";U(y,x)R y;R*j*x)+L(y)+1);sprintf(r,"%s%s",*x,y);*x=r;}R T(x)R j x)+1);strcpy(r,x);v +r;}R(i w);static R(Z w);K w;main(a,A)int a;R*A;{int s w,p=0,q=0,n=0,c,k=0;W{V +f(c>='0'&&c<='9'){f(!n)N=0;n=1;e=10*e+(c-'0')h}n=0;J(39,m +sprintf(d=M(13),"%d",e)) +J(37,q&&puts(g))J(34,q&&printf("%s",g))J(27,H(p,_,s))O('[',']')J(56,f(p){c=e;N=c;})J(2,m--p)J(10,N=a)J(4,f(q){N=L(g);X(S--]);})J(1,f(q){S+1]=T(g);++q;})J(53,m +e>=0&&e1&&(--q,U(S+1],i+q)))J(5,q&&p>1&&(_-1]=open(g,_-1],e),--p,X(S--])))J(47,m +close(u)) +J(26,m(e=dup(e)))O('"','"')J(51,H(q,S,i))J(49,N=fork())J(12,wait(&N)+1||(e=-1))J(68,{++p;pipe(s+p++)==-1&&(e=-1);})F('q',v +0) +F('=',W{R x;f(m u)f(x=l){k+=n=L(x);V;Y(*x)K[--k]=*x++;k+=n;n=0;}b})J(15,f(q)W{l&&X(l);l=T(g);b})J(33,f(c=q){*i=g;g=0;Y(--q&&**(i+q))g++;f(q){N=execvp(*i,i+q+1);q=c;}})J(38,P +c&&(e/C)) +J(35,Q=e>G)F('+',Q+C)J(42,Q*C)J(41,Q=~(e&G))J(57,m(e=-e))J(3,)F('\n',)putchar(c);puts(73+I);}} diff --git a/1991/brnstnd.hint b/1991/brnstnd.hint new file mode 100644 index 000000000..b2169e7d9 --- /dev/null +++ b/1991/brnstnd.hint @@ -0,0 +1,175 @@ +Best Of Show: + + Daniel J. Bernstein + New York University + + +Judges' comments: + + Make and run. Try: + + make brnstnd + brnstnd < sorta.i2+2 + + For info on more examples, read the sorta.README file. + + The author wished to win the "most useful program" award and + documented this in the source code. The judges were unmoved + by this blatant attempt to influence the contest and rejected + this idea... so we gave it the Best of Show award instead!! + + NOTE: Due to minor problems with some ANSI C compilers, we have + supplied a more portable ANSI version. See the top level + README file for details. + + NOTE: One should remove the final trailing newline to obtain the + original source file. This step is not needed to compile + this entry. + + +Selected notes from the author: + + This is an interpreter for the programming language SORTA, a systems + and numerical programming language with features sorta from C, sorta + from FORTH, and sorta from Ada. + + SORTA lets you manipulate files and spawn programs easily, has bitwise + operators, and gives you absolutely brilliant error messages like '?' + (that's the C bit). SORTA programs work with a stack (that's the FORTH + bit)---actually two stacks, one for integers and one for strings. And + all SORTA operations are strongly typed, detect practically any failure, + and garbage-collect (that's the Ada bit). + + SORTA also contains features you might not expect from such a small + interpreter: arbitrary-length string input and concatenation, for + instance, not to mention infinite-depth tail recursion. + + SORTA ignores its arguments (though it makes them available to the + script); it takes all commands, character by character, from its + standard input. Unrecognized commands are repeated with a ?. + + SORTA maintains an ``i stack'' for integers and an ``s stack'' for + strings. It also keeps track of ``programs,'' one for each character. + Operations are silently ignored if the relevant stacks are too low, + except as noted for s, S, and !. If the i stack or s stack (or the stack + of buffered macro commands) grows too high, SORTA will exit silently + with exit code 2. (Compile parameter -Do=250 controls what ``too high'' + means; you should not make o larger than 250.) I don't think it's + possible to crash the interpreter. + + Here, then, is the SORTA programming language. All non-digits delimit + numeric constants. Spaces and newlines are ignored except as numeric + delimiters. + + Basic operations: + + q: quit + number: push that number on top of the i stack + "string": push that string on top of the s stack, no length limit + [string]: push that string on top of the s stack, no length limit + #: make top of i stack non-destructively in ASCII, push result onto s stack + `: print top of s stack non-destructively + $: print top of s stack non-destructively without newline + d: drop (pop) top of i stack + D: dup (duplicate) top of i stack + ': dup top of s stack + s: pop top of i stack. If it is n, swap (n+1)th-top of i stack with top. + 1s, for example, swaps the top two elements; 2s swaps the top with + the third down; etc. This always pops the top of the i stack, even + upon failure. + S: pop top of i stack, then act just like s but upon s stack + l: pop top of s stack, push its length onto i stack + a: push argc onto i stack + A: pop top of i stack, push argv[i] on top of s stack + T: concatenate top two elements of s stack + _: negate top of i stack + +: pop top two elements of i stack, add, push back sum + *: pop top two elements of i stack, multiply, push back product + /: pop top two elements of i stack, divide, push back quotient + >: pop top two elements of i stack, compare, push back 1 or 0 as in C + &: pop top two elements of i stack, nand, push back bitwise result + Note that nand is sufficient to construct all bitwise operations, + as demonstrated by icalc below. + + System operations: + + o: pop top of s stack and top two of i stack; open(s1,i2,i1); leave + result on i stack + O: pop top of i stack, close() it + u: pop top of i stack, dup() it, push result back on + F: fork(), push result on i stack. This is not always safe while SORTA + is reading keyboard input or a script, as the forked programs share + file descriptors. It is always safe inside a program (see below). + P: pipe(), push two ends onto i stack. In case of trouble, + push <-1> onto i stack. + w: wait(), push successful result (or -1 if no children) on i stack + !: execvp() top of the s stack. Arguments are the next things down on + the s stack, in reverse order from popping; the first character of + each string is lopped off. There must be an empty string somewhere + in the s stack to terminate the argument list. If the execve() + fails, any operation involving current members of the s stack has + undefined effects, and -1 is pushed onto the i stack. + + High-level language operations: + + :x: copy the top of the s stack into a program labeled by character x + =x: pop the top of the i stack. If it was nonzero, execute the program + labeled by character x. Note that a digit at the end of a program + will merge with any digits after =x; in that case you usually want + to add a space at the end of the program. + + Common idioms: To drop the top of the s stack, ld. To do a <, 1s>. To + unconditionally execute the program labeled by character x, 1=x (or any + nonzero number followed by =x). To print the top of the i stack + non-destructively, #` (or #$ if you don't want the newline). To + subtract, _+. To do mod or and or any of the other missing operations, + combine the available operations as illustrated below. To introduce a + comment, [ this is a comment string which is promptly eliminated ]ld. + + SORTA's requirements: it wants fork(), execvp(), open(), + close(), dup(), pipe(), and wait(), so it obviously won't even compile + on a non-UNIX machine. It also assumes that you have a size-256 + character set and that the characters between '0' and '9' are exactly + the digits in order. It does *not* depend on ASCII, despite the code + appearance. Also note that SORTA does not attempt to declare malloc(), + so you will get some warnings about illegal pointer combinations. Also + note that there are unreached statements in SORTA. + + While the program source of course depends highly on #defines for + obfuscation, I like to think that this code has those little touches, + those professionally sharpened edges that mark true software + engineering. Observe, for instance, how i and s are the string and + integer stacks respectively. It's these little things that make you + feel at home in an otherwise utterly useless piece of code. They're + what make an obfuscation work. + + The character pool (``I'' after cpp) makes it rather painful to + see the effect of commands at a glance. I can just imagine people + spending hours bouncing between the pool and the rest of the code, + or accidentally changing the pool without realizing its importance. + Without documentation and example scripts, someone would find it + a challenge to figure out what the arrays are used for, let alone + that SORTA is a scripting language. + + Another nice feature is that the SORTA language itself encourages + you to write not merely obfuscated but plain incomprehensible + scripts (like the examples below---after working with the language + for a while, I guess I can read it pretty easily, but I also think + FORTH is a beautiful language). The numbers running around + everywhere will make people think of ASCII, even though the code is + not ASCII-dependent. What's your first thought when you see + several arrays[256]? This is pretty standard obfuscation otherwise. + I like the way that unbalanced macro braces can throw off the + reader in ``if(c>0){y+1]=z[c];'', and I had fun covering the + alphabet with #defines, but that's nothing special. + + Possible future extensions to SORTA include string extraction and + matching, reading from files into strings, and encrypting the string + pool to further confuse the judges. I don't think I can fit this into + the size limit, unfortunately. + +Copyright (c) 1991, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1991/brnstnd_ansi.c b/1991/brnstnd_ansi.c new file mode 100644 index 000000000..712ea195d --- /dev/null +++ b/1991/brnstnd_ansi.c @@ -0,0 +1,42 @@ +#include +#define H(x,y,z) f(p){--p;c=x-_+1];f(c>0){y+1]=z[c];z[c]=y];y]=y+1];}} +#define O(x,y) F(x,int U;int T=0;d=M(U=1);W{f(c==y)b g[T++]=c;f(T==U)g=realloc(g,U<<=1);}g[T]=0;) +#define W Y((c=k?K[--k]:getchar())-EOF) +#define S i[q +#define F(w,z) f(c==w){z h} +#define f if +#define P p>1&&(c=u, +#define _ s[p +#define C =G +#define g S] +#define J(x,y) F(I[x],y) +#define Q P e +#define Y while +#define b break; +#define u _--] +#define m p&& +#define R char* +#define l Z[c] +#define L strlen +#define d i[++q] +#define G c) +#define h ;continue; +#define N s[++p] +#define e _] +#define j x;{R r=M(L( +#define v return +#define w [256] +#define V f(k>o||p>o||q>o)v 2; +R I="I'd love ta win: the most useful !$>%`/#<&*|^ _OBFUSCATED_ utility. Pleez?";U(y,x)R y;R*j*x)+L(y)+1);sprintf(r,"%s%s",*x,y);*x=r;}R T(x)R j x)+1);strcpy(r,x);v +r;}R(i w);static R(Z w);int K w;main(a,A)int a;R*A;{int s w,p=0,q=0,n=0,c,k=0;W{V +f(c>='0'&&c<='9'){f(!n)N=0;n=1;e=10*e+(c-'0')h}n=0;J(39,m +sprintf(d=M(13),"%d",e)) +J(37,q&&puts(g))J(34,q&&printf("%s",g))J(27,H(p,_,s))O('[',']')J(56,f(p){c=e;N=c;})J(2,m--p)J(10,N=a)J(4,f(q){N=L(g);X(S--]);})J(1,f(q){S+1]=T(g);++q;})J(53,m +e>=0&&e1&&(--q,U(S+1],i+q)))J(5,q&&p>1&&(_-1]=open(g,_-1],e),--p,X(S--])))J(47,m +close(u)) +J(26,m(e=dup(e)))O('"','"')J(51,H(q,S,i))J(49,N=fork())J(12,wait(&N)+1||(e=-1))J(68,{++p;pipe(s+p++)==-1&&(e=-1);})F('q',v +0) +F('=',W{R x;f(m u)f(x=l){k+=n=L(x);V;Y(*x)K[--k]=*x++;k+=n;n=0;}b})J(15,f(q)W{l&&X(l);l=T(g);b})J(33,f(c=q){*i=g;g=0;Y(--q&&**(i+q))g++;f(q){N=execvp(*i,i+q+1);q=c;}})J(38,P +c&&(e/C)) +J(35,Q=e>G)F('+',Q+C)J(42,Q*C)J(41,Q=~(e&G))J(57,m(e=-e))J(3,)F('\n',)putchar(c);puts(73+I);}} diff --git a/1991/buzzard.c b/1991/buzzard.c new file mode 100644 index 000000000..6b611c6d7 --- /dev/null +++ b/1991/buzzard.c @@ -0,0 +1,31 @@ +#include +#define X(s) (!(s&3)-((s&3)==2)) +#define W while +char Z[82][82],A,B,f,g=26;z(q){return atoi(q);}m(d,l){return +Z[ B + X ( f + +3) * d+l *X(f+ 2 )][ A+X ( f ) * d + +l* X ( f + 3 ) ] ;}int +h= 0;D(p,s)char*s; {W(h>>3

> 3 ) {putchar('\t' +); h = ( h +8 +)&~7 ;}W(h < p ){putchar(' ');++h; }(void)printf( +"%s" , s ) ;h+=strlen(s);}main(x,a)char **a; { +# define P(x) (x?(5-(x))*(6-(x ))/2:11) +int b; { char b[256],i, j=0; FILE*F;F=fopen(x-1?a[1]:"buzzard.c","r");W( +fgets( b ,256 ,F)){for(i=0;b[ i];++ i) +Z[j][i ] =( b [ i ] ==' '?1:2*(b[i]==(x>2?*a[2]:'\\')));++j;}fclose +(F);}A =4 ; B = 3 ; f = 1;x >3? A=z(a[3]),B=z(a[4]):0;b='\n';do{if(b=='\n' +){int y , s , d , p , q ,i;for +(y=-11; y<= 11;++ y){ for(s = 1 ,d=0;s+3;s-=2){for +(;d!=2 + 3 * s ; d+=s){ +if(m(d,0) !=1 ){p=P (d) ;if (abs( y ) + p)break;for +(i =-p;iq)continue;if +(abs(y) 0)?"\\":"/");}d-=s;}puts( +"");h=0;}}f+=(b=='r')-(b=='l');f&=3;if(b=='f'){if(!m(1,0))continue; +A+=X(f);B+=X(f-1);}}W((b=getchar())!=-1&&m(0,0)==1);return 0;} diff --git a/1991/buzzard.hint b/1991/buzzard.hint new file mode 100644 index 000000000..fbeb55ac7 --- /dev/null +++ b/1991/buzzard.hint @@ -0,0 +1,92 @@ +Best Output: + + Sean Barrett + University of Maryland + 5407 20th Place + Hyattsville MD 20782 + USA + + +Judges' comments: + + Make and run as follows: + + make buzzard + buzzard + + You will be A-mazed. + + You are invited to try to cheat, ... if you can figure out how! :-) + + +Selected notes from the author: + + HOW TO PLAY: + + When the game starts, you are at the far end of the maze from the + exit, looking down a corridor. To move forward, type 'f' and press + return. To turn 90 degrees right, type 'r'; left, 'l'. You can + put multiple commands on one line, and the new view will be drawn + after all the moves. + + The game ends if you get out the exit (you'll know it when you see + it) or when you type ^D. + + HINTS ON HOW TO CHEAT: (rot13 to read) + + Lbh pna, bs pbhefr, purng ol ybbxvat ng gur znmr znc. Gur dhrfgvba + lbh arrq gb nfx lbhefrys, gubhtu, vf jung frdhrapr bs punenpgref + znexf gur cynpr jurer lbh pna rfpncr gur znmr? + + Gur nytbevguz vf dhvgr ovmneer--gur cevznel arfgrq ybbc gung + trarengrf vg tbrf gbc gb obggbz ba gur qvfcynl, ybbcvat sbejneq + gura onpxjneq sebz gur pheerag cbfvgvba gb qenj gur yrsg fvqr naq + gura gur evtug fvqr. + + ADVANCED USAGE NOTES: (rot13 to read) + + Gur cebtenz pna nyfb or eha sebz bgure svyrf pbagnvavat znmrf. Gur + znmr fubhyq or ynvq bhg tencuvpnyyl va gur boivbhf sbezng; arjyvarf + frcnengr culfvpny ebjf va gur znmr; n fcnpr vaqvpngrf n pbeevqbe, + naq nal bgure punenpgre vf n jnyy. Gnof ner nyfb pbafvqrerq jnyyf, + fb znxr fher gb pbaireg gnof gb fcnprf orsber hfvat vg. + + Hfntr: ohmmneq [svyranzr [rfpncr-pune [fgneg-k fgneg-l]]] + + Svyranzr vf gur anzr bs gur svyr pbagnvavat gur znmr. Guvf + qrsnhygf gb 'ohmmneq.p'. + + Rfpncr-pune vf gur punenpgre va gur znmr gung ercerfragf gur rkvg. + Lbh pna chg zber guna bar rkvg va gur znmr (sbe rknzcyr, lbh pbhyq + znxr nyy '!'f va gur znmr or rkvgf). + + Fgneg-k naq fgneg-l znex gur pbbeqvangrf jurer lbh ortva cynlvat. + L pbbeqvangr vf qbja gur ebjf va gur svyrf, K vf gb gur evtug + guebhtu gur punenpgref bs rnpu yvar. Obgu K naq L ortva pbhagvat + sebz 0. Gur qrsnhyg vf fgneg-k = 4, fgneg-l = 5, juvpu vf arrqrq + sbe gur ohmmneq.p, ohg jbhyq cebonoyl or vanccebcevngr sbe bgure + znmrf. + + OHTF: + + Lbh pna'g punatr gung ng fgneg lbh'er snpvat qbja ("fbhgu"). + + Gur qenjvat nytbevguz pnaabg unaqyr bcra fcnprf (gjb fhpprfvir + fvqr-pbeevqbef jvgu ab jnyy orgjrra gurz). Va snpg, vg pnaabg unaqyr + fznyy qbt-yrtf cebcreyl, nygubhtu gur reebe vf fhogyr. + + Gur rkvg vf qenja yvxr n abezny pbeevqbe sebz gur fvqr ivrj; + vg'f bayl qvfcynlrq nf gur rkvg jura lbh ner snpvat vg. + + Vzcebcre pbzznaqyvar nethzragf ner abg unaqyrq avpryl. + + Znmrf jvgu bcravatf ng gur rqtrf jvyy pnhfr gur qenjvat cebtenz + gb ernpu vagb neovgenel cnepryf bs zrzbel. + + Gur cebtenz nffhzrf gung gnof ner frg gb 8 punenpgref. + +Copyright (c) 1991, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1991/cdupont.c b/1991/cdupont.c new file mode 100644 index 000000000..3a63eabfe --- /dev/null +++ b/1991/cdupont.c @@ -0,0 +1,26 @@ + /* common sense to nohonest programmer */ +#include +main(){int x ,gi=4,i,f,ri=1,httxkbl=1,m=012;long cd=0x5765248d,n; + char u[0x50][032];FILE *ind; + ind=fopen(s,t); for(i=0; i<0x1a; i++){goto daswjhkls;vhjsgfdy1l1gjhd:;} +/*borntorun.*/goto c0g0;cOgO:i=0;fclose(ind);c0gO: +x= u [gi][m]; sorryfor_this_unused_but_very_needed_label: + if( m==gi){x=0x70;f=0x68;}else goto cOg0 ; b:putchar(x); if( +!(n-httxkbl++)) +#define yank putchar(' + {httxkbl=1; yank ');goto + hxi;}goto bl; + /* hardlyundrstandable, but +likely to be missed if removed */ + daswjhkls: fgets(u[i], 0120, ind); + /*obfuscated, eh? */goto + vhjsgfdy1l1gjhd; + c0g0 : n=cd&0x40000000L>>0x1e; + goto cOgO; g6w: + if(x!=0x2e){i++;goto c0gO;}else /* +injail*/yank\n');goto vhjsgfdyl1lgjhd; +cOg0 : +f=u[m][gi];goto b;bl:m=(i+1)*(4* +x+3*f)%032;gi=(i+1)*(x+2*f)%0x1a; goto g6w; + hxi:cd^= n= cd&(7<<3*(014-++ri)); +n >>=3*(12-ri); goto bl;vhjsgfdyl1lgjhd:;} diff --git a/1991/cdupont.hint b/1991/cdupont.hint new file mode 100644 index 000000000..ea1f178a5 --- /dev/null +++ b/1991/cdupont.hint @@ -0,0 +1,54 @@ +Most Useful Label: + + Christian Dupont + Ecole Normale Superieure de Lyon, + Laboratoire d'Informatique Parallele + 42, Rue H.Berlioz + 69009 Lyon + France + + +Judges' comments: + + Make and run as follows: + + make cdupont + cdupont + + Why is the following label necessary? + + sorryfor_this_unused_but_very_needed_label: + + Notice that if you C beautify (cb) or pre-process this program, it + will no longer work correctly, or at all. (go ahead, try it... :-)) + + NOTE: Due to minor problems with some ANSI C compilers, we have + supplied a more portable ANSI version. See the top level + README file for details. + + NOTE: One should remove the final trailing newline to obtain the + original source file. This step is not needed to compile + this entry. + + +Selected notes from the author: + + Spoiler, rot13 to read: + + Gur fbhepr pbqr ubyqf gur yrggref bs gur zrffntr. Rnpu yrggre, pbzovarq + jvgu nabgure xrl yrggre, vf hfrq gb pbzchgr gur pbbeqvangrf bs gur arkg + yrggre naq xrl. Guhf, gur zrffntr vf pbqr. Gung vf jul V hfr fvyyl + pbzzragf, zbfg bsgra onqyl fcnprq. + + Gur fcnpr punenpgre frdhrapr orgjrra gur jbeqf vf tvira ol n fvzcyr + pbzchgngvba ba na bpgny pbafgnag (tvira urer nf na urk inyhr, bs + pbhefr). + + Guvf jnl, nal zrffntr pna or zvkrq vagb n pbqr, fvapr gur xrlf nyybj + lbh gb cynpr gur zrnavatshy yrggref jurerire lbh jnag. + +Copyright (c) 1991, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1991/cdupont_ansi.c b/1991/cdupont_ansi.c new file mode 100644 index 000000000..fdae94064 --- /dev/null +++ b/1991/cdupont_ansi.c @@ -0,0 +1,26 @@ + /* common sense to nohonest programmer */ +#include +main(){int x ,gi=4,i,f,ri=1,httxkbl=1,m=012;long cd=0x5765248d,n; + char u[0x50][032];FILE *ind; + ind=fopen(s,t); for(i=0; i<0x1a; i++){goto daswjhkls;vhjsgfdy1l1gjhd:;} +/*borntorun.*/goto c0g0;cOgO:i=0;fclose(ind);c0gO: +x= u [gi][m]; sorryfor_this_unused_but_very_needed_label: + if( m==gi){x=0x70;f=0x68;}else goto cOg0 ; b:putchar(x); if( +!(n-httxkbl++)) +#define yank(x) putchar(x) + {httxkbl=1; yank(' ');goto + hxi;}goto bl; + /* hardlyundrstandable, but +likely to be missed if removed */ + daswjhkls: fgets(u[i], 0120, ind); + /*obfuscated, eh? */goto + vhjsgfdy1l1gjhd; + c0g0 : n=cd&0x40000000L>>0x1e; + goto cOgO; g6w: + if(x!=0x2e){i++;goto c0gO;}else /* +injail*/yank('\n');goto vhjsgfdyl1lgjhd; +cOg0 : +f=u[m][gi];goto b;bl:m=(i+1)*(4* +x+3*f)%032;gi=(i+1)*(x+2*f)%0x1a; goto g6w; + hxi:cd^= n= cd&(7<<3*(014-++ri)); +n >>=3*(12-ri); goto bl;vhjsgfdyl1lgjhd:;} diff --git a/1991/common.mk b/1991/common.mk new file mode 100644 index 000000000..20a9804c6 --- /dev/null +++ b/1991/common.mk @@ -0,0 +1,152 @@ +# %W% %G% %U% +# +# 1991 makefile + +SHELL=/bin/sh +CHMOD=chmod +CP=cp +RM=rm +SED=sed +LN=ln + +# flags for common K&R compiles +# +CFLAGS=-O +CC=cc + +# winners that may be ok to compile with common K&R +# +WINNERS= ant brnstnd buzzard cdupont davidguy dds fine westley rince + +all: ${WINNERS} + +ansi: + @echo "wrong makefile, use ansi.mk" + exit 1 + +common: all + +# NOTE: some systems may need: +# +# old SYS V: +# cc ${CFLAGS} -DMODE=0600 -DBUF=32767 -o ant ant.c -lcurses +# ATARI ST: +# cc -DMODE=0 -DBUF=32767 -o ant.ttp ant.c curses.a +# PC class: +# wcl -mc -DMODE=0 -DBUF=32767 ant.c curses.lib +# +ant: ant.c + ${CC} ${CFLAGS} -DMODE=0600 -DBUF=32767 ant.c -o ant -lcurses -ltermcap + +brnstnd: brnstnd.c + ${CC} ${CFLAGS} -DM=malloc -DX=free -Do=250 brnstnd.c -o brnstnd + +buzzard: buzzard.c + ${CC} ${CFLAGS} buzzard.c -o buzzard + +cdupont: cdupont.c + ${CC} ${CFLAGS} -Ds=\"cdupont.c\" -Dt=\"r\" cdupont.c -o cdupont + +# NOTE: some systems may need: +# +# ${CC} ${CFLAGS} davidguy.c -o davidguy +# or: +# ${CC} ${CFLAGS} davidguy.c -o davidguy -linet +# +davidguy: davidguy.c + ${CC} ${CFLAGS} davidguy.c -o davidguy -lsocket -lnsl + +# NOTE: this is the original program that won the contest +# +# BSD: +# ${CC} ${CFLAGS} davidguy.orig.c -o davidguy.orig +# +davidguy.orig: davidguy.orig.c + ${CC} ${CFLAGS} davidguy.orig.c -o davidguy.orig -lsocket -lnsl + +dds: dds.c LANDER.BAS + ${CC} ${CFLAGS} dds.c -o dds + +fine: fine.c + ${CC} ${CFLAGS} fine.c -o fine + +westley: westley.c ttt + ${CC} ${CFLAGS} -DP=putchar -DN="P(10)" -DQ="P(34)" -DF="S(&X)" \ + -DJ=z[4] -DK=J[14] \ + -DH="w[]={146,7,292,73,448,56,84,273,325,297,108,324,22,40,48,40,17,325}" \ + westley.c -o westley + +# the hint file gives nextmove.c as an example, provide a build rule for it +# +nextmove: nextmove.c ttt + ${CC} ${CFLAGS} -DP=putchar -DN="P(10)" -DQ="P(34)" -DF="S(&X)" \ + -DJ=z[4] -DK=J[14] \ + -DH="w[]={146,7,292,73,448,56,84,273,325,297,108,324,22,40,48,40,17,325}" \ + nextmove.c -o nextmove + +# the ttt script has been added by the judges to make playing westley easy +# +ttt: ttt.sh + rm -f ttt + cp ttt.sh ttt + chmod +x ttt + +# used by the ttt shell script when playing westley +# +# The ttt script controls what goes into merlyn.c, and how it is used. +# The merlyn program and source represent the best (hopefully) state that +# the program has evolved into thus far. The ttt_game program and source +# represent the current state of the game. +# +merlyn: merlyn.c ttt + @${CC} ${CFLAGS} -DP=putchar -DN="P(10)" -DQ="P(34)" -DF="S(&X)" \ + -DJ=z[4] -DK=J[14] \ + -DH="w[]={146,7,292,73,448,56,84,273,325,297,108,324,22,40,48,40,17,325}" \ + merlyn.c -o merlyn +ttt_game: ttt_game.c ttt + @${CC} ${CFLAGS} -DP=putchar -DN="P(10)" -DQ="P(34)" -DF="S(&X)" \ + -DJ=z[4] -DK=J[14] \ + -DH="w[]={146,7,292,73,448,56,84,273,325,297,108,324,22,40,48,40,17,325}" \ + ttt_game.c -o ttt_game + +# The upper level makefile wants to make these source files if they don't +# already exist. +# +merlyn.c: westley.c + rm -f merlyn.c + cp westley.c merlyn.c + chmod +w merlyn.c +nextmove.c: westley.c + rm -f nextmove.c + cp westley.c nextmove.c + chmod +w nextmove.c +ttt_game.c: westley.c + rm -f ttt_game.c + cp westley.c ttt_game.c + chmod +w ttt_game.c + +# NOTE: some systems may need: +# +# old SYS V: +# cc ${CFLAGS} -o rince rince.c -lcurses +# +# The original source is found in rince.orig.c. Many ANSI compilers have +# problems with it, so by default we use rince_ansi.c. +# +# GNU CC users can compile this with: +# +# gcc -ansi rince.orig.c -o rince -lcurses -ltermcap +# +rince: rince.c + ${CC} ${CFLAGS} rince.c -o rince -lcurses -ltermcap + +clean: + ${RM} -f *.o a.out core +clobber: clean + ${RM} -f ${WINNERS} a.c a.out davidguy.orig ttt + ${RM} -f merlyn merlyn.c nextmove.c nextmove.c + ${RM} -f ttt_game ttt_game.c ttt_old.c ttt_new.c nextmove +nuke: clobber + @true +install: all + cat ${WINNERS} > /dev/null diff --git a/1991/davidguy.c b/1991/davidguy.c new file mode 100644 index 000000000..8d7a75726 --- /dev/null +++ b/1991/davidguy.c @@ -0,0 +1,33 @@ +#define u unsigned +#define w char* +#define j(x)(*(*(x*)&T)++) +#define H j(short*) +#define K j(w) +#define e j(u*) +#define r register u +#define R(b)write(A,T=h,4*b); +#define S (u*)sbrk(Q*4+U*8)+U +#define E(a,b,c)a=c&1<<31|b/2;c=c*2|b&1; +#define V q=h^*L;L+=F;E(d,q,x)E(f,d,s)g=f&q;f^=q +#define W while( +#define Z q=I&f;M|=q&c;c^=q;I^=f;M|=g&c;c^=g +#define Y W(F= *s++-'0')<=9)*T=10**T+F;K +#define D(q,s)c);W q>s)G= *--q,*q= *s,*s++=G; +#define P if(i^z){x=Q+(n=D(x,n) +#define C if(i){q=Q*4+(s=(w)D(q,s) +u A,U,Q,J,X[9999],B;main(a,b)w*b;{r*c,*d,y=0,f,g,F,I,M,N,z,*x,*n,i,G;w q,*h=(w +)X,*T,*s=".slo.-W00,tmhw.W/";T=h;if(a>1){e;s=b[1];Y;Y;Y;Y;T=h;H;K=23;Y+=112;T= +h;Y;y= *--T;H=2;}else{H=1;W*s)K=1+*s++;}connect(A=socket(a,1,0),T=h,24-a*4);H= +17004;H=11;e=0;e=0;i=66==*h;R(3)read(A,h,8);e;H;read(A,h,4*H);T=h;e;F=e;e;e;I= +11+H;f=H-6;K;U=K;i^=K;z=!K;T+=I/4*4+8*U;W y--){T+=39;I=K;W I--)H,T+=4+24*H;}I= +e;e;B=(!e^**b&1)-1;e;e;U=H/32;J=H/30*30;T+=14;M=K;f/=U;T=h;K=55;K;H=4;e=F;e=I; +e=0;R(4)N=F+8192;K=53;K=M;H=4;e=N;e=I;H=U*32;H=J;R(4)K=2;K;H=4;e=I;e=1;e=N;R(4 +)Q=J*U;c=S;d=S;L(c);W 1){P}C}y=0;W yf?g=f:g);e=N;e +=F;H=U*32;H=g;H=0;H=y;K=0;K=1;R(6)write(A,c+y*U,g*U*4);y+=g;}K=61;K=0;H=4;e=I; +e=0;e=0;R(4)C}P}v(c,d);}}L(A)r*A;{r*T=A+Q,X=getpid();W A>31;G=z+F;L=y+F;W G>z){M= *--G;*--L=(M*2)+f;f=M>>31;}z+=F;y+ +=F;}} diff --git a/1991/davidguy.fix.c b/1991/davidguy.fix.c new file mode 100644 index 000000000..21ea9da20 --- /dev/null +++ b/1991/davidguy.fix.c @@ -0,0 +1,34 @@ +#define u unsigned +#define w char* +#define j(x)(*(*(x*)&T)++) +#define H j(short*) +#define K j(w) +#define e j(u*) +#define r register u +#define R(b)write(A,T=h,4*b); +#define S (u*)sbrk(Q*4+U*8)+U +#define E(a,b,c)a=c&1<<31|b/2;c=c*2|b&1; +#define V q= *L;L+=F;E(d,q,x)E(f,d,s)g=f&q;f^=q +#define W while( +#define Z q=I&f;M|=q&c;c^=q;I^=f;M|=g&c;c^=g +#define Y W(F= *s++)&16)*T=10**T+F-'0';T++ +#define D(q,s)c);W q>s)G= *--q,*q= *s,*s++=G; +#define P if(i^z){x=Q+(n=D(x,n) +#define C if(i){q=Q*4+(s=(w)D(q,s) +u A,U,Q,J,X[9999];main(a,b)w*b;{r*c,*d,y,f,g,F,G,I,M,N,z,*x,*n,i,B,O;w q,*h=(w +)X,*T,*s;T=h;if(a>1){H=2;K=23;K=112;s=b[1];Y;Y;Y;Y;}else{s=".slo.-W00,tmhw.W/" +;H=1;W*s)K=1+*s++;K=0;}s=T;H=17004;H=11;e=0;e=0;i=66==*s;W connect(A=socket(a, +3-Q++,0),h,24-a*4)||write(A,s,12)!=12||read(A,T,8)!=8);e;H;read(A,h,4*H);T=h;e +;F=e;e;e;I=11+H;f=H-6;K;U=K;i^=K;z=!K;T+=I/4*4+8*U;I=e;e;O=e;B=e;e;U=H/32;J=H/ +30*30;T+=14;M=K;f/=U;T=h;K=55;K;H=6;e=F;e=I;e=12;e=B;e=O;R(6)B=F+8192;K=53;K=1 +;H=4;e=B;e=I;H=U*32;H=J;R(4)O=B+8192;K=55;K;H=4;e=O;e=B;e=0;R(4)N=O+8192;K=53; +K=M;H=4;e=N;e=I;H=U*32;H=J;R(4)K=2;K;H=4;e=I;e=1;e=N;R(4)Q=J*U;c=S;d=S;L(c);W +1){P}C}y=0;W yf?g=f:g);e=B;e=O;H=U*32;H=g;H=0;H=y; +K=0;K=1;R(6)write(A,c+y*U,g*U*4);y+=g;}K=63;K;H=8;e=B;e=N;e=F;e=0;e=0;H=U*32;H +=J;e=1;R(8)K=61;K=0;H=4;e=I;e=0;e=0;R(4)C}P}v(c,d);}}L(A)r*A;{r*T=A+Q,X=getpid +();W A>31;G=z+F;L=y+F;W G>z){M= *--G;*--L=(M*2)+ +f;f=M>>31;}z+=F;y+=F;}} diff --git a/1991/davidguy.hint b/1991/davidguy.hint new file mode 100644 index 000000000..972f25d44 --- /dev/null +++ b/1991/davidguy.hint @@ -0,0 +1,122 @@ +Best X11 Graphics: + + David Applegate Guy Jacobson + School of Computer Science AT&T Bell Laboratories + Carnegie Mellon University 600 Mountain Avenue + Pittsburgh PA 15213 Murray Hill NJ 07974 + USA USA + + +Judges' comments: + + Make and run as follows: + + make davidguy + davidguy ip_address:server.screen + + where 'ip_address' in an IP address of an X server. For example, try: + + davidguy 127.0.0.1:0.0 + + Of course, may need to supply a more reasonable address. :-) + + Also try: + + cp davidguy guydavid + guydavid 127.0.0.1:0.0 + + Can you determine why this makes a difference. + + We permitted this type of entry to win because: + + - it did not require X to be on the host system + - both BSD and SVR4 have sockets + + Now that X11 and sockets have become 'standard', we plan to open + up the contest to programs that use them. Future rules will + explain this further. + + We are pleased that this entry has helped bring new 'life' into + the contest. + + NOTE: The orignal program that won may be found in davidguy.orig.c. + The author supplied a second version of the program, which + we have placed in the default location davidguy.c. + + +Selected notes from the authors: + + The program is a fully-functional X client. It talks directly to + the X server through a socket without using Xlib, Xt or any other + wussie toolkit junk. With no arguments, it will try to run + locally using the unix-domain socket (only on BSD :-( ) or you can + give it a command line argument identifying a display host address + (in dotted octet notation, like 127.0.0.1:0.0) where the X server + is running. It handles color and monochrome displays, and + performs whatever byte-swapping and bit-reversal is needed (so + that the program works even when the server and the client have + different architectures). It buffers communication to the X + server for efficiency. + + [[ NOTE: The original source in davidguy.c used only an IP address + argument (assumed :0.0) and assumed the color of black + and white. ]] + + The program doesn't require any user interaction; you can just sit + back and watch it run. All the action takes place in the root + window of the display. + + We think the program is interesting for these reasons: + + 1) It belongs to a class of programs that programmers make + the following complaints about: they require a mountain + of code to implement even the simplest program; and they + must be linked with giant libraries of hard-to-understand + functions. In contrast to these complaints (made by wimps, + in our humble opinion), our program fits in under 1536 + bytes, doesn't need any external functions except for a few + system calls, and doesn't need to include any header files. + + 2) It implements an extremely efficient algorithm for the + computation it performs. One cool feature of the algorithm + (at least as far as this contest is concerned) is that its + obscurity is fundamentally necessary for its efficiency. + In other words, even if we took steps to present the algorithm + clearly, (we haven't) the relation of the computation performed + to the specification of what the program was supposed to do + would still be hard to understand. + + Quasi-spoiler on internals: + + The program plays Conway's game of Life in the root window's + background pixmap. It starts by setting the background to random + bits, and then plays Life, with one Life cell for each pixel of the + screen. In the game of Life, a cell survives to the next round if + 2 or 3 of its 8 neighbors are also alive, and a cell is born if + exactly 3 of its neighbors are alive. Otherwise, a cell dies of + exposure if it has only 0 or 1 neighbors, and dies of overcrowding + if it has 4 or more neighbors. + + The algorithm used to compute the next generation is based on the + observation that a cell's state in the next generation is a boolean + function of its current state, and the states of its 8 neighbors + (ie, a boolean function from 9 bits to 1 bit). This function can + be computed by a boolean circuit. In addition, intermediate values + computed by the circuit can be shared between neighboring cells, + reducing the number of gates per cell required. These ideas + have been used before, to compute the next generation through a + series of bit blits. Instead of doing this, we map values in the + circuit to bits in registers, so that the next generation can be + computed efficiently within registers, minimizing memory accesses. + As a result, the computation of the next generation is performed + with about 1.6 instructions per life cell, consisting of .125 + memory accesses, .17 shifts, and 1.3 logic operations. The net + result is that the time to transfer the bits to the X server, and + for the X server to draw them on the screen, dominates the time to + compute the next generation. + +Copyright (c) 1991, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1991/davidguy.orig.c b/1991/davidguy.orig.c new file mode 100644 index 000000000..421c014d3 --- /dev/null +++ b/1991/davidguy.orig.c @@ -0,0 +1,32 @@ +#define _ define +#_ u unsigned +#_ w char* +#_ j(x)(*(*(x*)&T)++) +#_ H j(short*) +#_ K j(w) +#_ e j(u*) +#_ r register u +#_ R(b)write(A,T=h,4*b); +#_ S (u*)sbrk(Q*4+U*8)+U +#_ E(a,b,c)a=c&1<<31|b/2;c=c*2|b&1; +#_ V q= *L;L+=F;E(d,q,x)E(f,d,s)g=f&q;f^=q +#_ W while( +#_ Z q=I&f;M|=q&c;c^=q;I^=f;M|=g&c;c^=g +#_ Y W(F= *s++)&16)*T=10**T+F-'0';T++ +#_ D(q,s)c);W q>s)G= *--q,*q= *s,*s++=G; +#_ P if(i^z){x=Q+(n=D(x,n) +#_ C if(i){q=Q*4+(s=(w)D(q,s) +u A,U,Q,J,X[9999];main(a,b)w*b;{r*c,*d,y,f,g,F,G,I,M,N,z,*x,*n,i;w q,*h=(w)X,* +T,*s=".slo.-W00,tmhw.W/";T=h;if(a>1){H=2;K=23;K=112;s=b[1];Y;Y;Y;Y;}else{H=1;W +*s)K=1+*s++;}connect(A=socket(a,1,0),T=h,24-a*4);H=17004;H=11;e=0;e=0;i=66==*h +;R(3)read(A,h,8);e;H;read(A,h,4*H);T=h;e;F=e;e;e;I=11+H;f=H-6;K;U=K;i^=K;z=!K; +T+=I/4*4+8*U;I=e;T+=16;U=H/32;J=H/30*30;T+=14;M=K;f/=U;T=h;K=55;K;H=4;e=F;e=I; +e=0;R(4)N=F+8192;K=53;K=M;H=4;e=N;e=I;H=U*32;H=J;R(4)K=2;K;H=4;e=I;e=1;e=N;R(4 +)Q=J*U;c=S;d=S;L(c);W 1){P}C}y=0;W yf?g=f:g);e=N;e +=F;H=U*32;H=g;H=0;H=y;K=0;K=1;R(6)write(A,c+y*U,g*U*4);y+=g;}K=61;K=0;H=4;e=I; +e=0;e=0;R(4)C}P}v(c,d);}}L(A)r*A;{r*T=A+Q,X=getpid();W A>31;G=z+F;L=y+F;W G>z){M= *--G;*--L=(M*2)+f;f=M>>31;}z+=F;y+=F;}} diff --git a/1991/dds.ansi.c b/1991/dds.ansi.c new file mode 100644 index 000000000..1868a83e0 --- /dev/null +++ b/1991/dds.ansi.c @@ -0,0 +1,17 @@ +#include +#define Q r=R[*p++-'0'];while( +#define B ;break;case +char*s="Qjou!s\\311^-g\\311^-n\\311^-c\\::^-q-ma%mO1JBHm%BQ-aP1J[O1HB%[QaP2QaP4HC%T\ +Qs\\q,,^>m,2aP4HC%SD12N1\nJNQm>s\\..q^aHC%NHb%GN1!D32P3%RN1UP1D12JPQUaP1H\ +R%PN4\nQaP2Q,2aP4Hb%OD12D12N2!N3\nJVP3Q,,n\ +\\(aP3Q(^*m>g\\(aP3Q(^::::aHC%VP3Q>bupj)hfut)c**aHb%JD12JON1!Qjg)a%LN1UP1D12JIQUa\ +P1HL%IQ*m>aN2!N2\nP2QP2Q>aN2\nP2Hbdd!b/d";int k;char R[4][99] +;main(c,v)char**v;{char*p,*r,*q;for(q=s;*q;q++)*q>' '&&(*q)--;{FILE*i=fopen(v +[1],"r"),*o=fopen(q-3,"w");for(p=s;;p++)switch(*p++){B'M':Q(k=fgetc(i))!=EOF +&&k!=*p)*r++=k;if(k==EOF){fputs("}}\n",o);fclose(o);return system(q-6);}*r=0 +B'P':while(*p!='`')fputc(*p++,o)B'O':Q*r)fputc(*r++,o);p--B'C':k=0;Q k<*p-'0' +)(*r++=fgetc(i),k++);*r=0 B'I':k= *p;if(**R==k)goto G B'G':k= *p;G:p=s;while( +*p!='$'||p[1]!= k)p++;p++B'N':R[*p-'0'][0]++;}}} diff --git a/1991/dds.c b/1991/dds.c new file mode 100644 index 000000000..c2e837c57 --- /dev/null +++ b/1991/dds.c @@ -0,0 +1,17 @@ +#include +#define Q r=R[*p++-'0'];while( +#define B ;break;case +char*s="Qjou!s\\311^-g\\311^-n\\311^-c\\::^-q-ma%mO1JBHm%BQ-aP1J[O1HB%[QaP2QaP4HC%T\ +Qs\\q,,^>m,2aP4HC%SD12N1\nJNQm>s\\..q^aHC%NHb%GN1!D32P3%RN1UP1D12JPQUaP1H\ +R%PN4\nQaP2Q,2aP4Hb%OD12D12N2!N3\nJVP3Q,,n\ +\\(aP3Q(^*m>g\\(aP3Q(^::::aHC%VP3Q>bupj)hfut)c**aHb%JD12JON1!Qjg)a%LN1UP1D12JIQUa\ +P1HL%IQ*m>aN2!N2\nP2QP2Q>aN2\nP2Hbdd!b/d";k;char R[4][99] +;main(c,v)char**v;{char*p,*r,*q;for(q=s;*q;q++)*q>' '&&(*q)--;{FILE*i=fopen(v +[1],"r"),*o=fopen(q-3,"w");for(p=s;;p++)switch(*p++){B'M':Q(k=fgetc(i))!=EOF +&&k!=*p)*r++=k;if(k==EOF){fputs("}}\n",o);fclose(o);return system(q-6);}*r=0 +B'P':while(*p!='`')fputc(*p++,o)B'O':Q*r)fputc(*r++,o);p--B'C':k=0;Q k<*p-'0' +)(*r++=fgetc(i),k++);*r=0 B'I':k= *p;if(**R==k)goto G B'G':k= *p;G:p=s;while( +*p!='$'||p[1]!= k)p++;p++B'N':R[*p-'0'][0]++;}}} diff --git a/1991/dds.hint b/1991/dds.hint new file mode 100644 index 000000000..897823dc3 --- /dev/null +++ b/1991/dds.hint @@ -0,0 +1,84 @@ +Most Well Rounded: + + Diomidis Spinellis + Imperial College, University of London + Myrsinis 1 + GR-145 62 Kifissia + Greece + + +Judges' comments: + + Make and run as follows: + + make dds + dds basic_program + a.out + + For example, the author suggests trying: + + dds LANDER.BAS + a.out + + Notice that a file a.c has been generated. Can you tell how a.c was + produced? How does a.c relate to LANDER.BAS? + + This obfuscated program translates BASIC programs into obfuscated + C programs by way of an obfuscated algorithm. + + NOTE: Due to minor problems with some strict ANSI C compilers, we + have supplied a more portable ANSI version. + + +Selected notes from the author: + + This program is a companion to the DDS-BASIC interpreter program that + was submitted to the contest in 1990. This compiles BASIC programs into + executable commands. The input format is almost identical to the input + format of the DDS-BASIC interpreter. The program needs an executable C + compiler called `cc' in your path in order to work. + + Program commands: + + variable names A to Z variables initialized to 0 on RUN + FOR var = exp TO exp NEXT variable + GOSUB exp RETURN + GOTO exp IF exp THEN exp + INPUT variable PRINT string + PRINT exp var = exp + REM any text END + + Expressions are the same as the expressions of the C language. + Many system calls and C library calls can be used. + + Input format: + + - Free format positioning of tokens on the line. + - No space is allowed before the line number. + - Exactly one space is needed after the FOR and NEXT tokens + - ALL INPUT MUST BE UPPERCASE. + + Error checking / error reports: + + The compiler silently ignores many errors. + Other errors may produce errors in later phases of the compilation. + +Can you figure out how the compiler works? Hint (rot13): + + The compiler is NOT written in C, so this is really a meta-obfuscated + program. The C code is an intepreter for the four register, seven + instruction COGNIMP$ machine that is contained in the s string. + (COGNIMP$ is named after the symbolic names of the seven instructions it + defines (Print Output Goto Match If, iNcrement and Copy). The $ sign + is used for labels.) The actual compiler is written in COGNIMP$. + Browsing through the COGNIMP$ code we encouriage you to examine the + loops for scanning the expression in the IF statement and the way a + decision tree is implemented in order to match the statements. (Of + course the 's' string is encoded by adding one to every character of it just + to confuse you). + +Copyright (c) 1991, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1991/fine.c b/1991/fine.c new file mode 100644 index 000000000..f48cef507 --- /dev/null +++ b/1991/fine.c @@ -0,0 +1 @@ +main(a,b){while((a=getchar())+1)putchar((b=64^a&223)&&b<27?a&96|(b+12)%26+1:a);} diff --git a/1991/fine.hint b/1991/fine.hint new file mode 100644 index 000000000..a7a51f518 --- /dev/null +++ b/1991/fine.hint @@ -0,0 +1,85 @@ +Best One Liner: + + Thomas A. Fine + Ohio State University + Department of Computer and Information Science + 2036 Neil Avenue Mall + Columbus, Ohio 43210 + USA + + +Judges' comments: + + Make and run as follows: + + make fine + echo "green terra + vex + tang + vend onyx + cheryl be flashy + rail + clerk" | fine + + This filter, 80 chars plus a newline, fits into a single line on most + terminals (unless your terminal has a line wrap mis-feature :-)). + + This entry is likely one of the smallest C implementations of this + filter, excluding programs that resort to command line or include + file tricks. + + How does this program work? Which 3 bytes of C code can be changed + into 2 bytes, allowing the program to still work, but also stripping + the high bit off of some input? + + +Selected notes from the author: + + The author wishes to thank J Greely for the last 6 bytes. + + Here's about how it does it: [rot13 to read] + + + ABGR: Ovgf ner ersreerq gb nf 76543210, uvtu gb ybj. + + 1. Trg gur punenpgre va inevnoyr n. Abgr gur sha jnl jr purpx sbe RBS. + (gunaxf W). + + 2. Erirefr ovg 6, naq fgevc ovg 5. Ovg 6 qrgrezvarf (zbfgyl) jurgure + be abg guvf punenpgre vf n yrggre. Ovg 5 jbhyq qrgrezvar pnfr vs + jr pnerq. Nffvta guvf inyhr gb inevnoyr o (Jr arrq gb fnir vg, + fvapr jr arrq gb znxr 2 pbzcnevfbaf naq znlor bar bcrengvba jvgu + guvf inyhr). Jr pna'g nohfr bhe svefg inevnoyr, fvapr vg fnirf gur + ovgf jr'er punatvat. + + 3. Purpx guvf inyhr gb frr vs vg vf n yrggre. Vg zhfg or aba-mreb - + vs vg vf mreb, gura jr unir rvgure gur ng-fvta (64) be gur + onpxdhbgr (96). Vg nyfb zhfg or yrff guna 27 - guvf purpxf gur + enatr sbe yrggref nf jryy nf vzcyvpvgyl purpxvat gur inyhr bs ovg 6 + (vs vg jnf bevtvanyyl pyrne, vg vf frg abj, fb o jbhyq or gb ovt). + + 4. Vs vg vf abg n yrggre, gur pbaqvgvbany rkcerffvba vafvqr bs gur + chgpune() ergheaf gur bevtvany punenpgre (n). Bgurejvfr, vg + ergheaf n ernyyl zrffl rkcerffvba gung cresbezf gur npghny ebgngvba + naq svkrf gur svsgu naq fvkgu ovgf: + + N. Fhogenpg 1, gb trg vagb gur enatr 0-25 (sbe gur zbqhyb bcrengvba). + O. Nqq 13 gb gur punenpgre. Fgrcf N naq O ner pbzovarq. + P. Gnxr guvf zbqhyb 26 gb znxr gur nqqvgvba jenc nebhaq. + Q. Svk ovgf 5 naq 6, onfrq ba inevnoyr n. + R. Nqq 1 onpx va (jr gbbx vg bhg va fgrc N.) Guvf vf bxnl gb qb + *nsgre* fgrc Q, orpnhfr jr xabj gur nqqvgvba jba'g gevpxyr hc + cnfg gur sbhegu ovg (o jbhyq unir gb or 31 sbe guvf gb unccra). + + Abgvpr gung guvf vzcyrzragngvba bcrengrf bayl ba punenpgref jvgu gur + uvtu ovg pyrne. Gur uvtu ovg pna or vtaberq jvgubhg punatvat gur fvmr + bs gur cebtenz. Nyfb, vs lbh xabj lbh ner bayl qrnyvat jvgu frira ovg + qngn, gur fvmr pna or erqhprq ol bar olgr. Gurfr ner yrsg nf rkrepvfrf + sbe gur fghqrag. + + +Copyright (c) 1991, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1991/rince.c b/1991/rince.c new file mode 100644 index 000000000..1d5d5edd5 --- /dev/null +++ b/1991/rince.c @@ -0,0 +1,12 @@ +#include +int u=484,X[]={-1,0,0,1},Y[]={0,1,-1,0},x,y,D,i,j,a; +char o,m,*t,*O="MNOH",*k="hjkl",*s="######\0######\0######\0 \0 \0 \0 ___ \0 / \\\0 \\___/\0 ___ \0 /@@@\\\0 \\@@@/\0| | /\\\0----||\0 \\/\0 /--\\\0 \\/ \0 ==| \0 ==| \0 /\\ \0 \\--/\0 /O__o\0 \\___/\0 /_\\_ \0 << \0 << \0 << \0 \0vvvvvv\0 \0 \0^^^^^^\0 \0 /\\ \0 < > \0 \\/ \0o__O\\ \0\\___/ \0 _/_\\ \0 O__O \0/----\\\0_/ \\_\0 ^__^ \0/----\\\0_/ \\_" , +M[12][22]={"AAAAAAAAAAAAAAAAAAAAAA" ,"ALCABBBBBBBABBCBBCABBA", "ACCABAKAAABAFBABABAEBA", "ABBBBABBIBBBBBEEABACLA", "ACCBNIBBAAAAGALBBBABCA", "AAAAAAAJACBABBCABAABCA", "ALLAACCBACBAAALLCABBBA", "ABDLAAABABCAAAALCABBLA", "ABCBIBBBBBBBBAAAAACBBA", "ABCCAABBADBBBBDBDBDBCA", "ALBBACCCCDBCABBBDBBBBA", "AAAAAAAAAAAAAAAAAAAAAA" };main(){initscr();clear(); +noecho();cbreak();x=y=4;D=39,o='M';m=M[y][x] ;while(D&&u){for(i=j=a=0;j<7;!(mvaddstr( +j*3+a,i*6,s+(((M[((y-1)/5)*5+j][((x-1)/10)*10+i]-'A')*3+a++)*7)),a^3)&&(a=0,! +(++i^12))&&(a=i=0,j++));refresh();M[y][x] ='B';if(t=(char*)strchr(k,getch())){int e= +x,g=y,f=x,h=y,d=t-k;o=O[d];f=(e=x+X[d])+X[d];h=(g=y+Y[d])+Y[d];switch(M[g][e] ){case +'B':x=e;y=g,u--;break ;case 'C':if(M[h][f] =='B')M[h][f] =M[g][e] ,x=e,y=g,u--; else if(M[h][f] =='C')M[h][f] =M[g][e] ='L';break ;case 'D':if(M[h][f] =='B')M[h][f] =M[g][e] ,x=e,y=g,u--; break ;case'L':x=e;y=g,u--;D +--;break ;case 'E':if(M[h][f] =='B')M[h][f] =M[g][e] ,x=e,y=g,u--; else if(M[h][f] =='I'&&d==0)M[h][f] =M[g][e] ='B';break ; case 'F':if(M[h][f] =='B')M[h][f] =M[g][e] ,x=e,y=g,u--; else if(M[h][f] =='J'&&d==1)M[h][f] =M[g][e] ='B';break ; case 'G':if(M[h][f] =='B')M[h][f] =M[g][e] ,x=e,y=g,u--; else if(M[h][f] =='K'&&d==2)M[h][f] =M[g][e] ='B';break ; }}m=M[y][x] ;M[y][x] =o;}clear();mvaddstr(12 +,31,u?"Well done!":"Too many moves");move(23,0);refresh();endwin();return 0;} + diff --git a/1991/rince.hint b/1991/rince.hint new file mode 100644 index 000000000..2ab9c0060 --- /dev/null +++ b/1991/rince.hint @@ -0,0 +1,80 @@ +Best Game: + + James Bonfield + University of Warwick + 7 Water End, + Wrestlingworth, + Sandy Beds, + SG19 2HA + England + + +Judges' comments: + + Make and run as follows: + + make rince + rince + + This entry exposed a number of bugs in a number of ANSI C compilers! + Because of this, we have provided a number of different versions: + + rince.orig.c - James Bonfield entry + (many non-GNU ANSI compilers can't grok this code) + rince.c - our non-ANSI version of rince.orig.c + rince_ansi.c - same as rince.c + (most ANSI C compilers can deal with this) + + You may need to change the makefile depending on what type of system + you are running. See the notes in ansi.mk or common.mk. + + +Selected notes from the author: + + This program is a simple puzzle type game. (I'll leave you to play + it to see the rest of it .. :-) .) The general idea was to try and + write the smallest playable game, but keep the playability and + enjoyment high. + + Instructions (rot 13 to read). + ============================== + + Xrl gb znc:- + + | + ###### | | | /\ /--\ ==| /\ | | Qverpgbany xrlf + ###### Fbyvq Jnyy | ----|| \/ /\ ||---- (haybpx qbbef bs + ###### | \/ ==| \--/ \/ gur fnzr qverpgvba) + | + | << >> Qbbef. Haybpxrq ol + Oynax fcnpr | << iiiiii ^^^^^^ >> gur nobir xrlf. + | << >> + | + ___ | b__B\ B__B ^__^ /B__b + / \ 'Pehfunoyr' | \___/ /----\ /----\ \___/ Gur sbhe fcevgrf sbe + \___/ obhyqre | _/_\ _/ \_ _/ \_ /_\_ lbhe punenpgre :-) + | + ___ hapehfunoyr | /\ Qvnzbaqf. Gurl pna rvgure or sbhaq ylvat + /@@@\ obhyqre | < > nebhaq (vs bayl!) be znahsnpgher ol chfuvat + \@@@/ | \/ gjb 'pehfunoyr' ebpxf gbtrgure. + | + + Gur trareny vqrn bs gur tnzr vf gb pbyyrpg nyy gur qvnzbaqf. Guvf zhfg + or qbar va gur zvavzhz nzbhag bs zbirf. V'ir nyybjrq n znetva bs 5 + zbirf juvpu oevatf gur zbirf nyybjrq gb 484. (nygre gur inyhr bs 'h' va + gur cebtenz gb frg gur znk zbirf nyybjrq) + + Gurer ner gjb glcrf bs obhyqref. Obgu pna or chfurq nebhaq, ohg bayl + gur ubyybj (pehfunoyr) barf pna or ghearq vagb qvnzbaqf (ol chfuvat vg + bagb nabgure ubyybj bar). + + Bs gur sbhe glcrf bs qbbef (naq xrlf) bayl 3 unir orra qrsvarq. Guvf + jnf qbar gb xrrc gur fbhepr nf ybj nf cbffvoyr (nf V bayl hfrq 3 va gur + znc). Gb haybpx n qbbe fvzcyl chfu n xrl vagb gur pbeerfcbaqvat qbbe. + Gnxr pner gung vg'f snpvat va gur pbeerpg qverpgvba. + +Copyright (c) 1991, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1991/rince.orig.c b/1991/rince.orig.c new file mode 100644 index 000000000..dce39f4f6 --- /dev/null +++ b/1991/rince.orig.c @@ -0,0 +1,30 @@ +#include +#define R break +#define U M[h][f] +#define W M[g][e] +#define T M[y][x] +#define B(a) "A"#a"A", +#define A "AAAAAAAAAAAAAAAAAAAAAA" +#define z(a) case a:if(U=='B')U=W,x=e,y=g,u--; +#define Z(a,b) else if(U==a&&d==b)U=W='B';R; +#define K(a) a##a##a +#define k(a) #a#a#a#a#a#a"\0" +#define V " \0" +#define S " \0/----\\\0_/ \\_" +int u=484,X[]={-1,0,0,1},Y[]={0,1,-1,0},x,y,D,i,j,a;char o,m,*t,*O="MNOH" +,*k="hjkl",*s=K(k(#))V V V" ___ \0 / \\\0 \\___/\0 ___ \0 /@@@\\\0 " +"\\@@@/\0| | /\\\0----||\0 \\/\0 /--\\\0 \\/ \0 ==| \0 ==| \0 " +" /\\ \0 \\--/\0 /O__o\0 \\___/\0 /_\\_ \0"K(" << \0")V k(v)V V k(^)V +" /\\ \0 < > \0 \\/ \0o__O\\ \0\\___/ \0 _/_\\ \0 O__O"S"\0 ^__^"S, +M[12][22]={A,B(LCABBBBBBBABBCBBCABB)B(CCABAKAAABAFBABABAEB +)B(BBBBABBIBBBBBEEABACL)B(CCBNIBBAAAAGALBBBABC)B(AAAAAAJACBABBCABAABC +)B(LLAACCBACBAAALLCABBB)B(BDLAAABABCAAAALCABBL)B(BCBIBBBBBBBBAAAAACBB +)B(BCCAABBADBBBBDBDBDBC)B(LBBACCCCDBCABBBDBBBB)A};main(){initscr();clear(); +noecho();cbreak();x=y=4;D=39,o='M';m=T;while(D&&u){for(i=j=a=0;j<7;!(mvaddstr( +j*3+a,i*6,s+(((M[((y-1)/5)*5+j][((x-1)/10)*10+i]-'A')*3+a++)*7)),a^3)&&(a=0,! +(++i^12))&&(a=i=0,j++));refresh();T='B';if(t=(char*)strchr(k,getch())){int e= +x,g=y,f=x,h=y,d=t-k;o=O[d];f=(e=x+X[d])+d[X];h=(g=y+Y[d])+d[Y];switch(W){case +'B':x=e;y=g,u--;R;z('C')else if(U=='C')U=W='L';R;z('D')R;case'L':x=e;y=g,u--;D +--;R;z('E')Z('I',0)z('F')Z('J',1)z('G')Z('K',2)}}m=T;T=o;}clear();mvaddstr(12 +,31,u?"Well done!":"Too many moves");move(23,0);refresh();endwin();return 0;} + diff --git a/1991/rince_ansi.c b/1991/rince_ansi.c new file mode 100644 index 000000000..1d5d5edd5 --- /dev/null +++ b/1991/rince_ansi.c @@ -0,0 +1,12 @@ +#include +int u=484,X[]={-1,0,0,1},Y[]={0,1,-1,0},x,y,D,i,j,a; +char o,m,*t,*O="MNOH",*k="hjkl",*s="######\0######\0######\0 \0 \0 \0 ___ \0 / \\\0 \\___/\0 ___ \0 /@@@\\\0 \\@@@/\0| | /\\\0----||\0 \\/\0 /--\\\0 \\/ \0 ==| \0 ==| \0 /\\ \0 \\--/\0 /O__o\0 \\___/\0 /_\\_ \0 << \0 << \0 << \0 \0vvvvvv\0 \0 \0^^^^^^\0 \0 /\\ \0 < > \0 \\/ \0o__O\\ \0\\___/ \0 _/_\\ \0 O__O \0/----\\\0_/ \\_\0 ^__^ \0/----\\\0_/ \\_" , +M[12][22]={"AAAAAAAAAAAAAAAAAAAAAA" ,"ALCABBBBBBBABBCBBCABBA", "ACCABAKAAABAFBABABAEBA", "ABBBBABBIBBBBBEEABACLA", "ACCBNIBBAAAAGALBBBABCA", "AAAAAAAJACBABBCABAABCA", "ALLAACCBACBAAALLCABBBA", "ABDLAAABABCAAAALCABBLA", "ABCBIBBBBBBBBAAAAACBBA", "ABCCAABBADBBBBDBDBDBCA", "ALBBACCCCDBCABBBDBBBBA", "AAAAAAAAAAAAAAAAAAAAAA" };main(){initscr();clear(); +noecho();cbreak();x=y=4;D=39,o='M';m=M[y][x] ;while(D&&u){for(i=j=a=0;j<7;!(mvaddstr( +j*3+a,i*6,s+(((M[((y-1)/5)*5+j][((x-1)/10)*10+i]-'A')*3+a++)*7)),a^3)&&(a=0,! +(++i^12))&&(a=i=0,j++));refresh();M[y][x] ='B';if(t=(char*)strchr(k,getch())){int e= +x,g=y,f=x,h=y,d=t-k;o=O[d];f=(e=x+X[d])+X[d];h=(g=y+Y[d])+Y[d];switch(M[g][e] ){case +'B':x=e;y=g,u--;break ;case 'C':if(M[h][f] =='B')M[h][f] =M[g][e] ,x=e,y=g,u--; else if(M[h][f] =='C')M[h][f] =M[g][e] ='L';break ;case 'D':if(M[h][f] =='B')M[h][f] =M[g][e] ,x=e,y=g,u--; break ;case'L':x=e;y=g,u--;D +--;break ;case 'E':if(M[h][f] =='B')M[h][f] =M[g][e] ,x=e,y=g,u--; else if(M[h][f] =='I'&&d==0)M[h][f] =M[g][e] ='B';break ; case 'F':if(M[h][f] =='B')M[h][f] =M[g][e] ,x=e,y=g,u--; else if(M[h][f] =='J'&&d==1)M[h][f] =M[g][e] ='B';break ; case 'G':if(M[h][f] =='B')M[h][f] =M[g][e] ,x=e,y=g,u--; else if(M[h][f] =='K'&&d==2)M[h][f] =M[g][e] ='B';break ; }}m=M[y][x] ;M[y][x] =o;}clear();mvaddstr(12 +,31,u?"Well done!":"Too many moves");move(23,0);refresh();endwin();return 0;} + diff --git a/1991/rules b/1991/rules new file mode 100644 index 000000000..bcaeff2bf --- /dev/null +++ b/1991/rules @@ -0,0 +1,263 @@ +8th International Obfuscated C Code Contest Rules + +Copyright (c) 1991, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: Their emotions obfuscated their + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show what should NOT be done in C programs. + * To provide a safe forum for poor C code. :-) + + +DEDICATION: + + The 1991 IOCCC is dedicated to the ANSI C pre-processor. + + +RULES: + + To help us handle the vast volume of entries, we ask that you follow the + rules below. SORRY FOR THE LENGTH, BUT WE NEED ALL THE HELP WE CAN GET! + + 1) Your source MUST be 1536 bytes or less. It must be a complete program. + + 2) To help us process your entries, we ask that you submit entries + in the following format. Please be sure to include ALL --- lines, + otherwise our extraction program may skip your entry! + +---header items--- +name: Your name, of course! + +org: School/Company/Organization + +email address: Email address from a well known site, or in a registered domain + +postal address: Postal address + include your country as well + +environment: Indicate the Hardware + and OS under which your program was tested + +entry: 5 + +remark: Remarks about the program. See rule #3 below for details. +---how to ANSI compile--- +Give the command(s) needed to compile your program using an ANSI C +compiler. If your program should not be compiled under an ANSI C compiler, +leave this section blank. The command size must be 160 characters or less. +---how to common compile--- +Give the command(s) needed to compile your program using an K&R/traditional +C compiler. If your program should not be compiled under a K&R style C, +leave this section blank. The command size must be 160 characters or less. +---program--- +Not everyone has a program such as uuencode, and we don't want to blindly +process a shar file, so we ask that you format your source as follows: + +Add a leading X to EACH line, unless it is a split line. (see below) + +Some mailers don't like long lines. To be safe, split lines longer than 80 + characters. To split a line, place an E at the point of a split and + place a C (instead of an X) at the beginning of the next line. + +If the program does not end in a newline, end the last line with an E. + +Leading X's, trailing E's followed by the two characters "\nC", and an E + at the last character of the last line are not considered to part of the + source and thus don't contribute toward the source character count. + Be careful with lines ending in "E\n", see the example below. + +Newlines and tabs each count as 1 character. Assume 8 character tab stops. + +The newlines here were placed for reasons of readability. In your entry, + every line in this section must begin with either an X or a C. + +Example: + +XThis is a single line containing 79 E +Ccharacters including the E +Cfinal newline. +XThe next line contains only a single newline. +X +XThis line is terminated by a newline preceded by an EE +C +XThis last line is not terminated by a newline and ends in an EE +---end--- + + 3) Regarding the header items: + + * Any text outside of the above format will be kept confidential. + + * All header lines are required, but you may use 'anonymous' + for any header line other than 'remarks' or 'entry'. + + * Only the '---program---' section uses the 'X', 'C', 'E' notation. + + * In the 'remark' item, please include: + - what this program does + - why you think the program is obfuscated + - any other remarks (humorous or otherwise) + - By default, we will select your program source and/or binary + filename. If your entry REQUIRES a specific source and/or + binary filename, please say so in the remark section. + - If this entry is a re-submission of a previous entry. + + 4) Your entry should be written in common C (K&R + common extensions) + or ANSI C. If your program will NOT compile under an ANSI C or + K&R C compiler, leave the particular 'how to' section blank. + If you leave a 'how to' section blank, include the '---' line. + + You do not have to fill in both 'how to' sections, though you must + fill in at least one 'how to' section. If you leave a 'how to' + section blank, include the '---' line anyway. + + 5) The program must be of original work. All programs must be + in the public domain. All copyrighted programs will be rejected. + + 6) Entries must be received between 06-Mar-91 0:00 UTC and + 16-May-91 0:00 UTC. Email your entries the address found below. + (UTC is essentially equivalent to Greenwich Mean Time) + + We will attempt to Email a confirmation of receipt of contest + entries, however since Email is not reliable you may not receive it. + We regret that we can no longer accept entries via postal mail. + + 7) Each person may submit up to 8 entries. Only 1 entry per Email + letter. If you submit multiple entries, be sure that each has a + unique entry number. + + We will discard all but the latest email in the case of multiple + entries with the same entry number. Thus, if you wish to correct + a previously sent entry, re-send it with the same entry number. + Just to be sure email does not arrive out or sequence, note that + fact in the 'remark' item. + + 8) Entries requiring human interaction to be built are not allowed. + (for example, don't use #include "/dev/tty") + + 9) Compiling an entry must result a regular file which may be executed. + (for example, don't use -o /dev/tty) + + +ANNOUNCEMENT OF WINNERS: + + * First announcement will likely be at the Summer 91 Usenix conference. + + * Winning entries will be posted in mid June 1991 to + comp.sources.unix as well as news groups where these rules + were posted. (depending on the judges work load) + + * Winning entries will be deposited into the uunet archives. + + * An article containing the winning entries will be published + in a future issue of the "Micro/Systems Journal". + + * Winners receive international fame and flames! :-) + + +JUDGING: + + Awards will be given to the best entry in a number of categories. + The actual category list will vary depending on the types of entries + we receive. As a guide, consider using the following: + + * The best small one line program + * The strangest source layout + * The most useful obfuscated program + * The most creatively obfuscated program + * Best obfuscated entry smaller than 256 bytes + * Best obfuscated entry smaller than 1024 bytes + * Best abuse of ANSI C + * Worse abuse of the rules (no abuse of entry format please!) + * + + +POINTS TO PONDER: + + People are encouraged to examine winners of the previous contests. + A copy of these entries has been posted to comp.sources.unix. + Contact the comp.sources.unix moderator, or some archive site (such + as uunet). Keep in mind that rules change from year to year, so some + winning entries may not be valid entries this year. What was unique + and novel one year might be 'old' the next year. + + We examine each entry on several levels of confusion. For example + each entry is judged when we: + + * look at the original source + * If it is ANSI, convert tri-graphs to ASCII + * C pre-process the source ignoring '#include' '#define' lines + * C pre-process the source ignoring '#define' and '#include' lines + * run it through a C beautifier + * examine the algorithm + * lint it + * compile it + * execute it + + One line programs are best when they are short, obscure and concise. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS or Un*x version specific + (index/strchr differences are ok, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is ok only if you warn us in the 'remark' header item) + * won't compile under both BSD or SYS V Un*x + * use an excessively long compile line to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are similar to previous winners + * are similar to previous losers :-) + + Simply abusing #defines or -Dfoo=bar won't go as far as a program + that is more well rounded in confusion. + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * pass lint without complaint (not a requirement, but it is nice) + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION + * make us laugh and/or throw up :-) + + Some types of programs can't excel in some areas. Of course, your + program doesn't have to excel in all areas, but doing well in several + areas really does help. A humorous note in the remark section helps. + + Be creative! + + +EMAIL ADDRESSES + + Send contest entries to: + + ...!{sun,pacbell,uunet,pyramid}!hoptoad!obfuscate + obfuscate@toad.com + + The Judging will be done by Landon Noll and Larry Bassel. If you have + questions or comments (no entries), please feel free to email them to: + + ...!{sun,pacbell,uunet,pyramid}!hoptoad!judges + judges@toad.com + + +chongo /\cc/\ hoptoad!chongo +Larry Bassel {uunet,ucbvax,cbosgd}|sun!lab diff --git a/1991/sorta.README b/1991/sorta.README new file mode 100644 index 000000000..584d4f3b2 --- /dev/null +++ b/1991/sorta.README @@ -0,0 +1,188 @@ +The 'sorta' scripts described below can sorta be found in this directory. + +sorta.i2+2 +---------- + + 2 2+#` [ about as basic as you can get ]ld + +This script takes 2, adds 2 to it, and prints the result (with a +newline). I get 5 on the hand-held Sinclair under ZYNIX. Let me know if +your machine produces a different result so that I can send you patches. + + +sorta.iarg0 +----------- + + 0A` [ take arg 0, print it ] + +This is self-explanatory. + + +sorta.icalc +----------- + + + [D2sD3s]:Dld [ input m n, output m n m n ]ld + + [2*1=d]:cld [ aux routine for :d recursion ]ld + [1=D1s>1Ds_+=c]:dld [ input m n, as long as n <= m double it, output m n ]ld + + [D2s1s_+1s]:-ld [ input m n, output m-n n ]ld + [1=D1s>1Ds_+#T=-2/D=1]:1ld [ aux routine for :@ ]ld + [1D=d2/1=1ddd1 ]:!ld + ["0"Td]:0ld + [DD=!1_+=0]:@ld [ input m, m assumed nonnegative, append + binary representation of m to top of s stack ]ld + + ["-"T_]:+ld + [D0 1s>=+1=@]:2ld [ input m, append - to top of s stack if m is negative, + then append binary representation of abs(m) to + top of s stack ]ld + + [d1A:A2=A]:A 27182 a1>=A + [d2A:A1=A]:A 3145 a2>=A + + D # " in binary is "T 1=2 `ld + 1=Dd # " in binary is "T 1=2 `ld + + 1=D 1s# " + "T 1s#T " is "T + #Td `ld + 1=D 1s# " - "T 1s#T " is "T _+ #Td `ld + 1=D 1s# " * "T 1s#T " is "T * #Td `ld + 1=D 1s# " / "T 1s#T " is "T / #Td `ld + 1=D 1s# " % "T 1s#T " is "T 1=D/*_+ #Td `ld + + 1=D d "~ " #T " is "T D& #T$ld " (" 1=2 ")"T `ld + 1=D 1s# " & "T 1s#T " is "T &D& #T$ld " (" 1=2 ")"T `ld + 1=D 1s# " | "T 1s#T " is "T D&1sD&& #T$ld " (" 1=2 ")"T `ld + 1=D 1s# " ^ "T 1s#T " is "T 1=D&2sD&1sD&&&D& #T$ld " (" 1=2 ")"T `ld + +icalc shows off SORTA's understanding of integer arithmetic. You can run +it with up to two arguments; the arguments have default values of 27182 +and 3145. Notice that sorta doesn't have a language primitive for +converting a string to a number, yet icalc is performing arithmetic on +its arguments. Can you see how? (Hint: Try sorta "2 2+" 3 < sorta.icalc. +Look at program A.) icalc also provides a useful binary output routine, +and if you can't remember offhand that D2sD3s&2sD&1sD&&&D& means xor, +you can just look it up here. + + +sorta.idup +----------- + + [ld#1_+1=y]:x + [uD1+=x]:y + 0""1=y` + +This script prints out the maximum file descriptor available from +repeated dup()s---usually NOFILE - 1. Can you see how it works? + + +sorta.iecho +----------- + + [" "$ld]:sld [ print a space ]ld + [1s1+DA$ld1s1_+D=sD=x]:xld [ given n (argc-n), print args ]ld + 0a1_+D=x""` [ simulation of /bin/echo ]ld + +This is a clone of /bin/echo, minus any argument processing and escape +interpretation. (Note that, unlike some shells' echo, /bin/echo prints a +newline even with no arguments.) Try sorta foo bar < iecho. + + +sorta.ifact1 +------------ + + 1#`ld2*#`ld3*#`ld4*#`ld5*#`ld6*#`ld7*#`ld8*#`ld9*#`ld10*#`ld + +This is a very straightforward factorial program: Take 1, print it, +multiply by 2, print it, multiply by 3, print it, etc. + + +sorta.ifact2 +------------ + + [1+D2s*#`ld1s]:f + 1 0 + 1=f 1=f 1=f 1=f 1=f 1=f 1=f 1=f 1=f 1=f + +ifact1 does a lot of repeated work. ifact2 takes advantage of this by +keeping the current n! n on the stack. Each call to routine f (1=f) +increments n by 1 and prints out the factorial. + + +sorta.ifact3 +------------ + + [1+D2s*#`ld1s]:f [ given (n-1)! (n-1), print n!, put n! n ] + [2s1=f2s1_+D0>=x]:x [ given n n! x, print (n+1)! through (n+x)! ] + 0 1 10 1=x + +Finally, ifact3 removes all the redundancy from ifact2, and exhibits +proper documentation of stack routines. You can replace the 10 by +anything in this version. + + +sorta.iio +--------- + + [ a simple example of interpreting code on the fly ]ld + + ["] "2 2+":xT ["]T " produces "T 1=x#T " which should be 4."T` + +Notice that "2 2+" is a literal string inside the program. + + +sorta.irot13 +------------ + + "[] [.tr] " + ["]".[a-m][n-z][A-M][N-Z]"[" ]TTT ["]".[n-z][a-m][N-Z][A-M]"[" ]TTT + "[tr] !q"T:xld + ["rot13: fatal: need exactly one argument"`q]:gld + ["rot13: fatal: cannot open "1ST`q]:hld + a2_+=g + 1A 0 [ that 0 is for RDONLY ]ld + 0 'o D0 1s>=hld + 0Ou1=x [ in a more complex spawner, this would be done under a fork ]ld + +Despite its name, irot13 is meant to show how to exec a program with +redirection from within sorta. You run it as sorta blah < irot13; it +opens blah and runs a (BSD-style) tr command to rotate all letters by 13 +spots. 1A 0 0 o opens argv[1]; the ' keeps the filename around for +subroutine h to print a nice error message if necessary. 0Ou closes +stdout and replaces it with the new descriptor. Finally, subroutine x +executes the tr. + + +sorta.isleep +------------ + + ["" "+sleep" "+5" "sleep" !q]:S [F0>1_+=S]:s + "forking sleep 5..."`ld + 1=s + "waiting for sleep to finish..."`ld + w + "done, sleep exit code " #T` + +This script illustrates the classic fork-exec-wait. + + +sorta.itailrec +-------------- + + [3*#" "T$ldD=f]:f + 1=f + +The sole purpose of this script is to prove that sorta can do infinite +tail recursion (in this case, in program f). Do sorta < itailrec | more +and watch the powers of 3 (mod your computer's word size) flow by. + + +sorta.iwhosort +-------------- + + [0Ou "" "+-u" "sort" !q]:S [F0>1_+=S]:s + [1Ou "" "+-u" "who" !q]:W [F0>1_+=W]:w + P1=wO1=sOww + +This final example is a simple pipeline, who | sort. diff --git a/1991/sorta.i2+2 b/1991/sorta.i2+2 new file mode 100644 index 000000000..9c4cc856c --- /dev/null +++ b/1991/sorta.i2+2 @@ -0,0 +1 @@ +2 2+#` [ about as basic as you can get ]ld diff --git a/1991/sorta.iarg0 b/1991/sorta.iarg0 new file mode 100644 index 000000000..0fd3f57c6 --- /dev/null +++ b/1991/sorta.iarg0 @@ -0,0 +1 @@ +0A` [ take arg 0, print it ] diff --git a/1991/sorta.icalc b/1991/sorta.icalc new file mode 100644 index 000000000..61e369a31 --- /dev/null +++ b/1991/sorta.icalc @@ -0,0 +1,33 @@ +[D2sD3s]:Dld [ input m n, output m n m n ]ld + +[2*1=d]:cld [ aux routine for :d recursion ]ld +[1=D1s>1Ds_+=c]:dld [ input m n, as long as n <= m double it, output m n ]ld + +[D2s1s_+1s]:-ld [ input m n, output m-n n ]ld +[1=D1s>1Ds_+#T=-2/D=1]:1ld [ aux routine for :@ ]ld +[1D=d2/1=1ddd1 ]:!ld +["0"Td]:0ld +[DD=!1_+=0]:@ld [ input m, m assumed nonnegative, + append binary representation of m to top of s stack ]ld + +["-"T_]:+ld +[D0 1s>=+1=@]:2ld [ input m, append - to top of s stack if m is negative, + then append binary representation of abs(m) to + top of s stack ]ld + +[d1A:A2=A]:A 27182 a1>=A +[d2A:A1=A]:A 3145 a2>=A + +D # " in binary is "T 1=2 `ld +1=Dd # " in binary is "T 1=2 `ld + +1=D 1s# " + "T 1s#T " is "T + #Td `ld +1=D 1s# " - "T 1s#T " is "T _+ #Td `ld +1=D 1s# " * "T 1s#T " is "T * #Td `ld +1=D 1s# " / "T 1s#T " is "T / #Td `ld +1=D 1s# " % "T 1s#T " is "T 1=D/*_+ #Td `ld + +1=D d "~ " #T " is "T D& #T$ld " (" 1=2 ")"T `ld +1=D 1s# " & "T 1s#T " is "T &D& #T$ld " (" 1=2 ")"T `ld +1=D 1s# " | "T 1s#T " is "T D&1sD&& #T$ld " (" 1=2 ")"T `ld +1=D 1s# " ^ "T 1s#T " is "T 1=D&2sD&1sD&&&D& #T$ld " (" 1=2 ")"T `ld diff --git a/1991/sorta.idup b/1991/sorta.idup new file mode 100644 index 000000000..008d042d2 --- /dev/null +++ b/1991/sorta.idup @@ -0,0 +1,3 @@ +[ld#1_+1=y]:x +[uD1+=x]:y +0""1=y` diff --git a/1991/sorta.iecho b/1991/sorta.iecho new file mode 100644 index 000000000..a9091666c --- /dev/null +++ b/1991/sorta.iecho @@ -0,0 +1,3 @@ +[" "$ld]:sld [ print a space ]ld +[1s1+DA$ld1s1_+D=sD=x]:xld [ given n (argc-n), print args ]ld +0a1_+D=x""` [ simulation of /bin/echo ]ld diff --git a/1991/sorta.ifact1 b/1991/sorta.ifact1 new file mode 100644 index 000000000..011312567 --- /dev/null +++ b/1991/sorta.ifact1 @@ -0,0 +1 @@ +1#`ld2*#`ld3*#`ld4*#`ld5*#`ld6*#`ld7*#`ld8*#`ld9*#`ld10*#`ld diff --git a/1991/sorta.ifact2 b/1991/sorta.ifact2 new file mode 100644 index 000000000..ca7229942 --- /dev/null +++ b/1991/sorta.ifact2 @@ -0,0 +1,3 @@ +[1+D2s*#`ld1s]:f +1 0 +1=f 1=f 1=f 1=f 1=f 1=f 1=f 1=f 1=f 1=f diff --git a/1991/sorta.ifact3 b/1991/sorta.ifact3 new file mode 100644 index 000000000..a9d85a47f --- /dev/null +++ b/1991/sorta.ifact3 @@ -0,0 +1,3 @@ +[1+D2s*#`ld1s]:f [ given (n-1)! (n-1), print n!, put n! n ] +[2s1=f2s1_+D0>=x]:x [ given n n! x, print (n+1)! through (n+x)! ] +0 1 10 1=x diff --git a/1991/sorta.iio b/1991/sorta.iio new file mode 100644 index 000000000..209864390 --- /dev/null +++ b/1991/sorta.iio @@ -0,0 +1,3 @@ + [ a simple example of interpreting code on the fly ]ld + +["] "2 2+":xT ["]T " produces "T 1=x#T " which should be 4."T` diff --git a/1991/sorta.irot13 b/1991/sorta.irot13 new file mode 100644 index 000000000..39a5b295c --- /dev/null +++ b/1991/sorta.irot13 @@ -0,0 +1,9 @@ +"[] [.tr] " +["]".[a-m][n-z][A-M][N-Z]"[" ]TTT ["]".[n-z][a-m][N-Z][A-M]"[" ]TTT +"[tr] !q"T:xld +["rot13: fatal: need exactly one argument"`q]:gld +["rot13: fatal: cannot open "1ST`q]:hld +a2_+=g +1A 0 [ that 0 is for RDONLY ]ld + 0 'o D0 1s>=hld +0Ou1=x [ in a more complex spawner, this would be done under a fork ]ld diff --git a/1991/sorta.isleep b/1991/sorta.isleep new file mode 100644 index 000000000..d8e4f1fd4 --- /dev/null +++ b/1991/sorta.isleep @@ -0,0 +1,6 @@ +["" "+sleep" "+5" "sleep" !q]:S [F0>1_+=S]:s +"forking sleep 5..."`ld +1=s +"waiting for sleep to finish..."`ld +w +"done, sleep exit code " #T` diff --git a/1991/sorta.itailrec b/1991/sorta.itailrec new file mode 100644 index 000000000..0e23249ea --- /dev/null +++ b/1991/sorta.itailrec @@ -0,0 +1,2 @@ +[3*#" "T$ldD=f]:f +1=f diff --git a/1991/sorta.iwhosort b/1991/sorta.iwhosort new file mode 100644 index 000000000..e856b49ff --- /dev/null +++ b/1991/sorta.iwhosort @@ -0,0 +1,3 @@ +[0Ou "" "+-u" "sort" !q]:S [F0>1_+=S]:s +[1Ou "" "+-u" "who" !q]:W [F0>1_+=W]:w +P1=wO1=sOww diff --git a/1991/ttt.sh b/1991/ttt.sh new file mode 100644 index 000000000..b17d91fbf --- /dev/null +++ b/1991/ttt.sh @@ -0,0 +1,151 @@ +#!/bin/sh +# +# play tic-tac-toe + +# parse args +# +if [ $# -gt 1 ]; then + echo "usage: ttt [move_digit]" 1>&2 + echo " ttt quitgame" 1>&2 + echo " ttt clobber" 1>&2 + exit 1 +elif [ $# -eq 1 ]; then + move="$1" +else + move= +fi + +# catch the clobber case +# +if [ clobber = "$move" ]; then + echo "ttt: rm -f ttt_game ttt_game.o ttt_game.c ttt_old.c ttt_new.c" 1>&2 + rm -f ttt_game ttt_game.o ttt_game.c ttt_old.c ttt_new.c + echo "ttt: rm -f merlyn.c merlyn.o merlyn" 1>&2 + rm -f merlyn.c merlyn.o merlyn + echo "ttt: removed all but the original source" 1>&2 + exit 0 +fi + +# catch the quitgame case +# +if [ quitgame = "$move" ]; then + echo "ttt: rm -f ttt_game ttt_game.o ttt_game.c ttt_old.c ttt_new.c" 1>&2 + rm -f ttt_game ttt_game.o ttt_game.c ttt_old.c ttt_new.c + echo "ttt: current game removed, perhaps you were going to lose? :-)" 1>&2 + exit 0 +fi + +# watch for bad args +# +if [ $# -eq 1 ]; then + case "$move" in + 1|2|3|4|5|6|7|8|9) ;; + *) echo "ttt: bad argument" 1>&2 + echo "usage: ttt [move_digit]" 1>&2 + echo " ttt quitgame" 1>&2 + echo " ttt clobber" 1>&2 + exit 2 ;; + esac +fi + +# be sure that we have the merlyn.c source +# +if [ ! -f merlyn.c ]; then + if [ -f westley.c ]; then + echo "ttt: No merlyn.c around these parts, using a copy of westley.c" 1>&2 + cp westley.c merlyn.c + chmod +w merlyn.c + else + echo "ttt: Ouch! merlyn.c and no westley.c are gone!" 1>&2 + exit 3 + fi + # check to see if the copy worked + if [ ! -f merlyn.c ]; then + echo "ttt: Darn, coundn't copy westley.c to merlyn.c" 1>&2 + exit 4 + fi +fi + +# be sure we have the merlyn program +# +if [ ! -f merlyn ]; then + echo "ttt: make merlyn" 1>&2 + make merlyn + status=$? + if [ "$status" -ne 0 ]; then + echo "ttt: something is wrong, fix merlyn.c and build it yourself!" 1>&2 + echo " or maybe type: ttt clobber" 1>&2 + exit 5 + fi + rm -f ttt_game.c +fi + +# If we don't have a ttt_game.c, or we cannot write it, make a new ttt_game.c +# +if [ ! -w ttt_game.c ]; then + rm -f ttt_game.c + if [ -z "$move" ]; then + merlyn | tee ttt_game.c + else + merlyn "$move" | tee ttt_game.c + fi + chmod +w ttt_game.c + +# If we have a ttt_game.c, then assume that we are in the process of playing +# +else + rm -f ttt_game ttt_new.c + echo "ttt: make ttt_game" 1>&2 + make ttt_game + status=$? + if [ "$status" -ne 0 ]; then + echo "ttt: something is wrong, fix ttt_game.c and build it yourself!" 1>&2 + echo " or maybe type: ttt quitgame" 1>&2 + exit 6 + fi + if [ -z "$move" ]; then + ttt_game | tee ttt_new.c + else + ttt_game "$move" | tee ttt_new.c + fi + chmod +w ttt_new.c + if [ -s ttt_new.c ]; then + mv ttt_game.c ttt_old.c + mv ttt_new.c ttt_game.c + +# Check for win, lose, or draw +# For a win or draw, copy merlyn.c to ttt_game.c +# For a loss, copy ttt_game.c to merlyn.c, as it is now better +# Also remove the executable for the file replaced +# For anything else, game in progress, do not do anything + + if [ -n "`grep ':-(' ttt_game.c`" ]; then + echo + echo "ttt: I lose...I won't make THAT mistake again!" + chmod +w merlyn.c + mv ttt_game.c merlyn.c + rm -f merlyn ttt_game + else + if [ -n "`grep ':-)' ttt_game.c`" ]; then + echo + echo "ttt: I win!" + cp merlyn.c ttt_game.c + rm -f ttt_game + else + if [ -z "`grep 'X=-. ' ttt_game.c`" -a -z "`grep '^. ' ttt_game.c`" ]; then + echo + echo "ttt: It's a draw - play again?" + cp merlyn.c ttt_game.c + rm -f ttt_game + fi + fi + fi + + else + echo "ttt: something is wrong, maybe ttt_old.c will help" 1>&2 + echo " or maybe type: ttt quitgame" 1>&2 + echo " or maybe type: ttt clobber" 1>&2 + exit 7 + fi +fi + diff --git a/1991/westley.c b/1991/westley.c new file mode 100644 index 000000000..abd056803 --- /dev/null +++ b/1991/westley.c @@ -0,0 +1,26 @@ + a(X){/*/X=- a(X){/*/X=- + -1;F;X=- -1;F;X=- + -1;F;}/*/ -1;F;}/*/ +char*z[]={"char*z[]={","a(X){/*/X=-","-1;F;X=-","-1;F;}/*/","9999999999 :-| ", +"int q,i,j,k,X,O=0,H;S(x)int*x;{X+=X;O+=O;*x+1?*x+2||X++:O++;*x=1;}L(n){for(*", +"z[i=1]=n+97;i<4;i++)M(256),s(i),M(128),s(i),M(64),N;X*=8;O*=8;}s(R){char*r=z", +"[R];for(q&&Q;*r;)P(*r++);q&&(Q,P(44));}M(m){P(9);i-2||P(X&m?88:O&m?48:32);P(", +"9);}y(A){for(j=8;j;)~A&w[--j]||(q=0);}e(W,Z){for(i-=i*q;i<9&&q;)y(W|(1<4&&N", +";s(q=12);P(48);P('}');P(59);N;q=0;L(1);for(i=5;i<13;)s(i++),N;L(2);}",0}; + b(X){/*/X=- b(X){/*/X=- + -1;F;X=- -1;F;X=- + -1;F;}/*/ -1;F;}/*/ +int q,i,j,k,X,O=0,H;S(x)int*x;{X+=X;O+=O;*x+1?*x+2||X++:O++;*x=1;}L(n){for(* +z[i=1]=n+97;i<4;i++)M(256),s(i),M(128),s(i),M(64),N;X*=8;O*=8;}s(R){char*r=z +[R];for(q&&Q;*r;)P(*r++);q&&(Q,P(44));}M(m){P(9);i-2||P(X&m?88:O&m?48:32);P( +9);}y(A){for(j=8;j;)~A&w[--j]||(q=0);}e(W,Z){for(i-=i*q;i<9&&q;)y(W|(1<4&&N +;s(q=12);P(48);P('}');P(59);N;q=0;L(1);for(i=5;i<13;)s(i++),N;L(2);} + c(X){/*/X=- c(X){/*/X=- + -1;F;X=- -1;F;X=- + -1;F;}/*/ -1;F;}/*/ diff --git a/1991/westley.hint b/1991/westley.hint new file mode 100644 index 000000000..b66225efd --- /dev/null +++ b/1991/westley.hint @@ -0,0 +1,180 @@ +Grand Prize: + + Brian Westley (Merlyn LeRoy on usenet) + DigiBoard, Inc. + 1026 Blair Ave. + St. Paul, MN 55104 USA + + +Judges' comments: + + Make and run as follows: + + make westley + westley [move_location] | tee nextmove.c + + where the 'move_location' is a digit from 1 to 9 that represents + a move on a tic-tac-toe board: + + 1 2 3 + 4 5 6 + 7 8 9 + + If you omit 'move_location', then the computer moves first. For your + next move, recompile nextmove.c and play it again: + + make nextmove + nextmove move_location | tee nextmove.c + + We have provided the shell script, ttt, to make it easier to play the game: + + make ttt + ttt [first_move] <- omit first arg to have it move first + ttt next_move + + The shell script determines when the game is over, and automatically + replaces merlyn.c with an improved version after a loss. The ttt script + has two other modes: + + ttt quitgame <- cancel any game in process, revert to merlyn.c + ttt clobber <- remove all game files, revert to original source + + Try not to cheat, the computer has not learned how to catch you doing it. + + +Selected notes from the author: + + A tic-tac-toe self-modifying program that "learns". This C program + plays standard tic-tac-toe on itself. The code is written as a + tic-tac-toe grid; moves are carried out within the code. + + The human is X, the computer 0 [sic, "zero", not letter "O"]. + + The program, when run, reproduces itself with both the player's + move and the computer's move added. Recompile THIS program (using + the same compile line) and repeat until the game is finished. + + If the computer wins, the "straight face" in the upper right-hand + corner ":-|" will change into a happy face ":-)". If it is a draw, + the face does not change. If the computer loses, the board is + blanked and the face changes into a sad face ":-(". If this + happens, the blank board should replace the original program; the + computer changes its play and will continue to do so until it no + longer loses games. + + If you want a program that never loses, simply replace the string + "9999999999 :-| " with "9883857753 :-| ". + + How It Works (rot13 to read) + ---------------------------- + + Gur iregvpny "onef" bs gur tevq ner vqragvpny shapgvbaf, jvgu gur + anzr bs gur shapgvba nf n(), o(), be p(). Nsgre rnpu shapgvba vf + pnyyrq, gur tybony inevnoyrf K naq B pbagnva ovgznfxf bs jurer nyy + gur Kf naq Bf ner cynprq. Gur fgngrzrag: + + K=- -1; + + rinyhngrf gb 1, -1, be -2 jura K vf 1 naq vf bar bs "K", + "0", be " ". Gur shapgvba F(&K) frgf gur nccebcevngr ovgf va + (tybony ine) K naq B naq erfrgf gur inyhr bs &K gb 1. Guvf vf ubj + gur pheerag cbfvgvba vf pbzchgrq. + + Gur cynlre'f zbir vf BE'q vagb gur K znfx, naq (vs vg vf gur + bcravat zbir) gur fgengrtl fgevat'f svefg punenpgre vf frg gb gur + cynlre'f svefg zbir (be "5" vs gur pbzchgre zbirf svefg). + + Gur rinyhgvba shapgvba l(Z) purpxf vs gur znfx unf n jvaavat + cnggrea (nal bs gur svefg rvtug ovgznfxf bs gur j[] neenl), naq + frgf gur inevnoyr d gb 0 vs vg qbrf. + + Gur cynlre'f zbir vf rinyhngrq gb frr vs gur uhzna unf jba. Gur + fzvyrl vf frg gb :-) be :-( qrcraqvat ba guvf. Nyfb, vs gur uhzna + unf jba, gur qvtvg va gur fgengrtl fgevat vf qrperzragrq gb punatr + gur pbzchgre'f cynl sbe arkg tnzr. + + Vs gur uhzna unf ABG jba, gur r(A,Z) shapgvba rinyhngrf vs NAL zbir + abg va znfx A pna cebqhpr n jva va znfx Z. Gur svefg rinyhngvba + r(K,B) purpxf vs B pna znxr n yrtny jvaavat zbir. Vs fb, gur + pbzchgre unf n jvaavat zbir naq znxrf vg. Vs abg, gur fzvyrl vf + frg gb :-|, naq n aba-jvaavat zbir vf trarengrq. + + N aba-jvaavat zbir svefg purpxf vs K pna jva va bar zbir; vs fb, + guvf zbir vf fryrpgrq, oybpxvat gur jva. Bgurejvfr, n zbir vf + trarengrq ol ybbxvat qbja gur yvfg bs "zbir grzcyngrf". Gur svefg + zbir grzcyngr gung trarengrf n zbir gung vf ABG nyernql bpphcvrq ol + na K be B vf erghearq. + + Gur "zbir grzcyngrf" ner fgngvp gvp-gnp-gbr cbfvgvbaf gung trarengr + cbffvoyr zbirf ol znxvat gur r() shapgvba erghea "jvaavat" zbirf, + r.t. gur grzcyngr: + + . . . + B , B (guvf vf gur inyhr 40; 2^3+2^5) + . . . ("B"f ner 1 ovgf, "." naq "," ner 0 ovgf) + + ...jvyy znxr gur r() shapgvba erghea n pragre zbir, nf + guvf vf gur bayl zbir gung cebqhprf guerr va n ebj. Abgvpr gung + gur pbzchgre qbrf abg pbafvqre juvpu pryyf pbagnva Kf naq Bf jura + znxvat n grzcyngr zbir, bayl juvpu pryyf ner rzcgl naq abg-rzcgl. + Guvf znxrf sbe hahfhny cynl. + + Gur grzcyngrf ner pnershyyl pubfra gb riraghnyyl oybpx nyy gencf + gung K pna gel, ol whfg oyhaqrevat va gur jnl. + + Nyfb abgr gung gur jvaavat & fgengrtl grzcyngrf ner cneg bs gur + pbzcvyr yvar, znxvat vg cbffvoyr gb punatr gur ehyrf bs gur tnzr ol + punatvat gur pbzcvyr yvar. + + Gur grzcyngrf ner: + + B , B + , , , + B , B + + , . . + . B . + . . B + + . . . + B , B + . . . + + . . . + B B , + . . . + + . . . + B , B + . . . + + . , , + . B . + B B , + + B , B + , , . + B . . + + , . B + B , B + B . , + + B . , + B , B + , . B + + B , B + , , , + B , B + + N qvtvg bs "9" zrnaf fgneg jvgu gur svefg grzcyngr, "8" fgnegf ng + gur frpbaq, rgp. Gur grzcyngrf ner fpnaarq hagvy n yrtny zbir vf + sbhaq. N grzcyngr vf fpnaarq sebz obggbz gb gbc, evtug gb yrsg + (v.r. zbir 9 vf grfgrq svefg, gura 8, qbja gb zbir 1). + +Copyright (c) 1991, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1992/1992.tar.bz2 b/1992/1992.tar.bz2 new file mode 100644 index 000000000..8e444d0d3 Binary files /dev/null and b/1992/1992.tar.bz2 differ diff --git a/1992/Makefile b/1992/Makefile new file mode 100644 index 000000000..2eb115d13 --- /dev/null +++ b/1992/Makefile @@ -0,0 +1,244 @@ +# %W% %G% %U% +# +# 1992 makefile +# +# Copyright (c) 1992, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL=/bin/sh +CHMOD=chmod +CP=cp +RM=rm +SED=sed +LN=ln +UNIQ=uniq +CB=cb +GREP=grep +# set this to where your C Processor resides +# +# On some systems: +# CPP=/lib/cpp +# +CPP=/usr/ccs/lib/acpp + +# flags for ansi compiles +# +# NOTE: Some ANSI compilers make use of -Xa to turn on ANSI mode, +# others such as gcc may want -ansi, others may want nothing +# at all. Adjust the CFLAGS line as needed. +# +# NOTE: Some compilers cannot optimize, or optimize some entries +# entries incorrectly. You might want need to turn on -O +# to see if your compiler can handle them. +# +#CFLAGS=-O -Xa +CFLAGS=-Xa +CC=cc + +# misc shell babble +# +NOINCLUDE=$(SED) -e 's/^.\([ ]*\)include/%include/' +SPACECLEAN=$(SED) -e 's/\([^ ]\)\([ ]\)[ ][ ]*/\1\2/g' +CPPCLEAN=$(GREP) -v '^. [0-9][0-9]*' + +# winners that compile under ANSI C +# +WINNERS= adrian albert ant buzzard.1 buzzard.2 gson kivinen imc \ + lush marangon nathan vern westley +ALT_NAMES= adgrep am babble first ag whereami + +all: $(WINNERS) $(ALT_NAMES) + +adrian: adrian.c + $(CC) $(CFLAGS) adrian.c -o adrian + $(RM) -f ad.temp adwc.c adbasename.c adecho.c adhead.c adsleep.c + $(SED) '1s/\..*\./. wc ./' adrian.c > ad.temp + -./adrian ad.temp adwc.c + $(CC) -o adwc adwc.c + $(SED) '1s/\..*\./. basename ./' adrian.c > ad.temp + -./adrian ad.temp adbasename.c + $(CC) -o adbasename adbasename.c + $(SED) '1s/\..*\./. echo| ./' adrian.c > ad.temp + -./adrian ad.temp adecho.c + $(CC) -o adecho adecho.c + $(SED) '1s/\..*\./. head; ./' adrian.c > ad.temp + -./adrian ad.temp adhead.c + $(CC) -o adhead adhead.c + $(SED) '1s/\..*\./. sleep ./' adrian.c > ad.temp + -./adrian ad.temp adsleep.c + $(CC) -o adsleep adsleep.c + $(RM) -f ad.temp + +# NOTE: this is the original source that won +# +adrian.orig: adrian.orig.c + $(CC) $(CFLAGS) adrian.orig.c -o adrian.orig + +albert: albert.c + $(CC) $(CFLAGS) albert.c -o albert + +# NOTE: this is the original source that won +# +albert.orig: albert.orig.c + $(CC) $(CFLAGS) albert.orig.c -o albert.orig + +ant: ant.c + $(CC) $(CFLAGS) ant.c -o ant + +buzzard.1: buzzard.1.c + $(CC) $(CFLAGS) buzzard.1.c -o buzzard.1 + +babble.cppcb: buzzard.1.c + $(NOINCLUDE) buzzard.1.c | \ + $(CPP) $(CPPFLAGS) | \ + $(CPPCLEAN) | \ + $(CB) $(CBFLAGS) | \ + $(UNIQ) | \ + $(SPACECLEAN) > babble.cppcb 2>&1 + +buzzard.2: buzzard.2.c + $(CC) $(CFLAGS) buzzard.2.c -o buzzard.2 + +# NOTE: this is the original source that won +# +buzzard.2.orig: buzzard.2.orig.c + $(CC) $(CFLAGS) buzzard.2.orig.c -o buzzard.2.orig + +gson: gson.c + $(CC) $(CFLAGS) gson.c -o gson + +# NOTE: some systems may only need: +# +# $(CC) $(CFLAGS) kivinen.c -o kivinen -lX11 +# +kivinen: kivinen.c + $(CC) $(CFLAGS) kivinen.c -o kivinen -lX11 -lsocket -lresolv -lnsl + +# NOTE: this is the original program that won +# +# NOTE: some systems may only need: +# +# $(CC) $(CFLAGS) kivinen.c -o kivinen -lX11 +# +kivinen.orig: kivinen.orig.c + $(CC) $(CFLAGS) kivinen.orig.c -o kivinen.orig -lX11 \ + -lsocket -lresolv -lnsl + +imc: imc.c + $(CC) $(CFLAGS) imc.c -o imc + +# NOTE: this is the original program that won +# +imc.orig: imc.orig.c + $(CC) $(CFLAGS) imc.orig.c -o imc.orig + +lush: lush.c + $(CC) $(CFLAGS) lush.c -o lush + +lush.again: lush.c + $(CC) $(CFLAGS) lush.c -o lush.again + $(RM) -f lush.again + +# NOTE: this is the original program that won +# +lush.orig: lush.orig.c + $(CC) $(CFLAGS) lush.orig.c -o lush.orig + +# NOTE: some systems may need: +# +# $(CC) $(CFLAGS) marangon.c -o marangon -lcurses -ltermcap +# +marangon: marangon.c + $(CC) $(CFLAGS) marangon.c -o marangon -lcurses + +# NOTE: this is the original program that won +# +# NOTE: some systems may need: +# +# $(CC) $(CFLAGS) marangon.orig.c -o marangon.orig -lcurses -ltermcap +# +marangon.orig: marangon.orig.c + $(CC) $(CFLAGS) marangon.orig.c -o marangon.orig -lcurses + +nathan: nathan.c + $(CC) $(CFLAGS) nathan.c -o nathan + +# NOTE: this is the original program that won +# +nathan.orig: nathan.orig.c + $(CC) $(CFLAGS) nathan.orig.c -o nathan.orig + +vern: vern.tmp.c + $(CC) $(CFLAGS) vern.tmp.c -o vern + +vern.tmp.c: vern.c + $(RM) -f vern.tmp.c + $(SED) vern.tmp.c + +# NOTE: this is the original program that won +# +vern.orig: vern.orig.tmp.c + $(CC) $(CFLAGS) vern.orig.tmp.c -o vern.orig + +vern.orig.tmp.c: vern.orig.c + $(RM) -f vern.orig.tmp.c + $(SED) vern.orig.tmp.c + +westley: westley.c + $(CC) $(CFLAGS) westley.c -o westley + +# alternate names for selected entries +# +adgrep: adrian + $(RM) -f adgrep + $(LN) adrian adgrep +am: ant + $(RM) -f am + $(LN) ant am +babble: buzzard.1 + $(RM) -f babble + $(LN) buzzard.1 babble +first: buzzard.2 + $(RM) -f first + $(LN) buzzard.2 first +ag: gson + $(RM) -f ag + $(LN) gson ag +whereami: westley + $(RM) -f whereami + $(LN) westley whereami + +clean: + $(RM) -f *.o a.out core + $(RM) -f vern.tmp.c lush.again babble.cppcb vern.orig.tmp.c + $(RM) -f ad.temp adwc.c adbasename.c adecho.c adhead.c adsleep.c + +clobber: clean + $(RM) -f $(WINNERS) a.out + $(RM) -f $(ALT_NAMES) + $(RM) -f adwc adbasename adecho adhead adsleep + $(RM) -f adrian.orig lush.orig nathan.orig buzzard.2.orig + $(RM) -f kivinen.orig imc.orig albert.orig marangon.orig vern.orig + +am_clobber: clean am + $(RM) -f am.safe + $(CP) am am.safe + $(RM) -f $(WINNERS) a.out + $(RM) -f $(ALT_NAMES) + $(RM) -f adwc adbasename adecho adhead adsleep + $(RM) -f adrian.orig lush.orig nathan.orig buzzard.2.orig + $(RM) -f kivinen.orig imc.orig albert.orig marangon.orig vern.orig + $(CP) am.safe am + $(RM) -f am.safe + +nuke: clobber + @true + +install: all + cat $(WINNERS) > /dev/null diff --git a/1992/README b/1992/README new file mode 100644 index 000000000..11bc69e1f --- /dev/null +++ b/1992/README @@ -0,0 +1,88 @@ +1992 marked the "The Ninth International Obfuscated C Code Contest" + +Copyright (c) 1992, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + +Use make to compile entries. It is possible that on BSD or non-unix +systems the makefile needs to be changed. See the Makefile for details. + +Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitters. + +Read over the makefile for compile/build issues. Your system may +require certain changes (add or remove a library, add or remove a +#define). A number of compilers had problems optimizing certain +entries. Some compilers do optimize, but the resulting program +does not work. By default we have left off -O from compile lines. +You might want to add -O back, or add it back for certain entries +where performance is important. + +This year marked an all time high for number of entries as well as the +quality of entries. Nearly twice the usual number of entries made it +to the final judging rounds. Even when we raised the standards for +winning, we still wound giving out a few more awards than in other +years. The new size rules size probably contributed to the overall +high quality. + +FYI: By tradition, we do not record the count the number entries, + nor do we give our our guess as to the number of entries + received. For folks who wonder, we can say that we consumed + about 2000 pages of output (printing between 2 and 4 normal + pages per side) during the judging process this year. + +The new instructions for submitting entries worked well - we were +able to write scripts to unpack them and eliminate duplicates. + +As promised last year, we accepted programs that made use of the X +libraries for the first time. We now consider ANSI C compilers to be +the "standard" version that the entries were compiled with. + +Name and address information are separated from the actual program +prior to judging. This eliminates any chance that we would bias our +judging for/against any person or group. In the end, we are surprised +as you are to see who as won. Even so, it is worth noting that +Brian Westley has submitted a winning entry for the past 6 years! + + +A few notes regarding future contests: + +We did not give awards to some traditional contest categories such as +"Best Layout". We felt that to do so would deny awards to more +deserving entries. These categories have not been eliminated. We will +likely be awarding them in future years. + +We received a few entries whose instructions were rot13'd. While +nothing was said about this in the rules, we found that it made the +judging process a little harder, so we may request that this not +be done this in the future. + +Some thought has been given to a separate obfuscated perl contest. +Watch comp.lang.perl for details! + +Be sure to wait until the 1993 rules are posted before submitting entries. +We may fine tune the rules to reflect the some ideas above. + +Please send us comments and suggestions what we have expressed above. +Also include anything else that you would like to see in future contests. +Send such email to: + + ...!{sun,pacbell,uunet,pyramid}!hoptoad!judges + judges@toad.com + + +If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used. + +If you have problems with any of the entries, AND YOU HAVE A FIX, please +Email the fix (patch file or the entire changed file) to the above address. + +Credits: + +We would like to thank Barbara Frezza for her role as official chef of +the contest. Landon Noll and Larry Bassel appreciated the opportunity +to serve as official taste testers. Yummo! diff --git a/1992/adrian.c b/1992/adrian.c new file mode 100644 index 000000000..5bd259728 --- /dev/null +++ b/1992/adrian.c @@ -0,0 +1,113 @@ +/* . wc . */ +#include/* Wht majr flwchrt? */ +#include/* That mjr flwchrt! */ +#define P 257 +#define G 17 +#define z 8 +#define v(jr) jr +int W ,head; +#define S(W,b,f) strncpy(W,b,f),W[f]=0\ + + +char *wcs=" \t\n"; +struct{ char X[z+1]; + char f ; + int e ; + struct{ char g[z+1]; + int b ; + } w[ G]; + } o[ P]; +int L=0,j= -28; + + +void E(int i, int m,char*c) +{ + for(; i<43; i+=3) + putc("}|uutsrq`_^bji`[Zkediml[PO]a_M__]ISOYIRGTNR"[i]+i-9,stderr); + fprintf(stderr,"(%d): %s\n" ,m,c); + exit(1); +} + + + +int N(int m, char *t) +{ + int i ; + if (strlen ( + t)>z) t[z ]=0; + for(i= 0; i< L ; i++) if( + !strcmp (o[ i] . X + , t))return i; + if( L== P) + E(0, m, t); + S (o[ L] . X , t + ,z); + head; W = .1* head; + o[L ].f = !( strchr( t,']' )== 0 ); + o[L ++ ] . e = 0; + return L -1 ; } + +#define v(x ) + +int A(char *R) +{ + int c=0, i; + while(* R) { + i = -1; + while(j){ + if( ++ i==o[ c].e ) return 0; + if(o[ + c] .w[i ] .g[0 ] + =='.' ||strchr (o[ c].w[i] .g ,* R)){ + c= + o[ c ] .w[i].b; break;/* +main(int sl,char *j[]){ + sleep (~~~~~~~~atoi(j[1])) ;/* . sl + sl s l . sl + l l ] + sl */ } + } + R++; + } + return o[ c].f; +} + + + main(int wc,char *V[]){char Y[999],*s;FILE*W;int m=0,echo,jr,q,wcl=0,wcw=0,wcc=0; + v(s = V[1]; if (*V=strrchr(s,'/'))s=*V+1; if(( !strncmp( s + (jr=strlen(s)) - + (q=strlen(V[2]) ),V[2],q))&&jr!=q) s[jr-q] = 0; puts(s); ) + int e,p,C=0,Q ,basename; + W= fopen(wc>= 2 ? V[1] : "adgrep.c","rt"); +echo| m^ e| 5| (int) .8| echo| +wc |C ==o[o[C] .e] . +e| e==+p,p; s[o[C] .e ] +; +while( fgets(Y,998,W)) { wcc += strlen(Y); m++; + if( s = strtok(Y,wcs)) wcw++; + else continue ; + C= + basename= j +j+*"* . basename" + +j+*"* r ] " + N(m,s) ; +while( s = strtok(0,wcs)) { + if( o[ C ] . e == + G) E(1 ,m,o[C] .X) ; + S(o[C + ] .w[o[C ] .e].g,s, z); + Q= C ; + if(! ( s =strtok ( 0 ,wcs )))wcw -- + ,E( 2 , m, o[C] + . w[ o[ Q ] .e] . g ); + e + = o[C ] .w[o[C ] .e++ ] .b= N(m,s) + ; wcw += 2; } + 0&& + W && wcl++ + < 10 && printf((W,Y)); } + if(j+28) { { + ; } printf("%7u%7u%7u\n", wcl , wcw , wcc); } + while( gets(Y) ) if(A(Y)) puts(Y); + W, jr; } + +O(int wc,char**V) { +--wc && (printf("%s ",*++V), main(wc,V), 1) || printf("\n"); } + diff --git a/1992/adrian.grep.1 b/1992/adrian.grep.1 new file mode 100644 index 000000000..1c8eec94b --- /dev/null +++ b/1992/adrian.grep.1 @@ -0,0 +1,4 @@ + a The first state to appear is the start state + b + c [q3] + [q3] diff --git a/1992/adrian.grep.2 b/1992/adrian.grep.2 new file mode 100644 index 000000000..34d67b287 --- /dev/null +++ b/1992/adrian.grep.2 @@ -0,0 +1,4 @@ + a + b + c [q3] + [q3] . [q3] diff --git a/1992/adrian.grep.3 b/1992/adrian.grep.3 new file mode 100644 index 000000000..6a5f1e651 --- /dev/null +++ b/1992/adrian.grep.3 @@ -0,0 +1,4 @@ + a . + b a . + c [q3] a . + [q3] . diff --git a/1992/adrian.grep.4 b/1992/adrian.grep.4 new file mode 100644 index 000000000..cac0ccfff --- /dev/null +++ b/1992/adrian.grep.4 @@ -0,0 +1,3 @@ + [q0] a + b + c [q0] diff --git a/1992/adrian.grep.5 b/1992/adrian.grep.5 new file mode 100644 index 000000000..0723555f8 --- /dev/null +++ b/1992/adrian.grep.5 @@ -0,0 +1,4 @@ + ab + cd + ef [q3] + [q3] diff --git a/1992/adrian.grep.from b/1992/adrian.grep.from new file mode 100644 index 000000000..3fd06d4de --- /dev/null +++ b/1992/adrian.grep.from @@ -0,0 +1,8 @@ + F + r + o + m + : . [q6] + . +[q6] . [q6] + diff --git a/1992/adrian.grep.try b/1992/adrian.grep.try new file mode 100644 index 000000000..50290c31f --- /dev/null +++ b/1992/adrian.grep.try @@ -0,0 +1,4 @@ + t . + hc t . + eh [q3] t . + [q3] . diff --git a/1992/adrian.hint b/1992/adrian.hint new file mode 100644 index 000000000..56ac4acc4 --- /dev/null +++ b/1992/adrian.hint @@ -0,0 +1,227 @@ +Most Educational: + + Adrian Mariano + University of Washington + 2729 72nd Ave SE + Mercer Island, WA 98040 + USA + + +Judges' comments: + + To build: + make adrian + + Try: + adrian adrian.grep.try < adrian.hint + + For the slow minded, try: + adsleep 32767 + + Once you get past the obfuscation, you have an opportunity to learn + about regular expressions and state machines. + + NOTE: Some compilers have had trouble optimizing this entry. + + +Selected notes from the author: + + ADrian's GREP (adgrep) + + For those confused by the complexity of full-blown egrep style regular + expressions, this program offers an alternative. It implements an + equivalent search, using a deterministic finite automaton. + + A deterministic finite automaton consists of a finite set of states, + along with transition rules to move from one state to another, an initial + state, and a set of accepting states. The automaton takes a string as + input and begins in the start state. It reads a character of the string + and consults the rules for the current state, moving to the new state + indicated by the appropriate rule. This process is repeated until the + string is consumed. If the current state at this point is one of the + accepting states, then the string is accepted. + + The deterministic finite automaton is specified as a series of rules for + each state: + + chars1 chars2 ... + + chars1 is a list of characters (only the first 8 are significant) which + should trigger a transition to . is another state which + should have a similar specification somewhere. A state is accepting if + it is specified in square brackets: [final], and state strings are + significant to only eight characters. + + Example 1: matches ^abc$ + + a The first state to appear is the start state + b + c [q3] + [q3] + + Technically, a deterministic finite automaton should have a rule for each + possible input character at each state. To simplify descriptions of the + automata, if no rule is present, the string will not be accepted. Also, + the '.' character matches any character if it occurs first in the + character list. + + + Example 2: ^abc + + a + b + c [q3] + [q3] . [q3] + + + Example 3: abc$ + + a . + b a . + c [q3] a . + [q3] . + + + Example 4: ^(abc)*$ + + [q0] a + b + c [q0] + + + Example 5: ^[ab][cd][ef]$ + + ab + cd + ef [q3] + [q3] + + + Example 6: ^(abc|efg)$ + + a e + b + c [q5] + f + g [q5] + [q5] + + + With the automaton specification in 'filename', invoke the program by + typing + + adgrep 'filename' + + It will read stdin and print out all the lines which the automaton + accepts. If the file cannot be opened, a system error message will + be printed. If the input contains errors, then an error message along + with the number of the offending line will be printed to stderr. The + number of rules for each state is limited to 17. If more than 17 rules + are present, you get the error to_many_rules, and the state that was + being processed is printed. Error no_destination occurs if you specify a + set of characters, but no destination state, and error too_many_states + occurs if your automaton has more than 257 states. + + Running + adgrep from < your_mailbox + + will perform a function similar to that of the unix from command. + + If no filename is specified on the command line, then "adgrep.c" is used + as the specification for the automaton. (This file has been renamed + to adrian.c by the judges.) In this case, the program will search for + matches to the regular expression: + + ^.[^|C][^w[Q]*(Q|[w[]c).*|^.[C|]$ + + I suggest using adgrep.c as input, and storing the output in adwc.c: + + adgrep < adgrep.c > adwc.c + + Compiling the new file, mywc.c, yields a clone of the unix wc command. It + runs on one file (defaulting to "adgrep.c" if no file is given) and + displays the number of lines, words, and bytes in the input file. + + + Another possibly interesting automaton can be created by slightly + adjusting the adgrep.c file. Change the first line to read + + /* . echo| . */ + + and repeat the process above + + adgrep adecho.c + + The new file now contains all lines which match + + ^.[^5|m^]*[m^]([e=p,;]|[^e=+p,;].*)$ + + Compile and run. This is an echo clone. Note the efficient algorithm + employed. + + + Two other adjustments to the first line also yield useful results. By + changing it to + /* . head; . */ + + you can search for matches to + + ^.[^W]*W..*$ + + By some freak happenstance, lines of adgrep.c which match this regular + expression form a unix head command. It prints the first ten lines of + the file specified on the command line (or adgrep.c if no file is + specified). + + By setting the first line to + + /* . basename . */ + + a clone of the unix basename command can be unearthed. The automaton will + search for + ^.[^j]*jr.*$ + + on standard input. And the program which results by running adgrep.c + through this filter requires two parameters. The first is meant to be a + filename, and the second, an extension. All leading pathname components + are removed from the filename, and the extension is removed if present. + The resulting base name is printed to stdout. + + Lastly, by setting the first line to + + /* . sleep . */ + + you can search for + + ^.[^(~][^s]*sl.*$ + + Filtering adgrep.c through this search yields a clone of the sleep + command. Invoke with a single integer parameter, and it will pause + for that many seconds. + + If either adbasename or adsleep is invoked with too few parameters, + the program will print the error message: + Segmentation fault (core dumped) + + (The exact text of the above error messages varies from machine to + machine.) The four programs which read from stdin require lines + shorter than 999 characters. + + The other info files are adrian.grep.[1-6] which contain the six + examples that appear above, and from, which is used to emulate the + unix from command. For reasons of clarity, the name "from" should + probably not be changed if possible. I wouldn't want to be accused of + confusing people by giving the input files weird names. + + If you want to change the default input filename (line 80) you must be + careful to choose a name that doesn't match the wrong search patterns, + introducing extra lines into one of the programs. + + The program will produce at least one warning and possible several + when compiled depending on the compiler. + +Copyright (c) 1992, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1992/adrian.orig.c b/1992/adrian.orig.c new file mode 100644 index 000000000..37ea85729 --- /dev/null +++ b/1992/adrian.orig.c @@ -0,0 +1,113 @@ +/* . wc . */ +#include/* Wht majr flwchrt? */ +#include/* That mjr flwchrt! */ +#define P 257 +#define G 17 +#define z 8 +#define v(jr) jr +int W ,head; +#define S(W,b,f) strncpy(W,b,f),W[f]=0\ + + +char *wcs=" \t\n"; +struct{ char X[z+1]; + char f ; + int e ; + struct{ char g[z+1]; + int b ; + } w[ G]; + } o[ P]; +int L=0,j= -28; + + +void E(int i, int m,char*c) +{ + for(; i<43; i+=3) + putc(i["}|uutsrq`_^bji`[Zkediml[PO]a_M__]ISOYIRGTNR"]+i-9,stderr); + fprintf(stderr,"(%d): %s\n" ,m,c); + exit(1); +} + + + +int N(int m, char *t) +{ + int i ; + if (strlen ( + t)>z) t[z ]=0; + for(i= 0; i< L ; i++) if( + !strcmp (o[ i] . X + , t))return i; + if( L== P) + E(0, m, t); + S (o[ L] . X , t + ,z); + head; W = .1* head; + o[L ].f = !( strchr( t,']' )== 0 ); + o[L ++ ] . e = 0; + return L -1 ; } + +#define v(x ) + +int A(char *R) +{ + int c=0, i; + while(* R) { + i = -1; + while(j){ + if( ++ i==o[ c].e ) return 0; + if(o[ + c] .w[i ] .g[0 ] + =='.' ||strchr (o[ c].w[i] .g ,* R)){ + c= + o[ c ] .w[i].b; break;/* +main(int sl,char *j[]){ + sleep (~~~~~~~~atoi(j[1])) ;/* . sl + sl s l . sl + l l ] + sl */ } + } + R++; + } + return o[ c].f; +} + + + main(int wc,char *V[]){char Y[999],*s;FILE*W;int m=0,echo,jr,q,wcl=0,wcw=0,wcc=0; + v(s = V[1]; if (*V=strrchr(s,'/'))s=*V+1; if(( !strncmp( s + (jr=strlen(s)) - + (q=strlen(V[2]) ),V[2],q))&&jr!=q) s[jr-q] = 0; puts(s); ) + int e,p,C,Q ,basename; + W= fopen(wc>= 2 ? V[1] : "adgrep.c","rt"); +echo| m^ e| 5| (int) .8| echo| +wc |C ==o[o[C] .e] . +e| e==+p,p; s[o[C] .e ] +; +while( fgets(Y,998,W)) { wcc += strlen(Y); m++; + if( s = strtok(Y,wcs)) wcw++; + else continue ; + C= + basename= j +j+*"* . basename" + +j+*"* r ] " + N(m,s) ; +while( s = strtok(0,wcs)) { + if( o[ C ] . e == + G) E(1 ,m,o[C] .X) ; + S(o[C + ] .w[o[C ] .e].g,s, z); + Q= C ; + if(! ( s =strtok ( 0 ,wcs )))wcw -- + ,E( 2 , m, o[C] + . w[ o[ Q ] .e] . g ); + e + = o[C ] .w[o[C ] .e++ ] .b= N(m,s) + ; wcw += 2; } + 0&& + W && wcl++ + < 10 && printf((W,Y)); } + if(j+28) { { + ; } printf("%7u%7u%7u\n", wcl , wcw , wcc); } + while( gets(Y) ) if(A(Y)) puts(Y); + W, jr; } + +O(int wc,char**V) { +--wc && (printf("%s ",*++V), main(wc,V), 1) || printf("\n"); } + diff --git a/1992/albert.c b/1992/albert.c new file mode 100644 index 000000000..05f4c8472 --- /dev/null +++ b/1992/albert.c @@ -0,0 +1,152 @@ +#include +#include +#include +#include +#define new(PP) (PP *) malloc(sizeof(PP)) +typedef struct q { + jmp_buf ppp; + long qq; + struct q *P; + struct q *p; +} +PP; + +PP *P; +int aaaaaa=2; +int aaaaaaa=1; + +long qqq; + + +aaAaaa(aa,aaa) +char *aa; +char *aaa; +{ + char aaaa = 0; + if ((((( aaa ))))) + { + aaaa = *aa; + *aa=0; + aa+=strlen(aa+1); + P =new(PP); + P->P=P; + P->p=P; + } + + if ((((( !setjmp(P->ppp) ))))) + { + if ((((( !isdigit(*aa) ))))) + longjmp(P->ppp,aaaaaaa); + else { + P->p->P = new(PP); + P->p->P->P = P; + P->p->P->p = P->p; + P->p = P->p->P; + + P->qq = *aa--; + P = P->p; + aaAaaa(aa,0); + } + } else { + if ( !aaaa&&!*aa ) + longjmp(P->p->ppp,aaaaaaa); + + if ((((( (P->qq=aaaa)<10 &&! + (isdigit(aaaa)) ||! + (isdigit(*aa) ||! + *aa )))))) + { + fprintf(stderr,"Usage %c%s \n", + (aaa[0]?7:aaaa),aaa+!aaa[0]); + exit(1); + } + } +} + + +ppPppp(pp,ppp) +PP **pp, *ppp; +{ + int aa; + if ((((( !(aa=setjmp(ppp->ppp))||aa==aaaaaa ))))) + { + if ((((( *pp==ppp ))))) + { + ppp = (*pp)->p; + + if ( qqq<47 ) return; + if ( ppp->qq!=48 ) return; + + while ( ppp->qq==48 ) + { + printf("%ld\n",qqq-45); + *pp = ppp; + ppp = ppp->p; + } + qqq -= 1; + longjmp(ppp->ppp,aaaaaaa); + } else { + PP *p; + + ppPppp(pp,ppp->p); + for (p=ppp;p!=*pp;p=p->p) + { + int qq=4; + if ((((( qqq<47 && + (qq=0,p->qq+=p->p->qq-96)>=48-qqq || + qqq>46 && + (p->qq-=p->p->qq)<0 ))))) + { + p->qq += qqq+qq; + if ( p->p==P && qqq<=46 ) + { + P->p->P = new(PP); + P->p->P->P = P; + P->p->P->p = P->p; + *pp = P = P->p = P->p->P; + P->qq = 48; + } + + p->p->qq+=qq==0; + p->p->qq-=qq!=0; + } + else + { + p->qq += 48; + } + } + if ( ppp->P==P ) longjmp(ppp->ppp,aaaaaaa); + } + } + else + { + qqq += 1; + + while (48==P->qq ) + { + P->P->p = P->p; + P = P->p->P = P->P; + + } + + if ( ppp!=ppp->p->p || qqq<47 ) + longjmp(ppp->ppp,aaaaaa); + else + { + printf("At most one remains\n"); + exit(0); + } + } +} + + +main(aaa,aaaa) +int aaa; +char **aaaa; +{ + aaAaaa(aaa==aaaaaaa?aaaa[0]:aaaa[1],aaaa[0]); + qqq = 39; + ppPppp(&P,P->p); +} + + diff --git a/1992/albert.fix.c b/1992/albert.fix.c new file mode 100644 index 000000000..d40c72c2b --- /dev/null +++ b/1992/albert.fix.c @@ -0,0 +1,34 @@ +#include + +main(argc,argv) +int argc; +char **argv; +{ + long arg[100]; + int i,j; + int base = 10; + int start = 0; + int end= strlen(argv[1]); + + + for (i=0;i 2 ) + { + while ( arg[end-1] == 0 ) { + printf("%d\n",base); + end--; + } + while ( arg[start] == 0 ) start +=1; + base += 1; + + for (i=start+1;istart;j--) + if ( (arg[j]-=arg[j-1])<0 ) + { + arg[j]+=base; + arg[j-1] -= 1; + } + } +} diff --git a/1992/albert.fix.hint b/1992/albert.fix.hint new file mode 100644 index 000000000..315060ef5 --- /dev/null +++ b/1992/albert.fix.hint @@ -0,0 +1,22 @@ +From: leo _at_ zycad -dot- com (Leo Broukhis) +Date: Tue, 30 Jan 96 17:37:51 PST +To: judges _at_ toad -dot- com +Subject: IOCCC 1992 - a bug + +Dear Judges, + +albert.c (even in its fixed form) still has a bug. Although I don't +remember the number that exposed the bug (afair, resulting in coredump) +in albert.orig.c that has been fixed in albert.c, +I've found a number exposing another bug: 10000000001 (that's 9 0's). +Both albert and albert.orig loop without printing anything, although +the first factor is 101 and is usually found in an instant. + +Unfortunately, the e-mail address in albert.hint is no longer valid, +and neither whois, nor replacing old domain name with a new one according +to the MX records, nor Altavista Web search were successful. + +...Fortunately, Albert van der Horst did send me an unobfuscated +(but somewhat limited - it doesn't check the number for factors 2, 3, 5, 7) +version of his program. I didn't have a chance to augment its functionality +to the one of the contest entry. diff --git a/1992/albert.hint b/1992/albert.hint new file mode 100644 index 000000000..68c0bd2ac --- /dev/null +++ b/1992/albert.hint @@ -0,0 +1,85 @@ +Most Useful Program: + + Albert van der Horst + S P&A R&C + Oranjestraat 8 + 3511 RA UTRECHT + The Netherlands + + +Judges' comments: + + For a canned example: + make albert + albert 1234567890123456789 + + We were impressed with the speed at which it was able to factor + arbitrarily large numbers consisting of factors that fit into + a long. + + +Selected notes from the author: + + The Obfuscated version of the Horst algorithm. + + This program will factor unlimited length numbers and print the + factors in ascending order. Numbers of one digit (e.g. 8) + are rejected without notice. + It quits as soon as there is at most one + factor left, but that factor will not be shown. + It accomplishes this efficiently, without resorting to division + or multiplication, until the candidate factor no longer fits in + a signed long. + + The nicest way is to rename the program into e.g. 4294967297 + if you want to factor Fermat's 4th number. Then just run it. + Or you may type "prog " + A nice one is also (30 ones) + albert 111111111111111111111111111111 + + Apart from the foregoing there are no special execution instructions. + + To customize the program into a factorizer of a fixed number, use + cc albert.c -o 4294967297 + or some such. + + There are no data files used, and it is not possible to feed input + via stdin. + + I think this program is a nice example of algorithmic obfuscation. + Several times two similar algorithms are merged into one. Then you + need quite some tricks to get it running, such as long jumps + through recursive subroutines. I felt like a sword smith, + welding the sword very long, folding it again to the proper + length, keep on hammering till it is tight, then fold again. + Always keeping it at the proper red hot temperature, but not too + hot lest the hardness fades. + The strict naming conventions for subroutines did not make things + much clearer after all, but it was not supposed to. + + I would like to draw attention to the robustness of the program + with respect to error handling and the nice stopping criterion. + The esthetic appeal of some lines is at the expense of clearness, + I apologize. + Running the program through the c-beautifier reveals nothing, + it will only destroy some of the lay out. + Running the program through lint shows the usual remarks for a + K&R program. Defeating this through casts does not make a program + cleaner in my opinion. + + Here are some hints, but they may not be too helpful. + 1. The Horst algorithm is described in the Hobby Computer Club + Newsletter, year 82, part 4, a real Dutch treat. + Assembler, c and Forth version have been around for some years. + 2. Does fractal programming exist after all? + 3. You remember the ToomCook algorithm in Knuth? + It uses iteration instead of recursion and is quite jumpy. + This program shares these disadvantages in a modified form. + 4. The Conversion is to be found in Knuth, not so the Observation. + The Observation: "if it ends in a zero, it is divisible by ten" + +Copyright (c) 1992, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1992/albert.orig.c b/1992/albert.orig.c new file mode 100644 index 000000000..489f27cdf --- /dev/null +++ b/1992/albert.orig.c @@ -0,0 +1,152 @@ +#include +#include +#include +#include +#define new(PP) (PP *) malloc(sizeof(PP)) +typedef struct q { + jmp_buf ppp; + long qq; + struct q *P; + struct q *p; +} +PP; + +PP *P; +int aaaaaa=2; +int aaaaaaa=1; + +long qqq; + + +aaAaaa(aa,aaa) +char *aa; +char *aaa; +{ + char aaaa = 0; + if ((((( aaa ))))) + { + aaaa = *aa; + *aa=0; + aa+=strlen(aa+1); + P =new(PP); + P->P=P; + P->p=P; + } + + if ((((( !setjmp(P->ppp) ))))) + { + if ((((( !isdigit(*aa) ))))) + longjmp(P->ppp,aaaaaaa); + else { + P->p->P = new(PP); + P->p->P->P = P; + P->p->P->p = P->p; + P->p = P->p->P; + + P->qq = *aa--; + P = P->p; + aaAaaa(aa,0); + } + } else { + if ( !aaaa&&!*aa ) + longjmp(P->p->ppp,aaaaaaa); + + if ((((( (P->qq=aaaa)<10 &&! + (isdigit(aaaa)) ||! + (isdigit(*aa) ||! + *aa )))))) + { + fprintf(stderr,"Usage %c%s \n", + (aaa[0]?7:aaaa),aaa+!aaa[0]); + exit(1); + } + } +} + + +ppPppp(pp,ppp) +PP **pp, *ppp; +{ + int aa; + if ((((( !(aa=setjmp(ppp->ppp))||aa==aaaaaa ))))) + { + if ((((( *pp==ppp ))))) + { + ppp = (*pp)->p; + + if ( qqq<47 ) return; + if ( ppp->qq!=48 ) return; + + while ( ppp->qq==48 ) + { + printf("%ld\n",qqq-45); + *pp = ppp; + ppp = ppp->p; + } + qqq -= 1; + longjmp(ppp->ppp,aaaaaaa); + } else { + PP *p; + + ppPppp(pp,ppp->p); + for (p=ppp;p!=*pp;p=p->p) + { + int qq=4; + if ((((( qqq<47 && + (qq=0,p->qq+=p->p->qq-96)>=48-qqq || + qqq>46 && + (p->qq-=p->p->qq)<0 ))))) + { + p->qq += qqq+qq; + if ( p->p==P && qqq<=46 ) + { + P->p->P = new(PP); + P->p->P->P = P; + P->p->P->p = P->p; + *pp = P = P->p = P->p->P; + P->qq = 48; + } + + p->p->qq+=qq==0; + p->p->qq-=qq!=0; + } + else + { + p->qq += 48; + } + } + if ( ppp->P==P ) longjmp(ppp->ppp,aaaaaaa); + } + } + else + { + qqq += 1; + + while (48==P->qq ) + { + P->P->p = P->p; + P = P->p->P = P->P; + + } + + if (ppp!=ppp->p->p ) + longjmp(ppp->ppp,aaaaaa); + else + { + printf("At most one remains\n"); + exit(0); + } + } +} + + +main(aaa,aaaa) +int aaa; +char **aaaa; +{ + aaAaaa(aaa==aaaaaaa?aaaa[0]:aaaa[1],aaaa[0]); + qqq = 39; + ppPppp(&P,P->p); +} + + diff --git a/1992/ant.README b/1992/ant.README new file mode 100644 index 000000000..b982a3975 --- /dev/null +++ b/1992/ant.README @@ -0,0 +1,271 @@ +NAME + + am Anthony's Make + + +SYNOPSIS + + am [target] + + +DESCRIPTION + +AM is a programmer's tool to maintain, update, and regenerate groups +of files and/or programs. It is similar to MAKE as described by the +POSIX.2 draft standard 11.2, and this document parallels the draft +in order to point out the subtle differences between AM and MAKE. + +The AM utility can be used as part of software development to update +files that are derived from other files. A typical case is one where +object files are derived from the corresponding source files. The AM +utility examines time relationships and updates those derived files +(targets) that have modified times earlier than the modified times of +the files (prerequisites) from which they are derived. A description +file ("makefile") contains a description of the relationships between +files, and the commands that must be executed to update the targets to +reflect changes in their prerequisites. Each specification, or rule, +shall consist of a target, optional prerequisites, and optional +commands to be executed when a prerequisite is newer than the target. + + +OPTIONS + +None. + + +OPERANDS + +makefile This required argument, is a pathname of a description + file, which is also referred to as the "makfile". A + pathname of "-", shall *NOT* denote the standard input. + +target This optional argument, is the first target to be + processed. If no target is specified, when AM is + processing the makefile, the first target that AM + encounters shall be used. + + +EXTERNAL INFLUENCES + +STANDARD INPUT + +Not used. + + +INPUT FILES + +The input file, otherwise known as the makefile, is a text file +containing rules, macro definitions, and comments. + + +ASYNCHRONOUS EVENTS + +All traps are left to their default actions. If AM receives a SIGHUP, +SIGTERM, SIGINT, or SIGQUIT then AM will terminate as per request +*WITHOUT* removing the current target. + + +EXTERNAL EFFECTS + +STANDARD OUTPUT + +The AM utility shall write all commands to be executed to standard +output unless the command is prefixed with an at-sign (@). If AM is +invoked without any work needing to be done, it shall *NOT* write a +message to standard output indicating that no action was taken. + + +STANDARD ERROR + +Standard error is used for diagnostic messages only. + + +OUTPUT FILES + +None. However, the utilities invoked by AM may create additional files. + + +EXTENDED DESCRIPTION + +The AM utility attempts to perform the actions required to ensure +that the specified target(s) are up-to-date. A target is considered +out-of-date if it is older than any of its prerequisites or it does +not exist. The AM utility shall treat all prerequisites as targets +themselves and recursively ensure that they are up-to-date, processing +them in the order which they appear in the rule. The AM utility shall +use the modification times of files to determine if the corresponding +targets are out-of-date. + +After AM has ensured that all of the prerequisites of a target are +up-to-date, and if the target is out-of-date, the commands associated +with the target entry shall be executed. If there are no commands +listed for the target, the target shall be treated as up-to-date. + + +MAKEFILE SYNTAX + +A makefile can contain rules, macro definitions, and comments. If a +macro is defined more than once, the value of the macro shall be the +last one specified. Comments start with a number-sign (#) and +continue until an unescaped is reached. + +A backslash before a serves as a line continuation mark, and +is used to create long-lines. A line will continue to be extended until +an unescaped is reached. + +When an escaped (one preceded by a backslash) is found anywhere +in the makefile, it shall be replaced, along with any leading white +space on the following line, with a single . + + +MAKEFILE EXECUTION + +Command lines shall be processed one at a time by writing the command +line to standard output, unless prefixed with an at-sign (@), and +executing the command(s) in the line. Commands shall be executed by +passing the command line to the command interpreter via the system() +function. + +The environment for the command being executed shall contain all of the +variables in the environment of AM. All macros are considered to be part +of the environment too. + +By default, when AM receives a non-zero status from the execution of a +command, it terminates with an error message to standard error. If +the command is prefixed by a hyphen (-) then any error found while +executing the command shall be ignored. + +Command lines can have one or more of the following prefixes: a hyphen +(-) to ignore errors, an at-sign (@) to be silent, or a plus-sign (+) +if the command is always executed (this prefix is for compatibility with +MAKE and is ignored). + + +TARGET RULES + +Target rules are formatted as follows: + + target [target ...] : [prerequisite ...] + [command + command + ...] + + (line that does not begin with ) + +Target entries are specified by a -separated, non-null list of +targets, then a colon, then a -separated, possibly empty list +of prerequisite. All following lines, if any, that begin with a , +are command lines to be executed to update the target(s). The first +line that does not begin with a shall begin a new entry. + +Target names can be any character supported by the host system, +excluding s, s, s, and colons (:), which are used +for delimiters. + +For any given target there can be only one target rule. The first +occurrence of a target in a makefile shall be used. All subsequent +rules for the same target are ignored. There is *no* support for +adding prerequisites to a target's prerequisite list once a target +rule is defined. + +There are no special targets or inference rule support. + + +MACROS + +Macro definitions are in the form: + + string1 = [string2] + +The macro named string1 is defined as having the value of string2, +where string2 is defined as all characters, if any, after the equal +sign up to an unescaped . Any s immediately before or +after the equal sign shall be ignored. + +Subsequent appearances of $(string1) shall be replaced by string2. +The parentheses are *NOT* optional if string1 is a single character. +The macro $$ shall be replaced by the single character $. + +Macro names can be any character that the host system would allow in +the definition of environment variables, excluding parentheses, ( and ), +which are used for delimiters. + +Macros can appear anywhere in the makefile, except within other macro +references (ie. no nesting). Macros in target and command lines shall +be evaluated when the line is read. Macros in macro definition lines +shall be evaluated *IMMEDIATELY*. A macro that has not been defined +shall evaluate to a null string without causing any error condition. + +If a macro is defined more than once, the value of the macro shall be the +last one specified prior to it being referenced. + +Macro assignments shall be accepted from the sources listed below, in +the order shown. If a macro name already exists at the time it is being +processed, the newer definition shall replace the existing definition. + + 1) The contents of the environment, including the variables with + null values in the order defined in the environment. + + 2) Macros defined in the makefile, processed in the order specified. + +There are no internal macros supported. The SHELL macro shall *NOT* be +treated specially. + + +EXIT STATUS + + 0 Successful completion. + 1 General error. + 2 Usage error. + 3 Failed to open makefile. + 4 Failed to allocate memory. + + +INSTALLATION + +AM can be built on any system providing at least K&R C. It has been +tested on + + o SunOS with GCC + o ATARI Mega ST with Sozobon C + o PC clone with Turbo C + o Interactive UNIX System V/386 release 3.2 + +For all machines, the compile command line should be + + cc -O -o am am.c + +The value RULES represents the number of slots available to record +target rules, dependencies, and commands. The default value chosen +should handle most project makefiles. RULES can be overridden on the +command line with -DRULES=nn, where 0 < nn < INT_MAX. + +On a DOS machine using Turbo C, it may be necessary to add the include +directive + + #include + +with the rest of the includes if sys/stat.h does not properly define or +use time_t. Also, on some older K&R C compilers, stdlib.h may not be +defined and so it might be necessary to remove the include directive for +it. + + +REFERENCES + +[Mil87] Webb Miller, "A Software Tools Sampler", Prentice Hall, 87 + ISBN 0-13-822305-X, chaper 2 + +[POSIX] POSIX.2 draft 11.2 MAKE + + +FILES + +ant.c Obfuscated source +ant.README Manual for AM +ant.test.mk Test makefile + + +BUGS + +Unknown as of 20 March 92. diff --git a/1992/ant.c b/1992/ant.c new file mode 100644 index 000000000..fb34068d6 --- /dev/null +++ b/1992/ant.c @@ -0,0 +1,178 @@ +#define W while +#define S strspn +#define R return +#define F fprintf(stderr, +#define C continue; + +#include +#include +#include +#include + +#ifndef RULES +#define RULES 500 +#endif + +#define N(p, i) (p += i, p += S(p, w), i = strcspn(p, w)) + +char *b, l[BUFSIZ], *t[RULES], *d[RULES], *c[RULES], w[] = "\n\t "; + +time_t M(); +int T(); +void U(); + + +time_t +M(f) +char *f; +{ + int j, x; + size_t i = 0; + struct stat s; + N(f, i); + x = f[i]; + f[i] = 0; + j = stat(f, &s); + f[i] = x; + R j < 0 ? 0 : s.st_mtime; +} + +int +T(f) +char *f; +{ + char *q; + size_t i = 0, j, k = 1; + N(f, i); + W ((q = t[k])) { + j = 0; + W (N(q, j)) { + if (i == j && !strncmp(f, q, i)) + R k; + } + ++k; + } + R 0; +} + +void +U(f) +char *f; +{ + time_t t = M(f); + size_t i = 0, j = !t, k = T(f); + char *p = d[k], *q = c[k]; + if (!N(p, i) && q && *q != '\t' && j) { + F "am: Don't know how to make '%s'.\n", f); + exit(1); + } + W (0 < i) { + U(p); + if (t < M(p)) + j = 1; + N(p, i); + } + if (j && q && *q == '\t') { + sleep(1); + W (*q++ == '\t') { + i = j = 1; + W (0 < S(q, "-+@")) { + if (*q == '@') + + i = 0; + if (*q++ == '-') + + j = 0; + } + if (i) + puts(q); + if (system(q) && j) { + F "am: Error making '%s'\n", f); + exit(1); + } + q += strlen(q) + 1; + } + c[k] = 0; + } +} + +int +main(u, v) +int u; +char **v; +{ + FILE *f; + struct stat s; + size_t i, j, k; + char *m, *n, *p, *q, *r; + if (u < 2) { + F "usage: am [target]\n"); + R 2; + } + if (stat(*++v, &s) || !(f = fopen(*v, "r"))) + R 3; + q = b = malloc(2*s.st_size); + if (!b) + R 4; + i = 1; + k = 0; + m = 0; + *t = *d = *c = ""; + W ((r = fgets(l, BUFSIZ, f))) { + if (RULES <= i) { + F "am: Number of target-rules exceeds %d.\n", RULES); + R 1; + } + if (k) { + *q++ = ' '; + r += S(r, w); + } else { + if (t[i]) + c[i++] = q; + if (m && putenv(m)) + F "am: No more environment space.\n"); + m = 0; + if (*l == '#' || *l == '\n') + C + p = q; + } + W (!(k = *r == '\\' && r[1] == '\n') && *r) { + if (*r == '$') { + if (r[1] == '(') { + n = r+2; + r += strcspn(r, ")"); + *r++ = 0; + n = getenv(n); + if (n) + q = strcpy(q, n) + strlen(n); + C + } + if (*r == r[1]) + ++r; + } + if (*r == '=' && *l != '\t' && !m) { + *q = 0; + m = p; + j = 0; + q = N(m, j) + m; + *q++ = *r; + j = 1; + if (!N(r, j)) + *q++ = 0; + C + } + if (*r == ':') { + t[i] = p; + *r = 0; + d[i] = q+1; + } + if (*r == '\n') + *r = 0; + *q++ = *r++; + } + } + fclose(f); + U(2 < u ? *++v : t[1]); + R 0; +} + diff --git a/1992/ant.hint b/1992/ant.hint new file mode 100644 index 000000000..42c5d78f2 --- /dev/null +++ b/1992/ant.hint @@ -0,0 +1,38 @@ +Best Utility: + + Anthony C Howe + Mortice Kern Systems Inc. + Unit 1, 14 Weber Street North + Waterloo, Ontario + N2J 3G4 + Canada + + +Judges' comments: + + To use: + make am + am ant.test.mk + + Like much of Posix, obfuscation has its place. Your task is to + figure out where. + + This entry comes complete with a Posix-like command description. + Interested Posix balloters should lobby the IEEE for an obfuscated + P1003 sub-committee. + + We also suggest that you try: + make am + am Makefile am_clobber <-- clobber everything except am + am Makefile all + + +Selected notes from the author: + + See the file ant.README. + +Copyright (c) 1992, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1992/ant.test.mk b/1992/ant.test.mk new file mode 100644 index 000000000..686a5f2ff --- /dev/null +++ b/1992/ant.test.mk @@ -0,0 +1,196 @@ +# +# Test makefile for AM +# + +# +# Allow for empty macros. +# +EMPTY= + +# +# Allow for white space in macro assignment. +# +TEXT_1=no white space +TEXT_2 =left hand side +TEXT_3= right hand side +TEXT_4 = both sides +TEXT_5 = tabs boths sides + +# +# Test psuedo targets. +# +all : print_macros repeat redefine many flags multiple split errors done + +print_macros : empty t1 t2 t3 t4 t5 t.all + +# +# Targets with no dependencies. +# +empty : + echo EMPTY='$(EMPTY)' + +t1 : + echo TEXT_1='$(TEXT_1)' + +t2 : + echo TEXT_2='$(TEXT_2)' + +t3 : + echo TEXT_3='$(TEXT_3)' + +t4 : + echo TEXT_4='$(TEXT_4)' + +t5 : + echo TEXT_5='$(TEXT_5)' + +t.all : + echo $(TEXT_1) $(TEXT_2) $(TEXT_3) $(TEXT_4) $(TEXT_5) + +# +# Test redefinition of macros. AM allows redefinition and +# evaluates macros immediately. +# +TEXT_1 =text number 1 +TEXT_2 = test macro split \ + across lines \ + three lines +TEXT_3 = test dollar macro '$$' +TEXT_4 = test dollar again "$$(TEXT_1)" +TEXT_5 = imbeded macro '$(TEXT_1)' + +redefine : r1 r2 r3 r4 r5 + +r1 : + echo TEXT_1='$(TEXT_1)' + +r2 : + echo TEXT_2='$(TEXT_2)' + +r3 : + echo TEXT_3='$(TEXT_3)' + +r4 : + echo TEXT_4='$(TEXT_4)' + +r5 : + echo TEXT_5='$(TEXT_5)' + +# +# Try to update a prerequisite more than once. Subsequent occurences +# should be ignored once a prerequisite has been updated. +# +repeat: t1 repeat.a t3 +repeat.a : t2 t1 + + +# +# Target with multi-line receipe. +# +many : leaf.1 leaf.2 + echo Execute receipe with multiple commands. + ls -1 leaf.* + echo Last line of receipe for target 'many'. + +leaf.1 : + touch leaf.1 + +leaf.2 : + touch leaf.2 + + +# +# Test receipe line flags. +# +flags : silence ignore always combination + +# Command not displayed before execution. +silence : + echo You should not see the 'ls' command printed. + @ls leaf.* + +# Ignore errors from command. +ignore : + echo The 'ls' command should fail but not terminate AM. + -ls unknown + +# This flag is ignored by AM since we don't support a silence option (-n). +always : + +echo The '+' flag is accepted and ignored. + +combination: + -@echo The next displayed line should not be 'ls unknown' + @-ls unknown + @+-echo Combined flags test completed. + + +# +# Multiple targets. +# +multiple : node.2 node.5 + +node.1 node.2 node.3 : leaf.1 leaf.2 + touch node.1 node.2 node.3 + +node.4 node.5 : node.2 leaf.3 + touch node.4 node.5 + +leaf.3 : + touch leaf.3 + + +# +# Test split lines. +# +split : node.6 leaf.4 split.cmd + echo Completed split line tests. + +# Target dependencies split across lines. +node.6 : leaf.1 \ + leaf.2 \ + leaf.3 + echo Test dependency list split across lines. + touch node.6 + +# Target list split across lines. +split.tar \ +leaf.4 \ +leaf.5 : + echo Test target list split across lines + touch leaf.4 leaf.5 + +# Command lines split across lines. +split.cmd: + echo Try spliting command \ + lines across more \ + than one line. + + +# +# Test AM error reports and exit statuses. +# +errors: + -am test.mk error.1 + -am test.mk error.2 + -am test.mk error.3 + +# Target that does not exist, has no dependencies, and no commands. +error.1: + +# Target where dependency does not exist. +error.2: unknown + +# Receipe command causes error. +error.3: t1 fail t2 +fail: + ls -l unknown + + +# +# +# +done: + echo AM Test Complete + +clean: + rm leaf.* node.* diff --git a/1992/buzzard.1.c b/1992/buzzard.1.c new file mode 100644 index 000000000..9dfcbf146 --- /dev/null +++ b/1992/buzzard.1.c @@ -0,0 +1,61 @@ +#define A(c,a,b) t=b;t+=a;_(c) +#define B(b,a) P(u,a)t=0;t-=a;R t+=u;t+=1;t/=2;_(b) +#define b(x) x(g) +#define C ;main(argc,argv)char**argv;{for(;!w;){q=0;l +#define c(y) x +#define D(c,a,b) t=a;t/=b;_(c) +#define d(x) S(x,x,1) +#define E(a,d) t=d;t-=p;t*=r;t*=a;p+=t;t=1;t-=a;r*=t; +#define e(x) y +#define f(x) x(e) +#define G(x,y) Q(x,atoi(argv[y])) +#define g(x) x(b) +#define H Q(w,1)Q(p,0)r=0; +#define h(x) x(c) +#define i(c,a,b) a(b,b,c) +#define J(x) Q(p,x)r=0; +#define j(x) Q(f(g),x) +#define K(x) Q(x,argc) +#define k(x) S(a,y,x) +#define L(x) u=p;u-=x;t=u;t*=u;R r+=2;r-=t;r/=2; +#define l L(q) q+=1; +#define M(c,a,b) t=a;t*=b;_(c) +#define m(x) x(a,a) +#define n(x) x(a,y) +#define O(c,a,b) t=b;t+=1;t+=a;t/=2;Q(c,t) +#define o(x,y) M(x,x,y) +#define P(b,a) t=a;R _(b) +#define R t+=2047;t/=2048;t+=8191;t/=8192; +#define Q(a,b) t=b;_(a) +#define S(c,a,b) t=a;t-=b;_(c) +#define T } +#define U(c,a,b) u=b;t=b;t-=1;t*=r;t+=1;b=t;t=a;t/=b;b=u;_(c) +#define V int t,u,q,p=0,r,w=0, +#define X(y) printf("%x\n",y); +#define Z(a,d) t=p;t-=d;t*=a;t+=d;_(p)r*=a; +#define _(a) t-=a;t*=r;a+=t; + +V a,x,y,s C + + G(f(g),q)G( g(h),2)n(B)Z(a,4)n( + P)E(a,1)j(2989)H l k (1)m(B)Z(a,6)l k(h(b)) + B(s,a )m(P) Z(s ,8)E + (a,q )Q( s,h (g) + )Q( f(c ),f + (g) )j( s)l + i(b (h) ,S, + f(b ))n (B) + E(a ,2) J(8) +l j( x)Q(x,1)l n(P)Z(a,8 +)o(x ,g(f))d(f(e))J(5)l j +(x)l d(x )S(a + ,x, 1)m (B) + Z(a ,10 )U( + a,y ,x) o(a + ,x) k(a )m( + P)E( a,7) l j (0) + Q(s,1 )l D(a ,x, q)o( + a,q)S(a,h(g),a)i(s, M,a)i(a,A,g(f))i(q,D,x + )o(s,16)B(a ,x)E(a,9)H l j(2766)H + +T X(b(f)) T diff --git a/1992/buzzard.1.hint b/1992/buzzard.1.hint new file mode 100644 index 000000000..0160ecc2e --- /dev/null +++ b/1992/buzzard.1.hint @@ -0,0 +1,221 @@ +Most Obfuscated Algorithm: + + Sean Barrett + Software Construction Company + 430 Southwest Parkway, #1906 + College Station, TX 77840 + USA + + +Judges' comments: + + To see clearly why this won an award: + make babble + + Try: + babble 0 10 + babble 56 720 + babble 1 521 + + To see good C Preprocessor babble, try: + make babble.cppcb + cat babble.cppcb + + Notice how many statements it takes to do anything useful? + + +Selected notes from the author: + + What you shouldn't think about babble: + + babble doesn't just do a mass of #defines as its obfuscation. + + + What you should be glad about: + + I didn't just submit the post-C-preprocessed output as an entry. + + + Cute trick warning: + + babble contains only a numeric printf, yet sometimes it prints out + short strings. + + + What it does: + + babble is a simple mathematical program. It expects two numeric + arguments. + + % babble 0 + will print out the factorial of . + + % babble + will print out the largest common factor of num1 and num2. + + % babble 1 + will print out a factor of num2 if it's composite, or else + it will print a string informing you that num2 is prime. + + If the first argument is less than 0, it prints out an + error message. + + + What it is: + + babble is a translator from a pseudo-assembly language into a + subset of C suitable for execution on Charles Babbage's + Analytical Engine. Or rather, the #defines in babble are that + translator. The rest of babble is a babble program. If you run the + whole mess through CPP and a beautifier, you will see that + all you have is a loop that runs until a variable is not 0, and + a sequence of assignment statements. The assignment statements + are all of the form 'a op= b' or 'a = b'. The Engine actually + allowed 'a = b op c'. Only +, -, /, and * are used--no boolean + or bitwise operators. The infinite loop could have been + simulated on the AE by connecting the already-processed + card stack to the input card stack. + + + How to try to understand it: + + *Don't* expand the #defines! Rather, decipher what they do. + Some of them are mere obfuscational fodder, put in to encourage + you to run it through CPP. + + + What it doesn't quite do right as an emulator: + + Because of the definitional constraints, calls to atoi(argv[#]) + also appear inside the loop. These could be put outside-- + the initial values of the "registers" on the AE--but the + macro conventions being used didn't lend themselves to it. + + + Theoretical observations: + + The simulated comparison operations only work with a certain + range of numbers; numbers that are too large will cause the + output code to fail to simulate the input code. This means + that this implementation of babble would not be turing-complete, + even if the AE could process indefinitely-sized numbers. + However, this is actually a constraint that no actual computer + can meet, either, so we can conclude that if an AE, with + card bins connected as suggested above, were hooked up to + a memory unit of sufficient size, it would be as turing + complete as any existing machine (or, for those who + interpret that excessively critically, i.e. "not at all" for + both, we can simply say that the AE could simulate any + existing machine--although not quickly). This would be a + good place to site some references on the AE, but I don't + have any. + + + Definition of the input language to babble: + (OR What Exactly Do All The Macros Do?) + + [Don't read this unless you're stumped!] + + + MACRO FUNCTION MNEMONIC + V begin variable declarations Variable + C begin program Code + + Q(b,a) let b = a eQuals + A(c,a,b) let c = a + b Add + S(c,a,b) let c = a - b Subtract + D(c,a,b) let c = a / b, where b is a *constant* Divide + U(c,a,b) let c = a / b, where b is anything Unknown + M(c,a,b) let c = a * b Multiply + + O(c,a,b) let c = a boolean-or b (a,b are 0 or 1) Or + B(b, a) let b = boolean value of a Boolean + P(b, a) let b = 1 if a>0, else 0. Positive + + l emit next sequential label Label + J(x) goto label #x Jump + + Z(a,d) if a is 0 goto d (a is 0 or 1) Zero + E(a,d) if a is 1 goto d (a is 0 or 1) Else + + H halt Haly + + K(x) let x = number of cmd line arguments Kount + G(x,y) let x = the value if the yth argument Get argument + + T end of code; begin output section Terminate + X(y) print out hexadecimal value of y heXadecimal + T end of output section and program Terminate + + You can figure out the other macros yourself. In the sample + program, I've actually implemented subroutines by saving + a return address in a variable and then jumping to a routine-- + specifically, a routine that converts a number into bcd, so + it can be output by the hexadecimal output statement. + + + How it works, i.e., how to get useful programs from a op= b + + The essential statement to be able to do to do interesting + programs is the conditional (given that we have loops). + Since all you can do in the given operation output set is + assignment, we implement "conditional assignment": + + if (x) y = z; + + To implement this, we constrain x to be either 0 or 1, and + simply compute: + + y = (z * x) + (y * (1-x)); + + This is more obscured by factoring out common terms and restricting + ourselves to two operand operations: + + temp = z; (temp == z) + temp -= y; (temp == z-y) + temp *= x; (temp == (z-y)*x) + y += temp; (y == (z-y)*x + y) + ( == z*x - y*x + y) + ( == z*x + y*(1-x)) + + Next we imagine we have a pc. "I'm supposed to execute statement + pc next", says our emulator. But suppose we're not currently + coming up on statement pc. To handle this, we simply make every + operation conditional on the pc having the correct value: + + if (pc == some_constant) y = z; + + To combine this with other operations, we simply multiply by our + (pc == some_constant) flag right after the above 'temp *= x'. + + To evaluate pc == some_constant requires one more trick. We assume + that numbers can only be in some limited range. Then we use successive + additions and divisions to reduce that number down to -1, 0, or 1. + You could, for instance, do this by using mod by 2 and div by 2 to + count bits, stopping after, say, 32 iterations. The number you get + is between 0..32, so another 6 iterations on it reduces it to 0..6. + Three iterations on this produces 0..2 (3 would be '7'), and then + two iterations on this produces 0 or 1. Instead I use a shorter + two-divide approach that assumes I'm allowed to use numbers slightly + larger than the numbers I'm operating on. + + A similar approach is used to detect positive numbers. + + Note that the obvious code to compute y/x will not work correctly, + because every value is computed, even if the pc is not set correctly; + if x is ever 0 when the real C code reaches this computation the + program will die. (This was discovered the hard way.) The solution + is to stick x in a temporary, and if the current code is not about + to be executed, set the temporary to 1. + + Thanks to Bill Pugh for bringing the loopability of the AE to + my attention. + + babble was originally named 'cb', for obvious reasons, and is + dedicated to the memory of Charles Barrett. + +Copyright (c) 1992, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1992/buzzard.2.README b/1992/buzzard.2.README new file mode 100644 index 000000000..ee59a3b2e --- /dev/null +++ b/1992/buzzard.2.README @@ -0,0 +1,22 @@ +buzzard.2.README this file +buzzard.2.design description of FIRST (design documentation of THIRD) +third implementation of THIRD in FIRST +help.th online listing of THIRD primitives + + FIRST demos: use 'first < {demo}' + +demo1.1st prints Hello World! assuming ASCII + + THIRD demos: use 'cat third {demo} | first' + +demo1.th prints Hello World! regardless of character set +demo2.th demonstrates a simple loop +demo3.th demonstrates a simple if test +demo4.th recursive factorial calculating on the way up +demo5.th recursive factorial calculating on the way down +demo6.th demonstrates switching from compiler to execution mode + + Interactive THIRD: use 'cat third - | first'. + + To include the primitive on-line help, use + 'cat third help.th - | first'. diff --git a/1992/buzzard.2.c b/1992/buzzard.2.c new file mode 100644 index 000000000..476545814 --- /dev/null +++ b/1992/buzzard.2.c @@ -0,0 +1,61 @@ +#define c m[m[0]++] = +#define z;break;case + +char s[5000]; +int m[20000]={32},L=1,I,T[500],*S=T,t=64,w,f; + +a(x) +{ + c L; + L= *m-1; + c t; + c x; + scanf("%s",s+t); + t+=strlen(s+t)+1; +} + +r(x) +{ + switch(m[x++]){ + z 5: for(w=scanf("%s",s)<1?exit(0),0:L;strcmp(s,&s[m[w+1]]);w=m[w]); + w-1 ? r(w+2) : (c 2,c atoi(s)) + z 12: I=m[m[1]--] + z 15: f=S[-f] + z 1: c x + z 9: f *=* S-- + z 7: m[f]= *S--; + f= *S-- + z 0: *++S=f; + f=m[I++] + z 8: f= *S --- f + z 2: m[++m[1]]=I; + I=x + z 11: f=0>f + z 4: *m-=2;c 2 + z 6: f=m[f] + z 10: f= *S--/f + z 3: a(1); + c 2 + z 13: putchar(f); + f= *S-- + z 14: *++S=f; + f=getchar(); + } +} + +main() +{ + a(3); + a(4); + a(1); + w= *m; + c 5; + c 2; + I= *m; + c w; + c I-1; + for(w=6;w<16;) + a(1),c w++; + m[1]= *m; + for(*m+=512;;r(m[I++])); +} diff --git a/1992/buzzard.2.design b/1992/buzzard.2.design new file mode 100644 index 000000000..49b2e2d17 --- /dev/null +++ b/1992/buzzard.2.design @@ -0,0 +1,780 @@ + FIRST & THIRD + almost FORTH + + FORTH is a language mostly familiar to users of "small" machines. +FORTH programs are small because they are interpreted--a function +call in FORTH takes two bytes. FORTH is an extendable language-- +built-in primitives are indistinguishable from user-defined +_words_. FORTH interpreters are small because much of the system +can be coded in FORTH--only a small number of primitives need to +be implemented. Some FORTH interpreters can also compile defined +words into machine code, resulting in a fast system. + + FIRST is an incredibly small language which is sufficient for +defining the language THIRD, which is mostly like FORTH. There are +some differences, and THIRD is probably just enough like FORTH for +those differences to be disturbing to regular FORTH users. + + The only existing FIRST interpreter is written in obfuscated C, +and rings in at under 800 bytes of source code, although through +deletion of whitespace and unobfuscation it can be brought to about +650 bytes. + + This document FIRST defines the FIRST environment and primitives, +with relevent design decision explanations. It secondly documents +the general strategies we will use to implement THIRD. The THIRD +section demonstrates how the complete THIRD system is built up +using FIRST. + + +Section 1: FIRST + + +Environment + + FIRST implements a virtual machine. The machine has three chunks +of memory: "main memory", "the stack", and "string storage". When +the virtual machine wishes to do random memory accesses, they come +out of main memory--it cannot access the stack or string storage. + + The stack is simply a standard LIFO data structure that is used +implicitly by most of the FIRST primitives. The stack is made up +of ints, whatever size they are on the host machine. + + String storage is used to store the names of built-in and defined +primitives. Separate storage is used for these because it allows +the C code to use C string operations, reducing C source code size. + + Main memory is a large array of ints. When we speak of +addresses, we actually mean indices into main memory. Main memory +is used for two things, primarily: the return stack and the dictionary. + + The return stack is a LIFO data structure, independent of +the abovementioned "the stack", which is used by FIRST to keep +track of function call return addresses. + + The dictionary is a list of words. Each word contains a header +and a data field. In the header is the address of the previous word, +an index into the string storage indicating where the name of this +word is stored, and a "code pointer". The code pointer is simply +an integer which names which "machine-language-primitive" implements +this instruction. For example, for defined words the code pointer +names the "run some code" primitive, which pushes the current program +counter onto the return stack and sets the counter to the address of +the data field for this word. + + There are several important pointers into main memory. There is +a pointer to the most recently defined word, which is used to start +searches back through memory when compiling words. There is a pointer +to the top of the return stack. There is a pointer to the current +end of the dictionary, used while compiling. + + For the last two pointers, namely the return stack pointer and +the dictionary pointer, there is an important distinction: the pointers +themselves are stored in main memory (in FIRST's main memory). This +is critical, because it means FIRST programs can get at them without +any further primitives needing to be defined. + + +Instructions + + There are two kinds of FIRST instructions, normal instructions and +immediate instructions. Immediate instructions do something significant +when they are used. Normal instructions compile a pointer to their +executable part onto the end of the dictionary. As we will see, this +means that by default FIRST simply compiles things. + + Integer Operations +Symbol Name Function + - binary minus pop top 2 elements of stack, subtract, push + * multiply pop top 2 elements of stack, multiply, push + / divide pop top 2 elements of stack, divide, push + <0 less than 0 pop top element of stack, push 1 if < 0 else 0 + +Note that we can synthesize addition and negation from binary minus, +but we cannot synthesize a time efficient divide or multiply from it. +<0 is synthesizable, but only nonportably. + + Memory Operations +Symbol Name Function + @ fetch pop top of stack, treat as address to push contents of + ! store top of stack is address, 2nd is value; store to memory + and pop both off the stack + + Input/Output Operations +Name Function +echo output top of stack through C's putchar() +key push C's getchar() onto top of stack +_read read a space-delimited word, find it in the + dictionary, and compile a pointer to + that word's code pointer onto the + current end of the dictionary + +Although _read could be synthesized from key, we need _read to be able +to compile words to be able to start any syntheses. + + Execution Operations +Name Function +exit leave the current function: pop the return stack + into the program counter + + Immediate (compilation) Operations +Symbol Name Function + : define read in the next space-delimited word, add it to + the end of our string storage, and generate + a header for the new word so that when it + is typed it compiles a pointer to itself + so that it can be executed. +immediate immediate when used immediately after a name following a ':', + makes the word being defined run whenever + it is typed. + +: cannot be synthesized, because we could not synthesize anything. +immediate has to be an immediate operation, so it could not be +synthesized unless by default operations were immediate; but that +would preclude our being able to do any useful compilation. + + Stack Operations +Name Function +pick pop top of stack, use as index into stack and copy up + that element + +If the data stack were stored in main memory, we could synthesize pick; +but putting the stack and stack pointer in main memory would significantly +increase the C source code size. + + There are three more primitives, but they are "internal only"-- +they have no names and no dictionary entries. The first is +"pushint". It takes the next integer out of the instruction stream +and pushes it on the stack. This could be synthesized, but probably +not without using integer constants. It is generated by _read when +the input is not a known word. The second is "compile me". When +this instruction is executed, a pointer to the word's data field is +appended to the dictionary. The third is "run me"--the word's data +field is taken to be a stream of pointers to words, and is executed. + + One last note about the environment: FIRST builds a very small +word internally that it executes as its main loop. This word calls +_read and then calls itself. Each time it calls itself, it uses +up a word on the return stack, so it will eventually trash things. +This is discussed some more in section 2. + + +Here's a handy summary of all the FIRST words: + + - * / binary integer operations on the stack + <0 is top of stack less than 0? + @ ! read from or write to memory + echo key output or input one character + _read read a word from input and compile a pointer to it + exit stop running the current function + : compile the header of a definition + immediate modify the header to create an immediate word + + Here is a sample FIRST program. I'm assuming you're using +the ASCII character set. FIRST does not depend upon ASCII, but +since FIRST has no syntax for character constants, one normally has +to use decimal values. This can be gotten around using getchar, though. +Oh. One other odd thing. FIRST initially builds its symbol table +by calling : several times, so it needs to get the names of the base +symbols as its first 13 words of input. You could even name them +differently if you wanted. + These FIRST programs have FORTH comments in them: they are contained +inside parentheses. FIRST programs cannot have FORTH comments; but I need +some device to indicate what's going on. (THIRD programs are an entirely +different subject.) + + ( Our first line gives the symbols for the built-ins ) +: immediate _read @ ! - * / <0 exit echo key _pick + + ( now we define a simple word that will print out a couple characters ) + +: L ( define a word named 'L' ) + 108 echo ( output an ascii 'l' ) + exit + +: hello ( define a word named 'hello') + 72 echo ( output an ascii 'H' ) + 101 echo ( output an ascii 'e' ) + 111 ( push ascii 'o' onto the stack ) + L L ( output two ascii 'l's ) + echo ( output the 'o' we pushed on the stack before ) + 10 echo ( print a newline ) + exit ( stop running this routine ) + +: test immediate ( define a word named 'test' that runs whenever typed ) + hello ( call hello ) + exit + +test + +( The result of running this program should be: +Hello +) + + +Section 2: Motivating THIRD + + What is missing from FIRST? There are a large number of +important primitives that aren't implemented, but which are +easy to implement. drop , which throws away the top of the +stack, can be implemented as { 0 * + } -- that is, multiply +the top of the stack by 0 (which turns the top of the stack +into a 0), and then add the top two elements of the stack. + + dup , which copies the top of the stack, can be easily +implemented using temporary storage locations. Conveniently, +FIRST leaves memory locations 3, 4, and 5 unused. So we can +implement dup by writing the top of stack into 3, and then +reading it out twice: { 3 ! 3 @ 3 @ }. + + we will never use the FIRST primitive 'pick' in building THIRD, +just to show that it can be done; 'pick' is only provided because +pick itself cannot be built out of the rest of FIRST's building +blocks. + + So, instead of worrying about stack primitives and the +like, what else is missing from FIRST? We get recursion, but +no control flow--no conditional operations. We cannot at the +moment write a looping routine which terminates. + + Another glaring dissimilarity between FIRST and FORTH is +that there is no "command mode"--you cannot be outside of a +: definition and issue some straight commands to be executed. +Also, as we noted above, we cannot do comments. + + FORTH also provides a system for defining new data types, +using the words [in one version of FORTH] . +We would like to implement these words as well. + + As the highest priority thing, we will build control flow +structures first. Once we have control structures, we can +write recursive routines that terminate, and we are ready to +tackle tasks like parsing, and the building of a command mode. + + By the way, location 0 holds the dictionary pointer, location +1 holds the return stack pointer, and location 2 should always +be 0--it's a fake dictionary entry that means "pushint". + + +Section 3: Building THIRD + + In this section, I'm going to keep my conversation + indented to this depth, rather than using fake comments-- + because we'll have real comments eventually. + + The first thing we have to do is give the symbols for our + built-ins. + +: immediate _read @ ! - * / < exit echo key _pick + + Next we want to be mildly self commenting, so we define + the word 'r' to push the *address of the return stack + pointer* onto the stack--NOT the value of the return + stack pointer. (In fact, when we run r, the value of + the return stack pointer is temporarily changed.) + +: r 1 exit + + Next, we're currently executing a short loop that contains + _read and recursion, which is slowly blowing up the return + stack. So let's define a new word, from which you can + never return. What it does is drops the top value off + the return stack, calls _read, then calls itself. Because + it kills the top of the return stack, it can recurse + indefinitely. + +: ] + r @ Get the value of the return stack pointer + 1 - Subtract one + r ! Store it back into the return stack pointer + _read Read and compile one word + ] Start over + + Notice that we don't need to exit, since we never come + back. Also, it's possible that an immediate word may + get run during _read, and that _read will never return! + + Now let's get compile running. + +: main immediate ] +main + + Next off, I'm going to do this the easy but non-portable + way, and put some character constant definitions in. + I wanted them at the top of the file, but that would have + burned too much of the return stack. + +: '"' 34 exit +: ')' 41 exit +: '\n' 10 exit +: 'space' 32 exit +: '0' 48 exit +: '-' 45 exit + +: cr '\n' echo exit + + Next, we want to define some temporary variables for + locations 3, 4, and 5, since this'll make our code look + clearer. +: _x 3 @ exit +: _x! 3 ! exit +: _y 4 @ exit +: _y! 4 ! exit + + Ok. Now, we want to make THIRD look vaguely like FORTH, + so we're going to define ';'. What ; ought to do is + terminate a compilation, and turn control over to the + command-mode handler. We don't have one, so all we want + ';' to do for now is compile 'exit' at the end of the + current word. To do this we'll need several other words. + + Swap by writing out the top two elements into temps, and + then reading them back in the other order. +: swap _x! _y! _x _y exit + Take another look and make sure you see why that works, + since it LOOKS like I'm reading them back in the same + order--in fact, it not only looks like it, but I AM! + + Addition might be nice to have. To add, we need to + negate the top element of the stack, and then subtract. + To negate, we subtract from 0. +: + + 0 swap - + - + exit + + Create a copy of the top of stack +: dup _x! _x _x exit + + Get a mnemonic name for our dictionary pointer--we need + to compile stuff, so it goes through this. +: h 0 exit + + We're going to need to advance that pointer, so let's + make a generic pointer-advancing function. + Given a pointer to a memory location, increment the value + at that memory location. +: inc + dup @ Get another copy of the address, and get the value + so now we have value, address on top of stack. + 1 + Add one to the value + swap Swap to put the address on top of the stack + ! exit Write it to memory + + , is a standard FORTH word. It should write the top of + stack into the dictionary, and advance the pointer +: , + h @ Get the value of the dictionary pointer + ! Write the top of stack there + h inc And increment the dictionary pointer + exit + + ' is a standard FORTH word. It should push the address + of the word that follows it onto the stack. We could + do this by making ' immediate, but then it'd need to + parse the next word. Instead, we compile the next word + as normal. When ' is executed, the top of the return + stack will point into the instruction stream immediately + after the ' . We push the word there, and advance the + return stack pointer so that we don't execute it. +: ' + r @ Get the address of the top of return stack + We currently have a pointer to the top of return stack + @ Get the value from there + We currently have a pointer to the instruction stream + dup Get another copy of it--the bottom copy will stick + around until the end of this word + 1 + Increment the pointer, pointing to the NEXT instruction + r @ ! Write it back onto the top of the return stack + We currently have our first copy of the old pointer + to the instruction stream + @ Get the value there--the address of the "next word" + exit + + Now we're set. ; should be an immediate word that pushes + the address of exit onto the stack, then writes it out. +: ; immediate + ' exit Get the address of exit + , Compile it + exit And we should return + + Now let's test out ; by defining a useful word: +: drop 0 * + ; + + Since we have 'inc', we ought to make 'dec': +: dec dup @ 1 - swap ! ; + + Our next goal, now that we have ;, is to implement + if-then. To do this, we'll need to play fast and + loose with the return stack, so let's make some + words to save us some effort. + + First we want a word that pops off the top of the normal + stack and pushes it on top of the return stack. We'll + call this 'tor', for TO-Return-stack. It sounds easy, + but when tor is running, there's an extra value on the + return stack--tor's return address! So we have to pop + that off first... We better just bite the bullet and + code it out--but we can't really break it into smaller + words, because that'll trash the return stack. +: tor + r @ @ Get the value off the top of the return stack + swap Bring the value to be pushed to the top of stack + r @ ! Write it over the current top of return stack + r @ 1 + r ! Increment the return stack pointer--but can't use inc + r @ ! Store our return address back on the return stack +; + + Next we want the opposite routine, which pops the top + of the return stack, and puts it on the normal stack. +: fromr + r @ @ Save old value + r @ 1 - r ! Decrement pointer + r @ @ Get value that we want off + swap Bring return address to top + r @ ! Store it and return +; + + Now, if we have a routine that's recursing, and we + want to be polite about the return stack, right before + we recurse we can run { fromr drop } so the stack won't + blow up. This means, though, that the first time we + enter this recursive routine, we blow our *real* return + address--so when we're done, we'll return up two levels. + To save a little, we make 'tail' mean { fromr drop }; + however, it's more complex since there's a new value on + top of the return stack. +: tail fromr fromr drop tor ; + + Now, we want to do 'if'. To do this, we need to convert + values to boolean values. The next few words set this + up. + + minus gives us unary negation. +: minus 0 swap - ; + + If top of stack is boolean, bnot gives us inverse +: bnot 1 swap - ; + + To compare two numbers, subtract and compare to 0. +: < - <0 ; + + logical turns the top of stack into either 0 or 1. +: logical + dup Get two copies of it + 0 < 1 if < 0, 0 otherwise + swap minus Swap number back up, and take negative + 0 < 1 if original was > 0, 0 otherwise + + Add them up--has to be 0 or 1! +; + + not returns 1 if top of stack is 0, and 0 otherwise +: not logical bnot ; + + We can test equality by subtracting and comparing to 0. +: = - not ; + + Just to show how you compute a branch: Suppose you've + compiled a call to branch, and immediately after it is + an integer constant with the offset of how far to branch. + To branch, we use the return stack to read the offset, and + add that on to the top of the return stack, and return. +: branch + r @ Address of top of return stack + @ Our return address + @ Value from there: the branch offset + r @ @ Our return address again + + The address we want to execute at + r @ ! Store it back onto the return stack +; + + For conditional branches, we want to branch by a certain + amount if true, otherwise we want to skip over the branch + offset constant--that is, branch by one. Assuming that + the top of the stack is the branch offset, and the second + on the stack is 1 if we should branch, and 0 if not, the + following computes the correct branch offset. +: computebranch 1 - * 1 + ; + + Branch if the value on top of the stack is 0. +: notbranch + not + r @ @ @ Get the branch offset + computebranch Adjust as necessary + r @ @ + Calculate the new address + r @ ! Store it +; + + here is a standard FORTH word which returns a pointer to + the current dictionary address--that is, the value of + the dictionary pointer. +: here h @ ; + + We're ALL SET to compile if...else...then constructs! + Here's what we do. When we get 'if', we compile a call + to notbranch, and then compile a dummy offset, because + we don't know where the 'then' will be. On the *stack* + we leave the address where we compiled the dummy offset. + 'then' will calculate the offset and fill it in for us. +: if immediate + ' notbranch , Compile notbranch + here Save the current dictionary address + 0 , Compile a dummy value +; + + then expects the address to fixup to be on the stack. +: then immediate + dup Make another copy of the address + here Find the current location, where to branch to + swap - Calculate the difference between them + swap ! Bring the address to the top, and store it. +; + + Now that we can do if...then statements, we can do + some parsing! Let's introduce real FORTH comments. + find-) will scan the input until it finds a ), and + exit. +: find-) + key Read in a character + ')' = Compare it to close parentheses + not if If it's not equal + tail find-) repeat (popping R stack) + then Otherwise branch here and exit +; + +: ( immediate + find-) +; + +( we should be able to do FORTH-style comments now ) + +( now that we've got comments, we can comment the rest of the code + in a legitimate [self parsing] fashion. Note that you can't + nest parentheses... ) + +: else immediate + ' branch , ( compile a definite branch ) + here ( push the backpatching address ) + 0 , ( compile a dummy offset for branch ) + swap ( bring old backpatch address to top ) + dup here swap - ( calculate the offset from old address ) + swap ! ( put the address on top and store it ) +; + +: over _x! _y! _y _x _y ; + +: add + _x! ( save the pointer in a temp variable ) + _x @ ( get the value pointed to ) + + ( add the incremement from on top of the stack ) + _x ! ( and save it ) +; + +: allot h add ; + +: maybebranch + logical ( force the TOS to be 0 or 1 ) + r @ @ @ ( load the branch offset ) + computebranch ( calculate the condition offset [either TOS or 1]) + r @ @ + ( add it to the return address ) + r @ ! ( store it to our return address and return ) +; + +: mod _x! _y! ( get x then y off of stack ) + _y _y _x / _x * ( y - y / x * x ) + - +; + +: printnum + dup + 10 mod '0' + + swap 10 / dup + if + printnum + echo + else + drop + echo + then +; + +: . + dup 0 < + if + '-' echo minus + then + printnum + 'space' echo +; + +: debugprint dup . cr ; + +( the following routine takes a pointer to a string, and prints it, + except for the trailing quote. returns a pointer to the next word + after the trailing quote ) + +: _print + dup 1 + + swap @ + dup '"' = + if + drop exit + then + echo + tail _print +; + +: print _print ; + + ( print the next thing from the instruction stream ) +: immprint + r @ @ + print + r @ ! +; + +: find-" + key dup , + '"' = + if + exit + then + tail find-" +; + +: " immediate + key drop + ' immprint , + find-" +; + +: do immediate + ' swap , ( compile 'swap' to swap the limit and start ) + ' tor , ( compile to push the limit onto the return stack ) + ' tor , ( compile to push the start on the return stack ) + here ( save this address so we can branch back to it ) +; + +: i r @ 1 - @ ; +: j r @ 3 - @ ; + +: > swap < ; +: <= 1 + < ; +: >= swap <= ; + +: inci + r @ 1 - ( get the pointer to i ) + inc ( add one to it ) + r @ 1 - @ ( find the value again ) + r @ 2 - @ ( find the limit value ) + <= + if + r @ @ @ r @ @ + r @ ! exit ( branch ) + then + fromr 1 + + fromr drop + fromr drop + tor +; + +: loop immediate ' inci @ here - , ; + +: loopexit + + fromr drop ( pop off our return address ) + fromr drop ( pop off i ) + fromr drop ( pop off the limit of i ) +; ( and return to the caller's caller routine ) + +: execute + 8 ! + ' exit 9 ! + 8 tor +; + +: :: ; ( :: is going to be a word that does ':' at runtime ) + +: fix-:: immediate 3 ' :: ! ; +fix-:: + + ( Override old definition of ':' with a new one that invokes ] ) +: : immediate :: ] ; + +: command + here 5 ! ( store dict pointer in temp variable ) + _read ( compile a word ) + ( if we get control back: ) + here 5 @ + = if + tail command ( we didn't compile anything ) + then + here 1 - h ! ( decrement the dictionary pointer ) + here 5 @ ( get the original value ) + = if + here @ ( get the word that was compiled ) + execute ( and run it ) + else + here @ ( else it was an integer constant, so push it ) + here 1 - h ! ( and decrement the dictionary pointer again ) + then + tail command +; + +: make-immediate ( make a word just compiled immediate ) + here 1 - ( back up a word in the dictionary ) + dup dup ( save the pointer to here ) + h ! ( store as the current dictionary pointer ) + @ ( get the run-time code pointer ) + swap ( get the dict pointer again ) + 1 - ( point to the compile-time code pointer ) + ! ( write run-time code pointer on compile-time pointer ) +; + +: ) + ' , , ( compile a push that address onto dictionary ) +; + +: does> immediate + ' command , ( jump back into command mode at runtime ) + here swap ! ( backpatch the build> to point to here ) + 2 , ( compile run-code primitive so we look like a word ) + ' fromr , ( compile fromr, which leaves var address on stack ) +; + + +: _dump ( dump out the definition of a word, sort of ) + dup " (" . " , " + dup @ ( save the pointer and get the contents ) + dup ' exit + = if + " ;)" cr exit + then + . " ), " + 1 + + tail _dump +; + +: dump _dump ; + +: # . cr ; + +: var ; +: constant @ ; +: array + ; + +: [ immediate command ; +: _welcome " Welcome to THIRD. +Ok. +" ; + +: ; immediate ' exit , command exit + +[ + +_welcome + diff --git a/1992/buzzard.2.hint b/1992/buzzard.2.hint new file mode 100644 index 000000000..b0fe22b04 --- /dev/null +++ b/1992/buzzard.2.hint @@ -0,0 +1,217 @@ +Best Language Tool: + + Sean Barrett + Software Construction Company + 430 Southwest Parkway, #1906 + College Station, TX 77840 + USA + + +Judges' comments: + + First: + make first + + Second: + echo help | cat third help.th - | first + cat third demo5.th | first + + Third: + cat third help.th - | first + + Wait until Ok is printed and the type: + 2 3 + . cr <-- yes you should really type the 2 letters: cr + + Forth: + Sorry, this is third! + + +Selected notes from the author: + + What it does: + + first implements a relatively primitive stack machine. How + primitive? It supplies 13 visible primitives: 3 arithmetic, + 1 comparison, 2 memory-access, 2 character I/O, 3 primitives + for defining new words, 1 tokenizing, and 1 special stack + operation. (There are also three internal operations for + the stack machine: 'push this integer', 'call this code', + and 'compile a call to this code'.) + + It is very difficult to accomplish anything with this set + of primitives, but they do have an interesting property. + + This--what this interesting property is, or in other words + what first is good for--is the major obfuscation; there are + also minor source obfuscations, as well as some design tricks + that are effectively obfuscations. Details on the obfuscations + are below, and the interesting property is discussed much + further down. + + + How to run it: + + first expects you to first enter the names of the 13 primitives, + separated by whitespace--it doesn't care what you name them, but + if all the names aren't unique, you won't be able to use some of + them. After this you may type any sequence of valid first input. + Valid first input is defined as any sequence of whitespace-delimited + tokens which consist of primitives, new words you've defined, and + integers (as parsed by "%d"). Invalid input behaves unpredictably, + but gives no warning messages. A sample program, demo1.1st, is + included, but it only works on ASCII systems. + + Do not expect to be able to do anything interesting with first. + + To do something interesting, you need to feed first the file + third first. In unix, you can do + + % cat third help.th - | first + + to do this. Hopefully most operating systems will provide a + way to do this. It may take some time for this to complete + (I seem to remember it taking several minutes on an 8086 PC); + THIRD will prompt you when it is finished. The file third has + not been obfuscated, due to sheer kindness on the author's part. + + For more information on what you can do once you've piped + THIRD into first, type 'help' and consult FORTH manuals for + further reference. Six sample THIRD programs are included + in the files demo[1-6].th. buzzard.2.README has more + information. + + Keep in mind that you are still running first, and + are for the most part limited by first's tokenizer + (notably, unknown words will attempt to be parsed as + integers.) It is possible to build a new parser that + parses by hand, reading a single character at a time; + however, such a parser cannot easily use the existing + dictionary, and so would have to implement its own, + thus requiring reimplementing all of first and third + a second time--I did not care to tackle this project. + + + Compiling: + + first is reasonably portable. You may need to adjust the + size of the buffers on smaller machines; m[] needs to be + at least 2000 long, though. + + I say first is portable mainly because it uses native types. + Unlike FORTH, which traditionally allows byte and multi-byte + operations, all operations are performed on C 'int's. That + means first code is only as portable as the same code would + be in C. As in C, the result of dividing -1 by 2 is machine + (or rather compiler) dependent. + + How is first obfuscated? + + first is obfuscated in several ways. Some minor obfuscations + like &w[&m[1]][s] for s+m[w+1] were in the original source + but are no longer because, apparently, ANSI doesn't allow it + (gcc -ansi -pedantic doesn't mind it, though.) + Other related obfuscations are still present. The top of the + stack is cached in a variable, which increases performance + massively if the compiler can figure out to keep it in a register; + it also obfuscates the code. (Unfortunately, the top of stack + is a global variable and neither gcc nor most bundled compilers + seem to register allocate it.) + + More significant are the design obfuscations. m[0] is the + "dictionary pointer", used when compiling words, and m[1] is + the return stack index. Both are used as integer offsets into + m. Both are kept in m, instead of as separate pointers, + because they are then accessible to first programs, which is a + crucial property of first. Similarly the way words are stored + in the dictionary is not obvious, so it can be difficult to + follow exactly what the compiler words are doing. + + Assuming you've waded through all that, you still have + to penetrate the most significant obfuscation. Traditionally, + the question is whether a reader can answer the question "what + will this do when I run it". A reader who has deciphered first + to this point may think they know the answer to this question, + but they may not know the answer to the more important question, + "what will this program do when given the right input?" FORTH + afficianados, and especially FORTH implementors, may recognize + the similarity of the internal compiler format to many FORTH + interal representations, and, being aware that FORTH interpreters + can often by self-compiling, may be suspicious that this program + can compile FORTH, or a significant subset of it, or at least be + capable of doing so if fed the right input. Of course, the name + "THIRD" should be a dead giveaway, if the name "first" wasn't. + (These numbers were largely chosed because they were five letters + long, like "FORTH", and would not require truncation to five + letters, which would be a dead giveaway. Besides, THIRD represents + a step backwards, in more ways than one.) + + + What exactly is first, then? + + first is a tiny interpreter which implements a sufficient + pseudo-subset of FORTH to allow it to bootstrap a relatively + complete version of FORTH (based loosely on forth79), which + I call THIRD. Complete relative to what, I'm not sure. + + I believe first is close to the smallest amount of code possible + to get this effect *using forth-style primitives*, and still have + some efficiency (it is possible to get by without multiplication + if you have addition, obviously). In the design file, design, + I give a justification for why each primitive in first was included. + + THIRD is sorta slow, because first has so few primitives that + many things that are primitives in FORTH (like swap) take a + significant amount of time in THIRD. + + When you get the 'Ok.' message from third, try out some sample + FORTH code (first has no way of knowing if keyboard input is + waiting, so it can't actually prompt you in a normal way. It + only prints 'Ok.' after you define a word). + + 2 3 + . cr ( add 2 and 3, and print it and a newline.) + + and THIRD responds + + 5 + + Now try: + + : test 11 1 do i . loop cr ; + test + + and THIRD responds + + 1 2 3 4 5 6 7 8 9 10 + + + When in THIRD, you can see how much space you're currently + using by typing + + here . + + The number THIRD replies is the number of machine words (ints) + that the dictionary (the first code) takes up, plus the + 512 ints for the return stack. If you compile the basic + THIRD system without the help word (strings take up one + int per character in the string!), you should find that + you're using around 1000 ints (plus the return stack). + + Thus THIRD gives you a relatively complete FORTH system in + less than 700 chars of C source + about 1000 ints of + memory--and it's portable too (you could copy over the + THIRD memory dump to another machine, in theory). If the + above numbers seem to you to be mixing apples and oranges + (C source and compiled THIRD code), note that you should + in theory be able to stick the compiled THIRD code into + the C source. + + + Software Construction Company gets credit for rekindling + my interest in FORTH and thus indirectly inspiring me + to write this program. + +Copyright (c) 1992, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1992/buzzard.2.orig.c b/1992/buzzard.2.orig.c new file mode 100644 index 000000000..7f77ab117 --- /dev/null +++ b/1992/buzzard.2.orig.c @@ -0,0 +1,61 @@ +#define c 0 [m] ++ [m] = +#define z;break;case + +char s[5000]; +int m[20000]={32},L=1,I,T[500],*S=T,t=64,w,f; + +a(x) +{ + c L; + L= *m-1; + c t; + c x; + scanf("%s",s+t); + t+=strlen(s+t)+1; +} + +r(x) +{ + switch(x++[m]){ + z 5: for(w=scanf("%s",s)<1?exit(0):L;strcmp(s,&w[&m[1]][s]);w=m[w]); + w-1 ? r(w+2) : (c 2,c atoi(s)) + z 12: I=1[m]--[m] + z 15: f=S[-f] + z 1: c x + z 9: f *=* S-- + z 7: m[f]= *S--; + f= *S-- + z 0: *++S=f; + f=I++[m] + z 8: f= *S --- f + z 2: m[++1[m]]=I; + I=x + z 11: f=0>f + z 4: *m-=2;c 2 + z 6: f=f[m] + z 10: f= *S--/f + z 3: a(1); + c 2 + z 13: putchar(f); + f= *S-- + z 14: *++S=f; + f=getchar(); + } +} + +main() +{ + a(3); + a(4); + a(1); + w= *m; + c 5; + c 2; + I= *m; + c w; + c I-1; + for(w=6;w<16;) + a(1),c w++; + m[1]= *m; + for(*m+=512;;r(m[I++])); +} diff --git a/1992/demo1.1st b/1992/demo1.1st new file mode 100644 index 000000000..b83696714 --- /dev/null +++ b/1992/demo1.1st @@ -0,0 +1,12 @@ +: immediate _read @ ! - * / <0 exit echo key _pick + +: show echo echo echo echo exit +: all show show show show echo exit + +: doit immediate + 10 33 100 108 114 111 87 + 32 111 108 108 101 72 + all +exit + +doit diff --git a/1992/demo1.th b/1992/demo1.th new file mode 100644 index 000000000..99d22bda4 --- /dev/null +++ b/1992/demo1.th @@ -0,0 +1,4 @@ +: demo1 " Hello world! +" ; + +demo1 diff --git a/1992/demo2.th b/1992/demo2.th new file mode 100644 index 000000000..8bf8eee17 --- /dev/null +++ b/1992/demo2.th @@ -0,0 +1,10 @@ +: demo2 + + 10 0 ( iterate from 0 stopping before 10 ) + do + i . ( print the loop counter ) + loop + cr ( add a newline ) +; + +demo2 diff --git a/1992/demo3.th b/1992/demo3.th new file mode 100644 index 000000000..c061b7407 --- /dev/null +++ b/1992/demo3.th @@ -0,0 +1,15 @@ +: printfour + + dup ( save the number on top of the stack ) + 4 = ( compare it to four ) + if + " forth " ( output a string for it ) + drop ( and delete the saved value ) + else + . + endif +; + +: demo3 10 0 do i printfour loop cr ; + +demo3 diff --git a/1992/demo4.th b/1992/demo4.th new file mode 100644 index 000000000..3f9a76dfa --- /dev/null +++ b/1992/demo4.th @@ -0,0 +1,30 @@ +( compute factorial recursively ) +( take x as input, return x! and x as output ) + +: fact-help + + dup if + 1 - ( leave x-1 on top ) + fact-help ( leave x-1, [x-1]! ) + 1 + ( leave x, [x-1]!, x ) + swap over swap ( leave [x-1]!, x, x ) + * ( into x!, x ) + swap ( into x, x! ) + else + 1 swap + then +; + +: fact + + fact-help + drop + +; + +: demo4 + " 4 factorial is: " 4 fact . cr + " 6 factorial is: " 6 fact . cr +; + +demo4 diff --git a/1992/demo5.th b/1992/demo5.th new file mode 100644 index 000000000..d16ca1e00 --- /dev/null +++ b/1992/demo5.th @@ -0,0 +1,27 @@ +( recursive factorial. given x on top, followed by ) +( an "accumulator" containing the product except for x! ) + +: fact-help2 + + dup if + swap over swap + * + swap 1 - + fact-help2 + then +; + +: fact + + 1 swap + fact-help2 + drop +; + +: demo5 + + " The factorial of 3 is: " 3 fact . cr + " The factorial of 5 is: " 5 fact . cr +; + +demo5 diff --git a/1992/demo6.th b/1992/demo6.th new file mode 100644 index 000000000..75ec66784 --- /dev/null +++ b/1992/demo6.th @@ -0,0 +1,18 @@ +: foobar + 2 + [ 2 , ( '[' turns the compiler off, allowing us to execute code ) + 1 1 1 + + , ( and we compile in-line a 2 and a three ) + ( the '2' means 'push the number following this' ) + ] + + . cr +; + +foobar + +: 'foobar ' foobar ; ( ' can only be run inside the compiler ) + ( ' leaves the address of the following word + on the stack ) + +'foobar . cr + +'foobar dump diff --git a/1992/gson.c b/1992/gson.c new file mode 100644 index 000000000..c92e30730 --- /dev/null +++ b/1992/gson.c @@ -0,0 +1,45 @@ +#include + +long a +[4],b[ +4],c[4] +,d[0400],e=1; +typedef struct f{long g +,h,i[4] ,j;struct f*k;}f;f g,* +l[4096 ]; char h[256],*m,k=3; + long n (o, p,q)long*o,*p,*q;{ + long r =4,s,i=0;for(;r--;s=i^ + *o^*p, i=i&*p|(i|*p)&~*o++,*q + ++=s,p ++);return i;}t(i,p)long*p + ;{*c=d [i],n(a,c,b),n(p,b,p);}u(j)f*j;{j->h + =(j->g =j->i[0]|j->i[1]|j->i[2]|j->i[3])&4095;}v( +j,s)f* j; {int i; for(j->k->k&&v(j->k, ' '),fseek( +stdin, j->j, 0);i=getchar(),putchar(i-'\n'?i:s),i- +'\n';);}w(o,r,j,x,p)f*o,*j;long p;{f q;int +s,i=o->h;q.k=o;r>i?j=l[r=i]:r>1, s|=s +>>2,s|=s>>4,s +|=s>>8 +,j=l[r +=((r&i + |s)&~(s>>1))-1&i]):0;--x;for + (;x&&!(p&i);p>>=1);for(;!x&&j;n(o->i,j->i,q. + i),u(&q),q.g||(q.j=j->j,v(&q,'\n')),j=j->k);for(;x;j=x + ?j->k:0){for(;!j&&((r=(r&i)-1&i)-i&&(r&p)?2:(x=0));j=l[r]);! + x||(j->g&~o->g)||n (o->i,j->i,q.i)||( + u(&q), q.j=j ->j,q.g?w(&q + ,r,j->k,x ,p):v(&q, + '\n')); }}y(){f + j;char *z,*p; +for(;m ? j.j= +ftell( stdin) +,7,(m= gets(m ))||w( +&g,315 *13,l[ 4095] + ,k,64* 64)&0: 0;n(g + .i,j.i, b)||(u (&j),j. + k=l[j.h],l[j.h]= &j,y())){for(z= p=h;*z&&( + d[*z++]||(p=0)););for(z=p?n(j.i ,j.i,j.i)+h:""; + *z;t(*z++,j.i));}}main(o,p)char** p; {for(;m = *++p;)for(;*m- +'-'?*m:(k= -atoi(m))&0;d[*m]||(d[*m ]=e,e<<=1),t(*m++,g.i)); u(& + g),m=h + ,y();} diff --git a/1992/gson.hint b/1992/gson.hint new file mode 100644 index 000000000..5063e39c8 --- /dev/null +++ b/1992/gson.hint @@ -0,0 +1,235 @@ +Most Humorous Output: + + Andreas Gustafsson + Helsinki University of Technology + Arentikuja 1 D 305 (home address) + 00410 Helsinki + FINLAND + + +Judges' comments: + + To make: + make ag + + Determine where your system dictionary is located. You may find + it located in one of the following places: + + /usr/dict/words + /usr/share/lib/spell/words + /usr/ucblib/dict/words + /dev/null <-- for machines with nothing to say + + Then using the proper dictionary: + + ag free software foundation < /usr/dict/words + ag obfuscated c contest < /usr/dict/words + ag unix international < /usr/dict/words + ag george bush < /usr/dict/words + ag bill clinton < /usr/dict/words + ag ross perot < /usr/dict/words + ag paul e tsongas < /usr/dict/words + + Recently some newspapers printed amusing anagrams of one of the + names listed above. Run this program to find the anagrams they + weren't allowed to print! + + +Selected notes from the author: + + The name of the game: + + AG is short for either Anagram Generator or simply AnaGram. + It might also be construed to mean Alphabet Game, and by pure + coincidence it happens to be the author's initials. + + + What it does: + + AG takes one or more words as arguments, and tries to find + anagrams of those words, i.e. words or sentences containing + exactly the same letters. + + + How to use it: + + To run AG, you need a dictionary file consisting of distinct words + in the natural language of your choice, one word on each line. If + your machine doesn't have one already, you can make your own + dictionary by concatenating a few hundred of your favourite Usenet + articles and piping them through the following obfuscated shell + script: + + #!/bin/sh + z=a-z];tr [A-Z\] \[$z|sed s/[\^$z[\^$z*/_/g|tr _ \\012|grep ..|sort -u + + Using articles from alt.folklore.computers is likely to make + a more professional-looking dictionary than rec.arts.erotica. + + AG must be run with the dictionary file as standard input. + + Because anagrams consisting of just a few words are generally more + meaningful than those consisting of dozens of very short words, the + number of words in the anagrams is limited to 3 by default. This + limit can be changed using a numeric command line option, as in + "ag -4 international obfuscated c code contest 6]U('1O(&QO;VLA"@I4:&%T('1H870@:7,L(&ES+@I4 +M:&%T('1H870@:7,@;F]T+`H@("`@:7,@;F]T('1H870@=&AA="!N;W0@:7,N +M"E1H870@:7,L('1H870@=&AA="!IW!R:6YT9B@B2&5L;&\L('=O special_build + sh < special_build + + * Assume that we will use the entry title. Send us a version of + your build/program files that uses the name convention. You + should uuencode these files in ---data--- sections. + + If your entry needs to modify its source, info or binary files, + please say so in the ---remark--- section. You should try to avoid + touching your original build, source and binary files. You should + arrange to make copies of the files you intend to modify. This + will allow people to re-generate your entry from scratch. + + Remember that your entry may be built without a build file. We + typically incorporate the build lines into a Makefile. If the + build file must exist, say so in the ---remark--- section. + + If your entry needs special info files, you should uuencode them + into ---info--- sections. In the case of multiple info files, + use multiple ---info--- sections. If no info files are needed, + then skip the ---info--- section. + + Info files are intended to be input, or detailed information that + does not fit well into the ---remark--- section. For example, an + entry that implements a compiler might want to provide some sample + programs for the user to compile. An entry might want to include a + lengthly design document, that might not be appropriate for a + 'hints' file. + + Info files should be used only to supplement your entry. For + example, info files may provide sample input or detailed + information about your entry. Because they are supplemental, + the entry should not require them exist. + + In some cases, your info files might be renamed to avoid name + conflicts. If info files should not be renamed for some reason, + say so in the ---remark--- section. + + Info files must uudecode into the current directory. If they + absolutely must be renamed, or moved into a sub-directory, say + so in the ---remark--- section. + + +JUDGING PROCESS: + + Entries are judged by Larry Bassel and Landon Curt Noll. + + Entries are unpacked into individual directories. The Email message + is unpacked into individual files, each containing: + + ---entry--- section + all ---author--- sections + all ---info--- sections + ---build--- section + ---program--- section + any other text, including the Email message headers + + Prior to judging, the 'any other text' file is scanned to be sure + it does not contain useful information (or in case the entry was + malformed and did not unpack correctly). Information from the + ---author--- sections are not read until the judging process is + complete, and then only from entries that have won an award. + + The above process helps keep us biased for/against any one particular + individual. We are usually kept in the dark as much as you are + until the final awards are given. We like the surprise of finding + out in the end, who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. (for the curious, + we do indicate the volume of paper consumed when presenting the IOCCC + winners at talks) + + After the Usenix announcement, we attempt to send Email to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes, typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the ---entry--- section + * reading the uudecoded ---build--- section + * reading the uudecoded ---program--- section + * reading the uudecoded ---info--- section(s), if any + * passing the source thru the C pre-processor + shipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + shipping over any #include files + + In later rounds, other actions are performed: + + * linting the source + * compiling/building the source + * running the program + * performing misc tests on the source and binary + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry often will compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code + * best X client (see OUR LIKES AND DISLIKES) + * best abuse of ANSI C + * worst abuse of the rules + * + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to 8 or 10 + winners. Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an entry that failed to win on a + previous year. There have been winners that lost in a previous + year. Of course, in those cases, improving on the entry made + the difference! + + More often that not, we select a small entry (usually one line), a + strange/creative layout entry, and an entry that abuses the contest + rules in some way. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entry. More often, the + 'best' is picked because it does well in a number of categories. + + +ANNOUNCEMENT OF WINNERS: + + The first announcement, occurs at a Summer Usenix conference. By + tradition, this is done during the latter part of the UUNET/IOCCC BOF. + + Winning entries will be posted in late July/Aug to the following groups: + + comp.lang.c comp.unix.wizards alt.sources + + In addition, pointers to these postings are posted to the following + + comp.sources.d alt.sources.d misc.misc + comp.sources.misc + + Winning entries will be deposited into the uunet archives. See + below for details. + + Often, winning entries are published in magazines such as "The C Users + Journal". Winners have appeared in books ("The New Hackers Dictionary") + and on various T-Shirts. + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending Email to the following address: + + ...!{apple,pyramid,sun,uunet}!hoptoad!judges (not the address for + judges@toad.com submitting entries) + + Questions and comments about the contest are welcome. + + One may obtain a copy of the current rules, guidelines or mkentry + program may be obtained from the judges using the Email address above. + + See the official IOCCC web site: + + http://www.ioccc.org + + for more updated information. + + +chongo /\cc/\ {chongo,noll}@{toad,sgi}.com +Larry Bassel {uunet,ucbvax,cbosgd}|sun!lab diff --git a/1992/help.th b/1992/help.th new file mode 100644 index 000000000..7afab271a --- /dev/null +++ b/1992/help.th @@ -0,0 +1,54 @@ +: help key ( flush the carriage return form the input buffer ) + +" The following are the standard known words; words marked with (*) are +immediate words, which cannot be used from command mode, but only in +word definitions. Words marked by (**) declare new words, so are always +followed by the new word. + + ! @ fetch, store + + - * / mod standard arithmetic operations + = < > <= >= standard comparison operations + + not boolean not of top of stack + logical turn top of stack into 0 or 1 + + dup over duplicate the top of stack or second of stack + swap drop reverse top two elements or drop topmost + + inc dec increment/decrement the value at address from stack + add add a value from 2nd of stack into address from top + + echo key output character from, or input to, top of stack + . # print out number on top of stack without/with cr + cr print a carriage return + +[more]" key +" (**) var declare variable with initial value taken from stack +(**) constant declare constant with initial value taken from stack +(**) array declare an array with size taken from stack + +(*) if...else...then FORTH branching construct +(*) do...loop FORTH looping construct + i j loop values (not variables) + + print print the string pointed to on screen + +(*)(**) : declare a new THIRD word +(*) declare a data types compile-time and run-time +(*) ; terminate a word definition + +[more]" key +" Advanced words: + here current location in dictionary + h pointer into dictionary + r pointer to return stack + fromr tor pop a value from or to the return stack + + , write the top of stack to dictionary + ' store the address of the following word on the stack + allot leave space on the dictionary + + :: compile a ':' header + [ switch into command mode + ] continue doing : definitions +" ; diff --git a/1992/imc.c b/1992/imc.c new file mode 100644 index 000000000..b049f2c5a --- /dev/null +++ b/1992/imc.c @@ -0,0 +1,55 @@ +#include +#include +#define ext(a) (exit(a),0) +#define I " .:\';+++q&&L(v[q],O,&B)!=1&&--q +#define F(U,S,C,A) t=0,*++J&&(t=L(J,U,&C,&A)),(!t&&c>++q&&!(t=L(v[q],U,\ + &C,&A)))?--q:(t<2&&c>++q&&!(t=L(v[q],S,&A))&&--q +#define T(E) (s("%d",E),E||(fputs(n,i),r)) +#define d(C,c) (F("%lg,%lg","%lg",C,c))) +#define O (F("%d,%d","%d",N,U),(N&&U)||(fputs(n,i),r))) +#define D (s("%lg",f)) +#define E putc + C + G=0, + R + =0,Q,H + ,M,P,z,S + =0,x=0 + , f=0;l b,j=0, k + =128,K=1,V,B=0,Y,m=128,p=0,N + =768,U=768,h[]={0x59A66A95,256 + ,192,1,6912,1,0,0},t,A=0,W=0,Z=63,X=23 + ;o*J,_;main(c,v)l c;o**v;{l q=1;for(;;q< + c ?(((J=v[q])[0]&&J[0]<48&&J++,((_= *J)<99|| + _/2== '2'||(_-1)/3=='\"'||_==107||_/05*2==','||_ + >0x074)?( fprintf(i,a,v[q]),r):_>0152?(_/4>27?(_&1?( + O,Z=N,X=U): (W++,N=Z,U=X)):_&1?T(K):T(k)):_>103?(d(G, + R ),j=1):_&1? d(S,x):D,q++),q--,main(c-q,v+q)):A==0?(A= + 1,f||(f=N/4.),b=(((N-1)&017)<8),q=(((N+7)>>3)+b)*U,(J=malloc(q) + )||(perror("malloc"),r),S-=(N/2)/f,x+=(U/2)/f):A==1?(B>=1)||/*/ + (m=128,u--),A==6?ext(1):B screen1.ras + imc -s512,512 -j-.523,-.535 > screen2.ras + +Copyright (c) 1992, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1992/imc.orig.c b/1992/imc.orig.c new file mode 100644 index 000000000..f85f23212 --- /dev/null +++ b/1992/imc.orig.c @@ -0,0 +1,54 @@ +#include +#include +#define I " .:\';+++q&&L(v[q],O,&B)!=1&&--q +#define F(U,S,C,A) t=0,*++J&&(t=L(J,U,&C,&A)),(!t&&c>++q&&!(t=L(v[q],U,\ + &C,&A)))?--q:(t<2&&c>++q&&!(t=L(v[q],S,&A))&&--q +#define T(E) (s("%d",E),E||(fputs(n,i),r)) +#define d(C,c) (F("%lg,%lg","%lg",C,c))) +#define O (F("%d,%d","%d",N,U),(N&&U)||(fputs(n,i),r))) +#define D (s("%lg",f)) +#define E putc + C + G=0, + R + =0,Q,H + ,M,P,z,S + =0,x=0 + , f=0;l b,j=0, k + =128,K=1,V,B=0,Y,m=128,p=0,N + =768,U=768,h[]={0x59A66A95,256 + ,192,1,6912,1,0,0},t,A=0,W=0,Z=63,X=23 + ;o*J,_;main(c,v)l c;o**v;{l q=1;for(;;q< + c ?(((J=v[q])[0]&&J[0]<48&&J++,((_= *J)<99|| + _/2== '2'||(_-1)/3=='\"'||_==107||_/05*2==','||_ + >0x074)?( fprintf(i,a,v[q]),r):_>0152?(_/4>27?(_&1?( + O,Z=N,X=U): (W++,N=Z,U=X)):_&1?T(K):T(k)):_>103?(d(G, + R ),j=1):_&1? d(S,x):D,q++),q--,main(c-q,v+q)):A==0?(A= + 1,f||(f=N/4.),b=(((N-1)&017)<8),q=(((N+7)>>3)+b)*U,(J=malloc(q) + )||(perror("malloc"),r),S-=(N/2)/f,x+=(U/2)/f):A==1?(B>=1)||/*/ + (m=128,u--),A==6?exit(1):B +#define ext(a) (exit(a),0) +# define X( x,v,y) XMoveWindow(d,s[x],(v)*z,(y)*z) +# define _ ButtonPressMask|ButtonReleaseMask +# define I( x,y) XSelectInput(d,s[x],y) +# define N( v) (XMapWindow(d,s[v]),v) +# define V VisibilityChangeMask +# define A XCreateSimpleWindow +# define D DefaultScreen(d) +# define E r.xbutton.button +# define R BlackPixel(d,D) +# define S r.xvisibility + + int main(a)int a;{Window s[53];int w,u,i,c,y,l=0 + ,q,e=32,t,k,j=~0,z=(a+1)/2,x=a&1,v=z&1;XEvent r;Display* + d=XOpenDisplay("");s[0]=A(d,DefaultRootWindow(d),200,200,(x& + v?330:120)*z,215*z,2,R,R);I(N(c=0),_);for(;c<(x?32:52);c++){s[ + c+1]=A(d,s[0],x ?c*20*z:(c-1)%10 *12*z,x?-20*z:( + c-1)/10*12*z,x ?z*(c^31?10: 2):z*10*(c?1:2 + ), x& v?z*10: (c &&!x?10:1+ x) *z,k =q=1, R, + WhitePixel(d ,D));I (N(c+1), V);}X( N(1),y=(x&v) + *115+50,x*70+ 60 ); X(N(c-- )+ 1,x?-10:(i=y) + ,u=!x*130-20); while(c &&e< 160){if(x){if( + v){l=!(e &32)*9; for(w=30; w--;){ if(s[w+2]){ k=w% + 10;l=e&32?k>l?k:l:k300?e++:0)):(q--,q+l<10?e++:0); } u>140? + ext(c):u>-20?X(32,i,u-=(v?5:-1 )) :(!v?(u =5,srandom(time(0)),i= + random()%88+6):0); } else{k>0?i+=(i>105?k= -k:k):(i+=(i<1?k= -k: + k)); j>0?u +=(u>140?ext(++c):j):(u+=(u <1?j= -j:j + )); X( 52,i,u);}XSync(d,0); while( + XCheckMaskEvent(d ,_|V,&r))if(!(r. type==ButtonPress + ?(E&1||!x||!v?t=E*4-8 :u<0?i=y+4,u=122:1):r + .type==ButtonRelease&&E?t=0,1:r.type^VisibilityNotify|S.state^1) + )for(x&v?(u= -15),w++:(w=0);++w <52-x*20;)if + (s[w] ==S.window)x&&v|| w ^1? + XUnmapWindow (d,s[w]) ,s[w]=0,c--: + 0,l=1; if(!x&&l)j= -j,l=0; if(l&x&&!v + )u=~19,c--,l=0;t=(!x||!v) &&(y<5&&t<0||y>95&&t>0)?0 + :t;s[1]?X(1,y+=x&v?t:t/(x+1),130):ext(++c);};return(c);} diff --git a/1992/kivinen.hint b/1992/kivinen.hint new file mode 100644 index 000000000..37b9e783a --- /dev/null +++ b/1992/kivinen.hint @@ -0,0 +1,103 @@ +Best X Program: + + Tero Kivinen + Helsinki University of Technology + Klovinrinne 6b + 02180 Espoo + Finland + + +Judges' comments: + + If your machine support the X Window System, Version 11: + make kivinen + + The type of entertainment depends on number of arguments + you have with the program. :-) + + NOTE: Some systems do not need (or have) -lsocket -lresolv -lnsl. + Such systems should compile using -lX11. + + NOTE: The original winning source kivinen.orig.c assumed that + exit returned a value which cause problems for some + systems where exit returned a void. The file kivinen.c + avoids this problem. + + +Selected notes from the author: + + X Entertainment Kit + + This kit includes three games from the early of video games for + The X Window System Version 11 Release 5. It should work with + earlier releases, though. + + + Space Invaders + + The classic game of shooting aliens from outer space, trying to + exterminate all life on earth. The game ends when the first line + of aliens touches the ground, or destroy you. To win the game you + must destroy all the aliens. If you evade out from the screen you + lose. + + Controls: + Button 1 = Move left + Button 2 = Fire missile + Button 3 = Move right + + + Breakout + + Break all the bricks with the ball, using your paddle. If you miss + the ball the game ends. + + Controls: + Button 1 = Move left + Button 3 = Move right + + + Dropout + + Catch all the falling pieces, before they reach the ground. If you + miss it, game ends. To win you must catch all 30 pieces. + + Controls: + Button 1 = Move left + Button 3 = Move right + + + + Starting the game + + The type of the game is determined by the number of arguments + given to the program. + + no arguments = Space Invaders + 1 argument = Breakout + 2 arguments = Dropout + 3 arguments = double sized Breakout + 4 arguments = triple sized Space Invaders + 5 arguments = triple sized Breakout + 6 arguments = double sized Dropout + 7 arguments = quadruple sized Breakout + and so on... + + + Scores + + The exit value of the game is your score. The smaller the score + the better it is. The exit value of zero means you have won. + + + Features + + The game has a cheat system, which can be found after examining the + event loop at the end of program. It is not a bug, it's a feature! + + +Copyright (c) 1992, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1992/kivinen.orig.c b/1992/kivinen.orig.c new file mode 100644 index 000000000..4d48dac3f --- /dev/null +++ b/1992/kivinen.orig.c @@ -0,0 +1,38 @@ +#include +# define X( x,v,y) XMoveWindow(d,s[x],(v)*z,(y)*z) +# define _ ButtonPressMask|ButtonReleaseMask +# define I( x,y) XSelectInput(d,s[x],y) +# define N( v) (XMapWindow(d,s[v]),v) +# define V VisibilityChangeMask +# define A XCreateSimpleWindow +# define D DefaultScreen(d) +# define E r.xbutton.button +# define R BlackPixel(d,D) +# define S r.xvisibility + + int main(a)int a;{Window s[53];int w,u,i,c,y,l=0 + ,q,e=32,t,k,j=~0,z=(a+1)/2,x=a&1,v=z&1;XEvent r;Display* + d=XOpenDisplay("");s[0]=A(d,DefaultRootWindow(d),200,200,(x& + v?330:120)*z,215*z,2,R,R);I(N(c=0),_);for(;c<(x?32:52);c++){s[ + c+1]=A(d,s[0],x ?c*20*z:(c-1)%10 *12*z,x?-20*z:( + c-1)/10*12*z,x ?z*(c^31?10: 2):z*10*(c?1:2 + ), x& v?z*10: (c &&!x?10:1+ x) *z,k =q=1, R, + WhitePixel(d ,D));I (N(c+1), V);}X( N(1),y=(x&v) + *115+50,x*70+ 60 ); X(N(c-- )+ 1,x?-10:(i=y) + ,u=!x*130-20); while(c &&e< 160){if(x){if( + v){l=!(e &32)*9; for(w=30; w--;){ if(s[w+2]){ k=w% + 10;l=e&32?k>l?k:l:k300?e++:0)):(q--,q+l<10?e++:0); } u>140? + exit(c):u>-20?X(32,i,u-=(v?5:-1)):(!v?(u =5,srandom(time(0)),i= + random()%88+6):0); } else{k>0?i+=(i>105?k= -k:k):(i+=(i<1?k= -k: + k)); j>0?u +=(u>140?exit(++c):j):(u+=(u <1?j= -j:j + )); X( 52,i,u);}XSync(d,0); while( + XCheckMaskEvent(d ,_|V,&r))if(!(r. type==ButtonPress + ?(E&1||!x||!v?t=E*4-8 :u<0?i=y+4,u=122:1):r + .type==ButtonRelease&&E?t=0,1:r.type^VisibilityNotify|S.state^1) + )for(x&v?(u= -15),w++:(w=0);++w <52-x*20;)if + (s[w] ==S.window)x&&v|| w ^1? + XUnmapWindow (d,s[w]) ,s[w]=0,c--: + 0,l=1; if(!x&&l)j= -j,l=0; if(l&x&&!v + )u=~19,c--,l=0;t=(!x||!v) &&(y<5&&t<0||y>95&&t>0)?0 + :t;s[1]?X(1,y+=x&v?t:t/(x+1),130):exit(++c);};return(c);} diff --git a/1992/lush.c b/1992/lush.c new file mode 100644 index 000000000..c788ea0f0 --- /dev/null +++ b/1992/lush.c @@ -0,0 +1,167 @@ +#define f 000: + char + *s,* + t,v; + char + _ [ + 999] + ,x [ + 999] + ,*p= + x ; + char + *av[ + ]= { + "W", + "H", + "o", + "l", + "N", + "e", + " ", + "r", + "d", + ".", + "m", + "s", + "g", + "!", + "*", + "\n" + } ; + int + n= 0 + ;int + __ = + 0,i= + 000; + main + () { +#define f 001: +#define F 042: +#define f 100: + _[i-- +#define f 126: +#define f 132: +#define f 103: +#define f 202: +#define f 666: +#define f 77:: +#define f 101: + ]=0 +#define f 232: +#define f 151: + ;if( +#define f 256: + !i){ + puts + ("I" + "BM" + " S" + "UX" + );;; + ;;;} + ;for + ( ; + gets + (_); + ) { + for( +#define f 301: + t=_, +#define f 700: +#define f 999: + s=t, +#define f 77 : +#define f 300: + s=t; +#define f s=t; +#define f 123: +#define f 127: + *t&& + !(!( + *t < + '0' + ||*t + >'9' + )&&! + ((t[ + 1] ^ + ':') + &&(t + [1]^ + '.') + )) ; + t++) +#define f 137: +#define f 133: + ;if( +#define f 111: +#define f 220: + v^*t + &&*t + ){v= + *t;; + n=n* + 2+(1 + &*t) + ;__= + (__+ + 1)&3 + ; __ + ||(( + n<15 + &&(* + p= * + av[n + ] ), +#define f 2+2: + p++) + ,n=0 + );}} +#define f ==4: + ;*p= + '\0' + ;;;; +#define f puts + puts + (x); + s=t; +#define f s=5; + s=t; +#define f s=5: + s=t; +#define f 445: +#define f 113: +#define f 900: + s=t; +#define f n22: +#define f n40: + s=t; +#define f nn6: + s=t; +#define f nn1: +#define f 0:-- + s=t; +#define f 19:- +#define f x2:x + s=t; +#define f x1:x + s=t; +#define f y2:x +#define f y7:y + s=t; +#define f 1::: + s=t; +#define f @3:@ +#define f 10:0 +#define f x+1: + s=t; +#define f 2::: +#define f 3::: +#define x 7::: +#define y 3::: +#define z 990: +#define Z 47:: + ;;;} + diff --git a/1992/lush.hint b/1992/lush.hint new file mode 100644 index 000000000..e85fcb723 --- /dev/null +++ b/1992/lush.hint @@ -0,0 +1,34 @@ +Worst Abuse of the C Preprocessor: + + Ed Luke + Mississippi State University + P.O. Box 6176 + Mississippi State, MS 39762, USA + + +Judges' comments: + + To setup: + make lush + + Try: + make lush.again 2>&1 | lush (sh or ksh users) + or: + make lush.again |& lush (csh users) + + The program uses error messages issued by the C Proproessor to + generate its message to the world. One program's error is another + program's data! + + +Selected notes from the author: + + This program is yet another "Hello World." program with a twist. The + string Hello World has been encoded in the error messages the compiler + generates when compiling the source. + +Copyright (c) 1992, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1992/lush.orig.c b/1992/lush.orig.c new file mode 100644 index 000000000..d88d71ce3 --- /dev/null +++ b/1992/lush.orig.c @@ -0,0 +1,167 @@ +#define f 000: + char + *s,* + t,v; + char + _ [ + 999] + ,x [ + 999] + ,*p= + x ; + char + *av[ + ]= { + "W", + "H", + "o", + "l", + "N", + "e", + " ", + "r", + "d", + ".", + "m", + "s", + "g", + "!", + "*", + "\n" + } ; + int + n= 0 + ;int + __ = + 0,i= + 000; + main + () { +#define f 001: +#define F 042: +#define f 100: + i--[ +#define f 126: +#define f 132: +#define f 103: +#define f 202: +#define f 666: +#define f 77:: +#define f 101: + _]=0 +#define f 232: +#define f 151: + ;if( +#define f 256: + !i){ + puts + ("I" + "BM" + " S" + "UX" + );;; + ;;;} + ;for + ( ; + gets + (_); + ) { + for( +#define f 301: + t=_, +#define f 700: +#define f 999: + s=t, +#define f 77 : +#define f 300: + s=t; +#define f s=t; +#define f 123: +#define f 127: + *t&& + !(!( + *t < + '0' + ||*t + >'9' + )&&! + ((t[ + 1] ^ + ':') + &&(t + [1]^ + '.') + )) ; + t++) +#define f 137: +#define f 133: + ;if( +#define f 111: +#define f 220: + v^*t + &&*t + ){v= + *t;; + n=n* + 2+(1 + &*t) + ;__= + (__+ + 1)&3 + ; __ + ||(( + n<15 + &&(* + p= * + av[n + ] ), +#define f 2+2: + p++) + ,n=0 + );}} +#define f ==4: + ;*p= + '\0' + ;;;; +#define f puts + puts + (x); + s=t; +#define f s=5; + s=t; +#define f s=5: + s=t; +#define f 445: +#define f 113: +#define f 900: + s=t; +#define f n22: +#define f n40: + s=t; +#define f nn6: + s=t; +#define f nn1: +#define f 0:-- + s=t; +#define f 19:- +#define f x2:x + s=t; +#define f x1:x + s=t; +#define f y2:x +#define f y7:y + s=t; +#define f 1::: + s=t; +#define f @3:@ +#define f 10:0 +#define f x+1: + s=t; +#define f 2::: +#define f 3::: +#define x 7::: +#define y 3::: +#define z 990: +#define Z 47:: + ;;;} + diff --git a/1992/marangon.c b/1992/marangon.c new file mode 100644 index 000000000..86345705f --- /dev/null +++ b/1992/marangon.c @@ -0,0 +1,78 @@ +#include +#include + +#define ST strchr +#define SRD srand48 +#define RD lrand48 +#define ext(a) (exit(a),0) + +#define Q return +#define W wrefresh(r) +typedef int i; + +#define Z(d,a) (RD()%((a)-(d)+1)+(d)) +i f[3][3] = {15,52,36,20,-39,48,60,0,-25}; + +char z[6][6]; +#define Y(x) (4*(x)+3) +#define X(x) (2*(x)+1) +#define I for +WINDOW *r=NULL; +#define K endwin() + +char *g ="\ +Use l-h-k-j for move.\nUse + for increment. Use - for decrement.\nUse Q to quit."; + +i (*d())(); +nt() +{ +long time(); +SRD(time((i *)0)); +memset(z,5,36); +initscr(); +cbreak(); +noecho(); +nonl(); +if (COLS<80||LINES<24) +K,ext(1); +if (!(r=newwin(X(6),Y(6), +(LINES-X(6))/2,(COLS-Y(6))/2))) +K,ext(1); +mvaddstr(LINES-5,0,g); +refresh(); +} +i ci() +{ +i x,y=0; +I (;y<6;++y) +I(x=0;x<6;++x) +mvwaddch(r,X(y),Y(x),z[x][y]+'0'); Q(0); +} +void main() +{ +char *ST(); +i a=0,b=0,c,q,t,s,x,sc=0; +i(*(*p)())()=(nt(),d); +I(x=0 ; x++<20; )d(Z(0,5),Z(0,5),Z(1,2)); +I(t=Z(0,2),q=s=0; q<3; s+=f[q][t]*f[q++][t]); +I(box(r,'|','-'),ci(),wmove(r,X(a),Y(b)), +W; (ST ("+-Qlkjh",(char)(c=wgetch(r))))&& +((i)((i)(q^=s%=Y(q),s/=2)!=(i)(s^=q)&&c&64&&(!(c&7|0)&&--b<0&& +(b=q^s)&0|| c&4&&++b==6&&c&4<(~b&23?q^=s,b^=b +:b&12?b=3:b|2)||c&2&&~c&1&&++a==++q/2+1&&c&16>( +!a|12?a=7,a&=~a:a|4?a=2:a&2)||~c&4&&c& +1&&--a<0&&(a+=6)&0)||~c&64&&(**p(b,a,~c))()|| +c&16)?K,ext(0):1)||c; sc==36?ci(),W,K,ext(0):wmove(r,X(a),Y(b)), +W) +I(t=Z(0,2),q=s=0; q<3; s+=f[q][t]*f[q++][t]) +I(sc=0; sc<36&&*((char *)z+sc++)==5; ); +} +i (*d(a,b,c))()i a,b,c; +{ +i x,y; +I(x=a>0?a-1:0; x<=(a<5?a+1:5); ++x) +I(y=b>0?b-1:0; y<=(b<5?b+1:5); ++y) +if(x==a&&y==b&&z[x][y]==(c&2?1:9)||z[x][y]==(c&2?9:1)&&(x!=a||y!=b))Q(ci); +I(x=a>0?a-1:0; x<=(a<5?a+1:5); x++) +I(y=b>0?b-1:0; y<=(b<5?b+1:5)&&(x==a&&y==b&&(z[x][y]+=(c&2?-1:1))||(z[x][y]+=(c&2?1:-1))); y++); Q(ci); +} diff --git a/1992/marangon.hint b/1992/marangon.hint new file mode 100644 index 000000000..edd3cab06 --- /dev/null +++ b/1992/marangon.hint @@ -0,0 +1,40 @@ +Best Game: + + Marangoni Andrea + Department of Computer Science at Milano + Via Pausula, 72 + 62014 Corridonia (MC) + Italy + + +Judges' comments: + + Make and run. + + The object is to refill the table with 5's, by incrementing + or decrementing numbers as needed. It is the side effects + that get you into trouble. If you are not careful, you may + find things "at 6's and 7's". :-) + + NOTE: Some compilers have had trouble optimizing this entry. + + NOTE: Some systems need to compile with -ltermcap as well as -lcurses. + + NOTE: The original winning source marangon.orig.c assumed that + exit returned a value which cause problems for some + systems where exit returned a void. The file marangon.c + avoids this problem. + + +Selected notes from the author: + + It starts off by creating a table with number 5 in all places. The + CPU melts the numbers and you must return them in original state. + When you increase a number, all the other eight numbers next to it + decrease and vice-versa. + +Copyright (c) 1992, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1992/marangon.orig.c b/1992/marangon.orig.c new file mode 100644 index 000000000..f40631a7a --- /dev/null +++ b/1992/marangon.orig.c @@ -0,0 +1,77 @@ +#include +#include + +#define ST strchr +#define SRD srand48 +#define RD lrand48 + +#define Q return +#define W wrefresh(r) +typedef int i; + +#define Z(d,a) (RD()%((a)-(d)+1)+(d)) +i f[3][3] = {15,52,36,20,-39,48,60,0,-25}; + +char z[6][6]; +#define Y(x) (4*(x)+3) +#define X(x) (2*(x)+1) +#define I for +WINDOW *r=NULL; +#define K endwin() + +char *g ="\ +Use l-h-k-j for move.\nUse + for increment. Use - for decrement.\nUse Q to quit."; + +i (*d())(); +nt() +{ +long time(); +SRD(time((i *)0)); +memset(z,5,36); +initscr(); +cbreak(); +noecho(); +nonl(); +if (COLS<80||LINES<24) +K,exit(1); +if (!(r=newwin(X(6),Y(6), +(LINES-X(6))/2,(COLS-Y(6))/2))) +K,exit(1); +mvaddstr(LINES-5,0,g); +refresh(); +} +i ci() +{ +i x,y=0; +I (;y<6;++y) +I(x=0;x<6;++x) +mvwaddch(r,X(y),Y(x),z[x][y]+'0'); Q(0); +} +void main() +{ +char *ST(); +i a=0,b=0,c,q,t,s,x,sc=0; +i(*(*p)())()=(nt(),d); +I(x=0 ; x++<20; )d(Z(0,5),Z(0,5),Z(1,2)); +I(t=Z(0,2),q=s=0; q<3; s+=f[q][t]*f[q++][t]); +I(box(r,'|','-'),ci(),wmove(r,X(a),Y(b)), +W; (ST ("+-Qlkjh",(char)(c=wgetch(r))))&& +((i)((i)(q^=s%=Y(q),s/=2)!=(i)(s^=q)&&c&64&&(!(c&7|0)&&--b<0&& +(b=q^s)&0|| c&4&&++b==6&&c&4<(~b&23?q^=s,b^=b +:b&12?b=3:b|2)||c&2&&~c&1&&++a==++q/2+1&&c&16>( +!a|12?a=7,a&=~a:a|4?a=2:a&2)||~c&4&&c& +1&&--a<0&&(a+=6)&0)||~c&64&&(**p(b,a,~c))()|| +c&16)?K,exit(0):1)||c; sc==36?ci(),W,K,exit(0):wmove(r,X(a),Y(b)), +W) +I(t=Z(0,2),q=s=0; q<3; s+=f[q][t]*f[q++][t]) +I(sc=0; sc<36&&*((char *)z+sc++)==5; ); +} +i (*d(a,b,c))()i a,b,c; +{ +i x,y; +I(x=a>0?a-1:0; x<=(a<5?a+1:5); ++x) +I(y=b>0?b-1:0; y<=(b<5?b+1:5); ++y) +if(x==a&&y==b&&z[x][y]==(c&2?1:9)||z[x][y]==(c&2?9:1)&&(x!=a||y!=b))Q(ci); +I(x=a>0?a-1:0; x<=(a<5?a+1:5); x++) +I(y=b>0?b-1:0; y<=(b<5?b+1:5)&&(x==a&&y==b&&(z[x][y]+=(c&2?-1:1))||(z[x][y]+=(c&2?1:-1))); y++); Q(ci); +} diff --git a/1992/mkentry.c b/1992/mkentry.c new file mode 100644 index 000000000..83915d24d --- /dev/null +++ b/1992/mkentry.c @@ -0,0 +1,1188 @@ +/* @(#)mkentry.c 1.20 3/1/92 16:13:00 */ +/* + * mkentry - make an International Obfuscated C Code Contest entry + * + * usage: + * mkentry -r remarks -b build -p prog.c -o ioccc.entry + * + * -r remarks file with remarks about the entry + * -b build file containing how prog.c should be built + * -p prog.c the obfuscated program source file + * -o ioccc.entry ioccc entry output file + * + * compile by: + * cc mkentry.c -o mkentry + */ +/* + * Copyright (c) 1992, Landon Curt Noll & Larry Bassel. + * All Rights Reserved. Permission for personal, educational or non-profit + * use is granted provided this this copyright and notice are included in + * its entirety and remains unaltered. All other uses must receive prior + * permission in writing from both Landon Curt Noll and Larry Bassel. + */ +/* + * Placed in the public domain by Landon Curt Noll, 1992. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* + * WARNING: + * + * This program attempts to implement the IOCCC rules. Every attempt + * has been made to make sure that this program produces an entry that + * conforms to the contest rules. In all cases, where this program + * differs from the contest rules, the contest rules will be used. Be + * sure to check with the contest rules before submitting an entry. + * + * Send questions or comments (but not entries) about the contest, to: + * + * ...!{sun,pacbell,uunet,pyramid}!hoptoad!judges + * judges@toad.com + * + * The rules and the guidelines may (and often do) change from year to + * year. You should be sure you have the current rules and guidelines + * prior to submitting entries. The IOCCC rules, guidelines and mkentry + * program may be obtained from the judges using the Email address above. + * Please use the following subject when sending in your request: + * + * send rules + * + * Because contest rules change from year to year, one should only use this + * program for the year that it was intended. Be sure that the RULE_YEAR + * define below matches this current year. + */ + +#include +#include +#include +#include +#include + +/* logic */ +#ifndef TRUE +# define TRUE 1 +#endif /* TRUE */ +#ifndef FALSE +# define FALSE 0 +#endif /* FALSE */ +#define EOF_OK TRUE +#define EOF_NOT_OK FALSE + +/* global limits */ +#define RULE_YEAR 1992 /* NOTE: should match the current year */ +#define START_DATE "1Mar92 0:00 UTC" /* first confirmation received */ +#define MAX_COL 79 /* max column a line should hit */ +#define MAX_BUILD_SIZE 256 /* max how to build size */ +#define MAX_PROGRAM_SIZE 3217 /* max program source size */ +#define MAX_PROGRAM_SIZE2 1536 /* max program source size not counting + whitespace and {}; not followed by + whitespace or EOF */ +#define MAX_TITLE_LEN 10 /* max chars in the title */ +#define MAX_ENTRY_LEN 1 /* max length in the entry input line */ +#define MAX_ENTRY 8 /* max number of entries per person per year */ +#define MAX_FILE_LEN 1024 /* max filename length for a info file */ + +/* where to send entries */ +#define ENTRY_ADDR1 "...!{apple,pyramid,sun,uunet}!hoptoad!obfuscate" +#define ENTRY_ADDR2 "obfuscate@toad.com" + +/* uuencode process - assumes ASCII */ +#define UUENCODE(c) (((c)=='\0') ? '`' : (((c)&0x3f)+' ')) +#define UUENCODE_LEN 45 /* max uuencode chunk size */ +#define UUINFO_MODE 0444 /* mode of an info file's uuencode file */ +#define UUBUILD_MODE 0444 /* mode of the build file's uuencode file */ +#define UUBUILD_NAME "build" /* name for the build file's uuencode file */ +#define UUPROG_MODE 0444 /* mode of the program's uuencode file */ +#define UUPROG_NAME "prog.c" /* name for the program's uuencode file */ + +/* global declarations */ +char *program; /* our name */ +long start_time; /* the startup time */ + +/* forward declarations */ +void parse_args(); +void usage(); +FILE *open_remark(); +FILE *open_build(); +FILE *open_program(); +FILE *open_output(); +void output_entry(); +void output_remark(); +void output_author(); +void output_info(); +void output_build(); +void output_program(); +void output_end(); +int get_line(); +void output_till_dot(); +int col_len(); +void check_io(); +void uuencode(); + +main(argc, argv) + int argc; /* arg count */ + char **argv; /* the args */ +{ + FILE *remark=NULL; /* open remarks stream */ + FILE *build=NULL; /* open build file stream */ + FILE *prog=NULL; /* open program stream */ + FILE *output=NULL; /* open output stream */ + char *rname=NULL; /* file with remarks about the entry */ + char *bname=NULL; /* file containing how prog.c should be built */ + char *pname=NULL; /* the obfuscated program source file */ + char *oname=NULL; /* ioccc entry output file */ + struct tm *tm; /* startup time structure */ + + /* + * check on the year + */ + start_time = time((long *)0); + tm = gmtime(&start_time); + if (tm->tm_year != RULE_YEAR-1900) { + fprintf(stderr, + "%s: WARNING: this program applies to %d, which differ from %d\n\n", + argv[0], RULE_YEAR, 1900+tm->tm_year); + } + + /* + * parse the command line args + */ + parse_args(argc, argv, &rname, &bname, &pname, &oname); + + /* + * open/check the input and output files + * + * We open and truncate the output file first, in case it is the same + * as one of the input files. + */ + output = open_output(oname); + remark = open_remark(rname); + build = open_build(bname); + prog = open_program(pname); + if (output==NULL || remark==NULL || build==NULL || prog==NULL) { + exit(1); + } + + /* + * output each section + */ + output_entry(output, oname); + output_remark(output, oname, remark, rname); + output_author(output, oname); + output_info(output, oname); + output_build(output, oname, build, bname); + output_program(output, oname, prog, pname); + output_end(output, oname); + + /* + * flush the output + */ + if (fflush(output) == EOF) { + fprintf(stderr, "%s: flush error in %s: ", program, oname); + perror(""); + exit(2); + } + + /* + * final words + */ + printf("\nYour entry can be found in %s. You should check this file\n", + oname); + printf("correct any problems and verify that the uudecode utility will\n"); + printf("correctly decode your build file and program.\n\n"); + printf("This program has been provided as a guide for submitters. In\n"); + printf("cases where it conflicts with the rules, the rules shall apply.\n"); + printf("It is your responsibility to ensure that your entry conforms to\n"); + printf("the current rules.\n\n"); + printf("Email your entries to:\n"); + printf("\t%s\n", ENTRY_ADDR1); + printf("\t%s\n\n", ENTRY_ADDR2); + printf("Please use the following subject when you Email your entry:\n"); + printf("\tioccc entry\n\n"); + /* all done */ + exit(0); +} + +/* + * parse_args - parse the command line args + * + * Given the command line args, this function parses them and sets the + * required name flags. This function will return only if the command + * line syntax is correct. + */ +void +parse_args(argc, argv, rname, bname, pname, oname) + int argc; /* arg count */ + char **argv; /* the args */ + char **rname; /* file with remarks about the entry */ + char **bname; /* file containing how prog.c should be built */ + char **pname; /* the obfuscated program source file */ + char **oname; /* ioccc entry output file */ +{ + char *optarg; /* -flag option operand */ + int flagname; /* the name of the -flag */ + int i; + + /* + * Not everyone has getopt, so we must parse args by hand. + */ + program = argv[0]; + for (i=1; i < argc; ++i) { + + /* determine the flagname */ + if (argv[i][0] != '-') { + usage(1); + /*NOTREACHED*/ + } + flagname = (int)argv[i][1]; + + /* determine the flag's operand */ + if (flagname != '\0' && argv[i][2] != '\0') { + optarg = &argv[i][2]; + } else { + if (i+1 >= argc) { + usage(2); + /*NOTREACHED*/ + } else { + optarg = argv[++i]; + } + } + + /* save the flag's operand in the correct global variable */ + switch (flagname) { + case 'r': + *rname = optarg; + break; + case 'b': + *bname = optarg; + break; + case 'p': + *pname = optarg; + break; + case 'o': + *oname = optarg; + break; + default: + usage(3); + /*NOTREACHED*/ + } + } + + /* + * verify that we have all of the required flags + */ + if (*rname == NULL || *bname == NULL || *pname == NULL || *oname == NULL) { + usage(4); + /*NOTREACHED*/ + } + return; +} + +/* + * usage - print a usage message and exit + * + * This function does not return. + */ +void +usage(exitval) + int exitval; /* exit with this value */ +{ + fprintf(stderr, + "usage: %s -r remarks -b build -p prog.c -o ioccc.entry\n\n", program); + fprintf(stderr, "\t-r remarks\tfile with remarks about the entry\n"); + fprintf(stderr, "\t-b build\tfile containing how prog.c should be built\n"); + fprintf(stderr, "\t-p prog.c\tthe obfuscated program source file\n"); + fprintf(stderr, "\t-o ioccc.entry\tioccc entry output file\n"); + exit(exitval); +} + +/* + * open_remark - open/check the remark file + * + * The remark file should be indented by 4 spaces, and should not extend + * beyond column MAX_COL. These are not requirements, so we only warn. + * + * This function returns NULL on I/O or format error. + */ +FILE * +open_remark(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + char buf[BUFSIZ+1]; /* input buffer */ + int toolong=0; /* number of lines that are too long */ + int non_indent=0; /* number of lines not indented by 4 spaces */ + + /* + * open the remark input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open remark file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * look at each line + */ + while (fgets(buf, BUFSIZ, stream) != NULL) { + + /* count lines that do not start with 4 spaces */ + if (buf[0] != '\n' && strncmp(buf, " ", 4) != 0) { + ++non_indent; + } + + /* count long lines */ + if (col_len(buf) > MAX_COL) { + /* found a line that is too long */ + ++toolong; + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* note long lines if needed */ + if (toolong > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s extend beyond the 80th column\n", + program, toolong, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* note non-indented lines, if needed */ + if (non_indent > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s are not indented by 4 spaces\n", + program, non_indent, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_build - open/check the build file + * + * The how to build file must not be longer than MAX_BUILD_SIZE bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_build(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + + /* + * open the how to build input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_BUILD_SIZE) { + fprintf(stderr, + "%s: FATAL: the how to build file: %s, is %d bytes long\n", + program, filename, statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_BUILD_SIZE); + return(NULL); + } + + /* return the open file */ + return(stream); +} + +/* + * open_program - open/check the program source file + * + * The program source file must be <= 3217 bytes. The number of + * non-whitespace and }{; chars not followed by whitespace must + * be <= 1536 bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_program(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + int count; /* special count size */ + int c; /* the character read */ + + /* + * open the program source input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open program source file: %s: ", + program, filename); + perror(""); + exit(7); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat program source file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_PROGRAM_SIZE) { + fprintf(stderr, + "%s: FATAL: the program source file: %s, is %d bytes long\n", + program, filename, statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_PROGRAM_SIZE); + return(NULL); + } + + /* + * count the non-whitespace, non {}; followed by whitespace chars + */ + count = 0; + c = 0; + while ((c=fgetc(stream)) != EOF) { + /* look at non-whitespace */ + if (!isascii(c) || !isspace(c)) { + switch (c) { + case '{': /* count if not followed by EOF or whitespace */ + case '}': + case ';': + /* peek at next char */ + c = fgetc(stream); + if (c != EOF && isascii(c) && !isspace(c)) { + /* not followed by whitespace or EOF, count it */ + ungetc(c, stream); + ++count; + } + break; + default: + ++count; + break; + } + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* look at the special size */ + if (count > MAX_PROGRAM_SIZE2) { + fprintf(stderr, + "%s: FATAL: the number of bytes that are non-whitespace, and\n", + program); + fprintf(stderr, + "%s: that are not '{', '}', ';' followed by whitespace\n", + program); + fprintf(stderr, + "%s: or EOF must be <= %d bytes\n", + program, MAX_PROGRAM_SIZE2); + fprintf(stderr, + "%s: in %s, %d bytes were found\n", + program, filename, count); + return(NULL); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_output - open/check the entry output file + * + * This function returns NULL on open error. + */ +FILE * +open_output(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + + /* + * open the ioccc entry output file + */ + stream = fopen(filename, "w"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open ioccc entry file for output: %s: ", + program, filename); + perror(""); + exit(8); + } + + /* return the open file */ + return(stream); +} + +/* + * output_entry - output the ---entry--- section + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_entry(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + char title[MAX_TITLE_LEN+1+1]; /* the entry's title */ + int entry=0; /* entry number */ + int ret; /* fields processed by fscanf */ + int ok_line=0; /* 0 => the line is not ok */ + char skip; /* input to skip */ + char *p; + + /* + * write the start of the section + */ + fprintf(output, "---entry---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the rule year + */ + fprintf(output, "rule:\t%d\n", RULE_YEAR); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the title + */ + printf("Your title must match expression be a [a-zA-Z0-9_+=,] character\n"); + printf("followed by 0 to 9 more [a-zA-Z0-9_+=,.-] characters.\n\n"); + printf("It is suggested, but not required, that the title should\n"); + printf("incorporate your username; in the\n"); + printf("case of multiple authors, consider using parts of the usernames\n"); + printf("of the authors.\n\n"); + printf("enter your title: "); + do { + /* prompt and read a line */ + if ((ok_line = get_line(title, MAX_TITLE_LEN+1, MAX_COL-9)) <= 0) { + printf("\ntitle is too long, please re-enter: "); + continue; + } + + /* verify the pattern, not everyone has regexp, so do it by hand */ + if (!isascii((int)title[0]) || + !(isalnum((int)title[0]) || title[0] == '_' || title[0] == '+' || + title[0] == '=' || title[0] == ',')) { + printf("\ninvalid first character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } else { + for (p=(&title[1]); *p != '\0' && *p != '\n'; ++p) { + if (!isascii((int)*p) || + !(isalnum((int)*p) || *p == '_' || *p == '+' || + *p == '=' || *p == ',' || *p == '.' || *p == '-')) { + printf("\ninvalid character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } + } + } + } while (ok_line <= 0); + fprintf(output, "title:\t%s", title); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the entry number + */ + printf("\nEach person may submit up to %d entries per year.\n\n", + MAX_ENTRY); + printf("enter an entry number from 0 to %d inclusive: ", MAX_ENTRY-1); + do { + /* get a valid input line */ + fflush(stdout); + ret = fscanf(stdin, "%d[\n]", &entry); + check_io(stdin, "stdin", EOF_NOT_OK); + /* skip over input until newline is found */ + do { + skip = fgetc(stdin); + check_io(stdin, "stdin", EOF_NOT_OK); + if (skip != '\n') { + /* bad text in input, invalidate entry number */ + entry = -1; + } + } while (skip != '\n'); + + /* check if we have a number, and if it is in range */ + if (ret != 1 || entry < 0 || entry > MAX_ENTRY-1) { + printf( + "\nThe entry number must be between 0 and %d inclusive\n\n", + MAX_ENTRY-1); + printf("enter the entry number: "); + } + } while (ret != 1 || entry < 0 || entry > MAX_ENTRY-1); + fprintf(output, "entry:\t%d\n", entry); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the submission date + */ + fprintf(output, "date:\t%s", ctime(&start_time)); /* returns a newline */ + check_io(output, oname, EOF_NOT_OK); + + /* + * write the OS/machine host information + */ + printf( + "\nEnter the machine(s) and OS(s) under which your entry was tested.\n"); + output_till_dot(output, oname, "host:"); +} + +/* + * output_remark - output the ---remark--- section + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_remark(output, oname, remark, rname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + FILE *remark; /* stream to the file containing remark text */ + char *rname; /* name of the remark file */ +{ + char buf[BUFSIZ+1]; /* input/output buffer */ + + /* + * write the start of the section + */ + fprintf(output, "---remark---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * copy the remark file to the section + */ + while (fgets(buf, BUFSIZ, remark) != NULL) { + fputs(buf, output); + check_io(output, oname, EOF_NOT_OK); + } + check_io(remark, rname, EOF_OK); + + /* be sure that the remark section ends with a newline */ + if (buf[strlen(buf)-1] != '\n') { + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + } +} + +/* + * output_author - output the ---author--- section + * + * Read the needed information from stdin, and write the author section. + * If multiple authors exist, multiple author sections will be written. + */ +void +output_author(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + char buf[MAX_COL+1+1]; /* I/O buffer */ + int more_auths; /* TRUE => more authors to note */ + int auth_cnt=0; /* number of authors processed */ + + /* + * prompt the user for the author section + */ + printf("\nEnter information about each author. If your entry is after\n"); + printf("%s and before the contest deadline, the judges\n", START_DATE); + printf("will attempt to Email back a confirmation to the first author\n"); + + /* + * place author information for each author in an individual section + */ + do { + + /* write the start of the section */ + fprintf(output, "---author---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* write the author */ + printf("\nAuthor #%d name: ", ++auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nname too long, please re-enter: "); + } + fprintf(output, "name:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the organization */ + printf("\nEnter the School/Company/Organization of author #%d\n", + auth_cnt); + printf("\nAuthor #%d org: ", auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter: "); + } + fprintf(output, "org:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the address */ + printf( + "\nEnter the postal address for author #%d. Be sure to include\n", + auth_cnt); + printf("your country and do not include your name.\n"); + output_till_dot(output, oname, "addr:"); + + /* write the Email address */ + printf( + "\nEnter the Email address for author #%d. Use an address from\n", + auth_cnt); + printf( + "a registered domain or well known site. If you give several\n"); + printf("forms, list them one per line.\n"); + output_till_dot(output, oname, "email:"); + + /* write the anonymous status */ + printf("\nShould author #%d remain anonymous (enter y or n)? ", + auth_cnt); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + fprintf(output, "anon:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* determine if there is another author */ + printf("\nIs there another author (enter y or n)? "); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + if (buf[0] == 'y') { + more_auths = TRUE; + } else { + more_auths = FALSE; + } + } while (more_auths == TRUE); + return; +} + +/* + * output_info - output the ---info--- section(s) + * + * Read the needed information from stdin, and write the info section. + * If multiple info files exist, multiple info sections will be written. + */ +void +output_info(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + char infoname[MAX_FILE_LEN+1]; /* filename buffer */ + char yorn[1+1]; /* y or n answer */ + char *uuname; /* name to uuencode as */ + FILE *infile; /* info file stream */ + + /* + * prompt the user for info information + */ + printf("\nInfo files should be used only to supplement your entry.\n"); + printf("For example, info files may provide sample input or detailed\n"); + printf("information about your entry. Because they are supplemental,\n"); + printf("the entry should not require them to exist.\n\n"); + + /* + * while there is another info file to save, uuencode it + */ + printf("Do you have a info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + while (yorn[0] == 'y') { + + /* read the filename */ + printf("\nEnter the info filename: "); + while (get_line(infoname, MAX_FILE_LEN+1, 0) <= 0) { + printf("\nInfo filename too long, please re-enter: "); + } + + /* compute the basename of the info filename */ + /* remove the trailing newline */ + uuname = &infoname[strlen(infoname)-1]; + *uuname = '\0'; + /* avoid rindex/shrrchr compat issues, do it by hand */ + for (--uuname; uuname > infoname; --uuname) { + if (*uuname == '/') { + ++uuname; + break; + } + } + + /* attempt to open the info file */ + infile = fopen(infoname, "r"); + if (infile == NULL) { + fprintf(stderr, "\n%s: cannot open info file: %s: ", + program, infoname); + perror(""); + continue; + } + + /* + * write the start of the section + */ + fprintf(output, "---info---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* uuencode the info file */ + uuencode(output, oname, infile, infoname, UUINFO_MODE, uuname); + + printf("\nDo you have another info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + }; + return; +} + +/* + * output_build - output the ---build--- section + * + * Read the needed information from stdin, and write the build section. + */ +void +output_build(output, oname, build, bname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + FILE *build; /* open build file stream */ + char *bname; /* name of the build file */ +{ + /* + * write the start of the section + */ + fprintf(output, "---build---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, build, bname, UUBUILD_MODE, UUBUILD_NAME); + return; +} + +/* + * output_program - output the ---program--- section + * + * Read the needed information form stdin, and write the program section. + */ +void +output_program(output, oname, prog, pname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + FILE *prog; /* open program stream */ + char *pname; /* name of program file */ +{ + /* + * write the start of the section + */ + fprintf(output, "---program---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, prog, pname, UUPROG_MODE, UUPROG_NAME); + return; +} + +/* + * output_end - output the ---end--- section + * + * Read the needed information form stdin, and write the 'end section'. + */ +void +output_end(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + /* + * write the final section terminator + */ + fprintf(output, "---end---\n"); + check_io(output, oname, EOF_NOT_OK); + return; +} + +/* + * get_line - get an answer from stdin + * + * This function will flush stdout, in case a prompt is pending, and + * read in the answer. + * + * This function returns 0 if the line is too long, of the length of the + * line (including the newline) of the line was ok. This function does + * not return if ERROR or EOF. + */ +int +get_line(buf, siz, maxcol) + char *buf; /* input buffer */ + int siz; /* length of input, including the newline */ + int maxcol; /* max col allowed, 0 => disable check */ +{ + int length; /* the length of the input line */ + + /* flush terminal output */ + fflush(stdout); + + /* read the line */ + if (fgets(buf, siz+1, stdin) == NULL) { + /* report the problem */ + check_io(stdin, "stdin", EOF_NOT_OK); + } + + /* look for the newline */ + length = strlen(buf); + if (buf[length-1] != '\n') { + int eatchar; /* the char being eaten */ + + /* no newline found, line must be too long, eat the rest of the line */ + do { + eatchar = fgetc(stdin); + } while (eatchar != EOF && eatchar != '\n'); + check_io(stdin, "stdin", EOF_NOT_OK); + + /* report the situation */ + return 0; + } + + /* watch for long lines, if needed */ + if (maxcol > 0 && (length > maxcol || col_len(buf) > maxcol)) { + /* report the situation */ + return 0; + } + + /* return length */ + return length; +} + +/* + * output_till_dot - output a set of lines until '.' by itself is read + * + * This routine will read a set of lines until (but not including) + * a single line with '.' is read. The format of the output is: + * + * leader:\tfirst line + * \tnext line + * \tnext line + * ... + * + * This routine will not return if I/O error or EOF. + */ +void +output_till_dot(output, oname, leader) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + char *leader; /* the lead text for the first line */ +{ + char buf[BUFSIZ+1]; /* input buffer */ + int count; /* lines read */ + int done=FALSE; /* TRUE => finished reading input */ + + /* instruct the user on how to input */ + printf("\nTo end input, enter a line with a single period.\n"); + + /* read lines until '.' or EOF */ + count = 0; + while (!done) { + /* issue the prompt */ + printf("%s\t", (count>0) ? "" : leader); + fflush(stdout); + + /* get the line */ + if (get_line(buf, BUFSIZ, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter:\n\t"); + continue; + } + + /* note if '.' was read */ + if (strcmp(buf, ".\n") == 0) { + done = TRUE; + } + + /* write line if we read something */ + if (!done) { + fprintf(output, "%s\t%s", (count++>0) ? "" : leader, buf); + check_io(output, oname, EOF_NOT_OK); + } + } + + /* if no lines read, at least output something */ + if (count <= 0) { + fprintf(output, "%s\t.\n", leader); + check_io(output, oname, EOF_NOT_OK); + } + return; +} + +/* + * col_len - determine the highest that a string would reach + * + * Given a string, this routine returns that a string would reach + * if the string were printed at column 1. Tab stops are assumed + * to start at 9, 17, 25, 33, ... + */ +int +col_len(string) + char *string; /* the string to examine */ +{ + int col; /* current column */ + char *p; /* current char */ + + /* scan the string */ + for (col=0, p=string; *p != '\0' && *p != '\n'; ++p) { + /* note the column shift */ + col = (*p=='\t') ? 1+((col+8)/8*8) : col+1; + } + if (*p == '\n') { + --col; + } + + /* return the highest column */ + return col; +} + +/* + * check_io - check for EOF or I/O error on a stream + * + * Does not return if EOF or I/O error. + */ +void +check_io(stream, name, eof_ok) + FILE *stream; /* the stream to check */ + char *name; /* the name of this stream */ + int eof_ok; /* EOF_OK or EOF_NOT_OK */ +{ + /* test for I/O error */ + if (ferror(stream)) { + fprintf(stderr, "%s: error on %s: ", program, name); + perror(""); + exit(1); + + /* test for EOF */ + } else if (eof_ok == EOF_NOT_OK && feof(stream)) { + fprintf(stderr, "%s: EOF on %s\n", program, name); + exit(1); + } + return; +} + +/* + * uuencode - uuencode a file + * + * Perform the uuencoding process identical to the process performed + * by the uuencode(1) utility. + * + * This routine implements the algorithm described in the uuencode(5) + * 4.3BSD Reno man page. + */ +void +uuencode(output, oname, infile, iname, umode, uname) + FILE *output; /* output file stream */ + char *oname; /* output filename */ + FILE *infile; /* input file stream */ + char *iname; /* input filename */ + int umode; /* the mode to put on the uuencode file */ + char *uname; /* name to put on the uuencode file */ +{ + char buf[UUENCODE_LEN+1]; /* the uuencode buffer */ + int read_len; /* actual number of chars read */ + int val; /* 6 bit chunk from buf */ + char filler='\0'; /* filler uuencode pad text */ + char *p; + + /* + * output the initial uuencode header + */ + fprintf(output, "begin %o %s\n", umode, uname); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + + /* + * We will process UUENCODE_LEN chars at a time, forming + * a single output line each time. + */ + while ((read_len=fread(buf,sizeof(buf[0]),UUENCODE_LEN,infile)) > 0) { + + /* + * the first character is the length character + */ + fputc(UUENCODE(read_len), output); + check_io(output, oname, EOF_NOT_OK); + + /* + * We will convert 24 bits at a time. Thus we will convert + * 3 sets of 8 bits into 4 sets of uuencoded 6 bits. + */ + for (p=buf; read_len>0; read_len-=3, p+=3) { + + /* bits 0 to 5 */ + val = (p[0]>>2)&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 6 to 11 */ + val = ((p[0]<<4)&0x30) | ((p[1]>>4)&0x0f); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 12 to 17 */ + val = ((p[1]<<2)&0x3c) | ((p[2]>>6)&0x03); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 18 to 23 */ + val = p[2]&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + } + + /* end of UUENCODE_LEN line */ + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer (don't depend on bzero() or memset()) + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + } + + /* check the last read on the input file */ + check_io(infile, iname, EOF_OK); + + /* write end of uuencode file */ + fprintf(output, "%c\nend\n", UUENCODE(filler)); + check_io(output, oname, EOF_NOT_OK); +} diff --git a/1992/nathan.c b/1992/nathan.c new file mode 100644 index 000000000..51f2d4ac4 --- /dev/null +++ b/1992/nathan.c @@ -0,0 +1,26 @@ +#include +static char *text[] = +{ + "Export of this program from the USA is governed by the US", + "Munitions List from the ITAR (International Traffic in Arms", + "Regulations). This list gives the specific categories of", + "restricted exports and includes cryptographic exports. Traffic", + "entirely external to, entirely internal to, or into the USA is", + "not restricted.", + "To obtain a copy of the program, email to nathan@inmos.co.uk", + "with a subject \"IOCCC request\". If you know that your 'From'", + "line is incorrect, add a single line", + "\"replyto you@your.correct.address\" to the body of the message.", + "A deamon will autoreply.", + "WARNING: You must not re-export this out of the USA, or else", + "the men in black might get you.", + NULL +}; +int main() +{ + char **ptr; + + for(ptr = text; *ptr; ptr++) + printf("%s\n", *ptr); + return 0; +} diff --git a/1992/nathan.hint b/1992/nathan.hint new file mode 100644 index 000000000..350180c85 --- /dev/null +++ b/1992/nathan.hint @@ -0,0 +1,118 @@ +Worst Abuse of the Rules: + + Nathan Sidwell + Inmos UK + 1000 Aztec West + Almondsbury + Bristol + UK BS12 4SQ + + +Judges' comments: + + The US International Traffic in Arms Regulations controls certain + exportations going out of the United States. The U.S. Munitions + List gives the specific categories of restricted exports. Because + this entry appears to fall under this restricted catagory, the + judges may not be able to distribute winners outside of the USA. + + Nathan Sidwell has stated that he is willing to distribute the + winning source. To read HIS instructions of how to obtain his + winning program: + + make nathan + nathan + + =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + =-=-= The text below assumes that you have the winning source =-=-= + =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + To use: + make nathan + + Try: + nathan obfuscate < nathan.c > foobarf.c + nathan - obfuscate < foobarf.c > barfoof.c + diff nathan.c barfoof.c + + WARNING: + The judges' make no claim as to the strength or security + of this program. It is likely to be nil, or the next + best thing to it. Still, you might consider installing + it in /usr/games/nathan. :-) + + NOTE: + The 'winning' catagory is also open to question. One could say + that it is a 'file obfuscator'. One could also say that it + unintentionally adbused the intent of rule #7 (that programs + should be freely redistributable). We suspect that the author + may not have intended to do this, but that is the way things go + sometimes. + + BTW, 'abuse of the rules' entries do not violate the rules. + Entries that violate the rules are disqualified. Abuse of the + rules entries are ones that tend to 'streach' the limits and + take the contest into unexpected territory. + + +Personal note from chongo: + + I think this situation shows just how ridiculous US crypto + regulations really are. Certain US federal officials can get away + with shipping arms to certain nations in apparent violation of US + laws, but I personally can't re-distribute a program contest winner + to the network! + + +Selected notes from the author: + + PROGRAM USE + + This program is a hello world text encrypter/decrypter. It uses an + enigma (I think) style encryption algorithm, where the encryption + key character is modified by a value, determined from the previous + character. Non-printable characters (those with ASCII values < ' ' + or > 0x7e) are passed unaltered, thus any kind of file may be + successfully procesed, but if the original is printable, the + processed file will be too. The input is read from stdin, and the + output presented to stdout. The key, a text string, is presented as + a command argument. This is optional, and if ommitted, the file is + self-{de,en}crypted. To specify decryption, a "-" should be given + before the key. (Actually encryption and dycryption proper inverse + operations, so you can use decrypt to scramble and encrypt to + descramble, if you're perverse.) + + PORTABILITY (A little knowledge is a dangerous thing) + + Its written in ANSI C, and doesn't even assume an ASCII character + set, (it has an array of the characters to convert), so should be + portable across many platforms. It passes gcc -ansi -pedantic -O + -Wall with no warnings (You may get assignment in conditional + warnings on other platforms though). Because I've heard that + conditional jumps slow down fast processors, I've eliminated all + the ifs from the code, indeed, as its only one statement, it should + compile to one instruction an a suitably designed CISC machine. To + speed compilation, there is only one statement in the loop, so that + another scoping level does not need to be opened. + + Being an encrypter/decrypter, you probably want the source code to + be obfuscated, to hide the algorithm. + + OBFUSCATION + + Inspite of the fact that it looks like a nice friendly hello world + program, it isn't (as documented above). (Short lines have been padded, + as you'll find if you look at an encrypted copy of the source.) + + I've also named some of the macros from commonly used functions, + just to keep things muddy. Of course, all the variables are + misnamed. The program is kept simply (one for statement), by + serious overuse of , and ? :. These are really confusing when used + together, nested or put in argument lists (is that a comma + operator, or argument separator?) + +Copyright (c) 1992, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1992/rules b/1992/rules new file mode 100644 index 000000000..9217f4174 --- /dev/null +++ b/1992/rules @@ -0,0 +1,176 @@ +9th International Obfuscated C Code Contest Rules + +Copyright (c) 1992, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: Their emotions obfuscated their + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show the importance of programming style, in an ironic way. + * To stress C compilers with unusual code. + * To illustrate some of the subtleties of the C language. + * To provide a safe forum for poor C code. :-) + + +RULES: + + To help us with the volume of entries, we ask that you follow these rules: + + 1) Your entry must be a complete program. + + 2) Your entry must be <= 3217 bytes in length. The number of characters + excluding whitespace (tab, space, newline), and excluding any ; { or } + followed by either whitespace or end of file, must be <= 1536. + + 3) Your entry must be submitted in the following format: + +---entry--- +rule: 1992 +title: title of entry (see comments below) +entry: Entry number from 0 to 7 inclusive +date: Date/time of submission (use the format of the date command) +host: Machine(s) and OS(s) under which your entry was tested + Use tab indented lines if needed +---remark--- + Place remarks about this entry in this section. It would be helpful if + you were to indent your remarks with 4 spaces, though it is not a + requirement. Also, if possible, try to avoid going beyond the 79th + column. Blank lines are ok. +---author--- +name: your name +org: School/Company/Organization +addr: postal address + use tab indented lines to continue + don't forget to include the country +email: Email address from a well known site or registered domain. + If you give several forms, list them on separate tab indented lines. +anon: y or n (y => remain anonymous, n => ok to publish this info) +---info--- +If your program needs an info file, place a uuencoded copy if it in +this section. In the case of multiple info files, use multiple info +sections. If your entry does not need a info file, skip this section. +---build--- +Place a uuencoded copy of the command(s) used to compile/build your program +in this section. It must uudecode into a file named 'build'. The resulting +file must be 255 bytes or less. +---program--- +Place a uuencoded copy of your program in this section. It must uudecode +into a file named is 'prog.c'. The resulting file must follow rule #2. +---end--- + + Regarding the above format: + + * The title must match expression: [a-zA-Z0-9_+=,][a-zA-Z0-9_+=,.-]* + and must be 1 to 10 characters in length. + + It is suggested, but not required, that the title should + incorporate your username; in the case of multiple authors, + consider using parts of the usernames of the authors. + + * All text outside of the above format will be kept confidential, + unless otherwise stated. Notes about an author of a winning entry + will be published unless 'y' was given to that author's 'anon' line. + + * To credit multiple authors, include an ---author--- section for + each author. Each should start with ---author--- line, and + should be found between the ---entry--- and ---build--- sections. + + * The entry's remarks should include: + - what this program does + - how to run the program (sample args or input) + - special compile or execution instructions, if any + - special filename requirements (see rule 4 and 5) + - information about any ---data--- files + - why you think the program is obfuscated + - note if this entry is a re-submission of a previous entry. + - any other remarks (humorous or otherwise) + + * Info files should be used only to supplement your entry. They + should not be required to exist. + + If your entry does not need an info file, skip the ---info--- + section. If your entry needs multiple info files, use multiple + ---info--- sections, one per info file. You should describe + each info file in the ---remark--- section. + + 4) If your entry is selected as a winner, it will be modified as follows: + + 'build' is incorporated into a makefile, and 'build' is removed + 'prog.c' is renamed to your entry's title, followed by an optional + digit, followed by '.c' + your entry is compiled into a file with the name of your entry's + title, possibly followed by a digit + + If your entry requires that a build file exist, state so in your + entry's remark section. The makefile will be arranged to execute a + build shell script containing the 'build' information. The name of + this build shell script will be your entry's title, possibly followed + by a digit, followed by '.sh'. + + If needed, your entry's remarks should indicate how your entry must + be changed in order to deal with the new filenames. + + 5) The build file, the source and the resulting executable should be + treated as read-only files. If your entry needs to modify these files, + it should make and modify a copy of the appropriate file. If this + occurs, state so in your entry's remarks. + + 6) Your entry must be written in C. Use of ANSI C is preferred. Use + of common C (K&R + extensions) is permitted, as long as it does not + cause major problems for ANSI C compilers. + + 7) The program must be of original work. All programs must be in the + public domain. All copyrighted programs will be rejected. + + 8) Entries must be received prior to 09-May-92 0:00 UTC. (UTC is + essentially equivalent to Greenwich Mean Time) Email your entries to: + + ...!{apple,pyramid,sun,uunet}!hoptoad!obfuscate + obfuscate@toad.com + + We request that your message use the subject 'ioccc entry'. + + If possible, we request that you hold off on Emailing your entries + until 1-Mar-92 0:00 UTC. Early entries will be accepted, however. + We will attempt to email a confirmation to the the first author for + all entries received after 1-Mar-92 0:00 UTC. + + 9) Each person may submit up to 8 entries per contest year. Each entry + must be sent in a separate Email letter. + + 10) Entries requiring human interaction to be built are not allowed. + Compiling an entry produce a file (or files) which may be executed. + + +FOR MORE INFORMATION: + + The Judging will be done by Landon Noll and Larry Bassel. Please send + questions or comments (but not entries) about the contest, to: + + ...!{apple,pyramid,sun,uunet}!hoptoad!judges + judges@toad.com + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. The IOCCC rules, guidelines and mkentry + program may be obtained from the judges using the Email address above. + + See the official IOCCC web site: + + http://www.ioccc.org + + for more updated information. + + +chongo /\cc/\ hoptoad!chongo +Larry Bassel {uunet,ucbvax,cbosgd}|sun!lab diff --git a/1992/third b/1992/third new file mode 100644 index 000000000..b5d380206 --- /dev/null +++ b/1992/third @@ -0,0 +1,367 @@ +: immediate _read @ ! - * / <0 exit echo key _pick + +: debug immediate 1 5 ! exit + +: r 1 exit + +: ] r @ 1 - r ! _read ] + +: _main immediate r @ 7 ! ] +_main + + +: _x 3 @ exit +: _y 4 @ exit +: _x! 3 ! exit +: _y! 4 ! exit + + +: swap _x! _y! _x _y exit + +: + 0 swap - - exit + +: dup _x! _x _x exit + +: inc dup @ 1 + swap ! exit + +: h 0 exit + +: , h @ ! h inc exit + + +: ' r @ @ dup 1 + r @ ! @ exit + +: ; immediate ' exit , exit + + +: drop 0 * + ; + +: dec dup @ 1 - swap ! ; + +: tor r @ @ swap r @ ! r @ 1 + r ! r @ ! ; + +: fromr r @ @ r @ 1 - r ! r @ @ swap r @ ! ; + +: tail fromr fromr drop tor ; + +: minus 0 swap - ; + +: bnot 1 swap - ; + +: < - <0 ; + +: logical dup 0 < swap minus 0 < + ; + +: not logical bnot ; + +: = - not ; + +: branch r @ @ @ r @ @ + r @ ! ; + +: computebranch 1 - * 1 + ; + +: notbranch + not + r @ @ @ + computebranch + r @ @ + + r @ ! +; + +: here h @ ; + +: if immediate ' notbranch , here 0 , ; + +: then immediate dup here swap - swap ! ; + +: ')' 0 ; + +: _fix key drop key swap 2 + ! ; + +: fix-')' immediate ' ')' _fix ; + +fix-')' ) + +: find-) key ')' = not if tail find-) then ; + +: ( immediate find-) ; + +( we should be able to do FORTH-style comments now ) + +( this works as follows: ( is an immediate word, so it gets + control during compilation. Then it simply reads in characters + until it sees a close parenthesis. once it does, it exits. + if not, it pops off the return stack--manual tail recursion. ) + +( now that we've got comments, we can comment the rest of the code! ) + +: else immediate + ' branch , ( compile a definite branch ) + here ( push the backpatching address ) + 0 , ( compile a dummy offset for branch ) + swap ( bring old backpatch address to top ) + dup here swap - ( calculate the offset from old address ) + swap ! ( put the address on top and store it ) +; + +: over _x! _y! _y _x _y ; + +: add + _x! ( save the pointer in a temp variable ) + _x @ ( get the value pointed to ) + + ( add the incremement from on top of the stack ) + _x ! ( and save it ) +; + +: allot h add ; + +: maybebranch + logical ( force the TOS to be 0 or 1 ) + r @ @ @ ( load the branch offset ) + computebranch ( calculate the condition offset [either TOS or 1]) + r @ @ + ( add it to the return address ) + r @ ! ( store it to our return address and return ) +; + +: mod _x! _y! ( get x then y off of stack ) + _y + _y _x / _x * ( y - y / x * x ) + - +; + +: '\n' 0 ; +: '"' 0 ; +: '0' 0 ; +: 'space' 0 ; + +: fix-'\n' immediate ' '\n' _fix ; +: fix-'"' immediate ' '"' _fix ; +: fix-'0' immediate ' '0' _fix ; +: fix-'space' immediate ' 'space' _fix ; + +fix-'0' 0 fix-'space' fix-'"' " +fix-'\n' + + +: cr '\n' echo exit + +: printnum + dup + 10 mod '0' + + swap 10 / dup + if + printnum 0 + then + drop echo +; + +: . + dup 0 < + if + 45 echo minus + then + printnum + 'space' echo +; + + +: debugprint dup . cr ; + +( the following routine takes a pointer to a string, and prints it, + except for the trailing quote. returns a pointer to the next word + after the trailing quote ) + +: _print + dup 1 + + swap @ + dup '"' = + if + drop exit + then + echo + tail _print +; + +: print _print ; + + ( print the next thing from the instruction stream ) +: immprint + r @ @ + print + r @ ! +; + +: find-" + key dup , + '"' = + if + exit + then + tail find-" +; + +: " immediate + key drop + ' immprint , + find-" +; + +: do immediate + ' swap , ( compile 'swap' to swap the limit and start ) + ' tor , ( compile to push the limit onto the return stack ) + ' tor , ( compile to push the start on the return stack ) + here ( save this address so we can branch back to it ) +; + +: i r @ 1 - @ ; +: j r @ 3 - @ ; + +: > swap < ; +: <= 1 + < ; +: >= swap <= ; + +: inci + r @ 1 - ( get the pointer to i ) + inc ( add one to it ) + r @ 1 - @ ( find the value again ) + r @ 2 - @ ( find the limit value ) + < + if + r @ @ @ r @ @ + r @ ! exit ( branch ) + then + fromr 1 + + fromr drop + fromr drop + tor +; + +: loop immediate ' inci , here - , ; + +: loopexit + + fromr drop ( pop off our return address ) + fromr drop ( pop off i ) + fromr drop ( pop off the limit of i ) +; ( and return to the caller's caller routine ) + +: isprime + dup 2 = if + exit + then + dup 2 / 2 ( loop from 2 to n/2 ) + do + dup ( value we're checking if it's prime ) + i mod ( mod it by divisor ) + not if + drop 0 loopexit ( exit from routine from inside loop ) + then + loop +; + +: primes + " The primes from " + dup . + " to " + over . + " are:" + cr + + do + i isprime + if + i . 'space' echo + then + loop + cr +; + +: execute + 8 ! + ' exit 9 ! + 8 tor +; + +: :: ; ( :: is going to be a word that does ':' at runtime ) + +: fix-:: immediate 3 ' :: ! ; +fix-:: + + ( Override old definition of ':' with a new one that invokes ] ) +: : immediate :: ] ; + +: command + here 5 ! ( store dict pointer in temp variable ) + _read ( compile a word ) + ( if we get control back: ) + here 5 @ + = if + tail command ( we didn't compile anything ) + then + here 1 - h ! ( decrement the dictionary pointer ) + here 5 @ ( get the original value ) + = if + here @ ( get the word that was compiled ) + execute ( and run it ) + else + here @ ( else it was an integer constant, so push it ) + here 1 - h ! ( and decrement the dictionary pointer again ) + then + tail command +; + +: make-immediate ( make a word just compiled immediate ) + here 1 - ( back up a word in the dictionary ) + dup dup ( save the pointer to here ) + h ! ( store as the current dictionary pointer ) + @ ( get the run-time code pointer ) + swap ( get the dict pointer again ) + 1 - ( point to the compile-time code pointer ) + ! ( write run-time code pointer on compile-time pointer ) +; + +: ) + ' , , ( compile a push that address onto dictionary ) +; + +: does> immediate + ' command , ( jump back into command mode at runtime ) + here swap ! ( backpatch the build> to point to here ) + 2 , ( compile run-code primitive so we look like a word ) + ' fromr , ( compile fromr, which leaves var address on stack ) +; + + +: _dump ( dump out the definition of a word, sort of ) + dup " (" . " , " + dup @ ( save the pointer and get the contents ) + dup ' exit + = if + " ;)" cr exit + then + . " ), " + 1 + + tail _dump +; + +: dump _dump ; + +: # . cr ; + +: var ; +: constant @ ; +: array + ; + +: [ immediate command ; +: _welcome " Welcome to THIRD. +Ok. +" ; + +: ; immediate ' exit , command exit + +[ + +_welcome diff --git a/1992/vern.c b/1992/vern.c new file mode 100644 index 000000000..3020a5a37 --- /dev/null +++ b/1992/vern.c @@ -0,0 +1,212 @@ +#include +; m(x)(x<0?-1:!!x) +; g tj()-J +; a(x)(x<0?-x:x) +; h(x)((x)<=K?x:N-(x)) +; f 9999 +; A return +; H printf{ +; R double +; U int +; V for +; b else +; u while +; B if +U v,w,Y} -1,W,J,p,F,o} f,M,N,K,X,YY,_,P[f],s{ } ; +typedef U{ *L} { } ; +L q[f]; +tj{ } { +U S} m{ v} +{ m{ w} <1||w-Y||!q[J]:{ w-Y&&{ w-Y*2||q[W+Y*{ N+1} ]|| + { J>>K} -K+{ Y-1} / 2} } ||q[J]; +} +z{ } { +_} 5; +A v*w||g; +} +e{ } { +_} -2; +A{ v*v*v-v||w*w*w-w} &&{ J-W-2||{ W&N} -4||{ W>>K!} { Y-1?N:0} } || + q[W+1]||q[W+2]||q[W+K]!} z||P[W+K]*Y<0} ; +} +R VR{ } { +int PZ} 0x7fff; +A{ R} { rand{ } &PZ} /{ R} PZ; +} +l{ } { +_} K+1; +A{ v*w&&a{ v} -a{ w} } ||g; +} +R UC{ } { +R { } 0,d; +u{ { { +} d} VR{ } } <1.0} ; +A d; +} +c{ } { +_} -11; +A a{ v} -a{ w} ||g; +} +I{ ur,n,x} { +W} ur; +J} n; +B{ P[W]!} Y||P[J]} } Y} A J+1; +v} { J&N} -{ W&N} ; +w} { J>>K} -{ W>>K} ; +A q[W]{ } ||{ x&&QL{ W,J,s} } ; +} +TT{ W} { +v} w} 0; +A q[W]{ } +K; +} +s{ } { +U j} -1,{ ; +Y} -Y; +V{ { } 0; { } 0&&!I{ { ,j,0} } A Y} -Y; +} +A!{ Y} -Y} ; +} +bb{ } { +_} 1; +A a{ v*w} -2; +} +uv{ } { +V{ v} 0; v>K} } } 0} { +U S} h{ v&N} ; +q[v]} !S?z:{ S} } 1?bb:{ S} } 2?c:{ v&N>K?l:e} } } ; +} +b B{ h{ v>>K} } } 1} q[v]} k; +b q[v]} 0; +P[v]} !!q[v]*{ 28-v} ; +} +} +y{ } { +U G} Y,{ ; +J} 0; +V{ { } 0; { >K} } } 0} q[J]} l; +B{ q[W]} } e} B{ J-W} } 2} O{ J+1,J-1} ; +b B{ W-J} } 2} O{ W-1,W+1} ; +P[J]} P[W]; +q[W]} 0; +P[W]} 0; +} +QL{ W,J,D} L D; +{ +U HQ} P[J],YX; +L AJ} q[J],XY} q[W]; +O{ W,J} ; +YX} D{ } ; +O{ J,W} ; +q[J]} AJ; +q[W]} XY; +P[J]} HQ; +A YX; +} +C{ } { +U { ,j,BZ} 0; +V{ { } 0; { >K} +h{ { &N} ,G} Y, + S} Z} } z?88:{ Z} } k?11 ++r+{ P[{ ]<0?N-{ { >>K} :{ { >>K} } : +{ Z} } l?124-{ { YY<8&&{ { { &N} !} K|| + { { >>K} !} { P[{ ]>0?0:N} } } ?M:0} : +{ Z} } c?41+r:{ Z} } e?f-r-r:36+r+r} } } } ; +Y} P[{ ]; +V{ j} 0; j>K+K,{ &M-1,1} } { +Y} -Y; +o} -E; +t} -QL{ { >>K+K,{ &M-1,PX} ; +Y} -Y; +B{ t>E} { +++XP; +Q} { ; +E} t; +B{ E>} S} +A++F,E; +} +} +B{ !XP} E} s{ } ?-f+1:0; +p} Q; +A++F,E; +} +RZ{ } { +U { ,j,T} 0; +V{ ; ; } { +y{ } ; +o} f; +do{ +H"\n%d %d %d %s ",X,T,C{ } ,s{ } ?"!":">"} ; +fflush{ stdout} ; +} +u{ scanf{ "%o%o",&{ ,&j} !} 2||I{ { ,j,1} } ; +O{ { ,j} ; +y{ } ; +X} 0; +++YY; +Y} -Y; +T} PX{ } ; +{ } p>>{ K<<1} ; +j} p&{ M-1} ; +B{ I{ { ,j,1} } { +H"Rats!\n"} ; +A; +} +O{ { ,j} ; +Y} -Y; +B{ T>M*M} H"\nHar har.\n"} ; +} +} +main{ ac,av} char**av; +{ +long time{ } ,j} time{ &j} ; +R { } 0; +srand{ { U} j} ; +V{ M} 0; M<} f; ++M} { +} UC{ } ; +M} { /100; +B{ M&3} ++M; +B{ M&1} --M; +V{ N} 1; N*N1?atoi{ av[1]} :2; +uv{ } ; +RZ{ } ; +} diff --git a/1992/vern.hint b/1992/vern.hint new file mode 100644 index 000000000..5c81883d4 --- /dev/null +++ b/1992/vern.hint @@ -0,0 +1,144 @@ +Best of Show: + + Vern Paxson + Lawrence Berkeley Laboratory + Computer Systems Engineering + Bldg. 46A, Room 1123 + Lawrence Berkeley Laboratory + 1 Cyclotron Rd. + Berkeley, CA 94720 USA + + +Judges' comments: + + Try: + make vern + vern 3 <-- default is 2 + + You might start off by giving the following input: + 63 43 + 76 55 + 71 52 + 67 57 (this may take a while) + + The judges assume no responsibility for the obfuscated opening + suggested above. :-) + + For a real quick game try: + vern + + 65 55 + 66 46 + + NOTE: Move values must be restricted to the range 00 to 77. + + NOTE: Because some mailers have problems with the original winning source, + a slightly modified version with shorter lines has been provided. + + +Selected notes from the author: + + This program plays chess. You play the white pieces and the program + the black pieces. Moves are entered as a two-digit number specifying + the coordinates of the piece to be moved followed by another two-digit + number specifying the coordinates of where to move it. Rows and + columns are numbered starting with (0,0) for the upper-lefthand corner + (black's queen's rook) and going to (7,7) for the lower-righthand + corner (white's king's rook). For example, the PK4 opening for white + is indicated as "64 44". Moves are read using scanf() so care should + be taken to not enter the wrong number of fields. + + If the move you enter is illegal then you are just prompted again to + move. If the move is legal then the new position is displayed and the + program starts computing its response. For every 64 board positions it + examines a "." is printed. Once it has chosen its move it simply + displays the board updated to reflect the move. + + Your move is prompted for using a string like "1351 9 2 >". The first + number is how many board positions the program examined when computing + its previous response. The second number is its anticipated value for + the move it just made (with larger numbers meaning an ultimately better + board position for it), and the third number is the evaluation it + assigns to the your current position (larger numbers meaning better + positions for you). A ">" indicates that you are not in check; for + check it is changed to "!". + + There are a few limitations on play: + + o castling can only be done on the king's side; + o prohibitions against castling out of or through check are + not enforced; + o prohibitions against castling if the king or rook have moved + are not enforced; + o pawns are always promoted to queens; + o en passant is not allowed; + o the board-position-repeated-three-times and fifty-moves + stalemates are not recognized; + + If you checkmate the computer it prints "Rats!" and exits. If your own + checkmate is imminent it prints "Har har." but doesn't exit so it can + rub your nose in defeat (which may be a move or two away if you're + playing at a high "ply" - see the next paragraph). Stalemates are not + recognized per se, but when selecting its move the program assigns a + stalemate position a value of 0 so it will try for a stalemate if its + other options are worse. + + The program takes one optional argument indicating the ply (lookahead) + it should use. The default is 2, which is enough to keep it from + making flaming blunders. The higher the ply, the better the play, and + the longer you have to wait. For example, at a ply of 2, a response to + the PK4 opening takes about 1.8 CPU seconds on a SPARC ELC when + compiled -O with Sun cc. A ply of 3 takes 13 CPU seconds (and results + in a different response to PK4) and a ply of 4 takes a little under 4 + CPU minutes (and for PK4 comes up with the same response as a ply of + 3). A ply of 3 is in general good enough to avoid not only flaming + blunders but also immediately stupid moves altogether. A ply of 4 + will find all mate-in-two's. + + + + This program is obfuscated in a number of ways. First, it abuses the + contest rule regarding ';', '{', and '}' in the source not counting + against the non-whitespace character limit if followed by whitespace. + As can be seen from the build file, certain combinations of these + characters followed by a particular whitespace character are expanded + at build time into much-needed text. Without this hack the program + wouldn't pass the character limit. A nice side effect is that the + initial source is gloriously difficult to peruse. + + Second, the rather ho-hum step has been taking of naming each variable + with a one or two letter identifier to render it meaningless (and save + space). This tactic is rather effective in a complex program. + + Third, the board is represented not as an array of pieces but rather as + an array of function pointers (with a separate array representing + whether a piece is white or black). This obfuscates the program's + central data structure. There is one function per type of piece; when + called they return 1 if the current move is illegal for that piece and + 0 if it is legal. The functions also as a side effect set a global + indicating the type of the piece (though the type can also be determined + by comparing the function pointer with the function itself). + + Fourth, there are no independent routines for generating potential + moves. Instead, the program generates its moves by brute force: for + every piece it controls on the board, it attempts to move it to every + square on the board. Those moves that are legal it then explores to + see their effects (using alpha-beta search). This tactic somewhat + obfuscates the algorithm used by the program. + + Finally, there are three key constants that occur throughout the + program: 64, 8, and 3 (lg 8). Rather than making these available at + compile-time, which provides a hint as to what the program is up to, + they are computed probabilistically at run-time. An instance of the + "Inspection Paradox" is used which happens to produce a value that on + average is close to .64. 10000 instances of this value are computed, + added up, and then divided by 100. Sometimes the value produced will + be 63 or 65 instead of 64 (but I've never observed any other values), + so the result is then rounded to the nearest multiple of 4, and then + the other constants are derived from it. + +Copyright (c) 1992, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1992/vern.orig.c b/1992/vern.orig.c new file mode 100644 index 000000000..2bcfc2340 --- /dev/null +++ b/1992/vern.orig.c @@ -0,0 +1,210 @@ +#include +; m(x)(x<0?-1:!!x) +; g tj()-J +; a(x)(x<0?-x:x) +; h(x)((x)<=K?x:N-(x)) +; f 9999 +; A return +; H printf{ +; R double +; U int +; V for +; b else +; u while +; B if +U v,w,Y} -1,W,J,p,F,o} f,M,N,K,X,YY,_,P[f],s{ } ; +typedef U{ *L} { } ; +L q[f]; +tj{ } { +U S} m{ v} +{ m{ w} <1||w-Y||!q[J]:{ w-Y&&{ w-Y*2||q[W+Y*{ N+1} ]|| + { J>>K} -K+{ Y-1} / 2} } ||q[J]; +} +z{ } { +_} 5; +A v*w||g; +} +e{ } { +_} -2; +A{ v*v*v-v||w*w*w-w} &&{ J-W-2||{ W&N} -4||{ W>>K!} { Y-1?N:0} } || + q[W+1]||q[W+2]||q[W+K]!} z||P[W+K]*Y<0} ; +} +R VR{ } { +int PZ} 0x7fff; +A{ R} { rand{ } &PZ} /{ R} PZ; +} +l{ } { +_} K+1; +A{ v*w&&a{ v} -a{ w} } ||g; +} +R UC{ } { +R { } 0,d; +u{ { { +} d} VR{ } } <1.0} ; +A d; +} +c{ } { +_} -11; +A a{ v} -a{ w} ||g; +} +I{ ur,n,x} { +W} ur; +J} n; +B{ P[W]!} Y||P[J]} } Y} A J+1; +v} { J&N} -{ W&N} ; +w} { J>>K} -{ W>>K} ; +A q[W]{ } ||{ x&&QL{ W,J,s} } ; +} +TT{ W} { +v} w} 0; +A q[W]{ } +K; +} +s{ } { +U j} -1,{ ; +Y} -Y; +V{ { } 0; { } 0&&!I{ { ,j,0} } A Y} -Y; +} +A!{ Y} -Y} ; +} +bb{ } { +_} 1; +A a{ v*w} -2; +} +uv{ } { +V{ v} 0; v>K} } } 0} { +U S} h{ v&N} ; +q[v]} !S?z:{ S} } 1?bb:{ S} } 2?c:{ v&N>K?l:e} } } ; +} +b B{ h{ v>>K} } } 1} q[v]} k; +b q[v]} 0; +P[v]} !!q[v]*{ 28-v} ; +} +} +y{ } { +U G} Y,{ ; +J} 0; +V{ { } 0; { >K} } } 0} q[J]} l; +B{ q[W]} } e} B{ J-W} } 2} O{ J+1,J-1} ; +b B{ W-J} } 2} O{ W-1,W+1} ; +P[J]} P[W]; +q[W]} 0; +P[W]} 0; +} +QL{ W,J,D} L D; +{ +U HQ} P[J],YX; +L AJ} q[J],XY} q[W]; +O{ W,J} ; +YX} D{ } ; +O{ J,W} ; +q[J]} AJ; +q[W]} XY; +P[J]} HQ; +A YX; +} +C{ } { +U { ,j,BZ} 0; +V{ { } 0; { >K} +h{ { &N} ,G} Y, + S} Z} } z?88:{ Z} } k?11+r+{ P[{ ]<0?N-{ { >>K} :{ { >>K} } : +{ Z} } l?124-{ { YY<8&&{ { { &N} !} K|| + { { >>K} !} { P[{ ]>0?0:N} } } ?M:0} : +{ Z} } c?41+r:{ Z} } e?f-r-r:36+r+r} } } } ; +Y} P[{ ]; +V{ j} 0; j>K+K,{ &M-1,1} } { +Y} -Y; +o} -E; +t} -QL{ { >>K+K,{ &M-1,PX} ; +Y} -Y; +B{ t>E} { +++XP; +Q} { ; +E} t; +B{ E>} S} +A++F,E; +} +} +B{ !XP} E} s{ } ?-f+1:0; +p} Q; +A++F,E; +} +RZ{ } { +U { ,j,T} 0; +V{ ; ; } { +y{ } ; +o} f; +do{ +H"\n%d %d %d %s ",X,T,C{ } ,s{ } ?"!":">"} ; +fflush{ stdout} ; +} +u{ scanf{ "%o%o",&{ ,&j} !} 2||I{ { ,j,1} } ; +O{ { ,j} ; +y{ } ; +X} 0; +++YY; +Y} -Y; +T} PX{ } ; +{ } p>>{ K<<1} ; +j} p&{ M-1} ; +B{ I{ { ,j,1} } { +H"Rats!\n"} ; +A; +} +O{ { ,j} ; +Y} -Y; +B{ T>M*M} H"\nHar har.\n"} ; +} +} +main{ ac,av} char**av; +{ +long time{ } ,j} time{ &j} ; +R { } 0; +srand{ { U} j} ; +V{ M} 0; M<} f; ++M} { +} UC{ } ; +M} { /100; +B{ M&3} ++M; +B{ M&1} --M; +V{ N} 1; N*N1?atoi{ av[1]} :2; +uv{ } ; +RZ{ } ; +} diff --git a/1992/westley.c b/1992/westley.c new file mode 100644 index 000000000..53bdc75f1 --- /dev/null +++ b/1992/westley.c @@ -0,0 +1,12 @@ + main(l + ,a,n,d)char**a;{ + for(d=atoi(a[1])/10*80- + atoi(a[2])/5-596;n="@NKA\ +CLCCGZAAQBEAADAFaISADJABBA^\ +SNLGAQABDAXIMBAACTBATAHDBAN\ +ZcEMMCCCCAAhEIJFAEAAABAfHJE\ +TBdFLDAANEfDNBPHdBcBBBEA_AL\ + H E L L O, W O R L D! " + [l++-3];)for(;n-->64;) + putchar(!d+++33^ + l&1);} diff --git a/1992/westley.hint b/1992/westley.hint new file mode 100644 index 000000000..1ad95e5c3 --- /dev/null +++ b/1992/westley.hint @@ -0,0 +1,112 @@ +Best Small Program: + + Brian Westley (aka Merlyn LeRoy) + Digi International + 1026 Blair Ave. + St. Paul, MN 55104 + USA + + +Judges' comments: + + If lost: + make whereami + + Then run: + whereami lat long + + Where lat and long correspond to your latitude and longitude. + + To find the approximate place where this entry was judged, type: + + whereami 37 -122 (- means west of meridian) + + +Selected notes from the author: + + Run the program with your latitude & longitude as integer + arguments; it will produce a map made up of '!' with the given + position marked with either a '"' (if the position is over a '!') + or a '#' (if the position is over a space). Southern latitudes + and western longitudes are entered as negative numbers. For + example, to find San Francisco, run with "prog 38 -122". The + resolution of the map is five degrees horizontally, ten degrees + vertically. The map is a Mercator projection with equal spacing + of the latitudes, so the areas near the poles are very distorted. + Latitudes near the poles and Antarctica are not shown. + + The program requires the ASCII character set, putchar(), atoi(), + and a display that auto-wraps at 80 characters(!). If your display + does not work this way, you will have to massage the output; + for example, you can pipe it to a file and edit it with vi, + which will do autowrap for you. + + Lint complains that main() returns a random value and I'm not + checking the value that putchar() returns. Scandalous! + + If you run it with fewer than 2 arguments, it will likely + give you an exception, as it will access arguments that + don't exist and characters before a string constant. + + How it works: + + The map is printed as one long string of ' ' and '!' characters, + with the autowrap used to stack up slices of 80. The map data is + a string; the first character is how many '!'s are printed + ('A'=1, 'B'=2, etc), the second character is how many ' 's, the + third is how many '!'s, etc. ASCII characters less than 'A' + print no characters but still change the polarity, so any map + of ' 's and '!'s is possible. This is done in the putchar() + argument as "33^l&1", where l is the character position+4; if + l is odd, ' ' is printed, if l is even, '!' is printed. + + The position of latitude & longitude is changed into a single + character position within the one long string via the first + expression "d = latitude/10*80 - longitude/5 - offset" The + latitude is divided by ten because the vertical resolution is + ten degrees, then multiplied by 80 because of the 80 character + wrap (i.e. each ten degrees moves the position up or down one + entire row). The longitude is divided by five and added, because + five degrees of change moves the location one character. The signs + are opposite because latitude is decreasing and longitude is + increasing as you go from upper left to lower right. The offset + is where the origin (latitude=0, longitude=0) is found. + + The position counting down to zero changes the putchar() from + printing ('!' or ' ') to printing ('"' or '#'). + + The "H E L L O, W O R L D!" string inside the data string + prints the line of blanks past Tierra del Fuego and the last + blank line. It's just for show, really. + + Since the resolution is coarse, a few costal cities are shown to + be just off the map; this is an unavoidable artifact. The map + is reasonably accurate. + + Here are some cities you might like to try: + + New York 41 -74 Los Angeles 34 -118 + London 52 0 Paris 45 2 + Moscow 56 38 Beijing 40 116 + New Delhi 29 77 Rio de Janeiro -23 -43 + Sydney -34 151 Tokyo 36 140 + +For a domestic (USA) version with higher resolution, try: +---cut--- +main(l,a,n,d)char**a;{for(d=atoi(a[1])/2*80-atoi(a[2])-2043; +n="bnaBCOCXdBBHGYdAP[A M E R I C A].AqandkmavX|ELC}BOCd" +[l++-3];)for(;n-->64;)putchar(!d+++33^l&1);} +---cut--- +The code will test the 80-column wrap and document itself if it is +joined together as one 160-character line and listed. You should see: + +main(l,a,n,d)... +[A M E R I C A]... + +...going down the left edge if your terminal autowraps at 80 characters. + +Copyright (c) 1992, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1993/1993.tar.bz2 b/1993/1993.tar.bz2 new file mode 100644 index 000000000..fc53377a7 Binary files /dev/null and b/1993/1993.tar.bz2 differ diff --git a/1993/Makefile b/1993/Makefile new file mode 100644 index 000000000..daa03a5ec --- /dev/null +++ b/1993/Makefile @@ -0,0 +1,147 @@ +# %W% %G% %U% +# +# 1993 makefile +# +# Copyright (c) 1993, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL=/bin/sh +CHMOD=chmod +CP=cp +RM=rm +SED=sed +LN=ln + +# flags for ANSI compiles +# +# NOTE: Some ANSI compilers make use of -Xa to turn on ANSI mode, +# others such as gcc may want -ansi, others may want nothing +# at all. Adjust the CFLAGS line as needed. +# +# NOTE: Some compilers cannot optimize, or optimize some entries +# entries incorrectly. You might want need to turn on -O +# to see if your compiler can handle them. +# +#CFLAGS=-O -Xa +#CFLAGS=-Xa +CFLAGS= -ansi +#CFLAGS= + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +#CC=cc +CC=gcc + +# misc shell babble +# +NOINCLUDE=$(SED) -e 's/^.\([ ]*\)include/%include/' +SPACECLEAN=$(SED) -e 's/\([^ ]\)\([ ]\)[ ][ ]*/\1\2/g' +CPPCLEAN=$(GREP) -v '^. [0-9][0-9]*' + +# winners that compile under ANSI C +# +WINNERS= ant cmills dgibson ejb jonth leo lmfjyh plummer rince schnitzi vanb +ALT_NAMES= ag ag.txt chris mind jkb + +all: $(WINNERS) $(ALT_NAMES) + +ant: ant.c + ${CC} ${CFLAGS} ant.c -o ant + +cmills: cmills.c + ${CC} ${CFLAGS} cmills.c -o cmills -lX11 + +dgibson: dgibson.c dgibson.sh dgibson.data1 + -@if [ ! -f life.d ] ; then \ + echo "cp dgibson.data1 life.d"; \ + cp dgibson.data1 life.d; \ + echo "rm -f data.name"; \ + rm -f data.name; \ + echo "echo dgibson.data1 > data.name"; \ + echo dgibson.data1 > data.name; \ + fi + ${CC} ${CFLAGS} dgibson.c -o dgibson + -${CHMOD} +x dgibson.sh + +ejb: ejb.c + ${CC} ${CFLAGS} ejb.c -o ejb + +jonth: jonth.c + ${RM} -f jonth.tmp.c + ${SED} -e s/\^\ /#define/ -e 's/@/Window(D,/g' jonth.c > jonth.tmp.c + ${CC} ${CFLAGS} \ + -DXX1='H 19;}M(J,4)}N H 20;}M(T,4)}q(m,w,' \ + -DXX='XKeycodeToKeysym(D,o[13],0);K 12:Y();}R;}d XX1' \ + jonth.tmp.c -o jonth -lX11 + +leo: leo.c + ${CC} ${CFLAGS} leo.c -o leo + +lmfjyh: lmfjyh.c + ${RM} -f \"\;main\(\)\{puts\(\"Hello\ World!\"\)\;\}char\*C=\".c + ${CP} lmfjyh.c \"\;main\(\)\{puts\(\"Hello\ World!\"\)\;\}char\*C=\".c + ${CC} ${CFLAGS} \ + \"\;main\(\)\{puts\(\"Hello\ World!\"\)\;\}char\*C=\".c \ + -o lmfjyh + +plummer: plummer.c + ${CC} ${CFLAGS} plummer.c -o plummer + +rince: rince.c + ${CC} ${CFLAGS} rince.c -lcurses -ltermcap -o rince + +# NOTE: this is the original source that won +# +rince.orig: rince.orig.c + $(CC) $(CFLAGS) rince.orig.c -lcurses -ltermcap -o rince.orig + +schnitzi: schnitzi.c + ${CC} ${CFLAGS} schnitzi.c -o schnitzi + +vanb: vanb.c + ${CC} ${CFLAGS} -DO5=main vanb.c -o vanb + + +# alternate names for selected entries +# +ag: ant + $(RM) -f ag + $(LN) ant ag + +ag.txt: ant.txt + $(RM) -f ag.txt + $(LN) ant.txt ag.txt + +chris: cmills + $(RM) -f chris + $(LN) cmills chris + +mind: leo + $(RM) -f mind + $(LN) leo mind + +jkb: rince + $(RM) -f jkb + $(LN) rince jkb + +tidy: + ${RM} -f \"\;main\(\)\{puts\(\"Hello\ World!\"\)\;\}char\*C=\".c + +clean: + $(RM) -f *.o a.out core + +clobber: clean tidy + $(RM) -f $(WINNERS) + $(RM) -f $(ALT_NAMES) + ${RM} -f jonth.tmp.c life.d rince.orig data.name data.name2 + +nuke: clobber + @true + +install: all + cat $(WINNERS) > /dev/null diff --git a/1993/README b/1993/README new file mode 100644 index 000000000..3c430d952 --- /dev/null +++ b/1993/README @@ -0,0 +1,59 @@ +1993 marked the "The Tenth International Obfuscated C Code Contest" + +Copyright (c) 1993, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + +Use make to compile entries. It is possible that on BSD or non-unix +systems the makefile needs to be changed. See the Makefile for details. + +Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitters. + +Read over the makefile for compile/build issues. Your system may +require certain changes (add or remove a library, add or remove a +#define). + +Name and address information are separated from the actual program +prior to judging. This eliminates any chance that we would bias our +judging for/against any person or group. + +This year was the first year that ANSI C was the default. Use of +classic K&R C was allowed so long as ANSI C compilers could still +compile the entry. If you do not have an ANSI C compiler, you may +not be able to compile the winners, sorry! + +A few notes regarding future contests: + +Be sure to wait until the 1994 rules are posted before submitting entries. +Rules differ from year to year, sometimes in significant ways. + +In 1994, we will retract the guideline that discouraged the use of C +constructs such as 3["curds"]. At one time, certain ANSI compilers did +not consider such expressions to be valid ANSI C. Alert readers noted +that the current ANSI standard considered them to be valid. We were +unable to find an ANSI C compiler that flagged such expressions as +errors. + +Please send us comments and suggestions what we have expressed above. +Also include anything else that you would like to see in future contests. +Send such email to: + + ...!{sun,pacbell,uunet,pyramid}!hoptoad!judges + judges@toad.com + +If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used. + +If you have problems with any of the entries, AND YOU HAVE A FIX, please +Email the fix (patch file or the entire changed file) to the above address. + +Credits: + +We would like to thank Barbara Frezza for her role as official chef +of the contest. Landon Noll and Larry Bassel appreciated the opportunity +to serve as official taste testers. And as usual, the food was excellent. diff --git a/1993/ant.c b/1993/ant.c new file mode 100644 index 000000000..35df31cb4 --- /dev/null +++ b/1993/ant.c @@ -0,0 +1,307 @@ +#define D ++*p +#define B **p +#define W while +#define R return +#define E else +#define Q if +#define G fprintf(stderr, + + +#include + +#ifndef A +#define A 512 +#endif + +typedef int I; +typedef char C; +typedef void V; + +I z; +I f; +I x; +I a[A], b; + + +I d[A][A]; +I m[A], n, o; + +I N(); +I M(); +I P(); +I U(); +V X(); +V T(); +V F(); +V L(); +V O(); + +I +main(c, p) +I c; +C B; +{ + I i; + FILE *j; + C *k, l[BUFSIZ+1]; + + Q (--c < 1) { + G "usage: ag [js...]\n"); + R 2; + } + + + N(-3); + N(-6-b); + N(0); + N(-3-b); + + X(&(*++p)); + + *l = '\n'; + o = 1; + i = 1; + do { + k = "-"; + j = stdin; + Q (1 < c && **++p != '-') { + Q (!(j = fopen(k = *p, "r"))) { + G + "ag: Failed to open '%s'.\n", k); + i = 3; + continue; + } + } + W (fgets(l+1, BUFSIZ, j)) { + Q (M(l)) { + printf("%s:%s", k, l+1); + i = 0; + } + } + fclose(j); + } W (1 < --c); + R i; +} + + +V +X(p) +C B; +{ + I i, j; + i = N(-3); + T(p); + W (B == '|') { + D; + j = N(-3); + N('\n'); + a[i] = -4-b; + i = N(-3); + T(p); + a[j] = -4-b; + } +} + + +V +T(p) +C B; +{ + W (B != '|' && (!x || B != ')') && B) + F(p); +} + + +V +F(p) +C B; +{ + I i = N(-3); + Q (B == '^') { + D; + N('\n'); + } E Q (B == '$') { + D; + N('\n'); + } E Q (B == '(') { + D; + ++x; + X(p); + Q (B != ')') { + G "ag: Missing ')'.\n"); + exit(3); + } + --x; + D; + } E { + L(p); + } + Q (B == '*') { + D; + a[i] = -4-b; + N(-5-i); + } E Q (B == '?') { + D; + a[i] = -4-b; + } +} + + +V +L(p) +C B; +{ + I i, j; + Q (B == '.') { + N(0); + } E Q (B == '[') { + D; + i = N(-2); + Q (B == '^') { + D; + a[i] = -1; + } + Q (B == ']') { + D; + N(']'); + } + W ((i = B) != ']') { + Q ((*p)[1] == '-' && i < (j = (*p)[2])) { + W (i <= j) + N(i++); + *p += 3; + } E { + N(i); + D; + } + } + N('\n'); + } E { + Q (B == '\\') + D; + N(B); + } + D; +} + + +I +N(c) +I c; +{ + Q (A <= b) { + G "ag: Pattern too long.\n"); + exit(3); + } + a[b] = c; + R b++; +} + + +V +O(p) +I p; +{ + I i = n; + Q (b <= p) + R; + Q (a[p] < -2) { + Q (a[p] != -3) + O(-4-a[p]); + O(p+1); + } E Q (!a[p] || a[p] == z || P(&p)) { + + W (i < o) + Q (m[i++] == p) + R; + + f = U(p+1); + + Q (A <= o) { + G "ag: Out of space.\n"); + exit(3); + } + + m[o++] = p; + } +} + + +I +P(p) +I *p; +{ + I i = 0, j = 0; + Q (a[*p] == -2 || (j = a[*p] == -1)) { + W (a[D] != '\n') + Q (a[*p] == z) + i = 1; + } + R i ^ j; +} + + +I +U(p) +I p; +{ + R ( + f || p == b || ( + a[p] < -2 && ( + (a[p] != -3 && U(-4-a[p])) + || U(p+1) + ) + ) + ); +} + + +I +M(p) +C *p; +{ + I c, i, j, k; + f = c = 0; + W (*p && 0 <= c) { + Q (0 < (i = d[c][*p])) { + + c = i; + } E { + + z = *p; + i = d[c][0]; + j = n = o; + do + O(m[i++]+1); + W (m[i] != 2); + + + i = k = 0; + W (i < n) { + Q (m[i] == 2) { + j = n; + ++k; + } + Q (m[i++] == m[j]) { + Q (o <= ++j) { + j = n; + Q (m[i] == 2) { + + o = n; + break; + } + } + } E { + j = n; + } + } + Q (n < o) + + d[++k][0] = n; + c = d[c][*p] = f ? -1 : k; + } + ++p; + } + R c < 0; +} + diff --git a/1993/ant.hint b/1993/ant.hint new file mode 100644 index 000000000..fb513e3ec --- /dev/null +++ b/1993/ant.hint @@ -0,0 +1,46 @@ +Best Utility: + + Anthony Howe + Mortice Kern Systems, Inc. + Unit 1, 14 Weber Street North, + Waterloo, Ontario, N2J 3G4 + Canada + + +Judges' comments: + + To use: + make ant + ./ant 'ERE' [file ...] + + where: + ERE is an extended regular expression + file a file to process (default is stdin) + + You may also want to try the author's test suite: + make -f ant.test.mk + + See the author's Posix P1003.2-like documentation file ant.txt + for more information. + + This program demonstrates that Posix doesn't guarantee readability. :-) + + +Selected notes from the author: + + Some of the features of my entry are: + + o "Lengthy" POSIX.2 style specification and manual :) :) + o Useful subset of POSIX.2 Extended Regular Expressions. + o Recursive ERE parser/compiler that generates an NFA railroad. + o Lazy NFA to DFA evaluation to improve performance speed. + o Code tested on a variety of platforms. + o Make driven test script. + o Can be compiled with ANSI or K&R C. + o Not a toy, but actually useful and usable on systems that use DOS. + +Copyright (c) 1993, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1993/ant.test.mk b/1993/ant.test.mk new file mode 100644 index 000000000..afb54deae --- /dev/null +++ b/1993/ant.test.mk @@ -0,0 +1,240 @@ +# +# Test Driver for Anthony's Grep +# +# Public Domain 1992, 1993 by Anthony Howe. No warranty. +# + +SHELL=/bin/sh +PRG=./ant + +all: ant char word anchor literal wild closure option branch sub class + +# +# Built the entry +# +ant: Makefile + make -f Makefile ant + +# +# Test simple text patterns without the use of meta characters. +# + +empty: + $(PRG) '' ant.test.mk + +char: + $(PRG) 'q' ant.test.mk + +word: + $(PRG) 'simple' ant.test.mk + +# +# Test meta characters. +# + +anchor: anchor1 anchor2 anchor3 anchor4 anchor5 + +anchor1: + $(PRG) '^anchor1' ant.test.mk + +anchor2: + $(PRG) 'Grep$$' ant.test.mk + +# +# Find all empty lines. +# +anchor3: + $(PRG) '^$$' ant.test.mk + +# +# This is valid but will never match. +# +anchor4: + -$(PRG) 'x^a' ant.test.mk + +# +# This is valid but will never match. +# +anchor5: + -$(PRG) 'mk$$x' ant.test.mk + +literal: literal1 literal2 + +# +# Every line with a dollar-sign. +# +literal1: + $(PRG) '\$$' ant.test.mk + +# +# Every line with a backslash. +# +literal2: + $(PRG) '\\' ant.test.mk + +# +# wild #1# +# wild #a# +# wild #%# +# +wild: + $(PRG) '#.#' ant.test.mk + +# +# closure !! +# closure !x! +# closure !xxxxxx! +# +closure: + $(PRG) 'closure !x*!' ant.test.mk + +# +# option ++ +# option +a+ +# option +b+ +# option +c+ +# option +abc+ +# +option: option1 option2 + +option1: + $(PRG) '+b?+' ant.test.mk + +option2: + $(PRG) '+.?+' ant.test.mk + +branch: branch1 branch2 branch3 branch4 branch5 branch6 + +branch1: + $(PRG) 'q|simple' ant.test.mk + +# +# This pattern should be the same as '(^all)|(Public)|(Grep$)'. +# +branch2: + $(PRG) '^all|Public|Grep$$' ant.test.mk + +# +# This pattern should generate the same results as branch2. +# +branch3: + $(PRG) 'Grep$$|^all|Public' ant.test.mk + +# +# Null expression between start of pattern and vertical-line. +# +branch4: + $(PRG) '|Grep' ant.test.mk + +# +# Null expression between vertical-line and end of pattern. +# +branch5: + $(PRG) 'Grep|' ant.test.mk + +# +# Null expression between vertical-line and vertical-line. +# +branch6: + $(PRG) 'all||Grep' ant.test.mk + +# +# sub aabcbcbcxx +# sub aagxx +# sub aaggxx +# sub aadddxx +# sub aaxx +# +sub: sub0 sub1 sub2 sub3 sub4 sub5 lparen1 lparen2 rparen1 rparen2 + +# +# Null sub-expressions. +# +sub0: + $(PRG) 's()u()b()' ant.test.mk + +sub1: + $(PRG) '#(1|%)#' ant.test.mk + +sub2: + $(PRG) 'aa((bc)*|g)xx' ant.test.mk + +# +# Null expression between the left-parenthesis and the vertical-line. +# +sub3: + $(PRG) '#(|1)#' ant.test.mk + +# +# Null expression between the vertical-line and the right-parenthesis. +# +sub4: + $(PRG) '#(1|)#' ant.test.mk + +# +# Null expression between the vertical-line and the right-parenthesis. +# +sub5: + $(PRG) '#(%||1)#' ant.test.mk + +# +# Missing left-parenthesis generates an error. +# +lparen1: + -$(PRG) 'left ( only' ant.test.mk + +lparen2: + $(PRG) 'left \( only' ant.test.mk + +# +# Right-parenthesis without preceding left parenthesis should be a literal. +# +rparen1: + -$(PRG) 'right ) only' ant.test.mk + +rparen2: + $(PRG) 'right \) only' ant.test.mk + +# +# 12345678 +# ----------------- +# =0= 1 45 +# =1= 2 45 78 +# =2= 2 45 +# =3= 2 45 78 +# =4= 2 45 +# =5= 2 45 +# =6= 2 45 +# =7= 2 45 +# =8= 2 45 +# =9= 1 45 +# =]= 23 6 +# =-= 2 4 678 +# = = 2 4 6 +# +class: class1 class2 class3 class4 class5 class6 class7 class8 + +class1: + $(PRG) '=[09]=' ant.test.mk + +class2: + $(PRG) '=[^09]=' ant.test.mk + +class3: + $(PRG) '=[]]=' ant.test.mk + +class4: + $(PRG) '=[^]]=' ant.test.mk + +class5: + $(PRG) '=[0-9]=' ant.test.mk + +class6: + $(PRG) '=[^0-9]=' ant.test.mk + +class7: + -$(PRG) '=[3-1]=' ant.test.mk + +class8: + $(PRG) '=[-13]=' ant.test.mk + diff --git a/1993/ant.txt b/1993/ant.txt new file mode 100644 index 000000000..c29317475 --- /dev/null +++ b/1993/ant.txt @@ -0,0 +1,376 @@ +0. NAME + + ag Anthony's Grep + + +1. SYNOPSIS + + ag [file...] + + +2. DESCRIPTION + +The AG utility shall search input files, selecting lines matching a +pattern. An input line shall be selected if the pattern, treated as a +subset of Extended Regular Expressions as described by POSIX.2 +Standard section 2.8.4, matches any part of the line; a null pattern +shall match every line. Each selected input line shall be written to +the standard output. + +Regular expression matching shall be based on text lines, which are +separated by a character. A regular expression cannot +contain a and there is no way for a pattern to match a + found in the input. + + +3. OPTIONS + +None. + + +4. OPERANDS + +pattern Specify one pattern to be used during the search for + input. See Extended Regular Exprssions below on what + constitutes a valid pattern. + +file A pathname of a file to be searched for the pattern. + If no file operands are specified or the file operand + is dash (-), the standard input shall be used. + + +5. EXTERNINAL INFLUENCES + +5.1. STANDARD INPUT + +The standard input shall be used only if no file operands are +specifed. See Input Files. + + +5.2. INPUT FILES + +The input files shall be text files. + + +5.3. ENVIRONMENT VARIABLES + +No environment variables are used. + + +5.4. ASYNCHRONOUS EVENTS + +Default. + + +6. EXTERNAL EFFECTS + +6.1. STANDARD OUTPUT + +For each selected input line from a file, a single output line shall +be written: + + "%s:%s\n", file, line + +Standard input will have the filename dash (-). + + +6.2. STANDARD ERROR + +Standard error is used for diagnostic messages only. + + +6.3. OUTPUT FILES + +None. + + +7. EXTENDED DESCRIPTION + +7.1. EXTENDED REGULAR EXPRESSIONS + +7.1.1. MATCHING A SINGLE CHARACTER + +An ERE ordinary character, a special character preceded by a +backslash, or a period shall match a single character. A bracket +expression shall match a single character. An ERE matching a single +character enclosed in parentheses shall match the same as the ERE +without parentheses would have matched. + + +7.1.1.1. ERE ORDINARY CHARACTERS + +An oridinary character is an ERE that matches itself. An ordinary +character is any character in the supported character set, except for +the ERE special characters listed in 7.1.1.2. The interpretation of +an ordinary character preceded by a backslash (\) is the ordinary +character. + + +7.1.1.2. ERE SPECIAL CHARACTERS + +An ERE special character has special properties in certain contexts. +Outside of those contexts, or when preceded by a backslash, such a +character shall be an ERE that matches the special character itself. +The extended regular expression special characters and the contexts in +which they have their special meaning are: + + . [ \ ( The period, left-bracket, backslash, and left- + parenthesis are special except when used in a + bracket expression. Outside a bracket + expression, a left-parenthesis immediately + followed by a right-parenthesis will be + treated as a null expression. + + ) The right-parenthesis is special when matched + with a preceding left-parenthesis, both + outside of a bracket expression. + + * ? The asterisk and question-mark are special + except when used in a bracket expression. + Results are undefined if this character + appears first in an ERE, or immediately + following a vertial-line, circumflex, or + left-parenthesis. + + | The vertical-line is special except when used + in a bracket expression. A vertical-line + appearing first or last in an ERE or + immediately following a vertical-line or + left-parenthesis, or preceding a + right-parenthesis, produces a null expression. + + ^ The circumflex shall be special when used as + an anchor or, as the first character of a + bracket expression. + + $ The dollar-sign shall be special when used as + an anchor. + + +7.1.1.3 PERIODS IN ERE + +A period (.), when used outside of a bracket expression, is an ERE +that shall match any character in the supported character set except +NUL. + +7.1.2. ERE BRACKET EXPRESSION + +A bracket expression (an expression enclosed in square brackets, []), +is an ERE that matches a single character contained in the nonempty +set of characters represented by the bracket expression. + +The following rules and definitions apply to bracket expressions: + + 1) A bracket expression is either a matching list expression + or a nonmatching list expression. It consists of one or more + characters and/or range expressions. The right-bracket (]) + shall lose its special meaning and represent itself in a + bracket expression if it occurs first in the list [after an + initial circumflex (^), if any]. Otherwise, it shall + terminate the bracket expression. The special characters + period (.), asterisk (*), left-bracket ([), and backslash (\) + shall lose their special meaning within a bracket expression. + + 2) A matching list expression specifies a list that shall match + any one of the expressions represented in the list. The first + character of the list shall not be the circumflex. For + example, [abc] is an ERE that matches any of a, b, or c. + + 3) A nonmatching list expression begins with a circumflex (^), + and specifies a list that shall match any character except for + the expressions represented in the list after the leading + circumflex. For example, [^abc] is an ERE that matches any + character except a, b, or c. The circumflex shall have this + special meaning only when it occurs first in the list, + immediately following the left-bracket. + + 4) A range expression represents the set of characters that + fall between two elements in the current collation sequence, + inclusive. It shall be expressed as the starting point and + the ending point separated by a hyphen (-). + + In the following, all examples assume the collation sequence + specified for the POSIX Locale (a.k.a ASCII Character Set), + unless another collation sequence is sepecifically defined + by the hardware. + + The starting range point and the ending range point shall be a + collating element (character). The ending range point shall + collate higher than the starting range point; otherwise the + expression shall be treated as invalid. + + The interpretation of a range expression where the ending + range point is the starting range point of a subsequent range + expression is undefined. + + The hyphen character shall be treated as itself if it occurs + first (after an initial ^, if any) or last in the list, or as + an ending range point in a range expression. As examples, the + expressions [-ac] and [ac-] are equivalent and match any of + the characters a, c, or -; the expressions [^-ac] and [^ac-] + are equivalent and match ant character except a, c, -; the + expression [%--] matches any of the characters between % and + - inclusive; the expression [--@] matches any of the + characters between - and @ inclusive; and the expression + [a--@] is invalid, because the letter a follows the symbol - + in the POSIX Locale. + + +7.1.3. ERE MATCHING MULTIPLE CHARACTERS + +The following rules shall be used to construct EREs matching multiple +characters from EREs matching a single character: + + 1) A concatenation of EREs shall match the concatenation of the + character sequences matched by each component of the ERE. A + concatenation of EREs enclosed in parentheses shall match + whatever the concatenation without parentheses matches. For + example, both the ERE cd and the ERE (cd) are matched by the + third and forth character of the string abcdefabcdef. + + 2) When an ERE matching a single character, or a concatention of + EREs enclosed in parentheses is followed by the special + character asterisk (*), together with that asterisk it shall + match what zero or more consecutive occurences of the ERE + would match. For example, the ERE b*c matches the first + character in the string cabbbcde, and the ERE b*cd matches the + third through seventh characters in the string + cabbbcdebbbbbbcdbc. And, [ab]* and [ab][ab] are equivalent + when matching the string ab. + + 3) When an ERE matching a single character or an ERE enclosed in + parentheses is followed by the special character question-mark + (?), together with that question mark it shall match what zero + or one consecutive occurences of the ERE would match. For + example, the ERE b?c matches the second character in the + string acabbbcde. + +The behaviour of multiple adjacent duplication symbols (*, ?) produces +undefined results. + + +7.1.4. ERE ALTERATION + +Two EREs separated by the special character vertical-line (|) shall +match a string that is matched by either. For example, the ERE +a((bc)|d) matches the string abc and the string ad. Single +characters, or expressions matching single characters, separated by +the vertical-line and enclosed in parentheses, shall be treated as an +ERE matching a single character. + + +7.1.5. ERE PRECEDENCE + +The order of precedence shall be as shown in the table below, from +high to low: + + escaped characters \ + bracket expression [ ] + grouping ( ) + single-character-ERE duplication * ? + concatenation + anchoring ^ $ + alteration | + +For example, the ERE abba|cde matches either the string abba or the +string cde (because concatenation has a higher order of precedence +than alteration). + + +7.1.6. ERE EXPRESSION ANCHORING + +An ERE can be limited to matching strings that begin or end a line; +this is called anchoring. The circumflex and dollar-sign special +characters shall be considered ERE anchors in the following contexts: + + 1) A circumflex (^) outside a bracket expression shall anchor + the (sub)expression it begins to the beginning of a string; + such a (sub)expression can match only a sequence starting at + the first character of a string. For example, the EREs ^ab + and (^ab) match ab in the string abcdef, but fail to match in + the string cdefab, and the ERE a^b is valid, but can never + match because the character a prevents the expression ^b from + matching the first character of a string. + + 2) A dollar-sign ($) outside a bracket expression shall anchor + the (sub)expression it ends to the end of a string; such a + (sub)expression can match only a sequence ending at the last + character of a string. For example, the EREs ef$ and (ef$) + match ef in the string abcdef, but fail to match in the string + cdefab, and the ERE e$f is valid, but can never match because + the character f prevents the expression e$ from matching the + last character of a string. + + +8. EXIT STATUS + +The following exit codes will be returned: + + 0 Successful match. + 1 No match. + 2 Usage error. + 3 General error. + + +9. INSTALLATION + +AG can be built on any system providing at least K&R C. It has been +tested on + + o SunOS with GCC + o ATARI Mega ST with Sozobon C + o PC clone with Turbo C and WatCom C + o Interactive UNIX System V/386 release 3.2 + +For most machines, the compile command line should be + + cc -O -o ag ag.c + +PC class machines may require that medium or large memory model be used +and that ARRAY be set to 256. For Watcom C the command line would be + + wcl -ml -DARRAY=256 ag.c + +The value ARRAY represents the size of the compiled pattern array and +the size of the array used to record matched states. The default +value choosen should handle most patterns. ARRAY can be overridden on +the command line with -DARRAY=nn, where 255 < nn < INT_MAX. + + +10. REFERENCES + +[Aho86] Aho, Sethi, and Ullman, "Compilers - Principles, Techniques, + and Tools", Addison-Wesley, 86, ISBN 0-201-10088-6, chapter 3 + +[K&P81] Kernighan and Plauger, "Software Tools in Pascal". + Addison-Wesley, 81, ISBN 0-201-10342-7, chapter 5 + +[Mil87] Webb Miller, "A Software Tools Sampler", + Prentice Hall, 87, ISBN 0-13-822305-X, chaper 4 + +[POSIX] POSIX.2 Standard, 2.8.4 Extended Regular Expressions, 4.28 Grep + + +11. FILES + +ag.c Obfuscated source +ag.txt Manual for AG +agag.c Unobfuscated source +test.mk Makefile test driver for AG. + + +12. BUGS + +The expression (a*)* compiles but loops forever. + +There is no check for trailing backslash (\) in the pattern. + +There is no check for unbalanced brackets. Omitting a closing bracket +will generate a "Patern too long" error, which is not the real error. + + +13. NOTICES + +Public Domain 1992, 1993 by Anthony Howe. No warranty. + + diff --git a/1993/cmills.c b/1993/cmills.c new file mode 100644 index 000000000..84a726875 --- /dev/null +++ b/1993/cmills.c @@ -0,0 +1,54 @@ +long +z[7992],W,H,*t=z,j,k,*T=z,n,b; +#include +Window*E,D,s,w[999],*e=w; +Display*d; +Pixmap +p; +m(w,h,x,y,u,v){ +#define C XCreateSimpleWindow(d, +XSetWindowBackgroundPixmap(d,s=C*e=C +#define l(n)t[n]=T[n]+ +D,l(0)x,l(1)y,t[2]=w,t[3]=h,1,b,0),l(6)-x,l(7)-y,W,H,0,0,0),p); +l(4)u; +l(5)v; +#define M XMapRaised(d, +M +s); +M*e++); +t+=8; +} +main(c,g)char**g; +{ +XSetWindowAttributes +a; +XGCValues +v; +n=DefaultScreen(d=XOpenDisplay(0)); +p=XCreatePixmap(d,D=RootWindow(d,n),W=DisplayWidth(d,n),H=DisplayHeight(d,n),DefaultDepth(d,n)); +v.subwindow_mode=IncludeInferiors; +XCopyArea(d,D,p,XCreateGC(d,D,GCSubwindowMode,&v),0,0,W,H,0,0); +a.override_redirect=True; +XChangeWindowAttributes(d,D=C +D,0,0,W,H,0,0,b=BlackPixel(d,n)),CWOverrideRedirect,&a); +M +D); +m(W,H,0,0,3,3); +for(c=c^1?atoi(g[1]):9; +; +)for(T=z,n=e-(E=w); +n--; +T+=8,++E){ +XMoveWindow(d,*E,*T+=T[4]*c,T[1]+=T[5]*c); +j=0; +#define F(n,o,s)o+T[n-4]s-0&&++j&&T[n]s!1&&(T[n]=0-T[n])|| +if((F(4,0,<)F(4,T[2]-W,>)F(5,0,<)F(5,T[3]-H,>)1)&&j&&(j=T[2]/2)&&(k=T[3]/2)&&e-w<997&&rand()%32768<=T[2]*T[3]*(T[4]*T[4]+T[5]*T[5])/999){ +m(T[2]-j,T[3]-k,j,k,2,2); +m(j,T[3]-k,0,k,-2,-2); +m(T[2]-j,k,j,0,2,-2); +T[7]-=2; +XResizeWindow(d,*E,T[2]=j,T[3]=k); +T[6]-=2; +} +} +} diff --git a/1993/cmills.hint b/1993/cmills.hint new file mode 100644 index 000000000..eaf21a7d5 --- /dev/null +++ b/1993/cmills.hint @@ -0,0 +1,72 @@ +"Bill Gates" Award: + + Chris Mills + Pagine Corporation + 1961-A Concourse Drive + San Jose, CA 95131 + USA + + +Judges' comments: + + From the San Jose Mercury News (May 15, 1993 page 20A "West Hackers + trounce East in computer quiz game"): + + "Since 1984, a contest has been held on Usenet for the most + unreadable, creative, bizarre but working C program", Gates + said. "What is the name of this contest?" + + "Windows," shot back Gassee, naming Microsoft's premier product + - a product over which Apple sued Microsoft five years ago. Not + the right answer - it's "The Obfuscated C Contest [sic]" - but + it brought down the house of Apple partisans... + + [The expression on Bill Gates' face was a sight to behold, as reported + to us by several who were there]. + + To use: + make cmills # requires the X11 library + DISPLAY="your_X_server_display" + export DISPLAY + ./cmills [speed] # must be run on an X11 server + + where: + speed update speed from 1 to 9 (default is 9) + + Csh users should use: + make cmills # requires the X11 library + setenv DISPLAY "your_X_server_display" + ./cmills [speed] # must be run on an X11 server + + You must set $DISPLAY in your environment or the program will + dump core. This is not a bug as the author documented it as + a feature. :-) + + The optional argument is integer which controls the speed of the + program. By default the speed is 9. You may want to try 1. + + You will have to kill the program (i.e., ^C) to stop it. + + WARNING: Slow servers or servers with long request queues will + continue to 'run' for a while after you have killed + the program. + + This program makes your windows about as useful as their windows. :-) + + +Selected notes from the author: + + The program uses a single backing pixmap (which is the size of the + screen) for all of its subwindows (with a little bit of trickery to + move the offset around). This is much better (and faster) than the + obvious implementation which would require a full-screen pixmap and + a separate backing pixmap for each subwindow. + + The chance that a window breaks is based on it's kinetic energy, + which in turn is based on it's area and speed. How silly! + +Copyright (c) 1993, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1993/dgibson.c b/1993/dgibson.c new file mode 100644 index 000000000..fac1067b6 --- /dev/null +++ b/1993/dgibson.c @@ -0,0 +1,41 @@ +#include + +#define maxc (prs >> 16) +#define maxr (prs & 0xff00) >> 8 +#define find (col > 1) +#define endb || (prs & 16) && X(0) || chpa || (eols, 0) +#define lnst doln ? 0 : (init, 0) || (prs & 128) && X(0) +#define L endb) || 0 || (find ? 0 : (rrr++, rrc = 0)) || (lnst +#define X(p) (dfc++ && ((prs & 48) != 32 || rrc < maxc) && ++ccl && \ + (find ? (bat = bit, bit = but, but = p, ccl == col && \ + (ret = bat + bit + but) + 1) : (las = las * 2 + \ + (((main(ccl + 1, cro - 1) + main(ccl + 1, cro) + \ + main(ccl + 1, cro + 1) - p) | p) == 3), occ |= las & 1, \ + printf(" %c", "_O"[las & 1]), ccl == 2 && (sta |= (las & 3) << 6),\ + 0))) +#define _ || (find || rrc++, 0) || X(0) +#define O || (find || rrc++, 0) || X(1) +#define chpa (find && col > ccl && ((ret = bit + but) + 1)) +#define eols (!find && (cro == 1 ? (sta |= occ << 3) : cro == 2 && \ + (sta |= occ << 2), sta |= (las & 3) << 4)) +#define init (find ? (ret = bit = but = 0) : (ocp = occ, las = occ = 0, \ + printf("\nL")), dfc = (prs & 192) != 64, ccl = 0) +#define doln !(dfl++ && (((prs & 3) != 2) || rrr < maxr) && \ + (++cro == row || !find)) +#define recu (col =- col, (ccl = find ? rcf : rcl), cro = rro, 0 _ || \ + (rrc >= maxc ? 0 : (find ? rcf = ccl : (rcl = ccl), \ + main(-col, row)))) +#define addl (lnst || (rro = cro, find ? rcf = ccl : (rrc = 0, rcl = ccl), \ + 0) || main(-col, row) || (ccl = rcl + 1, 0) endb) +#define outp (find || printf("\n\nGEN %d STAT %ld\nEND\n", ++gen, \ + (long)ccl << 16 | cro << 8 | (sta | occ | ocp << 1) ^ 0x66)) +#define GEN endb) || (prs & 1) && addl || (outp, 0)), ret)); } int gen = +#define STAT ;long prs = +#define END ; +#define LIFE int bat, bit, but, las, gen, ret, rcl, rcf, rro, rrc, rrr, \ + occ, ocp, sta, dfc; long prs; main(int col, int row) { \ + int dfl = ((prs & 12) != 4), ccl = 0, cro = 0; return \ + col == 1 && printf("LIFE\n"), (col < 0 ? recu : \ + (((ret = 0) || (prs & 8) && addl || 0 && (0 + +#include "life.d" diff --git a/1993/dgibson.data1 b/1993/dgibson.data1 new file mode 100644 index 000000000..cc6767012 --- /dev/null +++ b/1993/dgibson.data1 @@ -0,0 +1,10 @@ +LIFE + +L _ _ _ _ _ +L _ _ _ O _ +L _ O _ O _ +L _ _ O O _ +L _ _ _ _ _ + +GEN 0 +END diff --git a/1993/dgibson.data2 b/1993/dgibson.data2 new file mode 100644 index 000000000..396f614a9 --- /dev/null +++ b/1993/dgibson.data2 @@ -0,0 +1,9 @@ +LIFE + +L _ _ _ _ _ +L _ O O O _ +L _ _ O _ _ +L _ _ _ _ _ + +GEN 0 +END diff --git a/1993/dgibson.data3 b/1993/dgibson.data3 new file mode 100644 index 000000000..c2d600196 --- /dev/null +++ b/1993/dgibson.data3 @@ -0,0 +1,10 @@ +LIFE + +L _ _ _ _ _ +L _ _ O O _ +L _ O O _ _ +L _ _ O _ _ +L _ _ _ _ _ + +GEN 0 +END diff --git a/1993/dgibson.data4 b/1993/dgibson.data4 new file mode 100644 index 000000000..086ad6a08 --- /dev/null +++ b/1993/dgibson.data4 @@ -0,0 +1,15 @@ +/* 0064 Can you build a puffer train? */ + +LIFE + +L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +L _ _ O _ _ _ _ _ _ _ _ O _ _ _ _ O _ _ _ +L _ O _ _ _ _ _ O _ _ O _ _ _ _ O _ _ _ _ +L _ O _ _ _ _ _ _ O O O _ _ _ _ O _ _ _ _ +L _ O _ _ O _ _ _ _ _ _ _ _ _ _ O _ _ O _ +L _ O O O _ _ _ _ _ _ _ _ _ _ _ O O O _ _ +L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +GEN 0 +END diff --git a/1993/dgibson.data5 b/1993/dgibson.data5 new file mode 100644 index 000000000..68918708d --- /dev/null +++ b/1993/dgibson.data5 @@ -0,0 +1,43 @@ +/* Howdy, Landon: */ +/* Here is one of the best Life patterns found in many years. It is called */ +/* a "spacefiller", for reasons which will become obvious when you run it. */ +/* This was found by Hartmut Holzwart a couple of weeks ago. Enjoy! */ +/* BCNU, -dbell- */ +LIFE +L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ O _ _ _ _ _ _ _ _ _ _ +L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ O _ _ _ _ _ _ _ _ _ +L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O _ _ _ _ _ _ _ _ +L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ _ O _ _ _ _ _ _ _ +L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O O _ _ _ O O O _ _ _ _ O _ O O O O O _ _ _ _ _ _ +L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ O _ O _ _ O _ _ _ _ _ _ _ _ _ _ _ _ O O _ _ _ +L _ _ _ _ _ _ _ _ _ _ O O _ _ _ _ _ _ _ O _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ O O O _ _ _ O _ _ +L _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ _ O _ _ _ O _ +L _ _ _ _ _ _ _ _ O O _ _ O _ _ _ _ _ _ _ O _ O _ O _ O _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ O _ +L _ _ _ _ _ _ _ O _ _ _ _ O _ _ _ _ _ _ _ O _ O _ O _ O _ _ _ _ _ _ _ _ _ _ O _ _ O _ _ O _ +L _ _ _ _ _ _ O O O O O _ _ _ _ _ _ _ _ _ _ O _ _ _ O _ _ _ _ _ _ _ _ O _ O O _ _ O _ O _ _ +L _ _ _ O O _ _ _ _ _ O O _ _ _ _ O _ _ _ O O O _ O O O _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ +L _ _ O _ _ _ O O O _ _ O _ _ O O O _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O O _ +L _ O _ _ _ O _ _ _ _ _ O O _ O O _ _ _ O O O O O O O O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O _ +L _ O _ _ _ _ _ O _ _ _ O _ _ _ O _ _ O _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ O O O _ +L _ O _ _ O _ _ O _ _ _ _ _ O O O _ O O O O O O O O O O O O _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ +L _ _ O _ O _ _ O O _ O _ _ O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O _ _ O _ O O _ _ O _ O _ _ +L _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ O O O O O O O O O O O O _ O O O _ _ _ _ _ O _ _ O _ _ O _ +L _ O O O _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ O _ _ O _ _ _ O _ _ _ O _ _ _ _ _ O _ +L _ O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ O O O O O O O O O _ _ _ O O _ O O _ _ _ _ _ O _ _ _ O _ +L _ O O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ O O O _ _ O _ _ O O O _ _ _ O _ _ +L _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ O O O _ O O O _ _ _ O _ _ _ _ O O _ _ _ _ _ O O _ _ _ +L _ _ O _ O _ _ O O _ O _ _ _ _ _ _ _ _ O _ _ _ O _ _ _ _ _ _ _ _ _ _ O O O O O _ _ _ _ _ _ +L _ O _ _ O _ _ O _ _ _ _ _ _ _ _ _ _ O _ O _ O _ O _ _ _ _ _ _ _ O _ _ _ _ O _ _ _ _ _ _ _ +L _ O _ _ _ _ _ O _ _ _ _ _ _ _ _ _ _ O _ O _ O _ O _ _ _ _ _ _ _ O _ _ O O _ _ _ _ _ _ _ _ +L _ O _ _ _ O _ _ _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ _ _ +L _ _ O _ _ _ O O O _ _ _ _ _ _ _ _ O _ _ _ _ _ _ _ O _ _ _ _ _ _ _ O O _ _ _ _ _ _ _ _ _ _ +L _ _ _ O O _ _ _ _ _ _ _ _ _ _ _ _ O _ _ O _ O _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +L _ _ _ _ _ _ O O O O O _ O _ _ _ _ O O O _ _ _ O O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +L _ _ _ _ _ _ _ O _ _ _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +L _ _ _ _ _ _ _ _ O O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +L _ _ _ _ _ _ _ _ _ O _ _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +L _ _ _ _ _ _ _ _ _ _ O _ O _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +GEN 0 +END diff --git a/1993/dgibson.hint b/1993/dgibson.hint new file mode 100644 index 000000000..2f6c00550 --- /dev/null +++ b/1993/dgibson.hint @@ -0,0 +1,66 @@ +Best Abuse of the C Preprocessor: + + David Gibson + University of Cape Town + + 1 Sweet Valley Road + Bergvliet + 7945 + South Africa + + +Judges' comments: + + To use: + sh ./dgibson.sh [datafile] + + where: + datafile initial pattern (default: dgibson.data1) + + We have provided the shell script 'dgibson.sh' to make it easier + to run this entry. Run this shell script several times to + see what happens. + + There are a number of data files available: + + dgibson.data1 + dgibson.data2 + dgibson.data3 + dgibson.data4 + dgibson.data5 + + For dgibson.data5 you will need a large screen, lots of virtual + memory and lots of time! + + Good luck trying to use a debugger on this entry! Life is not + always pretty. + + +Selected notes from the author: + + This program plays the Game of Life. + + Life is a cellular automaton invented by J. H. Conway, in which each of + a rectangular grid of cells can be alive or dead, and cells with more + than 3 or less than 2 (out of 8) live neighbours die, and empty cells + with exactly 3 neighbours give birth. + + Some notes: the "STAT n" information does not have to be present in the + initial configuration; the initial configuration should not have live + cells around the edges; the grid should be a perfect rectangle. + + Further features: the current generation number is preserved, and the + grid automatically resizes itself as the object gets too big or too + small. + + When writing this program, my goal was to make each cell in the life + grid expand to the code which calculates the fate of that cell. In + addition, the resulting program is a single expression, which makes it + necessary to recurse on main in two "directions" simultaneously. + + +Copyright (c) 1993, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1993/dgibson.sh b/1993/dgibson.sh new file mode 100644 index 000000000..2bf351e6d --- /dev/null +++ b/1993/dgibson.sh @@ -0,0 +1,53 @@ +#!/bin/sh +# +# dgibson.sh - run the dgibson entry +# +# usage: +# dgibson.sh [data_file] + +# parse args +# +if [ $# -eq 0 ]; then + DATA="./dgibson.data1" +else + DATA="$1" +fi +if [ ! -f "$DATA" ]; then + echo "$0: no data found in $DATA" 1>&2 + exit 1 +fi + +# for the initial data.name if needed +# +if [ ! -f "data.name" ]; then + rm -f data.name + echo "$DATA" > data.name +fi +if [ ! -f life.d ]; then + # force a new life setup + echo "/" > data.name +fi +rm -f data.name2 +echo "$DATA" > data.name2 + +# note if we are running a new form +# +if cmp -s data.name data.name2; then + : +else + rm -f life.d + cp "$DATA" life.d + rm -f data.name + echo "$DATA" > data.name + cat life.d +fi + +# build a new copy of the program +# +rm -f dgibson +make dgibson + +# form the next generation +# +chmod +w life.d +dgibson | tee life.d diff --git a/1993/ejb.c b/1993/ejb.c new file mode 100644 index 000000000..46bdd969b --- /dev/null +++ b/1993/ejb.c @@ -0,0 +1,53 @@ + + + static signed char a[] = {0x69, + 110, 118, 97, 108, 105, 0x64, 1-1, + 0x6d, 111, 118, 101, 1<<1<<1<<1<<1<<1, + 114, 105, 0x6e, 103, 32, 'o'/3, 100, + 32, 102, 114, 111, 0x6d, 32, 115, 116, + 97, 100-001, 107, 32,37, 2*'2', '@'>>1, + 116, '%' + '%' + '%','w'-'W',115, 0x74, + 97, 3*'!', 107, 'q' - 'Q', 37, 10*'\n', + 10, 0}, * b = a + (1<<1<<1<<1), * w, x, + *q, c, r; int main(int d, char *e []) { + return q = (signed char *)(e+1+1), (r = + e[0] && e[1] ? 0 : 0 * puts (a) + 1) || + (r = e[1<<1] && d != 1 <<1 && 0 * puts( + a) + 1) || e[1- -1] || (r = atoi(e[1]) + < -0200 || atoi (e [1]) > 0x7f || ( x = + atoi( e[1] ) ) == 0 ? 0 * puts(a) + 1 : + 0) || e [1- -1] || (x- -x > 1-1 ? (q[0] + = x, q[1] = q[3] = 1, q[2] = 2) : ( + memset ( w = ( signed char * ) + + + + + + + + malloc(-x), '1', -x), puts (w), + q[0] = x, q[1] = '0', q[2] = q[3] = + 0)), r || (q[3] ? (c = 6 - q[1] - q[2], + (q[0] != 1) ? q[0]-- , d = q[2], q[2] = + c, main(2, e), c = q[2], q[2] = d, q[0] + ++ : 0, printf(b, q[0], q[1], q[2]), (q + [0] != 1) ? q[0]--, d = q[1],q[1] = c , + main(2, e), c = q[1], q[1] = d, q[0] ++ + : 0) : - 1 - q[0] - 1 == 0 ? (w[- x - 1 + - (q[1] & 1 ^ 1)] = q[1], puts (w), w [ + - x - 1 - (q[1] & 1)] = q[1], puts(w) ) + : - 1 - q[0] == 0 ? (w[- x - 1] = q[ 1 + ], puts(w)) : (q[0] += 1 + ( q[1] & 1 + ^ 1), main(2, e), q[0] -= 1 + ( q + [1] & 1 ^ 1), q[1] & 1 ? (q + [0]+=1+1, q[1]^=1, main + (2, e), q[1]^=1, q[0]-=1 + +1) : 0, w[q[0] - x] = q + [1], puts(w), q[1] & 1 ? + 0 : (q[0]+=1+1, q[1]^=1, + main (2, e), q[1]^=1, q + [0]-=1+1), q[0] += 1 + + (q[1] & 1),main(2,e) + , q[0] -= 1 + (q[1] + & 1) ) ), r; } diff --git a/1993/ejb.explain1 b/1993/ejb.explain1 new file mode 100644 index 000000000..fe710afdb --- /dev/null +++ b/1993/ejb.explain1 @@ -0,0 +1,9 @@ + The Towers of Hanoi is a puzzle consisting of three posts + and several rings of various sizes. The initial + configuration of the game is that all the rings are stacked + in decreasing order of size on one post. The object of the + game is to move all the rings from one post to another + subject to two rules: only one ring can be moved at a time, + and at no time can one ring be placed on top of a smaller + ring. The number of steps necessary to solve this puzzle is + exponential in the number rings. diff --git a/1993/ejb.explain2 b/1993/ejb.explain2 new file mode 100644 index 000000000..a1884f081 --- /dev/null +++ b/1993/ejb.explain2 @@ -0,0 +1,141 @@ + The Patience puzzle, probably of Chinese origin, consists of + an iron U-shaped piece and several rings that link around + it. The physical shape of the puzzle is very difficult to + describe verbally, but here is an attempt. + + This description of the puzzle is presented as a set of + instructions for constructing the puzzle. Start with a flat + piece of iron about 15 centimeters long by about two + centimeters wide. Drill six holes in the piece of iron. + Through each hole, place a rod. The rod should have a + diameter slightly less than that of the hole so that it can + move freely. One end of the rod is like the head of a nail + and is larger than the hole to prevent it from coming free. + The other end is looped around a metal ring with a diameter + of about five centimeters. This completely prevents the + iron rod from separating from the base. Each rod, in + addition to going through the iron base, goes through the + ring at the end of the rod to its right. The only rod free + of this restriction is the rightmost rod. What has been + described so far is one of the two components of the puzzle. + + The other component is another iron rod shaped like a U. + the U is as long from the tips to the base as the original + piece of iron with the holes in it. The ends of the U are + looped around another ring of about five centimeters in + diameter. In the puzzle's initial configuration, the U is + placed through the rings so that it is held in place by the + iron rods. Imagine starting with the U piece before the + iron loop is placed at the end. Slide the legs of the U + through the loops so that the iron rods securing the loops + to the metal strip go up the center of the U. Placing the + final ring at the ends of the U prevents it from coming out. + The object of the puzzle is to free the U-shaped piece from + the other piece. + + The following illustration (sideways) shows a three-ring + case of this puzzle. If you look carefully, you can see + that the first ring could be lifted over the edge of the U + and slid down through the center of the U, thereby freeing + the U from the first iron rod. The second ring can also be + freed in the initial configuration since it is already over + the rod for the first ring. The third ring cannot be moved, + however, since it is blocked by the iron rod two which the + first ring is attached. If the first first is removed, then + the third ring is no longer blocked by the first ring's iron + rod and can be removed freely. The second ring, however + cannot be moved if the first ring is gone because it will + then be blocked by the first ring in its new position + outside of the U. + + Here is an illustration of the three-ring case. The bottom + of the puzzle is on the left-hand side of the page. + + + + //==\\ + || || + || || + *****||** || + *** || ***|| + ** || *|| + |\ ** || ||** + | \ *** || || *** + | \ *** | || === + | \ *** || // * \\ + | \ *** || || ** || + | | | ********** || + | | || || || || + | | || || || || + | | *****||** || \\ || + | | |\ | *** || ***|| || + |==| |=========-**-===-||-============// + |==| |=========-**-===-||-===========// + | | \| | *** || || *** + | | *** || || === + | | ***| || // * \\ + | | *** || || ** || + | | ||********** || + | | || || || || + | | *****||** || \\ || + | | |\ | *** || ***|| || + |==| |=========-**-===-||-============// + |==| |=========-**-===-||-===========// + | | \| | *** || || *** + | | *** || || === + | | ***| || // * \\ + | | *** || || ** || + | | ||********** || + | | || || || || + | | || || || || + | | | || || \\ || + | | |\ | || || || + |==| |================-||-============// + |==| |================-||-===========// + | | \| | || || + | | || || + | | || || + | | || || + \ | || || + \ | \\ || + \ | \\ || + \ | \\ || + \ | \\|| + \| \|| + + This puzzle takes other forms as well. One such puzzle is + called "Spin-Out". This puzzle consists of one plastic + piece that encases another piece that can slide in and out + of it. The movement of the smaller piece is restricted by + discs that, when turned to one angle, lock the smaller piece + inside the larger one and, when turned the other way, allow + it to move. This puzzle is as difficult to describe as the + first and, since I don't have one in front of me, I will not + attempt to describe it. The object of this puzzle is to + free the smaller piece from the larger one. The other + puzzle that is like this one consists of a cylinder with + rods protruding from the top. The rods can be slid from the + center to the edge of the cylinder constrained by a series + of discs in the center. The discs have cuts in them that + allow some rods to move and force others in one place based + on the relative rotations of the discs. The object here is + to move all the rods from the inside to the outside. + + What makes these puzzles similar is that the physical shapes + of the puzzles put the same restrictions on the movement of + the pieces. Specifically, there is always one piece that is + free to move. The only other piece that is free to move is + the second one that is still attached to the base it is + trying to be freed from. In the case of the original + puzzle, consider the rings numbered from 1 to 6 with ring 1 + being the one at the closed send of the U. Ring 1 can + always be removed from or added to the U. In the initial + state, when all rings are around the U, ring 2 is the other + one that can be moved because it is second. If ring 1 is + removed, then only two operations are possible: the + restoration of ring 1 and the removal of ring 3. This is + because ring 1 is always movable, and ring 3 is currently + the second ring still attached to the U. This constraint + leads to a recursive solution to the puzzle. Like the + Towers of Hanoi, the number of steps to solve this puzzle is + exponential in the number of rings. diff --git a/1993/ejb.hint b/1993/ejb.hint new file mode 100644 index 000000000..48d89253e --- /dev/null +++ b/1993/ejb.hint @@ -0,0 +1,79 @@ +Best Obfuscated Algorithm: + + E. Jay Berkenbilt + Engineering Research Associates + 1595 Springhill Road + Vienna, VA 22182-2235 + USA + + +Judges' comments: + + To run: + make ejb + ./ejb level + + where: + level a value from -128 to 127 + + A negative argument plays the patience puzzle. An argument + greater than 0 plays the Tower of Hanoi puzzle. In either case + the absolute value of the argument specifies the size of the + respective puzzle. Refer to the files ejb.explain1 and + ejb.explain2 for more information on these puzzles. + + Of course, you need a different kind of "patience" if you give + the argument 127 to this program and want to see it finish! + + +Selected notes from the author: + + WHAT THIS PROGRAM DOES + ====================== + + ./ejb 5 Output: solution to Towers of Hanoi for five rings + ./ejb -6 Output: solution to the Patience puzzle for six rings + + The format of the output for the Towers of Hanoi case is simply a + text description of how to solve the puzzle. For the patience + puzzle, the output is a sequence binary codes representing + successive states of the puzzle. The rightmost digit represents + the first ring. A "1" means the ring is on the U; a "0" means it + is off the U. The program prints the word "Invalid" in response to + illegal command line parameters. + + MOTIVATION + ========== + Most people who have written software for other people have been + asked to count lines of code. Naturally, this brings up the + controversial question of exactly what defines a line of code. + This program serves to show that counting semicolons will not + always provide a meaningful measure of code size. This is + especially true in this program where the number of semicolons + itself is ambiguous. Does it have two or three? In addition, the + only "C" keyword this program uses besides type names and + qualifiers is "return", and the only function defined in the code + is "main". The level of complexity of the program without multiple + semicolons, statements, and functions is achieved by abusing C + operators, especially the comma operator. Considerable use of ||, + &&, and ? : helps too. In addition, main is called recursively. + The null pointer that terminates argv is used to pass additional + information into main. Even though the algorithms used by this + code are simple, this program is still hard to follow even when + indented properly. (It is pretty hard to indent this code + reasonably, however.) + + Although this program is has only been tested on UNIX systems but + will probably run on just about any machine with an ANSI C + compiler. It does not use the C preprocessor at all. The only + functions it uses are atoi, malloc, memset, printf, and puts. It + does, however, require that the architecture it runs on have bytes + that are at least eight bits long and pointers that are at least + four bytes long. In addition, it requires an ANSI compiler since + it uses "signed char" and ANSI-style function declarations. + +Copyright (c) 1993, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1993/guidelines b/1993/guidelines new file mode 100644 index 000000000..8acc360f9 --- /dev/null +++ b/1993/guidelines @@ -0,0 +1,592 @@ +10th International Obfuscated C Code Contest Guidelines, Hints and Comments + +Copyright (c) Landon Curt Noll & Larry Bassel, 1993. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + +ABOUT THIS FILE: + + This file is intended to help people who wish to submit entries to + the International Obfuscated C Code Contest (IOCCC for short). + + This is not the IOCCC rules, though it does contain comments about + them. The guidelines should be viewed as hints and suggestions. + Entries that violate the guidelines but remain within the rules are + allowed. Even so, you are safer if you remain within the guidelines. + + You should read the current IOCCC rules, prior to submitting entries. + The rules are typically sent out with these guidelines. + + Changes from the 1993 draft are noted by change bars. ---> | + + +WHAT IS NEW IN 1993: + + The entry format is better (for us anyway). The program mkentry.c + has been updated. See ENTRY FORMAT. + + We will reject entries that cannot be compiled using an ANSI C + compiler. Certain old Obfuscation hacks that cause ANSI C compilers + fits are no longer permitted. Some of the new issues deal with + non-integral array types, variable number of arguments, C preprocessor + directives and the exit() function. See OUR LIKES AND DISLIKES. + + +HINTS AND SUGGESTIONS: + + You are encouraged to examine the winners of previous contests. See + FOR MORE INFORMATION for details on how to get previous winners. + + Keep in mind that rules change from year to year, so some winning entries + may not be valid entries this year. What was unique and novel one year + might be 'old' the next year. + + An entry is usually examined in a number of ways. We typically apply + a number of tests to an entry: + + * look at the original source + * convert ANSI tri-graphs to ASCII + * C pre-process the source ignoring '#include' lines + * C pre-process the source ignoring '#define' and '#include' lines + * run it through a C beautifier + * examine the algorithm + * lint it + * compile it + * execute it + + You should consider how your entry looks in each of the above tests. + You should ask yourself if your entry remains obscure after it has been + 'cleaned up' by the C pre-processor and a C beautifier. + + Your entry need not do well under all, or in most tests. In certain + cases, a test is not important. Entries that compete for the + 'strangest/most creative source layout' need not do as well as + others in terms of their algorithm. On the other hand, given + two such entries, we are more inclined to pick the entry that + does something interesting when you run it. + + We try to avoid limiting creativity in our rules. As such, we leave + the contest open for creative rule interpretation. As in real life + programming, interpreting a requirements document or a customer request + is important. For this reason, we often award 'worst abuse of the + rules' to an entry that illustrates this point in an ironic way. + + If you do plan to abuse the rules, we suggest that you let us know + in the remarks section. Please note that an invitation to abuse + is not an invitation to break. We are strict when it comes to the + 3217 byte size limit. Also, abusing the entry format tends to + annoy more than amuse. + + We do realize that there are holes in the rules, and invite entries + to attempt to exploit them. We will award 'worst abuse of the rules' + and then plug the hole next year. Even so, we will attempt to use + the smallest plug needed, if not smaller. :-) + + Check out your program and be sure that it works. We sometimes make + the effort to debug an entry that has a slight problem, particularly + in or near the final round. On the other hand, we have seen some + of the best entries fall down because they didn't work. + + We tend to look down on a prime number printer, that claims that + 16 is a prime number. If you do have a bug, you are better off + documenting it. Noting "this entry sometimes prints the 4th power + of a prime by mistake" would save the above entry. And sometimes, + a strange bug/feature can even help the entry! Of course, a correctly + working entry is best. + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many ANSI C compilers dislike the following code, and so do we: + + #define d define + #d foo <-- don't expect this to turn into #define foo + + int i; + j; <-- don't use such implicit type declaration + int k; + + We suggest that you compile your entry with an ANSI C compiler. If you + must use non-ANSI C, such as K&R C, you must avoid areas that result in + compile/link errors for ANSI C compilers. + + Unfortunately, some ANSI C compilers require array indexes to be of | + integral type. Thus, the following classical obfuscation hacks should | + not be used in 1993. This rule may be relaxed in future contests. | + + int i; + char *c; + i[c]; <--- use c[i] instead + (i+3)["string"]; <--- use "string"[i+3] instead + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using , use instead. + + If you use C preprocessor directives (#define, #if, #ifdef, ...), + the leading '#' must be the first character on a line. While some + C preprocessors allow whitespace the leading '#', many do not. + + Because the exit() function returns void on some systems, entries + must not assume that it returns an int. + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + + One line programs should be short one line programs, say around 80 + bytes long. Getting close to 160 bytes is a bit too long in our opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS or Un*x version specific + (index/strchr differences are ok, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is ok only if you warn us in the 'remark' header item) + * won't compile under both BSD or SYS V Un*x + * abusing the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are similar to previous winners + * are identical to previous losers :-) + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + The build file should not be used to try and get around the size + limit. It is one thing to make use of a several -D's to help out, + but it is quite another to use 200+ bytes of -D's in order to + try and squeeze the source under the size limit. You should feel + free to make use of the build file space, but you are better off + if you show some amount of restraint. + + We allowed whitespace, and in certain cases ; { or } do not impact + your program size (up to a certain point), because we want to get + away from source that is simply a compact blob of characters. + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! + + We suggest that you avoid trying for the 'smallest self-replicating' + program. We are amazed at the many different sizes that claim + to be the smallest. There is nothing wrong with self-replicating + programs. In fact, a number of winners have been self-replicating. + You might want to avoid the claim of 'smallest', lest we (or others) + know of a smaller one! + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. Don't + depend on a particular type of display. For example, don't depend + on color or a given size. Don't require backing store. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. We ask that such X client + entries restrict themselves to only the low level Xlib and the + Athena widget set (libX11.a, libXaw.a, libXmu.a and libXt.a). + Don't use M*tif, Xv*ew, or OpenL*ok toolkits, since not everyone + has them. Avoid depending on a particular window manager. Not + everyone has X11r5, and some people are stuck back in X11r4 (or + earlier), so try to target X11r5 without requiring X11r5. Better + yet, try to make your entry run on all version 11 X Window Systems. + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines + in the ---remark--- section. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * pass lint without complaint (not a requirement, but it is nice) + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION + * make us laugh and/or throw up :-) + + Some types of programs can't excel in some areas. Of course, your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + We freely admit that interesting, creative or humorous comments in + the ---remark--- section helps your chance of winning. If you had to + read of many twisted entries, you too would enjoy a good laugh or two. + We think the readers of the contest winners do as well. + + Be creative! + + +ENTRY FORMAT: + + In order to help us process the many entries, we must request your + assistance by formatting your entries in a certain way. This format, + in addition, allows us to quickly separate information about the + author from the program itself. (see JUDGING PROCESS) + + We have provided the program, mkentry, as an example of how to + format entries. You should be aware of the following warning that + is found in mkentry.c: + + This program attempts to implement the IOCCC rules. Every + attempt has been made to make sure that this program produces + an entry that conforms to the contest rules. In all cases, + where this program differs from the contest rules, the + contest rules will be used. Be sure to check with the + contest rules before submitting an entry. + + You are not required to use mkentry. It is convenient, however, + as it attempts to uuencode the needed files, and attempt to check + the entry against the size rules. + + If you have any suggestions, comments, fixes or complaints about + the mkentry.c program, please send Email to the judges. (see below) + + The following is a sample entry: + +---entry--- +rule: 1993 +fix: n +title: chonglab +entry: 0 +date: Mon Mar 1 08:45:20 1993 +host: Un*x v6, pdp11/45 + 2.9BSD, pdp11/70 +---remark--- + This is a non-obfuscated obfuscated C program. + + It is likely not to win a prize. But what do you expect from + a short example! +---author--- +name: Landon Curt Noll +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA +email: {chongo,noll}@{toad,sgi}.com +anon: n +---author--- +name: Larry Bassel +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA +email: hoptoad!sun!lab + lab@sun.com +anon: n +---info--- +begin 444 info.file +M0V]P>7)I9VAT("AC*2!,86YD;VX@0W5R="!.;VQL+"`Q.3DS+@I!;&P@4FEG +M:'1S(%)E65A2!A8W1U86QL>2!D96-O9&5D('1H:7,@9FEL92X*22!W;VYD97(@:&]W(&UA +9;GD@=VEL;"!D;R!I="!T:&ES('EE87(_"@`` +` +end +---build--- +begin 444 build +28V,@<')O9RYC("UO('!R;V<* +` +end +---program--- +begin 444 prog.c +M;6%I;B@I"GL*(VEF(&1E9FEN960H05]214=)4U1%4D5$7U9/5$527TE.7U-5 +M3DY95D%,15]#04Q)1D]23DE!7U5302D*("`@('!R:6YT9B@B5F]T92!,86YD +M;VX@3F]L;"!F;W(@4W5N;GEV86QE($-I='D@0V]U;F-I;"!S96%T(",Q+EQN +:(BD["B-E;F1I9@H@("`@97AI="@P*3L*?0H` +` +end +---end--- + + Typically the build file should assume that the source is prog.c + and will compile into prog. If an entry wins, we will rename + its source and binary to avoid filename collision. By tradition, + we use the name of the entry's title, followed by an optional + digit in case of name conflicts. + + If the above entry somehow won the 'least likely to win' award, + we would use chonglab.c and chonglab. + + If your entry depends on, or requires that your build, source + and/or binary files be a particular name, please say so in the + ---remark--- section. If this case applies, it would be be helpful + if you did one of the following: + + * Tell us how to change the filename(s) in your entry. + + * Have the build file make copies of the files. For example: + + cc prog.c -o special_name need special binary + + or rm -f special_src.c need special source + cp prog.c special_src.c + cc special_src.c -o special_name + + or rm -f special_build need special build + tail +4 build > special_build + sh < special_build + + * Assume that we will use the entry title. Send us a version of + your build/program files that uses the name convention. You + should uuencode these files in ---data--- sections. + + If your entry needs to modify its source, info or binary files, + please say so in the ---remark--- section. You should try to avoid + touching your original build, source and binary files. You should + arrange to make copies of the files you intend to modify. This + will allow people to re-generate your entry from scratch. + + Remember that your entry may be built without a build file. We + typically incorporate the build lines into a Makefile. If the + build file must exist, say so in the ---remark--- section. + + If your entry needs special info files, you should uuencode them + into ---info--- sections. In the case of multiple info files, + use multiple ---info--- sections. If no info files are needed, + then skip the ---info--- section. + + Info files are intended to be input, or detailed information that + does not fit well into the ---remark--- section. For example, an + entry that implements a compiler might want to provide some sample + programs for the user to compile. An entry might want to include a + lengthy design document, that might not be appropriate for a + 'hints' file. + + Info files should be used only to supplement your entry. For + example, info files may provide sample input or detailed + information about your entry. Because they are supplemental, + the entry should not require them exist. + + In some cases, your info files might be renamed to avoid name + conflicts. If info files should not be renamed for some reason, + say so in the ---remark--- section. + + Info files must uudecode into the current directory. If they + absolutely must be renamed, or moved into a sub-directory, say + so in the ---remark--- section. + + When submitting multiple entries, be sure that each entry has + a unique entry number from 0 to 7. Your first entry should + have entry number 0. + + With the exception of the header, all text outside of the entry + format may be ignored. That is, don't place text outside of the + entry and expect the judges to see it. (Our decoding tools aren't + AI progs!) If you need tell the the something, put it in the + ---remark--- section, or send a Email to the judges at: + + ...!{apple,pyramid,sun,uunet}!hoptoad!judges (not the address for + judges@toad.com submitting entries) + + The date should be given with respect to UTC. (Some systems refer + to this as GMT or GMT0) The format of the date should be that as + returned by asctime() in the C locale. An example of such a string is: + + Thr Apr 01 00:47:00 1993 + + This format is similar to the output of the date(1) command. The + string does not include the timezone name before the year. On many + systems, one of the following command will produce a similar string: + + date -u "+%a %h %d %T 19%y" + date -u | sed -e 's/... \(19[0-9][0-9]\)$/\1/' + sh -c 'TZ=UTC date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"' + sh -c 'TZ=GMT date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"' + sh -c 'TZ=GMT0 date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"' + + You are allowed to update/fix/revise your entry. To do so, set + the 'fix' line in the ---entry--- section to 'y' instead of 'n'. + Be sure that the resubmittion uses the same title and entry number + as well, as these are used to determine which entry is to be + replaced. + + +JUDGING PROCESS: + + Entries are judged by Larry Bassel and Landon Curt Noll. + + Entries are unpacked into individual directories. The Email message + is unpacked into individual files, each containing: + + ---entry--- section + all ---author--- sections + all ---info--- sections + ---build--- section + ---program--- section + any other text, including the Email message headers + + Prior to judging, the 'any other text' file is scanned to be sure + it does not contain useful information (or in case the entry was + malformed and did not unpack correctly). Information from the + ---author--- sections are not read until the judging process is + complete, and then only from entries that have won an award. + + The above process helps keep us biased for/against any one particular + individual. We are usually kept in the dark as much as you are + until the final awards are given. We like the surprise of finding + out in the end, who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. (for the curious, + we do indicate the volume of paper consumed when presenting the IOCCC + winners at talks) + + After the Usenix announcement, we attempt to send Email to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes, typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the ---entry--- section + * reading the uudecoded ---build--- section + * reading the uudecoded ---program--- section + * reading the uudecoded ---info--- section(s), if any + * passing the source thru the C pre-processor + shipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + shipping over any #include files + + In later rounds, other actions are performed: + + * linting the source + * compiling/building the source + * running the program + * performing misc tests on the source and binary + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry often will compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code + * best X client (see OUR LIKES AND DISLIKES) + * best abuse of ANSI C + * worst abuse of the rules + * + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to 8 or 10 + winners. Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + + More often that not, we select a small entry (usually one line), a + strange/creative layout entry, and an entry that abuses the contest + rules in some way. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entry. More often, the + 'best' is picked because it does well in a number of categories. + + +ANNOUNCEMENT OF WINNERS: + + The first announcement, occurs at a Summer Usenix conference. By tradition, + this is done during the latter part of the UUNET/IOCCC BOF, just prior to + the Berkeley BSD, and BSDI BOF. + + Winning entries will be posted in late June to the following groups: + + comp.lang.c comp.unix.wizards alt.sources + + In addition, pointers to these postings are posted to the following + + comp.sources.d alt.sources.d misc.misc + comp.sources.misc comp.windows.x + + Winning entries will be deposited into the uunet archives. See + below for details. + + Often, winning entries are published in selected magazines. Winners + have appeared in books ("The New Hackers Dictionary") and on T-Shirts. + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending Email to the following address: + + ...!{apple,pyramid,sun,uunet}!hoptoad!judges (not the address for + judges@toad.com submitting entries) + + Questions and comments about the contest are welcome. + + The rules and the guidelines may (and often do) change from year to | + year. You should be sure you have the current rules and guidelines | + prior to submitting entries. + + +chongo /\cc/\ {chongo,noll}@{toad,sgi}.com | +Larry Bassel lab@sun.com | diff --git a/1993/jonth.c b/1993/jonth.c new file mode 100644 index 000000000..654becc32 --- /dev/null +++ b/1993/jonth.c @@ -0,0 +1,125 @@ + G int i,j + K case + R return 0 + S( x,y) for(x=0; x=0&&t<10&&!B[t][u ]; + if(!j){ + F]=1; + R; + } + N(w); + v(0)K 32:for(; + q(m,m,2); + )n=r++; + R+1; + K 3:l=0; + g=3; + I-6&&j)j=!B[t][u+l ]; + if(!j)R; + v(l)K 2:z Q(u+1)<22 A(t][u+1,l++)} + R; +} +X9(_){ + G; + for(j=_; j; j--)I)s]=s-1]; +} +U(){ + void*a=&C; + C.w=200; + C.h=30; + M(T,1); + sprintf(L,"Score%9d Level%9d",r,h); + XDrawString(D,p,J,7,15,L,29);} +P(){ + signal(14,f); +} + diff --git a/1993/jonth.hint b/1993/jonth.hint new file mode 100644 index 000000000..d8693bd29 --- /dev/null +++ b/1993/jonth.hint @@ -0,0 +1,37 @@ +Most Obfuscated X Program: + + Jon Thingvold + University of Oslo + Sogn Studentby 8231 + N 0858 Oslo + Norway + + +Judges' comments: + + To use: + make jonth # requires the X11 library + ./jonth # must be run on an X11 server + + Use 'h' and 'l' to shift objects left or right. Use 'k' to + rotate and press SPACE to drop. + + This program's output may be even more obfuscated when played + on inverse video. :-) + + +Selected notes from the author: + + This is jonth (jon's t(h)etris) for the X Window System. + + This program is also an example of data abstraction. The X array is + after initialization hidden by the well defined macros t, u and F. + + This program is highly portable as it runs on a "Notebook" size SPARC. + This program will not work on machines with sizeof(int)!=sizeof(void *). + +Copyright (c) 1993, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1993/leo.c b/1993/leo.c new file mode 100644 index 000000000..ed90d56f9 --- /dev/null +++ b/1993/leo.c @@ -0,0 +1,128 @@ +#include +#include +#include + +#define A(x) (e^d)&i?e:(e+=i+i/15-d,d<<=4,i<<=4,x) +#define B b+=!((e^d)&i)&&(d|=i),i<<=4, +#define C i=15,B B B B d=d<<4|d>>12, +#define D=(d=g,b=0,C b<<=4, C C C b) +#define E if(**y)goto +#define F=a[rand()%c] +#define G unsigned short +#define H e^=a[z],a[z]^=e,e^=a[z], + +void + main + (int + z,char + **y) + {G*a + ,b,c + ,d,e + ,f,g + ,h,i + ;*(* + y+= + strlen + (*y) + -1)^= + 'd'; + srand + (time + (0)) + ;z== + 2&& + sscanf + (y[1 + ],"%d" + ,&z) + &&z? + 0:(z + =6); + if(! + (a=( + G*) + calloc( + z*z* + z*z, + sizeof + (G)) + )){ + printf +("No\ + memory\ + \n"); + exit + (1); + }for + (c=1 + ;i=15 + ,d=z + ,c0&& + ((g F + ),1) + );printf + ("\n" +);} diff --git a/1993/leo.hint b/1993/leo.hint new file mode 100644 index 000000000..bae046f05 --- /dev/null +++ b/1993/leo.hint @@ -0,0 +1,106 @@ +Best Game: + + Leonid A. Broukhis + Moscow Centre of SPARC Technology + 123481 Liberty St., + 89-1-95 Moscow + Russia + + +Judges' comments: + + To make: + make leo + + To have the computer guess: + leo [colors] + + To guess the computer's number: + mind [colors] + + where: + colors number of possible colors (1 to 15) (default: 6) + + By default, the number of colors if 6. You may specify a + value of between 1 and 15 colors. See the author's notes + for instructions of how to play. + + We look forward to more entries from the newer members of the + International Internet community. + + On some systems, you may need to remove the line: + + #include + + or replace that line with: + + #include + #include + + to successfully build this entry. + + +Selected notes from the author: + + This program plays mastermind, if you call it by a name ending by + 'd', otherwise it _solves_ mastermind. Call it without parameters + to use 6 digits (colors), or indicate the number of possible digits + (you cannot change the number of positions so easily). + + The number in parentheses is the number of possible combinations, + based on previous questions and answers. If you solve the puzzle, + "(1)" indicates that your previous moves are enough to give correct + answer. If the program acts as solver and terminates prematurely, + it means that you have mistaken in your answers to its guesses. + Question marks indicate the number of digits you have to enter + (either 4 when you guess or 2 when computer guesses). + + Note that the program uses the same code for both player and + solver, and the only place where it makes difference is the + interactive part. Many obfuscations have been made to achieve + this. An expression giving (bulls * 16 + cows) from two numbers + is, however, quite straightforward :-) , as well as the arithmetic + of binary coded colors-base numbers is. + + Limitations: maximum number of digits (colors) is 14 (1..F). + + Suggestions: Use terminal (or emulator) with non-destructive + backspaces. Do "disable scrolling" on cmdtool or similar emulators. + + Bugs: Please don't type ^D at the prompt!! + + EXAMPLE: Suppose we think of 1234: + + judges-385> leo + (1296): 6433 + ?? 12 # one 3 is a bull, another is a cow, and 4 is a cow + (160): 5363 + ?? 02 # both 3's are cows + (21): 4231 + ?? 22 # 2 and 3 are bulls, 4 and 1 are cows + (2): 4132 + ?? 13 # 3 is a bull; 1, 2 and 4 are cows + (1): 1234 + ?? 40 # you may enter everything there + + EXAMPLE: Guess the computer's number: + + judges-387> mind + (1296): ???? 1122 # my strategy isn't the best, just as example + 00 + (256): ???? 3344 + 20 + (18): ???? 5566 + 02 + (6): ???? 3654 + 11 + (2): ???? 3355 + 00 + (1): ???? 6444 + 40 # we have guessed the number + +Copyright (c) 1993, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1993/lmfjyh.c b/1993/lmfjyh.c new file mode 100644 index 000000000..56da58975 --- /dev/null +++ b/1993/lmfjyh.c @@ -0,0 +1 @@ +char*_=__FILE__; diff --git a/1993/lmfjyh.hint b/1993/lmfjyh.hint new file mode 100644 index 000000000..c722bf7b0 --- /dev/null +++ b/1993/lmfjyh.hint @@ -0,0 +1,167 @@ +Most Versatile Source: + + Jyrki Holopainen + Oy LM Ericsson Ab + SF-02420 Jorvas + Finland + + +Judges' comments: + + To use: + make lmfjyh + ./lmfjyh + + See the makefile for details. + + There's more than one way to get around disk quotas. :-) + + Some people have reported problems compiling this entry + with gcc 2.3.3. + + The make command: + + make tidy + + will remove the "special" file that is created during the + make of lmfjyh. + + +Selected notes from the author: + + "Practical and efficient method of compressing source code" + + 1. Introduction + + I will shortly present a totally new compression method. + It may be used to compress any types of files, but it works + best with C-source code. + + As an example, I have taken a simple "Hello world!" program + that should be familiar to all C-programmers. + + Listing 1. A simple "Hello World" program: + + main() + { + puts("Hello World!"); + } + + + 2. Packing method + + Normally a file name is used only to identify the file, + but this new revolutionary method introduces a totally new concept: + THE FILE NAME IS THE PROGRAM. There is no need to waste + valuable disk space to store source code. The program is + embedded in the file name, only a minor portion of it + is inside the file. + + Listing 2. Compressed "Hello world": + + char*_=__FILE__; + + + Listing 3. Code embedded in the file name: + + ";main(){puts("Hello World!");}char*C=".c + + + The sample program in listing 1 is 36 bytes long. By using the new + compression method, the example program may be squeezed to sixteen + bytes. In the example the compression ratio is 2:1. It is evident + that the longer the program is, the better the compression ratio + is. The maximum compression ratio in a UNIX environment is 254:16 + which equals approximately to 16:1. By using the method a one + megabyte of source code can be compressed to 64 kilobytes. + + One might easily think that the program could be compressed to a + single byte by writing a one character long preprocessor directive + in the source file and defining the actual source code in the + command line, eg. 'cc hello.c -DX=main(){puts...'. With this + method nothing is gained, since the compiling commands must be + stored in a file, and that takes even more space than writing the + code in a source file as presented in listing 1. + + + 3. Packing files in a UNIX environment + + In a UNIX environment it is possible to write almost any program by + including the code in file names. Since '/' is used to separate + path components and cannot therefore exist in a file name, all + features of C-language cannot be used. + + In C, the '/' is used as a division operator and it may also be a + part of a comment start and end identifier. This is, however, not a + dangerous limitation, since practice has shown that comments are + almost totally unnecessary. A real programmer can more easily + understand pure source code, and misleading comments are + disastrous. The division operation may be replaced with pow(x, -1) + and multiplication when using real numbers or with div() function + when using integers. + + Large programs must be separated into small modules. This enforces + people to write better programs, since monolithic programming style + cannot be used. Program development will also be faster, no extra + code need not be recompiled after changes have been made. + + + 4. Usage with currently available tools + + I have tested how well this new method works with currently + available programming tools. + + Any ANSI conforming C-compiler that runs under a REAL operating + system should be able to compile the code. (there may be problems + with some older UNIX variants) + + 4.1. Compilers: + + These worked: + gcc versions 2.0, 2.1, 2.3.2 (ld failed at AIX with gcc 2.1) + cc (HP-UX) + cc (VAX) + + These failed miserably: + cc (SunOs/Solaris) - could not start cpp properly + cc/xlc (AIX) - could not open source + + 4.2. Other tools: + + 4.2.1 Debuggers: (tested at SunOs 4.1.2) + + dbx - Quit with a very 'informative' error message: + "dbx: fatal error: Is a directory" + + gdb - Printed almost the same error message ":Is a directory". + It was, however, possible to step through the code but + not list it. + + 4.2.2 Lints: + + - None of the lints at tested environments were able + to open the file. + + + 5. Conclusions + + The method can be used to compress any types of files, actually the + compression ratios are even better when compressing other files + than C-source. For example plain text files may be compressed with + INFINITE compression ratio. It is trivial task to compress a 100 + kilobytes long text file in about 400 files whose lengths are zero + bytes. The drawback is that the files must be unpacked before they + can be used, so a large amount of temporary disk space is needed, + while C-source is totally usable in the compressed form. + + Evidently, there is a long way to go before this new programming + technique may be widely used, since currently there are only few + tools supporting it. The advantages over the traditional methods + are, however, so great that there is no doubt that this method will + be new standard. + +Copyright (c) 1993, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1993/mkentry.c b/1993/mkentry.c new file mode 100644 index 000000000..5f03fd5b8 --- /dev/null +++ b/1993/mkentry.c @@ -0,0 +1,1212 @@ +/* @(#)mkentry.c 1.25 4/5/93 15:58:08 */ +/* + * Copyright (c) Landon Curt Noll & Larry Bassel, 1993. + * All Rights Reserved. Permission for personal, educational or non-profit + * use is granted provided this this copyright and notice are included in + * its entirety and remains unaltered. All other uses must receive prior + * permission in writing from both Landon Curt Noll and Larry Bassel. + */ +/* + * mkentry - make an International Obfuscated C Code Contest entry + * + * usage: + * mkentry -r remarks -b build -p prog.c -o ioccc.entry + * + * -r remarks file with remarks about the entry + * -b build file containing how prog.c should be built + * -p prog.c the obfuscated program source file + * -o ioccc.entry ioccc entry output file + * + * compile by: + * cc mkentry.c -o mkentry + */ +/* + * Placed in the public domain by Landon Curt Noll, 1992. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* + * WARNING: + * + * This program attempts to implement the IOCCC rules. Every attempt + * has been made to make sure that this program produces an entry that + * conforms to the contest rules. In all cases, where this program + * differs from the contest rules, the contest rules will be used. Be + * sure to check with the contest rules before submitting an entry. + * + * FOR MORE INFORMATION: + * + * You may contact the judges by sending Email to the following address: + * + * ...!{apple,pyramid,sun,uunet}!hoptoad!judges (not the address for + * judges@toad.com submitting entries) + * + * Questions and comments about the contest are welcome. + * + * The rules and the guidelines may (and often do) change from year to + * year. You should be sure you have the current rules and guidelines + * prior to submitting entries. + * + * Because contest rules change from year to year, one should only use this + * program for the year that it was intended. Be sure that the RULE_YEAR + * define below matches this current year. + */ + +#include +#include +#include +#include +#include + +/* logic */ +#ifndef TRUE +# define TRUE 1 +#endif /* TRUE */ +#ifndef FALSE +# define FALSE 0 +#endif /* FALSE */ +#define EOF_OK TRUE +#define EOF_NOT_OK FALSE + +/* global limits */ +#define RULE_YEAR 1993 /* NOTE: should match the current year */ +#define START_DATE "1Mar92 0:00 UTC" /* first confirmation received */ +#define MAX_COL 79 /* max column a line should hit */ +#define MAX_BUILD_SIZE 256 /* max how to build size */ +#define MAX_PROGRAM_SIZE 3217 /* max program source size */ +#define MAX_PROGRAM_SIZE2 1536 /* max program source size not counting + whitespace and {}; not followed by + whitespace or EOF */ +#define MAX_TITLE_LEN 12 /* max chars in the title */ +#define MAX_ENTRY_LEN 1 /* max length in the entry input line */ +#define MAX_ENTRY 8 /* max number of entries per person per year */ +#define MAX_FILE_LEN 1024 /* max filename length for a info file */ + +/* where to send entries */ +#define ENTRY_ADDR1 "...!{apple,pyramid,sun,uunet}!hoptoad!obfuscate" +#define ENTRY_ADDR2 "obfuscate@toad.com" + +/* uuencode process - assumes ASCII */ +#define UUENCODE(c) (encode_str[(int)(c)&0xff]) +#define UUENCODE_LEN 45 /* max uuencode chunk size */ +#define UUINFO_MODE 0444 /* mode of an info file's uuencode file */ +#define UUBUILD_MODE 0444 /* mode of the build file's uuencode file */ +#define UUBUILD_NAME "build" /* name for the build file's uuencode file */ +#define UUPROG_MODE 0444 /* mode of the program's uuencode file */ +#define UUPROG_NAME "prog.c" /* name for the program's uuencode file */ + +/* encode_str[(char)val] is the uuencoded character of val */ +char encode_str[256+1] = "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"; + +/* global declarations */ +char *program; /* our name */ +long start_time; /* the startup time */ + +/* forward declarations */ +void parse_args(); +void usage(); +FILE *open_remark(); +FILE *open_build(); +FILE *open_program(); +FILE *open_output(); +void output_entry(); +void output_remark(); +void output_author(); +void output_info(); +void output_build(); +void output_program(); +void output_end(); +int get_line(); +void output_till_dot(); +int col_len(); +void check_io(); +void uuencode(); + +main(argc, argv) + int argc; /* arg count */ + char **argv; /* the args */ +{ + FILE *remark=NULL; /* open remarks stream */ + FILE *build=NULL; /* open build file stream */ + FILE *prog=NULL; /* open program stream */ + FILE *output=NULL; /* open output stream */ + char *rname=NULL; /* file with remarks about the entry */ + char *bname=NULL; /* file containing how prog.c should be built */ + char *pname=NULL; /* the obfuscated program source file */ + char *oname=NULL; /* ioccc entry output file */ + struct tm *tm; /* startup time structure */ + + /* + * check on the year + */ + start_time = time((long *)0); + tm = gmtime(&start_time); + if (tm->tm_year != RULE_YEAR-1900) { + fprintf(stderr, + "%s: WARNING: this program applies to %d, which may differ from %d\n\n", + argv[0], RULE_YEAR, 1900+tm->tm_year); + } + + /* + * parse the command line args + */ + parse_args(argc, argv, &rname, &bname, &pname, &oname); + + /* + * open/check the input and output files + * + * We open and truncate the output file first, in case it is the same + * as one of the input files. + */ + output = open_output(oname); + remark = open_remark(rname); + build = open_build(bname); + prog = open_program(pname); + if (output==NULL || remark==NULL || build==NULL || prog==NULL) { + exit(1); + } + + /* + * output each section + */ + output_entry(output, oname); + output_remark(output, oname, remark, rname); + output_author(output, oname); + output_info(output, oname); + output_build(output, oname, build, bname); + output_program(output, oname, prog, pname); + output_end(output, oname); + + /* + * flush the output + */ + if (fflush(output) == EOF) { + fprintf(stderr, "%s: flush error in %s: ", program, oname); + perror(""); + exit(2); + } + + /* + * final words + */ + printf("\nYour entry can be found in %s. You should check this file\n", + oname); + printf("correct any problems and verify that the uudecode utility will\n"); + printf("correctly decode your build file and program.\n\n"); + printf("This program has been provided as a guide for submitters. In\n"); + printf("cases where it conflicts with the rules, the rules shall apply.\n"); + printf("It is your responsibility to ensure that your entry conforms to\n"); + printf("the current rules.\n\n"); + printf("Email your entries to:\n"); + printf("\t%s\n", ENTRY_ADDR1); + printf("\t%s\n\n", ENTRY_ADDR2); + printf("Please use the following subject when you Email your entry:\n"); + printf("\tioccc entry\n\n"); + /* all done */ + exit(0); +} + +/* + * parse_args - parse the command line args + * + * Given the command line args, this function parses them and sets the + * required name flags. This function will return only if the command + * line syntax is correct. + */ +void +parse_args(argc, argv, rname, bname, pname, oname) + int argc; /* arg count */ + char **argv; /* the args */ + char **rname; /* file with remarks about the entry */ + char **bname; /* file containing how prog.c should be built */ + char **pname; /* the obfuscated program source file */ + char **oname; /* ioccc entry output file */ +{ + char *optarg; /* -flag option operand */ + int flagname; /* the name of the -flag */ + int i; + + /* + * Not everyone has getopt, so we must parse args by hand. + */ + program = argv[0]; + for (i=1; i < argc; ++i) { + + /* determine the flagname */ + if (argv[i][0] != '-') { + usage(1); + /*NOTREACHED*/ + } + flagname = (int)argv[i][1]; + + /* determine the flag's operand */ + if (flagname != '\0' && argv[i][2] != '\0') { + optarg = &argv[i][2]; + } else { + if (i+1 >= argc) { + usage(2); + /*NOTREACHED*/ + } else { + optarg = argv[++i]; + } + } + + /* save the flag's operand in the correct global variable */ + switch (flagname) { + case 'r': + *rname = optarg; + break; + case 'b': + *bname = optarg; + break; + case 'p': + *pname = optarg; + break; + case 'o': + *oname = optarg; + break; + default: + usage(3); + /*NOTREACHED*/ + } + } + + /* + * verify that we have all of the required flags + */ + if (*rname == NULL || *bname == NULL || *pname == NULL || *oname == NULL) { + usage(4); + /*NOTREACHED*/ + } + return; +} + +/* + * usage - print a usage message and exit + * + * This function does not return. + */ +void +usage(exitval) + int exitval; /* exit with this value */ +{ + fprintf(stderr, + "usage: %s -r remarks -b build -p prog.c -o ioccc.entry\n\n", program); + fprintf(stderr, "\t-r remarks\tfile with remarks about the entry\n"); + fprintf(stderr, "\t-b build\tfile containing how prog.c should be built\n"); + fprintf(stderr, "\t-p prog.c\tthe obfuscated program source file\n"); + fprintf(stderr, "\t-o ioccc.entry\tioccc entry output file\n"); + exit(exitval); +} + +/* + * open_remark - open/check the remark file + * + * The remark file should be indented by 4 spaces, and should not extend + * beyond column MAX_COL. These are not requirements, so we only warn. + * + * This function returns NULL on I/O or format error. + */ +FILE * +open_remark(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + char buf[BUFSIZ+1]; /* input buffer */ + int toolong=0; /* number of lines that are too long */ + int non_indent=0; /* number of lines not indented by 4 spaces */ + + /* + * open the remark input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open remark file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * look at each line + */ + while (fgets(buf, BUFSIZ, stream) != NULL) { + + /* count lines that do not start with 4 spaces */ + if (buf[0] != '\n' && strncmp(buf, " ", 4) != 0) { + ++non_indent; + } + + /* count long lines */ + if (col_len(buf) > MAX_COL) { + /* found a line that is too long */ + ++toolong; + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* note long lines if needed */ + if (toolong > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s extend beyond the 80th column\n", + program, toolong, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* note non-indented lines, if needed */ + if (non_indent > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s are not indented by 4 spaces\n", + program, non_indent, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_build - open/check the build file + * + * The how to build file must not be longer than MAX_BUILD_SIZE bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_build(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + + /* + * open the how to build input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_BUILD_SIZE) { + fprintf(stderr, + "%s: FATAL: the how to build file: %s, is %d bytes long\n", + program, filename, statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_BUILD_SIZE); + return(NULL); + } + + /* return the open file */ + return(stream); +} + +/* + * open_program - open/check the program source file + * + * The program source file must be <= 3217 bytes. The number of + * non-whitespace and }{; chars not followed by whitespace must + * be <= 1536 bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_program(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + int count; /* special count size */ + int c; /* the character read */ + + /* + * open the program source input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open program source file: %s: ", + program, filename); + perror(""); + exit(7); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat program source file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_PROGRAM_SIZE) { + fprintf(stderr, + "%s: FATAL: the program source file: %s, is %d bytes long\n", + program, filename, statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_PROGRAM_SIZE); + return(NULL); + } + + /* + * count the non-whitespace, non {}; followed by whitespace chars + */ + count = 0; + c = 0; + while ((c=fgetc(stream)) != EOF) { + /* look at non-whitespace */ + if (!isascii(c) || !isspace(c)) { + switch (c) { + case '{': /* count if not followed by EOF or whitespace */ + case '}': + case ';': + /* peek at next char */ + c = fgetc(stream); + if (c != EOF && isascii(c) && !isspace(c)) { + /* not followed by whitespace or EOF, count it */ + ungetc(c, stream); + ++count; + } + break; + default: + ++count; + break; + } + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* look at the special size */ + if (count > MAX_PROGRAM_SIZE2) { + fprintf(stderr, + "%s: FATAL: the number of bytes that are non-whitespace, and\n", + program); + fprintf(stderr, + "%s: that are not '{', '}', ';' followed by whitespace\n", + program); + fprintf(stderr, + "%s: or EOF must be <= %d bytes\n", + program, MAX_PROGRAM_SIZE2); + fprintf(stderr, + "%s: in %s, %d bytes were found\n", + program, filename, count); + return(NULL); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_output - open/check the entry output file + * + * This function returns NULL on open error. + */ +FILE * +open_output(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + + /* + * open the ioccc entry output file + */ + stream = fopen(filename, "w"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open ioccc entry file for output: %s: ", + program, filename); + perror(""); + exit(8); + } + + /* return the open file */ + return(stream); +} + +/* + * output_entry - output the ---entry--- section + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_entry(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + char title[MAX_TITLE_LEN+1+1]; /* the entry's title */ + char buf[MAX_COL+1+1]; /* I/O buffer */ + int entry=0; /* entry number */ + int ret; /* fields processed by fscanf */ + int ok_line=0; /* 0 => the line is not ok */ + char skip; /* input to skip */ + FILE *date_pipe; /* pipe to a date command */ + time_t epoch_sec; /* seconds since the epoch */ + char *p; + + /* + * write the start of the section + */ + fprintf(output, "---entry---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the rule year + */ + fprintf(output, "rule:\t%d\n", RULE_YEAR); + check_io(output, oname, EOF_NOT_OK); + + /* determine if this is a fix */ + printf("Is this a fix, update or resubmittion to a "); + printf("previous entry (enter y or n)? "); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + if (buf[0] == 'y') { + fprintf(output, "fix:\ty\n"); + check_io(output, oname, EOF_NOT_OK); + printf("\nBe sure that the title and entry number that you give\n"); + printf("are the same of as the entry you are replacing\n"); + } else { + fprintf(output, "fix:\tn\n"); + check_io(output, oname, EOF_NOT_OK); + } + + /* + * write the title + */ + printf("\nYour title must match expression be a [a-zA-Z0-9_=] character\n"); + printf("followed by 0 to %d more [a-zA-Z0-9_=+-] characters.\n\n", + MAX_TITLE_LEN-1); + printf("It is suggested, but not required, that the title should\n"); + printf("incorporate your username; in the\n"); + printf("case of multiple authors, consider using parts of the usernames\n"); + printf("of the authors.\n\n"); + printf("enter your title: "); + do { + /* prompt and read a line */ + if ((ok_line = get_line(title, MAX_TITLE_LEN+1, MAX_COL-9)) <= 0) { + printf("\ntitle is too long, please re-enter: "); + continue; + } + + /* verify the pattern, not everyone has regexp, so do it by hand */ + if (!isascii((int)title[0]) || + !(isalnum((int)title[0]) || title[0] == '_' || title[0] == '=')) { + printf("\ninvalid first character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } else { + for (p=(&title[1]); *p != '\0' && *p != '\n'; ++p) { + if (!isascii((int)*p) || + !(isalnum((int)*p) || + *p == '_' || *p == '=' || *p == '+' || *p == '-')) { + printf("\ninvalid character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } + } + } + } while (ok_line <= 0); + fprintf(output, "title:\t%s", title); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the entry number + */ + printf("\nEach person may submit up to %d entries per year.\n\n", + MAX_ENTRY); + printf("enter an entry number from 0 to %d inclusive: ", MAX_ENTRY-1); + do { + /* get a valid input line */ + fflush(stdout); + ret = fscanf(stdin, "%d[\n]", &entry); + check_io(stdin, "stdin", EOF_NOT_OK); + /* skip over input until newline is found */ + do { + skip = fgetc(stdin); + check_io(stdin, "stdin", EOF_NOT_OK); + if (skip != '\n') { + /* bad text in input, invalidate entry number */ + entry = -1; + } + } while (skip != '\n'); + + /* check if we have a number, and if it is in range */ + if (ret != 1 || entry < 0 || entry > MAX_ENTRY-1) { + printf( + "\nThe entry number must be between 0 and %d inclusive\n\n", + MAX_ENTRY-1); + printf("enter the entry number: "); + } + } while (ret != 1 || entry < 0 || entry > MAX_ENTRY-1); + fprintf(output, "entry:\t%d\n", entry); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the submission date + */ + /* returns a newline */ + epoch_sec = time(NULL); + fprintf(output, "date:\t%s", asctime(gmtime(&epoch_sec))); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the OS/machine host information + */ + printf( + "\nEnter the machine(s) and OS(s) under which your entry was tested.\n"); + output_till_dot(output, oname, "host:"); +} + +/* + * output_remark - output the ---remark--- section + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_remark(output, oname, remark, rname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + FILE *remark; /* stream to the file containing remark text */ + char *rname; /* name of the remark file */ +{ + char buf[BUFSIZ+1]; /* input/output buffer */ + + /* + * write the start of the section + */ + fprintf(output, "---remark---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * copy the remark file to the section + */ + while (fgets(buf, BUFSIZ, remark) != NULL) { + fputs(buf, output); + check_io(output, oname, EOF_NOT_OK); + } + check_io(remark, rname, EOF_OK); + + /* be sure that the remark section ends with a newline */ + if (buf[strlen(buf)-1] != '\n') { + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + } +} + +/* + * output_author - output the ---author--- section + * + * Read the needed information from stdin, and write the author section. + * If multiple authors exist, multiple author sections will be written. + */ +void +output_author(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + char buf[MAX_COL+1+1]; /* I/O buffer */ + int more_auths; /* TRUE => more authors to note */ + int auth_cnt=0; /* number of authors processed */ + + /* + * prompt the user for the author section + */ + printf("\nEnter information about each author. If your entry is after\n"); + printf("%s and before the contest deadline, the judges\n", START_DATE); + printf("will attempt to Email back a confirmation to the first author\n"); + + /* + * place author information for each author in an individual section + */ + do { + + /* write the start of the section */ + fprintf(output, "---author---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* write the author */ + printf("\nAuthor #%d name: ", ++auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nname too long, please re-enter: "); + } + fprintf(output, "name:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the organization */ + printf("\nEnter the School/Company/Organization of author #%d\n", + auth_cnt); + printf("\nAuthor #%d org: ", auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter: "); + } + fprintf(output, "org:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the address */ + printf( + "\nEnter the postal address for author #%d. Be sure to include\n", + auth_cnt); + printf("your country and do not include your name.\n"); + output_till_dot(output, oname, "addr:"); + + /* write the Email address */ + printf( + "\nEnter the Email address for author #%d. Use an address from\n", + auth_cnt); + printf( + "a registered domain or well known site. If you give several\n"); + printf("forms, list them one per line.\n"); + output_till_dot(output, oname, "email:"); + + /* write the anonymous status */ + printf("\nShould author #%d remain anonymous (enter y or n)? ", + auth_cnt); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + fprintf(output, "anon:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* determine if there is another author */ + printf("\nIs there another author (enter y or n)? "); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + if (buf[0] == 'y') { + more_auths = TRUE; + } else { + more_auths = FALSE; + } + } while (more_auths == TRUE); + return; +} + +/* + * output_info - output the ---info--- section(s) + * + * Read the needed information from stdin, and write the info section. + * If multiple info files exist, multiple info sections will be written. + */ +void +output_info(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + char infoname[MAX_FILE_LEN+1]; /* filename buffer */ + char yorn[1+1]; /* y or n answer */ + char *uuname; /* name to uuencode as */ + FILE *infile; /* info file stream */ + + /* + * prompt the user for info information + */ + printf("\nInfo files should be used only to supplement your entry.\n"); + printf("For example, info files may provide sample input or detailed\n"); + printf("information about your entry. Because they are supplemental,\n"); + printf("the entry should not require them to exist.\n\n"); + + /* + * while there is another info file to save, uuencode it + */ + printf("Do you have a info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + while (yorn[0] == 'y') { + + /* read the filename */ + printf("\nEnter the info filename: "); + while (get_line(infoname, MAX_FILE_LEN+1, 0) <= 0) { + printf("\nInfo filename too long, please re-enter: "); + } + + /* compute the basename of the info filename */ + /* remove the trailing newline */ + uuname = &infoname[strlen(infoname)-1]; + *uuname = '\0'; + /* avoid rindex/shrrchr compat issues, do it by hand */ + for (--uuname; uuname > infoname; --uuname) { + if (*uuname == '/') { + ++uuname; + break; + } + } + + /* attempt to open the info file */ + infile = fopen(infoname, "r"); + if (infile == NULL) { + fprintf(stderr, "\n%s: cannot open info file: %s: ", + program, infoname); + perror(""); + continue; + } + + /* + * write the start of the section + */ + fprintf(output, "---info---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* uuencode the info file */ + uuencode(output, oname, infile, infoname, UUINFO_MODE, uuname); + + printf("\nDo you have another info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + }; + return; +} + +/* + * output_build - output the ---build--- section + * + * Read the needed information from stdin, and write the build section. + */ +void +output_build(output, oname, build, bname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + FILE *build; /* open build file stream */ + char *bname; /* name of the build file */ +{ + /* + * write the start of the section + */ + fprintf(output, "---build---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, build, bname, UUBUILD_MODE, UUBUILD_NAME); + return; +} + +/* + * output_program - output the ---program--- section + * + * Read the needed information form stdin, and write the program section. + */ +void +output_program(output, oname, prog, pname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + FILE *prog; /* open program stream */ + char *pname; /* name of program file */ +{ + /* + * write the start of the section + */ + fprintf(output, "---program---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, prog, pname, UUPROG_MODE, UUPROG_NAME); + return; +} + +/* + * output_end - output the ---end--- section + * + * Read the needed information form stdin, and write the 'end section'. + */ +void +output_end(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + /* + * write the final section terminator + */ + fprintf(output, "---end---\n"); + check_io(output, oname, EOF_NOT_OK); + return; +} + +/* + * get_line - get an answer from stdin + * + * This function will flush stdout, in case a prompt is pending, and + * read in the answer. + * + * This function returns 0 if the line is too long, of the length of the + * line (including the newline) of the line was ok. This function does + * not return if ERROR or EOF. + */ +int +get_line(buf, siz, maxcol) + char *buf; /* input buffer */ + int siz; /* length of input, including the newline */ + int maxcol; /* max col allowed, 0 => disable check */ +{ + int length; /* the length of the input line */ + + /* flush terminal output */ + fflush(stdout); + + /* read the line */ + if (fgets(buf, siz+1, stdin) == NULL) { + /* report the problem */ + check_io(stdin, "stdin", EOF_NOT_OK); + } + + /* look for the newline */ + length = strlen(buf); + if (buf[length-1] != '\n') { + int eatchar; /* the char being eaten */ + + /* no newline found, line must be too long, eat the rest of the line */ + do { + eatchar = fgetc(stdin); + } while (eatchar != EOF && eatchar != '\n'); + check_io(stdin, "stdin", EOF_NOT_OK); + + /* report the situation */ + return 0; + } + + /* watch for long lines, if needed */ + if (maxcol > 0 && (length > maxcol || col_len(buf) > maxcol)) { + /* report the situation */ + return 0; + } + + /* return length */ + return length; +} + +/* + * output_till_dot - output a set of lines until '.' by itself is read + * + * This routine will read a set of lines until (but not including) + * a single line with '.' is read. The format of the output is: + * + * leader:\tfirst line + * \tnext line + * \tnext line + * ... + * + * This routine will not return if I/O error or EOF. + */ +void +output_till_dot(output, oname, leader) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + char *leader; /* the lead text for the first line */ +{ + char buf[BUFSIZ+1]; /* input buffer */ + int count; /* lines read */ + int done=FALSE; /* TRUE => finished reading input */ + + /* instruct the user on how to input */ + printf("\nTo end input, enter a line with a single period.\n"); + + /* read lines until '.' or EOF */ + count = 0; + while (!done) { + /* issue the prompt */ + printf("%s\t", (count>0) ? "" : leader); + fflush(stdout); + + /* get the line */ + if (get_line(buf, BUFSIZ, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter:\n\t"); + continue; + } + + /* note if '.' was read */ + if (strcmp(buf, ".\n") == 0) { + done = TRUE; + } + + /* write line if we read something */ + if (!done) { + fprintf(output, "%s\t%s", (count++>0) ? "" : leader, buf); + check_io(output, oname, EOF_NOT_OK); + } + } + + /* if no lines read, at least output something */ + if (count <= 0) { + fprintf(output, "%s\t.\n", leader); + check_io(output, oname, EOF_NOT_OK); + } + return; +} + +/* + * col_len - determine the highest that a string would reach + * + * Given a string, this routine returns that a string would reach + * if the string were printed at column 1. Tab stops are assumed + * to start at 9, 17, 25, 33, ... + */ +int +col_len(string) + char *string; /* the string to examine */ +{ + int col; /* current column */ + char *p; /* current char */ + + /* scan the string */ + for (col=0, p=string; *p != '\0' && *p != '\n'; ++p) { + /* note the column shift */ + col = (*p=='\t') ? 1+((col+8)/8*8) : col+1; + } + if (*p == '\n') { + --col; + } + + /* return the highest column */ + return col; +} + +/* + * check_io - check for EOF or I/O error on a stream + * + * Does not return if EOF or I/O error. + */ +void +check_io(stream, name, eof_ok) + FILE *stream; /* the stream to check */ + char *name; /* the name of this stream */ + int eof_ok; /* EOF_OK or EOF_NOT_OK */ +{ + /* test for I/O error */ + if (ferror(stream)) { + fprintf(stderr, "%s: error on %s: ", program, name); + perror(""); + exit(1); + + /* test for EOF */ + } else if (eof_ok == EOF_NOT_OK && feof(stream)) { + fprintf(stderr, "%s: EOF on %s\n", program, name); + exit(1); + } + return; +} + +/* + * uuencode - uuencode a file + * + * Perform the uuencoding process identical to the process performed + * by the uuencode(1) utility. + * + * This routine implements the algorithm described in the uuencode(5) + * 4.3BSD Reno man page. + */ +void +uuencode(output, oname, infile, iname, umode, uname) + FILE *output; /* output file stream */ + char *oname; /* output filename */ + FILE *infile; /* input file stream */ + char *iname; /* input filename */ + int umode; /* the mode to put on the uuencode file */ + char *uname; /* name to put on the uuencode file */ +{ + char buf[UUENCODE_LEN+1]; /* the uuencode buffer */ + int read_len; /* actual number of chars read */ + int val; /* 6 bit chunk from buf */ + char filler='\0'; /* filler uuencode pad text */ + char *p; + + /* + * output the initial uuencode header + */ + fprintf(output, "begin %o %s\n", umode, uname); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + + /* + * We will process UUENCODE_LEN chars at a time, forming + * a single output line each time. + */ + while ((read_len=fread(buf,sizeof(buf[0]),UUENCODE_LEN,infile)) > 0) { + + /* + * the first character is the length character + */ + fputc(UUENCODE(read_len), output); + check_io(output, oname, EOF_NOT_OK); + + /* + * We will convert 24 bits at a time. Thus we will convert + * 3 sets of 8 bits into 4 sets of uuencoded 6 bits. + */ + for (p=buf; read_len>0; read_len-=3, p+=3) { + + /* bits 0 to 5 */ + val = (p[0]>>2)&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 6 to 11 */ + val = ((p[0]<<4)&0x30) | ((p[1]>>4)&0x0f); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 12 to 17 */ + val = ((p[1]<<2)&0x3c) | ((p[2]>>6)&0x03); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 18 to 23 */ + val = p[2]&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + } + + /* end of UUENCODE_LEN line */ + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer (don't depend on bzero() or memset()) + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + } + + /* check the last read on the input file */ + check_io(infile, iname, EOF_OK); + + /* write end of uuencode file */ + fprintf(output, "%c\nend\n", UUENCODE(filler)); + check_io(output, oname, EOF_NOT_OK); +} diff --git a/1993/plummer.c b/1993/plummer.c new file mode 100644 index 000000000..d0c61daa2 --- /dev/null +++ b/1993/plummer.c @@ -0,0 +1 @@ +char*_,*O;main(S,l)char**l;{*(O=*(l+++S-1)-1)=13,*l[1]=0;for(;;)for(printf(*l),_=O-1;_>=*l&&++*_>(S+*O+S)*S;*_--=(S+*O)*S);} diff --git a/1993/plummer.hint b/1993/plummer.hint new file mode 100644 index 000000000..0a3a37a30 --- /dev/null +++ b/1993/plummer.hint @@ -0,0 +1,81 @@ +Best One Liner: + + Mark Plummer + 2901 Reckord Road + Fallston, MD, 21047 + USA + + +Judges' comments: + + To run: + make plummer + ./plummer number arg + + where: + number a number (try 21701) + arg any argument + + For extra credit: What happens when 'number' contains non-numeric + characters, and why? + + +Selected notes from the author: + + This program prints out all numbers up to a given number of digits + on a single line. When the largest number is reached, the program + starts again with 0. It takes two arguments: the first argument + specifies the number to start counting from and uses leading 0's to + indicate the number of digits, the second argument can be anything + but must be present. + + Variable names are single characters chosen for their similarity to + other characters (O for 0, l for 1, S for 5 (in some fonts), and _ + for ... well nothing really, but it is easy to miss). To prevent + the need for strlen(), the fact that argv is laid out sequentially + is exploited (ie. argv[i + 1] == argv[i] + strlen(argv[i]) + 1). + This is not portable (by the books), but it seems to work + everywhere I try (actually, for vms, that only holds for i > 1). + Also, I depend on the fact that a carriage return causes the line + just written to be overwritten. lint (and most compilers) complain + that there is no control path leading to a return from main(). At + 125 characters, it still fits on a single line (for those of us who + don't mind ruining our eyes with 132 column screens). + + The first statement points the base of l (the argument vector) to + be the first argument by incrementing it. It then assigns O to + point to the character before the first character of the second + argument which also happens to be the null termination of the first + argument. *O gets a \r assigned to it. Finally 0 is assigned to + the first character of the second argument which has the effect of + null terminating the first argument after the carriage return had + removed its null termination. I really tried to make the last part + of that statement part of the original expression, but the best I + could do was attach it with a comma (against the advice of K&R). + The for loop runs the next for loop continuously (actually until + the machine crashes or the user gets tired of seeing the + counting). The next for loop is the meat of the program. In the + initialization statement, the string pointed to by l (the first + argument containing the digits used for counting followed by a \r) + is printed, and _ is started at the least significant digit in the + string. In the test portion, _ is insured not to be past the + beginning of the string (the most significant digit), and the digit + pointed to by _ is incremented and checked to be sure that it _is_ + greater than '9' (written here as (S+*O+S)*S). If the test fails, + either the string has been incremented or each digit in the string + has been reset to '0'. If the test succeeded, the iteration + statement assigns '0' (written here as (S+*O)*S (which has the + added bonus of having the code be a cry for help)) to *_ and + decrements _ to point to the next more significant digit to be + incremented; it is done only when a carry situation results (*_ has + been incremented past '9'). + + The inspiration for this program came from actual code which dealt + with scanning for a unique temporary filename by appending a + successively larger number to the end of a string. + +Copyright (c) 1993, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1993/rince.c b/1993/rince.c new file mode 100644 index 000000000..33e8bd2bb --- /dev/null +++ b/1993/rince.c @@ -0,0 +1,123 @@ +/** J.K.Bonfield ** +^ < +^ > +< # > v +< < +< > > < v +X X j +x X j +X x ^ k +^ ^ +^ # +X X X X + +^ v +v v +v # +v X +v x +> # < v +> > +X X l +x X l + +41 20 +######################################## +# # +# < < < < <> < < < # +# > > > <> > > > > # +# < < < < <> < < < # +# > > > <> > > > > # +# < < < < <> < < < # +# > > > <> > > > > # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# X # +########################################*/ +#include +#include +#include +#include +#include +int _tty_ch; +bool _echoit; +bool _rawmode; +SGTTY _tty; +#define U char +#define G for( +#define I )malloc(sizeof( + +typedef struct z {U x[20]; struct z*y; } j; j*J[2][256]; +struct timeval v= {0,1<<17} ; +U**X,c,*P="noopoqqnr",d; + +j*a(int Q, int i) { + G + clear(),noecho(),cbreak(); ; +) + +{ + int x=0,y=0,W=Q,Q=i-1,k; + G; + y<=Q; + (mvaddch(y,x,X[y][x]),++x^W-1)||(x=0,y++)); + k=y=- --x; + G + refresh(),c=select(k,&y,0,0,&v)?getch():0; + k?++x-W||(x=1,++y-Q||(--k,x=W-1,y=Q-1)):--x||(y--,x=W-1),k|y; +) + +{ + j *t; + G + t=J[1-k][X[y][x]]; t; t=t->y) { + U*f=t->x; + if (d==f[17]|f[17]==c) { + int i=k&2,u=9,k=1,w=x,_=y,T; + G; + --u||(d-f[8]&&(X[y][x]=f[8]),w---_--,i=0,u=8,k--);) { + _+=P[T=i>u?u:i]-'o'; + w+=P[4+T]-'p'; + if(k) { + if (d-f[i]&&f[i]-X[_][w]) break; + i++; + } else + f[++i+8]-d && (X[_][w]=f[i+8]); +} } } } } } + +jmp_buf E; + +int main(int open, U**exit) { + FILE*C=fopen ( + open-2?__FILE__:*++exit,P+8); + j*t; + volatile int Q,Y=0; + int i,q; d=open-2?'\t':'*'; L: + + Q=0; G; setjmp(E)<256; Q-- + ) + longjmp(E,(J[Y][Q]=0,Q++)); + G; ; ) { + if(!C)return 1; + if('\n'==(c=getc(C))) + if(!Y++)goto L; else + { fscanf(C,"%d %d\n",&i,&q); + X=(U**I P++)*q*(i+1)); + Q=0; G; Qy=J[Y][c]; J[Y][c]=t; + fgets(t->x,20,C); } +} diff --git a/1993/rince.data1 b/1993/rince.data1 new file mode 100644 index 000000000..80f651cf3 --- /dev/null +++ b/1993/rince.data1 @@ -0,0 +1,41 @@ +\#* ***** **'****** +\#** **** ***/***** +\$*******/ ******** +o*** **** ***o****, +=*** **** ***=****, +o******=* *o******. +o ***** * \******** +\ ******* \******** +'**$*****`** ****** +' *#***** \******** +'**#* *** ****`**** +'** ***** **'****** +/******=*\********* +`******=*'********* + +=**** *** ****=***/ +o**** *** ****o***/ +/***** ** *****/*** +/*****#**`********* +`******* *******`* +`*******#/********* + +36 18 +################################### +# # +#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$# +#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$# +#$$$$$$$$$$$$$#$$$#$$$$$$$$$$$$$$$# +#$$$$$$$$$$$$$#$$$#$$$$$$$$$$$$$$$# +#$$$$$$$$$$$$$#$$$#$$$$$$$$$$$$$$$# +# # +# # +# # # # # +# # # # +# # # # +# # +# # +# o # +# ==== # +# # +----------------------------------- diff --git a/1993/rince.data2 b/1993/rince.data2 new file mode 100644 index 000000000..b6837ca4f --- /dev/null +++ b/1993/rince.data2 @@ -0,0 +1,55 @@ +o***o@***@***d.***h +o*o****@*@*d****.*k +h***H@***@***..***h +k*K****@*@*.****.*k +o***.@***@***o.***h +O***.@***@***O.***h +h***.@***@***h.***h +j***.@***@***j.***h +k***.@***@***k.***h +l***.@***@***l.***h +o*.****@*@*o****.*k +O*.****@*@*O****.*k +h*.****@*@*h****.*k +j*.****@*@*j****.*k +k*.****@*@*k****.*k +l*.****@*@*l****.*k +@***.****.***@****h +@***d****.***@****h +@*d******.*@******k +@*.******.*@******k + +o***@o***@***.d***l +o*@****o*@*.****d*j +l***@L***@***..***l +j*@****J*@*.****.*j +o***@.***@***.o***l +O***@.***@***.O***l +h***@.***@***.h***l +j***@.***@***.j***l +k***@.***@***.k***l +l***@.***@***.l***l +o*@****.*@*.****o*j +O*@****.*@*.****O*j +h*@****.*@*.****h*j +j*@****.*@*.****j*j +k*@****.*@*.****k*j +l*@****.*@*.****l*j +@****d***.****@***l +@****.***.****@***l +@******d*.******@*j +@******.*.******@*j + +23 12 +###################### +#do#.......#..o.o.#..# +#oo#.#K###.#j.#.#.#h.# +#.@..#..H.....hh#.#od# +#oo..H..####k#d...#.o# +#######J#o.#..o#.##.o# +#dd##oo.#o.###ddo#...# +#.Od###.#.o####do#..d# +#.o.H........#####o..# +#.oo##..#O....O.O.O.o# +#d..#ooooO.o#...O....# +###################### diff --git a/1993/rince.data3 b/1993/rince.data3 new file mode 100644 index 000000000..aeab20df4 --- /dev/null +++ b/1993/rince.data3 @@ -0,0 +1,66 @@ +m*** o***o***m ***h +m*** O***o***m.***h +M*** o***O***m ***h +M*** O***O***m.***h +m***.o***o***M ***h +m***.O***o***M.***h +M***.o***O***M ***h +M***.O***O***M.***h +o*** **** ***o****h +o***.**** ***O****h +O*** ****.***o****h +O***.****.***O****h +m* ****o*o*m**** *k +m* ****O*o*m****.*k +M* ****o*O*m**** *k +M* ****O*O*m****.*k +m*.****o*o*M**** *k +m*.****O*o*M****.*k +M*.****o*O*M**** *k +M*.****O*O*M****.*k +o* ****** *o******k +o*.****** *O******k +O* ******.*o******k +O*.******.*O******k + +m***o ***o*** m***l +m***O ***o***.m***l +M***o ***O*** m***l +M***O ***O***.m***l +m***o.***o*** M***l +m***O.***o***.M***l +M***o.***O*** M***l +M***O.***O***.M***l +o**** *** ****o***l +o****.*** ****O***l +O**** ***.****o***l +O****.***.****O***l +m*o**** *o* ****m*j +m*O**** *o*.****m*j +M*o**** *O* ****m*j +M*O**** *O*.****m*j +m*o****.*o* ****M*j +m*O****.*o*.****M*j +M*o****.*O* ****M*j +M*O****.*O*.****M*j +o****** * ******o*j +o******.* ******O*j +O****** *.******o*j +O******.*.******O*j + +20 15 +. #### + #### # # + ### o###m # + ## m # + ## m mm## ## + # #m## # + # # m mm # ### + # m # # m ##### +#### # mm # # +#### ## m # +#. ### ######## +#.. ..# #### +#...#.# +#.....# +####### diff --git a/1993/rince.data4 b/1993/rince.data4 new file mode 100644 index 000000000..9424f9eec --- /dev/null +++ b/1993/rince.data4 @@ -0,0 +1,64 @@ +m*** o***o***m ***h +m*** O***o***m.***h +M*** o***O***m ***h +M*** O***O***m.***h +m***.o***o***M ***h +m***.O***o***M.***h +M***.o***O***M ***h +M***.O***O***M.***h +o*** **** ***o****h +o***.**** ***O****h +O*** ****.***o****h +O***.****.***O****h +m* ****o*o*m**** *k +m* ****O*o*m****.*k +M* ****o*O*m**** *k +M* ****O*O*m****.*k +m*.****o*o*M**** *k +m*.****O*o*M****.*k +M*.****o*O*M**** *k +M*.****O*O*M****.*k +o* ****** *o******k +o*.****** *O******k +O* ******.*o******k +O*.******.*O******k + +m***o ***o*** m***l +m***O ***o***.m***l +M***o ***O*** m***l +M***O ***O***.m***l +m***o.***o*** M***l +m***O.***o***.M***l +M***o.***O*** M***l +M***O.***O***.M***l +o**** *** ****o***l +o****.*** ****O***l +O**** ***.****o***l +O****.***.****O***l +m*o**** *o* ****m*j +m*O**** *o*.****m*j +M*o**** *O* ****m*j +M*O**** *O*.****m*j +m*o****.*o* ****M*j +m*O****.*o*.****M*j +M*o****.*O* ****M*j +M*O****.*O*.****M*j +o****** * ******o*j +o******.* ******O*j +O****** *.******o*j +O******.*.******O*j + +20 14 +. ######### + ## ## ##### +### # # ### +# m #m # # ... # +# # m#om## # #.#. # +# # #m # . . # +# m m # # #.#. # +# ## ##m m . . # +# m # # #m#.#. # +## m m m m... # + #m ###### ## # + # # ########## + #### diff --git a/1993/rince.design b/1993/rince.design new file mode 100644 index 000000000..67a451643 --- /dev/null +++ b/1993/rince.design @@ -0,0 +1,84 @@ + Implementation notes + -------------------- + + Due to the long time this has been slowly evolving, it's hard to describe + quite whether it's been `implemented'. I think perhaps evolve is a better + term. I basic concept behind the program is to describe a game as a simple, + slightly cheaty, cellular automata system, with some of the transitions + bound to key presses. + + For instance, assume you wish to make a boulder 'o' roll off a hill '/' + A standard automata would have 2 rules something like this: + + + o.. ... + \.. --> `o' .o. --> `.' + ... .\. + + + However, the system I devised, in order to keep things small and neat(!), + was to define a 3x3 to 3x3 map (instead of the 3x3 to 1x1 shown above). + Hence: + + .o. ... + .\. --> .\o + ... ... + + This does of course have the odd problem with clashes. What if we want to + roll two down boulders down simultaneously towards the same square. + I perform no buffering, and so this situation is just a 'fight it out' and + let which ever transition has priority win. Such a case may produce the + following change of maps (depending on which 'roll' transition is used + first). + + o.o ..o o.. + \./ changes to \o/ or to \o/ + ... ... ... + + I claim that it is possible to perform all of the 3x3 to 1x1 transitions + in a 3x3 to 3x3 based system. One other feature added in is a work around + for the 'no buffering' problem. if we define an space ship (as in the + space invader example) to fly right, and we are 'walking through' our map + from top-left to bottom-right, then it is easy to foresee a situation where + our space ship would zip right as far as possible in only the one cycle + of the automata. However, a similar leftwards-bound space ship would only + move the required one square. For this reason I have two lists of + transitions and apply them independently of each other; first top-left to + bottom right, and the second in the reverse direction. This means that I + can make any 'object' move by any amount in a single transition. + + Now comes the key important addition to make it 'game' worthy - the + addition of external control by the user. This is done by requesting that + some transitions are only valid when a certain key has been pressed. + So for example, if we (an @ symbol) wish to move right when the 'l' key + is hit we have a transition like: + + Key: l + * * * * * * + * @ . * . @ + * * * * * * + + Here I also use wildcards. On the match side (left) of the transition, an + asterisk will match against any character. On the update side (right), an + asterisk means 'keep whatever was here before'. So the above example + simply means to swap the '@' and '.' around when 'l' is pressed. For the + purposes of space saving, this transition is shrunk to a single line. + + Key: K + a b c 1 2 3 + d e f 4 5 6 + g h i 7 8 9 + + is written as: + + eabcdfghi512346789K + + If there are no keys needed for this transition, the character '*' should + be used instead. Now the format of the game description file is now + the following: (angle brackets denote an 'entity' to be defined). + + *\n*\n[ \t]+\n + + + The should take into account the newline at the end of each line + of map, and hence should also be one larger than expected. diff --git a/1993/rince.hint b/1993/rince.hint new file mode 100644 index 000000000..36d673ada --- /dev/null +++ b/1993/rince.hint @@ -0,0 +1,185 @@ +Most Well Rounded: + + James Bonfield + MRC Laboratory of Molecular Biology, + Hills Road, + Cambridge, + England + + +Judges' comments: + + To run: + make rince + rince [cabbage] + + where: + [cabbage] a CABBAGE description file (default: rince.c) + + The author has provided several CABBAGE files for your amusement: + + rince.data1 plays breakout. Keys are ',' for left, '/' + for right, and '.' for 'fire the ball'. + + rince.data2 plays the old rince game from IOCCC 1991 + + rince.data3 Sokoban screen 11. You are the 'o' character. You + must push the money 'm' into the dotted region of + the screen. The game is considered finished when + all the 'm's are then 'M's. + + rince.data4 Sokoban screen 13. Same rules as above. + + For a brief design description, see rince.design. + + The select(2) from SunOS says: + + BUGS + + ... + + select() should probably return the time remaining from the + original timeout, if any, by modifying the time value in + place. This may be implemented in future versions of the + system. Thus, it is unwise to assume that the timeout + pointer will be unmodified by the select() call. + + Systems such as Linux does return the remaining time in timeout + field (0 if no keys were pressed), but `rince' assumes that + timeout remains unmodified. + + It has been suggested that: + + select(k,&y,0,0,&v) + + should be replaced with: + + select(k,&y,0,0,(v.tv_usec=1< | + + +RULES: + + To help us with the volume of entries, we ask that you follow these rules: + + 1) Your entry must be a complete program. + + 2) Your entry must be <= 3217 bytes in length. The number of characters + excluding whitespace (tab, space, newline), and excluding any ; { or } + followed by either whitespace or end of file, must be <= 1536. + + 3) Your entry must be submitted in the following format: + +---entry--- +rule: 1993 +fix: y or n (n => this is a new entry, y => this replaces an older entry) +title: title of entry (see comments below) +entry: Entry number from 0 to 7 inclusive (your 1st entry should by 0) +date: Date/time of submission in UTC (see comments below) +host: Machine(s) and OS(s) under which your entry was tested + Use tab indented lines if needed +---remark--- + Place remarks about this entry in this section. It would be helpful if + you were to indent your remarks with 4 spaces, though it is not a + requirement. Also, if possible, try to avoid going beyond the 79th + column. Blank lines are permitted. +---author--- +name: your name +org: School/Company/Organization +addr: postal address + use tab indented lines to continue + don't forget to include the country +email: Email address from a well known site or registered domain. + If you give several forms, list them on separate tab indented lines. +anon: y or n (y => remain anonymous, n => ok to publish this info) +---info--- +If your program needs an info file, place a uuencoded copy of it in +this section. In the case of multiple info files, use multiple info +sections. If your entry does not need a info file, skip this section. +---build--- +Place a uuencoded copy of the command(s) used to compile/build your program +in this section. It must uudecode into a file named 'build'. The resulting +file must be 255 bytes or less. +---program--- +Place a uuencoded copy of your program in this section. It must uudecode +into a file named is 'prog.c'. The resulting file must follow rule #2. +---end--- + + Regarding the above format: + + * The title must match the expression: [a-zA-Z0-9_=][a-zA-Z0-9_=+-]* + and must be 1 to 12 characters in length. + + It is suggested, but not required, that the title should + incorporate your username; in the case of multiple authors, + consider using parts of the usernames of the authors. + + * The date in the ---entry--- section should be given with respect + to UTC. The format of the date should be as returned by asctime() + using the C locale. (see guidelines for more info) + + * You may correct/revise a previously submitted entry by sending + it to the contest email address. Be sure to set 'fix' in the + ---entry--- section to 'n'. The corrected entry must use the same + title and entry number as submittion that is being corrected. Be + sure that you note the resubmittion in the ---remark--- as well. + + * With the exception of the header, all text outside of the above + format may be ignored by the judges. If you need tell the judges + something, put it in the ---remark--- section, or send a separate + Email message to the judges. + + * Information from the ---author--- section will be published unless + 'y' was given to the respective author's 'anon' line. + + * To credit multiple authors, include an ---author--- section for + each author. Each should start with ---author--- line, and + should be found between the ---entry--- and ---build--- sections. + + * The entry's remarks should include: + - what this program does + - how to run the program (sample args or input) + - special compile or execution instructions, if any + - special filename requirements (see rule 4 and 5) + - information about any ---data--- files + - why you think the program is obfuscated + - note if this entry is a re-submission of a previous entry. + - any other remarks (humorous or otherwise) + + * Do not rot13 your entry's remarks. You may suggest that certain + portions of your remarks be rot13ed if your entry wins an award. + + * Info files should be used only to supplement your entry. They + should not be required to exist. + + If your entry does not need an info file, skip the ---info--- + section. If your entry needs multiple info files, use multiple + ---info--- sections, one per info file. You should describe + each info file in the ---remark--- section. + + 4) If your entry is selected as a winner, it will be modified as follows: + + 'build' is incorporated into a makefile, and 'build' is removed + 'prog.c' is renamed to your entry's title, followed by an optional + digit, followed by '.c' + your entry is compiled into a file with the name of your entry's + title, possibly followed by a digit + + If your entry requires that a build file exist, state so in your + entry's remark section. The makefile will be arranged to execute a + build shell script containing the 'build' information. The name of + this build shell script will be your entry's title, possibly followed + by a digit, followed by '.sh'. + + If needed, your entry's remarks should indicate how your entry must + be changed in order to deal with the new filenames. + + 5) The build file, the source and the resulting executable should be + treated as read-only files. If your entry needs to modify these files, + it should make and modify a copy of the appropriate file. If this + occurs, state so in your entry's remarks. + + 6) Entries that cannot be compiled by an ANSI C compiler will be rejected. + Use of common C (K&R + extensions) is permitted, as long as it does not + cause compile errors for ANSI C compilers. + + 7) The program must be of original work. All programs must be in the + public domain. All copyrighted programs will be rejected. + + 8) Entries must be received prior to 07-May-93 0:00 UTC. (UTC is + essentially equivalent to Greenwich Mean Time) Email your entries to: + + ...!{apple,pyramid,sun,uunet}!hoptoad!obfuscate + obfuscate@toad.com + + We request that your message use the subject 'ioccc entry'. + + If possible, we request that you hold off on Emailing your entries + until 1-Mar-93 0:00 UTC. Early entries will be accepted, however. + We will attempt to email a confirmation to the the first author for + all entries received after 1-Mar-93 0:00 UTC. + + 9) Each person may submit up to 8 entries per contest year. Each entry + must be sent in a separate Email letter. + + 10) Entries requiring human interaction to be built are not allowed. + Compiling an entry (must) produce a file (or files) which may | + be executed. | + + 11) Programs that require special privileges (setuid, setgid, super-user, + special owner or group) are not allowed. + + +FOR MORE INFORMATION: + + The Judging will be done by Landon Noll and Larry Bassel. Please send + questions or comments about the contest, to: + + ...!{apple,pyramid,sun,uunet}!hoptoad!judges (not the address for | + judges@toad.com submitting entries) | + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. + + +chongo /\cc/\ {chongo,noll}@{toad,sgi}.com | +Larry Bassel lab@sun.com | diff --git a/1993/schnitzi.c b/1993/schnitzi.c new file mode 100644 index 000000000..24f9bf26f --- /dev/null +++ b/1993/schnitzi.c @@ -0,0 +1,31 @@ +#include +#define iii\ +( I ) if ( ii(I,6\ + ) )I [ strlen(I ) -1]=!1 + int ii(ll,lll ) char*ll; { + + char *l="\"; !l ? 1.1 : l; l,printf(";int l1=1-/*+&|"); &+|-*/1,li=!1;while + +( lll>l1 ) li|=! ( l[3*l1+++3 + ] -ll[strlen ( ll)-1] ) ;return +( li ) ;}main ( ll,lll + ) char*lll[];{char l1 [ 111][21],li1[111][21 ] ,il1[111],i1l +[ 111 ] ;int lli,l11,l1l,li/* ( */,ll1,il,l;FILE*f;if(ll-2 + ) {f=fopen ( lll[1],"r" ) ;lli=l=ll1=il=!1;while +( fscanf(f,"%s",l1[lli] ) +1){li=ii ( l1[lli],3 + ) ;iii ( l1[lli] ) ;l1l=l11=!1;while +( l1l>-ll ) {iii ( lll[-l1l] + ) ;strcasecmp ( lll[-l1l--],l1[lli] ) || +( l11=++il ) ;}l11||lli++;if ( li + ) {if ( ll1l1l + ) printf ( " %s",li1[l1l++] ) ;puts +( "." ) ;}}else{sprintf ( il1,"cat %s;echo",lll[1] + ) ;system ( il1 ) ;}printf +( "\n? " ) ;gets ( il1 + ) ;sprintf ( i1l,"%s %s %s",lll[!1 ] ,lll[1],il1);system +( i1l); } diff --git a/1993/schnitzi.hint b/1993/schnitzi.hint new file mode 100644 index 000000000..91899a36c --- /dev/null +++ b/1993/schnitzi.hint @@ -0,0 +1,89 @@ +Obfuscated Intelligence Award: + + Mark Schnitzius + 1700 Woodbury Rd. #1208 + Orlando, FL 32828 + USA + + +Judges' comments: + + To run: + make schnitzi + ./schnitzi file + + where: + file a file containing some text + + After this program prints the contents of 'file', ask it + some questions related to the text. + + The author suggests the following questions when using schnitzi.info: + + Who is Mark Schnitzius? + What exactly does this program do? + What language is it written in? + Has the Loch Ness monster really been captured? + Who was Hitler? + Were the NASA moon landings faked? + Is it true that Elvis is alive? + Do colorless green ideas sleep furiously? + + NOTE: The author may also be contacted at: marks@aldrin.ksc.nasa.gov + + We suggest you try using the body (minus the header and signature line) + of a Usenet article. You might want to try something from alt.flame. :-) + + +Selected notes from the author: + + I wanted to write a program that would read in a text file in + natural language (such as English) and answer questions about that + text file. I thought this might be a complicated task, and I was + right -- it took me over 800 bytes. Of course, it doesn't always + work, but that's AI for you. + + This program accepts the name of a text file as the first + parameter. For example, to run it on the supplied data file called + 'info' you would type 'schnitzi info'. It echoes the file, then + gives you a prompt where you may type in questions about that text. + The more words you use which are actually present in the text file, + the better results you get. You'll need to hit to break out + of the program. Just hitting at the prompt will reprint the + paragraph. + + If you're curious as to how it works, I guess you could feed in the + source as the input file and ask "How does this work?" at the prompt, + but I'm not guaranteeing any results... + + Compilation notes: + + o The use of 'strcasecmp' may be non-standard. 'strcmp' + can be substituted for it, with a slight performance penalty. + + o This program depends on the first command-line parameter, typically + called argv[0], to hold the name of the executable. It is my under- + standing that this property of argv[0] is not guaranteed on some + systems. + + This program is obfuscated in the following ways: + + o It uses a hidden string to test for punctuation; + + o The layout, variable names, and expression format + have been chosen in such a way as to cause visual confusion; + + o It uses uses external 'system' calls to echo the text + file and break up the question into individual words with a + recursive call; + + o It uses a clever hack to simulate artificial intelligence. + + The text for the info file, by the way, consists largely of headlines + from the Weekly World News. + +Copyright (c) 1993, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1993/schnitzi.info b/1993/schnitzi.info new file mode 100644 index 000000000..b415b90ea --- /dev/null +++ b/1993/schnitzi.info @@ -0,0 +1,8 @@ +This program answers questions about paragraphs +of text posed to it in English. It is written +in C. Mark Schnitzius is the author of this +program. + +The Loch Ness monster has been captured. Elvis +is alive. Hostler was a woman. The NASA moon +landings were clearly faked. diff --git a/1993/vanb.c b/1993/vanb.c new file mode 100644 index 000000000..98800e1d4 --- /dev/null +++ b/1993/vanb.c @@ -0,0 +1,26 @@ +O5(O2,O7,O3)char**O7;{return!(O2+=~01+01)?00:!(O2-=02>01)?printf("\045\157\012" +,O5(012,O7+01,00)):!(O2-=02>>01)?(**O7<=067&&**O7>057?O5(03,O7,*(*O7)++-060+010 + *O3):O3 ):!(O2 -=-O3- ~O3)? (072>** + O7&&060 <=**O7 ?O5(04 ,O7,012 *O3-060 + +*(*O7 )++):O3 ):!(O2 -=!O3+ !!O3)?( + **O7>057 &&**O7 <=071? O5(05, O7,*(* + O7)+++ O3*020 -060): **O7<= 0106&& + 00101<= **O7?O5 (05,O7 ,020*O3 +*(*O7) + ++-067) :0140<** O7&&** O7<0147 ?O5(05, + O7,-0127 +*(*O7 )+++020 *O3):O3 ):!( + O2-=02- 01)?(** O7==050 ?050** ++*O7, + O5(013, O7,O5( 012,O7 ,00)):* *O7<056 + &&054<* *O7?055 **++* O7,-O5( 06,O7, + 00):054 >**O7&& 052<** O7?050* *(*O7) + ++,O5(06 ,O7,00 ):!(** O7^0170 )||!( + 0130^** O7)?*++ *O7,O5 (05,O7 ,00):* + *O7==0144 ||**O7 ==0104 ?++*O7 ,O5(04, + O7,00): O5(03 ,O7,00 )):!-- O2?(* + *O7==052 ?O5(07 ,O7,O3* (*++*O7 ,O5(06 + ,O7,00) )):!( 045-** O7)?O5( 07,O7, + O3%(03+( *O7)++, O5(06, O7,00) )):!(** + O7^057)?O5(07, O7,O3/( 03-*++ *O7,O5( + 06,O7,00))):O3 ):!(O2 +=01-02 )?O5(07 + ,O7,O5(06,O7, 00)):!( O2+=-02/ 02)?(!(* +*O7-053)?O5(011,O7,O3+(++*O7,O5(010,O7,00))):!(055^**O7)?O5(011,O7,O3-(03+*(*O7 +)++,O5(0010,O7,00))):O3):!(O2-=0563&0215)?O5(011,O7,O5(010,O7,00)):(++*O7,O3);} diff --git a/1993/vanb.hint b/1993/vanb.hint new file mode 100644 index 000000000..b8b6519f4 --- /dev/null +++ b/1993/vanb.hint @@ -0,0 +1,186 @@ +Most Irregular Expression: + + David Van Brackle + ISX Corporation + 1165 Northchase Parkway, Suite 120 + Marietta, GA 30067 + USA + + +Judges' comments: + + To run: + make vanb + ./vanb 'exp' + + where: + 'exp' an octal expression + + The octal expression may contain: + + unary operators: +, - + binary operators +, -, *, /, % + hex numbers: x or X follow by hex digits + decimal numbers: d or D follow by decimal digits + octal numbers: octal digits + grouping: () + + No spaces are allowed in the expression. To avoid shell expansion, + one should surround the expression in single quotes. + + It is a good thing that this program consists of only one + expression, otherwise it might become hard to understand. :-) + + +Selected notes from the author: + + The program does no error checking - erroneous expressions will + produce spurious results. Note that unary '-' is an operator. Thus, + decimal -46 would be entered as -d46 and not d-46. + + What Makes This Program Special: + + 0) Of course, the fact that the program takes input and produces output + in octal, rather than a more useful system like decimal, makes + it "special". + + 1) The entire program consists of a single expression, returned from main. + + 2) There are no global or local variables other than the parameters + to main + + 3) All of the constants in the program are expressed in octal - including + the printf string. + + 4) The variables are given names which cause visual confusion with the + octal constants. + + 5) The program is formatted like a roman numeral 8. The significance of + 8 is obvious. I chose roman numerals because it is a numbering + system even more arcane than octal. It's not very 'deceptive', + but it's difficult to deceptively format a program which has no + explicit control structures (other than ?:'s). + + 6) Many simple tasks are done many times. I tried to do these differently + each time, to make the program harder to understand. + + How It Works: + + It's a recursive descent parser, calling main + for all of its recursion. O2 is a state variable, telling main + what grammar non-terminal to parse. **O7 is the next character. + O3 is an intermediate result. Whenever you see a construct like: + + !(expression with O2)? + + it's decrementing & testing O2 to see what state it's in. Comparisons + involving **O7 and octal constants are looking for certain characters. + + Here's the grammar ('e' denotes the empty string) : + + ::= + ::= + | - | e + ::= + ::= * | / | % | e + ::= + | - | ( | d | D | x | X | + ::= ) + ::= [0-9] | e + ::= [0-9] | [A-F] | [a-f] | e + ::= [0-7] | e + + Here's how the grammar nonterminals map to octal state numbers: + + is 012 + is 011 + is 010 + is 07 + is 06 + is 013 + is 04 + is 05 + is 03 + + Here's a version of the program before it got formatted into the VIII, + augmented with comments showing where each state begins. N1 and N2 are + notes: + + #define O5 main + O5(O2,O7,O3)char**O7; + { + return + /* N1 */ !(O2+=~01+01) ? + 00: + /* N2 */ !(O2-=02>01) ? + printf("\045\157\012",O5(012,O7+01,00)): + /* O */ !(O2-=02>>01) ? + (**O7<=067 && **O7>057 ? O5(03,O7,*(*O7)++-060+010*O3):O3): + /* D */ !(O2-=-O3-~O3) ? + (072>**O7 && 060<=**O7 ? O5(04,O7,012*O3-060+*(*O7)++):O3): + /* X */ !(O2-=!O3+!!O3) ? + (**O7>057 && **O7<=071 ? O5(05,O7,*(*O7)+++O3*020-060): + **O7<=0106 && 0101<=**O7 ? O5(05,O7,020*O3+*(*O7)++-067): + 0140<**O7 && **O7<0147 ? O5(05,O7,-0127+*(*O7)+++020*O3):O3): + /* F */ !(O2-=02-01) ? + (**O7==050 ? 050**++*O7,O5(013,O7,O5(012,O7,00)): + **O7<056 && 054<**O7 ? 055**++*O7,-O5(06,O7,00): + 054>**O7 && 052<**O7 ? 050**(*O7)++,O5(06,O7,00): + !(**O7^0170)||!(0130^**O7) ? *++*O7,O5(05,O7,00): + **O7==0144||**O7==0104 ? ++*O7,O5(04,O7,00):O5(03,O7,00)): + /* T' */ !--O2 ? + (**O7==052 ? O5(07,O7,O3*(*++*O7,O5(06,O7,00))): + !(045-**O7) ? O5(07,O7,O3%(03+(*O7)++,O5(06,O7,00))): + !(**O7^057) ? O5(07,O7,O3/(03-*++*O7,O5(06,O7,00))):O3): + /* T */ !(O2+=01-02) ? + O5(07,O7,O5(06,O7,00)): + /* E' */ !(O2+=-02/02) ? + (!(**O7-053)?O5(011,O7,O3+(++*O7,O5(010,O7,00))): + !(055^**O7) ? O5(011,O7,O3-(03+*(*O7)++,O5(010,O7,00))):O3): + /* E */ !(O2-=0563&0215) ? + O5(011,O7,O5(010,O7,00)): + /* C */ (++*O7,O3); + } + + Note N1: It should never enter this state, unless the user invokes the + program with no parameters, in which case it just returns 0. + + Note N2: Since the program is properly invoked with 1 parameter, this is + the first state it will go into. This state just invokes + printf, and sends the parser to state 012 (which is ). + + The E and T states work like this: + + int e(){ return eprime( t() ); } + + The E' and T' states work like this: + + int eprime( int intermediate ) + { + if( ch == '+' ) + { + ch = nextchar(); + return eprime( intermediate + t() ); + } + else return intermediate; + } + + The D, X and O states work like this (they assume that they're initially + called with 0): + + int octal( int intermediate ) + { + if( ch>='0' && ch<='7' ) + { + intermediate = intermediate * 8 + ch - '0'; + ch = nextchar(); + return octal( intermediate ); + } + else return intermediate; + } + + F and C work similarly. + +Copyright (c) 1993, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1994/1994.tar.bz2 b/1994/1994.tar.bz2 new file mode 100644 index 000000000..533de62c1 Binary files /dev/null and b/1994/1994.tar.bz2 differ diff --git a/1994/Makefile b/1994/Makefile new file mode 100644 index 000000000..69f3bea69 --- /dev/null +++ b/1994/Makefile @@ -0,0 +1,158 @@ +# %W% %G% %U% +# +# 1994 makefile +# +# Copyright (c) 1994, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll and Larry Bassel. + + +SHELL=/bin/sh +CAT=cat +CHMOD=chmod +CP=cp +ECHO=echo +GUNZIP=gunzip +UUDECODE=uudecode +LN=ln +RM=rm +SED=sed +TRUE=true + +# flags for ANSI compiles +# +# NOTE: Some ANSI compilers make use of -Xa to turn on ANSI mode, +# others such as gcc may want -ansi, others may want nothing +# at all. Adjust the CFLAGS line as needed. +# +# NOTE: Some compilers cannot optimize, or optimize some entries +# entries incorrectly. You might want need to turn on -O +# to see if your compiler can handle them. +# +#CFLAGS=-O -Xa +#CFLAGS=-Xa +#CFLAGS= -ansi +CFLAGS= -ansi -O +#CFLAGS= + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +#CC=cc +CC=gcc + +# winners that compile under ANSI C +# +WINNERS= dodsond1 dodsond2 horton imc ldb schnitzi shapiro smr tvr weisberg \ + westley +ALT_NAMES= dodsond2.orig shapiro.alt horton.alt gtface weisberg.alt tvr.alt + +all: $(WINNERS) $(ALT_NAMES) + +westley: westley.c + ${CC} ${CFLAGS} westley.c -DO -o westley + +weisberg: weisberg.c + ${CC} ${CFLAGS} -Dc='n*n>x?p:((m=*(b+1)),N))' \ + -De='(2<<6*sizeof(int))' \ + -Do='(8<<5*sizeof(int))' \ + -DN='((b=t+1),x+=2,x>e?exit():o' \ + -Dp='(a-t shapiro_t2.c + +shapiro_t1: shapiro.c + ${CC} ${CFLAGS} shapiro.c -o shapiro_t1 + +shapiro.alt: shapiro.alt.c + ${CC} ${CFLAGS} shapiro.alt.c -o shapiro.alt + +schnitzi: schnitzi.c + ${CC} ${CFLAGS} schnitzi.c -o schnitzi + +horton: horton.c + ${CC} ${CFLAGS} horton.c -o horton + +# Here are some programs related to the horton entry. See horton.hint +# for details. +# +horton.alt: horton.alt.c + ${CC} ${CFLAGS} horton.alt.c -o horton.alt +gtface: gtface.c + ${CC} ${CFLAGS} gtface.c -o gtface + +ldb: ldb.c + ${CC} ${CFLAGS} ldb.c -o ldb + +imc: imc.c + ${CC} ${CFLAGS} imc.c -o imc + +dodsond2: dodsond2.c + ${CC} ${CFLAGS} dodsond2.c -o dodsond2 + +# NOTE: this is the original (gziped) file that won +# +dodsond2.orig: dodsond2.gz + @${RM} -f dodsond2.orig.c + -${GUNZIP} < dodsond2.gz > dodsond2.orig.c + -@if [ -s dodsond2.orig.c ]; then \ + ${ECHO} "${CC} ${CFLAGS} dodsond2.orig.c -o dodsond2.orig"; \ + ${CC} ${CFLAGS} dodsond2.orig.c -o dodsond2.orig; \ + else \ + ${RM} -f dodsond2.orig.c; \ + ${ECHO} "sorry, we could not gunzip dodsond2.gz"; \ + fi + +dodsond2.gz: dodsond2.gz.uu + @${RM} -f dodsond2.gz + ${UUDECODE} dodsond2.gz.uu + +dodsond1: dodsond1.c + ${CC} ${CFLAGS} dodsond1.c -o dodsond1 + +clean: + $(RM) -f *.o a.out core + +clobber: clean + $(RM) -f $(WINNERS) + $(RM) -f $(ALT_NAMES) + ${RM} -f dodsond2.orig.c dodsond2.gz shapiro_t2.c shapiro_t1 + +nuke: clobber + @${TRUE} + +install: all + ${CAT} $(WINNERS) $(ALT_NAMES) > /dev/null diff --git a/1994/README b/1994/README new file mode 100644 index 000000000..f65b9e9b5 --- /dev/null +++ b/1994/README @@ -0,0 +1,138 @@ +1994 marked the "The Eleventh International Obfuscated C Code Contest" + +Copyright (c) 1994, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + + +Use make to compile entries. It is possible that on BSD or non-unix +systems the makefile needs to be changed. See the Makefile for details. + +Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitters. + +Read over the makefile for compile/build issues. Your system may +require certain changes (add or remove a library, add or remove a +#define). + +Name and address information are separated from the actual program +prior to judging. This eliminates any chance that we would bias our +judging for/against any person or group. + +This year we retracted the guideline that discouraged the use of C +constructs such as 3["curds"]. At one time, certain ANSI compilers did +not consider such expressions to be valid ANSI C. Alert readers noted +that the current ANSI standard considered them to be valid. We were +unable to find an ANSI C compiler that flagged such expressions as +errors. + +Rule abuse was encouraged this year - two of this year's winners found +new and interesting abuses of the rules. Next year's rules will change +due to these (smr and dodsond2) entries' forms of abuse. + + +Want to be an IOCCC Judge? +-------------------------- + +We are thinking about adding a 3rd judge to our team. A 3rd judge +would help distribute the work load as well as to allowing us to +possibly expand or reshape the contest. + +The ideal 3rd judge would have all of the following: + + * thorough knowledge of the C language (ANSI and K&R) + * thorough knowledge of common C libs (libc, libm, libcurses, ...) + * reasonable written communication skills (able to write *.hint files) + * appreciation for well-written non-obfuscated code + * willing to devote ~4 weekend days in January (starting Jan 96) for judging + * located in the San Francisco (California, USA) Bay Area, or + able to travel (paying your own way) to the SF Bay Area during judging, or + able to link to the other IOCCC judges some form of a a video link + +Any of the following, though not required, would be a plus: + + * familiar with portability issues + * some /bin/sh experience + * some Perl experience + * some C++ experience + * some experience with low-level X11 programming + * attends Usenix conferences on a regular basis + * good sense of humor + * loves chocolate and other fine foods :-) + +If you think this may be you, send EMail before 31 Dec 1995, to: + + judges@toad.com (use the Subject: 3rd judge) + +Include in your message: + + * Your name, address, EMail address and phone number + * Why would you want to be an IOCCC judge? + * How well do you match each of the above qualifications? + * What special skills would you bring to the team? + +If you have any questions about the above, feel free to ask us via +EMail at the above address. + + +Looking for an IOCCC WWW site +----------------------------- + +We would like to setup an IOCCC home page somewhere out in WWW land. +If you have a well known stable site that would be willing to give us +access to put up some IOCCC html pages, please send EMail (say prior +to 31 Dec 1995) to: + + judges@toad.com (use the Subject: www site) + +describing your site and any other appropriate comments. Thanks! + + +A few notes regarding future contests +------------------------------------- + +Due to changes in the Usenix conference calendar, the 1995 contest will +be delayed. Because there will be no Summer 1995 Usenix conference, +the 1995 IOCCC winners will be announced at the Jan 1996 Usenix conference. + +The 1995 contest will not open until late October 1995, and will close +sometime around the end of December 1995. The rules for the 1995 +contest have not been formed at this time and are not expected to be +ready for distribution until late October 1995. + +Be sure to wait until the 1995 rules are posted before submitting entries. +Rules differ from year to year, sometimes in significant ways. + +Please send us comments and suggestions what we have expressed above. +Also include anything else that you would like to see in future contests. +Send such email to: + + ...!{sun,pacbell,uunet,pyramid}!hoptoad!judges + judges@toad.com + +If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used. + +If you have problems with any of the entries, AND YOU HAVE A FIX, please +EMail the fix (patch file or the entire changed file) to the above address. + + +Credits +------- + +We would like to thank Barbara Frezza for her role as official chef +of the contest. Landon Noll and Larry Bassel appreciated the opportunity +to serve as official taste testers. And as usual, the food was excellent. +The official menu of the 1994 Obfuscated C Contest dinner: + +Antipasto: meats, cheeses, olives, peppers, pickles, artichokes +Soup: Cream of tomato +Salad: spring mix +Pasta: Linguine with wild mushrooms and Reggiano Parmesan +Seafood: Salmon in cream sauce or lobster claws +Vegetable: Zucchini +Dessert: Homemade chocolate/pecan brownies, fruit diff --git a/1994/dodsond1.c b/1994/dodsond1.c new file mode 100644 index 000000000..44483c9f7 --- /dev/null +++ b/1994/dodsond1.c @@ -0,0 +1,72 @@ +#define X N(a,O(h,W(f,M(c,g))),O(i,W(f,M(d,g)))) +#define A(x) r(D(x,1); O(x,-9); D(x,O(x,1))) +#define L(x) getchar()-x +#define R Z,Z,0,0 +#define S 0,9,6,6,6,6,6,6,9,0 +#define q D(h,0); A(f)A(g) +#define T 0,6,1,2,2,2,2,1,6,0 +#define U 0,6,2,3,3,3,3,2,6,0 +#define C(x) ((x<1)||(x>8)) +#define F(x,y) printf(x,y); +#define N(x,y,z) *O(*O(x,y),z) +#define y(a,b,c) a[b][c] +#define O(x,y) ((x)+(y)) +#define u(x) (O(0,-(x))) +#define W(x,y) ((x)*(y)) +#define G(x) printf(x); +#define D(x,y) (x=(y)) +#define P (random()%6) +#define Y D(e,O(e,1)) +#define s D(f,O(f,Q)) +#define H(x) return x +#define B(x) while(x) +#define M(x,y) *O(x,y) +#define z(a,b) a[b] +#define E(x) if(x) +#define I main(){ +#define Z 0,0,0,0 +#define t G("\n") +#define V(x) (!x) +#define v h,i,j,k +#define w e,f,g +#define J int +#define Q u(1) +#define p "%c" +#define o 'A' +#define r for +#define n 60 +#define K do + +J y(a,10,10)={R,R,R,R,Z,1,Q,Z,Z,Q,1,R,R,R,R,Z},y(b,10,10)={R,S,T, +U , U , U , U , T +, S , R } , z ( c +, 9 ) = { Q , Q , +Q,0,0,1,1,1,0},z(d,9)={Q,0,1,Q,1,Q,0,1,0};I J w,v;l();r(D(e,0);O( +e , - n ) ; Y ) { +q D ( h , O ( h , +m ( f , g , 1 , 1 +)));E(h){K{G("\n?")K{D(f,L(O('A',Q)));}B(C(f));K{D(g,L('0'));}B(C +( g ) ) ; } B ( V +( m ( f , g , 1 , +Q ) ) ) ; l ( ) ; +}q E((D(k,O(m(f,g,Q,1),P)))>h){D(h,k);D(i,f);D(j,g);}E(h&&m(i,j,Q +, Q ) ) /***/ l /***/ ( ) ; } +} J m (/* */v/*****/) J v ; +{ J w ; /***/ E /***/ ( N ( a +,h,i))H(0);E(O(k,Q))D(N(a,h,i),j);D(e,N(b,h,i));r(D(g,1);O(g,-9); +D ( g , /***/ O /***/ ( g , 1 +) ) ) {/*****/D/* */( g , O +( g , Q /***/ ) /***/ ) ; E ( +V(O(N(a,O(h,M(c,g)),O(i,M(d,g))),j))){r(D(f,1);V(O(X,j));D(f,O(f, +1 ) ) ) ; E ( V ( +O ( N ( a , O ( h +, W ( f , M ( c , +g))),O(i,W(f,M(d,g)))),u(j))))r(s;f;s){X=X*k;D(e,O(e,N(b,O(h,W(f, +M ( c , g ) ) ) , +O ( i , W ( f , M +( d , g ) ) ) ) ) +);}}D(g,O(g,1));}E(V(O(e,u(N(b,h,i))))){D(N(a,h,i),0);H(0);}H(e); +} l ( ) { J f , g +; t A ( g ) { F ( +p , O ( O ( o , g +),Q))A(f)F("%c:",M("X O<",O(N(a,g,f),1)))t}G(" ")A(f)F("%d ",f)t} diff --git a/1994/dodsond1.hint b/1994/dodsond1.hint new file mode 100644 index 000000000..3eccb306e --- /dev/null +++ b/1994/dodsond1.hint @@ -0,0 +1,36 @@ +Best Game: + + Don Dodson + AG Communication Systems + 17239 N. 19th Ave. #1003 + Phoenix, AZ 85023 + USA + + +Judges' comments: + + To use: + make dodsond1 + dodsond1 + + At the prompt, try entering E3. + + The program plays the game that the layout of the source implies. + The source, on the other hand, implies a language along the + lines of Lisp. :-) + + +Selected notes from the author: + + For each turn, the board is displayed and the player is prompted for + a move. Enter your move as an upper-case character followed by a number. + + The program uses a single function for 4 different purposes -- to + determine if a valid move exists, to verify that a move is valid, to + make a move, and to determine the value of a move. + +Copyright (c) 1994, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1994/dodsond2.c b/1994/dodsond2.c new file mode 100644 index 000000000..61c3f9604 --- /dev/null +++ b/1994/dodsond2.c @@ -0,0 +1,55 @@ +#include +#include +#define A { E"Your score is %d\n",j);exit(0);} +#define B(x,y) K(xd)w(J(o,x),d+1);}G r(x)G x;{G y,t=0,u; +F(e[x]){u=3;(e[x])--;do{y=D;K(t++>1000)H(0);K(t%100==0)u--;} +F((y==x)||(e[y]<=0)||(y==J(x,2))||(y==J(x,1))||(e[y]0)){j-=50;E"You have %d arrows\n",i);H;}}F(!M(v)); +n=v-'0';v=P;K(M(v))n=10*n+v-'0';K((J(r,0)==n)||(J(r,1)==n)||(J(r,2) +==n)){r=n;K(b[r]==0){E"You have killed the Wumpus!\n");j+=500+i*100; +A;}}L K(random()%3==1){E"The arrow bounces back and kills you\n"); +j-=100;A;}L{I(n=0;n6)2NU5(F=*2W).:G)Y^'=:&)+%J9%$9>0H^:8/_2?&9:ER&C#>=.R?:.E7 +MC(QI>5JQ>BU*7HJ*5V+]BN\N:+Q9!V^O"2P,MYQ7I ] +M4W=Y2=9&Z7Q&NYLKLGU42]G1UP3>.^J&&)D71G<77\@L-1UU2PV$0J*)"2=/ +M87<])FK6$7=$+K.]_J\ 0J+F:F_CGHR"CG@@.#K8T?OW,6V] D?8 +M#1U IIL;6S_YFS;$;ZS^3+ RQ(!#U;A#LZ47H(1W88^<.[:H+OY=2R\O,[L> +M3&UAS5H-P+I 5N^* O,B9"\O-&GW*>Q"@/=H*/43AGXE'-PKN84J O.>( +M]QSQCH/Q*S!=VR%%(IQ0FI@T7;5CRD"5C>D,S+%:@;^.;Y86.B&1!@&3;H&/ +M\:>^& 8<&3&P>C>]Y7*,J7GG6<'5HD'PDN!;>TXXPCF +M"\D?)00ZG4H#[ E,N3C=X!E<&#GIK!574&8VO( O,(W-'2CZQ84Q2F8D +MVD:5%?F9#H'C0@B#G0+^Q1:&V,$73RZPT3#SGK,TC?(,0(D7I(( BK5U.3'I +MVM+_29D%&/WTQKM2<:%G*X0X(EN;$1<>YN!_BXCMLB-1=&JD?)8[T1]5EQ-] +ME%#-$3%%EB\Q/QG6CU-Q>?@095DTEX!=1O)T%XEO?QBFB\J9\9T)WZFW'AS, +M+720( @9S^V(VH@':,B-$+VLQ[Y3PUIJV6,00K1 6:15;^=DM)%@S.7^*$:C +MREZ>T4?.^QT./.L+W30A\/@KZ[!WO4 +M12&$QO2[6%X10TLP(S341-.@TS -PE^9-W!/P8-R&GXR&I ;CK1H1@>W_/VP]IR-N,.OQ8W[P? -=X_ +( U4WUUP* !^ + +end diff --git a/1994/dodsond2.hint b/1994/dodsond2.hint new file mode 100644 index 000000000..6d28dd4a2 --- /dev/null +++ b/1994/dodsond2.hint @@ -0,0 +1,58 @@ +Most Obfuscated Packaging: + + Don Dodson + AG Communication Systems + 17239 N. 19th Ave. #1003 + Phoenix, AZ 85023 + USA + + +Judges' comments: + + To use: + make dodsond2 + dodsond2 + + The original source file may be found in dodsond2.gz. For people + who don't have gunzip, an un-zipped version is provided as dodsond2.c. + + Each year people find new ways to squeeze more and more out of the + contest rules. Next year, entries that use compression utilities + to get around the size limit will find themselves squeezed out of + the contest! + + +Selected notes from the author: + + Go searching for the Wumpus in the Caverns of Doom! But be careful... + There are pits and bats waiting to seal your fate, as well as a + stealthy robber lurking in the shadows. Move through the rooms by + typing the number of the adjacent room you wish to visit. You can + feel a breeze if there is a pit in an adjacent room. A rustling sound + will tell you that bats are nearby. The scent of the evil Wumpus can + be detected from 2 rooms away. + + To win, you must find one or more arrows, determine where the Wumpus + is, and shoot him, all without falling into a pit or becoming the + next meal for the Wumpus. To shoot an arrow, type "s". Then give a + list of the rooms you want to shoot into. The rooms must be + connected in the order you list them, or else the arrow may bounce + back and hit you. An arrow can go through as many as four rooms. + But beware, because shooting an arrow and missing the Wumpus may + awaken him. + + There is a robber who waits in an unknown room. If you enter + that room carrying an arrow, he will steal that arrow from you + and move to a new room. If he steals all the arrows in the + Caverns, you may catch him and recover all of them. Doing this + gives you a bonus on your score. + + You can quit at any time by typing 'q'. Typing 'i' will tell + you how many arrows you are carrying. 'l' prints the description + of the current room again. + +Copyright (c) 1994, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1994/gtface.c b/1994/gtface.c new file mode 100644 index 000000000..42b7f56ee --- /dev/null +++ b/1994/gtface.c @@ -0,0 +1,119 @@ +#include +#include + +char graphtab[16][16] = { +' ', '.', '.', ',', '.', ';', ':', 'j', '\'',':', ':', ';', '\'',';', '!', '|', +'.', '_', ':', ',', ';', ';', ';', 'j', '/', ';', ';', ';', 'j', 'j', 'j', 'j', +'.', ',', '-', ',', 'r', '<', 'j', 'q', '/', ';', 'I', ';', '/', '|', 'I', '|', +',', ',', 'r', 'x', '/', '/', '/', 'd', '/', '/', '/', 'd', '/', '/', '/', 'd', +'.', ':', '\\',';', '-', '=', 'v', 'q', '\'',':', '<', '|', '\'',':', '+', '+', +';', ';', '>', ';', '=', '=', 'g', 'g', '\'',':', 'S', 'S', '/', '/', '/', '+', +':', '\\','\\','\\','r', '<', 'w', 'q', '/', '<', '6', '4', '/', '/', 'd', '+', +'l', 'L', '+', 'b', 'y', '[', 'p', 'g', '/', '<', '/', '6', '/', '/', '/', '+', +'`', ':', ':', ';', '`', '\\','\\','\\','"', ':', ':', ';', '`', '\\','Y', 'T', +';', ';', ';', ';', '`', '2', '>', '\\',':', '=', ';', ';', '?', '?', ']', ']', +':', ';', ';', ';', '>', '2', '>', '\\','F', ';', 'O', ';', '7', '?', ']', '7', +';', ';', ';', ';', '?', '2', '>', 'b', ';', ';', ';', ';', '?', '?', ']', '#', +'\'','\\','\\','\\','`', '\\','\\','\\','\'','\'','<', '5', '"', '"', 'V', 'q', +';', '\\','\\','\\','`', '=', '\\','\\','\'','\'','5', '5', '"', '?', 'g', 'g', +'I', 'L', 'L', 'L', 'D', '\\','b', 'f', 'F', '[', '[', '[', 'P', '?', '#', 'M', +'|', '|', '|', '|', '|', '#', '+', '#', 'T', '[', 'F', 'F', 'P', '?', 'P', 'M' +}; + +#define BITROWS 96 +#define BITCOLS 160 +#define SCREENROWS 23 /* one less so doesn't scroll off screen */ +#define SCREENCOLS 79 /* one less so doesn't scroll off screen */ +char framebuffer[BITROWS][BITCOLS]; + +#define BITSET(r, c) framebuffer[r][c] = 1; +#define BITCLR(r, c) framebuffer[r][c] = 0; + +double f(); +double atof(); + +FILE *d; + +main(argc, argv) +char **argv; +{ + int i, a, b, c, r; + char labbuf[100]; + + for (i=0; i<48; i++) { + r = scanf("%x %x %x", &a, &b, &c); + bs(i, 0, a); + bs(i, 16, b); + bs(i, 32, c); + } + + bitshow(); +} + +bs(r, c, v) +int r, c, v; +{ + int j, q; + + for (j=16; j>0; j--) { + q = v&0x8000; + v <<= 1; + if (q) /* !q for white on black */ + BITSET(r, c); + c++; + } +} + +bitshow() +{ + bitshow2(); /* or bitshow1() for bigger version */ +} + +/* Show bits with 1x2 resolution, 48x80 on screen */ +bitshow1() +{ + int r, c; + int basei, basej; + int i, j; + char ch; + + for (r=0; r | + + +WHAT IS NEW IN 1994: | + + It now appears that most ANSI C compilers allow indexes to be of | + non-integral type. Unlike last year, we now allow one to use | + constructs such as: | + + int h; | + char *i; | + ... | + h[i] = (h+3)["string"]; | + + The ---build--- section may use "gcc" or "cc" commands. However, your | + entry should be compilable with any ANSI C compiler. You should not | + depend on a gcc specific feature. | + + The order of your entry's sections must be the same as the order of | + the rule template or the example below. | + + We have added a new rule regarding rule abuse. The guidelines expand | + on the rule abuse aspect of the contest. | + + A suggestion regarding VTxxx/ANSI escape sequences has been given. | + + +HINTS AND SUGGESTIONS: + + You are encouraged to examine the winners of previous contests. See + FOR MORE INFORMATION for details on how to get previous winners. + + Keep in mind that rules change from year to year, so some winning entries + may not be valid entries this year. What was unique and novel one year + might be 'old' the next year. + + An entry is usually examined in a number of ways. We typically apply + a number of tests to an entry: + + * look at the original source + * convert ANSI tri-graphs to ASCII + * C pre-process the source ignoring '#include' lines + * C pre-process the source ignoring '#define' and '#include' lines + * run it through a C beautifier + * examine the algorithm + * lint it + * compile it + * execute it + + You should consider how your entry looks in each of the above tests. + You should ask yourself if your entry remains obscure after it has been + 'cleaned up' by the C pre-processor and a C beautifier. + + Your entry need not do well under all, or in most tests. In certain + cases, a test is not important. Entries that compete for the + 'strangest/most creative source layout' need not do as well as + others in terms of their algorithm. On the other hand, given + two such entries, we are more inclined to pick the entry that + does something interesting when you run it. + + We try to avoid limiting creativity in our rules. As such, we leave + the contest open for creative rule interpretation. As in real life + programming, interpreting a requirements document or a customer request + is important. For this reason, we often award 'worst abuse of the + rules' to an entry that illustrates this point in an ironic way. + + We do realize that there are holes in the rules, and invite entries + to attempt to exploit them. We will award 'worst abuse of the rules' + and then plug the hole next year. Even so, we will attempt to use + the smallest plug needed, if not smaller. :-) + + Check out your program and be sure that it works. We sometimes make + the effort to debug an entry that has a slight problem, particularly + in or near the final round. On the other hand, we have seen some + of the best entries fall down because they didn't work. + + We tend to look down on a prime number printer, that claims that + 16 is a prime number. If you do have a bug, you are better off + documenting it. Noting "this entry sometimes prints the 4th power + of a prime by mistake" would save the above entry. And sometimes, + a strange bug/feature can even help the entry! Of course, a correctly + working entry is best. + + People who are considering to just use some complex mathematical | + function or state machine to spell out something such as "hello, | + world!" may want to try and be more creative. | + + Ultra-obfuscated programs are in some cases some cases easier to | + deobfuscate than subtly-obfuscated programs. Consider using | + misleading or subtitle tricks layered on top of or under an | + appropriate level of obfuscation. | + + Programs that use VTxxx/ANSI sequences that are NOT limited to a | + specific terminal brand and that can also work in a standard xterm | + are considered portable. | + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many ANSI C compilers dislike the following code, and so do we: + + #define d define + #d foo <-- don't expect this to turn into #define foo + + When declaring local or global variables, you should declare the type: | + + int this_is_ok; | + this_is_not; <-- don't use such implicit type declaration | + + We suggest that you compile your entry with an ANSI C compiler. If you + must use non-ANSI C, such as K&R C, you must avoid areas that result in + compile/link errors for ANSI C compilers. + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using . Use instead. + + If you use C preprocessor directives (#define, #if, #ifdef, ...), + the leading '#' must be the first character on a line. While some + C preprocessors allow whitespace the leading '#', many do not. + + Because the exit() function returns void on some systems, entries + must not assume that it returns an int. + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + + One line programs should be short one line programs, say around 80 + bytes long. Getting close to 160 bytes is a bit too long in our opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS or Un*x version specific + (index/strchr differences are ok, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is ok only if you warn us in the 'remark' header item) + * won't compile under both BSD or SYS V like Un*x systems | + * abusing the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are similar to previous winners + * are identical to previous losers :-) + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + The build file should not be used to try and get around the size + limit. It is one thing to make use of a several -D's to help out, + but it is quite another to use 200+ bytes of -D's in order to + try and squeeze the source under the size limit. You should feel + free to make use of the build file space, but you are better off + if you show some amount of restraint. + + We want to get away from source that is simply a compact blob of | + characters. To help, we give a break to source that contains | + whitespace, and in certain cases ; { or } characters. While the | + number of characters excluding whitespace (tab, space, newline), | + and excluding any ; { or } followed by either whitespace or end of | + file, must be <= 1536, the total size may be less than 3217 | + bytes. This means that one may use "free of charge" up to 1681 | + bytes of whitespace, or ; { or } followed by either whitespace | + or end of file. | + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! + + We suggest that you avoid trying for the 'smallest self-replicating' + program. We are amazed at the many different sizes that claim + to be the smallest. There is nothing wrong with self-replicating + programs. In fact, a number of winners have been self-replicating. + You might want to avoid the claim of 'smallest', lest we (or others) + know of a smaller one! + + We tend to dislike writable strings. That is, we want to avoid: | + + char *T = "So many primes, so little time!"; | + ... | + T[14] = ';'; | + + You may use writable strings if you really must. If you do depend | + on them, you must say do in the ---remark--- section. | + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. Don't + depend on a particular type of display. For example, don't depend + on color or a given size. Don't require backing store. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. We ask that such X client + entries restrict themselves to only the low level Xlib and the + Athena widget set (libX11.a, libXaw.a, libXmu.a and libXt.a). + Don't use M*tif, Xv*ew, or OpenL*ok toolkits, since not everyone + has them. Avoid depending on a particular window manager. Not + everyone has X11r5, and some people are stuck back in X11r4 (or + earlier), so try to target X11r5 without requiring X11r5. Better + yet, try to make your entry run on all version 11 X Window Systems. + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines + in the ---remark--- section. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * pass lint without complaint (not a requirement, but it is nice) + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION + * make us laugh and/or throw up :-) + + Some types of programs can't excel in some areas. Of course, your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + We freely admit that interesting, creative or humorous comments in + the ---remark--- section helps your chance of winning. If you had to + read of many twisted entries, you too would enjoy a good laugh or two. + We think the readers of the contest winners do as well. + + Be creative! + + +ABUSING THE RULES: | + + Legal abuse of the rules is somewhat encouraged. Legal rule abuse may | + involve, but is not limited to, doing things that are technically | + allowed by the rules and yet do not fit the spirit of what we | + intended to be submitted. | + + Legal rule abuse is encouraged to help promote creativity. Rule | + abuse entries, regardless of if they receive an award, result in | + changes to the next year's rules and guidelines. | + + Legal abuse of the rules is NOT an invitation to violate the | + rules. An entry that violates the rules in the opinion of the | + judges, WILL be disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL | + OF RISK! If you have an entry that might otherwise be interesting, | + you might want to submit two versions; one that does not abuse the | + rules and one that does. | + + If you intend to abuse the rules, indicate so in the ---remark--- | + section. You must try to justify why you consider your rule abuse | + to be allowed under the rules. That is, you must plead your case | + as to why your entry is valid. Humor and/or creativity help plead | + a case. | + + Abusing the entry format tends to annoy us more than amuse us. | + + We are often asked why the contest rules and guidelines seem to | + strange or contain mistakes, flaws or grammatical errors. | + One reason is that we sometimes make genuine mistakes. But in many | + cases such problems, flaws or areas of confusion are deliberate. | + Changes to rules and guidelines in response to a rule abuses, are | + done in a minimal fashion. Often the we will deliberately leave | + behind holes (or introduce new ones) so that future rule abuse may | + continue. + + At the risk of stating the obvious, this contest is a parity the | + software development process. The rules and guidelines are | + only a small part of the overall contest. Even so, one may think | + the contest rule and guideline process as a parody of the sometimes | + tragic mismatch between what a customer (or marketing) wants and | + what engineering delivers. | + + +ENTRY FORMAT: + + In order to help us process the many entries, we must request your + assistance by formatting your entries in a certain way. This format, + in addition, allows us to quickly separate information about the + author from the program itself. (see JUDGING PROCESS) + + We have provided the program, mkentry, as an example of how to + format entries. You should be aware of the following warning that + is found in mkentry.c: + + This program attempts to implement the IOCCC rules. Every + attempt has been made to make sure that this program produces + an entry that conforms to the contest rules. In all cases, + where this program differs from the contest rules, the + contest rules will be used. Be sure to check with the + contest rules before submitting an entry. + + You are not required to use mkentry. It is convenient, however, + as it attempts to uuencode the needed files, and attempt to check + the entry against the size rules. + + If you have any suggestions, comments, fixes or complaints about + the mkentry.c program, please send EMail to the judges. (see below) + + The following is a sample entry: + +---entry--- +rule: 1994 +fix: n +title: chonglab +entry: 0 +date: Thu Mar 3 13:23:14 1994 +host: Un*x v6, pdp11/45 + 2.9BSD, pdp11/70 +---remark--- + This is a non-obfuscated obfuscated C program. + + It is likely not to win a prize. But what do you expect from + a short example! +---author--- +name: Landon Curt Noll +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA +email: {chongo,noll}@{toad,sgi}.com +anon: n +---author--- +name: Larry Bassel +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA +email: hoptoad!sun!lab + lab@sun.com +anon: n +---info--- +begin 444 info.file +M0V]P>7)I9VAT("AC*2!,86YD;VX@0W5R="!.;VQL+"`Q.3DS+@I!;&P@4FEG +M:'1S(%)E65A79A;&5<;B(I.PH@("`@<')I;G1F*")#:71Y($-O=6YC:6PN("!4:&%N +M:R!Y;W4A7&Y<;B(I.PHC96YD:68*("`@('!R:6YT9B@B4W5N;GEV86QE(')E +M;&%T960@14UA:6P@;6%Y(&)E('-E;G0@=&\Z(&YO;&Q`;F-D+F-O;2Y<;EQN +M(BD["@H@("`@<')I;G1F*")!="!T:&4@=&EM92!T:&ES('=A79A;&4@:&%D(&YO="!Y970@;V)T86EN961<;B(I.PH@("`@<')I +M;G1F*")A(&1O;6%I;BP@8G5T('!L86YN960@=&\@9&\@&ET*#(Q-S`Q("4@,3(W*3L*?0H` +` +end +---end--- + + Your entry's sections must be the same order as in the above example. | + + Typically the build file should assume that the source is prog.c + and will compile into prog. If an entry wins, we will rename + its source and binary to avoid filename collision. By tradition, + we use the name of the entry's title, followed by an optional + digit in case of name conflicts. + + If the above entry somehow won the 'least likely to win' award, + we would use chonglab.c and chonglab. + + If your entry depends on, or requires that your build, source + and/or binary files be a particular name, please say so in the + ---remark--- section. If this case applies, it would be be helpful + if you did one of the following: + + * Tell us how to change the filename(s) in your entry. + + * Have the build file make copies of the files. For example: + + cc prog.c -o special_name | + + or rm -f special_src.c | + cp prog.c special_src.c + cc special_src.c -o special_name + + or rm -f special_build | + tail +4 build > special_build + sh < special_build + + * Assume that we will use the entry title. Send us a version of + your build/program files that uses the name convention. You + should uuencode these files in ---info--- sections. | + + If your entry needs to modify its source, info or binary files, + please say so in the ---remark--- section. You should try to avoid + touching your original build, source and binary files. You should + arrange to make copies of the files you intend to modify. This + will allow people to re-generate your entry from scratch. + + Remember that your entry may be built without a build file. We + typically incorporate the build lines into a Makefile. If the + build file must exist, say so in the ---remark--- section. + + Typically the ---build--- command will contain a "cc" command. | + It is also ok to use a "gcc" command (and gcc args). However keep | + in mind that your entry should be compilable by any standard ANSI C | + compiler and thus should not depend on a special gcc feature. | + + If your entry needs special info files, you should uuencode them + into ---info--- sections. In the case of multiple info files, + use multiple ---info--- sections. If no info files are needed, + then skip the ---info--- section. + + Info files are intended to be input, or detailed information that + does not fit well into the ---remark--- section. For example, an + entry that implements a compiler might want to provide some sample + programs for the user to compile. An entry might want to include a + lengthy design document, that might not be appropriate for a + 'hints' file. + + Info files should be used only to supplement your entry. For + example, info files may provide sample input or detailed + information about your entry. Because they are supplemental, + the entry should not require them exist. + + In some cases, your info files might be renamed to avoid name + conflicts. If info files should not be renamed for some reason, + say so in the ---remark--- section. + + Info files must uudecode into the current directory. If they + absolutely must be renamed, or moved into a sub-directory, say + so in the ---remark--- section. + + When submitting multiple entries, be sure that each entry has + a unique entry number from 0 to 7. Your first entry should + have entry number 0. + + With the exception of the header, all text outside of the entry + format may be ignored. That is, don't place text outside of the + entry and expect the us to see it. (Our decoding tools are | + not AI progs!) If you need tell the the something, put it in | + the ---remark--- section, or send a EMail to the us at: | + + ...!{apple,pyramid,sun,uunet}!hoptoad!judges (not the address for + judges@toad.com submitting entries) + + The date should be given with respect to UTC. (Some systems refer + to this as GMT or GMT0) The format of the date should be that as + returned by asctime() in the C locale. An example of such a string is: + + Fri Apr 01 00:47:00 1994 | + + This format is similar to the output of the date(1) command. The + string does not include the timezone name before the year. On many + systems, one of the following command will produce a similar string: + + date -u "+%a %h %d %T 19%y" + date -u | sed -e 's/... \(19[0-9][0-9]\)$/\1/' + sh -c 'TZ=UTC date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"' + sh -c 'TZ=GMT date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"' + sh -c 'TZ=GMT0 date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"' + + You are allowed to update/fix/revise your entry. To do so, set + the 'fix' line in the ---entry--- section to 'y' instead of 'n'. + Be sure that the resubmittion uses the same title and entry number + as well, as these are used to determine which entry is to be + replaced. + + +JUDGING PROCESS: + + Entries are judged by Larry Bassel and Landon Curt Noll. + + Entries are unpacked into individual directories. The EMail message + is unpacked into individual files, each containing: + + ---entry--- section + all ---author--- sections + all ---info--- sections + ---build--- section + ---program--- section + any other text, including the EMail message headers + + Prior to judging, the 'any other text' file is scanned to be sure + it does not contain useful information (or in case the entry was + malformed and did not unpack correctly). Information from the + ---author--- sections are not read until the judging process is + complete, and then only from entries that have won an award. + + The above process helps keep us biased for/against any one particular + individual. We are usually kept in the dark as much as you are + until the final awards are given. We like the surprise of finding + out in the end, who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. (for the curious, + we do indicate the volume of paper consumed when presenting the IOCCC + winners at talks) + + After the Usenix announcement, we attempt to send EMail to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes, typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the ---entry--- section + * reading the uudecoded ---build--- section + * reading the uudecoded ---program--- section + * reading the uudecoded ---info--- section(s), if any + * passing the source thru the C pre-processor + shipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + shipping over any #include files + + In later rounds, other actions are performed: + + * linting the source + * compiling/building the source + * running the program + * performing misc tests on the source and binary + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry often will compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code + * best X client (see OUR LIKES AND DISLIKES) + * best abuse of ANSI C + * worst abuse of the rules + * + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to 8 or 10 + winners. Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + + More often that not, we select a small entry (usually one line), a + strange/creative layout entry, and an entry that abuses the contest + rules in some way. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entry. More often, the + 'best' is picked because it does well in a number of categories. + + +ANNOUNCEMENT OF WINNERS: + + The first announcement, occurs at a Summer Usenix conference. By tradition, + this is done during the latter part of the UUNET/IOCCC BOF, just prior to + the Berkeley BSD, and BSDI BOF. + + Winning entries will be posted in late June to the following groups: + + comp.lang.c comp.unix.wizards alt.sources + + In addition, pointers to these postings are posted to the following + + comp.sources.d alt.sources.d misc.misc + comp.sources.misc comp.windows.x + + Winning entries will be deposited into the uunet archives. See + below for details. + + Often, winning entries are published in selected magazines. Winners + have appeared in books ("The New Hackers Dictionary") and on T-Shirts. + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending EMail to the following address: + + ...!{apple,pyramid,sun,uunet}!hoptoad!judges (not the address for + judges@toad.com submitting entries) + + Questions and comments about the contest are welcome. Comments about | + confusing rules and guidelines are also welcome. | + + The rules and the guidelines may (and often do) change from year to | + year. You should be sure you have the current rules and guidelines | + prior to submitting entries. + + +chongo /\cc/\ {chongo,noll}@{toad,sgi}.com +Larry Bassel lab@sun.com diff --git a/1994/horton.alt.c b/1994/horton.alt.c new file mode 100644 index 000000000..8d278013c --- /dev/null +++ b/1994/horton.alt.c @@ -0,0 +1,197 @@ +#include +/* + * Obfuscated version is simpler but can't display labels. + */ + +char graphtab[] = +" ..,.;:j'::;';!|._:,;;;j/;;;jjjj.,-,r;==gg':SS///+:\\\\\\r\\:=;;??]]:;;;>2>\\F;O;7?]7;;;;?2>b;;;;??]#'\\\\\\`\\\\\\''<5\"\"Vq;\\\\\\`=\\\\''55\"?ggILLLD\\bfF[[[P?#M|||||#+#T[FFP?PM'" +; + +#define BITROWS 96 +#define BITCOLS 160 +#define SCREENROWS 23 /* one less so doesn't scroll off screen */ +#define SCREENCOLS 79 /* one less so doesn't scroll off screen */ +char framebuffer[BITROWS][BITCOLS]; +char screen[SCREENROWS][SCREENCOLS]; + +#define BITSET(r, c) framebuffer[r][c] = 1; +#define BITCLR(r, c) framebuffer[r][c] = 0; + +double f(); +double atof(); + +/* row and column boundaries in frame buffer */ +int minr= 10; +int maxr= 80; +int minc= 20; +int maxc=150; + +/* x and y boundaries in formula */ +double maxy= 500; +double miny=-500; +double maxx= 10; +double minx= -20; + +double three, two, one, zero; /* coefficients */ + +double xbase, ybase; + +main(argc, argv) +char **argv; +{ + double x, y; + char labbuf[100]; + + if (argc < 5) { + printf("Usage: %s cube square linear constant\n", argv[0]); + exit(1); + } + + /* Arguments are four coefficients to polynomial */ + three = atof(argv[1]); + two = atof(argv[2]); + one = atof(argv[3]); + zero = atof(argv[4]); + + gbox(minr,maxr,minc-2,maxc+2); + + plotinit(); + for (x=minx; x<=maxx; x += .05) { + fplot(x, f(x)); + } + + bitshow(); + + hlabel(minr-4, (maxc+minc)/2 - 10, "A Cubic Function"); + sprintf(labbuf, "y=%gx^3+%gx^2+%gx+%g", three, two, one, zero); + vlabel(12, 5, labbuf); + hlabel(maxr+4, (maxc+minc)/2, "x"); + + sprintf(labbuf, "%g", minx); + hlabel(maxr+4, minc, labbuf); + sprintf(labbuf, "%g", maxx); + hlabel(maxr+4, maxc-strlen(labbuf)*2, labbuf); + + sprintf(labbuf, "%g", miny); + vlabel(minr+4, minc-4, labbuf); + sprintf(labbuf, "%g", maxy); + vlabel(maxr-strlen(labbuf)*4, minc-4, labbuf); + + /* bigshow(20, 55, 0, 70); */ + srefresh(); +} + +double f(x) +double x; +{ + double y; + + y = three*x*x*x + two*x*x + one*x + zero; + return y; +} + +fplot(x, y) +double x, y; +{ + int r, c; + + r = (maxy - y) * ybase + minr; + c = (x - minx) * xbase + minc; + if (r >= minr && r <= maxr && c >= minc && c <= maxc) + BITSET(r, c); +} + +hlabel(r, c, lab) +int r, c; +char *lab; +{ + r = r/4; + c = c/2; + while (*lab) + screen[r][c++] = *lab++; +} + +vlabel(r, c, lab) +int r, c; +char *lab; +{ + r = r/4; + c = c/2; + while (*lab && r=10 && r<=80 && c +>= 20 && c<=150) S +( r, c); } for ( +r =0; r < 24; r ++ +) for (c=0; c <80; c++) { bi = +4 *r;bj=2*c; i=(((f[bi][bj]<< 3 +) +(f[bi+1][bj]<<2)+(f[bi+2][bj]<<1)+(f[bi + +3 ][bj]<<0))*16+ (f[bi][bj+1]<<3)+( f +[ bi+1][bj+1]<<2)+(f[bi+2][bj + +1 ]<<1)+(f[bi+3][bj+ 1 +] <<0)+1)*(c<79 ) +; putchar ( + +"\n ..,.;:j'::;';!|._:,;;;j/;;;jjjj.,-,r;==gg':SS///+:\\\\\\r\\:=;;??]]:;;;>2>\\F;O;7?]7;;;;?2>b;;;;??]#'\\\\\\`\\\ +\\\\''<5\"\"Vq;\\\\\\`=\\\\''55\"?ggILLLD\\bfF[[[P?#M|||||#+#T[FFP?PM'" +[i]); } } diff --git a/1994/horton.hint b/1994/horton.hint new file mode 100644 index 000000000..0e6f9e7ca --- /dev/null +++ b/1994/horton.hint @@ -0,0 +1,86 @@ +Best Utility: + + Mark Horton + AT&T Bell Labs + Rm 1H-117 + 6200 E Broad St. + Columbus OH 43213 + USA + + +Judges' comments: + + To use: + make horton + ./horton A B C D + + A, B, C, D are numeric arguments (try 3 2 1 0). + + Try to figure out how this program prints, for a given slope, the + right character. And for extra credit, try to figure out which + character is at the bottom on this hint file. :-) + + This confuses cb greatly. See gtplot.c for an unobfuscated/enhanced + version. To compile it: + + make horton.alt + ./horton.alt A B C D + + A, B, C, D are numeric arguments (try 3 2 1 0). + + +Selected notes from the author: + + Run it with any 4 numeric arguments, e.g. prog 3 2 1 0. Play with the + numbers to get a pleasing result, or use it for your high school algebra + class. + + SPOILER: + + As should be obvious from 20 feet away, the program is a cubic plotter. + It plots against certain artists, splattering their cubes with graphs + of their cubic equations. Those dastardly arguments are mere coefficients, + cogs in the wheels of the grand plot to overthrow the cubics! + + Oh, by the way, it uses a self-contained graphtab and frame buffer. + It's easily modified to graph *any* 96x160 bitmap on a dumb terminal. + + See the gtface program for another example. Try: + + make gtface + ./gtface < gtface.data + + For more information, see + Using GraphTab; USENIX ;login: + Sept/Oct 1992; Pages 28-31 + + MMMM,M,MM"MM,,, + ,,MMMMMMMMM"""""""", + ,MMMMM""" ", + ,MMM" " + MMM M + MM + MM" " M + M " , ,,,,, ,,,,,,,,,MM + "MMMM"M,MMMMM MMMM M M"MMM, + ,M"MMMM"MM"MMM""M""MMMM""M"M + , MM M M,M M" "M",, M "M " + M ,M," ,M "M, ,,,", M + M , M"MMM",,M,M,,""" , , + ",," , " "MMMMMMMM " , " + ,M , ""M,MMMMMMMM,M " ,, + ,MM, MMMMMMMMMMMMMM,", M, + M,M,MM"M"M" """M"MM,M M + ,MMMMMM M,MMMMM"M MM""M + M MMMMMM,M M"M"" M MMMM", , + "M"MMMMMMMMMM"M ,MMMMM M ,, + "" MMMMMMM,M,MM,M,,,MMM"M , + ," , "MMMMMMM"MM"M,,,,MMMMM , ,, + M ," MMMMMM"MM""M ,MMMMM,M, M + , MMMM,MMMM"M"M"M,MM,M,", " + +Copyright (c) 1994, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1994/imc.c b/1994/imc.c new file mode 100644 index 000000000..8cde6fe74 --- /dev/null +++ b/1994/imc.c @@ -0,0 +1,85 @@ +#include +#include +#define f (sizeof(int)) + +int i,j,k,l,m,*t,*u,*v; +int r(x)int x;{return (rand()/256)%x;} +void p(x,y)int *x,y;{for(i=y;--i;k=x[i],x[i]=x[j],x[j]=k)j=r(i+1);} + +void o(n,a,q,d)int n,d,*a,*q; +{ + for(m=r(2)?n:1,t=q,l=n/2,i=n; + i--&&(i!=l||i--); + *(t++)=i); + for(p(q,n-1),q[n-1]=l,u=a,i=j=0; + i=n&&(j-=n)); + for(p(q,n-1),u=a,m=n+1-m,i=0,j=n-1; + i=n&&(j-=n)); +} + +void s(n,a,q,d)int n,d,*a,*q; +{ + for(q[1]=3-(*q=r(n)),q[3]=3-(q[2]=1^q[r(2)]),t=a,i=n,m=3*r(2); + i--; + t+=d) + for(j=n; + j--; + t++[0]=q[j^(i&m)^(i/2)]); + for(q[1]=3-(*q=r(n)),q[3]=3-(q[2]=1^q[r(2)]),t=a,i=n,m=3-m; + i--; + t+=d) + for(j=n; + j--; + t++[0]+=q[j^(i&m)^(i/2)]*4); +} + +void e(n,a,q,d)int n,d,*a,*q; +{ + int h,i,k,l,z,g=n/2; + void (*m)(); + for((m=g!=4?g%2?o:e:s)(g,a,q,g+d),m(g,a+g,q,g+d),l=(n+d)*g,u=a,i=g; + i--; + u+=d) + for(j=n; + j--; + ji) + for(j=g;!q[--j]||(k--,q[z]=1,q[j]=0);); + if(q[i]) + if(h)h--; + else + for(j=g;q[--j]||j==z||(q[j]=1,q[i]=0);); + else + if(h>i||(g==3&&h&&(k==2||i==z))) + for(j=g;!q[--j]||j==z||(h--,i==z&&k--,q[i]=1,q[j]=0);); + for(t=q,j=g;j--;u++) + if(0[t++])z=*u,*u=u[l],u[l]=z; + } + for(h=k=g/2-g%2,i=g;i--;q[i]=i +#include +#include +#include +#include + +/* logic */ +#ifndef TRUE +# define TRUE 1 +#endif /* TRUE */ +#ifndef FALSE +# define FALSE 0 +#endif /* FALSE */ +#define EOF_OK TRUE +#define EOF_NOT_OK FALSE + +/* global limits */ +#define RULE_YEAR 1994 /* NOTE: should match the current year */ +#define START_DATE "4Mar92 0:00 UTC" /* first confirmation received */ +#define MAX_COL 79 /* max column a line should hit */ +#define MAX_BUILD_SIZE 256 /* max how to build size */ +#define MAX_PROGRAM_SIZE 3217 /* max program source size */ +#define MAX_PROGRAM_SIZE2 1536 /* max program source size not counting + whitespace and {}; not followed by + whitespace or EOF */ +#define MAX_TITLE_LEN 12 /* max chars in the title */ +#define MAX_ENTRY_LEN 1 /* max length in the entry input line */ +#define MAX_ENTRY 8 /* max number of entries per person per year */ +#define MAX_FILE_LEN 1024 /* max filename length for a info file */ + +/* where to send entries */ +#define ENTRY_ADDR1 "...!{apple,pyramid,sun,uunet}!hoptoad!obfuscate" +#define ENTRY_ADDR2 "obfuscate@toad.com" + +/* uuencode process - assumes ASCII */ +#define UUENCODE(c) (encode_str[(int)(c)&0xff]) +#define UUENCODE_LEN 45 /* max uuencode chunk size */ +#define UUINFO_MODE 0444 /* mode of an info file's uuencode file */ +#define UUBUILD_MODE 0444 /* mode of the build file's uuencode file */ +#define UUBUILD_NAME "build" /* name for the build file's uuencode file */ +#define UUPROG_MODE 0444 /* mode of the program's uuencode file */ +#define UUPROG_NAME "prog.c" /* name for the program's uuencode file */ + +/* encode_str[(char)val] is the uuencoded character of val */ +char encode_str[256+1] = "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"; + +/* global declarations */ +char *program; /* our name */ +long start_time; /* the startup time */ + +/* forward declarations */ +void parse_args(); +void usage(); +FILE *open_remark(); +FILE *open_build(); +FILE *open_program(); +FILE *open_output(); +void output_entry(); +void output_remark(); +void output_author(); +void output_info(); +void output_build(); +void output_program(); +void output_end(); +int get_line(); +void output_till_dot(); +int col_len(); +void check_io(); +void uuencode(); + +main(argc, argv) + int argc; /* arg count */ + char **argv; /* the args */ +{ + FILE *remark=NULL; /* open remarks stream */ + FILE *build=NULL; /* open build file stream */ + FILE *prog=NULL; /* open program stream */ + FILE *output=NULL; /* open output stream */ + char *rname=NULL; /* file with remarks about the entry */ + char *bname=NULL; /* file containing how prog.c should be built */ + char *pname=NULL; /* the obfuscated program source file */ + char *oname=NULL; /* ioccc entry output file */ + struct tm *tm; /* startup time structure */ + + /* + * check on the year + */ + start_time = time((long *)0); + tm = gmtime(&start_time); + if (tm->tm_year != RULE_YEAR-1900) { + fprintf(stderr, + "%s: WARNING: this program applies to %d, which may differ from %d\n\n", + argv[0], RULE_YEAR, 1900+tm->tm_year); + } + + /* + * parse the command line args + */ + parse_args(argc, argv, &rname, &bname, &pname, &oname); + + /* + * open/check the input and output files + * + * We open and truncate the output file first, in case it is the same + * as one of the input files. + */ + output = open_output(oname); + remark = open_remark(rname); + build = open_build(bname); + prog = open_program(pname); + if (output==NULL || remark==NULL || build==NULL || prog==NULL) { + exit(1); + } + + /* + * output each section + */ + output_entry(output, oname); + output_remark(output, oname, remark, rname); + output_author(output, oname); + output_info(output, oname); + output_build(output, oname, build, bname); + output_program(output, oname, prog, pname); + output_end(output, oname); + + /* + * flush the output + */ + if (fflush(output) == EOF) { + fprintf(stderr, "%s: flush error in %s: ", program, oname); + perror(""); + exit(2); + } + + /* + * final words + */ + printf("\nYour entry can be found in %s. You should check this file\n", + oname); + printf("correct any problems and verify that the uudecode utility will\n"); + printf("correctly decode your build file and program.\n\n"); + printf("This program has been provided as a guide for submitters. In\n"); + printf("cases where it conflicts with the rules, the rules shall apply.\n"); + printf("It is your responsibility to ensure that your entry conforms to\n"); + printf("the current rules.\n\n"); + printf("EMail your entries to:\n"); + printf("\t%s\n", ENTRY_ADDR1); + printf("\t%s\n\n", ENTRY_ADDR2); + printf("Please use the following subject when you EMail your entry:\n"); + printf("\tioccc entry\n\n"); + /* all done */ + exit(0); +} + +/* + * parse_args - parse the command line args + * + * Given the command line args, this function parses them and sets the + * required name flags. This function will return only if the command + * line syntax is correct. + */ +void +parse_args(argc, argv, rname, bname, pname, oname) + int argc; /* arg count */ + char **argv; /* the args */ + char **rname; /* file with remarks about the entry */ + char **bname; /* file containing how prog.c should be built */ + char **pname; /* the obfuscated program source file */ + char **oname; /* ioccc entry output file */ +{ + char *optarg; /* -flag option operand */ + int flagname; /* the name of the -flag */ + int i; + + /* + * Not everyone has getopt, so we must parse args by hand. + */ + program = argv[0]; + for (i=1; i < argc; ++i) { + + /* determine the flagname */ + if (argv[i][0] != '-') { + usage(1); + /*NOTREACHED*/ + } + flagname = (int)argv[i][1]; + + /* determine the flag's operand */ + if (flagname != '\0' && argv[i][2] != '\0') { + optarg = &argv[i][2]; + } else { + if (i+1 >= argc) { + usage(2); + /*NOTREACHED*/ + } else { + optarg = argv[++i]; + } + } + + /* save the flag's operand in the correct global variable */ + switch (flagname) { + case 'r': + *rname = optarg; + break; + case 'b': + *bname = optarg; + break; + case 'p': + *pname = optarg; + break; + case 'o': + *oname = optarg; + break; + default: + usage(3); + /*NOTREACHED*/ + } + } + + /* + * verify that we have all of the required flags + */ + if (*rname == NULL || *bname == NULL || *pname == NULL || *oname == NULL) { + usage(4); + /*NOTREACHED*/ + } + return; +} + +/* + * usage - print a usage message and exit + * + * This function does not return. + */ +void +usage(exitval) + int exitval; /* exit with this value */ +{ + fprintf(stderr, + "usage: %s -r remarks -b build -p prog.c -o ioccc.entry\n\n", program); + fprintf(stderr, "\t-r remarks\tfile with remarks about the entry\n"); + fprintf(stderr, "\t-b build\tfile containing how prog.c should be built\n"); + fprintf(stderr, "\t-p prog.c\tthe obfuscated program source file\n"); + fprintf(stderr, "\t-o ioccc.entry\tioccc entry output file\n"); + exit(exitval); +} + +/* + * open_remark - open/check the remark file + * + * The remark file should be indented by 4 spaces, and should not extend + * beyond column MAX_COL. These are not requirements, so we only warn. + * + * This function returns NULL on I/O or format error. + */ +FILE * +open_remark(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + char buf[BUFSIZ+1]; /* input buffer */ + int toolong=0; /* number of lines that are too long */ + int non_indent=0; /* number of lines not indented by 4 spaces */ + + /* + * open the remark input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open remark file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * look at each line + */ + while (fgets(buf, BUFSIZ, stream) != NULL) { + + /* count lines that do not start with 4 spaces */ + if (buf[0] != '\n' && strncmp(buf, " ", 4) != 0) { + ++non_indent; + } + + /* count long lines */ + if (col_len(buf) > MAX_COL) { + /* found a line that is too long */ + ++toolong; + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* note long lines if needed */ + if (toolong > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s extend beyond the 80th column\n", + program, toolong, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* note non-indented lines, if needed */ + if (non_indent > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s are not indented by 4 spaces\n", + program, non_indent, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_build - open/check the build file + * + * The how to build file must not be longer than MAX_BUILD_SIZE bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_build(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + + /* + * open the how to build input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_BUILD_SIZE) { + fprintf(stderr, + "%s: FATAL: the how to build file: %s, is %d bytes long\n", + program, filename, statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_BUILD_SIZE); + return(NULL); + } + + /* return the open file */ + return(stream); +} + +/* + * open_program - open/check the program source file + * + * The program source file must be <= 3217 bytes. The number of + * non-whitespace and }{; chars not followed by whitespace must + * be <= 1536 bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_program(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + int count; /* special count size */ + int c; /* the character read */ + + /* + * open the program source input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open program source file: %s: ", + program, filename); + perror(""); + exit(7); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat program source file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_PROGRAM_SIZE) { + fprintf(stderr, + "%s: FATAL: the program source file: %s, is %d bytes long\n", + program, filename, statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_PROGRAM_SIZE); + return(NULL); + } + + /* + * count the non-whitespace, non {}; followed by whitespace chars + */ + count = 0; + c = 0; + while ((c=fgetc(stream)) != EOF) { + /* look at non-whitespace */ + if (!isascii(c) || !isspace(c)) { + switch (c) { + case '{': /* count if not followed by EOF or whitespace */ + case '}': + case ';': + /* peek at next char */ + c = fgetc(stream); + if (c != EOF && isascii(c) && !isspace(c)) { + /* not followed by whitespace or EOF, count it */ + ungetc(c, stream); + ++count; + } + break; + default: + ++count; + break; + } + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* look at the special size */ + if (count > MAX_PROGRAM_SIZE2) { + fprintf(stderr, + "%s: FATAL: the number of bytes that are non-whitespace, and\n", + program); + fprintf(stderr, + "%s: that are not '{', '}', ';' followed by whitespace\n", + program); + fprintf(stderr, + "%s: or EOF must be <= %d bytes\n", + program, MAX_PROGRAM_SIZE2); + fprintf(stderr, + "%s: in %s, %d bytes were found\n", + program, filename, count); + return(NULL); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_output - open/check the entry output file + * + * This function returns NULL on open error. + */ +FILE * +open_output(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + + /* + * open the ioccc entry output file + */ + stream = fopen(filename, "w"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open ioccc entry file for output: %s: ", + program, filename); + perror(""); + exit(8); + } + + /* return the open file */ + return(stream); +} + +/* + * output_entry - output the ---entry--- section + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_entry(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + char title[MAX_TITLE_LEN+1+1]; /* the entry's title */ + char buf[MAX_COL+1+1]; /* I/O buffer */ + int entry=0; /* entry number */ + int ret; /* fields processed by fscanf */ + int ok_line=0; /* 0 => the line is not ok */ + char skip; /* input to skip */ + FILE *date_pipe; /* pipe to a date command */ + time_t epoch_sec; /* seconds since the epoch */ + char *p; + + /* + * write the start of the section + */ + fprintf(output, "---entry---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the rule year + */ + fprintf(output, "rule:\t%d\n", RULE_YEAR); + check_io(output, oname, EOF_NOT_OK); + + /* determine if this is a fix */ + printf("Is this a fix, update or resubmittion to a "); + printf("previous entry (enter y or n)? "); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + if (buf[0] == 'y') { + fprintf(output, "fix:\ty\n"); + check_io(output, oname, EOF_NOT_OK); + printf("\nBe sure that the title and entry number that you give\n"); + printf("are the same of as the entry you are replacing\n"); + } else { + fprintf(output, "fix:\tn\n"); + check_io(output, oname, EOF_NOT_OK); + } + + /* + * write the title + */ + printf("\nYour title must match expression be a [a-zA-Z0-9_=] character\n"); + printf("followed by 0 to %d more [a-zA-Z0-9_=+-] characters.\n\n", + MAX_TITLE_LEN-1); + printf("It is suggested, but not required, that the title should\n"); + printf("incorporate your username; in the\n"); + printf("case of multiple authors, consider using parts of the usernames\n"); + printf("of the authors.\n\n"); + printf("enter your title: "); + do { + /* prompt and read a line */ + if ((ok_line = get_line(title, MAX_TITLE_LEN+1, MAX_COL-9)) <= 0) { + printf("\ntitle is too long, please re-enter: "); + continue; + } + + /* verify the pattern, not everyone has regexp, so do it by hand */ + if (!isascii((int)title[0]) || + !(isalnum((int)title[0]) || title[0] == '_' || title[0] == '=')) { + printf("\ninvalid first character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } else { + for (p=(&title[1]); *p != '\0' && *p != '\n'; ++p) { + if (!isascii((int)*p) || + !(isalnum((int)*p) || + *p == '_' || *p == '=' || *p == '+' || *p == '-')) { + printf("\ninvalid character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } + } + } + } while (ok_line <= 0); + fprintf(output, "title:\t%s", title); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the entry number + */ + printf("\nEach person may submit up to %d entries per year.\n\n", + MAX_ENTRY); + printf("enter an entry number from 0 to %d inclusive: ", MAX_ENTRY-1); + do { + /* get a valid input line */ + fflush(stdout); + ret = fscanf(stdin, "%d[\n]", &entry); + check_io(stdin, "stdin", EOF_NOT_OK); + /* skip over input until newline is found */ + do { + skip = fgetc(stdin); + check_io(stdin, "stdin", EOF_NOT_OK); + if (skip != '\n') { + /* bad text in input, invalidate entry number */ + entry = -1; + } + } while (skip != '\n'); + + /* check if we have a number, and if it is in range */ + if (ret != 1 || entry < 0 || entry > MAX_ENTRY-1) { + printf( + "\nThe entry number must be between 0 and %d inclusive\n\n", + MAX_ENTRY-1); + printf("enter the entry number: "); + } + } while (ret != 1 || entry < 0 || entry > MAX_ENTRY-1); + fprintf(output, "entry:\t%d\n", entry); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the submission date + */ + /* returns a newline */ + epoch_sec = time(NULL); + fprintf(output, "date:\t%s", asctime(gmtime(&epoch_sec))); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the OS/machine host information + */ + printf( + "\nEnter the machine(s) and OS(s) under which your entry was tested.\n"); + output_till_dot(output, oname, "host:"); +} + +/* + * output_remark - output the ---remark--- section + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_remark(output, oname, remark, rname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + FILE *remark; /* stream to the file containing remark text */ + char *rname; /* name of the remark file */ +{ + char buf[BUFSIZ+1]; /* input/output buffer */ + + /* + * write the start of the section + */ + fprintf(output, "---remark---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * copy the remark file to the section + */ + while (fgets(buf, BUFSIZ, remark) != NULL) { + fputs(buf, output); + check_io(output, oname, EOF_NOT_OK); + } + check_io(remark, rname, EOF_OK); + + /* be sure that the remark section ends with a newline */ + if (buf[strlen(buf)-1] != '\n') { + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + } +} + +/* + * output_author - output the ---author--- section + * + * Read the needed information from stdin, and write the author section. + * If multiple authors exist, multiple author sections will be written. + */ +void +output_author(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + char buf[MAX_COL+1+1]; /* I/O buffer */ + int more_auths; /* TRUE => more authors to note */ + int auth_cnt=0; /* number of authors processed */ + + /* + * prompt the user for the author section + */ + printf("\nEnter information about each author. If your entry is after\n"); + printf("%s and before the contest deadline, the judges\n", START_DATE); + printf("will attempt to EMail back a confirmation to the first author\n"); + + /* + * place author information for each author in an individual section + */ + do { + + /* write the start of the section */ + fprintf(output, "---author---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* write the author */ + printf("\nAuthor #%d name: ", ++auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nname too long, please re-enter: "); + } + fprintf(output, "name:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the organization */ + printf("\nEnter the School/Company/Organization of author #%d\n", + auth_cnt); + printf("\nAuthor #%d org: ", auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter: "); + } + fprintf(output, "org:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the address */ + printf( + "\nEnter the postal address for author #%d. Be sure to include\n", + auth_cnt); + printf("your country and do not include your name.\n"); + output_till_dot(output, oname, "addr:"); + + /* write the EMail address */ + printf( + "\nEnter the EMail address for author #%d. Use an address from\n", + auth_cnt); + printf( + "a registered domain or well known site. If you give several\n"); + printf("forms, list them one per line.\n"); + output_till_dot(output, oname, "email:"); + + /* write the anonymous status */ + printf("\nShould author #%d remain anonymous (enter y or n)? ", + auth_cnt); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + fprintf(output, "anon:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* determine if there is another author */ + printf("\nIs there another author (enter y or n)? "); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + if (buf[0] == 'y') { + more_auths = TRUE; + } else { + more_auths = FALSE; + } + } while (more_auths == TRUE); + return; +} + +/* + * output_info - output the ---info--- section(s) + * + * Read the needed information from stdin, and write the info section. + * If multiple info files exist, multiple info sections will be written. + */ +void +output_info(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + char infoname[MAX_FILE_LEN+1]; /* filename buffer */ + char yorn[1+1]; /* y or n answer */ + char *uuname; /* name to uuencode as */ + FILE *infile; /* info file stream */ + + /* + * prompt the user for info information + */ + printf("\nInfo files should be used only to supplement your entry.\n"); + printf("For example, info files may provide sample input or detailed\n"); + printf("information about your entry. Because they are supplemental,\n"); + printf("the entry should not require them to exist.\n\n"); + + /* + * while there is another info file to save, uuencode it + */ + printf("Do you have a info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + while (yorn[0] == 'y') { + + /* read the filename */ + printf("\nEnter the info filename: "); + while (get_line(infoname, MAX_FILE_LEN+1, 0) <= 0) { + printf("\nInfo filename too long, please re-enter: "); + } + + /* compute the basename of the info filename */ + /* remove the trailing newline */ + uuname = &infoname[strlen(infoname)-1]; + *uuname = '\0'; + /* avoid rindex/shrrchr compat issues, do it by hand */ + for (--uuname; uuname > infoname; --uuname) { + if (*uuname == '/') { + ++uuname; + break; + } + } + + /* attempt to open the info file */ + infile = fopen(infoname, "r"); + if (infile == NULL) { + fprintf(stderr, "\n%s: cannot open info file: %s: ", + program, infoname); + perror(""); + continue; + } + + /* + * write the start of the section + */ + fprintf(output, "---info---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* uuencode the info file */ + uuencode(output, oname, infile, infoname, UUINFO_MODE, uuname); + + printf("\nDo you have another info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + }; + return; +} + +/* + * output_build - output the ---build--- section + * + * Read the needed information from stdin, and write the build section. + */ +void +output_build(output, oname, build, bname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + FILE *build; /* open build file stream */ + char *bname; /* name of the build file */ +{ + /* + * write the start of the section + */ + fprintf(output, "---build---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, build, bname, UUBUILD_MODE, UUBUILD_NAME); + return; +} + +/* + * output_program - output the ---program--- section + * + * Read the needed information form stdin, and write the program section. + */ +void +output_program(output, oname, prog, pname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + FILE *prog; /* open program stream */ + char *pname; /* name of program file */ +{ + /* + * write the start of the section + */ + fprintf(output, "---program---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, prog, pname, UUPROG_MODE, UUPROG_NAME); + return; +} + +/* + * output_end - output the ---end--- section + * + * Read the needed information form stdin, and write the 'end section'. + */ +void +output_end(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + /* + * write the final section terminator + */ + fprintf(output, "---end---\n"); + check_io(output, oname, EOF_NOT_OK); + return; +} + +/* + * get_line - get an answer from stdin + * + * This function will flush stdout, in case a prompt is pending, and + * read in the answer. + * + * This function returns 0 if the line is too long, of the length of the + * line (including the newline) of the line was ok. This function does + * not return if ERROR or EOF. + */ +int +get_line(buf, siz, maxcol) + char *buf; /* input buffer */ + int siz; /* length of input, including the newline */ + int maxcol; /* max col allowed, 0 => disable check */ +{ + int length; /* the length of the input line */ + + /* flush terminal output */ + fflush(stdout); + + /* read the line */ + if (fgets(buf, siz+1, stdin) == NULL) { + /* report the problem */ + check_io(stdin, "stdin", EOF_NOT_OK); + } + + /* look for the newline */ + length = strlen(buf); + if (buf[length-1] != '\n') { + int eatchar; /* the char being eaten */ + + /* no newline found, line must be too long, eat the rest of the line */ + do { + eatchar = fgetc(stdin); + } while (eatchar != EOF && eatchar != '\n'); + check_io(stdin, "stdin", EOF_NOT_OK); + + /* report the situation */ + return 0; + } + + /* watch for long lines, if needed */ + if (maxcol > 0 && (length > maxcol || col_len(buf) > maxcol)) { + /* report the situation */ + return 0; + } + + /* return length */ + return length; +} + +/* + * output_till_dot - output a set of lines until '.' by itself is read + * + * This routine will read a set of lines until (but not including) + * a single line with '.' is read. The format of the output is: + * + * leader:\tfirst line + * \tnext line + * \tnext line + * ... + * + * This routine will not return if I/O error or EOF. + */ +void +output_till_dot(output, oname, leader) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + char *leader; /* the lead text for the first line */ +{ + char buf[BUFSIZ+1]; /* input buffer */ + int count; /* lines read */ + int done=FALSE; /* TRUE => finished reading input */ + + /* instruct the user on how to input */ + printf("\nTo end input, enter a line with a single period.\n"); + + /* read lines until '.' or EOF */ + count = 0; + while (!done) { + /* issue the prompt */ + printf("%s\t", (count>0) ? "" : leader); + fflush(stdout); + + /* get the line */ + if (get_line(buf, BUFSIZ, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter:\n\t"); + continue; + } + + /* note if '.' was read */ + if (strcmp(buf, ".\n") == 0) { + done = TRUE; + } + + /* write line if we read something */ + if (!done) { + fprintf(output, "%s\t%s", (count++>0) ? "" : leader, buf); + check_io(output, oname, EOF_NOT_OK); + } + } + + /* if no lines read, at least output something */ + if (count <= 0) { + fprintf(output, "%s\t.\n", leader); + check_io(output, oname, EOF_NOT_OK); + } + return; +} + +/* + * col_len - determine the highest that a string would reach + * + * Given a string, this routine returns that a string would reach + * if the string were printed at column 1. Tab stops are assumed + * to start at 9, 17, 25, 33, ... + */ +int +col_len(string) + char *string; /* the string to examine */ +{ + int col; /* current column */ + char *p; /* current char */ + + /* scan the string */ + for (col=0, p=string; *p != '\0' && *p != '\n'; ++p) { + /* note the column shift */ + col = (*p=='\t') ? 1+((col+8)/8*8) : col+1; + } + if (*p == '\n') { + --col; + } + + /* return the highest column */ + return col; +} + +/* + * check_io - check for EOF or I/O error on a stream + * + * Does not return if EOF or I/O error. + */ +void +check_io(stream, name, eof_ok) + FILE *stream; /* the stream to check */ + char *name; /* the name of this stream */ + int eof_ok; /* EOF_OK or EOF_NOT_OK */ +{ + /* test for I/O error */ + if (ferror(stream)) { + fprintf(stderr, "%s: error on %s: ", program, name); + perror(""); + exit(1); + + /* test for EOF */ + } else if (eof_ok == EOF_NOT_OK && feof(stream)) { + fprintf(stderr, "%s: EOF on %s\n", program, name); + exit(1); + } + return; +} + +/* + * uuencode - uuencode a file + * + * Perform the uuencoding process identical to the process performed + * by the uuencode(1) utility. + * + * This routine implements the algorithm described in the uuencode(5) + * 4.3BSD Reno man page. + */ +void +uuencode(output, oname, infile, iname, umode, uname) + FILE *output; /* output file stream */ + char *oname; /* output filename */ + FILE *infile; /* input file stream */ + char *iname; /* input filename */ + int umode; /* the mode to put on the uuencode file */ + char *uname; /* name to put on the uuencode file */ +{ + char buf[UUENCODE_LEN+1]; /* the uuencode buffer */ + int read_len; /* actual number of chars read */ + int val; /* 6 bit chunk from buf */ + char filler='\0'; /* filler uuencode pad text */ + char *p; + + /* + * output the initial uuencode header + */ + fprintf(output, "begin %o %s\n", umode, uname); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + + /* + * We will process UUENCODE_LEN chars at a time, forming + * a single output line each time. + */ + while ((read_len=fread(buf,sizeof(buf[0]),UUENCODE_LEN,infile)) > 0) { + + /* + * the first character is the length character + */ + fputc(UUENCODE(read_len), output); + check_io(output, oname, EOF_NOT_OK); + + /* + * We will convert 24 bits at a time. Thus we will convert + * 3 sets of 8 bits into 4 sets of uuencoded 6 bits. + */ + for (p=buf; read_len>0; read_len-=3, p+=3) { + + /* bits 0 to 5 */ + val = (p[0]>>2)&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 6 to 11 */ + val = ((p[0]<<4)&0x30) | ((p[1]>>4)&0x0f); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 12 to 17 */ + val = ((p[1]<<2)&0x3c) | ((p[2]>>6)&0x03); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 18 to 23 */ + val = p[2]&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + } + + /* end of UUENCODE_LEN line */ + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer (don't depend on bzero() or memset()) + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + } + + /* check the last read on the input file */ + check_io(infile, iname, EOF_OK); + + /* write end of uuencode file */ + fprintf(output, "%c\nend\n", UUENCODE(filler)); + check_io(output, oname, EOF_NOT_OK); +} diff --git a/1994/rules b/1994/rules new file mode 100644 index 000000000..8d68775bc --- /dev/null +++ b/1994/rules @@ -0,0 +1,214 @@ +11th International Obfuscated C Code Contest Rules + +Copyright (c) Landon Curt Noll & Larry Bassel, 1994. +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: his emotions obfuscated his + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show the importance of programming style, in an ironic way. + * To stress C compilers with unusual code. + * To illustrate some of the subtleties of the C language. + * To provide a safe forum for poor C code. :-) + + +NOTE: Changes from the original 1993 rules are denoted by change bars. ---> | + + +RULES: + + To help us with the volume of entries, we ask that you follow these rules: + + 1) Your entry must be a complete program. + + 2) Your entry must be <= 3217 bytes in length. The number of characters + excluding whitespace (tab, space, newline), and excluding any ; { or } + followed by either whitespace or end of file, must be <= 1536. + + 3) Your entry must be submitted in the following format: + +---entry--- +rule: 1994 +fix: y or n (n => this is a new entry, y => this replaces an older entry) +title: title of entry (see comments below) +entry: Entry number from 0 to 7 inclusive (your 1st entry should by 0) +date: Date/time of submission in UTC (see comments below) +host: Machine(s) and OS(s) under which your entry was tested + Use tab indented lines if needed +---remark--- + Place remarks about this entry in this section. It would be helpful if + you were to indent your remarks with 4 spaces, though it is not a + requirement. Also, if possible, try to avoid going beyond the 79th + column. Blank lines are permitted. +---author--- +name: your name +org: School/Company/Organization +addr: postal address + use tab indented lines to continue + don't forget to include the country +email: EMail address from a well known site or registered domain. + If you give several forms, list them on separate tab indented lines. +anon: y or n (y => remain anonymous, n => ok to publish this info) +---info--- +If your program needs an info file, place a uuencoded copy of it in +this section. In the case of multiple info files, use multiple info +sections. If your entry does not need a info file, skip this section. +---build--- +Place a uuencoded copy of the command(s) used to compile/build your program +in this section. It must uudecode into a file named 'build'. The resulting +file must be 255 bytes or less. +---program--- +Place a uuencoded copy of your program in this section. It must uudecode +into a file named is 'prog.c'. The resulting file must follow rule #2. +---end--- + + Regarding the above format: + + * The title must match the expression: [a-zA-Z0-9_=][a-zA-Z0-9_=+-]* + and must be 1 to 12 characters in length. + + It is suggested, but not required, that the title should + incorporate your username; in the case of multiple authors, + consider using parts of the usernames of the authors. + + * The date in the ---entry--- section should be given with respect + to UTC. The format of the date should be as returned by asctime() + using the C locale. (see guidelines for more info) + + * You may correct/revise a previously submitted entry by sending + it to the contest email address. Be sure to set 'fix' in the + ---entry--- section to 'y'. The corrected entry must use the same | + title and entry number as submittion that is being corrected. Be + sure that you note the resubmittion in the ---remark--- as well. + + * With the exception of the header, all text outside of the above + format may be ignored by the judges. If you need tell the judges + something, put it in the ---remark--- section, or send a separate + EMail message to the judges. + + * Information from the ---author--- section will be published unless + 'y' was given to the respective author's 'anon' line. + + * To credit multiple authors, include an ---author--- section for + each author. Each should start with ---author--- line, and + should be found between the ---entry--- and ---build--- sections. + + * The entry's remarks should include: + - note if this entry is a re-submission of a previous entry. + - what this program does + - how to run the program (sample args or input) + - special compile or execution instructions, if any + - special filename requirements (see rule 4 and 5) + - information about any ---info--- files | + - why you think the program is obfuscated + - any other remarks (humorous or otherwise) + + * Do not rot13 your entry's remarks. You may suggest that certain + portions of your remarks be rot13ed if your entry wins an award. + + * Info files should be used only to supplement your entry. They + should not be required to exist. + + * If your entry does not need an info file, skip the ---info--- | + section. If your entry needs multiple info files, use multiple + ---info--- sections, one per info file. You should describe + each info file in the ---remark--- section. + + * Your sections must in the same order as in the above template. | + + 4) If your entry is selected as a winner, it will be modified as follows: + + 'build' is incorporated into a makefile, and 'build' is removed + 'prog.c' is renamed to your entry's title, followed by an optional + digit, followed by '.c' + your entry is compiled into a file with the name of your entry's + title, possibly followed by a digit + + If your entry requires that a build file exist, state so in your + entry's remark section. The makefile will be arranged to execute a + build shell script containing the 'build' information. The name of + this build shell script will be your entry's title, possibly followed + by a digit, followed by '.sh'. + + If needed, your entry's remarks should indicate how your entry must + be changed in order to deal with the new filenames. + + 5) The build file, the source and the resulting executable should be + treated as read-only files. If your entry needs to modify these files, + it should make and modify a copy of the appropriate file. If this + occurs, state so in your entry's remarks. + + 6) Entries that cannot be compiled by an ANSI C compiler will be rejected. + Use of common C (K&R + extensions) is permitted, as long as it does not + cause compile errors for ANSI C compilers. + + 7) The program must be of original work. All programs must be in the + public domain. All copyrighted programs will be rejected. + + 8) Entries must be received prior to 8-May-94 23:59 UTC. (UTC is | + essentially equivalent to Greenwich Mean Time) EMail your entries to: + + ...!{apple,pyramid,sun,uunet}!hoptoad!obfuscate + obfuscate@toad.com + + We request that your message use the subject 'ioccc entry'. + + If possible, we request that you hold off on EMailing your entries + until 4-Mar-94 12:00 UTC. Early entries will be accepted, however. | + We will attempt to email a confirmation to the sender of any entry | + received after 4-Mar-94 12:00 UTC and before the close of the contest. | + + 9) Each person may submit up to 8 entries per contest year. Each entry + must be sent in a separate EMail letter. + + 10) Entries requiring human interaction to be built are not allowed. + Making an entry must produce a file (or files) which may be executed. | + + 11) Programs that require special privileges (setuid, setgid, super-user, + special owner or group) are not allowed. + + 12) Legal abuse of the rules is somewhat encouraged. An entry that, in | + the opinion of the judges, violates the rules will be disqualified. | + Entries that attempt to abuse the rules must try to justify why | + their rule abuse is legal in the ---remark--- section. | + + +FOR MORE INFORMATION: + + The Judging will be done by Landon Noll and Larry Bassel. Please send + questions or comments about the contest, to: + + ...!{apple,pyramid,sun,uunet}!hoptoad!judges (not the address for | + judges@toad.com submitting entries) | + + Comments about confusing rules and guidelines are also welcome. | + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, send EMail to the address | + above and use the subject 'send rules'. | + + One may obtain winners of previous contests (1984 to date), via ftp from: | + + host: ftp.uu.net (192.48.96.9) | + user: anonymous + pass: yourname@yourhost + dir: pub/ioccc | + + As a last resort, previous winners may be obtained by sending EMail | + to the above address. Please use the subject 'send YEAR winners', | + where YEAR is a single 4 digit year, a year range, or 'all'. | + + +chongo /\cc/\ {chongo,noll}@{toad,sgi}.com +Larry Bassel lab@sun.com diff --git a/1994/schnitzi.c b/1994/schnitzi.c new file mode 100644 index 000000000..45a5365e4 --- /dev/null +++ b/1994/schnitzi.c @@ -0,0 +1,52 @@ +#include +int r=0,x,y=0, /* +nt / +c +lx /\ / \ /|\ /|\ +u, \/ \\/ \-/ \ / +dn ] +e= ||| /|\ /\ /\ = p p + 0 \/ \ / ||| \/ f f f r r +<, tw t s s i i +sy || /|\ /\ i eh e e c n n +t= /- \ / ||| n li l e a t t +d0 ||| t ll l {< k n f f +i, || /|\ /|\ (e s ( fr ( f ( ( +o _ ||\ \ / \-/ tu s( t usw o; i s ( " " +. || - / c [[ tg rv [th rx=f t " % \ +h mh111 de{l) +di (+'( d+% c n+ +> aa000 itte; > +il x+ n inc " "+ + / ir000[ns[nytyrrne<=)'y ? t [ + r ] : y; + u[++r ] = + ftell(stdin ) ; } + while ( n + < y ) + {for(x=0 ; x + + /*MLSPXPMPVPOQN + POPJLVMMQNQNPSPYPXLRP + XMTJMLSPXPMPVPOQNPOPJLVMN + QSPWPOPXLRPXMTJMLNPOPPPSPXPOP + JLYPRLTPVLUPVLWPVLXPVLVPSLJLUQP + PJQLQSPXPNQPPRLTPVL*/main(){int K/* + PUOUPWOV*/,L/*WPVLXPVLKPUOVPWOSLU*/,M + /*PPPPVPOQMQRPR*/=0;FILE/*TPSLUMWQT*/ * + J/*MPRPKPLQ*/; J= fopen(__FILE__ + /*T*/,"r");for (;( L/*KPUOWOWMUQ + LLOLMPULWLWL WLW LWLWLWLWLWLW + LWLWLULVOXP LLV LLLOLMPULOL + MMNP*/=getc (J) )!= -1;L/* + OLWLRMMQUL VOX PLLVLLLMQO + PMPYPXPNP MQL LVLLLWPSP + XPOQNQOPMQ LLV LTj*/>='J' + &&L/*LRPYP OQL QMQLLVLLL + OLMQVOXPL LVL LLVOe*/<= + 'J'+15&&( (M= !M/*MMMQMV + OJMMMMMU OOL NPU MPMOM + UMRNOLMQV OJM MMMMRMLLW + QUMTJSPX PNQ JLLPUOWO + WMUQJMVL JMV L*/)?K/* + MQMV*/=L: putchar (K/*deMN + MaVbcLKM KMV Le*/-'J' + /*MWQUMTJ WPK PSPXPR*/ + |(L/*PQV LMPSLSPXPNQ*/- 'J'<<4)) + ));exit( 0);}/*LPQUMMPR PKPLQJLT + LTLJLMPU MTJUQMPRPKPLQ JLNPUONM + JMWOVLTL OPVLPPWM + PMUMTJNQ SPWPOPYO + NQJLQPUM TJPNSNVN + ONJLTLRP VLTLSPUM + TJQQRPSP VPOPJLRL + WLWLPPJLP LPLJLKLJQ + SPJQOPRL NPSLJLPL + PLJLKLPPY PLQUPRLSL + SLUMTJRPW MPPNPYPJQ + OPXPRLPMW LPPVMVMKM + VLLLKPLLSL UMSPWMPPNP + YPJQOPXPR LRLPMWLPP + VMVMKMSLUL KMVLLLLQLL + SLUMTJPPYP LQRLUMUMSL + UQSPPPRLPPS LUQPPQPOPNQ + MQRLNPVLNMJM VLSPSLUMNPUO + MQNQLQVPOPXPR LNPSLWLKMWOWM + QLVOJMQLUMTJSP PPRLTLNPWMWMQL + JMQLULPPSLUQMQJQLQSPXPNQPPRLTLMPVLLLOLM + QVOXPLLVLNPULKMSLUMYPRLMQNQNPYPOQNQVL + PMVLPMWLPPVLNPULKMVLJMSLWQTJSPPPRLT + LNPXMQLJMQLULPPSLYPRLRPVLOMVLNP + VLJMVLJMSLWQOPVPMQOPUQNQSPWPO + PRLPLQPSLUMOPWMKPMQMPNQSP + WPOPRLVPYPMPKPVPNQSPW + POPRLPLQPSLSLUM + +TJPPYPLQRLPQWMKMUMPQVMPMUMPQULULSLYPRLRPVLPQKLWMKMPLPLPQKLWMPMWLKMVLPQ +ULQLJMQLVLKPNQYPSPRLOPULLPUOPQWOSLVLPQSLMQVPOPOPJQRLKMSLUMWQWQWQTJTJ*/ + diff --git a/1994/shapiro.hint b/1994/shapiro.hint new file mode 100644 index 000000000..f612c88b2 --- /dev/null +++ b/1994/shapiro.hint @@ -0,0 +1,64 @@ +Most Well Rounded Obfuscation: + + Andrew T. Shapiro + CSES/CIRES University of Colorado + Campus Box 216 + Boulder, CO 80309-0216 + USA + + +Judges' comments: + + To use: + make shapiro + ./shapiro & + + This entry has many different levels of obfuscation, and yet the + source file is self documenting. :-) + + From time to time, run ps and look at the new processes. + + See shapiro.info for more information in the internals of this program. + The file shapiro.alt contains a non-obfuscated version of this program. + + +Selected notes from the author: + + The basic theme (pun) of this program is: + + "This time (everything) is not where it should be." + ~~~~ + My entry (shapiro.c) is mostly comment, formatted in the shape of a + clock. If you strip out the comments and look at the code you will + quickly realize that the comments were the important part and that + the code does very little (see pun above). It writes (to stdout) + another C program (shapiro_t2.c). This is the first level of + obfuscation. + + The second program (shapiro_t2.c if you use the build/make file) + prints a clock in the upper right hand corner of your VTxxx/ANSI + display. + + Most of the surface obfuscation in the second program (shapiro_t2.c) + was an attempt to make it as small as possible. You should be able to + see around this with cb(1) and some more intelligent variable names. + Once you get past this you will realize that the third level of + obfuscation is a six member client/server hierarchy. + (See the second info file for a detailed description of the algorithm.) + + Lint complains about: precedence confusion, K may be used before set, + main() returns random value to invocation environment, value type used + inconsistently, value type declared inconsistently, function argument + ( number ) used inconsistently, function returns value which is always + ignored, function returns value which is sometimes ignored + All of which are harmless (famous last words). + + This may or may not work on non ASCII systems (I could not find one to + test it on.) + +Copyright (c) 1994, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. + diff --git a/1994/shapiro.info b/1994/shapiro.info new file mode 100644 index 000000000..c81070fb7 --- /dev/null +++ b/1994/shapiro.info @@ -0,0 +1,109 @@ +HINTS +~~~~~ +For the first program (prog.c): +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This is a very simple program: + + 1. #include + 2. main() + 3. { + 4. int K,L,M=0; + 5. FILE *J; + 6. J=fopen(__FILE__,"r"); + 7. for(; + 8. (L=getc(J))!=-1; + 9. L>='J'&&L<='J'+15 && +10. ((M=!M)?K=L:putchar(K-'J'|(L-'J'<<4))) +11. ); +12. exit(0)} + +Lines 1-5 are basic stuff. Line 6 opens the source code for input. Line 7 +is the loop. Line 8 is read in each character in the file (placed in L) +while not EOF(-1). Line 9 is an if expression which filters out all +characters not between J and J + 15. Line 10 uses M to execute two different +paths the first just stores the character in K. The second path combines +the last two characters read in as high and low nibbles of a byte and +outputs them. In effect this is a very poor ASCII to binary decoder. +The last line is necessary so that make will not stop when it executes +this program. + +The second program is encoded into this format and then included (mostly) +as a comment. + +Notice that it is impossible to write this program while leaving 16 +contiguous ASCII characters free for the encoding. Because of this the +second program is mostly included as a comment. However, some of the +characters of the encoded program are also source code for the decoder. + +For the second program (time.c): +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 1 #include + 2 #include + 3 #define o(j,k,m,n,l) {fprintf(j,a[k],m,n,a[l]);fflush(j);} + 4 char *a[]={"%c+------------+\n","%c+%3d %-8s+\n","seconds","minutes", + 5 "hours","%s\n","\0337\033[%d;65;H%s\0338"}; + 6 int b[]={0,0,17,14,11,0}; + 7 main(v,c) + 8 int v; + 9 char ** c; + 10 { + 11 char d[40],*e,f=6; + 12 time_t g; + 13 FILE *h,*i; + 14 while (--f && !pipe(d) && !fork()); + 15 h=fdopen(6-f<<1,"a"); + 16 i=fdopen((6-f<<1)+1,"r"); + 17 for(;;){ + 18 if(f){ + 19 fgets(d,40,i); + 20 d[strlen(d)-1]='\0'; + 21 if(*d=='0'+f){ sprintf(*c,"%s\n",d+1); o(stdout,6,6-f,d+1,0) } + 22 if(*d>'0'+f) o(h,5,d,0,0) + 23 }else{ + 24 time(&g); + 25 e=asctime(localtime(&g)); + 26 for(v=1;v<6;v++) o(h,v!=1&&v!=6-1,v+'0',atoi(e+b[v]),v) + 27 sleep(1); + 28 }}} + +Lines 1 and 2 have to be. Think of 'o' in line 3 as send message with +j,k and m as where, format and what. Lines 4 and 5 are all the text +strings. Line 6 is the offsets into the time string for the hours, +minutes and seconds. Lines 7-13 are basic stuff. Line 14 is the crux of +the biscuit. 14 forks off 'f'(6) processes each of which is connected to +the ones above and below it with a Unix pipe. It was too difficult to +recover the actual fd numbers for the pipe ends in line 14 so I regenerate +them and fdopen them (for use with the standard C library functions) on lines +15 and 16. Now we have six almost identical processes. Each of which has +two files open h and i (up and down). The only difference in each process +is the value of f (0 <= f < 6). The five processes where f !=0 are the +slave processes and f == 0 is the master. Line 17 says we are going to do +this forever. Lines 18 and 23 differentiate between the master and the +slaves. + +Lines 19 to 22 are the slave code. Here we read in a line of text from +i (down)(line 19) and remove the end of line char (line 20). On line +21 if this message is for us (if the first character is our number, f, +in ASCII) we do two things: +1. We copy the text of the message to *c which is really argv[0]. + If you are on the correct flavor of Unix this will change the output of + the ps(1) command to the string we just put there. +2. We send the message (not including the number) to stdout with + format number 6 ("\0337\033[%d;65;H%s\0338") If you can read VTxxx + (and I read books printed as ANSI/VTxxx codes for fun :-) you know this + is the sequence for: remember where we are, + go somewhere else, + print the message, + and return to where we started. +Line 22 says if this message is not for us (the number is bigger than ours) +send it to h (up). + +Lines 24 to 27 are the master code. Here we get the time and convert it +to an ASCII format (lines 24 and 25). Then on line 26 we build and send +each of the messages for the slaves. The message uses a different control +string for the different slaves. For the first and last slave the message +text is just "%c+------------+\n" (slave number, text, newline.) For the +other slaves it is "%c+%3d %-8s+\n" (slave number, number, units, newline). +The slave number is v+'0'. The number (if used) is atoi(e+b[v]) and the +units are just the string in the slave number position. + diff --git a/1994/smr.c b/1994/smr.c new file mode 100644 index 000000000..e69de29bb diff --git a/1994/smr.hint b/1994/smr.hint new file mode 100644 index 000000000..51c536625 --- /dev/null +++ b/1994/smr.hint @@ -0,0 +1,43 @@ +Worst Abuse of the Rules: + + Szymon Rusinkiewicz + Massachusetts Institute of Technology + 305 Memorial Dr., Room 005B + Cambridge, Ma 02139 + USA + + +Judges' comments: + + To use: + make smr + ./smr + + Nearly every year, one or more people would submit what they claimed + was the world's smallest self reproducing program. While the sizes + of these submissions varied, a quick glance would reveal that they + were too big, until this entry came along. + + While strictly speaking, smr.c is not a valid C program, it is + not an invalid C program either! Some C compilers will compile + an empty file into a program that does nothing. But even if your + compiler can't, the build instructions supplied with this entry + will produce an executable file. On most systems, the stdout + from the executable will exactly match original source. + + In the future, the contest rules will specify a minimum size + that is one character larger than this entry, forever eliminating + this sort of program from contest. After all, how many variations + can one make on this entry? :-) + + +Selected notes from the author: + + The world's smallest self-replicating program. Guaranteed. + Produces a listing of itself on stdout. + +Copyright (c) 1994, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1994/tvr.alt.c b/1994/tvr.alt.c new file mode 100644 index 000000000..048d7fb72 --- /dev/null +++ b/1994/tvr.alt.c @@ -0,0 +1,175 @@ +#include +#define M typedef +#define N( a)=r=(a)+j +#define S f(; G; )D[B[H=i[--G]]=F+=FV)*2 +#define o b F; b G = 0; c H = 0; c R + +M int b; +M unsigned c; +M unsigned char *d; +M XPoint *e; +M void _; +short *a; +b *h, *i, j, k, l, m, n, p, V; +c T; +b O; +d A, B, C; +_ *q, *r, *calloc (); +e s, t; +Window u, v; +GC x[256]; +b D[256]; +b w, y, z; +_ +Q (b F) +{ + XMapWindow (q, v = XCreateSimpleWindow (q, XRootWindow (q, z = XDefaultScreen (q)), !v * n, 0, n, n, 0, 0, 0)); + XSelectInput (q, v, F); +} +_ +P () +{ + C N (h N (i N (a N (s N (t N (A N (B = calloc (C - B + 256, 1)))))))); +} +_ +J () +{ + o; + R = w % 5; + F = G = m; + V = n * !R - 1; + Z + { + h g = l + (R - 4 ? R - 2 ? R - 3 ? (a g = 2 * (F * F - G * G) / m) + 4 * F * G / m * n + (F * F > j / 4 - G * G) * j * !R * 8 : G + F * n : (G * G - F * F) / m * n + 2 * F * G / m : (G - F * F / n) + F * n); + (s g.x = m - F--, s + H)->y = m - G; + F = F + m ? F : (G--, m); + } +} +_ +K () +{ + b H; + c R; + Z D[B g = X ? (R = E) < j ? (A[R] < p) + A[R] : 1 : 0]++; +} +_ +I (d F) +{ + F || gets (F = B); + y = atoi (F); +} +_ +Y () +{ + o; + K (); + f (H = k + l; + X && (F = B g) < p; + H = E) + { + D[F]--; + B[i[G++] = H] = p; + } + if (H >= j) + F = 1; + S; +} +_ +L () +{ + o; + Z B g = 0; + O = -1; + Z + { + f (; + X && !(F = B g); + H = E) B[i[G++] = H] = p; + S; + } +} +_ +U () +{ + o; + e L[256], W = t; + f (H = 0; + H < y; + H++) + { + L g = W; + W += D g; + } + Z if (A g - B g) + *L[B g]++ = s g; + { + XMotionEvent *R = r = t; + W = t; + f (H = 0; + H < y; + H++) + { + XDrawPoints (q, v, x g, W, L g - W, CoordModeOrigin); + W += D g; + D g = 0; + } + f (F = k; + XPending (q) + !++O; + R->type - ButtonPress ? (k = (T = R->x) + R->y * n - l) : (O = -42)) XNextEvent (q, r = R); + Z h g += k - F; + } +} +_ +main (b i, d * W) +{ + o; + if (i > 2) + { + P (); + I (*++W); + w = y; + I (*++W); + n = y * 2; + j = n * n; + P (); + m = y; + l = j / 2 + m; + q = XOpenDisplay (0); + Q (0); + u = v; + Q (PointerMotionMask | ButtonPressMask); + I (0); + p = y; + { + XColor F; + Colormap G; + f (H = 0; + H < p; + H++) + { + I (0); + XParseColor (q, G = XDefaultColormap (q, z), r = B, &F); + XAllocColor (q, G, &F); + XSetForeground (q, x g = XCreateGC (q, u, 0, 0), F.pixel); + } + } + y = p--; + P (); + J (); + f (F = R = H = 0; + R < j; + )++ F < p && X ? (T = R % n, H = G + E) : (D[B[R] = F]++, H = l, G = ++R - H, F = 0); + T = m; + G = j; + U (); + v = u; + f (F = w / 5; ; + A += G -= G + G, B -= G) (O < 0 ? L : *("tvr@cs.hut.fi." + 7 * F) ? F ^ 1 ? Y : K : L) (), (U) (); + } + puts ("tvr: mode size < cmap"); +} diff --git a/1994/tvr.bw b/1994/tvr.bw new file mode 100644 index 000000000..3fcbe28e5 --- /dev/null +++ b/1994/tvr.bw @@ -0,0 +1,122 @@ +121 +black +white +black +white +black +white +black +white +black +black +white +white +black +black +white +white +black +black +white +white +black +black +white +white +black +black +black +black +white +white +white +white +black +black +black +black +white +white +white +white +black +black +black +black +white +white +white +white +black +black +black +black +white +white +white +white +black +black +black +black +black +black +black +black +white +white +white +white +white +white +white +white +black +black +black +black +black +black +black +black +white +white +white +white +white +white +white +white +black +black +black +black +black +black +black +black +white +white +white +white +white +white +white +white +black +black +black +black +black +black +black +black +white +white +white +white +white +white +white +white +black diff --git a/1994/tvr.c b/1994/tvr.c new file mode 100644 index 000000000..f3c7797fb --- /dev/null +++ b/1994/tvr.c @@ -0,0 +1,115 @@ +#include +#define M typedef +#define N( a)=r=(a)+j +#define S f(; G; )D[B[R=i[--G]]=F+=Fy=m-G;F= + F+m?F:(G--, m);}} _ K(){ b H,R; + f(H=0;H= j) F = 1; S; } _ L() { b H, F,G; c R ; + f( H =0; H < j; H ++) B g =0; O =-1; f( G = R = 0; + R < j; R++ ){ f(; R < j && !( F = B[ R ]); R = h[ R ] + + k) B [i[ G ++] = R ] = p; S; } } _ U() { e X [ 256 ] + ,W; b H; W = t; f ( H = 0; H < o; H ++ ) { X g = + W; W +=D g ;} f( H =0; H < j; H ++) if( + A g - B g) * X[ B g ] ++ = s g; { + XMotionEvent * V = r = t ; W + = t; f ( H = 0; H < o + ; H ++ ) { XDrawPoints + + + (q , + v ,x g, + W,X g -W, + CoordModeOrigin + ) ; W += D + g ; D g + + = 0 ; + } f(; + XPending(q)+! + ++O; V->type- + ButtonPress?( + k =V + ->x+ + + + V -> y * n - l) : ( + O = - 42 ) ) XNextEvent ( q , r + = V ) ; } } _ main ( b X , d * W ) { b H, F + ,G; c R; if ( X < 3 ) { puts( "tvr: mode size < cmap" + ); exit(0);} P(); I(*++ W); w = y %12; I(*++ W); n = y *2; j + = n * n ; P ( ) ; m = y ; l = j / 2 + m + ; q=XOpenDisplay ( 0 ) ; Q ( 0 ) + ; u = v ; Q ( PointerMotionMask + |ButtonPressMask ) ; I ( 0 ) ; o + =y ; p = o -1 ; { XColor F ; + Colormap G; f ( H = 0 ; H < o + ; H++){ I(0); XParseColor(q,G + =XDefaultColormap ( q , z ) , r = + B , & F ) ; XAllocColor + (q , G , & F ) ; + + + + + + + + + + + XSetForeground + (q,x g = XCreateGC + ( q, u ,0 , 0 ) , F + .pixel ) ; } } P ( ); J (); f + ( F =R = G =H = 0; H < j; ) + if(++F >= p || ( R = h [ R ] + +G)>=j ) { D [ B g = F ] ++; R + = l + k; G= ++H -R; + F =0; } H=j; U(); v= + u; f(F=w/4; ; A+=H-=H+H,B-=H + )(O<0?L:*("tvr@cs.hut.fi." + +7*F)?F^1?Y:K:L)() + ,(U)(); } diff --git a/1994/tvr.color b/1994/tvr.color new file mode 100644 index 000000000..90a17f18e --- /dev/null +++ b/1994/tvr.color @@ -0,0 +1,125 @@ +124 +#005050 +#006464 +#007878 +#008c8c +#00a0a0 +#1ca8a8 +#3cb4b4 +#5cc0c0 +#7ccccc +#9cd8d8 +#bce4e4 +#dcf0f0 +#fcfcfc +#e0f4f4 +#c0e8e8 +#a0dcdc +#80d0d0 +#60c4c4 +#40b8b8 +#20acac +#00a0a0 +#008c8c +#007878 +#006464 +#005050 +#003c3c +#002828 +#001414 +#000000 +#140000 +#280000 +#3c0000 +#500000 +#640000 +#780000 +#8c0000 +#a00000 +#ac2020 +#b84040 +#c46464 +#d08484 +#dca8a8 +#e8c8c8 +#f4e8e8 +#f8f0f0 +#ecd0d0 +#e0b0b0 +#d49090 +#cc7070 +#c05050 +#b43030 +#a81010 +#980000 +#840000 +#700000 +#5c0000 +#480000 +#340000 +#200000 +#0c0000 +#000800 +#001c00 +#003000 +#004400 +#005800 +#006c00 +#008000 +#009400 +#0ca40c +#2cb02c +#4cbc4c +#6cc86c +#8cd08c +#acdcac +#cce8cc +#ecf4ec +#f0f8f0 +#d0ecd0 +#b0e0b0 +#90d490 +#70cc70 +#50c050 +#30b430 +#10a810 +#009800 +#008400 +#007000 +#005c00 +#004800 +#003400 +#002000 +#000c00 +#000008 +#00001c +#000030 +#000044 +#000058 +#00006c +#000080 +#000094 +#0c0ca4 +#2c2cb0 +#4c4cbc +#6c6cc8 +#8c8cd0 +#acacdc +#cccce8 +#ececf4 +#f0f0f8 +#d0d0ec +#b0b0e0 +#9090d4 +#7070cc +#5050c0 +#3030b4 +#1010a8 +#000098 +#000084 +#000070 +#00005c +#000048 +#000034 +#000020 +#00000c diff --git a/1994/tvr.hint b/1994/tvr.hint new file mode 100644 index 000000000..f1cbc22cc --- /dev/null +++ b/1994/tvr.hint @@ -0,0 +1,219 @@ +Best X11 Program: + + Teemu Rantanen + Helsinki University of Technology + Melkonkatu 5 A 8 + 00210 Helsinki + Finland + + +Judges' comments: + + To use: + make tvr + ./tvr mode screensize/2 < colormapfile + + Try: + ./tvr 0 128 < tvr.color (for color displays) + ./tvr 0 128 < tvr.bw (for Black & White displays) + + Mode may be a value from 0 to 12. + + This entry requires the use of X11. It will form two windows + (hopefully your window mangler will ask you to place these + your display) which you should place side by side. Move the + cursor around in one of the two windows and watch what happens. + + The fractally minded may be able to detect that mode 0 does not + calculate Mandelbrot/Julian sets correctly. Can you find the bug? + Better still, can you fix it without breaking something else? + + The author has provided us a spoiler version: + + make tvr.alt + ./tvr.alt altmode screensize/2 < colormapfile + + where altmode 1-4 correspond to mode 0-3 in the original entry + and altmode 0 calculates Mandelbrot/Julian sets correctly. + + +Selected notes from the author: + + + Interactive Fractals for X Window System + + + This program contains 4 pairs of fractals/effects and 3 methods of + animating them. There are two windows for a pair of fractals, one + of which contains static fractal (eg. Mandelbrot set) and the + other an animating one (eg. Julian set) which is derived from the + same formula as the static one. Only one pair of fractals can be + displayed on one process. + + + To animate the fractal, you must move your mouse on the static + fractal -window and the animated fractal will be calculated based + on mouse coordinates. If you are on one of the two non-stable + modes (more about them later) you can stabilize the picture by + pressing a mouse button. Pressing it does nothing on stable mode. + + + + The three modes are: + - non-stable mode with simple 'attractor searcher' + - non-stable mode + - stable mode + + On Mandelbrot/Julian mode the stable mode calculates normal Julian + set according to the Mandelbrot coordinates (mouse position). On + non-stable modes the picture slowly transforms to the same picture + as on the stable mode but transformation can take some + time. Usually, and especially if changes are relatively small + between mouse movements or frame rate is high, the non-stable mode + makes much more interesting effects IMHO. The difference between + 2 non-stable modes is that the first tries to stabilize + picture. It doesn't stabilize much, but it helps on some cases + quite a lot. One notable case where help can be seen is when you + first move your mouse to non-black areas of Mandelbrot set, then + back to near the center. On some cases 'attractor searcher' can be + seen as noise. + + + First of the fractal pairs is Mandelbrot/Julianset as mentioned + before. Second is a variation of that. Third makes nice + 3d-look-a-like effects and fourth is variation of that with more + nice effects. + + + + Usage: + tvr mode screensize/2 < colormapfile + + The first parameter is the operating-mode of the program. There + are 4 fractal pairs, 3 display modes, making total of 12 + modes. Screensize is half of the actual screenlength/width. ie. If + you use 128 as a second parameter, you will get two 256x256 + windows. + + Program needs reasonable values for both of these parameters to + operate. Good first try could be "0 128" or "8 128". Colormap has + to be piped into the programs standard input. + + Note that you will need approximately (secondparameter^2)*64 bytes + of free main memory or machine will swap heavily (memory + references are quite random and may confuse paging algorithms + easily). This means that for 512x512 windows you will need 4M of + memory. + + + Colormapfile: + + This is the file from which program reads colors for screen + colormap. First line of the file must be a number between + 3..254. This informs the program how many colors there are to be + expected. This is also the maximum number of iterations used on + picture calculations. Lines after that are X11 color + names. Program expects to find, and uses, the number of colors + reported on first line. + + There are 2 colormapfiles to start with. One with colors and + another with only black and white. If you have enough colors on + your display you can use the one with colors (even on + grayscale). The other is meant mainly for 1 bitplane display + (on which the picture looks terrible compared to 8 bitplane + display). + + + Compilation: + + You should compile this entry with optimizing compiler with the + highest level of optimization possible. You will also need an ansi + compatible compiler (gcc -ansi -pedantic will do fine). + + + + This entry has been tested on wide variety of machines including: + + Machine OS + ------- -- + Decstation 5000/240 Ultrix 4.3A + DECAlpha 3000/300 OSF/1 v1.3 and v2.0 + IBM RS6000 AIX v3 + SPARCStation IPX SunOS 4.1.3 + i486 Linux v1.1.8 (binarysize 3576 bytes + using gcc -O6 -s -N ;) + HP 9000/730 HP-UX + + Also, many of X-server and Xlibrary version have been tested and + the program should be highly portable. Program may slow down + considerably on machines where table references are slow as the + program makes extensive use of them. Also, due to the huge amount + of data sent to the X-server, considerable slowdown can be noticed + if the Xserver is slow or especially if the connection between the + Xserver and the client is slow. (Don't try this on 9600 bps modem + line. I did ;) + + + Obfuscation is done on different levels. Almost none of it is made + at the macro level, so cpp:ing the code won't give you + much. Perhaps most notable is the algorithmic obfuscation. Simple + formula has been turned into something completely different. Also + it may be a surprise to find out which piece of the code + calculates non-stable fractals and how it does that. Many + obfuscations were left out of the program because speed of + animation was one of the key issues. Well, obfuscated or not, + some of the effects are very nice ;) + + + Memory refreshment: + + Mandelbrot set is calculated from formula + + 2 + Z = Z + Z + n+1 n 0 + + and Julian set is calculated from formula + + 2 + Z = Z + C + n+1 n + + where C is the same throughout the picture. Both + calculation are finished when |Z| >= 2.0. For the other + fractals, the basic methods are the same but formula is + different (look from the source ;) + + Note that Mandelbrot and Julian on this program aren't + exactly correct. Find out why ;) + + + Bugs: + + - No error checking. If DISPLAY is not set program dumps core. + This may also happen if a request of some of the resources + fails. eg. getting colors. + + - No expose event handling + + - It may be possible that the program starts drawing before + window is mapped as there is no XSync(). In that case drawn + data is lost. Also, some window manager configurations places + the second window on top of the first and and again drawn data + will be lost. By default, windows are placed next to the other + in the topleft corner of the screen. + + - Zooming is not possible + + - Eats LOTS of memory on BIG pictures. Also lot's of CPU. + + - Under mode 0, the boundary condition is not checked properly. + The condition |Z| >= 2.0 should be checked exactly (by comparing + x*x+y*y with 2*2), or else artifacts are introduced. The result + of this error is a "bubbly" appearance (at least in mono). + +Copyright (c) 1994, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1994/weisberg.c b/1994/weisberg.c new file mode 100644 index 000000000..785bbcc30 --- /dev/null +++ b/1994/weisberg.c @@ -0,0 +1,5 @@ + +main(){ + int x=3,n,m=2,*t,*a,*b=0; + while(b?o:((*(t=b=(int*)malloc(o))=2),a=t+1,o))n=*b,n>=m?c:x%n?(int)b++:N); +} diff --git a/1994/weisberg.hint b/1994/weisberg.hint new file mode 100644 index 000000000..67de4532c --- /dev/null +++ b/1994/weisberg.hint @@ -0,0 +1,66 @@ +Best Short Program: + + Jeff Weisberg + University of Rochester + Dept of Electrical Engineering + Computer Studies Bldg + Rochester, NY 14627 + USA + + +Judges' comments: + + To use: + make weisberg + ./weisberg + + This entry confuses some C-preprocessors and some C-beautifiers. + We found one cpp that processed this source differently when + it was read on stdin instead of via cc -E. + + If you liked what you saw from the above program, and happen to + have some 512 Megabytes of virtual memory laying around with to do, + you could try: + + make weisberg.alt + ./weisberg.alt + + Lesser systems will find this alternative version a good way to create + a core file. :-) + + +Selected notes from the author: + + Description: + The following short program implements the "Yet Another" algorithm for + generating prime numbers. It will generate all primes up to 33554432, + displaying them to the standard output as it churns along. As 33554432 + is rather large on most machines, this code may take quite some time to + run to completion, so as an added feature, it will cease execution upon + reception of a signal (any will do equally well), as well as in the + event of a system shutdown or reboot. + + Bugs: + The alternative version (weisberg.alt) has never actually run + to completion. After running for close to a week it had reached + somewhere around 250e6, when it became necessary to test the + reboot feature (which worked remarkably well) As there are + quite a lot of primes to be found before reaching MAXINT, the + output produced can be quite overwhelming, it recommended to + pipe the output through your favorite pager (more or less), and not + output to a paper output device (unless you have *LOTS* of paper). + + Technical: + The original "Yet Another Prime Program" algorithm used here was + developed as a Computer Architecture course micro-programing exercise, + and was designed to take full advantage of the UR300 + micro-architecture to achieve blindingly fast speed. It was ported to + C specifically for the IOCCC. In the conversion/obfuscation step some + of (much of) the blazing speed was lost, but as a bonus, the + understandability of the code was reduced to zero. + +Copyright (c) 1994, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1994/westley.c b/1994/westley.c new file mode 100644 index 000000000..b0a8af20b --- /dev/null +++ b/1994/westley.c @@ -0,0 +1,90 @@ +#if O +main(){} +#else + + + + + + + + + + + + + + + + + + + + + + + + +#if rop&onut&((own&rain)|warf) +#include " The orc scrambles to the drain, trying to get the donut; you run out the door and escape! The End " +#else +#if escribe +#if ocument +#include " It reads: Depress Dotted Dog " +#else +#if oor +#include " The door is decorated with relief figures of various dog breeds " +#else +#if rain +#include " Through the drain you see a dwarf in another cell " +#else +#if warf +#include " The gnarled dwarf looks thirsty " +#else +#if ungeon|ebris +#include " You notice a desk, a phone, and a phone directory among the clutter " +#else +#if esk +#include " There are some dimes on the desk " +#else +#if irectory +#include " It reads: Pixie's Pub - instant service - Dial DUNgeon0614 " +#else +#include " You notice nothing unusual " +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#else +#if ial&UNgeon0614 +#include " Pixie takes your order, and magically, the room is filled with banana daiquiris " +#endif +#if rink&aiquiri +#include " As you drink, a voice from below says 'Could you drop one down here?' " +#endif +#if rop&aiquiri +#if warf|own +#include " The dwarf eagerly accepts the drink. 'Thanks! Here, I found this, but I can't understand it.' He hands you a document " +#else +#include " You drop the drink on the floor " +#endif +#endif +#if epress&(almatian|almation) +#include " As you press the dalmatian figure, the door opens - only to reveal a menacing orc by a vending machine (with a sign reading 'DEPOSIT MONEY') " +#endif +#if eposit&(ime|imes) +#include " Donuts spill out; you get some, the orc hungrily eats the rest " +#endif +#if rop&onut +#include " The orc quickly eats the donut; he still bars the way " +#endif +#if rop+epress+ime+eposit+rink+aiquiri+onut==1 +#include " Be more specific " +#endif +#include " You are in a debris-filled dungeon; a door bars the way, and sludge trickles into a floor drain " +#endif +#endif +#endif diff --git a/1994/westley.hint b/1994/westley.hint new file mode 100644 index 000000000..5d8677fc4 --- /dev/null +++ b/1994/westley.hint @@ -0,0 +1,101 @@ +Worst Abuse of the C Preprocessor: + + Brian Westley (Merlyn LeRoy on Usenet) + Digi International + 1906 James Ave. + St. Paul, MN 55105 + USA + + +Judges' comments: + + To use: + make westley + ./westley + + But for something more interesting try compiling it with + different cc arguments. For example: + + cc -Describe -Door westley.c + cc -Describe -Drain westley.c + + Not all compiler errors are bad. + + For spoilers see the end of the notes from the author below. + + +Selected notes from the author: + + This program, in accordance with the rules, compiles into a legal + C program without human intervention. However, it simply compiles + into "main(){}", which does nothing and exits, so you don't need + to actually compile the program. + + This program is a simple adventure game which uses only C preprocessor + error messages (for missing #include files) as output. To begin, + try to compile the program with no options: + + cc westley.c + + This will fail, producing an error message for a missing #include + file as the opening description. Your terminal should be set for + 80 columns, 8 character tabs, and wraparound, as there is no way + to reliably output newlines. You should see something like this + (text massaged to change wraparound to separate lines): + + westley.c + westley.c(87) : fatal error C1024: cannot open include file ' + + You are in a debris-filled + dungeon; a door bars the + way, and sludge trickles into + a floor drain + + ' + Your compiler error message will vary, but the important part is the + missing include file name, which functions as the game text. + + To "do" things, all words must start with "-D". For example, to + look at the door, do: + + cc -Describe -Door prog.c + + ...and you will get another error message telling you about the door. + (note: some compilers will stop after the first missing include file, + while others will continue to try compiling; the latter will repeat + the opening message each time, as if you are playing an adventure game + with "verbose" turned on). + + The goal of the game is to escape the dungeon. + + Here is a walk-through for the game, including a few dead-ends: + ---SPOILER--- + + -Describe -Door + -Describe -Drain + -Describe -Dwarf + -Describe -Debris (or -Dungeon) + -Describe -Desk + -Describe -Dime + -Describe -Directory + -Dial -DUNgeon0614 + -Drink -Daiquiri + -Drop -Daiquiri + -Drop -Dwarf -Daiquiri (or -Drop -Down -Daiquiri) + -Describe -Document + -Depress -Dotted -Dog + -Depress -Dalmatian (also accepts "Dalmation" [sic]) + -Deposit -Dime + -Drop -Donut + -Drop -Donut -Down -Drain (or -Drop -Dwarf -Donut) + (at this point, you win!) + + Note that the game has no real state information; you can type these + commands in any order, at any time. Also note that word order is + unimportant. + +Copyright (c) 1994, Landon Curt Noll & Larry Bassel. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from both Landon Curt Noll and Larry Bassel. diff --git a/1995/1995.tar.bz2 b/1995/1995.tar.bz2 new file mode 100644 index 000000000..e18f57766 Binary files /dev/null and b/1995/1995.tar.bz2 differ diff --git a/1995/Makefile b/1995/Makefile new file mode 100644 index 000000000..30064fd22 --- /dev/null +++ b/1995/Makefile @@ -0,0 +1,119 @@ +# %W% %G% %U% +# +# 1995 makefile +# +# Copyright (c) 1996, Landon Curt Noll, Larry Bassel & Sriram Srinivasan +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from Landon Curt Noll, Larry Bassel and Sriram Srinivasan. + + +SHELL=/bin/sh +CAT=cat +CHMOD=chmod +CP=cp +ECHO=echo +GUNZIP=gunzip +UUDECODE=uudecode +LN=ln +RM=rm +SED=sed +TRUE=true + +# flags for ANSI compiles +# +# NOTE: Some ANSI compilers make use of -Xa to turn on ANSI mode, +# others such as gcc may want -ansi, others may want nothing +# at all. Adjust the CFLAGS line as needed. +# +# NOTE: Some compilers cannot optimize, or optimize some entries +# incorrectly. You might want to turn on -O to see if your +# compiler can handle them. +# +#CFLAGS=-O -Xa +#CFLAGS=-Xa +#CFLAGS= -ansi +CFLAGS= -ansi -O +#CFLAGS= + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +CC=cc +#CC=gcc + +# winners that compile under ANSI C +# +WINNERS= cdua dodsond1 dodsond2 esde garry heathbar leo makarios savastio \ + schnitzi spinellis vanschnitz +ALT_NAMES= leo.orig garry.fmt garry.test + +LEVEL=5 + +all: $(WINNERS) + +cdua: cdua.c + ${CC} ${CFLAGS} cdua.c -o cdua + +dodsond1: dodsond1.c + ${CC} ${CFLAGS} -DXXXXXX= -DXXXXXXX= dodsond1.c -o dodsond1 + +dodsond2: dodsond2.c + ${CC} ${CFLAGS} dodsond2.c -o dodsond2 -lcurses -ltermcap + +esde: esde.c esde.data esde.data2 + ${CC} ${CFLAGS} esde.c -o esde + +garry: garry.c + ${CC} ${CFLAGS} garry.c -o garry + +heathbar: heathbar.c + ${CC} ${CFLAGS} heathbar.c -o heathbar + +# The following as a less obfuscated version of garry. +# +garry.fmt: garry.fmt.c + ${CC} ${CFLAGS} garry.fmt.c -o garry.fmt + +# The following are test progs for garry +# +garry.test: garry.test.sh garry garry.data + rm -f garry.test + cp garry.test.sh garry.test + chmod +x garry.test + +leo: leo.c + ${CC} ${CFLAGS} -DGa=608 -DAs=792 -DMo=int -DAr='unsigned long' \ + -DS='struct Se' leo.c -o leo + +# NOTE: this is the original program that was non-interactive +# +leo.orig: leo.orig.c + ${CC} ${CFLAGS} -DGa=608 -DAs=792 -DMo=int -DAr='unsigned long' \ + -DS='struct S' leo.orig.c -o leo.orig + +makarios: makarios.c + ${CC} ${CFLAGS} makarios.c -o makarios + +schnitzi: schnitzi.c + ${CC} ${CFLAGS} schnitzi.c -o schnitzi + +spinellis: spinellis.c + ${CC} ${CFLAGS} spinellis.c -o spinellis + +vanschnitz: vanschnitz.c + ${CC} ${CFLAGS} -Dn=${LEVEL} vanschnitz.c -o vanschnitz + +clean: + $(RM) -f *.o a.out core ${WINNERS} + +clobber: clean + $(RM) -f $(WINNERS) + $(RM) -f $(ALT_NAMES) + +nuke: clobber + @${TRUE} + +install: all + ${CAT} $(WINNERS) $(ALT_NAMES) > /dev/null diff --git a/1995/README b/1995/README new file mode 100644 index 000000000..bf312cd65 --- /dev/null +++ b/1995/README @@ -0,0 +1,142 @@ +1995 marked the "The Twelfth International Obfuscated C Code Contest" + +Copyright (c) 1996, Landon Curt Noll, Larry Bassel & Sriram Srinivasan. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from Landon Curt Noll, Larry Bassel and Sriram Srinivasan. + + +The IOCCC has an official home page: + + http://www.ioccc.org + +containing previous winning entries, information about the judges, +announcements and much more. + +Use make to compile entries. It is possible that on BSD or non-unix +systems the makefile needs to be changed. See the Makefile for details. + +Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitters. + +Read over the makefile for compile/build issues. Your system may +require certain changes (add or remove a library, add or remove a +#define). + +This year Sriram Srinivasan joined the judging. + +The moderator of comp.unix.wizards did not feel that the IOCCC was "wizardly" +enough to be posted to comp.unix.wizards - we will no longer post the +winners to this newsgroup - we'll let you the reader decide for yourself the +wizardlyness of these entries. + +This year there were several people who won more than once +and several previous winners who won this year. The judging was done +without knowledge of the names of the submitters - multiple winners were +a coincidence. Since we tend to discount entries that are similar to +previous winners, these people have had to come with original ideas to +stay in the winners circle. + +We wish to thank CAIP at Rutgers University for the use of their machines. + +A few notes regarding future contests +------------------------------------- + +Due to changes in the Usenix conference calendar, the 1996 contest will +be delayed. Because there will be no Summer 1996 Usenix conference, +the 1996 IOCCC winners will be announced at the Jan 1997 Usenix +conference. + +The 1996 contest will not open until sometime in October 1996, and will +close sometime around the end of December 1996. The rules for the 1996 +contest have not been formed at this time and are not expected to be +ready for distribution until late September 1996. + +Be sure to wait until the 1996 rules are posted before submitting entries. +Rules differ from year to year, sometimes in significant ways. + +Please send us comments and suggestions what we have expressed above. +Also include anything else that you would like to see in future contests. +Send such email to: + + ...!{sun,pacbell,uunet,pyramid}!hoptoad!judges + judges@toad.com + +If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used. + +If you have problems with any of the entries, AND YOU HAVE A FIX, please +EMail the fix (patch file or the entire changed file) to the above address. + + +Credits +------- + +We would like to thank Barbara Frezza for her role as official chef of +the contest. Landon Noll, Larry Bassel and Sriram Srinivasan +appreciated the opportunity to serve as official taste testers. And as +usual, the food was excellent. The official menus of the 1995 +Obfuscated C Contest dinners were: + +Session One: + +Antipasti: Crudites, olive selection, pickles, cheese selection +Soup: Homemade mushroom and green onion soup +Salad: artichoke, red bell peppers, Italian onions, cucumbers + and Greek olives with mustard vinaigrette +Main Course: Pizzas, with a variety of toppings +Dessert: Chocolate torte + +Session Two: + +Antipasti: crudites, olives, roasted red peppers, cheese selection +Salad: Mixed greens with vinaigrette +Main Course: Spaghetti with tomato sauce containing mushrooms and black olives + selection of hot and mild Italian sausages +Bread: Fresh French bread +Dessert: Cookie selection, featuring chocolate chocolate chip cookies and + chocolate butter cookies + + +Session Three + +Antipasti: Crudites, olive selection +Salad: Mixed greens with mustard vinaigrette +Main Course: Broiled salmon with lemmon pepper mayonnaise, chard, mixture + of white and wild rices +Bread: Cheese bread with herbs +Dessert: Chocolate cheesecake (Coutesy of Elizabeth Watson) + +Session Four: + +Antipasti: Crudites, olive selection, roasted red peppers, cheese selection +Bread: Sourdough +Salad: Mixed spring greens with flowers, and mustard vinaigrette +Main Course: Surf and Turf--Grilled steaks of salmon and New York steak + grilled vegetables--onions, peppers, portobello mushrooms + wild rice +Dessert: Chocolate mousse + +Session Five: + +Antipasti: Crudites, olive selection, pickles +Salad: Mixed spring greens with mustard vinaigrette +Main Course: Linguini with a cream sauce of Shiitaki mushrooms and smoked +salmon +Bread: Garlic bread +Dessert: Flourless chocolate torte + +Session Six: + +Antipasti: Carrot and celery sticks with cheese spread, olive selection, +pickles +Bread: Focaccia with black olives and mozzarella cheeses +Salad: Mixed spring greens with flowers and mustard vinaigrette +Soup: Homemade butternut squash soup with mushrooms +Main Course: Cracked dungeness crab with lemon mayonnaise, broccoli, + mixture of white and brown rice +Dessert: Key lime pie + diff --git a/1995/cdua.c b/1995/cdua.c new file mode 100644 index 000000000..b772090f0 --- /dev/null +++ b/1995/cdua.c @@ -0,0 +1,16 @@ +#define r return + +char*u0=" to begin... ",*u1="Already been here!",*u2="Found a wall! \ + ",*u3="Walking... ",*u4="Finished. ",*u5="Going back..\ +. ",*o="\033[23;1HDone!!\n",*x="\033[2J",*y="\033[1;1H",*z="\033[%d;%\ +dH%c",*w="\033[1;1H%s",*v="\033[%d;%dH%c\033[%d;%dH%c\033[%d;%dH%c",b[1841 +];int c,d,e,f,g;typedef int(*h)();h i,j,k,l,m,n;int printf(),srand(),rand( +),time(),getchar();int main(int a){i=printf,j=srand,k=rand,l=time,m=getchar, +n=main;if(!c)for(j(l(0)),g=a=1000,--d;++d<1840;b[c=d]=" #\n"[d%80==79?2:d/80 +&&d%80&&d/80-22&&d%80-78]);if(!(c-1839))++c,i("%s%s%s",x,y,b);k:if(!(c-1840) +&&(b[a+2]+b[a-2]+b[a+160]+b[a-160]-4*' ')){while(b[a+(f=(e=k()%4)?e-1?e-2?-1 +:1:-80:80)*2]!='#');b[a]=b[a+f]=b[f+a+f]=' ';i(v,a/80+1,1+a%80,' ',(a+f)/80+ +1,1+(a+f)%80,' ',(f+a+f)/80+1,1+(f+a+f)%80,' ');n(f+a+f);goto k;}else if(!(g +-a))c=1,a=162,i(w,u0),m();if(c-1){}else r b[a]!=' '?(i(w,b[a]=='.'?u1:u2),0) +:(b[a]='.',i(w,u3),i(z,a/80+1,1+a%80,'.'),a==1676?(i(w,u4),i(o),1):n(a+1)||n +(a+80)||n(a-80)||n(a-1)?1:(b[a]=' ',i(w,u5),i(z,a/80+1,1+a%80,' '),0));r 0;} diff --git a/1995/cdua.hint b/1995/cdua.hint new file mode 100644 index 000000000..45b84672f --- /dev/null +++ b/1995/cdua.hint @@ -0,0 +1,27 @@ +Best Output: + + Carlos Duarte + Instituto Superior Tecnico + Largo da Igreja, 5 R/C DTo + Damaia + 2720 Amadora + Portugal + + +Judges' comments: + + To use: + make cdua + + Try: + cdua + + This could be used as the basis of an a-maze-ing screen exerciser. + + +Selected notes from the author: + + A program that generates a maze, and then solves it, all this being + seen by the user. Some highlights of obfuscation are: 3 steps + functions in one - main(), several recursive calls with conditional + actions, and just one (big and ugly) statement to solve the maze. diff --git a/1995/dodsond1.c b/1995/dodsond1.c new file mode 100644 index 000000000..6b56621f5 --- /dev/null +++ b/1995/dodsond1.c @@ -0,0 +1,67 @@ +#define X +#define XX +#define XXX +#define XXXX +#define XXXXX +#define XXXXXX +#define XXXXXXX +#define orfa for +#define XXXXXXXXX +#define archa char +#define ainma main +#define etcharga getchar +#define utcharpa putchar + + X X + X X X X + X X X X + X X X X + X X X X + X X X X + X X X X + X X X X X X + X XX X X XX X +X XXX X XXXXXXXXX X XXX X +X XXX X XXXX XXXX X XXX X +X XXXX X XX ainma(){ archa XX X XXXX X +X XXXX X oink[9],*igpa, X XXXX X +X XXXXXX atinla=etcharga(),iocccwa XXXXXX X +X XXXX ,apca='A',owla='a',umna=26 XXXX X +X XXX ; orfa(; (atinla+1)&&(!((( XXX X +X XX atinla-apca)*(apca+umna-atinla) XX X + X X >=0)+((atinla-owla)*(owla+umna- X X + X atinla)>=0))); utcharpa(atinla), X + X X atinla=etcharga()); orfa(; atinla+1; X X + X X ){ orfa( igpa=oink ,iocccwa=( X X + X X (atinla- XXX apca)*( XXX apca+umna- X X + X atinla)>=0) XXX XXX ; (((( X + X atinla-apca XXXXX XXXXXXX XXXXX )*(apca+ X + X umna-atinla XXXXXX )>=0) XXXXXX +((atinla- X + X owla)*(owla+ XXXX umna- XXXX atinla)>=0)) X + X &&"-Pig-" XX "Lat-in" XX "COb-fus" X + X "ca-tion!!"[ X (((atinla- X apca)*(apca+ X + X umna-atinla) X >=0)?atinla- X apca+owla: X +X atinla)-owla X ]-'-')||((igpa== X oink)&&!(*( X +X igpa++)='w') X )||! X (*( X igpa X ++)=owla); * X +X (igpa++)=(( X ( XXX XXX X atinla-apca X +X )*(apca+ X umna XXX - XXX X atinla)>=0) X +X ?atinla- X apca XXX + XXX owla X :atinla), X + X atinla= X X X X etcharga()) X + X ; orfa( X atinla=iocccwa?(( X (atinla- X + X owla)*(owla+ X umna-atinla)>=0 X )?atinla- X + X owla+apca: X atinla): X atinla; ((( X + X atinla-apca)* X (apca+umna- X atinla)>=0)+( X + X (atinla-owla)* X (owla+ X umna-atinla)>= X + X 0)); utcharpa( XX XX atinla),atinla X + X =etcharga()); XXXXXXX orfa(*igpa=0, X + X igpa=oink; * igpa; utcharpa( X + X *(igpa++))); orfa(; (atinla+1)&&(!((( X + X atinla-apca )*(apca+ X + X umna- XXXXX XXXXX atinla)>=0 X + X )+(( XXXXX atinla- X + XX owla)*( owla+umna- XX + XX atinla)>=0))); utcharpa XX + XX (atinla),atinla= XX + XX etcharga()); } XX + XXXX } XXXX + XXXXXXXXX diff --git a/1995/dodsond1.hint b/1995/dodsond1.hint new file mode 100644 index 000000000..2839d1cc1 --- /dev/null +++ b/1995/dodsond1.hint @@ -0,0 +1,40 @@ +Most Humorous: + + Don Dodson + AG Communication Systems + 4101 W Union Hills Dr #1104 + Glendale, AZ 85308 + USA + + +Judges' comments: + + To use: + make dodsond1 + + Try: + dodsond1 + + Give the following input: + + ... a male (who) gets very, very frustrated sitting in a chair all + the time because males are biologically driven to go out and hunt + giraffes. + -- Adjunct Professor Newt Gingrich, Reinhardt College, 1/7/95 + + +Selected notes from the author: + + Istha ogrampra akesta Englishwa extta aswa inputwa andwa + anslatestra itwa intowa Igpa Atinla. + + The obfuscation is on several levels. + + Most obviously, the shape of the program. + + Underneath that, the variable names are in pig latin, as are the + names of the standard C functions, such as putchar. Even main is + written as ainma. + + The program construction is also very obfuscated, with all of the + code being inside the ()'s of one of the 6 "orfa" loops. diff --git a/1995/dodsond2.c b/1995/dodsond2.c new file mode 100644 index 000000000..0a86755a7 --- /dev/null +++ b/1995/dodsond2.c @@ -0,0 +1,60 @@ +#include +#include +#define P(A,B,C,D,E) mvaddch(b+A,a+B,(q[y]&C)?D:E); +#define O(A,B,C) case A:if(q[x]&B)C;break; +#define R rand() +#define U 0,1,4,5 +#define J(x) (1<=0)&&(x+u[d]<343)){if(!q[x ++u[d]]){q[x]+=J(d);x+=u[d];q[x]+=J(5-d +);l--;}else if(R0){move(J(0),60);printw("Level %d",( +x/0x31)+J(0)); q[x]|=J(J(3));for(y=(x/ +0x31)*0x31;y<(J(0)+x/0x31)*0x31;y++)if +(q[y]&J(J(3))){a=J(0)+(3*((y/7)%7));b= +J(0)+(3* (y% 7)); +mvaddch( J(1)+((y +%7)*3),J (1)+(((y + + + +/7)%7)*3 ),V);P(0 +,0,0,0,j )P(3,0,0 +,0,j)P(0,3,0,0,j)P(3,3,0,0,j)P(0,J(0), +J(0),V,j)P(0,J(1),J(0),V,j)P(J(0),3,J( +1),V,j)P(J(1),3,J(1),V,j)P(J(1),J(0),4 +,'U',V)P(J(1),J(1),J(3),'D',V)P(J(0),0 +,J(4),V, j)P(J(1) +,0,J(4), V,j)P(3, +J(0),J(5 ),V,j)P( +3,J(1),J( 5),V, j)} + mvaddch(J (1)+((x%7 + )*3),J(1) +(((x/7)% + 7)*3),'@') ;refresh() + ;switch(getchar()){O('k',J(0), + x--)O('j',J(5),x++)O('l',J + (1),x+=J(3)-J(0))O('h' + ,J(4),x-=7)O('u',4 + + +,(x+=49, clear()))O('d',8,(x-=49,clear +()))case 'q':x=-1;break;}}clear();refresh +(/*v*/); nocrmode ();echo();endwin();if(! +x)printf ("You Escaped!\n");exit(0);} diff --git a/1995/dodsond2.hint b/1995/dodsond2.hint new file mode 100644 index 000000000..eb306fa2f --- /dev/null +++ b/1995/dodsond2.hint @@ -0,0 +1,33 @@ +Best Game: + + Don Dodson + AG Communication Systems + 4101 W Union Hills Dr #1104 + Glendale, AZ 85308 + USA + + +Judges' comments: + + To use: + make dodsond2 + + Try: + dodsond2 + + An amazing entry! + + The official chef enjoyed solving the maze, which she did on the first + attempt. + +Selected notes from the author: + + Interactive 3D Maze + + Step into a randomly generated 3D maze and try to get out alive! + Use the vi movement keys (hjkl) to move on a level, and u or d + to move (u)p or (d)own from a position with a U or D on the + map. To simulate the feeling of being in an unknown labyrinth, + areas which you have not visited cannot be seen. + + Reach the north-west left corner of level 1 to exit. diff --git a/1995/esde.c b/1995/esde.c new file mode 100644 index 000000000..e5be7dcfb --- /dev/null +++ b/1995/esde.c @@ -0,0 +1,22 @@ + #include + static char atoi['C'^'c']="__+C-_+C__CC*//_+C&C-_+_C_C/*__"; + + + main(int LCL,char **LB +){FILE*SS;int abs, cos; +char fgetc[5],rand [6], qsort [26] ,log[256]; if(3>LCL) return 1;if((SS=fopen( *++LB ,"rt" +))== NULL) return 2; SD( fgetc ,*++LB);while( fgets(log,0x0100, SS)!=NULL){ abs^= abs; abs--; +while ((int)abs< (int)strlen (log )){cos ^=cos; while (!( isalpha (log[ ++abs]) ))if( !(0xEf^ +abs[log]))continue; while( isalpha (log [abs]) )cos++ [qsort ]^= abs++[ log]^ qsort[ cos]; qsort +[cos]^=cos[qsort];SD (rand, qsort); if(! (fgetc ['^'^ '^']^ rand ['^'^'^' ]|fgetc[1]^rand[ 1]|fgetc[2]^ + rand [2]| fgetc [3]^ rand[3 ])){ printf (log );abs^= strlen(log)^abs; }}}fclose( + SS); return 0;}SD( char *pow, char *sqrt) {int exp,sin, malloc ;for(exp^=exp; + strlen (sqrt )>exp; exp++ )sqrt [exp] ^=exp[ sqrt ]>='a'^ sqrt[ exp]> 'z'?'C' +^'c':'^'^'^'; pow[1] ^=pow[1];pow[2]&= pow[1];pow[3]^= pow[3] ^pow[2] ;pow[0]^=sqrt[0]^ pow[2][pow];if(!( (malloc ^=strlen +(sqrt)^malloc,malloc ?malloc:malloc ^malloc)^1)) return ;for( exp^=exp,++exp; exp++sin))if((sin[sqrt]^'_')&&(sqrt + [sin-1]^sqrt[sin+0]))pow[exp]^=sin[sqrt]^pow[++exp];} diff --git a/1995/esde.data b/1995/esde.data new file mode 100644 index 000000000..ffcf52eba --- /dev/null +++ b/1995/esde.data @@ -0,0 +1,16 @@ +Johnson +Mike +Steve Jonsun +Dolly +Stephany +Steven +Mick +Michael +Dorroty +Katty Johnsone +Denis +Dennis +Jahansen +Deorowicz +Dorowicz +Deodorowicz diff --git a/1995/esde.data2 b/1995/esde.data2 new file mode 100644 index 000000000..0ff40b4e6 --- /dev/null +++ b/1995/esde.data2 @@ -0,0 +1,3 @@ +Can't figure esde does? +Read the source ... +until your eyes grow red. diff --git a/1995/esde.hint b/1995/esde.hint new file mode 100644 index 000000000..5b7b443b1 --- /dev/null +++ b/1995/esde.hint @@ -0,0 +1,64 @@ +Interesting Algorithm: + + Sebastian Deorowicz + ul. Radzionkowska 71a + 42-605 Tarnowskie Gory + Poland + + +Judges' comments: + + To use: + make esde + + Try: + esde esde.data Johanson + esde esde.data2 read + esde esde.hint date + + In general: + + esde data-file word + + where data-file contains lines of < 255 chars in length. + + When reading the source be careful to distinguish between variable + names and library functions. + + If you still don't know what it does, try: + + http://avian.dars.muohio.edu/~kaelbesa/soundex.html + http://avian.dars.muohio.edu/~kaelbesa/coder.html + + +Selected notes from the author: + + 0) what this program does. + This program searches in the file words which have the same Soundex code + like the given word, and print out lines with these words. + + The Soundex code is using to find similar sounds words. + + Soundex code begins with the first letter of the word followed by a + three-digit code. There is the algorithm: + + a) Every letter in the word change by a digit (excluding the first + letter). + b) Replace all pairs of the same code by single code + (ex. R011235 -> R01235). + c) Remove all 0-codes (ex. R01235 -> R1235). + d) If lenght of code is > 4, get only first 4 codes (ex. R1235 -> R123). + e) If lenght of code is < 4, add zeros (ex. T12 -> T120). + + There is the codes: + 0 = A, E, H, I, O, U, W, Y + 1 = B, P, F, V + 2 = C, S, G, J, K, Q, X, Z + 3 = D, T + 4 = L + 5 = M, N + 6 = R + + 1) information about an info file. + An info file should be a text file consisting of lines (max. 256 bytes + in each line). diff --git a/1995/garry.c b/1995/garry.c new file mode 100644 index 000000000..249188b1d --- /dev/null +++ b/1995/garry.c @@ -0,0 +1,30 @@ +#include +#include +#include + FILE + *i,*o; + ;;char y + [ 256], z[ + 10240],*cb(), + *x;char*c,D=36 + ;int l;main(){i + =/* */stdin;o=stdout ;c= + fgets( y,255,i);while(c/* */){x= + cb();;;;/* */fwrite(x,l,1,o);/* */c=fgets( + y,255,i);}};/* */char*cb(){char*c,*/* */a,*b;char*v; + unsigned char/* */f;;c=strchr(y,D);;l=/* */strlen(y);if( + !c){return(y);/* */}a=y;b=z;while(*a){if(/* */*a!=D) *b++=*a + ++;else{a++;c=/* */strchr(a,D);if(c){*c=0;;/* */if(strchr(a,32 + )){*c=D;*b++=D/* */;}else{;v=getenv(a);if(v){/* */while(*v){if(* + v!=92)*b++=*v/* */++;else{f=0/* ** */;v++;if/* */(*v<48||*v>57 + )*b++=92;/*p%* */else{f=(*v/* */++/* */)-48;;/* */if(*v<48||*v + >57)*b++=f;/* */else{f=(/* */f<<3)+(/* */*v++)/* */-48;;*b++=( + (*v<48||*/* */v>57)?f/* */:((f<<3)+(*/* */v++)/* */-48));}}} + ;}a=c+1/* */;}else/* */{*c=D;*b++=D;;;;/* */while (*a != D) + *b++/* */=*a++/* */;a++;*b++=D;}}}else{/* */*b/* */++=D; + }/* */}}l=/* */b-z;return(z);}int*tng()/* *//* *)' + */{if/* */(x==c||c!=x){x=cb();l<<=l>>1/* *(* + */;/* */;strcpy(&D,"(C)1995");l=l/* */ + *l;/* */}/*G.Glendown%^x*//* ; + */ + } diff --git a/1995/garry.cpp b/1995/garry.cpp new file mode 100644 index 000000000..c97098d53 --- /dev/null +++ b/1995/garry.cpp @@ -0,0 +1,30 @@ +#include +#include +#include + FILE + *i,*o; + ;;char y + [ 256], z[ + 10240],*cb(), + *x;char*c,D=36 + ;int l;main(){i + =stdin;o=stdout ;c= + fgets( y,255,i);while(c){x= + cb();;;;fwrite(x,l,1,o);c=fgets( + y,255,i);}};char*cb(){char*c,*a,*b;char*v; + unsigned charf;;c=strchr(y,D);;l=strlen(y);if( + !c){return(y);}a=y;b=z;while(*a){if(*a!=D) *b++=*a + ++;else{a++;c=strchr(a,D);if(c){*c=0;;if(strchr(a,32 + )){*c=D;*b++=D;}else{;v=getenv(a);if(v){while(*v){if(* + v!=92)*b++=*v++;else{f=0;v++;if(*v<48||*v>57 + )*b++=92;else{f=(*v++)-48;;if(*v<48||*v + >57)*b++=f;else{f=(f<<3)+(*v++)-48;;*b++=( + (*v<48||*v>57)?f:((f<<3)+(*v++)-48));}}} + ;}a=c+1;}else{*c=D;*b++=D;;;;while (*a != D) + *b++=*a++;a++;*b++=D;}}}else{*b++=D; + }}}l=b-z;return(z);}int*tng() +{if(x==c||c!=x){x=cb();l<<=l>>1 +;;strcpy(&D,"(C)1995");l=l + *l;} + + } diff --git a/1995/garry.data b/1995/garry.data new file mode 100644 index 000000000..bcabb6b16 --- /dev/null +++ b/1995/garry.data @@ -0,0 +1,41 @@ +This is a short example to demonstrate the use of the garry program ... + +Your Home-directory is $HOME$, while you search +for programs at the following places: + $PATH$ + +Here's some nice conversion using escaped values: + +$EXAMPLEON$ this should be reverse on VT100's $EXAMPLEOFF$ +while this shouldn't ... + +============================================= +The garry.test file looks like the following: +============================================= + +#!/bin/sh +# +# garry.test - example of how to use garry + +EXAMPLEON="\33\133\61\73\67\155" +EXAMPLEOFF="\33\133\155" +DOLLAR="$" +export EXAMPLEON EXAMPLEOFF DOLLAR + +./garry +#include +#include +FILE *i,*o; +char y[256], z[10240],*cb(), *x; +char *c,D = 36; +int l; + +main(){ + i = stdin; + o = stdout; + c = fgets(y,255,i); + while(c){ + x = cb(); + fwrite(x,l,1,o); + c = fgets(y,255,i); + } +} +char*cb(){ + char *c,*a,*b; + char *v; + unsigned char f; + c = strchr(y,D); + l = strlen(y); + if(!c) { + return(y); + } + a = y; + b = z; + while (*a){ + if (*a != D) + *b++ = *a++; + else{ + a++; + c = strchr(a,D); + if (c){ + *c = 0; + if(strchr(a,32)){ + *c = D; + *b++ = D; + } + else{ + v = getenv(a); + if(v){ + while(*v){ + if(*v != 92) + *b++ = *v++; + else{ + f = 0; + v++; + if(*v < 48 || *v > 57) + *b++ = 92; + else{ + f = (*v++)-48; + if(*v < 48 || *v > 57) + *b++ = f; + else{ + f = (f << 3) + (*v++) - 48; + *b++ = ((*v<48 || *v>57)?f:((f<<3)+(*v++)-48)); + } + } + }; + } + a = c + 1; + } + else{ + *c = D; + *b++ = D; + while (*a != D) + *b++ = *a++ ; + a++; + *b++ = D; + } + } + } + else{ + *b++ = D; + } + } + } + l = b - z; + return(z); +} + +int *tng() +{ + if(x == c || c != x){ + x = cb(); + l <<= l >> 1; + strcpy(&D,"(C)1995"); + l = l *l; + } /*G.Glendown*/ +} diff --git a/1995/garry.hint b/1995/garry.hint new file mode 100644 index 000000000..5270d4be7 --- /dev/null +++ b/1995/garry.hint @@ -0,0 +1,61 @@ +Best Utility: + + Garry Glendown + G\"uldene Kammer 35 + 36251 Bad Hersfeld + Germany + + +Judges' comments: + + To use: + make garry garry.test + + Try: + garry.test + + In general, try: + + garry output_file + + While it may not have been the intention of the submitter, the + judges noted that the C pre-processed version (with the #includes + left intact) looked very much like a rat "dropping core". See + garry.cpp and judge for yourself! + + The author was kind enough to provide a less obfuscated version of + the source called garry.fmt.c. + + +Selected notes from the author: + + This program is a file filter, designed to do environment-expansion and + incorporating the ability to create binary from escaped data in the + environment variables. + + The calling syntax is pretty simple, just use it with stdio-redirection + or inside pipelines, e.g.: + + progname converted_file + + or + + cat all_my_files/* | progname | lp + + The syntax of the conversion of the input file is as follows: To include + the value of an environment variable in the output file, place the name + of the variable between "$"-signs in the input, e.g.: + + My Home-Directory is: $HOME$ + I'm using the path: $PATH$ + + Unknown Env-variables or misformed expressions are ignored and kept + intact. + + Additionally, the filter replaces escaped octal values in the + environment variables by their binary representation, e.g.: + + $ TEST="\110\145\154\154\157" + $ export TEST + $ echo '$TEST$' | progname + Hello diff --git a/1995/garry.test.sh b/1995/garry.test.sh new file mode 100644 index 000000000..719d0eff2 --- /dev/null +++ b/1995/garry.test.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# +# garry.test - example of how to use garry + +EXAMPLEON="\33\133\61\73\67\155" +EXAMPLEOFF="\33\133\155" +DOLLAR="$" +export EXAMPLEON EXAMPLEOFF DOLLAR + +./garry | + Not every change is marked in this file is marked, but + most are. :-) | + + +WHAT IS NEW IN 1995: | + + A number of small rules changes were made. See rule #6 and #10 for | + more information. | + + A loophole in the size rule (#2) was plugged. | + + We have clarified the environment under which the C programs are assumed | + to be run. See comments about POSIX in "OUR LIKES AND DISLIKES" below. | + + Sriram Srinivasan was added to the judging team. | + + We are thinking about C++ in a future contest. Ideas are welcome, C++ | + entries are not (yet). | + + Windows 95 (see Dislikes). | + + The original 1995 mkentry.c contained a bug. We have remained this | + rule set 1995-1 to distinguish it from the previous set. | + + +HINTS AND SUGGESTIONS: + + You are encouraged to examine the winners of previous contests. See + FOR MORE INFORMATION for details on how to get previous winners. + + Keep in mind that rules change from year to year, so some winning entries + may not be valid entries this year. What was unique and novel one year + might be 'old' the next year. + + An entry is usually examined in a number of ways. We typically apply + a number of tests to an entry: + + * look at the original source + * convert ANSI tri-graphs to ASCII + * C pre-process the source ignoring '#include' lines + * C pre-process the source ignoring '#define' and '#include' lines + * run it through a C beautifier + * examine the algorithm + * lint it + * compile it + * execute it + + You should consider how your entry looks in each of the above tests. + You should ask yourself if your entry remains obscure after it has been + 'cleaned up' by the C pre-processor and a C beautifier. + + Your entry need not pass all of the above tests. In certain | + cases, a test is not important. Entries that compete for the + 'strangest/most creative source layout' need not do as well as + others in terms of their algorithm. On the other hand, given + two such entries, we are more inclined to pick the entry that + does something interesting when you run it. + + We try to avoid limiting creativity in our rules. As such, we leave + the contest open for creative rule interpretation. As in real life + programming, interpreting a requirements document or a customer request + is important. For this reason, we often award 'worst abuse of the + rules' to an entry that illustrates this point in an ironic way. + + We do realize that there are holes in the rules, and invite entries + to attempt to exploit them. We will award 'worst abuse of the rules' + and then plug the hole next year. Even so, we will attempt to use + the smallest plug needed, if not smaller. :-) + + Check out your program and be sure that it works. We sometimes make + the effort to debug an entry that has a slight problem, particularly + in or near the final round. On the other hand, we have seen some + of the best entries fall down because they didn't work. + + We tend to look down on a prime number printer, that claims that + 16 is a prime number. If you do have a bug, you are better off + documenting it. Noting "this entry sometimes prints the 4th power + of a prime by mistake" would save the above entry. And sometimes, + a strange bug/feature can even help the entry! Of course, a correctly + working entry is best. + + People who are considering to just use some complex mathematical + function or state machine to spell out something such as "hello, + world!" may want to try and be more creative. + + Ultra-obfuscated programs are in some cases some cases easier to + deobfuscate than subtly-obfuscated programs. Consider using + misleading or subtle tricks layered on top of or under an | + appropriate level of obfuscation. + + Programs that use VTxxx/ANSI sequences that are NOT limited to a + specific terminal brand and that can also work in a standard xterm + are considered portable. + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many ANSI C compilers dislike the following code, and so do we: + + #define d define + #d foo <-- don't expect this to turn into #define foo + + When declaring local or global variables, you should declare the type: + + int this_is_ok; + this_is_not; <-- don't use such implicit type declaration + + We suggest that you compile your entry with an ANSI C compiler. If you + must use non-ANSI C, such as K&R C, you must avoid areas that result in + compile/link errors for ANSI C compilers. + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using . Use instead. + + If you use C preprocessor directives (#define, #if, #ifdef, ...), + the leading '#' must be the first character on a line. While some + C preprocessors allow whitespace the leading '#', many do not. + + Because the exit() function returns void on some systems, entries + must not assume that it returns an int. + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + + One line programs should be short one line programs, say around 80 + bytes long. Getting close to 160 bytes is a bit too long in our opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS version specific | + (index/strchr differences are ok, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is ok only if you warn us in the 'remark' header item) + * won't compile or run under a POSIX P1003.1/P1003.2 like systems | + * depend on a utility or application not normally found on most | + most POSIX P1003.1/P1003.2 like systems | + * abuse the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are similar to previous winners + * are identical to previous losers :-) + * are identical to future losers (Windows 95) :-) | + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + The build file should not be used to try and get around the size + limit. It is one thing to make use of a several -D's to help out, + but it is quite another to use 200+ bytes of -D's in order to + try and squeeze the source under the size limit. You should feel + free to make use of the build file space, but you are better off + if you show some amount of restraint. + + We want to get away from source that is simply a compact blob of + characters. To help, we give a break to source that contains + whitespace, and in certain cases ; { or } characters. While the + number of characters excluding whitespace (tab, space, newline), + and excluding any ; { or } followed immediately by either whitespace | + or end of file, must be <= 1536, the total size may be less than 3217 | + bytes. This means that one may use "free of charge" up to 1681 + bytes of whitespace, or ; { or } followed by either whitespace + or end of file. [[Q: What is special about 1681?]] | + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! + + We suggest that you avoid trying for the 'smallest self-replicating' | + source. The smallest, a zero byte entry, won in 1994. | + + We tend to dislike writable strings. That is, we want to avoid: + + char *T = "So many primes, so little time!"; + ... + T[14] = ';'; + + You may use writable strings if you really must. If you do depend + on them, you must say do in the ---remark--- section. + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. Don't + depend on a particular type of display. For example, don't depend + on color or a given size. Don't require backing store. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. We ask that such X client + entries restrict themselves to only the low level Xlib and the + Athena widget set (libX11.a, libXaw.a, libXmu.a and libXt.a). + Don't use M*tif, Xv*ew, or OpenL*ok toolkits, since not everyone + has them. Avoid depending on a particular window manager. Not + everyone has X11r5, and some people are stuck back in X11r4 (or + earlier), so try to target X11r5 without requiring X11r5. Better + yet, try to make your entry run on all version 11 X Window Systems. + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines + in the ---remark--- section. + + While we recognize that UN*X is not a universal operating system, the | + contest does have a bias towards such systems. In an effort to expand | + the scope of the contest, we phrase our bias in terms of POSIX P1003.1 | + and P1003.2 standards. This will allow certain non-UN*X OS users to | + submit entries. On the other hand, this is a guideline and not a rule. | + We will not reject an entry based on some POSIX technicality. | + + When dealing with OS and application environments, we suggest that you | + be reasonable with a nod towards vanilla UN*X-like systems. POSIX will | + evolve but not as much as the contest, so avoid stuff like POSIX real | + time, security, etc. | + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * pass lint without complaint (not a requirement, but it is nice) + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION + * make us laugh and/or throw up :-) + + Some types of programs can't excel (tm) in some areas. Of course, your | + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + We freely admit that interesting, creative or humorous comments in + the ---remark--- section help your chances of winning. If you had to | + read so many twisted entries, you too would enjoy a good laugh or two. | + We think the readers of the contest winners do as well. + + Be creative! + + +ABUSING THE RULES: + + Legal abuse of the rules is somewhat encouraged. Legal rule abuse may + involve, but is not limited to, doing things that are technically + allowed by the rules and yet do not fit the spirit of what we + intended to be submitted. + + Legal rule abuse is encouraged to help promote creativity. Rule + abuse entries, regardless of if they receive an award, result in + changes to the next year's rules and guidelines. + + Legal abuse of the rules is NOT an invitation to violate the + rules. An entry that violates the rules in the opinion of the + judges, WILL be disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL + OF RISK! If you have an entry that might otherwise be interesting, + you might want to submit two versions; one that does not abuse the + rules and one that does. + + If you intend to abuse the rules, indicate so in the ---remark--- + section. You must try to justify why you consider your rule abuse + to be allowed under the rules. That is, you must plead your case + as to why your entry is valid. Humor and/or creativity help plead + a case. + + Abusing the entry format tends to annoy us more than amuse us. + + We are often asked why the contest rules and guidelines seem too | + strange or contain mistakes, flaws or grammatical errors. + One reason is that we sometimes make genuine mistakes. But in many + cases such problems, flaws or areas of confusion are deliberate. + Changes to rules and guidelines in response to rule abuses, are | + done in a minimal fashion. Often we will deliberately leave | + behind holes (or introduce new ones) so that future rule abuse may + continue. + + At the risk of stating the obvious, this contest is a parity of the | + software development process. The rules and guidelines are + only a small part of the overall contest. Even so, one may think + the contest rule and guideline process as a parody of the sometimes + tragic mismatch between what a customer (or marketing) wants and + what engineering delivers. + + +ENTRY FORMAT: + + In order to help us process the many entries, we must request your + assistance by formatting your entries in a certain way. This format, + in addition, allows us to quickly separate information about the + author from the program itself. (see JUDGING PROCESS) + + We have provided the program, mkentry, as an example of how to + format entries. You should be aware of the following warning that + is found in mkentry.c: + + This program attempts to implement the IOCCC rules. Every + attempt has been made to make sure that this program produces + an entry that conforms to the contest rules. In all cases, + where this program differs from the contest rules, the + contest rules will be used. Be sure to check with the + contest rules before submitting an entry. + + You are not required to use mkentry. It is convenient, however, + as it attempts to uuencode the needed files, and attempt to check + the entry against the size rules. + + If you have any suggestions, comments, fixes or complaints about + the mkentry.c program, please send EMail to the judges. (see below) + + The following is a sample entry (the | change bars are not part | + of the example, don't add them to your entry!) | + +---entry--- +rule: 1995-1 +fix: y +title: chonglabram +entry: 0 +date: Mon Oct 23 07:04:32 1995 +host: Un*x v6, pdp11/45 + 2.9BSD, pdp11/70 +---remark--- + This is a not-very-obfuscated C program. It is likely not to win a + prize, because it doesn't have what it takes to win and because the + author plans to forget to send it in before the deadline! :-) + + Note that the rule is 1995-1 because 1995's old mkentry.c was buggy. +---author--- +name: Landon Curt Noll +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA + Earth +email: {chongo,noll}@{toad,sgi}.com +anon: y +---author--- +name: Larry Bassel +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA +email: labbmf@ix.netcom.com +anon: n +---author--- +name: Sriram Srinivasan +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA +email: sriram@tcs.com +anon: n +---info--- +begin 444 info.file +M0V]P>7)I9VAT("AC*2!,86YD;VX@0W5R="!.;VQL+"`Q.3DU+@I!;&P@4FEG +M:'1S(%)E2!O8F9U2!B92!S96YT('1O.B!N;VQL0'1O +M860N8V]M+EQN(BD["B`@("!P'!E8W0@9&ER96-T(%-U;FYY=F%L92!54DP@F5NF5N7,N("!&=6X@<&QA8V4N(&-O;VP@<&5O<&QE(&%N9%QN(BD["B`@ +M("!P7-<;B(I.PH@("`@<')I;G1F*")T;R!C +M2!P2`M/B!W871C:"!F='`Z+R]F='`N=74N;F5T+W!U8B]I;V-C8UQN(BD["B`@ +M("!P special_build + sh < special_build + + * Assume that we will use the entry title. Send us a version of + your build/program files that uses the name convention. You + should uuencode these files in ---info--- sections. + + If your entry needs to modify its source, info or binary files, + please say so in the ---remark--- section. You should try to avoid + touching your original build, source and binary files. You should + arrange to make copies of the files you intend to modify. This + will allow people to re-generate your entry from scratch. + + Remember that your entry may be built without a build file. We + typically incorporate the build lines into a Makefile. If the + build file must exist, say so in the ---remark--- section. + + Typically the ---build--- command will contain a "cc" command. + It is also ok to use a "gcc" command (and gcc args). However keep + in mind that your entry should be compilable by any standard ANSI C + compiler and thus should not depend on a special gcc feature. + + If your entry needs special info files, you should uuencode them + into ---info--- sections. In the case of multiple info files, + use multiple ---info--- sections. If no info files are needed, + then skip the ---info--- section. + + Info files are intended to be input, or detailed information that + does not fit well into the ---remark--- section. For example, an + entry that implements a compiler might want to provide some sample + programs for the user to compile. An entry might want to include a + lengthy design document, that might not be appropriate for a + 'hints' file. + + Info files should be used only to supplement your entry. For + example, info files may provide sample input or detailed + information about your entry. Because they are supplemental, + the entry should not require them exist. + + In some cases, your info files might be renamed to avoid name + conflicts. If info files should not be renamed for some reason, + say so in the ---remark--- section. + + Info files must uudecode into the current directory. If they + absolutely must be renamed, or moved into a sub-directory, say + so in the ---remark--- section. + + When submitting multiple entries, be sure that each entry has + a unique entry number from 0 to 7. Your first entry should + have entry number 0. + + With the exception of the header, all text outside of the entry + format may be ignored. That is, don't place text outside of the + entry and expect us to see it. (Our decoding tools are not AI | + progs!) If you need tell the judges something, put it in the | + ---remark--- section, or send a EMail to: | + + ...!{apple,sun,uunet}!hoptoad!judges (not the address for | + judges@toad.com submitting entries) + + The date should be given with respect to UTC. (Some systems refer + to this as GMT or GMT0) The format of the date should be that as + returned by asctime() in the C locale. An example of such a string is: + + Fri Apr 01 00:47:00 1995 | + + This format is similar to the output of the date(1) command. The + string does not include the timezone name before the year. On many + systems, one of the following command will produce a similar string: + + date -u "+%a %h %d %T 19%y" + date -u | sed -e 's/... \(19[0-9][0-9]\)$/\1/' + sh -c 'TZ=UTC date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"' + sh -c 'TZ=GMT date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"' + sh -c 'TZ=GMT0 date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"' + + You are allowed to update/fix/revise your entry. To do so, set + the 'fix' line in the ---entry--- section to 'y' instead of 'n'. + Be sure that the resubmittion uses the same title and entry number + as well, as these are used to determine which entry is to be + replaced. + + +JUDGING PROCESS: + + Entries are judged by Larry Bassel, Landon Curt Noll and Sriram | + Srinivasan. | + + Entries are unpacked into individual directories. The EMail message + is unpacked into individual files, each containing: + + ---entry--- section + all ---author--- sections + all ---info--- sections + ---build--- section + ---program--- section + any other text, including the EMail message headers + + Prior to judging, the 'any other text' file is scanned to be sure + it does not contain useful information (or in case the entry was + malformed and did not unpack correctly). Information from the + ---author--- sections and the title from the ---entry--- section | + are not read until the judging process is complete, and then only | + from entries that have won an award. + + The above process helps keep us biased for/against any one particular + individual. We are usually kept in the dark as much as you are + until the final awards are given. We like the surprise of finding + out in the end, who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. (For the curious, | + we do indicate the volume of paper consumed when presenting the IOCCC + winners at talks) + + After the Usenix announcement, we attempt to send EMail to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes and typos. We | + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the ---entry--- section + * reading the uudecoded ---build--- section + * reading the uudecoded ---program--- section + * reading the uudecoded ---info--- section(s), if any + * passing the source thru the C pre-processor + skipping over any #include files | + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + skipping over any #include files | + + In later rounds, other actions are performed: + + * linting the source + * compiling/building the source + * running the program + * performing miscellaneous tests on the source and binary | + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry often will compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code + * best X client (see OUR LIKES AND DISLIKES) + * best abuse of ANSI C + * worst abuse of the rules + * + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to 8 or 10 + winners. Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry os good enough to win, but is beat out | + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + + More often than not, we select a small entry (usually one line), a + strange/creative layout entry, and an entry that abuses the contest + rules in some way. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entries. More often, the | + 'best' is picked because it does well in a number of categories. + + +ANNOUNCEMENT OF WINNERS: + + The first announcement, occurs at the main Usenix conference. By | + tradition, this is done during the IOCCC BOF. | + + Winning entries will be posted in February to the following groups: + + comp.lang.c comp.unix.wizards alt.sources + + In addition, pointers to these postings are posted to the following + + comp.sources.d alt.sources.d misc.misc + comp.sources.misc comp.windows.x comp.lang.c++ | + comp.programming | + + Winning entries will be deposited into the uunet archives. See + below for details. + + Often, winning entries are published in selected magazines from around | + the world. Winners have appeared in books ("The New Hackers Dictionary") | + and on T-Shirts. | + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending EMail to the following address: + + ...!{apple,sun,uunet}!hoptoad!judges (not the address for | + judges@toad.com submitting entries) + + Questions and comments about the contest are welcome. Comments about + confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, send EMail to the address + above and use the subject 'send rules'. + + Check out the IOCCC Web page: | + + http://reality.sgi.com/csp/ioccc | + + It has rules, guidelines and winners of previous contests (1984 to date). | + + One may also obtain previous winners via ftp from: | + + host: ftp.uu.net | + user: anonymous + pass: yourname@yourhost + dir: pub/ioccc + + As a last resort, previous winners may be obtained by sending EMail + to the above address. Please use the subject 'send YEAR winners', + where YEAR is a single 4 digit year, a year range (1993-1994), or 'all'. | + + +chongo /\cc/\ {chongo,noll}@{toad,sgi}.com +Larry Bassel labbmf@ix.netcom.com | +Sriram Srinivasan sriram@tcs.com | diff --git a/1995/heathbar.c b/1995/heathbar.c new file mode 100644 index 000000000..aa4db1221 --- /dev/null +++ b/1995/heathbar.c @@ -0,0 +1,88 @@ +# include +# define MAin printf("%d\n" +# define mAIN return 0 +# define MaiN {static +# define mAlN ) {if( +# define MA1N char* +# define MAiN (!!( +# define mAiN atoi +# define mAln &1<< +# define MAlN !=3) +# define MAln )&& +# define MAIN int +# define maln --, +# define Maln << +# define MaIn ++ +# define MalN |= +# define MA1n || +# define malN -1 +# define maIN * +# define MaIN = +# define ma1N ) +# define Ma1N ( +# define Main ; +# define mA1n ! +# define MAIn } +# define mA1N , + MAIN mAIn + Ma1N MAIN + ma1N mA1N + mAiN Ma1N + MA1N ma1N mA1N maIn MaIN malN mA1N ma1n + mA1N maiN Main + MAIN main Ma1N MAIN Ma1n mA1N MA1N maIN + mAin mAlN Ma1n MAlN + mAIN Main maIn MaIn + mA1N Ma1n maln mAin MaIn Main maIn + MaIN mAiN Ma1N Ma1N + Ma1n maln maIN mAin + MaIn ma1N ma1N Main + ma1n MaIN mAiN Ma1N + Ma1N Ma1n maln maIN + mAin MaIn ma1N ma1N + Main mAIn Ma1N mAIn + Ma1N mAIn Ma1N mAIn + Ma1N mAIn Ma1N mAIn Ma1N mAIn + Ma1N mAIn Ma1N mAIn Ma1N mAIn + Ma1N mAIn Ma1N mAIn Ma1N mAIn + Ma1N mAIn Ma1N mAIn Ma1N mAIn + Ma1N Ma1n ma1N + ma1N ma1N ma1N + ma1N ma1N ma1N ma1N ma1N ma1N + ma1N ma1N ma1N ma1N + ma1N ma1N Main MAin + mA1N maiN ma1N Main mAIN Main MAIn MAIN + mAIn Ma1N MAIN mAin ma1N + MaiN MAIN main MaIN malN + Main main MaIn Main mAIN + mA1N maiN MalN Ma1N MAiN + maIn mAln main ma1N + MA1n Ma1N MAiN ma1n + mAln main ma1N MA1n + mAin MAln Ma1N + mA1n MAiN ma1n mAln + main MAln mAin ma1N + ma1N ma1N MAln Ma1N mA1n MAiN maIn + mAln main MAln + Ma1N MAiN ma1n + mAln main ma1N MA1n mAin MAln + Ma1N mA1n MAiN + ma1n mAln main + MAln mAin ma1N + ma1N ma1N ma1N + ma1N ma1N Maln + main mA1N MAiN + ma1n mAln main + MAln mAin ma1N + MA1n MAiN maIn + mAln main MAln + Ma1N MAiN ma1n + mAln main ma1N MA1n + mAin MAln + Ma1N mA1n + MAiN ma1n + mAln main + MAln mAin + ma1N ma1N + ma1N ma1N + Main MAIn diff --git a/1995/heathbar.hint b/1995/heathbar.hint new file mode 100644 index 000000000..77a2366ca --- /dev/null +++ b/1995/heathbar.hint @@ -0,0 +1,54 @@ +Best Layout: + + Heather Downs, Selene Makarios + The Software Bungalow + 900 High School Way, #2202 + Mountain View, CA 94041 + USA + + +Judges' comments: + + To use: + make heathbar + + To run: + heathbar 4253 2281 + + The main reason we liked this entry was mainly because the main + effect of the source was self documenting! :-) + + +Selected Author's comments: + + Run this program with two non-negative integer arguments + (e.g. "prog 1234 999"). + + My goal was to create the fastest possible C program. To that + end, I made three critical observations: + + 1. If there's one thing computers are good at, it's math. + 2. Simple operations take less time than complicated ones. + 3. Every C program seems to contain the word "main". + + Based on #1, I knew that the Fastest Program had to be one that + performed addition. From #2, I reasoned that it ought to directly + manipulate the bits, rather than wasting time dealing with bloated, + high-level, fuzzy-logic, artificial-intelligence, neural-net, + client-server, object-oriented abstractions like the C language "+" + operator. And it was obvious from #3 that the program should + resemble, as closely as possible, a long sequence of the familiar + word "main" repeated over and over, so the computer would be + comfortable running the program and wouldn't get distracted dealing + with unfamiliar variable names. + + Also, I've looked at some past winning entries of your contest, and + if you don't mind a little constructive criticsm, some of them are + kind-of hard to figure out. I didn't want my program to fall into + the same trap, so I went out of my way to write self-documenting + code. Anyone who so much as glances at my program will immediately + see that it adds two 16-bit unsigned integers by streaming their + bits through a simulated cascade of hardware adders. I hope my + diligent effort to write especially clear code gets me extra points! + + P.S. What does "obfuscated" mean? diff --git a/1995/leo.c b/1995/leo.c new file mode 100644 index 000000000..61565008e --- /dev/null +++ b/1995/leo.c @@ -0,0 +1,94 @@ +#include +#include +#include + +#define N O-> +#define Li(V,K)[(K)*Ga/32+V/32] +#define Mg(P,V,K)(P Li(V,K)>>(V&31)&1) +#define H(P,V,K)(P Li(V,K)|=1<<(V&31)) +#define U(P)calloc(P,1) +#define Au(V,K)Al[K|N U+V+V-1&7] +#define Ti(V,I,K,Y)((V^I&&K^Y&&I=Li/2)+(V>D[P],Au(P,8)>>D[P], N V, N K)) + + Ar *U, *Au, W, Li, F; + +Mo Al[27]; + +S +{ + Ar V, K, U, T; + S *H; +} +*C, *Zn; + +S * +Zr (Mo V, Mo K, Mo T) +{ + S *O = C, *W = Zn; + *(Mg(U, V, K)?&W:&O)=0; + while (O) + O = (W = !N T || (N T &= -!!(N V - V | N K - K | !(T - N T ^ 1))) ? O : 0) ? N H : 0; + return W; +} + +void +Ag (Mo V, Mo K, Mo P, Mo T, S * O) +{ + S *H = (O ? N H : C); + *(H ? &O : &Zn) = O = *(O ? &N H : &C) = U (sizeof (S)); + N U = P; N T = T; N H = H; N V = V; N K = K; + F & 32 || H(U, V, K); +} + +void +main (Mo V, char ** O) +{ + char *H, Sg[106]; + srand (time (0)); + + while (*++O && (sscanf (*O, "%lu", W ? &Li : &W) || + (--**O, F |= !((**O - 57) % 14) << (**O - 57) / 14)) + ); + + puts("%!\n/S{ 0 setlinewidth} /N{ showpage} /O{ moveto rlineto stroke} def def def S"); + for (V = 0; V < 8; Al[8 | (V - 2) & 7] = Al[V] = !!(V & 3) * (1 - (V & 4) / 2) * 4, V++); + do + { + U = U (V = (As * Ga + 31) / 8); + Au = U (V); + for (*U = -W-1, H = U(W); ++*U; H[*U+W] = Mn); + + + Ag (Ga / 2, As / 2, 5, 1, C); + Ag (Ga / 2, As / 2, 1, 1, C); + + while (C) { + Ar I[7], Y[5], D[13]; + S *Ge, *O = C; + + if (N T) + { + D[8] = (F & 4 ? Mn : W ? H[N T % W] : (N T & 85) % 3); + W ((!!C>>!C)); + W ((!!C<> 1) | F & 1)); +} diff --git a/1995/leo.hint b/1995/leo.hint new file mode 100644 index 000000000..9c4aa6b29 --- /dev/null +++ b/1995/leo.hint @@ -0,0 +1,216 @@ +Best Use of Obfuscation: + + Leonid A. Broukhis + 46728 Crawford St., apt. 20 + Fremont, CA 94539 + USA + + +Judges' comments: + + To use: + make leo + + Try: + leo 1 | cat - /dev/tty | gs - + leo 37 80 | cat - /dev/tty | gs - + + Press return after each image is drawn. + + The variable names are element-ary. If you find this confusing, + remember that it is nu-clear. :-) + + Some Ghostscripts/Postscript programs cleared the screen right after + the image is drawn, so we added element 106 which acts as an input + buffer. The original version may be found in leo.orig.c. + + + If you don't have gs or an equivalent postscript viewer, try: + + echo "" | leo 1 > foo.ps + + and send foo.ps to your local postscript printer. + + + To qualify for a category specially for yourself in the Geek code, + find out the all the secret switches that the author doesn't divulge ! + (All switches are single characters on the command line - anything that's + not a number is a candidate) + + +Selected notes from the author: + + The usage is: + + prog.sh [ deep ] [ right ] [ Variable ] [ cycle [ freq ] ] + + where the first three are literal words, `cycle' is a positive + integer (0 is ignored), and `freq' is an integer (default = 0) + supposed to be in range 0..100 (bigger values are allowed, however). + Invalid parameters and options usually stop the command line + parsing (but not always, why?). The actual position of the word + options does not matter, so "prog.sh right Variable 1 70" + is equivalent to "prog.sh 0 0 0 1 Variable 70 right", etc. + + If `Variable' is used, `cycle' is almost ignored (see below) but has + to be present if you want to enter `freq' (and you usually do). + + Some options to try (besides the obvious): + + leo 1 | cat - /dev/tty | gs - + + This draws the basic pattern I invented in high school: + + You take a big sheet of "arithmetic" paper and draw a line + of length 1 (between 2 crossings) it the center of the sheet: + + | + + This makes 2 open ends (I think the notion of an "open end" doesn't + require explanations) in step 1. Now, until there are open ends in step N, + repeat: for each open end pretend it points north and draw 2 lines going + northwest and northeast from it to the nearest crossings. This needs to be + done "simultaneously" for all ends that are open at the moment. + + + Step 2: + \./ + | + / \ + + Step 3: + __| |__ + \./ + | + __ / \ __ + | | + + . + Step 4: \./ \./ + \__| |__/ + / \./ \ + | + \__./ \.__/ + / | | \ + / \./ \ + + + Step 5: + ._| . |_. + __| \./ \./ |__ + \__| |__/ + __./ \./ \.__ + __I | I__ + \__./ \.__/ + __./ | | \.__ + |_./ \./ \._| + | | + +The lines marked by I show the places where "simultaneity" is significant. + + Note that so far all the drawings represent valid + structural formulas of some organic substances. + + step 1: ethane + step 2: 2,3-dimethylbutane + step 3: (2,5-dimethyl;3,4-isopropyl)-hexane + step 4 and 5: I don't know. Do you? + etc. + + Step 6: + \./ \./ \./ \./ + ._| . |_. ._| . |_. + \__| \./ \./ |__/ \__| \./ \./ |__/ + / \__| |__/ \ / \__| |__/ \ + \__./ \./ \.__/ \__./ \./ \.__/ + X__| | |__X or <__| | |__> + / \__./ \.__/ \ / \__./ \.__/ \ + \__./ | | \.__/ \__./ | | \.__/ + / |_./ \./ \._| / |_./ \./ \._| + | | | | + / \ / \ / \ / \ + + depending on the desired "hairiness". The original (paper-based) + algorithm was "hairy", but it didn't look as good on the screen. + + The program cannot handle non-hairy mode 100% correctly - step 6 happens + to be + + |__ + ...__/ ...__/ + ... \ ... \. + ...__/ ...__/|__ + ...__Y and step 7: ...__Y + ... \ ... \ + ...__/ ...__/ + \ \.__ + | + + and so on: the horisontal symmetry has been lost. That's why + the opening for step 1 is not a single line but a cross: + + \./ + / \ + + + To watch it repeatedly (as a screen saver), use: + + leo 2 | cat - /dev/tty | gs - + + The command line: + + leo Variable 1 | cat - /dev/tty | gs - + + This draws the same as above. Try: + + leo Variable 1 1 | cat - /dev/tty | gs - + + what happened to the picture? Increase `freq' and watch the changes. + + If `cycle' is more than 1, the program loops, allowing the user to + enjoy randomly changing patterns (the delay is 3 sec), + but there is a secret switch to suppress looping : useful + if you want to pipe the output to a printer. + + uudecode the spoiler below if you really want to know. +begin 664 spoiler1 +M*%1H92!C;VQO;B J:7,J('1H92!S96-R970@ 1. To figure out what difference + `cycle' makes when `Variable' is not used, try + + leo Variable 37 80 | cat - /dev/tty | gs - + + and other values of `cycle'; smaller values usually require + smaller values of `freq' for the patterns to be non-trivial + + The options `deep' and `right' make the patterns to be drawn in different + manners. Try all the examples above with `deep' and with `right'. + What is the difference between them? + + ...There is a little flaw in the implementation of the algorithm, + and sometimes the patterns are not symmetrical when they ought to be + (the program needs to be slightly changed to expose the flaw, + otherwise it is hardly noticeable, if ever). + + A quick and dirty fix (turned on by another secret switch) + makes the patterns symmetrical, but a little too HAIRY. + + + There is one more secret switch (it shall remain nameless), and I don't + even want to explain what it does. You've been warned! + + + * * * + + Special thanks: + + - to PostScript syntax designers for the curly braces; + - to Dmitry Mendeleyev for his periodic table of elements; + - to Hydrogen for having 2 more isotopes. + + diff --git a/1995/leo.orig.c b/1995/leo.orig.c new file mode 100644 index 000000000..62aaaafc1 --- /dev/null +++ b/1995/leo.orig.c @@ -0,0 +1,94 @@ +#include +#include +#include + +#define N O-> +#define Li(V,K)[(K)*Ga/32+V/32] +#define Mg(P,V,K)(P Li(V,K)>>(V&31)&1) +#define H(P,V,K)(P Li(V,K)|=1<<(V&31)) +#define U(P)calloc(P,1) +#define Au(V,K)Al[K|N U+V+V-1&7] +#define Ti(V,I,K,Y)((V^I&&K^Y&&I=Li/2)+(V>D[P],Au(P,8)>>D[P], N V, N K)) + +Ar *U, *Au, W, Li, F, time (); + +Mo Al[27]; + +S +{ + Ar V, K, U, T; + S *H; +} +*C, *Zn; + +S * +Zr (Mo V, Mo K, Mo T) +{ + S *O = C, *W = Zn; + *(Mg(U, V, K)?&W:&O)=0; + while (O) + O = (W = !N T || (N T &= -!!(N V - V | N K - K | !(T - N T ^ 1))) ? O : 0) ? N H : 0; + return W; +} + +void +Ag (Mo V, Mo K, Mo P, Mo T, S * O) +{ + S *H = (O ? N H : C); + *(H ? &O : &Zn) = O = *(O ? &N H : &C) = U (sizeof (S)); + N U = P; N T = T; N H = H; N V = V; N K = K; + F & 32 || H(U, V, K); +} + +void +main (Mo V, char ** O) +{ + char *H; + srand (time (0)); + + while (*++O && (sscanf (*O, "%lu", W ? &Li : &W) || + (--**O, F |= !((**O - 57) % 14) << (**O - 57) / 14)) + ); + + puts("%!\n/S{ 0 setlinewidth} /N{ showpage} /O{ moveto rlineto stroke} def def def S"); + for (V = 0; V < 8; Al[8 | (V - 2) & 7] = Al[V] = !!(V & 3) * (1 - (V & 4) / 2) * 4, V++); + do + { + U = U (V = (As * Ga + 31) / 8); + Au = U (V); + for (*U = -W-1, H = U(W); ++*U; H[*U+W] = Mn); + + + Ag (Ga / 2, As / 2, 5, 1, C); + Ag (Ga / 2, As / 2, 1, 1, C); + + while (C) { + Ar I[7], Y[5], D[13]; + S *Ge, *O = C; + + if (N T) + { + D[8] = (F & 4 ? Mn : W ? H[N T % W] : (N T & 85) % 3); + W ((!!C>>!C)); + W ((!!C<> 1) | F & 1)); +} diff --git a/1995/makarios.c b/1995/makarios.c new file mode 100644 index 000000000..5379b47b5 --- /dev/null +++ b/1995/makarios.c @@ -0,0 +1,2 @@ +main(n,i,a,m){while(i=++n) +for(a=0;a +#include +#include +#include +#include + +/* logic */ +#ifndef TRUE +# define TRUE 1 +#endif /* TRUE */ +#ifndef FALSE +# define FALSE 0 +#endif /* FALSE */ +#define EOF_OK TRUE +#define EOF_NOT_OK FALSE + +/* global limits */ +#define RULE_YEAR 1995 /* NOTE: should match the current year */ +#define START_DATE "4Mar92 0:00 UTC" /* first confirmation received */ +#define MAX_COL 79 /* max column a line should hit */ +#define MAX_BUILD_SIZE 256 /* max how to build size */ +#define MAX_PROGRAM_SIZE 3217 /* max program source size */ +#define MAX_PROGRAM_SIZE2 1536 /* max program source size not counting + whitespace and {}; not followed by + whitespace or EOF */ +#define MAX_TITLE_LEN 12 /* max chars in the title */ +#define MAX_ENTRY_LEN 1 /* max length in the entry input line */ +#define MAX_ENTRY 8 /* max number of entries per person per year */ +#define MAX_FILE_LEN 1024 /* max filename length for a info file */ + +/* where to send entries */ +#define ENTRY_ADDR1 "...!{apple,sun,uunet}!hoptoad!obfuscate" +#define ENTRY_ADDR2 "obfuscate@toad.com" + +/* uuencode process - assumes ASCII */ +#define UUENCODE(c) ((c) ? encode_str[(int)(c)&0x3f] : '`') +#define UUENCODE_LEN 45 /* max uuencode chunk size */ +#define UUINFO_MODE 0444 /* mode of an info file's uuencode file */ +#define UUBUILD_MODE 0444 /* mode of the build file's uuencode file */ +#define UUBUILD_NAME "build" /* name for the build file's uuencode file */ +#define UUPROG_MODE 0444 /* mode of the program's uuencode file */ +#define UUPROG_NAME "prog.c" /* name for the program's uuencode file */ + +/* encode_str[(char)val] is the uuencoded character of val */ +char encode_str[] = "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"; + +/* global declarations */ +char *program; /* our name */ +long start_time; /* the startup time */ + +/* forward declarations */ +void parse_args(); +void usage(); +FILE *open_remark(); +FILE *open_build(); +FILE *open_program(); +FILE *open_output(); +void output_entry(); +void output_remark(); +void output_author(); +void output_info(); +void output_build(); +void output_program(); +void output_end(); +int get_line(); +void output_till_dot(); +int col_len(); +void check_io(); +void uuencode(); + +main(argc, argv) + int argc; /* arg count */ + char **argv; /* the args */ +{ + FILE *remark=NULL; /* open remarks stream */ + FILE *build=NULL; /* open build file stream */ + FILE *prog=NULL; /* open program stream */ + FILE *output=NULL; /* open output stream */ + char *rname=NULL; /* file with remarks about the entry */ + char *bname=NULL; /* file containing how prog.c should be built */ + char *pname=NULL; /* the obfuscated program source file */ + char *oname=NULL; /* ioccc entry output file */ + struct tm *tm; /* startup time structure */ + + /* + * check on the year + */ + start_time = time((long *)0); + tm = gmtime(&start_time); + if (tm->tm_year != RULE_YEAR-1900) { + fprintf(stderr, + "%s: WARNING: this program applies to %d, which may differ from %d\n\n", + argv[0], RULE_YEAR, 1900+tm->tm_year); + } + + /* + * parse the command line args + */ + parse_args(argc, argv, &rname, &bname, &pname, &oname); + + /* + * open/check the input and output files + * + * We open and truncate the output file first, in case it is the same + * as one of the input files. + */ + output = open_output(oname); + remark = open_remark(rname); + build = open_build(bname); + prog = open_program(pname); + if (output==NULL || remark==NULL || build==NULL || prog==NULL) { + exit(1); + } + + /* + * output each section + */ + output_entry(output, oname); + output_remark(output, oname, remark, rname); + output_author(output, oname); + output_info(output, oname); + output_build(output, oname, build, bname); + output_program(output, oname, prog, pname); + output_end(output, oname); + + /* + * flush the output + */ + if (fflush(output) == EOF) { + fprintf(stderr, "%s: flush error in %s: ", program, oname); + perror(""); + exit(2); + } + + /* + * final words + */ + printf("\nYour entry can be found in %s. You should check this file\n", + oname); + printf("correct any problems and verify that the uudecode utility will\n"); + printf("correctly decode your build file and program.\n\n"); + printf("This program has been provided as a guide for submitters. In\n"); + printf("cases where it conflicts with the rules, the rules shall apply.\n"); + printf("It is your responsibility to ensure that your entry conforms to\n"); + printf("the current rules.\n\n"); + printf("EMail your entries to:\n"); + printf("\t%s\n", ENTRY_ADDR1); + printf("\t%s\n\n", ENTRY_ADDR2); + printf("Please use the following subject when you EMail your entry:\n"); + printf("\tioccc entry\n\n"); + /* all done */ + exit(0); +} + +/* + * parse_args - parse the command line args + * + * Given the command line args, this function parses them and sets the + * required name flags. This function will return only if the command + * line syntax is correct. + */ +void +parse_args(argc, argv, rname, bname, pname, oname) + int argc; /* arg count */ + char **argv; /* the args */ + char **rname; /* file with remarks about the entry */ + char **bname; /* file containing how prog.c should be built */ + char **pname; /* the obfuscated program source file */ + char **oname; /* ioccc entry output file */ +{ + char *optarg; /* -flag option operand */ + int flagname; /* the name of the -flag */ + int i; + + /* + * Not everyone has getopt, so we must parse args by hand. + */ + program = argv[0]; + for (i=1; i < argc; ++i) { + + /* determine the flagname */ + if (argv[i][0] != '-') { + usage(1); + /*NOTREACHED*/ + } + flagname = (int)argv[i][1]; + + /* determine the flag's operand */ + if (flagname != '\0' && argv[i][2] != '\0') { + optarg = &argv[i][2]; + } else { + if (i+1 >= argc) { + usage(2); + /*NOTREACHED*/ + } else { + optarg = argv[++i]; + } + } + + /* save the flag's operand in the correct global variable */ + switch (flagname) { + case 'r': + *rname = optarg; + break; + case 'b': + *bname = optarg; + break; + case 'p': + *pname = optarg; + break; + case 'o': + *oname = optarg; + break; + default: + usage(3); + /*NOTREACHED*/ + } + } + + /* + * verify that we have all of the required flags + */ + if (*rname == NULL || *bname == NULL || *pname == NULL || *oname == NULL) { + usage(4); + /*NOTREACHED*/ + } + return; +} + +/* + * usage - print a usage message and exit + * + * This function does not return. + */ +void +usage(exitval) + int exitval; /* exit with this value */ +{ + fprintf(stderr, + "usage: %s -r remarks -b build -p prog.c -o ioccc.entry\n\n", program); + fprintf(stderr, "\t-r remarks\tfile with remarks about the entry\n"); + fprintf(stderr, "\t-b build\tfile containing how prog.c should be built\n"); + fprintf(stderr, "\t-p prog.c\tthe obfuscated program source file\n"); + fprintf(stderr, "\t-o ioccc.entry\tioccc entry output file\n"); + exit(exitval); +} + +/* + * open_remark - open/check the remark file + * + * The remark file should be indented by 4 spaces, and should not extend + * beyond column MAX_COL. These are not requirements, so we only warn. + * + * This function returns NULL on I/O or format error. + */ +FILE * +open_remark(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + char buf[BUFSIZ+1]; /* input buffer */ + int toolong=0; /* number of lines that are too long */ + int non_indent=0; /* number of lines not indented by 4 spaces */ + + /* + * open the remark input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open remark file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * look at each line + */ + while (fgets(buf, BUFSIZ, stream) != NULL) { + + /* count lines that do not start with 4 spaces */ + if (buf[0] != '\n' && strncmp(buf, " ", 4) != 0) { + ++non_indent; + } + + /* count long lines */ + if (col_len(buf) > MAX_COL) { + /* found a line that is too long */ + ++toolong; + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* note long lines if needed */ + if (toolong > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s extend beyond the 80th column\n", + program, toolong, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* note non-indented lines, if needed */ + if (non_indent > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s are not indented by 4 spaces\n", + program, non_indent, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_build - open/check the build file + * + * The how to build file must not be longer than MAX_BUILD_SIZE bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_build(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + + /* + * open the how to build input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_BUILD_SIZE) { + fprintf(stderr, + "%s: FATAL: the how to build file: %s, is %d bytes long\n", + program, filename, statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_BUILD_SIZE); + return(NULL); + } + + /* return the open file */ + return(stream); +} + +/* + * open_program - open/check the program source file + * + * The program source file must be <= 3217 bytes. The number of + * non-whitespace and }{; chars not followed by whitespace must + * be <= 1536 bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_program(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + int count; /* special count size */ + int c; /* the character read */ + + /* + * open the program source input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open program source file: %s: ", + program, filename); + perror(""); + exit(7); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat program source file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_PROGRAM_SIZE) { + fprintf(stderr, + "%s: FATAL: the program source file: %s, is %d bytes long\n", + program, filename, statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_PROGRAM_SIZE); + return(NULL); + } + + /* + * count the non-whitespace, non {}; followed by whitespace chars + */ + count = 0; + c = 0; + while ((c=fgetc(stream)) != EOF) { + /* look at non-whitespace */ + if (!isascii(c) || !isspace(c)) { + switch (c) { + case '{': /* count if not followed by EOF or whitespace */ + case '}': + case ';': + /* peek at next char */ + c = fgetc(stream); + if (c != EOF && isascii(c) && !isspace(c)) { + /* not followed by whitespace or EOF, count it */ + ungetc(c, stream); + ++count; + } + break; + default: + ++count; + break; + } + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* look at the special size */ + if (count > MAX_PROGRAM_SIZE2) { + fprintf(stderr, + "%s: FATAL: the number of bytes that are non-whitespace, and\n", + program); + fprintf(stderr, + "%s: that are not '{', '}', ';' followed by whitespace\n", + program); + fprintf(stderr, + "%s: or EOF must be <= %d bytes\n", + program, MAX_PROGRAM_SIZE2); + fprintf(stderr, + "%s: in %s, %d bytes were found\n", + program, filename, count); + return(NULL); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_output - open/check the entry output file + * + * This function returns NULL on open error. + */ +FILE * +open_output(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + + /* + * open the ioccc entry output file + */ + stream = fopen(filename, "w"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open ioccc entry file for output: %s: ", + program, filename); + perror(""); + exit(8); + } + + /* return the open file */ + return(stream); +} + +/* + * output_entry - output the ---entry--- section + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_entry(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + char title[MAX_TITLE_LEN+1+1]; /* the entry's title */ + char buf[MAX_COL+1+1]; /* I/O buffer */ + int entry=0; /* entry number */ + int ret; /* fields processed by fscanf */ + int ok_line=0; /* 0 => the line is not ok */ + char skip; /* input to skip */ + FILE *date_pipe; /* pipe to a date command */ + time_t epoch_sec; /* seconds since the epoch */ + char *p; + + /* + * write the start of the section + */ + fprintf(output, "---entry---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the rule year + */ + fprintf(output, "rule:\t%d-1\n", RULE_YEAR); + check_io(output, oname, EOF_NOT_OK); + + /* determine if this is a fix */ + printf("Is this a fix, update or resubmittion to a "); + printf("previous entry (enter y or n)? "); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + if (buf[0] == 'y') { + fprintf(output, "fix:\ty\n"); + check_io(output, oname, EOF_NOT_OK); + printf("\nBe sure that the title and entry number that you give\n"); + printf("are the same of as the entry you are replacing\n"); + } else { + fprintf(output, "fix:\tn\n"); + check_io(output, oname, EOF_NOT_OK); + } + + /* + * write the title + */ + printf("\nYour title must match expression be a [a-zA-Z0-9_=] character\n"); + printf("followed by 0 to %d more [a-zA-Z0-9_=+-] characters.\n\n", + MAX_TITLE_LEN-1); + printf("It is suggested, but not required, that the title should\n"); + printf("incorporate your username; in the\n"); + printf("case of multiple authors, consider using parts of the usernames\n"); + printf("of the authors.\n\n"); + printf("enter your title: "); + do { + /* prompt and read a line */ + if ((ok_line = get_line(title, MAX_TITLE_LEN+1, MAX_COL-9)) <= 0) { + printf("\ntitle is too long, please re-enter: "); + continue; + } + + /* verify the pattern, not everyone has regexp, so do it by hand */ + if (!isascii((int)title[0]) || + !(isalnum((int)title[0]) || title[0] == '_' || title[0] == '=')) { + printf("\ninvalid first character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } else { + for (p=(&title[1]); *p != '\0' && *p != '\n'; ++p) { + if (!isascii((int)*p) || + !(isalnum((int)*p) || + *p == '_' || *p == '=' || *p == '+' || *p == '-')) { + printf("\ninvalid character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } + } + } + } while (ok_line <= 0); + fprintf(output, "title:\t%s", title); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the entry number + */ + printf("\nEach person may submit up to %d entries per year.\n\n", + MAX_ENTRY); + printf("enter an entry number from 0 to %d inclusive: ", MAX_ENTRY-1); + do { + /* get a valid input line */ + fflush(stdout); + ret = fscanf(stdin, "%d[\n]", &entry); + check_io(stdin, "stdin", EOF_NOT_OK); + /* skip over input until newline is found */ + do { + skip = fgetc(stdin); + check_io(stdin, "stdin", EOF_NOT_OK); + if (skip != '\n') { + /* bad text in input, invalidate entry number */ + entry = -1; + } + } while (skip != '\n'); + + /* check if we have a number, and if it is in range */ + if (ret != 1 || entry < 0 || entry > MAX_ENTRY-1) { + printf( + "\nThe entry number must be between 0 and %d inclusive\n\n", + MAX_ENTRY-1); + printf("enter the entry number: "); + } + } while (ret != 1 || entry < 0 || entry > MAX_ENTRY-1); + fprintf(output, "entry:\t%d\n", entry); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the submission date + */ + /* returns a newline */ + epoch_sec = time(NULL); + fprintf(output, "date:\t%s", asctime(gmtime(&epoch_sec))); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the OS/machine host information + */ + printf( + "\nEnter the machine(s) and OS(s) under which your entry was tested.\n"); + output_till_dot(output, oname, "host:"); +} + +/* + * output_remark - output the ---remark--- section + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_remark(output, oname, remark, rname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + FILE *remark; /* stream to the file containing remark text */ + char *rname; /* name of the remark file */ +{ + char buf[BUFSIZ+1]; /* input/output buffer */ + + /* + * write the start of the section + */ + fprintf(output, "---remark---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * copy the remark file to the section + */ + while (fgets(buf, BUFSIZ, remark) != NULL) { + fputs(buf, output); + check_io(output, oname, EOF_NOT_OK); + } + check_io(remark, rname, EOF_OK); + + /* be sure that the remark section ends with a newline */ + if (buf[strlen(buf)-1] != '\n') { + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + } +} + +/* + * output_author - output the ---author--- section + * + * Read the needed information from stdin, and write the author section. + * If multiple authors exist, multiple author sections will be written. + */ +void +output_author(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + char buf[MAX_COL+1+1]; /* I/O buffer */ + int more_auths; /* TRUE => more authors to note */ + int auth_cnt=0; /* number of authors processed */ + + /* + * prompt the user for the author section + */ + printf("\nEnter information about each author. If your entry is after\n"); + printf("%s and before the contest deadline, the judges\n", START_DATE); + printf("will attempt to EMail back a confirmation to the first author\n"); + + /* + * place author information for each author in an individual section + */ + do { + + /* write the start of the section */ + fprintf(output, "---author---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* write the author */ + printf("\nAuthor #%d name: ", ++auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nname too long, please re-enter: "); + } + fprintf(output, "name:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the organization */ + printf("\nEnter the School/Company/Organization of author #%d\n", + auth_cnt); + printf("\nAuthor #%d org: ", auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter: "); + } + fprintf(output, "org:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the address */ + printf( + "\nEnter the postal address for author #%d. Be sure to include\n", + auth_cnt); + printf("your country and do not include your name.\n"); + output_till_dot(output, oname, "addr:"); + + /* write the EMail address */ + printf( + "\nEnter the EMail address for author #%d. Use an address from\n", + auth_cnt); + printf( + "a registered domain or well known site. If you give several\n"); + printf("forms, list them one per line.\n"); + output_till_dot(output, oname, "email:"); + + /* write the anonymous status */ + printf("\nShould author #%d remain anonymous (enter y or n)? ", + auth_cnt); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + fprintf(output, "anon:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* determine if there is another author */ + printf("\nIs there another author (enter y or n)? "); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + if (buf[0] == 'y') { + more_auths = TRUE; + } else { + more_auths = FALSE; + } + } while (more_auths == TRUE); + return; +} + +/* + * output_info - output the ---info--- section(s) + * + * Read the needed information from stdin, and write the info section. + * If multiple info files exist, multiple info sections will be written. + */ +void +output_info(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + char infoname[MAX_FILE_LEN+1]; /* filename buffer */ + char yorn[1+1]; /* y or n answer */ + char *uuname; /* name to uuencode as */ + FILE *infile; /* info file stream */ + + /* + * prompt the user for info information + */ + printf("\nInfo files should be used only to supplement your entry.\n"); + printf("For example, info files may provide sample input or detailed\n"); + printf("information about your entry. Because they are supplemental,\n"); + printf("the entry should not require them to exist.\n\n"); + + /* + * while there is another info file to save, uuencode it + */ + printf("Do you have a info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + while (yorn[0] == 'y') { + + /* read the filename */ + printf("\nEnter the info filename: "); + while (get_line(infoname, MAX_FILE_LEN+1, 0) <= 0) { + printf("\nInfo filename too long, please re-enter: "); + } + + /* compute the basename of the info filename */ + /* remove the trailing newline */ + uuname = &infoname[strlen(infoname)-1]; + *uuname = '\0'; + /* avoid rindex/shrrchr compat issues, do it by hand */ + for (--uuname; uuname > infoname; --uuname) { + if (*uuname == '/') { + ++uuname; + break; + } + } + + /* attempt to open the info file */ + infile = fopen(infoname, "r"); + if (infile == NULL) { + fprintf(stderr, "\n%s: cannot open info file: %s: ", + program, infoname); + perror(""); + continue; + } + + /* + * write the start of the section + */ + fprintf(output, "---info---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* uuencode the info file */ + uuencode(output, oname, infile, infoname, UUINFO_MODE, uuname); + + printf("\nDo you have another info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + }; + return; +} + +/* + * output_build - output the ---build--- section + * + * Read the needed information from stdin, and write the build section. + */ +void +output_build(output, oname, build, bname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + FILE *build; /* open build file stream */ + char *bname; /* name of the build file */ +{ + /* + * write the start of the section + */ + fprintf(output, "---build---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, build, bname, UUBUILD_MODE, UUBUILD_NAME); + return; +} + +/* + * output_program - output the ---program--- section + * + * Read the needed information form stdin, and write the program section. + */ +void +output_program(output, oname, prog, pname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + FILE *prog; /* open program stream */ + char *pname; /* name of program file */ +{ + /* + * write the start of the section + */ + fprintf(output, "---program---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, prog, pname, UUPROG_MODE, UUPROG_NAME); + return; +} + +/* + * output_end - output the ---end--- section + * + * Read the needed information form stdin, and write the 'end section'. + */ +void +output_end(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + /* + * write the final section terminator + */ + fprintf(output, "---end---\n"); + check_io(output, oname, EOF_NOT_OK); + return; +} + +/* + * get_line - get an answer from stdin + * + * This function will flush stdout, in case a prompt is pending, and + * read in the answer. + * + * This function returns 0 if the line is too long, of the length of the + * line (including the newline) of the line was ok. This function does + * not return if ERROR or EOF. + */ +int +get_line(buf, siz, maxcol) + char *buf; /* input buffer */ + int siz; /* length of input, including the newline */ + int maxcol; /* max col allowed, 0 => disable check */ +{ + int length; /* the length of the input line */ + + /* flush terminal output */ + fflush(stdout); + + /* read the line */ + if (fgets(buf, siz+1, stdin) == NULL) { + /* report the problem */ + check_io(stdin, "stdin", EOF_NOT_OK); + } + + /* look for the newline */ + length = strlen(buf); + if (buf[length-1] != '\n') { + int eatchar; /* the char being eaten */ + + /* no newline found, line must be too long, eat the rest of the line */ + do { + eatchar = fgetc(stdin); + } while (eatchar != EOF && eatchar != '\n'); + check_io(stdin, "stdin", EOF_NOT_OK); + + /* report the situation */ + return 0; + } + + /* watch for long lines, if needed */ + if (maxcol > 0 && (length > maxcol || col_len(buf) > maxcol)) { + /* report the situation */ + return 0; + } + + /* return length */ + return length; +} + +/* + * output_till_dot - output a set of lines until '.' by itself is read + * + * This routine will read a set of lines until (but not including) + * a single line with '.' is read. The format of the output is: + * + * leader:\tfirst line + * \tnext line + * \tnext line + * ... + * + * This routine will not return if I/O error or EOF. + */ +void +output_till_dot(output, oname, leader) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + char *leader; /* the lead text for the first line */ +{ + char buf[BUFSIZ+1]; /* input buffer */ + int count; /* lines read */ + int done=FALSE; /* TRUE => finished reading input */ + + /* instruct the user on how to input */ + printf("\nTo end input, enter a line with a single period.\n"); + + /* read lines until '.' or EOF */ + count = 0; + while (!done) { + /* issue the prompt */ + printf("%s\t", (count>0) ? "" : leader); + fflush(stdout); + + /* get the line */ + if (get_line(buf, BUFSIZ, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter:\n\t"); + continue; + } + + /* note if '.' was read */ + if (strcmp(buf, ".\n") == 0) { + done = TRUE; + } + + /* write line if we read something */ + if (!done) { + fprintf(output, "%s\t%s", (count++>0) ? "" : leader, buf); + check_io(output, oname, EOF_NOT_OK); + } + } + + /* if no lines read, at least output something */ + if (count <= 0) { + fprintf(output, "%s\t.\n", leader); + check_io(output, oname, EOF_NOT_OK); + } + return; +} + +/* + * col_len - determine the highest that a string would reach + * + * Given a string, this routine returns that a string would reach + * if the string were printed at column 1. Tab stops are assumed + * to start at 9, 17, 25, 33, ... + */ +int +col_len(string) + char *string; /* the string to examine */ +{ + int col; /* current column */ + char *p; /* current char */ + + /* scan the string */ + for (col=0, p=string; *p != '\0' && *p != '\n'; ++p) { + /* note the column shift */ + col = (*p=='\t') ? 1+((col+8)/8*8) : col+1; + } + if (*p == '\n') { + --col; + } + + /* return the highest column */ + return col; +} + +/* + * check_io - check for EOF or I/O error on a stream + * + * Does not return if EOF or I/O error. + */ +void +check_io(stream, name, eof_ok) + FILE *stream; /* the stream to check */ + char *name; /* the name of this stream */ + int eof_ok; /* EOF_OK or EOF_NOT_OK */ +{ + /* test for I/O error */ + if (ferror(stream)) { + fprintf(stderr, "%s: error on %s: ", program, name); + perror(""); + exit(1); + + /* test for EOF */ + } else if (eof_ok == EOF_NOT_OK && feof(stream)) { + fprintf(stderr, "%s: EOF on %s\n", program, name); + exit(1); + } + return; +} + +/* + * uuencode - uuencode a file + * + * Perform the uuencoding process identical to the process performed + * by the uuencode(1) utility. + * + * This routine implements the algorithm described in the uuencode(5) + * 4.3BSD Reno man page. + */ +void +uuencode(output, oname, infile, iname, umode, uname) + FILE *output; /* output file stream */ + char *oname; /* output filename */ + FILE *infile; /* input file stream */ + char *iname; /* input filename */ + int umode; /* the mode to put on the uuencode file */ + char *uname; /* name to put on the uuencode file */ +{ + char buf[UUENCODE_LEN+1]; /* the uuencode buffer */ + int read_len; /* actual number of chars read */ + int val; /* 6 bit chunk from buf */ + char filler='\0'; /* filler uuencode pad text */ + char *p; + + /* + * output the initial uuencode header + */ + fprintf(output, "begin %o %s\n", umode, uname); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + + /* + * We will process UUENCODE_LEN chars at a time, forming + * a single output line each time. + */ + while ((read_len=fread(buf,sizeof(buf[0]),UUENCODE_LEN,infile)) > 0) { + + /* + * the first character is the length character + */ + fputc(UUENCODE(read_len), output); + check_io(output, oname, EOF_NOT_OK); + + /* + * We will convert 24 bits at a time. Thus we will convert + * 3 sets of 8 bits into 4 sets of uuencoded 6 bits. + */ + for (p=buf; read_len>0; read_len-=3, p+=3) { + + /* bits 0 to 5 */ + val = (p[0]>>2)&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 6 to 11 */ + val = ((p[0]<<4)&0x30) | ((p[1]>>4)&0x0f); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 12 to 17 */ + val = ((p[1]<<2)&0x3c) | ((p[2]>>6)&0x03); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 18 to 23 */ + val = p[2]&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + } + + /* end of UUENCODE_LEN line */ + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer (don't depend on bzero() or memset()) + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + } + + /* check the last read on the input file */ + check_io(infile, iname, EOF_OK); + + /* write end of uuencode file */ + fprintf(output, "%c\nend\n", UUENCODE(filler)); + check_io(output, oname, EOF_NOT_OK); +} diff --git a/1995/rules b/1995/rules new file mode 100644 index 000000000..ac3dbf60c --- /dev/null +++ b/1995/rules @@ -0,0 +1,213 @@ +12th International Obfuscated C Code Contest Rules | + +Copyright (c) Landon Curt Noll, Larry Bassel and Sriram Srinivasan, 1995. | +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from Landon Curt Noll, Larry Bassel and Sriram Srinivasan. | + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: his emotions obfuscated his + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show the importance of programming style, in an ironic way. + * To stress C compilers with unusual code. + * To illustrate some of the subtleties of the C language. + * To provide a safe forum for poor C code. :-) + + +NOTE: Some if the changes from the 1994 rules are denoted by change bars. ---> | +NOTE: The original 1995 mkentry.c contained a bug. We have remained this | + rule set 1995-1 to distinguish it from the previous set. | + + +RULES: + + To help us with the volume of entries, we ask that you follow these rules: + + 1) Your entry must be a complete program. + + 2) Your entry must be <= 3217 bytes in length. The number of characters + excluding whitespace (tab, space, newline), and excluding any ; { or } + immediately followed by whitespace or end of file, must be <= 1536. | + + 3) Your entry must be submitted in the following format: + +---entry--- +rule: 1995-1 | +fix: y or n (n => this is a new entry, y => this replaces an older entry) +title: title of entry (see comments below) +entry: Entry number from 0 to 7 inclusive (your 1st entry should by 0) +date: Date/time of submission in UTC (see comments below) +host: Machine(s) and OS(s) under which your entry was tested + Use tab indented lines if needed +---remark--- + Place remarks about this entry in this section. It would be helpful if + you were to indent your remarks with 4 spaces, though it is not a + requirement. Also, if possible, try to avoid going beyond the 79th + column. Blank lines are permitted. +---author--- +name: your name +org: School/Company/Organization +addr: postal address + use tab indented lines to continue + don't forget to include the country +email: EMail address from a well known site or registered domain. + If you give several forms, list them on separate tab indented lines. +anon: y or n (y => remain anonymous, n => OK to publish this info) +---info--- +If your program needs an info file, place a uuencoded copy of it in +this section. In the case of multiple info files, use multiple info +sections. If your entry does not need a info file, skip this section. +---build--- +Place a uuencoded copy of the command(s) used to compile/build your program +in this section. It must uudecode into a file named 'build'. The resulting +file must be 255 bytes or less. +---program--- +Place a uuencoded copy of your program in this section. It must uudecode +into a file named is 'prog.c'. The resulting file must follow rule #2. +---end--- + + Regarding the above format: + + * The title must match the expression: [a-zA-Z0-9_=][a-zA-Z0-9_=+-]* + and must be 1 to 12 characters in length. + + It is suggested, but not required, that the title should | + incorporate the author(s) username(s). | + + * The date in the ---entry--- section should be given with respect + to UTC. The format of the date should be as returned by asctime() + using the C locale. (see guidelines for more info) + + * You may correct/revise a previously submitted entry by sending + it to the contest email address. Be sure to set 'fix' in the + ---entry--- section to 'y'. The corrected entry must use the same + title and entry number as submission that is being corrected. Be | + sure that you note the re-submission in the ---remark--- as well. | + + * With the exception of the header, all text outside of the above + format may be ignored by the judges. If you need to tell the judges | + something, put it in the ---remark--- section, or send a separate + EMail message to the judges. + + * Information from the ---author--- section will be published unless + 'y' was given to the respective author's 'anon' line. + + * To credit multiple authors, include an ---author--- section for + each author. Each should start with ---author--- line, and + should be found between the ---entry--- and ---build--- sections. + + * The entry's remarks should include: + - note if this entry is a re-submission of a previous entry. + - what this program does + - how to run the program (sample args or input) + - special compile or execution instructions, if any + - special filename requirements (see rule 4 and 5) + - information about any ---info--- files + - why you think the program is obfuscated + - any other remarks (humorous or otherwise) + + * Do not rot13 your entry's remarks. You may suggest that certain + portions of your remarks be rot13ed if your entry wins an award. + + * Info files should be used only to supplement your entry. They + should not be required to exist. + + * If your entry does not need an info file, skip the ---info--- + section. If your entry needs multiple info files, use multiple + ---info--- sections, one per info file. You should describe + each info file in the ---remark--- section. + + * Your sections must in the same order as in the above template. + + * Because the original 1995 mkentry.c program contained a bug, | + the rule set was changed to 1995-1. | + + 4) If your entry is selected as a winner, it will be modified as follows: + + 'build' is incorporated into a makefile, and 'build' is removed + 'prog.c' is renamed to your entry's title, followed by an optional + digit, followed by '.c' + your entry is compiled into a file with the name of your entry's + title, possibly followed by a digit + + If your entry requires that a build file exist, state so in your + entry's remark section. The makefile will be arranged to execute a + build shell script containing the 'build' information. The name of + this build shell script will be your entry's title, possibly followed + by a digit, followed by '.sh'. + + If needed, your entry's remarks should indicate how your entry must + be changed in order to deal with the new filenames. + + 5) The build file, the source and the resulting executable should be + treated as read-only files. If your entry needs to modify these files, + it should make and modify a copy of the appropriate file. If this + occurs, state so in your entry's remarks. + + 6) The uudecoded ---program--- section must be able to be compiled | + cleanly by an ANSI C compiler, or if there are any compile errors, | + they must be documented in the ---remark--- section. | + + 7) The program must be of original work. All programs must be in the + public domain. All copyrighted programs will be rejected. + + 8) Entries must be received prior to 08-Dec-95 23:59 UTC. (UTC is | + essentially equivalent to Greenwich Mean Time) EMail your entries to: + + ...!{apple,sun,uunet}!hoptoad!obfuscate | + obfuscate@toad.com + + We request that your message use the subject 'ioccc entry'. + + If possible, we request that you hold off on EMailing your entries + until 19-Oct-95 12:00 UTC. Early entries will be accepted, however. | + We will attempt to EMail a confirmation to the sender of any entry + received after 19-Oct-95 12:00 UTC and before the close of the contest. | + + 9) Each person may submit up to 8 entries per contest year. Each entry + must be sent in a separate EMail letter. + + 10) Entries requiring human interaction to be built are not allowed. | + + 11) Programs that require special privileges (setuid, setgid, super-user, + special owner or group) are not allowed. + + 12) Legal abuse of the rules is somewhat encouraged. An entry that, in + the opinion of the judges, violates the rules will be disqualified. + Entries that attempt to abuse the rules must try to justify why + their rule abuse is legal in the ---remark--- section. + + +FOR MORE INFORMATION: + + The judging will be done by Landon Noll, Larry Bassel and Sriram | + Srinivasan. Please send questions or comments about the contest, to: | + + ...!{apple,sun,uunet}!hoptoad!judges (not the address for | + judges@toad.com submitting entries) + + Comments about confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, send EMail to the address + above and use the subject 'send rules'. + + Check out the IOCCC Web page: | + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). | + + +chongo /\cc/\ {chongo,noll}@{toad,sgi}.com +Larry Bassel labbmf@ix.netcom.com | +Sriram Srinivasan sriram@tcs.com | diff --git a/1995/savastio.c b/1995/savastio.c new file mode 100644 index 000000000..e3d50054e --- /dev/null +++ b/1995/savastio.c @@ -0,0 +1,41 @@ +#include + +#define l11l 0xFFFF +#define ll1 for +#define ll111 if +#define l1l1 unsigned +#define l111 struct +#define lll11 short +#define ll11l long +#define ll1ll putchar +#define l1l1l(l) l=malloc(sizeof(l111 llll1));l->lll1l=1-1;l->ll1l1=1-1; +#define l1ll1 *lllll++=l1ll%10000;l1ll/=10000; +#define l1lll ll111(!l1->lll1l){l1l1l(l1->lll1l);l1->lll1l->ll1l1=l1;}\ +lllll=(l1=l1->lll1l)->lll;ll=1-1; +#define llll 1000 + + + + + l111 llll1 { + l111 llll1 * + lll1l,*ll1l1 ;l1l1 lll11 lll [ + llll];};main (){l111 llll1 *ll11,*l1l,* + l1, *ll1l, * malloc ( ) ; l1l1 ll11l l1ll ; + ll11l l11,ll ,l;l1l1 lll11 *lll1,* lllll; ll1(l + =1-1 ;l< 14; ll1ll("\t\"8)>l\"9!.)>vl" [l]^'L'),++l + );scanf("%d",&l);l1l1l(l1l) l1l1l(ll11 ) (l1=l1l)-> + lll[l1l->lll[1-1] =1]=l11l;ll1(l11 =1+1;l11<=l; + ++l11){l1=ll11; lll1 = (ll1l=( ll11=l1l))-> + lll; lllll =( l1l=l1)->lll; ll=(l1ll=1-1 + );ll1(;ll1l-> lll1l||l11l!= *lll1;){l1ll + +=l11**lll1++ ;l1ll1 ll111 (++ll>llll){ + l1lll lll1=( ll1l =ll1l-> lll1l)->lll; + }}ll1(;l1ll; ){l1ll1 ll111 (++ll>=llll) + { l1lll} } * lllll=l11l;} + ll1(l=(ll=1- 1);(llll[ l] !=l11l);++l); ll1 (;l1;l1= + l1->ll1l1,l= llll){ll1(--l ;l>=1-1;--l, + ++ll)printf( (ll)?((ll%19) ?"%04d":(ll= + 19,"\n%04d") ):"%4d",l1-> lll[l] ) ; } + ll1ll(10); } diff --git a/1995/savastio.hint b/1995/savastio.hint new file mode 100644 index 000000000..79feb5b07 --- /dev/null +++ b/1995/savastio.hint @@ -0,0 +1,54 @@ +Most Obfuscated Syntax: + + Michael Savastio + Securicor Telesciences + 925 1/2 Anchor St, Apt 2 + Philadelphia, PA 19124 + USA + + +Judges' comments: + + To use: + make savastio + + To run: + savastio + + enter a number (such as 100). + + As one judge said: + + I know an l when I see a 1. + + +Selected Author's comments: + + This program is an infinite-precision factorial calculator. It will + compute the factorial of any number entered to an infinite degree of + precision (or the limits of your machine's memory, whichever comes + first). I'd suggest you start with small numbers the first few times + you run it and gradually work your way up in order to get a feel for + the computation time your machine will require. + + Aside from having an artistic code layout and confusing variable names, + the algorithm itself takes advantage of some cute C-isms. Try to + figure out how it prints the prompt "Enter number:". + + Numbers are represented internally by a linked list of blocks each + containing 1000 buckets of 4-digit integers. To further confuse + matters, the buckets are arranged backwards in the block. For example, + the number 8347108947139478934713847134 is represented as: + + 7134 1384 9347 3947 9471 7108 834 + + Platform limitations: + + Long integers must be at least 4 bytes. + + Features: + + In order to prevent the user from wasting too much time computing + useless factorials, the maximum factorial that can be computed is + 429539! This limit was selected through extensive research in + time management studies and the factorial arts. diff --git a/1995/schnitzi.c b/1995/schnitzi.c new file mode 100644 index 000000000..8e9fec4b5 --- /dev/null +++ b/1995/schnitzi.c @@ -0,0 +1 @@ +main(l,i,I)char**i;{l/=!(l>(I=atoi(*++i))||fork()&&main(l+1,i-1)||I%l);return printf("%d\n",l);} diff --git a/1995/schnitzi.hint b/1995/schnitzi.hint new file mode 100644 index 000000000..4041c2148 --- /dev/null +++ b/1995/schnitzi.hint @@ -0,0 +1,32 @@ +Best One Liner: + + Mark Schnitzius + ISX Corporation + 3215-C Post Woods Dr. + Atlanta, GA 30339 + USA + + +Judges' comments: + + To use: + make schnitzi + + Try: + schnitzi 24 + schnitzi 18 + schnitzi 30 + + Sometimes a core dump is a feature, not a bug! + + This is one of the better one-liners we have seen in a while. + Take some time to figure out what it does before you run it! + + +Selected notes from the author: + + Beware, running this program with too high of a number + amounts to doing a fork bomb on your machine! + + + diff --git a/1995/spinellis.c b/1995/spinellis.c new file mode 100644 index 000000000..aef0ae2e6 --- /dev/null +++ b/1995/spinellis.c @@ -0,0 +1,658 @@ +#include +#include +/*; +; + } { + + + } { + } + + { } + + + + { +{ + + +{ { + +} +} { +{ } { + { + { ; + +{ ; + + + +{ + { + { ; + + + + + } { + } } { + +} + +{ + } { +{ +{ +{ { { { { { + + +{ { + +} +} { +{ } { + ; +{ { } } +; +} + ; +{ { ; { +{ } { + { + ; { ; { +{ } + + ; { ; { +{ } { + } ; +{ { ; +; +{ { ; +{ { + + +{ } +{ + + { + { + } +{ + +{ } { +} +} +{ + ; +{ { +{ +{ ; +{ { + + +{ { + { } + { + + ; +{ { ; + ; +{ + + +{ { + + + + { + +} +} { + ; +{ { +} { { + + + +} + + + + } { + +{ { + +} +} { +{ } { + { + { +} { { +{ + } +{ + + { + + } ; +{ { + + + + + + +{ } ; +{ + +{ { + +} +} { +{ } +{ + ; { } + +{ { + { } + { + + { ; +{ + +{ + + + + } { + + } +} + { + + + { + + +{ { +{ + + +{ } ; +{ { + +} +} { +{ } +{ + ; { } + +{ { + { } + { + + { ; + { { + +} +} { +} +} ; { { + { } + ; + + + { ; + +{ { + +} +} { +{ } + + + + { + ; +{ { +{ + + +{ { + +} +} { +{ } + +} + { { { + ; +{ { + + + +; + + + + { + + +; + + +{ + + ; + + { ; + + + + + + + + ; + + + + ; +{ { { { { { + + { + + +{ } + } + +} { + { } { + { + + +} } { + + +{ } { +} +} +{ + ; + + +{ { + +} +} { +{ } { + { + { ; + +{ } } + + + } +{ + { } + + { + { + } +{ } { + { } +} + +{ + } { { { + + + +} + ; +{ { { { { + + { + + +{ } + +} + { } { + { + + } + +} +} { + { +{ + { + +{ + +{ } } + + + } +{ + + + + { } } +{ + ; { + + { { + { +} + + + + +{ +{ } + { ; +{ { { { { + + { + + +{ } } } +{ + } } { ; + +{ { + + + + } + +{ + } +} { } + +} { } + + } +} } +{ +{ { + + +{ + { + ; +{ { { { { + + { + + +{ + + +} +} } } +{ } { + { } + + + { + { + +{ + +{ } { + { } } +{ } +{ + } +{ + } { + +{ + +{ } { + { ; + +{ +{ + } +{ { + ; +{ { { { { + + { + + +{ } } + + +} + +{ + { + { { { } { { + +{ + { { + + + +} +} + + { { + + + +} +{ } + + + +} +{ ; + +{ { + + +{ + { + ; +{ { ; +; + + { { { + + + + + +; + + + ; +{ { { { { { + + +; +; +; + + + { { { { { ; + + + { + + + +} +} +{ { + + } } + { + } +} } { { { + { ; + ; + +{ ; + ; + ; +; +{ { } { + } { + + { +{ + + } ; +{ { + { + { + } + + { { + } +{ + +{ + +{ { + { } +{ { +} { + } +} { { { { { { { { { + } + +{ + +} +{ + + + { } + +} { + } } { { +{ + { + +} { { ; { } } { { +{ + ; { + { + } + + + + { + + + ; { { + { + { { + } + +{ + +} +{ + + + { { + { ; + { +{ + +} +{ { { { { { { { { + + + { + { + +{ } { + + { { + + + + + + + +} + { + { + { { { } + +} { + } } { { +{ + { + +} +{ { + + { + { + +{ + +{ { + + + +{ + ; { + } +} } { { { + { ; + ; + +{ ; +; ; + ; ; +{ { { { { + + +; +; +; + + + { + { +comments!=style +*/ +int c;char*s="{ } ;\n*";b(){ + +return + + strchr (s,getchar())-s;} + n (){int c; +c= b()*3; + c +=b()/2; + c=c*3+ b()/2; + +return + +c==0?' ': +c==1?'\n': +c==2?' ': +c<33?c+'a' +-3:(c-32) +*3+' '+b +()/2; + +}main(){ + +while(b()!=6); + while((c=n())!='$') + putchar(c);} diff --git a/1995/spinellis.hint b/1995/spinellis.hint new file mode 100644 index 000000000..1ebe5be45 --- /dev/null +++ b/1995/spinellis.hint @@ -0,0 +1,32 @@ +Abusing The Rules: + + Diomidis Spinellis + SENA S.A. + Kyprou 27 + GR-152 37 Filothei + Greece + + +Judges' comments: + + To use: + make spinellis + + Try: + spinellis < spinellis.c + + While code does not abuse the rules, its output surely does! + + P.S. Does the source have any spelling errors? + + +Selected notes from the author: + + 96% of the program lines (631 out of the 658) are comment text rendering + the program readable and understandable. With the exception of the + two include file names (needed for a warning-free compile) the program + passes the standard Unix spell checker without any errors. Checking + for spelling errors is considered very important for programs that are + so heavily commented. This program is exactly 3217 characters long + through judicious use of white space. Rule abuse? Would I _ever_ abuse + the rules? diff --git a/1995/vanschnitz.c b/1995/vanschnitz.c new file mode 100644 index 000000000..7c2293a56 --- /dev/null +++ b/1995/vanschnitz.c @@ -0,0 +1,152 @@ +#ifndef pdbq +#ifndef n +#define n 05 +#endif pqbd +#define dpqb __FILE__ +#define ppbd "Move disk %d from peg %d to peg %d\n" +#define pdbq +#if n&01 +#define dqbp +#endif bpdq +#if n&02 +#define dbpq +#endif pbdq +#if n&04 +#define pbqd +#endif qbpb +#if n>>3 +#define bqdp +#endif pbbq +main(){ pdbq +printf( pdbq +#include dpqb +#define qbdp +#include dpqb +);} qbdp +#else dpdp +#ifdef dqbp +#define bdpq +#endif bpdd +#ifdef dbpq +#define bdpq +#endif pqpb +#ifdef pbqd +#define bdpq +#endif pdpp +#ifdef bqdp +#define bdpq +#endif pdpp +#ifdef bdpq +#undef bdpq +#ifndef dqbp +#define dqbp +#ifndef dbpq +#define dbpq +#ifndef pbqd +#define pbqd +#ifndef bqdp +#define bqdp +#else dbqb +#undef bqdp +#endif qdqb +#else pdbq +#undef pbqd +#endif qdbp +#else pqbb +#undef dbpq +#endif pqbd +#else bbpp +#undef dqbp +#endif ppqb +#include dpqb +#ifndef dqbp +#ifndef dbpq +#ifndef pbqd +#ifndef bqdp +#define bdpq +#endif pbpp +#endif qpdp +#endif ddpb +#endif qppb +#ifdef bdpq +#undef bdpq +#ifndef qbdp +pdbq ppbd +#else qbbd +#ifdef pqdb +,1,2,3 pqdb +#undef pqdb +#define qdbp +#else bdbb +#ifdef qdbp +,1,3,1 qdbp +#undef qdbp +#else bdbd +,1,1,2 pdbq +#define pqdb +#endif qppq +#endif pqpb +#endif bpdd +#else pqpq +#ifndef qbdp +pdbq ppbd +#else qqqb +,1 pdbq +#ifdef dqbp ++1 dqbp +#endif qqdb +#ifdef dbpq ++2 dbpq +#endif ppqb +#ifdef pbqd ++4 pbqd +#endif pqpp +#ifdef bqdp ++8 bqdp +#endif bbpb +#ifdef pqdb +#ifdef dqbp +,1,3 dqbp +#else pddp +,3,1 pdbq +#endif qpqq +#else dbqb +#ifdef qdbp +#ifdef dqbp +,2,1 dqbp +#else pqdb +,1,2 pdbq +#endif dbdp +#else pdpp +#ifdef dqbp +,3,2 dqbp +#else pdbb +,2,3 pdbq +#endif pqpp +#endif qbdp +#endif pqpp +#endif pdbp +#endif pqdp +#include dpqb +#ifdef dqbp +#undef dqbp +#ifdef dbpq +#undef dbpq +#ifdef pbqd +#undef pbqd +#ifdef bqdp +#undef bqdp +#else qddb +#define bqdp +#endif ppqp +#else bddq +#define pbqd +#endif ddbq +#else bbdb +#define dbpq +#endif qqbd +#else ddbq +#define dqbp +#endif qbdb +#endif qbdb +#endif qbpp diff --git a/1995/vanschnitz.hint b/1995/vanschnitz.hint new file mode 100644 index 000000000..ad0c3fc9e --- /dev/null +++ b/1995/vanschnitz.hint @@ -0,0 +1,166 @@ +Worst Abuse of the C Preprocessor: +and Most Likely To Amaze: + + Mark Schnitzius & David Van Brackle + ISX Corporation + 1165 Northchase Parkway + Suite 120 + Marietta, GA 30067 + USA + + +Judges' comments: + + To use: + make vanschnitz + + Try: + vanschnitz + + For a good time, try: + + rm -f vanschnitz + make vanschnitz LEVEL=8 + + Warning: Values of LEVEL>8 have been known to cause compilers + (and in one case a system) to crash during compilation. + + For a bad/slow time try LEVEL=15. + +Selected notes from the authors: + + A classic problem in computer science is known as the Towers + of Hanoi. It involves a set of different-sized disks mounted + on one of three pegs. The object is to move the pile of disks + to one of the other pegs. You may only move one disk at a + time, and there is an additional constraint that a disk may + never be placed on top of a smaller disk. + + Our program solves the Towers of Hanoi problem. Well, that's + not exactly true; actually, it's the compiler that solves the + problem. The resulting program just prints out the correct + solution. + + How do you trick a compiler into actually solving the problem? + First, you must tell it how many disks you wish to solve it + for. This is done by defining the symbol 'n' on the compile + line. For instance, to cause the compiler to solve the Towers + of Hanoi problem with four disks, you would compile the program + like this: + + gcc hanoi.c -o hanoi -Dn=4 + + A default value of 5 will be used for n if you do not define + it on the command line. The value of n cannot be greater than + fifteen (the compiler we used to test has a limit on the #include + depth). The compiler then solves the problem using binary + arithmetic based on whether particular symbols are defined or not. + + To loop, the program #include's itself. This is, of course, + expensive; one compile we did with n=14 took about fifty + minutes to compile on our system (compiling with n=15 + caused our system to crash). + + The resulting program that the compiler generates simply + prints out the answer. Did I say "simply"? Actually, the + whole resulting program consists of a single printf statement, + consisting of a massive string constant of length 35*(2^n-1), + followed by 3*(2^n-1) integers which get formatted into the + string. For our n=14 run, this adds up to a string constant + of length 573405, followed by 49149 integers delimeted by + commas. (Generating the string constant depends on the + ANSI C feature in which adjacent character strings are + catenated; a version that does not use this feature has been + included for people who can only run K&R). A good way to see + the resulting program (on a Unix system) is to do the command + + gcc hanoi.c -E -Dn=5 | grep -v \# | grep -v ^\$ + + For an odd number of disks, the program will provide a + solution wherein the disks end up on peg 2; for an even + number of disks, they will end on peg 3. This should + provide some hint as to what sort of algorithm is used. + + We have included a "spoiler" version of the program, with + meaningful symbol names and comments, but we encourage you + to try to decipher the program without it... + +begin 444 spoiler.c +M(VEF;F1E9B`@24Y)5$E!3$E:140*"B\J"B`J("!)9B!N(&ES;B=T(&1E9FEN +M960L(&UA:V4@:70@-0H@*B\*(VEF;F1E9B`@;@HC9&5F:6YE("!N(#`U"B-E +M;F1I9@H*+RH*("H@4V]M92!UPIP2!N('=E)W)E(&UO=FEN9R!D:7-K(&XK,2X@5&AA="!M96%N6-L92`Q +M(#T^(#(@/3X@,R`]/B`Q+B!#;VUB:6YE('1H:7,@=VET:"!T:&4@:VYO=VQE +M9&=E"B`J("!O9B!W:&5R92!D:7-K(#$@:7,L(&%N9"!W92!C86X@9&5T97)M +M:6YE(&AO=R!T;R!M;W9E(&%N>2!D:7-K+@H@*B\*(VEF;F1E9B`@3D]77T1/ +M7U1(15].54U"15)3"D9/4DU!5%]35%))3D<*(V5L test.oo +# +august: august.c fac.oc parse.oc test.oc + ${CC} ${CFLAGS} -DZ=60000 -D'T=m[s]' -D'P=m[s++]' \ + -D'L=m[p++]' -D'g=getchar()' -DE=else -DW=while -D'B=m[p++]' \ + -DI=if -DR='s=s+l/2;T=r;I(l%2)s++' -D'X=m[s-' \ + -D'D=Q(13,-)Q(14,*)Q(15,/)Q(16,%)Q(6,==)Q(7,!=)Q(8,<)C(1,r=P;m[T]=r;T=r)C(9,r=P;m[T]=r;s++)' \ + august.c -o august + ${CHMOD} +r fac.oc parse.oc test.oc + +# This forms a byte code execution engine written in OC +# +august.oc: august.c + ${RM} -f august.oc + ${CC} ${CFLAGS} -E -DZ=40000 -D'T=m[s]' -D'P=m[s++]' \ + -D'L=m[p++]' -D'g=getchar()' -DE=else -DW=while -D'B=m[p++]' \ + -DI=if -DR='s=s+l/2;T=r;I(l%2)s++' -D'X=m[s-' \ + -D'D=Q(13,-)Q(14,*)Q(15,/)Q(16,%)Q(6,==)Q(7,!=)Q(8,<)C(1,r=P;m[T]=r;T=r)C(9,r=P;m[T]=r;s++)' \ + august.c > august.oc + ${CHMOD} +r august.oc + +# NOTE: this is the original source that won +# +august.orig: august.orig.c fac.oc parse.oc test.oc + ${CC} ${CFLAGS} -DZ=60000 -DZ=60000 -D'T=m[s]' -D'P=m[s++]' \ + -D'L=m[p++]' -D'g=getchar()' -DE=else -DW=while -D'B=m[p++]' \ + -DI=if -DR='s=s+l/2;T=r;I(l%2)s++' -D'X=m[s-' \ + -D'D=Q(13,-)Q(14,*)Q(15,/)Q(16,%)Q(6,==)Q(7,!=)Q(8,<)C(1,r=P;m[T]=r;T=r)C(9,r=P;m[T]=r;s++)' \ + august.orig.c -o august.orig + ${RM} -f august.oc + ${CC} ${CFLAGS} -E -DZ=40000 -D'T=m[s]' -D'P=m[s++]' \ + -D'L=m[p++]' -D'g=getchar()' -DE=else -DW=while -D'B=m[p++]' \ + -DI=if -DR='s=s+l/2;T=r;I(l%2)s++' -D'X=m[s-' \ + -D'D=Q(13,-)Q(14,*)Q(15,/)Q(16,%)Q(6,==)Q(7,!=)Q(8,<)C(1,r=P;m[T]=r;T=r)C(9,r=P;m[T]=r;s++)' \ + august.orig.c > august.oc + ${CHMOD} +r fac.oc parse.oc test.oc august.oc + +dalbec: dalbec.c + ${CC} ${CFLAGS} dalbec.c -o dalbec + +eldby: eldby.c + ${CC} ${CFLAGS} eldby.c -o eldby + +gandalf: gandalf.c + ${CC} ${CFLAGS} gandalf.c -o gandalf + ${RM} -f hatcat cathat + ${CP} gandalf hatcat + ${CP} gandalf cathat + +huffman: huffman.c + ${CC} ${CFLAGS} huffman.c -o huffman + +# Add -I${X}/include and -L${X}/lib if this doesn't build +# (X is the root of the X Window distribution) +# Solaris users add -lsocket +# +jonth: jonth.c + ${CC} ${CFLAGS} jonth.c -o jonth -lX11 -lm + +rcm: rcm.c + ${CC} ${CFLAGS} -DJ='if(' -Ds='else J O==' -DU='B(' \ + -DX='for(' -DH='unsigned' -Dn='struct x' -DA='0,0,0,0,' \ + -DT='' -DY='' -DR='malloc(sizeof(n))' \ + -DM='%=K' -DK=32768 -DD='getchar()' -DN=putchar rcm.c -o rcm + +schweikh1: schweikh1.c errno.h + ${CC} ${CFLAGS} -I. schweikh1.c -o schweikh1 + +schweikh2: schweikh2.c hunni.c hunni.pl + ${CC} ${CFLAGS} -D_POSIX_SOURCE schweikh2.c -o schweikh2 + +# NOTE: On some systems such as SunOS, one may need to compile with: +# +# ${CC} ${CFLAGS} \ +# -I. -D_POSIX_SOURCE '-Ddifftime(a,b)=(double)(b-a)' \ +# schweikh3.c -o schweikh3 +# +schweikh3: schweikh3.c iso646.h + ${CC} ${CFLAGS} -I. -D_POSIX_SOURCE schweikh3.c -o schweikh3 + +westley: westley.c clock1 clock2 clock3 + ${CC} ${CFLAGS} westley.c -o westley + ${CHMOD} +x clock1 clock2 clock3 + +clean: + ${RM} -f *.o a.out core ${WINNERS} + +clobber: clean + ${RM} -f $(WINNERS) + ${RM} -f $(ALT_NAMES) + ${RM} -f fac.oo parse.oo test.oo hatcat cathat august.oc + +nuke: clobber + @${TRUE} + +install: all + ${CAT} $(WINNERS) $(ALT_NAMES) > /dev/null diff --git a/1996/README b/1996/README new file mode 100644 index 000000000..17202b100 --- /dev/null +++ b/1996/README @@ -0,0 +1,97 @@ +1996 marked the "The Thirteenth International Obfuscated C Code Contest" + +Copyright (c) 1997, Landon Curt Noll & Sriram Srinivasan. +All Rights Reserved. Permission for personal, educational or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from Landon Curt Noll and Sriram Srinivasan. + + +Standard IOCCC stuff +-------------------- + +The IOCCC has an official home page: + + http://www.ioccc.org + +containing previous winning entries, information about the judges, +announcements and much more. + +Use make to compile entries. It is possible that on BSD or non-unix +systems the makefile needs to be changed. See the Makefile for details. + +Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitters. + +Read over the makefile for compile/build issues. Your system may +require certain changes (add or remove a library, add or remove a +#define). + + +Where are Larry Bassel and Barbara Frezza? +------------------------------------------ + +It is not true that Larry Bassel avoided the 13th IOCCC on grounds of +superstition! Larry (as well as Landon) is fond of prime numbers. +Larry is so fond of prime numbers that he decided to become a graduate +student in number theory at UC San Diego. For this reason Larry +decided to sit out this year and plans to be back next year. + +Barbara Frezza also went to San Diego to enter into law school +at the same time. Her cooking in the role of official chef was +sorely missed. We look forward to her return to the contest +next year as well. + +Both Larry and Barbara have taken important new steps in their +lives as we wish them the best. When it is all over, Larry will +be able to produce obfuscated mathematical proofs, and Barbara +will be able de-obfuscate the many legal obfuscations. :-) + + +Remarks on some of the entries +------------------------------ + +This year, Jens Schweikhardt won 3 times ... a new IOCCC record. +Meanwhile, Brian Westley came up with his 8th winning entry, twice the +number of the next highest count. But with people like Schweikhardt +around, this lead could fall fast. + +As we state in the guidelines, the names of the winners are as much +news to us as they are to you because we keep authorship separate from +rest of the entry. Some people have it, we guess! + +There were a few very good entries that might have won if it were not +for the fact that they didn't work. If you didn't win, but think you +had a chance: test your program, fix it and submit it next year! + + +A few notes regarding future contests +------------------------------------- + +There is no 1997 contest. + +The next contest will not open until sometime in March 1998, and will +close sometime around the end of May 1998. The rules for the 1998 +contest have not been formed at this time and are not expected to be +ready for distribution until late February 1998. + +So what happened to 1997? Well the next USENIX Technical Conference +will be held Jun 15-19, 1998 (in New Orleans, USA). The 18 month +span between conferences will cause the IOCCC to skip over 1997. + +Be sure to wait until the 1998 rules are posted before submitting entries. +Rules differ from year to year, sometimes in significant ways. + +Please send us comments and suggestions what we have expressed above. +Also include anything else that you would like to see in future contests. +Send such email to: + + judges@toad.com + +If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used. + +If you have problems with any of the entries, AND YOU HAVE A FIX, please +EMail the fix (patch file or the entire changed file) to the above address. diff --git a/1996/august.c b/1996/august.c new file mode 100644 index 000000000..bfc046795 --- /dev/null +++ b/1996/august.c @@ -0,0 +1,321 @@ +/*T } ¶ ; +ˆ +; + +; + } + {  + +{ ;  ; +; 1 { +è { ! +} { + ; é ; + +; + { + + + { ]- } ; ; | +í ; Q +; +´ë ; ; ; "û } +} Ü; ; -ýl + +} + } t dÀ ; +; + + t2 { ì ; + +} 1; C + i +; = } ; ; + +; +ì ; { + + { ê +} { � { ï } } + +; . { + { é } } ;  +{ ; +; /nÈ; 5 +} ; Ú { ;  + ; { 1 ; } ; ¨ý } { + +;  { ; . { ;  } ;  ; +; T ; +{ +; ; Ä; ;  { +; + { { ; ; +ì; ‘ ; ; ï; n!t } +; ì!; G; t;  ø; ¤ }  ; + + ; + } ; "; è# } +;  +{ +; �$ { +; +; & + + ; d˜ +{ + + ¶;  { +; Sé' +{ d; ; è); �c +{ + ;  ; +; &ï*; ; +— { +; +$; ¢; ,; ; $ˆd } —; ˆ; ë/Î; Î +; a; Í ; { + } ; j; #è1; + } +; Ä ; { ê5a; û Ät { ï4a } + } + +; £ ; +Û2; - +; 8 + +} ; } +; è8; ;  Ú6Q ; aÌ { ;  { ˆ +ì } +†; v: +{ +? + } + +{ ? + +{ ; 4r +; +; v=b; Û +; + ; + } ;  +; ; ; Þ { ú> + } } + {  ; + { Õ` +} +; + ; +!; +; 1; ; >; Ì } 1; X +; } p ; +; + +; ; ;  +; ; 2 } ; vm +2; ;1íJ +; + ; ; Ï } +; ÉJc; ›; d } +} ÞG; i } +; ; §F +{ vl¶þV; z +n +¶éOc; s +; ; ÑÞ; + uh¶ëR } hRs; A cl,; +; ; Z;  { +x +lw¶êUch�{  } + } ; àîVc } +; Ž; >ÈD + ; G ; ; † +; +îX; ’ˆ +; + +; 2 }  { é[;  +{  } + ; Þj; å; ë_; y + ; D; T; ; ?j; .n; ; ã { + +; Ú]; !; Ë; 0a + } J ; +; ^; . +{ { { îc; X ; ; ´; +J { +; ; + } — { êf;  +; { + ; ; : } {  +{ + + ; (h} } +{  } + } ; ; {  +; ûD; Tì Cr; ; I; WèsÎWQ +; ; +×; W { û } +; ( ; ; } +} ;  { +; ÿn{ k; © ; ‚; ?; %Ùk;  ; + + { ïv; +3{ (; h { + +; ; z + +; ; ]{ ; ˜ïx; S; { * } ˜; z} ; î;  +{ ; ~ +; +U; ö +; { ‡ +; í~; +Ob } ; ò; UU; U{ -{ %Ú|1èƒ; +; Q + ; +µ{ w{ š;  ; + { í‡; ‚; ü� + +… +} Ù†; ?; u +{ + + +ƒ +} } ; » ; ´ ; ;  } +; è +{ + +; ;  } + ; p ; ; ; Q; Ü�{ ; ; K; $ì“ +p; 1} +4; $; +2Q ; }  { +; $î— } ; #; +T; 1 +; ; +; ± }  +; ; +. ; {  +{ ; š{ +  ; + { +; ;  } + + +; { [ { ; £{ ; �; 0{  + { ôr ; éŸ +; + } =; w + +?; ; +ä; B®lwx + ; h�h + +} ; pj + ; ; ; ö { û§; 'n +; ; { ) { +; ú¤; +; +Q +; f; 'r +{ +? { ë¬; %lÂf} +; ~©{ qÛ¨;  +{ + { ÿ­; ÂÛ¬{ œÚžl,u +; & ; + + { í; G }  +; k +;  } + ;  +{ + + +; hR; ; Wß´;  +} ; + +; ; —e; Z; ž{ N; = + } ; < + { ]- Bšretur; ¡if +else +whil; do; nt +char + { ; { pu{  } +{ ; = +} B +} { +; ø¿`ˆ; dÀ; ´ } � +} } ; ø`; waÌ { •ma; > + { ; oJ +} ÈD +{  ; ; ; · ; + +; Á ; ; ;  ; ;  +{  +; ; €Õ; @ë ; Á; L { + +; ØÈ ; + */int m[Z]; + +#define U(x)s--;T=x +#define C(l,s)I(o==l){s;}E +#define Q(l,o)C(l,r=P;T=T o r) +#define O(l,o)C(l,T=o T) +#define H(l,s)C(l,U(s)) +int +main(){int*q,s,f,r,o,l,p,c,b; +char*d; +d=" \t\n;{}\0AÊP€³²‰Š@ɵ�gEÏͱ°Œ0�Ž‹q"; +b=256; +q=m; +g; +o=g; +c=g; +c=c+g*b; +p=c; +I(o){W(p){o=g; +C(59,r=2)C('{',r=5)C('}',r=8)r=0; +I(r){r=r+g%4; +l=1-g-r; +W(r--){*q=q[l]; +q++; +p--; +}}E{I((o==32)+(o==9)+(o==10)){r=g; +o=o%4+(r+(r==123))%8*3; +I(8 test.oo + ./august < test.oo + + NOTE: Some compilers will compile this code into infinite loops! + If the above cat line does not execute in a very short amount + of time, then you may need to fix your compiler or use gcc. + + Try: + cat august.c fac.oc | ./august > fac.oo + ./august < fac.oo + + Or try: + cat august.c fac.oc | ./august | ./august + + And try: + cat august.c parse.oc | ./august > parse.oo + cat parse.oo fac.oc | ./august | ./august + + This entry can feed on itself. If you C preprocess the source, + you compile the interpreter: + + make august.oc + + We can now compile the interpreter as follows: + + cat august.c august.oc | ./august > august.oo + + and use the compiled interpreter to execute some previously + compiled code: + + cat august.oo test.oo | ./august + + And we can have the compiled interpreter interpret itself which + inturn compiles the test program: + + cat august.oo august.oo fac.oo | ./august + + And if you have lots of spare time, you can recurse one level deeper: + + cat august.oo august.oo august.oo fac.oo | ./august + + We (the judges) recommend that you spend some time studying this + entry as it surely will make the 'best of the IOCCC' list. It was + very well received by those who attended the IOCCC BOF. + + +Selected notes from the author: + + This program is a bytecode interpreter. This fact is not + particularly obfuscated; any experienced C programmer can see that + in about a minute. + + The interpreter reads the bytecode from the standard input. What + remains of the standard input after this is left as standard input for + the interpreted program. + + Having an interpreter but no code isn't any fun. But within a comment + in the beginning of the interpreter is a sequence of bytes that is + code that the interpreter understands. It is in fact the code for a + compiler that compiles from OC (Obfuscated C, a subset of C) into the + byte code that the interpreter understands. + + The language the compiler understands is a subset of C (the grammar + is in grammar.small) with the functions getchar() and putchar() + available. The subset has the types `int', `char', and pointers to + those (it has function pointers too, but not with the proper + syntax). Arrays can only be global. There is a rather limited set + of operators, and control constructs. + + The compiler has absolutely no error checking, so things + can go wrong. But this is what seasoned C progammers are used to. + + Assume that the interpreter has been compiled (source in prog.c and + binary in prog) and that we have this in a file named test.oc: + + main() { putchar('!'); putchar('\n'); exit(0); } + + We can then compile by + + cat august.c test.oc | ./august > test.oo + + And run the compiled program by + + ./august < test.oo + + Or even simpler: + + cat august.c test.oc | ./august | ./august + + A larger example is included fac.oc. + + The compiler for OC is naturally written in OC (where did you think + the byte code came from?). It is in the file parse.oc. + + Hmm... So now we have an interpreter written in OC and a compiler + for OC, can we compile the interpreter? Yes, we can! The OC + compiler does not have a preprocessor (hey, what do you expect from + a program that is this small), so we need to use an external one. + To preprocess august.c use the command from the build file, but add + the -E flag and change 60000 to 40000, i.e.: + + cc -E -DZ=40000 .... august.c > prog.oc + + If prog.oc contain some junk line starting with a `#' (most likely + it does) then remove it. + + OK, we can now compile the interpreter: + + cat august.c prog.oc | ./august > prog.oo + + And we can run it: + + cat prog.oo test.oo | ./august + + Here we have the interpreter interpreting another interpreter that runs + the program. Did you think that was too fast? Just throw in another + level of interpretation: + + cat prog.oo prog.oo test.oo | ./august + + And another... + + cat prog.oo prog.oo prog.oo test.oo | ./august + + ***** + + Fitting the byte code for the compiler into the initial comment + was a challenge. I had to strip the compiler/interpreter of + a lot of functionality to bring down their sizes. The initial + version had a full set of binary operators as well as prefix &. + Given a handful more bytes it would be easy to put them back. + + Anyway, the bytecode from the compiler is first optimized in + an external optimizer (not supplied here); this brings down the + size of it by about 30%. The remaining code is then LZ-compressed + (roughly) with a sliding window of 255 bytes. The most common + occuring bytes are then encoded using " \n\t;{}" to avoid having + them counted as significant. About 200 bytes of the interpreter + handles the unpacking of the byte code (this is a lot, but it pays + off). + + Despite all this work I still had to put a lot of code in the + compilation command. This disturbs me. It is possible to compress + the code further with a better entropy coder (e.g. an arithmetic + coder), but decompression then takes up too much code. Maybe this + would be a way to fit it all into the 1536 bytes, but I'm don't have + time to try it. + + ***** + + Execution starts at main(). Nothing can be used before it is + defined. getchar() and putchar() are predefined functions. + + The following is a description of the OC grammar: + + OC grammar + ========== + Terminals are in quotes, () is used for bracketing. + + program: decl* + + decl: vardecl + fundecl + + vardecl: type NAME ; + type NAME "[" INT "]" ; + + fundecl: type NAME "(" args ")" "{" body "}" + + args: /*empty*/ + ( arg "," )* arg + + arg: type NAME + + body: vardecl* stmt* + + stmt: ifstmt + whilestmt + dowhilestmt + "return" expr ";" + expr ";" + "{" stmt* "}" + ";" + + ifstmt: "if" "(" expr ")" stmt + "if" "(" expr ")" stmt "else" stmt + + whilestmt: "while" "(" expr ")" stmt + + dowhilestmt: "do" stmt "while" "(" expr ")" ";" + + expr: expr binop expr + unop expr + expr "[" expr "]" + "(" expr ")" + expr "(" exprs ")" + NAME + INT + CHAR + STRING + + exprs: /*empty*/ + (expr ",")* expr + + binop: "+" | "-" | "*" | "/" | "%" | + "=" | + "<" | "==" | "!=" + + unop: "!" | "-" | "*" + + type: "int" stars + "char" stars + + stars: "*"* + + ***** + + Well, that is enough ranting for now. diff --git a/1996/august.orig.c b/1996/august.orig.c new file mode 100644 index 000000000..93053bd65 --- /dev/null +++ b/1996/august.orig.c @@ -0,0 +1,321 @@ +/*T } ¶ ; +ˆ +; + +; + } + {  + +{ ;  ; +; 1 { +è { ! +} { + ; é ; + +; + { + + + { ]- } ; ; | +í ; Q +; +´ë ; ; ; "û } +} Ü; ; -ýl + +} + } t dÀ ; +; + + t2 { ì ; + +} 1; C + i +; = } ; ; + +; +ì ; { + + { ê +} { � { ï } } + +; . { + { é } } ;  +{ ; +; /nÈ; 5 +} ; Ú { ;  + ; { 1 ; } ; ¨ý } { + +;  { ; . { ;  } ;  ; +; T ; +{ +; ; Ä; ;  { +; + { { ; ; +ì; ‘ ; ; ï; n!t } +; ì!; G; t;  ø; ¤ }  ; + + ; + } ; "; è# } +;  +{ +; �$ { +; +; & + + ; d˜ +{ + + ¶;  { +; Sé' +{ d; ; è); �c +{ + ;  ; +; &ï*; ; +— { +; +$; ¢; ,; ; $ˆd } —; ˆ; ë/Î; Î +; a; Í ; { + } ; j; #è1; + } +; Ä ; { ê5a; û Ät { ï4a } + } + +; £ ; +Û2; - +; 8 + +} ; } +; è8; ;  Ú6Q ; aÌ { ;  { ˆ +ì } +†; v: +{ +? + } + +{ ? + +{ ; 4r +; +; v=b; Û +; + ; + } ;  +; ; ; Þ { ú> + } } + {  ; + { Õ` +} +; + ; +!; +; 1; ; >; Ì } 1; X +; } p ; +; + +; ; ;  +; ; 2 } ; vm +2; ;1íJ +; + ; ; Ï } +; ÉJc; ›; d } +} ÞG; i } +; ; §F +{ vl¶þV; z +n +¶éOc; s +; ; ÑÞ; + uh¶ëR } hRs; A cl,; +; ; Z;  { +x +lw¶êUch�{  } + } ; àîVc } +; Ž; >ÈD + ; G ; ; † +; +îX; ’ˆ +; + +; 2 }  { é[;  +{  } + ; Þj; å; ë_; y + ; D; T; ; ?j; .n; ; ã { + +; Ú]; !; Ë; 0a + } J ; +; ^; . +{ { { îc; X ; ; ´; +J { +; ; + } — { êf;  +; { + ; ; : } {  +{ + + ; (h} } +{  } + } ; ; {  +; ûD; Tì Cr; ; I; WèsÎWQ +; ; +×; W { û } +; ( ; ; } +} ;  { +; ÿn{ k; © ; ‚; ?; %Ùk;  ; + + { ïv; +3{ (; h { + +; ; z + +; ; ]{ ; ˜ïx; S; { * } ˜; z} ; î;  +{ ; ~ +; +U; ö +; { ‡ +; í~; +Ob } ; ò; UU; U{ -{ %Ú|1èƒ; +; Q + ; +µ{ w{ š;  ; + { í‡; ‚; ü� + +… +} Ù†; ?; u +{ + + +ƒ +} } ; » ; ´ ; ;  } +; è +{ + +; ;  } + ; p ; ; ; Q; Ü�{ ; ; K; $ì“ +p; 1} +4; $; +2Q ; }  { +; $î— } ; #; +T; 1 +; ; +; ± }  +; ; +. ; {  +{ ; š{ +  ; + { +; ;  } + + +; { [ { ; £{ ; �; 0{  + { ôr ; éŸ +; + } =; w + +?; ; +ä; B®lwx + ; h�h + +} ; pj + ; ; ; ö { û§; 'n +; ; { ) { +; ú¤; +; +Q +; f; 'r +{ +? { ë¬; %lÂf} +; ~©{ qÛ¨;  +{ + { ÿ­; ÂÛ¬{ œÚžl,u +; & ; + + { í; G }  +; k +;  } + ;  +{ + + +; hR; ; Wß´;  +} ; + +; ; —e; Z; ž{ N; = + } ; < + { ]- Bšretur; ¡if +else +whil; do; nt +char + { ; { pu{  } +{ ; = +} B +} { +; ø¿`ˆ; dÀ; ´ } � +} } ; ø`; waÌ { •ma; > + { ; oJ +} ÈD +{  ; ; ; · ; + +; Á ; ; ;  ; ;  +{  +; ; €Õ; @ë ; Á; L { + +; ØÈ ; + */int m[Z]; + +#define U(x)s--;T=x +#define C(l,s)I(o==l){s;}E +#define Q(l,o)C(l,r=P;T=T o r) +#define O(l,o)C(l,T=o T) +#define H(l,s)C(l,U(s)) +int +main(){int*q,s,f,r,o,l,p,c,b; +char*d; +d=" \t\n;{}\0AÊP€³²‰Š@ɵ�gEÏͱ°Œ0�Ž‹q"; +b=256; +q=m; +g; +o=g; +c=g; +c=c+g*b; +p=c; +I(o){W(p){o=g; +C(59,r=2)C('{',r=5)C('}',r=8)r=0; +I(r){r=r+g%4; +l=1-g-r; +W(r--){*q=q[l]; +q++; +p--; +}}E{I((o==32)+(o==9)+(o==10)){r=g; +o=o%4+(r+(r==123))%8*3; +I(8>- +--====v====-- +| | +| | +| | +| 0 | +| | +| | +| | +============= + \\ / + \\ / + | | + | | | + | | | + | | | + | | | + | O | + | | +)-----------( +| | +=============" diff --git a/1996/clock2 b/1996/clock2 new file mode 100644 index 000000000..183d15cf2 --- /dev/null +++ b/1996/clock2 @@ -0,0 +1,18 @@ +#!/bin/sh +./westley \ +"%%%\$\$\$###000===KKKYYYhhhwwwxxxyyyzzz{{{nnnaaaSSSEEE666'''&&&" \ +"32?M[jkl_QC432?M[jkl_QC4" \ +" xX" \ +" + )-=*=-( +--===-=-===-- +) ( +| | +| | +| 0 | +| | +| | +) ( +]]==-----==[[ + ) | ( + -----------" diff --git a/1996/clock3 b/1996/clock3 new file mode 100644 index 000000000..3689bb928 --- /dev/null +++ b/1996/clock3 @@ -0,0 +1,11 @@ +#!/bin/sh +./westley \ +"123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_\`abcdefghijkl" \ +"/\$%&'()*+,-./\$%&'()*+,-." \ +" ||" \ +" +..3..6..9..12 Hours + + + ----.----10---.----20---.----30---.----40---.----50---.---- Minutes +" diff --git a/1996/dalbec.c b/1996/dalbec.c new file mode 100644 index 000000000..8dfbf8633 --- /dev/null +++ b/1996/dalbec.c @@ -0,0 +1,19 @@ +#include +#include +main(I,O,O0,OO,l) +int I,O0,OO,l; +char **O; +{ + return !!I>=I?!I>=I?!!~I>=~I?!~I>=~I?!OO?!I:OO%2? + OO=main(I,O,O0,OO>>!!OO,l), + OO=main(I-!I-!!I,O,OO,OO,l), + OO=main(I-!I-!!I,O,O0,OO,l), + !(OO-!I||I)?l-1:OO + :(OO=main(I,O,O0,OO>>!!OO,l), + !(OO-l+!I||I)?l-1:main(I-!I-!!I,O,OO,OO,l)) + :(O0+OO)%l + :main(I-I/I-I/I,O,O0,OO+OO/OO, + main(0,O,O0,OO,I-I-I)+I+1?1:printf("%d ",I-I-I)+fflush(stdout)) + :main(I-I-I-I-I,O,I+I-I+I,I,0) + :main(~!!I-!!I,O,atoi(1[O]),1,atoi(0[O])); +} diff --git a/1996/dalbec.hint b/1996/dalbec.hint new file mode 100644 index 000000000..09629a22d --- /dev/null +++ b/1996/dalbec.hint @@ -0,0 +1,67 @@ +Best Numerical Obfuscation: + + John Dalbec + 20 Squire's Ct. (home address) + Canfield, OH 44406 + USA + + http://www.math.yale.edu/pub/users/dalbec/ + + +Judges' comments: + + To use: + make dalbec + ./dalbec + + The output is mis-leading ... why does it also print 2047? + + Also try: + + ./dalbec 3 + + why does it output 121? + + For a hint see: + + http://www.utm.edu/research/primes/prove2.html#sprp + + and then try to understand the source! :-) + + We (the judges) recommend that you take the time needed to understand + how this program works. The source is small enough to make the effort + reasonable, and complex enough to make it interesting. + + +Selected notes from the author: + + This program assumes that your terminal wraps lines automatically. + If this is not the case, you may need to change the space in the + "printf" format string to a newline character. + + An extra feature of this program is that it allows you (in most + cases) to estimate the stack space available to programs on your + system. Simply allow the program to run to completion. The stack + space is roughly proportional to the last number printed. + + (On SunOS/cc, the proportionality constant is about 48 bytes.) + + On completion, the program produces a core file that may be used to + refine this estimate. (Or you could try typing "limit" if you're + running csh.) In rare cases the stack space may exceed 24*MAXINT + bytes, in which case the program will produce an inaccurate estimate. + + This program is obfuscated: + + (1) by the use of easily-confused variable names + + (2) by using the implicit !=0 in conditional expressions + + (3) by substituting expressions such as !a for 0 where a!=0 + and !a for 1 where a==0 + + (4) by the fact that main() is a single expression and so beautifies poorly + + (5) by the fact that main() is used + (a) to compute powers in modular arithmetic + (b) to recursively call itself in the main loop diff --git a/1996/eldby.c b/1996/eldby.c new file mode 100644 index 000000000..f21cef225 --- /dev/null +++ b/1996/eldby.c @@ -0,0 +1,8 @@ +float s=1944,x[5],y[5],z[5],r[5],j,h,a,b,d,e;int i=33,c,l,f=1;int g(){return f= +(f*6478+1)%65346;}m(){x[i]=g()-l;y[i]=(g()-l)/4;r[i]=g()>>4;}main(){char t[1948 +]=" `MYmtw%FFlj%Jqig~%`jqig~Etsqnsj3stb",*p=t+3,*k="3tjlq9TX";l=s*20;while(i0) +{for(e=b;e*e>b*1.01||e*e | + Not every change is marked in this file is marked, but + most are. :-) + + +WHAT IS NEW IN 1996: + + A number of small rules changes were made. See rule #3. | + + We clarified what is a legal title by using a stronger regexp. | + + We expanded on the value of the --remark--- section in the | + guidelines below. | + + We now ask for an author's home page URL in the --entry-- section. | + + We declared that use of local funcions are not allowed this year due | + to the lack of portability. | + + Windows 95 (see Dislikes). This is not really new but we like to | + say it anyway. | + + +HINTS AND SUGGESTIONS: + + You are encouraged to examine the winners of previous contests. See + FOR MORE INFORMATION for details on how to get previous winners. + + Keep in mind that rules change from year to year, so some winning entries + may not be valid entries this year. What was unique and novel one year + might be 'old' the next year. + + An entry is usually examined in a number of ways. We typically apply + a number of tests to an entry: + + * look at the original source + * convert ANSI tri-graphs to ASCII + * C pre-process the source ignoring '#include' lines + * C pre-process the source ignoring '#define' and '#include' lines + * run it through a C beautifier + * examine the algorithm + * lint it + * compile it + * execute it + + You should consider how your entry looks in each of the above tests. + You should ask yourself if your entry remains obscure after it has been + 'cleaned up' by the C pre-processor and a C beautifier. + + Your entry need not pass all of the above tests. In certain + cases, a test is not important. Entries that compete for the + 'strangest/most creative source layout' need not do as well as + others in terms of their algorithm. On the other hand, given + two such entries, we are more inclined to pick the entry that + does something interesting when you run it. + + We try to avoid limiting creativity in our rules. As such, we leave + the contest open for creative rule interpretation. As in real life + programming, interpreting a requirements document or a customer request + is important. For this reason, we often award 'worst abuse of the + rules' to an entry that illustrates this point in an ironic way. + + We do realize that there are holes in the rules, and invite entries + to attempt to exploit them. We will award 'worst abuse of the rules' + and then plug the hole next year. Even so, we will attempt to use + the smallest plug needed, if not smaller. :-) + + Check out your program and be sure that it works. We sometimes make + the effort to debug an entry that has a slight problem, particularly + in or near the final round. On the other hand, we have seen some + of the best entries fall down because they didn't work. + + We tend to look down on a prime number printer, that claims that + 16 is a prime number. If you do have a bug, you are better off + documenting it. Noting "this entry sometimes prints the 4th power + of a prime by mistake" would save the above entry. And sometimes, + a strange bug/feature can even help the entry! Of course, a correctly + working entry is best. + + People who are considering to just use some complex mathematical + function or state machine to spell out something such as "hello, + world!" may want to try and be more creative. + + Ultra-obfuscated programs are in some cases some cases easier to + deobfuscate than subtly-obfuscated programs. Consider using + misleading or subtle tricks layered on top of or under an + appropriate level of obfuscation. + + Programs that use VTxxx/ANSI sequences that are NOT limited to a + specific terminal brand and that can also work in a standard xterm + are considered portable. + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many ANSI C compilers dislike the following code, and so do we: + + #define d define + #d foo <-- don't expect this to turn into #define foo + + When declaring local or global variables, you should declare the type: + + int this_is_ok; + this_is_not; <-- don't use such implicit type declaration + + We suggest that you compile your entry with an ANSI C compiler. If you + must use non-ANSI C, such as K&R C, you must avoid areas that result in + compile/link errors for ANSI C compilers. For example, using gcc | + local function declarations, such as: | + + void main() { | + void blah() { printf("blah\n"); } | + blah(); | + } | + + are not allowed even though their existence seems tailor made for | + this contest! But for now, since they are not in wide spread use | + we cannot accept entries that use them. | + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using . Use instead. + + If you use C preprocessor directives (#define, #if, #ifdef, ...), + the leading '#' must be the first character on a line. While some + C preprocessors allow whitespace the leading '#', many do not. + + Because the exit() function returns void on some systems, entries + must not assume that it returns an int. + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + + One line programs should be short one line programs, say around 80 + bytes long. Getting close to 160 bytes is a bit too long in our opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS version specific + (index/strchr differences are ok, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is ok only if you warn us in the 'remark' header item) + * won't compile or run under a POSIX P1003.1/P1003.2 like systems + * depend on a utility or application not normally found on most + most POSIX P1003.1/P1003.2 like systems + * abuse the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are similar to previous winners + * are identical to previous losers :-) + * are identical to future losers (Windows 95) :-) + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + The build file should not be used to try and get around the size + limit. It is one thing to make use of a several -D's to help out, + but it is quite another to use 200+ bytes of -D's in order to + try and squeeze the source under the size limit. You should feel + free to make use of the build file space, but you are better off + if you show some amount of restraint. + + We want to get away from source that is simply a compact blob of + characters. To help, we give a break to source that contains + whitespace, and in certain cases ; { or } characters. While the + number of characters excluding whitespace (tab, space, newline), + and excluding any ; { or } followed immediately by either whitespace + or end of file, must be <= 1536, the total size may be less than 3217 + bytes. This means that one may use "free of charge" up to 1681 + bytes of whitespace, or ; { or } followed by either whitespace + or end of file. [[Q: What is special about 1681?]] + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! + + We suggest that you avoid trying for the 'smallest self-replicating' + source. The smallest, a zero byte entry, won in 1994. + + We tend to dislike writable strings. That is, we want to avoid: + + char *T = "So many primes, so little time!"; + ... + T[14] = ';'; + + You may use writable strings if you really must. If you do depend + on them, you must say do in the ---remark--- section. + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. Don't + depend on a particular type of display. For example, don't depend + on color or a given size. Don't require backing store. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. We ask that such X client + entries restrict themselves to only the low level Xlib and the + Athena widget set (libX11.a, libXaw.a, libXmu.a and libXt.a). + Don't use M*tif, Xv*ew, or OpenL*ok toolkits, since not everyone + has them. Avoid depending on a particular window manager. Not + everyone has X11r5, and some people are stuck back in X11r4 (or + earlier), so try to target X11r5 without requiring X11r5. Better + yet, try to make your entry run on all version 11 X Window Systems. + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines + in the ---remark--- section. + + While we recognize that UN*X is not a universal operating system, the + contest does have a bias towards such systems. In an effort to expand + the scope of the contest, we phrase our bias in terms of POSIX P1003.1 + and P1003.2 standards. This will allow certain non-UN*X OS users to + submit entries. On the other hand, this is a guideline and not a rule. + We will not reject an entry based on some POSIX technicality. + + When dealing with OS and application environments, we suggest that you + be reasonable with a nod towards vanilla UN*X-like systems. POSIX will + evolve but not as much as the contest, so avoid stuff like POSIX real + time, security, etc. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * pass lint without complaint (not a requirement, but it is nice) + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION + * make us laugh and/or throw up :-) + + Some types of programs can't excel (tm) in some areas. Of course, your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + You are better off explaining what your entry does in the | + ---remark--- section rather than leaving it obscure for the judges | + as we might miss something and/or be too tired to notice. | + + We freely admit that interesting, creative or humorous comments in + the ---remark--- section help your chances of winning. If you had to + read so many twisted entries, you too would enjoy a good laugh or two. + We think the readers of the contest winners do as well. We do read | + the ---remark--- section during the judging process, so it is worth | + your while to write a remarkable ---remark--- section. | + + Be creative! + + +ABUSING THE RULES: + + Legal abuse of the rules is somewhat encouraged. Legal rule abuse may + involve, but is not limited to, doing things that are technically + allowed by the rules and yet do not fit the spirit of what we + intended to be submitted. + + Legal rule abuse is encouraged to help promote creativity. Rule + abuse entries, regardless of if they receive an award, result in + changes to the next year's rules and guidelines. + + Legal abuse of the rules is NOT an invitation to violate the + rules. An entry that violates the rules in the opinion of the + judges, WILL be disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL + OF RISK! If you have an entry that might otherwise be interesting, + you might want to submit two versions; one that does not abuse the + rules and one that does. + + If you intend to abuse the rules, indicate so in the ---remark--- + section. You must try to justify why you consider your rule abuse + to be allowed under the rules. That is, you must plead your case + as to why your entry is valid. Humor and/or creativity help plead + a case. + + Abusing the entry format tends to annoy us more than amuse us. + + We are often asked why the contest rules and guidelines seem too + strange or contain mistakes, flaws or grammatical errors. + One reason is that we sometimes make genuine mistakes. But in many + cases such problems, flaws or areas of confusion are deliberate. + Changes to rules and guidelines in response to rule abuses, are + done in a minimal fashion. Often we will deliberately leave + behind holes (or introduce new ones) so that future rule abuse may + continue. + + At the risk of stating the obvious, this contest is a parity of the + software development process. The rules and guidelines are + only a small part of the overall contest. Even so, one may think + the contest rule and guideline process as a parody of the sometimes + tragic mismatch between what a customer (or marketing) wants and + what engineering delivers. + + +ENTRY FORMAT: + + In order to help us process the many entries, we must request your + assistance by formatting your entries in a certain way. This format, + in addition, allows us to quickly separate information about the + author from the program itself. (see JUDGING PROCESS) + + We have provided the program, mkentry, as an example of how to + format entries. You should be aware of the following warning that + is found in mkentry.c: + + This program attempts to implement the IOCCC rules. Every + attempt has been made to make sure that this program produces + an entry that conforms to the contest rules. In all cases, + where this program differs from the contest rules, the + contest rules will be used. Be sure to check with the + contest rules before submitting an entry. + + You are not required to use mkentry. It is convenient, however, + as it attempts to uuencode the needed files, and attempt to check + the entry against the size rules. + + If you have any suggestions, comments, fixes or complaints about + the mkentry.c program, please send EMail to the judges. (see below) + + The following is a sample entry (the | change bars are not part + of the example, don't add them to your entry!) + +---entry--- +rule: 1996-1 +fix: y +title: chonglabram +entry: 0 +date: Mon Oct 28 00:47:00 1996 +host: Un*x v6, pdp11/45 + 2.9BSD, pdp11/70 +---remark--- + This is a not-very-obfuscated C program. It is likely not to win a + prize, because it doesn't have what it takes to win and because the + author plans to forget to send it in before the deadline! :-) + + Note that the rule is 1996-1 because 1996's old mkentry.c was buggy. +---author--- +name: Landon Curt Noll +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA + Earth +email: {chongo,noll}@{toad,sgi}.com +url: http:///www.isthe.com/chongo/index.html +anon: y +---author--- +name: Larry Bassel +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA +email: labbmf@ix.netcom.com +url: none +anon: n +---author--- +name: Sriram Srinivasan +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA +email: sriram@tcs.com +url: none | +anon: n +---info--- +begin 444 info.file +M0V]P>7)I9VAT("AC*2!,86YD;VX@0W5R="!.;VQL+"`Q.3DU+@I!;&P@4FEG +M:'1S(%)E2!O8F9U2!B92!S96YT('1O.B!N;VQL0'1O +M860N8V]M+EQN(BD["B`@("!P'!E8W0@9&ER96-T(%-U;FYY=F%L92!54DP@F5NF5N7,N("!&=6X@<&QA8V4N(&-O;VP@<&5O<&QE(&%N9%QN(BD["B`@ +M("!P7-<;B(I.PH@("`@<')I;G1F*")T;R!C +M2!P2`M/B!W871C:"!F='`Z+R]F='`N=74N;F5T+W!U8B]I;V-C8UQN(BD["B`@ +M("!P special_build + sh < special_build + + * Assume that we will use the entry title. Send us a version of + your build/program files that uses the name convention. You + should uuencode these files in ---info--- sections. + + If your entry needs to modify its source, info or binary files, + please say so in the ---remark--- section. You should try to avoid + touching your original build, source and binary files. You should + arrange to make copies of the files you intend to modify. This + will allow people to re-generate your entry from scratch. + + Remember that your entry may be built without a build file. We + typically incorporate the build lines into a Makefile. If the + build file must exist, say so in the ---remark--- section. + + Typically the ---build--- command will contain a "cc" command. + It is also ok to use a "gcc" command (and gcc args). However keep + in mind that your entry should be compilable by any standard ANSI C + compiler and thus should not depend on a special gcc feature. + + If your entry needs special info files, you should uuencode them + into ---info--- sections. In the case of multiple info files, + use multiple ---info--- sections. If no info files are needed, + then skip the ---info--- section. + + Info files are intended to be input, or detailed information that + does not fit well into the ---remark--- section. For example, an + entry that implements a compiler might want to provide some sample + programs for the user to compile. An entry might want to include a + lengthy design document, that might not be appropriate for a + 'hints' file. + + Info files should be used only to supplement your entry. For + example, info files may provide sample input or detailed + information about your entry. Because they are supplemental, + the entry should not require them exist. + + In some cases, your info files might be renamed to avoid name + conflicts. If info files should not be renamed for some reason, + say so in the ---remark--- section. + + Info files must uudecode into the current directory. If they + absolutely must be renamed, or moved into a sub-directory, say + so in the ---remark--- section. + + When submitting multiple entries, be sure that each entry has + a unique entry number from 0 to 7. Your first entry should + have entry number 0. + + With the exception of the header, all text outside of the entry + format may be ignored. That is, don't place text outside of the + entry and expect us to see it. (Our decoding tools are not AI + progs!) If you need tell the judges something, put it in the + ---remark--- section, or send a EMail to: + + ...!{apple,sun,uunet}!hoptoad!judges (not the address for + judges@toad.com submitting entries) + + The date should be given with respect to UTC. (Some systems refer + to this as GMT or GMT0) The format of the date should be that as + returned by asctime() in the C locale. An example of such a string is: + + Mon Oct 28 00:47:00 1996 + + This format is similar to the output of the date(1) command. The + string does not include the timezone name before the year. On many + systems, one of the following command will produce a similar string: + + date -u "+%a %h %d %T 19%y" + date -u | sed -e 's/... \(19[0-9][0-9]\)$/\1/' + sh -c 'TZ=UTC date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"' + sh -c 'TZ=GMT date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"' + sh -c 'TZ=GMT0 date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"' + + You are allowed to update/fix/revise your entry. To do so, set + the 'fix' line in the ---entry--- section to 'y' instead of 'n'. + Be sure that the resubmission uses the same title and entry number | + as well, as these are used to determine which entry is to be + replaced. + +JUDGING PROCESS: + + Entries are judged by Larry Bassel, Landon Curt Noll and Sriram + Srinivasan. + + Entries are unpacked into individual directories. The EMail message + is unpacked into individual files, each containing: + + ---entry--- section + all ---author--- sections + all ---info--- sections + ---build--- section + ---program--- section + any other text, including the EMail message headers + + Prior to judging, the 'any other text' file is scanned to be sure + it does not contain useful information (or in case the entry was + malformed and did not unpack correctly). Information from the + ---author--- sections and the title from the ---entry--- section + are not read until the judging process is complete, and then only + from entries that have won an award. + + The above process helps keep us biased for/against any one particular + individual. We are usually kept in the dark as much as you are + until the final awards are given. We like the surprise of finding + out in the end, who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. (For the curious, + we do indicate the volume of paper consumed when presenting the IOCCC + winners at talks) + + After the Usenix announcement, we attempt to send EMail to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes and typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the ---entry--- section + * reading the uudecoded ---build--- section + * reading the uudecoded ---program--- section + * reading the uudecoded ---info--- section(s), if any + * passing the source thru the C pre-processor + skipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + skipping over any #include files + + In later rounds, other actions are performed: + + * linting the source + * compiling/building the source + * running the program + * performing miscellaneous tests on the source and binary + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry often will compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code + * best X client (see OUR LIKES AND DISLIKES) + * best abuse of ANSI C + * worst abuse of the rules + * + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to 8 or 10 + winners. Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry os good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + + More often than not, we select a small entry (usually one line), a + strange/creative layout entry, and an entry that abuses the contest + rules in some way. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entries. More often, the + 'best' is picked because it does well in a number of categories. + + +ANNOUNCEMENT OF WINNERS: + + The first announcement, occurs at the main Usenix conference. By + tradition, this is done during the IOCCC BOF. + + Winning entries will be posted in February to the following groups: + + comp.lang.c comp.unix.wizards alt.sources + + In addition, pointers to these postings are posted to the following + + comp.sources.d alt.sources.d misc.misc + comp.sources.misc comp.windows.x comp.lang.c++ + comp.programming + + Winning entries will be deposited into the uunet archives. See + below for details. + + Often, winning entries are published in selected magazines from around + the world. Winners have appeared in books ("The New Hackers Dictionary") + and on T-Shirts. + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending EMail to the following address: + + ...!{apple,sun,uunet}!hoptoad!judges (not the address for + judges@toad.com submitting entries) + + Questions and comments about the contest are welcome. Comments about + confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, send EMail to the address + above and use the subject 'send rules'. + + Check out the IOCCC Web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + +chongo /\cc/\ {chongo,noll}@{toad,sgi}.com +Larry Bassel labbmf@ix.netcom.com +Sriram Srinivasan sriram@tcs.com diff --git a/1996/huffman.c b/1996/huffman.c new file mode 100644 index 000000000..a5745bc7f --- /dev/null +++ b/1996/huffman.c @@ -0,0 +1,49 @@ +#define x char +#define z else +#define w gets +#define r if +#define u int +#define s main +#define v putchar +#define y while +#define t " A?B?K?L?CIF?MSP?E?H?O?R?DJG?NTQ?????U?V?????X???????Z????W??Y??" + s ( ) { x* c , b[ 5 * 72 ]; u a, e , d [ 9 +*9 *9 ] ; y (w ( b) ){ r ( 0 [ b] -7 * +5 ) { c = b ; y ( (* c - 6 +* 7 )* * c )c = c+ 1 ; r (( -0 ) [ c ] && w ( b + + 8 * 5* 3 ) && w (b +8 *5 * 6) ) + { a = 0; y ( a [ b ] + ) { a [ d ] = ! ! ( a[ b] - 4 *8 ) ; a = a + +1; } y (a < 8 * 5 * 3 ) d [ ( a ++ ) +] = 0 ; a = 0; y( b [ + a + 8 *3 * 5 ] ) { d [ a ] = a [ d] + ! !( b[ +a+ 40 * 3 ] -4 * 8) * 2 ; ++ a ; } a = + 0 ; y ( a [ b + 6 * 40 ] +) {a [d ] += ! ! ( b[ a + 5 * 6 * 8 ] - 4 * + 8 ) * 4; a = a + 1 ;} a= 0; y (a <3 *8 + *5 ) { r ( a [ d ] ) { e + = 1 ; y ( e[ a + d] ){ * ( d+ a+ e ) = a[ d ++e - 1] +( d [ a + e ] << ( 3* e) ) ;e + = e + 1 ;} a = a + +e - 1 ; v( !! ( * ( d+ + a) % ( 64 ) - 12 * 5 + ) + ( e +> 4 ) ?t [ e >2 ? 2 :a [ d ] ] :6 * 8 +( t [ d[ + a ]/ 8 /8 ] -4 ) %( 10 ) ) ; r( ! (2 [a ++ d] + 3 [d + a ] ) ) v ( 4 * 8 ) + ; } a = a + 1 ; } v (5 * 2 ) ; } z {c =b ; e += 0 ; y (* c ) { * c += - (* c > 8 * 12 + ) * 32 ; a = 8 * 8 ; r (* c + >= 48 &&* c<8 *8 -6) {*c =( * c + 1 + ) %( 5 * 2 ) + 65 ;y( --a >0 &&* +c- a[ t] ); d[ (e ++ )] =4 ;( + * ( d + (e ++) ))= 07 ;}z y(a -- >1 + &&* c- t[a ]); d[ ( e = e + 1) - +1] =a %8 ;y (a /= 8) d[ (e ++ + ) ] = a% 8 ; ++ c ; * ( e ++ +d ) =0 +;} -- e ;r ( e >0 ) {a = 1 ; +y ( a< 8 ) { c = b ;y + ( c + huffmancoding@gmail.com + + +Judges' comments: + + To use: + make huffman + echo 'Huffman Decoding' | ./huffman + + Try: + echo 'seeing or feeling is believing' | ./huffman + echo 'CC OR NOT CC' | ./huffman | ./huffman + + If you are still confused and want to read a spoiler, check out + the source and it will be clear as mud! + + And for a misleading hint, consider who won! :-) + + And if you really can't see what is going on, here is an extra spoiler: + + ./huffman < huffman.c + + This entry was very well received at the IOCCC BOF. + + +Selected notes from the author: + + This filter program is really not obfuscated code. It compiles cleanly + with an ANSI C compiler and comes with user documentation that even a + blind person could read. + + The program is a bi-directional filter with the output of the program + suitable for its input. The output of this program, when used as input, + undoes the original program filtering. + + This program accepts any alphanumeric text that has lines less than 100 + characters. The user is encouraged to use the program's source as input + to the executable. + + This program is best appreciated on a tactile monitor. diff --git a/1996/jonth.c b/1996/jonth.c new file mode 100644 index 000000000..06192abd8 --- /dev/null +++ b/1996/jonth.c @@ -0,0 +1,18 @@ +#define O B F U S C A T E D +#define I 8;}t(p){r(p?W:o);XClearWindow(V,m);}main(i,f)char**f;{M((T(h=f), +#define K Y(o,XMapRaised(V,e);)x=3;x--;)for(y=3;y--;r(G))XMapRaised(V,R[D] +#define N z(x+i,(z(H-x-i,x),x)))x20&&l>x +#define XIMOfIC Z;XID(*w)()=XCreateWindow,m,e,o[2],W[2],G[2],R[2][O]);}GC*g +#define E (++D)));}r(XID*z){XSetWindowBackgroundPixmap(V=d[D],m=R[D][x][y],z[ +#define L ;XStoreName(V,e=w(V,RootWindow(V,s),0,0,152,152,2,0,1,0,0,0),"II"+D +#define B 3][3];Display*V,*d[2];char**h,k=25,b[2500],H=50,D,s,x,y,i;T(){float +#define S +k),z(k-P=w(V,e,H*x,H*y,H,H,1,0,1,0,2048,&c));}XEvent J;M(){XFlush( +#define Y(z,y) ;for(z[D]=XCreatePixmapFromBitmapData(Q,x=0,H*H);xH||N;l-=.5)z(x+k,y=sqrt(l*l-x*x) +#include +#include diff --git a/1996/jonth.hint b/1996/jonth.hint new file mode 100644 index 000000000..833662fee --- /dev/null +++ b/1996/jonth.hint @@ -0,0 +1,45 @@ +Best X11 Entry: + + Jon Thingvold + University of Oslo + Gaustadveien 10B + N 0372 Oslo + Norway + + http://www.uio.no/~jonth/ + + +Judges' comments: + + To use: + make jonth + + ./jonth + + Also try: + + ./jonth host1:0 host2:0 + + NOTE: You may need to change the Makefile depending on where X11 + include files are found and what libs are required. For + example Solaris and Slowlaris need -lsocket. :-) + + For extra credit, figure out how you can cheat by taking over + a square already occupied by an opponent. + + +Selected notes from the author: + + This is mulituser tictactoe for X Windows. You may give one or two X + displays as arguments to this game. + + Known bugs: + + Sometimes on Solaris X gets confused and this program core dumps, + solution: give two display arguments (prog host:0 host:0) + + If one (or both) windows look like a copy of the window(s) below, + try xrefresh command. + + Have a nice(1) day. + diff --git a/1996/mkentry.c b/1996/mkentry.c new file mode 100644 index 000000000..cf50abe78 --- /dev/null +++ b/1996/mkentry.c @@ -0,0 +1,1226 @@ +/* @(#)mkentry.c 1.32 9/27/96 17:16:36 */ +/* + * Copyright (c) Landon Curt Noll & Larry Bassel, 1996. + * All Rights Reserved. Permission for personal, education or non-profit use + * is granted provided this this copyright and notice are included in its + * entirety and remains unaltered. All other uses must receive prior + * permission in writing from both Landon Curt Noll and Larry Bassel. + */ +/* + * mkentry - make an International Obfuscated C Code Contest entry + * + * usage: + * mkentry -r remarks -b build -p prog.c -o ioccc.entry + * + * -r remarks file with remarks about the entry + * -b build file containing how prog.c should be built + * -p prog.c the obfuscated program source file + * -o ioccc.entry ioccc entry output file + * + * compile by: + * cc mkentry.c -o mkentry + */ +/* + * Placed in the public domain by Landon Curt Noll, 1992. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* + * WARNING: + * + * This program attempts to implement the IOCCC rules. Every attempt + * has been made to make sure that this program produces an entry that + * conforms to the contest rules. In all cases, where this program + * differs from the contest rules, the contest rules will be used. Be + * sure to check with the contest rules before submitting an entry. + * + * FOR MORE INFORMATION: + * + * You may contact the judges by sending EMail to the following address: + * + * ...!{apple,sun,uunet}!hoptoad!judges (not the address for + * judges@toad.com submitting entries) + * + * Questions and comments about the contest are welcome. + * + * The rules and the guidelines may (and often do) change from year to + * year. You should be sure you have the current rules and guidelines + * prior to submitting entries. + * + * Because contest rules change from year to year, one should only use this + * program for the year that it was intended. Be sure that the RULE_YEAR + * define below matches this current year. + */ + +#include +#include +#include +#include +#include + +/* logic */ +#ifndef TRUE +# define TRUE 1 +#endif /* TRUE */ +#ifndef FALSE +# define FALSE 0 +#endif /* FALSE */ +#define EOF_OK TRUE +#define EOF_NOT_OK FALSE + +/* global limits */ +#define RULE_YEAR 1996 /* NOTE: should match the current year */ +#define START_DATE "4Mar92 0:00 UTC" /* first confirmation received */ +#define MAX_COL 79 /* max column a line should hit */ +#define MAX_BUILD_SIZE 256 /* max how to build size */ +#define MAX_PROGRAM_SIZE 3217 /* max program source size */ +#define MAX_PROGRAM_SIZE2 1536 /* max program source size not counting + whitespace and {}; not followed by + whitespace or EOF */ +#define MAX_TITLE_LEN 12 /* max chars in the title */ +#define MAX_ENTRY_LEN 1 /* max length in the entry input line */ +#define MAX_ENTRY 8 /* max number of entries per person per year */ +#define MAX_FILE_LEN 1024 /* max filename length for a info file */ + +/* where to send entries */ +#define ENTRY_ADDR1 "...!{apple,sun,uunet}!hoptoad!obfuscate" +#define ENTRY_ADDR2 "obfuscate@toad.com" + +/* uuencode process - assumes ASCII */ +#define UUENCODE(c) ((c) ? encode_str[(int)(c)&0x3f] : '`') +#define UUENCODE_LEN 45 /* max uuencode chunk size */ +#define UUINFO_MODE 0444 /* mode of an info file's uuencode file */ +#define UUBUILD_MODE 0444 /* mode of the build file's uuencode file */ +#define UUBUILD_NAME "build" /* name for the build file's uuencode file */ +#define UUPROG_MODE 0444 /* mode of the program's uuencode file */ +#define UUPROG_NAME "prog.c" /* name for the program's uuencode file */ + +/* encode_str[(char)val] is the uuencoded character of val */ +char encode_str[] = "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"; + +/* global declarations */ +char *program; /* our name */ +long start_time; /* the startup time */ + +/* forward declarations */ +void parse_args(); +void usage(); +FILE *open_remark(); +FILE *open_build(); +FILE *open_program(); +FILE *open_output(); +void output_entry(); +void output_remark(); +void output_author(); +void output_info(); +void output_build(); +void output_program(); +void output_end(); +int get_line(); +void output_till_dot(); +int col_len(); +void check_io(); +void uuencode(); + +main(argc, argv) + int argc; /* arg count */ + char **argv; /* the args */ +{ + FILE *remark=NULL; /* open remarks stream */ + FILE *build=NULL; /* open build file stream */ + FILE *prog=NULL; /* open program stream */ + FILE *output=NULL; /* open output stream */ + char *rname=NULL; /* file with remarks about the entry */ + char *bname=NULL; /* file containing how prog.c should be built */ + char *pname=NULL; /* the obfuscated program source file */ + char *oname=NULL; /* ioccc entry output file */ + struct tm *tm; /* startup time structure */ + + /* + * check on the year + */ + start_time = time((long *)0); + tm = gmtime(&start_time); + if (tm->tm_year != RULE_YEAR-1900) { + fprintf(stderr, + "%s: WARNING: this program applies to %d, which may differ from %d\n\n", + argv[0], RULE_YEAR, 1900+tm->tm_year); + } + + /* + * parse the command line args + */ + parse_args(argc, argv, &rname, &bname, &pname, &oname); + + /* + * open/check the input and output files + * + * We open and truncate the output file first, in case it is the same + * as one of the input files. + */ + output = open_output(oname); + remark = open_remark(rname); + build = open_build(bname); + prog = open_program(pname); + if (output==NULL || remark==NULL || build==NULL || prog==NULL) { + exit(1); + } + + /* + * output each section + */ + output_entry(output, oname); + output_remark(output, oname, remark, rname); + output_author(output, oname); + output_info(output, oname); + output_build(output, oname, build, bname); + output_program(output, oname, prog, pname); + output_end(output, oname); + + /* + * flush the output + */ + if (fflush(output) == EOF) { + fprintf(stderr, "%s: flush error in %s: ", program, oname); + perror(""); + exit(2); + } + + /* + * final words + */ + printf("\nYour entry can be found in %s. You should check this file\n", + oname); + printf("correct any problems and verify that the uudecode utility will\n"); + printf("correctly decode your build file and program.\n\n"); + printf("This program has been provided as a guide for submitters. In\n"); + printf("cases where it conflicts with the rules, the rules shall apply.\n"); + printf("It is your responsibility to ensure that your entry conforms to\n"); + printf("the current rules.\n\n"); + printf("EMail your entries to:\n"); + printf("\t%s\n", ENTRY_ADDR1); + printf("\t%s\n\n", ENTRY_ADDR2); + printf("Please use the following subject when you EMail your entry:\n"); + printf("\tioccc entry\n\n"); + /* all done */ + exit(0); +} + +/* + * parse_args - parse the command line args + * + * Given the command line args, this function parses them and sets the + * required name flags. This function will return only if the command + * line syntax is correct. + */ +void +parse_args(argc, argv, rname, bname, pname, oname) + int argc; /* arg count */ + char **argv; /* the args */ + char **rname; /* file with remarks about the entry */ + char **bname; /* file containing how prog.c should be built */ + char **pname; /* the obfuscated program source file */ + char **oname; /* ioccc entry output file */ +{ + char *optarg; /* -flag option operand */ + int flagname; /* the name of the -flag */ + int i; + + /* + * Not everyone has getopt, so we must parse args by hand. + */ + program = argv[0]; + for (i=1; i < argc; ++i) { + + /* determine the flagname */ + if (argv[i][0] != '-') { + usage(1); + /*NOTREACHED*/ + } + flagname = (int)argv[i][1]; + + /* determine the flag's operand */ + if (flagname != '\0' && argv[i][2] != '\0') { + optarg = &argv[i][2]; + } else { + if (i+1 >= argc) { + usage(2); + /*NOTREACHED*/ + } else { + optarg = argv[++i]; + } + } + + /* save the flag's operand in the correct global variable */ + switch (flagname) { + case 'r': + *rname = optarg; + break; + case 'b': + *bname = optarg; + break; + case 'p': + *pname = optarg; + break; + case 'o': + *oname = optarg; + break; + default: + usage(3); + /*NOTREACHED*/ + } + } + + /* + * verify that we have all of the required flags + */ + if (*rname == NULL || *bname == NULL || *pname == NULL || *oname == NULL) { + usage(4); + /*NOTREACHED*/ + } + return; +} + +/* + * usage - print a usage message and exit + * + * This function does not return. + */ +void +usage(exitval) + int exitval; /* exit with this value */ +{ + fprintf(stderr, + "usage: %s -r remarks -b build -p prog.c -o ioccc.entry\n\n", program); + fprintf(stderr, "\t-r remarks\tfile with remarks about the entry\n"); + fprintf(stderr, "\t-b build\tfile containing how prog.c should be built\n"); + fprintf(stderr, "\t-p prog.c\tthe obfuscated program source file\n"); + fprintf(stderr, "\t-o ioccc.entry\tioccc entry output file\n"); + exit(exitval); +} + +/* + * open_remark - open/check the remark file + * + * The remark file should be indented by 4 spaces, and should not extend + * beyond column MAX_COL. These are not requirements, so we only warn. + * + * This function returns NULL on I/O or format error. + */ +FILE * +open_remark(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + char buf[BUFSIZ+1]; /* input buffer */ + int toolong=0; /* number of lines that are too long */ + int non_indent=0; /* number of lines not indented by 4 spaces */ + + /* + * open the remark input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open remark file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * look at each line + */ + while (fgets(buf, BUFSIZ, stream) != NULL) { + + /* count lines that do not start with 4 spaces */ + if (buf[0] != '\n' && strncmp(buf, " ", 4) != 0) { + ++non_indent; + } + + /* count long lines */ + if (col_len(buf) > MAX_COL) { + /* found a line that is too long */ + ++toolong; + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* note long lines if needed */ + if (toolong > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s extend beyond the 80th column\n", + program, toolong, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* note non-indented lines, if needed */ + if (non_indent > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s are not indented by 4 spaces\n", + program, non_indent, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_build - open/check the build file + * + * The how to build file must not be longer than MAX_BUILD_SIZE bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_build(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + + /* + * open the how to build input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_BUILD_SIZE) { + fprintf(stderr, + "%s: FATAL: the how to build file: %s, is %d bytes long\n", + program, filename, statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_BUILD_SIZE); + return(NULL); + } + + /* return the open file */ + return(stream); +} + +/* + * open_program - open/check the program source file + * + * The program source file must be <= 3217 bytes. The number of + * non-whitespace and }{; chars not followed by whitespace must + * be <= 1536 bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_program(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + int count; /* special count size */ + int c; /* the character read */ + + /* + * open the program source input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open program source file: %s: ", + program, filename); + perror(""); + exit(7); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat program source file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_PROGRAM_SIZE) { + fprintf(stderr, + "%s: FATAL: the program source file: %s, is %d bytes long\n", + program, filename, statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_PROGRAM_SIZE); + return(NULL); + } + + /* + * count the non-whitespace, non {}; followed by whitespace chars + */ + count = 0; + c = 0; + while ((c=fgetc(stream)) != EOF) { + /* look at non-whitespace */ + if (!isascii(c) || !isspace(c)) { + switch (c) { + case '{': /* count if not followed by EOF or whitespace */ + case '}': + case ';': + /* peek at next char */ + c = fgetc(stream); + if (c != EOF && isascii(c) && !isspace(c)) { + /* not followed by whitespace or EOF, count it */ + ungetc(c, stream); + ++count; + } + break; + default: + ++count; + break; + } + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* look at the special size */ + if (count > MAX_PROGRAM_SIZE2) { + fprintf(stderr, + "%s: FATAL: the number of bytes that are non-whitespace, and\n", + program); + fprintf(stderr, + "%s: that are not '{', '}', ';' followed by whitespace\n", + program); + fprintf(stderr, + "%s: or EOF must be <= %d bytes\n", + program, MAX_PROGRAM_SIZE2); + fprintf(stderr, + "%s: in %s, %d bytes were found\n", + program, filename, count); + return(NULL); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_output - open/check the entry output file + * + * This function returns NULL on open error. + */ +FILE * +open_output(filename) + char *filename; +{ + FILE *stream; /* the opened file stream */ + + /* + * open the ioccc entry output file + */ + stream = fopen(filename, "w"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open ioccc entry file for output: %s: ", + program, filename); + perror(""); + exit(8); + } + + /* return the open file */ + return(stream); +} + +/* + * output_entry - output the ---entry--- section + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_entry(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + char title[MAX_TITLE_LEN+1+1]; /* the entry's title */ + char buf[MAX_COL+1+1]; /* I/O buffer */ + int entry=0; /* entry number */ + int ret; /* fields processed by fscanf */ + int ok_line=0; /* 0 => the line is not ok */ + char skip; /* input to skip */ + FILE *date_pipe; /* pipe to a date command */ + time_t epoch_sec; /* seconds since the epoch */ + char *p; + + /* + * write the start of the section + */ + fprintf(output, "---entry---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the rule year + */ + fprintf(output, "rule:\t%d-1\n", RULE_YEAR); + check_io(output, oname, EOF_NOT_OK); + + /* determine if this is a fix */ + printf("Is this a fix, update or resubmittion to a "); + printf("previous entry (enter y or n)? "); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + if (buf[0] == 'y') { + fprintf(output, "fix:\ty\n"); + check_io(output, oname, EOF_NOT_OK); + printf("\nBe sure that the title and entry number that you give\n"); + printf("are the same of as the entry you are replacing\n"); + } else { + fprintf(output, "fix:\tn\n"); + check_io(output, oname, EOF_NOT_OK); + } + + /* + * write the title + */ + printf("\nThe first character of your title should match [a-zA-Z0-9_=]\n"); + printf("The next 0 to %d characters should match [a-zA-Z0-9_=+-]\n\n", + MAX_TITLE_LEN-1); + printf("It is suggested, but not required, that the title should\n"); + printf("incorporate your username; in the\n"); + printf("case of multiple authors, consider using parts of the usernames\n"); + printf("of the authors.\n\n"); + printf("enter your title: "); + do { + /* prompt and read a line */ + if ((ok_line = get_line(title, MAX_TITLE_LEN+1, MAX_COL-9)) <= 0) { + printf("\ntitle is too long, please re-enter: "); + continue; + } + + /* verify the pattern, not everyone has regexp, so do it by hand */ + if (!isascii((int)title[0]) || + !(isalnum((int)title[0]) || title[0] == '_' || title[0] == '=')) { + printf("\ninvalid first character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } else { + for (p=(&title[1]); *p != '\0' && *p != '\n'; ++p) { + if (!isascii((int)*p) || + !(isalnum((int)*p) || + *p == '_' || *p == '=' || *p == '+' || *p == '-')) { + printf("\ninvalid character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } + } + } + } while (ok_line <= 0); + fprintf(output, "title:\t%s", title); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the entry number + */ + printf("\nEach person may submit up to %d entries per year.\n\n", + MAX_ENTRY); + printf("enter an entry number from 0 to %d inclusive: ", MAX_ENTRY-1); + do { + /* get a valid input line */ + fflush(stdout); + ret = fscanf(stdin, "%d[\n]", &entry); + check_io(stdin, "stdin", EOF_NOT_OK); + /* skip over input until newline is found */ + do { + skip = fgetc(stdin); + check_io(stdin, "stdin", EOF_NOT_OK); + if (skip != '\n') { + /* bad text in input, invalidate entry number */ + entry = -1; + } + } while (skip != '\n'); + + /* check if we have a number, and if it is in range */ + if (ret != 1 || entry < 0 || entry > MAX_ENTRY-1) { + printf( + "\nThe entry number must be between 0 and %d inclusive\n\n", + MAX_ENTRY-1); + printf("enter the entry number: "); + } + } while (ret != 1 || entry < 0 || entry > MAX_ENTRY-1); + fprintf(output, "entry:\t%d\n", entry); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the submission date + */ + /* returns a newline */ + epoch_sec = time(NULL); + fprintf(output, "date:\t%s", asctime(gmtime(&epoch_sec))); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the OS/machine host information + */ + printf( + "\nEnter the machine(s) and OS(s) under which your entry was tested.\n"); + output_till_dot(output, oname, "host:"); +} + +/* + * output_remark - output the ---remark--- section + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_remark(output, oname, remark, rname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + FILE *remark; /* stream to the file containing remark text */ + char *rname; /* name of the remark file */ +{ + char buf[BUFSIZ+1]; /* input/output buffer */ + + /* + * write the start of the section + */ + fprintf(output, "---remark---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * copy the remark file to the section + */ + while (fgets(buf, BUFSIZ, remark) != NULL) { + fputs(buf, output); + check_io(output, oname, EOF_NOT_OK); + } + check_io(remark, rname, EOF_OK); + + /* be sure that the remark section ends with a newline */ + if (buf[strlen(buf)-1] != '\n') { + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + } +} + +/* + * output_author - output the ---author--- section + * + * Read the needed information from stdin, and write the author section. + * If multiple authors exist, multiple author sections will be written. + */ +void +output_author(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + char buf[MAX_COL+1+1]; /* I/O buffer */ + int more_auths; /* TRUE => more authors to note */ + int auth_cnt=0; /* number of authors processed */ + + /* + * prompt the user for the author section + */ + printf("\nEnter information about each author. If your entry is after\n"); + printf("%s and before the contest deadline, the judges\n", START_DATE); + printf("will attempt to EMail back a confirmation to the first author\n"); + + /* + * place author information for each author in an individual section + */ + do { + + /* write the start of the section */ + fprintf(output, "---author---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* write the author */ + printf("\nAuthor #%d name: ", ++auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nname too long, please re-enter: "); + } + fprintf(output, "name:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the organization */ + printf("\nEnter the School/Company/Organization of author #%d\n", + auth_cnt); + printf("\nAuthor #%d org: ", auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter: "); + } + fprintf(output, "org:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the address */ + printf( + "\nEnter the postal address for author #%d. Be sure to include\n", + auth_cnt); + printf("your country and do not include your name.\n"); + output_till_dot(output, oname, "addr:"); + + /* write the EMail address */ + printf( + "\nEnter the EMail address for author #%d. Use an address from\n", + auth_cnt); + printf( + "a registered domain or well known site. If you give several\n"); + printf("forms, list them one per line.\n"); + output_till_dot(output, oname, "email:"); + + /* write the home page URL */ + printf( + "\nEnter the fully qualified home page URL for author #%d\n", + auth_cnt); + printf("including the http: part or type none: "); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0 || + (strncmp(buf, "http://", sizeof("http://")-1) != 0 && + strcmp(buf, "none\n") != 0)) { + printf("\nURL too long, does not begin with http:// or\n"); + printf("is not the word none\n"); + } + fprintf(output, "url:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the anonymous status */ + printf("\nShould author #%d remain anonymous (enter y or n)? ", + auth_cnt); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + fprintf(output, "anon:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* determine if there is another author */ + printf("\nIs there another author (enter y or n)? "); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + if (buf[0] == 'y') { + more_auths = TRUE; + } else { + more_auths = FALSE; + } + } while (more_auths == TRUE); + return; +} + +/* + * output_info - output the ---info--- section(s) + * + * Read the needed information from stdin, and write the info section. + * If multiple info files exist, multiple info sections will be written. + */ +void +output_info(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + char infoname[MAX_FILE_LEN+1]; /* filename buffer */ + char yorn[1+1]; /* y or n answer */ + char *uuname; /* name to uuencode as */ + FILE *infile; /* info file stream */ + + /* + * prompt the user for info information + */ + printf("\nInfo files should be used only to supplement your entry.\n"); + printf("For example, info files may provide sample input or detailed\n"); + printf("information about your entry. Because they are supplemental,\n"); + printf("the entry should not require them to exist.\n\n"); + + /* + * while there is another info file to save, uuencode it + */ + printf("Do you have a info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + while (yorn[0] == 'y') { + + /* read the filename */ + printf("\nEnter the info filename: "); + while (get_line(infoname, MAX_FILE_LEN+1, 0) <= 0) { + printf("\nInfo filename too long, please re-enter: "); + } + + /* compute the basename of the info filename */ + /* remove the trailing newline */ + uuname = &infoname[strlen(infoname)-1]; + *uuname = '\0'; + /* avoid rindex/shrrchr compat issues, do it by hand */ + for (--uuname; uuname > infoname; --uuname) { + if (*uuname == '/') { + ++uuname; + break; + } + } + + /* attempt to open the info file */ + infile = fopen(infoname, "r"); + if (infile == NULL) { + fprintf(stderr, "\n%s: cannot open info file: %s: ", + program, infoname); + perror(""); + continue; + } + + /* + * write the start of the section + */ + fprintf(output, "---info---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* uuencode the info file */ + uuencode(output, oname, infile, infoname, UUINFO_MODE, uuname); + + printf("\nDo you have another info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + }; + return; +} + +/* + * output_build - output the ---build--- section + * + * Read the needed information from stdin, and write the build section. + */ +void +output_build(output, oname, build, bname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + FILE *build; /* open build file stream */ + char *bname; /* name of the build file */ +{ + /* + * write the start of the section + */ + fprintf(output, "---build---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, build, bname, UUBUILD_MODE, UUBUILD_NAME); + return; +} + +/* + * output_program - output the ---program--- section + * + * Read the needed information form stdin, and write the program section. + */ +void +output_program(output, oname, prog, pname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + FILE *prog; /* open program stream */ + char *pname; /* name of program file */ +{ + /* + * write the start of the section + */ + fprintf(output, "---program---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, prog, pname, UUPROG_MODE, UUPROG_NAME); + return; +} + +/* + * output_end - output the ---end--- section + * + * Read the needed information form stdin, and write the 'end section'. + */ +void +output_end(output, oname) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ +{ + /* + * write the final section terminator + */ + fprintf(output, "---end---\n"); + check_io(output, oname, EOF_NOT_OK); + return; +} + +/* + * get_line - get an answer from stdin + * + * This function will flush stdout, in case a prompt is pending, and + * read in the answer. + * + * This function returns 0 if the line is too long, of the length of the + * line (including the newline) of the line was ok. This function does + * not return if ERROR or EOF. + */ +int +get_line(buf, siz, maxcol) + char *buf; /* input buffer */ + int siz; /* length of input, including the newline */ + int maxcol; /* max col allowed, 0 => disable check */ +{ + int length; /* the length of the input line */ + + /* flush terminal output */ + fflush(stdout); + + /* read the line */ + if (fgets(buf, siz+1, stdin) == NULL) { + /* report the problem */ + check_io(stdin, "stdin", EOF_NOT_OK); + } + + /* look for the newline */ + length = strlen(buf); + if (buf[length-1] != '\n') { + int eatchar; /* the char being eaten */ + + /* no newline found, line must be too long, eat the rest of the line */ + do { + eatchar = fgetc(stdin); + } while (eatchar != EOF && eatchar != '\n'); + check_io(stdin, "stdin", EOF_NOT_OK); + + /* report the situation */ + return 0; + } + + /* watch for long lines, if needed */ + if (maxcol > 0 && (length > maxcol || col_len(buf) > maxcol)) { + /* report the situation */ + return 0; + } + + /* return length */ + return length; +} + +/* + * output_till_dot - output a set of lines until '.' by itself is read + * + * This routine will read a set of lines until (but not including) + * a single line with '.' is read. The format of the output is: + * + * leader:\tfirst line + * \tnext line + * \tnext line + * ... + * + * This routine will not return if I/O error or EOF. + */ +void +output_till_dot(output, oname, leader) + FILE *output; /* entry's output file stream */ + char *oname; /* name of the output file */ + char *leader; /* the lead text for the first line */ +{ + char buf[BUFSIZ+1]; /* input buffer */ + int count; /* lines read */ + int done=FALSE; /* TRUE => finished reading input */ + + /* instruct the user on how to input */ + printf("\nTo end input, enter a line with a single period.\n"); + + /* read lines until '.' or EOF */ + count = 0; + while (!done) { + /* issue the prompt */ + printf("%s\t", (count>0) ? "" : leader); + fflush(stdout); + + /* get the line */ + if (get_line(buf, BUFSIZ, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter:\n\t"); + continue; + } + + /* note if '.' was read */ + if (strcmp(buf, ".\n") == 0) { + done = TRUE; + } + + /* write line if we read something */ + if (!done) { + fprintf(output, "%s\t%s", (count++>0) ? "" : leader, buf); + check_io(output, oname, EOF_NOT_OK); + } + } + + /* if no lines read, at least output something */ + if (count <= 0) { + fprintf(output, "%s\t.\n", leader); + check_io(output, oname, EOF_NOT_OK); + } + return; +} + +/* + * col_len - determine the highest that a string would reach + * + * Given a string, this routine returns that a string would reach + * if the string were printed at column 1. Tab stops are assumed + * to start at 9, 17, 25, 33, ... + */ +int +col_len(string) + char *string; /* the string to examine */ +{ + int col; /* current column */ + char *p; /* current char */ + + /* scan the string */ + for (col=0, p=string; *p != '\0' && *p != '\n'; ++p) { + /* note the column shift */ + col = (*p=='\t') ? 1+((col+8)/8*8) : col+1; + } + if (*p == '\n') { + --col; + } + + /* return the highest column */ + return col; +} + +/* + * check_io - check for EOF or I/O error on a stream + * + * Does not return if EOF or I/O error. + */ +void +check_io(stream, name, eof_ok) + FILE *stream; /* the stream to check */ + char *name; /* the name of this stream */ + int eof_ok; /* EOF_OK or EOF_NOT_OK */ +{ + /* test for I/O error */ + if (ferror(stream)) { + fprintf(stderr, "%s: error on %s: ", program, name); + perror(""); + exit(1); + + /* test for EOF */ + } else if (eof_ok == EOF_NOT_OK && feof(stream)) { + fprintf(stderr, "%s: EOF on %s\n", program, name); + exit(1); + } + return; +} + +/* + * uuencode - uuencode a file + * + * Perform the uuencoding process identical to the process performed + * by the uuencode(1) utility. + * + * This routine implements the algorithm described in the uuencode(5) + * 4.3BSD Reno man page. + */ +void +uuencode(output, oname, infile, iname, umode, uname) + FILE *output; /* output file stream */ + char *oname; /* output filename */ + FILE *infile; /* input file stream */ + char *iname; /* input filename */ + int umode; /* the mode to put on the uuencode file */ + char *uname; /* name to put on the uuencode file */ +{ + char buf[UUENCODE_LEN+1]; /* the uuencode buffer */ + int read_len; /* actual number of chars read */ + int val; /* 6 bit chunk from buf */ + char filler='\0'; /* filler uuencode pad text */ + char *p; + + /* + * output the initial uuencode header + */ + fprintf(output, "begin %o %s\n", umode, uname); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + + /* + * We will process UUENCODE_LEN chars at a time, forming + * a single output line each time. + */ + while ((read_len=fread(buf,sizeof(buf[0]),UUENCODE_LEN,infile)) > 0) { + + /* + * the first character is the length character + */ + fputc(UUENCODE(read_len), output); + check_io(output, oname, EOF_NOT_OK); + + /* + * We will convert 24 bits at a time. Thus we will convert + * 3 sets of 8 bits into 4 sets of uuencoded 6 bits. + */ + for (p=buf; read_len>0; read_len-=3, p+=3) { + + /* bits 0 to 5 */ + val = (p[0]>>2)&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 6 to 11 */ + val = ((p[0]<<4)&0x30) | ((p[1]>>4)&0x0f); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 12 to 17 */ + val = ((p[1]<<2)&0x3c) | ((p[2]>>6)&0x03); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 18 to 23 */ + val = p[2]&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + } + + /* end of UUENCODE_LEN line */ + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer (don't depend on bzero() or memset()) + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + } + + /* check the last read on the input file */ + check_io(infile, iname, EOF_OK); + + /* write end of uuencode file */ + fprintf(output, "%c\nend\n", UUENCODE(filler)); + check_io(output, oname, EOF_NOT_OK); +} diff --git a/1996/parse.oc b/1996/parse.oc new file mode 100644 index 000000000..1bd531d5a --- /dev/null +++ b/1996/parse.oc @@ -0,0 +1,463 @@ +int curloc; +int lexval; +int token; +int pusharg; +int thechar; +int nglob; +int nlocal; +int nfun; +int strsize; +int narg; +int curgloboffs; +int nsym; +int pushop; +int argids[50 ]; +int globids[300 ]; +int globoffs[300 ]; +int globscalar[300 ]; +int funids[300 ]; +int funoffs[300 ]; +int localids[50 ]; +char symbol[5000 ]; +char code[5000 ]; +char names[5000 ]; +int +digit(int c) +{ + return (( '/' < c ) * ( c < ':' )) ; +} +int +letter(int c) +{ + return (( '`' < c ) * ( c < '{' )) + ; +} +int +eqstr(char *p, char *q) +{ + while(*p) { + if (*p++ != *q++) + return 0; + } + return !*q; +} +int +lookup(char *name) +{ + int i; + char *ns; + ns = names; + i = 0; + while(i < nsym) { + if (eqstr(ns, name)) { + return i; + } + while(*ns++) + ; + i++; + } + while(*ns++ = *name++) + ; + return nsym++; +} +int +next() +{ + int r; + r = thechar; + thechar = getchar(); + return r; +} +int +gobble(int t, int rr, int r) +{ + if (thechar == t) { + next(); + return rr; + } + return r; +} +int +getstring(int delim) +{ + int c; + strsize = 0; + while((c = next()) != delim) { + if (c == '\\') { + if ( (c = next()) == 'n') c = '\n'; + if (c == 't') c = '\t'; + if (c == '0') c = 0; + } + symbol[strsize++] = c; + } + symbol[strsize++] = 0; +} +int +getlex() +{ + int c; + char *p; + while( (( 0 < (c = next()) ) * ( c < '!' )) ) + ; + if ((( c == -1 ) + ( + (( c == '(' ) + ( + (( c == ')' ) + ( + (( c == '[' ) + ( + (( c == ']' ) + ( + (( c == '{' ) + ( + (( c == '}' ) + ( + (( c == ',' ) + ( + c == ';' )) )) )) )) )) )) )) )) ) + return c; + if (c == '/') { + if (thechar == '*') { + while((( next() != '*' ) + ( thechar != '/' )) ) + ; + next(); + return getlex(); + } else + return 1115 ; + } + if (c == '*') return 1114 ; + if (c == '%') return 1116 ; + if (c == '-') + return gobble(c,1225 ,1013 ); + if (c == '<') + return 808 ; + if (c == '=') + return gobble(c,806 ,101 ); + if (c == '+') + return gobble(c,1219 ,1012 ); + if (c == '!') + return gobble('=',807 ,1217 ); + if (c == '\'') { + getstring(c); + lexval = symbol[0]; + return 257 ; + } + if (c == '"') { + getstring(c); + return 258 ; + } + if (digit(c)) { + lexval = c - '0'; + while(digit(thechar)) { + lexval = lexval * 10 + next() - '0'; + } + return 257 ; + } + p = symbol; + *p++ = c; + while(letter(thechar)) + *p++ = next(); + *p = 0; + if ( (lexval = lookup(symbol)) < 7 ) { + if (lexval == 6 ) + return 517 ; + return lexval + 512 ; + } + return 256 ; +} +int +istoken(int t) +{ + if (token == t) { + token = getlex(); + return 1; + } + return 0; +} +int +type() +{ + istoken( 517 ) ; + while(istoken(1114 )) + ; +} +int +name() +{ + int r; + r = lexval; + token = getlex(); + return r; +} +int +emit(int opc) +{ + code[curloc++] = opc; +} +int +emitat(int a, int c) +{ + code[a++] = c; + code[a] = c/256; +} +int +emitop(int rator, int rand) +{ + int r; + emit(rator+ 7 ); + r = curloc; + emit(rand); + emit(rand/256); + return r; +} +int +pushloop(int puop, int max, int *arr) +{ + int i; + i = 0; + pushop = puop; + while (i < max) { + if (arr[i] == lexval) { + pusharg = i; + return 1; + } + i++; + } + return 0; +} +int +pushval() +{ + int lval; + lval = 1; + if (pushloop(64 , nlocal, localids)) { + } else if (pushloop(32 , narg, argids)) { + pusharg = narg-pusharg-1; + } else if (pushloop(96 , nglob, globids)) { + lval = globscalar[pusharg]; + pusharg = globoffs[pusharg]; + } else { + lval = 0; + if (pushloop(192 , nfun, funids)) { + pusharg = funoffs[pusharg]; + } else if (lexval < 9 ) { + pusharg = lexval- 7 ; + } + } + emitop(pushop, pusharg); + return lval; +} +int +pderef(int l) +{ + if (l) + emit(23 ); +} +int +expr(int needval, int prec) +{ + int na; + int islval; + int jdst; + int op; + int any; + int opprec; + islval = 0; + if (istoken(257 )) { + emitop(128 , lexval); + } else if (istoken(258 )) { + emitop(144 , strsize); + any = 0; + while(any < strsize) + emit(symbol[any++]); + } else if (istoken(256 )) { + islval = pushval(); + } else if (istoken('(')) { + islval = expr(0, 0 ); + istoken( ')' ) ; + } else if (istoken(1217 )) { + expr(1, 100 ); + emit(17 ); + } else if (istoken(1013 )) { + expr(1, 100 ); + emit(18 ); + } else if (istoken(1114 )) { + expr(1, 100 ); + islval = 1; + } + any = 1; + while(any) { + op = token % 100 ; + if (istoken('(')) { + pderef(islval); + na = 0; + if (!istoken(')')) { + do { + expr(1, 0 ); + na++; + } while(istoken(',')); + istoken( ')' ) ; + } + emitop(176 , na*2); + islval = 0; + } else if (istoken('[')) { + pderef(islval); + expr(1, 0 ); + emit(12 ); + istoken( ']' ) ; + islval = 1; + } else if (istoken(1219 )) { + emit(op); + islval = 0; + } else if (istoken(1225 )) { + emit(op); + islval = 0; + } else + any = 0; + } + opprec = token / 100 ; + while (prec < opprec) { + if ( (op = token % 100 ) != 1 ) { + pderef(islval); + } + { + token = getlex(); + expr(1, opprec); + emit(op); + } + islval = 0; + opprec = token / 100 ; + } + if (needval) { + pderef(islval); + islval = 0; + } + return islval; +} +int +pexpr() +{ + istoken( '(' ) ; + expr(1, 0 ); + istoken( ')' ) ; +} +int +stmt() +{ + int jdest; + int tst; + if (istoken('{')) { + while(!istoken('}')) + stmt(); + } else if (istoken(513 )) { + pexpr(); + jdest = emitop (224 , 0); + stmt(); + if (istoken(514 )) { + tst = emitop (208 , 0); + emitat(jdest, curloc); + stmt(); + emitat(tst, curloc); + } else { + emitat(jdest, curloc); + } + } else if (istoken(515 )) { + tst = curloc; + pexpr(); + jdest = emitop (224 , 0); + stmt(); + emitop (208 , tst); + emitat(jdest, curloc); + } else if (istoken(516 )) { + jdest = curloc; + stmt(); + istoken( 515 ) ; + pexpr(); + emit(17 ); + emitop (224 , jdest); + } else if (istoken(512 )) { + expr(1, 0 ); + istoken( ';' ) ; + emit(10 ); + } else if (istoken(';')) { + } else { + expr(1, 0 ); + emit(22 ); + istoken( ';' ) ; + } +} +int +parse() +{ + int objid; + token = getlex(); + while(1) { + if (token < 0) + return 1; + type(); + objid = name(); + if (istoken('(')) { + funids[nfun] = objid; + funoffs[nfun++] = curloc; + narg = 0; + if (!istoken(')')) { + do { + type(); + argids[narg++] = name(); + } while(istoken(',')); + istoken( ')' ) ; + } + istoken( '{' ) ; + nlocal = 0; + while(token == 517 ) { + type(); + do { + localids[nlocal++] = name(); + } while (istoken(',')); + istoken( ';' ) ; + } + while(!istoken('}')) + stmt(); + emit(10 ); + } else { + globoffs[nglob] = curgloboffs; + if (istoken('[')) { + istoken( 257 ) ; + curgloboffs = curgloboffs + lexval; + istoken( ']' ) ; + globscalar[nglob] = 0; + } else { + curgloboffs++; + globscalar[nglob] = 1; + } + globids[nglob++] = objid; + istoken( ';' ) ; + } + } +} +int +main( + ) +{ + int n; + char *p; + char *q; + nsym = 9 ; + p = names; + q = "return\0if\0else\0while\0do\0int\0char\0getchar\0putchar" ; + n = 48 ; + do + *p++ = *q++; + while(n--); + curloc = 7; + thechar = getchar(); + parse(); + n = curloc; + curloc = 0; + lexval = lookup("main"); + pushval(); + emitop(176 , 0); + emit(27 ); + putchar(0); + putchar(0); + putchar(n); + putchar(n/256); + p = code; + while(n--) { + putchar(*p++); + } + return 0; +} diff --git a/1996/rcm.c b/1996/rcm.c new file mode 100644 index 000000000..0864baf5a --- /dev/null +++ b/1996/rcm.c @@ -0,0 +1,119 @@ +#include T +#include Y + +H W[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 } +,u[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, +59, 67, 83, 99, 115, 131, 163, 195, 227, 258 } ,P[] = { A A 1, 1, 1, 1, 2, +2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 } ,Q[] = { 1, 2, 3, 4, 5, 7, 9, +13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, +3073, 4097, 6145, 8193, 12289, 16385, 24577 } ,L[] = { A 1, 1, 2, 2, 3, 3, +4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 }, y, C, t, +Z[320], b[17], G[17]; H long j; H char S[K]; n { n *o, *O; H l; } F, *V, *h, +*I, **e; + +H U H l, H O) +{ + H w = 0, o, f, q; J !O) { ; { + U 24, 1); o = U 8, 1); U 24, 1); U 24, 1); { + J o & 4) { ; X q = U 16, 1); q--; U 8, 1)); } ; { + X; o & 8 && U 8, 1); ) { ; ; + } + } + X; o & 16 && U 8, 1); ); + o & 2 && U 16, 1); +} + +X o = 0; !o; ) { ; +{ + o = U 1, 1); q = U 2, 1); J + q || U 8, 7)) { ; { ; { ; } ; ; ; + q & 1 && U 7, 8); + q & 2 && U 3, 9); U 5, 6); + I = V; U 2, 4); I = h; U 9, 4); } ; } + } ; ; { ; } ; { ; } ; { ; } ; { ; } +} + +X; (C M) != (t M); N (C++[S])); } ; } + +s 6) +{ + ; { ; { ; } X; (O = U 6, (I = V, 3) )) != 256; ) + J O > 256 || (U O, 2), 0)) { ; { + O -= 257; l = u[O] + U P[O], 1); + I = h; O = U 5, 3); O = Q[O] + U L[O], 1); + O = O <= t ? + t - O : K - O + t; X; l--; O M) U S[O++], 2) ; } ; } + } + ;} s 3) { + ; { X; I->o; I = U 1, 1) ? I->O : I->o); w = I->l; } ; + } s 5) { ; { X O = 17; O--; O[b] = + 0); X O++; O < l; + O++[Z][b]++); + X *b = *G = O = 0 ; O < 16; O++) { ; { + G[O+1] = (O[G] + b[O]) << 1; ; } +} + +X I = 0, O = 0; O < l; O++) J Z[O]) { ; +{ + X e = (q = O[Z][G], Z[O][G]++, + o = Z[O], &I); o-- && (*e || ((*(*e = R) = F), 1)); + e = ((q >> o) & 1) ? &(*e)->O : &(*e)->o); + *(*e = R) + = F; (*e)->l = O; } ; } } ; } s 2) { ; { + t++[S] = l; (t M) == (C M) + && N (C++[S]); } ; } s 8) { ; { + X O = 288; O--; Z[O] = O < 144 ? 8 + : O < 256 ? 9 : O < 280 ? 7 : 8); V = (U 288, 5), + I); { ; { X O = 32; O--; + Z[O] = 5); + } +} + +h = (U 32, 5), I); } ; } s 1 && l) +{ + ; { { ; } ; { ; } ; { ; } ; { ; } + X; y < l; y += 8) + j |= 0l + D << y; w = j + & (1 << l) - 1; + j >>= l; y -= l; } ; } s 7) { ; { y % 8 && U y % 8, 1); + X O = U 16, 1), U 16, 1); O--; U U 8, 1), 2)); + } ; + } + s 9) { ; { + H p = U 5, 1) + 257, z = U 5, 1) + 1, v = U 4, + 1) + 4; { X O = 0; O < v; O++[W][Z] = U 3, 1)); + X; 19 > O; W[O++][Z] = 0); { ; + } +} + +V = (U 19, 5), I); +{ + X l = O = 0; O < (p + z); ) { + I = V; o = U 3, 3); f = o == 16 + ? (o = l), 3 + U 2, 1) : o == 17 ? + (o = 0), 3 + U 3, 1) : o == 18 ? (o = 0), + 11 + U 7, 1) : ((l = o), 1); X q = f; q--; + O++[Z] = o); ; ; ; ; ; { ; } +} + +I = V; +{ + U 9, 4); } + V = (U p, 5), I); + X O = z; O--; + Z[O] = Z[O+p]); + h = (U z, 5), + I); } ; ; ; } ; ; ; } s + 4) { ; ; ; { n * + i = I; i && ( + I = i->o, U 7, 4), + I = i->O, + free (i), U 1, 4)); + } ; } + return w; +} + +main () +{ + return B (3, 0); +} diff --git a/1996/rcm.hint b/1996/rcm.hint new file mode 100644 index 000000000..dde333d4b --- /dev/null +++ b/1996/rcm.hint @@ -0,0 +1,69 @@ +Best RFC Obfuscation: + + Ron McFarland + 7941 Fawncreek Drive + Cincinnati, Ohio 45249 + USA + + +Judges' comments: + + To use: + make rcm + ./rcm < rfc1951.gz + + Also try: + + ./rcm < rfc1952.gz + + And for more information try: + + ./rcm < rfc1951.gz + ./rcm < rfc1952.gz + + For a good noop try: + + gzip -c < rcm.c | ./rcm + + +Selected notes from the author: + + Except for some silly requirements regarding input validation, CRC + checking, and similar unimportant fluff, this program is a fully + compliant RFC1951/RFC1952 (GNU Gzip) file uncompressor. Feed it a + "gzip" compressed file on standard input, and it will write the fully + uncompressed original file to standard output. + + ObJustifications for this entry: + + The Design Trade-off Argument + + "The 184 characters worth of defines in the build file have been + carefully offset by 184 redundant and unecessary '{', '}', and ';' + characters in the source file." + + The Design Review Argument + + "Using only 216 characters out of a maximum of 256, the build file + meets and actually exceeds specification." + + The Program Metrics Argument + + "The program source is less than 3,100 characters in length and + uncompresses file `emacs-19.34b.tar.gz' in about 130 seconds on + my HP 9000/735. The now obsolete source file `inflate.c' from + the GNU gzip source tree is 31,613 characters in length and + uncompresses the emacs distribution file in slightly under 25 + seconds. Thus: + + 3100 / 130 = 23.85 -vs- 31613 / 25 = 1264.52 + + which represents a better than 530% improvement in the ratio of + source file size to execution time." + + The Whining Programmer's Argument + + "The inflate algorithm requires that over 400 characters worth + of constants and tables be defined. Which means the program + itself had to be squeezed down to about 1,100 IOCCC countable + bytes." diff --git a/1996/rfc1951.gz b/1996/rfc1951.gz new file mode 100644 index 000000000..b3e92c698 Binary files /dev/null and b/1996/rfc1951.gz differ diff --git a/1996/rfc1952.gz b/1996/rfc1952.gz new file mode 100644 index 000000000..f755080c9 Binary files /dev/null and b/1996/rfc1952.gz differ diff --git a/1996/rules b/1996/rules new file mode 100644 index 000000000..2eb854696 --- /dev/null +++ b/1996/rules @@ -0,0 +1,219 @@ + 13th International Obfuscated C Code Contest Rules + +Copyright (c) Landon Curt Noll, Larry Bassel and Sriram Srinivasan, 1996. +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from Landon Curt Noll, Larry Bassel and Sriram Srinivasan. + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: his emotions obfuscated his + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show the importance of programming style, in an ironic way. + * To stress C compilers with unusual code. + * To illustrate some of the subtleties of the C language. + * To provide a safe forum for poor C code. :-) + +The 13th IOCCC contest window is: | + + 01-Oct-96 12:00 UTC to 01-Dec-96 12:00 UTC | + +NOTE: Some of the changes from the 1995 rules are denoted by change bars. ---> | + However some changes such as 1995 to 1996 are not marked. | + + +RULES: + + To help us with the volume of entries, we ask that you follow these rules: + + 1) Your entry must be a complete program. + + 2) Your entry must be <= 3217 bytes in length. The number of characters + excluding whitespace (tab, space, newline), and excluding any ; { or } + immediately followed by whitespace or end of file, must be <= 1536. + + 3) Your entry must be submitted in the following format: + +---entry--- +rule: 1996-1 +fix: y or n (n => this is a new entry, y => this replaces an older entry) +title: title of entry (see comments below) +entry: Entry number from 0 to 7 inclusive (your 1st entry should by 0) +date: Date/time of submission in UTC (see comments below) +host: Machine(s) and OS(s) under which your entry was tested + Use tab indented lines if needed +---remark--- + Place remarks about this entry in this section. It would be helpful if + you were to indent your remarks with 4 spaces, though it is not a + requirement. Also, if possible, try to avoid going beyond the 79th + column. Blank lines are permitted. +---author--- +name: your name +org: School/Company/Organization +addr: postal address + use tab indented lines to continue + don't forget to include the country +email: EMail address from a well known site or registered domain. + If you give several forms, list them on separate tab indented lines. +url: http://your/home/page.html or say none if you don't have one | +anon: y or n (y => remain anonymous, n => OK to publish this info) +---info--- +If your program needs an info file, place a uuencoded copy of it in +this section. In the case of multiple info files, use multiple info +sections. If your entry does not need a info file, skip this section. +---build--- +Place a uuencoded copy of the command(s) used to compile/build your program +in this section. It must uudecode into a file named 'build'. The resulting +file must be 255 bytes or less. +---program--- +Place a uuencoded copy of your program in this section. It must uudecode +into a file named is 'prog.c'. The resulting file must follow rule #2. +---end--- + + Regarding the above format: + + * The title must match the expression: | + + ^[a-zA-Z0-9_=][a-zA-Z0-9_=+-]*$ | + + and must be 1 to 12 characters in length. + + It is suggested, but not required, that the title should + incorporate the author(s) username(s). + + * The date in the ---entry--- section should be given with respect + to UTC. The format of the date should be as returned by asctime() + using the C locale. (see guidelines for more info) + + * You may correct/revise a previously submitted entry by sending + it to the contest email address. Be sure to set 'fix' in the + ---entry--- section to 'y'. The corrected entry must use the same + title and entry number as submission that is being corrected. Be + sure that you note the re-submission in the ---remark--- as well. + + * With the exception of the header, all text outside of the above + format may be ignored by the judges. If you need to tell the judges + something, put it in the ---remark--- section, or send a separate + EMail message to the judges. + + * Information from the ---author--- section will be published unless + 'y' was given to the respective author's 'anon' line. + + * To credit multiple authors, include an ---author--- section for + each author. Each should start with ---author--- line, and + should be found between the ---entry--- and ---build--- sections. + + * The home page URL in the ---author--- section must be fully | + qualified or must be the word `none'. | + + * The entry's remarks should include: + - note if this entry is a re-submission of a previous entry. + - what this program does + - how to run the program (sample args or input) + - special compile or execution instructions, if any + - special filename requirements (see rule 4 and 5) + - information about any ---info--- files + - why you think the program is obfuscated + - any other remarks (humorous or otherwise) + + * Do not rot13 your entry's remarks. You may suggest that certain + portions of your remarks be rot13ed if your entry wins an award. + + * Info files should be used only to supplement your entry. They + should not be required to exist. + + * If your entry does not need an info file, skip the ---info--- + section. If your entry needs multiple info files, use multiple + ---info--- sections, one per info file. You should describe + each info file in the ---remark--- section. + + * Your sections must in the same order as in the above template. + + 4) If your entry is selected as a winner, it will be modified as follows: + + 'build' is incorporated into a makefile, and 'build' is removed + 'prog.c' is renamed to your entry's title, followed by an optional + digit, followed by '.c' + your entry is compiled into a file with the name of your entry's + title, possibly followed by a digit + + If your entry requires that a build file exist, state so in your + entry's remark section. The makefile will be arranged to execute a + build shell script containing the 'build' information. The name of + this build shell script will be your entry's title, possibly followed + by a digit, followed by '.sh'. + + If needed, your entry's remarks should indicate how your entry must + be changed in order to deal with the new filenames. + + 5) The build file, the source and the resulting executable should be + treated as read-only files. If your entry needs to modify these files, + it should make and modify a copy of the appropriate file. If this + occurs, state so in your entry's remarks. + + 6) The uudecoded ---program--- section must be able to be compiled + cleanly by an ANSI C compiler, or if there are any compile errors, + they must be documented in the ---remark--- section. + + 7) The program must be of original work. All programs must be in the + public domain. All copyrighted programs will be rejected. + + 8) Entries must be received prior to 01-Dec-96 12:00 UTC. (UTC is | + essentially equivalent to Greenwich Mean Time) EMail your entries to: + + ...!{apple,sun,uunet}!hoptoad!obfuscate + obfuscate@toad.com + + We request that your message use the subject 'ioccc entry'. + + If possible, we request that you hold off on EMailing your entries + until 01-Oct-96 12:00 UTC. Early entries will be accepted, however. | + We will attempt to EMail a confirmation to the sender of any entry + received after 01-Oct-96 12:00 UTC and before the close of the contest. | + + 9) Each person may submit up to 8 entries per contest year. Each entry + must be sent in a separate EMail letter. + + 10) Entries requiring human interaction to be built are not allowed. + + 11) Programs that require special privileges (setuid, setgid, super-user, + special owner or group) are not allowed. + + 12) Legal abuse of the rules is somewhat encouraged. An entry that, in + the opinion of the judges, violates the rules will be disqualified. + Entries that attempt to abuse the rules must try to justify why + their rule abuse is legal in the ---remark--- section. + + +FOR MORE INFORMATION: + + The judging will be done by Landon Noll, Larry Bassel and Sriram + Srinivasan. Please send questions or comments about the contest, to: + + ...!{apple,sun,uunet}!hoptoad!judges (not the address for + judges@toad.com submitting entries) + + Comments about confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, send EMail to the address + above and use the subject 'send rules'. + + Check out the IOCCC Web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + +chongo /\cc/\ {chongo,noll}@{toad,sgi}.com +Larry Bassel labbmf@ix.netcom.com +Sriram Srinivasan sriram@tcs.com diff --git a/1996/schweikh1.c b/1996/schweikh1.c new file mode 100644 index 000000000..9f40b72a9 --- /dev/null +++ b/1996/schweikh1.c @@ -0,0 +1,33 @@ +#define _POSIX_SOURCE +#include +#include +#define extern/* ioccc*/ +#define condition 22+d+e> 31 +#define declarator main ( void ) +#define keyword ae(t,d+e-9); ae(m,4) +#define false ae (t, d+ e+ 22); ae (m,3) +#define syntax_error(n); } else if (J < n) { +#define relational_expression(i, o, ccc) i o ccc +#define errno translation_unit/*Apollo 13*/int errno +#define iterative_statement for ( expressions ) block +#define translation_unit declarator compound_statement +#define ae(unary_expression,ae) unary_expression= ae +#define declaration char T[16]; struct tm ae(s,{ 0}) +#define if_part {macrolist list ae(b,J%4); type_name +#define tokens if (t==25&&d==28 &&a > 10) ae (t, 18) +#define selection_statement(a,b,c) if(a){b; } else{ c; } +#define storage_class ae(e,(2*b+4*c+6*d+N)%7); statement +#define statement_list iterative_statement return'^'^'^' +#define macro(x,y,cast) ae(M,x); ae(N,y)syntax_error(cast) +#define block { if(relational_expression(J,<,1700))if_part;} +#define declaration_list int J,a,b,c,d, e,t,m,M,N; declaration +#define true keyword; selection_statement(t==26,ae(t,19),tokens) +#define compound_statement { declaration_list ; statement_list ; } +#define expressions ae(J,1582); relational_expression(J,<,2200); ++J +#define list macro (24, 5, 2200) ae(M, 24); ae(N, 6); } ae(a, J % 19); +#define type_name ae (c, J % 7);ae (d, (19 * a + M) % 30); storage_class +#define statement selection_statement ( condition,true,false)pptoken cast +#define macrolist macro(22,2,1800)macro (23, 3,1900) macro (23, 4, 2100) +#define pptoken ae(s.tm_year,J-1900);ae (s.tm_mon,m-1); ae(s.tm_mday,t); +#define cast (void)strftime(T,sizeof T, "%a %b %d %Y",&s),(void)puts(T); +#include diff --git a/1996/schweikh1.hint b/1996/schweikh1.hint new file mode 100644 index 000000000..dec510b08 --- /dev/null +++ b/1996/schweikh1.hint @@ -0,0 +1,108 @@ +Worst Abuse of the C Preprocessor: + + Jens Schweikhardt + DFN Network Operation Center + Schlartaeckerweg 3 (home address) + D-71384 Weinstadt + Germany + + http://www.uni-stuttgart.de/People/schweikhardt/home.html + + +Judges' comments: + + To use: + make schweikh1 + ./schweikh1 + + Look at the source. There is something very odd going on here. + Where does the real code come from if everything is a C pre-processor + statement? + + Clearly this is either the Best Use or the Worst Abuse of the + C Preprocessor that the judges have seen this year! + + +Selected notes from the author: + + What this program does + ---------------------- + + This program is an implementation of an algorithm that calculates + the date of the Sunday following the first full moon after the + spring equinoxe. (Also known as "Easter", defined this way by the + Nicaean Concilium in 325 Anno Domini.) The algorithm is attributed + to the famous mathematician Carl Friedrich Gauss ["Meyers Handbuch + ueber das Weltall", Meyer, 5th Edition, 1973, p149] and is suitable + for anni domini within the Gregorian Calendar, that is, from 1582 AD + to 2199 AD: + + Let J be the year. + If J is from 1582 to 1699, let M be 22, let N be 2 + If J is from 1700 to 1799, let M be 23, let N be 3 + If J is from 1800 to 1899, let M be 23, let N be 4 + If J is from 1900 to 2099, let M be 24, let N be 5 + If J is from 2100 to 2199, let M be 24, let N be 6 + Let a be the modulus of J divided by 19 + Let b be the modulus of J divided by 4 + Let c be the modulus of J divided by 7 + Let d be the modulus of (19a + M) divided by 30 + Let e be the modulus of (2b + 4c + 6d + N) divided by 7 + The interesting Sunday is either + March 22 + d + e or + April d + e - 9 (only one of them is a valid date) + with the following exceptions: + April 26 must always be changed to April 19 + April 25 must be changed to April 18 if d is 28 and a greater than 10 + + Example: J = 1962, M = 24, N = 5 + a = J % 19 = 5 + b = J % 4 = 2 + c = J % 7 = 2 + d = 119 % 30 = 29 + e = 191 % 7 = 2 + March 53 is invalid, so the result is April 22 1962 + + Why I think this is obfuscated + ------------------------------ + + Apart from the calculation of the Easter date, the definition *and* + calculation of which are obfuscations in their own right, + obfuscation lurks in many places. Look at those macro identifiers. + What can be more obvious than a program that explicitly mentions the + grammatical constructs it is composed of? If you look at K&RII A.9.3 + you will find that a compound statement consists of an opening brace + followed by a declaration list followed by a semicolon followed by a + statement list followed by another semicolon and a closing brace. + Nobody can learn that by heart so I gently remind the reader by + defining a macro that expresses this clearly (line 25). This goes up + to the definition of a translation unit. Unfortunately, due to the + IOCCC's size restrictions, I had to abbreviate some syntactic + elements. "ae" actually reads "assignment expression". I had to stop + at some arbitrary point, so don't waste your time trying to find out + how preprocessing tokens form type qualifier lists, cast expressions + or direct abstract declarators. Assuming the reader knows about + these easy to remember language elements is justified in my opinion. + + + The moral: + Try to be as precise as can be and no one will comprehend what you mean. + + The formula: + comprehension = 1/(2**precision) + + The interpretation: + "Say nothing and everybody will understand." + + The -I/usr/include in the build file is needed by gcc on Solaris because + gcc's "fixed" header in gcc-lib/sparc-sun-solaris2.5/2.7.2/include/errno.h + is broken (sort of) because it has *two* identical extern + declarations of errno. This leads to an error due to the + redefinition of main. The -I option makes sure the working + /usr/include/errno.h is found first, which shouldn't harm on other + systems. + + Usage + ----- + + The program is run without arguments. It prints all dates in order. diff --git a/1996/schweikh2.c b/1996/schweikh2.c new file mode 100644 index 000000000..a67d381c1 --- /dev/null +++ b/1996/schweikh2.c @@ -0,0 +1,98 @@ +#define C " " +#define O( _ ) # _ +#define R( n , d ) e ( n , d ) +#define e(p,o)o##p +#define D O ( % ) O ( l ) O ( d ) +#define U R ( e ( g , n ) , e ( o , l ) ) +#define M H ( R ( e ( c , i ) , t ) , R ( e ( a , t ) , s ) ) +#define P H ( R ( e ( f , t ) , n ) , R ( e ( i , r ) , p ) ) ( +#define H(O,r)R(O,r) +#include + H ( R ( e ( f , e ) , e ( d , e +) ) , R ( e ( p , y ) , t ) ) H +( R ( e ( t , c ) , u ) , R ( e +( r , t ) , s ) ) { U n , t ; } +F ; H ( R ( e ( f , e ) , e ( d +, e ) ) , R ( e ( p , y ) , t ) +) H ( R ( e ( d , e ) , e ( n , +g ) ) , R ( e ( i , s ) , e ( n + , u ) ) ) U B ; M F I [ 4 * 5 ] +, w [ 4 * 5 ] , p [ 4 ] = { { 9 +, 1 } , { 1 , 1 } , { 1 , 1 } , +{ 6 * 7 , 1 } } ; M R ( e ( t , +n ) , i ) J ; M R ( e ( d , i ) +, e ( o , v ) ) o ( F f ) { e ( +f , i ) ( f . t - 1 ) { J = P D +O ( / ) D , f . n , f . t ) ; } + R ( e ( e , s ) , e ( l , e ) ) +{ J = P D , f . n ) ; } } M R ( +e ( d , i ) , e ( o , v ) ) n ( +F * f ) { U a = ( * f ) . n , b += ( * f ) . t ; e ( f , i ) ( b +) { H ( R ( e ( e , l ) , i ) , +e ( h , w ) ) ( a ) { U i = b % +a ; b = a ; a = i ; } b = b < 0 + ? - b : b ; ( * f ) . n e ( = , +/ ) b ; ( * f ) . t e ( = , / ) +b ; } } R ( e ( t , n ) , i ) R +( e ( n , i ) , e ( a , m ) ) ( +R ( e ( t , n ) , i ) a , R ( e +( r , a ) , e ( h , c ) ) * v [ +] ) { B m , W ; R ( e ( t , n ) +, i ) i , c ; R ( e ( r , o ) , + f ) ( i = 1 ; i < 5 ; i = i + 1 +) { e ( f , i ) ( a > i ) { J = +H ( R ( e ( f , n ) , a ) , R ( +e ( c , s ) , s ) ) ( v [ i ] , +D O ( / ) D , & p [ i - 1 ] . n +, & p [ i - 1 ] . t ) ; } n ( p ++ i - 1 ) ; } I [ 0 ] = p [ 1 ] +; R ( e ( r , o ) , f ) ( i = 0 + ; i < p [ 0 ] . n ; i = i + 1 ) +{ I [ i + 1 ] . n = I [ i ] . n +* p [ 2 ] . t + p [ 2 ] . n * I +[ i ] . t ; I [ i + 1 ] . t = I +[ i ] . t * p [ 2 ] . t ; n ( I ++ i + 1 ) ; } R ( e ( r , o ) , +f ) ( W = ~ ( ~ 0 e ( < , < ) p +[ 0 ] . n * 2 ) ; ~ ( B ) 0 - W + ; W = W - 1 ) { w [ c = 0 ] = I +[ 0 ] ; R ( e ( r , o ) , f ) ( +m = W , i = 1 ; ! ( i > p [ 0 ] +. n ) ; i = i + 1 , m = m / 4 ) +{ e ( f , i ) ( ( m & 3 ) < 2 ) +{ e ( f , i ) ( m & 1 ) { w [ c +] . n e ( = , * ) I [ i ] . t ; +e ( f , i ) ( ( w [ c ] . t e ( + = , * ) I [ i ] . n ) < 0 ) { w +[ c ] . n e ( = , * ) - 1 ; w [ +c ] . t e ( = , * ) - 1 ; } } R +( e ( e , s ) , e ( l , e ) ) { +w [ c ] . n e ( = , * ) I [ i ] +. n ; w [ c ] . t e ( = , * ) I +[ i ] . t ; } } R ( e ( e , s ) +, e ( l , e ) ) { w [ c = c + 1 + ] = I [ i ] ; } } R ( e ( r , o +) , f ) ( m = W , i = c = 0 ; i +< p [ 0 ] . n ; i = i + 1 , m = +m / 4 ) { e ( f , i ) ( ( m & 3 +) > 1 ) { w [ 0 ] . n = w [ 0 ] +. n * w [ c + 1 ] . t + ( ( m & +1 ) ? - 1 : + 1 ) * w [ c + 1 ] +. n * w [ 0 ] . t ; w [ 0 ] . t + = w [ 0 ] . t * w [ c = c + 1 ] +. t ; } } n ( w ) ; e ( f , i ) +( ! p [ 3 ] . t e ( | , | ) ( ! +( p [ 3 ] . n - w [ 0 ] . n ) e +( & , & ) ! ( p [ 3 ] . t - w [ +0 ] . t ) ) ) { R ( e ( r , o ) +, f ) ( m = W , i = 0 ; i < p [ +0 ] . n ; i = i + 1 , m = m / 4 + ) { o ( I [ i ] ) ; J = P C O ( +% ) O ( c ) C , O ( * ) O ( / ) +O ( + ) O ( - ) [ m & 3 ] ) ; } +o ( I [ i ] ) ; J = P C O ( = ) +C ) ; o ( w [ 0 ] ) ; J = P O ( +% ) O ( c ) , e ( 0 , 1 ) ) ; } +} H ( R ( e ( n , r ) , u ) , R +( e ( t , e ) , r ) ) J - 1 ; } diff --git a/1996/schweikh2.hint b/1996/schweikh2.hint new file mode 100644 index 000000000..9d08f5c76 --- /dev/null +++ b/1996/schweikh2.hint @@ -0,0 +1,129 @@ +Best Algorithm: + + Jens Schweikhardt + DFN Network Operation Center + Schlartaeckerweg 3 (home address) + D-71384 Weinstadt + Germany + + http://www.uni-stuttgart.de/People/schweikhardt/home.html + + +Judges' comments: + + To use: + make schweikh2 + + ./schweikh2 + + Also try: + + ./schweikh2 15 1 0 0/0 + + The program accepts up to 4 parameters: + + 1) The number of operators in the expression [default: 9] + + 2) The value of the first operand [default: 1] + + 3) The (possibly negative) increment to the next operand [default: 1] + + 4) The goal value or 0/0 [default: 42] + + The original program, with only slight obfuscations, may be found + in hunni.c. The perl script, obfuscates it appropriately: + + perl ./hunni.pl < hunni.c + + This entry was another crowd pleaser at the IOCCC BOF. + + +Selected notes from the author: + + Note: the source must be viewed with tabstop 8. To appreciate the + beauty have your eyes half closed. + + Why I think this program is obfuscated: + + C is a free format language. It is therefore a question of style how + variables, operators, declarations, functions and syntactic elements + like braces and parentheses are grouped together. As a rule of thumb, + I put spaces around operators, after opening braces and before closing + braces. I have generalized this rule by putting whitespace after *any* + non-white space character (with the exception of preprocessor directives). + There are no recognizable keywords anymore. There are no recognizable + string literals any more. The main function is invisible. All operators + longer than one character have gone. They have been replaced by macro + calls with quite a number of arguments. The keys are the token pasting + and stringizing macros e and O. The "arcane rules of token pasting" + [K&R2] are used up to three levels, H(O,r)R(O,r)! which is needed to make + one 8-character token from 8 characters ('unsigned'). BTW, C has no 9 or + more character reserved words, so a fourth level is only required if + you intend to generate object names from 9 or more components. The final + round even swaps the tokens, so all keywords must be spelled backwards + (sort of, can you spot printf in the P macro?). + + Try to indent the source. The unbalanced parentheses confuse Solaris' + indent to the max (although the result does compile): + + Looking at the indented source is even *less* fun, because the nice + diamond pattern has been replaced by something that looks like, uhm, + modem noise. + + Lint the source. It's clean. How obfuscated... + + What's the exit status? The program exits with J - 1 where J is the + return value from several non-void functions (needed to shut up + lint). The last assignment is J = printf ("%c", 10); so the exit + status is 0 unless the last printf failed, which is even a *useful* + status. A further obfuscation is the use of 10 instead of '\n'. + '\n' can not be constructed by token pasting, AFAIK. That's why schweikh2 + is likely to produce occasional garbage on non-ASCII execution character + set systems. + + What this program does: + ----------------------- + + The program is an expression evaluator for a limited class of + expressions. Known operators are + - * /, operands are real numbers + (integers or fractions). The operands are restricted in that they must + differ by a constant value, for example 1 + 2 * 3 / 4 - 5. For any + combination of operators the expression is evaluated and compared to a + goal value. If they compare equal the expression is printed. If the goal + value is specified as 0/0 all expressions and results are printed. For + any fraction, the numerator and denominator are divided by their + greatest common divisor. + + The program accepts up to 4 parameters: + 1) The number of operators in the expression [default: 9] + 2) The value of the first operand [1] + 3) The (possibly negative) increment to the next operand [1] + 4) The goal value or 0/0 [42] + + On ANSI/ISO C conformant systems (where long is at least 32 bits) + overflow will occur in the default case (first operand 1, increment 1) + only for more than 11 operators. Because a bit mask is used that needs + twice the number of operands in bits (plus a sentinel value) on those + systems the first parameter must not exceed 15. + + If long is at least 64 bits overflow will occur for more than 19 + operators but you will probably wait quite some time for every of the + 4^19 = 274,877,906,944 combinations to be evaluated... While I'm at it, + on a 50 MHz sparc, 4^11 expressions are evaluated in about 3 cpu + minutes (gcc -O3). + + Sample arguments: + ----------------- + $ schweikh2 6 + $ schweikh2 7 0 + $ schweikh2 7 7 0 + $ schweikh2 8 9 -1 -67/21 + $ schweikh2 8 2 2/5 -98/25 + $ schweikh2 2 1/0 1 1/0 + + Miscellaneous + ------------- + + The diamond pattern can be continued without a break. + For a nice printout try this on your Bourne compatible shell + % while :; do grep -v '#' schweikh2.c; done diff --git a/1996/schweikh3.c b/1996/schweikh3.c new file mode 100644 index 000000000..e2ba5fa1a --- /dev/null +++ b/1996/schweikh3.c @@ -0,0 +1,116 @@ + static char Asm = 'm' +; +#include\ + + typedef unsigned long LOGO +; +#include\ + + static void new (char *, LOGO) +; +#include\ + +#define Pascal (void)printf +#include\ + + static void new (char *Oberon +, LOGO awk) +{ Pascal ("%s to %calloc %luM+%luK+%lu bytes" +, Oberon +, Asm +, awk >> (__LINE__ - 1) +, (awk & 0xffc00) >> (1+sizeof __TIME__) +, awk & 1023) +; } typedef size_t BCPL +; static BCPL far = 0 +, Lisp = ~(BCPL)0^( +~ (BCPL)0>>1) +; +#define B\ +( C)case SIG##C\ +: (void)puts(\ +# C)\ +; break\ +; + int main (int, char**) +; +#define Alloc switch (Asm) { case 'c'\ +: Basic = calloc (far\ +, 1)\ +; break\ +; default\ +: Basic = malloc (far)\ +; } +#include\ + + static int inline(void) +; +#include\ + + int main (int F77 +, char **F90) +{ switch (F90[--F77][0] == 'c') case 1 +: Asm += 'c' - Asm +; switch (setbuf (stdout +, 0) +, fork()) { char *Basic +; case -1 +: assert (0) +; break +; case 0 +: for ( +; far +#include\ + + or_eq Lisp, Lisp not_eq 0 +; Lisp >>= 1) { new ("Trying" +, (LOGO) far) +; Alloc switch (Basic not_eq 0) { case 1 +: Pascal ("..YEP\n") +; free (Basic) +; break +; default +: Pascal ("..nope\n") +; far and_eq compl Lisp +; } } Alloc assert (Basic not_eq 0) +; new ("Able" +, (LOGO) far) +; (void) putchar ('\n') +; for (Lisp = 0 +; Lisp < far +; Lisp += 1 << 10) { time_t COBOL = time (NULL) +; Basic[Lisp] = '\a' +; Pascal ("\r%lu kilo bytes ok " +, (LOGO) (1 + (Lisp >> 10))) +; switch (difftime (time (NULL) +, COBOL) - 5 > FLT_EPSILON) { case 1 +: free (Basic) +; return 1 +; } } free (Basic) +; return 0 +; } return inline() +; } +#include\ + +#include\ + + static int inline (void) { int PL1 +; switch ((void) wait (&PL1) +, WIFSIGNALED (PL1)) { int Algol +; default +: Algol = WTERMSIG (PL1) +; Pascal (" %calloc lied! Killed by SIG" +, Asm) +; switch (Algol) { B(KILL) B(SEGV) default +: Pascal ("NAL %d\n" +, Algol) +; } break +; case 0 +: WEXITSTATUS(PL1)==1 +? Pascal (" %calloc lied! Thr\aashing\n" +, Asm) +: Pascal ("no overcommit\n") +; } re\ +turn PL1 +; +} diff --git a/1996/schweikh3.hint b/1996/schweikh3.hint new file mode 100644 index 000000000..74633da62 --- /dev/null +++ b/1996/schweikh3.hint @@ -0,0 +1,165 @@ +Best Utility: + + Jens Schweikhardt + DFN Network Operation Center + Schlartaeckerweg 3 (home address) + D-71384 Weinstadt + Germany + + http://www.uni-stuttgart.de/People/schweikhardt/home.html + + +Judges' comments: + + To use: + make schweikh3 + + WARNING! + + Do not run this program without reading this text down to the end. + It may render your system unusable for a limited amount of time + or force you to reboot using the Big Red Button! This is not a joke. + You have been warned. + + The source fails to compile on compilers that recognize the inline + keyword by default. For gcc, you may need to use -ansi. + + See the file, schweikh3.info for example output from various systems. + + But still it is a useful utility. To use try: + + ./schweikh3 + + and thanks for the virtual memories! :-) + + NOTE: On some systems such as SunOS, one may need to compile with: + + ${CC} ${CFLAGS} \ + -I. -D_POSIX_SOURCE '-Ddifftime(a,b)=(double)(b-a)' \ + schweikh3.c -o schweikh3 + + +Selected notes from the author: + + Why I think my entry is obfuscated + ---------------------------------- + + There are some layout obfuscations that hinder readability, like + some (but not all) one character tokens in column 1. Includes, + defines and declarations of data and functions appear intermixed. + iso646.h is even included in the middle of an expression, how + disgusting. Besides, requiring iso646.h will render the program + uncompilable on many systems that have not yet incorporated + Amendment One to The Standard. If you, dear reader, suffer from + this disease, just read iso646.h. + + There are no `if' statements. They have been replaced by + "switch () case 1:" or "switch () case 0:" etc. At least one + switch has a declaration after the opening brace, booh! + Identifiers are named after random programming languages, Basic, + Cobol, F77, awk etc. + + You have to select maximum ANSI C conformance of your + compiler. The source fails to compile under a C++ compiler due to + the `new' identifier which is a C++ reserved word: + + $ g++ prog.c + prog.c:9: parse error before `new' + prog.c:16: parse error before `new' + prog.c:46: parse error before `void' + prog.c:65: parse error before `Lisp' + prog.c:68: parse error before `;' + [...] + prog.c:91: confused by earlier errors, bailing out + + The source fails to compile on compilers that recognize the inline + keyword by default, e.g. gcc: + + $ gcc prog.c + prog.c:46: parse error before `void' + prog.c: In function `main': + prog.c:91: parse error before `inline' + prog.c: At top level: + prog.c:97: parse error before `void' + + The -ansi option to gcc fixes this. + + The source fails to compile on obsolete systems with obsolete + memory models due to the identifier `far' (to be honest: this is + untested :-). + + Does your indent cope with backslash/newline pairs inbetween + keywords like in "re\turn"? Solaris' indent inserts spaces + and thereby renders the source uncompilable... + + The indented source will exhibit different semantics when indenting + changes the number of lines (due to using the __LINE__ macro in an + expression). + + And what about sizeof __TIME__? This one's for the philosophers + and physicists among us programmers. What is it? sizeof (char *) -- no. + Strlen ("hh:mm:ss")? -- no. It's the same as sizeof __DATE__ - + sizeof "no" :-) + + The program is POSIX conformant and lints without warning under + Solaris' Sunpro lint. Allocated memory is correctly freed on all + possible execution paths. + + What this program does + ---------------------- + + This program tests your operating system's allocation honesty. It + forks a child that will allocate as much as possible with byte + granularity and then write to every 1024th byte, at the same time + writing a status report on stdout. This way each page of the + allocated virtual memory will eventually be referenced. Without + any arguments, malloc() will be used to allocate memory. If the + first arg starts with c, calloc() will be used instead. + + I distinguish three different behaviours: + + 1) OS without memory overcommit: + malloc does not lie -- you can use all memory the OS granted to you. + + 2) OS with memory overcommit: + malloc lies -- any program may get killed at random when the + OS can not acquire a free page. + + 3) OS with pseudo memory overcommit: + malloc lies -- The OS puts processes to sleep for which it can + not acquire a free page. Because other processes are also + affected this way, the system slows down and quickly becomes + totally unusable (also known as "thrashing"). Because more and + more processes wait for memory returned by other exiting processes + the system eventually enters a deadlock situation and effectively + halts. + + I had the pleasure and pain to find all three behaviours on the + platforms I use regularly. What follows are the outputs for + Solaris, FreeBSD and Linux. The Linux case is interesting in that + the behaviour changes when calloc is used instead of malloc. + For FreeBSD, the last two lines are not messages stemming from + my program but issued by the syslog daemon. + + Implementation remarks + ---------------------- + + How can we distinguish the three different OS types from the + table above? + + Obviously, type 1), no overcommit, is easy. + + For type 2), random kill, we need to fork a child that can be killed + and whose exit status the parent collects and decodes. Here's + where POSIX enters the scene. + + Type 3), thrashing, was the hardest part. The first attempt was to + measure the elapsed processor time it takes to write a single byte + (using clock()). If a certain threshold is reached I assume the + system is thrashing. When thrashing, however, the process does not + consume processor time in a noticeable amount any longer and I lose. + So I switched to measuring wall clock time using time(). On the one + system that I observe thrashing (Linux) this works (although the + value returned by time seems to 'hang' sometimes when the OS thrashes. + Exceeding a threshold of 5 seconds may be detected only after half a + minute or so. diff --git a/1996/schweikh3.info b/1996/schweikh3.info new file mode 100644 index 000000000..7e9255e96 --- /dev/null +++ b/1996/schweikh3.info @@ -0,0 +1,171 @@ + ***** SOLARIS 2.5 (sparc): + + % prog + Trying to malloc 2048M+0K+0 bytes..nope + Trying to malloc 1024M+0K+0 bytes..nope + Trying to malloc 512M+0K+0 bytes..nope + Trying to malloc 256M+0K+0 bytes..nope + Trying to malloc 128M+0K+0 bytes..YEP + Trying to malloc 192M+0K+0 bytes..nope + Trying to malloc 160M+0K+0 bytes..YEP + Trying to malloc 176M+0K+0 bytes..nope + Trying to malloc 168M+0K+0 bytes..YEP + Trying to malloc 172M+0K+0 bytes..nope + Trying to malloc 170M+0K+0 bytes..YEP + Trying to malloc 171M+0K+0 bytes..YEP + Trying to malloc 171M+512K+0 bytes..YEP + Trying to malloc 171M+768K+0 bytes..nope + Trying to malloc 171M+640K+0 bytes..nope + Trying to malloc 171M+576K+0 bytes..YEP + Trying to malloc 171M+608K+0 bytes..YEP + Trying to malloc 171M+624K+0 bytes..nope + Trying to malloc 171M+616K+0 bytes..nope + Trying to malloc 171M+612K+0 bytes..YEP + Trying to malloc 171M+614K+0 bytes..YEP + Trying to malloc 171M+615K+0 bytes..YEP + Trying to malloc 171M+615K+512 bytes..YEP + Trying to malloc 171M+615K+768 bytes..YEP + Trying to malloc 171M+615K+896 bytes..YEP + Trying to malloc 171M+615K+960 bytes..YEP + Trying to malloc 171M+615K+992 bytes..YEP + Trying to malloc 171M+615K+1008 bytes..YEP + Trying to malloc 171M+615K+1016 bytes..nope + Trying to malloc 171M+615K+1012 bytes..nope + Trying to malloc 171M+615K+1010 bytes..nope + Trying to malloc 171M+615K+1009 bytes..nope + Able to malloc 171M+615K+1008 bytes + 1 kilo bytes ok + 2 kilo bytes ok + ... + 175719 kilo bytes ok no overcommit + + ***** FreeBSD 2.1 (i386): + + % prog + Trying to malloc 2048M+0K+0 bytes..nope + Trying to malloc 1024M+0K+0 bytes..nope + Trying to malloc 512M+0K+0 bytes..nope + Trying to malloc 256M+0K+0 bytes..nope + Trying to malloc 128M+0K+0 bytes..nope + Trying to malloc 64M+0K+0 bytes..nope + Trying to malloc 32M+0K+0 bytes..YEP + Trying to malloc 48M+0K+0 bytes..nope + Trying to malloc 40M+0K+0 bytes..nope + Trying to malloc 36M+0K+0 bytes..nope + Trying to malloc 34M+0K+0 bytes..nope + Trying to malloc 33M+0K+0 bytes..nope + Trying to malloc 32M+512K+0 bytes..nope + Trying to malloc 32M+256K+0 bytes..nope + Trying to malloc 32M+128K+0 bytes..nope + Trying to malloc 32M+64K+0 bytes..nope + Trying to malloc 32M+32K+0 bytes..nope + Trying to malloc 32M+16K+0 bytes..nope + Trying to malloc 32M+8K+0 bytes..nope + Trying to malloc 32M+4K+0 bytes..nope + Trying to malloc 32M+2K+0 bytes..YEP + Trying to malloc 32M+3K+0 bytes..YEP + Trying to malloc 32M+3K+512 bytes..YEP + Trying to malloc 32M+3K+768 bytes..YEP + Trying to malloc 32M+3K+896 bytes..YEP + Trying to malloc 32M+3K+960 bytes..YEP + Trying to malloc 32M+3K+992 bytes..YEP + Trying to malloc 32M+3K+1008 bytes..YEP + Trying to malloc 32M+3K+1016 bytes..YEP + Trying to malloc 32M+3K+1020 bytes..YEP + Trying to malloc 32M+3K+1022 bytes..nope + Trying to malloc 32M+3K+1021 bytes..nope + Able to malloc 32M+3K+1020 bytes + 1 kilo bytes ok + ... + 21668 kilo bytes ok + malloc lied! Killed by SIGKILL + Nov 24 18:11:56 /kernel: swap_pager: out of space + Nov 24 18:11:57 /kernel: Process 5 killed by vm_fault -- out of swap + + % prog c + Trying to calloc 2048M+0K+0 bytes..nope + Trying to calloc 1024M+0K+0 bytes..nope + Trying to calloc 512M+0K+0 bytes..nope + Trying to calloc 256M+0K+0 bytes..nope + Trying to calloc 128M+0K+0 bytes..nope + Trying to calloc 64M+0K+0 bytes..nope + Trying to calloc 32M+0K+0 bytes + calloc lied! Killed by SIGKILL + Nov 24 18:14:54 /kernel: swap_pager: out of space + Nov 24 18:14:55 /kernel: Process 7 killed by vm_fault -- out of swap + + ***** Linux 1.2.13 (i386): + + % prog + Trying to malloc 2048M+0K+0 bytes..nope + Trying to malloc 1024M+0K+0 bytes..nope + Trying to malloc 512M+0K+0 bytes..nope + Trying to malloc 256M+0K+0 bytes..nope + Trying to malloc 128M+0K+0 bytes..nope + Trying to malloc 64M+0K+0 bytes..nope + Trying to malloc 32M+0K+0 bytes..nope + Trying to malloc 16M+0K+0 bytes..YEP + Trying to malloc 24M+0K+0 bytes..nope + Trying to malloc 20M+0K+0 bytes..YEP + Trying to malloc 22M+0K+0 bytes..YEP + Trying to malloc 23M+0K+0 bytes..YEP + Trying to malloc 23M+512K+0 bytes..YEP + Trying to malloc 23M+768K+0 bytes..YEP + Trying to malloc 23M+896K+0 bytes..YEP + Trying to malloc 23M+960K+0 bytes..YEP + Trying to malloc 23M+992K+0 bytes..YEP + Trying to malloc 23M+1008K+0 bytes..YEP + Trying to malloc 23M+1016K+0 bytes..YEP + Trying to malloc 23M+1020K+0 bytes..YEP + Trying to malloc 23M+1022K+0 bytes..YEP + Trying to malloc 23M+1023K+0 bytes..YEP + Trying to malloc 23M+1023K+512 bytes..YEP + Trying to malloc 23M+1023K+768 bytes..YEP + Trying to malloc 23M+1023K+896 bytes..YEP + Trying to malloc 23M+1023K+960 bytes..YEP + Trying to malloc 23M+1023K+992 bytes..YEP + Trying to malloc 23M+1023K+1008 bytes..YEP + Trying to malloc 23M+1023K+1016 bytes..YEP + Trying to malloc 23M+1023K+1020 bytes..YEP + Trying to malloc 23M+1023K+1022 bytes..YEP + Trying to malloc 23M+1023K+1023 bytes..YEP + Able to malloc 23M+1023K+1023 bytes + 23294 kilo bytes ok malloc lied! Thrashing + + % prog c + Trying to calloc 2048M+0K+0 bytes..nope + Trying to calloc 1024M+0K+0 bytes..nope + Trying to calloc 512M+0K+0 bytes..nope + Trying to calloc 256M+0K+0 bytes..nope + Trying to calloc 128M+0K+0 bytes..nope + Trying to calloc 64M+0K+0 bytes..nope + Trying to calloc 32M+0K+0 bytes..nope + Trying to calloc 16M+0K+0 bytes..YEP + Trying to calloc 24M+0K+0 bytes..nope + Trying to calloc 20M+0K+0 bytes..nope + Trying to calloc 18M+0K+0 bytes..nope + Trying to calloc 17M+0K+0 bytes..nope + Trying to calloc 16M+512K+0 bytes..nope + Trying to calloc 16M+256K+0 bytes..nope + Trying to calloc 16M+128K+0 bytes..nope + Trying to calloc 16M+64K+0 bytes..nope + Trying to calloc 16M+32K+0 bytes..nope + Trying to calloc 16M+16K+0 bytes..nope + Trying to calloc 16M+8K+0 bytes..YEP + Trying to calloc 16M+12K+0 bytes..YEP + Trying to calloc 16M+14K+0 bytes..nope + Trying to calloc 16M+13K+0 bytes..nope + Trying to calloc 16M+12K+512 bytes..nope + Trying to calloc 16M+12K+256 bytes..nope + Trying to calloc 16M+12K+128 bytes..nope + Trying to calloc 16M+12K+64 bytes..nope + Trying to calloc 16M+12K+32 bytes..nope + Trying to calloc 16M+12K+16 bytes..nope + Trying to calloc 16M+12K+8 bytes..nope + Trying to calloc 16M+12K+4 bytes..nope + Trying to calloc 16M+12K+2 bytes..nope + Trying to calloc 16M+12K+1 bytes..nope + Able to calloc 16M+12K+0 bytes + 1 kilo bytes ok + ... + 16396 kilo bytes ok no overcommit diff --git a/1996/test.oc b/1996/test.oc new file mode 100644 index 000000000..ac8045c76 --- /dev/null +++ b/1996/test.oc @@ -0,0 +1 @@ +main() { putchar('!'); putchar('\n'); exit(0); } diff --git a/1996/westley.c b/1996/westley.c new file mode 100644 index 000000000..00f7ec364 --- /dev/null +++ b/1996/westley.c @@ -0,0 +1 @@ +main(h,m)char**m;{for(time(*m);h/=2;)m[4][m[h][h[(int*)localtime(*m)]]]=m[3][h];puts(m[4]);} diff --git a/1996/westley.hint b/1996/westley.hint new file mode 100644 index 000000000..9e4d8618c --- /dev/null +++ b/1996/westley.hint @@ -0,0 +1,83 @@ +Best One Liner: + + Brian Westley (Merlyn LeRoy on Usenet) + 1906 James Ave. + St. Paul, MN 55105 + USA + + http://www.visi.com/~westley/index.html + + +Judges' comments: + + To use: + make westley + sh ./clock1 + + Also try: + + sh ./clock2 + + And for a good time, try: + + sh ./clock3 + + Time and time again, Brian Westley seems to come up with a winner! + We are amazed at how much is being done with only one relatively + short line. We think you will as well if you take the time to + understand it. + + +Selected notes from the author: + + This 1-line program allows various analog ASCII clocks + to print out the time; the ASCII clock is built from + the command line arguments, so many different types of + clocks can be generated. Three different scripts are + supplied to print out a grandfather clock, a mantle + clock that runs backwards, and a linear-style clock. + (they are clock1, clock2, and clock3) + + The program makes the following (possibly non-portable) assumptions: + + 1) Command line strings can be written to + + 2) argv[0] can be written to as if it were a long * + + 3) The first three elements of the struct * returned by + localtime() are seconds, minutes, hours, and all are ints + + 4) My sample scripts assume ASCII, though this is not + inherent in the code, just my sample scripts + + These assumptions are pretty reasonable. 2) can be eliminated + by makes the code larger. + + The code is simple; the arguments passed are: + + prog minute_map hour_map hand_symbol clock_image + + The program merely takes the minute (0-59) and the hour (0-23) + values, looks up the offsets in minute_map and hour_map + and writes the hand_symbol for each into the clock_image + string. This string is then printed. + + The for() loop starts by calling time() with argv[0], so + the time value (a long) is written into the program name. + The for() control value is argc, which starts at 5, but + the /=2 statement is executed before the test, so the for() + loop is executed twice, with h=2, then h=1 (for hour & minute). + + The statement of the for() loop takes the hour or minute + field of the struct returned by localtime() by casting it + to an int* and dereferencing element [h]. It is slightly + smaller to use the trick h[(int*)localtime(*m)] instead of + ((int*)localtime(*m))[h]. + + This value is in turn indexed into the hour_map or minute_map + parameter to determine where the 'hand' symbol should be + written into the clock_image. + + Note that the hands move in a quantum fashion; 3:59 looks + deceptively like 2:59, since the hour hand will be at the 3 + position. It won't move until both hands click over at 4:00. diff --git a/1998/1998.tar.bz2 b/1998/1998.tar.bz2 new file mode 100644 index 000000000..32d53ec4b Binary files /dev/null and b/1998/1998.tar.bz2 differ diff --git a/1998/Makefile b/1998/Makefile new file mode 100644 index 000000000..4aa67d809 --- /dev/null +++ b/1998/Makefile @@ -0,0 +1,175 @@ +#!/bin/make +# 1998 makefile +# +# Copyright (c) Landon Curt Noll, Jeremy Horn, Peter Seebach +# and Leonid A. Broukhis, 1999. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from the contest judges. + +SHELL=/bin/sh +CAT=cat +CHMOD=chmod +CP=cp +MV=mv +ECHO=echo +LN=ln +RM=rm +SED=sed +TRUE=true + +# flags for ANSI compiles +# +# NOTE: Some ANSI compilers make use of -Xa to turn on ANSI mode, +# others such as gcc may want -ansi, others may want nothing +# at all. Adjust the CFLAGS line as needed. +# +# NOTE: Some compilers cannot optimize, or optimize some entries +# incorrectly. You might want to turn on -O to see if your +# compiler can handle them. +# +# NOTE: On some systems, the library path does not include the location +# of the X11 libraries. You might need to use a -L/path/to/X11/lib/dir +# in order to compile with these libs. +# +#CFLAGS=-O -Xa +#CFLAGS=-Xa +CFLAGS= -ansi +#CFLAGS= -ansi -O +#CFLAGS= +#CFLAGS= -ansi -L/usr/X11R6/lib + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +MAY_NEED_GCC= gcc + +# winners that compile under ANSI C +# +WINNERS= schweikh1 df dloweneil banks dlowe bas2 fanf bas1 tomtorfs dorssel \ + schweikh2 schnitzi chaos schweikh3 +ALT_NAMES= schweikh2.orig banks.orig dlowe.orig df.orig schweikh1.orig \ + chaos_nohalf +DATA_FILES= banks_files chaos_files fanf_files schweikh1_files schweikh3_files + + +all: ${WINNERS} + +schweikh1: schweikh1.c + ${MAY_NEED_GCC} ${CFLAGS} $? -o $@ + +schweikh1.orig: schweikh1.orig.c + ${MAY_NEED_GCC} ${CFLAGS} $? -o $@ + +schweikh1_files: data + +df: df.c + ${CC} ${CFLAGS} $? -o $@ + +df.orig: prog.c + ${CC} ${CFLAGS} $? -o $@ + +prog.c : df.c + ${RM} -f prog.c + ${CP} $? prog.c + +dloweneil: dloweneil.c + ${CC} ${CFLAGS} $? -lcurses -o $@ + +# See note about use of -L/path/to/X11/lib/dir above this rule fails to link +# +banks: banks.c + ${CC} ${CFLAGS} $? -DIT=XK_Page_Up -DDT=XK_Page_Down \ + -DUP=XK_Up -DDN=XK_Down -DLT=XK_Left -DRT=XK_Right \ + -DCS=XK_Return -Ddt=0.02 -lm -lX11 -o $@ + +# See note about use of -L/path/to/X11/lib/dir above this rule fails to link +# +banks.orig: banks.orig.c + ${MAY_NEED_GCC} ${CFLAGS} $? -DIT=XK_Page_Up -DDT=XK_Page_Down \ + -DUP=XK_Up -DDN=XK_Down -DLT=XK_Left -DRT=XK_Right \ + -DCS=XK_Return -Ddt=0.02 -lm -lX11 -o $@ + +banks_files: bb.sc horizon.sc mountains.sc pittsburgh.sc pyramids.sc river.sc + +dlowe: dlowe.c + ${CC} ${CFLAGS} $? -o $@ + +dlowe.orig: dlowe.orig.c + ${CC} ${CFLAGS} $? -o $@ + +bas2: bas2.c + ${CC} ${CFLAGS} $? -o $@ + +fanf: fanf.c + ${RM} -f fanftmp1.c fanftmp2.c + ${MAY_NEED_GCC} ${CFLAGS} -E $? > fanftmp1.c + ${MAY_NEED_GCC} ${CFLAGS} -E fanftmp1.c > fanftmp2.c + ${MAY_NEED_GCC} ${CFLAGS} fanftmp2.c ${LDFLAGS} -o $@ + +fanf_files: fanf.lambda + +bas1: bas1.c + ${CC} ${CFLAGS} $? -o $@ + +tomtorfs: tomtorfs.c + ${CC} ${CFLAGS} $? -o $@ + +dorssel: dorssel.c + ${CC} ${CFLAGS} $? -o $@ + +schweikh2: schweikh2.c + ${MAY_NEED_GCC} ${CFLAGS} $? -o $@ + +schweikh2.orig: schweikh2.orig.c + ${MAY_NEED_GCC} ${CFLAGS} $? -o $@ + +schweikh3: schweikh3.c + ${MAY_NEED_GCC} ${CFLAGS} $? -DM0=sizeof -DM1=long -DM2=void \ + -DM3=realloc -DM4=calloc -DM5=free -o $@ + +schweikh3_files: samefile.1 + +schnitzi: schnitzi.c + ${CC} ${CFLAGS} $? -o $@ + +chaos: chaos.c + ${CC} ${CFLAGS} $? -lcurses -o $@ + +# some libcurses do not have halfdelay(). This rule is for those systems +# +chaos_nohalf: chaos_nohalf.c + ${CC} ${CFLAGS} $? -lcurses -o $@ + ${CP} -f $@ chaos + +chaos_nohalf.c: chaos.c + ${RM} -f $@ + ${SED} -e 's/halfdelay([^)]*);//' < $? > $@ + +chaos_files: cube.data desk.data ioccc.data pyramid.data xwing.data + +everything: ${WINNERS} ${ALT_NAMES} ${DATA_FILES} + +clean: + ${RM} -f *.o a.out core ${WINNERS} + ${RM} -f prog.c fanftmp1.c fanftmp2.c chaos_nohalf.c + +clobber: clean + ${RM} -f ${WINNERS} + ${RM} -f ${ALT_NAMES} + +nuke: clobber + @${TRUE} + +install: all + ${CAT} ${WINNERS} ${ALT_NAMES} > /dev/null diff --git a/1998/README b/1998/README new file mode 100644 index 000000000..d9180c8e0 --- /dev/null +++ b/1998/README @@ -0,0 +1,133 @@ +1998 marked the "The Fourteenth International Obfuscated C Code Contest" + +Copyright (c) Landon Curt Noll, Jeremy Horn, Peter Seebach +and Leonid A. Broukhis, 1999. +All Rights Reserved. Permission for personal, educational or non-profit +use is granted provided this this copyright and notice are included in its +entirety and remains unaltered. All other uses must receive prior permission +from the contest judges. + + +Standard IOCCC stuff +-------------------- + +The IOCCC has its own domain. The IOCCC has an official home page is now: + + http://www.ioccc.org + +Use make to compile entries. It is possible that on BSD or non-unix +systems the makefile needs to be changed. See the Makefile for details. + +Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitters. + +Read over the makefile for compile/build issues. Your system may +require certain changes (add or remove a library, add or remove a +#define). + +Some ANSI C compilers are not quite as good as they should be. If +yours is lacking, you may need to compile using gcc instead of your +local compiler. + + +New Judges +---------- + +Larry Bassel is now a graduate student in number theory at UC San Diego. +Barbara Frezza also went to San Diego to enter into law school at the +same time. Her cooking in the role of official chef was sorely missed. +Both Larry and Barbara have taken important new steps in their lives. +We wish them the best. + +Landon was unable to contact with Sriram Srinivasan at the start of +the 1998 IOCCC season. Having not heard from Sriram, Landon put out +a call for new IOCCC judges. A number of excellent people applied. + +Landon selected Leonid A. Broukhis, a two time IOCCC winner, as a +co-judge. Landon and Leo together selected Jeremy Horn and Peter +Seebach. The four judges: + + http://www.ioccc.org/judges.html + +together worked thru-out the 1998 IOCCC season. + + +Remarks on some of the entries +------------------------------ + +This year, Jens Schweikhardt won 3 times ... AGAIN! He is the only +person who was able to do this, let alone do it in two contests +in a row. Bas de Bakker and David Lowe won twice this year as well. + +As we state in the guidelines, the names of the winners are as much +news to us as they are to you because we keep authorship separate from +rest of the entry. Some people have it, we guess! + +There were a few very good entries that might have won if it were not +for the fact that they didn't work. If you didn't win, but think you +had a chance: test your program, fix it and submit it next year! + +This year we awarded some outstanding entries. We recommend that you +look at all of the winners. The list of winners is a bit too long to +say something about every winner. On the other hand a partial mention +of a few is in order: + + + Audiences were very impressed with the Best of Show entry. + + The judges were amused that for the first time we received an entry + that caused gcc to give the assembler bad input in some cases. + + The poot entries got a good laugh from the Usenix IOCCC BOF crowd. + + Those with Functional Programming knowledge as well as those + impressed with CPP code expansion liked the entry that translated + lambda expressions into combinator expressions. + + Logic minded folks will get somewhat twisted up while following the + flow of the Best Flow Control entry. + + Those who know the PostScript language will be ``bemused'' by + the Best Encapsulation entry. + +There were some outstanding entries that did not win. Unfortunately +some very good entries lost because they: + + + depended too much on non-portable side effects in expressions; + + depended too much on a particular byte order; + + required the use of a special script, data file or pseudo-machine + language that was not supplied with the entry. + +We hope the authors of some of those entries will fix and re-submit +them for the next IOCCC. + + +There was no 1997 contest +------------------------- + +So what happened to 1997? There was no summer USENIX Technical +Conference. The Technical Conference was held Jun 15-19, 1998 instead +... 18 months later than the 1996 summer USENIX Technical Conference. +In addition we had to select some new IOCCC judges. As a result IOCCC +skipped over 1997. + + +Final Comments +-------------- + +Please send us comments and suggestions what we have expressed above. +Also include anything else that you would like to see in future contests. +Send such email to: + + questions@ioccc.org + +If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used. + +You must include the words ``ioccc question'' in the subject of your EMail +message when sending EMail to the judges. + +If you have problems with any of the entries, AND YOU HAVE A FIX, please +EMail the fix (patch file or the entire changed file) to the above address. + +The next IOCCC is planned to start towards the end of 1999. Watch: + + http://www.ioccc.org + +for news of the next contest. diff --git a/1998/banks.c b/1998/banks.c new file mode 100644 index 000000000..f8ed3e77a --- /dev/null +++ b/1998/banks.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include + double L ,o ,P + ,_=dt,T,Z,D=1,d, + s[999],E,h= 8,I, + J,K,w[999],M,m,O + ,n[999],j=33e-3,i= + 1E3,r,t, u,v ,W,S= + 74.5,l=221,X=7.26, + a,B,A=32.2,c, F,H; + int N,q, C, y,p,U; + Window z; char f[52] + ; GC k; main(){ Display*e= + XOpenDisplay( 0); z=RootWindow(e,0); for (XSetForeground(e,k=XCreateGC (e,z,0,0),BlackPixel(e,0)) +; scanf("%lf%lf%lf",y +n,w+y, y+s)+1; y ++); XSelectInput(e,z= XCreateSimpleWindow(e,z,0,0,400,400, +0,0,WhitePixel(e,0) ),KeyPressMask); for(XMapWindow(e,z); ; T=sin(O)){ struct timeval G={ 0,dt*1e6} +; K= cos(j); N=1e4; M+= H*_; Z=D*K; F+=_*P; r=E*K; W=cos( O); m=K*W; H=K*T; O+=D*_*F/ K+d/K*E*_; B= +sin(j); a=B*T*D-E*W; XClearWindow(e,z); t=T*E+ D*B*W; j+=d*_*D-_*F*E; P=W*E*B-T*D; for (o+=(I=D*W+E +*T*B,E*d/K *B+v+B/K*F*D)*_; p K)N=1e4; else{ q=W/K *4E2+2e2; C= 2E2+4e2/ K + *D; N-1E4&& XDrawLine(e ,z,k,N ,U,q,C); N=q; U=C; } ++p; } L+=_* (X*t +P*M+m*l); T=X*X+ l*l+M *M; + XDrawString(e,z,k ,20,380,f,17); D=v/l*15; i+=(B *l-M*r -X*Z)*_; for(; XPending(e); u *=CS!=N){ + XEvent z; XNextEvent(e ,&z); + ++*((N=XLookupKeysym + (&z.xkey,0))-IT? + N-LT? UP-N?& E:& + J:& u: &h); --*( + DN -N? N-DT ?N== + RT?&u: & W:&h:&J + ); } m=15*F/l; + c+=(I=M/ l,l*H + +I*M+a*X)*_; H + =A*r+v*X-F*l+( + E=.1+X*4.9/l,t + =T*m/32-I*T/24 + )/S; K=F*M+( + h* 1e4/l-(T+ + E*5*T*E)/3e2 + )/S-X*d-B*A; + a=2.63 /l*d; + X+=( d*l-T/S + *(.19*E +a + *.64+J/1e3 + )-M* v +A* + Z)*_; l += + K *_; W=d; + sprintf(f, + "%5d %3d" + "%7d",p =l + /1.7,(C=9E3+ + O*57.3)%0550,(int)i); d+=T*(.45-14/l* + X-a*130-J* .14)*_/125e2+F*_*v; P=(T*(47 + *I-m* 52+E*94 *D-t*.38+u*.21*E) /1e2+W* + 179*v)/2312; select(p=0,0,0,0,&G); v-=( + W*F-T*(.63*m-I*.086+m*E*19-D*25-.11*u + )/107e2)*_; D=cos(o); E=sin(o); } } + + diff --git a/1998/banks.hint b/1998/banks.hint new file mode 100644 index 000000000..96064641e --- /dev/null +++ b/1998/banks.hint @@ -0,0 +1,195 @@ +Best of Show: + + Carl Banks + Penn State Department of Aerospace Engineering + 232 Hammond Building + University Park, PA 16802 + USA + + http://www.personal.psu.edu/users/c/w/cwb129/ + + +Judge's Comments: + + To build: + + make banks + + To use: + + cat horizon.sc pittsburgh.sc | ./banks + + What can we say? It's a flight sim done in 1536 bytes of real code. + This one is a real marvel. When people say the size limits are too + tight, well, we can just point them at this one. This program really + pushes the envelope! + + The provided Makefile should work; you will need an X-ish system, and + a select() system call. More on building in the author comments. + + NOTE: On some systems the original entry did not correctly display + the altitude and airspeed. These problems have been fixed. One can + still build the original program by: + + make banks.orig + + +Selected Author's Comments: + + You have just stepped out of the real world and into the + virtual. You are now sitting in the cockpit of a Piper Cherokee + airplane, heading north, flying 1000 feet above ground level. + + Use the keyboard to fly the airplane. The arrow keys represent + the control stick. Press the Up Arrow key to push the stick + forward. Press the left arrow key to move the stick left, and + so on. Press Enter to re-center the stick. Use Page Up and Page + Down increase and decrease the throttle, respectively. (The + rudder is automatically coordinated with the turn rate, so + rudder pedals are not represented.) + + On your display, you will see on the bottom left corner three + instruments. The first is the airspeed indicator; it tells you + how fast you're going in knots. The second is the heading + indicator, or compass. 0 is north, 90 is east, 180 is south, + 270 is west. The third instrument is the altimeter, which + measures your height above ground level in feet. + + -------- + Features + -------- + + * Simulator models a Piper Cherokee, which is a light, + single-engine propeller driven airplane. + + * The airplane is modeled as a six degree-of-freedom rigid + body, accurately reflecting its dynamics (for normal flight + conditions, at least). + + * Fly through a virtual 3-D world, while sitting at your X + console. + + * Loadable scenery files. + + * Head-up display contains three instruments: a true airspeed + indicator, a heading indicator (compass), and an altimeter. + + * Flight controls may be mapped to any keys at compile time + by redefining the macros in the build file. Nice if your + keyboard doesn't have arrow keys. (Or if you still use + vi. :-) + + * Time step size can be set at compile time. This is useful to + reduce flicker on network X connections. (But be careful: + step sizes longer than about 0.03 seconds tend to have + numerical stability problems.) + + * Airplane never stalls! + + * Airplane never runs out of fuel! + + * Fly underground! + + * Fly through buildings! + + + ------- + Scenery + ------- + + Each of the *.sc files is a scenery file. The simulator + program reads in the scenery from standard input on startup. + You may input more than one scenery file, as long as there are + less than 1000 total lines of input. + + Here is a brief description of the scenery files: + + horizon.sc -- A horizon, nothing more. You will probably + always want to input this piece of scenery. + + mountains.sc -- An alternate horizon; a little more + mountainous. + + pittsburgh.sc -- Scenery of downtown Pittsburgh. The downtown + area is initially located to your right. + + bb.sc -- Simple obstacle course. Try to fly over the + buildings and under the bridges. + + pyramids.sc -- Fly over the tombs of the ancient Pharaohs, + in this (fictitious) Egyptian landscape. + + river.sc -- Follow a flowing river from the sky. + + A few examples of how to input scenery: + + cat horizon.sc pittsburgh.sc | ./banks + cat mountains.sc bb.sc | ./banks + cat mountains.sc river.sc pyramids.sc | ./banks + + You can simulate flying through a cloud bank as well: + + ./banks < /dev/null + + You will usually want at least a horizon, though. + + The format of scenery files is simple, by the way. They're just + a list of 3-D coordinates, and the simulator simply draws line + segments from point to point as listed in the scenery file. 0 0 + 0 is used to end a series of consecutive line segments. Note + that in the coordinate system used, the third coordinate + represents altitude in a negative sense: negative numbers are + positive altitudes. + + I'm sure you'll be making your own scenery files very soon!!! + + ---------------------------- + Alternate Build Instructions + ---------------------------- + + Several options must be passed to the compiler to make the build + work. The provided build file has the appropriate options set + to default values. Use this section if you want to compile with + different options. + + To map a key to a control, you must pass an option to the + compiler in the format ``-Dcontrol=key''. The possible controls + you can map are described in the table below: + + + Control Description Default Key + ------- ------------------------- ----------- + IT Increase throttle XK_Page_Up + DT Decrease throttle XK_Page_Down + FD Move stick forward XK_Up + BK Move stick back XK_Down + LT Move stick left XK_Left + RT Move stick right XK_Right + CS Center stick XK_Enter + + + Values for the possible keys can be found in the X Windows + header file . This file is most likely a + cross-reference to another header, . + + You must map all seven controls to keys at compile time, or the + compilation will fail. + + For example, to map Center Stick to the space-bar, the compile + option would be ``-DCS=XK_space''. + + + To set the time step size, you must pass the following option to + the compiler: ``-Ddt=duration'', where dt is literal, and where + duration is the time in seconds you want the time step to be. + + Two things to keep in mind when selecting a time step. Time + steps that are too large (more than about 0.03) will cause + numerical stability problems and should be avoided. Setting the + time step to be smaller than your clock resolution will slow + down the simulator, because the system pauses for more time than + the simulator expects. + + The best advice is to set time step size to your system timer + resolution. Try a longer period if you're getting too much + flicker. diff --git a/1998/banks.orig.c b/1998/banks.orig.c new file mode 100644 index 000000000..e51b14c3f --- /dev/null +++ b/1998/banks.orig.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include + double L ,o ,P + ,_=dt,T,Z,D=1,d, + s[999],E,h= 8,I, + J,K,w[999],M,m,O + ,n[999],j=33e-3,i= + 1E3,r,t, u,v ,W,S= + 74.5,l=221,X=7.26, + a,B,A=32.2,c, F,H; + int N,q,C,y,p,U,*g + ; Display*e; char f[ + 52]; GC k; main( ){ Window + z=RootWindow(e=XOpenDisplay( 0),0); for (XSetForeground(e,k=XCreateGC (e,z,0,0),BlackPixel(e,0 )) +; scanf("%lf%lf%lf",y +n,w+y, y+s)+1; y ++); XSelectInput(e,z= XCreateSimpleWindow(e,z,0,0,400,400, +0,0,WhitePixel(e,0) ),KeyPressMask); for(XMapWindow(e,z); ; T=sin(O)){ struct timeval G={ 0,dt*1e6} +; K= cos(j); N=1e4; M+= H*_; Z=D*K; F+=_*P; r=E*K; W=cos( O); m=K*W; H=K*T; O+=D*_*F/ K+d/K*E*_; B= +sin(j); a=B*T*D-E*W; XClearWindow(e,z); t=T*E+ D*B*W; j+=d*_*D-_*F*E; P=W*E*B-T*D; for (o+=(I=D*W+E +*T*B,E*d/K *B+v+B/K*F*D)*_; pK)N=1e4; else{ q=W/(9+K) *4E2+2e2; C= 2E2+4e2/( K + +9)*D; N-1E4&&XDrawLine(e ,z,k,N ,U,q,C); N=q; U=C; } ++p; } L+=_*(X*t+P*M+m*l); T=X*X+ l*l+M *M; + XDrawString(e,z,k ,20,380,f,17); D=v/l*15; i+=(B *l-M*r -X*Z)*_; for(; XPending(e); u *=CS!=N){ + XEvent z; XNextEvent(e ,&z); + ++*((N=XLookupKeysym + (&z.xkey,0))-IT? + N-LT? UP-N?& E:& + J:& u: &h); --*( + DN -N? N-DT ?N== + RT?&u: & W:&h:&J + ); } m=15*F/l; + c+=(I=M/ l,l*H + +I*M+a*X)*_; H + =A*r+v*X-F*l+( + E=.1+X*4.9/l,t + =T*m/32-I*T/24 + )/S; K=F*M+( + h* 1e4/l-(T+ + E*5*T*E)/3e2 + )/S-X*d-B*A; + a=2.63 /l*d; + X+=( d*l-T/S + *(.19*E +a + *.64+J/1e3 + )-M* v +A* + Z)*_; l += + K *_; W=d; + sprintf(f, + "%5.0f %4" + "d %6.0f", + l /1.7,( C = + 9E3+O*57.3)% 0550,i); d+=T*(.45-14/l* + X-a*130-J* .14)*_/125e2+F*_*v; P=(T*(47 + *I-m* 52+E*94 *D-t*.38+u*.21*E) /1e2+W* + 179*v)/2312; select(p=0,g,g,g,&G); v-=( + W*F-T*(.63*m-I*.086+m*E*19-D*25-.11*u + )/107e2)*_; D=cos(o); E=sin(o); } } + + diff --git a/1998/bas1.c b/1998/bas1.c new file mode 100644 index 000000000..451e47681 --- /dev/null +++ b/1998/bas1.c @@ -0,0 +1,67 @@ +char r[]="C#S3K+[;G'W7OB/_? ? « ( !IOCCC! ´ ³Ën £0 0 e÷|ÅtÑ%Ä ° 2u" +" »¾ß mÔ/p ª c p) nm «¨ªúïµ!!¶â¡a £À3sîÜ 9sz2{ +§ 9_°0 © h0 ºÂ / " +"¤)$1 ¬ a~ ) % y qÃ'¯ ¹â ° \" ! q 6 µy' 0 3;e{ Ì kãÔs¾,Ê 2~a q t" +" 9dl 9 ¬.´ .ù_ &Á!ê '* ·­ ; ·± µÁ = ü 5 ,Þ & Ã0 Úù*½ ³äÿgh"; +#define C( b)O(28+(B+b)%6) +# define a >> B &M[i X] +#include/* s */ +#include/* s */ + unsigned int long +# define e putchar( + B,E,M,A,Z,I,N,G +# define g ! (32 a) +# define u U(533); +# define n (65 a) +# define z for ( +[32768], i [32] +# define p if( +[48][3]={ { { 2} } } ; void**V,*D,*F[32][48]; +void*Q(void**O){ return*O?(*O=Q(*O)):O; } U( +O){return E+=(O/=2)-1?U((A=A/2^57525273+(A& +1^O&1)*9583591<<5,O)),0:O,16; } main(O){ A +=O?time(D):953351751; z I=0; I<26; ++I){z +N=I/2; N<30+I/2; ++N){ z M=0; M<3; ++M){ +p Z=O)z; (B=I+Z*!!M) <26&&N+Z*(M!=2)-B/ +2<30; B[G]=N<<7|Z++<<13|I*4+M)z; G[B=A +# define X [ I+Z*!! M] [ N+Z*(M!= 2)] +&32767]; )u p!Z&&M[i X]){ z B=0; B<6 +; B++){ p!g){ C(5)O(0)C(2)O(2)} C(( +B&1?!!n:4-3*g))p!g|n)O(4)O(7)} z B +=0; B<6; B++){ p g&&!n)O(14)p!g)O +(8)p B&1|g){ O=!n; O(10)O=!(1040 +a ); O(12 )O=0; } O(17+(B&1 ?!( +1040 a)!=!n:g))} } } O(24)} O( +21+(I&1))} O(26)p O)z E=0; E< +1<<15; I=16){ B=E++[G]; D=Q( +&F[I=B/4&31][N=B>>7&63]); M +=B%4; Z=B>>=13; V=Q(&F X); +p!(D==V|N[I[i]] [1]|i X[1 +])){ z; --Z&&!(*i X%9|*i +X/9&*i X/9-1); ); p!Z){ +*V=D; *i X|=32>>M; Z=B +; z*i X|=4>>M; --Z; i +X[*i X?2-!i X [1]:!( +F X=V)]=36>>M); } } +} p!O){ u u z I=8; +I--; )p(N=I[r]=(I +>3?E:A)>>(I*9&24 +))==10||N==13){ +e 0 ); I =8; u +u u u} e 1 ); +} z E =1333; +++ I<8+469* +!!O; e(N=I +[r])-32|! +O?N:r[++ +I]-N)); +return + O && +main +(!O +); +} diff --git a/1998/bas1.hint b/1998/bas1.hint new file mode 100644 index 000000000..61a97dc2c --- /dev/null +++ b/1998/bas1.hint @@ -0,0 +1,78 @@ +Best Encapsulation: + + Bas de Bakker + Pica, Centre for Library Automation + Statenweg 154 B (home address) + 3039 JN Rotterdam + The Netherlands + + +Judges' comments: + + To build: + + make bas1 + + To use: + + If lpr on your system can print PostScript: + + ./bas1 | gunzip | lpr + + else, while in X Window System, + + ./bas1 | gunzip | gv - + or: + ./bas1 | gunzip | gs -sDEVICE=pgmraw -sOutputFile='|xv -' - + + The output is supposed to be a 3D maze, but it is somewhat more + than that. If you've seen any of the Maurits Escher's works, + you'll know what we're talking about. + + When trying to run the program with command line arguments, be generous. + + +Selected Author's Comments: + + BEMAZING + ======== + + "You're in a twisty little maze of beams, all different." + + Bemazing is "amazing" taken one step (letter) further. Bemazing + creates a 3D maze of beams. Try to go from the entrance (the + unfinished beam in one corner) to the exit (the unfinished beam in the + opposite corner) or vice versa. + + For maximum portability, Bemazing is not tied to any window system, + but creates postscript. The picture it makes will fit on either A4 or + letter size paper. + + In addition, because postscript is rather verbose, Bemazing creates + the postscript in gzip format, in order to save precious bits on your + hard disk for the latest version of GNU Emacs (after all, you wouldn't + want to use an editor without a psychoanalyze-pinhead function, now + would you). Again for maximum portability, Bemazing will take special + care that the binary output will not contain any newline or return + characters that may get weird treatment on systems that do not use the + One True Line Separator. + + NOTES + ===== + + Be sure to view the source with something that can display characters + \240-\377. Use LESSCHARSET=latin1, M-x standard-display-european in + GNU Emacs etc. The source does not use characters in the range + \200-\237 (we are not an unnamed word processor that tends to create + HTML containing these control characters). + + Because this is not the obfuscated postscript contest, the postscript + does not contain any "for", "if" or other control structures. All the + logic is in the C code. There are only a few straightforward "def"s, + because otherwise the output would become much larger. + + Try running Bemazing with command line arguments and see what + happens. (But note that the program only guarantees that there + actually is a route from entrance to exit if you run it without + command line arguments.) + diff --git a/1998/bas2.c b/1998/bas2.c new file mode 100644 index 000000000..380a0a069 --- /dev/null +++ b/1998/bas2.c @@ -0,0 +1,3 @@ +#include +int O,o,i;char*I="";main(l){O&=l&1?*I:~*I,*I++||(l=2*getchar(),i+=O>8 +?o:O?0:o+1,o=O>9,O=-1,I="t8B~pq`",l>0)?main(l/2):printf("%d\n",--i);} diff --git a/1998/bas2.hint b/1998/bas2.hint new file mode 100644 index 000000000..cdda7e722 --- /dev/null +++ b/1998/bas2.hint @@ -0,0 +1,49 @@ +Best Small Program: + + Bas de Bakker + Pica, Centre for Library Automation + Statenweg 154 B (home address) + 3039 JN Rotterdam + The Netherlands + + +Judges' comments: + + To build: + + make bas2 + + To use: + + ./bas2 < bas2.c + + Questions to ponder: + + Can you determine the relationship between the input and the + resulting numeric output? + + The program was not designed to process files with a certain + octet value, what value is that? + + Hint and Extra Credit: + + This entry points our a minor flaw in the IOCCC rules that has + been around since 1992. It processes a certain octet value in + a way that differs from a strict reading of one of the + official IOCCC rules. What is the rule and what is the octet + value? + + +Selected Author's Comments: + + The main obfuscation is the way characters are recognized, which is + done by matching the bit patterns. Minor obfuscations are: + + - Useless layout. + + - Useless variable names. + + - Recursive main() instead of 2 loops (over input characters and over + bits in the character). + + - ? and || instead of if statements. diff --git a/1998/bb.sc b/1998/bb.sc new file mode 100644 index 000000000..7fdcedf10 --- /dev/null +++ b/1998/bb.sc @@ -0,0 +1,572 @@ +23374 -1302 -30 +23374 -1200 -30 +23374 -1099 -30 +23374 -998 -30 +23374 -897 -30 +23374 -796 -30 +23374 -695 -30 +23374 -594 -30 +23374 -493 -30 +23374 -392 -30 +23374 -291 -30 +23374 -190 -30 +23374 -89 -30 +23374 11 -30 +23374 112 -30 +23374 213 -30 +23374 314 -30 +23374 415 -30 +23374 516 -30 +23374 617 -30 +23374 718 -30 +23374 819 -30 +23374 920 -30 +23374 1021 -30 +23374 1122 -30 +23374 1223 -30 +23374 1324 -30 +23374 1426 -30 +23498 1426 -30 +23498 1324 -30 +23498 1223 -30 +23498 1122 -30 +23498 1021 -30 +23498 920 -30 +23498 819 -30 +23498 718 -30 +23498 617 -30 +23498 516 -30 +23498 415 -30 +23498 314 -30 +23498 213 -30 +23498 112 -30 +23498 11 -30 +23498 -89 -30 +23498 -190 -30 +23498 -291 -30 +23498 -392 -30 +23498 -493 -30 +23498 -594 -30 +23498 -695 -30 +23498 -796 -30 +23498 -897 -30 +23498 -998 -30 +23498 -1099 -30 +23498 -1200 -30 +23498 -1302 -30 +23374 -1302 -30 +23374 -1302 -30 +0 0 0 +0 0 0 +7502 124 -30 +7502 124 -750 +7750 124 -750 +7502 124 -510 +7750 124 -510 +7502 124 -270 +7750 124 -270 +7502 124 -30 +7750 124 -30 +7750 124 -750 +7750 -124 -750 +7750 124 -510 +7750 -124 -510 +7750 124 -270 +7750 -124 -270 +7750 124 -30 +7750 -124 -30 +7750 -124 -750 +7502 -124 -750 +7750 -124 -510 +7502 -124 -510 +7750 -124 -270 +7502 -124 -270 +7750 -124 -30 +7502 -124 -30 +7502 -124 -750 +7502 124 -750 +7502 -124 -510 +7502 124 -510 +7502 -124 -270 +7502 124 -270 +7502 -124 -30 +7502 124 -30 +7502 124 -750 +7502 124 -750 +7502 124 -510 +7502 124 -510 +7502 124 -270 +7502 124 -270 +7502 124 -30 +7502 124 -30 +0 0 0 +23374 -1054 0 +23374 -1054 -30 +23374 -496 -402 +23374 62 -526 +23374 620 -402 +23374 1178 -30 +23374 1178 0 +0 0 0 +23498 1178 0 +23498 1178 -30 +23498 620 -402 +23498 62 -526 +23498 -496 -402 +23498 -1054 -30 +23498 -1054 0 +0 0 0 +18166 0 -30 +18166 0 -610 +18352 186 -610 +18166 0 -320 +18352 186 -320 +18166 0 -30 +18352 186 -30 +18352 186 -610 +18538 0 -610 +18352 186 -320 +18538 0 -320 +18352 186 -30 +18538 0 -30 +18538 0 -610 +18352 -186 -610 +18538 0 -320 +18352 -186 -320 +18538 0 -30 +18352 -186 -30 +18352 -186 -610 +18166 0 -610 +18352 -186 -320 +18166 0 -320 +18352 -186 -30 +18166 0 -30 +18166 0 -610 +18166 0 -610 +18166 0 -320 +18166 0 -320 +18166 0 -30 +18166 0 -30 +0 0 0 +13392 -1364 -30 +13392 -1262 -30 +13392 -1161 -30 +13392 -1060 -30 +13392 -959 -30 +13392 -858 -30 +13392 -757 -30 +13392 -656 -30 +13392 -555 -30 +13392 -454 -30 +13392 -353 -30 +13392 -252 -30 +13392 -151 -30 +13392 -50 -30 +13392 50 -30 +13392 151 -30 +13392 252 -30 +13392 353 -30 +13392 454 -30 +13392 555 -30 +13392 656 -30 +13392 757 -30 +13392 858 -30 +13392 959 -30 +13392 1060 -30 +13392 1161 -30 +13392 1262 -30 +13392 1364 -30 +13516 1364 -30 +13516 1262 -30 +13516 1161 -30 +13516 1060 -30 +13516 959 -30 +13516 858 -30 +13516 757 -30 +13516 656 -30 +13516 555 -30 +13516 454 -30 +13516 353 -30 +13516 252 -30 +13516 151 -30 +13516 50 -30 +13516 -50 -30 +13516 -151 -30 +13516 -252 -30 +13516 -353 -30 +13516 -454 -30 +13516 -555 -30 +13516 -656 -30 +13516 -757 -30 +13516 -858 -30 +13516 -959 -30 +13516 -1060 -30 +13516 -1161 -30 +13516 -1262 -30 +13516 -1364 -30 +13392 -1364 -30 +13392 -1364 -30 +0 0 0 +13392 -1116 -30 +13392 -892 -60 +13392 -669 -150 +13392 -334 -60 +13392 0 -35 +13392 334 -60 +13392 669 -150 +13392 892 -60 +13392 1116 -30 +0 0 0 +13392 -669 -150 +13392 -669 0 +0 0 0 +13392 669 -150 +13392 669 0 +0 0 0 +13516 1116 -30 +13516 892 -60 +13516 669 -150 +13516 334 -60 +13516 0 -35 +13516 -334 -60 +13516 -669 -150 +13516 -892 -60 +13516 -1116 -30 +0 0 0 +13516 669 -150 +13516 669 0 +0 0 0 +13516 -669 -150 +13516 -669 0 +0 0 0 +33604 620 -30 +33604 620 -1132 +33852 620 -1132 +33604 620 -856 +33852 620 -856 +33604 620 -581 +33852 620 -581 +33604 620 -305 +33852 620 -305 +33604 620 -30 +33852 620 -30 +33852 620 -1132 +33852 372 -1132 +33852 620 -856 +33852 372 -856 +33852 620 -581 +33852 372 -581 +33852 620 -305 +33852 372 -305 +33852 620 -30 +33852 372 -30 +33852 372 -1132 +33604 372 -1132 +33852 372 -856 +33604 372 -856 +33852 372 -581 +33604 372 -581 +33852 372 -305 +33604 372 -305 +33852 372 -30 +33604 372 -30 +33604 372 -1132 +33604 620 -1132 +33604 372 -856 +33604 620 -856 +33604 372 -581 +33604 620 -581 +33604 372 -305 +33604 620 -305 +33604 372 -30 +33604 620 -30 +33604 620 -1132 +33604 620 -1132 +33604 620 -856 +33604 620 -856 +33604 620 -581 +33604 620 -581 +33604 620 -305 +33604 620 -305 +33604 620 -30 +33604 620 -30 +0 0 0 +44516 1240 -30 +44516 1340 -30 +44516 1441 -30 +44516 1542 -30 +44516 1643 -30 +44516 1743 -30 +44516 1844 -30 +44516 1945 -30 +44516 2046 -30 +44516 2146 -30 +44516 2247 -30 +44516 2348 -30 +44516 2449 -30 +44516 2549 -30 +44516 2650 -30 +44516 2751 -30 +44516 2852 -30 +44516 2952 -30 +44516 3053 -30 +44516 3154 -30 +44516 3255 -30 +44516 3355 -30 +44516 3456 -30 +44516 3557 -30 +44516 3658 -30 +44640 3658 -30 +44640 3557 -30 +44640 3456 -30 +44640 3355 -30 +44640 3255 -30 +44640 3154 -30 +44640 3053 -30 +44640 2952 -30 +44640 2852 -30 +44640 2751 -30 +44640 2650 -30 +44640 2549 -30 +44640 2449 -30 +44640 2348 -30 +44640 2247 -30 +44640 2146 -30 +44640 2046 -30 +44640 1945 -30 +44640 1844 -30 +44640 1743 -30 +44640 1643 -30 +44640 1542 -30 +44640 1441 -30 +44640 1340 -30 +44640 1240 -30 +44516 1240 -30 +44516 1240 -30 +0 0 0 +44516 1488 -30 +44516 1674 -60 +44516 1860 -150 +44516 2139 -60 +44516 2418 -35 +44516 2697 -60 +44516 2976 -150 +44516 3162 -60 +44516 3348 -30 +0 0 0 +44516 1860 -150 +44516 1860 0 +0 0 0 +44516 2976 -150 +44516 2976 0 +0 0 0 +44640 3348 -30 +44640 3162 -60 +44640 2976 -150 +44640 2697 -60 +44640 2418 -35 +44640 2139 -60 +44640 1860 -150 +44640 1674 -60 +44640 1488 -30 +0 0 0 +44640 2976 -150 +44640 2976 0 +0 0 0 +44640 1860 -150 +44640 1860 0 +0 0 0 +48980 3348 -30 +48980 3348 -440 +49228 3348 -440 +48980 3348 -30 +49228 3348 -30 +49228 3348 -440 +49228 2604 -440 +49228 3348 -30 +49228 2604 -30 +49228 2604 -440 +48980 2604 -440 +49228 2604 -30 +48980 2604 -30 +48980 2604 -440 +48980 3348 -440 +48980 2604 -30 +48980 3348 -30 +48980 3348 -440 +48980 3348 -440 +48980 3348 -30 +48980 3348 -30 +0 0 0 +53940 1798 -30 +53940 1901 -30 +53940 2004 -30 +53940 2108 -30 +53940 2211 -30 +53940 2314 -30 +53940 2418 -30 +53940 2521 -30 +53940 2624 -30 +53940 2728 -30 +53940 2831 -30 +53940 2934 -30 +53940 3038 -30 +53940 3141 -30 +53940 3244 -30 +53940 3348 -30 +53940 3451 -30 +53940 3554 -30 +53940 3658 -30 +54064 3658 -30 +54064 3554 -30 +54064 3451 -30 +54064 3348 -30 +54064 3244 -30 +54064 3141 -30 +54064 3038 -30 +54064 2934 -30 +54064 2831 -30 +54064 2728 -30 +54064 2624 -30 +54064 2521 -30 +54064 2418 -30 +54064 2314 -30 +54064 2211 -30 +54064 2108 -30 +54064 2004 -30 +54064 1901 -30 +54064 1798 -30 +53940 1798 -30 +53940 1798 -30 +0 0 0 +53940 1984 0 +53940 1984 -80 +53940 2356 -130 +53940 3100 -30 +53940 3472 -30 +53940 3100 -130 +53940 2356 -30 +53940 1984 -80 +0 0 0 +53940 3472 -30 +53940 3472 0 +0 0 0 +54064 3472 0 +54064 3472 -80 +54064 3100 -130 +54064 2356 -30 +54064 1984 -30 +54064 2356 -130 +54064 3100 -30 +54064 3472 -80 +0 0 0 +54064 1984 -30 +54064 1984 0 +0 0 0 +64790 0 -30 +64790 0 -580 +65100 -248 -580 +64790 0 -305 +65100 -248 -305 +64790 0 -30 +65100 -248 -30 +65100 -248 -580 +65596 372 -580 +65100 -248 -305 +65596 372 -305 +65100 -248 -30 +65596 372 -30 +65596 372 -580 +65286 620 -580 +65596 372 -305 +65286 620 -305 +65596 372 -30 +65286 620 -30 +65286 620 -580 +64790 0 -580 +65286 620 -305 +64790 0 -305 +65286 620 -30 +64790 0 -30 +64790 0 -580 +64790 0 -580 +64790 0 -305 +64790 0 -305 +64790 0 -30 +64790 0 -30 +0 0 0 +73470 -1798 -30 +73470 -1696 -30 +73470 -1595 -30 +73470 -1494 -30 +73470 -1393 -30 +73470 -1292 -30 +73470 -1191 -30 +73470 -1090 -30 +73470 -989 -30 +73470 -888 -30 +73470 -787 -30 +73470 -686 -30 +73470 -585 -30 +73470 -484 -30 +73470 -383 -30 +73470 -282 -30 +73470 -181 -30 +73470 -80 -30 +73470 20 -30 +73470 121 -30 +73470 222 -30 +73470 323 -30 +73470 424 -30 +73470 525 -30 +73470 626 -30 +73470 727 -30 +73470 828 -30 +73470 930 -30 +73594 930 -30 +73594 828 -30 +73594 727 -30 +73594 626 -30 +73594 525 -30 +73594 424 -30 +73594 323 -30 +73594 222 -30 +73594 121 -30 +73594 20 -30 +73594 -80 -30 +73594 -181 -30 +73594 -282 -30 +73594 -383 -30 +73594 -484 -30 +73594 -585 -30 +73594 -686 -30 +73594 -787 -30 +73594 -888 -30 +73594 -989 -30 +73594 -1090 -30 +73594 -1191 -30 +73594 -1292 -30 +73594 -1393 -30 +73594 -1494 -30 +73594 -1595 -30 +73594 -1696 -30 +73594 -1798 -30 +73470 -1798 -30 +73470 -1798 -30 +0 0 0 +73470 -1550 0 +73470 -1550 -30 +73470 -992 -402 +73470 -434 -526 +73470 124 -402 +73470 682 -30 +73470 682 0 +0 0 0 +73594 682 0 +73594 682 -30 +73594 124 -402 +73594 -434 -526 +73594 -992 -402 +73594 -1550 -30 +73594 -1550 0 +0 0 0 diff --git a/1998/chaos.c b/1998/chaos.c new file mode 100644 index 000000000..078906902 --- /dev/null +++ b/1998/chaos.c @@ -0,0 +1,93 @@ +#include +#include +#include + +#define A int +#define F float +#define O sizeof +#define V ((A *)(X+N)) +#define U(a,b) for(a = 0; a < b; a++) +#define L(a) (X[K] * H[a*4]+ X[K+1] * H[a*4+1]+ X[K+2] * H[a*4+2]) +#define _(e,f,a,b,c) if(M==e) { T[a*4+c] = T[b*4+c] = T[c*4+a] = T[c*4+b] = !(T[c*5] = 1); T[a*4+b] = -(T[b*4+a] = f .1045284632); T[b*5] = T[a*5] = .9945418726; U(M,3) U(E,4) U(K,3) R[M*4+E] += H[K*4+E] * T[M*4+K]; memcpy(H,R,12*O(F)); } + +char Q[3792]; +A K, M=0, E, B; +long Z; +F H[] = { 1,0,0,0,0,1,0,0,0,0,1,0 } , T[12], R[12], C, D, I, J, S, * X, G=4; +FILE * W; + +A main(A N,char ** Y) { + char P[] = "AlWuzEre 72 -1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 -1 1 1 1 -1 1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 "; + strcpy(Q,P); + if(!(W = fopen(Y[N<2?0:1],"r"))) { + printf("Can't read\n"); exit(-1); } + fseek(W,0,SEEK_END); + Z = ftell(W); + fseek(W,0,SEEK_SET); + strcpy(Q+9, "%d"); + while(fscanf(W,Q,&N) != 1) { + fseek(W,1,SEEK_CUR); + if(ftell(W) >= Z) { + printf("Bad input\n"); exit(-1); } } + + X = (F *)malloc(N * (O(A)>O(F)?O(A):O(F)) * 2); + if(!X) { printf("No memory\n"); exit(-1); } + U(K,N) fscanf(W,"%f",X+K); + fclose(W); + + initscr(); + halfdelay(30); + noecho(); + + CH: + memset(R,0,12*O(F)); + _('h', ,1,2,0) + _('j', ,2,0,1) + _('k', ,1,0,2) + _('y',-,1,2,0) + _('u',-,2,0,1) + _('i',-,1,0,2) + G += M=='a'?-.1:M=='z'?.1:0; + if(M=='q') { printf("%.9s\n",P); exit(0); } + + memset(Q,0,3792); + erase(); + + U(K,N) { + C = 40 / (L(2)+G); + V[K] = (A)(L(0) * C) + 40; + V[K+1] = (A)(L(1) * C) + 24; + K+=2; } + + U(B,N) { + C = V[B++]; + D = V[B++]; + E = V[++B] - C; + M = V[++B] - D; + B++; + S = (F)abs((abs(E)>abs(M))?E:M); + I=E/S; + J=M/S++; + U(K,S) + { + E = (A)(C+0.5); + M = (A)(D+0.5); + if(E>=0 && M>=0 && E<79 && M<48) + { + Q[E + M * 79] = 1; + mvaddch((M&1?M-1:M)/2,E,Q[E+(M+(M&1?-1:1))*79]?':':(M&1?'.':'`')); + } + C+=I; + D+=J; + } + } + + move(0,0); + refresh(); + + M = getch(); + halfdelay(M==ERR?1:30); + M = M==ERR?'u':M; + + goto CH; +} diff --git a/1998/chaos.hint b/1998/chaos.hint new file mode 100644 index 000000000..41d56bb5a --- /dev/null +++ b/1998/chaos.hint @@ -0,0 +1,77 @@ +Best Object Orientation: + + Alan De Smet + 8531 Greenway Blvd. #206 + Middleton, WI 53562 + USA + + http://www.upl.cs.wisc.edu/~chaos/ + + +Judge's Comments: + + To build: + + make chaos + + To use: + + ./chaos + + This is the authors first IOCCC entry. We thought the entry was + a nice example of a compact collection of obfuscations. + + Can you figure our why, in some cases, it wants to read itself? + + Some systems do not implement halfdelay() in their libcurses. + You might try compiling with -lncurses of you have that library. + Or you can build this entry without the halfdelay() call by: + + make chaos_nohalf + + +Selected Author's Comments: + + + * Usage + + The executable takes a single argument for the data file to use. + If no argument is given, it will find a data file by itself, don't + worry about it... + + + * Summary + + This is a simple ncurses 3D object viewer. The keys 'y', 'u', 'i', + 'h', 'j', and 'k' rotate. 'a' and 'z' zoom in and out. 'q' quits. + Given about 3 seconds of no input, it will start rotating until + interrupted by user input. + + + * Features (aka Bugs): + + Memory malloced is never freed. This shouldn't be a big deal, + since only one block is ever allocated, and the OS should recover it. + + My local flavor of lint doesn't seem to like the fact that I never + "return" from main. Feh, what does it know? Otherwise, ignoring + lint's over protectiveness ("Of course I'm not using all of the + functions defined in curses.h!"), it's lint clean. + + If the compiler happens to generate the byte sequence "AlWuzEre" + in the executable by chance, the program may be unable to locate + the embedded string. As a result, running the program without an + external data file may act in undefined ways. + + If the compiler doesn't store char * P's data in a nice contiguous + stream, it would be bad. As above, it would break running the + program without an external data file. + + If the incoming data is corrupt, the results are undefined. + (Although dumping core is a popular result.) + + When a point passes behind the camera, it is still plotted. + The object will "bounce" off the camera, but the result (some points + in front, some reflected from the rear) looks really odd. And it + sometimes hangs. So just don't fly through objects. You'll be + happier. diff --git a/1998/cube.data b/1998/cube.data new file mode 100644 index 000000000..a39b2cc5c --- /dev/null +++ b/1998/cube.data @@ -0,0 +1,14 @@ +AlWuzEre 72 +-1 1 1 1 1 1 + 1 1 1 1 1 -1 + 1 1 1 1 -1 1 + 1 1 -1 1 -1 -1 +-1 1 -1 -1 1 1 + 1 1 -1 -1 1 -1 + 1 -1 1 -1 -1 1 + 1 -1 -1 -1 -1 -1 + 1 -1 1 1 -1 -1 +-1 1 1 -1 -1 1 +-1 1 -1 -1 -1 -1 +-1 -1 1 -1 -1 -1 + diff --git a/1998/data b/1998/data new file mode 100644 index 000000000..4ef1f46ce --- /dev/null +++ b/1998/data @@ -0,0 +1,949 @@ +# This file is read by a standard conformance test program. +# +# File format: +# Three paragraphs separated by exactly one empty line. +# Lines beginning with '#' at the very beginning are ignored. +# +# Lines in the first paragraph consist of a single digit [0-9], a space, +# and an argument for cpp which selects some standard. Normally this is +# done with a feature test macros but for example for ANSI compliance it +# might be a compiler switch, like -Xa or -ansi. +# No more than 10 standards (identified by the digits 0 - 9, in order) +# are allowed. +# +# Lines in the second paragraph consist of a string of digits, a space, +# and an identifier. An identifier may begin or end with '*' meaning +# zero or more characters can be appended or prepended, respectively. +# The string of digits describes the particular standards in which this +# identifier is *always* (regardless of which header is included) reserved +# and thus may be a valid macro. +# +# Lines in the third paragraph consist of two or three fields. +# A two field line consists of a string of digits describing the +# standards, a space, and an identifier (of the same format as in +# the second paragraph). A sequence of two field lines is followed +# by exactly one three field line. This line consists of a string +# of digits describing the standards, a space, the header name, +# another space and the single character H. In other words, a list +# of identifiers *followed* by the header in which they may appear. +# [That way only one pass is needed when reading this file.] +# +0 -D__STDC__ -D_ANSI_SOURCE +1 -D_POSIX_SOURCE +2 -D_XOPEN_SOURCE -D_XOPEN_VERSION=4 + +# Identifiers with external linkage (extern functions and extern +# variables) are always in scope, even when no header is included. +# +# Always okay, because these constitute the implementation name space: +012 _* +# +# : +012 errno +# +# : [no identifiers with external linkage] +# +# : [no identifiers with external linkage] +# +# : +012 isa* +012 isb* +012 isc* +012 isd* +012 ise* +012 isf* +012 isg* +012 ish* +012 isi* +012 isj* +012 isk* +012 isl* +012 ism* +012 isn* +012 iso* +012 isp* +012 isq* +012 isr* +012 iss* +012 ist* +012 isu* +012 isv* +012 isw* +012 isx* +012 isy* +012 isz* +012 toa* +012 tob* +012 toc* +012 tod* +012 toe* +012 tof* +012 tog* +012 toh* +012 toi* +012 toj* +012 tok* +012 tol* +012 tom* +012 ton* +012 too* +012 top* +012 toq* +012 tor* +012 tos* +012 tot* +012 tou* +012 tov* +012 tow* +012 tox* +012 toy* +012 toz* +# +# : +012 lconv +012 setlocale +012 localeconv +# +# : +012 acos +012 acosf +012 acosl +012 asin +012 asinf +012 asinl +012 atan +012 atanf +012 atanl +012 atan2 +012 atan2f +012 atan2l +012 cos +012 cosf +012 cosl +012 cosh +012 coshf +012 coshl +012 exp +012 expf +012 expl +012 fabs +012 fabsf +012 fabsl +012 floor +012 floorf +012 floorl +012 fmod +012 fmodf +012 fmodl +012 frexp +012 frexpf +012 frexpl +012 ldexp +012 ldexpf +012 ldexpl +012 log +012 logf +012 logl +012 log10 +012 log10f +012 log10l +012 modf +012 modff +012 modfl +012 pow +012 powf +012 powl +012 sin +012 sinf +012 sinl +012 sinh +012 sinhf +012 sinhl +012 tan +012 tanf +012 tanl +012 tanh +012 tanhf +012 tanhl +012 sqrt +012 sqrtf +012 sqrtl +012 ceil +012 ceilf +012 ceill +# +# : +012 longjmp +012 setjmp +12 siglongjmp +12 sigsetjmp +# +# : +012 raise +012 signal +12 kill +12 sigaction +12 sigaddset +12 sigdelset +12 sigemptyset +12 sigfillset +12 sigismember +12 sigpending +12 sigprocmask +12 sigsuspend +# +# : [no identifiers with external linkage] +# +# : +012 stderr +012 stdin +012 stdout +012 remove +012 rename +012 tmpfile +012 tmpnam +012 fclose +012 fflush +012 fileno +012 fopen +012 freopen +012 setbuf +012 setvbuf +012 fprintf +012 fscanf +012 printf +012 scanf +012 sprintf +012 sscanf +012 vfprintf +012 vprintf +012 vsprintf +012 fgetc +012 fgets +012 fputc +012 fputs +012 getc +012 getchar +012 gets +012 putc +012 putchar +012 puts +012 ungetc +012 fread +012 fwrite +012 fgetpos +012 fseek +012 fsetpos +012 ftell +012 rewind +012 clearerr +012 feof +012 ferror +012 perror +# +# : +012 atof +012 atoi +012 atol +012 strtod +012 strtol +012 strtoul +012 rand +012 srand +012 calloc +012 free +012 malloc +012 realloc +012 abort +012 atexit +012 exit +012 getenv +012 system +012 bsearch +012 qsort +012 abs +012 div +012 labs +012 ldiv +012 mblen +012 mbtowc +012 wctomb +012 mbstowcs +012 wcstombs +# +# +012 mema* +012 memb* +012 memc* +012 memd* +012 meme* +012 memf* +012 memg* +012 memh* +012 memi* +012 memj* +012 memk* +012 meml* +012 memm* +012 memn* +012 memo* +012 memp* +012 memq* +012 memr* +012 mems* +012 memt* +012 memu* +012 memv* +012 memw* +012 memx* +012 memy* +012 memz* +012 stra* +012 strb* +012 strc* +012 strd* +012 stre* +012 strf* +012 strg* +012 strh* +012 stri* +012 strj* +012 strk* +012 strl* +012 strm* +012 strn* +012 stro* +012 strp* +012 strq* +012 strr* +012 strs* +012 strt* +012 stru* +012 strv* +012 strw* +012 strx* +012 stry* +012 strz* +012 wcsa* +012 wcsb* +012 wcsc* +012 wcsd* +012 wcse* +012 wcsf* +012 wcsg* +012 wcsh* +012 wcsi* +012 wcsj* +012 wcsk* +012 wcsl* +012 wcsm* +012 wcsn* +012 wcso* +012 wcsp* +012 wcsq* +012 wcsr* +012 wcss* +012 wcst* +012 wcsu* +012 wcsv* +012 wcsw* +012 wcsx* +012 wcsy* +012 wcsz* +# +# : +012 clock +012 difftime +012 mktime +012 time +012 asctime +012 ctime +012 gmtime +012 localtime +012 strftime +12 tzset +12 tzname +# +# : [no identifiers with external linkage] +# +# : [no identifiers with external linkage] +# +# : [no identifiers with external linkage] +# +# : +012 wctype +012 wctrans +# (is* and to* mentioned above) +# +# : +# (wcs* already mentioned above) +012 fwprintf +012 fwscanf +012 wprintf +012 wscanf +012 swprintf +012 swscanf +012 vfwprintf +012 vwprintf +012 vswprintf +012 fgetwc +012 fgetws +012 fputwc +012 fputws +012 getwc +012 getwchar +012 putwc +012 putwchar +012 ungetwc +012 fwide +012 wmemchr +012 wmemcmp +012 wmemcpy +012 wmemmove +012 wmemset +012 btowc +012 wctob +012 mbsinit +012 mbrlen +012 mbrtowc +012 wcrtomb +012 mbsrtowcs +# +# (POSIX) : +12 dirent +12 closedir +12 opendir +12 readdir +12 rewinddir +# +# (POSIX) : +12 flock +12 creat +12 fcntl +12 open +# +# (POSIX) : +12 getgrgid +12 getgrnam +# +# (POSIX) : +12 getpwnam +12 getpwuid +# +# (POSIX) : +12 chmod +12 fstat +12 mkdir +12 mkfifo +12 stat +12 umask +# +# (POSIX) : +12 times +# +# (POSIX) : [no external identifiers] +# +# (POSIX) : +12 uname +# +# (POSIX) : +12 wait +12 waitpid +# +# (POSIX) : +12 cfgetispeed +12 cfgetospeed +12 cfsetispeed +12 cfsetospeed +12 tcdrain +12 tcflow +12 tcflush +12 tcgetattr +12 tcsendbreak +12 tcsetattr +# +# (POSIX) : +12 _exit +12 access +12 alarm +12 chdir +12 chown +12 close +12 ctermid +12 cuserid +12 dup2 +12 dup +12 execl +12 execle +12 execlp +12 execv +12 execve +12 execvp +12 fork +12 fpathconf +12 getcwd +12 getegid +12 geteuid +12 getgid +12 getgroups +12 getlogin +12 getpgrp +12 getpid +12 getppid +12 getuid +12 isatty +12 link +12 lseek +12 pathconf +12 pause +12 pipe +12 read +12 rmdir +12 setgid +12 setpgid +12 setsid +12 setuid +12 sleep +12 sysconf +12 tcgetpgrp +12 tcsetpgrp +12 ttyname +12 unlink +12 write +# (XOPEN additions) +2 confstr +2 crypt +2 encrypt +2 getopt +2 optarg +2 opterr +2 optind +2 optopt +2 getpass +2 swab +# +# (POSIX) : +12 utime + +# Identifiers with no linkage, per header: +# macros, types, structs, unions. +012 E0* +012 E1* +012 E2* +012 E3* +012 E4* +012 E5* +012 E6* +012 E7* +012 E8* +012 E9* +012 EA* +012 EB* +012 EC* +012 ED* +012 EE* +012 EF* +012 EG* +012 EH* +012 EI* +012 EJ* +012 EK* +012 EL* +012 EM* +012 EN* +012 EO* +012 EP* +012 EQ* +012 ER* +012 ES* +012 ET* +012 EU* +012 EV* +012 EW* +012 EX* +012 EY* +012 EZ* +12 *_t +012 errno.h H +012 NULL +012 offsetof +012 ptrdiff_t +012 size_t +012 wchar_z +12 *_t +012 stddef.h H +012 NDEBUG +012 assert +12 *_t +012 assert.h H +012 LC_A* +012 LC_B* +012 LC_C* +012 LC_D* +012 LC_E* +012 LC_F* +012 LC_G* +012 LC_H* +012 LC_I* +012 LC_J* +012 LC_K* +012 LC_L* +012 LC_M* +012 LC_N* +012 LC_O* +012 LC_P* +012 LC_Q* +012 LC_R* +012 LC_S* +012 LC_T* +012 LC_U* +012 LC_V* +012 LC_W* +012 LC_X* +012 LC_Y* +012 LC_Z* +012 NULL +12 *_t +012 locale.h H +012 HUGE_VAL +12 *_t +2 MAXFLOAT +2 M_E +2 M_LOG2E +2 M_LOG10E +2 M_LN2 +2 M_LN10 +2 M_PI +2 M_PI_2 +2 M_PI_4 +2 M_1_PI +2 M_2_PI +2 M_2_SQRTPI +2 M_SQRT2 +2 M_SQRT1_2 +012 math.h H +012 jmp_buf +12 sigjmp_buf +12 *_t +012 setjmp.h H +012 sig_atomic_t +012 SIG_* +012 SIGA* +012 SIGB* +012 SIGC* +012 SIGD* +012 SIGE* +012 SIGF* +012 SIGG* +012 SIGH* +012 SIGI* +012 SIGJ* +012 SIGK* +012 SIGL* +012 SIGM* +012 SIGN* +012 SIGO* +012 SIGP* +012 SIGQ* +012 SIGR* +012 SIGS* +012 SIGT* +012 SIGU* +012 SIGV* +012 SIGW* +012 SIGX* +012 SIGY* +012 SIGZ* +12 sa_* +12 SA_* +12 *_t +012 signal.h H +012 va_list +012 va_start +012 va_arg +012 va_end +12 *_t +012 stdarg.h H +012 _IOFBF +012 _IOLBF +012 _IONBF +012 BUFSIZ +012 EOF +012 FILE +012 FILENAME_MAX +012 FOPEN_MAX +012 fpos_t +012 L_tmpnam +012 NULL +012 SEEK_CUR +012 SEEK_END +012 SEEK_SET +012 size_t +012 TMP_MAX +12 L_ctermid +12 L_cuserid +12 STREAM_MAX +12 *_t +2 P_tmpdir +012 stdio.h H +012 EXIT_FAILURE +012 EXIT_SUCCESS +012 MB_CUR_MAX +012 NULL +012 RAND_MAX +012 div_t +012 ldiv_t +012 size_t +012 wchar_t +12 *_t +2 WIFSIGNALED +2 WTERMSIG +2 WUNTRACED +2 WNOHANG +2 WIFEXITED +2 WIFSTOPPED +2 WSTOPSIG +2 WEXITSTATUS +012 stdlib.h H +012 NULL +012 size_t +12 *_t +012 string.h H +012 CLOCKS_PER_SEC +012 NULL +012 tm +12 CLK_TCK +12 *_t +012 time.h H +012 CHAR_BIT +012 CHAR_MAX +012 CHAR_MIN +012 INT_MAX +012 INT_MIN +012 LONG_MAX +012 LONG_MIN +012 MB_LEN_MAX +012 SCHAR_MAX +012 SCHAR_MIN +012 SHRT_MAX +012 SHRT_MIN +012 UCHAR_MAX +012 UCHAR_MIN +012 UINT_MAX +012 ULONG_MAX +012 USHRT_MAX +12 ARG_MAX +12 CHILD_MAX +12 LINK_MAX +12 MAX_CANON +12 MAX_INPUT +12 NAME_MAX +12 NGROUPS_MAX +12 OPEN_MAX +12 PATH_MAX +12 PIPE_BUF +12 SSIZE_MAX +12 STREAM_MAX +12 TZNAME_MAX +12 *_t +12 *_MAX +2 NL_TEXTMAX +2 DBL_MIN +2 NL_MSGMAX +2 NL_ARGMAX +2 NL_NMAX +2 WORD_BIT +2 NL_LANGMAX +2 LONG_BIT +2 NZERO +2 NL_SETMAX +2 FLT_DIG +2 FLT_MIN +2 DBL_DIG +012 limits.h H +012 DBL_DIG +012 DBL_MANT_DIG +012 DBL_MAX_10_EXP +012 DBL_MAX_EXP +012 DBL_MIN_10_EXP +012 DBL_MIN_EXP +012 FLT_DIG +012 FLT_MANT_DIG +012 FLT_MAX_10_EXP +012 FLT_MAX_EXP +012 FLT_MIN_10_EXP +012 FLT_MIN_EXP +012 LDBL_DIG +012 LDBL_MANT_DIG +012 LDBL_MAX_10_EXP +012 LDBL_MAX_EXP +012 LDBL_MIN_10_EXP +012 LDBL_MIN_EXP +012 DBL_MAX +012 FLT_MAX +012 LDBL_MAX +012 DBL_EPSILON +012 DBL_MIN +012 FLT_EPSILON +012 FLT_MIN +012 LDBL_EPSILON +012 LDBL_MIN +012 FLT_ROUNDS +012 FLT_RADIX +12 *_t +012 float.h H +012 and +012 and_eq +012 bitand +012 bitor +012 compl +012 not +012 not_eq +012 or +012 or_eq +012 xor +012 xor_eq +12 *_t +012 iso646.h H +012 wctrans_t +012 wctype_t +012 WEOF +012 wint_t +12 *_t +012 wctype.h H +012 mbstate_t +012 NULL +012 size_t +012 tm +012 wchar_t +012 WCHAR_MAX +012 WCHAR_MIN +012 WEOF +012 wint_t +12 *_t +012 wchar.h H +12 DIR +12 d_* +12 *_t +12 dirent.h H +12 l_* +12 F_* +12 O_* +12 S_* +12 FD_CLOEXEC +12 SEEK_CUR +12 SEEK_END +12 SEEK_SET +2 st_atime +2 st_mtime +2 st_ctime +12 *_t +12 fcntl.h H +12 group +12 *_t +12 gr_* +12 grp.h H +12 passwd +12 pw_* +12 *_t +12 pwd.h H +12 stat +12 st_* +12 S_* +12 *_t +12 sys/stat.h H +12 clock_t +12 tms +12 tms_* +12 *_t +12 sys/times.h H +12 *_t +12 sys/types.h H +12 utsname +12 *_t +12 sys/utsname.h H +12 WEXITSTATUS +12 WIFEXITED +12 WIFSIGNALED +12 WIFSTOPPED +12 WNOHANG +12 WSTOPSIG +12 WTERMSIG +12 WUNTRACED +12 *_t +12 sys/wait.h H +12 BRKINT +12 CLOCAL +12 CREAD +12 CS5 +12 CS6 +12 CS7 +12 CS8 +12 CSIZE +12 CSTOPB +12 ECHO +12 ECHOE +12 ECHOK +12 ECHONL +12 HUPCL +12 NCCS +12 NOFLSH +12 PARENB +12 PARMRK +12 PARODD +12 TOSTOP +12 c_* +12 V* +12 I* +12 O* +12 TC* +12 B0* +12 B1* +12 B2* +12 B3* +12 B4* +12 B5* +12 B6* +12 B7* +12 B8* +12 B9* +2 FFDLY +2 CRDLY +2 BS0 +2 BS1 +2 FF0 +2 CR0 +2 FF1 +2 CR1 +2 CR2 +2 CR3 +2 XCASE +2 NL0 +2 NL1 +2 TABDLY +2 NLDLY +2 TAB0 +2 TAB1 +2 TAB2 +2 TAB3 +2 BSDLY +12 termios +12 *_t +12 termios.h H +12 F_OK +12 NULL +12 R_OK +12 SEEK_CUR +12 SEEK_END +12 SEEK_SET +12 STDERR_FILENO +12 STDIN_FILENO +12 STDOUT_FILENO +12 W_OK +12 X_OK +# _* is in the allowed namespace anyway. +12 *_t +12 unistd.h H +12 utimbuf +12 *_t +12 utime.h H diff --git a/1998/desk.data b/1998/desk.data new file mode 100644 index 000000000..6103a52ac --- /dev/null +++ b/1998/desk.data @@ -0,0 +1,39 @@ +AlWuzEre 228 +-1.5 -1 1 -1.5 1 1 +-1.5 -1 1 -1.5 -1 -1 +-1.5 -1 1 -1 -1 1 +-1.5 1 1 -1 1 1 +-1.5 1 1 -1.5 1 -1 +-1.5 1 1 1.5 1 1 +1 -1 1 1 -1 -1 +1 -1 1 1 1 1 +1 -1 1 1 .75 1 +1 -1 -1 1 1 -1 +1 -1 -1 1 .75 -1 +-1 1 -1 1 1 -1 +-1 1 -1 -1 .75 -1 +1 1 -1 1 .75 -1 +-1 1 1 1 1 1 +-1 1 1 -1 .75 1 +1 1 1 1 .75 1 +-1 .75 -1 1 .75 -1 +-1 .75 -1 -1 .75 1 +1 .75 -1 1 .75 1 +1 .75 1 -1 .75 1 +-1.5 1 -1 -1 1 -1 +-1.5 1 -1 -1.5 -1 -1 +-1.5 1 -1 1.5 1 -1 +-1.5 -1 -1 -1 -1 -1 +1.5 1 1 1 1 1 +1.5 1 1 1.5 1 -1 +1.5 1 1 1.5 -1 1 +1.5 1 -1 1 1 -1 +1.5 1 -1 1.5 -1 -1 +1.5 -1 -1 1 -1 -1 +1.5 -1 -1 1.5 -1 1 +1.5 -1 1 1 -1 1 +-1 -1 -1 -1 1 -1 +-1 -1 -1 -1 .75 -1 +-1 -1 -1 -1 -1 1 +-1 -1 1 -1 1 1 +-1 -1 1 -1 .75 1 diff --git a/1998/df.c b/1998/df.c new file mode 100644 index 000000000..f760f1825 --- /dev/null +++ b/1998/df.c @@ -0,0 +1,39 @@ +#ifndef int +#ifdef while +char s[234],d[56],*p=s,m='m'; +#define int typedef (*define)();\ + define O [6]={getc,putchar,(y)memmove,(y)printf,(y)n,(y)l}; +#include __FILE__ +signed short n(short bz){ + short pb=0,Md=1,ih=2,sfp=3,sjs=4,fo,u=5,scp=6,t,gq=7,oh,r=8,pcf=9,rs=10; + char o=1,i=1,l,pc=i,b=r+o/2,_f=6,m=7,s=8,g,q,od=o*rs+4^s,js=_f/*3-m*'c',bs='g'; +return 1; } +#y FILE c[a]+s,p[c],r[m]+u[i+4*o|f]-r[wob][wad]+s*f-!w|o,L+x | cut +;}int main(i,love_unix){*/;}int main(i,love_unix){/*;}int main(i,love_unix){*\;}| here */ +while(FILE)for(;9-(i=0[O](f));); +for(;32-(i=0[O](f));0&& 3[O]("-->%s<--", "gxdgbtgxsxpcctvpixktedhiedcte")); +for(;'\n'-(i=O[0](f));)(i>='a'&&i<'z')?* +#include __FILE__ + "Demonic Smiley" );} /* */ +#else +#define while(int) short c=0;int*f=fopen(__##int##__,"r");for(i=0;i<25;i _)i[d]='A'+(13+i)%26;main: +#define y define +#define _ ++ +#include +#include +#include +#include __FILE__ +#endif +#elif defined(signed) +(p _)=(i-'a')[d]:!(i-'z')?*(p _)=32:(i>='A'&&i<='Z')&&((3&8|2)[O](d+1,d,24L),*(p _)=0[d]=i);/* +#y FILE t,ra|js+t*gj,at[qdd]-=K,is _,qv _,veb _,ti _,ao[mqht] _*/ +if(c _<6) goto main; 5[O]( +#else +#define signed short l(){char q='_';p=s+4*(time(NULL)%24)*2,m=(char)p+1;\ +*(p+8)=0; for(d[3]=10,d[33]=3[d]-10;d[3]<18;3[d] _) d[3][p]=q;3[d][p]=0;\ +hell: printf("\t[%s]\n",p+10);if(!m) goto stoned;\ +froze: d[8]=(scanf("%c",&(2[d+__STDC__])),2[d+!NULL])&223;if(!(3[d+5]-'\n')) goto froze;\ +for(m=1[d]=0;d[1]<8;2[d-1] _) (p[d[1]]-d[8]||(p[3[d-2]+10]=4[d+4]))+(p[d[1]+10]-q||m _);\ +goto hell;stoned:;} +FILE *X(FILE s){ char i,iev,jmqhu,xqht,mqh,ujek,sxydw,kdj,yjb,utou,qhre,eamy,jxxe,bt;} +#endif diff --git a/1998/df.hint b/1998/df.hint new file mode 100644 index 000000000..d74ca1d9d --- /dev/null +++ b/1998/df.hint @@ -0,0 +1,144 @@ +Best Data Hiding: + + Daniel Fischer + VNetx.com GbR + Salenbergstrasse 11 (home address) + D 72250 Freudenstadt + German Federal Republic + + +Judge's Comments: + + To build: + + make df + + To use: + + ./df + + Everyone talks about how data hiding can produce clearer code; I am + pleased to offer this charming refutation. + + The program is a simple game. A bit of observation reveals that the + game has some data - but where? It's unclear which of the contents of + the program are used. + + Curiously, the program only works if its source is in the directory + it's run in. More curiously, the program will fail if the program's + name's second letter isn't "r" (the source has been changed for your + convenience and this restriction does no longer exist). + + Modern design has come a long way since the unreadable, tightly-coupled + systems we used to have. + + Extra credit questions: + + Where are the words stored? + How many words does this entry use? + Can you add more words to the program and still make it work? + + +Selected Author's Comments: + + This program lets you guess English words. It displays an underscore + for each letter in the word; guessing a letter that actually is in + the word replaces the corresponding underscores with the letter + itself. You can guess a letter simply by typing it in. If your C + implementation requires it, you may have to hit Return before it + is recognized. In this case, you can also type multiple guesses + on the same line (completely solve it by entering + "abcdefghijklmnopqrstuvwxyz"). Execution stops when all underscores + have been replaced. + + The program offers a number of different words to guess, time() is + used to pick one at random. All words are eight characters long. + + The source should compile with any ANSI C compiler (I used CodeWarrior + w/ ANSI strict). Using non-ANSI compilers that implement the ANSI + features it uses will not work (unless they defined __STDC__ 1 + which they shouldn't). Due to space restrictions, I did not use + any trigraph sequences. It does not require any special -D defines. + + The source passes lint without any complaint (if invoked with + >/dev/null). (My lclint is unable to recover from some parts of it.) + + Actually, the code not only is compliant with the ANSI specifications, + but uses a near minimum subset of them. C keywords that were not + used have been re(de)fined to avoid unnecessary introduction of + new, unknown character patterns. The source also includes all ANSI + headers it needs (after most of the functions have been used), and + the declaration of main() follows the guidelines (but the return + type has a different meaning and the arguments are either mis- or + unused). There also may be some compiler warnings. These are not + bugs, but features. The more warnings, the better the compiler. + There wouldn't be any if I had been allowed to use some extra space + for prototypes etc. + + Multiple defines are used (but not all of them define), and #define + y define is used with #y but the code doesn't assume #y to expand + to #define. I have also included comments in the code, and vital + code in the comments. And of course there is code that doesn't do + anything but will crash the program if it is removed (just like + those comments I mentioned above). Additionally, since you said + you'd be preprocessing entries ignoring includes I figured I should + use some more of them instead of other obfuscation methods. Did + I mention that preprocessed or beautified sources will crash or + hang your system? The program will also crash on non-ASCII machines. + + The executable needs its source file present in the current directory + or, depending on your system, in your path. The name of the source + file is not hard-coded, __FILE__ is used instead. + + In the original version which was sent in to the contest, there were + some restrictions on the file name: + The second letter had to be a lowercase 'r'. + The third letter could never be a '+' or a 'b'. + Valid names would have been "pr4.c", "pr.c", "prog.c", "brownie.c" etc. + My first private version would only run when compiled on a Friday. + I decided it would be better this way... + These restrictions have been removed for your convenience. + + The following lines describe how this program works; if you don't + want to know it at this time, please skip them. If this entry would + by some mistake win the contest, please do not rot13 this - I hate + rot13'd spoilers since it is somewhat complicated on a Mac to + reverse them. Anyone out there should have enough discipline and + rot13 shouldn't be required, really. After all, we are no children + anymore :-) + + This paragraph is not part of the author's comments, but is a helpful + gift from the judges; if you read too fast to stop yourself, this should + give you enough time to stop, which you really need to do RIGHT NOW if + you don't want to read the spoilers, which really do spoil everything, + we mean it. + + The source file needs to be present because the words are read from + it. The wordlist is encoded within the source using a 24 entry + sliding dictionary where lowercase letters are offsets into the + dictionary, uppercase letters are new letters not yet in the + dictionary, and all other characters are ignored. The words are + spread over six lines in the source; decoding starts on a line + after a tab and a whitespace have been found, and stops on a newline. + The grin after the "Demonic Smiley" actually is one encoded letter + while the string is completely ignored; and the "cut" in "cut here" + is required while "here" is not. + + "For extra credit", explain why the words are sorted alphabetically + (because I extracted them from a dictionary :-) + + The file name had to fulfill the restrictions mentioned above + because __FILE__+1 was used as a second parameter to fopen(). (It + essentially was fopen(__FILE__,__FILE__+1) ). This was an extra joke + that does no longer exist in the released version. + + You probably discovered that the while(FILE) in main is not a while loop + but the statement that opens the file and initializes the dictionary. + Similarly, int and signed have been redefined (to save space, of + course). + + The main function (the guessing part) is between the last #else..#endif, + but still is declared before main(). The 5[O]() in main() calls + this function. Similarly, Most indexing operations have been + changed to this form; and I tried to write each such operation + different. diff --git a/1998/dlowe.c b/1998/dlowe.c new file mode 100644 index 000000000..5466711fb --- /dev/null +++ b/1998/dlowe.c @@ -0,0 +1,18 @@ +#include +#define PO(o,t)\ +(((o>64)&&(o<91))?(((t>96)&&(t<123))?(t-32):(t)):(((t>64)&&(t<91))?(t+32):(t))) + + void main() { char *poo= "poot", + *Poo="pootpoot" ,O[9];int o,t,T,p;(t=p =0)||(*O='\0');while + ((o= getc( stdin ))!=( EOF))if ((p== 0)&& (((o>64 )&& ( + o<91 )) || ((o> 96 ) &&(o< 123) ))) ( + t!=8 )&&(O [t]= o)&& (O[++ t] = '\0') + ;else {if (t>7) {for (T = 0 ; T <=7; T++ ) + printf("%c", PO(*( O+T), *(Poo+ T))); printf + ("%c", o);}else if (t>3){for (T =0;T<= + 3;T++) printf + ("%c", PO(*(O + +T),*( poo+T) + +) ) ; printf( "%c" , o ) ; } else printf ( "%s%c" , O , o ) ; ( t = 0 ) || ( +* O = '\0' ) ; ( o == 60 ) && ( ++p ) ; ( o == 62 ) && (p!=0) && ( --p ) ; } } diff --git a/1998/dlowe.hint b/1998/dlowe.hint new file mode 100644 index 000000000..0a8d4641e --- /dev/null +++ b/1998/dlowe.hint @@ -0,0 +1,83 @@ +Best Utility: + + David Lowe + Pootpoot + 67-D Manchester Street + San Francisco, CA 94110 + USA + + http://pootpoot.com/ + + +Judges' Comments: + + To build: + + make dlowe + + To use: + + ./dlowe < anyfile > pootfile + + Why is this entry would be considered a utility? Well because it + is able to convert content-free web pages into useful web pages. + + To see why, try using an online version, modified for use as + a CGI program: + + http://pootpoot.com/poot/pootify?URL=http%3A%2F%2Fwww.microsoft.com + + We are sure that you will find that new web page to make a much + more consistent level of quality. :-) + + A CGI script such as: + + #!/bin/sh + # pootify - a sample CGI pootifier + # + POOT="/usr/local/bin/dlowe" + LYNX="/usr/local/bin/lynx" + ECHO="/usr/bin/echo" + EXPR="/usr/bin/expr" + ${ECHO} "Content-type: text/html" + ${ECHO} + if [ -z "${QUERY_STRING}" ]; then + ${ECHO} "QUERY_STRING not found" + else + URL=`${EXPR} "$QUERY_STRING" : '[Uu][Rr][Ll]=\(.*\)'` + if [ -z "${URL}" ]; then + ${ECHO} "No URL given in QUERY_STRING" + elif [ X`${EXPR} "${URL}" : '[Ff][Ii][Ll][Ee]:'` != X0 ]; then + ${ECHO} "file: based URLs are not allowed" + else + ${LYNX} -restrictions=all -source "${URL}" | ${POOT} + fi + fi + + can be used to pootify web pages. + + For further information see: + + http://pootpoot.com/poot/pootify?URL=http%3A%2F%2Fwww.ioccc.org + + NOTE: The original entry was just a text based pootifier. To build + that version try: + + make dlowe.orig + ./dlowe.orig < anyfile > pootfile + + +Selected Author's Comments: + + This program is a text filter, it reads stdin and outputs the + "corrected" text to stdout. + + It is obfuscated in that the code is painful to look at and + its purpose and mode of operation are not terribly obvious. + More importantly, it is a tool for further obfuscation, in that it + can take any text and render it unintelligible. + + Suggested uses: add to your MANROFFSEQ environment variable for man page + enjoyment; use it to turn the GPL into the PPL; see what happens when you + run perl4 programs after they've been run through it; "encrypt" sensitive + (but unnecessary) documents... diff --git a/1998/dlowe.orig.c b/1998/dlowe.orig.c new file mode 100644 index 000000000..efe783ab2 --- /dev/null +++ b/1998/dlowe.orig.c @@ -0,0 +1,18 @@ +#include +#define PO(o,t)\ +(((o>64)&&(o<91))?(((t>96)&&(t<123))?(t-32):(t)):(((t>64)&&(t<91))?(t+32):(t))) + + void main() { char *poo="poot", + *Poo="pootpoot" ,O[9],o;int t, T;(t=0)|| (*O='\0');while( + (o= getc( stdin ))!=( EOF))if (((o> 64)&& + (o< 91)) ||(( o>96 )&&(o <123 ))) ( + t!=8 )&&(O [t]= o)&& (O[++ t] = '\0') + ;else {if (t>7) {for (T = 0 ; T <=7; T++ ) + printf("%c", PO(*( O+T), *(Poo+ T))); printf + ("%c", o);}else if (t>3){for (T =0;T<= + 3;T++) printf + ("%c", PO(*(O + +T),*( poo+T) + +) ); printf( "%c", o ) ; } else printf("%s%c", O, o); ( t =0) || (*O='\0'); } } + diff --git a/1998/dloweneil.c b/1998/dloweneil.c new file mode 100644 index 000000000..ff232ee06 --- /dev/null +++ b/1998/dloweneil.c @@ -0,0 +1,67 @@ +#include +#include +#include +#define E x/Y +#define F x%Y +#define P( o , O , t ) move ( o + 3 , O + 3 ) ; addch ( t ); +#define I(n) ( 2 * ( n / ( X + Y ) ) - 1 + ( ( n % ( X + Y ) - X ) < 0 ? 1 :2)) +#define D(T) switch(I(p)){ case 3:P(2*(X+Y)-1-p,-2,T); break; case 2:P(Y+1,2*X\ ++ Y-p -1, T); break; case 1:P(p-X, 1 +X, T); break; case 0: P( -2, p, T); } +#define R for(x=0; x84)?42:L[E][F]); } move(5+Y,2) \ +; clrtoeol(); printw("score: %d", s); move(0, 0); clrtoeol() ; refresh() ; + + int main(int t, char *u[]) { char c, *C="POOT", L[99 + ][ 99 + ]; int X, Y, n, x, a, b, A, B, p, s, S ; X = Y= p= + s= 0; if (t + == 3) { X= + atoi ( u[ 1]) + ; Y = atoi(u[2]); } if + (X <6 + || X > 98|| Y > 98 || + + Y < 6 ) { X = 15 ; Y = 12; } + initscr (); for + (x =0; x < X * Y; x++ ){ + L[ E][F ]=32 ; P + (- 1, E, 45 + ); P( Y, E, + 45 ); P (F,- 1, + 124 ); P(F, X, 124); } P( + -1, -1, 43); P( + -1, X, 43) ; P(Y, -1, 43 ) ; + + P(Y,X,43); c=C[random()%4]; + D(c); R ; for(; + ; ) { switch (x = getch () + ){ case 97 : D( + 32 ); if (-- + p< 0) p= (X + +Y )*2-1; break; case + 115 : D(32); if (++p > (X + +Y)* 2- 1) p =0 + ; break ; case 100: a = ( ( + n=I(p))%2) + ?X +( + n/2)*( 1- + X) -1 + :( 1- +n)*p+(n/2)*(2*X+Y-1); b = (n%2)?((n/2)?(2* (X ++Y )- +p-1): (p-X)) :Y+ ((2-n) /2) *(1-Y)-1; if(L [a + ][ b] + != 32 + )break ; A + =( n% + 2)?n-2:(n- + +1)*((c%3-1)*-1); B=(n%2)?(n-2)*((c%3-1)*(-1)):(n-1)*-1; D(32); for(; ; ){ P(b, +a,32); if((!a)&&A<0)if(!B){ A=0; B=1; } else A*=-1; if((!b)&&B<0)B*=-1; if(( a +==(X-1))&&A>0)if(!B){ A=0; B=1; } else A*=-1; if(((b==(Y-1))&&B>0)||(L[a+A][b+ +B]!=32))break; a+=A; b+=B; P(b,a,c); move(0,0); refresh(); usleep(5000); } ++s +; L[a][b]=c; c=C[random()%4]; p=0; f:for(S=1,x=0; x= +0&&b>=0))||((L[a][b]!=C[n])&&((L[a][b]-9)!=C[n])))break; if(n==3)for(n=0; n<4; +n++,S*=2)L[E+n*A][F+n*B]+=9; } if(S>1){ R; sleep(1); s+=S; for(x=0; x=0; a--){ if(L[x][a]>84)n=1; if(n)L[x][a]=a>0?L[x][a-1]:32 +; } while ( n ) ; R ; goto f ; } } D ( c ) ; R ; } } diff --git a/1998/dloweneil.hint b/1998/dloweneil.hint new file mode 100644 index 000000000..6edb4ea91 --- /dev/null +++ b/1998/dloweneil.hint @@ -0,0 +1,107 @@ +Most Fun: + + David Lowe Neil Mix + Pootpoot Pootpoot + 67-D Manchester Street 1490 Sacramento Street #4G + San Francisco, CA 94110 San Francisco, CA 94110 + USA USA + + http://pootpoot.com/ + + +Judge's Comments: + + To build: + + make dloweneil + + To use: + + ./dloweneil + + Read the the Author's comments below. We believe that your experience + may mirror one of our experiences: + + Originally, I didn't appreciate the game. Then I actually read the + description of the controls. I started playing. I struggled. + I spelled my first "poot". I was hooked ... + + +Selected Author's comments: + + Usage: + pootris [X size of board] [Y size of board] + + Synopsis: + The object of this game is to spell "POOT" as much as possible. There + is no time pressure. You're given one letter at a time (sort of randomly + chosen from the set 'P', 'O', and 'T') and you get to move it freely + around the border of the playing board, and decide when and where to drop + it into the board. Sound easy? Of course, there's a catch... + + Controls: + . Only three controls: + 'a' moves the current letter one position counterclockwise around + the border of the playing field. + 's' moves the current letter one position clockwise around the border + of the playing field. + 'd' drops the current letter onto the board. + . To quit, send a fatal signal to the process. + + Rules of motion: + . The different letters move in different directions once dropped onto + the board: + 'P' moves diagonally, at a 45 degree angle and in a clockwise + direction around the board once dropped. + 'O' moves in a straight line perpendicular to the border from which + it is dropped. + 'T' moves diagonally, at a 45 degree angle and in a counterclockwise + direction around the board once dropped. + . The letters bounce off the top and sides of the board. They bounce + in a 'natural' way, with the exception that 'O's will fall straight + down if they hit a side wall. + . The letters stop when they hit another letter or the bottom of the + board. + + Rules of spelling: + . When you spell 'POOT' on the board, in any direction, the letters + comprising the word will disappear, and any letters which may have + accumulated above the disappeared letters will 'fall'. + . Letters can be used in multiple spellings of 'POOT'. + . Chain reactions are possible. + + Rules of scoring: + . You get one (1) point for each letter you drop onto the board. + . You get a bunch of points for spelling 'POOT'. More if you spell + it in more than one way simultaneously. + + Some of the obfuscations: + . Several different coordinate systems are used. There's the "real" X + by Y system used for curses, the "inside the box" X by Y system used + for moving things around and finding instances of "POOT" inside the + box, and the position of the current letter, which is a single value + from 0 to 2 * xsize + 2 * ysize - 1. + . The fact that x%3 is a perfect hash function for x values 'P', 'O' + and 'T' is used. + . Of course, the code is as hideous as possible, and spells poot for + fun (It's also exactly 3217 bytes in length, with exactly 1536 + counted characters for purposes of this contest.) + . Love that modulus operator! Mmmm... + . There are some equations used which are really unnecessarily ugly, + which served the dual purposes of compacting the code and making it + trickier to understand. I'm thinking of the equations used to convert + between coordinate systems when dropping pieces into the game board. + . Simple and silly ones: short, meaningless (and sometimes misleading + (see 'x')) variable names; hard-coded ASCII numeric values used for + character constants; using goto for fun and profit; reusing and + re-purposing variables in different places. + . The game itself is simple, but still weird and quite difficult. + + Some things I wish I could have fit into this, but didn't have the space: + . Seeding the random number generator (doh!) + . Something to detect when the game is over. + . Some kind of scoreboard. + . Sound. + . Some way of quitting gracefully. + + Good Luck! diff --git a/1998/dorssel.c b/1998/dorssel.c new file mode 100644 index 000000000..edd8bc12a --- /dev/null +++ b/1998/dorssel.c @@ -0,0 +1,18 @@ +#include +#include + +main() +{ + char*O,l[999]="'`acgo\177~|xp .-\0R^8)NJ6%K4O+A2M(*0ID57$3G1FBL"; + while(O=fgets(l+45,954,stdin)){ + *l=O[strlen(O)[O-1]=0,strspn(O,l+11)]; + while(*O)switch((*l&&isalnum(*O))-!*l){ + case-1:{char*I=(O+=strspn(O,l+12)+1)-2,O=34; + while(*I&3&&(O=(O-16<<1)+*I---'-')<80); + putchar(O&93?*I&8||!(I=memchr(l,O,44))?'?':I-l+47:32); + break; + case 1: ;}*l=(*O&31)[l-15+(*O>61)*32]; + while(putchar(45+*l%2),(*l=*l+32>>1)>35); + case 0: putchar((++O,32));} + putchar(10);} +} diff --git a/1998/dorssel.hint b/1998/dorssel.hint new file mode 100644 index 000000000..0078baa60 --- /dev/null +++ b/1998/dorssel.hint @@ -0,0 +1,95 @@ +Obsolescent Feature: + + Frans van Dorsselaer + Bakker Industrial Automation + Kaiserstraat 35 + NL-2311 GP Leiden + The Netherlands + + +Judges' comments: + + To build: + + make dorssel + + To use: + + echo Simple as 123 | ./dorssel + echo '.... --- .-- -.. --- . ... .. - -.. --- - .... .- -'|./dorssel + + How does the program decide which way to convert? + + What obsolescent feature are we talking about? (No, it's not a + C language feature.) + + The author suggests that you try to answer the following questions: + + - Which character in the initializing string is totally irrelevant? + - Which two relevant characters in the initializing string may be + exchanged without altering the behavior? + - Which characters in the initializing string are somewhat irrelevant, + and to what values may they be changed without altering the behavior? + - Which characters may be used to enlarge the initializing string by + one without altering the behavior ? + + Extra credit: Change the program so that it does not SHOUT IN ALL CAPS. + + You might also want to read the dorssel.hint2 file. + + +Selected author's notes: + + Usage + ===== + + This program converts ASCII to Morse code, and vice versa. + + The program reads in lines from standard input and writes its result to + standard output. The direction of conversion is determined on a per + line basis. Each line must consist of a maximum of 952 characters + followed by a new line character, they must not contain any NUL + characters. Otherwise, some characters may be lost in the conversion. + + - Encoding to Morse code: + The program knows the Morse codes for all Latin letters (a-z, case + insensitive) and decimal digits (0-9). Any other characters are + replaced by an ASCII space ' '. Morse code per converted character is + written as a sequence of '.' and '-' characters, each sequence + followed by a space. + + - Decoding from Morse code: + Morse code should be typed as sequences of '.' and '-' characters, + separated by a space. Extra spaces will be echoed back (to separate + words). Unknown sequences will be converted to a '?' character. + + Notes + ===== + + The program assumes both source and execution character sets to be + ASCII. As far as I can tell, the program is conforming and does not + invoke undefined behavior. + + Hints + ===== + + - Try + + ./dorssel < dorssel.c | ./dorssel + + to see what variables, numbers, and functions are used. (Does a + better job than most C beautifiers). + + - Filter your text twice (as in the previous sample) to obtain a version + of your text that can be reversibly morsified, i.e. + + ./dorssel | ./dorssel | ./dorssel | ./dorssel + + is the same as + + ./dorssel | ./dorssel + + - The file "dorssel.hint2" contains all the information needed to + understand this program. For an obfuscated spoiler, try + + ./dorssel < dorssel.hint2 diff --git a/1998/dorssel.hint2 b/1998/dorssel.hint2 new file mode 100644 index 000000000..0a92fa954 --- /dev/null +++ b/1998/dorssel.hint2 @@ -0,0 +1,184 @@ +Morse codes for letters and digits use sequences of 1 to 5 (inclusive) +Morse symbols (denoted as '.' or '-'), e.g. + +E . +Z --.. +3 ...-- + +(BTW: digits always have 5 symbols, letters 1 to 4. I didn't use this fact) + +Of course we can encode these symbols with bits in a byte. I chose '-' +to be a bit set to 0, '.' to be a bit set to 1. Characters in C are at +least 8 bits, but they are either signed or unsigned. To be portable, +I've used only values from 0 to 127 (inclusive) (both in the encoding +of Morse codes, as well as in subexpressions in the program). Hence we +can use type char (using unsigned char for an extra bit would have made +the source code excessively large ;-) + +The least significant bit contains the first symbol of a Morse code, so +we have + +E > 0......1 +Z > 0...1100 +3 > 0..00111 + +The dots have still to be determined. But we also need to encode the +length of the sequence. Since there are only 4 different kind of lengths, +two bits would suffice, e.g. + +E > 000....1 +Z > 010.1100 +3 > 01100111 + +That means bits 6 and 5 set to 00 is length 1, set to 01 is length 2, etc. +But this would mean that we would have to extract the length into a +counter before shifting out each symbol, such as + +length = (encoding & 96) >> 5; +do { + putchar(encoding & 1 ? '-' : '.'); + encoding >>= 1; +} while (length--); + +We can also use the remaining bits to *include* the counter + +length 1: 00000.1x E > 00000.11 +length 2: 0000.1xx +length 3: 000.1xxx +length 4: 00.1xxxx Z > 00.11100 +length 5: 0.1xxxxx 3 > 0.100111 + +With 1 bit still to be chosen freely (let's assume it is 0). Now we can do + +do { + putchar(encoding & 1 ? '-' : '.'); + encoding >>= 1; +while (encoding > 1); + +As you see, the encoded Morse sequence can be the counter itself. But +this is not very pleasant, as some Morse sequences will end up having +an ASCII value < 32, i.e. they will be control codes. This would make +the initializing (encoding) string awkward. Hence I came up with the +following + +length 1: 0010010x E > 00100101 (= '%') +length 2: 001010xx +length 3: 00110xxx +length 4: 0100xxxx Z > 01001100 (= 'L') +length 5: 011xxxxx 3 > 01100111 (= 'g') + +Notice these encodings in the initialization string. Only the coding for +'5' needs an escape (5 = ..... > 01111111 = '\177'). The way the length +is encoded still allows the encoding to be its own counter: + +do { + putchar(encoding & 1 ? '-' : '.'); + encoding = (encoding + 32) >> 1; +} while (encoding > 35); + +The last shift will always result in 00100010, hence the test for >35. +Note that the calculation for the next value of `encoding' is done at int +precision, so that the actual value of the char remains <= 127. + +The character '-' (ASCII 45) and '.' (ASCII 46) are conveniently in +sequence, so the putchar can simply be + +putchar(45 + encoding % 2); + +I used the modulo operator this time, because '+' takes precedence over '&'. +The assignment can be incorporated into the while control test, and a +do-while loop with a body of a single expression statement can be written +as a while loop with a comma operator in the test: + +while(putchar(45 + encoding % 2), encoding = encoding + 32 >> 1); + +Voila. + +Now, the decoding of Morse codes is just the reverse. We shift in 0's +and 1's as we scan the line. But: we have to scan from back to front +(the left most Morse symbol is in the least significant bit, and thus +has to shifted in last). The test for the scanning while loop must +stop when there are no more '.' or '-' on the left. Hence we need a +terminating character in front of the line. The input line is read one +past the encoding string (into the same character array) the terminating +character for the reverse scan is therefore provided by the implicit '\0' +of the array initializer ! The test also stops when at most 5 symbols +have been shifted in. + +The encoded character is then looked up in the encoding string with +memchr (why memchr is explained later). Either a '?' (when there are +more than 5 consecutive Morse symbols, or if the sequence is unknown) +or the decoded character is printed. Or a ' ' if there was an extra +space in the source line. Note the use of "or" in these last sentences, +as they explain the use of the conditional operator. + +The strspn calls need either " .-" or ".-" as argument. Of course they +are overlapped. I put these strings between the encodings for digits +and letters. This is OK, since neither of these characters, or the '\0', +is a valid encoding ! We must, however, use memchr instead of strchr in +the decoding lookup because of this '\0'. Since it is far more obscure +this way, I hope you'll forgive me. + +The outline of the program is roughly as follows + +while (more lines) { + if (line is in morse) { + while (more characters) { + skip next sequence + if (' ') + putchar(' '); + else + decode_sequence; /* backwards */ + } + } else { + while (more characters) { + if (isalnum) + encode_character; + putchar(' '); + } + } + +Because of the *two* while(more characters) loops are the same, I've +exchanged the if(line is in morse) and the two while loops (so there +is *single* while loop). However, we must now store the if(line is in +morse) test for efficiency (it would be stupid to test the entire line +for every character). This is done in l[0] ! (the first encoding is +thus in l[1]). The memchr decoding lookup is not disturbed, because the +test is always 0 for Morse lines, and '\0' is not a possible encoding. +l[0] is also used as the temporary shift character while encoding a +line of text. This does not disturb the if (line is in morse) test, +as the temporary l[0] will remain != 0. + +I've put the if's in the above layout into a single switch. Hope you don't +mind ;-) + +Summary of the use of l[999]: + +l[0] result of "is this line in morse" test +l[0] temporary shift during encoding +l[0] - l[33] Morse codings (letters and digits, plus garbage) +l[11] - l[14] strspn argument +l[12] - l[14] strspn argument +l[34] terminator for backward decoding +l[35] - l[998] input line + +***** + +Selected notes: +- We don't need to declare isalnum() (or include ctype.h) as its implicit + declaration is correct (int argument, int result). This is not so for + strlen(), strspn(), and memchr() as they use size_t. +- During development, my gcc 2.7.2.3 had an internal compiler error (signal + 6) on code that was correct ! +- lclint 2.4b thinks that "the observer is modified" a couple of times, + whereas it is not. Well, it is, but there is a sequence point in between. +- lclint 2.4b parses line 13 as , whereas it is correct code. +- lclint 2.4b is positive the second while loop is infinite, whereas it is + not. + +***** + +.. - .... .. -. -.- - .... .. ... ... .--. --- .. .-.. . .-. .. ... -- --- .-. . --- -... ..-. ..- ... -.-. .- - . -.. - .... .- -. - .... . .--. .-. --- --. .-. .- -- + +. -..- . .-. -.-. .. ... . +-.-. .... .- -. --. . - .... . .--. .-. --- --. .-. .- -- ... --- .. - -.. --- . ... -. --- - ... .... --- ..- - diff --git a/1998/fanf.c b/1998/fanf.c new file mode 100644 index 000000000..6fcd499b2 --- /dev/null +++ b/1998/fanf.c @@ -0,0 +1,120 @@ +#include +#include +#define l #define +#define p(p) l p b ( m p u X ) + +l i int +l n struct n +l x ){ return ( +l A -> +l N n* + +n { i c ; N L ; N R ; N U ; N ( * F ) ( N ) ; } ; + +l F A F +l U A U +l R A R +l L A L +l m q = malloc(sizeof * q ) Z F = +l e z F ( p ) ) ; } +l f e N +l g z L Q s f +l h ( N p x +l H h p L U Q +l s R z R = q +l t ) ? p : ( +l z , p +l Z , q +l Q = p +l w ! p U t p U L Q z Q U , +l D W p R U = 0 z R Q R F ( p R ) z R F != E t +l W h w +l X z = q , 0 +l V w p F = v z L Q +l O m o Z L Q +l M m E Z A c = +l r Z R Q +l u Z U Q +l a ) ) ) ? 0 : j ( ! +l k ( i c x +l y 0 ) ; } i + +N q ; N +o H z Q L f +v H U z Q L f +K W V L R f +J W V R f +I h V R f +#if 0 +Y W q Q g +#endif +S W w w O L L R r s , O L R r R R g +E D p F Q L A c - p R A c ? J : K f +P D w putchar ( p L R A c ) , m I g +G W M getchar ( ) g +p ; + +i j k c ? O U r u U U X : y b k y d k y + +l d(d) ( ( d a b +l b(b) ( ( b a d +l E(E) b ( M E u X ) + +main k i ) ! ( + +p (I) +p (J) +p (K) +#if 0 +p (Y) +#endif +p (P) +p (G) + +p (S) +l B b (S (K S) K) +l SS b (B (B S) B) +l C b (SS B S (K K)) +l CC b (B (B C) B) +l BB b (CC B (B B B) B) + +l Y b (S (C B (S I I)) (C B (S I I))) + +l CI b (C I) + +l ef E(EOF) +l sp E(' ') +l ob E('(') +l cb E(')') +l lm E('\\') +l nl E('\n') +l ht E('\t') +l qs E('S') +l qk E('K') +l qi E('I') + +l pair b (BB (B (B K)) C CI) +l atom b (B K CI) + +l bind b (CC B B C) + +l ore b (SS (CI K)) +l gns b (Y (B (bind G) (CC S (C (ore sp (ore nl ht))) CI))) + +l pr b (Y (CC C (BB CI (B (BB (bind (P ob)) K)) (SS C (CC C (BB BB bind) K) (C (CC bind) (K (P cb))))) P)) + +l trans b (Y (B (bind gns) (S (BB S (C lm) lam) (C (BB S (C ob) brac) (S (C cb (CI (atom sp))) (S (C ef (CI (atom sp))) (B CI atom))))))) + +l brac b (S bind (B Y (C (BB B B bind) (S (BB S (BB S (S I)) (CC (BB (B K)) (BB K) pair)) (CC S (CC BB (BB C (C (CI sp)) CI)) pair))))) + +l lam b (B (bind gns) (C (CC BB bind (B CI)) abs)) + +l abs b (Y (C (BB S (BB C CI) (SS S (BB C (BB B opt)) I)) (CC S (C C (atom qi)) (B (pair (atom qk)) atom)))) + +l make b (B pair (pair (atom qs))) + +l opt b (S (S I (S (BB (CC B) CI (BB K K make)) (S (BB C (BB C (C (CI qk))) (SS (SS S) (S (BB (BB (S I)) S (BB (BB (CC B) CI) (BB K K) make)) (B (CC B (BB (CC C) (BB (C (CI qk)) (pair (atom qk))) pair)) make)) (B (C (BB B C (C (CI qi)))) make))) make))) (B K make)) + +(bind (bind trans pr) (P nl) I) + +e diff --git a/1998/fanf.hint b/1998/fanf.hint new file mode 100644 index 000000000..f6123d98c --- /dev/null +++ b/1998/fanf.hint @@ -0,0 +1,388 @@ +Most Obfuscated Translator: + + Tony Finch + Demon Internet + 322 Regent's Park Road + Finchley + London N3 2QQ + United Kingdom + + http://www.inch.demon.co.uk/ + + +Judges' comments: + + To build: + make fanf + + Some systems may have problems building this entry because + of the system resources can require. + + To use: + Enter an expression on standard input. Here are some + sample expressions that you can use: + + ((\a(\b(\c(d)))) e) + + + (\f\g\x + ( + (g x) (f x) + ) K K z + ) + + + (\f(\f\g\x( (f((\a(g(b))) e)) (g x) ) K K z)) + + + (Y\f\n + ((= n 0) + 1 + (* n (f (- n 1))) + ) + ) + + This program translares lambda expressions into combinator + expressions. But you do not need to know Lambda Calculus to be + impressed by this program! + + See the file: + + fanf.lambda + + for more examples of lambda calculus source. + + Notice how large the code grows from the fanf.c into the final + fanftmp2.c C program. Take a look at that final C program again, + can you begin to understand what it is doing? + + Look at the first stage of the C pre-processing: + + gcc -ansi fanf.c -E > fanftmp1.c + + Skip to the bottom of fanftmp1.c (after all of the #include header + stuff ... look for a line of the form: # 2 "fanf.c" near the bottom) + and look at the resulting code. This code, when C pre-processed + will expand into over 342 times the original code (ignoring #include + headers) to produce fanftmp2.c. That program in turn, when compiled + translates a single lambda expression on standard input into + combinator expressions on standard output. + + Extra credit question: + + What do you have to do to make this program work with an + old non-ANSI C preprocessor? + + +Selected Author's comments: + + My program is a demonstration of some practical applications of + theoretical computer science. The application it implements is a program + for translating lambda expressions into combinator expressions. + + + What the program does + ===================== + + The syntax of lambda expressions recognised by the program is as + follows: The basic atoms are variables which are single characters other + than backslash or parentheses, e.g. `a' or `b' or `@'. Variables are + combined by function application which is written e.g. `(f a)' which is + the function `f' applied to the argument `a'. Application groups to the + left, so `(f a b c)' is equivalent to `(((f a) b) c)'. Functions are + created from lambda terms which are written in the form `\a(expr)' which + is the function taking argument `a' and having value `expr'. Lambda is + spelt `\' because ASCII isn't good enough. Lambda binds tightly, so + `\a\bcd' is equivalent to `((\a(\b(c))) d)'. Whitespace is ignored. + + For example, the identity function, called `I', is written `\x(x)'. A + simple expression is `(I a)' which is equivalent to `(\x(x) a)', which + has the value `a'. Another function called `K' is defined as `\x\y(x)' + and it evaluates as follows: + + K p q + -> \x\y(x) p q + -> \y(p) q + -> p + + Another function of interest is `S', defined as `\f\g\x((f x) (g x))'. + My program demonstrates the fact that any lambda expression can be + translated into an equivalent "combinator expression" which involves + only `S', `K', `I' (the combinators), and application, with no + variables or lambda abstractions. In fact, even `I' is unnecessary, + since it is equivalent to `S K K': + + I z + -> \a(a) z + -> z + + S K K z + -> \f\g\x((f x) (g x)) K K z + -> (K z) (K z) + -> \x\y(x) z (K z) + -> z + + The algorithm for translating lambda expressions into combinator + expressions works as follows. There are three forms of lambda expression + to consider: variables, applications, and abstractions. + + trans `v' -> `v' (variable) + trans `a b' -> (trans `a') (trans `b') (application) + trans `\ab' -> abs a (trans `b') (abstraction) + + There are a further three cases to consider for the body of lambda + expressions, where we need to do the magic that transforms away the + variables. + + abs a `f x' -> `S' (abs a `f') (abs a `x') + abs a `b' -> `K b' (b != a) + abs a `a' -> `I' + + E.g. suppose we had combinator expressions for `+' and `3' and we wanted + to see what the combinator expression for doubling 3 looked like: + + trans `\x(+ x x) 3' + -> (trans `\x(+ x x)') (trans `3') + -> (abs x (trans `+ x x')) `3' + -> (abs x `+ x x') `3' + -> `S' (abs x `+ x') (abs x `x') `3' + -> `S' (`S' (abs x `+') (abs x `x')) `I' `3' + -> `S' (`S' (`K +') `I') `I' `3' + -> `S (S (K +) I) I 3' + + We can then check that this evaluates to the expected result: + + S (S (K +) I) I 3 + -> S (K +) I 3 (I 3) + -> K + 3 (I 3) (I 3) + -> + (I 3) (I 3) + -> + 3 3 + + It is possible to perform a slightly more compact translation with a + couple of simple optimisations. For example, note that `K (a b)' is the + same as `S (K a) (K b)', because + + K (a b) x + -> a b + + and + + S (K a) (K b) x + -> K a x (K b x) + -> a b + + Also, `S (K a) I' is the same as just `a' because + + S (K a) I x + -> K a x (I x) + -> a x + + The program simply reads a lambda expression from the standard input, + translates it into a combinator expression using the transformation and + optimisations described above, and prints out the result. + + + Why this is a practical application + =================================== + + Combinator expressions are easier to evaluate than lambda expressions + because there are no problems with variables. For example, if I naively + evaluated the expression `\x\y(x y) y' I might get `\y(y y)' which is + not the same as the correct result because the first `y' in the body + should refer to a global `y' rather than the local one. David Turner was + the first person to realise that because of this fact, SK combinators + provide a simple way to implement non-strict functional programming + languages, either in software or directly in hardware. + + My program demonstrates this by being based on a combinator evaluation + engine which is used to implement a language called "OFL" (pronounced + like "offal" and short for "Obfuscated Functional Language"). I then + used OFL to implement all the high-level functionality described above. + This contributes a lot to the obfuscation because even small amounts of + OFL are quite unpalatable, and large expressions are completely + incomprehensible. + + It is fairly well known that the lambda calculus (and hence SK + combinators) can compute anything, but mere computation is no use if you + cannot communicate with the world. This is why OFL includes a few + concessions to reality: a combinator `E' for representing characters and + testing them for equality, two IO combinators, `G' and `P', for reading + and writing characters respectively, and a combinator `J' for + representing "false". I also implemented the `Y' combinator directly + rather than in terms of the primitive combinators, since it only + required five characters to do so (viz. `Y W q Q g'). However this code + is not enabled because the definition of Y in terms of other combinators + is more cute. + + The `E' combinator comes in a large number of forms, one for each + character and one for end of file. It is written `E(c)' for the variant + of `E' corresponding to the character `c'. An expression of the form + `E(c) x' is evaluated by first evaluating `x'. If `x' doesn't evaluate + to some form of `E', then evaluation of the expression terminates. If + `x' evaluates to `E(c)', then the expression evaluates to `K'. If `x' + evaluates to `E(d)' (where `d' is a different character to `c'), then + the expression evaluates to `J'. + + `K' and `J' are used to represent "true" and "false" respectively; they + correspond exactly to the standard lambda calculus representations of + true and false, viz. `\t\f(t)' and `\t\f(f)' respectively. In this way a + conditional expression can just be written `cond then else', which is + even more terse than C's `cond ? then : else'. An expression that + compares a character with `a', say, can be written in the rather + obfuscated form `E('a') char then else'. + + The `P' combinator, like the `E' combinator, starts off by evaluating + its first argument and checking that it is some form of `E'. It then + writes that character on stdout, and finally it calls its second + argument as a function with the argument `I', i.e. + P x f -> f I + with a side-effect. + + The `G' combinator just reads a character from stdin then calls its + argument as a function with the appropriate `E' combinator as an + argument, i.e. + G f -> f E(c) + with a side-effect. + + One of the problems with non-strict languages is that it is hard to + predict in advance in which order side-effects will occur. In my program + I used a monadic IO structure like that used by the programming language + Haskell; this allows one to write programs that manipulate external + state in a manner remarkably similar to imperative programming languages + like C. An examination of my program should provide an illustration of + how well this technique works in practice. (In particular, I used the + CPS form of the IO monad from page 6 of "Imperative Functional + Programming".) + + The `Y' combinator is used for implementing recursive functions. It has + the evaluation rule + Y f -> f (Y f) + so that it can be used to call a function with itself as an argument. + For example, if I had the appropriate arithmetic operators defined, I + could write a factorial function in the lambda calculus like this: + Y \f\n((= n 0) 1 (* n (f (- n 1)))) + + OFL provides a facility for naming expressions so that they can be used + more than once without writing them in full. A definition must be written + on one line in the form `l name b expression' where `l' is short for + "let" and `b' is short for "be". Names must be more than one character + long. A complete OFL program starts off by defining the primitives it + will use with likes of the form `p (S)' etc., then goes on to define the + names it will use, and finishes off with the main expression followed by + a single `e' short for "end". OFL expressions must use the minimum + number of brackets needed to be unambiguous, except that the whole + expression must be surrounded by brackets. + + OFL has a standard library which adds another five combinators to the + basic eight. These combinators provide greater scope for optimisation + when translating an expression from the lambda calculus to combinators, + and therefore more compact programs. Their evaluation rules are: + + B f g x -> f (g x) + C f g x -> (f x) g + BB c f g x -> c (f (g x)) + CC c f g x -> c (f x) g + SS c f g x -> c (f x) (g x) + + I used them to help fit my program into the required space; unfortunately + I couldn't fit the version that fully optimises the lambda expressions + it reads into the required space. The complete optimisation rules + including the ones it doesn't use are: + + S (K p) I -> p + S (K p) (K r) -> K ( p r ) + S (K p) (B r s) -> BB p r s + S (K p) r -> B p r + S (B p q) (K r) -> CC p q r + S p (K r) -> C p r + S (B p q) r -> SS p q r + S p r -> S p r + + + The implementation of OFL + ========================= + + Although OFL has completely different syntax and semantics to C, all you + need to compile OFL programs is a C compiler and a header file (which in + my entry to the competition has been included in-line). The header file + implements a two-pass optimising compiler which produces a representation + of the program that is then interpreted. + + The first pass of the compiler is implemented via the C preprocessor. It + implements one optimisation, namely function in-lining. Unfortunately, + this optimisation always increases object code size and execution time. + The opposite optimisation, common sub-expression elimination, (which + would offer improvements in code size and execution time) has not been + implemented. The output of this pass is a C program that may be compiled + by a normal C compiler. + + The second pass is performed by the initialisation phase of the C + program. It builds a data structure representing the abstract syntax + tree of the program. + + The program is then executed by an interpreter. This operates by + performing manipulations on the AST that correspond to the evaluation + rules of the combinators that I described above. + + The first 54 lines of the program are mostly the interpreter; the next 8 + lines are pass one of the compiler; the next nine declare the OFL + primitives; the next five define the OFL standard library; and the rest + implement the application described in the first part of this document. + This part of the program is transformed into the second pass of the + compiler by the first pass of the compiler. + + The first pass of the compiler relies on some magic macros that expand + in a mutually-overlapping and almost recursive way in order to + perpetrate a complete change of syntax. Interestingly enough, if I + hadn't used the same identifier for more than one thing in various + places in the program this transformation would work with old-style cpp + as well and ANSI cpp. It expands the program from about 2.2KB to about + 740KB. The resulting code does some tricky stuff to build a data + structure of the same form as the code itself. + + The interpreter is written in fairly straightforward C, although it is + highly compressed. The C itself is written in a fairly functional style, + in that every function consists of a single expression. In the tradition + of functional programming languages it assumes that memory is infinite + and so never frees anything. It also assumes that the C compiler + implements the tail recursion optimisation, which is probably not true. + + + References + ========== + + I used these references in the course of writing this program and they + explain some of the ideas behind it in more detail. Arthur Norman (one + of the authors of the first paper) did a lot to enthuse me about this + topic. + + Clarke, T. J. W., et al., 1980. SKIM - the S, K, I Reduction Machine. + Proceedings of the 1980 ACM LISP Conference, pp. 128-135. + + Curry, H. B. and Feys, R., 1958. Combinatory Logic, Vol. 1. + North-Holland. + + Gordon, M. J. C., 1988. Programming Language Theory and its + Implementation. Prentice-Hall. + + Peterson, J, et al., 1997. Report on the Programming Language Haskell, + version 1.4. + + Peyton Jones, S. L., 1987. The implementation of Functional + Programming Languages, Chapters 2, 11, 12, 16. Prentice-Hall. + + Peyton Jones, S. L., and Wadler, P., 1992. Imperative Functional + Programming. Proceedings of the ACM Symposium on the Principles of + Programming Languages 1993, pp. 71-84. + + Turner, D. A., 1979. A new implementation technique for applicative + languages. Software- Practice and Experience. Vol. 9, pp. 31-49. + + Turner, D. A., 1979. Another algorithm for bracket abstraction. Journal + of Symbolic Logic. Vol. 44, no. 2, pp. 67-270. + + Wadler, P., 1990. Comprehending Monads. Proceedings of the ACM + conference on Lisp and Functional Programming, 1990. + + Wadler, P., 1995. How to Declare an Imperative. Proceedings of the ACM + International Logic Programming Symposium, 1995. diff --git a/1998/fanf.lambda b/1998/fanf.lambda new file mode 100644 index 000000000..74ddab607 --- /dev/null +++ b/1998/fanf.lambda @@ -0,0 +1,262 @@ +----------------------------------------------------------------------------- +-- +-- This file contains the original source code for my entry, which was +-- written in the lambda calculus using a slightly extended syntax +-- compared to that accepted by my entry (in particular, it has +-- multi-character identifiers and uses ` instead of \ because that's +-- easier to enter inside a Haskell string). It also contains the Haskell +-- code I used to translate the lambda calculus into combinators using +-- the fully optimising algorithm described in the .hint file. +-- +-- Tony Finch +-- + +----------------------------------------------------------------------------- +-- +-- Source code for my entry +-- + + +unit = `val`k(k val) + = CI +bind = `op`fop`k(op `res(fop res k)) + = (CC B B C) + + +revacc = Y `f(`acc`list(list `nil(acc) + `head`tail(f tail (pair head acc)))) +rev = revacc I + +fold = `atomf`pairf(Y `rec(`list(list atomf (pairf rec)))) + = (B (B Y) (BB B C CI)) + + +pair = `x`y`f`g( f x y ) +atom = `a`f`g( g a ) + + +ore = `a`b`c(a c K (b c)) = (SS (CI K)) +gns = Y `f(bind G `c(ore sp (ore nl ht) c f (C I c))) + +pr = Y `f`e(e `x`y(bind (P ob) `i(bind (f x) `i(bind (f y) `i(P cb)))) + `a(P a)) + +trans = Y `f(bind gns `c( lm c (lambda f) + ob c (brac f) + cb c (unit (atom sp)) + ef c (unit (atom sp)) + (unit (atom c)) )) + +brac = `f(bind f (Y `l`ea(bind f `eb(eb `x`y(l (pair ea eb)) + `a(a sp (unit ea) + (l (pair ea eb))))))) + +lam = `f(bind gns `v(bind f `e(unit (abstract v e)))) + +abs = Y `r`v`e(e `x`y(optimise (r v x) (r v y)) + `a(a v (atom i) + (pair (atom k) (atom a)) )) + +make = `x`y(pair (pair (atom s) x) y) + +unopt = `a`b(pair (pair (atom s) a) b) + +opt = `x(x `xx`xy(xx `xxx`xxy(make x) + `xxa(xxa k `y(y `yx`yy(yx `yxx`yxy(make x y) + `yxa(yxa k (pair (atom k) (pair xy yy)) + (make x y))) + `ya(ya i xy (make x y))) + (make x))) + `xa(make x)) + +(Y `f(bind (bind trans pr) `i(f i)) I) + + +----------------------------------------------------------------------------- +-- +-- Haskell lambda and combinator utilities +-- + +infixl 9 :@: + +data Expr = Expr :@: Expr | Lambda String Expr | Var String + | Y | I | J | K | S | C | B | SS | CC | BB + | P | G | E Int + deriving (Eq, Read, Show) + +data EType = EFun | EArg | ELam deriving Eq + + +isGraph c = c >= '!' && c <= '~' +isToken c = isAlphanum c || '_' == c + +disp e = display ELam e "" + +exec e = do e' <- execute (compile (fst (parse e))) + putStr (disp e') + +comp = disp . compile . fst . parse + +simp = disp . simplify . fst . parse + + + +-- turn String into Expr + +parse (a : as) | isSpace a = parse as + | a == '`' = let (var, bs) = span isToken (dropWhile isSpace as) + (expr, cs) = parse bs + in (Lambda var expr, cs) + | a == '(' = let (left, bs) = parse as + fun left (c : cs) | isSpace c = fun left cs + | c == ')' = (left, cs) + | otherwise = let (right, ds) = parse (c:cs) + in fun (left :@: right) ds + in fun left bs + | a == '\'' = case as of + c:cs -> (E (ord c), cs) + [] -> (E (-1), []) + | isDigit a = let (bs, cs) = span isDigit as + n = read (a:bs) + in (E n, cs) + | a == '-' = let (bs, cs) = span isDigit as + n = read (if bs == "" then "1" else bs) + in (E (-n), cs) + | isToken a = let (bs, cs) = span isToken as + in (case a:bs of + "Y" -> Y; "I" -> I; "J" -> J; "K" -> K; "S" -> S; "C" -> C; "B" -> B + "SS" -> SS; "CC" -> CC; "BB" -> BB; "P" -> P; "G" -> G; x -> Var x + , cs) + + +-- pretty printer + +display t (Lambda v e) = showChar '`' . showString v . display ELam e +display t (a :@: b) = showParen (t /= EFun) (display EFun a . showChar ' ' . display EArg b) +display t (Var v) = showParen (t == ELam) (showString v) +display t (E n) = let c = chr n in if isGraph c then showChar '\'' . showChar c else shows n +display t e = showParen (t == ELam) (shows e) + + + +-- translate into optimised combinators + +compile (a :@: b) = compile a :@: compile b +compile (Lambda var e) = abstract var (compile e) +compile e = e + +abstract v (a :@: b) = optimise (abstract v a) (abstract v b) +abstract v e | e == Var v = I + | otherwise = K :@: e + +optimise (K :@: p) I = p +optimise (K :@: p) (K :@: r) = K :@: ( p :@: r ) +optimise (K :@: p) (B :@: r :@: s) = BB :@: p :@: r :@: s +optimise (K :@: p) r = B :@: p :@: r +optimise (B :@: p :@: q) (K :@: r) = CC :@: p :@: q :@: r +optimise p (K :@: r) = C :@: p :@: r +optimise (B :@: p :@: q) r = SS :@: p :@: q :@: r +optimise p r = S :@: p :@: r + + + +-- do combinator reduction + +execute ( Y :@: f) = let g = f :@: g in execute g +execute ( I :@: f ) = execute f +execute ( J :@: f :@: g) = execute g +execute ( K :@: f :@: g ) = execute f +execute ( S :@: f :@: g :@: x) = execute ((f :@: x) :@: (g :@: x)) +execute ( C :@: f :@: g :@: x ) = execute ((f :@: x) :@: g) +execute ( B :@: f :@: g :@: x ) = execute (f :@: (g :@: x)) +execute (SS :@: c :@: f :@: g :@: x) = execute (c :@: (f :@: x) :@: (g :@: x)) +execute (CC :@: c :@: f :@: g :@: x ) = execute (c :@: (f :@: x) :@: g) +execute (BB :@: c :@: f :@: g :@: x ) = execute (c :@: (f :@: (g :@: x))) + +execute (G :@: f) = do c <- getChar + execute (f :@: E (ord c)) + +execute (P :@: f :@: g) = do f' <- execute f + case f' of + E n -> do putChar (chr n) + execute (I :@: g) + _ -> return (f' :@: g) + +execute (E n :@: f) = do f' <- execute f + case f' of + E m -> if n == m then return K else return J + _ -> return (E n :@: f') + +execute (f :@: g) = do f' <- execute f + if f' == f then return (f' :@: g) + else execute (f' :@: g) +execute e = return e + + + +-- translate into lambda calculus and do beta reduction + +simplify I = fst (parse " `f f ") +simplify J = fst (parse " `f`g g ") +simplify K = fst (parse " `f`g f ") +simplify S = fst (parse " `f`g`x ((f x) (g x)) ") +simplify C = fst (parse " `f`g`x ((f x) g) ") +simplify B = fst (parse " `f`g`x (f (g x)) ") +simplify CC = fst (parse " `c`f`g`x (c (f x) g) ") +simplify SS = fst (parse " `c`f`g`x (c (f x) (g x)) ") +simplify BB = fst (parse " `c`f`g`x (c (f (g x))) ") + +simplify (Lambda v b) = Lambda v (simplify b) + +simplify (Lambda v b :@: a) = simplify (substitute v a b) + +simplify (a :@: b) = let a' = simplify a + b' = simplify b + in if a' == a then (a' :@: b') + else simplify (a' :@: b') +simplify x = x + + + +-- replace instances of variable v in body b with argument a, avoiding variable capture + +substitute v a b = let wf b = newvar (merge (vars a) (vars b)) + subst (Var v') | v == v' = a + | otherwise = Var v' + subst (Lambda v' b) | v == v' = Lambda v' b + | otherwise = let w = wf b in Lambda w (subst (substitute v' (Var w) b)) + subst (b :@: c) = (subst b) :@: (subst c) + subst x = x + in subst b + + + +-- return a variable not in vs (which is sorted) + +newvar vs = let x `isin` [] = False + x `isin` (y:ys) | x < y = False + | x == y = True + | otherwise = x `isin` ys + try v = if v `isin` vs then try (next v) else v + next (v:vs) = if v < 'z' then (succ v):vs else 'a':(next vs) + next [] = "a" + in try "a" + + + +-- get (sorted, unrepetitive) list of variables in an Expr + +vars (Lambda v b) = merge [v] (vars b) +vars (a :@: b) = merge (vars a) (vars b) +vars (Var v) = [v] +vars _ = [] + + + +-- combine two sorted lists, omitting duplicates + +merge [] ys = ys +merge xs [] = xs +merge (x:xs) (y:ys) | x < y = x : merge (xs) (y:ys) + | x == y = x : merge (xs) (ys) + | otherwise = y : merge (x:xs) (ys) diff --git a/1998/guidelines b/1998/guidelines new file mode 100644 index 000000000..de8eaf766 --- /dev/null +++ b/1998/guidelines @@ -0,0 +1,802 @@ +14th International Obfuscated C Code Contest Guidelines, Hints and Comments | + +Copyright (c) Leonid A. Broukhis, Jeremy Horn, Landon Curt Noll and | +Peter Seebach, 1998. | + +All Rights Reserved. Permission for personal, education or non-profit use is | +granted provided this this copyright and notice are included in its entirety | +and remains unaltered. All other uses must receive prior permission in | +writing from the contest judges. | + + +ABOUT THIS FILE: + + This file is intended to help people who wish to submit entries to + the International Obfuscated C Code Contest (IOCCC for short). + + This is not the IOCCC rules, though it does contain comments about + them. The guidelines should be viewed as hints and suggestions. + Entries that violate the guidelines but remain within the rules are + allowed. Even so, you are safer if you remain within the guidelines. + + You should read the current IOCCC rules, prior to submitting entries. + The rules are typically sent out with these guidelines. + + Changes from the 1996 rules are denoted by change bars. ---> | + Not every change is marked in this file is marked, but + most are. :-) + + +WHAT IS NEW IN 1998: + + The EMail addresses (entry@ioccc.org and questions@ioccc.org) are | + different. Contest entries (in the proper form) go to entry@ioccc.org | + and questions to the judges go to questions@ioccc.org. | + + There is a new web URL: http://www.ioccc.org | + + We have a new IOCCC judging team. See http://www.ioccc.org/judges.html | + for more information. + + We added a more explicit comment against using gzip to get around the | + contest entry size limit. | + + We warn against assuming that string constants are writable. | + + There are some stuff about exit() returning void in the guidelines. | + + There are some stuff about #'s as the first char of a line in | + C-preprocessor directives. See below. | + + Titles can be 31 chars now ... but please try to keep then short. | + + To provide you with a little more time, we have extended the deadline | + to 31-Jan-99, which due to the leap second of 31-Dec-98 23:59:60 UTC | + gives you just a little more time to complete your entry. | + + Some may complain about the use of 2 digit years in our contest start | + and stop dates. These dates have nothing to do with the current Y2K | + hype. In fact this contest is currently certified 99.9% Y2K hype free! | + We use 2 digit years because they are more obfuscated. :-) | + + +HINTS AND SUGGESTIONS: + + You are encouraged to examine the winners of previous contests. See + FOR MORE INFORMATION for details on how to get previous winners. + + Keep in mind that rules change from year to year, so some winning entries + may not be valid entries this year. What was unique and novel one year + might be 'old' the next year. + + An entry is usually examined in a number of ways. We typically apply + a number of tests to an entry: + + * look at the original source + * convert ANSI tri-graphs to ASCII + * C pre-process the source ignoring '#include' lines + * C pre-process the source ignoring '#define' and '#include' lines + * run it through a C beautifier + * examine the algorithm + * lint it + * compile it + * execute it + + You should consider how your entry looks in each of the above tests. + You should ask yourself if your entry remains obscure after it has been + 'cleaned up' by the C pre-processor and a C beautifier. + + Your entry need not pass all of the above tests. In certain + cases, a test is not important. Entries that compete for the + 'strangest/most creative source layout' need not do as well as + others in terms of their algorithm. On the other hand, given + two such entries, we are more inclined to pick the entry that + does something interesting when you run it. + + We try to avoid limiting creativity in our rules. As such, we leave + the contest open for creative rule interpretation. As in real life + programming, interpreting a requirements document or a customer request + is important. For this reason, we often award 'worst abuse of the + rules' to an entry that illustrates this point in an ironic way. + + We do realize that there are holes in the rules, and invite entries + to attempt to exploit them. We will award 'worst abuse of the rules' + and then plug the hole next year. Even so, we will attempt to use + the smallest plug needed, if not smaller. :-) + + Check out your program and be sure that it works. We sometimes make + the effort to debug an entry that has a slight problem, particularly + in or near the final round. On the other hand, we have seen some + of the best entries fall down because they didn't work. + + We tend to look down on a prime number printer, that claims that + 16 is a prime number. If you do have a bug, you are better off + documenting it. Noting "this entry sometimes prints the 4th power + of a prime by mistake" would save the above entry. And sometimes, + a strange bug/feature can even help the entry! Of course, a correctly + working entry is best. + + People who are considering to just use some complex mathematical + function or state machine to spell out something such as "hello, + world!" may want to try and be more creative. + + Ultra-obfuscated programs are in some cases some cases easier to + deobfuscate than subtly-obfuscated programs. Consider using + misleading or subtle tricks layered on top of or under an + appropriate level of obfuscation. + + Programs that use VTxxx/ANSI sequences that are NOT limited to a + specific terminal brand and that can also work in a standard xterm + are considered portable. + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many ANSI C compilers dislike the following code, and so do we: + + #define d define + #d foo <-- don't expect this to turn into #define foo + + When declaring local or global variables, you should declare the type: + + int this_is_ok; + this_is_not; <-- don't use such implicit type declaration + + We suggest that you compile your entry with an ANSI C compiler. If you + must use non-ANSI C, such as K&R C, you must avoid areas that result in + compile/link errors for ANSI C compilers. For example, using gcc + local function declarations, such as: + + int | + main() { | + void blah() { printf("blah\n"); } + blah(); + } + + are not allowed even though their existence seems tailor made for + this contest! But for now, since they are not in wide spread use + we cannot accept entries that use them. + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using . Use instead. + + If you use C preprocessor directives (#define, #if, #ifdef, ...), | + the leading '#' must be the first non-whitespace character on a line. | + While some broken C preprocessors do not allow whitespace before a | + '#', most do. | + + The exit() function returns void. On some broken systems have exit() | + return int. Your entry should assume that exit() returns a void. | + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + + One line programs should be short one line programs, say around 80 + bytes long. Getting close to 160 bytes is a bit too long in our opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS version specific + (index/strchr differences are ok, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is ok only if you warn us in the 'remark' header item) + * won't compile or run under a POSIX P1003.1/P1003.2 like systems + * depend on a utility or application not normally found on most + most POSIX P1003.1/P1003.2 like systems + * abuse the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are similar to previous winners + * are identical to previous losers :-) + * are identical to future losers (Windows 95) :-) + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + The build file should not be used to try and get around the size + limit. It is one thing to make use of a several -D's to help out, + but it is quite another to use 200+ bytes of -D's in order to + try and squeeze the source under the size limit. You should feel + free to make use of the build file space, but you are better off + if you show some amount of restraint. + + We want to get away from source that is simply a compact blob of + characters. To help, we give a break to source that contains + whitespace, and in certain cases ; { or } characters. While the + number of characters excluding whitespace (tab, space, newline), + and excluding any ; { or } followed immediately by either whitespace + or end of file, must be <= 1536, the total size may be less than 3217 + bytes. This means that one may use "free of charge" up to 1681 + bytes of whitespace, or ; { or } followed by either whitespace + or end of file. [[Q: What is special about 1681?]] + + Please do not use things like gzip to get around the size limit. | + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! + + We suggest that you avoid trying for the 'smallest self-replicating' + source. The smallest, a zero byte entry, won in 1994. + + We do not like writable strings. That is, we don't want stuff like: | + + char *T = "So many primes, so little time!"; + ... + T[14] = ';'; + + Please don't make use of this feature, even if your system allows it. | + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. Don't + depend on a particular type of display. For example, don't depend + on color or a given size. Don't require backing store. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. We ask that such X client + entries restrict themselves to only the low level Xlib and the + Athena widget set (libX11.a, libXaw.a, libXmu.a and libXt.a). + Don't use M*tif, Xv*ew, or OpenL*ok toolkits, since not everyone + has them. Avoid depending on a particular window manager. Not + everyone has X11r5, and some people are stuck back in X11r4 (or + earlier), so try to target X11r5 without requiring X11r5. Better + yet, try to make your entry run on all version 11 X Window Systems. + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines + in the ---remark--- section. + + While we recognize that UN*X is not a universal operating system, the + contest does have a bias towards such systems. In an effort to expand + the scope of the contest, we phrase our bias in terms of POSIX P1003.1 + and P1003.2 standards. This will allow certain non-UN*X OS users to + submit entries. On the other hand, this is a guideline and not a rule. + We will not reject an entry based on some POSIX technicality. + + When dealing with OS and application environments, we suggest that you + be reasonable with a nod towards vanilla UN*X-like systems. POSIX will + evolve but not as much as the contest, so avoid stuff like POSIX real + time, security, etc. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * pass lint without complaint (not a requirement, but it is nice) + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION <== HINT!! | + * make us laugh and/or throw up :-) (humor helps!) | + + Some types of programs can't excel (tm) in some areas. Of course, your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + You are better off explaining what your entry does in the + ---remark--- section rather than leaving it obscure for the judges + as we might miss something and/or be too tired to notice. + + We freely admit that interesting, creative or humorous comments in + the ---remark--- section help your chances of winning. If you had to + read so many twisted entries, you too would enjoy a good laugh or two. + We think the readers of the contest winners do as well. We do read + the ---remark--- section during the judging process, so it is worth + your while to write a remarkable ---remark--- section. + + Be creative! + + +ABUSING THE RULES: + + Legal abuse of the rules is somewhat encouraged. Legal rule abuse may + involve, but is not limited to, doing things that are technically + allowed by the rules and yet do not fit the spirit of what we + intended to be submitted. + + Legal rule abuse is encouraged to help promote creativity. Rule + abuse entries, regardless of if they receive an award, result in + changes to the next year's rules and guidelines. + + Legal abuse of the rules is NOT an invitation to violate the + rules. An entry that violates the rules in the opinion of the + judges, WILL be disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL + OF RISK! If you have an entry that might otherwise be interesting, + you might want to submit two versions; one that does not abuse the + rules and one that does. + + If you intend to abuse the rules, indicate so in the ---remark--- + section. You must try to justify why you consider your rule abuse + to be allowed under the rules. That is, you must plead your case + as to why your entry is valid. Humor and/or creativity help plead + a case. + + Abusing the entry format tends to annoy us more than amuse us. + + We are often asked why the contest rules and guidelines seem too + strange or contain mistakes, flaws or grammatical errors. + One reason is that we sometimes make genuine mistakes. But in many + cases such problems, flaws or areas of confusion are deliberate. + Changes to rules and guidelines in response to rule abuses, are + done in a minimal fashion. Often we will deliberately leave + behind holes (or introduce new ones) so that future rule abuse may + continue. + + At the risk of stating the obvious, this contest is a parity of the + software development process. The rules and guidelines are + only a small part of the overall contest. Even so, one may think + the contest rule and guideline process as a parody of the sometimes + tragic mismatch between what a customer (or marketing) wants and + what engineering delivers. + + +ENTRY FORMAT: + + In order to help us process the many entries, we must request your + assistance by formatting your entries in a certain way. This format, + in addition, allows us to quickly separate information about the + author from the program itself. (see JUDGING PROCESS) + + We have provided the program, mkentry, as an example of how to + format entries. You should be aware of the following warning that + is found in mkentry.c: + + This program attempts to implement the IOCCC rules. Every + attempt has been made to make sure that this program produces + an entry that conforms to the contest rules. In all cases, + where this program differs from the contest rules, the + contest rules will be used. Be sure to check with the + contest rules before submitting an entry. + + You are not required to use mkentry. It is convenient, however, + as it attempts to uuencode the needed files, and attempt to check + the entry against the size rules. + + If you have any suggestions, comments, fixes or complaints about + the mkentry.c program, please send EMail to the judges. (see below) + + The following is a sample entry (the | change bars are not part + of the example, don't add them to your entry!) + +---entry--- +rule: 1998 +fix: y +title: chlejhse +entry: 0 +date: Mon Oct 28 00:47:00 1998 +host: Un*x v6, pdp11/45 + 2.9BSD, pdp11/70 +---remark--- + This is a not-very-obfuscated C program. It is likely not to win a + prize, because it doesn't have what it takes to win and because the + author plans to forget to send it in before the deadline! :-) +---author--- +name: Landon Curt Noll +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA + Earth +email: chongo@no_spam.fake.address + nobody@toad.com +url: http:///www.isthe.com/chongo +anon: y +---author--- +name: Leonid A. Broukhis +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA +email: leob@no_spam.fake_org +url: http://www.mailcom.com/main.shtml +anon: n +---author--- +name: Jeremy Horn +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA +email: jhorn@no_spam.fake_edu +url: none +anon: n +---author--- +name: Peter Seebach +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA +email: seebs@no_spam.fake_com +url: none +anon: y +---info--- +begin 444 info.file +M5&AI2$I+"!O;F4@;6EG:'0@2!P2!A8W1U86QL>2!D96-O9&5D +M('1H:7,@9FEL92X@($EN"C$Y.3,@86YD(#$Y.30@82!F97<@;6]R92!D:60@ +M=&AE('-A;64N("!);B`Q.3DU+"!A(&YU;6)E2!D96-O9&5D('1H:7,@ +M9FEL92X@(%-E96US('1H97)E(&ES(&$*2!D;VXG="!Y;W4@=&5L;"!U +M6]U(&1E8V]D960@=&AI6]U6]U2!O8F9U&%M<&QE+@H@("`@("HO"B`@("!P&%M<&QE+EQN +M(BD["B`@("!P6]U&ET*#(Q-S`Q("4@,3(W*3L*?0H` +` +end +---end--- + + Your entry's sections must be the same order as in the above example. + + Typically the build file should assume that the source is prog.c + and will compile into prog. If an entry wins, we will rename + its source and binary to avoid filename collision. By tradition, + we use the name of the entry's title, followed by an optional + digit in case of name conflicts. + + Please note that the title must match the following regexp: + + ^[a-zA-Z0-9_=][a-zA-Z0-9_=+-]*$ + + and must be 1 to 31 chars in length. Titles such as: | + + foo.c + this_invalid_title_is_too_long ! + /dev/null + + are right out! :-) + + Titles can be 31 chars long now, but please try to keep them short. | + Why 31? Because at lesst one of the judges likes Mersenne primes! | + + It is suggested, but not required, that the title should incorporate + the author(s) username(s). + + If the above entry somehow won the 'least likely to win' award, + we would use chonglab.c and chonglab. + + If your entry depends on, or requires that your build, source + and/or binary files be a particular name, please say so in the + ---remark--- section. If this case applies, it would be be helpful + if you did one of the following: + + * Tell us how to change the filename(s) in your entry. + + * Have the build file make copies of the files. For example: + + cc prog.c -o special_name + + or rm -f special_src.c + cp prog.c special_src.c + cc special_src.c -o special_name + + or rm -f special_build + tail +4 build > special_build + sh < special_build + + * Assume that we will use the entry title. Send us a version of + your build/program files that uses the name convention. You + should uuencode these files in ---info--- sections. + + If your entry needs to modify its source, info or binary files, + please say so in the ---remark--- section. You should try to avoid + touching your original build, source and binary files. You should + arrange to make copies of the files you intend to modify. This + will allow people to re-generate your entry from scratch. + + Remember that your entry may be built without a build file. We + typically incorporate the build lines into a Makefile. If the + build file must exist, say so in the ---remark--- section. + + Typically the ---build--- command will contain a "cc" command. + It is also ok to use a "gcc" command (and gcc args). However keep + in mind that your entry should be compilable by any standard ANSI C + compiler and thus should not depend on a special gcc feature. + + If your entry needs special info files, you should uuencode them + into ---info--- sections. In the case of multiple info files, + use multiple ---info--- sections. If no info files are needed, + then skip the ---info--- section. + + Info files are intended to be input, or detailed information that + does not fit well into the ---remark--- section. For example, an + entry that implements a compiler might want to provide some sample + programs for the user to compile. An entry might want to include a + lengthy design document, that might not be appropriate for a + 'hints' file. + + Info files should be used only to supplement your entry. For + example, info files may provide sample input or detailed + information about your entry. Because they are supplemental, + the entry should not require them exist. + + In some cases, your info files might be renamed to avoid name + conflicts. If info files should not be renamed for some reason, + say so in the ---remark--- section. + + Info files must uudecode into the current directory. If they + absolutely must be renamed, or moved into a sub-directory, say + so in the ---remark--- section. + + When submitting multiple entries, be sure that each entry has + a unique entry number from 0 to 7. Your first entry should + have entry number 0. + + With the exception of the header, all text outside of the entry + format may be ignored. That is, don't place text outside of the + entry and expect us to see it. (Our decoding tools are not AI + progs!) If you need tell the judges something, put it in the + ---remark--- section, or send a EMail to: + + questions@ioccc.org (not the address for submitting entries) | + + You must include the words ``ioccc question'' in the subject of your + EMail message when sending EMail to the judges. + + The date should be given with respect to UTC. (Some systems refer + to this as GMT or GMT0) The format of the date should be that as + returned by asctime() in the C locale. An example of such a string is: + + Mon Oct 28 00:47:00 1998 + + This format is similar to the output of the date(1) command. The + string does not include the timezone name before the year. On many + systems, one of the following command will produce a similar string: + + date -u "+%a %h %d %T 19%y" + date -u | sed -e 's/... \(19[0-9][0-9]\)$/\1/' + sh -c 'TZ=UTC date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"' + sh -c 'TZ=GMT date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"' + sh -c 'TZ=GMT0 date | sed -e "s/... \(19[0-9][0-9]\)$/\1/"' + + You are allowed to update/fix/revise your entry. To do so, set + the 'fix' line in the ---entry--- section to 'y' instead of 'n'. + Be sure that the resubmission uses the same title and entry number + as well, as these are used to determine which entry is to be + replaced. + +JUDGING PROCESS: + + Entries are judged by Leonid A. Broukhis, Jeremy Horn, Landon Curt Noll | + and Peter Seebach. | + + Entries are unpacked into individual directories. The EMail message + is unpacked into individual files, each containing: + + ---entry--- section + all ---author--- sections + all ---info--- sections + ---build--- section + ---program--- section + any other text, including the EMail message headers + + Prior to judging, the 'any other text' file is scanned to be sure + it does not contain useful information (or in case the entry was + malformed and did not unpack correctly). Information from the + ---author--- sections and the title from the ---entry--- section + are not read until the judging process is complete, and then only + from entries that have won an award. + + The above process helps keep us biased for/against any one particular + individual. We are usually kept in the dark as much as you are + until the final awards are given. We like the surprise of finding + out in the end, who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. (For the curious, + we do indicate the volume of paper consumed when presenting the IOCCC + winners at talks) + + After the Usenix announcement, we attempt to send EMail to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes and typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the ---entry--- section + * reading the uudecoded ---build--- section + * reading the uudecoded ---program--- section + * reading the uudecoded ---info--- section(s), if any + * passing the source thru the C pre-processor + skipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + skipping over any #include files + + In later rounds, other actions are performed: + + * linting the source + * compiling/building the source + * running the program + * performing miscellaneous tests on the source and binary + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry often will compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code + * best X client (see OUR LIKES AND DISLIKES) + * best abuse of ANSI C + * worst abuse of the rules + * + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to 8 or 10 + winners. Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry os good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + + More often than not, we select a small entry (usually one line), a + strange/creative layout entry, and an entry that abuses the contest + rules in some way. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entries. More often, the + 'best' is picked because it does well in a number of categories. + + +ANNOUNCEMENT OF WINNERS: + + The first announcement, occurs at the main Usenix conference. By + tradition, this is done during the IOCCC BOF. However due to the | + schedule change of 1998, an announcement may take place on the | + web first in early 1999. | + + Winning entries will be posted in February to the following groups: + + comp.lang.c comp.lang.c.moderated alt.sources | + + In addition, pointers to these postings are posted to the following + + comp.sources.misc comp.windows.x comp.programming | + misc.misc comp.std.c alt.folklore.computers | + + Winning entries will be deposited into the uunet archives. See + below for details. + + Often, winning entries are published in selected magazines from around + the world. Winners have appeared in books ("The New Hackers Dictionary") + and on T-Shirts. + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending EMail to the following address: + + questions@ioccc.org (not the address for submitting entries) | + + Questions and comments about the contest are welcome. Comments about + confusing rules and guidelines are also welcome. + + You must include the words ``ioccc question'' in the subject of your + EMail message when sending EMail to the judges. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. + + Check out the IOCCC Web page: + + http://www.ioccc.org | + + It has rules, guidelines and winners of previous contests (1984 to date). | + + +Leonid A. Broukhis | +Jeremy Horn | +chongo /\cc/\ +Peter Seebach | diff --git a/1998/horizon.sc b/1998/horizon.sc new file mode 100644 index 000000000..b3e60838c --- /dev/null +++ b/1998/horizon.sc @@ -0,0 +1,22 @@ +1000000 0 0 +951057 309017 0 +809017 587785 0 +587785 809017 0 +309017 951057 0 +0 1000000 0 +-309017 951057 0 +-587785 809017 0 +-809017 587785 0 +-951057 309017 0 +-1e+06 0 0 +-951057 -309017 0 +-809017 -587785 0 +-587785 -809017 0 +-309017 -951057 0 +0 -1000000 0 +309017 -951057 0 +587785 -809017 0 +809017 -587785 0 +951057 -309017 0 +1000000 0 0 +0 0 0 diff --git a/1998/ioccc.data b/1998/ioccc.data new file mode 100644 index 000000000..770e4db9a --- /dev/null +++ b/1998/ioccc.data @@ -0,0 +1,931 @@ +AlWuzEre 5580 +0.104638 -1.025458 0.533203 0.104591 -1.102728 0.533203 +0.104591 -1.102728 0.533203 0.104591 -1.102728 0.000000 +0.104638 -1.025458 0.533203 0.104591 -1.102728 0.000000 +0.104638 -1.025458 0.533203 0.104591 -1.102728 0.000000 +0.104591 -1.102728 0.000000 0.104638 -1.025458 0.000000 +0.104638 -1.025458 0.533203 0.104638 -1.025458 0.000000 +0.104591 -1.102728 0.533203 0.104638 -1.025458 0.533203 +0.104638 -1.025458 0.533203 0.104638 -1.025458 0.000000 +0.104591 -1.102728 0.533203 0.104638 -1.025458 0.000000 +0.104591 -1.102728 0.533203 0.104638 -1.025458 0.000000 +0.104638 -1.025458 0.000000 0.104591 -1.102728 0.000000 +0.104591 -1.102728 0.533203 0.104591 -1.102728 0.000000 +0.104844 -0.684881 0.543823 0.104812 -0.737661 0.538925 +0.104812 -0.737661 0.538925 0.104877 -0.630911 0.538925 +0.104844 -0.684881 0.543823 0.104877 -0.630911 0.538925 +0.104877 -0.630911 0.538925 0.104812 -0.737661 0.538925 +0.104812 -0.737661 0.538925 0.104783 -0.786871 0.524231 +0.104877 -0.630911 0.538925 0.104783 -0.786871 0.524231 +0.104877 -0.630911 0.538925 0.104783 -0.786871 0.524231 +0.104783 -0.786871 0.524231 0.104907 -0.581060 0.524231 +0.104877 -0.630911 0.538925 0.104907 -0.581060 0.524231 +0.104907 -0.581060 0.524231 0.104783 -0.786871 0.524231 +0.104783 -0.786871 0.524231 0.104755 -0.832144 0.500015 +0.104907 -0.581060 0.524231 0.104755 -0.832144 0.500015 +0.104907 -0.581060 0.524231 0.104755 -0.832144 0.500015 +0.104755 -0.832144 0.500015 0.104935 -0.535330 0.499832 +0.104907 -0.581060 0.524231 0.104935 -0.535330 0.499832 +0.104935 -0.535330 0.499832 0.104755 -0.832144 0.500015 +0.104755 -0.832144 0.500015 0.104730 -0.873114 0.466553 +0.104935 -0.535330 0.499832 0.104730 -0.873114 0.466553 +0.104935 -0.535330 0.499832 0.104730 -0.873114 0.466553 +0.104730 -0.873114 0.466553 0.104844 -0.685614 0.466553 +0.104935 -0.535330 0.499832 0.104844 -0.685614 0.466553 +0.104844 -0.685614 0.466553 0.104730 -0.873114 0.466553 +0.104730 -0.873114 0.466553 0.104801 -0.757391 0.452271 +0.104844 -0.685614 0.466553 0.104801 -0.757391 0.452271 +0.104801 -0.757391 0.452271 0.104730 -0.873114 0.466553 +0.104730 -0.873114 0.466553 0.104709 -0.909185 0.423798 +0.104801 -0.757391 0.452271 0.104709 -0.909185 0.423798 +0.104801 -0.757391 0.452271 0.104709 -0.909185 0.423798 +0.104709 -0.909185 0.423798 0.104764 -0.817816 0.410889 +0.104801 -0.757391 0.452271 0.104764 -0.817816 0.410889 +0.104764 -0.817816 0.410889 0.104709 -0.909185 0.423798 +0.104709 -0.909185 0.423798 0.104693 -0.935369 0.376099 +0.104764 -0.817816 0.410889 0.104693 -0.935369 0.376099 +0.104764 -0.817816 0.410889 0.104693 -0.935369 0.376099 +0.104693 -0.935369 0.376099 0.104738 -0.860662 0.345337 +0.104764 -0.817816 0.410889 0.104738 -0.860662 0.345337 +0.104738 -0.860662 0.345337 0.104693 -0.935369 0.376099 +0.104693 -0.935369 0.376099 0.104683 -0.951300 0.324463 +0.104738 -0.860662 0.345337 0.104683 -0.951300 0.324463 +0.104738 -0.860662 0.345337 0.104683 -0.951300 0.324463 +0.104683 -0.951300 0.324463 0.104680 -0.956610 0.269897 +0.104738 -0.860662 0.345337 0.104680 -0.956610 0.269897 +0.104738 -0.860662 0.345337 0.104680 -0.956610 0.269897 +0.104680 -0.956610 0.269897 0.104729 -0.876043 0.269165 +0.104738 -0.860662 0.345337 0.104729 -0.876043 0.269165 +0.104729 -0.876043 0.269165 0.104680 -0.956610 0.269897 +0.104680 -0.956610 0.269897 0.104737 -0.862127 0.190247 +0.104729 -0.876043 0.269165 0.104737 -0.862127 0.190247 +0.104737 -0.862127 0.190247 0.104680 -0.956610 0.269897 +0.104680 -0.956610 0.269897 0.104690 -0.939032 0.166809 +0.104737 -0.862127 0.190247 0.104690 -0.939032 0.166809 +0.104737 -0.862127 0.190247 0.104690 -0.939032 0.166809 +0.104690 -0.939032 0.166809 0.104761 -0.822210 0.125977 +0.104737 -0.862127 0.190247 0.104761 -0.822210 0.125977 +0.104761 -0.822210 0.125977 0.104690 -0.939032 0.166809 +0.104690 -0.939032 0.166809 0.104800 -0.758856 0.081665 +0.104761 -0.822210 0.125977 0.104800 -0.758856 0.081665 +0.104800 -0.758856 0.081665 0.104690 -0.939032 0.166809 +0.104690 -0.939032 0.166809 0.104722 -0.887396 0.080933 +0.104800 -0.758856 0.081665 0.104722 -0.887396 0.080933 +0.104800 -0.758856 0.081665 0.104722 -0.887396 0.080933 +0.104722 -0.887396 0.080933 0.104844 -0.685614 0.065918 +0.104800 -0.758856 0.081665 0.104844 -0.685614 0.065918 +0.104844 -0.685614 0.065918 0.104722 -0.887396 0.080933 +0.104722 -0.887396 0.080933 0.104748 -0.844503 0.041107 +0.104844 -0.685614 0.065918 0.104748 -0.844503 0.041107 +0.104935 -0.535330 0.499832 0.104844 -0.685614 0.466553 +0.104844 -0.685614 0.466553 0.104960 -0.493719 0.465820 +0.104935 -0.535330 0.499832 0.104960 -0.493719 0.465820 +0.104960 -0.493719 0.465820 0.104844 -0.685614 0.466553 +0.104844 -0.685614 0.466553 0.104891 -0.608893 0.450989 +0.104960 -0.493719 0.465820 0.104891 -0.608893 0.450989 +0.104960 -0.493719 0.465820 0.104891 -0.608893 0.450989 +0.104891 -0.608893 0.450989 0.104982 -0.458105 0.423523 +0.104960 -0.493719 0.465820 0.104982 -0.458105 0.423523 +0.104982 -0.458105 0.423523 0.104891 -0.608893 0.450989 +0.104891 -0.608893 0.450989 0.104930 -0.543890 0.402832 +0.104982 -0.458105 0.423523 0.104930 -0.543890 0.402832 +0.104982 -0.458105 0.423523 0.104930 -0.543890 0.402832 +0.104930 -0.543890 0.402832 0.104997 -0.432562 0.376465 +0.104982 -0.458105 0.423523 0.104997 -0.432562 0.376465 +0.104997 -0.432562 0.376465 0.104930 -0.543890 0.402832 +0.104930 -0.543890 0.402832 0.104954 -0.504889 0.341125 +0.104997 -0.432562 0.376465 0.104954 -0.504889 0.341125 +0.104997 -0.432562 0.376465 0.104954 -0.504889 0.341125 +0.104954 -0.504889 0.341125 0.105007 -0.417181 0.325104 +0.104997 -0.432562 0.376465 0.105007 -0.417181 0.325104 +0.105007 -0.417181 0.325104 0.104954 -0.504889 0.341125 +0.104954 -0.504889 0.341125 0.104962 -0.491522 0.270630 +0.105007 -0.417181 0.325104 0.104962 -0.491522 0.270630 +0.105007 -0.417181 0.325104 0.104962 -0.491522 0.270630 +0.104962 -0.491522 0.270630 0.105010 -0.412054 0.269897 +0.105007 -0.417181 0.325104 0.105010 -0.412054 0.269897 +0.105010 -0.412054 0.269897 0.104962 -0.491522 0.270630 +0.104962 -0.491522 0.270630 0.104953 -0.505438 0.190567 +0.105010 -0.412054 0.269897 0.104953 -0.505438 0.190567 +0.105010 -0.412054 0.269897 0.104953 -0.505438 0.190567 +0.104953 -0.505438 0.190567 0.104999 -0.429632 0.165344 +0.105010 -0.412054 0.269897 0.104999 -0.429632 0.165344 +0.104999 -0.429632 0.165344 0.104953 -0.505438 0.190567 +0.104953 -0.505438 0.190567 0.104928 -0.547186 0.124695 +0.104999 -0.429632 0.165344 0.104928 -0.547186 0.124695 +0.104999 -0.429632 0.165344 0.104928 -0.547186 0.124695 +0.104928 -0.547186 0.124695 0.104986 -0.451605 0.119980 +0.104999 -0.429632 0.165344 0.104986 -0.451605 0.119980 +0.104986 -0.451605 0.119980 0.104928 -0.547186 0.124695 +0.104928 -0.547186 0.124695 0.104890 -0.609625 0.080612 +0.104986 -0.451605 0.119980 0.104890 -0.609625 0.080612 +0.104986 -0.451605 0.119980 0.104890 -0.609625 0.080612 +0.104890 -0.609625 0.080612 0.104967 -0.482367 0.079468 +0.104986 -0.451605 0.119980 0.104967 -0.482367 0.079468 +0.104967 -0.482367 0.079468 0.104890 -0.609625 0.080612 +0.104890 -0.609625 0.080612 0.104844 -0.685614 0.065918 +0.104967 -0.482367 0.079468 0.104844 -0.685614 0.065918 +0.104967 -0.482367 0.079468 0.104844 -0.685614 0.065918 +0.104844 -0.685614 0.065918 0.104748 -0.844503 0.041107 +0.104967 -0.482367 0.079468 0.104748 -0.844503 0.041107 +0.104967 -0.482367 0.079468 0.104748 -0.844503 0.041107 +0.104748 -0.844503 0.041107 0.104941 -0.526175 0.040283 +0.104967 -0.482367 0.079468 0.104941 -0.526175 0.040283 +0.104941 -0.526175 0.040283 0.104748 -0.844503 0.041107 +0.104748 -0.844503 0.041107 0.104777 -0.796392 0.012451 +0.104941 -0.526175 0.040283 0.104777 -0.796392 0.012451 +0.104941 -0.526175 0.040283 0.104777 -0.796392 0.012451 +0.104777 -0.796392 0.012451 0.104911 -0.574835 0.012085 +0.104941 -0.526175 0.040283 0.104911 -0.574835 0.012085 +0.104911 -0.574835 0.012085 0.104777 -0.796392 0.012451 +0.104777 -0.796392 0.012451 0.104809 -0.743338 -0.004852 +0.104911 -0.574835 0.012085 0.104809 -0.743338 -0.004852 +0.104911 -0.574835 0.012085 0.104809 -0.743338 -0.004852 +0.104809 -0.743338 -0.004852 0.104879 -0.628073 -0.004944 +0.104911 -0.574835 0.012085 0.104879 -0.628073 -0.004944 +0.104879 -0.628073 -0.004944 0.104809 -0.743338 -0.004852 +0.104809 -0.743338 -0.004852 0.104844 -0.685614 -0.010620 +0.104879 -0.628073 -0.004944 0.104844 -0.685614 -0.010620 +0.104844 -0.684881 0.543823 0.104877 -0.630911 0.538925 +0.104877 -0.630911 0.538925 0.104812 -0.737661 0.538925 +0.104844 -0.684881 0.543823 0.104812 -0.737661 0.538925 +0.104812 -0.737661 0.538925 0.104877 -0.630911 0.538925 +0.104877 -0.630911 0.538925 0.104907 -0.581060 0.524231 +0.104812 -0.737661 0.538925 0.104907 -0.581060 0.524231 +0.104812 -0.737661 0.538925 0.104907 -0.581060 0.524231 +0.104907 -0.581060 0.524231 0.104783 -0.786871 0.524231 +0.104812 -0.737661 0.538925 0.104783 -0.786871 0.524231 +0.104783 -0.786871 0.524231 0.104907 -0.581060 0.524231 +0.104907 -0.581060 0.524231 0.104755 -0.832144 0.500015 +0.104783 -0.786871 0.524231 0.104755 -0.832144 0.500015 +0.104755 -0.832144 0.500015 0.104907 -0.581060 0.524231 +0.104907 -0.581060 0.524231 0.104935 -0.535330 0.499832 +0.104755 -0.832144 0.500015 0.104935 -0.535330 0.499832 +0.104755 -0.832144 0.500015 0.104935 -0.535330 0.499832 +0.104935 -0.535330 0.499832 0.104844 -0.685614 0.466553 +0.104755 -0.832144 0.500015 0.104844 -0.685614 0.466553 +0.104755 -0.832144 0.500015 0.104844 -0.685614 0.466553 +0.104844 -0.685614 0.466553 0.104730 -0.873114 0.466553 +0.104755 -0.832144 0.500015 0.104730 -0.873114 0.466553 +0.104730 -0.873114 0.466553 0.104844 -0.685614 0.466553 +0.104844 -0.685614 0.466553 0.104801 -0.757391 0.452271 +0.104730 -0.873114 0.466553 0.104801 -0.757391 0.452271 +0.104730 -0.873114 0.466553 0.104801 -0.757391 0.452271 +0.104801 -0.757391 0.452271 0.104709 -0.909185 0.423798 +0.104730 -0.873114 0.466553 0.104709 -0.909185 0.423798 +0.104709 -0.909185 0.423798 0.104801 -0.757391 0.452271 +0.104801 -0.757391 0.452271 0.104764 -0.817816 0.410889 +0.104709 -0.909185 0.423798 0.104764 -0.817816 0.410889 +0.104709 -0.909185 0.423798 0.104764 -0.817816 0.410889 +0.104764 -0.817816 0.410889 0.104693 -0.935369 0.376099 +0.104709 -0.909185 0.423798 0.104693 -0.935369 0.376099 +0.104693 -0.935369 0.376099 0.104764 -0.817816 0.410889 +0.104764 -0.817816 0.410889 0.104738 -0.860662 0.345337 +0.104693 -0.935369 0.376099 0.104738 -0.860662 0.345337 +0.104693 -0.935369 0.376099 0.104738 -0.860662 0.345337 +0.104738 -0.860662 0.345337 0.104683 -0.951300 0.324463 +0.104693 -0.935369 0.376099 0.104683 -0.951300 0.324463 +0.104683 -0.951300 0.324463 0.104738 -0.860662 0.345337 +0.104738 -0.860662 0.345337 0.104680 -0.956610 0.269897 +0.104683 -0.951300 0.324463 0.104680 -0.956610 0.269897 +0.104680 -0.956610 0.269897 0.104738 -0.860662 0.345337 +0.104738 -0.860662 0.345337 0.104729 -0.876043 0.269165 +0.104680 -0.956610 0.269897 0.104729 -0.876043 0.269165 +0.104680 -0.956610 0.269897 0.104729 -0.876043 0.269165 +0.104729 -0.876043 0.269165 0.104737 -0.862127 0.190247 +0.104680 -0.956610 0.269897 0.104737 -0.862127 0.190247 +0.104680 -0.956610 0.269897 0.104737 -0.862127 0.190247 +0.104737 -0.862127 0.190247 0.104690 -0.939032 0.166809 +0.104680 -0.956610 0.269897 0.104690 -0.939032 0.166809 +0.104690 -0.939032 0.166809 0.104737 -0.862127 0.190247 +0.104737 -0.862127 0.190247 0.104761 -0.822210 0.125977 +0.104690 -0.939032 0.166809 0.104761 -0.822210 0.125977 +0.104690 -0.939032 0.166809 0.104761 -0.822210 0.125977 +0.104761 -0.822210 0.125977 0.104800 -0.758856 0.081665 +0.104690 -0.939032 0.166809 0.104800 -0.758856 0.081665 +0.104690 -0.939032 0.166809 0.104800 -0.758856 0.081665 +0.104800 -0.758856 0.081665 0.104722 -0.887396 0.080933 +0.104690 -0.939032 0.166809 0.104722 -0.887396 0.080933 +0.104722 -0.887396 0.080933 0.104800 -0.758856 0.081665 +0.104800 -0.758856 0.081665 0.104844 -0.685614 0.065918 +0.104722 -0.887396 0.080933 0.104844 -0.685614 0.065918 +0.104722 -0.887396 0.080933 0.104844 -0.685614 0.065918 +0.104844 -0.685614 0.065918 0.104748 -0.844503 0.041107 +0.104722 -0.887396 0.080933 0.104748 -0.844503 0.041107 +0.104844 -0.685614 0.466553 0.104935 -0.535330 0.499832 +0.104935 -0.535330 0.499832 0.104960 -0.493719 0.465820 +0.104844 -0.685614 0.466553 0.104960 -0.493719 0.465820 +0.104844 -0.685614 0.466553 0.104960 -0.493719 0.465820 +0.104960 -0.493719 0.465820 0.104891 -0.608893 0.450989 +0.104844 -0.685614 0.466553 0.104891 -0.608893 0.450989 +0.104891 -0.608893 0.450989 0.104960 -0.493719 0.465820 +0.104960 -0.493719 0.465820 0.104982 -0.458105 0.423523 +0.104891 -0.608893 0.450989 0.104982 -0.458105 0.423523 +0.104891 -0.608893 0.450989 0.104982 -0.458105 0.423523 +0.104982 -0.458105 0.423523 0.104930 -0.543890 0.402832 +0.104891 -0.608893 0.450989 0.104930 -0.543890 0.402832 +0.104930 -0.543890 0.402832 0.104982 -0.458105 0.423523 +0.104982 -0.458105 0.423523 0.104997 -0.432562 0.376465 +0.104930 -0.543890 0.402832 0.104997 -0.432562 0.376465 +0.104930 -0.543890 0.402832 0.104997 -0.432562 0.376465 +0.104997 -0.432562 0.376465 0.104954 -0.504889 0.341125 +0.104930 -0.543890 0.402832 0.104954 -0.504889 0.341125 +0.104954 -0.504889 0.341125 0.104997 -0.432562 0.376465 +0.104997 -0.432562 0.376465 0.105007 -0.417181 0.325104 +0.104954 -0.504889 0.341125 0.105007 -0.417181 0.325104 +0.104954 -0.504889 0.341125 0.105007 -0.417181 0.325104 +0.105007 -0.417181 0.325104 0.104962 -0.491522 0.270630 +0.104954 -0.504889 0.341125 0.104962 -0.491522 0.270630 +0.104962 -0.491522 0.270630 0.105007 -0.417181 0.325104 +0.105007 -0.417181 0.325104 0.105010 -0.412054 0.269897 +0.104962 -0.491522 0.270630 0.105010 -0.412054 0.269897 +0.104962 -0.491522 0.270630 0.105010 -0.412054 0.269897 +0.105010 -0.412054 0.269897 0.104953 -0.505438 0.190567 +0.104962 -0.491522 0.270630 0.104953 -0.505438 0.190567 +0.104953 -0.505438 0.190567 0.105010 -0.412054 0.269897 +0.105010 -0.412054 0.269897 0.104999 -0.429632 0.165344 +0.104953 -0.505438 0.190567 0.104999 -0.429632 0.165344 +0.104953 -0.505438 0.190567 0.104999 -0.429632 0.165344 +0.104999 -0.429632 0.165344 0.104928 -0.547186 0.124695 +0.104953 -0.505438 0.190567 0.104928 -0.547186 0.124695 +0.104928 -0.547186 0.124695 0.104999 -0.429632 0.165344 +0.104999 -0.429632 0.165344 0.104986 -0.451605 0.119980 +0.104928 -0.547186 0.124695 0.104986 -0.451605 0.119980 +0.104928 -0.547186 0.124695 0.104986 -0.451605 0.119980 +0.104986 -0.451605 0.119980 0.104890 -0.609625 0.080612 +0.104928 -0.547186 0.124695 0.104890 -0.609625 0.080612 +0.104890 -0.609625 0.080612 0.104986 -0.451605 0.119980 +0.104986 -0.451605 0.119980 0.104967 -0.482367 0.079468 +0.104890 -0.609625 0.080612 0.104967 -0.482367 0.079468 +0.104890 -0.609625 0.080612 0.104967 -0.482367 0.079468 +0.104967 -0.482367 0.079468 0.104844 -0.685614 0.065918 +0.104890 -0.609625 0.080612 0.104844 -0.685614 0.065918 +0.104844 -0.685614 0.065918 0.104967 -0.482367 0.079468 +0.104967 -0.482367 0.079468 0.104748 -0.844503 0.041107 +0.104844 -0.685614 0.065918 0.104748 -0.844503 0.041107 +0.104748 -0.844503 0.041107 0.104967 -0.482367 0.079468 +0.104967 -0.482367 0.079468 0.104941 -0.526175 0.040283 +0.104748 -0.844503 0.041107 0.104941 -0.526175 0.040283 +0.104748 -0.844503 0.041107 0.104941 -0.526175 0.040283 +0.104941 -0.526175 0.040283 0.104777 -0.796392 0.012451 +0.104748 -0.844503 0.041107 0.104777 -0.796392 0.012451 +0.104777 -0.796392 0.012451 0.104941 -0.526175 0.040283 +0.104941 -0.526175 0.040283 0.104911 -0.574835 0.012085 +0.104777 -0.796392 0.012451 0.104911 -0.574835 0.012085 +0.104777 -0.796392 0.012451 0.104911 -0.574835 0.012085 +0.104911 -0.574835 0.012085 0.104809 -0.743338 -0.004852 +0.104777 -0.796392 0.012451 0.104809 -0.743338 -0.004852 +0.104809 -0.743338 -0.004852 0.104911 -0.574835 0.012085 +0.104911 -0.574835 0.012085 0.104879 -0.628073 -0.004944 +0.104809 -0.743338 -0.004852 0.104879 -0.628073 -0.004944 +0.104809 -0.743338 -0.004852 0.104879 -0.628073 -0.004944 +0.104879 -0.628073 -0.004944 0.104844 -0.685614 -0.010620 +0.104809 -0.743338 -0.004852 0.104844 -0.685614 -0.010620 +0.105346 0.143121 0.133667 0.105289 0.047907 0.133667 +0.105289 0.047907 0.133667 0.105272 0.020853 0.104599 +0.105346 0.143121 0.133667 0.105272 0.020853 0.104599 +0.105346 0.143121 0.133667 0.105272 0.020853 0.104599 +0.105272 0.020853 0.104599 0.105252 -0.012701 0.083313 +0.105346 0.143121 0.133667 0.105252 -0.012701 0.083313 +0.105346 0.143121 0.133667 0.105252 -0.012701 0.083313 +0.105252 -0.012701 0.083313 0.105321 0.101694 0.071915 +0.105346 0.143121 0.133667 0.105321 0.101694 0.071915 +0.105321 0.101694 0.071915 0.105252 -0.012701 0.083313 +0.105252 -0.012701 0.083313 0.105202 -0.095282 0.065918 +0.105321 0.101694 0.071915 0.105202 -0.095282 0.065918 +0.105321 0.101694 0.071915 0.105202 -0.095282 0.065918 +0.105202 -0.095282 0.065918 0.105106 -0.254172 0.041107 +0.105321 0.101694 0.071915 0.105106 -0.254172 0.041107 +0.105321 0.101694 0.071915 0.105106 -0.254172 0.041107 +0.105106 -0.254172 0.041107 0.105288 0.046991 0.026550 +0.105321 0.101694 0.071915 0.105288 0.046991 0.026550 +0.105288 0.046991 0.026550 0.105106 -0.254172 0.041107 +0.105106 -0.254172 0.041107 0.105135 -0.206061 0.012451 +0.105288 0.046991 0.026550 0.105135 -0.206061 0.012451 +0.105288 0.046991 0.026550 0.105135 -0.206061 0.012451 +0.105135 -0.206061 0.012451 0.105248 -0.019247 -0.001328 +0.105288 0.046991 0.026550 0.105248 -0.019247 -0.001328 +0.105248 -0.019247 -0.001328 0.105135 -0.206061 0.012451 +0.105135 -0.206061 0.012451 0.105167 -0.153006 -0.004852 +0.105248 -0.019247 -0.001328 0.105167 -0.153006 -0.004852 +0.105248 -0.019247 -0.001328 0.105167 -0.153006 -0.004852 +0.105167 -0.153006 -0.004852 0.105202 -0.095282 -0.010620 +0.105248 -0.019247 -0.001328 0.105202 -0.095282 -0.010620 +0.105113 -0.241812 0.500015 0.105088 -0.282782 0.466553 +0.105088 -0.282782 0.466553 0.105202 -0.095282 0.466553 +0.105113 -0.241812 0.500015 0.105202 -0.095282 0.466553 +0.105202 -0.095282 0.466553 0.105088 -0.282782 0.466553 +0.105088 -0.282782 0.466553 0.105158 -0.167059 0.452271 +0.105202 -0.095282 0.466553 0.105158 -0.167059 0.452271 +0.105158 -0.167059 0.452271 0.105088 -0.282782 0.466553 +0.105088 -0.282782 0.466553 0.105066 -0.318854 0.423294 +0.105158 -0.167059 0.452271 0.105066 -0.318854 0.423294 +0.105158 -0.167059 0.452271 0.105066 -0.318854 0.423294 +0.105066 -0.318854 0.423294 0.105122 -0.227484 0.410889 +0.105158 -0.167059 0.452271 0.105122 -0.227484 0.410889 +0.105122 -0.227484 0.410889 0.105066 -0.318854 0.423294 +0.105066 -0.318854 0.423294 0.105050 -0.345038 0.375549 +0.105122 -0.227484 0.410889 0.105050 -0.345038 0.375549 +0.105122 -0.227484 0.410889 0.105050 -0.345038 0.375549 +0.105050 -0.345038 0.375549 0.105096 -0.270331 0.345337 +0.105122 -0.227484 0.410889 0.105096 -0.270331 0.345337 +0.105096 -0.270331 0.345337 0.105050 -0.345038 0.375549 +0.105050 -0.345038 0.375549 0.105041 -0.360968 0.324142 +0.105096 -0.270331 0.345337 0.105041 -0.360968 0.324142 +0.105096 -0.270331 0.345337 0.105041 -0.360968 0.324142 +0.105041 -0.360968 0.324142 0.105038 -0.366278 0.269897 +0.105096 -0.270331 0.345337 0.105038 -0.366278 0.269897 +0.105096 -0.270331 0.345337 0.105038 -0.366278 0.269897 +0.105038 -0.366278 0.269897 0.105086 -0.285712 0.269165 +0.105096 -0.270331 0.345337 0.105086 -0.285712 0.269165 +0.105086 -0.285712 0.269165 0.105038 -0.366278 0.269897 +0.105038 -0.366278 0.269897 0.105095 -0.271796 0.190247 +0.105086 -0.285712 0.269165 0.105095 -0.271796 0.190247 +0.105095 -0.271796 0.190247 0.105038 -0.366278 0.269897 +0.105038 -0.366278 0.269897 0.105048 -0.348700 0.166809 +0.105095 -0.271796 0.190247 0.105048 -0.348700 0.166809 +0.105095 -0.271796 0.190247 0.105048 -0.348700 0.166809 +0.105048 -0.348700 0.166809 0.105119 -0.231879 0.125977 +0.105095 -0.271796 0.190247 0.105119 -0.231879 0.125977 +0.105119 -0.231879 0.125977 0.105048 -0.348700 0.166809 +0.105048 -0.348700 0.166809 0.105157 -0.168524 0.081665 +0.105119 -0.231879 0.125977 0.105157 -0.168524 0.081665 +0.105157 -0.168524 0.081665 0.105048 -0.348700 0.166809 +0.105048 -0.348700 0.166809 0.105080 -0.297064 0.080933 +0.105157 -0.168524 0.081665 0.105080 -0.297064 0.080933 +0.105157 -0.168524 0.081665 0.105080 -0.297064 0.080933 +0.105080 -0.297064 0.080933 0.105202 -0.095282 0.065918 +0.105157 -0.168524 0.081665 0.105202 -0.095282 0.065918 +0.105202 -0.095282 0.065918 0.105080 -0.297064 0.080933 +0.105080 -0.297064 0.080933 0.105106 -0.254172 0.041107 +0.105202 -0.095282 0.065918 0.105106 -0.254172 0.041107 +0.105202 -0.094550 0.543823 0.105170 -0.147330 0.538925 +0.105170 -0.147330 0.538925 0.105249 -0.017508 0.534119 +0.105202 -0.094550 0.543823 0.105249 -0.017508 0.534119 +0.105249 -0.017508 0.534119 0.105170 -0.147330 0.538925 +0.105170 -0.147330 0.538925 0.105140 -0.196539 0.524231 +0.105249 -0.017508 0.534119 0.105140 -0.196539 0.524231 +0.105249 -0.017508 0.534119 0.105140 -0.196539 0.524231 +0.105140 -0.196539 0.524231 0.105290 0.049554 0.505005 +0.105249 -0.017508 0.534119 0.105290 0.049554 0.505005 +0.105290 0.049554 0.505005 0.105140 -0.196539 0.524231 +0.105140 -0.196539 0.524231 0.105113 -0.241812 0.500015 +0.105290 0.049554 0.505005 0.105113 -0.241812 0.500015 +0.105290 0.049554 0.505005 0.105113 -0.241812 0.500015 +0.105113 -0.241812 0.500015 0.105202 -0.095282 0.466553 +0.105290 0.049554 0.505005 0.105202 -0.095282 0.466553 +0.105290 0.049554 0.505005 0.105202 -0.095282 0.466553 +0.105202 -0.095282 0.466553 0.105323 0.103983 0.458130 +0.105290 0.049554 0.505005 0.105323 0.103983 0.458130 +0.105323 0.103983 0.458130 0.105202 -0.095282 0.466553 +0.105202 -0.095282 0.466553 0.105253 -0.010687 0.448608 +0.105323 0.103983 0.458130 0.105253 -0.010687 0.448608 +0.105323 0.103983 0.458130 0.105253 -0.010687 0.448608 +0.105253 -0.010687 0.448608 0.105274 0.023737 0.426270 +0.105323 0.103983 0.458130 0.105274 0.023737 0.426270 +0.105323 0.103983 0.458130 0.105274 0.023737 0.426270 +0.105274 0.023737 0.426270 0.105291 0.052301 0.395142 +0.105323 0.103983 0.458130 0.105291 0.052301 0.395142 +0.105323 0.103983 0.458130 0.105291 0.052301 0.395142 +0.105291 0.052301 0.395142 0.105346 0.143121 0.395142 +0.105323 0.103983 0.458130 0.105346 0.143121 0.395142 +0.105289 0.047907 0.133667 0.105346 0.143121 0.133667 +0.105346 0.143121 0.133667 0.105272 0.020853 0.104599 +0.105289 0.047907 0.133667 0.105272 0.020853 0.104599 +0.105272 0.020853 0.104599 0.105346 0.143121 0.133667 +0.105346 0.143121 0.133667 0.105252 -0.012701 0.083313 +0.105272 0.020853 0.104599 0.105252 -0.012701 0.083313 +0.105252 -0.012701 0.083313 0.105346 0.143121 0.133667 +0.105346 0.143121 0.133667 0.105321 0.101694 0.071915 +0.105252 -0.012701 0.083313 0.105321 0.101694 0.071915 +0.105252 -0.012701 0.083313 0.105321 0.101694 0.071915 +0.105321 0.101694 0.071915 0.105202 -0.095282 0.065918 +0.105252 -0.012701 0.083313 0.105202 -0.095282 0.065918 +0.105202 -0.095282 0.065918 0.105321 0.101694 0.071915 +0.105321 0.101694 0.071915 0.105106 -0.254172 0.041107 +0.105202 -0.095282 0.065918 0.105106 -0.254172 0.041107 +0.105106 -0.254172 0.041107 0.105321 0.101694 0.071915 +0.105321 0.101694 0.071915 0.105288 0.046991 0.026550 +0.105106 -0.254172 0.041107 0.105288 0.046991 0.026550 +0.105106 -0.254172 0.041107 0.105288 0.046991 0.026550 +0.105288 0.046991 0.026550 0.105135 -0.206061 0.012451 +0.105106 -0.254172 0.041107 0.105135 -0.206061 0.012451 +0.105135 -0.206061 0.012451 0.105288 0.046991 0.026550 +0.105288 0.046991 0.026550 0.105248 -0.019247 -0.001328 +0.105135 -0.206061 0.012451 0.105248 -0.019247 -0.001328 +0.105135 -0.206061 0.012451 0.105248 -0.019247 -0.001328 +0.105248 -0.019247 -0.001328 0.105167 -0.153006 -0.004852 +0.105135 -0.206061 0.012451 0.105167 -0.153006 -0.004852 +0.105167 -0.153006 -0.004852 0.105248 -0.019247 -0.001328 +0.105248 -0.019247 -0.001328 0.105202 -0.095282 -0.010620 +0.105167 -0.153006 -0.004852 0.105202 -0.095282 -0.010620 +0.105113 -0.241812 0.500015 0.105202 -0.095282 0.466553 +0.105202 -0.095282 0.466553 0.105088 -0.282782 0.466553 +0.105113 -0.241812 0.500015 0.105088 -0.282782 0.466553 +0.105088 -0.282782 0.466553 0.105202 -0.095282 0.466553 +0.105202 -0.095282 0.466553 0.105158 -0.167059 0.452271 +0.105088 -0.282782 0.466553 0.105158 -0.167059 0.452271 +0.105088 -0.282782 0.466553 0.105158 -0.167059 0.452271 +0.105158 -0.167059 0.452271 0.105066 -0.318854 0.423294 +0.105088 -0.282782 0.466553 0.105066 -0.318854 0.423294 +0.105066 -0.318854 0.423294 0.105158 -0.167059 0.452271 +0.105158 -0.167059 0.452271 0.105122 -0.227484 0.410889 +0.105066 -0.318854 0.423294 0.105122 -0.227484 0.410889 +0.105066 -0.318854 0.423294 0.105122 -0.227484 0.410889 +0.105122 -0.227484 0.410889 0.105050 -0.345038 0.375549 +0.105066 -0.318854 0.423294 0.105050 -0.345038 0.375549 +0.105050 -0.345038 0.375549 0.105122 -0.227484 0.410889 +0.105122 -0.227484 0.410889 0.105096 -0.270331 0.345337 +0.105050 -0.345038 0.375549 0.105096 -0.270331 0.345337 +0.105050 -0.345038 0.375549 0.105096 -0.270331 0.345337 +0.105096 -0.270331 0.345337 0.105041 -0.360968 0.324142 +0.105050 -0.345038 0.375549 0.105041 -0.360968 0.324142 +0.105041 -0.360968 0.324142 0.105096 -0.270331 0.345337 +0.105096 -0.270331 0.345337 0.105038 -0.366278 0.269897 +0.105041 -0.360968 0.324142 0.105038 -0.366278 0.269897 +0.105038 -0.366278 0.269897 0.105096 -0.270331 0.345337 +0.105096 -0.270331 0.345337 0.105086 -0.285712 0.269165 +0.105038 -0.366278 0.269897 0.105086 -0.285712 0.269165 +0.105038 -0.366278 0.269897 0.105086 -0.285712 0.269165 +0.105086 -0.285712 0.269165 0.105095 -0.271796 0.190247 +0.105038 -0.366278 0.269897 0.105095 -0.271796 0.190247 +0.105038 -0.366278 0.269897 0.105095 -0.271796 0.190247 +0.105095 -0.271796 0.190247 0.105048 -0.348700 0.166809 +0.105038 -0.366278 0.269897 0.105048 -0.348700 0.166809 +0.105048 -0.348700 0.166809 0.105095 -0.271796 0.190247 +0.105095 -0.271796 0.190247 0.105119 -0.231879 0.125977 +0.105048 -0.348700 0.166809 0.105119 -0.231879 0.125977 +0.105048 -0.348700 0.166809 0.105119 -0.231879 0.125977 +0.105119 -0.231879 0.125977 0.105157 -0.168524 0.081665 +0.105048 -0.348700 0.166809 0.105157 -0.168524 0.081665 +0.105048 -0.348700 0.166809 0.105157 -0.168524 0.081665 +0.105157 -0.168524 0.081665 0.105080 -0.297064 0.080933 +0.105048 -0.348700 0.166809 0.105080 -0.297064 0.080933 +0.105080 -0.297064 0.080933 0.105157 -0.168524 0.081665 +0.105157 -0.168524 0.081665 0.105202 -0.095282 0.065918 +0.105080 -0.297064 0.080933 0.105202 -0.095282 0.065918 +0.105080 -0.297064 0.080933 0.105202 -0.095282 0.065918 +0.105202 -0.095282 0.065918 0.105106 -0.254172 0.041107 +0.105080 -0.297064 0.080933 0.105106 -0.254172 0.041107 +0.105170 -0.147330 0.538925 0.105202 -0.094550 0.543823 +0.105202 -0.094550 0.543823 0.105249 -0.017508 0.534119 +0.105170 -0.147330 0.538925 0.105249 -0.017508 0.534119 +0.105170 -0.147330 0.538925 0.105249 -0.017508 0.534119 +0.105249 -0.017508 0.534119 0.105140 -0.196539 0.524231 +0.105170 -0.147330 0.538925 0.105140 -0.196539 0.524231 +0.105140 -0.196539 0.524231 0.105249 -0.017508 0.534119 +0.105249 -0.017508 0.534119 0.105290 0.049554 0.505005 +0.105140 -0.196539 0.524231 0.105290 0.049554 0.505005 +0.105140 -0.196539 0.524231 0.105290 0.049554 0.505005 +0.105290 0.049554 0.505005 0.105113 -0.241812 0.500015 +0.105140 -0.196539 0.524231 0.105113 -0.241812 0.500015 +0.105113 -0.241812 0.500015 0.105290 0.049554 0.505005 +0.105290 0.049554 0.505005 0.105202 -0.095282 0.466553 +0.105113 -0.241812 0.500015 0.105202 -0.095282 0.466553 +0.105202 -0.095282 0.466553 0.105290 0.049554 0.505005 +0.105290 0.049554 0.505005 0.105323 0.103983 0.458130 +0.105202 -0.095282 0.466553 0.105323 0.103983 0.458130 +0.105202 -0.095282 0.466553 0.105323 0.103983 0.458130 +0.105323 0.103983 0.458130 0.105253 -0.010687 0.448608 +0.105202 -0.095282 0.466553 0.105253 -0.010687 0.448608 +0.105253 -0.010687 0.448608 0.105323 0.103983 0.458130 +0.105323 0.103983 0.458130 0.105274 0.023737 0.426270 +0.105253 -0.010687 0.448608 0.105274 0.023737 0.426270 +0.105274 0.023737 0.426270 0.105323 0.103983 0.458130 +0.105323 0.103983 0.458130 0.105346 0.143121 0.395142 +0.105274 0.023737 0.426270 0.105346 0.143121 0.395142 +0.105274 0.023737 0.426270 0.105346 0.143121 0.395142 +0.105346 0.143121 0.395142 0.105291 0.052301 0.395142 +0.105274 0.023737 0.426270 0.105291 0.052301 0.395142 +0.105688 0.707086 0.133667 0.105631 0.611871 0.133667 +0.105631 0.611871 0.133667 0.105614 0.584817 0.104599 +0.105688 0.707086 0.133667 0.105614 0.584817 0.104599 +0.105688 0.707086 0.133667 0.105614 0.584817 0.104599 +0.105614 0.584817 0.104599 0.105594 0.551263 0.083313 +0.105688 0.707086 0.133667 0.105594 0.551263 0.083313 +0.105688 0.707086 0.133667 0.105594 0.551263 0.083313 +0.105594 0.551263 0.083313 0.105663 0.665659 0.071915 +0.105688 0.707086 0.133667 0.105663 0.665659 0.071915 +0.105663 0.665659 0.071915 0.105594 0.551263 0.083313 +0.105594 0.551263 0.083313 0.105544 0.468683 0.065918 +0.105663 0.665659 0.071915 0.105544 0.468683 0.065918 +0.105663 0.665659 0.071915 0.105544 0.468683 0.065918 +0.105544 0.468683 0.065918 0.105447 0.309793 0.041107 +0.105663 0.665659 0.071915 0.105447 0.309793 0.041107 +0.105663 0.665659 0.071915 0.105447 0.309793 0.041107 +0.105447 0.309793 0.041107 0.105630 0.610956 0.026550 +0.105663 0.665659 0.071915 0.105630 0.610956 0.026550 +0.105630 0.610956 0.026550 0.105447 0.309793 0.041107 +0.105447 0.309793 0.041107 0.105477 0.357904 0.012451 +0.105630 0.610956 0.026550 0.105477 0.357904 0.012451 +0.105630 0.610956 0.026550 0.105477 0.357904 0.012451 +0.105477 0.357904 0.012451 0.105590 0.544717 -0.001328 +0.105630 0.610956 0.026550 0.105590 0.544717 -0.001328 +0.105590 0.544717 -0.001328 0.105477 0.357904 0.012451 +0.105477 0.357904 0.012451 0.105509 0.410959 -0.004852 +0.105590 0.544717 -0.001328 0.105509 0.410959 -0.004852 +0.105590 0.544717 -0.001328 0.105509 0.410959 -0.004852 +0.105509 0.410959 -0.004852 0.105544 0.468683 -0.010620 +0.105590 0.544717 -0.001328 0.105544 0.468683 -0.010620 +0.105455 0.322153 0.500015 0.105430 0.281183 0.466553 +0.105430 0.281183 0.466553 0.105544 0.468683 0.466553 +0.105455 0.322153 0.500015 0.105544 0.468683 0.466553 +0.105544 0.468683 0.466553 0.105430 0.281183 0.466553 +0.105430 0.281183 0.466553 0.105500 0.396906 0.452271 +0.105544 0.468683 0.466553 0.105500 0.396906 0.452271 +0.105500 0.396906 0.452271 0.105430 0.281183 0.466553 +0.105430 0.281183 0.466553 0.105408 0.245111 0.423294 +0.105500 0.396906 0.452271 0.105408 0.245111 0.423294 +0.105500 0.396906 0.452271 0.105408 0.245111 0.423294 +0.105408 0.245111 0.423294 0.105464 0.336481 0.410889 +0.105500 0.396906 0.452271 0.105464 0.336481 0.410889 +0.105464 0.336481 0.410889 0.105408 0.245111 0.423294 +0.105408 0.245111 0.423294 0.105392 0.218927 0.375549 +0.105464 0.336481 0.410889 0.105392 0.218927 0.375549 +0.105464 0.336481 0.410889 0.105392 0.218927 0.375549 +0.105392 0.218927 0.375549 0.105438 0.293634 0.345337 +0.105464 0.336481 0.410889 0.105438 0.293634 0.345337 +0.105438 0.293634 0.345337 0.105392 0.218927 0.375549 +0.105392 0.218927 0.375549 0.105383 0.202997 0.324142 +0.105438 0.293634 0.345337 0.105383 0.202997 0.324142 +0.105438 0.293634 0.345337 0.105383 0.202997 0.324142 +0.105383 0.202997 0.324142 0.105379 0.197687 0.269897 +0.105438 0.293634 0.345337 0.105379 0.197687 0.269897 +0.105438 0.293634 0.345337 0.105379 0.197687 0.269897 +0.105379 0.197687 0.269897 0.105428 0.278253 0.269165 +0.105438 0.293634 0.345337 0.105428 0.278253 0.269165 +0.105428 0.278253 0.269165 0.105379 0.197687 0.269897 +0.105379 0.197687 0.269897 0.105437 0.292169 0.190247 +0.105428 0.278253 0.269165 0.105437 0.292169 0.190247 +0.105437 0.292169 0.190247 0.105379 0.197687 0.269897 +0.105379 0.197687 0.269897 0.105390 0.215265 0.166809 +0.105437 0.292169 0.190247 0.105390 0.215265 0.166809 +0.105437 0.292169 0.190247 0.105390 0.215265 0.166809 +0.105390 0.215265 0.166809 0.105461 0.332086 0.125977 +0.105437 0.292169 0.190247 0.105461 0.332086 0.125977 +0.105461 0.332086 0.125977 0.105390 0.215265 0.166809 +0.105390 0.215265 0.166809 0.105499 0.395441 0.081665 +0.105461 0.332086 0.125977 0.105499 0.395441 0.081665 +0.105499 0.395441 0.081665 0.105390 0.215265 0.166809 +0.105390 0.215265 0.166809 0.105421 0.266901 0.080933 +0.105499 0.395441 0.081665 0.105421 0.266901 0.080933 +0.105499 0.395441 0.081665 0.105421 0.266901 0.080933 +0.105421 0.266901 0.080933 0.105544 0.468683 0.065918 +0.105499 0.395441 0.081665 0.105544 0.468683 0.065918 +0.105544 0.468683 0.065918 0.105421 0.266901 0.080933 +0.105421 0.266901 0.080933 0.105447 0.309793 0.041107 +0.105544 0.468683 0.065918 0.105447 0.309793 0.041107 +0.105544 0.469415 0.543823 0.105512 0.416635 0.538925 +0.105512 0.416635 0.538925 0.105591 0.546457 0.534119 +0.105544 0.469415 0.543823 0.105591 0.546457 0.534119 +0.105591 0.546457 0.534119 0.105512 0.416635 0.538925 +0.105512 0.416635 0.538925 0.105482 0.367426 0.524231 +0.105591 0.546457 0.534119 0.105482 0.367426 0.524231 +0.105591 0.546457 0.534119 0.105482 0.367426 0.524231 +0.105482 0.367426 0.524231 0.105632 0.613519 0.505005 +0.105591 0.546457 0.534119 0.105632 0.613519 0.505005 +0.105632 0.613519 0.505005 0.105482 0.367426 0.524231 +0.105482 0.367426 0.524231 0.105455 0.322153 0.500015 +0.105632 0.613519 0.505005 0.105455 0.322153 0.500015 +0.105632 0.613519 0.505005 0.105455 0.322153 0.500015 +0.105455 0.322153 0.500015 0.105544 0.468683 0.466553 +0.105632 0.613519 0.505005 0.105544 0.468683 0.466553 +0.105632 0.613519 0.505005 0.105544 0.468683 0.466553 +0.105544 0.468683 0.466553 0.105665 0.667947 0.458130 +0.105632 0.613519 0.505005 0.105665 0.667947 0.458130 +0.105665 0.667947 0.458130 0.105544 0.468683 0.466553 +0.105544 0.468683 0.466553 0.105595 0.553278 0.448608 +0.105665 0.667947 0.458130 0.105595 0.553278 0.448608 +0.105665 0.667947 0.458130 0.105595 0.553278 0.448608 +0.105595 0.553278 0.448608 0.105616 0.587701 0.426270 +0.105665 0.667947 0.458130 0.105616 0.587701 0.426270 +0.105665 0.667947 0.458130 0.105616 0.587701 0.426270 +0.105616 0.587701 0.426270 0.105633 0.616266 0.395142 +0.105665 0.667947 0.458130 0.105633 0.616266 0.395142 +0.105665 0.667947 0.458130 0.105633 0.616266 0.395142 +0.105633 0.616266 0.395142 0.105688 0.707086 0.395142 +0.105665 0.667947 0.458130 0.105688 0.707086 0.395142 +0.105631 0.611871 0.133667 0.105688 0.707086 0.133667 +0.105688 0.707086 0.133667 0.105614 0.584817 0.104599 +0.105631 0.611871 0.133667 0.105614 0.584817 0.104599 +0.105614 0.584817 0.104599 0.105688 0.707086 0.133667 +0.105688 0.707086 0.133667 0.105594 0.551263 0.083313 +0.105614 0.584817 0.104599 0.105594 0.551263 0.083313 +0.105594 0.551263 0.083313 0.105688 0.707086 0.133667 +0.105688 0.707086 0.133667 0.105663 0.665659 0.071915 +0.105594 0.551263 0.083313 0.105663 0.665659 0.071915 +0.105594 0.551263 0.083313 0.105663 0.665659 0.071915 +0.105663 0.665659 0.071915 0.105544 0.468683 0.065918 +0.105594 0.551263 0.083313 0.105544 0.468683 0.065918 +0.105544 0.468683 0.065918 0.105663 0.665659 0.071915 +0.105663 0.665659 0.071915 0.105447 0.309793 0.041107 +0.105544 0.468683 0.065918 0.105447 0.309793 0.041107 +0.105447 0.309793 0.041107 0.105663 0.665659 0.071915 +0.105663 0.665659 0.071915 0.105630 0.610956 0.026550 +0.105447 0.309793 0.041107 0.105630 0.610956 0.026550 +0.105447 0.309793 0.041107 0.105630 0.610956 0.026550 +0.105630 0.610956 0.026550 0.105477 0.357904 0.012451 +0.105447 0.309793 0.041107 0.105477 0.357904 0.012451 +0.105477 0.357904 0.012451 0.105630 0.610956 0.026550 +0.105630 0.610956 0.026550 0.105590 0.544717 -0.001328 +0.105477 0.357904 0.012451 0.105590 0.544717 -0.001328 +0.105477 0.357904 0.012451 0.105590 0.544717 -0.001328 +0.105590 0.544717 -0.001328 0.105509 0.410959 -0.004852 +0.105477 0.357904 0.012451 0.105509 0.410959 -0.004852 +0.105509 0.410959 -0.004852 0.105590 0.544717 -0.001328 +0.105590 0.544717 -0.001328 0.105544 0.468683 -0.010620 +0.105509 0.410959 -0.004852 0.105544 0.468683 -0.010620 +0.105455 0.322153 0.500015 0.105544 0.468683 0.466553 +0.105544 0.468683 0.466553 0.105430 0.281183 0.466553 +0.105455 0.322153 0.500015 0.105430 0.281183 0.466553 +0.105430 0.281183 0.466553 0.105544 0.468683 0.466553 +0.105544 0.468683 0.466553 0.105500 0.396906 0.452271 +0.105430 0.281183 0.466553 0.105500 0.396906 0.452271 +0.105430 0.281183 0.466553 0.105500 0.396906 0.452271 +0.105500 0.396906 0.452271 0.105408 0.245111 0.423294 +0.105430 0.281183 0.466553 0.105408 0.245111 0.423294 +0.105408 0.245111 0.423294 0.105500 0.396906 0.452271 +0.105500 0.396906 0.452271 0.105464 0.336481 0.410889 +0.105408 0.245111 0.423294 0.105464 0.336481 0.410889 +0.105408 0.245111 0.423294 0.105464 0.336481 0.410889 +0.105464 0.336481 0.410889 0.105392 0.218927 0.375549 +0.105408 0.245111 0.423294 0.105392 0.218927 0.375549 +0.105392 0.218927 0.375549 0.105464 0.336481 0.410889 +0.105464 0.336481 0.410889 0.105438 0.293634 0.345337 +0.105392 0.218927 0.375549 0.105438 0.293634 0.345337 +0.105392 0.218927 0.375549 0.105438 0.293634 0.345337 +0.105438 0.293634 0.345337 0.105383 0.202997 0.324142 +0.105392 0.218927 0.375549 0.105383 0.202997 0.324142 +0.105383 0.202997 0.324142 0.105438 0.293634 0.345337 +0.105438 0.293634 0.345337 0.105379 0.197687 0.269897 +0.105383 0.202997 0.324142 0.105379 0.197687 0.269897 +0.105379 0.197687 0.269897 0.105438 0.293634 0.345337 +0.105438 0.293634 0.345337 0.105428 0.278253 0.269165 +0.105379 0.197687 0.269897 0.105428 0.278253 0.269165 +0.105379 0.197687 0.269897 0.105428 0.278253 0.269165 +0.105428 0.278253 0.269165 0.105437 0.292169 0.190247 +0.105379 0.197687 0.269897 0.105437 0.292169 0.190247 +0.105379 0.197687 0.269897 0.105437 0.292169 0.190247 +0.105437 0.292169 0.190247 0.105390 0.215265 0.166809 +0.105379 0.197687 0.269897 0.105390 0.215265 0.166809 +0.105390 0.215265 0.166809 0.105437 0.292169 0.190247 +0.105437 0.292169 0.190247 0.105461 0.332086 0.125977 +0.105390 0.215265 0.166809 0.105461 0.332086 0.125977 +0.105390 0.215265 0.166809 0.105461 0.332086 0.125977 +0.105461 0.332086 0.125977 0.105499 0.395441 0.081665 +0.105390 0.215265 0.166809 0.105499 0.395441 0.081665 +0.105390 0.215265 0.166809 0.105499 0.395441 0.081665 +0.105499 0.395441 0.081665 0.105421 0.266901 0.080933 +0.105390 0.215265 0.166809 0.105421 0.266901 0.080933 +0.105421 0.266901 0.080933 0.105499 0.395441 0.081665 +0.105499 0.395441 0.081665 0.105544 0.468683 0.065918 +0.105421 0.266901 0.080933 0.105544 0.468683 0.065918 +0.105421 0.266901 0.080933 0.105544 0.468683 0.065918 +0.105544 0.468683 0.065918 0.105447 0.309793 0.041107 +0.105421 0.266901 0.080933 0.105447 0.309793 0.041107 +0.105512 0.416635 0.538925 0.105544 0.469415 0.543823 +0.105544 0.469415 0.543823 0.105591 0.546457 0.534119 +0.105512 0.416635 0.538925 0.105591 0.546457 0.534119 +0.105512 0.416635 0.538925 0.105591 0.546457 0.534119 +0.105591 0.546457 0.534119 0.105482 0.367426 0.524231 +0.105512 0.416635 0.538925 0.105482 0.367426 0.524231 +0.105482 0.367426 0.524231 0.105591 0.546457 0.534119 +0.105591 0.546457 0.534119 0.105632 0.613519 0.505005 +0.105482 0.367426 0.524231 0.105632 0.613519 0.505005 +0.105482 0.367426 0.524231 0.105632 0.613519 0.505005 +0.105632 0.613519 0.505005 0.105455 0.322153 0.500015 +0.105482 0.367426 0.524231 0.105455 0.322153 0.500015 +0.105455 0.322153 0.500015 0.105632 0.613519 0.505005 +0.105632 0.613519 0.505005 0.105544 0.468683 0.466553 +0.105455 0.322153 0.500015 0.105544 0.468683 0.466553 +0.105544 0.468683 0.466553 0.105632 0.613519 0.505005 +0.105632 0.613519 0.505005 0.105665 0.667947 0.458130 +0.105544 0.468683 0.466553 0.105665 0.667947 0.458130 +0.105544 0.468683 0.466553 0.105665 0.667947 0.458130 +0.105665 0.667947 0.458130 0.105595 0.553278 0.448608 +0.105544 0.468683 0.466553 0.105595 0.553278 0.448608 +0.105595 0.553278 0.448608 0.105665 0.667947 0.458130 +0.105665 0.667947 0.458130 0.105616 0.587701 0.426270 +0.105595 0.553278 0.448608 0.105616 0.587701 0.426270 +0.105616 0.587701 0.426270 0.105665 0.667947 0.458130 +0.105665 0.667947 0.458130 0.105688 0.707086 0.395142 +0.105616 0.587701 0.426270 0.105688 0.707086 0.395142 +0.105616 0.587701 0.426270 0.105688 0.707086 0.395142 +0.105688 0.707086 0.395142 0.105633 0.616266 0.395142 +0.105616 0.587701 0.426270 0.105633 0.616266 0.395142 +0.106030 1.271051 0.133667 0.105972 1.175836 0.133667 +0.105972 1.175836 0.133667 0.105956 1.148782 0.104599 +0.106030 1.271051 0.133667 0.105956 1.148782 0.104599 +0.106030 1.271051 0.133667 0.105956 1.148782 0.104599 +0.105956 1.148782 0.104599 0.105936 1.115228 0.083313 +0.106030 1.271051 0.133667 0.105936 1.115228 0.083313 +0.106030 1.271051 0.133667 0.105936 1.115228 0.083313 +0.105936 1.115228 0.083313 0.106005 1.229623 0.071915 +0.106030 1.271051 0.133667 0.106005 1.229623 0.071915 +0.106005 1.229623 0.071915 0.105936 1.115228 0.083313 +0.105936 1.115228 0.083313 0.105886 1.032648 0.065918 +0.106005 1.229623 0.071915 0.105886 1.032648 0.065918 +0.106005 1.229623 0.071915 0.105886 1.032648 0.065918 +0.105886 1.032648 0.065918 0.105789 0.873758 0.041107 +0.106005 1.229623 0.071915 0.105789 0.873758 0.041107 +0.106005 1.229623 0.071915 0.105789 0.873758 0.041107 +0.105789 0.873758 0.041107 0.105972 1.174921 0.026550 +0.106005 1.229623 0.071915 0.105972 1.174921 0.026550 +0.105972 1.174921 0.026550 0.105789 0.873758 0.041107 +0.105789 0.873758 0.041107 0.105818 0.921869 0.012451 +0.105972 1.174921 0.026550 0.105818 0.921869 0.012451 +0.105972 1.174921 0.026550 0.105818 0.921869 0.012451 +0.105818 0.921869 0.012451 0.105932 1.108682 -0.001328 +0.105972 1.174921 0.026550 0.105932 1.108682 -0.001328 +0.105932 1.108682 -0.001328 0.105818 0.921869 0.012451 +0.105818 0.921869 0.012451 0.105851 0.974924 -0.004852 +0.105932 1.108682 -0.001328 0.105851 0.974924 -0.004852 +0.105932 1.108682 -0.001328 0.105851 0.974924 -0.004852 +0.105851 0.974924 -0.004852 0.105886 1.032648 -0.010620 +0.105932 1.108682 -0.001328 0.105886 1.032648 -0.010620 +0.105797 0.886118 0.500015 0.105772 0.845148 0.466553 +0.105772 0.845148 0.466553 0.105886 1.032648 0.466553 +0.105797 0.886118 0.500015 0.105886 1.032648 0.466553 +0.105886 1.032648 0.466553 0.105772 0.845148 0.466553 +0.105772 0.845148 0.466553 0.105842 0.960870 0.452271 +0.105886 1.032648 0.466553 0.105842 0.960870 0.452271 +0.105842 0.960870 0.452271 0.105772 0.845148 0.466553 +0.105772 0.845148 0.466553 0.105750 0.809076 0.423294 +0.105842 0.960870 0.452271 0.105750 0.809076 0.423294 +0.105842 0.960870 0.452271 0.105750 0.809076 0.423294 +0.105750 0.809076 0.423294 0.105805 0.900446 0.410889 +0.105842 0.960870 0.452271 0.105805 0.900446 0.410889 +0.105805 0.900446 0.410889 0.105750 0.809076 0.423294 +0.105750 0.809076 0.423294 0.105734 0.782892 0.375549 +0.105805 0.900446 0.410889 0.105734 0.782892 0.375549 +0.105805 0.900446 0.410889 0.105734 0.782892 0.375549 +0.105734 0.782892 0.375549 0.105779 0.857599 0.345337 +0.105805 0.900446 0.410889 0.105779 0.857599 0.345337 +0.105779 0.857599 0.345337 0.105734 0.782892 0.375549 +0.105734 0.782892 0.375549 0.105725 0.766962 0.324142 +0.105779 0.857599 0.345337 0.105725 0.766962 0.324142 +0.105779 0.857599 0.345337 0.105725 0.766962 0.324142 +0.105725 0.766962 0.324142 0.105721 0.761652 0.269897 +0.105779 0.857599 0.345337 0.105721 0.761652 0.269897 +0.105779 0.857599 0.345337 0.105721 0.761652 0.269897 +0.105721 0.761652 0.269897 0.105770 0.842218 0.269165 +0.105779 0.857599 0.345337 0.105770 0.842218 0.269165 +0.105770 0.842218 0.269165 0.105721 0.761652 0.269897 +0.105721 0.761652 0.269897 0.105779 0.856134 0.190247 +0.105770 0.842218 0.269165 0.105779 0.856134 0.190247 +0.105779 0.856134 0.190247 0.105721 0.761652 0.269897 +0.105721 0.761652 0.269897 0.105732 0.779230 0.166809 +0.105779 0.856134 0.190247 0.105732 0.779230 0.166809 +0.105779 0.856134 0.190247 0.105732 0.779230 0.166809 +0.105732 0.779230 0.166809 0.105803 0.896051 0.125977 +0.105779 0.856134 0.190247 0.105803 0.896051 0.125977 +0.105803 0.896051 0.125977 0.105732 0.779230 0.166809 +0.105732 0.779230 0.166809 0.105841 0.959406 0.081665 +0.105803 0.896051 0.125977 0.105841 0.959406 0.081665 +0.105841 0.959406 0.081665 0.105732 0.779230 0.166809 +0.105732 0.779230 0.166809 0.105763 0.830866 0.080933 +0.105841 0.959406 0.081665 0.105763 0.830866 0.080933 +0.105841 0.959406 0.081665 0.105763 0.830866 0.080933 +0.105763 0.830866 0.080933 0.105886 1.032648 0.065918 +0.105841 0.959406 0.081665 0.105886 1.032648 0.065918 +0.105886 1.032648 0.065918 0.105763 0.830866 0.080933 +0.105763 0.830866 0.080933 0.105789 0.873758 0.041107 +0.105886 1.032648 0.065918 0.105789 0.873758 0.041107 +0.105886 1.033380 0.543823 0.105854 0.980600 0.538925 +0.105854 0.980600 0.538925 0.105933 1.110422 0.534119 +0.105886 1.033380 0.543823 0.105933 1.110422 0.534119 +0.105933 1.110422 0.534119 0.105854 0.980600 0.538925 +0.105854 0.980600 0.538925 0.105824 0.931390 0.524231 +0.105933 1.110422 0.534119 0.105824 0.931390 0.524231 +0.105933 1.110422 0.534119 0.105824 0.931390 0.524231 +0.105824 0.931390 0.524231 0.105973 1.177484 0.505005 +0.105933 1.110422 0.534119 0.105973 1.177484 0.505005 +0.105973 1.177484 0.505005 0.105824 0.931390 0.524231 +0.105824 0.931390 0.524231 0.105797 0.886118 0.500015 +0.105973 1.177484 0.505005 0.105797 0.886118 0.500015 +0.105973 1.177484 0.505005 0.105797 0.886118 0.500015 +0.105797 0.886118 0.500015 0.105886 1.032648 0.466553 +0.105973 1.177484 0.505005 0.105886 1.032648 0.466553 +0.105973 1.177484 0.505005 0.105886 1.032648 0.466553 +0.105886 1.032648 0.466553 0.106006 1.231912 0.458130 +0.105973 1.177484 0.505005 0.106006 1.231912 0.458130 +0.106006 1.231912 0.458130 0.105886 1.032648 0.466553 +0.105886 1.032648 0.466553 0.105937 1.117242 0.448608 +0.106006 1.231912 0.458130 0.105937 1.117242 0.448608 +0.106006 1.231912 0.458130 0.105937 1.117242 0.448608 +0.105937 1.117242 0.448608 0.105958 1.151666 0.426270 +0.106006 1.231912 0.458130 0.105958 1.151666 0.426270 +0.106006 1.231912 0.458130 0.105958 1.151666 0.426270 +0.105958 1.151666 0.426270 0.105975 1.180231 0.395142 +0.106006 1.231912 0.458130 0.105975 1.180231 0.395142 +0.106006 1.231912 0.458130 0.105975 1.180231 0.395142 +0.105975 1.180231 0.395142 0.106030 1.271051 0.395142 +0.106006 1.231912 0.458130 0.106030 1.271051 0.395142 +0.105972 1.175836 0.133667 0.106030 1.271051 0.133667 +0.106030 1.271051 0.133667 0.105956 1.148782 0.104599 +0.105972 1.175836 0.133667 0.105956 1.148782 0.104599 +0.105956 1.148782 0.104599 0.106030 1.271051 0.133667 +0.106030 1.271051 0.133667 0.105936 1.115228 0.083313 +0.105956 1.148782 0.104599 0.105936 1.115228 0.083313 +0.105936 1.115228 0.083313 0.106030 1.271051 0.133667 +0.106030 1.271051 0.133667 0.106005 1.229623 0.071915 +0.105936 1.115228 0.083313 0.106005 1.229623 0.071915 +0.105936 1.115228 0.083313 0.106005 1.229623 0.071915 +0.106005 1.229623 0.071915 0.105886 1.032648 0.065918 +0.105936 1.115228 0.083313 0.105886 1.032648 0.065918 +0.105886 1.032648 0.065918 0.106005 1.229623 0.071915 +0.106005 1.229623 0.071915 0.105789 0.873758 0.041107 +0.105886 1.032648 0.065918 0.105789 0.873758 0.041107 +0.105789 0.873758 0.041107 0.106005 1.229623 0.071915 +0.106005 1.229623 0.071915 0.105972 1.174921 0.026550 +0.105789 0.873758 0.041107 0.105972 1.174921 0.026550 +0.105789 0.873758 0.041107 0.105972 1.174921 0.026550 +0.105972 1.174921 0.026550 0.105818 0.921869 0.012451 +0.105789 0.873758 0.041107 0.105818 0.921869 0.012451 +0.105818 0.921869 0.012451 0.105972 1.174921 0.026550 +0.105972 1.174921 0.026550 0.105932 1.108682 -0.001328 +0.105818 0.921869 0.012451 0.105932 1.108682 -0.001328 +0.105818 0.921869 0.012451 0.105932 1.108682 -0.001328 +0.105932 1.108682 -0.001328 0.105851 0.974924 -0.004852 +0.105818 0.921869 0.012451 0.105851 0.974924 -0.004852 +0.105851 0.974924 -0.004852 0.105932 1.108682 -0.001328 +0.105932 1.108682 -0.001328 0.105886 1.032648 -0.010620 +0.105851 0.974924 -0.004852 0.105886 1.032648 -0.010620 +0.105797 0.886118 0.500015 0.105886 1.032648 0.466553 +0.105886 1.032648 0.466553 0.105772 0.845148 0.466553 +0.105797 0.886118 0.500015 0.105772 0.845148 0.466553 +0.105772 0.845148 0.466553 0.105886 1.032648 0.466553 +0.105886 1.032648 0.466553 0.105842 0.960870 0.452271 +0.105772 0.845148 0.466553 0.105842 0.960870 0.452271 +0.105772 0.845148 0.466553 0.105842 0.960870 0.452271 +0.105842 0.960870 0.452271 0.105750 0.809076 0.423294 +0.105772 0.845148 0.466553 0.105750 0.809076 0.423294 +0.105750 0.809076 0.423294 0.105842 0.960870 0.452271 +0.105842 0.960870 0.452271 0.105805 0.900446 0.410889 +0.105750 0.809076 0.423294 0.105805 0.900446 0.410889 +0.105750 0.809076 0.423294 0.105805 0.900446 0.410889 +0.105805 0.900446 0.410889 0.105734 0.782892 0.375549 +0.105750 0.809076 0.423294 0.105734 0.782892 0.375549 +0.105734 0.782892 0.375549 0.105805 0.900446 0.410889 +0.105805 0.900446 0.410889 0.105779 0.857599 0.345337 +0.105734 0.782892 0.375549 0.105779 0.857599 0.345337 +0.105734 0.782892 0.375549 0.105779 0.857599 0.345337 +0.105779 0.857599 0.345337 0.105725 0.766962 0.324142 +0.105734 0.782892 0.375549 0.105725 0.766962 0.324142 +0.105725 0.766962 0.324142 0.105779 0.857599 0.345337 +0.105779 0.857599 0.345337 0.105721 0.761652 0.269897 +0.105725 0.766962 0.324142 0.105721 0.761652 0.269897 +0.105721 0.761652 0.269897 0.105779 0.857599 0.345337 +0.105779 0.857599 0.345337 0.105770 0.842218 0.269165 +0.105721 0.761652 0.269897 0.105770 0.842218 0.269165 +0.105721 0.761652 0.269897 0.105770 0.842218 0.269165 +0.105770 0.842218 0.269165 0.105779 0.856134 0.190247 +0.105721 0.761652 0.269897 0.105779 0.856134 0.190247 +0.105721 0.761652 0.269897 0.105779 0.856134 0.190247 +0.105779 0.856134 0.190247 0.105732 0.779230 0.166809 +0.105721 0.761652 0.269897 0.105732 0.779230 0.166809 +0.105732 0.779230 0.166809 0.105779 0.856134 0.190247 +0.105779 0.856134 0.190247 0.105803 0.896051 0.125977 +0.105732 0.779230 0.166809 0.105803 0.896051 0.125977 +0.105732 0.779230 0.166809 0.105803 0.896051 0.125977 +0.105803 0.896051 0.125977 0.105841 0.959406 0.081665 +0.105732 0.779230 0.166809 0.105841 0.959406 0.081665 +0.105732 0.779230 0.166809 0.105841 0.959406 0.081665 +0.105841 0.959406 0.081665 0.105763 0.830866 0.080933 +0.105732 0.779230 0.166809 0.105763 0.830866 0.080933 +0.105763 0.830866 0.080933 0.105841 0.959406 0.081665 +0.105841 0.959406 0.081665 0.105886 1.032648 0.065918 +0.105763 0.830866 0.080933 0.105886 1.032648 0.065918 +0.105763 0.830866 0.080933 0.105886 1.032648 0.065918 +0.105886 1.032648 0.065918 0.105789 0.873758 0.041107 +0.105763 0.830866 0.080933 0.105789 0.873758 0.041107 +0.105854 0.980600 0.538925 0.105886 1.033380 0.543823 +0.105886 1.033380 0.543823 0.105933 1.110422 0.534119 +0.105854 0.980600 0.538925 0.105933 1.110422 0.534119 +0.105854 0.980600 0.538925 0.105933 1.110422 0.534119 +0.105933 1.110422 0.534119 0.105824 0.931390 0.524231 +0.105854 0.980600 0.538925 0.105824 0.931390 0.524231 +0.105824 0.931390 0.524231 0.105933 1.110422 0.534119 +0.105933 1.110422 0.534119 0.105973 1.177484 0.505005 +0.105824 0.931390 0.524231 0.105973 1.177484 0.505005 +0.105824 0.931390 0.524231 0.105973 1.177484 0.505005 +0.105973 1.177484 0.505005 0.105797 0.886118 0.500015 +0.105824 0.931390 0.524231 0.105797 0.886118 0.500015 +0.105797 0.886118 0.500015 0.105973 1.177484 0.505005 +0.105973 1.177484 0.505005 0.105886 1.032648 0.466553 +0.105797 0.886118 0.500015 0.105886 1.032648 0.466553 +0.105886 1.032648 0.466553 0.105973 1.177484 0.505005 +0.105973 1.177484 0.505005 0.106006 1.231912 0.458130 +0.105886 1.032648 0.466553 0.106006 1.231912 0.458130 +0.105886 1.032648 0.466553 0.106006 1.231912 0.458130 +0.106006 1.231912 0.458130 0.105937 1.117242 0.448608 +0.105886 1.032648 0.466553 0.105937 1.117242 0.448608 +0.105937 1.117242 0.448608 0.106006 1.231912 0.458130 +0.106006 1.231912 0.458130 0.105958 1.151666 0.426270 +0.105937 1.117242 0.448608 0.105958 1.151666 0.426270 +0.105958 1.151666 0.426270 0.106006 1.231912 0.458130 +0.106006 1.231912 0.458130 0.106030 1.271051 0.395142 +0.105958 1.151666 0.426270 0.106030 1.271051 0.395142 +0.105958 1.151666 0.426270 0.106030 1.271051 0.395142 +0.106030 1.271051 0.395142 0.105975 1.180231 0.395142 +0.105958 1.151666 0.426270 0.105975 1.180231 0.395142 diff --git a/1998/mkentry.c b/1998/mkentry.c new file mode 100644 index 000000000..4a3c74f5f --- /dev/null +++ b/1998/mkentry.c @@ -0,0 +1,1280 @@ +/* $Id: mkentry.c,v 1.6 1999/01/27 23:19:37 chongo Exp $ */ +/* + * Copyright (c) Leonid A. Broukhis, Jeremy Horn, Landon Curt Noll and + * Peter Seebach, 1998. + * + * All Rights Reserved. Permission for personal, education or non-profit use + * is granted provided this this copyright and notice are included in its + * entirety and remains unaltered. All other uses must receive prior + * permission in writing from the contest judges. + */ +/* + * mkentry - make an International Obfuscated C Code Contest entry + * + * usage: + * mkentry -r remarks -b build -p prog.c -o ioccc.entry + * + * -r remarks file with remarks about the entry + * -b build file containing how prog.c should be built + * -p prog.c the obfuscated program source file + * -o ioccc.entry ioccc entry output file + * + * compile by: + * cc mkentry.c -o mkentry + */ +/* + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* + * WARNING: + * + * This program attempts to implement the IOCCC rules. Every attempt + * has been made to make sure that this program produces an entry that + * conforms to the contest rules. In all cases, where this program + * differs from the contest rules, the contest rules will be used. Be + * sure to check with the contest rules before submitting an entry. + * + * FOR MORE INFORMATION: + * + * You may contact the judges by sending EMail to the following address: + * + * questions@ioccc.org (not the address for submitting entries) + * + * Questions and comments about the contest are welcome. + * + * You must include the words ``ioccc question'' in the subject of your + * EMail message when sending EMail to the judges. + * + * Entries must be sent to: + * + * entry@ioccc.org + * + * but be sure to follow the rules and read the guidelines first! + * + * You must include the words ``ioccc entry'' in the subject + * of your EMail when sending in your entry! Failure to do so may + * result in the loss of your entry! + * + * The rules and the guidelines may (and often do) change from year to + * year. You should be sure you have the current rules and guidelines + * prior to submitting entries. To obtain them, visit the following URL: + * + * http://www.ioccc.org + * + * Because contest rules change from year to year, one should only use this + * program for the year that it was intended. + */ + +#include +#include +#include +#include +#include +#include +#include + +/* logic */ +#ifndef TRUE +# define TRUE 1 +#endif /* TRUE */ +#ifndef FALSE +# define FALSE 0 +#endif /* FALSE */ +#define EOF_OK TRUE +#define EOF_NOT_OK FALSE + +/* global limits */ +#define RULE_YEAR 1998 /* NOTE: should match the current year */ +#define START_DATE "26Nov98 12:00 UTC" /* first confirmation received */ +#define MAX_COL 79 /* max column a line should hit */ +#define MAX_BUILD_SIZE 256 /* max how to build size */ +#define MAX_PROGRAM_SIZE 3217 /* max program source size */ +#define MAX_PROGRAM_SIZE2 1536 /* max program source size not counting + whitespace and {}; not followed by + whitespace or EOF */ +#define MAX_TITLE_LEN 31 /* max chars in the title */ +#define MAX_ENTRY_LEN 1 /* max length in the entry input line */ +#define MAX_ENTRY 8 /* max number of entries per person per year */ +#define MAX_FILE_LEN 1024 /* max filename length for a info file */ + +/* where to send entries */ +#define ENTRY_ADDR "entry@ioccc.org" + +/* uuencode process - assumes ASCII */ +#define UUENCODE(c) ((c) ? encode_str[(int)(c)&0x3f] : '`') +#define UUENCODE_LEN 45 /* max uuencode chunk size */ +#define UUINFO_MODE 0444 /* mode of an info file's uuencode file */ +#define UUBUILD_MODE 0444 /* mode of the build file's uuencode file */ +#define UUBUILD_NAME "build" /* name for the build file's uuencode file */ +#define UUPROG_MODE 0444 /* mode of the program's uuencode file */ +#define UUPROG_NAME "prog.c" /* name for the program's uuencode file */ + +/* encode_str[(char)val] is the uuencoded character of val */ +char encode_str[] = "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"; + +/* global declarations */ +char *program; /* our name */ +long start_time; /* the startup time */ + +/* forward declarations */ +void parse_args(int argc, char **argv, char **rname, + char **bname, char **pname, char **oname); +void usage(int exitval); +FILE *open_remark(char *filename); +FILE *open_build(char *filename); +FILE *open_program(char *filename); +FILE *open_output(char *filename); +void output_entry(FILE *output, char *oname); +void output_remark(FILE *output, char *oname, FILE *remark, char *rname); +void output_author(FILE *output, char *oname); +void output_info(FILE *output, char *oname); +void output_build(FILE *output, char *oname, FILE *build, char *bname); +void output_program(FILE *output, char *oname, FILE *prog, char *pname); +void output_end(FILE *output, char *oname); +int get_line(char *buf, int siz, int maxcol); +void output_till_dot(FILE *output, char *oname, char *leader); +int col_len(char *string); +void check_io(FILE *stream, char *name, int eof_ok); +void uuencode(FILE *output, char *oname, FILE *infile, + char *iname, int umode, char *uname); + +int +main(argc, argv) + int argc; /* arg count */ + char **argv; /* the args */ +{ + FILE *remark=NULL; /* open remarks stream */ + FILE *build=NULL; /* open build file stream */ + FILE *prog=NULL; /* open program stream */ + FILE *output=NULL; /* open output stream */ + char *rname=NULL; /* file with remarks about the entry */ + char *bname=NULL; /* file containing how prog.c should be built */ + char *pname=NULL; /* the obfuscated program source file */ + char *oname=NULL; /* ioccc entry output file */ + struct tm *tm; /* startup time structure */ + + /* + * check on the year + */ + start_time = time((long *)0); + tm = gmtime(&start_time); + if (tm->tm_year != RULE_YEAR-1900 && + (tm->tm_year != RULE_YEAR-1900+1 || tm->tm_mon != 0)) { + fprintf(stderr, + "%s: WARNING: this program applies to %d, which may differ from %d\n\n", + argv[0], RULE_YEAR, 1900+tm->tm_year); + } + + /* + * parse the command line args + */ + parse_args(argc, argv, &rname, &bname, &pname, &oname); + + /* + * open/check the input and output files + * + * We open and truncate the output file first, in case it is the same + * as one of the input files. + */ + output = open_output(oname); + remark = open_remark(rname); + build = open_build(bname); + prog = open_program(pname); + if (output==NULL || remark==NULL || build==NULL || prog==NULL) { + exit(1); + } + + /* + * output each section + */ + output_entry(output, oname); + output_remark(output, oname, remark, rname); + output_author(output, oname); + output_info(output, oname); + output_build(output, oname, build, bname); + output_program(output, oname, prog, pname); + output_end(output, oname); + + /* + * flush the output + */ + if (fflush(output) == EOF) { + fprintf(stderr, "%s: flush error in %s: ", program, oname); + perror(""); + exit(2); + } + + /* + * final words + */ + printf("\nYour entry can be found in %s. You should check this file\n", + oname); + printf("correct any problems and verify that the uudecode utility will\n"); + printf("correctly decode your build file and program.\n\n"); + printf("This program has been provided as a guide for submitters. In\n"); + printf("cases where it conflicts with the rules, the rules shall apply.\n"); + printf("It is your responsibility to ensure that your entry conforms to\n"); + printf("the current rules.\n\n"); + printf("EMail your entries to:\n"); + printf("\t%s\n\n", ENTRY_ADDR); + printf("Please use the following subject when you EMail your entry:\n"); + printf("\tioccc entry\n\n"); + /* all done */ + return 0; +} + +/* + * parse_args - parse the command line args + * + * usage: + * argc arg count + * argv the args + * rname file with remarks about the entry + * bname file containing how prog.c should be built + * pname the obfuscated program source file + * oname ioccc entry output file + * + * Given the command line args, this function parses them and sets the + * required name flags. This function will return only if the command + * line syntax is correct. + */ +void +parse_args(int argc, char **argv, char **rname, + char **bname, char **pname, char **oname) +{ + char *optarg; /* -flag option operand */ + int flagname; /* the name of the -flag */ + int i; + + /* + * Not everyone has getopt, so we must parse args by hand. + */ + program = argv[0]; + for (i=1; i < argc; ++i) { + + /* determine the flagname */ + if (argv[i][0] != '-') { + usage(1); + /*NOTREACHED*/ + } + flagname = (int)argv[i][1]; + + /* determine the flag's operand */ + if (flagname != '\0' && argv[i][2] != '\0') { + optarg = &argv[i][2]; + } else { + if (i+1 >= argc) { + usage(2); + /*NOTREACHED*/ + } else { + optarg = argv[++i]; + } + } + + /* save the flag's operand in the correct global variable */ + switch (flagname) { + case 'r': + *rname = optarg; + break; + case 'b': + *bname = optarg; + break; + case 'p': + *pname = optarg; + break; + case 'o': + *oname = optarg; + break; + default: + usage(3); + /*NOTREACHED*/ + } + } + + /* + * verify that we have all of the required flags + */ + if (*rname == NULL || *bname == NULL || *pname == NULL || *oname == NULL) { + usage(4); + /*NOTREACHED*/ + } + return; +} + +/* + * usage - print a usage message and exit + * + * usage: + * exitval exit with this value + * + * This function does not return. + */ +void +usage(int exitval) +{ + fprintf(stderr, + "usage: %s -r remarks -b build -p prog.c -o ioccc.entry\n\n", program); + fprintf(stderr, "\t-r remarks\tfile with remarks about the entry\n"); + fprintf(stderr, "\t-b build\tfile containing how prog.c should be built\n"); + fprintf(stderr, "\t-p prog.c\tthe obfuscated program source file\n"); + fprintf(stderr, "\t-o ioccc.entry\tioccc entry output file\n"); + exit(exitval); +} + +/* + * open_remark - open/check the remark file + * + * usage: + * filename remark filename + * + * The remark file should be indented by 4 spaces, and should not extend + * beyond column MAX_COL. These are not requirements, so we only warn. + * + * This function returns NULL on I/O or format error. + */ +FILE * +open_remark(char *filename) +{ + FILE *stream; /* the opened file stream */ + char buf[BUFSIZ+1]; /* input buffer */ + int toolong=0; /* number of lines that are too long */ + int non_indent=0; /* number of lines not indented by 4 spaces */ + + /* + * open the remark input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open remark file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * look at each line + */ + while (fgets(buf, BUFSIZ, stream) != NULL) { + + /* count lines that do not start with 4 spaces */ + if (buf[0] != '\n' && strncmp(buf, " ", 4) != 0) { + ++non_indent; + } + + /* count long lines */ + if (col_len(buf) > MAX_COL) { + /* found a line that is too long */ + ++toolong; + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* note long lines if needed */ + if (toolong > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s extend beyond the 80th column\n", + program, toolong, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* note non-indented lines, if needed */ + if (non_indent > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s are not indented by 4 spaces\n", + program, non_indent, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_build - open/check the build file + * + * usage: + * filename build filename + * + * The how to build file must not be longer than MAX_BUILD_SIZE bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_build(char *filename) +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + + /* + * open the how to build input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_BUILD_SIZE) { + fprintf(stderr, + "%s: FATAL: the how to build file: %s, is %ld bytes long\n", + program, filename, (long) statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_BUILD_SIZE); + return(NULL); + } + + /* return the open file */ + return(stream); +} + +/* + * open_program - open/check the program source file + * + * usage: + * filename source filename + * + * The program source file must be <= 3217 bytes. The number of + * non-whitespace and }{; chars not followed by whitespace must + * be <= 1536 bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_program(char *filename) +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + int count; /* special count size */ + int c; /* the character read */ + + /* + * open the program source input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open program source file: %s: ", + program, filename); + perror(""); + exit(7); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat program source file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_PROGRAM_SIZE) { + fprintf(stderr, + "%s: FATAL: the program source file: %s, is %ld bytes long\n", + program, filename, (long) statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_PROGRAM_SIZE); + return(NULL); + } + + /* + * count the non-whitespace, non {}; followed by whitespace chars + */ + count = 0; + c = 0; + while ((c=fgetc(stream)) != EOF) { + /* look at non-whitespace */ + if (!isascii(c) || !isspace(c)) { + switch (c) { + case '{': /* count if not followed by EOF or whitespace */ + case '}': + case ';': + /* peek at next char */ + c = fgetc(stream); + if (c != EOF && isascii(c) && !isspace(c)) { + /* not followed by whitespace or EOF, count it */ + ungetc(c, stream); + ++count; + } + break; + default: + ++count; + break; + } + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* look at the special size */ + if (count > MAX_PROGRAM_SIZE2) { + fprintf(stderr, + "%s: FATAL: the number of bytes that are non-whitespace, and\n", + program); + fprintf(stderr, + "%s: that are not '{', '}', ';' followed by whitespace\n", + program); + fprintf(stderr, + "%s: or EOF must be <= %d bytes\n", + program, MAX_PROGRAM_SIZE2); + fprintf(stderr, + "%s: in %s, %d bytes were found\n", + program, filename, count); + return(NULL); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_output - open/check the entry output file + * + * usage: + * filename output filename + * + * This function returns NULL on open error. + */ +FILE * +open_output(char *filename) +{ + FILE *stream; /* the opened file stream */ + + /* + * open the ioccc entry output file + */ + stream = fopen(filename, "w"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open ioccc entry file for output: %s: ", + program, filename); + perror(""); + exit(8); + } + + /* return the open file */ + return(stream); +} + +/* + * output_entry - output the ---entry--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_entry(FILE *output, char *oname) +{ + char title[MAX_TITLE_LEN+1+1]; /* the entry's title */ + char buf[MAX_COL+1+1]; /* I/O buffer */ + int entry=0; /* entry number */ + int ret; /* fields processed by fscanf */ + int ok_line=0; /* 0 => the line is not ok */ + char skip; /* input to skip */ + time_t epoch_sec; /* seconds since the epoch */ + char *p; + + /* + * write the start of the section + */ + fprintf(output, "---entry---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the rule year + */ + fprintf(output, "rule:\t%d\n", RULE_YEAR); + check_io(output, oname, EOF_NOT_OK); + + /* determine if this is a fix */ + printf("Is this a fix, update or resubmittion to a "); + printf("previous entry (enter y or n)? "); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + if (buf[0] == 'y') { + fprintf(output, "fix:\ty\n"); + check_io(output, oname, EOF_NOT_OK); + printf("\nBe sure that the title and entry number that you give\n"); + printf("are the same of as the entry you are replacing\n"); + } else { + fprintf(output, "fix:\tn\n"); + check_io(output, oname, EOF_NOT_OK); + } + + /* + * write the title + */ + printf("\nThe first character of your title should match [a-zA-Z0-9_=]\n"); + printf("The next 0 to %d characters should match [a-zA-Z0-9_=+-]\n\n", + MAX_TITLE_LEN-1); + printf("It is suggested, but not required, that the title should\n"); + printf("incorporate your username; in the\n"); + printf("case of multiple authors, consider using parts of the usernames\n"); + printf("of the authors.\n\n"); + printf("enter your title: "); + do { + /* prompt and read a line */ + if ((ok_line = get_line(title, MAX_TITLE_LEN+1, MAX_COL-9)) <= 0) { + printf("\ntitle is too long, please re-enter: "); + continue; + } + + /* verify the pattern, not everyone has regexp, so do it by hand */ + if (!isascii((int)title[0]) || + !(isalnum((int)title[0]) || title[0] == '_' || title[0] == '=')) { + printf("\ninvalid first character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } else { + for (p=(&title[1]); *p != '\0' && *p != '\n'; ++p) { + if (!isascii((int)*p) || + !(isalnum((int)*p) || + *p == '_' || *p == '=' || *p == '+' || *p == '-')) { + printf("\ninvalid character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } + } + } + } while (ok_line <= 0); + fprintf(output, "title:\t%s", title); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the entry number + */ + printf("\nEach person may submit up to %d entries per year.\n\n", + MAX_ENTRY); + printf("enter an entry number from 0 to %d inclusive: ", MAX_ENTRY-1); + do { + /* get a valid input line */ + fflush(stdout); + ret = fscanf(stdin, "%d[\n]", &entry); + check_io(stdin, "stdin", EOF_NOT_OK); + /* skip over input until newline is found */ + do { + skip = fgetc(stdin); + check_io(stdin, "stdin", EOF_NOT_OK); + if (skip != '\n') { + /* bad text in input, invalidate entry number */ + entry = -1; + } + } while (skip != '\n'); + + /* check if we have a number, and if it is in range */ + if (ret != 1 || entry < 0 || entry > MAX_ENTRY-1) { + printf( + "\nThe entry number must be between 0 and %d inclusive\n\n", + MAX_ENTRY-1); + printf("enter the entry number: "); + } + } while (ret != 1 || entry < 0 || entry > MAX_ENTRY-1); + fprintf(output, "entry:\t%d\n", entry); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the submission date + */ + /* returns a newline */ + epoch_sec = time(NULL); + fprintf(output, "date:\t%s", asctime(gmtime(&epoch_sec))); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the OS/machine host information + */ + printf( + "\nEnter the machine(s) and OS(s) under which your entry was tested.\n"); + output_till_dot(output, oname, "host:"); +} + +/* + * output_remark - output the ---remark--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * remark stream to the file containing remark text + * rname name of the remark file + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_remark(FILE *output, char *oname, FILE *remark, char *rname) +{ + char buf[BUFSIZ+1]; /* input/output buffer */ + + /* + * write the start of the section + */ + fprintf(output, "---remark---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * copy the remark file to the section + */ + while (fgets(buf, BUFSIZ, remark) != NULL) { + fputs(buf, output); + check_io(output, oname, EOF_NOT_OK); + } + check_io(remark, rname, EOF_OK); + + /* be sure that the remark section ends with a newline */ + if (buf[strlen(buf)-1] != '\n') { + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + } +} + +/* + * output_author - output the ---author--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * + * Read the needed information from stdin, and write the author section. + * If multiple authors exist, multiple author sections will be written. + */ +void +output_author(FILE *output, char *oname) +{ + char buf[MAX_COL+1+1]; /* I/O buffer */ + int more_auths; /* TRUE => more authors to note */ + int auth_cnt=0; /* number of authors processed */ + + /* + * prompt the user for the author section + */ + printf("\nEnter information about each author. If your entry is after\n"); + printf("%s and before the contest deadline, the judges\n", START_DATE); + printf("will attempt to EMail back a confirmation to the first author\n"); + + /* + * place author information for each author in an individual section + */ + do { + + /* write the start of the section */ + fprintf(output, "---author---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* write the author */ + printf("\nAuthor #%d name: ", ++auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nname too long, please re-enter: "); + } + fprintf(output, "name:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the organization */ + printf("\nEnter the School/Company/Organization of author #%d\n", + auth_cnt); + printf("\nAuthor #%d org: ", auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter: "); + } + fprintf(output, "org:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the address */ + printf( + "\nEnter the postal address for author #%d. Be sure to include\n", + auth_cnt); + printf("your country and do not include your name.\n"); + output_till_dot(output, oname, "addr:"); + + /* write the EMail address */ + printf( + "\nEnter the EMail address for author #%d. Use an address from\n", + auth_cnt); + printf( + "a registered domain or well known site. If you give several\n"); + printf("forms, list them one per line.\n"); + output_till_dot(output, oname, "email:"); + + /* write the home page URL */ + printf( + "\nEnter the fully qualified home page URL for author #%d\n", + auth_cnt); + printf("including the http: part or type none: "); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0 || + (strncmp(buf, "http://", sizeof("http://")-1) != 0 && + strcmp(buf, "none\n") != 0)) { + printf("\nURL too long, does not begin with http:// or\n"); + printf("is not the word none\n"); + } + fprintf(output, "url:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the anonymous status */ + printf("\nShould author #%d remain anonymous (enter y or n)? ", + auth_cnt); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + fprintf(output, "anon:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* determine if there is another author */ + printf("\nIs there another author (enter y or n)? "); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + if (buf[0] == 'y') { + more_auths = TRUE; + } else { + more_auths = FALSE; + } + } while (more_auths == TRUE); + return; +} + +/* + * output_info - output the ---info--- section(s) + * + * usage: + * output entry's output file stream + * oname name of the output file + * + * Read the needed information from stdin, and write the info section. + * If multiple info files exist, multiple info sections will be written. + */ +void +output_info(FILE *output, char *oname) +{ + char infoname[MAX_FILE_LEN+1]; /* filename buffer */ + char yorn[1+1]; /* y or n answer */ + char *uuname; /* name to uuencode as */ + FILE *infile; /* info file stream */ + + /* + * prompt the user for info information + */ + printf("\nInfo files should be used only to supplement your entry.\n"); + printf("For example, info files may provide sample input or detailed\n"); + printf("information about your entry. Because they are supplemental,\n"); + printf("the entry should not require them to exist.\n\n"); + + /* + * while there is another info file to save, uuencode it + */ + printf("Do you have a info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + while (yorn[0] == 'y') { + + /* read the filename */ + printf("\nEnter the info filename: "); + while (get_line(infoname, MAX_FILE_LEN+1, 0) <= 0) { + printf("\nInfo filename too long, please re-enter: "); + } + + /* compute the basename of the info filename */ + /* remove the trailing newline */ + uuname = &infoname[strlen(infoname)-1]; + *uuname = '\0'; + /* avoid rindex/shrrchr compat issues, do it by hand */ + for (--uuname; uuname > infoname; --uuname) { + if (*uuname == '/') { + ++uuname; + break; + } + } + + /* attempt to open the info file */ + infile = fopen(infoname, "r"); + if (infile == NULL) { + fprintf(stderr, "\n%s: cannot open info file: %s: ", + program, infoname); + perror(""); + continue; + } + + /* + * write the start of the section + */ + fprintf(output, "---info---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* uuencode the info file */ + uuencode(output, oname, infile, infoname, UUINFO_MODE, uuname); + + printf("\nDo you have another info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + }; + return; +} + +/* + * output_build - output the ---build--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * build open build file stream + * bname name of the build file + * + * Read the needed information from stdin, and write the build section. + */ +void +output_build(FILE *output, char *oname, FILE *build, char *bname) +{ + /* + * write the start of the section + */ + fprintf(output, "---build---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, build, bname, UUBUILD_MODE, UUBUILD_NAME); + return; +} + +/* + * output_program - output the ---program--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * prog open program stream + * pname name of program file + * + * Read the needed information form stdin, and write the program section. + */ +void +output_program(FILE *output, char *oname, FILE *prog, char *pname) +{ + /* + * write the start of the section + */ + fprintf(output, "---program---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, prog, pname, UUPROG_MODE, UUPROG_NAME); + return; +} + +/* + * output_end - output the ---end--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * + * Read the needed information form stdin, and write the 'end section'. + */ +void +output_end(FILE *output, char *oname) +{ + /* + * write the final section terminator + */ + fprintf(output, "---end---\n"); + check_io(output, oname, EOF_NOT_OK); + return; +} + +/* + * get_line - get an answer from stdin + * + * usage: + * buf input buffer + * siz length of input, including the newline + * maxcol max col allowed, 0 => disable check + * + * This function will flush stdout, in case a prompt is pending, and + * read in the answer. + * + * This function returns 0 if the line is too long, of the length of the + * line (including the newline) of the line was ok. This function does + * not return if ERROR or EOF. + */ +int +get_line(char *buf, int siz, int maxcol) +{ + int length; /* the length of the input line */ + + /* flush terminal output */ + fflush(stdout); + + /* read the line */ + if (fgets(buf, siz+1, stdin) == NULL) { + /* report the problem */ + check_io(stdin, "stdin", EOF_NOT_OK); + } + + /* look for the newline */ + length = strlen(buf); + if (buf[length-1] != '\n') { + int eatchar; /* the char being eaten */ + + /* no newline found, line must be too long, eat the rest of the line */ + do { + eatchar = fgetc(stdin); + } while (eatchar != EOF && eatchar != '\n'); + check_io(stdin, "stdin", EOF_NOT_OK); + + /* report the situation */ + return 0; + } + + /* watch for long lines, if needed */ + if (maxcol > 0 && (length > maxcol || col_len(buf) > maxcol)) { + /* report the situation */ + return 0; + } + + /* return length */ + return length; +} + +/* + * output_till_dot - output a set of lines until '.' by itself is read + * + * usage: + * output entry's output file stream + * oname name of the output file + * leader the lead text for the first line + * + * This routine will read a set of lines until (but not including) + * a single line with '.' is read. The format of the output is: + * + * leader:\tfirst line + * \tnext line + * \tnext line + * ... + * + * This routine will not return if I/O error or EOF. + */ +void +output_till_dot(FILE *output, char *oname, char *leader) +{ + char buf[BUFSIZ+1]; /* input buffer */ + int count; /* lines read */ + int done=FALSE; /* TRUE => finished reading input */ + + /* instruct the user on how to input */ + printf("\nTo end input, enter a line with a single period.\n"); + + /* read lines until '.' or EOF */ + count = 0; + while (!done) { + /* issue the prompt */ + printf("%s\t", (count>0) ? "" : leader); + fflush(stdout); + + /* get the line */ + if (get_line(buf, BUFSIZ, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter:\n\t"); + continue; + } + + /* note if '.' was read */ + if (strcmp(buf, ".\n") == 0) { + done = TRUE; + } + + /* write line if we read something */ + if (!done) { + fprintf(output, "%s\t%s", (count++>0) ? "" : leader, buf); + check_io(output, oname, EOF_NOT_OK); + } + } + + /* if no lines read, at least output something */ + if (count <= 0) { + fprintf(output, "%s\t.\n", leader); + check_io(output, oname, EOF_NOT_OK); + } + return; +} + +/* + * col_len - determine the highest that a string would reach + * + * usage: + * string the string to examine + * + * Given a string, this routine returns that a string would reach + * if the string were printed at column 1. Tab stops are assumed + * to start at 9, 17, 25, 33, ... + */ +int +col_len(char *string) +{ + int col; /* current column */ + char *p; /* current char */ + + /* scan the string */ + for (col=0, p=string; *p != '\0' && *p != '\n'; ++p) { + /* note the column shift */ + col = (*p=='\t') ? 1+((col+8)/8*8) : col+1; + } + if (*p == '\n') { + --col; + } + + /* return the highest column */ + return col; +} + +/* + * check_io - check for EOF or I/O error on a stream + * + * usage: + * stream the stream to check + * name the name of this stream + * eof_ok EOF_OK or EOF_NOT_OK + * + * Does not return if EOF or I/O error. + */ +void +check_io(FILE *stream, char *name, int eof_ok) +{ + /* test for I/O error */ + if (ferror(stream)) { + fprintf(stderr, "%s: error on %s: ", program, name); + perror(""); + exit(1); + + /* test for EOF */ + } else if (eof_ok == EOF_NOT_OK && feof(stream)) { + fprintf(stderr, "%s: EOF on %s\n", program, name); + exit(1); + } + return; +} + +/* + * uuencode - uuencode a file + * + * usage: + * output output file stream + * oname output filename + * infile input file stream + * iname input filename + * umode the mode to put on the uuencode file + * uname name to put on the uuencode file + * + * Perform the uuencoding process identical to the process performed + * by the uuencode(1) utility. + * + * This routine implements the algorithm described in the uuencode(5) + * 4.3BSD Reno man page. + */ +void +uuencode(FILE *output, char *oname, FILE *infile, + char *iname, int umode, char *uname) +{ + char buf[UUENCODE_LEN+1]; /* the uuencode buffer */ + int read_len; /* actual number of chars read */ + int val; /* 6 bit chunk from buf */ + char filler='\0'; /* filler uuencode pad text */ + char *p; + + /* + * output the initial uuencode header + */ + fprintf(output, "begin %o %s\n", umode, uname); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + + /* + * We will process UUENCODE_LEN chars at a time, forming + * a single output line each time. + */ + while ((read_len=fread(buf,sizeof(buf[0]),UUENCODE_LEN,infile)) > 0) { + + /* + * the first character is the length character + */ + fputc(UUENCODE(read_len), output); + check_io(output, oname, EOF_NOT_OK); + + /* + * We will convert 24 bits at a time. Thus we will convert + * 3 sets of 8 bits into 4 sets of uuencoded 6 bits. + */ + for (p=buf; read_len>0; read_len-=3, p+=3) { + + /* bits 0 to 5 */ + val = (p[0]>>2)&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 6 to 11 */ + val = ((p[0]<<4)&0x30) | ((p[1]>>4)&0x0f); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 12 to 17 */ + val = ((p[1]<<2)&0x3c) | ((p[2]>>6)&0x03); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 18 to 23 */ + val = p[2]&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + } + + /* end of UUENCODE_LEN line */ + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer (don't depend on bzero() or memset()) + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + } + + /* check the last read on the input file */ + check_io(infile, iname, EOF_OK); + + /* write end of uuencode file */ + fprintf(output, "%c\nend\n", UUENCODE(filler)); + check_io(output, oname, EOF_NOT_OK); +} diff --git a/1998/mountains.sc b/1998/mountains.sc new file mode 100644 index 000000000..f01534fd5 --- /dev/null +++ b/1998/mountains.sc @@ -0,0 +1,42 @@ +1e+06 0 -18084 +987688 156434 -15630 +951056 309016 -201 +891006 453990 5139 +809017 587785 24594 +707106 707106 -19208 +587785 809016 -21229 +453990 891006 -15010 +309017 951056 -13161 +156434 987688 20032 +0 999999 -20092 +-156434 987688 -7521 +-309016 951056 18472 +-453990 891006 8668 +-587785 809017 -12963 +-707106 707106 -22986 +-809016 587785 -19944 +-891006 453990 15048 +-951056 309017 20336 +-987688 156434 6819 +-999999 0 13015 +-987688 -156434 7485 +-951056 -309016 -15857 +-891006 -453990 6584 +-809017 -587785 21741 +-707106 -707106 -1338 +-587785 -809016 -1247 +-453990 -891006 2410 +-309017 -951056 14432 +-156434 -987688 12342 +0 -999999 5533 +156434 -987688 2973 +309016 -951056 21713 +453990 -891006 -19668 +587785 -809017 -16888 +707106 -707106 21307 +809016 -587785 -13876 +891006 -453990 -13116 +951056 -309017 -18702 +987688 -156434 -2036 +1e+06 0 -18084 +0 0 0 diff --git a/1998/pittsburgh.sc b/1998/pittsburgh.sc new file mode 100644 index 000000000..cb5b7dca2 --- /dev/null +++ b/1998/pittsburgh.sc @@ -0,0 +1,781 @@ +-4851 33852 0 +-5301 32379 0 +-5487 31325 0 +-5115 30101 0 +-4014 29062 0 +-2573 28675 0 +-1498 28633 0 +-423 28592 0 +651 28551 0 +1790 27985 0 +2929 27419 0 +3632 26603 0 +4334 25786 0 +5037 24970 0 +5409 23699 0 +5781 22428 0 +6153 21157 0 +5928 20173 0 +5704 19189 0 +5680 17693 0 +5657 16197 0 +6122 15255 0 +6587 14314 0 +7052 13372 0 +7517 12431 0 +8401 11237 0 +8571 11268 0 +8982 12710 0 +9393 14151 0 +9889 15213 0 +10385 16275 0 +11185 17205 0 +11986 18135 0 +12787 19065 0 +13516 19785 0 +14244 20506 0 +14973 21227 0 +15701 21948 0 +16729 22630 0 +17757 23312 0 +18786 23994 0 +19741 24490 0 +20697 24986 0 +21653 25482 0 +22924 26737 0 +23420 27677 0 +23916 28618 0 +24412 29558 0 +24893 30907 0 +25373 32255 0 +0 0 0 +-5890 33991 0 +-6083 32666 0 +-6277 31341 0 +-5936 29822 0 +-4557 28380 0 +-2836 27838 0 +-1756 27796 0 +-676 27755 0 +403 27714 0 +1689 27233 0 +2658 26427 0 +3627 25621 0 +4185 24668 0 +4743 23715 0 +4983 22475 0 +5223 21235 0 +5073 20155 0 +4923 19075 0 +4774 17995 0 +4758 16833 0 +4743 15670 0 +5266 14779 0 +5789 13888 0 +6312 12996 0 +6835 12105 0 +7445 11160 0 +8054 10214 0 +8664 9269 0 +9362 7471 0 +10049 6680 0 +10736 5890 0 +11423 5099 0 +12282 4274 0 +13140 3450 0 +13999 2625 0 +14858 1801 0 +15717 976 0 +16972 573 0 +18197 1007 0 +18631 1550 0 +19623 1472 0 +20599 1069 0 +21917 -124 0 +0 0 0 +22707 620 0 +21343 1875 0 +20049 2348 0 +18755 2821 0 +17786 3410 0 +16817 3999 0 +15748 4611 0 +14678 5223 0 +13632 5332 0 +12586 5440 0 +11578 6262 0 +10431 7657 0 +9842 9114 0 +9455 11051 0 +9594 11981 0 +10075 13857 0 +10586 14911 0 +11098 15965 0 +12152 17329 0 +13004 18160 0 +13857 18992 0 +14709 19824 0 +15593 20320 0 +16476 20816 0 +17360 21312 0 +18135 22041 0 +18910 22769 0 +19741 23343 0 +20573 23916 0 +21405 24490 0 +22482 25443 0 +23560 26396 0 +24288 27435 0 +25017 28473 0 +25347 29455 0 +25678 30436 0 +26009 31418 0 +26210 32767 0 +26412 34115 0 +0 0 0 +6525 21638 -30 +6335 20611 -30 +6145 19584 -30 +5955 18557 -30 +5766 17530 -30 +5797 16259 -30 +6401 16523 -30 +7540 16918 -30 +8680 17313 -30 +9594 17825 -30 +10462 17747 -30 +11353 16941 -30 +12245 16135 -30 +12973 17019 -30 +0 0 0 +10385 17577 -30 +9625 17654 -30 +8742 17251 -30 +7571 16848 -30 +6401 16445 -30 +5828 16182 -30 +6296 15236 -30 +6765 14291 -30 +7234 13345 -30 +7703 12400 -30 +8881 12570 -30 +10059 12245 -30 +10788 12849 -30 +11160 14678 -30 +12152 15996 -30 +11268 16786 -30 +10385 17577 -30 +10385 17577 -30 +0 0 0 +10323 13903 -30 +9331 14182 -30 +9346 14229 -30 +10338 13950 -30 +10323 13903 -30 +10323 13903 -30 +0 0 0 +10571 14430 -30 +9579 14709 -30 +9594 14756 -30 +10586 14477 -30 +10571 14430 -30 +10571 14430 -30 +0 0 0 +10757 14880 -30 +9765 15159 -30 +9780 15205 -30 +10772 14926 -30 +10757 14880 -30 +10757 14880 -30 +0 0 0 +0 0 0 +8602 16492 -30 +8602 16492 -841 +8525 16678 -841 +8602 16492 -570 +8525 16678 -570 +8602 16492 -300 +8525 16678 -300 +8602 16492 -30 +8525 16678 -30 +8525 16678 -841 +8711 16647 -841 +8525 16678 -570 +8711 16647 -570 +8525 16678 -300 +8711 16647 -300 +8525 16678 -30 +8711 16647 -30 +8711 16647 -841 +8602 16492 -841 +8711 16647 -570 +8602 16492 -570 +8711 16647 -300 +8602 16492 -300 +8711 16647 -30 +8602 16492 -30 +8602 16492 -841 +8602 16492 -841 +8602 16492 -570 +8602 16492 -570 +8602 16492 -300 +8602 16492 -300 +8602 16492 -30 +8602 16492 -30 +0 0 0 +7905 16151 -30 +7905 16151 -725 +7827 16182 -725 +7905 16151 -377 +7827 16182 -377 +7905 16151 -30 +7827 16182 -30 +7827 16182 -725 +7781 16275 -725 +7827 16182 -377 +7781 16275 -377 +7827 16182 -30 +7781 16275 -30 +7781 16275 -725 +7812 16337 -725 +7781 16275 -377 +7812 16337 -377 +7781 16275 -30 +7812 16337 -30 +7812 16337 -725 +7889 16383 -725 +7812 16337 -377 +7889 16383 -377 +7812 16337 -30 +7889 16383 -30 +7889 16383 -725 +7967 16352 -725 +7889 16383 -377 +7967 16352 -377 +7889 16383 -30 +7967 16352 -30 +7967 16352 -725 +8013 16259 -725 +7967 16352 -377 +8013 16259 -377 +7967 16352 -30 +8013 16259 -30 +8013 16259 -725 +7982 16182 -725 +8013 16259 -377 +7982 16182 -377 +8013 16259 -30 +7982 16182 -30 +7982 16182 -725 +7905 16151 -725 +7982 16182 -377 +7905 16151 -377 +7982 16182 -30 +7905 16151 -30 +7905 16151 -725 +7905 16151 -725 +7905 16151 -377 +7905 16151 -377 +7905 16151 -30 +7905 16151 -30 +0 0 0 +8246 13082 -30 +8246 13082 -250 +8277 13159 -250 +8246 13082 -30 +8277 13159 -30 +8277 13159 -250 +8556 13082 -250 +8277 13159 -30 +8556 13082 -30 +8556 13082 -250 +8525 13004 -250 +8556 13082 -30 +8525 13004 -30 +8525 13004 -250 +8246 13082 -250 +8525 13004 -30 +8246 13082 -30 +8246 13082 -250 +8246 13082 -250 +8246 13082 -30 +8246 13082 -30 +0 0 0 +8416 13981 -30 +8416 13981 -450 +8478 14151 -450 +8416 13981 -240 +8478 14151 -240 +8416 13981 -30 +8478 14151 -30 +8478 14151 -450 +8649 14089 -450 +8478 14151 -240 +8649 14089 -240 +8478 14151 -30 +8649 14089 -30 +8649 14089 -450 +8587 13919 -450 +8649 14089 -240 +8587 13919 -240 +8649 14089 -30 +8587 13919 -30 +8587 13919 -450 +8416 13981 -450 +8587 13919 -240 +8416 13981 -240 +8587 13919 -30 +8416 13981 -30 +8416 13981 -450 +8416 13981 -450 +8416 13981 -240 +8416 13981 -240 +8416 13981 -30 +8416 13981 -30 +0 0 0 +7657 13640 -30 +7657 13640 -630 +7595 13795 -630 +7657 13640 -330 +7595 13795 -330 +7657 13640 -30 +7595 13795 -30 +7595 13795 -630 +7750 13857 -630 +7595 13795 -330 +7750 13857 -330 +7595 13795 -30 +7750 13857 -30 +7750 13857 -630 +7812 13702 -630 +7750 13857 -330 +7812 13702 -330 +7750 13857 -30 +7812 13702 -30 +7812 13702 -630 +7657 13640 -630 +7812 13702 -330 +7657 13640 -330 +7812 13702 -30 +7657 13640 -30 +7657 13640 -630 +7657 13640 -630 +7657 13640 -330 +7657 13640 -330 +7657 13640 -30 +7657 13640 -30 +0 0 0 +6882 15267 -30 +6882 15267 -600 +6820 15422 -600 +6882 15267 -410 +6820 15422 -410 +6882 15267 -220 +6820 15422 -220 +6882 15267 -30 +6820 15422 -30 +6820 15422 -600 +6975 15484 -600 +6820 15422 -410 +6975 15484 -410 +6820 15422 -220 +6975 15484 -220 +6820 15422 -30 +6975 15484 -30 +6975 15484 -600 +7037 15329 -600 +6975 15484 -410 +7037 15329 -410 +6975 15484 -220 +7037 15329 -220 +6975 15484 -30 +7037 15329 -30 +7037 15329 -600 +6882 15267 -600 +7037 15329 -410 +6882 15267 -410 +7037 15329 -220 +6882 15267 -220 +7037 15329 -30 +6882 15267 -30 +6882 15267 -600 +6882 15267 -600 +6882 15267 -410 +6882 15267 -410 +6882 15267 -220 +6882 15267 -220 +6882 15267 -30 +6882 15267 -30 +0 0 0 +8339 14461 -30 +8339 14461 -500 +8261 14647 -500 +8339 14461 -265 +8261 14647 -265 +8339 14461 -30 +8261 14647 -30 +8261 14647 -500 +8401 14709 -500 +8261 14647 -265 +8401 14709 -265 +8261 14647 -30 +8401 14709 -30 +8401 14709 -500 +8478 14523 -500 +8401 14709 -265 +8478 14523 -265 +8401 14709 -30 +8478 14523 -30 +8478 14523 -500 +8339 14461 -500 +8478 14523 -265 +8339 14461 -265 +8478 14523 -30 +8339 14461 -30 +8339 14461 -500 +8339 14461 -500 +8339 14461 -265 +8339 14461 -265 +8339 14461 -30 +8339 14461 -30 +0 0 0 +7440 13500 -30 +7440 13500 -350 +7300 13438 -350 +7440 13500 -190 +7300 13438 -190 +7440 13500 -30 +7300 13438 -30 +7300 13438 -350 +7223 13609 -350 +7300 13438 -190 +7223 13609 -190 +7300 13438 -30 +7223 13609 -30 +7223 13609 -350 +7362 13671 -350 +7223 13609 -190 +7362 13671 -190 +7223 13609 -30 +7362 13671 -30 +7362 13671 -350 +7440 13500 -350 +7362 13671 -190 +7440 13500 -190 +7362 13671 -30 +7440 13500 -30 +7440 13500 -350 +7440 13500 -350 +7440 13500 -190 +7440 13500 -190 +7440 13500 -30 +7440 13500 -30 +0 0 0 +7192 11547 0 +7192 11547 -30 +7292 11698 -151 +7393 11849 -191 +7494 12000 -151 +7595 12152 -30 +7595 12152 0 +0 0 0 +7269 11501 0 +7269 11501 -30 +7366 11652 -149 +7463 11803 -189 +7560 11954 -149 +7657 12105 -30 +7657 12105 0 +0 0 0 +5688 14198 0 +5688 14198 -80 +5866 14291 -130 +6223 14477 -30 +6401 14570 -30 +6223 14477 -130 +5866 14291 -30 +5688 14198 -80 +0 0 0 +6401 14570 -30 +6401 14570 0 +0 0 0 +6370 14632 0 +6370 14632 -80 +6192 14539 -130 +5835 14353 -30 +5657 14260 -30 +5835 14353 -130 +6192 14539 -30 +6370 14632 -80 +0 0 0 +5657 14260 -30 +5657 14260 0 +0 0 0 +9641 12369 0 +9641 12369 -30 +9482 12411 -139 +9323 12454 -176 +9164 12496 -139 +9005 12539 -30 +9005 12539 0 +0 0 0 +9610 12260 0 +9610 12260 -30 +9451 12303 -139 +9292 12345 -176 +9133 12388 -139 +8974 12431 -30 +8974 12431 0 +0 0 0 +10168 13950 -30 +10092 13971 -60 +10016 13993 -150 +9902 14025 -60 +9788 14058 -35 +9674 14091 -60 +9560 14123 -150 +9484 14145 -60 +9408 14167 -30 +0 0 0 +10016 13993 -150 +10016 13993 0 +0 0 0 +9560 14123 -150 +9560 14123 0 +0 0 0 +10183 13996 -30 +10107 14018 -60 +10031 14039 -150 +9917 14072 -60 +9803 14105 -35 +9689 14137 -60 +9575 14170 -150 +9499 14191 -60 +9424 14213 -30 +0 0 0 +10031 14039 -150 +10031 14039 0 +0 0 0 +9575 14170 -150 +9575 14170 0 +0 0 0 +10369 14492 -30 +10296 14512 -60 +10223 14532 -150 +10114 14563 -60 +10005 14593 -35 +9895 14623 -60 +9786 14653 -150 +9713 14673 -60 +9641 14694 -30 +0 0 0 +10223 14532 -150 +10223 14532 0 +0 0 0 +9786 14653 -150 +9786 14653 0 +0 0 0 +10385 14539 -30 +10312 14559 -60 +10239 14579 -150 +10130 14609 -60 +10020 14639 -35 +9911 14669 -60 +9802 14700 -150 +9729 14720 -60 +9656 14740 -30 +0 0 0 +10239 14579 -150 +10239 14579 0 +0 0 0 +9802 14700 -150 +9802 14700 0 +0 0 0 +10602 14926 -30 +10526 14948 -60 +10450 14969 -150 +10336 15002 -60 +10222 15035 -35 +10108 15067 -60 +9994 15100 -150 +9918 15121 -60 +9842 15143 -30 +0 0 0 +10450 14969 -150 +10450 14969 0 +0 0 0 +9994 15100 -150 +9994 15100 0 +0 0 0 +10617 14973 -30 +10541 14994 -60 +10465 15016 -150 +10351 15048 -60 +10237 15081 -35 +10123 15114 -60 +10009 15146 -150 +9933 15168 -60 +9858 15190 -30 +0 0 0 +10465 15016 -150 +10465 15016 0 +0 0 0 +10009 15146 -150 +10009 15146 0 +0 0 0 +8416 11640 0 +8277 11749 0 +8385 11873 0 +8509 11764 0 +8416 11640 0 +8416 11640 0 +0 0 0 +6432 21638 -30 +6246 20626 -30 +6060 19615 -30 +5874 18603 -30 +5688 17592 -30 +5735 16213 -30 +4107 15314 -30 +4138 15236 -30 +5766 16151 -30 +6479 14694 -30 +5099 13965 -30 +5130 13903 -30 +6510 14632 -30 +7044 13531 -30 +7579 12431 -30 +7579 12136 -30 +6789 10943 -30 +6851 10881 -30 +7781 12291 -30 +8866 12462 -30 +10106 12152 -30 +10819 11516 -30 +10839 10493 -30 +10860 9470 -30 +10881 8447 -30 +11051 7827 -30 +9300 7037 -30 +9346 6959 -30 +11098 7750 -30 +11532 7083 -30 +12198 6680 -30 +0 0 0 +12260 6820 -30 +11640 7223 -30 +11253 7812 -30 +11051 8509 -30 +11016 9567 -30 +10981 10625 -30 +10946 11683 -30 +10912 12741 -30 +11284 14601 -30 +12183 15779 -30 +13082 16957 -30 +0 0 0 +10788 11702 -30 +10199 12198 -30 +10757 12663 -30 +10788 11702 -30 +10788 11702 -30 +0 0 0 +10524 7579 0 +10524 7579 -30 +10261 7463 -222 +9997 7347 -286 +9734 7230 -222 +9470 7114 -30 +9470 7114 0 +0 0 0 +10602 7517 0 +10602 7517 -30 +10338 7401 -222 +10075 7285 -286 +9811 7168 -222 +9548 7052 -30 +9548 7052 0 +0 0 0 +16352 1581 0 +15558 2305 0 +14763 3030 0 +13969 3754 0 +13175 4479 0 +14260 4495 0 +15391 4045 0 +16316 3410 0 +17241 2774 0 +18166 2139 0 +18150 1720 0 +17670 1457 0 +16352 1581 0 +16352 1581 0 +0 0 0 +20227 976 -30 +20754 2402 -30 +20692 2418 -30 +20165 1038 -30 +20227 976 -30 +20227 976 -30 +0 0 0 +16724 21018 0 +17507 21700 0 +18290 22382 0 +18150 22521 0 +17088 21979 0 +16027 21436 0 +14802 20181 0 +15763 20599 0 +16724 21018 0 +16724 21018 0 +0 0 0 +12400 17019 -30 +11408 17949 -30 +11470 17980 -30 +12446 17050 -30 +12400 17019 -30 +12400 17019 -30 +0 0 0 +16414 20553 -30 +15624 21963 -30 +15686 22025 -30 +16476 20599 -30 +16414 20553 -30 +16414 20553 -30 +0 0 0 +19654 23002 -30 +18693 24242 -30 +18770 24288 -30 +19747 23048 -30 +19654 23002 -30 +19654 23002 -30 +0 0 0 +5704 17887 -30 +4371 18228 -30 +4402 18290 -30 +5750 17933 -30 +5704 17887 -30 +5704 17887 -30 +0 0 0 +6138 22521 -30 +4836 22335 -30 +4836 22444 -30 +6138 22614 -30 +6138 22521 -30 +6138 22521 -30 +0 0 0 +-4913 32472 -30 +-6463 32643 -30 +-6401 32736 -30 +-4944 32581 -30 +-4913 32472 -30 +-4913 32472 -30 +0 0 0 +26365 31976 -30 +24939 32302 -30 +24986 32410 -30 +26412 32069 -30 +26365 31976 -30 +26365 31976 -30 +0 0 0 +0 0 0 diff --git a/1998/pyramid.data b/1998/pyramid.data new file mode 100644 index 000000000..8011f634a --- /dev/null +++ b/1998/pyramid.data @@ -0,0 +1,9 @@ +AlWuzEre 48 +-1 -1 -1 -1 -1 1 +-1 -1 -1 -1 1 -1 +-1 1 1 -1 -1 1 +-1 1 1 -1 1 -1 +-1 -1 1 1 0 0 +-1 -1 -1 1 0 0 +-1 1 -1 1 0 0 +-1 1 1 1 0 0 diff --git a/1998/pyramids.sc b/1998/pyramids.sc new file mode 100644 index 000000000..a659cfed0 --- /dev/null +++ b/1998/pyramids.sc @@ -0,0 +1,264 @@ +6511 -1785 -30 +6267 -952 -30 +7095 -739 -30 +7339 -1571 -30 +6511 -1785 -30 +6803 -1262 -577 +7095 -739 -30 +0 0 0 +6267 -952 -30 +6803 -1262 -577 +7339 -1571 -30 +0 0 0 +24046 -16204 -30 +23575 -15543 -30 +24236 -15072 -30 +24707 -15732 -30 +24046 -16204 -30 +24141 -15638 -546 +24236 -15072 -30 +0 0 0 +23575 -15543 -30 +24141 -15638 -546 +24707 -15732 -30 +0 0 0 +26090 -16254 -30 +25960 -16064 -30 +26150 -15934 -30 +26280 -16124 -30 +26090 -16254 -30 +26120 -16094 -176 +26150 -15934 -30 +0 0 0 +25960 -16064 -30 +26120 -16094 -176 +26280 -16124 -30 +0 0 0 +41193 -15685 -30 +40827 -15165 -30 +41348 -14799 -30 +41714 -15320 -30 +41193 -15685 -30 +41271 -15242 -434 +41348 -14799 -30 +0 0 0 +40827 -15165 -30 +41271 -15242 -434 +41714 -15320 -30 +0 0 0 +17255 -4645 -30 +16887 -4140 -30 +17410 -3759 -30 +17776 -4280 -30 +17255 -4645 -30 +17332 -4206 -434 +17410 -3759 -30 +0 0 0 +16887 -4140 -30 +17332 -4206 -434 +17776 -4280 -30 +0 0 0 +45863 -17213 -30 +45495 -16708 -30 +46018 -16327 -30 +46383 -16848 -30 +45863 -17213 -30 +45940 -16774 -434 +46018 -16327 -30 +0 0 0 +45495 -16708 -30 +45940 -16774 -434 +46383 -16848 -30 +0 0 0 +66583 -8805 -30 +66112 -8145 -30 +66772 -7673 -30 +67243 -8334 -30 +66583 -8805 -30 +66678 -8239 -546 +66772 -7673 -30 +0 0 0 +66112 -8145 -30 +66678 -8239 -546 +67243 -8334 -30 +0 0 0 +75995 -18851 -30 +76008 -18777 -150 +75338 -17822 -150 +75264 -17810 -30 +75995 -18851 -30 +77039 -18105 -30 +76008 -18777 -150 +76964 -18092 -150 +0 0 0 +77039 -18105 -30 +76292 -17062 -30 +75264 -17810 -30 +0 0 0 +76964 -18092 -150 +76280 -17136 -150 +75338 -17822 -150 +0 0 0 +76280 -17136 -150 +76292 -17062 -30 +0 0 0 +76021 -18702 -150 +76033 -18628 -270 +75485 -17847 -270 +75412 -17835 -150 +76021 -18702 -150 +76890 -18080 -150 +76033 -18628 -270 +76816 -18068 -270 +0 0 0 +76890 -18080 -150 +76268 -17211 -150 +75412 -17835 -150 +0 0 0 +76816 -18068 -270 +76256 -17285 -270 +75485 -17847 -270 +0 0 0 +76256 -17285 -270 +76268 -17211 -150 +0 0 0 +76046 -18553 -270 +76059 -18479 -391 +75632 -17871 -391 +75559 -17859 -270 +76046 -18553 -270 +76742 -18055 -270 +76059 -18479 -391 +76667 -18043 -391 +0 0 0 +76742 -18055 -270 +76244 -17360 -270 +75559 -17859 -270 +0 0 0 +76667 -18043 -391 +76232 -17435 -391 +75632 -17871 -391 +0 0 0 +76232 -17435 -391 +76244 -17360 -270 +0 0 0 +76072 -18404 -391 +76084 -18330 -511 +75780 -17896 -511 +75706 -17884 -391 +76072 -18404 -391 +76593 -18031 -391 +76084 -18330 -511 +76519 -18019 -511 +0 0 0 +76593 -18031 -391 +76220 -17509 -391 +75706 -17884 -391 +0 0 0 +76519 -18019 -511 +76208 -17584 -511 +75780 -17896 -511 +0 0 0 +76208 -17584 -511 +76220 -17509 -391 +0 0 0 +76097 -18255 -511 +76110 -18180 -632 +75927 -17920 -632 +75853 -17908 -511 +76097 -18255 -511 +76445 -18006 -511 +76110 -18180 -632 +76370 -17994 -632 +0 0 0 +76445 -18006 -511 +76196 -17658 -511 +75853 -17908 -511 +0 0 0 +76370 -17994 -632 +76184 -17733 -632 +75927 -17920 -632 +0 0 0 +76184 -17733 -632 +76196 -17658 -511 +0 0 0 +76122 -18106 -632 +76135 -18031 -752 +76074 -17945 -752 +76000 -17932 -632 +76122 -18106 -632 +76296 -17982 -632 +76135 -18031 -752 +76222 -17969 -752 +0 0 0 +76296 -17982 -632 +76172 -17808 -632 +76000 -17932 -632 +0 0 0 +76222 -17969 -752 +76160 -17882 -752 +76074 -17945 -752 +0 0 0 +76160 -17882 -752 +76172 -17808 -632 +0 0 0 +86332 -23736 -30 +85964 -23231 -30 +86486 -22850 -30 +86852 -23371 -30 +86332 -23736 -30 +86408 -23297 -434 +86486 -22850 -30 +0 0 0 +85964 -23231 -30 +86408 -23297 -434 +86852 -23371 -30 +0 0 0 +46429 -18090 -30 +46299 -17900 -30 +46489 -17770 -30 +46619 -17960 -30 +46429 -18090 -30 +46459 -17930 -176 +46489 -17770 -30 +0 0 0 +46299 -17900 -30 +46459 -17930 -176 +46619 -17960 -30 +0 0 0 +97292 -27848 -30 +98318 -27115 -30 +99051 -28141 -30 +98025 -28874 -30 +97292 -27848 -30 +98171 -27994 -832 +99051 -28141 -30 +0 0 0 +98318 -27115 -30 +98171 -27994 -832 +98025 -28874 -30 +0 0 0 +99469 -23347 -30 +98998 -22687 -30 +99659 -22216 -30 +100130 -22876 -30 +99469 -23347 -30 +99564 -22782 -546 +99659 -22216 -30 +0 0 0 +98998 -22687 -30 +99564 -22782 -546 +100130 -22876 -30 +0 0 0 +97982 -24924 -30 +98832 -24323 -30 +99434 -25173 -30 +98583 -25775 -30 +97982 -24924 -30 +98708 -25049 -692 +99434 -25173 -30 +0 0 0 +98832 -24323 -30 +98708 -25049 -692 +98583 -25775 -30 +0 0 0 diff --git a/1998/river.sc b/1998/river.sc new file mode 100644 index 000000000..18aa85f29 --- /dev/null +++ b/1998/river.sc @@ -0,0 +1,464 @@ +2114 800 0 +2687 1012 0 +3259 1225 0 +3831 1437 0 +4371 1643 0 +4911 1850 0 +5451 2056 0 +5994 2188 0 +6536 2319 0 +7079 2451 0 +7622 2582 0 +8209 2583 0 +8795 2583 0 +9382 2583 0 +9969 2584 0 +10506 2538 0 +11043 2492 0 +11580 2446 0 +12117 2400 0 +12654 2354 0 +13191 2308 0 +13727 2263 0 +14311 2479 0 +14894 2695 0 +15477 2911 0 +16032 2778 0 +16588 2646 0 +17143 2514 0 +17698 2381 0 +18254 2249 0 +18809 2117 0 +19359 2161 0 +19909 2206 0 +20459 2251 0 +21009 2295 0 +21580 2303 0 +22151 2311 0 +22722 2319 0 +23292 2327 0 +23863 2335 0 +24377 2205 0 +24891 2074 0 +25405 1944 0 +25919 1813 0 +26232 1326 0 +26545 839 0 +26857 352 0 +27564 144 0 +28270 -63 0 +28746 -354 0 +29222 -644 0 +29698 -935 0 +30195 -1072 0 +30693 -1210 0 +31190 -1347 0 +31750 -1202 0 +32310 -1057 0 +32871 -912 0 +33431 -767 0 +33828 -421 0 +34226 -75 0 +34624 270 0 +35297 270 0 +35970 270 0 +36578 138 0 +37185 7 0 +37571 -367 0 +37957 -742 0 +38305 -1111 0 +38652 -1480 0 +38865 -1972 0 +39078 -2463 0 +39658 -2795 0 +40205 -2855 0 +40752 -2916 0 +41324 -2690 0 +41895 -2465 0 +42636 -2428 0 +42638 -2412 0 +43131 -2528 0 +43623 -2643 0 +44139 -2872 0 +44655 -3100 0 +45171 -3329 0 +45687 -3557 0 +46142 -3788 0 +46598 -4018 0 +47053 -4249 0 +47509 -4479 0 +47965 -4710 0 +48420 -4940 0 +48978 -5179 0 +49535 -5417 0 +50093 -5655 0 +50650 -5893 0 +51171 -6091 0 +51691 -6289 0 +52211 -6487 0 +52731 -6684 0 +53250 -6701 0 +53768 -6717 0 +54287 -6734 0 +54806 -6750 0 +55324 -6767 0 +55843 -6783 0 +56362 -6800 0 +56873 -6702 0 +57384 -6604 0 +57895 -6507 0 +58407 -6409 0 +58918 -6311 0 +59579 -6398 0 +60240 -6485 0 +60901 -6572 0 +61338 -6873 0 +61776 -7174 0 +62214 -7476 0 +62932 -7662 0 +63649 -7848 0 +64173 -8057 0 +64697 -8265 0 +65221 -8474 0 +65624 -8836 0 +66027 -9197 0 +66602 -9340 0 +67177 -9483 0 +67810 -9430 0 +68444 -9378 0 +68978 -9462 0 +69513 -9547 0 +70047 -9631 0 +70582 -9716 0 +71116 -9800 0 +71651 -9885 0 +72185 -9970 0 +72720 -10054 0 +73255 -10139 0 +73789 -10223 0 +74324 -10308 0 +74828 -10478 0 +75332 -10648 0 +75837 -10818 0 +76341 -10988 0 +76846 -11158 0 +77350 -11329 0 +77855 -11499 0 +78359 -11669 0 +78758 -12100 0 +79157 -12531 0 +79556 -12963 0 +80006 -13234 0 +80456 -13506 0 +80906 -13777 0 +81355 -14049 0 +81805 -14320 0 +82255 -14591 0 +82807 -14806 0 +83360 -15021 0 +83912 -15236 0 +84464 -15451 0 +85016 -15665 0 +85522 -15740 0 +86028 -15815 0 +86534 -15891 0 +87040 -15966 0 +87546 -16041 0 +88052 -16116 0 +88558 -16191 0 +89172 -16276 0 +89786 -16362 0 +90400 -16448 0 +91014 -16534 0 +91601 -16424 0 +92187 -16314 0 +92774 -16204 0 +93361 -16094 0 +93916 -16151 0 +94472 -16207 0 +95027 -16264 0 +95546 -16284 0 +96065 -16304 0 +96584 -16325 0 +97103 -16345 0 +97621 -16365 0 +98140 -16385 0 +98611 -16597 0 +99083 -16809 0 +99554 -17021 0 +100083 -17023 0 +100612 -17025 0 +101142 -17027 0 +101671 -17029 0 +102200 -17031 0 +102729 -17034 0 +103258 -17036 0 +103788 -17038 0 +104317 -17040 0 +104846 -17042 0 +105375 -17044 0 +105904 -17046 0 +0 0 0 +2162 465 0 +2734 677 0 +3306 889 0 +3878 1102 0 +4401 1258 0 +4923 1415 0 +5446 1571 0 +5998 1713 0 +6550 1856 0 +7102 1998 0 +7654 2140 0 +8223 2185 0 +8793 2231 0 +9363 2277 0 +9933 2323 0 +10498 2255 0 +11063 2187 0 +11628 2120 0 +12193 2052 0 +12759 1984 0 +13324 1916 0 +13889 1849 0 +14383 1940 0 +14877 2032 0 +15371 2123 0 +15865 2215 0 +16455 2139 0 +17046 2062 0 +17636 1986 0 +18226 1910 0 +18817 1834 0 +19430 1895 0 +20044 1955 0 +20657 2016 0 +21197 1992 0 +21736 1969 0 +22275 1946 0 +22815 1923 0 +23354 1900 0 +23893 1877 0 +24403 1566 0 +24912 1255 0 +25422 944 0 +25885 597 0 +26348 251 0 +26811 -94 0 +27425 -399 0 +28040 -704 0 +28486 -1100 0 +28931 -1496 0 +29377 -1892 0 +29988 -1852 0 +30598 -1812 0 +31209 -1772 0 +31785 -1571 0 +32361 -1369 0 +32937 -1168 0 +33512 -967 0 +34119 -597 0 +34727 -228 0 +35398 -181 0 +36070 -134 0 +36579 -299 0 +37088 -464 0 +37479 -800 0 +37871 -1137 0 +38329 -1889 0 +38658 -2561 0 +38931 -2959 0 +39401 -3181 0 +39994 -3193 0 +40587 -3206 0 +41154 -3066 0 +41721 -2926 0 +42286 -2919 0 +42850 -2911 0 +43446 -3127 0 +44042 -3344 0 +44578 -3575 0 +45115 -3806 0 +45651 -4038 0 +46108 -4294 0 +46565 -4551 0 +47022 -4808 0 +47480 -5065 0 +47937 -5322 0 +48394 -5578 0 +48957 -5806 0 +49520 -6033 0 +50083 -6260 0 +50646 -6487 0 +51144 -6619 0 +51642 -6752 0 +52140 -6884 0 +52638 -7016 0 +53145 -7033 0 +53653 -7050 0 +54160 -7067 0 +54667 -7084 0 +55175 -7101 0 +55682 -7119 0 +56189 -7136 0 +56738 -7062 0 +57287 -6988 0 +57835 -6915 0 +58384 -6841 0 +58933 -6767 0 +59564 -6876 0 +60196 -6985 0 +60828 -7094 0 +61438 -7485 0 +62049 -7875 0 +62552 -7971 0 +63055 -8068 0 +63558 -8164 0 +64060 -8458 0 +64561 -8752 0 +65062 -9047 0 +65504 -9304 0 +65945 -9561 0 +66561 -9804 0 +67177 -10046 0 +67811 -9876 0 +68445 -9707 0 +68973 -9801 0 +69502 -9895 0 +70030 -9989 0 +70558 -10083 0 +71087 -10177 0 +71615 -10271 0 +72143 -10365 0 +72672 -10459 0 +73200 -10553 0 +73728 -10647 0 +74205 -10818 0 +74682 -10989 0 +75159 -11160 0 +75636 -11331 0 +76113 -11502 0 +76590 -11673 0 +77067 -11843 0 +77544 -12014 0 +78021 -12185 0 +78467 -12581 0 +78912 -12977 0 +79358 -13373 0 +79777 -13661 0 +80196 -13949 0 +80614 -14237 0 +81033 -14525 0 +81452 -14813 0 +81871 -15101 0 +82336 -15302 0 +82801 -15502 0 +83266 -15703 0 +83731 -15903 0 +84196 -16104 0 +84661 -16304 0 +85179 -16361 0 +85696 -16418 0 +86214 -16474 0 +86732 -16531 0 +87250 -16587 0 +87767 -16644 0 +88285 -16700 0 +88803 -16757 0 +89320 -16814 0 +89838 -16870 0 +90356 -16927 0 +90873 -16983 0 +91376 -17028 0 +91879 -17074 0 +92382 -17119 0 +92885 -17164 0 +93388 -17209 0 +93890 -17254 0 +94393 -17299 0 +94896 -17344 0 +95399 -17389 0 +95902 -17435 0 +96405 -17480 0 +96908 -17525 0 +97410 -17570 0 +97913 -17615 0 +98416 -17660 0 +98945 -17654 0 +99473 -17647 0 +100002 -17640 0 +100530 -17633 0 +101059 -17627 0 +101588 -17620 0 +102116 -17613 0 +102645 -17606 0 +103173 -17600 0 +103702 -17593 0 +104230 -17586 0 +104759 -17579 0 +105288 -17573 0 +105816 -17566 0 +0 0 0 +92115 -16718 0 +92688 -16767 0 +93260 -16816 0 +93832 -16864 0 +94152 -16705 0 +94092 -16462 0 +93530 -16337 0 +92812 -16440 0 +92133 -16705 0 +92115 -16718 0 +92115 -16718 0 +0 0 0 +94634 -16835 0 +94977 -17071 0 +95769 -17228 0 +96425 -17179 0 +97082 -17130 0 +97609 -17274 0 +98137 -17418 0 +98557 -17210 0 +98398 -16891 0 +97556 -16758 0 +97062 -16595 0 +96519 -16730 0 +95976 -16866 0 +95484 -16688 0 +94993 -16510 0 +94618 -16614 0 +94582 -16765 0 +94634 -16835 0 +94634 -16835 0 +0 0 0 +24830 1637 0 +24832 1762 0 +24979 1804 0 +25332 1755 0 +25641 1617 0 +26002 1176 0 +26128 845 0 +25983 818 0 +25463 1126 0 +25129 1423 0 +24830 1637 0 +24830 1637 0 +0 0 0 +30671 -1587 0 +30754 -1443 0 +30609 -1360 0 +30151 -1280 0 +29513 -1144 0 +28801 -747 0 +28260 -359 0 +27538 -39 0 +27392 -81 0 +27936 -439 0 +28549 -759 0 +28991 -1181 0 +29395 -1535 0 +29709 -1641 0 +30334 -1650 0 +30671 -1587 0 +30671 -1587 0 +0 0 0 diff --git a/1998/rules b/1998/rules new file mode 100644 index 000000000..8a8b0ddf1 --- /dev/null +++ b/1998/rules @@ -0,0 +1,214 @@ + 14th International Obfuscated C Code Contest Rules | + +Copyright (c) Leonid A. Broukhis, Jeremy Horn, Landon Curt Noll and | +Peter Seebach, 1998. | + +All Rights Reserved. Permission for personal, education or non-profit use is | +granted provided this this copyright and notice are included in its entirety | +and remains unaltered. All other uses must receive prior permission in | +writing from the contest judges. | + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: his emotions obfuscated his + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show the importance of programming style, in an ironic way. + * To stress C compilers with unusual code. + * To illustrate some of the subtleties of the C language. + * To provide a safe forum for poor C code. :-) + +The 14th IOCCC contest window is: | + + 26-Nov-98 12:00 UTC to 31-Jan-99 23:59:59 UTC | + +NOTE: Some of the changes from the 1998 rules are denoted by change bars. ---> | + However some changes such as 1996 to 1998 are not marked. | + + +RULES: + + To help us with the volume of entries, we ask that you follow these rules: + + 1) Your entry must be a complete program. + + 2) Your entry must be <= 3217 bytes in length. The number of characters + excluding whitespace (tab, space, newline), and excluding any ; { or } + immediately followed by whitespace or end of file, must be <= 1536. + + 3) Your entry must be submitted in the following format: + +---entry--- +rule: 1998 +fix: y or n (n => this is a new entry, y => this replaces an older entry) +title: title of entry (see comments below) +entry: Entry number from 0 to 7 inclusive (your 1st entry should by 0) +date: Date/time of submission in UTC (see comments below) +host: Machine(s) and OS(s) under which your entry was tested + Use tab indented lines if needed +---remark--- + Place remarks about this entry in this section. It would be helpful if + you were to indent your remarks with 4 spaces, though it is not a + requirement. Also, if possible, try to avoid going beyond the 79th + column. Blank lines are permitted. +---author--- +name: your name +org: School/Company/Organization +addr: postal address + use tab indented lines to continue + don't forget to include the country +email: EMail address from a well known site or registered domain. + If you give several forms, list them on separate tab indented lines. +url: http://your/home/page.html or say none if you don't have one +anon: y or n (y => remain anonymous, n => OK to publish this info) +---info--- +If your program needs an info file, place a uuencoded copy of it in +this section. In the case of multiple info files, use multiple info +sections. If your entry does not need a info file, skip this section. +---build--- +Place a uuencoded copy of the command(s) used to compile/build your program +in this section. It must uudecode into a file named 'build'. The resulting +file must be 255 bytes or less. +---program--- +Place a uuencoded copy of your program in this section. It must uudecode +into a file named is 'prog.c'. The resulting file must follow rule #2. +---end--- + + Regarding the above format: + + * The title must match the expression: | + + ^[a-zA-Z0-9_=][a-zA-Z0-9_=+-]*$ | + + and must be 1 to 31 characters in length. | + + It is suggested, but not required, that the title should + incorporate the author(s) username(s). + + * The date in the ---entry--- section should be given with respect + to UTC. The format of the date should be as returned by asctime() + using the C locale. (see guidelines for more info) + + * You may correct/revise a previously submitted entry by sending + it to the contest email address. Be sure to set 'fix' in the + ---entry--- section to 'y'. The corrected entry must use the same + title and entry number as submission that is being corrected. Be + sure that you note the re-submission in the ---remark--- as well. + + * With the exception of the header, all text outside of the above + format may be ignored by the judges. If you need to tell the judges + something, put it in the ---remark--- section, or send a separate + EMail message to the judges. + + * Information from the ---author--- section will be published unless + 'y' was given to the respective author's 'anon' line. + + * To credit multiple authors, include an ---author--- section for + each author. Each should start with ---author--- line, and + should be found between the ---entry--- and ---build--- sections. + + * The home page URL in the ---author--- section must be fully | + qualified or must be the word `none'. | + + * The entry's remarks should include: + - note if this entry is a re-submission of a previous entry. + - what this program does + - how to run the program (sample args or input) + - special compile or execution instructions, if any + - special filename requirements (see rule 4 and 5) + - information about any ---info--- files + - why you think the program is obfuscated + - any other remarks (humorous or otherwise) + + * Do not rot13 your entry's remarks. You may suggest that certain + portions of your remarks be rot13ed if your entry wins an award. + + * Info files should be used only to supplement your entry. They + should not be required to exist. + + * If your entry does not need an info file, skip the ---info--- + section. If your entry needs multiple info files, use multiple + ---info--- sections, one per info file. You should describe + each info file in the ---remark--- section. + + * Your sections must in the same order as in the above template. + + 4) If your entry is selected as a winner, it will be modified as follows: + + 'build' is incorporated into a makefile, and 'build' is removed + 'prog.c' is renamed to your entry's title, followed by an optional + digit, followed by '.c' + your entry is compiled into a file with the name of your entry's + title, possibly followed by a digit + + If your entry requires that a build file exist, state so in your + entry's remark section. The makefile will be arranged to execute a + build shell script containing the 'build' information. The name of + this build shell script will be your entry's title, possibly followed + by a digit, followed by '.sh'. + + If needed, your entry's remarks should indicate how your entry must + be changed in order to deal with the new filenames. + + 5) The build file, the source and the resulting executable should be + treated as read-only files. If your entry needs to modify these files, + it should make and modify a copy of the appropriate file. If this + occurs, state so in your entry's remarks. + + 6) The uudecoded ---program--- section must be able to be compiled + cleanly by an ANSI C compiler, or if there are any compile errors, + they must be documented in the ---remark--- section. + + 7) The program must be of original work. All programs must be in the + public domain. All copyrighted programs will be rejected. + + 8) Entries must be received prior to 31-Jan-99 23:59:59 UTC. (UTC is | + essentially equivalent to Greenwich Mean Time) EMail your entries to: + + entry@ioccc.org | + + You must include the words ``ioccc entry'' in the subject + of your EMail when sending in your entry! Failure to do so may + result in the loss of your entry! + + If possible, we request that you hold off on EMailing your entries + until 26-Nov-98 12:00 UTC. Early entries will be accepted, however. | + We will attempt to EMail a confirmation to the sender of any entry + received after 26-Nov-98 12:00 UTC and before the close of the contest. | + + 9) Each person may submit up to 8 entries per contest year. Each entry + must be sent in a separate EMail letter. + + 10) Entries requiring human interaction to be built are not allowed. + + 11) Programs that require special privileges (setuid, setgid, super-user, + special owner or group) are not allowed. + + 12) Legal abuse of the rules is somewhat encouraged. An entry that, in + the opinion of the judges, violates the rules will be disqualified. + Entries that attempt to abuse the rules must try to justify why + their rule abuse is legal in the ---remark--- section. + + +FOR MORE INFORMATION: + + The judging will be done by Leonid A. Broukhis, Jeremy Horn, Landon + Curt Noll and Peter Seebach. Please send questions or comments + about the contest, to: + + questions@ioccc.org (not the address for submitting entries) | + + Comments about confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, visit the IOCCC web page: | + + http://www.ioccc.org | + + It has rules, guidelines and winners of previous contests (1984 to date). diff --git a/1998/samefile.1 b/1998/samefile.1 new file mode 100644 index 000000000..7b90919e0 --- /dev/null +++ b/1998/samefile.1 @@ -0,0 +1,116 @@ +.\" +.\" To format this file into a text file say +.\" +.\" nroff -man samefile.1 or +.\" groff -man -Tascii samefile.1 +.\" +.TH SAMEFILE 1 "OCTOBER 1997" IOCCC "User Manuals" +.SH NAME +samefile \- find identical files +.SH SYNOPSIS +.B samefile +.SH DESCRIPTION +.B samefile +reads a list of file names (one file name per line) from stdin. +For each file name pair with identical contents, a +line consisting of six tab separated fields is output: +The size in bytes, two file names, the character ``='' if +the two files are on the same device, ``X'' otherwise, +and the link counts of the two files. +The output is sorted in reverse order by size. + +.B samefile +uses two stages to give optimum performance. + +In the first stage, all non-plain files are silently +ignored (directories, devices, FIFOs, sockets, +symbolic links) as well as files for which +.BR stat (2) +or +.BR open (2) +fails. +The result of the first stage (the file names) is written into +a binary tree with one node for every file size. Each node +is in turn a linked list of file names along with inode and +device information. +It is also at this first stage where checks for hard links are done. +For any inode only one filename will be added to the binary tree. + +In the second stage all files having the same +size are compared against each other. The rules +of mathematical logic are applied to reduce work +and output noise: if files A, B, and C have the same size and +.B samefile +finds that A = B and A = C then it will not +compare B against C (and will not +output a line for B and C) but only +for A = B and A = C. The algorithm will detect +equality across arbitrarily long chains. +Note however, that because +only the first filename per inode gets into the +first stage, the output for a group of identical files +with different inode numbers is also minimized. Suppose +you have six identical files of size 100 +in an inode group consisting of the three +inodes with numbers 10, 20 and 30: + +.nf +$ ls -i # output edited for readabilty: + 10 file1 20 file4 30 file6 + 10 file2 20 file5 + 10 file3 +$ ls | samefile +100 file1 file4 = 3 2 +100 file1 file6 = 3 1 + +.fi +The sum of the sizes in the first column is the amount of disk space +you could gain by making all 6 files links to only one +file or remove all but one of the files. To be precise, +disk space is allocated in blocks - you will probably gain +two blocks here, rather than 200 bytes. +Note that it is not enough to just remove file4 and +file6 (you would gain only 100 bytes because file5 +still exists.) + +.SH LIMITATIONS +.B Samefile +was written with no limits in mind. The number of input lines is +unlimited. The size of the actual files is only limited by +available virtual memory needed to compare one pair of files. +The only hard limit is the constraint that there should not +be more than about 8192 files having the same size. Experience +has shown that there are rarely more than a couple dozen +files of the same size. +.SH EXAMPLES +.nf + +For everybody: +What are the duplicates under my home directory? + + $ find $HOME | samefile + +For the sysadmin folks: +Report all duplicate files under /usr larger than 16k: + + $ find /usr -size +16384c -a -type f | samefile + +For the ftp and WWW admins: +How much space is wasted below our site's /pub directory? + + $ find /pub -type f | samefile | awk '{sum += $1} END {print sum}' + +.fi + +.SH "EXIT STATUS" +If +.B samefile +runs out of memory the exit status is 1, +zero otherwise. +.fi +.SH "SEE ALSO" +.BR find (1), +.BR ln (1), +.BR rm (1) +.\" +.\" End Of Man Page diff --git a/1998/schnitzi.c b/1998/schnitzi.c new file mode 100644 index 000000000..ea1314739 --- /dev/null +++ b/1998/schnitzi.c @@ -0,0 +1,56 @@ +typedef void e(); + +e *w,*l,*u,*_o,*j,*t,*O,exit,b,c_,b_,a_,c,a,z_,x_,d,y_,_m; +int q,m,_d,z,k,h,f[99]; +char y[26],_p[40][26],_q,r[2],*_,**s,*i, + +*x[]= { "\n", ")", "if (", "}\n", ");\n\n", " ", ",&", "\"", + ",", " %%d", ";\n\n scanf(\"%%d", "%%d ", "else ", ",", "<", + ");\n", "printf(\"", "main()\n{\n int a" }; + +void g(){ O=j; printf(_); } +void _j(){ O=_o; m=!m; h=h+m*(long)t; } +void _u(){ O=g; _=x[0]; j=b; } +void _r(){ O=g; _=x[1]; j=_u; } +void _f(){ O=g; *r=y[k-1]; _=r; j=_r; } +void _l(){ O=g; _=x[2]; j=x_; } +void _c(){ O=(e*)h; } +void n(){ O=_j; t=w; _o=_c; } +void p(){ O=_j; h=0; t=l; _o=n; } +void _b(){ O=p; q=*i+q*10-'0'; i=i+1; m=*i; w=_b; l=c; } +void _s(){ O=g; _=x[3]; j=exit; } +void v(){ O=p; z=z-1; m=z; w=z_; l=_s; } +void _a(){ O=g; _=x[4]; *y=x[17][1]; z=0; j=b; } +void _z(){ O=g; _=x[5]; j=p; k=k-1; m=k; w=_z; l=u; } +void _h(){ O=g; _=x[6]; j=a_; } +void _e(){ O=g; _=x[7]; k=0; j=_h; } +void _t(){ O=g; _=x[8]; j=d; } +void _g(){ O=g; _=x[7]; j=_t; k=0; } +void _k(){ O=_z; k=f[z]; _q=y[k]; y[k]=y[k-1]; y[k-1]=_q; u=b_; k=z; } +void d_(){ O=_k; y[z+1]=x[17][1]+z; f[z]=z+1; } +void b (){ O=p; z=z+1; m=q-z; w=c_; k=z; l=_z; u=a; } +void e_(){ O=g; _=x[9]; k=k+1; m=k1; w=_l; l=_u; } +void l_(){ O=g; _=x[12]; j=k_; } +void m_(){ O=g; _=x[13]; j=y_; } +void n_(){ O=p; k=k+1; m=k sort.c + cc sort.c -o sort + echo 123 > data + echo 234 >> data + echo 413 >> data + echo 134 >> data + echo 324 >> data + ./sort < data + + This is a beautiful program. How can a program with no conditional + behavior at all have output which depends on anything? + + For hints on deciphering this, see below past the Author's Comments; + they're a nice summary, but they leave the mystery intact. + + +Selected Author's Comments: + + In literary circles, there is a poetic form called a "lipogram", + which is a poem in which a specific letter has been distinctly + avoided. This principle can be applied in other ways. For + instance, in this paragraph, the vowel which immediately follows + 't' in the alphabet is nowhere to be seen. There is even an + entire novel (E. V. Wright's "Gadsby") in which no word contains + the letter 'e'. + + The IOCCC has been no stranger to this concept. Several winning + entries from years past have accomplished interesting feats while + completely avoiding the use of certain C constructs thought to + be essential (e.g. 1988's robison.c). If you have to ask why they + would do it this way, then this contest just isn't for you. + + In continuing with this fine tradition, this program suggests to + the ANSI committee some new practical simplifications for the C + language. For instance, it appears that CONDITIONAL BRANCHING isn't + really necessary. So, we can do away with while, do...while, for, + if/else, switch, ?:, or anything else that might cause any kind of + nondeterministic jump in the code. There's too much uncertainty + in the world anyway. + + Function parameters and return types just confuse people anyway, so + get rid of them. Same with local variables. In fact, all you really + need are assignment statements, and maybe one printf() and one goto. + + This style of programming is also ideal for systems with limited + memory capacity, since the function call stack never goes beyond + a depth of one. + + So what does it do? Give it an integer (1 < n < 27) on the command + line, such as + + schnitzi 5 + + The output will itself be a lipographic program, one which inputs + (in this case) five numbers and prints them out sorted. It sorts + them, however, using only "if/else" statements, without arrays or + looping. To see the resulting program run, redirect the output from + "schnitzi" into another file, like this + + schnitzi 4 > sort.c + + and then compile it. + +Spoilers And Hints: + + The big key to this program is figuring out what the names of the + functions ought to be; a bit of research may allow you to guess at + a few crucial ones. + + The only function ever called is "O", but "O" is just set to point to + other functions all the time. Or, almost all the time. + + So how does 'h' get set, and what to? diff --git a/1998/schweikh1.c b/1998/schweikh1.c new file mode 100644 index 000000000..1d7b1ab2a --- /dev/null +++ b/1998/schweikh1.c @@ -0,0 +1,70 @@ + %:define H(x) + #include H(dio) + #include H(dlib) + #include H(ring) + + #define x ) == 0 ?__LINE__:0){O =__LINE__;break;} } + #define X(x) __LINE__ x __LINE__ + #define t(a)\ +for (c = 0; c :\n" + char *I = L + __LINE__; + int O = printf (__FILE__, n[nn]) + +#line 2 "0gcc -ansi -E -dM -undef %s /usr/include/%s>r\0 (" + sprintf (K, 1+__FILE__, f[S-*__FILE__] + __LINE__, n[nn]); + O += system (K); + if ((H = fopen (__FILE__+44, 44+__FILE__)) == 0) return 1; + while ((fgets (L, (int)sizeof L, H)) != 0) { + I[strcspn (I, 46+__FILE__)] = O = 0; +#line 1 "*r" + t (n) t (e) + if (0 == O) O = puts (L); + } + nn = fclose (H); + } + } + } + return remove (1+__FILE__); +} diff --git a/1998/schweikh1.hint b/1998/schweikh1.hint new file mode 100644 index 000000000..02f220e1f --- /dev/null +++ b/1998/schweikh1.hint @@ -0,0 +1,222 @@ +CPP Abuse: + + Jens Schweikhardt + DFN Network Operation Center + Schlartaeckerweg 3 (Home address) + D-71384 Weinstadt + Germany + + http://www.shuttle.de/schweikh/ + + +Judge's Comments: + + To build: + + make schweikh1 + + To use: + + ./schweikh1 + + What does it do? It seems to print a list of system headers, perhaps + with words after them. Curiously, if you look at the list of words + defined in a given standard header, they are never printed directly + after that header's name. Ah-hah! It's a conformance test for the + standard headers. + + This code is a wonder; it's a wonder that it compiles. I wonder + whether or not it should. The innovative realization that you can + use special characters, such as '\n', in #file directives alone + merits some recognition. + + I've included most of the author's comments; they're fairly thorough. + Do not read them if you want to figure this out yourself. "Amendment + One" refers to "NA1", the add-on to C89 which added some fairly + crufty internationalization support. + + NOTE: Some non-gcc compilers that are not fully ANSI standard do not + compile this entry correctly. Using cc by default is not helpful + most of the time on this entry, because the program has a hardcoded + gcc invocation anyway. Anyone who uses egcs and has no plain gcc + will need to frob the source anyway and can be expected to do the + right thing with ${CC}. So use gcc. + + NOTE: One may build the original entry, which incorrectly used + ^K's and ^L's after a # cpp-directive. While this works under + gcc, it is not ISO C89. One may build this original entry by: + + make schweikh1.orig + + +Selected Author's Comments: + + Important! This program, if it compiles at all, is mis-compiled by many + compilers due to compiler bugs. It could be the "least likely + to compile and execute" in conjunction with preprocessor abuse. + When run, it is likely to uncover bugs in your system headers. + + The program is run without arguments. If your compiler is buggy, + the most likely result is no output and/or an exit status of 1. + + If Amendment One headers are missing you will see + : + gcc: /usr/include/iso646.h: No such file or directory + gcc: No input files specified + : + gcc: /usr/include/wctype.h: No such file or directory + gcc: No input files specified + : + gcc: /usr/include/wchar.h: No such file or directory + gcc: No input files specified + + Bug your vendor for an upgrade. + + The format of the info file is straightforward and described in the file + itself. Just load it in your favorite editor. + + Requirements + ------------ + + Gcc (the GNU C compiler) must be available at runtime. It is assumed + that your C implementation keeps headers as files in the /usr/include + directory. The info file must be readable and reside in the current + working directory. The current working directory must be writable in + order to create a temporary file (which is removed upon program + termination). In case you don't have gcc at runtime, not all is lost + if your compiler or preprocessor can produce a list of defined macros + in the format output by gcc -dM, i.e. lines of the form + #define MACRO value + Edit the source at line 55 in this case. + + Background + ---------- + + ISO C has a very strict idea of visibility of identifiers. All possible + macros are explicitly enumerated. In a compliant implementation no other + macros can be defined, because you could write strictly conforming + programs that may fail to compile due to syntax errors: suppose + defines PIPE_BUF, then the conforming + + #include + #include /* <- or where the bogus macro is defined */ + #include + #define STR(x) #x + #define XSTR(x) STR(x) + int main (void) + { + int PIPE_BUF = 0; + assert (strcmp ("PIPE_BUF", XSTR (PIPE_BUF)) == 0); + return 0; + } + + is expected to compile and meet the assertion. If it does not, your + compiler compiles some other language than ISO C. + + Why I think my program is obfuscated + ------------------------------------ + + Not only is the program's purpose a thorough standard conformance + test. The source itself is a beast and has uncovered bugs in many + C compilers. + + 1. The token sequence after #include can consist of pp-tokens and + "are processed just as in normal text." [ISO 6.8.2] The result + must resemble one of the canonical forms, "foo.h" or . + This lets us write things like + #define HEADER "foo.h" + #include HEADER + I could not find a compiler rejecting this. However, if we're + torturing the preprocessor a little more, by using token pasting, + at least one compiler falls over. + #define H(x) + #include H(dio) /* expands to */ + is rejected by tcc version 4.1.2, the TenDRA compiler: + "t.c", line 3: Error: + [ISO 6.8.3.3]: Invalid result for '##' operator in macro 'H'. + To be honest, I don't know if the rules for pp-tokens and token + pasting don't forbid what I do (and tcc is correct in rejecting it). + In this case, all other compilers I tried are buggy, or the Standard + itself :-) + + 2. The #line directive allows to set a line number, and optionally + a file name, i.e. modify __LINE__ and __FILE__. Strange things + happen if the file name contains a NUL byte -- which the Standard + allows: in #line num "file" the "file" is an s-char-sequence per + ISO 6.8.4. ISO 6.1.4 defines string literals as s-char-sequences, + which may include octal escape sequences. Let's look at + #include + #line 42 "foo\0bar" + int main (void) { + printf ("%s %d\n", __FILE__, (int)sizeof __FILE__); + return 0; + } + This is supposed to output 'foo 8'. Here's what happens in RL: + foo 4 gcc 2.7.2.1, lcc + foo\0bar 9 tcc 4.1.2, Sunsoft cc turn "\0" into "\\0", ugh! + (I have written a bug report for gcc. Newer versions and egcs are ok.) + + 3. The %: and %:%: digraphs test for conformance to Amendment One. + + Ask your local guru if C allows the same case label in the same switch + statement to appear more than once. Ask him/her to think real hard. + The answer will be "no". The true guru will cite a constraint in + ISO 6.6.4.2. Then make fun of the guru's answer by waving 'case __LINE__:' + under his/her nose. Easy money from a bet! Make sure your guru has + no chance to use Standardese weasel words as an escape: can I have + case : + case : + in the same switch? (Note that you need the [invisible] newline. You + can generously allow the additional constraint that no #undefs or + #defines are allowed between the two cases.) + + Lots of integer constants and string literals come into the source + via __LINE__ and __FILE__ which are redefined at various places. + Sometimes the __FILE__ contains \0 bytes; different strings or + characters are then accessed with offsets, say 10+__FILE__ or + __LINE__+__FILE__ or 2[__FILE__]. One integral constant in octal. + This makes the source and header input depend on ASCII. + + A few old obfuscations, like one character identifiers, not too + many macros, a goto O, "needless" assignments to satisfy lint + with its "function value ignored" warnings. My lint has nothing + to complain. + + There's more whitespace in the Standard than just space, tab and + newline. In particular, there are vertical tab and formfeed that + can be used in certain places (outside of preprocessing directives, + i.e. they are not allowed from just after the # up to the final + newline. See 6.8 for details.) + On many implementations these appear as ^L and ^K. My source starts + with an extremely uncommon 32bit word consisting of ^L, ^K, % and :. + I have grepped old winning entries for ^K, none of them contains one, + so this is something new -- after 14 years of IOCCC. Be sure to have + enough paper in your printer when you make a hardcopy of the source... + + While I'm at it, the rules state that only space, tab and newline + are ignored for the count (plus '{', '}', ';' followed by + whitespace). The mkentry.c program, however, uses isspace() which + returns nonzero for vtab and formfeed and other characters as well. + I could have used a lot more ^K and ^L probably undetected by your + counter but decided to err on the side of safety. I use a perl + script to compute the character count according to the rules. + The advantages of an independent clean room approach... + #!/usr/bin/perl -w + $/ = "\0"; + $_ = <>; + s/[;{}][ \t\n]/\n/g; + s/[ \t\n]+//g; + print length ($_),"\n"; + + I have tried, as suggested in the guidelines, to let the code look + like ordinary C code. Apart from a few long lines I think I left + the indentation like I would in RL. You should however not try to + use indent on the source. The code is extremely fragile because of the + myriads of __LINE__ macros -- indenting is a sure way to break + the program. Don't even think of maintaining that beast; I've + had my share of core dumps during development :-) A test suite + was used after every minor change to find out if the program still + does what it should. + + From the goals: "To stress C compilers with unusual code." + That describes exactly my modest attempts... diff --git a/1998/schweikh1.orig.c b/1998/schweikh1.orig.c new file mode 100644 index 000000000..b20c1cb96 --- /dev/null +++ b/1998/schweikh1.orig.c @@ -0,0 +1,70 @@ + %: define H(x) + #include H(dio) + #include H(dlib) + #include H(ring) + + #define x ) == 0 ?__LINE__:0){O =__LINE__;break;} } + #define X(x) __LINE__ x __LINE__ + #define t(a)\ +for (c = 0; c :\n" + char *I = L + __LINE__; + int O = printf (__FILE__, n[nn]) + +#line 2 "0gcc -ansi -E -dM -undef %s /usr/include/%s>r\0 (" + sprintf (K, 1+__FILE__, f[S-*__FILE__] + __LINE__, n[nn]); + O += system (K); + if ((H = fopen (__FILE__+44, 44+__FILE__)) == 0) return 1; + while ((fgets (L, (int)sizeof L, H)) != 0) { + I[strcspn (I, 46+__FILE__)] = O = 0; +#line 1 "*r" + t (n) t (e) + if (0 == O) O = puts (L); + } + nn = fclose (H); + } + } + } + return remove (1+__FILE__); +} diff --git a/1998/schweikh2.c b/1998/schweikh2.c new file mode 100644 index 000000000..b727c326d --- /dev/null +++ b/1998/schweikh2.c @@ -0,0 +1,20 @@ +#define _POSIX_SOURCE /* you are not supposed to understand this */ +#define O(OOO,OO0,O00,O0O,OO,O0)\0##O0O%:%:OO\0##O0%:%:OOO\0##OO0%:%:O00 +#include +static volatile sig_atomic_t One; +#include +#include +#define Zero(NULL)#NULL +#define ONE(One) Zero(One) +in??/ +t +#line 10 "01\015" +main (register zero, char **ONE) +%: +<% switch (sizeof __FILE__ < zero) case 1: return One /= zero; +{ auto one = zero = atoi (ONE<:zero-1:>); +do for (one += alarm (One |= (signal (__LINE__, (void(*)(register))main) +!= SIG_ERR)); One; ++one); +while (zero -= write (1, __FILE__+(one&1), 1)); +return write (1, 1+__FILE__+1, 1) != 1; +%>} diff --git a/1998/schweikh2.hint b/1998/schweikh2.hint new file mode 100644 index 000000000..357325ec2 --- /dev/null +++ b/1998/schweikh2.hint @@ -0,0 +1,180 @@ +Most Erratic Behavior: + + Jens Schweikhardt + DFN Network Operation Center + Schlartaeckerweg 3 (Home address) + D-71384 Weinstadt + Germany + + http://www.shuttle.de/schweikh/ + + +Judges' comments: + + To build: + + make schweikh2 + + Almost every compiler is supposed to be able to accept the code in + schweikh2.c; try compiling schweikh2.orig.c to see if your compiler + is fully standard-compliant. + + To use: + + ./schweikh2 + or + ./schweikh2 integer_number + + Run the program with a small argument, like 5 or 10, several times. + Are the results different? Why? + + Some non-gcc compilers that are not fully ANSI standard do not + compile this entry correctly. + + At the time this hint file was written, some gcc and egcs + implementations ran into problem when building the original entry: + + make schweikh2.orig + + This program often will produce an error of the form: + + gcc -ansi schweikh2.orig.c -o schweikh2.orig + as: Error: cca00NzV.s, line 58: Missing " at end of string + " + as: Error: cca00NzV.s, line 58: malformed statement + *** Error code 1 (bu21) + + because the line: + + ??=line 10 ONE(O(1,1,2,6,0,6)) + + turns into the line: + + # 9 "01\012" + + which causes gcc to give to the assembler the following two lines: + + .stabs "whey.c + ",132,0,0,Ltext1 + + and the lone " after the #.file line results in an assembler syntax error. + + In some cases one must compile using 'gcc -g': + + make schweikh2.orig CFLAGS=-g + + to trigger this error. + + And with the proper text beyond the \012, it may be possible to have + all kinds of fun adding ``inline assembly'' via #line directives. :-) + For extra credit: + + If your compiler has this bug, transform the line in the C + program to inject assembly instructions in such a way that + the program will compile. + + If you are able to do the above, try adding assembly instructions + so that it will compile, execute and do something interesting. + If you succeed in doing this (especially on FreeBSD, Linux or Sparc), + email the author for a free pat on the back. + + +Selected author's comments: + + What this program does + ---------------------- + + My entry is a yarng, which stands for, you guessed it, yet another + random number generator, and is pronounced 'yawn' due to its + incredible speed. Seriously, it exploits the randomness of quantum + mechanical events that build up the hardware as well as some other + non-deterministic factors. Here's how it works: + + 1) an alarm is scheduled to be delivered in a second + 2) an infinite loop is entered that just increments a counter + 3) on delivery of the alarm signal, the counter's LSB is printed. + 4) while some other counter is not zero, go to 1) + 5) exit + + The yarng therefore produces output at a rate of 1 baud. The number of + bits may be specified by an argument and defaults either to UINT_MAX + (least likely) or UINT_MAX+1 (most likely). Extra credit: why the + different values? How long would you need for an empirical test? + + For example: + + $ yarng 32 + 10111001010101110110010101001111 + $ yarng 5 + 10011 + + Why I think this is obfuscated + ------------------------------ + + -Ever seen a 'do for ... while' loop? + -I avoided 'int' like the plague. Instead I used storage class specifiers + (register, auto) to get implicit int. The Standard allows implicit int + even in casts as you can see in '(void(*)(register))main'. Where implicit + int is impossible, like in the 'int main' declaration I have int split + across two lines. All indent programs I use insert space at the beginning + of the continuation line and thereby introduce a syntax error. + -main (ab)used as a signal handler. Shocking. Yeah, this leads to undefined + behaviour. I have yet to see a system where it does not work. If it + doesn't work for you, I'd appreciate if you mail me about it. + Uh-oh, schweikh did it, uttered "Works for me". Don't quote me on that! + -Even if you know how the program works, you just can't predict the output. + -Chained use of token pasting operators ## with shuffled arguments + -So you think you can't assign to __LINE__ and __FILE__? Not so. The + #line preprocessor directive does the trick. But saying '#line 10 "01\n"' + is a little lame and I came up with '??=line 10 ONE(O(1,1,2,6,0,6))' + -__LINE__ is used as the signal number argument to signal(). If indenting + or other editing changes the number of lines the program is likely to be + killed after one second... Thanks to POSIX for specifying SIGALRM as 14. + You're SOL if your system does not conform. Get a real OS. + -All strings (or characters) needed are crammed into __FILE__ using + octal notation and then extracted using pointer + offset notation. + -Use of a # (null) preprocessor directive (hidden as a %: digraph) + Delete this line and prepare for a core dump. + -Identifiers reused with different capitalization: one, One, ONE, zero, + Zero. ONE is particularly nasty because it appears as a macro taking + an arg and as a plain identifier in main's parameters. The rule is that + whenever ONE is followed by '(' it must be the macro. + -A quote from Kernighan and Plauger, "The Elements of Programming Style", + 2nd Ed., page 21: "A useful way to decide if some piece of code is + clear or not is the ``telephone test.'' If someone could understand your + code when read aloud over the telephone, it's clear enough. If not then + it needs rewriting." + Now try the telephone test for 'one = zero = atoi (ONE[zero-1])' + -Don't you love the aesthetics of symmetry: write (1, 1+__FILE__+1, 1) + (telephone test this as well; is it 1, One, ONE, one? Maybe won?). + + Where does the randomness come from? + ------------------------------------ + + Each bit obviously depends on the number of times the loop body is + executed between two calls of the signal handler. But what determines + this number? + + + The accuracy of the clock driving the CPU + + The accuracy of the clock driving the timer responsible for alarm signals + + On multitasking OS's: The total time the process is scheduled + to run between successive invocations of the signal handler. + + How about the randomness of the yarng? To measure these properties I + counted the number of bit sequences and compared them to what I would + expect from a generator with uniform distribution (all sequences + equally likely to occur). + + It is interesting to note that yarng's maximum deviations are less + than or equal to rand()'s. Randomness however tends to degrade under + high load averages on my system (Linux). This could be avoided by + allowing the process one second of execution time instead of wall + clock time (using the SIGVTALRM sent by the virtual timer + instead of SIGALRM). + + I'm not surprised. Yarng in the end depends on fluctuations of the + electrical field and the heat distribution in the oscillators, the + implementation and state of the scheduling algorithm, the system + load, number and temporal distribution of asynchronous events and + last but not least the phase of the moon. God _does_ play dice. + Type yarng and watch Him roll. diff --git a/1998/schweikh2.orig.c b/1998/schweikh2.orig.c new file mode 100644 index 000000000..b6155b391 --- /dev/null +++ b/1998/schweikh2.orig.c @@ -0,0 +1,20 @@ +#define _POSIX_SOURCE /* you are not supposed to understand this */ +#define O(OOO,OO0,O00,O0O,OO,O0)\0##O0O%:%:OO\0##O0%:%:OOO\0##OO0%:%:O00 +#include +static volatile sig_atomic_t One; +#include +#include +#define Zero(NULL)#NULL +#define ONE(One) Zero(One) +in??/ +t +??=line 10 ONE(O(1,1,2,6,0,6)) +main (register zero, char **ONE) +%: +<% switch (sizeof __FILE__ < zero) case 1: return One /= zero; +{ auto one = zero = atoi (ONE<:zero-1:>); +do for (one += alarm (One |= (signal (__LINE__, (void(*)(register))main) +!= SIG_ERR)); One; ++one); +while (zero -= write (1, __FILE__+(one&1), 1)); +return write (1, 1+__FILE__+1, 1) != 1; +%>} diff --git a/1998/schweikh3.c b/1998/schweikh3.c new file mode 100644 index 000000000..8a10fd234 --- /dev/null +++ b/1998/schweikh3.c @@ -0,0 +1,61 @@ +%:define _POSIX_SOURCE +#include +#include +#include +#include +#include +#include +#include +#define D(N,t)Z t*N V<%t*z U M0*z); H z)u z; X} +#define k(x,y)x<0||fstat(x,&y)|| +#define h(x)=open(x,O_RDONLY) +#define b(x),(int)x.st_nlink +#define B ;typedef g +#define X exit (1); +#define O .st_size +#define U =malloc( +#define Y S.st_ino +#define v ;%>else +#define W .st_dev +#define o ||read( +#define Z static +#define g struct +#define u return +#define I char* +#define V (M2) +#define H if( +#define _ -> + +/* HE WHO SAYS */ + +Z I A<:32767/ M0(I )]; Z g stat S,T; Z size_t y B f{ +I n ; g f * x ; dev_t d ; ino_t i; } f B t{ M1 s,c; f +*l; g t*L,*R; } t; D(a,t)D(E ,f)Z t*J(t*p,I n){ H! p){ p= +a(); p _ s =S O; p _ c=1; p _ L=p _ R=0; +p _ l= E(); p _ l _ n=n; p _ l _ x=0; p +_ l _ d=S W; p _ l _ i= Y v H S O==p _ +s){ f* e; for (e=p _ l; e; e=e _ x) { H S W==e _ +d&&Y== e _ i) { u p; } } e=E(); e _ x=p _ l; e _ +n=n; e _ d =S W; e _ i=Y; p _ l=e; ++p _ +c v H S O< p _ s) { p _ L= J( p _ L,n)v{ +p _ R= J (p _ R,n ); } u p ; } Z int Q( +I G,I F){ int d h(G),D h(F); I m,*M; H k(d,S )k(D,T )(y =S +O)-T O){ y= 0; goto d; } H! (m U y))||!(M U y))o d ,m,y)- +y o D,M,y)-y) X y=!memcmp( m,M,y); M5(m) ; M5(M ); d:V + + close (d );V close(D); u y; } Z M2 C(M1 z,M1 N){ M1 i=N*(N-1)/2, +j=1,s; I q,*e,* p,*w,*l; e=q= M4((size_t)i,1); H!e) X p=q+i; for(i=0; e-p +; ++e){ H!*e&&Q (A[i:>,A[j])){ V printf("%""l""d" "\t""%" "s""\t" "%""s" +"??/t" "%""c" "\11" "%""d" "??/t" "%""d" "\n", z,A[i] +,A[j], S W -T W?'X' :'='b( S)b(T) ); H j -i-1) { s=N- +i-3; w =e+s+1; l=q+N* (j-1)- j*(j-1 )/ 2 ; do{ *w +=1; H w==l) break; w+= s; } while( s-->0); } } H++j ==N){ j=i+++ + 2; } } M5(q); } Z M2 P(t*p ){ H p){ P(p _ R); H p _ c>1){ M1 i=0 + ; f*l= p _ l; for (; i< p _ c; ++i ){ A[i + ]= l _ n; l=l _ x; } C (p _ s, p _ c); } P (p _ + L) ; } } int main V { t*r= 0; I F ; for (; ; ) +{ H!(F U 1024)) )X H ! fgets( F,1024 ,stdin) )break; *(F+(y +=strlen(F))-1)= 0; H!( F=M3(F, y)))X H stat(F,&S)==0 &&S_ISREG(S. + st_mode)&&S O )r=J(r ,F ); } H r)P(r ); u 0; }/* Obfuscated C + +IS FREE THINKS MONEY GROWS ON DIRECTORY TREE */ diff --git a/1998/schweikh3.hint b/1998/schweikh3.hint new file mode 100644 index 000000000..a2d2a8150 --- /dev/null +++ b/1998/schweikh3.hint @@ -0,0 +1,193 @@ +Most Space Efficient: + + Jens Schweikhardt + DFN Network Operation Center + Schlartaeckerweg 3 (Home address) + D-71384 Weinstadt + Germany + + http://www.shuttle.de/schweikh/ + + +Judges' comments: + + To build: + + make schweikh3 + + To use: + + If "dir" is the directory (or a directory tree) where you keep + all your favorite pictures off the Internet or from + alt.binaries.pictures.*, do + + find dir -type f -print | ./schweikh3 + + Maybe you will not need to buy another 10 Gb disk to store them. :-) + + Also Try: + + cp schweikh3 file1 + cp schweikh3 file2 + cp schweikh3.c file3 + ln file3 file4 + + ls -1 file? | ./schweikh3 + + NOTE: this program is not as smart as to detect identity of JPEG + files with the same picture but with different compression levels. + + NOTE: Some non-gcc compilers that are not fully ANSI standard do + not compile this entry correctly. + + +Selected author's comments: + + The source is expected to conform to IEEE Std 1003.1-1990 ("POSIX"). + Thank God the IEEE does not standardize a coding style... + + What this program does + ---------------------- + + This is best explained in the man page. The troff source for this + man page can be found in the file samefile.1. + + SAMEFILE(1) User Manuals SAMEFILE(1) + + + NAME + samefile - find identical files + + SYNOPSIS + samefile + + DESCRIPTION + samefile reads a list of file names (one file name per + line) from stdin. For each file name pair with identical + contents, a line consisting of six tab separated fields is + output: The size in bytes, two file names, the character + ``='' if the two files are on the same device, ``X'' oth- + erwise, and the link counts of the two files. The output + is sorted in reverse order by size. + + samefile uses two stages to give optimum performance. + + In the first stage, all non-plain files are silently + ignored (directories, devices, FIFOs, sockets, symbolic + links) as well as files for which stat(2) or open(2) + fails. The result of the first stage (the file names) is + written into a binary tree with one node for every file + size. Each node is in turn a linked list of file names + along with inode and device information. It is also at + this first stage where checks for hard links are done. + For any inode only one filename will be added to the + binary tree. + + In the second stage all files having the same size are + compared against each other. The rules of mathematical + logic are applied to reduce work and output noise: if + files A, B, and C have the same size and samefile finds + that A = B and A = C then it will not compare B against C + (and will not output a line for B and C) but only for A = + B and A = C. The algorithm will detect equality across + arbitrarily long chains. Note however, that because only + the first filename per inode gets into the first stage, + the output for a group of identical files with different + inode numbers is also minimized. Suppose you have six + identical files of size 100 in an inode group consisting + of the three inodes with numbers 10, 20 and 30: + + $ ls -i # output edited for readability: + 10 file1 20 file4 30 file6 + 10 file2 20 file5 + 10 file3 + $ ls | samefile + 100 file1 file4 = 3 2 + 100 file1 file6 = 3 1 + + The sum of the sizes in the first column is the amount of + disk space you could gain by making all 6 files links to + only one file or remove all but one of the files. To be + precise, disk space is allocated in blocks - you will + probably gain two blocks here, rather than 200 bytes. + Note that it is not enough to just remove file4 and file6 + (you would gain only 100 bytes because file5 still + exists.) + + + LIMITATIONS + Samefile was written with no limits in mind. The number of + input lines is unlimited. The size of the actual files is + only limited by available virtual memory needed to compare + one pair of files. The only hard limit is the constraint + that there should not be more than about 8192 files having + the same size. Experience has shown that there are rarely + more than a couple dozen files of the same size. + + EXAMPLES + For everybody: + What are the duplicates under my home directory? + + $ find $HOME | samefile + + For the sysadmin folks: + Report all duplicate files under /usr larger than 16k: + + $ find /usr -size +16384c -a -type f | samefile + + For the ftp and WWW admins: + How much space is wasted below our site's /pub directory? + + $ find /pub -type f | samefile | awk '{sum += $1} END {print sum}' + + + + EXIT STATUS + If samefile runs out of memory the exit status is 1, zero + otherwise. + + SEE ALSO + find(1), ln(1), rm(1) + + + Why I think it is obfuscated + ---------------------------- + + - the code is commented but this gives only an *extremely* faint clue. + - the layout does not reflect the program structure, or does it? + - The data structure the program builds is an ordered binary tree + where each node consists of a linked list. This is probably too + heavy to comprehend for N percent of all programmers ;-) + - The tree is built and traversed by recursive function calls. + - Why does this program look at dev_t and ino_t? Heavy wizardry. + - Can you find out how the algorithm works that detects identity + of files across arbitrarily long chains? In my private unobfuscated + source there are 17 lines describing just that. A classical case for + the well known /* You're not supposed to understand this */ comment. + - Would Dijkstra consider this goto harmful? + - The only string literal is split in more than a dozen substrings + - For the task at hand the code is pretty terse. Some dynamic memory + is even freed as soon as it's no longer needed. I have tried to + make the preprocessor directives as short as possible. This means + no spaces after #include and no spaces after some of the macro + names. + + Are you an algorithms guru? If so you should know why the output + appears sorted without any use of qsort() or system("sort"). + + Rewrite (hah!) the program to use memory mapping of files instead + of read(). Does this affect performance noticeably? + + It's easy to write a script that takes samefile's output and + hardlinks (or symlinks) identical files. Writing such a script is + left as an exercise for the deobfuscator. + + When you run samefile on some directory tree, try to estimate + how much you think it will find. Is the actual result anywhere + near your estimate? How many copies of the GPL COPYING file + are there on your filesystems? :-) + + In the remote event that the input has more than 8192 files with + the same size (on systems where sizeof (char *) == 4, or 4096 when + sizeof (char *) == 8), increase the manifest constant 32767 on line + 31. diff --git a/1998/tomtorfs.c b/1998/tomtorfs.c new file mode 100644 index 000000000..c48a2cf08 --- /dev/null +++ b/1998/tomtorfs.c @@ -0,0 +1,20 @@ +#include +#include + +int main(int a,char **A){FILE*B;typedef unsigned long C;C b +[8]; if(!(a==7&&(B= fopen(1[A],"rb")))) return 1;for(7[b]=0 +;7[b]<5;7[b]++)b[7[ b]]=strtoul(A[2+7[b ]],0,16-!7[b]*6);5[ +b]=3[b] ; while ((6[b]= getc(B) +)!=(C)- 1){if(2 [b])for (7[b]=0 +;7[b]<4 ;7[b]++ )if(((6 [b]>>7[ +b])^(6[ b]>>(7-7[b])))&1)6[ b] ^=(1 +<<7[b]) ^(1<<(7-7[b]));5[b] ^= 6[b] +<<(0[b] -8);for(7[b]=0;7[b] <8;7[b] +++)if(( 5[b]>>(0[b]- 1))&1)5 +[b]=(5[ b]<<1)^ 1[b]; else 5[ +b]<<=1; }5[b]&=((((C)1 <<(0[b] +-1))-1) <<1)|1; if(2[b] )for(7[ +b]=0;7[ b]<(0[b ]>>1);7 [b] ++) +if(((5[b]>>7[b])^(5 [b]>>(0 [b]-1-7 [b])))&1)5[b]^=((C) +1<<7[b])^((C)1<<(0[ b]-1-7[ b]));5[ b]^=4[b];fclose(B); +printf("%0*lX\n", ( int)(0[ b]+3)>> 2,5[b]); return 0;} diff --git a/1998/tomtorfs.hint b/1998/tomtorfs.hint new file mode 100644 index 000000000..73edbc55d --- /dev/null +++ b/1998/tomtorfs.hint @@ -0,0 +1,104 @@ +Best Self-Documenting: + + Tom Torfs + De Nayer Instituut + Cuperuslei 12 (home address) + 2220 Heist-op-den-Berg + Belgium + + http://members.xoom.com/tomtorfs + + +Judges' comments: + + To build: + + make tomtorfs + + To use: + + ./tomtorfs tomtorfs.c 32 04C11DB7 1 FFFFFFFF FFFFFFFF + + Also try: + + echo "abscond conferrable" > file.A + echo "adorn condolence" > file.B + echo "adorn condolence too" > file.C + ./tomtorfs file.A 32 04C11DB7 1 FFFFFFFF FFFFFFFF + ./tomtorfs file.B 32 04C11DB7 1 FFFFFFFF FFFFFFFF + ./tomtorfs file.C 32 04C11DB7 1 FFFFFFFF FFFFFFFF + + If you don't believe the program is correct, try and compare the output + of the program with the value of CRC computed by PKZIP or any other + archiver that uses the CRC-32 algorithm. + + +Selected author's comments: + + Usage: + crc filename bitwidth polynom reflected init xor + + filename : file to calculate the CRC of + bitwidth : width of the CRC in bits (decimal) + polynom : polynomial used for the CRC (hexadecimal) + reflected : 0 if the CRC is not reflected, 1 if it is + init : initial value for the CRC (hexadecimal) + xor : value to xor the final CRC with (hexadecimal) + + Examples: + + CRC-16: crc filename 16 1021 0 FFFF 0000 + CRC-32: crc filename 32 04C11DB7 1 FFFFFFFF FFFFFFFF + XMODEM: crc filename 16 8408 1 0000 0000 + ARC: crc filename 16 8005 1 0000 0000 + + Portability notes: + + The program assumes CHAR_BIT==8. Results are undefined if + bitwidth > sizeof(unsigned long) * 8. It is also assumed + that EOF is -1 and 1 is a valid exit value to indicate + failure (replace them with EOF resp. EXIT_FAILURE if the + assumptions are false). Otherwise ANSI/ISO C. + No special build options required. + + Special notes: + + Count the number of non-whitespace characters in the source + file to find out what dark force drove me to write this ;-). + + Spoiler: + + First of all, if you run a C beautifier on the program + (thereby of course losing the nice code shape I worked + so hard on ;-) the code will become a bit more readable. + + The variable names are not very descriptive. They have the + following meanings: + a = argc + A = argv + b = array of unsigned long variables + b[0] = bit-width of the CRC (argv[2]) + b[1] = CRC polynomial (argv[3]) + b[2] = nonzero if CRC is reflected (argv[4]) + b[3] = initial value of CRC (argv[5]) + b[4] = value final CRC is XORed with (argv[6]) + b[5] = CRC value + b[6] = byte from file + b[7] = counter + B = FILE * through which the file argv[1] is opened + C = typedef for unsigned long + + The first for loop simply reads the command-line arguments + in the b[] array. The third parameter to strtoul() causes + all arguments to be in base-16 (hex) except the first one, + which will be in base-10 (decimal). + + The rest of the program "simply" calculates the crc in b[5] + and then prints it to stdout. The bit reflection loops may + appear a bit tricky at first, but if you have a good look + at them they should become obvious also. + + Acknowledgments: + + Ross N. Williams, whose CRC guide was very useful to me + for writing this. You can find it as CRC.TXT in Snippets. diff --git a/1998/xwing.data b/1998/xwing.data new file mode 100644 index 000000000..f88ed12a9 --- /dev/null +++ b/1998/xwing.data @@ -0,0 +1,3751 @@ +AlWuzEre 22500 +-0.7045 -0.1707319945 -0.2451674955 -0.704914978 -0.1561185 -0.273181488 +-0.704914978 -0.1561185 -0.273181488 -0.4203150025 -0.1561185 -0.2771505125 +-0.4203150025 -0.1561185 -0.2771505125 -0.7045 -0.1707319945 -0.2451674955 +-0.379541504 -1.047410034 -0.2901315 -0.398068512 -1.0475250245 -0.289850006 +-0.398068512 -1.0475250245 -0.289850006 -0.3795400085 -1.038709961 -0.300842987 +-0.3795400085 -1.038709961 -0.300842987 -0.379541504 -1.047410034 -0.2901315 +-0.414620514 0.1922545015 0.0955195005 -0.391160492 0.1918079985 0.1367350005 +-0.391160492 0.1918079985 0.1367350005 -0.391092987 0.1986130065 0.133501007 +-0.391092987 0.1986130065 0.133501007 -0.414620514 0.1922545015 0.0955195005 +1.5616049805 0.0559399985 -0.0323445015 1.567165039 0.0611829985 -0.03144705 +1.567165039 0.0611829985 -0.03144705 1.5675550535 0.0427768515 -0.018049549 +1.5675550535 0.0427768515 -0.018049549 1.5616049805 0.0559399985 -0.0323445015 +-0.4144265135 -0.2113359985 0.102217499 -0.414549988 -0.243016495 0.1081279985 +-0.414549988 -0.243016495 0.1081279985 -0.3913515015 -0.216244507 0.1405245055 +-0.3913515015 -0.216244507 0.1405245055 -0.4144265135 -0.2113359985 0.102217499 +-0.818619995 0.150423004 -0.3046845095 -0.8187700195 0.168940506 -0.324213501 +-0.8187700195 0.168940506 -0.324213501 -0.705674988 0.1645899965 -0.3327789915 +-0.705674988 0.1645899965 -0.3327789915 -0.818619995 0.150423004 -0.3046845095 +-0.397935486 -1.0287800295 -0.274896515 -0.3980455015 -1.020414978 -0.285609497 +-0.3980455015 -1.020414978 -0.285609497 -0.378959503 -1.0288950195 -0.275279999 +-0.378959503 -1.0288950195 -0.275279999 -0.397935486 -1.0287800295 -0.274896515 +-0.019209049 0.165593506 -0.314048004 -0.0819990005 0.128001007 -0.2727409975 +-0.0819990005 0.128001007 -0.2727409975 -0.0189395505 0.1284474945 -0.273652008 +-0.0189395505 0.1284474945 -0.273652008 -0.019209049 0.165593506 -0.314048004 +-0.3791839905 -1.0201950075 -0.2858840025 -0.3980455015 -1.020414978 -0.285609497 +-0.3980455015 -1.020414978 -0.285609497 -0.378959503 -1.0288950195 -0.275279999 +-0.378959503 -1.0288950195 -0.275279999 -0.3791839905 -1.0201950075 -0.2858840025 +1.5656049805 0.0384262505 -0.1326784975 1.560160034 0.038314701 -0.1336849975 +1.560160034 0.038314701 -0.1336849975 1.71826001 0.025263201 -0.0751435015 +1.71826001 0.025263201 -0.0751435015 1.5656049805 0.0384262505 -0.1326784975 +1.559994995 -0.00976365 -0.136589493 1.565660034 -0.00954055 -0.1353554995 +1.565660034 -0.00954055 -0.1353554995 1.7184849855 -0.0395476 -0.075139 +1.7184849855 -0.0395476 -0.075139 1.559994995 -0.00976365 -0.136589493 +-0.36017749 -0.037651348 0.1090999985 -0.366709015 -0.0489177015 0.0920045015 +-0.366709015 -0.0489177015 0.0920045015 -0.36017749 0.043362549 0.1090999985 +-0.36017749 0.043362549 0.1090999985 -0.36017749 -0.037651348 0.1090999985 +-0.0190025005 -0.28730249 -0.291951996 -0.082064499 -0.28730249 -0.2909295045 +-0.082064499 -0.28730249 -0.2909295045 -0.017911249 -0.3124014895 -0.2428359985 +-0.017911249 -0.3124014895 -0.2428359985 -0.0190025005 -0.28730249 -0.291951996 +-0.705674988 0.1645899965 -0.3327789915 -0.818619995 0.150423004 -0.3046845095 +-0.818619995 0.150423004 -0.3046845095 -0.7051550295 0.142614502 -0.3095599975 +-0.7051550295 0.142614502 -0.3095599975 -0.705674988 0.1645899965 -0.3327789915 +-0.3929995115 0.27457901 0.1446185 -0.393755493 0.299566498 0.095510002 +-0.393755493 0.299566498 0.095510002 -0.0763499985 0.305924988 0.091447998 +-0.0763499985 0.305924988 0.091447998 -0.3929995115 0.27457901 0.1446185 +-0.0814189985 -0.3126245115 -0.2418224945 -0.082064499 -0.28730249 -0.2909295045 +-0.082064499 -0.28730249 -0.2909295045 -0.017911249 -0.3124014895 -0.2428359985 +-0.017911249 -0.3124014895 -0.2428359985 -0.0814189985 -0.3126245115 -0.2418224945 +-0.0819990005 0.128001007 -0.2727409975 -0.0826054995 0.1662630005 -0.313032501 +-0.0826054995 0.1662630005 -0.313032501 -0.019209049 0.165593506 -0.314048004 +-0.019209049 0.165593506 -0.314048004 -0.0819990005 0.128001007 -0.2727409975 +-0.8182199705 -0.2512714995 -0.2866004945 -0.8183900145 -0.238889496 -0.310369995 +-0.8183900145 -0.238889496 -0.310369995 -0.70513501 -0.258745514 -0.289364502 +-0.70513501 -0.258745514 -0.289364502 -0.8182199705 -0.2512714995 -0.2866004945 +-0.7054450075 -0.244132004 -0.3171535035 -0.8183900145 -0.238889496 -0.310369995 +-0.8183900145 -0.238889496 -0.310369995 -0.70513501 -0.258745514 -0.289364502 +-0.70513501 -0.258745514 -0.289364502 -0.7054450075 -0.244132004 -0.3171535035 +-0.421191498 0.1650359955 -0.336527008 -0.397792511 0.1839994965 -0.303010498 +-0.397792511 0.1839994965 -0.303010498 -0.397655487 0.1911390075 -0.304234497 +-0.397655487 0.1911390075 -0.304234497 -0.421191498 0.1650359955 -0.336527008 +-0.392913513 -0.187798996 0.167158493 -0.3932944945 -0.1500944975 0.126760498 +-0.3932944945 -0.1500944975 0.126760498 -0.075633003 -0.193822998 0.1637630005 +-0.075633003 -0.193822998 0.1637630005 -0.392913513 -0.187798996 0.167158493 +-0.420950989 0.1964935 -0.3426579895 -0.421191498 0.1650359955 -0.336527008 +-0.421191498 0.1650359955 -0.336527008 -0.397655487 0.1911390075 -0.304234497 +-0.397655487 0.1911390075 -0.304234497 -0.420950989 0.1964935 -0.3426579895 +-0.817659973 -0.176309494 -0.249211502 -0.8180599975 -0.1644850005 -0.272873993 +-0.8180599975 -0.1644850005 -0.272873993 -0.704914978 -0.1561185 -0.273181488 +-0.704914978 -0.1561185 -0.273181488 -0.817659973 -0.176309494 -0.249211502 +-0.4212099915 -0.2156869965 -0.335634491 -0.397461487 -0.2093285065 -0.2975360105 +-0.397461487 -0.2093285065 -0.2975360105 -0.397417511 -0.2159100035 -0.2942994995 +-0.397417511 -0.2159100035 -0.2942994995 -0.4212099915 -0.2156869965 -0.335634491 +-0.817659973 0.211330002 -0.249211502 -0.818034973 0.2299589995 -0.2686335145 +-0.818034973 0.2299589995 -0.2686335145 -0.704299988 0.2146764985 -0.2440475005 +-0.704299988 0.2146764985 -0.2440475005 -0.817659973 0.211330002 -0.249211502 +-0.420726013 -0.2442440035 -0.3214544985 -0.4212099915 -0.2156869965 -0.335634491 +-0.4212099915 -0.2156869965 -0.335634491 -0.397417511 -0.2159100035 -0.2942994995 +-0.397417511 -0.2159100035 -0.2942994995 -0.420726013 -0.2442440035 -0.3214544985 +-0.818034973 0.2299589995 -0.2686335145 -0.704710022 0.236875 -0.267040497 +-0.704710022 0.236875 -0.267040497 -0.704299988 0.2146764985 -0.2440475005 +-0.704299988 0.2146764985 -0.2440475005 -0.818034973 0.2299589995 -0.2686335145 +-0.36017749 0.043362549 0.1090999985 -0.366709015 0.0510040015 0.0920045015 +-0.366709015 0.0510040015 0.0920045015 -0.277796997 0.0240641995 0.105972 +-0.277796997 0.0240641995 0.105972 -0.36017749 0.043362549 0.1090999985 +-0.3932944945 -0.1500944975 0.126760498 -0.0762330015 -0.1558954925 0.1231364975 +-0.0762330015 -0.1558954925 0.1231364975 -0.075633003 -0.193822998 0.1637630005 +-0.075633003 -0.193822998 0.1637630005 -0.3932944945 -0.1500944975 0.126760498 +0.5549400025 -1.0454050295 0.1769714965 0.5548549805 -1.0385999755 0.1756309965 +0.5548549805 -1.0385999755 0.1756309965 0.5696550295 -1.04261499 0.1882140045 +0.5696550295 -1.04261499 0.1882140045 0.5549400025 -1.0454050295 0.1769714965 +0.554244995 1.029 0.1406950075 0.5541400145 1.0336850585 0.1351139985 +0.5541400145 1.0336850585 0.1351139985 0.614205017 1.0263199465 0.133359497 +0.614205017 1.0263199465 0.133359497 0.554244995 1.029 0.1406950075 +-0.0763499985 0.305924988 0.091447998 -0.3929995115 0.27457901 0.1446185 +-0.3929995115 0.27457901 0.1446185 -0.0757074965 0.280825989 0.1406649935 +-0.0757074965 0.280825989 0.1406649935 -0.0763499985 0.305924988 0.091447998 +0.5541849975 1.0195150145 0.1331065065 0.5540549925 1.031005005 0.128529007 +0.5540549925 1.031005005 0.128529007 0.614205017 1.0263199465 0.133359497 +0.614205017 1.0263199465 0.133359497 0.5541849975 1.0195150145 0.1331065065 +0.548119995 -1.030454956 -0.296473999 0.54801001 -1.026329956 -0.301942993 +0.54801001 -1.026329956 -0.301942993 0.60775 -1.0326850585 -0.304262512 +0.60775 -1.0326850585 -0.304262512 0.548119995 -1.030454956 -0.296473999 +-0.704914978 -0.1561185 -0.273181488 -0.817659973 -0.176309494 -0.249211502 +-0.817659973 -0.176309494 -0.249211502 -0.7045 -0.1707319945 -0.2451674955 +-0.7045 -0.1707319945 -0.2451674955 -0.704914978 -0.1561185 -0.273181488 +-0.414549988 -0.243016495 0.1081279985 -0.3913515015 -0.216244507 0.1405245055 +-0.3913515015 -0.216244507 0.1405245055 -0.3912680055 -0.2236069945 0.141865494 +-0.3912680055 -0.2236069945 0.141865494 -0.414549988 -0.243016495 0.1081279985 +0.5479450075 -1.0399399415 -0.304064514 0.5478150025 -1.0287800295 -0.308530487 +0.5478150025 -1.0287800295 -0.308530487 0.60775 -1.0326850585 -0.304262512 +0.60775 -1.0326850585 -0.304262512 0.5479450075 -1.0399399415 -0.304064514 +-0.0611064985 -0.00273584 0.1627285005 -0.068318001 0.0365300485 0.1341255035 +-0.068318001 0.0365300485 0.1341255035 -0.0527330015 0.0115427 0.1624575045 +-0.0527330015 0.0115427 0.1624575045 -0.0611064985 -0.00273584 0.1627285005 +0.547325012 1.019965027 -0.3331984865 0.5471849975 1.013044983 -0.3318630065 +0.5471849975 1.013044983 -0.3318630065 0.5621500245 1.0152800295 -0.3218420105 +0.5621500245 1.0152800295 -0.3218420105 0.547325012 1.019965027 -0.3331984865 +-0.4142409975 0.1639205015 0.1093619995 -0.414620514 0.1922545015 0.0955195005 +-0.414620514 0.1922545015 0.0955195005 -0.391160492 0.1918079985 0.1367350005 +-0.391160492 0.1918079985 0.1367350005 -0.4142409975 0.1639205015 0.1093619995 +-0.364023987 -1.022424988 -0.2585650025 -0.364399994 -1.0025700075 -0.2832315065 +-0.364399994 -1.0025700075 -0.2832315065 -0.0865565035 -1.0226450195 -0.262907013 +-0.0865565035 -1.0226450195 -0.262907013 -0.364023987 -1.022424988 -0.2585650025 +-0.0800445025 0.2915350035 -0.190246002 -0.0166485005 0.2917579955 -0.191261505 +-0.0166485005 0.2917579955 -0.191261505 -0.016158449 0.254165497 -0.150748993 +-0.016158449 0.254165497 -0.150748993 -0.0800445025 0.2915350035 -0.190246002 +-0.4217065125 1.0540999755 0.1514924925 -0.3916849975 1.054209961 0.1511174925 +-0.3916849975 1.054209961 0.1511174925 -0.3912390135 1.036920044 0.1724380035 +-0.3912390135 1.036920044 0.1724380035 -0.4217065125 1.0540999755 0.1514924925 +0.245074997 0.0905479965 -0.0232690505 0.2432630005 0.114140999 -0.076584503 +0.2432630005 0.114140999 -0.076584503 0.5980599975 0.099528 -0.081314499 +0.5980599975 0.099528 -0.081314499 0.245074997 0.0905479965 -0.0232690505 +0.243067505 -0.115179497 -0.0725719985 0.2424004975 -0.0841679995 -0.109963501 +0.2424004975 -0.0841679995 -0.109963501 0.5970150145 -0.072901001 -0.143260498 +0.5970150145 -0.072901001 -0.143260498 0.243067505 -0.115179497 -0.0725719985 +-0.4213720095 1.0368050535 0.1728110045 -0.4217065125 1.0540999755 0.1514924925 +-0.4217065125 1.0540999755 0.1514924925 -0.3912390135 1.036920044 0.1724380035 +-0.3912390135 1.036920044 0.1724380035 -0.4213720095 1.0368050535 0.1728110045 +-0.079331497 0.253942505 -0.1497295075 -0.0800445025 0.2915350035 -0.190246002 +-0.0800445025 0.2915350035 -0.190246002 -0.016158449 0.254165497 -0.150748993 +-0.016158449 0.254165497 -0.150748993 -0.079331497 0.253942505 -0.1497295075 +-0.812075012 0.1572274935 0.1445429995 -0.81225 0.1696100005 0.120885002 +-0.81225 0.1696100005 0.120885002 -0.698539978 0.1489725035 0.141565506 +-0.698539978 0.1489725035 0.141565506 -0.812075012 0.1572274935 0.1445429995 +-0.6991849975 0.1636974945 0.1138809965 -0.81225 0.1696100005 0.120885002 +-0.81225 0.1696100005 0.120885002 -0.698539978 0.1489725035 0.141565506 +-0.698539978 0.1489725035 0.141565506 -0.6991849975 0.1636974945 0.1138809965 +-0.3925085145 1.0170650025 0.121197998 -0.4220870055 0.999994995 0.143005005 +-0.4220870055 0.999994995 0.143005005 -0.3916164855 0.99988501 0.1425274965 +-0.3916164855 0.99988501 0.1425274965 -0.3925085145 1.0170650025 0.121197998 +-0.4143890075 0.224158005 0.1004329985 -0.3912275085 0.205751999 0.1346139985 +-0.3912275085 0.205751999 0.1346139985 -0.391092987 0.1986130065 0.133501007 +-0.391092987 0.1986130065 0.133501007 -0.4143890075 0.224158005 0.1004329985 +-0.0793929975 -0.1620305025 -0.1574295045 -0.080373001 -0.137600998 -0.2065429995 +-0.080373001 -0.137600998 -0.2065429995 -0.017202299 -0.1372660065 -0.2074515075 +-0.017202299 -0.1372660065 -0.2074515075 -0.0793929975 -0.1620305025 -0.1574295045 +-0.5908200075 -0.003405275 0.03001585 -0.605380005 -0.00189917 -0.0125483 +-0.605380005 -0.00189917 -0.0125483 -0.5905700075 0.0253190995 0.0181384505 +-0.5905700075 0.0253190995 0.0181384505 -0.5908200075 -0.003405275 0.03001585 +-0.4220870055 0.999994995 0.143005005 -0.4222005005 1.017174988 0.1218034975 +-0.4222005005 1.017174988 0.1218034975 -0.3925085145 1.0170650025 0.121197998 +-0.3925085145 1.0170650025 0.121197998 -0.4220870055 0.999994995 0.143005005 +-0.087268997 -1.0023449705 -0.287467987 -0.364399994 -1.0025700075 -0.2832315065 +-0.364399994 -1.0025700075 -0.2832315065 -0.0865565035 -1.0226450195 -0.262907013 +-0.0865565035 -1.0226450195 -0.262907013 -0.087268997 -1.0023449705 -0.287467987 +-0.391774994 1.0136049805 0.1447559965 -0.3919964905 1.022085022 0.1340399935 +-0.3919964905 1.022085022 0.1340399935 -0.3733554995 1.022085022 0.1336495055 +-0.3733554995 1.022085022 0.1336495055 -0.391774994 1.0136049805 0.1447559965 +-0.8117650145 -0.2581879885 0.140533005 -0.8120300295 -0.239447006 0.121001999 +-0.8120300295 -0.239447006 0.121001999 -0.6989349975 -0.2429055025 0.1125479965 +-0.6989349975 -0.2429055025 0.1125479965 -0.8117650145 -0.2581879885 0.140533005 +-0.3912680055 -0.2236069945 0.141865494 -0.414034485 -0.2644345095 0.1314579925 +-0.414034485 -0.2644345095 0.1314579925 -0.39104599 -0.228850006 0.1472254945 +-0.39104599 -0.228850006 0.1472254945 -0.3912680055 -0.2236069945 0.141865494 +-0.3986954955 -1.0437299805 -0.313182495 -0.4281619875 -1.060910034 -0.291372986 +-0.4281619875 -1.060910034 -0.291372986 -0.3979100035 -1.060910034 -0.292078491 +-0.3979100035 -1.060910034 -0.292078491 -0.3986954955 -1.0437299805 -0.313182495 +-0.3978670045 -1.0068049925 -0.283486511 -0.4282235105 -1.0068049925 -0.2831174925 +-0.4282235105 -1.0068049925 -0.2831174925 -0.397646515 -1.0239849855 -0.2620589905 +-0.397646515 -1.0239849855 -0.2620589905 -0.3978670045 -1.0068049925 -0.283486511 +-0.8111900025 0.232078003 0.182162506 -0.8118049925 0.244237503 0.1583840025 +-0.8118049925 0.244237503 0.1583840025 -0.698659973 0.251600006 0.157964493 +-0.698659973 0.251600006 0.157964493 -0.8111900025 0.232078003 0.182162506 +-0.0876624985 -1.0450699465 -0.321953491 -0.3643034975 -1.064925049 -0.293159485 +-0.3643034975 -1.064925049 -0.293159485 -0.087058502 -1.06526001 -0.297505493 +-0.087058502 -1.06526001 -0.297505493 -0.0876624985 -1.0450699465 -0.321953491 +-0.6989349975 -0.2429055025 0.1125479965 -0.8117650145 -0.2581879885 0.140533005 +-0.8117650145 -0.2581879885 0.140533005 -0.69875 -0.264880493 0.1356475065 +-0.69875 -0.264880493 0.1356475065 -0.6989349975 -0.2429055025 0.1125479965 +-0.698539978 0.1489725035 0.141565506 -0.6991849975 0.1636974945 0.1138809965 +-0.6991849975 0.1636974945 0.1138809965 -0.4135985105 0.1494190065 0.1372695005 +-0.4135985105 0.1494190065 0.1372695005 -0.698539978 0.1489725035 0.141565506 +-0.4142409975 0.1639205015 0.1093619995 -0.6991849975 0.1636974945 0.1138809965 +-0.6991849975 0.1636974945 0.1138809965 -0.4135985105 0.1494190065 0.1372695005 +-0.4135985105 0.1494190065 0.1372695005 -0.4142409975 0.1639205015 0.1093619995 +-0.4278934935 -1.0236500245 -0.261576996 -0.4282235105 -1.0068049925 -0.2831174925 +-0.4282235105 -1.0068049925 -0.2831174925 -0.397646515 -1.0239849855 -0.2620589905 +-0.397646515 -1.0239849855 -0.2620589905 -0.4278934935 -1.0236500245 -0.261576996 +-0.8109299925 -0.196834503 0.1964494935 -0.811409973 -0.178317505 0.176690506 +-0.811409973 -0.178317505 0.176690506 -0.6978950195 -0.1932649995 0.201272003 +-0.6978950195 -0.1932649995 0.201272003 -0.8109299925 -0.196834503 0.1964494935 +-0.6981900025 -0.170955002 0.1780579985 -0.811409973 -0.178317505 0.176690506 +-0.811409973 -0.178317505 0.176690506 -0.6978950195 -0.1932649995 0.201272003 +-0.6978950195 -0.1932649995 0.201272003 -0.6981900025 -0.170955002 0.1780579985 +0.095731003 -0.1586840055 -0.069856003 0.2424004975 -0.0841679995 -0.109963501 +0.2424004975 -0.0841679995 -0.109963501 0.243067505 -0.115179497 -0.0725719985 +0.243067505 -0.115179497 -0.0725719985 0.095731003 -0.1586840055 -0.069856003 +-0.4281619875 -1.060910034 -0.291372986 -0.4284914855 -1.0437299805 -0.3129140015 +-0.4284914855 -1.0437299805 -0.3129140015 -0.3986954955 -1.0437299805 -0.313182495 +-0.3986954955 -1.0437299805 -0.313182495 -0.4281619875 -1.060910034 -0.291372986 +-0.0135162495 0.305924988 0.090643997 -0.0757074965 0.280825989 0.1406649935 +-0.0757074965 0.280825989 0.1406649935 -0.01264795 0.280825989 0.1397545015 +-0.01264795 0.280825989 0.1397545015 -0.0135162495 0.305924988 0.090643997 +-0.3578984985 0.995755005 0.141449005 -0.358160492 1.01561499 0.1166735 +-0.358160492 1.01561499 0.1166735 -0.0810410005 1.0157249755 0.1129940035 +-0.0810410005 1.0157249755 0.1129940035 -0.3578984985 0.995755005 0.141449005 +-0.698659973 0.251600006 0.157964493 -0.8111900025 0.232078003 0.182162506 +-0.8111900025 0.232078003 0.182162506 -0.698125 0.236875 0.1857579955 +-0.698125 0.236875 0.1857579955 -0.698659973 0.251600006 0.157964493 +-0.3917485045 1.0319000245 0.159484497 -0.3919704895 1.04048999 0.1487684935 +-0.3919704895 1.04048999 0.1487684935 -0.372782501 1.0319000245 0.1595464935 +-0.372782501 1.0319000245 0.1595464935 -0.3917485045 1.0319000245 0.159484497 +-0.69875 -0.264880493 0.1356475065 -0.6989349975 -0.2429055025 0.1125479965 +-0.6989349975 -0.2429055025 0.1125479965 -0.414549988 -0.243016495 0.1081279985 +-0.414549988 -0.243016495 0.1081279985 -0.69875 -0.264880493 0.1356475065 +-0.5908200075 -0.003405275 0.03001585 -0.605380005 -0.00189917 -0.0125483 +-0.605380005 -0.00189917 -0.0125483 -0.5905700075 -0.03212965 0.0181384505 +-0.5905700075 -0.03212965 0.0181384505 -0.5908200075 -0.003405275 0.03001585 +-0.3919704895 1.04048999 0.1487684935 -0.3728945005 1.0405999755 0.1489450075 +-0.3728945005 1.0405999755 0.1489450075 -0.372782501 1.0319000245 0.1595464935 +-0.372782501 1.0319000245 0.1595464935 -0.3919704895 1.04048999 0.1487684935 +-0.391774994 1.0136049805 0.1447559965 -0.373359009 1.0132700195 0.144472 +-0.373359009 1.0132700195 0.144472 -0.3733554995 1.022085022 0.1336495055 +-0.3733554995 1.022085022 0.1336495055 -0.391774994 1.0136049805 0.1447559965 +-0.37967099 1.0114849855 -0.31055249 -0.379950012 1.024869995 -0.313236511 +-0.379950012 1.024869995 -0.313236511 -0.364604492 1.0364749755 -0.300083496 +-0.364604492 1.0364749755 -0.300083496 -0.37967099 1.0114849855 -0.31055249 +-0.398068512 -1.0475250245 -0.289850006 -0.3982879945 -1.0388199465 -0.30067749 +-0.3982879945 -1.0388199465 -0.30067749 -0.3795400085 -1.038709961 -0.300842987 +-0.3795400085 -1.038709961 -0.300842987 -0.398068512 -1.0475250245 -0.289850006 +-0.364604492 1.0364749755 -0.300083496 -0.37967099 1.0114849855 -0.31055249 +-0.37967099 1.0114849855 -0.31055249 -0.3644035035 1.005460022 -0.293719513 +-0.3644035035 1.005460022 -0.293719513 -0.364604492 1.0364749755 -0.300083496 +-0.0762330015 -0.1558954925 0.1231364975 -0.0131756495 -0.1561185 0.1223379975 +-0.0131756495 -0.1561185 0.1223379975 -0.0124575995 -0.193822998 0.162632004 +-0.0124575995 -0.193822998 0.162632004 -0.0762330015 -0.1558954925 0.1231364975 +-0.378959503 -1.0288950195 -0.275279999 -0.3791839905 -1.0201950075 -0.2858840025 +-0.3791839905 -1.0201950075 -0.2858840025 -0.364023987 -1.022424988 -0.2585650025 +-0.364023987 -1.022424988 -0.2585650025 -0.378959503 -1.0288950195 -0.275279999 +-0.364399994 -1.0025700075 -0.2832315065 -0.3791839905 -1.0201950075 -0.2858840025 +-0.3791839905 -1.0201950075 -0.2858840025 -0.364023987 -1.022424988 -0.2585650025 +-0.364023987 -1.022424988 -0.2585650025 -0.364399994 -1.0025700075 -0.2832315065 +-0.372782501 1.0319000245 0.1595464935 -0.3728945005 1.0405999755 0.1489450075 +-0.3728945005 1.0405999755 0.1489450075 -0.3572795105 1.038369995 0.175826996 +-0.3572795105 1.038369995 0.175826996 -0.372782501 1.0319000245 0.1595464935 +-0.7051550295 0.142614502 -0.3095599975 -0.705674988 0.1645899965 -0.3327789915 +-0.705674988 0.1645899965 -0.3327789915 -0.421191498 0.1650359955 -0.336527008 +-0.421191498 0.1650359955 -0.336527008 -0.7051550295 0.142614502 -0.3095599975 +-0.075633003 -0.193822998 0.1637630005 -0.0762330015 -0.1558954925 0.1231364975 +-0.0762330015 -0.1558954925 0.1231364975 -0.0124575995 -0.193822998 0.162632004 +-0.0124575995 -0.193822998 0.162632004 -0.075633003 -0.193822998 0.1637630005 +-0.3728945005 1.0405999755 0.1489450075 -0.357885498 1.058449951 0.1514909975 +-0.357885498 1.058449951 0.1514909975 -0.3572795105 1.038369995 0.175826996 +-0.3572795105 1.038369995 0.175826996 -0.3728945005 1.0405999755 0.1489450075 +-0.372256012 -1.0350300295 0.1930305025 -0.372307495 -1.0483050535 0.1954839935 +-0.372307495 -1.0483050535 0.1954839935 -0.3571340025 -1.0233150025 0.2061784975 +-0.3571340025 -1.0233150025 0.2061784975 -0.372256012 -1.0350300295 0.1930305025 +-0.372307495 -1.0483050535 0.1954839935 -0.3571340025 -1.0233150025 0.2061784975 +-0.3571340025 -1.0233150025 0.2061784975 -0.356928009 -1.054214966 0.212319504 +-0.356928009 -1.054214966 0.212319504 -0.372307495 -1.0483050535 0.1954839935 +-0.0757074965 0.280825989 0.1406649935 -0.0763499985 0.305924988 0.091447998 +-0.0763499985 0.305924988 0.091447998 -0.0135162495 0.305924988 0.090643997 +-0.0135162495 0.305924988 0.090643997 -0.0757074965 0.280825989 0.1406649935 +-0.70513501 -0.258745514 -0.289364502 -0.7054450075 -0.244132004 -0.3171535035 +-0.7054450075 -0.244132004 -0.3171535035 -0.420192505 -0.2585224915 -0.2936610105 +-0.420192505 -0.2585224915 -0.2936610105 -0.70513501 -0.258745514 -0.289364502 +-0.420726013 -0.2442440035 -0.3214544985 -0.7054450075 -0.244132004 -0.3171535035 +-0.7054450075 -0.244132004 -0.3171535035 -0.420192505 -0.2585224915 -0.2936610105 +-0.420192505 -0.2585224915 -0.2936610105 -0.420726013 -0.2442440035 -0.3214544985 +-0.036099098 0.0115427 0.162024994 -0.0527330015 0.0115427 0.1624575045 +-0.0527330015 0.0115427 0.1624575045 -0.0221133995 0.036418701 0.133531006 +-0.0221133995 0.036418701 0.133531006 -0.036099098 0.0115427 0.162024994 +-0.414549988 -0.243016495 0.1081279985 -0.69875 -0.264880493 0.1356475065 +-0.69875 -0.264880493 0.1356475065 -0.414034485 -0.2644345095 0.1314579925 +-0.414034485 -0.2644345095 0.1314579925 -0.414549988 -0.243016495 0.1081279985 +-0.698125 0.236875 0.1857579955 -0.698659973 0.251600006 0.157964493 +-0.698659973 0.251600006 0.157964493 -0.4137214965 0.2514880065 0.153779999 +-0.4137214965 0.2514880065 0.153779999 -0.698125 0.236875 0.1857579955 +-0.366709015 0.0510040015 0.0920045015 -0.366709015 -0.0489177015 0.0920045015 +-0.366709015 -0.0489177015 0.0920045015 -0.36017749 0.043362549 0.1090999985 +-0.36017749 0.043362549 0.1090999985 -0.366709015 0.0510040015 0.0920045015 +-0.421191498 0.1650359955 -0.336527008 -0.7051550295 0.142614502 -0.3095599975 +-0.7051550295 0.142614502 -0.3095599975 -0.420447998 0.143171997 -0.3134150085 +-0.420447998 0.143171997 -0.3134150085 -0.421191498 0.1650359955 -0.336527008 +-0.0826054995 0.1662630005 -0.313032501 -0.3992210085 0.122088997 -0.266778015 +-0.3992210085 0.122088997 -0.266778015 -0.0819990005 0.128001007 -0.2727409975 +-0.0819990005 0.128001007 -0.2727409975 -0.0826054995 0.1662630005 -0.313032501 +-0.4143890075 0.224158005 0.1004329985 -0.414620514 0.1922545015 0.0955195005 +-0.414620514 0.1922545015 0.0955195005 -0.391092987 0.1986130065 0.133501007 +-0.391092987 0.1986130065 0.133501007 -0.4143890075 0.224158005 0.1004329985 +-0.0835910035 -1.031125 -0.2872795105 -0.0835930025 -1.026550049 -0.2925234985 +-0.0835930025 -1.026550049 -0.2925234985 0.54801001 -1.026329956 -0.301942993 +0.54801001 -1.026329956 -0.301942993 -0.0835910035 -1.031125 -0.2872795105 +-0.704299988 0.2146764985 -0.2440475005 -0.704710022 0.236875 -0.267040497 +-0.704710022 0.236875 -0.267040497 -0.4195794985 0.2145650025 -0.2483484955 +-0.4195794985 0.2145650025 -0.2483484955 -0.704299988 0.2146764985 -0.2440475005 +0.54801001 -1.026329956 -0.301942993 -0.0835910035 -1.031125 -0.2872795105 +-0.0835910035 -1.031125 -0.2872795105 0.548119995 -1.030454956 -0.296473999 +0.548119995 -1.030454956 -0.296473999 0.54801001 -1.026329956 -0.301942993 +-0.704710022 0.236875 -0.267040497 -0.419994995 0.236651993 -0.2711185 +-0.419994995 0.236651993 -0.2711185 -0.4195794985 0.2145650025 -0.2483484955 +-0.4195794985 0.2145650025 -0.2483484955 -0.704710022 0.236875 -0.267040497 +-0.083765999 -1.036035034 -0.300226013 0.5478150025 -1.0287800295 -0.308530487 +0.5478150025 -1.0287800295 -0.308530487 0.5479450075 -1.0399399415 -0.304064514 +0.5479450075 -1.0399399415 -0.304064514 -0.083765999 -1.036035034 -0.300226013 +-0.6138599855 0.058282501 0.0833130035 -0.6140250245 0.1022330015 0.0486092985 +-0.6140250245 0.1022330015 0.0486092985 -0.586830017 0.1207505035 0.0660270005 +-0.586830017 0.1207505035 0.0660270005 -0.6138599855 0.058282501 0.0833130035 +-0.083318001 -1.040494995 -0.2949725035 -0.083765999 -1.036035034 -0.300226013 +-0.083765999 -1.036035034 -0.300226013 0.5479450075 -1.0399399415 -0.304064514 +0.5479450075 -1.0399399415 -0.304064514 -0.083318001 -1.040494995 -0.2949725035 +-0.068318001 0.0365300485 0.1341255035 -0.091324997 -0.00307031 0.1352055055 +-0.091324997 -0.00307031 0.1352055055 -0.0611064985 -0.00273584 0.1627285005 +-0.0611064985 -0.00273584 0.1627285005 -0.068318001 0.0365300485 0.1341255035 +-0.3992210085 0.122088997 -0.266778015 -0.399822998 0.1597929995 -0.307292511 +-0.399822998 0.1597929995 -0.307292511 -0.0826054995 0.1662630005 -0.313032501 +-0.0826054995 0.1662630005 -0.313032501 -0.3992210085 0.122088997 -0.266778015 +-0.3643034975 -1.064925049 -0.293159485 -0.3646839905 -1.0451800535 -0.317602997 +-0.3646839905 -1.0451800535 -0.317602997 -0.0876624985 -1.0450699465 -0.321953491 +-0.0876624985 -1.0450699465 -0.321953491 -0.3643034975 -1.064925049 -0.293159485 +-0.068318001 0.0365300485 0.1341255035 -0.0527330015 0.0115427 0.1624575045 +-0.0527330015 0.0115427 0.1624575045 -0.0221133995 0.036418701 0.133531006 +-0.0221133995 0.036418701 0.133531006 -0.068318001 0.0365300485 0.1341255035 +-0.586830017 0.1207505035 0.0660270005 -0.6138599855 0.058282501 0.0833130035 +-0.6138599855 0.058282501 0.0833130035 -0.5861099855 0.0693259965 0.106208 +-0.5861099855 0.0693259965 0.106208 -0.586830017 0.1207505035 0.0660270005 +-0.4203150025 -0.1561185 -0.2771505125 -0.7045 -0.1707319945 -0.2451674955 +-0.7045 -0.1707319945 -0.2451674955 -0.4196700135 -0.1706204985 -0.2493545075 +-0.4196700135 -0.1706204985 -0.2493545075 -0.4203150025 -0.1561185 -0.2771505125 +-0.017202299 -0.1372660065 -0.2074515075 -0.0793929975 -0.1620305025 -0.1574295045 +-0.0793929975 -0.1620305025 -0.1574295045 -0.0165569495 -0.162142502 -0.158345001 +-0.0165569495 -0.162142502 -0.158345001 -0.017202299 -0.1372660065 -0.2074515075 +-0.357885498 1.058449951 0.1514909975 -0.0809820025 1.058334961 0.1474725035 +-0.0809820025 1.058334961 0.1474725035 -0.080376503 1.0385949705 0.171808502 +-0.080376503 1.0385949705 0.171808502 -0.357885498 1.058449951 0.1514909975 +-0.3572795105 1.038369995 0.175826996 -0.357885498 1.058449951 0.1514909975 +-0.357885498 1.058449951 0.1514909975 -0.080376503 1.0385949705 0.171808502 +-0.080376503 1.0385949705 0.171808502 -0.3572795105 1.038369995 0.175826996 +-0.0810410005 1.0157249755 0.1129940035 -0.3578984985 0.995755005 0.141449005 +-0.3578984985 0.995755005 0.141449005 -0.080772003 0.995869995 0.1374349975 +-0.080772003 0.995869995 0.1374349975 -0.0810410005 1.0157249755 0.1129940035 +-0.590580017 -0.1214260025 -0.186546997 -0.6176500245 -0.1046934965 -0.167365494 +-0.6176500245 -0.1046934965 -0.167365494 -0.5887700195 -0.159800003 -0.0598709985 +-0.5887700195 -0.159800003 -0.0598709985 -0.590580017 -0.1214260025 -0.186546997 +-0.539215027 -0.0394641 0.100496002 -0.547130005 -0.0489177015 0.0882249985 +-0.547130005 -0.0489177015 0.0882249985 -0.539215027 0.041549801 0.100496002 +-0.539215027 0.041549801 0.100496002 -0.539215027 -0.0394641 0.100496002 +-0.398976013 -0.306601013 -0.235866501 -0.399395996 -0.281390503 -0.2850805055 +-0.399395996 -0.281390503 -0.2850805055 -0.0814189985 -0.3126245115 -0.2418224945 +-0.0814189985 -0.3126245115 -0.2418224945 -0.398976013 -0.306601013 -0.235866501 +-0.0761695025 0.130455002 0.0561935005 -0.0772649995 0.1557774965 0.0073007 +-0.0772649995 0.1557774965 0.0073007 -0.0132262 0.1311244965 0.055503502 +-0.0132262 0.1311244965 0.055503502 -0.0761695025 0.130455002 0.0561935005 +-0.082064499 -0.28730249 -0.2909295045 -0.399395996 -0.281390503 -0.2850805055 +-0.399395996 -0.281390503 -0.2850805055 -0.0814189985 -0.3126245115 -0.2418224945 +-0.0814189985 -0.3126245115 -0.2418224945 -0.082064499 -0.28730249 -0.2909295045 +-0.539215027 0.041549801 0.100496002 -0.547130005 0.0510040015 0.0882249985 +-0.547130005 0.0510040015 0.0882249985 -0.458218994 0.041549801 0.102193001 +-0.458218994 0.041549801 0.102193001 -0.539215027 0.041549801 0.100496002 +-0.547130005 0.0510040015 0.0882249985 -0.458218994 0.041549801 0.102193001 +-0.458218994 0.041549801 0.102193001 -0.4472309875 0.0510040015 0.0903174975 +-0.4472309875 0.0510040015 0.0903174975 -0.547130005 0.0510040015 0.0882249985 +-0.076989502 1.031339966 0.137960495 -0.0770759965 1.0201849975 0.1420870055 +-0.0770759965 1.0201849975 0.1420870055 0.5541849975 1.0195150145 0.1331065065 +0.5541849975 1.0195150145 0.1331065065 -0.076989502 1.031339966 0.137960495 +-0.0767959975 1.0294449465 0.150014496 -0.0770179975 1.0336850585 0.144654495 +-0.0770179975 1.0336850585 0.144654495 0.5541400145 1.0336850585 0.1351139985 +0.5541400145 1.0336850585 0.1351139985 -0.0767959975 1.0294449465 0.150014496 +0.5540549925 1.031005005 0.128529007 -0.076989502 1.031339966 0.137960495 +-0.076989502 1.031339966 0.137960495 0.5541849975 1.0195150145 0.1331065065 +0.5541849975 1.0195150145 0.1331065065 0.5540549925 1.031005005 0.128529007 +-0.413470001 -0.170843506 0.1737575075 -0.6981900025 -0.170955002 0.1780579985 +-0.6981900025 -0.170955002 0.1780579985 -0.413173004 -0.1929299925 0.196859497 +-0.413173004 -0.1929299925 0.196859497 -0.413470001 -0.170843506 0.1737575075 +-0.6978950195 -0.1932649995 0.201272003 -0.6981900025 -0.170955002 0.1780579985 +-0.6981900025 -0.170955002 0.1780579985 -0.413173004 -0.1929299925 0.196859497 +-0.413173004 -0.1929299925 0.196859497 -0.6978950195 -0.1932649995 0.201272003 +-0.0138381995 -0.281947998 -0.000519875 -0.0766255035 -0.319317993 0.0406752015 +-0.0766255035 -0.319317993 0.0406752015 -0.0135636995 -0.319540985 0.039653099 +-0.0135636995 -0.319540985 0.039653099 -0.0138381995 -0.281947998 -0.000519875 +-0.2079640045 -0.1587955015 -0.065171501 0.095731003 -0.1586840055 -0.069856003 +0.095731003 -0.1586840055 -0.069856003 0.0967710035 -0.122987999 -0.146151993 +0.0967710035 -0.122987999 -0.146151993 -0.2079640045 -0.1587955015 -0.065171501 +-0.547130005 0.0510040015 0.0882249985 -0.547130005 -0.0489177015 0.0882249985 +-0.547130005 -0.0489177015 0.0882249985 -0.539215027 0.041549801 0.100496002 +-0.539215027 0.041549801 0.100496002 -0.547130005 0.0510040015 0.0882249985 +-0.01398065 0.155442505 0.00628325 -0.0772649995 0.1557774965 0.0073007 +-0.0772649995 0.1557774965 0.0073007 -0.0132262 0.1311244965 0.055503502 +-0.0132262 0.1311244965 0.055503502 -0.01398065 0.155442505 0.00628325 +-0.0766255035 -0.319317993 0.0406752015 -0.077117996 -0.281725006 0.000274572 +-0.077117996 -0.281725006 0.000274572 -0.0138381995 -0.281947998 -0.000519875 +-0.0138381995 -0.281947998 -0.000519875 -0.0766255035 -0.319317993 0.0406752015 +-0.4137214965 0.2514880065 0.153779999 -0.698125 0.236875 0.1857579955 +-0.698125 0.236875 0.1857579955 -0.413183014 0.237209503 0.1813504945 +-0.413183014 0.237209503 0.1813504945 -0.4137214965 0.2514880065 0.153779999 +0.5541400145 1.0336850585 0.1351139985 -0.0767959975 1.0294449465 0.150014496 +-0.0767959975 1.0294449465 0.150014496 0.554244995 1.029 0.1406950075 +0.554244995 1.029 0.1406950075 0.5541400145 1.0336850585 0.1351139985 +-0.075651001 -0.32623349 0.095367996 -0.0762770005 -0.150429001 0.0613240015 +-0.0762770005 -0.150429001 0.0613240015 -0.0124824495 -0.32623349 0.094570999 +-0.0124824495 -0.32623349 0.094570999 -0.075651001 -0.32623349 0.095367996 +-0.0131036995 -0.1507640075 0.0603045005 -0.0762770005 -0.150429001 0.0613240015 +-0.0762770005 -0.150429001 0.0613240015 -0.0124824495 -0.32623349 0.094570999 +-0.0124824495 -0.32623349 0.094570999 -0.0131036995 -0.1507640075 0.0603045005 +-0.028180849 -0.00273584 0.1621909945 -0.036113098 -0.016902849 0.162694 +-0.036113098 -0.016902849 0.162694 -0.0220345495 -0.0428942985 0.135095001 +-0.0220345495 -0.0428942985 0.135095001 -0.028180849 -0.00273584 0.1621909945 +-0.0138086995 -0.1494255065 0.067319 -0.0762490005 -0.3247839965 0.102607498 +-0.0762490005 -0.3247839965 0.102607498 -0.0130736 -0.324449005 0.1014765015 +-0.0130736 -0.324449005 0.1014765015 -0.0138086995 -0.1494255065 0.067319 +-0.705674988 0.1645899965 -0.3327789915 -0.421191498 0.1650359955 -0.336527008 +-0.421191498 0.1650359955 -0.336527008 -0.420950989 0.1964935 -0.3426579895 +-0.420950989 0.1964935 -0.3426579895 -0.705674988 0.1645899965 -0.3327789915 +-0.0220345495 -0.0428942985 0.135095001 -0.028180849 -0.00273584 0.1621909945 +-0.028180849 -0.00273584 0.1621909945 0.000972655 -0.00273584 0.134014496 +0.000972655 -0.00273584 0.134014496 -0.0220345495 -0.0428942985 0.135095001 +-0.705674988 0.1645899965 -0.3327789915 -0.7057750245 0.196382004 -0.3386944885 +-0.7057750245 0.196382004 -0.3386944885 -0.420950989 0.1964935 -0.3426579895 +-0.420950989 0.1964935 -0.3426579895 -0.705674988 0.1645899965 -0.3327789915 +0.0004238665 -0.0035166 0.096292 -0.0220345495 -0.0428942985 0.135095001 +-0.0220345495 -0.0428942985 0.135095001 0.000972655 -0.00273584 0.134014496 +0.000972655 -0.00273584 0.134014496 0.0004238665 -0.0035166 0.096292 +-0.0314913005 -0.0430058515 0.096515999 -0.0608115005 -0.0426708985 0.1220094985 +-0.0608115005 -0.0426708985 0.1220094985 -0.0312316 -0.0427826995 0.121401497 +-0.0312316 -0.0427826995 0.121401497 -0.0314913005 -0.0430058515 0.096515999 +-0.0762490005 -0.3247839965 0.102607498 -0.0768724975 -0.1494255065 0.0684524995 +-0.0768724975 -0.1494255065 0.0684524995 -0.0138086995 -0.1494255065 0.067319 +-0.0138086995 -0.1494255065 0.067319 -0.0762490005 -0.3247839965 0.102607498 +-0.017911249 -0.3124014895 -0.2428359985 -0.0181679 -0.136151001 -0.214612503 +-0.0181679 -0.136151001 -0.214612503 -0.017202299 -0.1372660065 -0.2074515075 +-0.017202299 -0.1372660065 -0.2074515075 -0.017911249 -0.3124014895 -0.2428359985 +-0.0172801 -0.3136285095 -0.2356815035 -0.017911249 -0.3124014895 -0.2428359985 +-0.017911249 -0.3124014895 -0.2428359985 -0.017202299 -0.1372660065 -0.2074515075 +-0.017202299 -0.1372660065 -0.2074515075 -0.0172801 -0.3136285095 -0.2356815035 +-0.6989349975 -0.2429055025 0.1125479965 -0.6991450195 -0.211671005 0.1066299975 +-0.6991450195 -0.211671005 0.1066299975 -0.4144265135 -0.2113359985 0.102217499 +-0.4144265135 -0.2113359985 0.102217499 -0.6989349975 -0.2429055025 0.1125479965 +0.098272499 0.0597330015 0.096444504 0.0980565035 0.069661003 0.0961054995 +0.0980565035 0.069661003 0.0961054995 0.2498950045 0.053039501 0.1234970015 +0.2498950045 0.053039501 0.1234970015 0.098272499 0.0597330015 0.096444504 +0.0982304995 -0.0677699965 0.0984520035 0.0981190035 -0.0753554995 0.098449997 +0.0981190035 -0.0753554995 0.098449997 0.248376999 -0.0656504975 0.1267005005 +0.248376999 -0.0656504975 0.1267005005 0.0982304995 -0.0677699965 0.0984520035 +-0.0754089965 -0.2480370025 0.1743674925 -0.075633003 -0.193822998 0.1637630005 +-0.075633003 -0.193822998 0.1637630005 -0.0123405 -0.2480370025 0.173010498 +-0.0123405 -0.2480370025 0.173010498 -0.0754089965 -0.2480370025 0.1743674925 +0.5548549805 -1.0385999755 0.1756309965 -0.0764349975 -1.045959961 0.186061493 +-0.0764349975 -1.045959961 0.186061493 0.5549400025 -1.0454050295 0.1769714965 +0.5549400025 -1.0454050295 0.1769714965 0.5548549805 -1.0385999755 0.1756309965 +-0.01395065 -0.2276224975 -0.0111220505 -0.077117996 -0.281725006 0.000274572 +-0.077117996 -0.281725006 0.000274572 -0.0138381995 -0.281947998 -0.000519875 +-0.0138381995 -0.281947998 -0.000519875 -0.01395065 -0.2276224975 -0.0111220505 +-0.0612874985 -0.0432287485 0.0967839965 -0.0608115005 -0.0426708985 0.1220094985 +-0.0608115005 -0.0426708985 0.1220094985 -0.0314913005 -0.0430058515 0.096515999 +-0.0314913005 -0.0430058515 0.096515999 -0.0612874985 -0.0432287485 0.0967839965 +-0.6978950195 -0.1932649995 0.201272003 -0.6979050295 -0.224610504 0.207185501 +-0.6979050295 -0.224610504 0.207185501 -0.4129599915 -0.224498993 0.2026660005 +-0.4129599915 -0.224498993 0.2026660005 -0.6978950195 -0.1932649995 0.201272003 +0.56151001 1.021299988 -0.3231944885 0.547325012 1.019965027 -0.3331984865 +0.547325012 1.019965027 -0.3331984865 0.5621500245 1.0152800295 -0.3218420105 +0.5621500245 1.0152800295 -0.3218420105 0.56151001 1.021299988 -0.3231944885 +-0.413173004 -0.1929299925 0.196859497 -0.6978950195 -0.1932649995 0.201272003 +-0.6978950195 -0.1932649995 0.201272003 -0.4129599915 -0.224498993 0.2026660005 +-0.4129599915 -0.224498993 0.2026660005 -0.413173004 -0.1929299925 0.196859497 +-0.0124575995 -0.193822998 0.162632004 -0.075633003 -0.193822998 0.1637630005 +-0.075633003 -0.193822998 0.1637630005 -0.0123405 -0.2480370025 0.173010498 +-0.0123405 -0.2480370025 0.173010498 -0.0124575995 -0.193822998 0.162632004 +0.248376999 -0.0656504975 0.1267005005 0.0982304995 -0.0677699965 0.0984520035 +0.0982304995 -0.0677699965 0.0984520035 0.248718994 -0.057841999 0.126373497 +0.248718994 -0.057841999 0.126373497 0.248376999 -0.0656504975 0.1267005005 +0.2498899995 0.0433349495 0.123720001 0.098272499 0.0597330015 0.096444504 +0.098272499 0.0597330015 0.096444504 0.2498950045 0.053039501 0.1234970015 +0.2498950045 0.053039501 0.1234970015 0.2498899995 0.0433349495 0.123720001 +-0.0682389985 -0.0427826995 0.1356889955 -0.0690130005 -0.043340351 0.098072998 +-0.0690130005 -0.043340351 0.098072998 -0.0220345495 -0.0428942985 0.135095001 +-0.0220345495 -0.0428942985 0.135095001 -0.0682389985 -0.0427826995 0.1356889955 +-0.0223600005 -0.043340351 0.097376503 -0.0690130005 -0.043340351 0.098072998 +-0.0690130005 -0.043340351 0.098072998 -0.0220345495 -0.0428942985 0.135095001 +-0.0220345495 -0.0428942985 0.135095001 -0.0223600005 -0.043340351 0.097376503 +0.248718994 -0.057841999 0.126373497 0.1539559935 0.0515895005 0.106760002 +0.1539559935 0.0515895005 0.106760002 0.2498899995 0.0433349495 0.123720001 +0.2498899995 0.0433349495 0.123720001 0.248718994 -0.057841999 0.126373497 +-0.022668751 0.0358608515 0.096142502 -0.0686484985 0.0359724005 0.0966299975 +-0.0686484985 0.0359724005 0.0966299975 -0.0221133995 0.036418701 0.133531006 +-0.0221133995 0.036418701 0.133531006 -0.022668751 0.0358608515 0.096142502 +-0.077117996 -0.281725006 0.000274572 -0.0774560015 -0.2273995055 -0.0102207005 +-0.0774560015 -0.2273995055 -0.0102207005 -0.01395065 -0.2276224975 -0.0111220505 +-0.01395065 -0.2276224975 -0.0111220505 -0.077117996 -0.281725006 0.000274572 +0.2424004975 -0.0841679995 -0.109963501 0.242095505 -0.01188305 -0.1273759995 +0.242095505 -0.01188305 -0.1273759995 0.597034973 -0.0122177495 -0.149508499 +0.597034973 -0.0122177495 -0.149508499 0.2424004975 -0.0841679995 -0.109963501 +-0.704299988 0.2146764985 -0.2440475005 -0.7043099975 0.183107498 -0.238022995 +-0.7043099975 0.183107498 -0.238022995 -0.419601013 0.183218994 -0.2419889985 +-0.419601013 0.183218994 -0.2419889985 -0.704299988 0.2146764985 -0.2440475005 +0.5573150025 -0.075467003 0.074149498 0.2444179995 -0.0770289995 0.00678675 +0.2444179995 -0.0770289995 0.00678675 0.5877650145 -0.0758014985 0.074564499 +0.5877650145 -0.0758014985 0.074564499 0.5573150025 -0.075467003 0.074149498 +0.5549400025 -1.0454050295 0.1769714965 0.5548549805 -1.0385999755 0.1756309965 +0.5548549805 -1.0385999755 0.1756309965 0.614789978 -1.0427249755 0.169298996 +0.614789978 -1.0427249755 0.169298996 0.5549400025 -1.0454050295 0.1769714965 +-0.061703499 0.0456775015 0.095324997 -0.0613320005 0.0461232985 0.1202129975 +-0.0613320005 0.0461232985 0.1202129975 -0.032014 0.045565899 0.094831497 +-0.032014 0.045565899 0.094831497 -0.061703499 0.0456775015 0.095324997 +-0.0613364985 0.0357492485 0.1204365005 -0.061594002 0.035079849 0.095439003 +-0.061594002 0.035079849 0.095439003 -0.031656349 0.0357492485 0.1203884965 +-0.031656349 0.0357492485 0.1203884965 -0.0613364985 0.0357492485 0.1204365005 +-0.0320233 0.035526348 0.0952770005 -0.061594002 0.035079849 0.095439003 +-0.061594002 0.035079849 0.095439003 -0.031656349 0.0357492485 0.1203884965 +-0.031656349 0.0357492485 0.1203884965 -0.0320233 0.035526348 0.0952770005 +1.5607650145 -0.0673239975 -0.0881500015 0.5991900025 -0.096885002 0.003283375 +0.5991900025 -0.096885002 0.003283375 1.5617249755 -0.0672125015 -0.032788101 +1.5617249755 -0.0672125015 -0.032788101 1.5607650145 -0.0673239975 -0.0881500015 +-0.016158449 0.254165497 -0.150748993 -0.079331497 0.253942505 -0.1497295075 +-0.079331497 0.253942505 -0.1497295075 -0.016150049 0.1997285005 -0.1404839935 +-0.016150049 0.1997285005 -0.1404839935 -0.016158449 0.254165497 -0.150748993 +-0.032014 0.045565899 0.094831497 -0.0613320005 0.0461232985 0.1202129975 +-0.0613320005 0.0461232985 0.1202129975 -0.0316446495 0.0460119515 0.1198310015 +-0.0316446495 0.0460119515 0.1198310015 -0.032014 0.045565899 0.094831497 +-0.061292 -0.053491501 0.097007004 -0.060813999 -0.053380001 0.122121002 +-0.060813999 -0.053380001 0.122121002 -0.0313547495 -0.053491501 0.1219570005 +-0.0313547495 -0.053491501 0.1219570005 -0.061292 -0.053491501 0.097007004 +-0.079331497 0.253942505 -0.1497295075 -0.079439499 0.199616501 -0.1392435 +-0.079439499 0.199616501 -0.1392435 -0.016150049 0.1997285005 -0.1404839935 +-0.016150049 0.1997285005 -0.1404839935 -0.079331497 0.253942505 -0.1497295075 +1.5617249755 -0.0672125015 -0.032788101 1.5607650145 -0.0673239975 -0.0881500015 +1.5607650145 -0.0673239975 -0.0881500015 1.7184849855 -0.0395476 -0.075139 +1.7184849855 -0.0395476 -0.075139 1.5617249755 -0.0672125015 -0.032788101 +-0.061292 -0.053491501 0.097007004 -0.031714199 -0.053715 0.0965110015 +-0.031714199 -0.053715 0.0965110015 -0.0313547495 -0.053491501 0.1219570005 +-0.0313547495 -0.053491501 0.1219570005 -0.061292 -0.053491501 0.097007004 +-0.6989349975 -0.2429055025 0.1125479965 -0.414549988 -0.243016495 0.1081279985 +-0.414549988 -0.243016495 0.1081279985 -0.4144265135 -0.2113359985 0.102217499 +-0.4144265135 -0.2113359985 0.102217499 -0.6989349975 -0.2429055025 0.1125479965 +-0.0827155 0.220031006 -0.3237464905 -0.399822998 0.1597929995 -0.307292511 +-0.399822998 0.1597929995 -0.307292511 -0.0826054995 0.1662630005 -0.313032501 +-0.0826054995 0.1662630005 -0.313032501 -0.0827155 0.220031006 -0.3237464905 +-0.0220345495 -0.0428942985 0.135095001 -0.0223600005 -0.043340351 0.097376503 +-0.0223600005 -0.043340351 0.097376503 0.0004238665 -0.0035166 0.096292 +0.0004238665 -0.0035166 0.096292 -0.0220345495 -0.0428942985 0.135095001 +0.1539559935 0.0515895005 0.106760002 0.1527079925 -0.0643119965 0.107737999 +0.1527079925 -0.0643119965 0.107737999 0.248718994 -0.057841999 0.126373497 +0.248718994 -0.057841999 0.126373497 0.1539559935 0.0515895005 0.106760002 +0.5981099855 -0.0973310015 -0.0783010025 0.2443829955 -0.096885002 0.00845965 +0.2443829955 -0.096885002 0.00845965 0.5991900025 -0.096885002 0.003283375 +0.5991900025 -0.096885002 0.003283375 0.5981099855 -0.0973310015 -0.0783010025 +-0.068318001 0.0365300485 0.1341255035 -0.0686484985 0.0359724005 0.0966299975 +-0.0686484985 0.0359724005 0.0966299975 -0.0221133995 0.036418701 0.133531006 +-0.0221133995 0.036418701 0.133531006 -0.068318001 0.0365300485 0.1341255035 +-0.605380005 -0.00189917 -0.0125483 -0.5899699705 -0.0440097505 -0.0105796005 +-0.5899699705 -0.0440097505 -0.0105796005 -0.58911499 -0.0245722505 -0.051342499 +-0.58911499 -0.0245722505 -0.051342499 -0.605380005 -0.00189917 -0.0125483 +-0.0764925005 -1.0364799805 0.1781380005 -0.080165001 -1.012830017 0.172371002 +-0.080165001 -1.012830017 0.172371002 -0.0764349975 -1.045959961 0.186061493 +-0.0764349975 -1.045959961 0.186061493 -0.0764925005 -1.0364799805 0.1781380005 +-0.0796760025 -1.0230949705 0.202283493 -0.080165001 -1.012830017 0.172371002 +-0.080165001 -1.012830017 0.172371002 -0.0764349975 -1.045959961 0.186061493 +-0.0764349975 -1.045959961 0.186061493 -0.0796760025 -1.0230949705 0.202283493 +-0.0802819975 0.1226464995 -0.210892502 -0.0173365 0.1230930025 -0.211694 +-0.0173365 0.1230930025 -0.211694 -0.01728615 0.298339508 -0.246058502 +-0.01728615 0.298339508 -0.246058502 -0.0802819975 0.1226464995 -0.210892502 +-0.419601013 0.183218994 -0.2419889985 -0.704299988 0.2146764985 -0.2440475005 +-0.704299988 0.2146764985 -0.2440475005 -0.4195794985 0.2145650025 -0.2483484955 +-0.4195794985 0.2145650025 -0.2483484955 -0.419601013 0.183218994 -0.2419889985 +0.260915985 -0.067100998 0.1140214995 0.248376999 -0.0656504975 0.1267005005 +0.248376999 -0.0656504975 0.1267005005 0.5573150025 -0.075467003 0.074149498 +0.5573150025 -0.075467003 0.074149498 0.260915985 -0.067100998 0.1140214995 +0.597034973 -0.0122177495 -0.149508499 0.5970150145 -0.072901001 -0.143260498 +0.5970150145 -0.072901001 -0.143260498 1.559994995 -0.00976365 -0.136589493 +1.559994995 -0.00976365 -0.136589493 0.597034973 -0.0122177495 -0.149508499 +0.5970150145 -0.072901001 -0.143260498 1.559994995 -0.00976365 -0.136589493 +1.559994995 -0.00976365 -0.136589493 1.560130005 -0.050702999 -0.132347 +1.560130005 -0.050702999 -0.132347 0.5970150145 -0.072901001 -0.143260498 +0.5991900025 -0.096885002 0.003283375 0.5981099855 -0.0973310015 -0.0783010025 +0.5981099855 -0.0973310015 -0.0783010025 1.5607650145 -0.0673239975 -0.0881500015 +1.5607650145 -0.0673239975 -0.0881500015 0.5991900025 -0.096885002 0.003283375 +-0.0826054995 0.1662630005 -0.313032501 -0.0827155 0.220031006 -0.3237464905 +-0.0827155 0.220031006 -0.3237464905 -0.01921245 0.2199194945 -0.3245360105 +-0.01921245 0.2199194945 -0.3245360105 -0.0826054995 0.1662630005 -0.313032501 +-0.0802819975 0.1226464995 -0.210892502 -0.080572998 0.298450989 -0.2449295045 +-0.080572998 0.298450989 -0.2449295045 -0.01728615 0.298339508 -0.246058502 +-0.01728615 0.298339508 -0.246058502 -0.0802819975 0.1226464995 -0.210892502 +-0.380924011 -1.076079956 -0.266730011 -0.5665650025 -0.3301380005 -0.145319 +-0.5665650025 -0.3301380005 -0.145319 -0.380744995 -1.078755005 -0.2486504975 +-0.380744995 -1.078755005 -0.2486504975 -0.380924011 -1.076079956 -0.266730011 +-0.365057007 0.9949749755 -0.3477359925 -0.3653745115 1.026209961 -0.353878998 +-0.3653745115 1.026209961 -0.353878998 -0.0882630005 0.995085022 -0.3518680115 +-0.0882630005 0.995085022 -0.3518680115 -0.365057007 0.9949749755 -0.3477359925 +-0.4195794985 0.2145650025 -0.2483484955 -0.419994995 0.236651993 -0.2711185 +-0.419994995 0.236651993 -0.2711185 -0.3972235105 0.195600998 -0.282245514 +-0.3972235105 0.195600998 -0.282245514 -0.4195794985 0.2145650025 -0.2483484955 +-0.4197265015 -0.2535025025 -0.2626329955 -0.420192505 -0.2585224915 -0.2936610105 +-0.420192505 -0.2585224915 -0.2936610105 -0.3973320005 -0.2195910035 -0.2877149965 +-0.3973320005 -0.2195910035 -0.2877149965 -0.4197265015 -0.2535025025 -0.2626329955 +-0.479845001 0.2959970095 -0.237003006 -0.0811139985 0.1200810015 -0.208455002 +-0.0811139985 0.1200810015 -0.208455002 -0.080088997 0.135586502 -0.129550003 +-0.080088997 0.135586502 -0.129550003 -0.479845001 0.2959970095 -0.237003006 +-0.4791119995 0.1200810015 -0.202733505 -0.479845001 0.2959970095 -0.237003006 +-0.479845001 0.2959970095 -0.237003006 -0.0811139985 0.1200810015 -0.208455002 +-0.0811139985 0.1200810015 -0.208455002 -0.4791119995 0.1200810015 -0.202733505 +-0.075633003 -0.193822998 0.1637630005 -0.392913513 -0.187798996 0.167158493 +-0.392913513 -0.187798996 0.167158493 -0.0754089965 -0.2480370025 0.1743674925 +-0.0754089965 -0.2480370025 0.1743674925 -0.075633003 -0.193822998 0.1637630005 +-0.398878998 1.020075012 -0.3363940125 -0.3801264955 1.0201849975 -0.336782501 +-0.3801264955 1.0201849975 -0.336782501 -0.38007251 1.006799988 -0.3339914855 +-0.38007251 1.006799988 -0.3339914855 -0.398878998 1.020075012 -0.3363940125 +-0.3982470095 0.1151725005 -0.2120859985 -0.398870514 0.2906424865 -0.2462409975 +-0.398870514 0.2906424865 -0.2462409975 -0.0811360015 0.1214195025 -0.2180514985 +-0.0811360015 0.1214195025 -0.2180514985 -0.3982470095 0.1151725005 -0.2120859985 +-0.0809820025 1.058334961 0.1474725035 -0.081139 1.046959961 0.1176784975 +-0.081139 1.046959961 0.1176784975 -0.0770179975 1.0336850585 0.144654495 +-0.0770179975 1.0336850585 0.144654495 -0.0809820025 1.058334961 0.1474725035 +-0.0810410005 1.0157249755 0.1129940035 -0.081139 1.046959961 0.1176784975 +-0.081139 1.046959961 0.1176784975 -0.076989502 1.031339966 0.137960495 +-0.076989502 1.031339966 0.137960495 -0.0810410005 1.0157249755 0.1129940035 +-0.0989465025 -0.3453089905 0.0143223 -0.5640200195 -0.3454205015 0.020870449 +-0.5640200195 -0.3454205015 0.020870449 -0.0962789995 -1.0869000245 0.1586445005 +-0.0962789995 -1.0869000245 0.1586445005 -0.0989465025 -0.3453089905 0.0143223 +-0.0994280015 -0.159911499 -0.0212803495 -0.5640200195 -0.3454205015 0.020870449 +-0.5640200195 -0.3454205015 0.020870449 -0.0989465025 -0.3453089905 0.0143223 +-0.0989465025 -0.3453089905 0.0143223 -0.0994280015 -0.159911499 -0.0212803495 +-0.413467499 0.154326996 0.168290497 -0.4135985105 0.1494190065 0.1372695005 +-0.4135985105 0.1494190065 0.1372695005 -0.3908900145 0.1896889955 0.150464493 +-0.3908900145 0.1896889955 0.150464493 -0.413467499 0.154326996 0.168290497 +-0.3910710145 0.188572998 0.143097 -0.4135985105 0.1494190065 0.1372695005 +-0.4135985105 0.1494190065 0.1372695005 -0.3908900145 0.1896889955 0.150464493 +-0.3908900145 0.1896889955 0.150464493 -0.3910710145 0.188572998 0.143097 +-0.357902008 -1.033579956 0.1522714995 -0.080778 -1.033579956 0.1483690035 +-0.080778 -1.033579956 0.1483690035 -0.0805699995 -1.064589966 0.154399002 +-0.0805699995 -1.064589966 0.154399002 -0.357902008 -1.033579956 0.1522714995 +-0.5643200075 -0.3491019895 0.00334654 -0.0991324995 -0.3487674865 -0.0034221 +-0.0991324995 -0.3487674865 -0.0034221 -0.096685997 -1.09013501 0.1407839965 +-0.096685997 -1.09013501 0.1407839965 -0.5643200075 -0.3491019895 0.00334654 +-0.4290765075 0.9977650145 -0.343609497 -0.429191498 1.024535034 -0.348744507 +-0.429191498 1.024535034 -0.348744507 -0.3989404905 0.9977650145 -0.344093994 +-0.3989404905 0.9977650145 -0.344093994 -0.4290765075 0.9977650145 -0.343609497 +-0.413173004 -0.1929299925 0.196859497 -0.413470001 -0.170843506 0.1737575075 +-0.413470001 -0.170843506 0.1737575075 -0.390921997 -0.211893997 0.162626007 +-0.390921997 -0.211893997 0.162626007 -0.413173004 -0.1929299925 0.196859497 +-0.0184746495 0.296889496 -0.253223999 -0.0816504975 0.297001007 -0.252092499 +-0.0816504975 0.297001007 -0.252092499 -0.0180767995 0.1216429975 -0.2189620055 +-0.0180767995 0.1216429975 -0.2189620055 -0.0184746495 0.296889496 -0.253223999 +-0.0811360015 0.1214195025 -0.2180514985 -0.0816504975 0.297001007 -0.252092499 +-0.0816504975 0.297001007 -0.252092499 -0.0180767995 0.1216429975 -0.2189620055 +-0.0180767995 0.1216429975 -0.2189620055 -0.0811360015 0.1214195025 -0.2180514985 +-0.585909973 0.069661003 0.0966449965 -0.5859699705 -0.0752440035 0.0994329985 +-0.5859699705 -0.0752440035 0.0994329985 -0.2049275055 -0.0747979965 0.093468498 +-0.2049275055 -0.0747979965 0.093468498 -0.585909973 0.069661003 0.0966449965 +-0.2053150025 0.069772499 0.0906709975 -0.585909973 0.069661003 0.0966449965 +-0.585909973 0.069661003 0.0966449965 -0.2049275055 -0.0747979965 0.093468498 +-0.2049275055 -0.0747979965 0.093468498 -0.2053150025 0.069772499 0.0906709975 +-0.3576954955 -1.0644799805 0.158412506 -0.357902008 -1.033579956 0.1522714995 +-0.357902008 -1.033579956 0.1522714995 -0.0805699995 -1.064589966 0.154399002 +-0.0805699995 -1.064589966 0.154399002 -0.3576954955 -1.0644799805 0.158412506 +-0.5640200195 -0.3454205015 0.020870449 -0.374411499 -1.086790039 0.1627485045 +-0.374411499 -1.086790039 0.1627485045 -0.0962789995 -1.0869000245 0.1586445005 +-0.0962789995 -1.0869000245 0.1586445005 -0.5640200195 -0.3454205015 0.020870449 +-0.391013489 -1.052880005 0.1723305055 -0.3912944945 -1.0391550295 0.1697590025 +-0.3912944945 -1.0391550295 0.1697590025 -0.372600006 -1.052880005 0.1721589965 +-0.372600006 -1.052880005 0.1721589965 -0.391013489 -1.052880005 0.1723305055 +-0.5664749755 0.320872986 -0.138845505 -0.566875 0.317303009 -0.1569295045 +-0.566875 0.317303009 -0.1569295045 -0.100772499 0.132463501 -0.1275285035 +-0.100772499 0.132463501 -0.1275285035 -0.5664749755 0.320872986 -0.138845505 +-0.566875 0.317303009 -0.1569295045 -0.5660700075 0.132463501 -0.1209850005 +-0.5660700075 0.132463501 -0.1209850005 -0.100772499 0.132463501 -0.1275285035 +-0.100772499 0.132463501 -0.1275285035 -0.566875 0.317303009 -0.1569295045 +-0.0994280015 -0.159911499 -0.0212803495 -0.5643200075 -0.3491019895 0.00334654 +-0.5643200075 -0.3491019895 0.00334654 -0.0989465025 -0.3453089905 0.0143223 +-0.0989465025 -0.3453089905 0.0143223 -0.0994280015 -0.159911499 -0.0212803495 +-0.3814909975 1.058785034 -0.303561493 -0.566875 0.317303009 -0.1569295045 +-0.566875 0.317303009 -0.1569295045 -0.103468498 1.0588950195 -0.3077795105 +-0.103468498 1.0588950195 -0.3077795105 -0.3814909975 1.058785034 -0.303561493 +-0.566875 0.317303009 -0.1569295045 -0.103468498 1.0588950195 -0.3077795105 +-0.103468498 1.0588950195 -0.3077795105 -0.1014725035 0.317303009 -0.1633589935 +-0.1014725035 0.317303009 -0.1633589935 -0.566875 0.317303009 -0.1569295045 +-0.566875 0.317303009 -0.1569295045 -0.1014725035 0.317303009 -0.1633589935 +-0.1014725035 0.317303009 -0.1633589935 -0.100772499 0.132463501 -0.1275285035 +-0.100772499 0.132463501 -0.1275285035 -0.566875 0.317303009 -0.1569295045 +-0.47505249 -0.3240029905 0.098828499 -0.475229492 -0.1483099975 0.0646825025 +-0.475229492 -0.1483099975 0.0646825025 -0.0771200025 -0.147751999 0.058963501 +-0.0771200025 -0.147751999 0.058963501 -0.47505249 -0.3240029905 0.098828499 +-0.5661550295 -0.3328154905 -0.1274585035 -0.5665650025 -0.3301380005 -0.145319 +-0.5665650025 -0.3301380005 -0.145319 -0.380744995 -1.078755005 -0.2486504975 +-0.380744995 -1.078755005 -0.2486504975 -0.5661550295 -0.3328154905 -0.1274585035 +-0.01921245 0.2199194945 -0.3245360105 -0.0826054995 0.1662630005 -0.313032501 +-0.0826054995 0.1662630005 -0.313032501 -0.019209049 0.165593506 -0.314048004 +-0.019209049 0.165593506 -0.314048004 -0.01921245 0.2199194945 -0.3245360105 +-0.0771200025 -0.147751999 0.058963501 -0.47505249 -0.3240029905 0.098828499 +-0.47505249 -0.3240029905 0.098828499 -0.0766104965 -0.323333496 0.093227501 +-0.0766104965 -0.323333496 0.093227501 -0.0771200025 -0.147751999 0.058963501 +-0.3727669985 -1.0392700195 0.1694774935 -0.3912944945 -1.0391550295 0.1697590025 +-0.3912944945 -1.0391550295 0.1697590025 -0.372600006 -1.052880005 0.1721589965 +-0.372600006 -1.052880005 0.1721589965 -0.3727669985 -1.0392700195 0.1694774935 +-0.0779629975 -0.3389505005 0.0139807995 -0.476128998 -0.4619914855 0.043687599 +-0.476128998 -0.4619914855 0.043687599 -0.077345497 -0.4619914855 0.037758999 +-0.077345497 -0.4619914855 0.037758999 -0.0779629975 -0.3389505005 0.0139807995 +-0.078477501 -0.1633690035 -0.020060499 -0.476186493 -0.3391734925 0.0198092005 +-0.476186493 -0.3391734925 0.0198092005 -0.0779629975 -0.3389505005 0.0139807995 +-0.0779629975 -0.3389505005 0.0139807995 -0.078477501 -0.1633690035 -0.020060499 +-0.099725998 -0.163703995 -0.039027199 -0.5643200075 -0.3491019895 0.00334654 +-0.5643200075 -0.3491019895 0.00334654 -0.0991324995 -0.3487674865 -0.0034221 +-0.0991324995 -0.3487674865 -0.0034221 -0.099725998 -0.163703995 -0.039027199 +-0.398878998 1.020075012 -0.3363940125 -0.3989349975 1.0066900025 -0.333717499 +-0.3989349975 1.0066900025 -0.333717499 -0.38007251 1.006799988 -0.3339914855 +-0.38007251 1.006799988 -0.3339914855 -0.398878998 1.020075012 -0.3363940125 +-0.5643200075 -0.3491019895 0.00334654 -0.3748160095 -1.090244995 0.144776001 +-0.3748160095 -1.090244995 0.144776001 -0.096685997 -1.09013501 0.1407839965 +-0.096685997 -1.09013501 0.1407839965 -0.5643200075 -0.3491019895 0.00334654 +-0.378959503 -1.0288950195 -0.275279999 -0.379361511 -1.042170044 -0.2774079895 +-0.379361511 -1.042170044 -0.2774079895 -0.363916504 -1.053660034 -0.2636954955 +-0.363916504 -1.053660034 -0.2636954955 -0.378959503 -1.0288950195 -0.275279999 +-0.5664749755 0.320872986 -0.138845505 -0.5658900145 0.135921005 -0.1027945025 +-0.5658900145 0.135921005 -0.1027945025 -0.100772499 0.132463501 -0.1275285035 +-0.100772499 0.132463501 -0.1275285035 -0.5664749755 0.320872986 -0.138845505 +-0.5664749755 0.320872986 -0.138845505 -0.5658900145 0.135921005 -0.1027945025 +-0.5658900145 0.135921005 -0.1027945025 -0.100697998 0.136032501 -0.109786499 +-0.100697998 0.136032501 -0.109786499 -0.5664749755 0.320872986 -0.138845505 +-0.3813055115 1.0620200195 -0.285816986 -0.5664749755 0.320872986 -0.138845505 +-0.5664749755 0.320872986 -0.138845505 -0.1032819975 1.0623549805 -0.2900350035 +-0.1032819975 1.0623549805 -0.2900350035 -0.3813055115 1.0620200195 -0.285816986 +-0.5664749755 0.320872986 -0.138845505 -0.1032819975 1.0623549805 -0.2900350035 +-0.1032819975 1.0623549805 -0.2900350035 -0.101293503 0.320872986 -0.145279999 +-0.101293503 0.320872986 -0.145279999 -0.5664749755 0.320872986 -0.138845505 +-0.399822998 0.1597929995 -0.307292511 -0.399938507 0.2138954925 -0.3177835085 +-0.399938507 0.2138954925 -0.3177835085 -0.0827155 0.220031006 -0.3237464905 +-0.0827155 0.220031006 -0.3237464905 -0.399822998 0.1597929995 -0.307292511 +-0.1014725035 0.317303009 -0.1633589935 -0.5664749755 0.320872986 -0.138845505 +-0.5664749755 0.320872986 -0.138845505 -0.100772499 0.132463501 -0.1275285035 +-0.100772499 0.132463501 -0.1275285035 -0.1014725035 0.317303009 -0.1633589935 +-0.080489502 0.3111679995 -0.1637005005 -0.47848999 0.311056488 -0.1578670045 +-0.47848999 0.311056488 -0.1578670045 -0.080088997 0.135586502 -0.129550003 +-0.080088997 0.135586502 -0.129550003 -0.080489502 0.3111679995 -0.1637005005 +-0.5664749755 0.320872986 -0.138845505 -0.101293503 0.320872986 -0.145279999 +-0.101293503 0.320872986 -0.145279999 -0.100697998 0.136032501 -0.109786499 +-0.100697998 0.136032501 -0.109786499 -0.5664749755 0.320872986 -0.138845505 +-0.100772499 0.132463501 -0.1275285035 -0.5664749755 0.320872986 -0.138845505 +-0.5664749755 0.320872986 -0.138845505 -0.100697998 0.136032501 -0.109786499 +-0.100697998 0.136032501 -0.109786499 -0.100772499 0.132463501 -0.1275285035 +-0.3647929995 0.984715027 -0.3177164915 -0.379788513 1.002340027 -0.320932007 +-0.379788513 1.002340027 -0.320932007 -0.3644035035 1.005460022 -0.293719513 +-0.3644035035 1.005460022 -0.293719513 -0.3647929995 0.984715027 -0.3177164915 +-0.0840490035 1.020075012 -0.3239974975 0.5471849975 1.013044983 -0.3318630065 +0.5471849975 1.013044983 -0.3318630065 0.547325012 1.019965027 -0.3331984865 +0.547325012 1.019965027 -0.3331984865 -0.0840490035 1.020075012 -0.3239974975 +-0.0839660035 1.013494995 -0.322657013 -0.0840490035 1.020075012 -0.3239974975 +-0.0840490035 1.020075012 -0.3239974975 0.5471849975 1.013044983 -0.3318630065 +0.5471849975 1.013044983 -0.3318630065 -0.0839660035 1.013494995 -0.322657013 +-0.087268997 -1.0023449705 -0.287467987 -0.0835930025 -1.026550049 -0.2925234985 +-0.0835930025 -1.026550049 -0.2925234985 -0.083453003 -1.0292299805 -0.299215515 +-0.083453003 -1.0292299805 -0.299215515 -0.087268997 -1.0023449705 -0.287467987 +-0.37967099 1.0114849855 -0.31055249 -0.379788513 1.002340027 -0.320932007 +-0.379788513 1.002340027 -0.320932007 -0.3644035035 1.005460022 -0.293719513 +-0.3644035035 1.005460022 -0.293719513 -0.37967099 1.0114849855 -0.31055249 +-0.476128998 -0.4619914855 0.043687599 -0.476186493 -0.3391734925 0.0198092005 +-0.476186493 -0.3391734925 0.0198092005 -0.0779629975 -0.3389505005 0.0139807995 +-0.0779629975 -0.3389505005 0.0139807995 -0.476128998 -0.4619914855 0.043687599 +-0.087430496 -1.013835022 -0.3170390015 -0.0876624985 -1.0450699465 -0.321953491 +-0.0876624985 -1.0450699465 -0.321953491 -0.083765999 -1.036035034 -0.300226013 +-0.083765999 -1.036035034 -0.300226013 -0.087430496 -1.013835022 -0.3170390015 +-0.0873600005 1.036920044 -0.3044295045 -0.0878539965 1.0468449705 -0.334118988 +-0.0878539965 1.0468449705 -0.334118988 -0.083911499 1.0225300295 -0.3305775145 +-0.083911499 1.0225300295 -0.3305775145 -0.0873600005 1.036920044 -0.3044295045 +-0.372307495 -1.0483050535 0.1954839935 -0.390832489 -1.048415039 0.195654007 +-0.390832489 -1.048415039 0.195654007 -0.372256012 -1.0350300295 0.1930305025 +-0.372256012 -1.0350300295 0.1930305025 -0.372307495 -1.0483050535 0.1954839935 +-0.391113495 -1.034920044 0.193081497 -0.390832489 -1.048415039 0.195654007 +-0.390832489 -1.048415039 0.195654007 -0.372256012 -1.0350300295 0.1930305025 +-0.372256012 -1.0350300295 0.1930305025 -0.391113495 -1.034920044 0.193081497 +-0.477980011 0.135363495 -0.123602997 -0.47848999 0.311056488 -0.1578670045 +-0.47848999 0.311056488 -0.1578670045 -0.080088997 0.135586502 -0.129550003 +-0.080088997 0.135586502 -0.129550003 -0.477980011 0.135363495 -0.123602997 +-0.364023987 -1.022424988 -0.2585650025 -0.378959503 -1.0288950195 -0.275279999 +-0.378959503 -1.0288950195 -0.275279999 -0.363916504 -1.053660034 -0.2636954955 +-0.363916504 -1.053660034 -0.2636954955 -0.364023987 -1.022424988 -0.2585650025 +-0.0686484985 0.0359724005 0.0966299975 -0.091989998 -0.0035166 0.097703003 +-0.091989998 -0.0035166 0.097703003 -0.068318001 0.0365300485 0.1341255035 +-0.068318001 0.0365300485 0.1341255035 -0.0686484985 0.0359724005 0.0966299975 +-0.091324997 -0.00307031 0.1352055055 -0.091989998 -0.0035166 0.097703003 +-0.091989998 -0.0035166 0.097703003 -0.068318001 0.0365300485 0.1341255035 +-0.068318001 0.0365300485 0.1341255035 -0.091324997 -0.00307031 0.1352055055 +-0.372782501 1.0319000245 0.1595464935 -0.372846985 1.0185150145 0.1573139955 +-0.372846985 1.0185150145 0.1573139955 -0.357734497 1.0070250245 0.170908005 +-0.357734497 1.0070250245 0.170908005 -0.372782501 1.0319000245 0.1595464935 +-0.080774498 0.434096985 -0.187360504 -0.479105011 0.433873993 -0.1817575075 +-0.479105011 0.433873993 -0.1817575075 -0.080489502 0.3111679995 -0.1637005005 +-0.080489502 0.3111679995 -0.1637005005 -0.080774498 0.434096985 -0.187360504 +-0.47848999 0.311056488 -0.1578670045 -0.479105011 0.433873993 -0.1817575075 +-0.479105011 0.433873993 -0.1817575075 -0.080489502 0.3111679995 -0.1637005005 +-0.080489502 0.3111679995 -0.1637005005 -0.47848999 0.311056488 -0.1578670045 +-0.357734497 1.0070250245 0.170908005 -0.372782501 1.0319000245 0.1595464935 +-0.372782501 1.0319000245 0.1595464935 -0.3572795105 1.038369995 0.175826996 +-0.3572795105 1.038369995 0.175826996 -0.357734497 1.0070250245 0.170908005 +-0.372307495 -1.0483050535 0.1954839935 -0.372536499 -1.05711499 0.1851024935 +-0.372536499 -1.05711499 0.1851024935 -0.356928009 -1.054214966 0.212319504 +-0.356928009 -1.054214966 0.212319504 -0.372307495 -1.0483050535 0.1954839935 +-0.372536499 -1.05711499 0.1851024935 -0.35698349 -1.0751850585 0.1883294985 +-0.35698349 -1.0751850585 0.1883294985 -0.356928009 -1.054214966 0.212319504 +-0.356928009 -1.054214966 0.212319504 -0.372536499 -1.05711499 0.1851024935 +-0.476186493 -0.3391734925 0.0198092005 -0.476254486 -0.163703995 -0.0142228005 +-0.476254486 -0.163703995 -0.0142228005 -0.078477501 -0.1633690035 -0.020060499 +-0.078477501 -0.1633690035 -0.020060499 -0.476186493 -0.3391734925 0.0198092005 +-0.564909973 -0.164261505 -0.0324813005 -0.5643200075 -0.3491019895 0.00334654 +-0.5643200075 -0.3491019895 0.00334654 -0.099725998 -0.163703995 -0.039027199 +-0.099725998 -0.163703995 -0.039027199 -0.564909973 -0.164261505 -0.0324813005 +-0.564909973 -0.164261505 -0.0324813005 -0.5643200075 -0.3491019895 0.00334654 +-0.5643200075 -0.3491019895 0.00334654 -0.0994280015 -0.159911499 -0.0212803495 +-0.0994280015 -0.159911499 -0.0212803495 -0.564909973 -0.164261505 -0.0324813005 +-0.3973299865 0.200732498 -0.287825989 -0.419994995 0.236651993 -0.2711185 +-0.419994995 0.236651993 -0.2711185 -0.3972235105 0.195600998 -0.282245514 +-0.3972235105 0.195600998 -0.282245514 -0.3973299865 0.200732498 -0.287825989 +-0.3938640135 -0.31876001 0.1059954985 -0.3941505125 -0.1431784975 0.0717365035 +-0.3941505125 -0.1431784975 0.0717365035 -0.0768724975 -0.1494255065 0.0684524995 +-0.0768724975 -0.1494255065 0.0684524995 -0.3938640135 -0.31876001 0.1059954985 +-0.0768724975 -0.1494255065 0.0684524995 -0.3938640135 -0.31876001 0.1059954985 +-0.3938640135 -0.31876001 0.1059954985 -0.0762490005 -0.3247839965 0.102607498 +-0.0762490005 -0.3247839965 0.102607498 -0.0768724975 -0.1494255065 0.0684524995 +-0.3909985045 -1.025880005 0.2035724945 -0.421020996 -1.052880005 0.2093034975 +-0.421020996 -1.052880005 0.2093034975 -0.390885498 -1.052880005 0.208819 +-0.390885498 -1.052880005 0.208819 -0.3909985045 -1.025880005 0.2035724945 +-0.421020996 -1.052880005 0.2093034975 -0.4212435 -1.025880005 0.203942993 +-0.4212435 -1.025880005 0.203942993 -0.3909985045 -1.025880005 0.2035724945 +-0.3909985045 -1.025880005 0.2035724945 -0.421020996 -1.052880005 0.2093034975 +-0.479845001 0.2959970095 -0.237003006 -0.0814024965 0.295885498 -0.2426035005 +-0.0814024965 0.295885498 -0.2426035005 -0.0811139985 0.1200810015 -0.208455002 +-0.0811139985 0.1200810015 -0.208455002 -0.479845001 0.2959970095 -0.237003006 +-0.564505005 -0.1605805055 -0.0145093 -0.5640200195 -0.3454205015 0.020870449 +-0.5640200195 -0.3454205015 0.020870449 -0.0994280015 -0.159911499 -0.0212803495 +-0.0994280015 -0.159911499 -0.0212803495 -0.564505005 -0.1605805055 -0.0145093 +-0.379950012 1.024869995 -0.313236511 -0.398421509 1.0114849855 -0.310276001 +-0.398421509 1.0114849855 -0.310276001 -0.37967099 1.0114849855 -0.31055249 +-0.37967099 1.0114849855 -0.31055249 -0.379950012 1.024869995 -0.313236511 +-0.4217120055 -1.0348050535 0.1570715025 -0.4217149965 -1.061800049 0.1625390015 +-0.4217149965 -1.061800049 0.1625390015 -0.391465515 -1.0620250245 0.1619450075 +-0.391465515 -1.0620250245 0.1619450075 -0.4217120055 -1.0348050535 0.1570715025 +-0.398816498 1.0246500245 -0.312738495 -0.398421509 1.0114849855 -0.310276001 +-0.398421509 1.0114849855 -0.310276001 -0.379950012 1.024869995 -0.313236511 +-0.379950012 1.024869995 -0.313236511 -0.398816498 1.0246500245 -0.312738495 +-0.0816504975 0.297001007 -0.252092499 -0.398870514 0.2906424865 -0.2462409975 +-0.398870514 0.2906424865 -0.2462409975 -0.0811360015 0.1214195025 -0.2180514985 +-0.0811360015 0.1214195025 -0.2180514985 -0.0816504975 0.297001007 -0.252092499 +-0.398476013 1.033795044 -0.302355011 -0.4284914855 1.006909973 -0.296958496 +-0.4284914855 1.006909973 -0.296958496 -0.398471985 1.006799988 -0.2972225035 +-0.398471985 1.006799988 -0.2972225035 -0.398476013 1.033795044 -0.302355011 +-0.429191498 1.024535034 -0.348744507 -0.3989444885 1.0246500245 -0.3492269895 +-0.3989444885 1.0246500245 -0.3492269895 -0.3989404905 0.9977650145 -0.344093994 +-0.3989404905 0.9977650145 -0.344093994 -0.429191498 1.024535034 -0.348744507 +-0.413470001 -0.170843506 0.1737575075 -0.390921997 -0.211893997 0.162626007 +-0.390921997 -0.211893997 0.162626007 -0.39092099 -0.2072089995 0.1572700045 +-0.39092099 -0.2072089995 0.1572700045 -0.413470001 -0.170843506 0.1737575075 +-0.3973320005 -0.2195910035 -0.2877149965 -0.4197265015 -0.2535025025 -0.2626329955 +-0.4197265015 -0.2535025025 -0.2626329955 -0.3972609865 -0.2181410065 -0.2804609985 +-0.3972609865 -0.2181410065 -0.2804609985 -0.3973320005 -0.2195910035 -0.2877149965 +-0.3644035035 1.005460022 -0.293719513 -0.364604492 1.0364749755 -0.300083496 +-0.364604492 1.0364749755 -0.300083496 -0.0873600005 1.036920044 -0.3044295045 +-0.0873600005 1.036920044 -0.3044295045 -0.3644035035 1.005460022 -0.293719513 +-0.0873600005 1.036920044 -0.3044295045 -0.3644035035 1.005460022 -0.293719513 +-0.3644035035 1.005460022 -0.293719513 -0.0872699965 1.0056849975 -0.298067993 +-0.0872699965 1.0056849975 -0.298067993 -0.0873600005 1.036920044 -0.3044295045 +-0.479845001 0.2959970095 -0.237003006 -0.47848999 0.311056488 -0.1578670045 +-0.47848999 0.311056488 -0.1578670045 -0.080088997 0.135586502 -0.129550003 +-0.080088997 0.135586502 -0.129550003 -0.479845001 0.2959970095 -0.237003006 +-0.3922409975 -0.2420130005 0.177660507 -0.392913513 -0.187798996 0.167158493 +-0.392913513 -0.187798996 0.167158493 -0.0754089965 -0.2480370025 0.1743674925 +-0.0754089965 -0.2480370025 0.1743674925 -0.3922409975 -0.2420130005 0.177660507 +-0.079804001 -1.054324951 0.2084174955 -0.356928009 -1.054214966 0.212319504 +-0.356928009 -1.054214966 0.212319504 -0.0796760025 -1.0230949705 0.202283493 +-0.0796760025 -1.0230949705 0.202283493 -0.079804001 -1.054324951 0.2084174955 +-0.356928009 -1.054214966 0.212319504 -0.3571340025 -1.0233150025 0.2061784975 +-0.3571340025 -1.0233150025 0.2061784975 -0.0796760025 -1.0230949705 0.202283493 +-0.0796760025 -1.0230949705 0.202283493 -0.356928009 -1.054214966 0.212319504 +-0.3653745115 1.026209961 -0.353878998 -0.0882630005 0.995085022 -0.3518680115 +-0.0882630005 0.995085022 -0.3518680115 -0.088132004 1.026209961 -0.358113495 +-0.088132004 1.026209961 -0.358113495 -0.3653745115 1.026209961 -0.353878998 +-0.4284914855 1.006909973 -0.296958496 -0.4286069945 1.0340200195 -0.302093994 +-0.4286069945 1.0340200195 -0.302093994 -0.398476013 1.033795044 -0.302355011 +-0.398476013 1.033795044 -0.302355011 -0.4284914855 1.006909973 -0.296958496 +-0.4217120055 -1.0348050535 0.1570715025 -0.391467499 -1.0350300295 0.1567005005 +-0.391467499 -1.0350300295 0.1567005005 -0.391465515 -1.0620250245 0.1619450075 +-0.391465515 -1.0620250245 0.1619450075 -0.4217120055 -1.0348050535 0.1570715025 +-0.0779629975 -0.3389505005 0.0139807995 -0.0770875015 -0.457976013 0.0574020005 +-0.0770875015 -0.457976013 0.0574020005 -0.0766104965 -0.323333496 0.093227501 +-0.0766104965 -0.323333496 0.093227501 -0.0779629975 -0.3389505005 0.0139807995 +-0.077947502 0.316968506 0.002600245 -0.0785835035 0.1407180025 -0.0256418 +-0.0785835035 0.1407180025 -0.0256418 -0.076378998 0.304475006 0.0821865005 +-0.076378998 0.304475006 0.0821865005 -0.077947502 0.316968506 0.002600245 +-0.077345497 -0.4619914855 0.037758999 -0.0779629975 -0.3389505005 0.0139807995 +-0.0779629975 -0.3389505005 0.0139807995 -0.0770875015 -0.457976013 0.0574020005 +-0.0770875015 -0.457976013 0.0574020005 -0.077345497 -0.4619914855 0.037758999 +-0.2053150025 0.069772499 0.0906709975 -0.2055149995 0.0694375 0.100234497 +-0.2055149995 0.0694375 0.100234497 -0.2049275055 -0.0747979965 0.093468498 +-0.2049275055 -0.0747979965 0.093468498 -0.2053150025 0.069772499 0.0906709975 +-0.2051275025 -0.0751324995 0.1030319975 -0.2055149995 0.0694375 0.100234497 +-0.2055149995 0.0694375 0.100234497 -0.2049275055 -0.0747979965 0.093468498 +-0.2049275055 -0.0747979965 0.093468498 -0.2051275025 -0.0751324995 0.1030319975 +-0.1032819975 1.0623549805 -0.2900350035 -0.103468498 1.0588950195 -0.3077795105 +-0.103468498 1.0588950195 -0.3077795105 -0.101293503 0.320872986 -0.145279999 +-0.101293503 0.320872986 -0.145279999 -0.1032819975 1.0623549805 -0.2900350035 +-0.0775804975 0.440566986 0.0223566495 -0.077947502 0.316968506 0.002600245 +-0.077947502 0.316968506 0.002600245 -0.0772109985 0.4375555115 0.0420019495 +-0.0772109985 0.4375555115 0.0420019495 -0.0775804975 0.440566986 0.0223566495 +-0.0840455015 1.010705017 -0.3348200075 -0.0878809965 0.984825012 -0.322181 +-0.0878809965 0.984825012 -0.322181 -0.0838584975 1.0084749755 -0.3277869875 +-0.0838584975 1.0084749755 -0.3277869875 -0.0840455015 1.010705017 -0.3348200075 +-0.1014725035 0.317303009 -0.1633589935 -0.103468498 1.0588950195 -0.3077795105 +-0.103468498 1.0588950195 -0.3077795105 -0.101293503 0.320872986 -0.145279999 +-0.101293503 0.320872986 -0.145279999 -0.1014725035 0.317303009 -0.1633589935 +-0.1025009995 -1.078755005 -0.2527525025 -0.102680496 -1.0761899415 -0.2708315125 +-0.102680496 -1.0761899415 -0.2708315125 -0.1010739975 -0.3328154905 -0.1344524995 +-0.1010739975 -0.3328154905 -0.1344524995 -0.1025009995 -1.078755005 -0.2527525025 +-0.101592499 -0.3295805055 -0.152315506 -0.102680496 -1.0761899415 -0.2708315125 +-0.102680496 -1.0761899415 -0.2708315125 -0.1010739975 -0.3328154905 -0.1344524995 +-0.1010739975 -0.3328154905 -0.1344524995 -0.101592499 -0.3295805055 -0.152315506 +-0.1007614975 -0.143848007 -0.1227304995 -0.1010739975 -0.3328154905 -0.1344524995 +-0.1010739975 -0.3328154905 -0.1344524995 -0.100580002 -0.1466369935 -0.1047630005 +-0.100580002 -0.1466369935 -0.1047630005 -0.1007614975 -0.143848007 -0.1227304995 +-0.077415497 0.204859497 -0.017472151 -0.01434715 0.204859497 -0.0188286495 +-0.01434715 0.204859497 -0.0188286495 -0.01398065 0.155442505 0.00628325 +-0.01398065 0.155442505 0.00628325 -0.077415497 0.204859497 -0.017472151 +-0.1010739975 -0.3328154905 -0.1344524995 -0.101592499 -0.3295805055 -0.152315506 +-0.101592499 -0.3295805055 -0.152315506 -0.1007614975 -0.143848007 -0.1227304995 +-0.1007614975 -0.143848007 -0.1227304995 -0.1010739975 -0.3328154905 -0.1344524995 +-0.101293503 0.320872986 -0.145279999 -0.1014725035 0.317303009 -0.1633589935 +-0.1014725035 0.317303009 -0.1633589935 -0.100772499 0.132463501 -0.1275285035 +-0.100772499 0.132463501 -0.1275285035 -0.101293503 0.320872986 -0.145279999 +-0.564409973 0.3264505005 -0.0082591 -0.564455017 0.323104004 0.0098149005 +-0.564455017 0.323104004 0.0098149005 -0.099258499 0.323215515 0.00259993 +-0.099258499 0.323215515 0.00259993 -0.564409973 0.3264505005 -0.0082591 +-0.0774609985 0.127778 0.0539350015 -0.0785835035 0.1407180025 -0.0256418 +-0.0785835035 0.1407180025 -0.0256418 -0.076378998 0.304475006 0.0821865005 +-0.076378998 0.304475006 0.0821865005 -0.0774609985 0.127778 0.0539350015 +-0.100772499 0.132463501 -0.1275285035 -0.101293503 0.320872986 -0.145279999 +-0.101293503 0.320872986 -0.145279999 -0.100697998 0.136032501 -0.109786499 +-0.100697998 0.136032501 -0.109786499 -0.100772499 0.132463501 -0.1275285035 +-0.5660700075 0.132463501 -0.1209850005 -0.5664749755 0.320872986 -0.138845505 +-0.5664749755 0.320872986 -0.138845505 -0.5658900145 0.135921005 -0.1027945025 +-0.5658900145 0.135921005 -0.1027945025 -0.5660700075 0.132463501 -0.1209850005 +-0.4791119995 0.1200810015 -0.202733505 -0.479845001 0.2959970095 -0.237003006 +-0.479845001 0.2959970095 -0.237003006 -0.477980011 0.135363495 -0.123602997 +-0.477980011 0.135363495 -0.123602997 -0.4791119995 0.1200810015 -0.202733505 +-0.56598999 -0.1469714965 -0.0979990005 -0.5661550295 -0.3328154905 -0.1274585035 +-0.5661550295 -0.3328154905 -0.1274585035 -0.565840027 -0.1442944945 -0.115959503 +-0.565840027 -0.1442944945 -0.115959503 -0.56598999 -0.1469714965 -0.0979990005 +-0.01264795 0.280825989 0.1397545015 -0.075449997 0.231632004 0.165663498 +-0.075449997 0.231632004 0.165663498 -0.0121675995 0.2314089965 0.1647575075 +-0.0121675995 0.2314089965 0.1647575075 -0.01264795 0.280825989 0.1397545015 +-0.479845001 0.2959970095 -0.237003006 -0.47848999 0.311056488 -0.1578670045 +-0.47848999 0.311056488 -0.1578670045 -0.477980011 0.135363495 -0.123602997 +-0.477980011 0.135363495 -0.123602997 -0.479845001 0.2959970095 -0.237003006 +-0.087058502 -1.06526001 -0.297505493 -0.0876624985 -1.0450699465 -0.321953491 +-0.0876624985 -1.0450699465 -0.321953491 -0.083318001 -1.040494995 -0.2949725035 +-0.083318001 -1.040494995 -0.2949725035 -0.087058502 -1.06526001 -0.297505493 +-0.6991849975 0.1636974945 0.1138809965 -0.6994450075 0.1919194945 0.0995944975 +-0.6994450075 0.1919194945 0.0995944975 -0.4142409975 0.1639205015 0.1093619995 +-0.4142409975 0.1639205015 0.1093619995 -0.6991849975 0.1636974945 0.1138809965 +-0.0996504975 0.1372599945 -0.0266406995 -0.0998320005 0.140494995 -0.044608101 +-0.0998320005 0.140494995 -0.044608101 -0.099223999 0.326004486 -0.01502785 +-0.099223999 0.326004486 -0.01502785 -0.0996504975 0.1372599945 -0.0266406995 +-0.5643200075 -0.3491019895 0.00334654 -0.564505005 -0.1605805055 -0.0145093 +-0.564505005 -0.1605805055 -0.0145093 -0.5640200195 -0.3454205015 0.020870449 +-0.5640200195 -0.3454205015 0.020870449 -0.5643200075 -0.3491019895 0.00334654 +-0.0994280015 -0.159911499 -0.0212803495 -0.099725998 -0.163703995 -0.039027199 +-0.099725998 -0.163703995 -0.039027199 -0.0991324995 -0.3487674865 -0.0034221 +-0.0991324995 -0.3487674865 -0.0034221 -0.0994280015 -0.159911499 -0.0212803495 +-0.099258499 0.323215515 0.00259993 -0.0996504975 0.1372599945 -0.0266406995 +-0.0996504975 0.1372599945 -0.0266406995 -0.099223999 0.326004486 -0.01502785 +-0.099223999 0.326004486 -0.01502785 -0.099258499 0.323215515 0.00259993 +-0.099223999 0.326004486 -0.01502785 -0.099258499 0.323215515 0.00259993 +-0.099258499 0.323215515 0.00259993 -0.097165001 1.069380005 0.121024498 +-0.097165001 1.069380005 0.121024498 -0.099223999 0.326004486 -0.01502785 +-0.4792055055 -0.1347005005 -0.198272995 -0.479736511 -0.3113974915 -0.226177994 +-0.479736511 -0.3113974915 -0.226177994 -0.477746002 -0.147306 -0.118800499 +-0.477746002 -0.147306 -0.118800499 -0.4792055055 -0.1347005005 -0.198272995 +-0.0991324995 -0.3487674865 -0.0034221 -0.0994280015 -0.159911499 -0.0212803495 +-0.0994280015 -0.159911499 -0.0212803495 -0.0989465025 -0.3453089905 0.0143223 +-0.0989465025 -0.3453089905 0.0143223 -0.0991324995 -0.3487674865 -0.0034221 +-0.061594002 0.035079849 0.095439003 -0.061703499 0.0456775015 0.095324997 +-0.061703499 0.0456775015 0.095324997 -0.0613364985 0.0357492485 0.1204365005 +-0.0613364985 0.0357492485 0.1204365005 -0.061594002 0.035079849 0.095439003 +-0.101592499 -0.3295805055 -0.152315506 -0.5661550295 -0.3328154905 -0.1274585035 +-0.5661550295 -0.3328154905 -0.1274585035 -0.1010739975 -0.3328154905 -0.1344524995 +-0.1010739975 -0.3328154905 -0.1344524995 -0.101592499 -0.3295805055 -0.152315506 +-0.564455017 0.323104004 0.0098149005 -0.5647299805 0.1372599945 -0.0196467 +-0.5647299805 0.1372599945 -0.0196467 -0.564409973 0.3264505005 -0.0082591 +-0.564409973 0.3264505005 -0.0082591 -0.564455017 0.323104004 0.0098149005 +-0.5661550295 -0.3328154905 -0.1274585035 -0.5665650025 -0.3301380005 -0.145319 +-0.5665650025 -0.3301380005 -0.145319 -0.565840027 -0.1442944945 -0.115959503 +-0.565840027 -0.1442944945 -0.115959503 -0.5661550295 -0.3328154905 -0.1274585035 +-0.061703499 0.0456775015 0.095324997 -0.0613364985 0.0357492485 0.1204365005 +-0.0613364985 0.0357492485 0.1204365005 -0.0613320005 0.0461232985 0.1202129975 +-0.0613320005 0.0461232985 0.1202129975 -0.061703499 0.0456775015 0.095324997 +-0.5647299805 0.1372599945 -0.0196467 -0.5650200195 0.140272003 -0.0378393515 +-0.5650200195 0.140272003 -0.0378393515 -0.564409973 0.3264505005 -0.0082591 +-0.564409973 0.3264505005 -0.0082591 -0.5647299805 0.1372599945 -0.0196467 +-0.060813999 -0.053380001 0.122121002 -0.0612874985 -0.0432287485 0.0967839965 +-0.0612874985 -0.0432287485 0.0967839965 -0.0608115005 -0.0426708985 0.1220094985 +-0.0608115005 -0.0426708985 0.1220094985 -0.060813999 -0.053380001 0.122121002 +-0.479105011 0.433873993 -0.1817575075 -0.479467499 0.4300815125 -0.2017369995 +-0.479467499 0.4300815125 -0.2017369995 -0.47848999 0.311056488 -0.1578670045 +-0.47848999 0.311056488 -0.1578670045 -0.479105011 0.433873993 -0.1817575075 +-0.372256012 -1.0350300295 0.1930305025 -0.3576235045 -1.012830017 0.1762660065 +-0.3576235045 -1.012830017 0.1762660065 -0.3571340025 -1.0233150025 0.2061784975 +-0.3571340025 -1.0233150025 0.2061784975 -0.372256012 -1.0350300295 0.1930305025 +-0.478869995 -0.4476015015 -0.1663549955 -0.4792275085 -0.4443664855 -0.186557495 +-0.4792275085 -0.4443664855 -0.186557495 -0.4788349915 -0.323890991 -0.146716995 +-0.4788349915 -0.323890991 -0.146716995 -0.478869995 -0.4476015015 -0.1663549955 +-0.032014 0.045565899 0.094831497 -0.0320233 0.035526348 0.0952770005 +-0.0320233 0.035526348 0.0952770005 -0.0316446495 0.0460119515 0.1198310015 +-0.0316446495 0.0460119515 0.1198310015 -0.032014 0.045565899 0.094831497 +-0.4212099915 -0.2156869965 -0.335634491 -0.7055949705 -0.2155755005 -0.3313265075 +-0.7055949705 -0.2155755005 -0.3313265075 -0.420726013 -0.2442440035 -0.3214544985 +-0.420726013 -0.2442440035 -0.3214544985 -0.4212099915 -0.2156869965 -0.335634491 +-0.564505005 -0.1605805055 -0.0145093 -0.564909973 -0.164261505 -0.0324813005 +-0.564909973 -0.164261505 -0.0324813005 -0.5643200075 -0.3491019895 0.00334654 +-0.5643200075 -0.3491019895 0.00334654 -0.564505005 -0.1605805055 -0.0145093 +-0.0771200025 -0.147751999 0.058963501 -0.078477501 -0.1633690035 -0.020060499 +-0.078477501 -0.1633690035 -0.020060499 -0.0766104965 -0.323333496 0.093227501 +-0.0766104965 -0.323333496 0.093227501 -0.0771200025 -0.147751999 0.058963501 +-0.0989465025 -0.3453089905 0.0143223 -0.0991324995 -0.3487674865 -0.0034221 +-0.0991324995 -0.3487674865 -0.0034221 -0.0962789995 -1.0869000245 0.1586445005 +-0.0962789995 -1.0869000245 0.1586445005 -0.0989465025 -0.3453089905 0.0143223 +-0.096685997 -1.09013501 0.1407839965 -0.0991324995 -0.3487674865 -0.0034221 +-0.0991324995 -0.3487674865 -0.0034221 -0.0962789995 -1.0869000245 0.1586445005 +-0.0962789995 -1.0869000245 0.1586445005 -0.096685997 -1.09013501 0.1407839965 +-0.091324997 -0.00307031 0.1352055055 -0.091989998 -0.0035166 0.097703003 +-0.091989998 -0.0035166 0.097703003 -0.0690130005 -0.043340351 0.098072998 +-0.0690130005 -0.043340351 0.098072998 -0.091324997 -0.00307031 0.1352055055 +-0.0878809965 0.984825012 -0.322181 -0.0882630005 0.995085022 -0.3518680115 +-0.0882630005 0.995085022 -0.3518680115 -0.0840455015 1.010705017 -0.3348200075 +-0.0840455015 1.010705017 -0.3348200075 -0.0878809965 0.984825012 -0.322181 +-0.7054450075 -0.244132004 -0.3171535035 -0.7055949705 -0.2155755005 -0.3313265075 +-0.7055949705 -0.2155755005 -0.3313265075 -0.420726013 -0.2442440035 -0.3214544985 +-0.420726013 -0.2442440035 -0.3214544985 -0.7054450075 -0.244132004 -0.3171535035 +-0.031656349 0.0357492485 0.1203884965 -0.0320233 0.035526348 0.0952770005 +-0.0320233 0.035526348 0.0952770005 -0.0316446495 0.0460119515 0.1198310015 +-0.0316446495 0.0460119515 0.1198310015 -0.031656349 0.0357492485 0.1203884965 +-0.0690130005 -0.043340351 0.098072998 -0.091324997 -0.00307031 0.1352055055 +-0.091324997 -0.00307031 0.1352055055 -0.0682389985 -0.0427826995 0.1356889955 +-0.0682389985 -0.0427826995 0.1356889955 -0.0690130005 -0.043340351 0.098072998 +-0.0779629975 -0.3389505005 0.0139807995 -0.078477501 -0.1633690035 -0.020060499 +-0.078477501 -0.1633690035 -0.020060499 -0.0766104965 -0.323333496 0.093227501 +-0.0766104965 -0.323333496 0.093227501 -0.0779629975 -0.3389505005 0.0139807995 +-0.608710022 -0.054188999 -0.0692985 -0.6109450075 -0.054188999 0.0372092515 +-0.6109450075 -0.054188999 0.0372092515 -0.5885549925 -0.0592085 -0.0795595015 +-0.5885549925 -0.0592085 -0.0795595015 -0.608710022 -0.054188999 -0.0692985 +-0.4762585145 0.140494995 -0.0193554495 -0.476396515 0.3170799865 0.00853545 +-0.476396515 0.3170799865 0.00853545 -0.475049011 0.304475006 0.088005501 +-0.475049011 0.304475006 0.088005501 -0.4762585145 0.140494995 -0.0193554495 +-0.0314913005 -0.0430058515 0.096515999 -0.031714199 -0.053715 0.0965110015 +-0.031714199 -0.053715 0.0965110015 -0.0312316 -0.0427826995 0.121401497 +-0.0312316 -0.0427826995 0.121401497 -0.0314913005 -0.0430058515 0.096515999 +-0.4759129945 0.440902008 0.0280716 -0.476396515 0.3170799865 0.00853545 +-0.476396515 0.3170799865 0.00853545 -0.475553009 0.4375555115 0.0481623995 +-0.475553009 0.4375555115 0.0481623995 -0.4759129945 0.440902008 0.0280716 +-0.0313547495 -0.053491501 0.1219570005 -0.031714199 -0.053715 0.0965110015 +-0.031714199 -0.053715 0.0965110015 -0.0312316 -0.0427826995 0.121401497 +-0.0312316 -0.0427826995 0.121401497 -0.0313547495 -0.053491501 0.1219570005 +-0.476396515 0.3170799865 0.00853545 -0.475553009 0.4375555115 0.0481623995 +-0.475553009 0.4375555115 0.0481623995 -0.475049011 0.304475006 0.088005501 +-0.475049011 0.304475006 0.088005501 -0.476396515 0.3170799865 0.00853545 +-0.079475502 -0.2115590055 -0.1322149965 -0.0165569495 -0.162142502 -0.158345001 +-0.0165569495 -0.162142502 -0.158345001 -0.0159628495 -0.2115590055 -0.1334505005 +-0.0159628495 -0.2115590055 -0.1334505005 -0.079475502 -0.2115590055 -0.1322149965 +-0.0221133995 0.036418701 0.133531006 -0.022668751 0.0358608515 0.096142502 +-0.022668751 0.0358608515 0.096142502 0.000972655 -0.00273584 0.134014496 +0.000972655 -0.00273584 0.134014496 -0.0221133995 0.036418701 0.133531006 +-0.475049011 0.304475006 0.088005501 -0.4762585145 0.140494995 -0.0193554495 +-0.4762585145 0.140494995 -0.0193554495 -0.4750224915 0.1278895035 0.060112499 +-0.4750224915 0.1278895035 0.060112499 -0.475049011 0.304475006 0.088005501 +-0.6109450075 -0.054188999 0.0372092515 -0.5912299805 -0.0592085 0.0483058015 +-0.5912299805 -0.0592085 0.0483058015 -0.5885549925 -0.0592085 -0.0795595015 +-0.5885549925 -0.0592085 -0.0795595015 -0.6109450075 -0.054188999 0.0372092515 +-0.077947502 0.316968506 0.002600245 -0.0772109985 0.4375555115 0.0420019495 +-0.0772109985 0.4375555115 0.0420019495 -0.076378998 0.304475006 0.0821865005 +-0.076378998 0.304475006 0.0821865005 -0.077947502 0.316968506 0.002600245 +-0.476186493 -0.3391734925 0.0198092005 -0.476254486 -0.163703995 -0.0142228005 +-0.476254486 -0.163703995 -0.0142228005 -0.47505249 -0.3240029905 0.098828499 +-0.47505249 -0.3240029905 0.098828499 -0.476186493 -0.3391734925 0.0198092005 +-0.5908449705 -0.0108788995 -0.221699005 -0.58888501 0.1410525055 -0.0650059965 +-0.58888501 0.1410525055 -0.0650059965 -0.5887700195 -0.159800003 -0.0598709985 +-0.5887700195 -0.159800003 -0.0598709985 -0.5908449705 -0.0108788995 -0.221699005 +-0.475229492 -0.1483099975 0.0646825025 -0.476254486 -0.163703995 -0.0142228005 +-0.476254486 -0.163703995 -0.0142228005 -0.47505249 -0.3240029905 0.098828499 +-0.47505249 -0.3240029905 0.098828499 -0.475229492 -0.1483099975 0.0646825025 +0.0004238665 -0.0035166 0.096292 -0.022668751 0.0358608515 0.096142502 +-0.022668751 0.0358608515 0.096142502 0.000972655 -0.00273584 0.134014496 +0.000972655 -0.00273584 0.134014496 0.0004238665 -0.0035166 0.096292 +-0.3800180055 1.029334961 -0.325957489 -0.364871002 1.046959961 -0.3299914855 +-0.364871002 1.046959961 -0.3299914855 -0.364604492 1.0364749755 -0.300083496 +-0.364604492 1.0364749755 -0.300083496 -0.3800180055 1.029334961 -0.325957489 +-0.476128998 -0.4619914855 0.043687599 -0.476186493 -0.3391734925 0.0198092005 +-0.476186493 -0.3391734925 0.0198092005 -0.4756474915 -0.458199005 0.063334999 +-0.4756474915 -0.458199005 0.063334999 -0.476128998 -0.4619914855 0.043687599 +-0.0811139985 0.1200810015 -0.208455002 -0.0814024965 0.295885498 -0.2426035005 +-0.0814024965 0.295885498 -0.2426035005 -0.080088997 0.135586502 -0.129550003 +-0.080088997 0.135586502 -0.129550003 -0.0811139985 0.1200810015 -0.208455002 +-0.476186493 -0.3391734925 0.0198092005 -0.4756474915 -0.458199005 0.063334999 +-0.4756474915 -0.458199005 0.063334999 -0.47505249 -0.3240029905 0.098828499 +-0.47505249 -0.3240029905 0.098828499 -0.476186493 -0.3391734925 0.0198092005 +-0.379950012 1.024869995 -0.313236511 -0.3800180055 1.029334961 -0.325957489 +-0.3800180055 1.029334961 -0.325957489 -0.364604492 1.0364749755 -0.300083496 +-0.364604492 1.0364749755 -0.300083496 -0.379950012 1.024869995 -0.313236511 +-0.0793929975 -0.1620305025 -0.1574295045 -0.079475502 -0.2115590055 -0.1322149965 +-0.079475502 -0.2115590055 -0.1322149965 -0.0165569495 -0.162142502 -0.158345001 +-0.0165569495 -0.162142502 -0.158345001 -0.0793929975 -0.1620305025 -0.1574295045 +-0.5664749755 0.320872986 -0.138845505 -0.566875 0.317303009 -0.1569295045 +-0.566875 0.317303009 -0.1569295045 -0.5660700075 0.132463501 -0.1209850005 +-0.5660700075 0.132463501 -0.1209850005 -0.5664749755 0.320872986 -0.138845505 +-0.5906049805 0.1224235 -0.190675995 -0.5908449705 -0.0108788995 -0.221699005 +-0.5908449705 -0.0108788995 -0.221699005 -0.58888501 0.1410525055 -0.0650059965 +-0.58888501 0.1410525055 -0.0650059965 -0.5906049805 0.1224235 -0.190675995 +-0.076600998 -1.0412750245 0.172668503 -0.0805699995 -1.064589966 0.154399002 +-0.0805699995 -1.064589966 0.154399002 -0.076320503 -1.050535034 0.1805964965 +-0.076320503 -1.050535034 0.1805964965 -0.076600998 -1.0412750245 0.172668503 +-0.391113495 -1.034920044 0.193081497 -0.390885498 -1.052880005 0.208819 +-0.390885498 -1.052880005 0.208819 -0.390832489 -1.048415039 0.195654007 +-0.390832489 -1.048415039 0.195654007 -0.391113495 -1.034920044 0.193081497 +-0.3909985045 -1.025880005 0.2035724945 -0.391113495 -1.034920044 0.193081497 +-0.391113495 -1.034920044 0.193081497 -0.390885498 -1.052880005 0.208819 +-0.390885498 -1.052880005 0.208819 -0.3909985045 -1.025880005 0.2035724945 +-0.590580017 -0.1214260025 -0.186546997 -0.5908449705 -0.0108788995 -0.221699005 +-0.5908449705 -0.0108788995 -0.221699005 -0.5887700195 -0.159800003 -0.0598709985 +-0.5887700195 -0.159800003 -0.0598709985 -0.590580017 -0.1214260025 -0.186546997 +-0.080305496 -1.075074951 0.184418503 -0.0805699995 -1.064589966 0.154399002 +-0.0805699995 -1.064589966 0.154399002 -0.076320503 -1.050535034 0.1805964965 +-0.076320503 -1.050535034 0.1805964965 -0.080305496 -1.075074951 0.184418503 +-0.0814024965 0.295885498 -0.2426035005 -0.080489502 0.3111679995 -0.1637005005 +-0.080489502 0.3111679995 -0.1637005005 -0.080088997 0.135586502 -0.129550003 +-0.080088997 0.135586502 -0.129550003 -0.0814024965 0.295885498 -0.2426035005 +-0.390885498 -1.052880005 0.208819 -0.391340515 -1.0707249755 0.1879450075 +-0.391340515 -1.0707249755 0.1879450075 -0.390832489 -1.048415039 0.195654007 +-0.390832489 -1.048415039 0.195654007 -0.390885498 -1.052880005 0.208819 +-0.391066498 -1.0572299805 0.1854954985 -0.391340515 -1.0707249755 0.1879450075 +-0.391340515 -1.0707249755 0.1879450075 -0.390832489 -1.048415039 0.195654007 +-0.390832489 -1.048415039 0.195654007 -0.391066498 -1.0572299805 0.1854954985 +-0.391066498 -1.0572299805 0.1854954985 -0.391340515 -1.0707249755 0.1879450075 +-0.391340515 -1.0707249755 0.1879450075 -0.391013489 -1.052880005 0.1723305055 +-0.391013489 -1.052880005 0.1723305055 -0.391066498 -1.0572299805 0.1854954985 +-0.0813919985 -0.3110629885 -0.2324494935 -0.0801604995 -0.3236679995 -0.152759506 +-0.0801604995 -0.3236679995 -0.152759506 -0.080080002 -0.1467485045 -0.124640503 +-0.080080002 -0.1467485045 -0.124640503 -0.0813919985 -0.3110629885 -0.2324494935 +-0.391340515 -1.0707249755 0.1879450075 -0.391465515 -1.0620250245 0.1619450075 +-0.391465515 -1.0620250245 0.1619450075 -0.391013489 -1.052880005 0.1723305055 +-0.391013489 -1.052880005 0.1723305055 -0.391340515 -1.0707249755 0.1879450075 +-0.391467499 -1.0350300295 0.1567005005 -0.3912944945 -1.0391550295 0.1697590025 +-0.3912944945 -1.0391550295 0.1697590025 -0.391013489 -1.052880005 0.1723305055 +-0.391013489 -1.052880005 0.1723305055 -0.391467499 -1.0350300295 0.1567005005 +-0.3913485105 -1.016960022 0.1776795045 -0.391467499 -1.0350300295 0.1567005005 +-0.391467499 -1.0350300295 0.1567005005 -0.3912944945 -1.0391550295 0.1697590025 +-0.3912944945 -1.0391550295 0.1697590025 -0.3913485105 -1.016960022 0.1776795045 +-0.391465515 -1.0620250245 0.1619450075 -0.391467499 -1.0350300295 0.1567005005 +-0.391467499 -1.0350300295 0.1567005005 -0.391013489 -1.052880005 0.1723305055 +-0.391013489 -1.052880005 0.1723305055 -0.391465515 -1.0620250245 0.1619450075 +-0.391113495 -1.034920044 0.193081497 -0.391511505 -1.0303449705 0.180130493 +-0.391511505 -1.0303449705 0.180130493 -0.3909985045 -1.025880005 0.2035724945 +-0.3909985045 -1.025880005 0.2035724945 -0.391113495 -1.034920044 0.193081497 +-0.3913485105 -1.016960022 0.1776795045 -0.391511505 -1.0303449705 0.180130493 +-0.391511505 -1.0303449705 0.180130493 -0.3909985045 -1.025880005 0.2035724945 +-0.3909985045 -1.025880005 0.2035724945 -0.3913485105 -1.016960022 0.1776795045 +-0.080774498 0.434096985 -0.187360504 -0.0808030015 0.4300815125 -0.2073329925 +-0.0808030015 0.4300815125 -0.2073329925 -0.080489502 0.3111679995 -0.1637005005 +-0.080489502 0.3111679995 -0.1637005005 -0.080774498 0.434096985 -0.187360504 +-0.5859699705 -0.0752440035 0.0994329985 -0.5861099855 0.0693259965 0.106208 +-0.5861099855 0.0693259965 0.106208 -0.585909973 0.069661003 0.0966449965 +-0.585909973 0.069661003 0.0966449965 -0.5859699705 -0.0752440035 0.0994329985 +-0.0808030015 0.4300815125 -0.2073329925 -0.0814024965 0.295885498 -0.2426035005 +-0.0814024965 0.295885498 -0.2426035005 -0.080489502 0.3111679995 -0.1637005005 +-0.080489502 0.3111679995 -0.1637005005 -0.0808030015 0.4300815125 -0.2073329925 +-0.3913754885 1.009590027 0.1683065035 -0.391713501 1.018289978 0.157811493 +-0.391713501 1.018289978 0.157811493 -0.3912390135 1.036920044 0.1724380035 +-0.3912390135 1.036920044 0.1724380035 -0.3913754885 1.009590027 0.1683065035 +-0.081086502 -0.1343659975 -0.2044380035 -0.0813919985 -0.3110629885 -0.2324494935 +-0.0813919985 -0.3110629885 -0.2324494935 -0.080080002 -0.1467485045 -0.124640503 +-0.080080002 -0.1467485045 -0.124640503 -0.081086502 -0.1343659975 -0.2044380035 +-0.3916849975 1.054209961 0.1511174925 -0.3917485045 1.0319000245 0.159484497 +-0.3917485045 1.0319000245 0.159484497 -0.3912390135 1.036920044 0.1724380035 +-0.3912390135 1.036920044 0.1724380035 -0.3916849975 1.054209961 0.1511174925 +-0.391713501 1.018289978 0.157811493 -0.3917485045 1.0319000245 0.159484497 +-0.3917485045 1.0319000245 0.159484497 -0.3912390135 1.036920044 0.1724380035 +-0.3912390135 1.036920044 0.1724380035 -0.391713501 1.018289978 0.157811493 +-0.8109299925 -0.196834503 0.1964494935 -0.6979050295 -0.224610504 0.207185501 +-0.6979050295 -0.224610504 0.207185501 -0.6978950195 -0.1932649995 0.201272003 +-0.6978950195 -0.1932649995 0.201272003 -0.8109299925 -0.196834503 0.1964494935 +-0.3916164855 0.99988501 0.1425274965 -0.391774994 1.0136049805 0.1447559965 +-0.391774994 1.0136049805 0.1447559965 -0.3913754885 1.009590027 0.1683065035 +-0.3913754885 1.009590027 0.1683065035 -0.3916164855 0.99988501 0.1425274965 +-0.391713501 1.018289978 0.157811493 -0.391774994 1.0136049805 0.1447559965 +-0.391774994 1.0136049805 0.1447559965 -0.3913754885 1.009590027 0.1683065035 +-0.3913754885 1.009590027 0.1683065035 -0.391713501 1.018289978 0.157811493 +-0.391924988 1.0358050535 0.1359380035 -0.3919284975 1.0442800295 0.125449997 +-0.3919284975 1.0442800295 0.125449997 -0.3916849975 1.054209961 0.1511174925 +-0.3916849975 1.054209961 0.1511174925 -0.391924988 1.0358050535 0.1359380035 +-0.8108099975 -0.223941498 0.201361496 -0.8109299925 -0.196834503 0.1964494935 +-0.8109299925 -0.196834503 0.1964494935 -0.6979050295 -0.224610504 0.207185501 +-0.6979050295 -0.224610504 0.207185501 -0.8108099975 -0.223941498 0.201361496 +-0.0180767995 0.1216429975 -0.2189620055 -0.0184746495 0.296889496 -0.253223999 +-0.0184746495 0.296889496 -0.253223999 -0.0173365 0.1230930025 -0.211694 +-0.0173365 0.1230930025 -0.211694 -0.0180767995 0.1216429975 -0.2189620055 +-0.5861099855 0.0693259965 0.106208 -0.586169983 -0.075578499 0.108996498 +-0.586169983 -0.075578499 0.108996498 -0.5859699705 -0.0752440035 0.0994329985 +-0.5859699705 -0.0752440035 0.0994329985 -0.5861099855 0.0693259965 0.106208 +-0.080892502 -0.4441434935 -0.1923840025 -0.0813919985 -0.3110629885 -0.2324494935 +-0.0813919985 -0.3110629885 -0.2324494935 -0.0801604995 -0.3236679995 -0.152759506 +-0.0801604995 -0.3236679995 -0.152759506 -0.080892502 -0.4441434935 -0.1923840025 +-0.0772649995 0.1557774965 0.0073007 -0.077415497 0.204859497 -0.017472151 +-0.077415497 0.204859497 -0.017472151 -0.01398065 0.155442505 0.00628325 +-0.01398065 0.155442505 0.00628325 -0.0772649995 0.1557774965 0.0073007 +0.0974524995 0.1208619995 0.0557024995 0.095617996 0.1413869935 -0.075102501 +0.095617996 0.1413869935 -0.075102501 0.2432630005 0.1117145005 -0.076584503 +0.2432630005 0.1117145005 -0.076584503 0.0974524995 0.1208619995 0.0557024995 +-0.3917485045 1.0319000245 0.159484497 -0.3919704895 1.04048999 0.1487684935 +-0.3919704895 1.04048999 0.1487684935 -0.3916849975 1.054209961 0.1511174925 +-0.3916849975 1.054209961 0.1511174925 -0.3917485045 1.0319000245 0.159484497 +-0.5867249755 -0.1349234925 0.066251999 -0.5887700195 -0.159800003 -0.0598709985 +-0.5887700195 -0.159800003 -0.0598709985 -0.586169983 -0.075578499 0.108996498 +-0.586169983 -0.075578499 0.108996498 -0.5867249755 -0.1349234925 0.066251999 +0.242095505 -0.01188305 -0.1273759995 0.0967710035 -0.122987999 -0.146151993 +0.0967710035 -0.122987999 -0.146151993 0.2424004975 -0.0841679995 -0.109963501 +0.2424004975 -0.0841679995 -0.109963501 0.242095505 -0.01188305 -0.1273759995 +-0.6983200075 -0.1671620025 0.147037506 -0.81186499 -0.174970505 0.1505724945 +-0.81186499 -0.174970505 0.1505724945 -0.6981900025 -0.170955002 0.1780579985 +-0.6981900025 -0.170955002 0.1780579985 -0.6983200075 -0.1671620025 0.147037506 +-0.080772003 0.995869995 0.1374349975 -0.0810410005 1.0157249755 0.1129940035 +-0.0810410005 1.0157249755 0.1129940035 -0.0770759965 1.0201849975 0.1420870055 +-0.0770759965 1.0201849975 0.1420870055 -0.080772003 0.995869995 0.1374349975 +-0.811409973 -0.178317505 0.176690506 -0.81186499 -0.174970505 0.1505724945 +-0.81186499 -0.174970505 0.1505724945 -0.6981900025 -0.170955002 0.1780579985 +-0.6981900025 -0.170955002 0.1780579985 -0.811409973 -0.178317505 0.176690506 +-0.6991450195 -0.211671005 0.1066299975 -0.8120300295 -0.239447006 0.121001999 +-0.8120300295 -0.239447006 0.121001999 -0.6989349975 -0.2429055025 0.1125479965 +-0.6989349975 -0.2429055025 0.1125479965 -0.6991450195 -0.211671005 0.1066299975 +-0.812034973 0.2401100005 0.1320475005 -0.6989050295 0.246580002 0.126941498 +-0.6989050295 0.246580002 0.126941498 -0.698659973 0.251600006 0.157964493 +-0.698659973 0.251600006 0.157964493 -0.812034973 0.2401100005 0.1320475005 +-0.391774994 1.0136049805 0.1447559965 -0.3919964905 1.022085022 0.1340399935 +-0.3919964905 1.022085022 0.1340399935 -0.3916164855 0.99988501 0.1425274965 +-0.3916164855 0.99988501 0.1425274965 -0.391774994 1.0136049805 0.1447559965 +-0.3919964905 1.022085022 0.1340399935 -0.3925085145 1.0170650025 0.121197998 +-0.3925085145 1.0170650025 0.121197998 -0.3916164855 0.99988501 0.1425274965 +-0.3916164855 0.99988501 0.1425274965 -0.3919964905 1.022085022 0.1340399935 +-0.8118049925 0.244237503 0.1583840025 -0.812034973 0.2401100005 0.1320475005 +-0.812034973 0.2401100005 0.1320475005 -0.698659973 0.251600006 0.157964493 +-0.698659973 0.251600006 0.157964493 -0.8118049925 0.244237503 0.1583840025 +-0.3919964905 1.022085022 0.1340399935 -0.3925085145 1.0170650025 0.121197998 +-0.3925085145 1.0170650025 0.121197998 -0.391924988 1.0358050535 0.1359380035 +-0.391924988 1.0358050535 0.1359380035 -0.3919964905 1.022085022 0.1340399935 +-0.413183014 0.237209503 0.1813504945 -0.697755005 0.2086524965 0.1999360045 +-0.697755005 0.2086524965 0.1999360045 -0.412921997 0.2087640075 0.195526001 +-0.412921997 0.2087640075 0.195526001 -0.413183014 0.237209503 0.1813504945 +-0.698539978 0.1489725035 0.141565506 -0.812075012 0.1572274935 0.1445429995 +-0.812075012 0.1572274935 0.1445429995 -0.698409973 0.1542155 0.172586502 +-0.698409973 0.1542155 0.172586502 -0.698539978 0.1489725035 0.141565506 +-0.81151001 0.161578003 0.1708869935 -0.812075012 0.1572274935 0.1445429995 +-0.812075012 0.1572274935 0.1445429995 -0.698409973 0.1542155 0.172586502 +-0.698409973 0.1542155 0.172586502 -0.81151001 0.161578003 0.1708869935 +-0.697755005 0.2086524965 0.1999360045 -0.698125 0.236875 0.1857579955 +-0.698125 0.236875 0.1857579955 -0.413183014 0.237209503 0.1813504945 +-0.413183014 0.237209503 0.1813504945 -0.697755005 0.2086524965 0.1999360045 +-0.0757074965 0.280825989 0.1406649935 -0.3927369995 0.225385498 0.169393997 +-0.3927369995 0.225385498 0.169393997 -0.075449997 0.231632004 0.165663498 +-0.075449997 0.231632004 0.165663498 -0.0757074965 0.280825989 0.1406649935 +-0.58888501 0.1410525055 -0.0650059965 -0.586169983 -0.075578499 0.108996498 +-0.586169983 -0.075578499 0.108996498 -0.5861099855 0.0693259965 0.106208 +-0.5861099855 0.0693259965 0.106208 -0.58888501 0.1410525055 -0.0650059965 +-0.479467499 0.4300815125 -0.2017369995 -0.479845001 0.2959970095 -0.237003006 +-0.479845001 0.2959970095 -0.237003006 -0.47848999 0.311056488 -0.1578670045 +-0.47848999 0.311056488 -0.1578670045 -0.479467499 0.4300815125 -0.2017369995 +-0.8120300295 -0.239447006 0.121001999 -0.812255005 -0.212675003 0.1157529985 +-0.812255005 -0.212675003 0.1157529985 -0.6991450195 -0.211671005 0.1066299975 +-0.6991450195 -0.211671005 0.1066299975 -0.8120300295 -0.239447006 0.121001999 +-0.075449997 0.231632004 0.165663498 -0.0757074965 0.280825989 0.1406649935 +-0.0757074965 0.280825989 0.1406649935 -0.01264795 0.280825989 0.1397545015 +-0.01264795 0.280825989 0.1397545015 -0.075449997 0.231632004 0.165663498 +0.587590027 0.0694375 0.0723290025 0.2443639985 0.084719002 0.0093517505 +0.2443639985 0.084719002 0.0093517505 0.5994000245 0.0846080015 0.00395728 +0.5994000245 0.0846080015 0.00395728 0.587590027 0.0694375 0.0723290025 +-0.4792275085 -0.4443664855 -0.186557495 -0.479736511 -0.3113974915 -0.226177994 +-0.479736511 -0.3113974915 -0.226177994 -0.4788349915 -0.323890991 -0.146716995 +-0.4788349915 -0.323890991 -0.146716995 -0.4792275085 -0.4443664855 -0.186557495 +-0.7043099975 0.183107498 -0.238022995 -0.817659973 0.211330002 -0.249211502 +-0.817659973 0.211330002 -0.249211502 -0.704299988 0.2146764985 -0.2440475005 +-0.704299988 0.2146764985 -0.2440475005 -0.7043099975 0.183107498 -0.238022995 +-0.3928659975 -0.291987488 0.154216995 -0.392913513 -0.187798996 0.167158493 +-0.392913513 -0.187798996 0.167158493 -0.3922409975 -0.2420130005 0.177660507 +-0.3922409975 -0.2420130005 0.177660507 -0.3928659975 -0.291987488 0.154216995 +-0.70513501 -0.258745514 -0.289364502 -0.81776001 -0.246921005 -0.2604830015 +-0.81776001 -0.246921005 -0.2604830015 -0.704549988 -0.2535025025 -0.258557495 +-0.704549988 -0.2535025025 -0.258557495 -0.70513501 -0.258745514 -0.289364502 +-0.3927369995 0.225385498 0.169393997 -0.3929995115 0.27457901 0.1446185 +-0.3929995115 0.27457901 0.1446185 -0.0757074965 0.280825989 0.1406649935 +-0.0757074965 0.280825989 0.1406649935 -0.3927369995 0.225385498 0.169393997 +-0.4196700135 -0.1706204985 -0.2493545075 -0.7043449705 -0.1995119935 -0.231216995 +-0.7043449705 -0.1995119935 -0.231216995 -0.4192974855 -0.1992890015 -0.2351764985 +-0.4192974855 -0.1992890015 -0.2351764985 -0.4196700135 -0.1706204985 -0.2493545075 +-0.3927369995 0.225385498 0.169393997 -0.3929995115 0.27457901 0.1446185 +-0.3929995115 0.27457901 0.1446185 -0.392666504 0.170947998 0.1606920015 +-0.392666504 0.170947998 0.1606920015 -0.3927369995 0.225385498 0.169393997 +-0.817659973 0.211330002 -0.249211502 -0.8177750245 0.184557495 -0.2438580015 +-0.8177750245 0.184557495 -0.2438580015 -0.7043099975 0.183107498 -0.238022995 +-0.7043099975 0.183107498 -0.238022995 -0.817659973 0.211330002 -0.249211502 +-0.7052800295 0.240779495 -0.2982940065 -0.818034973 0.2299589995 -0.2686335145 +-0.818034973 0.2299589995 -0.2686335145 -0.704710022 0.236875 -0.267040497 +-0.704710022 0.236875 -0.267040497 -0.7052800295 0.240779495 -0.2982940065 +-0.70548999 -0.1612494965 -0.304211487 -0.8180599975 -0.1644850005 -0.272873993 +-0.8180599975 -0.1644850005 -0.272873993 -0.704914978 -0.1561185 -0.273181488 +-0.704914978 -0.1561185 -0.273181488 -0.70548999 -0.1612494965 -0.304211487 +0.555049988 -1.0499749755 0.1716185 0.5548599855 -1.0478599855 0.1648079985 +0.5548599855 -1.0478599855 0.1648079985 0.614789978 -1.0427249755 0.169298996 +0.614789978 -1.0427249755 0.169298996 0.555049988 -1.0499749755 0.1716185 +0.5994000245 0.0846080015 0.00395728 0.587590027 0.0694375 0.0723290025 +0.587590027 0.0694375 0.0723290025 1.561875 0.0447851485 -0.0345699995 +1.561875 0.0447851485 -0.0345699995 0.5994000245 0.0846080015 0.00395728 +-0.81776001 -0.246921005 -0.2604830015 -0.8182199705 -0.2512714995 -0.2866004945 +-0.8182199705 -0.2512714995 -0.2866004945 -0.70513501 -0.258745514 -0.289364502 +-0.70513501 -0.258745514 -0.289364502 -0.81776001 -0.246921005 -0.2604830015 +-0.392913513 -0.187798996 0.167158493 -0.3932944945 -0.1500944975 0.126760498 +-0.3932944945 -0.1500944975 0.126760498 -0.3922409975 -0.2420130005 0.177660507 +-0.3922409975 -0.2420130005 0.177660507 -0.392913513 -0.187798996 0.167158493 +-0.3927369995 0.225385498 0.169393997 -0.3933034975 0.1317940065 0.121850502 +-0.3933034975 0.1317940065 0.121850502 -0.392666504 0.170947998 0.1606920015 +-0.392666504 0.170947998 0.1606920015 -0.3927369995 0.225385498 0.169393997 +-0.8180599975 -0.1644850005 -0.272873993 -0.81851001 -0.168723999 -0.2992149965 +-0.81851001 -0.168723999 -0.2992149965 -0.70548999 -0.1612494965 -0.304211487 +-0.70548999 -0.1612494965 -0.304211487 -0.8180599975 -0.1644850005 -0.272873993 +-0.586830017 0.1207505035 0.0660270005 -0.58888501 0.1410525055 -0.0650059965 +-0.58888501 0.1410525055 -0.0650059965 -0.5861099855 0.0693259965 0.106208 +-0.5861099855 0.0693259965 0.106208 -0.586830017 0.1207505035 0.0660270005 +-0.393755493 0.299566498 0.095510002 -0.393834015 0.123316002 0.067279999 +-0.393834015 0.123316002 0.067279999 -0.3929995115 0.27457901 0.1446185 +-0.3929995115 0.27457901 0.1446185 -0.393755493 0.299566498 0.095510002 +-0.393755493 0.299566498 0.095510002 -0.393834015 0.123316002 0.067279999 +-0.393834015 0.123316002 0.067279999 -0.3933034975 0.1317940065 0.121850502 +-0.3933034975 0.1317940065 0.121850502 -0.393755493 0.299566498 0.095510002 +-0.0810410005 1.0157249755 0.1129940035 -0.0770759965 1.0201849975 0.1420870055 +-0.0770759965 1.0201849975 0.1420870055 -0.076989502 1.031339966 0.137960495 +-0.076989502 1.031339966 0.137960495 -0.0810410005 1.0157249755 0.1129940035 +-0.080373001 -0.137600998 -0.2065429995 -0.081001503 -0.136151001 -0.213808502 +-0.081001503 -0.136151001 -0.213808502 -0.0181679 -0.136151001 -0.214612503 +-0.0181679 -0.136151001 -0.214612503 -0.080373001 -0.137600998 -0.2065429995 +-0.3938640135 -0.31876001 0.1059954985 -0.3941505125 -0.1431784975 0.0717365035 +-0.3941505125 -0.1431784975 0.0717365035 -0.3928659975 -0.291987488 0.154216995 +-0.3928659975 -0.291987488 0.154216995 -0.3938640135 -0.31876001 0.1059954985 +-0.3938640135 -0.31876001 0.1059954985 -0.3941505125 -0.1431784975 0.0717365035 +-0.3941505125 -0.1431784975 0.0717365035 -0.3932944945 -0.1500944975 0.126760498 +-0.3932944945 -0.1500944975 0.126760498 -0.3938640135 -0.31876001 0.1059954985 +-0.420192505 -0.2585224915 -0.2936610105 -0.420726013 -0.2442440035 -0.3214544985 +-0.420726013 -0.2442440035 -0.3214544985 -0.3973320005 -0.2195910035 -0.2877149965 +-0.3973320005 -0.2195910035 -0.2877149965 -0.420192505 -0.2585224915 -0.2936610105 +-0.397417511 -0.2159100035 -0.2942994995 -0.420726013 -0.2442440035 -0.3214544985 +-0.420726013 -0.2442440035 -0.3214544985 -0.3973320005 -0.2195910035 -0.2877149965 +-0.3973320005 -0.2195910035 -0.2877149965 -0.397417511 -0.2159100035 -0.2942994995 +-0.419994995 0.236651993 -0.2711185 -0.4204609985 0.2408910065 -0.302145996 +-0.4204609985 0.2408910065 -0.302145996 -0.397296997 0.201848007 -0.2947430115 +-0.397296997 0.201848007 -0.2947430115 -0.419994995 0.236651993 -0.2711185 +-0.3978880005 -1.051089966 -0.266527008 -0.397890991 -1.042505005 -0.2770150145 +-0.397890991 -1.042505005 -0.2770150145 -0.397646515 -1.0239849855 -0.2620589905 +-0.397646515 -1.0239849855 -0.2620589905 -0.3978880005 -1.051089966 -0.266527008 +-0.397890991 -1.042505005 -0.2770150145 -0.3979100035 -1.060910034 -0.292078491 +-0.3979100035 -1.060910034 -0.292078491 -0.3978880005 -1.051089966 -0.266527008 +-0.3978880005 -1.051089966 -0.266527008 -0.397890991 -1.042505005 -0.2770150145 +-0.4203150025 -0.1561185 -0.2771505125 -0.420441498 -0.1610265045 -0.3083940125 +-0.420441498 -0.1610265045 -0.3083940125 -0.3973714905 -0.196723007 -0.2911744995 +-0.3973714905 -0.196723007 -0.2911744995 -0.4203150025 -0.1561185 -0.2771505125 +-0.3978670045 -1.0068049925 -0.283486511 -0.397935486 -1.0287800295 -0.274896515 +-0.397935486 -1.0287800295 -0.274896515 -0.397646515 -1.0239849855 -0.2620589905 +-0.397646515 -1.0239849855 -0.2620589905 -0.3978670045 -1.0068049925 -0.283486511 +-0.397890991 -1.042505005 -0.2770150145 -0.397935486 -1.0287800295 -0.274896515 +-0.397935486 -1.0287800295 -0.274896515 -0.397646515 -1.0239849855 -0.2620589905 +-0.397646515 -1.0239849855 -0.2620589905 -0.397890991 -1.042505005 -0.2770150145 +-0.3973714905 -0.196723007 -0.2911744995 -0.4203150025 -0.1561185 -0.2771505125 +-0.4203150025 -0.1561185 -0.2771505125 -0.397188507 -0.195272995 -0.2839179995 +-0.397188507 -0.195272995 -0.2839179995 -0.3973714905 -0.196723007 -0.2911744995 +-0.5887700195 -0.159800003 -0.0598709985 -0.58888501 0.1410525055 -0.0650059965 +-0.58888501 0.1410525055 -0.0650059965 -0.586169983 -0.075578499 0.108996498 +-0.586169983 -0.075578499 0.108996498 -0.5887700195 -0.159800003 -0.0598709985 +-0.479736511 -0.3113974915 -0.226177994 -0.4788349915 -0.323890991 -0.146716995 +-0.4788349915 -0.323890991 -0.146716995 -0.477746002 -0.147306 -0.118800499 +-0.477746002 -0.147306 -0.118800499 -0.479736511 -0.3113974915 -0.226177994 +-0.3973299865 0.200732498 -0.287825989 -0.419994995 0.236651993 -0.2711185 +-0.419994995 0.236651993 -0.2711185 -0.397296997 0.201848007 -0.2947430115 +-0.397296997 0.201848007 -0.2947430115 -0.3973299865 0.200732498 -0.287825989 +-0.080529999 -0.447155487 -0.172404495 -0.080892502 -0.4441434935 -0.1923840025 +-0.080892502 -0.4441434935 -0.1923840025 -0.0801604995 -0.3236679995 -0.152759506 +-0.0801604995 -0.3236679995 -0.152759506 -0.080529999 -0.447155487 -0.172404495 +1.5617249755 -0.0672125015 -0.032788101 1.5607650145 -0.0673239975 -0.0881500015 +1.5607650145 -0.0673239975 -0.0881500015 1.56623999 -0.0750210035 -0.0883700025 +1.56623999 -0.0750210035 -0.0883700025 1.5617249755 -0.0672125015 -0.032788101 +-0.7057750245 0.196382004 -0.3386944885 -0.8187700195 0.168940506 -0.324213501 +-0.8187700195 0.168940506 -0.324213501 -0.705674988 0.1645899965 -0.3327789915 +-0.705674988 0.1645899965 -0.3327789915 -0.7057750245 0.196382004 -0.3386944885 +1.561875 0.0447851485 -0.0345699995 1.560925049 0.0643065035 -0.090489502 +1.560925049 0.0643065035 -0.090489502 1.56651001 0.0687679975 -0.0907070005 +1.56651001 0.0687679975 -0.0907070005 1.561875 0.0447851485 -0.0345699995 +-0.0612874985 -0.0432287485 0.0967839965 -0.061292 -0.053491501 0.097007004 +-0.061292 -0.053491501 0.097007004 -0.060813999 -0.053380001 0.122121002 +-0.060813999 -0.053380001 0.122121002 -0.0612874985 -0.0432287485 0.0967839965 +1.56623999 -0.0750210035 -0.0883700025 1.5617249755 -0.0672125015 -0.032788101 +1.5617249755 -0.0672125015 -0.032788101 1.567420044 -0.072344002 -0.0328918495 +1.567420044 -0.072344002 -0.0328918495 1.56623999 -0.0750210035 -0.0883700025 +-0.397935486 -1.0287800295 -0.274896515 -0.3980455015 -1.020414978 -0.285609497 +-0.3980455015 -1.020414978 -0.285609497 -0.3978670045 -1.0068049925 -0.283486511 +-0.3978670045 -1.0068049925 -0.283486511 -0.397935486 -1.0287800295 -0.274896515 +-0.8187700195 0.168940506 -0.324213501 -0.819 0.195712494 -0.3292390135 +-0.819 0.195712494 -0.3292390135 -0.7057750245 0.196382004 -0.3386944885 +-0.7057750245 0.196382004 -0.3386944885 -0.8187700195 0.168940506 -0.324213501 +-0.082878998 -0.238220001 -0.315939514 -0.0194851 -0.238220001 -0.316842987 +-0.0194851 -0.238220001 -0.316842987 -0.0190025005 -0.28730249 -0.291951996 +-0.0190025005 -0.28730249 -0.291951996 -0.082878998 -0.238220001 -0.315939514 +-0.3979100035 -1.060910034 -0.292078491 -0.398068512 -1.0475250245 -0.289850006 +-0.398068512 -1.0475250245 -0.289850006 -0.397890991 -1.042505005 -0.2770150145 +-0.397890991 -1.042505005 -0.2770150145 -0.3979100035 -1.060910034 -0.292078491 +-0.097348503 1.0722800295 0.1031695025 -0.099223999 0.326004486 -0.01502785 +-0.099223999 0.326004486 -0.01502785 -0.097165001 1.069380005 0.121024498 +-0.097165001 1.069380005 0.121024498 -0.097348503 1.0722800295 0.1031695025 +-0.082064499 -0.28730249 -0.2909295045 -0.082878998 -0.238220001 -0.315939514 +-0.082878998 -0.238220001 -0.315939514 -0.0190025005 -0.28730249 -0.291951996 +-0.0190025005 -0.28730249 -0.291951996 -0.082064499 -0.28730249 -0.2909295045 +-0.398068512 -1.0475250245 -0.289850006 -0.3982879945 -1.0388199465 -0.30067749 +-0.3982879945 -1.0388199465 -0.30067749 -0.3979100035 -1.060910034 -0.292078491 +-0.3979100035 -1.060910034 -0.292078491 -0.398068512 -1.0475250245 -0.289850006 +-0.3919284975 1.0442800295 0.125449997 -0.3925085145 1.0170650025 0.121197998 +-0.3925085145 1.0170650025 0.121197998 -0.391924988 1.0358050535 0.1359380035 +-0.391924988 1.0358050535 0.1359380035 -0.3919284975 1.0442800295 0.125449997 +-0.398870514 0.2906424865 -0.2462409975 -0.3992210085 0.122088997 -0.266778015 +-0.3992210085 0.122088997 -0.266778015 -0.3982470095 0.1151725005 -0.2120859985 +-0.3982470095 0.1151725005 -0.2120859985 -0.398870514 0.2906424865 -0.2462409975 +-0.3983309935 -1.0164000245 -0.309269989 -0.3980455015 -1.020414978 -0.285609497 +-0.3980455015 -1.020414978 -0.285609497 -0.3978670045 -1.0068049925 -0.283486511 +-0.3978670045 -1.0068049925 -0.283486511 -0.3983309935 -1.0164000245 -0.309269989 +-0.398976013 -0.306601013 -0.235866501 -0.3990870055 -0.1388285065 -0.262535492 +-0.3990870055 -0.1388285065 -0.262535492 -0.398001007 -0.130238495 -0.2078405 +-0.398001007 -0.130238495 -0.2078405 -0.398976013 -0.306601013 -0.235866501 +-0.3989404905 0.9977650145 -0.344093994 -0.3989444885 1.0246500245 -0.3492269895 +-0.3989444885 1.0246500245 -0.3492269895 -0.3989349975 1.0066900025 -0.333717499 +-0.3989349975 1.0066900025 -0.333717499 -0.3989404905 0.9977650145 -0.344093994 +-0.398870514 0.2906424865 -0.2462409975 -0.3997575075 0.263869995 -0.2944599915 +-0.3997575075 0.263869995 -0.2944599915 -0.3982470095 0.1151725005 -0.2120859985 +-0.3982470095 0.1151725005 -0.2120859985 -0.398870514 0.2906424865 -0.2462409975 +-0.399762512 -0.2323079985 -0.310192505 -0.082878998 -0.238220001 -0.315939514 +-0.082878998 -0.238220001 -0.315939514 -0.082064499 -0.28730249 -0.2909295045 +-0.082064499 -0.28730249 -0.2909295045 -0.399762512 -0.2323079985 -0.310192505 +-0.3982254945 -1.0250999755 -0.298333496 -0.3983309935 -1.0164000245 -0.309269989 +-0.3983309935 -1.0164000245 -0.309269989 -0.3980455015 -1.020414978 -0.285609497 +-0.3980455015 -1.020414978 -0.285609497 -0.3982254945 -1.0250999755 -0.298333496 +-0.3989444885 1.0246500245 -0.3492269895 -0.3989349975 1.0066900025 -0.333717499 +-0.3989349975 1.0066900025 -0.333717499 -0.398878998 1.020075012 -0.3363940125 +-0.398878998 1.020075012 -0.3363940125 -0.3989444885 1.0246500245 -0.3492269895 +-0.399493988 -0.177871002 -0.3017070005 -0.399762512 -0.2323079985 -0.310192505 +-0.399762512 -0.2323079985 -0.310192505 -0.3990870055 -0.1388285065 -0.262535492 +-0.3990870055 -0.1388285065 -0.262535492 -0.399493988 -0.177871002 -0.3017070005 +-0.398471985 1.006799988 -0.2972225035 -0.398592987 0.9887299805 -0.318089508 +-0.398592987 0.9887299805 -0.318089508 -0.398421509 1.0114849855 -0.310276001 +-0.398421509 1.0114849855 -0.310276001 -0.398471985 1.006799988 -0.2972225035 +-0.3982879945 -1.0388199465 -0.30067749 -0.3986954955 -1.0437299805 -0.313182495 +-0.3986954955 -1.0437299805 -0.313182495 -0.3979100035 -1.060910034 -0.292078491 +-0.3979100035 -1.060910034 -0.292078491 -0.3982879945 -1.0388199465 -0.30067749 +-0.399762512 -0.2323079985 -0.310192505 -0.399395996 -0.281390503 -0.2850805055 +-0.399395996 -0.281390503 -0.2850805055 -0.082064499 -0.28730249 -0.2909295045 +-0.082064499 -0.28730249 -0.2909295045 -0.399762512 -0.2323079985 -0.310192505 +-0.3982879945 -1.0388199465 -0.30067749 -0.3986954955 -1.0437299805 -0.313182495 +-0.3986954955 -1.0437299805 -0.313182495 -0.3982254945 -1.0250999755 -0.298333496 +-0.3982254945 -1.0250999755 -0.298333496 -0.3982879945 -1.0388199465 -0.30067749 +-0.3983309935 -1.0164000245 -0.309269989 -0.3986954955 -1.0437299805 -0.313182495 +-0.3986954955 -1.0437299805 -0.313182495 -0.3982254945 -1.0250999755 -0.298333496 +-0.3982254945 -1.0250999755 -0.298333496 -0.3983309935 -1.0164000245 -0.309269989 +-0.4135985105 0.1494190065 0.1372695005 -0.4142409975 0.1639205015 0.1093619995 +-0.4142409975 0.1639205015 0.1093619995 -0.3910710145 0.188572998 0.143097 +-0.3910710145 0.188572998 0.143097 -0.4135985105 0.1494190065 0.1372695005 +-0.391160492 0.1918079985 0.1367350005 -0.4142409975 0.1639205015 0.1093619995 +-0.4142409975 0.1639205015 0.1093619995 -0.3910710145 0.188572998 0.143097 +-0.3910710145 0.188572998 0.143097 -0.391160492 0.1918079985 0.1367350005 +-0.4137214965 0.2514880065 0.153779999 -0.4140755005 0.2463569945 0.1227545015 +-0.4140755005 0.2463569945 0.1227545015 -0.3911524965 0.2123339995 0.1470005035 +-0.3911524965 0.2123339995 0.1470005035 -0.4137214965 0.2514880065 0.153779999 +-0.398592987 0.9887299805 -0.318089508 -0.398764496 1.0022249755 -0.320548004 +-0.398764496 1.0022249755 -0.320548004 -0.398421509 1.0114849855 -0.310276001 +-0.398421509 1.0114849855 -0.310276001 -0.398592987 0.9887299805 -0.318089508 +-0.4140755005 0.2463569945 0.1227545015 -0.3911524965 0.2123339995 0.1470005035 +-0.3911524965 0.2123339995 0.1470005035 -0.3910004885 0.2112180025 0.139751007 +-0.3910004885 0.2112180025 0.139751007 -0.4140755005 0.2463569945 0.1227545015 +-0.398976013 -0.306601013 -0.235866501 -0.399395996 -0.281390503 -0.2850805055 +-0.399395996 -0.281390503 -0.2850805055 -0.398001007 -0.130238495 -0.2078405 +-0.398001007 -0.130238495 -0.2078405 -0.398976013 -0.306601013 -0.235866501 +-0.398816498 1.0246500245 -0.312738495 -0.398933502 1.0426099855 -0.3284735105 +-0.398933502 1.0426099855 -0.3284735105 -0.398761505 1.029334961 -0.326015503 +-0.398761505 1.029334961 -0.326015503 -0.398816498 1.0246500245 -0.312738495 +-0.398816498 1.0246500245 -0.312738495 -0.398471985 1.006799988 -0.2972225035 +-0.398471985 1.006799988 -0.2972225035 -0.398421509 1.0114849855 -0.310276001 +-0.398421509 1.0114849855 -0.310276001 -0.398816498 1.0246500245 -0.312738495 +-0.413470001 -0.170843506 0.1737575075 -0.4139360045 -0.1670505065 0.1427295075 +-0.4139360045 -0.1670505065 0.1427295075 -0.39092099 -0.2072089995 0.1572700045 +-0.39092099 -0.2072089995 0.1572700045 -0.413470001 -0.170843506 0.1737575075 +-0.3909924925 -0.2059819945 0.150016495 -0.4139360045 -0.1670505065 0.1427295075 +-0.4139360045 -0.1670505065 0.1427295075 -0.39092099 -0.2072089995 0.1572700045 +-0.39092099 -0.2072089995 0.1572700045 -0.3909924925 -0.2059819945 0.150016495 +-0.398476013 1.033795044 -0.302355011 -0.398816498 1.0246500245 -0.312738495 +-0.398816498 1.0246500245 -0.312738495 -0.398471985 1.006799988 -0.2972225035 +-0.398471985 1.006799988 -0.2972225035 -0.398476013 1.033795044 -0.302355011 +-0.399493988 -0.177871002 -0.3017070005 -0.399762512 -0.2323079985 -0.310192505 +-0.399762512 -0.2323079985 -0.310192505 -0.399395996 -0.281390503 -0.2850805055 +-0.399395996 -0.281390503 -0.2850805055 -0.399493988 -0.177871002 -0.3017070005 +-0.398816498 1.0246500245 -0.312738495 -0.398933502 1.0426099855 -0.3284735105 +-0.398933502 1.0426099855 -0.3284735105 -0.398476013 1.033795044 -0.302355011 +-0.398476013 1.033795044 -0.302355011 -0.398816498 1.0246500245 -0.312738495 +-0.399822998 0.1597929995 -0.307292511 -0.399938507 0.2138954925 -0.3177835085 +-0.399938507 0.2138954925 -0.3177835085 -0.3992210085 0.122088997 -0.266778015 +-0.3992210085 0.122088997 -0.266778015 -0.399822998 0.1597929995 -0.307292511 +-0.399822998 0.1597929995 -0.307292511 -0.399938507 0.2138954925 -0.3177835085 +-0.399938507 0.2138954925 -0.3177835085 -0.3997575075 0.263869995 -0.2944599915 +-0.3997575075 0.263869995 -0.2944599915 -0.399822998 0.1597929995 -0.307292511 +-0.3989404905 0.9977650145 -0.344093994 -0.398764496 1.0022249755 -0.320548004 +-0.398764496 1.0022249755 -0.320548004 -0.398592987 0.9887299805 -0.318089508 +-0.398592987 0.9887299805 -0.318089508 -0.3989404905 0.9977650145 -0.344093994 +-0.398878998 1.020075012 -0.3363940125 -0.398933502 1.0426099855 -0.3284735105 +-0.398933502 1.0426099855 -0.3284735105 -0.398761505 1.029334961 -0.326015503 +-0.398761505 1.029334961 -0.326015503 -0.398878998 1.020075012 -0.3363940125 +-0.398933502 1.0426099855 -0.3284735105 -0.3989444885 1.0246500245 -0.3492269895 +-0.3989444885 1.0246500245 -0.3492269895 -0.398878998 1.020075012 -0.3363940125 +-0.398878998 1.020075012 -0.3363940125 -0.398933502 1.0426099855 -0.3284735105 +-0.3989349975 1.0066900025 -0.333717499 -0.3989404905 0.9977650145 -0.344093994 +-0.3989404905 0.9977650145 -0.344093994 -0.398764496 1.0022249755 -0.320548004 +-0.398764496 1.0022249755 -0.320548004 -0.3989349975 1.0066900025 -0.333717499 +-0.4216180115 1.0098099975 0.168565506 -0.4220870055 0.999994995 0.143005005 +-0.4220870055 0.999994995 0.143005005 -0.3916164855 0.99988501 0.1425274965 +-0.3916164855 0.99988501 0.1425274965 -0.4216180115 1.0098099975 0.168565506 +-0.3919284975 1.0442800295 0.125449997 -0.4217065125 1.0540999755 0.1514924925 +-0.4217065125 1.0540999755 0.1514924925 -0.3916849975 1.054209961 0.1511174925 +-0.3916849975 1.054209961 0.1511174925 -0.3919284975 1.0442800295 0.125449997 +-0.458218994 0.041549801 0.102193001 -0.4582470095 -0.0394641 0.1021920015 +-0.4582470095 -0.0394641 0.1021920015 -0.4472309875 0.0510040015 0.0903174975 +-0.4472309875 0.0510040015 0.0903174975 -0.458218994 0.041549801 0.102193001 +-0.547130005 -0.0489177015 0.0882249985 -0.4582470095 -0.0394641 0.1021920015 +-0.4582470095 -0.0394641 0.1021920015 -0.447259491 -0.0489177015 0.0903170015 +-0.447259491 -0.0489177015 0.0903170015 -0.547130005 -0.0489177015 0.0882249985 +-0.4192974855 -0.1992890015 -0.2351764985 -0.4194179995 -0.230746002 -0.240088501 +-0.4194179995 -0.230746002 -0.240088501 -0.3973940125 -0.2053125 -0.274104004 +-0.3973940125 -0.2053125 -0.274104004 -0.4192974855 -0.1992890015 -0.2351764985 +-0.390921997 -0.211893997 0.162626007 -0.413173004 -0.1929299925 0.196859497 +-0.413173004 -0.1929299925 0.196859497 -0.390729492 -0.2194795075 0.1640805055 +-0.390729492 -0.2194795075 0.1640805055 -0.390921997 -0.211893997 0.162626007 +-0.3906679995 0.1949315035 0.155824997 -0.4131514895 0.1771950075 0.1905 +-0.4131514895 0.1771950075 0.1905 -0.3905799865 0.202182495 0.156942505 +-0.3905799865 0.202182495 0.156942505 -0.3906679995 0.1949315035 0.155824997 +-0.390729492 -0.2194795075 0.1640805055 -0.4129599915 -0.224498993 0.2026660005 +-0.4129599915 -0.224498993 0.2026660005 -0.3906640015 -0.2261725005 0.1609575045 +-0.3906640015 -0.2261725005 0.1609575045 -0.390729492 -0.2194795075 0.1640805055 +-0.4286944885 -1.01651001 -0.308566986 -0.3983309935 -1.0164000245 -0.309269989 +-0.3983309935 -1.0164000245 -0.309269989 -0.3978670045 -1.0068049925 -0.283486511 +-0.3978670045 -1.0068049925 -0.283486511 -0.4286944885 -1.01651001 -0.308566986 +-0.539215027 -0.0394641 0.100496002 -0.547130005 -0.0489177015 0.0882249985 +-0.547130005 -0.0489177015 0.0882249985 -0.4582470095 -0.0394641 0.1021920015 +-0.4582470095 -0.0394641 0.1021920015 -0.539215027 -0.0394641 0.100496002 +-0.447259491 -0.0489177015 0.0903170015 -0.4582470095 -0.0394641 0.1021920015 +-0.4582470095 -0.0394641 0.1021920015 -0.4472309875 0.0510040015 0.0903174975 +-0.4472309875 0.0510040015 0.0903174975 -0.447259491 -0.0489177015 0.0903170015 +-0.4282235105 -1.0068049925 -0.2831174925 -0.4286944885 -1.01651001 -0.308566986 +-0.4286944885 -1.01651001 -0.308566986 -0.3978670045 -1.0068049925 -0.283486511 +-0.3978670045 -1.0068049925 -0.283486511 -0.4282235105 -1.0068049925 -0.2831174925 +-0.4217065125 1.0540999755 0.1514924925 -0.4221755065 1.044170044 0.125931999 +-0.4221755065 1.044170044 0.125931999 -0.3919284975 1.0442800295 0.125449997 +-0.3919284975 1.0442800295 0.125449997 -0.4217065125 1.0540999755 0.1514924925 +-0.099725998 -0.163703995 -0.039027199 -0.5643200075 -0.3491019895 0.00334654 +-0.5643200075 -0.3491019895 0.00334654 -0.0994280015 -0.159911499 -0.0212803495 +-0.0994280015 -0.159911499 -0.0212803495 -0.099725998 -0.163703995 -0.039027199 +-0.4280255125 -1.051089966 -0.265931 -0.4281619875 -1.060910034 -0.291372986 +-0.4281619875 -1.060910034 -0.291372986 -0.3978880005 -1.051089966 -0.266527008 +-0.3978880005 -1.051089966 -0.266527008 -0.4280255125 -1.051089966 -0.265931 +-0.412921997 0.2087640075 0.195526001 -0.4131514895 0.1771950075 0.1905 +-0.4131514895 0.1771950075 0.1905 -0.3905799865 0.202182495 0.156942505 +-0.3905799865 0.202182495 0.156942505 -0.412921997 0.2087640075 0.195526001 +-0.5640200195 -0.3454205015 0.020870449 -0.5643200075 -0.3491019895 0.00334654 +-0.5643200075 -0.3491019895 0.00334654 -0.0994280015 -0.159911499 -0.0212803495 +-0.0994280015 -0.159911499 -0.0212803495 -0.5640200195 -0.3454205015 0.020870449 +-0.5885549925 -0.0592085 -0.0795595015 -0.608710022 0.0486054495 -0.0692985 +-0.608710022 0.0486054495 -0.0692985 -0.5885549925 0.053625 -0.0795595015 +-0.5885549925 0.053625 -0.0795595015 -0.5885549925 -0.0592085 -0.0795595015 +-0.4281619875 -1.060910034 -0.291372986 -0.3979100035 -1.060910034 -0.292078491 +-0.3979100035 -1.060910034 -0.292078491 -0.3978880005 -1.051089966 -0.266527008 +-0.3978880005 -1.051089966 -0.266527008 -0.4281619875 -1.060910034 -0.291372986 +-0.3916164855 0.99988501 0.1425274965 -0.4216180115 1.0098099975 0.168565506 +-0.4216180115 1.0098099975 0.168565506 -0.3913754885 1.009590027 0.1683065035 +-0.3913754885 1.009590027 0.1683065035 -0.3916164855 0.99988501 0.1425274965 +-0.3908900145 0.1896889955 0.150464493 -0.413467499 0.154326996 0.168290497 +-0.413467499 0.154326996 0.168290497 -0.3906679995 0.1949315035 0.155824997 +-0.3906679995 0.1949315035 0.155824997 -0.3908900145 0.1896889955 0.150464493 +-0.4194179995 -0.230746002 -0.240088501 -0.4197265015 -0.2535025025 -0.2626329955 +-0.4197265015 -0.2535025025 -0.2626329955 -0.3972569885 -0.212675003 -0.275328491 +-0.3972569885 -0.212675003 -0.275328491 -0.4194179995 -0.230746002 -0.240088501 +-0.4197265015 -0.2535025025 -0.2626329955 -0.3972609865 -0.2181410065 -0.2804609985 +-0.3972609865 -0.2181410065 -0.2804609985 -0.3972569885 -0.212675003 -0.275328491 +-0.3972569885 -0.212675003 -0.275328491 -0.4197265015 -0.2535025025 -0.2626329955 +-0.419601013 0.183218994 -0.2419889985 -0.4196619875 0.154661499 -0.2550444945 +-0.4196619875 0.154661499 -0.2550444945 -0.397299988 0.1815455015 -0.2839205015 +-0.397299988 0.1815455015 -0.2839205015 -0.419601013 0.183218994 -0.2419889985 +-0.397299988 0.1815455015 -0.2839205015 -0.419601013 0.183218994 -0.2419889985 +-0.419601013 0.183218994 -0.2419889985 -0.397023987 0.1883504945 -0.2811254885 +-0.397023987 0.1883504945 -0.2811254885 -0.397299988 0.1815455015 -0.2839205015 +-0.4131514895 0.1771950075 0.1905 -0.413467499 0.154326996 0.168290497 +-0.413467499 0.154326996 0.168290497 -0.3906679995 0.1949315035 0.155824997 +-0.3906679995 0.1949315035 0.155824997 -0.4131514895 0.1771950075 0.1905 +-0.608710022 0.0486054495 -0.0692985 -0.608710022 -0.054188999 -0.0692985 +-0.608710022 -0.054188999 -0.0692985 -0.5885549925 -0.0592085 -0.0795595015 +-0.5885549925 -0.0592085 -0.0795595015 -0.608710022 0.0486054495 -0.0692985 +-0.4194179995 -0.230746002 -0.240088501 -0.3973940125 -0.2053125 -0.274104004 +-0.3973940125 -0.2053125 -0.274104004 -0.3972569885 -0.212675003 -0.275328491 +-0.3972569885 -0.212675003 -0.275328491 -0.4194179995 -0.230746002 -0.240088501 +-0.4129599915 -0.224498993 0.2026660005 -0.413251007 -0.253279495 0.189940506 +-0.413251007 -0.253279495 0.189940506 -0.3906640015 -0.2261725005 0.1609575045 +-0.3906640015 -0.2261725005 0.1609575045 -0.4129599915 -0.224498993 0.2026660005 +-0.6178049925 -0.0103215505 -0.1971589965 -0.5908449705 -0.0108788995 -0.221699005 +-0.5908449705 -0.0108788995 -0.221699005 -0.590580017 -0.1214260025 -0.186546997 +-0.590580017 -0.1214260025 -0.186546997 -0.6178049925 -0.0103215505 -0.1971589965 +-0.6176500245 -0.1046934965 -0.167365494 -0.6178049925 -0.0103215505 -0.1971589965 +-0.6178049925 -0.0103215505 -0.1971589965 -0.590580017 -0.1214260025 -0.186546997 +-0.590580017 -0.1214260025 -0.186546997 -0.6176500245 -0.1046934965 -0.167365494 +1.71826001 0.025263201 -0.0751435015 1.565660034 -0.00954055 -0.1353554995 +1.565660034 -0.00954055 -0.1353554995 1.7184849855 -0.0395476 -0.075139 +1.7184849855 -0.0395476 -0.075139 1.71826001 0.025263201 -0.0751435015 +0.554244995 1.029 0.1406950075 0.5541849975 1.0195150145 0.1331065065 +0.5541849975 1.0195150145 0.1331065065 0.614205017 1.0263199465 0.133359497 +0.614205017 1.0263199465 0.133359497 0.554244995 1.029 0.1406950075 +0.5541400145 1.0336850585 0.1351139985 0.5540549925 1.031005005 0.128529007 +0.5540549925 1.031005005 0.128529007 0.614205017 1.0263199465 0.133359497 +0.614205017 1.0263199465 0.133359497 0.5541400145 1.0336850585 0.1351139985 +0.5479450075 -1.0399399415 -0.304064514 0.547919983 -1.037704956 -0.297593506 +0.547919983 -1.037704956 -0.297593506 0.60775 -1.0326850585 -0.304262512 +0.60775 -1.0326850585 -0.304262512 0.5479450075 -1.0399399415 -0.304064514 +0.54801001 -1.026329956 -0.301942993 0.5478150025 -1.0287800295 -0.308530487 +0.5478150025 -1.0287800295 -0.308530487 0.60775 -1.0326850585 -0.304262512 +0.60775 -1.0326850585 -0.304262512 0.54801001 -1.026329956 -0.301942993 +0.5469849855 1.0105949705 -0.343582489 0.5614349975 1.014830017 -0.3568919985 +0.5614349975 1.014830017 -0.3568919985 0.56175 1.008919983 -0.355881012 +0.56175 1.008919983 -0.355881012 0.5469849855 1.0105949705 -0.343582489 +1.565660034 -0.00954055 -0.1353554995 1.5656049805 0.0384262505 -0.1326784975 +1.5656049805 0.0384262505 -0.1326784975 1.71826001 0.025263201 -0.0751435015 +1.71826001 0.025263201 -0.0751435015 1.565660034 -0.00954055 -0.1353554995 +0.54725 1.0174000245 -0.3454735105 0.5469849855 1.0105949705 -0.343582489 +0.5469849855 1.0105949705 -0.343582489 0.5614349975 1.014830017 -0.3568919985 +0.5614349975 1.014830017 -0.3568919985 0.54725 1.0174000245 -0.3454735105 +-0.080772003 0.995869995 0.1374349975 -0.357734497 1.0070250245 0.170908005 +-0.357734497 1.0070250245 0.170908005 -0.0804990005 1.0070250245 0.1670079955 +-0.0804990005 1.0070250245 0.1670079955 -0.080772003 0.995869995 0.1374349975 +0.243067505 -0.115179497 -0.0725719985 0.097556999 -0.1345890045 0.0560390015 +0.097556999 -0.1345890045 0.0560390015 0.2443829955 -0.096885002 0.00845965 +0.2443829955 -0.096885002 0.00845965 0.243067505 -0.115179497 -0.0725719985 +0.2425700075 0.0857229995 -0.1127494965 0.0970875015 0.1206384965 -0.150608505 +0.0970875015 0.1206384965 -0.150608505 0.2432630005 0.1117145005 -0.076584503 +0.2432630005 0.1117145005 -0.076584503 0.2425700075 0.0857229995 -0.1127494965 +0.5540549925 1.031005005 0.128529007 -0.076989502 1.031339966 0.137960495 +-0.076989502 1.031339966 0.137960495 0.5541400145 1.0336850585 0.1351139985 +0.5541400145 1.0336850585 0.1351139985 0.5540549925 1.031005005 0.128529007 +-0.076989502 1.031339966 0.137960495 -0.0770179975 1.0336850585 0.144654495 +-0.0770179975 1.0336850585 0.144654495 0.5541400145 1.0336850585 0.1351139985 +0.5541400145 1.0336850585 0.1351139985 -0.076989502 1.031339966 0.137960495 +-0.0770759965 1.0201849975 0.1420870055 0.5541849975 1.0195150145 0.1331065065 +0.5541849975 1.0195150145 0.1331065065 0.554244995 1.029 0.1406950075 +0.554244995 1.029 0.1406950075 -0.0770759965 1.0201849975 0.1420870055 +-0.0767959975 1.0294449465 0.150014496 -0.0770759965 1.0201849975 0.1420870055 +-0.0770759965 1.0201849975 0.1420870055 0.554244995 1.029 0.1406950075 +0.554244995 1.029 0.1406950075 -0.0767959975 1.0294449465 0.150014496 +0.5991900025 -0.096885002 0.003283375 0.5877650145 -0.0758014985 0.074564499 +0.5877650145 -0.0758014985 0.074564499 1.5617249755 -0.0672125015 -0.032788101 +1.5617249755 -0.0672125015 -0.032788101 0.5991900025 -0.096885002 0.003283375 +-0.357734497 1.0070250245 0.170908005 -0.3578984985 0.995755005 0.141449005 +-0.3578984985 0.995755005 0.141449005 -0.080772003 0.995869995 0.1374349975 +-0.080772003 0.995869995 0.1374349975 -0.357734497 1.0070250245 0.170908005 +-0.3643034975 -1.064925049 -0.293159485 -0.087058502 -1.06526001 -0.297505493 +-0.087058502 -1.06526001 -0.297505493 -0.0866764985 -1.053660034 -0.267818512 +-0.0866764985 -1.053660034 -0.267818512 -0.3643034975 -1.064925049 -0.293159485 +0.547919983 -1.037704956 -0.297593506 -0.0835910035 -1.031125 -0.2872795105 +-0.0835910035 -1.031125 -0.2872795105 0.5479450075 -1.0399399415 -0.304064514 +0.5479450075 -1.0399399415 -0.304064514 0.547919983 -1.037704956 -0.297593506 +-0.363916504 -1.053660034 -0.2636954955 -0.3643034975 -1.064925049 -0.293159485 +-0.3643034975 -1.064925049 -0.293159485 -0.0866764985 -1.053660034 -0.267818512 +-0.0866764985 -1.053660034 -0.267818512 -0.363916504 -1.053660034 -0.2636954955 +-0.083318001 -1.040494995 -0.2949725035 -0.0835910035 -1.031125 -0.2872795105 +-0.0835910035 -1.031125 -0.2872795105 0.5479450075 -1.0399399415 -0.304064514 +0.5479450075 -1.0399399415 -0.304064514 -0.083318001 -1.040494995 -0.2949725035 +-0.0835930025 -1.026550049 -0.2925234985 0.5478150025 -1.0287800295 -0.308530487 +0.5478150025 -1.0287800295 -0.308530487 0.54801001 -1.026329956 -0.301942993 +0.54801001 -1.026329956 -0.301942993 -0.0835930025 -1.026550049 -0.2925234985 +-0.083453003 -1.0292299805 -0.299215515 -0.0835930025 -1.026550049 -0.2925234985 +-0.0835930025 -1.026550049 -0.2925234985 0.5478150025 -1.0287800295 -0.308530487 +0.5478150025 -1.0287800295 -0.308530487 -0.083453003 -1.0292299805 -0.299215515 +-0.087430496 -1.013835022 -0.3170390015 -0.3645660095 -1.0139450075 -0.31257901 +-0.3645660095 -1.0139450075 -0.31257901 -0.087268997 -1.0023449705 -0.287467987 +-0.087268997 -1.0023449705 -0.287467987 -0.087430496 -1.013835022 -0.3170390015 +1.560130005 -0.050702999 -0.132347 1.559994995 -0.00976365 -0.136589493 +1.559994995 -0.00976365 -0.136589493 1.565660034 -0.00954055 -0.1353554995 +1.565660034 -0.00954055 -0.1353554995 1.560130005 -0.050702999 -0.132347 +1.560160034 0.038314701 -0.1336849975 1.559994995 -0.00976365 -0.136589493 +1.559994995 -0.00976365 -0.136589493 1.71826001 0.025263201 -0.0751435015 +1.71826001 0.025263201 -0.0751435015 1.560160034 0.038314701 -0.1336849975 +1.559994995 -0.00976365 -0.136589493 1.5656049805 0.0384262505 -0.1326784975 +1.5656049805 0.0384262505 -0.1326784975 1.71826001 0.025263201 -0.0751435015 +1.71826001 0.025263201 -0.0751435015 1.559994995 -0.00976365 -0.136589493 +1.559994995 -0.00976365 -0.136589493 1.71826001 0.025263201 -0.0751435015 +1.71826001 0.025263201 -0.0751435015 1.7184849855 -0.0395476 -0.075139 +1.7184849855 -0.0395476 -0.075139 1.559994995 -0.00976365 -0.136589493 +-0.3980455015 -1.020414978 -0.285609497 -0.3982254945 -1.0250999755 -0.298333496 +-0.3982254945 -1.0250999755 -0.298333496 -0.3791839905 -1.0201950075 -0.2858840025 +-0.3791839905 -1.0201950075 -0.2858840025 -0.3980455015 -1.020414978 -0.285609497 +1.565660034 -0.00954055 -0.1353554995 1.5653449705 -0.050814499 -0.130899002 +1.5653449705 -0.050814499 -0.130899002 1.7184849855 -0.0395476 -0.075139 +1.7184849855 -0.0395476 -0.075139 1.565660034 -0.00954055 -0.1353554995 +-0.398068512 -1.0475250245 -0.289850006 -0.397890991 -1.042505005 -0.2770150145 +-0.397890991 -1.042505005 -0.2770150145 -0.379361511 -1.042170044 -0.2774079895 +-0.379361511 -1.042170044 -0.2774079895 -0.398068512 -1.0475250245 -0.289850006 +-0.36017749 -0.037651348 0.1090999985 -0.366709015 -0.0489177015 0.0920045015 +-0.366709015 -0.0489177015 0.0920045015 -0.277825012 -0.0219785005 0.1059714965 +-0.277825012 -0.0219785005 0.1059714965 -0.36017749 -0.037651348 0.1090999985 +-0.364399994 -1.0025700075 -0.2832315065 -0.3645660095 -1.0139450075 -0.31257901 +-0.3645660095 -1.0139450075 -0.31257901 -0.087268997 -1.0023449705 -0.287467987 +-0.087268997 -1.0023449705 -0.287467987 -0.364399994 -1.0025700075 -0.2832315065 +-0.391713501 1.018289978 0.157811493 -0.391774994 1.0136049805 0.1447559965 +-0.391774994 1.0136049805 0.1447559965 -0.373359009 1.0132700195 0.144472 +-0.373359009 1.0132700195 0.144472 -0.391713501 1.018289978 0.157811493 +-0.373359009 1.0132700195 0.144472 -0.391713501 1.018289978 0.157811493 +-0.391713501 1.018289978 0.157811493 -0.372846985 1.0185150145 0.1573139955 +-0.372846985 1.0185150145 0.1573139955 -0.373359009 1.0132700195 0.144472 +-0.379359009 -1.025214966 -0.2988305055 -0.3982254945 -1.0250999755 -0.298333496 +-0.3982254945 -1.0250999755 -0.298333496 -0.3791839905 -1.0201950075 -0.2858840025 +-0.3791839905 -1.0201950075 -0.2858840025 -0.379359009 -1.025214966 -0.2988305055 +1.560130005 -0.050702999 -0.132347 1.5653449705 -0.050814499 -0.130899002 +1.5653449705 -0.050814499 -0.130899002 1.565660034 -0.00954055 -0.1353554995 +1.565660034 -0.00954055 -0.1353554995 1.560130005 -0.050702999 -0.132347 +-0.081139 1.046959961 0.1176784975 -0.357885498 1.058449951 0.1514909975 +-0.357885498 1.058449951 0.1514909975 -0.0809820025 1.058334961 0.1474725035 +-0.0809820025 1.058334961 0.1474725035 -0.081139 1.046959961 0.1176784975 +-0.38007251 1.006799988 -0.3339914855 -0.3801264955 1.0201849975 -0.336782501 +-0.3801264955 1.0201849975 -0.336782501 -0.365057007 0.9949749755 -0.3477359925 +-0.365057007 0.9949749755 -0.3477359925 -0.38007251 1.006799988 -0.3339914855 +1.71826001 0.025263201 -0.0751435015 1.561875 0.0447851485 -0.0345699995 +1.561875 0.0447851485 -0.0345699995 1.7184849855 -0.0395476 -0.075139 +1.7184849855 -0.0395476 -0.075139 1.71826001 0.025263201 -0.0751435015 +1.5621800535 -0.053380001 -0.0332249985 1.561875 0.0447851485 -0.0345699995 +1.561875 0.0447851485 -0.0345699995 1.7184849855 -0.0395476 -0.075139 +1.7184849855 -0.0395476 -0.075139 1.5621800535 -0.053380001 -0.0332249985 +1.560925049 0.0643065035 -0.090489502 1.560160034 0.038314701 -0.1336849975 +1.560160034 0.038314701 -0.1336849975 1.71826001 0.025263201 -0.0751435015 +1.71826001 0.025263201 -0.0751435015 1.560925049 0.0643065035 -0.090489502 +-0.357885498 1.058449951 0.1514909975 -0.3582674865 1.0470699465 0.1218034975 +-0.3582674865 1.0470699465 0.1218034975 -0.081139 1.046959961 0.1176784975 +-0.081139 1.046959961 0.1176784975 -0.357885498 1.058449951 0.1514909975 +-0.391924988 1.0358050535 0.1359380035 -0.3919704895 1.04048999 0.1487684935 +-0.3919704895 1.04048999 0.1487684935 -0.373402008 1.035579956 0.135880005 +-0.373402008 1.035579956 0.135880005 -0.391924988 1.0358050535 0.1359380035 +-0.3919704895 1.04048999 0.1487684935 -0.373402008 1.035579956 0.135880005 +-0.373402008 1.035579956 0.135880005 -0.3728945005 1.0405999755 0.1489450075 +-0.3728945005 1.0405999755 0.1489450075 -0.3919704895 1.04048999 0.1487684935 +-0.3727669985 -1.0392700195 0.1694774935 -0.357902008 -1.033579956 0.1522714995 +-0.357902008 -1.033579956 0.1522714995 -0.3576954955 -1.0644799805 0.158412506 +-0.3576954955 -1.0644799805 0.158412506 -0.3727669985 -1.0392700195 0.1694774935 +-0.3801264955 1.0201849975 -0.336782501 -0.3653745115 1.026209961 -0.353878998 +-0.3653745115 1.026209961 -0.353878998 -0.365057007 0.9949749755 -0.3477359925 +-0.365057007 0.9949749755 -0.3477359925 -0.3801264955 1.0201849975 -0.336782501 +-0.3791839905 -1.0201950075 -0.2858840025 -0.379359009 -1.025214966 -0.2988305055 +-0.379359009 -1.025214966 -0.2988305055 -0.364399994 -1.0025700075 -0.2832315065 +-0.364399994 -1.0025700075 -0.2832315065 -0.3791839905 -1.0201950075 -0.2858840025 +-0.3645660095 -1.0139450075 -0.31257901 -0.379359009 -1.025214966 -0.2988305055 +-0.379359009 -1.025214966 -0.2988305055 -0.364399994 -1.0025700075 -0.2832315065 +-0.364399994 -1.0025700075 -0.2832315065 -0.3645660095 -1.0139450075 -0.31257901 +-0.3728945005 1.0405999755 0.1489450075 -0.373402008 1.035579956 0.135880005 +-0.373402008 1.035579956 0.135880005 -0.3582674865 1.0470699465 0.1218034975 +-0.3582674865 1.0470699465 0.1218034975 -0.3728945005 1.0405999755 0.1489450075 +-0.3582674865 1.0470699465 0.1218034975 -0.3728945005 1.0405999755 0.1489450075 +-0.3728945005 1.0405999755 0.1489450075 -0.357885498 1.058449951 0.1514909975 +-0.357885498 1.058449951 0.1514909975 -0.3582674865 1.0470699465 0.1218034975 +-0.379541504 -1.047410034 -0.2901315 -0.398068512 -1.0475250245 -0.289850006 +-0.398068512 -1.0475250245 -0.289850006 -0.379361511 -1.042170044 -0.2774079895 +-0.379361511 -1.042170044 -0.2774079895 -0.379541504 -1.047410034 -0.2901315 +-0.372600006 -1.052880005 0.1721589965 -0.3727669985 -1.0392700195 0.1694774935 +-0.3727669985 -1.0392700195 0.1694774935 -0.3576954955 -1.0644799805 0.158412506 +-0.3576954955 -1.0644799805 0.158412506 -0.372600006 -1.052880005 0.1721589965 +1.5621800535 -0.053380001 -0.0332249985 1.5617249755 -0.0672125015 -0.032788101 +1.5617249755 -0.0672125015 -0.032788101 1.7184849855 -0.0395476 -0.075139 +1.7184849855 -0.0395476 -0.075139 1.5621800535 -0.053380001 -0.0332249985 +-0.350479492 0.7405300295 0.080237999 -0.401796509 0.5401799925 0.0479222985 +-0.401796509 0.5401799925 0.0479222985 -0.258470001 0.7406400145 0.082165497 +-0.258470001 0.7406400145 0.082165497 -0.350479492 0.7405300295 0.080237999 +1.5546450195 0.056107498 -0.042392502 0.598159973 0.0870339965 -0.0235440005 +0.598159973 0.0870339965 -0.0235440005 1.5562750245 0.065867996 -0.085538498 +1.5562750245 0.065867996 -0.085538498 1.5546450195 0.056107498 -0.042392502 +0.598159973 0.0870339965 -0.0235440005 0.5980599975 0.099528 -0.081314499 +0.5980599975 0.099528 -0.081314499 1.5562750245 0.065867996 -0.085538498 +1.5562750245 0.065867996 -0.085538498 0.598159973 0.0870339965 -0.0235440005 +-0.309901001 0.5400700075 0.0499586985 -0.401796509 0.5401799925 0.0479222985 +-0.401796509 0.5401799925 0.0479222985 -0.258470001 0.7406400145 0.082165497 +-0.258470001 0.7406400145 0.082165497 -0.309901001 0.5400700075 0.0499586985 +-0.167061493 0.951914978 0.1181100005 -0.258470001 0.7406400145 0.082165497 +-0.258470001 0.7406400145 0.082165497 -0.166348999 0.7406400145 0.084095001 +-0.166348999 0.7406400145 0.084095001 -0.167061493 0.951914978 0.1181100005 +0.5980599975 0.099528 -0.081314499 0.245074997 0.0905479965 -0.0232690505 +0.245074997 0.0905479965 -0.0232690505 0.598159973 0.0870339965 -0.0235440005 +0.598159973 0.0870339965 -0.0235440005 0.5980599975 0.099528 -0.081314499 +-0.1530700075 -0.96363501 0.142615494 -0.2441734925 -0.7528049925 0.102772003 +-0.2441734925 -0.7528049925 0.102772003 -0.152276001 -0.7526950075 0.1046969985 +-0.152276001 -0.7526950075 0.1046969985 -0.1530700075 -0.96363501 0.142615494 +-0.258470001 0.7406400145 0.082165497 -0.350479492 0.7405300295 0.080237999 +-0.350479492 0.7405300295 0.080237999 -0.167061493 0.951914978 0.1181100005 +-0.167061493 0.951914978 0.1181100005 -0.258470001 0.7406400145 0.082165497 +-0.29564151 -0.5525700075 0.0669940035 -0.387316498 -0.5525700075 0.0650735015 +-0.387316498 -0.5525700075 0.0650735015 -0.2441734925 -0.7528049925 0.102772003 +-0.2441734925 -0.7528049925 0.102772003 -0.29564151 -0.5525700075 0.0669940035 +-0.3359599915 -0.752914978 0.1008495025 -0.387316498 -0.5525700075 0.0650735015 +-0.387316498 -0.5525700075 0.0650735015 -0.2441734925 -0.7528049925 0.102772003 +-0.2441734925 -0.7528049925 0.102772003 -0.3359599915 -0.752914978 0.1008495025 +-0.318848999 0.951914978 0.114930496 -0.350479492 0.7405300295 0.080237999 +-0.350479492 0.7405300295 0.080237999 -0.167061493 0.951914978 0.1181100005 +-0.167061493 0.951914978 0.1181100005 -0.318848999 0.951914978 0.114930496 +-0.2441734925 -0.7528049925 0.102772003 -0.3359599915 -0.752914978 0.1008495025 +-0.3359599915 -0.752914978 0.1008495025 -0.1530700075 -0.96363501 0.142615494 +-0.1530700075 -0.96363501 0.142615494 -0.2441734925 -0.7528049925 0.102772003 +-0.304411499 -0.9635250245 0.1394450075 -0.3359599915 -0.752914978 0.1008495025 +-0.3359599915 -0.752914978 0.1008495025 -0.1530700075 -0.96363501 0.142615494 +-0.1530700075 -0.96363501 0.142615494 -0.304411499 -0.9635250245 0.1394450075 +-0.8184849855 0.2335285035 -0.2950859985 -0.8187800295 0.220142502 -0.318411499 +-0.8187800295 0.220142502 -0.318411499 -0.7052800295 0.240779495 -0.2982940065 +-0.7052800295 0.240779495 -0.2982940065 -0.8184849855 0.2335285035 -0.2950859985 +-0.819 0.195712494 -0.3292390135 -0.7057750245 0.196382004 -0.3386944885 +-0.7057750245 0.196382004 -0.3386944885 -0.705380005 0.2250505065 -0.325520508 +-0.705380005 0.2250505065 -0.325520508 -0.819 0.195712494 -0.3292390135 +-0.8187800295 0.220142502 -0.318411499 -0.819 0.195712494 -0.3292390135 +-0.819 0.195712494 -0.3292390135 -0.705380005 0.2250505065 -0.325520508 +-0.705380005 0.2250505065 -0.325520508 -0.8187800295 0.220142502 -0.318411499 +-0.817375 -0.2276224975 -0.2415065 -0.81776001 -0.246921005 -0.2604830015 +-0.81776001 -0.246921005 -0.2604830015 -0.7042349855 -0.230746002 -0.2363475035 +-0.7042349855 -0.230746002 -0.2363475035 -0.817375 -0.2276224975 -0.2415065 +-0.812039978 -0.1883565065 0.127026497 -0.812255005 -0.212675003 0.1157529985 +-0.812255005 -0.212675003 0.1157529985 -0.698755005 -0.182556 0.119804001 +-0.698755005 -0.182556 0.119804001 -0.812039978 -0.1883565065 0.127026497 +-0.812255005 -0.212675003 0.1157529985 -0.6991450195 -0.211671005 0.1066299975 +-0.6991450195 -0.211671005 0.1066299975 -0.698755005 -0.182556 0.119804001 +-0.698755005 -0.182556 0.119804001 -0.812255005 -0.212675003 0.1157529985 +-0.81776001 -0.246921005 -0.2604830015 -0.704549988 -0.2535025025 -0.258557495 +-0.704549988 -0.2535025025 -0.258557495 -0.7042349855 -0.230746002 -0.2363475035 +-0.7042349855 -0.230746002 -0.2363475035 -0.81776001 -0.246921005 -0.2604830015 +-0.6981849975 -0.2533910065 0.193901993 -0.8108099975 -0.223941498 0.201361496 +-0.8108099975 -0.223941498 0.201361496 -0.6979050295 -0.224610504 0.207185501 +-0.6979050295 -0.224610504 0.207185501 -0.6981849975 -0.2533910065 0.193901993 +-0.8108099975 -0.223941498 0.201361496 -0.8110250245 -0.248259506 0.1904225005 +-0.8110250245 -0.248259506 0.1904225005 -0.6981849975 -0.2533910065 0.193901993 +-0.6981849975 -0.2533910065 0.193901993 -0.8108099975 -0.223941498 0.201361496 +-0.817375 -0.2276224975 -0.2415065 -0.8174699705 -0.200515503 -0.237157501 +-0.8174699705 -0.200515503 -0.237157501 -0.7043449705 -0.1995119935 -0.231216995 +-0.7043449705 -0.1995119935 -0.231216995 -0.817375 -0.2276224975 -0.2415065 +-0.8110250245 -0.248259506 0.1904225005 -0.6981849975 -0.2533910065 0.193901993 +-0.6981849975 -0.2533910065 0.193901993 -0.698174988 -0.2690085145 0.1666775055 +-0.698174988 -0.2690085145 0.1666775055 -0.8110250245 -0.248259506 0.1904225005 +-0.6980949705 0.177083496 0.194908005 -0.8112349855 0.180653 0.1897485045 +-0.8112349855 0.180653 0.1897485045 -0.697755005 0.2086524965 0.1999360045 +-0.697755005 0.2086524965 0.1999360045 -0.6980949705 0.177083496 0.194908005 +-0.091324997 -0.00307031 0.1352055055 -0.0682389985 -0.0427826995 0.1356889955 +-0.0682389985 -0.0427826995 0.1356889955 -0.052630501 -0.01679125 0.162906006 +-0.052630501 -0.01679125 0.162906006 -0.091324997 -0.00307031 0.1352055055 +-0.7043449705 -0.1995119935 -0.231216995 -0.817375 -0.2276224975 -0.2415065 +-0.817375 -0.2276224975 -0.2415065 -0.7042349855 -0.230746002 -0.2363475035 +-0.7042349855 -0.230746002 -0.2363475035 -0.7043449705 -0.1995119935 -0.231216995 +-0.7046950075 0.1388215025 -0.2783095095 -0.817875 0.159904495 -0.2551295015 +-0.817875 0.159904495 -0.2551295015 -0.7045949705 0.1542155 -0.2510829925 +-0.7045949705 0.1542155 -0.2510829925 -0.7046950075 0.1388215025 -0.2783095095 +-0.091324997 -0.00307031 0.1352055055 -0.0611064985 -0.00273584 0.1627285005 +-0.0611064985 -0.00273584 0.1627285005 -0.052630501 -0.01679125 0.162906006 +-0.052630501 -0.01679125 0.162906006 -0.091324997 -0.00307031 0.1352055055 +-0.705380005 0.2250505065 -0.325520508 -0.8187800295 0.220142502 -0.318411499 +-0.8187800295 0.220142502 -0.318411499 -0.7052800295 0.240779495 -0.2982940065 +-0.7052800295 0.240779495 -0.2982940065 -0.705380005 0.2250505065 -0.325520508 +-0.81851001 -0.168723999 -0.2992149965 -0.818674988 -0.187910507 -0.318075012 +-0.818674988 -0.187910507 -0.318075012 -0.7056950075 -0.1840065 -0.3264194945 +-0.7056950075 -0.1840065 -0.3264194945 -0.81851001 -0.168723999 -0.2992149965 +-0.7045949705 0.1542155 -0.2510829925 -0.8177750245 0.184557495 -0.2438580015 +-0.8177750245 0.184557495 -0.2438580015 -0.7043099975 0.183107498 -0.238022995 +-0.7043099975 0.183107498 -0.238022995 -0.7045949705 0.1542155 -0.2510829925 +-0.8125300295 0.220588501 0.113069 -0.812669983 0.193816498 0.1089380035 +-0.812669983 0.193816498 0.1089380035 -0.6994450075 0.1919194945 0.0995944975 +-0.6994450075 0.1919194945 0.0995944975 -0.8125300295 0.220588501 0.113069 +-0.818674988 -0.187910507 -0.318075012 -0.7056950075 -0.1840065 -0.3264194945 +-0.7056950075 -0.1840065 -0.3264194945 -0.7055949705 -0.2155755005 -0.3313265075 +-0.7055949705 -0.2155755005 -0.3313265075 -0.818674988 -0.187910507 -0.318075012 +-0.81186499 -0.174970505 0.1505724945 -0.812039978 -0.1883565065 0.127026497 +-0.812039978 -0.1883565065 0.127026497 -0.6983200075 -0.1671620025 0.147037506 +-0.6983200075 -0.1671620025 0.147037506 -0.81186499 -0.174970505 0.1505724945 +-0.6992199705 0.2239349975 0.1047320025 -0.812034973 0.2401100005 0.1320475005 +-0.812034973 0.2401100005 0.1320475005 -0.6989050295 0.246580002 0.126941498 +-0.6989050295 0.246580002 0.126941498 -0.6992199705 0.2239349975 0.1047320025 +-0.812034973 0.2401100005 0.1320475005 -0.8125300295 0.220588501 0.113069 +-0.8125300295 0.220588501 0.113069 -0.6992199705 0.2239349975 0.1047320025 +-0.6992199705 0.2239349975 0.1047320025 -0.812034973 0.2401100005 0.1320475005 +-0.8112349855 0.180653 0.1897485045 -0.81151001 0.161578003 0.1708869935 +-0.81151001 0.161578003 0.1708869935 -0.6980949705 0.177083496 0.194908005 +-0.6980949705 0.177083496 0.194908005 -0.8112349855 0.180653 0.1897485045 +-0.6994450075 0.1919194945 0.0995944975 -0.8125300295 0.220588501 0.113069 +-0.8125300295 0.220588501 0.113069 -0.6992199705 0.2239349975 0.1047320025 +-0.6992199705 0.2239349975 0.1047320025 -0.6994450075 0.1919194945 0.0995944975 +-0.7056950075 -0.1840065 -0.3264194945 -0.81851001 -0.168723999 -0.2992149965 +-0.81851001 -0.168723999 -0.2992149965 -0.70548999 -0.1612494965 -0.304211487 +-0.70548999 -0.1612494965 -0.304211487 -0.7056950075 -0.1840065 -0.3264194945 +-0.818674988 -0.187910507 -0.318075012 -0.8186950075 -0.214906006 -0.322427002 +-0.8186950075 -0.214906006 -0.322427002 -0.7055949705 -0.2155755005 -0.3313265075 +-0.7055949705 -0.2155755005 -0.3313265075 -0.818674988 -0.187910507 -0.318075012 +-0.817875 0.159904495 -0.2551295015 -0.818164978 0.146741501 -0.2784549865 +-0.818164978 0.146741501 -0.2784549865 -0.7046950075 0.1388215025 -0.2783095095 +-0.7046950075 0.1388215025 -0.2783095095 -0.817875 0.159904495 -0.2551295015 +-0.698755005 -0.182556 0.119804001 -0.812039978 -0.1883565065 0.127026497 +-0.812039978 -0.1883565065 0.127026497 -0.6983200075 -0.1671620025 0.147037506 +-0.6983200075 -0.1671620025 0.147037506 -0.698755005 -0.182556 0.119804001 +-0.698409973 0.1542155 0.172586502 -0.81151001 0.161578003 0.1708869935 +-0.81151001 0.161578003 0.1708869935 -0.6980949705 0.177083496 0.194908005 +-0.6980949705 0.177083496 0.194908005 -0.698409973 0.1542155 0.172586502 +-0.8177750245 0.184557495 -0.2438580015 -0.817875 0.159904495 -0.2551295015 +-0.817875 0.159904495 -0.2551295015 -0.7045949705 0.1542155 -0.2510829925 +-0.7045949705 0.1542155 -0.2510829925 -0.8177750245 0.184557495 -0.2438580015 +-0.810994995 0.2078715055 0.194216995 -0.8112349855 0.180653 0.1897485045 +-0.8112349855 0.180653 0.1897485045 -0.697755005 0.2086524965 0.1999360045 +-0.697755005 0.2086524965 0.1999360045 -0.810994995 0.2078715055 0.194216995 +-0.8110250245 -0.248259506 0.1904225005 -0.8113200075 -0.261423004 0.167097 +-0.8113200075 -0.261423004 0.167097 -0.698174988 -0.2690085145 0.1666775055 +-0.698174988 -0.2690085145 0.1666775055 -0.8110250245 -0.248259506 0.1904225005 +-0.3990870055 -0.1388285065 -0.262535492 -0.398001007 -0.130238495 -0.2078405 +-0.398001007 -0.130238495 -0.2078405 -0.081001503 -0.136151001 -0.213808502 +-0.081001503 -0.136151001 -0.213808502 -0.3990870055 -0.1388285065 -0.262535492 +0.2444179995 -0.0770289995 0.00678675 0.5877650145 -0.0758014985 0.074564499 +0.5877650145 -0.0758014985 0.074564499 0.5991900025 -0.096885002 0.003283375 +0.5991900025 -0.096885002 0.003283375 0.2444179995 -0.0770289995 0.00678675 +0.56198999 -1.0384849855 -0.2874804995 0.547919983 -1.037704956 -0.297593506 +0.547919983 -1.037704956 -0.297593506 0.5626400145 -1.032464966 -0.286574005 +0.5626400145 -1.032464966 -0.286574005 0.56198999 -1.0384849855 -0.2874804995 +0.248376999 -0.0656504975 0.1267005005 0.5573150025 -0.075467003 0.074149498 +0.5573150025 -0.075467003 0.074149498 0.5877650145 -0.0758014985 0.074564499 +0.5877650145 -0.0758014985 0.074564499 0.248376999 -0.0656504975 0.1267005005 +0.2444179995 -0.0770289995 0.00678675 0.2443829955 -0.096885002 0.00845965 +0.2443829955 -0.096885002 0.00845965 0.5991900025 -0.096885002 0.003283375 +0.5991900025 -0.096885002 0.003283375 0.2444179995 -0.0770289995 0.00678675 +1.561875 0.0447851485 -0.0345699995 1.5616049805 0.0559399985 -0.0323445015 +1.5616049805 0.0559399985 -0.0323445015 1.56651001 0.0687679975 -0.0907070005 +1.56651001 0.0687679975 -0.0907070005 1.561875 0.0447851485 -0.0345699995 +0.248376999 -0.0656504975 0.1267005005 0.2443274995 -0.0801524965 0.0057804 +0.2443274995 -0.0801524965 0.0057804 0.260915985 -0.067100998 0.1140214995 +0.260915985 -0.067100998 0.1140214995 0.248376999 -0.0656504975 0.1267005005 +0.097556999 -0.1345890045 0.0560390015 0.095731003 -0.1586840055 -0.069856003 +0.095731003 -0.1586840055 -0.069856003 0.243067505 -0.115179497 -0.0725719985 +0.243067505 -0.115179497 -0.0725719985 0.097556999 -0.1345890045 0.0560390015 +-0.3990870055 -0.1388285065 -0.262535492 -0.0819830015 -0.1444055025 -0.268166504 +-0.0819830015 -0.1444055025 -0.268166504 -0.081001503 -0.136151001 -0.213808502 +-0.081001503 -0.136151001 -0.213808502 -0.3990870055 -0.1388285065 -0.262535492 +0.2443829955 -0.096885002 0.00845965 0.243067505 -0.115179497 -0.0725719985 +0.243067505 -0.115179497 -0.0725719985 0.5981099855 -0.0973310015 -0.0783010025 +0.5981099855 -0.0973310015 -0.0783010025 0.2443829955 -0.096885002 0.00845965 +0.0970875015 0.1206384965 -0.150608505 0.095617996 0.1413869935 -0.075102501 +0.095617996 0.1413869935 -0.075102501 0.2432630005 0.1117145005 -0.076584503 +0.2432630005 0.1117145005 -0.076584503 0.0970875015 0.1206384965 -0.150608505 +0.2424004975 -0.0841679995 -0.109963501 0.5970150145 -0.072901001 -0.143260498 +0.5970150145 -0.072901001 -0.143260498 0.597034973 -0.0122177495 -0.149508499 +0.597034973 -0.0122177495 -0.149508499 0.2424004975 -0.0841679995 -0.109963501 +-0.393834015 0.123316002 0.067279999 -0.3933034975 0.1317940065 0.121850502 +-0.3933034975 0.1317940065 0.121850502 -0.0771045 0.1293399965 0.0635385015 +-0.0771045 0.1293399965 0.0635385015 -0.393834015 0.123316002 0.067279999 +-0.0130736 -0.324449005 0.1014765015 -0.0131036995 -0.1507640075 0.0603045005 +-0.0131036995 -0.1507640075 0.0603045005 -0.0124824495 -0.32623349 0.094570999 +-0.0124824495 -0.32623349 0.094570999 -0.0130736 -0.324449005 0.1014765015 +-0.0771045 0.1293399965 0.0635385015 -0.3933034975 0.1317940065 0.121850502 +-0.3933034975 0.1317940065 0.121850502 -0.0761255035 0.137929001 0.1180065 +-0.0761255035 0.137929001 0.1180065 -0.0771045 0.1293399965 0.0635385015 +-0.0131036995 -0.1507640075 0.0603045005 -0.0138086995 -0.1494255065 0.067319 +-0.0138086995 -0.1494255065 0.067319 -0.0130736 -0.324449005 0.1014765015 +-0.0130736 -0.324449005 0.1014765015 -0.0131036995 -0.1507640075 0.0603045005 +0.547325012 1.019965027 -0.3331984865 0.5471849975 1.013044983 -0.3318630065 +0.5471849975 1.013044983 -0.3318630065 0.607039978 1.0150549925 -0.3394234925 +0.607039978 1.0150549925 -0.3394234925 0.547325012 1.019965027 -0.3331984865 +0.2443274995 -0.0801524965 0.0057804 0.2316795045 -0.0788134995 0.0183468 +0.2316795045 -0.0788134995 0.0183468 0.248376999 -0.0656504975 0.1267005005 +0.248376999 -0.0656504975 0.1267005005 0.2443274995 -0.0801524965 0.0057804 +0.548119995 -1.030454956 -0.296473999 0.547919983 -1.037704956 -0.297593506 +0.547919983 -1.037704956 -0.297593506 0.5626400145 -1.032464966 -0.286574005 +0.5626400145 -1.032464966 -0.286574005 0.548119995 -1.030454956 -0.296473999 +-0.3933034975 0.1317940065 0.121850502 -0.393755493 0.299566498 0.095510002 +-0.393755493 0.299566498 0.095510002 -0.0771045 0.1293399965 0.0635385015 +-0.0771045 0.1293399965 0.0635385015 -0.3933034975 0.1317940065 0.121850502 +-0.704914978 -0.1561185 -0.273181488 -0.70548999 -0.1612494965 -0.304211487 +-0.70548999 -0.1612494965 -0.304211487 -0.420441498 -0.1610265045 -0.3083940125 +-0.420441498 -0.1610265045 -0.3083940125 -0.704914978 -0.1561185 -0.273181488 +-0.0762770005 -0.150429001 0.0613240015 -0.0768724975 -0.1494255065 0.0684524995 +-0.0768724975 -0.1494255065 0.0684524995 -0.0138086995 -0.1494255065 0.067319 +-0.0138086995 -0.1494255065 0.067319 -0.0762770005 -0.150429001 0.0613240015 +-0.0221133995 0.036418701 0.133531006 -0.036099098 0.0115427 0.162024994 +-0.036099098 0.0115427 0.162024994 0.000972655 -0.00273584 0.134014496 +0.000972655 -0.00273584 0.134014496 -0.0221133995 0.036418701 0.133531006 +-0.028180849 -0.00273584 0.1621909945 -0.036099098 0.0115427 0.162024994 +-0.036099098 0.0115427 0.162024994 0.000972655 -0.00273584 0.134014496 +0.000972655 -0.00273584 0.134014496 -0.028180849 -0.00273584 0.1621909945 +-0.477980011 0.135363495 -0.123602997 -0.4791119995 0.1200810015 -0.202733505 +-0.4791119995 0.1200810015 -0.202733505 -0.080088997 0.135586502 -0.129550003 +-0.080088997 0.135586502 -0.129550003 -0.477980011 0.135363495 -0.123602997 +-0.0313547495 -0.053491501 0.1219570005 -0.0608115005 -0.0426708985 0.1220094985 +-0.0608115005 -0.0426708985 0.1220094985 -0.0312316 -0.0427826995 0.121401497 +-0.0312316 -0.0427826995 0.121401497 -0.0313547495 -0.053491501 0.1219570005 +-0.0608115005 -0.0426708985 0.1220094985 -0.060813999 -0.053380001 0.122121002 +-0.060813999 -0.053380001 0.122121002 -0.0313547495 -0.053491501 0.1219570005 +-0.0313547495 -0.053491501 0.1219570005 -0.0608115005 -0.0426708985 0.1220094985 +0.5877650145 -0.0758014985 0.074564499 1.5617249755 -0.0672125015 -0.032788101 +1.5617249755 -0.0672125015 -0.032788101 1.5621800535 -0.053380001 -0.0332249985 +1.5621800535 -0.053380001 -0.0332249985 0.5877650145 -0.0758014985 0.074564499 +-0.078477501 -0.1633690035 -0.020060499 -0.47505249 -0.3240029905 0.098828499 +-0.47505249 -0.3240029905 0.098828499 -0.0771200025 -0.147751999 0.058963501 +-0.0771200025 -0.147751999 0.058963501 -0.078477501 -0.1633690035 -0.020060499 +-0.078477501 -0.1633690035 -0.020060499 -0.475229492 -0.1483099975 0.0646825025 +-0.475229492 -0.1483099975 0.0646825025 -0.0771200025 -0.147751999 0.058963501 +-0.0771200025 -0.147751999 0.058963501 -0.078477501 -0.1633690035 -0.020060499 +-0.47505249 -0.3240029905 0.098828499 -0.475229492 -0.1483099975 0.0646825025 +-0.475229492 -0.1483099975 0.0646825025 -0.078477501 -0.1633690035 -0.020060499 +-0.078477501 -0.1633690035 -0.020060499 -0.47505249 -0.3240029905 0.098828499 +1.5616049805 0.0559399985 -0.0323445015 1.560925049 0.0643065035 -0.090489502 +1.560925049 0.0643065035 -0.090489502 1.561875 0.0447851485 -0.0345699995 +1.561875 0.0447851485 -0.0345699995 1.5616049805 0.0559399985 -0.0323445015 +-0.0799229965 -0.3050390015 -0.1800905 -0.0807854995 -0.3138515015 -0.234779999 +-0.0807854995 -0.3138515015 -0.234779999 -0.0172801 -0.3136285095 -0.2356815035 +-0.0172801 -0.3136285095 -0.2356815035 -0.0799229965 -0.3050390015 -0.1800905 +-0.031714199 -0.053715 0.0965110015 -0.0612874985 -0.0432287485 0.0967839965 +-0.0612874985 -0.0432287485 0.0967839965 -0.0314913005 -0.0430058515 0.096515999 +-0.0314913005 -0.0430058515 0.096515999 -0.031714199 -0.053715 0.0965110015 +-0.704549988 -0.2535025025 -0.258557495 -0.70513501 -0.258745514 -0.289364502 +-0.70513501 -0.258745514 -0.289364502 -0.420192505 -0.2585224915 -0.2936610105 +-0.420192505 -0.2585224915 -0.2936610105 -0.704549988 -0.2535025025 -0.258557495 +-0.080376503 1.0385949705 0.171808502 -0.0809820025 1.058334961 0.1474725035 +-0.0809820025 1.058334961 0.1474725035 -0.0770179975 1.0336850585 0.144654495 +-0.0770179975 1.0336850585 0.144654495 -0.080376503 1.0385949705 0.171808502 +-0.2207765045 -0.03890625 0.095060997 -0.277825012 -0.0219785005 0.1059714965 +-0.277825012 -0.0219785005 0.1059714965 -0.2207485045 0.040992199 0.0950619965 +-0.2207485045 0.040992199 0.0950619965 -0.2207765045 -0.03890625 0.095060997 +-0.420441498 -0.1610265045 -0.3083940125 -0.704914978 -0.1561185 -0.273181488 +-0.704914978 -0.1561185 -0.273181488 -0.4203150025 -0.1561185 -0.2771505125 +-0.4203150025 -0.1561185 -0.2771505125 -0.420441498 -0.1610265045 -0.3083940125 +-0.5867249755 -0.1349234925 0.066251999 -0.5887700195 -0.159800003 -0.0598709985 +-0.5887700195 -0.159800003 -0.0598709985 -0.2079640045 -0.1587955015 -0.065171501 +-0.2079640045 -0.1587955015 -0.065171501 -0.5867249755 -0.1349234925 0.066251999 +-0.0612874985 -0.0432287485 0.0967839965 -0.061292 -0.053491501 0.097007004 +-0.061292 -0.053491501 0.097007004 -0.031714199 -0.053715 0.0965110015 +-0.031714199 -0.053715 0.0965110015 -0.0612874985 -0.0432287485 0.0967839965 +-0.031656349 0.0357492485 0.1203884965 -0.0613320005 0.0461232985 0.1202129975 +-0.0613320005 0.0461232985 0.1202129975 -0.0316446495 0.0460119515 0.1198310015 +-0.0316446495 0.0460119515 0.1198310015 -0.031656349 0.0357492485 0.1203884965 +-0.0613320005 0.0461232985 0.1202129975 -0.0613364985 0.0357492485 0.1204365005 +-0.0613364985 0.0357492485 0.1204365005 -0.031656349 0.0357492485 0.1203884965 +-0.031656349 0.0357492485 0.1203884965 -0.0613320005 0.0461232985 0.1202129975 +-0.061703499 0.0456775015 0.095324997 -0.0320233 0.035526348 0.0952770005 +-0.0320233 0.035526348 0.0952770005 -0.032014 0.045565899 0.094831497 +-0.032014 0.045565899 0.094831497 -0.061703499 0.0456775015 0.095324997 +-0.3813055115 1.0620200195 -0.285816986 -0.3814909975 1.058785034 -0.303561493 +-0.3814909975 1.058785034 -0.303561493 -0.1032819975 1.0623549805 -0.2900350035 +-0.1032819975 1.0623549805 -0.2900350035 -0.3813055115 1.0620200195 -0.285816986 +-0.103468498 1.0588950195 -0.3077795105 -0.3814909975 1.058785034 -0.303561493 +-0.3814909975 1.058785034 -0.303561493 -0.1032819975 1.0623549805 -0.2900350035 +-0.1032819975 1.0623549805 -0.2900350035 -0.103468498 1.0588950195 -0.3077795105 +-0.061594002 0.035079849 0.095439003 -0.061703499 0.0456775015 0.095324997 +-0.061703499 0.0456775015 0.095324997 -0.0320233 0.035526348 0.0952770005 +-0.0320233 0.035526348 0.0952770005 -0.061594002 0.035079849 0.095439003 +-0.420192505 -0.2585224915 -0.2936610105 -0.704549988 -0.2535025025 -0.258557495 +-0.704549988 -0.2535025025 -0.258557495 -0.4197265015 -0.2535025025 -0.2626329955 +-0.4197265015 -0.2535025025 -0.2626329955 -0.420192505 -0.2585224915 -0.2936610105 +-0.0130736 -0.324449005 0.1014765015 -0.075651001 -0.32623349 0.095367996 +-0.075651001 -0.32623349 0.095367996 -0.0124824495 -0.32623349 0.094570999 +-0.0124824495 -0.32623349 0.094570999 -0.0130736 -0.324449005 0.1014765015 +-0.014045 0.1300090025 0.0626274985 -0.0761255035 0.137929001 0.1180065 +-0.0761255035 0.137929001 0.1180065 -0.0130681495 0.138375 0.1172074965 +-0.0130681495 0.138375 0.1172074965 -0.014045 0.1300090025 0.0626274985 +1.5621800535 -0.053380001 -0.0332249985 1.5617249755 -0.0672125015 -0.032788101 +1.5617249755 -0.0672125015 -0.032788101 1.567420044 -0.072344002 -0.0328918495 +1.567420044 -0.072344002 -0.0328918495 1.5621800535 -0.053380001 -0.0332249985 +-0.0802819975 0.1226464995 -0.210892502 -0.0811360015 0.1214195025 -0.2180514985 +-0.0811360015 0.1214195025 -0.2180514985 -0.0180767995 0.1216429975 -0.2189620055 +-0.0180767995 0.1216429975 -0.2189620055 -0.0802819975 0.1226464995 -0.210892502 +-0.277796997 0.0240641995 0.105972 -0.277825012 -0.0219785005 0.1059714965 +-0.277825012 -0.0219785005 0.1059714965 -0.2207485045 0.040992199 0.0950619965 +-0.2207485045 0.040992199 0.0950619965 -0.277796997 0.0240641995 0.105972 +-0.47505249 -0.3240029905 0.098828499 -0.476186493 -0.3391734925 0.0198092005 +-0.476186493 -0.3391734925 0.0198092005 -0.078477501 -0.1633690035 -0.020060499 +-0.078477501 -0.1633690035 -0.020060499 -0.47505249 -0.3240029905 0.098828499 +-0.698659973 0.251600006 0.157964493 -0.6989050295 0.246580002 0.126941498 +-0.6989050295 0.246580002 0.126941498 -0.4137214965 0.2514880065 0.153779999 +-0.4137214965 0.2514880065 0.153779999 -0.698659973 0.251600006 0.157964493 +-0.0819830015 -0.1444055025 -0.268166504 -0.018921301 -0.1445169985 -0.2691889955 +-0.018921301 -0.1445169985 -0.2691889955 -0.0181679 -0.136151001 -0.214612503 +-0.0181679 -0.136151001 -0.214612503 -0.0819830015 -0.1444055025 -0.268166504 +-0.475229492 -0.1483099975 0.0646825025 -0.476254486 -0.163703995 -0.0142228005 +-0.476254486 -0.163703995 -0.0142228005 -0.078477501 -0.1633690035 -0.020060499 +-0.078477501 -0.1633690035 -0.020060499 -0.475229492 -0.1483099975 0.0646825025 +-0.6989050295 0.246580002 0.126941498 -0.4140755005 0.2463569945 0.1227545015 +-0.4140755005 0.2463569945 0.1227545015 -0.4137214965 0.2514880065 0.153779999 +-0.4137214965 0.2514880065 0.153779999 -0.6989050295 0.246580002 0.126941498 +-0.075651001 -0.32623349 0.095367996 -0.0762490005 -0.3247839965 0.102607498 +-0.0762490005 -0.3247839965 0.102607498 -0.0130736 -0.324449005 0.1014765015 +-0.0130736 -0.324449005 0.1014765015 -0.075651001 -0.32623349 0.095367996 +-0.0138086995 -0.1494255065 0.067319 -0.0762770005 -0.150429001 0.0613240015 +-0.0762770005 -0.150429001 0.0613240015 -0.0131036995 -0.1507640075 0.0603045005 +-0.0131036995 -0.1507640075 0.0603045005 -0.0138086995 -0.1494255065 0.067319 +-0.698409973 0.1542155 0.172586502 -0.698539978 0.1489725035 0.141565506 +-0.698539978 0.1489725035 0.141565506 -0.413467499 0.154326996 0.168290497 +-0.413467499 0.154326996 0.168290497 -0.698409973 0.1542155 0.172586502 +-0.4135985105 0.1494190065 0.1372695005 -0.698539978 0.1489725035 0.141565506 +-0.698539978 0.1489725035 0.141565506 -0.413467499 0.154326996 0.168290497 +-0.413467499 0.154326996 0.168290497 -0.4135985105 0.1494190065 0.1372695005 +-0.076619499 0.298450989 0.029740999 -0.01356005 0.298339508 0.02883025 +-0.01356005 0.298339508 0.02883025 -0.0125814 0.307152008 0.0832994995 +-0.0125814 0.307152008 0.0832994995 -0.076619499 0.298450989 0.029740999 +-0.075977501 0.307152008 0.084314499 -0.076619499 0.298450989 0.029740999 +-0.076619499 0.298450989 0.029740999 -0.0125814 0.307152008 0.0832994995 +-0.0125814 0.307152008 0.0832994995 -0.075977501 0.307152008 0.084314499 +-0.081001503 -0.136151001 -0.213808502 -0.0819830015 -0.1444055025 -0.268166504 +-0.0819830015 -0.1444055025 -0.268166504 -0.0181679 -0.136151001 -0.214612503 +-0.0181679 -0.136151001 -0.214612503 -0.081001503 -0.136151001 -0.213808502 +-0.0761255035 0.137929001 0.1180065 -0.0771045 0.1293399965 0.0635385015 +-0.0771045 0.1293399965 0.0635385015 -0.014045 0.1300090025 0.0626274985 +-0.014045 0.1300090025 0.0626274985 -0.0761255035 0.137929001 0.1180065 +-0.5664749755 0.320872986 -0.138845505 -0.566875 0.317303009 -0.1569295045 +-0.566875 0.317303009 -0.1569295045 -0.1014725035 0.317303009 -0.1633589935 +-0.1014725035 0.317303009 -0.1633589935 -0.5664749755 0.320872986 -0.138845505 +-0.207515503 0.1411640015 -0.0706295015 -0.2095735015 0.122199997 -0.196083496 +-0.2095735015 0.122199997 -0.196083496 0.095617996 0.1413869935 -0.075102501 +0.095617996 0.1413869935 -0.075102501 -0.207515503 0.1411640015 -0.0706295015 +-0.615919983 0.119746002 -0.0633409995 -0.617460022 0.1037945025 -0.170932007 +-0.617460022 0.1037945025 -0.170932007 -0.5906049805 0.1224235 -0.190675995 +-0.5906049805 0.1224235 -0.190675995 -0.615919983 0.119746002 -0.0633409995 +0.095731003 -0.1586840055 -0.069856003 -0.2058014985 -0.1342545015 0.0606189995 +-0.2058014985 -0.1342545015 0.0606189995 0.097556999 -0.1345890045 0.0560390015 +0.097556999 -0.1345890045 0.0560390015 0.095731003 -0.1586840055 -0.069856003 +-0.5906049805 0.1224235 -0.190675995 -0.615919983 0.119746002 -0.0633409995 +-0.615919983 0.119746002 -0.0633409995 -0.58888501 0.1410525055 -0.0650059965 +-0.58888501 0.1410525055 -0.0650059965 -0.5906049805 0.1224235 -0.190675995 +-0.2058014985 -0.1342545015 0.0606189995 -0.2079640045 -0.1587955015 -0.065171501 +-0.2079640045 -0.1587955015 -0.065171501 0.095731003 -0.1586840055 -0.069856003 +0.095731003 -0.1586840055 -0.069856003 -0.2058014985 -0.1342545015 0.0606189995 +-0.613674988 -0.0655390015 0.0851019975 -0.614039978 -0.1160715025 0.049166649 +-0.614039978 -0.1160715025 0.049166649 -0.586169983 -0.075578499 0.108996498 +-0.586169983 -0.075578499 0.108996498 -0.613674988 -0.0655390015 0.0851019975 +-0.5867249755 -0.1349234925 0.066251999 -0.614039978 -0.1160715025 0.049166649 +-0.614039978 -0.1160715025 0.049166649 -0.586169983 -0.075578499 0.108996498 +-0.586169983 -0.075578499 0.108996498 -0.5867249755 -0.1349234925 0.066251999 +-0.374411499 -1.086790039 0.1627485045 -0.3748160095 -1.090244995 0.144776001 +-0.3748160095 -1.090244995 0.144776001 -0.096685997 -1.09013501 0.1407839965 +-0.096685997 -1.09013501 0.1407839965 -0.374411499 -1.086790039 0.1627485045 +-0.096685997 -1.09013501 0.1407839965 -0.374411499 -1.086790039 0.1627485045 +-0.374411499 -1.086790039 0.1627485045 -0.0962789995 -1.0869000245 0.1586445005 +-0.0962789995 -1.0869000245 0.1586445005 -0.096685997 -1.09013501 0.1407839965 +-0.2095735015 0.122199997 -0.196083496 0.095617996 0.1413869935 -0.075102501 +0.095617996 0.1413869935 -0.075102501 0.0970875015 0.1206384965 -0.150608505 +0.0970875015 0.1206384965 -0.150608505 -0.2095735015 0.122199997 -0.196083496 +-0.0796760025 -1.0230949705 0.202283493 -0.079804001 -1.054324951 0.2084174955 +-0.079804001 -1.054324951 0.2084174955 -0.0764349975 -1.045959961 0.186061493 +-0.0764349975 -1.045959961 0.186061493 -0.0796760025 -1.0230949705 0.202283493 +-0.0172801 -0.3136285095 -0.2356815035 -0.0799229965 -0.3050390015 -0.1800905 +-0.0799229965 -0.3050390015 -0.1800905 -0.0164174995 -0.3048160095 -0.180991501 +-0.0164174995 -0.3048160095 -0.180991501 -0.0172801 -0.3136285095 -0.2356815035 +-0.605380005 -0.00189917 -0.0125483 -0.5899699705 0.0371994515 -0.0105796005 +-0.5899699705 0.0371994515 -0.0105796005 -0.58911499 0.0213313005 -0.051342499 +-0.58911499 0.0213313005 -0.051342499 -0.605380005 -0.00189917 -0.0125483 +-0.589119995 -0.003405275 -0.051175499 -0.605380005 -0.00189917 -0.0125483 +-0.605380005 -0.00189917 -0.0125483 -0.58911499 -0.0245722505 -0.051342499 +-0.58911499 -0.0245722505 -0.051342499 -0.589119995 -0.003405275 -0.051175499 +-0.589119995 -0.003405275 -0.051175499 -0.605380005 -0.00189917 -0.0125483 +-0.605380005 -0.00189917 -0.0125483 -0.58911499 0.0213313005 -0.051342499 +-0.58911499 0.0213313005 -0.051342499 -0.589119995 -0.003405275 -0.051175499 +-0.0180767995 0.1216429975 -0.2189620055 -0.0802819975 0.1226464995 -0.210892502 +-0.0802819975 0.1226464995 -0.210892502 -0.0173365 0.1230930025 -0.211694 +-0.0173365 0.1230930025 -0.211694 -0.0180767995 0.1216429975 -0.2189620055 +0.5877650145 -0.0758014985 0.074564499 0.587590027 0.0694375 0.0723290025 +0.587590027 0.0694375 0.0723290025 1.5621800535 -0.053380001 -0.0332249985 +1.5621800535 -0.053380001 -0.0332249985 0.5877650145 -0.0758014985 0.074564499 +-0.0770179975 1.0336850585 0.144654495 -0.080376503 1.0385949705 0.171808502 +-0.080376503 1.0385949705 0.171808502 -0.0767959975 1.0294449465 0.150014496 +-0.0767959975 1.0294449465 0.150014496 -0.0770179975 1.0336850585 0.144654495 +-0.4129599915 -0.224498993 0.2026660005 -0.413173004 -0.1929299925 0.196859497 +-0.413173004 -0.1929299925 0.196859497 -0.390729492 -0.2194795075 0.1640805055 +-0.390729492 -0.2194795075 0.1640805055 -0.4129599915 -0.224498993 0.2026660005 +0.587590027 0.0694375 0.0723290025 1.561875 0.0447851485 -0.0345699995 +1.561875 0.0447851485 -0.0345699995 1.5621800535 -0.053380001 -0.0332249985 +1.5621800535 -0.053380001 -0.0332249985 0.587590027 0.0694375 0.0723290025 +-0.0811139985 0.1200810015 -0.208455002 -0.4791119995 0.1200810015 -0.202733505 +-0.4791119995 0.1200810015 -0.202733505 -0.080088997 0.135586502 -0.129550003 +-0.080088997 0.135586502 -0.129550003 -0.0811139985 0.1200810015 -0.208455002 +-0.0184746495 0.296889496 -0.253223999 -0.080572998 0.298450989 -0.2449295045 +-0.080572998 0.298450989 -0.2449295045 -0.01728615 0.298339508 -0.246058502 +-0.01728615 0.298339508 -0.246058502 -0.0184746495 0.296889496 -0.253223999 +-0.58888501 0.1410525055 -0.0650059965 -0.5906049805 0.1224235 -0.190675995 +-0.5906049805 0.1224235 -0.190675995 -0.207515503 0.1411640015 -0.0706295015 +-0.207515503 0.1411640015 -0.0706295015 -0.58888501 0.1410525055 -0.0650059965 +-0.4196619875 0.154661499 -0.2550444945 -0.419870514 0.139267502 -0.28238501 +-0.419870514 0.139267502 -0.28238501 -0.3974995115 0.178087494 -0.290396515 +-0.3974995115 0.178087494 -0.290396515 -0.4196619875 0.154661499 -0.2550444945 +-0.2051275025 -0.0751324995 0.1030319975 -0.2055149995 0.0694375 0.100234497 +-0.2055149995 0.0694375 0.100234497 0.0981190035 -0.0753554995 0.098449997 +0.0981190035 -0.0753554995 0.098449997 -0.2051275025 -0.0751324995 0.1030319975 +-0.4195794985 0.2145650025 -0.2483484955 -0.419601013 0.183218994 -0.2419889985 +-0.419601013 0.183218994 -0.2419889985 -0.397023987 0.1883504945 -0.2811254885 +-0.397023987 0.1883504945 -0.2811254885 -0.4195794985 0.2145650025 -0.2483484955 +0.0980565035 0.069661003 0.0961054995 -0.2055149995 0.0694375 0.100234497 +-0.2055149995 0.0694375 0.100234497 0.0981190035 -0.0753554995 0.098449997 +0.0981190035 -0.0753554995 0.098449997 0.0980565035 0.069661003 0.0961054995 +-0.564909973 -0.164261505 -0.0324813005 -0.099725998 -0.163703995 -0.039027199 +-0.099725998 -0.163703995 -0.039027199 -0.0994280015 -0.159911499 -0.0212803495 +-0.0994280015 -0.159911499 -0.0212803495 -0.564909973 -0.164261505 -0.0324813005 +-0.2095735015 0.122199997 -0.196083496 -0.5906049805 0.1224235 -0.190675995 +-0.5906049805 0.1224235 -0.190675995 -0.207515503 0.1411640015 -0.0706295015 +-0.207515503 0.1411640015 -0.0706295015 -0.2095735015 0.122199997 -0.196083496 +-0.5643200075 -0.3491019895 0.00334654 -0.564505005 -0.1605805055 -0.0145093 +-0.564505005 -0.1605805055 -0.0145093 -0.0994280015 -0.159911499 -0.0212803495 +-0.0994280015 -0.159911499 -0.0212803495 -0.5643200075 -0.3491019895 0.00334654 +-0.564505005 -0.1605805055 -0.0145093 -0.564909973 -0.164261505 -0.0324813005 +-0.564909973 -0.164261505 -0.0324813005 -0.0994280015 -0.159911499 -0.0212803495 +-0.0994280015 -0.159911499 -0.0212803495 -0.564505005 -0.1605805055 -0.0145093 +-0.3974995115 0.178087494 -0.290396515 -0.4196619875 0.154661499 -0.2550444945 +-0.4196619875 0.154661499 -0.2550444945 -0.397299988 0.1815455015 -0.2839205015 +-0.397299988 0.1815455015 -0.2839205015 -0.3974995115 0.178087494 -0.290396515 +-0.5658900145 0.135921005 -0.1027945025 -0.5660700075 0.132463501 -0.1209850005 +-0.5660700075 0.132463501 -0.1209850005 -0.100772499 0.132463501 -0.1275285035 +-0.100772499 0.132463501 -0.1275285035 -0.5658900145 0.135921005 -0.1027945025 +-0.5664749755 0.320872986 -0.138845505 -0.101293503 0.320872986 -0.145279999 +-0.101293503 0.320872986 -0.145279999 -0.100772499 0.132463501 -0.1275285035 +-0.100772499 0.132463501 -0.1275285035 -0.5664749755 0.320872986 -0.138845505 +-0.4192974855 -0.1992890015 -0.2351764985 -0.4196700135 -0.1706204985 -0.2493545075 +-0.4196700135 -0.1706204985 -0.2493545075 -0.3972149965 -0.198953995 -0.2773359985 +-0.3972149965 -0.198953995 -0.2773359985 -0.4192974855 -0.1992890015 -0.2351764985 +-0.2079640045 -0.1587955015 -0.065171501 -0.5867249755 -0.1349234925 0.066251999 +-0.5867249755 -0.1349234925 0.066251999 -0.2058014985 -0.1342545015 0.0606189995 +-0.2058014985 -0.1342545015 0.0606189995 -0.2079640045 -0.1587955015 -0.065171501 +-0.080572998 0.298450989 -0.2449295045 -0.0816504975 0.297001007 -0.252092499 +-0.0816504975 0.297001007 -0.252092499 -0.0184746495 0.296889496 -0.253223999 +-0.0184746495 0.296889496 -0.253223999 -0.080572998 0.298450989 -0.2449295045 +-0.5643200075 -0.3491019895 0.00334654 -0.0991324995 -0.3487674865 -0.0034221 +-0.0991324995 -0.3487674865 -0.0034221 -0.0989465025 -0.3453089905 0.0143223 +-0.0989465025 -0.3453089905 0.0143223 -0.5643200075 -0.3491019895 0.00334654 +-0.5640200195 -0.3454205015 0.020870449 -0.5643200075 -0.3491019895 0.00334654 +-0.5643200075 -0.3491019895 0.00334654 -0.0989465025 -0.3453089905 0.0143223 +-0.0989465025 -0.3453089905 0.0143223 -0.5640200195 -0.3454205015 0.020870449 +-0.413251007 -0.253279495 0.189940506 -0.4137894895 -0.2685620115 0.162369995 +-0.4137894895 -0.2685620115 0.162369995 -0.3909744875 -0.2295195005 0.1544795075 +-0.3909744875 -0.2295195005 0.1544795075 -0.413251007 -0.253279495 0.189940506 +-0.0994280015 -0.159911499 -0.0212803495 -0.5643200075 -0.3491019895 0.00334654 +-0.5643200075 -0.3491019895 0.00334654 -0.0991324995 -0.3487674865 -0.0034221 +-0.0991324995 -0.3487674865 -0.0034221 -0.0994280015 -0.159911499 -0.0212803495 +-0.3909744875 -0.2295195005 0.1544795075 -0.413251007 -0.253279495 0.189940506 +-0.413251007 -0.253279495 0.189940506 -0.3906640015 -0.2261725005 0.1609575045 +-0.3906640015 -0.2261725005 0.1609575045 -0.3909744875 -0.2295195005 0.1544795075 +-0.0840490035 1.020075012 -0.3239974975 -0.0873600005 1.036920044 -0.3044295045 +-0.0873600005 1.036920044 -0.3044295045 -0.0839660035 1.013494995 -0.322657013 +-0.0839660035 1.013494995 -0.322657013 -0.0840490035 1.020075012 -0.3239974975 +-0.3973940125 -0.2053125 -0.274104004 -0.4192974855 -0.1992890015 -0.2351764985 +-0.4192974855 -0.1992890015 -0.2351764985 -0.3972149965 -0.198953995 -0.2773359985 +-0.3972149965 -0.198953995 -0.2773359985 -0.3973940125 -0.2053125 -0.274104004 +-0.0840490035 1.020075012 -0.3239974975 -0.0873600005 1.036920044 -0.3044295045 +-0.0873600005 1.036920044 -0.3044295045 -0.083911499 1.0225300295 -0.3305775145 +-0.083911499 1.0225300295 -0.3305775145 -0.0840490035 1.020075012 -0.3239974975 +-0.0865565035 -1.0226450195 -0.262907013 -0.087268997 -1.0023449705 -0.287467987 +-0.087268997 -1.0023449705 -0.287467987 -0.0835930025 -1.026550049 -0.2925234985 +-0.0835930025 -1.026550049 -0.2925234985 -0.0865565035 -1.0226450195 -0.262907013 +-0.3907325135 0.209098999 0.153591995 -0.412921997 0.2087640075 0.195526001 +-0.412921997 0.2087640075 0.195526001 -0.3905799865 0.202182495 0.156942505 +-0.3905799865 0.202182495 0.156942505 -0.3907325135 0.209098999 0.153591995 +-0.3972235105 0.195600998 -0.282245514 -0.4195794985 0.2145650025 -0.2483484955 +-0.4195794985 0.2145650025 -0.2483484955 -0.397023987 0.1883504945 -0.2811254885 +-0.397023987 0.1883504945 -0.2811254885 -0.3972235105 0.195600998 -0.282245514 +-0.5660700075 0.132463501 -0.1209850005 -0.5664749755 0.320872986 -0.138845505 +-0.5664749755 0.320872986 -0.138845505 -0.100772499 0.132463501 -0.1275285035 +-0.100772499 0.132463501 -0.1275285035 -0.5660700075 0.132463501 -0.1209850005 +-0.1014725035 0.317303009 -0.1633589935 -0.5664749755 0.320872986 -0.138845505 +-0.5664749755 0.320872986 -0.138845505 -0.101293503 0.320872986 -0.145279999 +-0.101293503 0.320872986 -0.145279999 -0.1014725035 0.317303009 -0.1633589935 +-0.100772499 0.132463501 -0.1275285035 -0.5658900145 0.135921005 -0.1027945025 +-0.5658900145 0.135921005 -0.1027945025 -0.100697998 0.136032501 -0.109786499 +-0.100697998 0.136032501 -0.109786499 -0.100772499 0.132463501 -0.1275285035 +-0.412921997 0.2087640075 0.195526001 -0.413183014 0.237209503 0.1813504945 +-0.413183014 0.237209503 0.1813504945 -0.3907325135 0.209098999 0.153591995 +-0.3907325135 0.209098999 0.153591995 -0.412921997 0.2087640075 0.195526001 +-0.0835930025 -1.026550049 -0.2925234985 -0.0865565035 -1.0226450195 -0.262907013 +-0.0865565035 -1.0226450195 -0.262907013 -0.0835910035 -1.031125 -0.2872795105 +-0.0835910035 -1.031125 -0.2872795105 -0.0835930025 -1.026550049 -0.2925234985 +-0.8183900145 -0.238889496 -0.310369995 -0.8186950075 -0.214906006 -0.322427002 +-0.8186950075 -0.214906006 -0.322427002 -0.7054450075 -0.244132004 -0.3171535035 +-0.7054450075 -0.244132004 -0.3171535035 -0.8183900145 -0.238889496 -0.310369995 +-0.4289570005 1.0427199705 -0.327986511 -0.398933502 1.0426099855 -0.3284735105 +-0.398933502 1.0426099855 -0.3284735105 -0.398476013 1.033795044 -0.302355011 +-0.398476013 1.033795044 -0.302355011 -0.4289570005 1.0427199705 -0.327986511 +-0.391066498 -1.0572299805 0.1854954985 -0.372600006 -1.052880005 0.1721589965 +-0.372600006 -1.052880005 0.1721589965 -0.372536499 -1.05711499 0.1851024935 +-0.372536499 -1.05711499 0.1851024935 -0.391066498 -1.0572299805 0.1854954985 +-0.479845001 0.2959970095 -0.237003006 -0.477980011 0.135363495 -0.123602997 +-0.477980011 0.135363495 -0.123602997 -0.080088997 0.135586502 -0.129550003 +-0.080088997 0.135586502 -0.129550003 -0.479845001 0.2959970095 -0.237003006 +-0.479845001 0.2959970095 -0.237003006 -0.0814024965 0.295885498 -0.2426035005 +-0.0814024965 0.295885498 -0.2426035005 -0.080088997 0.135586502 -0.129550003 +-0.080088997 0.135586502 -0.129550003 -0.479845001 0.2959970095 -0.237003006 +-0.366709015 0.0510040015 0.0920045015 -0.277796997 0.0240641995 0.105972 +-0.277796997 0.0240641995 0.105972 -0.2207485045 0.040992199 0.0950619965 +-0.2207485045 0.040992199 0.0950619965 -0.366709015 0.0510040015 0.0920045015 +-0.3647929995 0.984715027 -0.3177164915 -0.365057007 0.9949749755 -0.3477359925 +-0.365057007 0.9949749755 -0.3477359925 -0.0878809965 0.984825012 -0.322181 +-0.0878809965 0.984825012 -0.322181 -0.3647929995 0.984715027 -0.3177164915 +-0.4212435 -1.025880005 0.203942993 -0.421484497 -1.0168449705 0.1781640015 +-0.421484497 -1.0168449705 0.1781640015 -0.3913485105 -1.016960022 0.1776795045 +-0.3913485105 -1.016960022 0.1776795045 -0.4212435 -1.025880005 0.203942993 +-0.4286069945 1.0340200195 -0.302093994 -0.4289570005 1.0427199705 -0.327986511 +-0.4289570005 1.0427199705 -0.327986511 -0.398476013 1.033795044 -0.302355011 +-0.398476013 1.033795044 -0.302355011 -0.4286069945 1.0340200195 -0.302093994 +-0.3989404905 0.9977650145 -0.344093994 -0.4290765075 0.9977650145 -0.343609497 +-0.4290765075 0.9977650145 -0.343609497 -0.398592987 0.9887299805 -0.318089508 +-0.398592987 0.9887299805 -0.318089508 -0.3989404905 0.9977650145 -0.344093994 +-0.364604492 1.0364749755 -0.300083496 -0.364871002 1.046959961 -0.3299914855 +-0.364871002 1.046959961 -0.3299914855 -0.0873600005 1.036920044 -0.3044295045 +-0.0873600005 1.036920044 -0.3044295045 -0.364604492 1.0364749755 -0.300083496 +-0.0882630005 0.995085022 -0.3518680115 -0.365057007 0.9949749755 -0.3477359925 +-0.365057007 0.9949749755 -0.3477359925 -0.0878809965 0.984825012 -0.322181 +-0.0878809965 0.984825012 -0.322181 -0.0882630005 0.995085022 -0.3518680115 +-0.476254486 -0.163703995 -0.0142228005 -0.47505249 -0.3240029905 0.098828499 +-0.47505249 -0.3240029905 0.098828499 -0.078477501 -0.1633690035 -0.020060499 +-0.078477501 -0.1633690035 -0.020060499 -0.476254486 -0.163703995 -0.0142228005 +-0.3913485105 -1.016960022 0.1776795045 -0.4212435 -1.025880005 0.203942993 +-0.4212435 -1.025880005 0.203942993 -0.3909985045 -1.025880005 0.2035724945 +-0.3909985045 -1.025880005 0.2035724945 -0.3913485105 -1.016960022 0.1776795045 +-0.391113495 -1.034920044 0.193081497 -0.391511505 -1.0303449705 0.180130493 +-0.391511505 -1.0303449705 0.180130493 -0.3722059935 -1.030454956 0.1799774935 +-0.3722059935 -1.030454956 0.1799774935 -0.391113495 -1.034920044 0.193081497 +-0.372536499 -1.05711499 0.1851024935 -0.372600006 -1.052880005 0.1721589965 +-0.372600006 -1.052880005 0.1721589965 -0.3576954955 -1.0644799805 0.158412506 +-0.3576954955 -1.0644799805 0.158412506 -0.372536499 -1.05711499 0.1851024935 +-0.414034485 -0.2644345095 0.1314579925 -0.414549988 -0.243016495 0.1081279985 +-0.414549988 -0.243016495 0.1081279985 -0.3912680055 -0.2236069945 0.141865494 +-0.3912680055 -0.2236069945 0.141865494 -0.414034485 -0.2644345095 0.1314579925 +-0.379788513 1.002340027 -0.320932007 -0.38007251 1.006799988 -0.3339914855 +-0.38007251 1.006799988 -0.3339914855 -0.3647929995 0.984715027 -0.3177164915 +-0.3647929995 0.984715027 -0.3177164915 -0.379788513 1.002340027 -0.320932007 +-0.3576954955 -1.0644799805 0.158412506 -0.372536499 -1.05711499 0.1851024935 +-0.372536499 -1.05711499 0.1851024935 -0.35698349 -1.0751850585 0.1883294985 +-0.35698349 -1.0751850585 0.1883294985 -0.3576954955 -1.0644799805 0.158412506 +-0.420447998 0.143171997 -0.3134150085 -0.421191498 0.1650359955 -0.336527008 +-0.421191498 0.1650359955 -0.336527008 -0.397792511 0.1839994965 -0.303010498 +-0.397792511 0.1839994965 -0.303010498 -0.420447998 0.143171997 -0.3134150085 +-0.391465515 -1.0620250245 0.1619450075 -0.42114151 -1.070834961 0.1884360045 +-0.42114151 -1.070834961 0.1884360045 -0.391340515 -1.0707249755 0.1879450075 +-0.391340515 -1.0707249755 0.1879450075 -0.391465515 -1.0620250245 0.1619450075 +-0.42114151 -1.070834961 0.1884360045 -0.4217149965 -1.061800049 0.1625390015 +-0.4217149965 -1.061800049 0.1625390015 -0.391465515 -1.0620250245 0.1619450075 +-0.391465515 -1.0620250245 0.1619450075 -0.42114151 -1.070834961 0.1884360045 +-0.391113495 -1.034920044 0.193081497 -0.372256012 -1.0350300295 0.1930305025 +-0.372256012 -1.0350300295 0.1930305025 -0.3722059935 -1.030454956 0.1799774935 +-0.3722059935 -1.030454956 0.1799774935 -0.391113495 -1.034920044 0.193081497 +-0.35698349 -1.0751850585 0.1883294985 -0.3576954955 -1.0644799805 0.158412506 +-0.3576954955 -1.0644799805 0.158412506 -0.0805699995 -1.064589966 0.154399002 +-0.0805699995 -1.064589966 0.154399002 -0.35698349 -1.0751850585 0.1883294985 +-0.3571340025 -1.0233150025 0.2061784975 -0.3576235045 -1.012830017 0.1762660065 +-0.3576235045 -1.012830017 0.1762660065 -0.080165001 -1.012830017 0.172371002 +-0.080165001 -1.012830017 0.172371002 -0.3571340025 -1.0233150025 0.2061784975 +1.561875 0.0447851485 -0.0345699995 1.560925049 0.0643065035 -0.090489502 +1.560925049 0.0643065035 -0.090489502 1.71826001 0.025263201 -0.0751435015 +1.71826001 0.025263201 -0.0751435015 1.561875 0.0447851485 -0.0345699995 +1.5653449705 -0.050814499 -0.130899002 1.5607650145 -0.0673239975 -0.0881500015 +1.5607650145 -0.0673239975 -0.0881500015 1.7184849855 -0.0395476 -0.075139 +1.7184849855 -0.0395476 -0.075139 1.5653449705 -0.050814499 -0.130899002 +-0.078477501 -0.1633690035 -0.020060499 -0.47505249 -0.3240029905 0.098828499 +-0.47505249 -0.3240029905 0.098828499 -0.0766104965 -0.323333496 0.093227501 +-0.0766104965 -0.323333496 0.093227501 -0.078477501 -0.1633690035 -0.020060499 +-0.080165001 -1.012830017 0.172371002 -0.3571340025 -1.0233150025 0.2061784975 +-0.3571340025 -1.0233150025 0.2061784975 -0.0796760025 -1.0230949705 0.202283493 +-0.0796760025 -1.0230949705 0.202283493 -0.080165001 -1.012830017 0.172371002 +-0.8186950075 -0.214906006 -0.322427002 -0.7055949705 -0.2155755005 -0.3313265075 +-0.7055949705 -0.2155755005 -0.3313265075 -0.7054450075 -0.244132004 -0.3171535035 +-0.7054450075 -0.244132004 -0.3171535035 -0.8186950075 -0.214906006 -0.322427002 +-0.0805699995 -1.064589966 0.154399002 -0.35698349 -1.0751850585 0.1883294985 +-0.35698349 -1.0751850585 0.1883294985 -0.080305496 -1.075074951 0.184418503 +-0.080305496 -1.075074951 0.184418503 -0.0805699995 -1.064589966 0.154399002 +-0.0785835035 0.1407180025 -0.0256418 -0.475049011 0.304475006 0.088005501 +-0.475049011 0.304475006 0.088005501 -0.0774609985 0.127778 0.0539350015 +-0.0774609985 0.127778 0.0539350015 -0.0785835035 0.1407180025 -0.0256418 +-0.364871002 1.046959961 -0.3299914855 -0.0878539965 1.0468449705 -0.334118988 +-0.0878539965 1.0468449705 -0.334118988 -0.0873600005 1.036920044 -0.3044295045 +-0.0873600005 1.036920044 -0.3044295045 -0.364871002 1.046959961 -0.3299914855 +-0.476396515 0.3170799865 0.00853545 -0.475049011 0.304475006 0.088005501 +-0.475049011 0.304475006 0.088005501 -0.0785835035 0.1407180025 -0.0256418 +-0.0785835035 0.1407180025 -0.0256418 -0.476396515 0.3170799865 0.00853545 +-0.398761505 1.029334961 -0.326015503 -0.3800180055 1.029334961 -0.325957489 +-0.3800180055 1.029334961 -0.325957489 -0.379950012 1.024869995 -0.313236511 +-0.379950012 1.024869995 -0.313236511 -0.398761505 1.029334961 -0.326015503 +-0.4287309875 0.9890650025 -0.317493988 -0.4290765075 0.9977650145 -0.343609497 +-0.4290765075 0.9977650145 -0.343609497 -0.398592987 0.9887299805 -0.318089508 +-0.398592987 0.9887299805 -0.318089508 -0.4287309875 0.9890650025 -0.317493988 +-0.397792511 0.1839994965 -0.303010498 -0.420447998 0.143171997 -0.3134150085 +-0.420447998 0.143171997 -0.3134150085 -0.397682007 0.1788685 -0.2976524965 +-0.397682007 0.1788685 -0.2976524965 -0.397792511 0.1839994965 -0.303010498 +-0.365057007 0.9949749755 -0.3477359925 -0.38007251 1.006799988 -0.3339914855 +-0.38007251 1.006799988 -0.3339914855 -0.3647929995 0.984715027 -0.3177164915 +-0.3647929995 0.984715027 -0.3177164915 -0.365057007 0.9949749755 -0.3477359925 +-0.391013489 -1.052880005 0.1723305055 -0.391066498 -1.0572299805 0.1854954985 +-0.391066498 -1.0572299805 0.1854954985 -0.372600006 -1.052880005 0.1721589965 +-0.372600006 -1.052880005 0.1721589965 -0.391013489 -1.052880005 0.1723305055 +-0.818164978 0.146741501 -0.2784549865 -0.818619995 0.150423004 -0.3046845095 +-0.818619995 0.150423004 -0.3046845095 -0.7051550295 0.142614502 -0.3095599975 +-0.7051550295 0.142614502 -0.3095599975 -0.818164978 0.146741501 -0.2784549865 +-0.083911499 1.0225300295 -0.3305775145 -0.0840490035 1.020075012 -0.3239974975 +-0.0840490035 1.020075012 -0.3239974975 0.5474699705 1.0223049925 -0.340002014 +0.5474699705 1.0223049925 -0.340002014 -0.083911499 1.0225300295 -0.3305775145 +-0.613674988 -0.0655390015 0.0851019975 -0.6138599855 0.058282501 0.0833130035 +-0.6138599855 0.058282501 0.0833130035 -0.5861099855 0.0693259965 0.106208 +-0.5861099855 0.0693259965 0.106208 -0.613674988 -0.0655390015 0.0851019975 +-0.8174699705 -0.200515503 -0.237157501 -0.817659973 -0.176309494 -0.249211502 +-0.817659973 -0.176309494 -0.249211502 -0.7045 -0.1707319945 -0.2451674955 +-0.7045 -0.1707319945 -0.2451674955 -0.8174699705 -0.200515503 -0.237157501 +-0.7045 -0.1707319945 -0.2451674955 -0.8174699705 -0.200515503 -0.237157501 +-0.8174699705 -0.200515503 -0.237157501 -0.7043449705 -0.1995119935 -0.231216995 +-0.7043449705 -0.1995119935 -0.231216995 -0.7045 -0.1707319945 -0.2451674955 +-0.2079640045 -0.1587955015 -0.065171501 -0.2098829955 -0.120867996 -0.1919620055 +-0.2098829955 -0.120867996 -0.1919620055 0.0967710035 -0.122987999 -0.146151993 +0.0967710035 -0.122987999 -0.146151993 -0.2079640045 -0.1587955015 -0.065171501 +-0.0840490035 1.020075012 -0.3239974975 0.547325012 1.019965027 -0.3331984865 +0.547325012 1.019965027 -0.3331984865 0.5474699705 1.0223049925 -0.340002014 +0.5474699705 1.0223049925 -0.340002014 -0.0840490035 1.020075012 -0.3239974975 +0.5474699705 1.0223049925 -0.340002014 0.547325012 1.019965027 -0.3331984865 +0.547325012 1.019965027 -0.3331984865 0.607039978 1.0150549925 -0.3394234925 +0.607039978 1.0150549925 -0.3394234925 0.5474699705 1.0223049925 -0.340002014 +0.5471849975 1.008585022 -0.337218506 0.5469849855 1.0105949705 -0.343582489 +0.5469849855 1.0105949705 -0.343582489 0.607039978 1.0150549925 -0.3394234925 +0.607039978 1.0150549925 -0.3394234925 0.5471849975 1.008585022 -0.337218506 +-0.81225 0.1696100005 0.120885002 -0.812669983 0.193816498 0.1089380035 +-0.812669983 0.193816498 0.1089380035 -0.6991849975 0.1636974945 0.1138809965 +-0.6991849975 0.1636974945 0.1138809965 -0.81225 0.1696100005 0.120885002 +-0.812669983 0.193816498 0.1089380035 -0.6994450075 0.1919194945 0.0995944975 +-0.6994450075 0.1919194945 0.0995944975 -0.6991849975 0.1636974945 0.1138809965 +-0.6991849975 0.1636974945 0.1138809965 -0.812669983 0.193816498 0.1089380035 +-0.6109450075 0.0486054495 0.0372092515 -0.6109450075 -0.054188999 0.0372092515 +-0.6109450075 -0.054188999 0.0372092515 -0.5912299805 -0.0592085 0.0483058015 +-0.5912299805 -0.0592085 0.0483058015 -0.6109450075 0.0486054495 0.0372092515 +0.2443639985 0.084719002 0.0093517505 0.2432630005 0.1117145005 -0.076584503 +0.2432630005 0.1117145005 -0.076584503 0.5980599975 0.0971015015 -0.081314499 +0.5980599975 0.0971015015 -0.081314499 0.2443639985 0.084719002 0.0093517505 +0.554994995 -1.036255005 0.1689389955 0.5548549805 -1.0385999755 0.1756309965 +0.5548549805 -1.0385999755 0.1756309965 0.614789978 -1.0427249755 0.169298996 +0.614789978 -1.0427249755 0.169298996 0.554994995 -1.036255005 0.1689389955 +-0.2055149995 0.0694375 0.100234497 -0.2057850035 0.1205270005 0.059838501 +-0.2057850035 0.1205270005 0.059838501 0.0980565035 0.069661003 0.0961054995 +0.0980565035 0.069661003 0.0961054995 -0.2055149995 0.0694375 0.100234497 +-0.5912299805 -0.0592085 0.0483058015 -0.6109450075 0.0486054495 0.0372092515 +-0.6109450075 0.0486054495 0.0372092515 -0.5912299805 0.053625 0.0483058015 +-0.5912299805 0.053625 0.0483058015 -0.5912299805 -0.0592085 0.0483058015 +-0.2057850035 0.1205270005 0.059838501 0.0974524995 0.1208619995 0.0557024995 +0.0974524995 0.1208619995 0.0557024995 0.0980565035 0.069661003 0.0961054995 +0.0980565035 0.069661003 0.0961054995 -0.2057850035 0.1205270005 0.059838501 +0.5970150145 -0.072901001 -0.143260498 0.243067505 -0.115179497 -0.0725719985 +0.243067505 -0.115179497 -0.0725719985 0.5981099855 -0.0973310015 -0.0783010025 +0.5981099855 -0.0973310015 -0.0783010025 0.5970150145 -0.072901001 -0.143260498 +-0.8113200075 -0.261423004 0.167097 -0.8117650145 -0.2581879885 0.140533005 +-0.8117650145 -0.2581879885 0.140533005 -0.698174988 -0.2690085145 0.1666775055 +-0.698174988 -0.2690085145 0.1666775055 -0.8113200075 -0.261423004 0.167097 +-0.7051550295 0.142614502 -0.3095599975 -0.818164978 0.146741501 -0.2784549865 +-0.818164978 0.146741501 -0.2784549865 -0.7046950075 0.1388215025 -0.2783095095 +-0.7046950075 0.1388215025 -0.2783095095 -0.7051550295 0.142614502 -0.3095599975 +-0.8117650145 -0.2581879885 0.140533005 -0.69875 -0.264880493 0.1356475065 +-0.69875 -0.264880493 0.1356475065 -0.698174988 -0.2690085145 0.1666775055 +-0.698174988 -0.2690085145 0.1666775055 -0.8117650145 -0.2581879885 0.140533005 +0.2432630005 0.1117145005 -0.076584503 0.0974524995 0.1208619995 0.0557024995 +0.0974524995 0.1208619995 0.0557024995 0.2443639985 0.084719002 0.0093517505 +0.2443639985 0.084719002 0.0093517505 0.2432630005 0.1117145005 -0.076584503 +-0.0998320005 0.140494995 -0.044608101 -0.564409973 0.3264505005 -0.0082591 +-0.564409973 0.3264505005 -0.0082591 -0.0996504975 0.1372599945 -0.0266406995 +-0.0996504975 0.1372599945 -0.0266406995 -0.0998320005 0.140494995 -0.044608101 +0.0967710035 -0.122987999 -0.146151993 0.096614998 -0.0127754 -0.1813014985 +0.096614998 -0.0127754 -0.1813014985 0.242095505 -0.01188305 -0.1273759995 +0.242095505 -0.01188305 -0.1273759995 0.0967710035 -0.122987999 -0.146151993 +0.0967710035 -0.122987999 -0.146151993 0.095731003 -0.1586840055 -0.069856003 +0.095731003 -0.1586840055 -0.069856003 0.2424004975 -0.0841679995 -0.109963501 +0.2424004975 -0.0841679995 -0.109963501 0.0967710035 -0.122987999 -0.146151993 +-0.810994995 0.2078715055 0.194216995 -0.8111900025 0.232078003 0.182162506 +-0.8111900025 0.232078003 0.182162506 -0.698125 0.236875 0.1857579955 +-0.698125 0.236875 0.1857579955 -0.810994995 0.2078715055 0.194216995 +-0.0184746495 0.296889496 -0.253223999 -0.0173365 0.1230930025 -0.211694 +-0.0173365 0.1230930025 -0.211694 -0.01728615 0.298339508 -0.246058502 +-0.01728615 0.298339508 -0.246058502 -0.0184746495 0.296889496 -0.253223999 +-0.564409973 0.3264505005 -0.0082591 -0.564455017 0.323104004 0.0098149005 +-0.564455017 0.323104004 0.0098149005 -0.0996504975 0.1372599945 -0.0266406995 +-0.0996504975 0.1372599945 -0.0266406995 -0.564409973 0.3264505005 -0.0082591 +1.5607650145 -0.0673239975 -0.0881500015 1.560130005 -0.050702999 -0.132347 +1.560130005 -0.050702999 -0.132347 1.5653449705 -0.050814499 -0.130899002 +1.5653449705 -0.050814499 -0.130899002 1.5607650145 -0.0673239975 -0.0881500015 +-0.698125 0.236875 0.1857579955 -0.810994995 0.2078715055 0.194216995 +-0.810994995 0.2078715055 0.194216995 -0.697755005 0.2086524965 0.1999360045 +-0.697755005 0.2086524965 0.1999360045 -0.698125 0.236875 0.1857579955 +-0.0764925005 -1.0364799805 0.1781380005 0.5548549805 -1.0385999755 0.1756309965 +0.5548549805 -1.0385999755 0.1756309965 0.554994995 -1.036255005 0.1689389955 +0.554994995 -1.036255005 0.1689389955 -0.0764925005 -1.0364799805 0.1781380005 +-0.0764349975 -1.045959961 0.186061493 -0.0764925005 -1.0364799805 0.1781380005 +-0.0764925005 -1.0364799805 0.1781380005 0.5548549805 -1.0385999755 0.1756309965 +0.5548549805 -1.0385999755 0.1756309965 -0.0764349975 -1.045959961 0.186061493 +0.5548599855 -1.0478599855 0.1648079985 -0.076600998 -1.0412750245 0.172668503 +-0.076600998 -1.0412750245 0.172668503 0.555049988 -1.0499749755 0.1716185 +0.555049988 -1.0499749755 0.1716185 0.5548599855 -1.0478599855 0.1648079985 +-0.076320503 -1.050535034 0.1805964965 -0.076600998 -1.0412750245 0.172668503 +-0.076600998 -1.0412750245 0.172668503 0.555049988 -1.0499749755 0.1716185 +0.555049988 -1.0499749755 0.1716185 -0.076320503 -1.050535034 0.1805964965 +-0.6159050295 -0.1372660065 -0.058765999 -0.6176500245 -0.1046934965 -0.167365494 +-0.6176500245 -0.1046934965 -0.167365494 -0.5887700195 -0.159800003 -0.0598709985 +-0.5887700195 -0.159800003 -0.0598709985 -0.6159050295 -0.1372660065 -0.058765999 +0.5981099855 -0.0973310015 -0.0783010025 0.5970150145 -0.072901001 -0.143260498 +0.5970150145 -0.072901001 -0.143260498 1.560130005 -0.050702999 -0.132347 +1.560130005 -0.050702999 -0.132347 0.5981099855 -0.0973310015 -0.0783010025 +-0.0838584975 1.0084749755 -0.3277869875 -0.0840455015 1.010705017 -0.3348200075 +-0.0840455015 1.010705017 -0.3348200075 0.5469849855 1.0105949705 -0.343582489 +0.5469849855 1.0105949705 -0.343582489 -0.0838584975 1.0084749755 -0.3277869875 +-0.586169983 -0.075578499 0.108996498 -0.613674988 -0.0655390015 0.0851019975 +-0.613674988 -0.0655390015 0.0851019975 -0.5861099855 0.0693259965 0.106208 +-0.5861099855 0.0693259965 0.106208 -0.586169983 -0.075578499 0.108996498 +-0.818034973 0.2299589995 -0.2686335145 -0.8184849855 0.2335285035 -0.2950859985 +-0.8184849855 0.2335285035 -0.2950859985 -0.7052800295 0.240779495 -0.2982940065 +-0.7052800295 0.240779495 -0.2982940065 -0.818034973 0.2299589995 -0.2686335145 +-0.3989349975 1.0066900025 -0.333717499 -0.38007251 1.006799988 -0.3339914855 +-0.38007251 1.006799988 -0.3339914855 -0.379788513 1.002340027 -0.320932007 +-0.379788513 1.002340027 -0.320932007 -0.3989349975 1.0066900025 -0.333717499 +1.560130005 -0.050702999 -0.132347 0.5981099855 -0.0973310015 -0.0783010025 +0.5981099855 -0.0973310015 -0.0783010025 1.5607650145 -0.0673239975 -0.0881500015 +1.5607650145 -0.0673239975 -0.0881500015 1.560130005 -0.050702999 -0.132347 +1.560925049 0.0643065035 -0.090489502 0.5994000245 0.0846080015 0.00395728 +0.5994000245 0.0846080015 0.00395728 1.561875 0.0447851485 -0.0345699995 +1.561875 0.0447851485 -0.0345699995 1.560925049 0.0643065035 -0.090489502 +-0.398764496 1.0022249755 -0.320548004 -0.3989349975 1.0066900025 -0.333717499 +-0.3989349975 1.0066900025 -0.333717499 -0.379788513 1.002340027 -0.320932007 +-0.379788513 1.002340027 -0.320932007 -0.398764496 1.0022249755 -0.320548004 +-0.586830017 0.1207505035 0.0660270005 -0.2057850035 0.1205270005 0.059838501 +-0.2057850035 0.1205270005 0.059838501 -0.2055149995 0.0694375 0.100234497 +-0.2055149995 0.0694375 0.100234497 -0.586830017 0.1207505035 0.0660270005 +-0.5861099855 0.0693259965 0.106208 -0.586830017 0.1207505035 0.0660270005 +-0.586830017 0.1207505035 0.0660270005 -0.2055149995 0.0694375 0.100234497 +-0.2055149995 0.0694375 0.100234497 -0.5861099855 0.0693259965 0.106208 +-0.083765999 -1.036035034 -0.300226013 -0.087430496 -1.013835022 -0.3170390015 +-0.087430496 -1.013835022 -0.3170390015 -0.083453003 -1.0292299805 -0.299215515 +-0.083453003 -1.0292299805 -0.299215515 -0.083765999 -1.036035034 -0.300226013 +-0.398761505 1.029334961 -0.326015503 -0.398816498 1.0246500245 -0.312738495 +-0.398816498 1.0246500245 -0.312738495 -0.379950012 1.024869995 -0.313236511 +-0.379950012 1.024869995 -0.313236511 -0.398761505 1.029334961 -0.326015503 +-0.088132004 1.026209961 -0.358113495 -0.0882630005 0.995085022 -0.3518680115 +-0.0882630005 0.995085022 -0.3518680115 -0.0840455015 1.010705017 -0.3348200075 +-0.0840455015 1.010705017 -0.3348200075 -0.088132004 1.026209961 -0.358113495 +0.5469849855 1.0105949705 -0.343582489 -0.0838584975 1.0084749755 -0.3277869875 +-0.0838584975 1.0084749755 -0.3277869875 0.5471849975 1.008585022 -0.337218506 +0.5471849975 1.008585022 -0.337218506 0.5469849855 1.0105949705 -0.343582489 +-0.0876624985 -1.0450699465 -0.321953491 -0.083765999 -1.036035034 -0.300226013 +-0.083765999 -1.036035034 -0.300226013 -0.083318001 -1.040494995 -0.2949725035 +-0.083318001 -1.040494995 -0.2949725035 -0.0876624985 -1.0450699465 -0.321953491 +-0.2098829955 -0.120867996 -0.1919620055 -0.5887700195 -0.159800003 -0.0598709985 +-0.5887700195 -0.159800003 -0.0598709985 -0.2079640045 -0.1587955015 -0.065171501 +-0.2079640045 -0.1587955015 -0.065171501 -0.2098829955 -0.120867996 -0.1919620055 +-0.5887700195 -0.159800003 -0.0598709985 -0.590580017 -0.1214260025 -0.186546997 +-0.590580017 -0.1214260025 -0.186546997 -0.2098829955 -0.120867996 -0.1919620055 +-0.2098829955 -0.120867996 -0.1919620055 -0.5887700195 -0.159800003 -0.0598709985 +-0.0805699995 -1.064589966 0.154399002 -0.080778 -1.033579956 0.1483690035 +-0.080778 -1.033579956 0.1483690035 -0.076600998 -1.0412750245 0.172668503 +-0.076600998 -1.0412750245 0.172668503 -0.0805699995 -1.064589966 0.154399002 +-0.2057850035 0.1205270005 0.059838501 -0.207515503 0.1411640015 -0.0706295015 +-0.207515503 0.1411640015 -0.0706295015 0.095617996 0.1413869935 -0.075102501 +0.095617996 0.1413869935 -0.075102501 -0.2057850035 0.1205270005 0.059838501 +-0.1007614975 -0.143848007 -0.1227304995 -0.56598999 -0.1469714965 -0.0979990005 +-0.56598999 -0.1469714965 -0.0979990005 -0.100580002 -0.1466369935 -0.1047630005 +-0.100580002 -0.1466369935 -0.1047630005 -0.1007614975 -0.143848007 -0.1227304995 +-0.564409973 0.3264505005 -0.0082591 -0.564455017 0.323104004 0.0098149005 +-0.564455017 0.323104004 0.0098149005 -0.375478485 1.0720600585 0.107161499 +-0.375478485 1.0720600585 0.107161499 -0.564409973 0.3264505005 -0.0082591 +-0.4140755005 0.2463569945 0.1227545015 -0.4143890075 0.224158005 0.1004329985 +-0.4143890075 0.224158005 0.1004329985 -0.3912275085 0.205751999 0.1346139985 +-0.3912275085 0.205751999 0.1346139985 -0.4140755005 0.2463569945 0.1227545015 +-0.5650200195 0.140272003 -0.0378393515 -0.0998320005 0.140494995 -0.044608101 +-0.0998320005 0.140494995 -0.044608101 -0.0996504975 0.1372599945 -0.0266406995 +-0.0996504975 0.1372599945 -0.0266406995 -0.5650200195 0.140272003 -0.0378393515 +-0.4139360045 -0.1670505065 0.1427295075 -0.414251007 -0.1823329925 0.115163498 +-0.414251007 -0.1823329925 0.115163498 -0.3909924925 -0.2059819945 0.150016495 +-0.3909924925 -0.2059819945 0.150016495 -0.4139360045 -0.1670505065 0.1427295075 +-0.564455017 0.323104004 0.0098149005 -0.375478485 1.0720600585 0.107161499 +-0.375478485 1.0720600585 0.107161499 -0.3752994995 1.069045044 0.1252405015 +-0.3752994995 1.069045044 0.1252405015 -0.564455017 0.323104004 0.0098149005 +-0.099258499 0.323215515 0.00259993 -0.564409973 0.3264505005 -0.0082591 +-0.564409973 0.3264505005 -0.0082591 -0.099223999 0.326004486 -0.01502785 +-0.099223999 0.326004486 -0.01502785 -0.099258499 0.323215515 0.00259993 +-0.391078003 -0.2096629945 0.1434315035 -0.414251007 -0.1823329925 0.115163498 +-0.414251007 -0.1823329925 0.115163498 -0.3909924925 -0.2059819945 0.150016495 +-0.3909924925 -0.2059819945 0.150016495 -0.391078003 -0.2096629945 0.1434315035 +0.095617996 0.1413869935 -0.075102501 -0.2057850035 0.1205270005 0.059838501 +-0.2057850035 0.1205270005 0.059838501 0.0974524995 0.1208619995 0.0557024995 +0.0974524995 0.1208619995 0.0557024995 0.095617996 0.1413869935 -0.075102501 +-0.565840027 -0.1442944945 -0.115959503 -0.56598999 -0.1469714965 -0.0979990005 +-0.56598999 -0.1469714965 -0.0979990005 -0.1007614975 -0.143848007 -0.1227304995 +-0.1007614975 -0.143848007 -0.1227304995 -0.565840027 -0.1442944945 -0.115959503 +-0.3912275085 0.205751999 0.1346139985 -0.4140755005 0.2463569945 0.1227545015 +-0.4140755005 0.2463569945 0.1227545015 -0.3910004885 0.2112180025 0.139751007 +-0.3910004885 0.2112180025 0.139751007 -0.3912275085 0.205751999 0.1346139985 +-0.413183014 0.237209503 0.1813504945 -0.4137214965 0.2514880065 0.153779999 +-0.4137214965 0.2514880065 0.153779999 -0.3911524965 0.2123339995 0.1470005035 +-0.3911524965 0.2123339995 0.1470005035 -0.413183014 0.237209503 0.1813504945 +-0.0866764985 -1.053660034 -0.267818512 -0.087058502 -1.06526001 -0.297505493 +-0.087058502 -1.06526001 -0.297505493 -0.083318001 -1.040494995 -0.2949725035 +-0.083318001 -1.040494995 -0.2949725035 -0.0866764985 -1.053660034 -0.267818512 +1.560925049 0.0643065035 -0.090489502 0.5994000245 0.0846080015 0.00395728 +0.5994000245 0.0846080015 0.00395728 1.5616049805 0.0559399985 -0.0323445015 +1.5616049805 0.0559399985 -0.0323445015 1.560925049 0.0643065035 -0.090489502 +-0.2098829955 -0.120867996 -0.1919620055 -0.2100370025 -0.01054445 -0.2272225035 +-0.2100370025 -0.01054445 -0.2272225035 0.096614998 -0.0127754 -0.1813014985 +0.096614998 -0.0127754 -0.1813014985 -0.2098829955 -0.120867996 -0.1919620055 +-0.0866764985 -1.053660034 -0.267818512 -0.0835910035 -1.031125 -0.2872795105 +-0.0835910035 -1.031125 -0.2872795105 -0.083318001 -1.040494995 -0.2949725035 +-0.083318001 -1.040494995 -0.2949725035 -0.0866764985 -1.053660034 -0.267818512 +0.096614998 -0.0127754 -0.1813014985 -0.2098829955 -0.120867996 -0.1919620055 +-0.2098829955 -0.120867996 -0.1919620055 0.0967710035 -0.122987999 -0.146151993 +0.0967710035 -0.122987999 -0.146151993 0.096614998 -0.0127754 -0.1813014985 +-0.5647299805 0.1372599945 -0.0196467 -0.5650200195 0.140272003 -0.0378393515 +-0.5650200195 0.140272003 -0.0378393515 -0.0996504975 0.1372599945 -0.0266406995 +-0.0996504975 0.1372599945 -0.0266406995 -0.5647299805 0.1372599945 -0.0196467 +-0.4791119995 0.1200810015 -0.202733505 -0.479845001 0.2959970095 -0.237003006 +-0.479845001 0.2959970095 -0.237003006 -0.080088997 0.135586502 -0.129550003 +-0.080088997 0.135586502 -0.129550003 -0.4791119995 0.1200810015 -0.202733505 +1.567420044 -0.072344002 -0.0328918495 1.5621800535 -0.053380001 -0.0332249985 +1.5621800535 -0.053380001 -0.0332249985 1.567630005 -0.0553880005 -0.0163743495 +1.567630005 -0.0553880005 -0.0163743495 1.567420044 -0.072344002 -0.0328918495 +-0.3992210085 0.122088997 -0.266778015 -0.3982470095 0.1151725005 -0.2120859985 +-0.3982470095 0.1151725005 -0.2120859985 -0.0811360015 0.1214195025 -0.2180514985 +-0.0811360015 0.1214195025 -0.2180514985 -0.3992210085 0.122088997 -0.266778015 +-0.379541504 -1.047410034 -0.2901315 -0.3646839905 -1.0451800535 -0.317602997 +-0.3646839905 -1.0451800535 -0.317602997 -0.3643034975 -1.064925049 -0.293159485 +-0.3643034975 -1.064925049 -0.293159485 -0.379541504 -1.047410034 -0.2901315 +0.2614974975 0.0551590005 0.1129179995 0.2498950045 0.053039501 0.1234970015 +0.2498950045 0.053039501 0.1234970015 0.535505005 0.0683219985 0.0713495025 +0.535505005 0.0683219985 0.0713495025 0.2614974975 0.0551590005 0.1129179995 +-0.6981900025 -0.170955002 0.1780579985 -0.6983200075 -0.1671620025 0.147037506 +-0.6983200075 -0.1671620025 0.147037506 -0.413470001 -0.170843506 0.1737575075 +-0.413470001 -0.170843506 0.1737575075 -0.6981900025 -0.170955002 0.1780579985 +-0.3911524965 0.2123339995 0.1470005035 -0.413183014 0.237209503 0.1813504945 +-0.413183014 0.237209503 0.1813504945 -0.3907325135 0.209098999 0.153591995 +-0.3907325135 0.209098999 0.153591995 -0.3911524965 0.2123339995 0.1470005035 +0.535505005 0.0683219985 0.0713495025 0.2443600005 0.0682105025 0.00421904 +0.2443600005 0.0682105025 0.00421904 0.587590027 0.0694375 0.0723290025 +0.587590027 0.0694375 0.0723290025 0.535505005 0.0683219985 0.0713495025 +-0.075651001 -0.32623349 0.095367996 -0.0766255035 -0.319317993 0.0406752015 +-0.0766255035 -0.319317993 0.0406752015 -0.0124824495 -0.32623349 0.094570999 +-0.0124824495 -0.32623349 0.094570999 -0.075651001 -0.32623349 0.095367996 +-0.5887700195 -0.159800003 -0.0598709985 -0.6159050295 -0.1372660065 -0.058765999 +-0.6159050295 -0.1372660065 -0.058765999 -0.5867249755 -0.1349234925 0.066251999 +-0.5867249755 -0.1349234925 0.066251999 -0.5887700195 -0.159800003 -0.0598709985 +-0.3752994995 1.069045044 0.1252405015 -0.375478485 1.0720600585 0.107161499 +-0.375478485 1.0720600585 0.107161499 -0.097348503 1.0722800295 0.1031695025 +-0.097348503 1.0722800295 0.1031695025 -0.3752994995 1.069045044 0.1252405015 +-0.3941505125 -0.1431784975 0.0717365035 -0.3932944945 -0.1500944975 0.126760498 +-0.3932944945 -0.1500944975 0.126760498 -0.0768724975 -0.1494255065 0.0684524995 +-0.0768724975 -0.1494255065 0.0684524995 -0.3941505125 -0.1431784975 0.0717365035 +-0.420447998 0.143171997 -0.3134150085 -0.7046950075 0.1388215025 -0.2783095095 +-0.7046950075 0.1388215025 -0.2783095095 -0.419870514 0.139267502 -0.28238501 +-0.419870514 0.139267502 -0.28238501 -0.420447998 0.143171997 -0.3134150085 +-0.097348503 1.0722800295 0.1031695025 -0.3752994995 1.069045044 0.1252405015 +-0.3752994995 1.069045044 0.1252405015 -0.097165001 1.069380005 0.121024498 +-0.097165001 1.069380005 0.121024498 -0.097348503 1.0722800295 0.1031695025 +-0.102680496 -1.0761899415 -0.2708315125 -0.380924011 -1.076079956 -0.266730011 +-0.380924011 -1.076079956 -0.266730011 -0.1025009995 -1.078755005 -0.2527525025 +-0.1025009995 -1.078755005 -0.2527525025 -0.102680496 -1.0761899415 -0.2708315125 +-0.3733554995 1.022085022 0.1336495055 -0.373359009 1.0132700195 0.144472 +-0.373359009 1.0132700195 0.144472 -0.358160492 1.01561499 0.1166735 +-0.358160492 1.01561499 0.1166735 -0.3733554995 1.022085022 0.1336495055 +-0.01728615 0.298339508 -0.246058502 -0.0800445025 0.2915350035 -0.190246002 +-0.0800445025 0.2915350035 -0.190246002 -0.0166485005 0.2917579955 -0.191261505 +-0.0166485005 0.2917579955 -0.191261505 -0.01728615 0.298339508 -0.246058502 +-0.075977501 0.307152008 0.084314499 -0.0763499985 0.305924988 0.091447998 +-0.0763499985 0.305924988 0.091447998 -0.0135162495 0.305924988 0.090643997 +-0.0135162495 0.305924988 0.090643997 -0.075977501 0.307152008 0.084314499 +-0.420441498 -0.1610265045 -0.3083940125 -0.4209825135 -0.184117996 -0.3304974975 +-0.4209825135 -0.184117996 -0.3304974975 -0.39726651 -0.2019660035 -0.296192993 +-0.39726651 -0.2019660035 -0.296192993 -0.420441498 -0.1610265045 -0.3083940125 +-0.69875 -0.264880493 0.1356475065 -0.414034485 -0.2644345095 0.1314579925 +-0.414034485 -0.2644345095 0.1314579925 -0.4137894895 -0.2685620115 0.162369995 +-0.4137894895 -0.2685620115 0.162369995 -0.69875 -0.264880493 0.1356475065 +-0.3992210085 0.122088997 -0.266778015 -0.0819990005 0.128001007 -0.2727409975 +-0.0819990005 0.128001007 -0.2727409975 -0.0811360015 0.1214195025 -0.2180514985 +-0.0811360015 0.1214195025 -0.2180514985 -0.3992210085 0.122088997 -0.266778015 +-0.3795400085 -1.038709961 -0.300842987 -0.379541504 -1.047410034 -0.2901315 +-0.379541504 -1.047410034 -0.2901315 -0.3646839905 -1.0451800535 -0.317602997 +-0.3646839905 -1.0451800535 -0.317602997 -0.3795400085 -1.038709961 -0.300842987 +-0.372846985 1.0185150145 0.1573139955 -0.373359009 1.0132700195 0.144472 +-0.373359009 1.0132700195 0.144472 -0.3578984985 0.995755005 0.141449005 +-0.3578984985 0.995755005 0.141449005 -0.372846985 1.0185150145 0.1573139955 +-0.605380005 -0.00189917 -0.0125483 -0.5905700075 0.0253190995 0.0181384505 +-0.5905700075 0.0253190995 0.0181384505 -0.5899699705 0.0371994515 -0.0105796005 +-0.5899699705 0.0371994515 -0.0105796005 -0.605380005 -0.00189917 -0.0125483 +-0.379361511 -1.042170044 -0.2774079895 -0.379541504 -1.047410034 -0.2901315 +-0.379541504 -1.047410034 -0.2901315 -0.363916504 -1.053660034 -0.2636954955 +-0.363916504 -1.053660034 -0.2636954955 -0.379361511 -1.042170044 -0.2774079895 +-0.373359009 1.0132700195 0.144472 -0.358160492 1.01561499 0.1166735 +-0.358160492 1.01561499 0.1166735 -0.3578984985 0.995755005 0.141449005 +-0.3578984985 0.995755005 0.141449005 -0.373359009 1.0132700195 0.144472 +0.2498950045 0.053039501 0.1234970015 0.535505005 0.0683219985 0.0713495025 +0.535505005 0.0683219985 0.0713495025 0.587590027 0.0694375 0.0723290025 +0.587590027 0.0694375 0.0723290025 0.2498950045 0.053039501 0.1234970015 +0.5980599975 0.0971015015 -0.081314499 0.2443639985 0.084719002 0.0093517505 +0.2443639985 0.084719002 0.0093517505 0.5994000245 0.0846080015 0.00395728 +0.5994000245 0.0846080015 0.00395728 0.5980599975 0.0971015015 -0.081314499 +-0.379541504 -1.047410034 -0.2901315 -0.3643034975 -1.064925049 -0.293159485 +-0.3643034975 -1.064925049 -0.293159485 -0.363916504 -1.053660034 -0.2636954955 +-0.363916504 -1.053660034 -0.2636954955 -0.379541504 -1.047410034 -0.2901315 +-0.0766255035 -0.319317993 0.0406752015 -0.0135636995 -0.319540985 0.039653099 +-0.0135636995 -0.319540985 0.039653099 -0.0124824495 -0.32623349 0.094570999 +-0.0124824495 -0.32623349 0.094570999 -0.0766255035 -0.319317993 0.0406752015 +-0.5661550295 -0.3328154905 -0.1274585035 -0.5665650025 -0.3301380005 -0.145319 +-0.5665650025 -0.3301380005 -0.145319 -0.101592499 -0.3295805055 -0.152315506 +-0.101592499 -0.3295805055 -0.152315506 -0.5661550295 -0.3328154905 -0.1274585035 +-0.391924988 1.0358050535 0.1359380035 -0.3919704895 1.04048999 0.1487684935 +-0.3919704895 1.04048999 0.1487684935 -0.3916849975 1.054209961 0.1511174925 +-0.3916849975 1.054209961 0.1511174925 -0.391924988 1.0358050535 0.1359380035 +-0.0181679 -0.136151001 -0.214612503 -0.080373001 -0.137600998 -0.2065429995 +-0.080373001 -0.137600998 -0.2065429995 -0.017202299 -0.1372660065 -0.2074515075 +-0.017202299 -0.1372660065 -0.2074515075 -0.0181679 -0.136151001 -0.214612503 +-0.0135162495 0.305924988 0.090643997 -0.014045 0.1300090025 0.0626274985 +-0.014045 0.1300090025 0.0626274985 -0.0132262 0.1311244965 0.055503502 +-0.0132262 0.1311244965 0.055503502 -0.0135162495 0.305924988 0.090643997 +-0.3578984985 0.995755005 0.141449005 -0.372846985 1.0185150145 0.1573139955 +-0.372846985 1.0185150145 0.1573139955 -0.357734497 1.0070250245 0.170908005 +-0.357734497 1.0070250245 0.170908005 -0.3578984985 0.995755005 0.141449005 +-0.0785835035 0.1407180025 -0.0256418 -0.4750224915 0.1278895035 0.060112499 +-0.4750224915 0.1278895035 0.060112499 -0.0774609985 0.127778 0.0539350015 +-0.0774609985 0.127778 0.0539350015 -0.0785835035 0.1407180025 -0.0256418 +-0.3913485105 -1.016960022 0.1776795045 -0.391511505 -1.0303449705 0.180130493 +-0.391511505 -1.0303449705 0.180130493 -0.3912944945 -1.0391550295 0.1697590025 +-0.3912944945 -1.0391550295 0.1697590025 -0.3913485105 -1.016960022 0.1776795045 +-0.0811360015 0.1214195025 -0.2180514985 -0.0819990005 0.128001007 -0.2727409975 +-0.0819990005 0.128001007 -0.2727409975 -0.0180767995 0.1216429975 -0.2189620055 +-0.0180767995 0.1216429975 -0.2189620055 -0.0811360015 0.1214195025 -0.2180514985 +-0.4204609985 0.2408910065 -0.302145996 -0.704710022 0.236875 -0.267040497 +-0.704710022 0.236875 -0.267040497 -0.419994995 0.236651993 -0.2711185 +-0.419994995 0.236651993 -0.2711185 -0.4204609985 0.2408910065 -0.302145996 +-0.0819990005 0.128001007 -0.2727409975 -0.0189395505 0.1284474945 -0.273652008 +-0.0189395505 0.1284474945 -0.273652008 -0.0180767995 0.1216429975 -0.2189620055 +-0.0180767995 0.1216429975 -0.2189620055 -0.0819990005 0.128001007 -0.2727409975 +-0.4204609985 0.2408910065 -0.302145996 -0.4207785035 0.225496994 -0.3296004945 +-0.4207785035 0.225496994 -0.3296004945 -0.397296997 0.201848007 -0.2947430115 +-0.397296997 0.201848007 -0.2947430115 -0.4204609985 0.2408910065 -0.302145996 +-0.380744995 -1.078755005 -0.2486504975 -0.380924011 -1.076079956 -0.266730011 +-0.380924011 -1.076079956 -0.266730011 -0.1025009995 -1.078755005 -0.2527525025 +-0.1025009995 -1.078755005 -0.2527525025 -0.380744995 -1.078755005 -0.2486504975 +-0.7043449705 -0.1995119935 -0.231216995 -0.7045 -0.1707319945 -0.2451674955 +-0.7045 -0.1707319945 -0.2451674955 -0.4196700135 -0.1706204985 -0.2493545075 +-0.4196700135 -0.1706204985 -0.2493545075 -0.7043449705 -0.1995119935 -0.231216995 +-0.2055149995 0.0694375 0.100234497 -0.5861099855 0.0693259965 0.106208 +-0.5861099855 0.0693259965 0.106208 -0.2053150025 0.069772499 0.0906709975 +-0.2053150025 0.069772499 0.0906709975 -0.2055149995 0.0694375 0.100234497 +-0.0800445025 0.2915350035 -0.190246002 -0.080572998 0.298450989 -0.2449295045 +-0.080572998 0.298450989 -0.2449295045 -0.01728615 0.298339508 -0.246058502 +-0.01728615 0.298339508 -0.246058502 -0.0800445025 0.2915350035 -0.190246002 +-0.5861099855 0.0693259965 0.106208 -0.585909973 0.069661003 0.0966449965 +-0.585909973 0.069661003 0.0966449965 -0.2053150025 0.069772499 0.0906709975 +-0.2053150025 0.069772499 0.0906709975 -0.5861099855 0.0693259965 0.106208 +-0.6994450075 0.1919194945 0.0995944975 -0.414620514 0.1922545015 0.0955195005 +-0.414620514 0.1922545015 0.0955195005 -0.4142409975 0.1639205015 0.1093619995 +-0.4142409975 0.1639205015 0.1093619995 -0.6994450075 0.1919194945 0.0995944975 +-0.0807854995 -0.3138515015 -0.234779999 -0.0814189985 -0.3126245115 -0.2418224945 +-0.0814189985 -0.3126245115 -0.2418224945 -0.017911249 -0.3124014895 -0.2428359985 +-0.017911249 -0.3124014895 -0.2428359985 -0.0807854995 -0.3138515015 -0.234779999 +-0.614039978 -0.1160715025 0.049166649 -0.6159050295 -0.1372660065 -0.058765999 +-0.6159050295 -0.1372660065 -0.058765999 -0.5867249755 -0.1349234925 0.066251999 +-0.5867249755 -0.1349234925 0.066251999 -0.614039978 -0.1160715025 0.049166649 +-0.586169983 -0.075578499 0.108996498 -0.2051275025 -0.0751324995 0.1030319975 +-0.2051275025 -0.0751324995 0.1030319975 -0.2049275055 -0.0747979965 0.093468498 +-0.2049275055 -0.0747979965 0.093468498 -0.586169983 -0.075578499 0.108996498 +-0.0770759965 1.0201849975 0.1420870055 -0.080772003 0.995869995 0.1374349975 +-0.080772003 0.995869995 0.1374349975 -0.0767959975 1.0294449465 0.150014496 +-0.0767959975 1.0294449465 0.150014496 -0.0770759965 1.0201849975 0.1420870055 +-0.586169983 -0.075578499 0.108996498 -0.5859699705 -0.0752440035 0.0994329985 +-0.5859699705 -0.0752440035 0.0994329985 -0.2049275055 -0.0747979965 0.093468498 +-0.2049275055 -0.0747979965 0.093468498 -0.586169983 -0.075578499 0.108996498 +-0.0138086995 -0.1494255065 0.067319 -0.0762330015 -0.1558954925 0.1231364975 +-0.0762330015 -0.1558954925 0.1231364975 -0.0131756495 -0.1561185 0.1223379975 +-0.0131756495 -0.1561185 0.1223379975 -0.0138086995 -0.1494255065 0.067319 +-0.4762585145 0.140494995 -0.0193554495 -0.4750224915 0.1278895035 0.060112499 +-0.4750224915 0.1278895035 0.060112499 -0.0785835035 0.1407180025 -0.0256418 +-0.0785835035 0.1407180025 -0.0256418 -0.4762585145 0.140494995 -0.0193554495 +-0.698174988 -0.2690085145 0.1666775055 -0.69875 -0.264880493 0.1356475065 +-0.69875 -0.264880493 0.1356475065 -0.4137894895 -0.2685620115 0.162369995 +-0.4137894895 -0.2685620115 0.162369995 -0.698174988 -0.2690085145 0.1666775055 +-0.207515503 0.1411640015 -0.0706295015 -0.586830017 0.1207505035 0.0660270005 +-0.586830017 0.1207505035 0.0660270005 -0.2057850035 0.1205270005 0.059838501 +-0.2057850035 0.1205270005 0.059838501 -0.207515503 0.1411640015 -0.0706295015 +-0.605380005 -0.00189917 -0.0125483 -0.5905700075 -0.03212965 0.0181384505 +-0.5905700075 -0.03212965 0.0181384505 -0.5899699705 -0.0440097505 -0.0105796005 +-0.5899699705 -0.0440097505 -0.0105796005 -0.605380005 -0.00189917 -0.0125483 +0.5994000245 0.0846080015 0.00395728 0.5980599975 0.0971015015 -0.081314499 +0.5980599975 0.0971015015 -0.081314499 1.560925049 0.0643065035 -0.090489502 +1.560925049 0.0643065035 -0.090489502 0.5994000245 0.0846080015 0.00395728 +-0.014045 0.1300090025 0.0626274985 -0.0761695025 0.130455002 0.0561935005 +-0.0761695025 0.130455002 0.0561935005 -0.0132262 0.1311244965 0.055503502 +-0.0132262 0.1311244965 0.055503502 -0.014045 0.1300090025 0.0626274985 +0.54725 1.0174000245 -0.3454735105 0.5469849855 1.0105949705 -0.343582489 +0.5469849855 1.0105949705 -0.343582489 0.607039978 1.0150549925 -0.3394234925 +0.607039978 1.0150549925 -0.3394234925 0.54725 1.0174000245 -0.3454735105 +-0.0768724975 -0.1494255065 0.0684524995 -0.3932944945 -0.1500944975 0.126760498 +-0.3932944945 -0.1500944975 0.126760498 -0.0762330015 -0.1558954925 0.1231364975 +-0.0762330015 -0.1558954925 0.1231364975 -0.0768724975 -0.1494255065 0.0684524995 +-0.586830017 0.1207505035 0.0660270005 -0.58888501 0.1410525055 -0.0650059965 +-0.58888501 0.1410525055 -0.0650059965 -0.207515503 0.1411640015 -0.0706295015 +-0.207515503 0.1411640015 -0.0706295015 -0.586830017 0.1207505035 0.0660270005 +-0.0135162495 0.305924988 0.090643997 -0.075977501 0.307152008 0.084314499 +-0.075977501 0.307152008 0.084314499 -0.0125814 0.307152008 0.0832994995 +-0.0125814 0.307152008 0.0832994995 -0.0135162495 0.305924988 0.090643997 +-0.3722059935 -1.030454956 0.1799774935 -0.372256012 -1.0350300295 0.1930305025 +-0.372256012 -1.0350300295 0.1930305025 -0.3576235045 -1.012830017 0.1762660065 +-0.3576235045 -1.012830017 0.1762660065 -0.3722059935 -1.030454956 0.1799774935 +-0.0762330015 -0.1558954925 0.1231364975 -0.0768724975 -0.1494255065 0.0684524995 +-0.0768724975 -0.1494255065 0.0684524995 -0.0138086995 -0.1494255065 0.067319 +-0.0138086995 -0.1494255065 0.067319 -0.0762330015 -0.1558954925 0.1231364975 +1.5653449705 -0.050814499 -0.130899002 1.5607650145 -0.0673239975 -0.0881500015 +1.5607650145 -0.0673239975 -0.0881500015 1.56623999 -0.0750210035 -0.0883700025 +1.56623999 -0.0750210035 -0.0883700025 1.5653449705 -0.050814499 -0.130899002 +0.2498950045 0.053039501 0.1234970015 0.2399284975 0.071333 0.0080312995 +0.2399284975 0.071333 0.0080312995 0.2614974975 0.0551590005 0.1129179995 +0.2614974975 0.0551590005 0.1129179995 0.2498950045 0.053039501 0.1234970015 +-0.477746002 -0.147306 -0.118800499 -0.4792055055 -0.1347005005 -0.198272995 +-0.4792055055 -0.1347005005 -0.198272995 -0.080080002 -0.1467485045 -0.124640503 +-0.080080002 -0.1467485045 -0.124640503 -0.477746002 -0.147306 -0.118800499 +-0.017911249 -0.3124014895 -0.2428359985 -0.0807854995 -0.3138515015 -0.234779999 +-0.0807854995 -0.3138515015 -0.234779999 -0.0172801 -0.3136285095 -0.2356815035 +-0.0172801 -0.3136285095 -0.2356815035 -0.017911249 -0.3124014895 -0.2428359985 +-0.3977164915 0.1983899995 -0.3013349915 -0.4207785035 0.225496994 -0.3296004945 +-0.4207785035 0.225496994 -0.3296004945 -0.397296997 0.201848007 -0.2947430115 +-0.397296997 0.201848007 -0.2947430115 -0.3977164915 0.1983899995 -0.3013349915 +-0.7046950075 0.1388215025 -0.2783095095 -0.7051550295 0.142614502 -0.3095599975 +-0.7051550295 0.142614502 -0.3095599975 -0.420447998 0.143171997 -0.3134150085 +-0.420447998 0.143171997 -0.3134150085 -0.7046950075 0.1388215025 -0.2783095095 +-0.4139360045 -0.1670505065 0.1427295075 -0.6983200075 -0.1671620025 0.147037506 +-0.6983200075 -0.1671620025 0.147037506 -0.413470001 -0.170843506 0.1737575075 +-0.413470001 -0.170843506 0.1737575075 -0.4139360045 -0.1670505065 0.1427295075 +-0.081086502 -0.1343659975 -0.2044380035 -0.4792055055 -0.1347005005 -0.198272995 +-0.4792055055 -0.1347005005 -0.198272995 -0.080080002 -0.1467485045 -0.124640503 +-0.080080002 -0.1467485045 -0.124640503 -0.081086502 -0.1343659975 -0.2044380035 +0.0980565035 0.069661003 0.0961054995 0.0974524995 0.1208619995 0.0557024995 +0.0974524995 0.1208619995 0.0557024995 0.2443600005 0.0682105025 0.00421904 +0.2443600005 0.0682105025 0.00421904 0.0980565035 0.069661003 0.0961054995 +-0.4196700135 -0.1706204985 -0.2493545075 -0.4203150025 -0.1561185 -0.2771505125 +-0.4203150025 -0.1561185 -0.2771505125 -0.397188507 -0.195272995 -0.2839179995 +-0.397188507 -0.195272995 -0.2839179995 -0.4196700135 -0.1706204985 -0.2493545075 +-0.0761695025 0.130455002 0.0561935005 -0.0771045 0.1293399965 0.0635385015 +-0.0771045 0.1293399965 0.0635385015 -0.014045 0.1300090025 0.0626274985 +-0.014045 0.1300090025 0.0626274985 -0.0761695025 0.130455002 0.0561935005 +-0.420441498 -0.1610265045 -0.3083940125 -0.3973714905 -0.196723007 -0.2911744995 +-0.3973714905 -0.196723007 -0.2911744995 -0.39726651 -0.2019660035 -0.296192993 +-0.39726651 -0.2019660035 -0.296192993 -0.420441498 -0.1610265045 -0.3083940125 +0.2399284975 0.071333 0.0080312995 0.228554001 0.069102997 0.018392851 +0.228554001 0.069102997 0.018392851 0.2498950045 0.053039501 0.1234970015 +0.2498950045 0.053039501 0.1234970015 0.2399284975 0.071333 0.0080312995 +-0.704710022 0.236875 -0.267040497 -0.7052800295 0.240779495 -0.2982940065 +-0.7052800295 0.240779495 -0.2982940065 -0.4204609985 0.2408910065 -0.302145996 +-0.4204609985 0.2408910065 -0.302145996 -0.704710022 0.236875 -0.267040497 +-0.080373001 -0.137600998 -0.2065429995 -0.0807854995 -0.3138515015 -0.234779999 +-0.0807854995 -0.3138515015 -0.234779999 -0.0172801 -0.3136285095 -0.2356815035 +-0.0172801 -0.3136285095 -0.2356815035 -0.080373001 -0.137600998 -0.2065429995 +-0.0814024965 0.295885498 -0.2426035005 -0.479467499 0.4300815125 -0.2017369995 +-0.479467499 0.4300815125 -0.2017369995 -0.0808030015 0.4300815125 -0.2073329925 +-0.0808030015 0.4300815125 -0.2073329925 -0.0814024965 0.295885498 -0.2426035005 +-0.101592499 -0.3295805055 -0.152315506 -0.5661550295 -0.3328154905 -0.1274585035 +-0.5661550295 -0.3328154905 -0.1274585035 -0.1007614975 -0.143848007 -0.1227304995 +-0.1007614975 -0.143848007 -0.1227304995 -0.101592499 -0.3295805055 -0.152315506 +-0.3982254945 -1.0250999755 -0.298333496 -0.3982879945 -1.0388199465 -0.30067749 +-0.3982879945 -1.0388199465 -0.30067749 -0.379359009 -1.025214966 -0.2988305055 +-0.379359009 -1.025214966 -0.2988305055 -0.3982254945 -1.0250999755 -0.298333496 +-0.5661550295 -0.3328154905 -0.1274585035 -0.1010739975 -0.3328154905 -0.1344524995 +-0.1010739975 -0.3328154905 -0.1344524995 -0.1007614975 -0.143848007 -0.1227304995 +-0.1007614975 -0.143848007 -0.1227304995 -0.5661550295 -0.3328154905 -0.1274585035 +-0.0194851 -0.238220001 -0.316842987 -0.0823895035 -0.183783493 -0.3073380125 +-0.0823895035 -0.183783493 -0.3073380125 -0.0194443495 -0.1836714935 -0.308139496 +-0.0194443495 -0.1836714935 -0.308139496 -0.0194851 -0.238220001 -0.316842987 +-0.081139 1.046959961 0.1176784975 -0.358160492 1.01561499 0.1166735 +-0.358160492 1.01561499 0.1166735 -0.0810410005 1.0157249755 0.1129940035 +-0.0810410005 1.0157249755 0.1129940035 -0.081139 1.046959961 0.1176784975 +-0.366709015 -0.0489177015 0.0920045015 -0.277825012 -0.0219785005 0.1059714965 +-0.277825012 -0.0219785005 0.1059714965 -0.2207765045 -0.03890625 0.095060997 +-0.2207765045 -0.03890625 0.095060997 -0.366709015 -0.0489177015 0.0920045015 +-0.3644035035 1.005460022 -0.293719513 -0.3647929995 0.984715027 -0.3177164915 +-0.3647929995 0.984715027 -0.3177164915 -0.0872699965 1.0056849975 -0.298067993 +-0.0872699965 1.0056849975 -0.298067993 -0.3644035035 1.005460022 -0.293719513 +-0.2058014985 -0.1342545015 0.0606189995 -0.586169983 -0.075578499 0.108996498 +-0.586169983 -0.075578499 0.108996498 -0.2051275025 -0.0751324995 0.1030319975 +-0.2051275025 -0.0751324995 0.1030319975 -0.2058014985 -0.1342545015 0.0606189995 +-0.5661550295 -0.3328154905 -0.1274585035 -0.1010739975 -0.3328154905 -0.1344524995 +-0.1010739975 -0.3328154905 -0.1344524995 -0.100580002 -0.1466369935 -0.1047630005 +-0.100580002 -0.1466369935 -0.1047630005 -0.5661550295 -0.3328154905 -0.1274585035 +-0.0814189985 -0.3126245115 -0.2418224945 -0.0181679 -0.136151001 -0.214612503 +-0.0181679 -0.136151001 -0.214612503 -0.017911249 -0.3124014895 -0.2428359985 +-0.017911249 -0.3124014895 -0.2428359985 -0.0814189985 -0.3126245115 -0.2418224945 +-0.5661550295 -0.3328154905 -0.1274585035 -0.1025009995 -1.078755005 -0.2527525025 +-0.1025009995 -1.078755005 -0.2527525025 -0.1010739975 -0.3328154905 -0.1344524995 +-0.1010739975 -0.3328154905 -0.1344524995 -0.5661550295 -0.3328154905 -0.1274585035 +-0.357902008 -1.033579956 0.1522714995 -0.3722059935 -1.030454956 0.1799774935 +-0.3722059935 -1.030454956 0.1799774935 -0.3576235045 -1.012830017 0.1762660065 +-0.3576235045 -1.012830017 0.1762660065 -0.357902008 -1.033579956 0.1522714995 +-0.479736511 -0.3113974915 -0.226177994 -0.0813919985 -0.3110629885 -0.2324494935 +-0.0813919985 -0.3110629885 -0.2324494935 -0.080080002 -0.1467485045 -0.124640503 +-0.080080002 -0.1467485045 -0.124640503 -0.479736511 -0.3113974915 -0.226177994 +-0.479736511 -0.3113974915 -0.226177994 -0.0813919985 -0.3110629885 -0.2324494935 +-0.0813919985 -0.3110629885 -0.2324494935 -0.081086502 -0.1343659975 -0.2044380035 +-0.081086502 -0.1343659975 -0.2044380035 -0.479736511 -0.3113974915 -0.226177994 +-0.079397499 -0.2659964905 -0.141251007 -0.0799229965 -0.3050390015 -0.1800905 +-0.0799229965 -0.3050390015 -0.1800905 -0.0162316 -0.2659964905 -0.1419360045 +-0.0162316 -0.2659964905 -0.1419360045 -0.079397499 -0.2659964905 -0.141251007 +-0.479467499 0.4300815125 -0.2017369995 -0.479845001 0.2959970095 -0.237003006 +-0.479845001 0.2959970095 -0.237003006 -0.0814024965 0.295885498 -0.2426035005 +-0.0814024965 0.295885498 -0.2426035005 -0.479467499 0.4300815125 -0.2017369995 +-0.586169983 -0.075578499 0.108996498 -0.5867249755 -0.1349234925 0.066251999 +-0.5867249755 -0.1349234925 0.066251999 -0.2058014985 -0.1342545015 0.0606189995 +-0.2058014985 -0.1342545015 0.0606189995 -0.586169983 -0.075578499 0.108996498 +-0.3722059935 -1.030454956 0.1799774935 -0.3727669985 -1.0392700195 0.1694774935 +-0.3727669985 -1.0392700195 0.1694774935 -0.357902008 -1.033579956 0.1522714995 +-0.357902008 -1.033579956 0.1522714995 -0.3722059935 -1.030454956 0.1799774935 +-0.3572795105 1.038369995 0.175826996 -0.357734497 1.0070250245 0.170908005 +-0.357734497 1.0070250245 0.170908005 -0.0804990005 1.0070250245 0.1670079955 +-0.0804990005 1.0070250245 0.1670079955 -0.3572795105 1.038369995 0.175826996 +-0.397890991 -1.042505005 -0.2770150145 -0.397935486 -1.0287800295 -0.274896515 +-0.397935486 -1.0287800295 -0.274896515 -0.379361511 -1.042170044 -0.2774079895 +-0.379361511 -1.042170044 -0.2774079895 -0.397890991 -1.042505005 -0.2770150145 +-0.079439499 0.199616501 -0.1392435 -0.0796204985 0.1496419985 -0.162566498 +-0.0796204985 0.1496419985 -0.162566498 -0.0163334505 0.1495305025 -0.1636954955 +-0.0163334505 0.1495305025 -0.1636954955 -0.079439499 0.199616501 -0.1392435 +-0.0173365 0.1230930025 -0.211694 -0.0796204985 0.1496419985 -0.162566498 +-0.0796204985 0.1496419985 -0.162566498 -0.0163334505 0.1495305025 -0.1636954955 +-0.0163334505 0.1495305025 -0.1636954955 -0.0173365 0.1230930025 -0.211694 +-0.081001503 -0.136151001 -0.213808502 -0.0814189985 -0.3126245115 -0.2418224945 +-0.0814189985 -0.3126245115 -0.2418224945 -0.0181679 -0.136151001 -0.214612503 +-0.0181679 -0.136151001 -0.214612503 -0.081001503 -0.136151001 -0.213808502 +-0.3733554995 1.022085022 0.1336495055 -0.373402008 1.035579956 0.135880005 +-0.373402008 1.035579956 0.135880005 -0.3582674865 1.0470699465 0.1218034975 +-0.3582674865 1.0470699465 0.1218034975 -0.3733554995 1.022085022 0.1336495055 +-0.399938507 0.2138954925 -0.3177835085 -0.3997575075 0.263869995 -0.2944599915 +-0.3997575075 0.263869995 -0.2944599915 -0.082088501 0.270229004 -0.3004140015 +-0.082088501 0.270229004 -0.3004140015 -0.399938507 0.2138954925 -0.3177835085 +-0.0163334505 0.1495305025 -0.1636954955 -0.079439499 0.199616501 -0.1392435 +-0.079439499 0.199616501 -0.1392435 -0.016150049 0.1997285005 -0.1404839935 +-0.016150049 0.1997285005 -0.1404839935 -0.0163334505 0.1495305025 -0.1636954955 +-0.0162316 -0.2659964905 -0.1419360045 -0.079397499 -0.2659964905 -0.141251007 +-0.079397499 -0.2659964905 -0.141251007 -0.0159628495 -0.2115590055 -0.1334505005 +-0.0159628495 -0.2115590055 -0.1334505005 -0.0162316 -0.2659964905 -0.1419360045 +-0.5908449705 -0.0108788995 -0.221699005 -0.2100370025 -0.01054445 -0.2272225035 +-0.2100370025 -0.01054445 -0.2272225035 -0.2095735015 0.122199997 -0.196083496 +-0.2095735015 0.122199997 -0.196083496 -0.5908449705 -0.0108788995 -0.221699005 +-0.080778 -1.033579956 0.1483690035 -0.3576235045 -1.012830017 0.1762660065 +-0.3576235045 -1.012830017 0.1762660065 -0.080165001 -1.012830017 0.172371002 +-0.080165001 -1.012830017 0.172371002 -0.080778 -1.033579956 0.1483690035 +-0.479736511 -0.3113974915 -0.226177994 -0.477746002 -0.147306 -0.118800499 +-0.477746002 -0.147306 -0.118800499 -0.080080002 -0.1467485045 -0.124640503 +-0.080080002 -0.1467485045 -0.124640503 -0.479736511 -0.3113974915 -0.226177994 +-0.0194443495 -0.1836714935 -0.308139496 -0.0819830015 -0.1444055025 -0.268166504 +-0.0819830015 -0.1444055025 -0.268166504 -0.018921301 -0.1445169985 -0.2691889955 +-0.018921301 -0.1445169985 -0.2691889955 -0.0194443495 -0.1836714935 -0.308139496 +-0.3576235045 -1.012830017 0.1762660065 -0.357902008 -1.033579956 0.1522714995 +-0.357902008 -1.033579956 0.1522714995 -0.080778 -1.033579956 0.1483690035 +-0.080778 -1.033579956 0.1483690035 -0.3576235045 -1.012830017 0.1762660065 +-0.364871002 1.046959961 -0.3299914855 -0.3653745115 1.026209961 -0.353878998 +-0.3653745115 1.026209961 -0.353878998 -0.088132004 1.026209961 -0.358113495 +-0.088132004 1.026209961 -0.358113495 -0.364871002 1.046959961 -0.3299914855 +-0.5906049805 0.1224235 -0.190675995 -0.5908449705 -0.0108788995 -0.221699005 +-0.5908449705 -0.0108788995 -0.221699005 -0.2095735015 0.122199997 -0.196083496 +-0.2095735015 0.122199997 -0.196083496 -0.5906049805 0.1224235 -0.190675995 +-0.01880385 0.2698940125 -0.301431488 -0.082088501 0.270229004 -0.3004140015 +-0.082088501 0.270229004 -0.3004140015 -0.0184746495 0.296889496 -0.253223999 +-0.0184746495 0.296889496 -0.253223999 -0.01880385 0.2698940125 -0.301431488 +-0.4759129945 0.440902008 0.0280716 -0.476396515 0.3170799865 0.00853545 +-0.476396515 0.3170799865 0.00853545 -0.077947502 0.316968506 0.002600245 +-0.077947502 0.316968506 0.002600245 -0.4759129945 0.440902008 0.0280716 +-0.5908449705 -0.0108788995 -0.221699005 -0.617460022 0.1037945025 -0.170932007 +-0.617460022 0.1037945025 -0.170932007 -0.5906049805 0.1224235 -0.190675995 +-0.5906049805 0.1224235 -0.190675995 -0.5908449705 -0.0108788995 -0.221699005 +-0.0769404985 -0.1774244995 0.0131091995 -0.0774560015 -0.2273995055 -0.0102207005 +-0.0774560015 -0.2273995055 -0.0102207005 -0.01376495 -0.177647995 0.0119779995 +-0.01376495 -0.177647995 0.0119779995 -0.0769404985 -0.1774244995 0.0131091995 +-0.0774560015 -0.2273995055 -0.0102207005 -0.01395065 -0.2276224975 -0.0111220505 +-0.01395065 -0.2276224975 -0.0111220505 -0.01376495 -0.177647995 0.0119779995 +-0.01376495 -0.177647995 0.0119779995 -0.0774560015 -0.2273995055 -0.0102207005 +-0.077367996 0.2596315 -0.00910285 -0.077415497 0.204859497 -0.017472151 +-0.077415497 0.204859497 -0.017472151 -0.01434715 0.204859497 -0.0188286495 +-0.01434715 0.204859497 -0.0188286495 -0.077367996 0.2596315 -0.00910285 +-0.088132004 1.026209961 -0.358113495 -0.364871002 1.046959961 -0.3299914855 +-0.364871002 1.046959961 -0.3299914855 -0.0878539965 1.0468449705 -0.334118988 +-0.0878539965 1.0468449705 -0.334118988 -0.088132004 1.026209961 -0.358113495 +-0.5650200195 0.140272003 -0.0378393515 -0.564409973 0.3264505005 -0.0082591 +-0.564409973 0.3264505005 -0.0082591 -0.0998320005 0.140494995 -0.044608101 +-0.0998320005 0.140494995 -0.044608101 -0.5650200195 0.140272003 -0.0378393515 +-0.076619499 0.298450989 0.029740999 -0.077367996 0.2596315 -0.00910285 +-0.077367996 0.2596315 -0.00910285 -0.01419695 0.259519989 -0.0100112 +-0.01419695 0.259519989 -0.0100112 -0.076619499 0.298450989 0.029740999 +-0.01434715 0.204859497 -0.0188286495 -0.077367996 0.2596315 -0.00910285 +-0.077367996 0.2596315 -0.00910285 -0.01419695 0.259519989 -0.0100112 +-0.01419695 0.259519989 -0.0100112 -0.01434715 0.204859497 -0.0188286495 +-0.358160492 1.01561499 0.1166735 -0.3582674865 1.0470699465 0.1218034975 +-0.3582674865 1.0470699465 0.1218034975 -0.081139 1.046959961 0.1176784975 +-0.081139 1.046959961 0.1176784975 -0.358160492 1.01561499 0.1166735 +-0.4788349915 -0.323890991 -0.146716995 -0.478869995 -0.4476015015 -0.1663549955 +-0.478869995 -0.4476015015 -0.1663549955 -0.0801604995 -0.3236679995 -0.152759506 +-0.0801604995 -0.3236679995 -0.152759506 -0.4788349915 -0.323890991 -0.146716995 +-0.4131514895 0.1771950075 0.1905 -0.6980949705 0.177083496 0.194908005 +-0.6980949705 0.177083496 0.194908005 -0.412921997 0.2087640075 0.195526001 +-0.412921997 0.2087640075 0.195526001 -0.4131514895 0.1771950075 0.1905 +-0.080529999 -0.447155487 -0.172404495 -0.478869995 -0.4476015015 -0.1663549955 +-0.478869995 -0.4476015015 -0.1663549955 -0.0801604995 -0.3236679995 -0.152759506 +-0.0801604995 -0.3236679995 -0.152759506 -0.080529999 -0.447155487 -0.172404495 +-0.5650200195 0.140272003 -0.0378393515 -0.564409973 0.3264505005 -0.0082591 +-0.564409973 0.3264505005 -0.0082591 -0.0996504975 0.1372599945 -0.0266406995 +-0.0996504975 0.1372599945 -0.0266406995 -0.5650200195 0.140272003 -0.0378393515 +-0.0816504975 0.297001007 -0.252092499 -0.082088501 0.270229004 -0.3004140015 +-0.082088501 0.270229004 -0.3004140015 -0.0184746495 0.296889496 -0.253223999 +-0.0184746495 0.296889496 -0.253223999 -0.0816504975 0.297001007 -0.252092499 +-0.3646839905 -1.0451800535 -0.317602997 -0.3795400085 -1.038709961 -0.300842987 +-0.3795400085 -1.038709961 -0.300842987 -0.3645660095 -1.0139450075 -0.31257901 +-0.3645660095 -1.0139450075 -0.31257901 -0.3646839905 -1.0451800535 -0.317602997 +-0.6981849975 -0.2533910065 0.193901993 -0.4137894895 -0.2685620115 0.162369995 +-0.4137894895 -0.2685620115 0.162369995 -0.413251007 -0.253279495 0.189940506 +-0.413251007 -0.253279495 0.189940506 -0.6981849975 -0.2533910065 0.193901993 +-0.399493988 -0.177871002 -0.3017070005 -0.399762512 -0.2323079985 -0.310192505 +-0.399762512 -0.2323079985 -0.310192505 -0.082878998 -0.238220001 -0.315939514 +-0.082878998 -0.238220001 -0.315939514 -0.399493988 -0.177871002 -0.3017070005 +-0.398870514 0.2906424865 -0.2462409975 -0.3997575075 0.263869995 -0.2944599915 +-0.3997575075 0.263869995 -0.2944599915 -0.0816504975 0.297001007 -0.252092499 +-0.0816504975 0.297001007 -0.252092499 -0.398870514 0.2906424865 -0.2462409975 +-0.0172801 -0.3136285095 -0.2356815035 -0.080373001 -0.137600998 -0.2065429995 +-0.080373001 -0.137600998 -0.2065429995 -0.017202299 -0.1372660065 -0.2074515075 +-0.017202299 -0.1372660065 -0.2074515075 -0.0172801 -0.3136285095 -0.2356815035 +-0.6979050295 -0.224610504 0.207185501 -0.6981849975 -0.2533910065 0.193901993 +-0.6981849975 -0.2533910065 0.193901993 -0.413251007 -0.253279495 0.189940506 +-0.413251007 -0.253279495 0.189940506 -0.6979050295 -0.224610504 0.207185501 +-0.0796204985 0.1496419985 -0.162566498 -0.0802819975 0.1226464995 -0.210892502 +-0.0802819975 0.1226464995 -0.210892502 -0.0173365 0.1230930025 -0.211694 +-0.0173365 0.1230930025 -0.211694 -0.0796204985 0.1496419985 -0.162566498 +-0.0814189985 -0.3126245115 -0.2418224945 -0.398976013 -0.306601013 -0.235866501 +-0.398976013 -0.306601013 -0.235866501 -0.081001503 -0.136151001 -0.213808502 +-0.081001503 -0.136151001 -0.213808502 -0.0814189985 -0.3126245115 -0.2418224945 +-0.698174988 -0.2690085145 0.1666775055 -0.6981849975 -0.2533910065 0.193901993 +-0.6981849975 -0.2533910065 0.193901993 -0.4137894895 -0.2685620115 0.162369995 +-0.4137894895 -0.2685620115 0.162369995 -0.698174988 -0.2690085145 0.1666775055 +-0.3582674865 1.0470699465 0.1218034975 -0.3733554995 1.022085022 0.1336495055 +-0.3733554995 1.022085022 0.1336495055 -0.358160492 1.01561499 0.1166735 +-0.358160492 1.01561499 0.1166735 -0.3582674865 1.0470699465 0.1218034975 +-0.477746002 -0.147306 -0.118800499 -0.4788349915 -0.323890991 -0.146716995 +-0.4788349915 -0.323890991 -0.146716995 -0.080080002 -0.1467485045 -0.124640503 +-0.080080002 -0.1467485045 -0.124640503 -0.477746002 -0.147306 -0.118800499 +-0.379359009 -1.025214966 -0.2988305055 -0.3795400085 -1.038709961 -0.300842987 +-0.3795400085 -1.038709961 -0.300842987 -0.3645660095 -1.0139450075 -0.31257901 +-0.3645660095 -1.0139450075 -0.31257901 -0.379359009 -1.025214966 -0.2988305055 +-0.0819830015 -0.1444055025 -0.268166504 -0.0823895035 -0.183783493 -0.3073380125 +-0.0823895035 -0.183783493 -0.3073380125 -0.0194443495 -0.1836714935 -0.308139496 +-0.0194443495 -0.1836714935 -0.308139496 -0.0819830015 -0.1444055025 -0.268166504 +-0.380924011 -1.076079956 -0.266730011 -0.5665650025 -0.3301380005 -0.145319 +-0.5665650025 -0.3301380005 -0.145319 -0.102680496 -1.0761899415 -0.2708315125 +-0.102680496 -1.0761899415 -0.2708315125 -0.380924011 -1.076079956 -0.266730011 +-0.565840027 -0.1442944945 -0.115959503 -0.5661550295 -0.3328154905 -0.1274585035 +-0.5661550295 -0.3328154905 -0.1274585035 -0.1007614975 -0.143848007 -0.1227304995 +-0.1007614975 -0.143848007 -0.1227304995 -0.565840027 -0.1442944945 -0.115959503 +-0.0840455015 1.010705017 -0.3348200075 0.54725 1.0174000245 -0.3454735105 +0.54725 1.0174000245 -0.3454735105 0.5474699705 1.0223049925 -0.340002014 +0.5474699705 1.0223049925 -0.340002014 -0.0840455015 1.010705017 -0.3348200075 +-0.413467499 0.154326996 0.168290497 -0.698409973 0.1542155 0.172586502 +-0.698409973 0.1542155 0.172586502 -0.4131514895 0.1771950075 0.1905 +-0.4131514895 0.1771950075 0.1905 -0.413467499 0.154326996 0.168290497 +-0.380744995 -1.078755005 -0.2486504975 -0.5661550295 -0.3328154905 -0.1274585035 +-0.5661550295 -0.3328154905 -0.1274585035 -0.1025009995 -1.078755005 -0.2527525025 +-0.1025009995 -1.078755005 -0.2527525025 -0.380744995 -1.078755005 -0.2486504975 +-0.0827155 0.220031006 -0.3237464905 -0.01921245 0.2199194945 -0.3245360105 +-0.01921245 0.2199194945 -0.3245360105 -0.01880385 0.2698940125 -0.301431488 +-0.01880385 0.2698940125 -0.301431488 -0.0827155 0.220031006 -0.3237464905 +-0.082088501 0.270229004 -0.3004140015 -0.0827155 0.220031006 -0.3237464905 +-0.0827155 0.220031006 -0.3237464905 -0.01880385 0.2698940125 -0.301431488 +-0.01880385 0.2698940125 -0.301431488 -0.082088501 0.270229004 -0.3004140015 +-0.5665650025 -0.3301380005 -0.145319 -0.565840027 -0.1442944945 -0.115959503 +-0.565840027 -0.1442944945 -0.115959503 -0.1007614975 -0.143848007 -0.1227304995 +-0.1007614975 -0.143848007 -0.1227304995 -0.5665650025 -0.3301380005 -0.145319 +-0.0823895035 -0.183783493 -0.3073380125 -0.082878998 -0.238220001 -0.315939514 +-0.082878998 -0.238220001 -0.315939514 -0.0194851 -0.238220001 -0.316842987 +-0.0194851 -0.238220001 -0.316842987 -0.0823895035 -0.183783493 -0.3073380125 +-0.0764925005 -1.0364799805 0.1781380005 -0.076600998 -1.0412750245 0.172668503 +-0.076600998 -1.0412750245 0.172668503 0.554994995 -1.036255005 0.1689389955 +0.554994995 -1.036255005 0.1689389955 -0.0764925005 -1.0364799805 0.1781380005 +-0.0804990005 1.0070250245 0.1670079955 -0.3572795105 1.038369995 0.175826996 +-0.3572795105 1.038369995 0.175826996 -0.080376503 1.0385949705 0.171808502 +-0.080376503 1.0385949705 0.171808502 -0.0804990005 1.0070250245 0.1670079955 +-0.5665650025 -0.3301380005 -0.145319 -0.102680496 -1.0761899415 -0.2708315125 +-0.102680496 -1.0761899415 -0.2708315125 -0.101592499 -0.3295805055 -0.152315506 +-0.101592499 -0.3295805055 -0.152315506 -0.5665650025 -0.3301380005 -0.145319 +-0.3645660095 -1.0139450075 -0.31257901 -0.3646839905 -1.0451800535 -0.317602997 +-0.3646839905 -1.0451800535 -0.317602997 -0.087430496 -1.013835022 -0.3170390015 +-0.087430496 -1.013835022 -0.3170390015 -0.3645660095 -1.0139450075 -0.31257901 +-0.564409973 0.3264505005 -0.0082591 -0.099223999 0.326004486 -0.01502785 +-0.099223999 0.326004486 -0.01502785 -0.097348503 1.0722800295 0.1031695025 +-0.097348503 1.0722800295 0.1031695025 -0.564409973 0.3264505005 -0.0082591 +-0.564455017 0.323104004 0.0098149005 -0.5647299805 0.1372599945 -0.0196467 +-0.5647299805 0.1372599945 -0.0196467 -0.0996504975 0.1372599945 -0.0266406995 +-0.0996504975 0.1372599945 -0.0266406995 -0.564455017 0.323104004 0.0098149005 +-0.564409973 0.3264505005 -0.0082591 -0.5647299805 0.1372599945 -0.0196467 +-0.5647299805 0.1372599945 -0.0196467 -0.0996504975 0.1372599945 -0.0266406995 +-0.0996504975 0.1372599945 -0.0266406995 -0.564409973 0.3264505005 -0.0082591 +-0.5665650025 -0.3301380005 -0.145319 -0.101592499 -0.3295805055 -0.152315506 +-0.101592499 -0.3295805055 -0.152315506 -0.1007614975 -0.143848007 -0.1227304995 +-0.1007614975 -0.143848007 -0.1227304995 -0.5665650025 -0.3301380005 -0.145319 +0.547919983 -1.037704956 -0.297593506 -0.0835910035 -1.031125 -0.2872795105 +-0.0835910035 -1.031125 -0.2872795105 0.548119995 -1.030454956 -0.296473999 +0.548119995 -1.030454956 -0.296473999 0.547919983 -1.037704956 -0.297593506 +-0.364023987 -1.022424988 -0.2585650025 -0.0866764985 -1.053660034 -0.267818512 +-0.0866764985 -1.053660034 -0.267818512 -0.0865565035 -1.0226450195 -0.262907013 +-0.0865565035 -1.0226450195 -0.262907013 -0.364023987 -1.022424988 -0.2585650025 +-0.0878809965 0.984825012 -0.322181 -0.3647929995 0.984715027 -0.3177164915 +-0.3647929995 0.984715027 -0.3177164915 -0.0872699965 1.0056849975 -0.298067993 +-0.0872699965 1.0056849975 -0.298067993 -0.0878809965 0.984825012 -0.322181 +-0.398761505 1.029334961 -0.326015503 -0.398878998 1.020075012 -0.3363940125 +-0.398878998 1.020075012 -0.3363940125 -0.3801264955 1.0201849975 -0.336782501 +-0.3801264955 1.0201849975 -0.336782501 -0.398761505 1.029334961 -0.326015503 +-0.014045 0.1300090025 0.0626274985 -0.0763499985 0.305924988 0.091447998 +-0.0763499985 0.305924988 0.091447998 -0.0135162495 0.305924988 0.090643997 +-0.0135162495 0.305924988 0.090643997 -0.014045 0.1300090025 0.0626274985 +-0.414251007 -0.1823329925 0.115163498 -0.698755005 -0.182556 0.119804001 +-0.698755005 -0.182556 0.119804001 -0.4139360045 -0.1670505065 0.1427295075 +-0.4139360045 -0.1670505065 0.1427295075 -0.414251007 -0.1823329925 0.115163498 +-0.476396515 0.3170799865 0.00853545 -0.0785835035 0.1407180025 -0.0256418 +-0.0785835035 0.1407180025 -0.0256418 -0.077947502 0.316968506 0.002600245 +-0.077947502 0.316968506 0.002600245 -0.476396515 0.3170799865 0.00853545 +-0.6983200075 -0.1671620025 0.147037506 -0.698755005 -0.182556 0.119804001 +-0.698755005 -0.182556 0.119804001 -0.4139360045 -0.1670505065 0.1427295075 +-0.4139360045 -0.1670505065 0.1427295075 -0.6983200075 -0.1671620025 0.147037506 +-0.0758130035 -0.297788513 0.151039505 -0.0762490005 -0.3247839965 0.102607498 +-0.0762490005 -0.3247839965 0.102607498 -0.0130736 -0.324449005 0.1014765015 +-0.0130736 -0.324449005 0.1014765015 -0.0758130035 -0.297788513 0.151039505 +-0.475049011 0.304475006 0.088005501 -0.4762585145 0.140494995 -0.0193554495 +-0.4762585145 0.140494995 -0.0193554495 -0.0785835035 0.1407180025 -0.0256418 +-0.0785835035 0.1407180025 -0.0256418 -0.475049011 0.304475006 0.088005501 +-0.0799229965 -0.3050390015 -0.1800905 -0.0164174995 -0.3048160095 -0.180991501 +-0.0164174995 -0.3048160095 -0.180991501 -0.0162316 -0.2659964905 -0.1419360045 +-0.0162316 -0.2659964905 -0.1419360045 -0.0799229965 -0.3050390015 -0.1800905 +-0.4143890075 0.224158005 0.1004329985 -0.6989050295 0.246580002 0.126941498 +-0.6989050295 0.246580002 0.126941498 -0.4140755005 0.2463569945 0.1227545015 +-0.4140755005 0.2463569945 0.1227545015 -0.4143890075 0.224158005 0.1004329985 +-0.397935486 -1.0287800295 -0.274896515 -0.379361511 -1.042170044 -0.2774079895 +-0.379361511 -1.042170044 -0.2774079895 -0.378959503 -1.0288950195 -0.275279999 +-0.378959503 -1.0288950195 -0.275279999 -0.397935486 -1.0287800295 -0.274896515 +-0.3653745115 1.026209961 -0.353878998 -0.3800180055 1.029334961 -0.325957489 +-0.3800180055 1.029334961 -0.325957489 -0.364871002 1.046959961 -0.3299914855 +-0.364871002 1.046959961 -0.3299914855 -0.3653745115 1.026209961 -0.353878998 +-0.075977501 0.307152008 0.084314499 -0.0761695025 0.130455002 0.0561935005 +-0.0761695025 0.130455002 0.0561935005 -0.0125814 0.307152008 0.0832994995 +-0.0125814 0.307152008 0.0832994995 -0.075977501 0.307152008 0.084314499 +-0.399938507 0.2138954925 -0.3177835085 -0.0827155 0.220031006 -0.3237464905 +-0.0827155 0.220031006 -0.3237464905 -0.082088501 0.270229004 -0.3004140015 +-0.082088501 0.270229004 -0.3004140015 -0.399938507 0.2138954925 -0.3177835085 +-0.0132262 0.1311244965 0.055503502 -0.0761695025 0.130455002 0.0561935005 +-0.0761695025 0.130455002 0.0561935005 -0.0125814 0.307152008 0.0832994995 +-0.0125814 0.307152008 0.0832994995 -0.0132262 0.1311244965 0.055503502 +-0.075609001 0.1771950075 0.1572920075 -0.0761255035 0.137929001 0.1180065 +-0.0761255035 0.137929001 0.1180065 -0.0122130005 0.177083496 0.1562765045 +-0.0122130005 0.177083496 0.1562765045 -0.075609001 0.1771950075 0.1572920075 +-0.3800180055 1.029334961 -0.325957489 -0.3801264955 1.0201849975 -0.336782501 +-0.3801264955 1.0201849975 -0.336782501 -0.3653745115 1.026209961 -0.353878998 +-0.3653745115 1.026209961 -0.353878998 -0.3800180055 1.029334961 -0.325957489 +-0.0761255035 0.137929001 0.1180065 -0.0130681495 0.138375 0.1172074965 +-0.0130681495 0.138375 0.1172074965 -0.0122130005 0.177083496 0.1562765045 +-0.0122130005 0.177083496 0.1562765045 -0.0761255035 0.137929001 0.1180065 +-0.079397499 -0.2659964905 -0.141251007 -0.079475502 -0.2115590055 -0.1322149965 +-0.079475502 -0.2115590055 -0.1322149965 -0.0159628495 -0.2115590055 -0.1334505005 +-0.0159628495 -0.2115590055 -0.1334505005 -0.079397499 -0.2659964905 -0.141251007 +-0.0754089965 -0.2480370025 0.1743674925 -0.0758130035 -0.297788513 0.151039505 +-0.0758130035 -0.297788513 0.151039505 -0.0125284995 -0.298122986 0.150022003 +-0.0125284995 -0.298122986 0.150022003 -0.0754089965 -0.2480370025 0.1743674925 +-0.0130736 -0.324449005 0.1014765015 -0.0758130035 -0.297788513 0.151039505 +-0.0758130035 -0.297788513 0.151039505 -0.0125284995 -0.298122986 0.150022003 +-0.0125284995 -0.298122986 0.150022003 -0.0130736 -0.324449005 0.1014765015 +-0.6991450195 -0.211671005 0.1066299975 -0.4144265135 -0.2113359985 0.102217499 +-0.4144265135 -0.2113359985 0.102217499 -0.414251007 -0.1823329925 0.115163498 +-0.414251007 -0.1823329925 0.115163498 -0.6991450195 -0.211671005 0.1066299975 +-0.698755005 -0.182556 0.119804001 -0.6991450195 -0.211671005 0.1066299975 +-0.6991450195 -0.211671005 0.1066299975 -0.414251007 -0.1823329925 0.115163498 +-0.414251007 -0.1823329925 0.115163498 -0.698755005 -0.182556 0.119804001 +-0.414620514 0.1922545015 0.0955195005 -0.6992199705 0.2239349975 0.1047320025 +-0.6992199705 0.2239349975 0.1047320025 -0.4143890075 0.224158005 0.1004329985 +-0.4143890075 0.224158005 0.1004329985 -0.414620514 0.1922545015 0.0955195005 +-0.6989050295 0.246580002 0.126941498 -0.6992199705 0.2239349975 0.1047320025 +-0.6992199705 0.2239349975 0.1047320025 -0.4143890075 0.224158005 0.1004329985 +-0.4143890075 0.224158005 0.1004329985 -0.6989050295 0.246580002 0.126941498 +-0.075449997 0.231632004 0.165663498 -0.075609001 0.1771950075 0.1572920075 +-0.075609001 0.1771950075 0.1572920075 -0.0121675995 0.2314089965 0.1647575075 +-0.0121675995 0.2314089965 0.1647575075 -0.075449997 0.231632004 0.165663498 +-0.0122130005 0.177083496 0.1562765045 -0.075609001 0.1771950075 0.1572920075 +-0.075609001 0.1771950075 0.1572920075 -0.0121675995 0.2314089965 0.1647575075 +-0.0121675995 0.2314089965 0.1647575075 -0.0122130005 0.177083496 0.1562765045 +-0.0125284995 -0.298122986 0.150022003 -0.0754089965 -0.2480370025 0.1743674925 +-0.0754089965 -0.2480370025 0.1743674925 -0.0123405 -0.2480370025 0.173010498 +-0.0123405 -0.2480370025 0.173010498 -0.0125284995 -0.298122986 0.150022003 +-0.6992199705 0.2239349975 0.1047320025 -0.6994450075 0.1919194945 0.0995944975 +-0.6994450075 0.1919194945 0.0995944975 -0.414620514 0.1922545015 0.0955195005 +-0.414620514 0.1922545015 0.0955195005 -0.6992199705 0.2239349975 0.1047320025 +-0.4194179995 -0.230746002 -0.240088501 -0.7042349855 -0.230746002 -0.2363475035 +-0.7042349855 -0.230746002 -0.2363475035 -0.4192974855 -0.1992890015 -0.2351764985 +-0.4192974855 -0.1992890015 -0.2351764985 -0.4194179995 -0.230746002 -0.240088501 +-0.4196619875 0.154661499 -0.2550444945 -0.7043099975 0.183107498 -0.238022995 +-0.7043099975 0.183107498 -0.238022995 -0.419601013 0.183218994 -0.2419889985 +-0.419601013 0.183218994 -0.2419889985 -0.4196619875 0.154661499 -0.2550444945 +-0.7042349855 -0.230746002 -0.2363475035 -0.7043449705 -0.1995119935 -0.231216995 +-0.7043449705 -0.1995119935 -0.231216995 -0.4192974855 -0.1992890015 -0.2351764985 +-0.4192974855 -0.1992890015 -0.2351764985 -0.7042349855 -0.230746002 -0.2363475035 +-0.3646839905 -1.0451800535 -0.317602997 -0.0876624985 -1.0450699465 -0.321953491 +-0.0876624985 -1.0450699465 -0.321953491 -0.087430496 -1.013835022 -0.3170390015 +-0.087430496 -1.013835022 -0.3170390015 -0.3646839905 -1.0451800535 -0.317602997 +-0.704549988 -0.2535025025 -0.258557495 -0.4197265015 -0.2535025025 -0.2626329955 +-0.4197265015 -0.2535025025 -0.2626329955 -0.4194179995 -0.230746002 -0.240088501 +-0.4194179995 -0.230746002 -0.240088501 -0.704549988 -0.2535025025 -0.258557495 +-0.052630501 -0.01679125 0.162906006 -0.0682389985 -0.0427826995 0.1356889955 +-0.0682389985 -0.0427826995 0.1356889955 -0.0220345495 -0.0428942985 0.135095001 +-0.0220345495 -0.0428942985 0.135095001 -0.052630501 -0.01679125 0.162906006 +-0.4792055055 -0.1347005005 -0.198272995 -0.479736511 -0.3113974915 -0.226177994 +-0.479736511 -0.3113974915 -0.226177994 -0.080080002 -0.1467485045 -0.124640503 +-0.080080002 -0.1467485045 -0.124640503 -0.4792055055 -0.1347005005 -0.198272995 +-0.363916504 -1.053660034 -0.2636954955 -0.364023987 -1.022424988 -0.2585650025 +-0.364023987 -1.022424988 -0.2585650025 -0.0866764985 -1.053660034 -0.267818512 +-0.0866764985 -1.053660034 -0.267818512 -0.363916504 -1.053660034 -0.2636954955 +-0.7042349855 -0.230746002 -0.2363475035 -0.704549988 -0.2535025025 -0.258557495 +-0.704549988 -0.2535025025 -0.258557495 -0.4194179995 -0.230746002 -0.240088501 +-0.4194179995 -0.230746002 -0.240088501 -0.7042349855 -0.230746002 -0.2363475035 +-0.419870514 0.139267502 -0.28238501 -0.7045949705 0.1542155 -0.2510829925 +-0.7045949705 0.1542155 -0.2510829925 -0.4196619875 0.154661499 -0.2550444945 +-0.4196619875 0.154661499 -0.2550444945 -0.419870514 0.139267502 -0.28238501 +-0.083453003 -1.0292299805 -0.299215515 -0.083765999 -1.036035034 -0.300226013 +-0.083765999 -1.036035034 -0.300226013 0.5478150025 -1.0287800295 -0.308530487 +0.5478150025 -1.0287800295 -0.308530487 -0.083453003 -1.0292299805 -0.299215515 +-0.7043099975 0.183107498 -0.238022995 -0.7045949705 0.1542155 -0.2510829925 +-0.7045949705 0.1542155 -0.2510829925 -0.4196619875 0.154661499 -0.2550444945 +-0.4196619875 0.154661499 -0.2550444945 -0.7043099975 0.183107498 -0.238022995 +-0.4792055055 -0.1347005005 -0.198272995 -0.479736511 -0.3113974915 -0.226177994 +-0.479736511 -0.3113974915 -0.226177994 -0.081086502 -0.1343659975 -0.2044380035 +-0.081086502 -0.1343659975 -0.2044380035 -0.4792055055 -0.1347005005 -0.198272995 +-0.4762585145 0.140494995 -0.0193554495 -0.476396515 0.3170799865 0.00853545 +-0.476396515 0.3170799865 0.00853545 -0.0785835035 0.1407180025 -0.0256418 +-0.0785835035 0.1407180025 -0.0256418 -0.4762585145 0.140494995 -0.0193554495 +-0.7045949705 0.1542155 -0.2510829925 -0.7046950075 0.1388215025 -0.2783095095 +-0.7046950075 0.1388215025 -0.2783095095 -0.419870514 0.139267502 -0.28238501 +-0.419870514 0.139267502 -0.28238501 -0.7045949705 0.1542155 -0.2510829925 +-0.077947502 0.316968506 0.002600245 -0.4759129945 0.440902008 0.0280716 +-0.4759129945 0.440902008 0.0280716 -0.0775804975 0.440566986 0.0223566495 +-0.0775804975 0.440566986 0.0223566495 -0.077947502 0.316968506 0.002600245 +-0.0801604995 -0.3236679995 -0.152759506 -0.4788349915 -0.323890991 -0.146716995 +-0.4788349915 -0.323890991 -0.146716995 -0.080080002 -0.1467485045 -0.124640503 +-0.080080002 -0.1467485045 -0.124640503 -0.0801604995 -0.3236679995 -0.152759506 +-0.391066498 -1.0572299805 0.1854954985 -0.372536499 -1.05711499 0.1851024935 +-0.372536499 -1.05711499 0.1851024935 -0.372307495 -1.0483050535 0.1954839935 +-0.372307495 -1.0483050535 0.1954839935 -0.391066498 -1.0572299805 0.1854954985 +-0.390832489 -1.048415039 0.195654007 -0.391066498 -1.0572299805 0.1854954985 +-0.391066498 -1.0572299805 0.1854954985 -0.372307495 -1.0483050535 0.1954839935 +-0.372307495 -1.0483050535 0.1954839935 -0.390832489 -1.048415039 0.195654007 +-0.47505249 -0.3240029905 0.098828499 -0.4756474915 -0.458199005 0.063334999 +-0.4756474915 -0.458199005 0.063334999 -0.0766104965 -0.323333496 0.093227501 +-0.0766104965 -0.323333496 0.093227501 -0.47505249 -0.3240029905 0.098828499 +-0.0839660035 1.013494995 -0.322657013 0.5471849975 1.008585022 -0.337218506 +0.5471849975 1.008585022 -0.337218506 0.5471849975 1.013044983 -0.3318630065 +0.5471849975 1.013044983 -0.3318630065 -0.0839660035 1.013494995 -0.322657013 +-0.617460022 0.1037945025 -0.170932007 -0.6178049925 -0.0103215505 -0.1971589965 +-0.6178049925 -0.0103215505 -0.1971589965 -0.5908449705 -0.0108788995 -0.221699005 +-0.5908449705 -0.0108788995 -0.221699005 -0.617460022 0.1037945025 -0.170932007 +-0.0770875015 -0.457976013 0.0574020005 -0.4756474915 -0.458199005 0.063334999 +-0.4756474915 -0.458199005 0.063334999 -0.0766104965 -0.323333496 0.093227501 +-0.0766104965 -0.323333496 0.093227501 -0.0770875015 -0.457976013 0.0574020005 +-0.4750224915 0.1278895035 0.060112499 -0.475049011 0.304475006 0.088005501 +-0.475049011 0.304475006 0.088005501 -0.0785835035 0.1407180025 -0.0256418 +-0.0785835035 0.1407180025 -0.0256418 -0.4750224915 0.1278895035 0.060112499 +-0.4207785035 0.225496994 -0.3296004945 -0.705380005 0.2250505065 -0.325520508 +-0.705380005 0.2250505065 -0.325520508 -0.4204609985 0.2408910065 -0.302145996 +-0.4204609985 0.2408910065 -0.302145996 -0.4207785035 0.225496994 -0.3296004945 +-0.4750224915 0.1278895035 0.060112499 -0.475049011 0.304475006 0.088005501 +-0.475049011 0.304475006 0.088005501 -0.0774609985 0.127778 0.0539350015 +-0.0774609985 0.127778 0.0539350015 -0.4750224915 0.1278895035 0.060112499 +-0.7052800295 0.240779495 -0.2982940065 -0.705380005 0.2250505065 -0.325520508 +-0.705380005 0.2250505065 -0.325520508 -0.4204609985 0.2408910065 -0.302145996 +-0.4204609985 0.2408910065 -0.302145996 -0.7052800295 0.240779495 -0.2982940065 +-0.036113098 -0.016902849 0.162694 -0.052630501 -0.01679125 0.162906006 +-0.052630501 -0.01679125 0.162906006 -0.0220345495 -0.0428942985 0.135095001 +-0.0220345495 -0.0428942985 0.135095001 -0.036113098 -0.016902849 0.162694 +-0.4209825135 -0.184117996 -0.3304974975 -0.70548999 -0.1612494965 -0.304211487 +-0.70548999 -0.1612494965 -0.304211487 -0.420441498 -0.1610265045 -0.3083940125 +-0.420441498 -0.1610265045 -0.3083940125 -0.4209825135 -0.184117996 -0.3304974975 +-0.0785835035 0.1407180025 -0.0256418 -0.475049011 0.304475006 0.088005501 +-0.475049011 0.304475006 0.088005501 -0.076378998 0.304475006 0.0821865005 +-0.076378998 0.304475006 0.0821865005 -0.0785835035 0.1407180025 -0.0256418 +-0.391511505 -1.0303449705 0.180130493 -0.3727669985 -1.0392700195 0.1694774935 +-0.3727669985 -1.0392700195 0.1694774935 -0.3722059935 -1.030454956 0.1799774935 +-0.3722059935 -1.030454956 0.1799774935 -0.391511505 -1.0303449705 0.180130493 +-0.475049011 0.304475006 0.088005501 -0.0774609985 0.127778 0.0539350015 +-0.0774609985 0.127778 0.0539350015 -0.076378998 0.304475006 0.0821865005 +-0.076378998 0.304475006 0.0821865005 -0.475049011 0.304475006 0.088005501 +-0.7056950075 -0.1840065 -0.3264194945 -0.4212099915 -0.2156869965 -0.335634491 +-0.4212099915 -0.2156869965 -0.335634491 -0.4209825135 -0.184117996 -0.3304974975 +-0.4209825135 -0.184117996 -0.3304974975 -0.7056950075 -0.1840065 -0.3264194945 +-0.70548999 -0.1612494965 -0.304211487 -0.7056950075 -0.1840065 -0.3264194945 +-0.7056950075 -0.1840065 -0.3264194945 -0.4209825135 -0.184117996 -0.3304974975 +-0.4209825135 -0.184117996 -0.3304974975 -0.70548999 -0.1612494965 -0.304211487 +-0.7055949705 -0.2155755005 -0.3313265075 -0.7056950075 -0.1840065 -0.3264194945 +-0.7056950075 -0.1840065 -0.3264194945 -0.4212099915 -0.2156869965 -0.335634491 +-0.4212099915 -0.2156869965 -0.335634491 -0.7055949705 -0.2155755005 -0.3313265075 +-0.7057750245 0.196382004 -0.3386944885 -0.420950989 0.1964935 -0.3426579895 +-0.420950989 0.1964935 -0.3426579895 -0.4207785035 0.225496994 -0.3296004945 +-0.4207785035 0.225496994 -0.3296004945 -0.7057750245 0.196382004 -0.3386944885 +-0.705380005 0.2250505065 -0.325520508 -0.7057750245 0.196382004 -0.3386944885 +-0.7057750245 0.196382004 -0.3386944885 -0.4207785035 0.225496994 -0.3296004945 +-0.4207785035 0.225496994 -0.3296004945 -0.705380005 0.2250505065 -0.325520508 +-0.391511505 -1.0303449705 0.180130493 -0.3912944945 -1.0391550295 0.1697590025 +-0.3912944945 -1.0391550295 0.1697590025 -0.3727669985 -1.0392700195 0.1694774935 +-0.3727669985 -1.0392700195 0.1694774935 -0.391511505 -1.0303449705 0.180130493 +-0.356928009 -1.054214966 0.212319504 -0.35698349 -1.0751850585 0.1883294985 +-0.35698349 -1.0751850585 0.1883294985 -0.079804001 -1.054324951 0.2084174955 +-0.079804001 -1.054324951 0.2084174955 -0.356928009 -1.054214966 0.212319504 +-0.413251007 -0.253279495 0.189940506 -0.6979050295 -0.224610504 0.207185501 +-0.6979050295 -0.224610504 0.207185501 -0.4129599915 -0.224498993 0.2026660005 +-0.4129599915 -0.224498993 0.2026660005 -0.413251007 -0.253279495 0.189940506 +-0.697755005 0.2086524965 0.1999360045 -0.6980949705 0.177083496 0.194908005 +-0.6980949705 0.177083496 0.194908005 -0.412921997 0.2087640075 0.195526001 +-0.412921997 0.2087640075 0.195526001 -0.697755005 0.2086524965 0.1999360045 +-0.564455017 0.323104004 0.0098149005 -0.3752994995 1.069045044 0.1252405015 +-0.3752994995 1.069045044 0.1252405015 -0.097165001 1.069380005 0.121024498 +-0.097165001 1.069380005 0.121024498 -0.564455017 0.323104004 0.0098149005 +-0.0996504975 0.1372599945 -0.0266406995 -0.564455017 0.323104004 0.0098149005 +-0.564455017 0.323104004 0.0098149005 -0.099258499 0.323215515 0.00259993 +-0.099258499 0.323215515 0.00259993 -0.0996504975 0.1372599945 -0.0266406995 +-0.3932944945 -0.1500944975 0.126760498 -0.3938640135 -0.31876001 0.1059954985 +-0.3938640135 -0.31876001 0.1059954985 -0.0768724975 -0.1494255065 0.0684524995 +-0.0768724975 -0.1494255065 0.0684524995 -0.3932944945 -0.1500944975 0.126760498 +-0.082088501 0.270229004 -0.3004140015 -0.3997575075 0.263869995 -0.2944599915 +-0.3997575075 0.263869995 -0.2944599915 -0.0816504975 0.297001007 -0.252092499 +-0.0816504975 0.297001007 -0.252092499 -0.082088501 0.270229004 -0.3004140015 +-0.4289570005 1.0427199705 -0.327986511 -0.429191498 1.024535034 -0.348744507 +-0.429191498 1.024535034 -0.348744507 -0.3989444885 1.0246500245 -0.3492269895 +-0.3989444885 1.0246500245 -0.3492269895 -0.4289570005 1.0427199705 -0.327986511 +-0.3917485045 1.0319000245 0.159484497 -0.372846985 1.0185150145 0.1573139955 +-0.372846985 1.0185150145 0.1573139955 -0.372782501 1.0319000245 0.1595464935 +-0.372782501 1.0319000245 0.1595464935 -0.3917485045 1.0319000245 0.159484497 +-0.391713501 1.018289978 0.157811493 -0.3917485045 1.0319000245 0.159484497 +-0.3917485045 1.0319000245 0.159484497 -0.372846985 1.0185150145 0.1573139955 +-0.372846985 1.0185150145 0.1573139955 -0.391713501 1.018289978 0.157811493 +-0.3989444885 1.0246500245 -0.3492269895 -0.4289570005 1.0427199705 -0.327986511 +-0.4289570005 1.0427199705 -0.327986511 -0.398933502 1.0426099855 -0.3284735105 +-0.398933502 1.0426099855 -0.3284735105 -0.3989444885 1.0246500245 -0.3492269895 +-0.3928659975 -0.291987488 0.154216995 -0.3938640135 -0.31876001 0.1059954985 +-0.3938640135 -0.31876001 0.1059954985 -0.0762490005 -0.3247839965 0.102607498 +-0.0762490005 -0.3247839965 0.102607498 -0.3928659975 -0.291987488 0.154216995 +-0.564455017 0.323104004 0.0098149005 -0.099258499 0.323215515 0.00259993 +-0.099258499 0.323215515 0.00259993 -0.097165001 1.069380005 0.121024498 +-0.097165001 1.069380005 0.121024498 -0.564455017 0.323104004 0.0098149005 +-0.4284914855 1.006909973 -0.296958496 -0.4287309875 0.9890650025 -0.317493988 +-0.4287309875 0.9890650025 -0.317493988 -0.398471985 1.006799988 -0.2972225035 +-0.398471985 1.006799988 -0.2972225035 -0.4284914855 1.006909973 -0.296958496 +-0.398592987 0.9887299805 -0.318089508 -0.4287309875 0.9890650025 -0.317493988 +-0.4287309875 0.9890650025 -0.317493988 -0.398471985 1.006799988 -0.2972225035 +-0.398471985 1.006799988 -0.2972225035 -0.398592987 0.9887299805 -0.318089508 +-0.375478485 1.0720600585 0.107161499 -0.564409973 0.3264505005 -0.0082591 +-0.564409973 0.3264505005 -0.0082591 -0.097348503 1.0722800295 0.1031695025 +-0.097348503 1.0722800295 0.1031695025 -0.375478485 1.0720600585 0.107161499 +0.0970875015 0.1206384965 -0.150608505 0.096614998 -0.0127754 -0.1813014985 +0.096614998 -0.0127754 -0.1813014985 0.2425700075 0.0857229995 -0.1127494965 +0.2425700075 0.0857229995 -0.1127494965 0.0970875015 0.1206384965 -0.150608505 +0.096614998 -0.0127754 -0.1813014985 0.242095505 -0.01188305 -0.1273759995 +0.242095505 -0.01188305 -0.1273759995 0.2425700075 0.0857229995 -0.1127494965 +0.2425700075 0.0857229995 -0.1127494965 0.096614998 -0.0127754 -0.1813014985 +-0.4284914855 -1.0437299805 -0.3129140015 -0.4286944885 -1.01651001 -0.308566986 +-0.4286944885 -1.01651001 -0.308566986 -0.3983309935 -1.0164000245 -0.309269989 +-0.3983309935 -1.0164000245 -0.309269989 -0.4284914855 -1.0437299805 -0.3129140015 +-0.398001007 -0.130238495 -0.2078405 -0.398976013 -0.306601013 -0.235866501 +-0.398976013 -0.306601013 -0.235866501 -0.081001503 -0.136151001 -0.213808502 +-0.081001503 -0.136151001 -0.213808502 -0.398001007 -0.130238495 -0.2078405 +0.097556999 -0.1345890045 0.0560390015 -0.2051275025 -0.0751324995 0.1030319975 +-0.2051275025 -0.0751324995 0.1030319975 0.0981190035 -0.0753554995 0.098449997 +0.0981190035 -0.0753554995 0.098449997 0.097556999 -0.1345890045 0.0560390015 +0.0974524995 0.1208619995 0.0557024995 0.2443600005 0.0682105025 0.00421904 +0.2443600005 0.0682105025 0.00421904 0.2443639985 0.084719002 0.0093517505 +0.2443639985 0.084719002 0.0093517505 0.0974524995 0.1208619995 0.0557024995 +0.0981190035 -0.0753554995 0.098449997 0.097556999 -0.1345890045 0.0560390015 +0.097556999 -0.1345890045 0.0560390015 0.2443829955 -0.096885002 0.00845965 +0.2443829955 -0.096885002 0.00845965 0.0981190035 -0.0753554995 0.098449997 +-0.4284914855 -1.0437299805 -0.3129140015 -0.3986954955 -1.0437299805 -0.313182495 +-0.3986954955 -1.0437299805 -0.313182495 -0.3983309935 -1.0164000245 -0.309269989 +-0.3983309935 -1.0164000245 -0.309269989 -0.4284914855 -1.0437299805 -0.3129140015 +0.0981190035 -0.0753554995 0.098449997 0.0980565035 0.069661003 0.0961054995 +0.0980565035 0.069661003 0.0961054995 0.2444179995 -0.0770289995 0.00678675 +0.2444179995 -0.0770289995 0.00678675 0.0981190035 -0.0753554995 0.098449997 +-0.0762770005 -0.150429001 0.0613240015 -0.0769404985 -0.1774244995 0.0131091995 +-0.0769404985 -0.1774244995 0.0131091995 -0.0131036995 -0.1507640075 0.0603045005 +-0.0131036995 -0.1507640075 0.0603045005 -0.0762770005 -0.150429001 0.0613240015 +-0.35698349 -1.0751850585 0.1883294985 -0.080305496 -1.075074951 0.184418503 +-0.080305496 -1.075074951 0.184418503 -0.079804001 -1.054324951 0.2084174955 +-0.079804001 -1.054324951 0.2084174955 -0.35698349 -1.0751850585 0.1883294985 +0.2443829955 -0.096885002 0.00845965 0.0981190035 -0.0753554995 0.098449997 +0.0981190035 -0.0753554995 0.098449997 0.2444179995 -0.0770289995 0.00678675 +0.2444179995 -0.0770289995 0.00678675 0.2443829955 -0.096885002 0.00845965 +-0.0998320005 0.140494995 -0.044608101 -0.564409973 0.3264505005 -0.0082591 +-0.564409973 0.3264505005 -0.0082591 -0.099223999 0.326004486 -0.01502785 +-0.099223999 0.326004486 -0.01502785 -0.0998320005 0.140494995 -0.044608101 +-0.3919964905 1.022085022 0.1340399935 -0.373402008 1.035579956 0.135880005 +-0.373402008 1.035579956 0.135880005 -0.3733554995 1.022085022 0.1336495055 +-0.3733554995 1.022085022 0.1336495055 -0.3919964905 1.022085022 0.1340399935 +-0.4278934935 -1.0236500245 -0.261576996 -0.4280255125 -1.051089966 -0.265931 +-0.4280255125 -1.051089966 -0.265931 -0.3978880005 -1.051089966 -0.266527008 +-0.3978880005 -1.051089966 -0.266527008 -0.4278934935 -1.0236500245 -0.261576996 +-0.3978880005 -1.051089966 -0.266527008 -0.4278934935 -1.0236500245 -0.261576996 +-0.4278934935 -1.0236500245 -0.261576996 -0.397646515 -1.0239849855 -0.2620589905 +-0.397646515 -1.0239849855 -0.2620589905 -0.3978880005 -1.051089966 -0.266527008 +-0.01376495 -0.177647995 0.0119779995 -0.0769404985 -0.1774244995 0.0131091995 +-0.0769404985 -0.1774244995 0.0131091995 -0.0131036995 -0.1507640075 0.0603045005 +-0.0131036995 -0.1507640075 0.0603045005 -0.01376495 -0.177647995 0.0119779995 +-0.391924988 1.0358050535 0.1359380035 -0.3919964905 1.022085022 0.1340399935 +-0.3919964905 1.022085022 0.1340399935 -0.373402008 1.035579956 0.135880005 +-0.373402008 1.035579956 0.135880005 -0.391924988 1.0358050535 0.1359380035 +-0.0838584975 1.0084749755 -0.3277869875 -0.0839660035 1.013494995 -0.322657013 +-0.0839660035 1.013494995 -0.322657013 0.5471849975 1.008585022 -0.337218506 +0.5471849975 1.008585022 -0.337218506 -0.0838584975 1.0084749755 -0.3277869875 +-0.0758130035 -0.297788513 0.151039505 -0.3922409975 -0.2420130005 0.177660507 +-0.3922409975 -0.2420130005 0.177660507 -0.0754089965 -0.2480370025 0.1743674925 +-0.0754089965 -0.2480370025 0.1743674925 -0.0758130035 -0.297788513 0.151039505 +0.2425700075 0.0857229995 -0.1127494965 0.242095505 -0.01188305 -0.1273759995 +0.242095505 -0.01188305 -0.1273759995 0.5971799925 0.0588405 -0.1457120055 +0.5971799925 0.0588405 -0.1457120055 0.2425700075 0.0857229995 -0.1127494965 +0.242095505 -0.01188305 -0.1273759995 0.597034973 -0.0122177495 -0.149508499 +0.597034973 -0.0122177495 -0.149508499 0.5971799925 0.0588405 -0.1457120055 +0.5971799925 0.0588405 -0.1457120055 0.242095505 -0.01188305 -0.1273759995 +-0.4221755065 1.044170044 0.125931999 -0.4222005005 1.017174988 0.1218034975 +-0.4222005005 1.017174988 0.1218034975 -0.3919284975 1.0442800295 0.125449997 +-0.3919284975 1.0442800295 0.125449997 -0.4221755065 1.044170044 0.125931999 +-0.4222005005 1.017174988 0.1218034975 -0.3925085145 1.0170650025 0.121197998 +-0.3925085145 1.0170650025 0.121197998 -0.3919284975 1.0442800295 0.125449997 +-0.3919284975 1.0442800295 0.125449997 -0.4222005005 1.017174988 0.1218034975 +0.2432630005 0.1117145005 -0.076584503 0.2425700075 0.0857229995 -0.1127494965 +0.2425700075 0.0857229995 -0.1127494965 0.5980599975 0.0971015015 -0.081314499 +0.5980599975 0.0971015015 -0.081314499 0.2432630005 0.1117145005 -0.076584503 +0.5971799925 0.0588405 -0.1457120055 0.2425700075 0.0857229995 -0.1127494965 +0.2425700075 0.0857229995 -0.1127494965 0.5980599975 0.0971015015 -0.081314499 +0.5980599975 0.0971015015 -0.081314499 0.5971799925 0.0588405 -0.1457120055 +-0.075609001 0.1771950075 0.1572920075 -0.392666504 0.170947998 0.1606920015 +-0.392666504 0.170947998 0.1606920015 -0.075449997 0.231632004 0.165663498 +-0.075449997 0.231632004 0.165663498 -0.075609001 0.1771950075 0.1572920075 +-0.0996504975 0.1372599945 -0.0266406995 -0.564409973 0.3264505005 -0.0082591 +-0.564409973 0.3264505005 -0.0082591 -0.099258499 0.323215515 0.00259993 +-0.099258499 0.323215515 0.00259993 -0.0996504975 0.1372599945 -0.0266406995 +-0.2051275025 -0.0751324995 0.1030319975 -0.2058014985 -0.1342545015 0.0606189995 +-0.2058014985 -0.1342545015 0.0606189995 0.097556999 -0.1345890045 0.0560390015 +0.097556999 -0.1345890045 0.0560390015 -0.2051275025 -0.0751324995 0.1030319975 +-0.421484497 -1.0168449705 0.1781640015 -0.4217120055 -1.0348050535 0.1570715025 +-0.4217120055 -1.0348050535 0.1570715025 -0.391467499 -1.0350300295 0.1567005005 +-0.391467499 -1.0350300295 0.1567005005 -0.421484497 -1.0168449705 0.1781640015 +-0.392666504 0.170947998 0.1606920015 -0.3927369995 0.225385498 0.169393997 +-0.3927369995 0.225385498 0.169393997 -0.075449997 0.231632004 0.165663498 +-0.075449997 0.231632004 0.165663498 -0.392666504 0.170947998 0.1606920015 +0.2443639985 0.084719002 0.0093517505 0.2443600005 0.0682105025 0.00421904 +0.2443600005 0.0682105025 0.00421904 0.587590027 0.0694375 0.0723290025 +0.587590027 0.0694375 0.0723290025 0.2443639985 0.084719002 0.0093517505 +-0.0762490005 -0.3247839965 0.102607498 -0.3928659975 -0.291987488 0.154216995 +-0.3928659975 -0.291987488 0.154216995 -0.0758130035 -0.297788513 0.151039505 +-0.0758130035 -0.297788513 0.151039505 -0.0762490005 -0.3247839965 0.102607498 +-0.01419695 0.259519989 -0.0100112 -0.076619499 0.298450989 0.029740999 +-0.076619499 0.298450989 0.029740999 -0.01356005 0.298339508 0.02883025 +-0.01356005 0.298339508 0.02883025 -0.01419695 0.259519989 -0.0100112 +-0.3922409975 -0.2420130005 0.177660507 -0.3928659975 -0.291987488 0.154216995 +-0.3928659975 -0.291987488 0.154216995 -0.0758130035 -0.297788513 0.151039505 +-0.0758130035 -0.297788513 0.151039505 -0.3922409975 -0.2420130005 0.177660507 +-0.0996504975 0.1372599945 -0.0266406995 -0.564409973 0.3264505005 -0.0082591 +-0.564409973 0.3264505005 -0.0082591 -0.099223999 0.326004486 -0.01502785 +-0.099223999 0.326004486 -0.01502785 -0.0996504975 0.1372599945 -0.0266406995 +-0.3801264955 1.0201849975 -0.336782501 -0.398761505 1.029334961 -0.326015503 +-0.398761505 1.029334961 -0.326015503 -0.3800180055 1.029334961 -0.325957489 +-0.3800180055 1.029334961 -0.325957489 -0.3801264955 1.0201849975 -0.336782501 +-0.4213720095 1.0368050535 0.1728110045 -0.4216180115 1.0098099975 0.168565506 +-0.4216180115 1.0098099975 0.168565506 -0.3913754885 1.009590027 0.1683065035 +-0.3913754885 1.009590027 0.1683065035 -0.4213720095 1.0368050535 0.1728110045 +-0.0823895035 -0.183783493 -0.3073380125 -0.3990870055 -0.1388285065 -0.262535492 +-0.3990870055 -0.1388285065 -0.262535492 -0.0819830015 -0.1444055025 -0.268166504 +-0.0819830015 -0.1444055025 -0.268166504 -0.0823895035 -0.183783493 -0.3073380125 +0.260915985 -0.067100998 0.1140214995 0.248376999 -0.0656504975 0.1267005005 +0.248376999 -0.0656504975 0.1267005005 0.2614974975 0.0551590005 0.1129179995 +0.2614974975 0.0551590005 0.1129179995 0.260915985 -0.067100998 0.1140214995 +-0.391467499 -1.0350300295 0.1567005005 -0.421484497 -1.0168449705 0.1781640015 +-0.421484497 -1.0168449705 0.1781640015 -0.3913485105 -1.016960022 0.1776795045 +-0.3913485105 -1.016960022 0.1776795045 -0.391467499 -1.0350300295 0.1567005005 +-0.3913754885 1.009590027 0.1683065035 -0.4213720095 1.0368050535 0.1728110045 +-0.4213720095 1.0368050535 0.1728110045 -0.3912390135 1.036920044 0.1724380035 +-0.3912390135 1.036920044 0.1724380035 -0.3913754885 1.009590027 0.1683065035 +-0.6980949705 0.177083496 0.194908005 -0.698409973 0.1542155 0.172586502 +-0.698409973 0.1542155 0.172586502 -0.4131514895 0.1771950075 0.1905 +-0.4131514895 0.1771950075 0.1905 -0.6980949705 0.177083496 0.194908005 +-0.56598999 -0.1469714965 -0.0979990005 -0.5661550295 -0.3328154905 -0.1274585035 +-0.5661550295 -0.3328154905 -0.1274585035 -0.1007614975 -0.143848007 -0.1227304995 +-0.1007614975 -0.143848007 -0.1227304995 -0.56598999 -0.1469714965 -0.0979990005 +-0.379788513 1.002340027 -0.320932007 -0.398764496 1.0022249755 -0.320548004 +-0.398764496 1.0022249755 -0.320548004 -0.37967099 1.0114849855 -0.31055249 +-0.37967099 1.0114849855 -0.31055249 -0.379788513 1.002340027 -0.320932007 +-0.083911499 1.0225300295 -0.3305775145 -0.0840455015 1.010705017 -0.3348200075 +-0.0840455015 1.010705017 -0.3348200075 0.5474699705 1.0223049925 -0.340002014 +0.5474699705 1.0223049925 -0.340002014 -0.083911499 1.0225300295 -0.3305775145 +0.5548599855 -1.0478599855 0.1648079985 -0.076600998 -1.0412750245 0.172668503 +-0.076600998 -1.0412750245 0.172668503 0.554994995 -1.036255005 0.1689389955 +0.554994995 -1.036255005 0.1689389955 0.5548599855 -1.0478599855 0.1648079985 +-0.3990870055 -0.1388285065 -0.262535492 -0.399493988 -0.177871002 -0.3017070005 +-0.399493988 -0.177871002 -0.3017070005 -0.0823895035 -0.183783493 -0.3073380125 +-0.0823895035 -0.183783493 -0.3073380125 -0.3990870055 -0.1388285065 -0.262535492 +0.5471849975 1.013044983 -0.3318630065 0.5471849975 1.008585022 -0.337218506 +0.5471849975 1.008585022 -0.337218506 0.607039978 1.0150549925 -0.3394234925 +0.607039978 1.0150549925 -0.3394234925 0.5471849975 1.013044983 -0.3318630065 +-0.421020996 -1.052880005 0.2093034975 -0.42114151 -1.070834961 0.1884360045 +-0.42114151 -1.070834961 0.1884360045 -0.390885498 -1.052880005 0.208819 +-0.390885498 -1.052880005 0.208819 -0.421020996 -1.052880005 0.2093034975 +-0.3933034975 0.1317940065 0.121850502 -0.0761255035 0.137929001 0.1180065 +-0.0761255035 0.137929001 0.1180065 -0.075609001 0.1771950075 0.1572920075 +-0.075609001 0.1771950075 0.1572920075 -0.3933034975 0.1317940065 0.121850502 +0.5474699705 1.0223049925 -0.340002014 0.54725 1.0174000245 -0.3454735105 +0.54725 1.0174000245 -0.3454735105 0.607039978 1.0150549925 -0.3394234925 +0.607039978 1.0150549925 -0.3394234925 0.5474699705 1.0223049925 -0.340002014 +-0.398764496 1.0022249755 -0.320548004 -0.398421509 1.0114849855 -0.310276001 +-0.398421509 1.0114849855 -0.310276001 -0.37967099 1.0114849855 -0.31055249 +-0.37967099 1.0114849855 -0.31055249 -0.398764496 1.0022249755 -0.320548004 +-0.2100370025 -0.01054445 -0.2272225035 0.096614998 -0.0127754 -0.1813014985 +0.096614998 -0.0127754 -0.1813014985 0.0970875015 0.1206384965 -0.150608505 +0.0970875015 0.1206384965 -0.150608505 -0.2100370025 -0.01054445 -0.2272225035 +-0.3933034975 0.1317940065 0.121850502 -0.392666504 0.170947998 0.1606920015 +-0.392666504 0.170947998 0.1606920015 -0.075609001 0.1771950075 0.1572920075 +-0.075609001 0.1771950075 0.1572920075 -0.3933034975 0.1317940065 0.121850502 +-0.076320503 -1.050535034 0.1805964965 -0.0764349975 -1.045959961 0.186061493 +-0.0764349975 -1.045959961 0.186061493 0.555049988 -1.0499749755 0.1716185 +0.555049988 -1.0499749755 0.1716185 -0.076320503 -1.050535034 0.1805964965 +0.56225 -1.033244995 -0.321282013 0.5478150025 -1.0287800295 -0.308530487 +0.5478150025 -1.0287800295 -0.308530487 0.5626799925 -1.0271099855 -0.3204920045 +0.5626799925 -1.0271099855 -0.3204920045 0.56225 -1.033244995 -0.321282013 +-0.082878998 -0.238220001 -0.315939514 -0.399493988 -0.177871002 -0.3017070005 +-0.399493988 -0.177871002 -0.3017070005 -0.0823895035 -0.183783493 -0.3073380125 +-0.0823895035 -0.183783493 -0.3073380125 -0.082878998 -0.238220001 -0.315939514 +-0.42114151 -1.070834961 0.1884360045 -0.391340515 -1.0707249755 0.1879450075 +-0.391340515 -1.0707249755 0.1879450075 -0.390885498 -1.052880005 0.208819 +-0.390885498 -1.052880005 0.208819 -0.42114151 -1.070834961 0.1884360045 +0.548119995 -1.030454956 -0.296473999 0.547919983 -1.037704956 -0.297593506 +0.547919983 -1.037704956 -0.297593506 0.60775 -1.0326850585 -0.304262512 +0.60775 -1.0326850585 -0.304262512 0.548119995 -1.030454956 -0.296473999 +-0.0771045 0.1293399965 0.0635385015 -0.393755493 0.299566498 0.095510002 +-0.393755493 0.299566498 0.095510002 -0.0763499985 0.305924988 0.091447998 +-0.0763499985 0.305924988 0.091447998 -0.0771045 0.1293399965 0.0635385015 +-0.2095735015 0.122199997 -0.196083496 -0.2100370025 -0.01054445 -0.2272225035 +-0.2100370025 -0.01054445 -0.2272225035 0.0970875015 0.1206384965 -0.150608505 +0.0970875015 0.1206384965 -0.150608505 -0.2095735015 0.122199997 -0.196083496 +-0.3982879945 -1.0388199465 -0.30067749 -0.3795400085 -1.038709961 -0.300842987 +-0.3795400085 -1.038709961 -0.300842987 -0.379359009 -1.025214966 -0.2988305055 +-0.379359009 -1.025214966 -0.2988305055 -0.3982879945 -1.0388199465 -0.30067749 +-0.0764349975 -1.045959961 0.186061493 0.5549400025 -1.0454050295 0.1769714965 +0.5549400025 -1.0454050295 0.1769714965 0.555049988 -1.0499749755 0.1716185 +0.555049988 -1.0499749755 0.1716185 -0.0764349975 -1.045959961 0.186061493 +-0.393755493 0.299566498 0.095510002 -0.393834015 0.123316002 0.067279999 +-0.393834015 0.123316002 0.067279999 -0.0771045 0.1293399965 0.0635385015 +-0.0771045 0.1293399965 0.0635385015 -0.393755493 0.299566498 0.095510002 +-0.0763499985 0.305924988 0.091447998 -0.0771045 0.1293399965 0.0635385015 +-0.0771045 0.1293399965 0.0635385015 -0.014045 0.1300090025 0.0626274985 +-0.014045 0.1300090025 0.0626274985 -0.0763499985 0.305924988 0.091447998 +-0.56598999 -0.1469714965 -0.0979990005 -0.5661550295 -0.3328154905 -0.1274585035 +-0.5661550295 -0.3328154905 -0.1274585035 -0.100580002 -0.1466369935 -0.1047630005 +-0.100580002 -0.1466369935 -0.1047630005 -0.56598999 -0.1469714965 -0.0979990005 +-0.398870514 0.2906424865 -0.2462409975 -0.3992210085 0.122088997 -0.266778015 +-0.3992210085 0.122088997 -0.266778015 -0.0811360015 0.1214195025 -0.2180514985 +-0.0811360015 0.1214195025 -0.2180514985 -0.398870514 0.2906424865 -0.2462409975 +1.559994995 -0.00976365 -0.136589493 1.5656049805 0.0384262505 -0.1326784975 +1.5656049805 0.0384262505 -0.1326784975 1.565660034 -0.00954055 -0.1353554995 +1.565660034 -0.00954055 -0.1353554995 1.559994995 -0.00976365 -0.136589493 +1.560160034 0.038314701 -0.1336849975 0.5971799925 0.0588405 -0.1457120055 +0.5971799925 0.0588405 -0.1457120055 1.560925049 0.0643065035 -0.090489502 +1.560925049 0.0643065035 -0.090489502 1.560160034 0.038314701 -0.1336849975 +1.559994995 -0.00976365 -0.136589493 0.597034973 -0.0122177495 -0.149508499 +0.597034973 -0.0122177495 -0.149508499 1.560160034 0.038314701 -0.1336849975 +1.560160034 0.038314701 -0.1336849975 1.559994995 -0.00976365 -0.136589493 +0.5971799925 0.0588405 -0.1457120055 0.597034973 -0.0122177495 -0.149508499 +0.597034973 -0.0122177495 -0.149508499 1.560160034 0.038314701 -0.1336849975 +1.560160034 0.038314701 -0.1336849975 0.5971799925 0.0588405 -0.1457120055 +1.5656049805 0.0384262505 -0.1326784975 1.560160034 0.038314701 -0.1336849975 +1.560160034 0.038314701 -0.1336849975 1.56651001 0.0687679975 -0.0907070005 +1.56651001 0.0687679975 -0.0907070005 1.5656049805 0.0384262505 -0.1326784975 +1.559994995 -0.00976365 -0.136589493 1.565660034 -0.00954055 -0.1353554995 +1.565660034 -0.00954055 -0.1353554995 1.71826001 0.025263201 -0.0751435015 +1.71826001 0.025263201 -0.0751435015 1.559994995 -0.00976365 -0.136589493 +0.554994995 -1.036255005 0.1689389955 0.5548599855 -1.0478599855 0.1648079985 +0.5548599855 -1.0478599855 0.1648079985 0.614789978 -1.0427249755 0.169298996 +0.614789978 -1.0427249755 0.169298996 0.554994995 -1.036255005 0.1689389955 +1.560160034 0.038314701 -0.1336849975 1.559994995 -0.00976365 -0.136589493 +1.559994995 -0.00976365 -0.136589493 1.5656049805 0.0384262505 -0.1326784975 +1.5656049805 0.0384262505 -0.1326784975 1.560160034 0.038314701 -0.1336849975 +0.568575012 -1.049084961 0.1543840025 0.5548599855 -1.0478599855 0.1648079985 +0.5548599855 -1.0478599855 0.1648079985 0.56938501 -1.043170044 0.153173996 +0.56938501 -1.043170044 0.153173996 0.568575012 -1.049084961 0.1543840025 +0.555049988 -1.0499749755 0.1716185 0.5549400025 -1.0454050295 0.1769714965 +0.5549400025 -1.0454050295 0.1769714965 0.614789978 -1.0427249755 0.169298996 +0.614789978 -1.0427249755 0.169298996 0.555049988 -1.0499749755 0.1716185 +0.5980599975 0.0971015015 -0.081314499 0.5971799925 0.0588405 -0.1457120055 +0.5971799925 0.0588405 -0.1457120055 1.560925049 0.0643065035 -0.090489502 +1.560925049 0.0643065035 -0.090489502 0.5980599975 0.0971015015 -0.081314499 +1.560925049 0.0643065035 -0.090489502 1.560160034 0.038314701 -0.1336849975 +1.560160034 0.038314701 -0.1336849975 1.56651001 0.0687679975 -0.0907070005 +1.56651001 0.0687679975 -0.0907070005 1.560925049 0.0643065035 -0.090489502 +0.5994000245 0.0846080015 0.00395728 1.5616049805 0.0559399985 -0.0323445015 +1.5616049805 0.0559399985 -0.0323445015 1.561875 0.0447851485 -0.0345699995 +1.561875 0.0447851485 -0.0345699995 0.5994000245 0.0846080015 0.00395728 +-0.080376503 1.0385949705 0.171808502 -0.0804990005 1.0070250245 0.1670079955 +-0.0804990005 1.0070250245 0.1670079955 -0.0767959975 1.0294449465 0.150014496 +-0.0767959975 1.0294449465 0.150014496 -0.080376503 1.0385949705 0.171808502 +-0.079804001 -1.054324951 0.2084174955 -0.0764349975 -1.045959961 0.186061493 +-0.0764349975 -1.045959961 0.186061493 -0.076320503 -1.050535034 0.1805964965 +-0.076320503 -1.050535034 0.1805964965 -0.079804001 -1.054324951 0.2084174955 +-0.080778 -1.033579956 0.1483690035 -0.076600998 -1.0412750245 0.172668503 +-0.076600998 -1.0412750245 0.172668503 -0.0764925005 -1.0364799805 0.1781380005 +-0.0764925005 -1.0364799805 0.1781380005 -0.080778 -1.033579956 0.1483690035 +-0.0804990005 1.0070250245 0.1670079955 -0.080772003 0.995869995 0.1374349975 +-0.080772003 0.995869995 0.1374349975 -0.0767959975 1.0294449465 0.150014496 +-0.0767959975 1.0294449465 0.150014496 -0.0804990005 1.0070250245 0.1670079955 +-0.079804001 -1.054324951 0.2084174955 -0.080305496 -1.075074951 0.184418503 +-0.080305496 -1.075074951 0.184418503 -0.076320503 -1.050535034 0.1805964965 +-0.076320503 -1.050535034 0.1805964965 -0.079804001 -1.054324951 0.2084174955 +-0.590580017 -0.1214260025 -0.186546997 -0.5908449705 -0.0108788995 -0.221699005 +-0.5908449705 -0.0108788995 -0.221699005 -0.2100370025 -0.01054445 -0.2272225035 +-0.2100370025 -0.01054445 -0.2272225035 -0.590580017 -0.1214260025 -0.186546997 +-0.080165001 -1.012830017 0.172371002 -0.080778 -1.033579956 0.1483690035 +-0.080778 -1.033579956 0.1483690035 -0.0764925005 -1.0364799805 0.1781380005 +-0.0764925005 -1.0364799805 0.1781380005 -0.080165001 -1.012830017 0.172371002 +-0.081139 1.046959961 0.1176784975 -0.0770179975 1.0336850585 0.144654495 +-0.0770179975 1.0336850585 0.144654495 -0.076989502 1.031339966 0.137960495 +-0.076989502 1.031339966 0.137960495 -0.081139 1.046959961 0.1176784975 +-0.5664749755 0.320872986 -0.138845505 -0.566875 0.317303009 -0.1569295045 +-0.566875 0.317303009 -0.1569295045 -0.3813055115 1.0620200195 -0.285816986 +-0.3813055115 1.0620200195 -0.285816986 -0.5664749755 0.320872986 -0.138845505 +-0.5661550295 -0.3328154905 -0.1274585035 -0.5665650025 -0.3301380005 -0.145319 +-0.5665650025 -0.3301380005 -0.145319 -0.1007614975 -0.143848007 -0.1227304995 +-0.1007614975 -0.143848007 -0.1227304995 -0.5661550295 -0.3328154905 -0.1274585035 +-0.0840455015 1.010705017 -0.3348200075 0.5469849855 1.0105949705 -0.343582489 +0.5469849855 1.0105949705 -0.343582489 0.54725 1.0174000245 -0.3454735105 +0.54725 1.0174000245 -0.3454735105 -0.0840455015 1.010705017 -0.3348200075 +-0.0865565035 -1.0226450195 -0.262907013 -0.0866764985 -1.053660034 -0.267818512 +-0.0866764985 -1.053660034 -0.267818512 -0.0835910035 -1.031125 -0.2872795105 +-0.0835910035 -1.031125 -0.2872795105 -0.0865565035 -1.0226450195 -0.262907013 +-0.0839660035 1.013494995 -0.322657013 -0.0872699965 1.0056849975 -0.298067993 +-0.0872699965 1.0056849975 -0.298067993 -0.0838584975 1.0084749755 -0.3277869875 +-0.0838584975 1.0084749755 -0.3277869875 -0.0839660035 1.013494995 -0.322657013 +-0.608710022 0.0486054495 -0.0692985 -0.6109450075 0.0486054495 0.0372092515 +-0.6109450075 0.0486054495 0.0372092515 -0.5912299805 0.053625 0.0483058015 +-0.5912299805 0.053625 0.0483058015 -0.608710022 0.0486054495 -0.0692985 +-0.0872699965 1.0056849975 -0.298067993 -0.0873600005 1.036920044 -0.3044295045 +-0.0873600005 1.036920044 -0.3044295045 -0.0839660035 1.013494995 -0.322657013 +-0.0839660035 1.013494995 -0.322657013 -0.0872699965 1.0056849975 -0.298067993 +-0.5912299805 0.053625 0.0483058015 -0.608710022 0.0486054495 -0.0692985 +-0.608710022 0.0486054495 -0.0692985 -0.5885549925 0.053625 -0.0795595015 +-0.5885549925 0.053625 -0.0795595015 -0.5912299805 0.053625 0.0483058015 +-0.087268997 -1.0023449705 -0.287467987 -0.087430496 -1.013835022 -0.3170390015 +-0.087430496 -1.013835022 -0.3170390015 -0.083453003 -1.0292299805 -0.299215515 +-0.083453003 -1.0292299805 -0.299215515 -0.087268997 -1.0023449705 -0.287467987 +-0.615919983 0.119746002 -0.0633409995 -0.58888501 0.1410525055 -0.0650059965 +-0.58888501 0.1410525055 -0.0650059965 -0.586830017 0.1207505035 0.0660270005 +-0.586830017 0.1207505035 0.0660270005 -0.615919983 0.119746002 -0.0633409995 +-0.0872699965 1.0056849975 -0.298067993 -0.0878809965 0.984825012 -0.322181 +-0.0878809965 0.984825012 -0.322181 -0.0838584975 1.0084749755 -0.3277869875 +-0.0838584975 1.0084749755 -0.3277869875 -0.0872699965 1.0056849975 -0.298067993 +-0.6140250245 0.1022330015 0.0486092985 -0.615919983 0.119746002 -0.0633409995 +-0.615919983 0.119746002 -0.0633409995 -0.586830017 0.1207505035 0.0660270005 +-0.586830017 0.1207505035 0.0660270005 -0.6140250245 0.1022330015 0.0486092985 +-0.0840455015 1.010705017 -0.3348200075 -0.088132004 1.026209961 -0.358113495 +-0.088132004 1.026209961 -0.358113495 -0.083911499 1.0225300295 -0.3305775145 +-0.083911499 1.0225300295 -0.3305775145 -0.0840455015 1.010705017 -0.3348200075 +-0.0878539965 1.0468449705 -0.334118988 -0.088132004 1.026209961 -0.358113495 +-0.088132004 1.026209961 -0.358113495 -0.083911499 1.0225300295 -0.3305775145 +-0.083911499 1.0225300295 -0.3305775145 -0.0878539965 1.0468449705 -0.334118988 +-0.1007614975 -0.143848007 -0.1227304995 -0.5661550295 -0.3328154905 -0.1274585035 +-0.5661550295 -0.3328154905 -0.1274585035 -0.100580002 -0.1466369935 -0.1047630005 +-0.100580002 -0.1466369935 -0.1047630005 -0.1007614975 -0.143848007 -0.1227304995 +-0.5640200195 -0.3454205015 0.020870449 -0.5643200075 -0.3491019895 0.00334654 +-0.5643200075 -0.3491019895 0.00334654 -0.3748160095 -1.090244995 0.144776001 +-0.3748160095 -1.090244995 0.144776001 -0.5640200195 -0.3454205015 0.020870449 +-0.2100370025 -0.01054445 -0.2272225035 -0.590580017 -0.1214260025 -0.186546997 +-0.590580017 -0.1214260025 -0.186546997 -0.2098829955 -0.120867996 -0.1919620055 +-0.2098829955 -0.120867996 -0.1919620055 -0.2100370025 -0.01054445 -0.2272225035 +-0.3748160095 -1.090244995 0.144776001 -0.5640200195 -0.3454205015 0.020870449 +-0.5640200195 -0.3454205015 0.020870449 -0.374411499 -1.086790039 0.1627485045 +-0.374411499 -1.086790039 0.1627485045 -0.3748160095 -1.090244995 0.144776001 +-0.0132262 0.1311244965 0.055503502 -0.0135162495 0.305924988 0.090643997 +-0.0135162495 0.305924988 0.090643997 -0.0125814 0.307152008 0.0832994995 +-0.0125814 0.307152008 0.0832994995 -0.0132262 0.1311244965 0.055503502 +-0.4792275085 -0.4443664855 -0.186557495 -0.479736511 -0.3113974915 -0.226177994 +-0.479736511 -0.3113974915 -0.226177994 -0.0813919985 -0.3110629885 -0.2324494935 +-0.0813919985 -0.3110629885 -0.2324494935 -0.4792275085 -0.4443664855 -0.186557495 +-0.479736511 -0.3113974915 -0.226177994 -0.4788349915 -0.323890991 -0.146716995 +-0.4788349915 -0.323890991 -0.146716995 -0.080080002 -0.1467485045 -0.124640503 +-0.080080002 -0.1467485045 -0.124640503 -0.479736511 -0.3113974915 -0.226177994 +-0.479736511 -0.3113974915 -0.226177994 -0.081086502 -0.1343659975 -0.2044380035 +-0.081086502 -0.1343659975 -0.2044380035 -0.080080002 -0.1467485045 -0.124640503 +-0.080080002 -0.1467485045 -0.124640503 -0.479736511 -0.3113974915 -0.226177994 +-0.0813919985 -0.3110629885 -0.2324494935 -0.4792275085 -0.4443664855 -0.186557495 +-0.4792275085 -0.4443664855 -0.186557495 -0.080892502 -0.4441434935 -0.1923840025 +-0.080892502 -0.4441434935 -0.1923840025 -0.0813919985 -0.3110629885 -0.2324494935 +-0.475049011 0.304475006 0.088005501 -0.475553009 0.4375555115 0.0481623995 +-0.475553009 0.4375555115 0.0481623995 -0.076378998 0.304475006 0.0821865005 +-0.076378998 0.304475006 0.0821865005 -0.475049011 0.304475006 0.088005501 +-0.0772109985 0.4375555115 0.0420019495 -0.475553009 0.4375555115 0.0481623995 +-0.475553009 0.4375555115 0.0481623995 -0.076378998 0.304475006 0.0821865005 +-0.076378998 0.304475006 0.0821865005 -0.0772109985 0.4375555115 0.0420019495 +1.5616049805 0.0559399985 -0.0323445015 1.560925049 0.0643065035 -0.090489502 +1.560925049 0.0643065035 -0.090489502 1.56651001 0.0687679975 -0.0907070005 +1.56651001 0.0687679975 -0.0907070005 1.5616049805 0.0559399985 -0.0323445015 +-0.4209825135 -0.184117996 -0.3304974975 -0.4212099915 -0.2156869965 -0.335634491 +-0.4212099915 -0.2156869965 -0.335634491 -0.397461487 -0.2093285065 -0.2975360105 +-0.397461487 -0.2093285065 -0.2975360105 -0.4209825135 -0.184117996 -0.3304974975 +-0.397461487 -0.2093285065 -0.2975360105 -0.4209825135 -0.184117996 -0.3304974975 +-0.4209825135 -0.184117996 -0.3304974975 -0.39726651 -0.2019660035 -0.296192993 +-0.39726651 -0.2019660035 -0.296192993 -0.397461487 -0.2093285065 -0.2975360105 +-0.4207785035 0.225496994 -0.3296004945 -0.420950989 0.1964935 -0.3426579895 +-0.420950989 0.1964935 -0.3426579895 -0.3977164915 0.1983899995 -0.3013349915 +-0.3977164915 0.1983899995 -0.3013349915 -0.4207785035 0.225496994 -0.3296004945 +1.561875 0.0447851485 -0.0345699995 1.5616049805 0.0559399985 -0.0323445015 +1.5616049805 0.0559399985 -0.0323445015 1.5675550535 0.0427768515 -0.018049549 +1.5675550535 0.0427768515 -0.018049549 1.561875 0.0447851485 -0.0345699995 +1.56651001 0.0687679975 -0.0907070005 1.5616049805 0.0559399985 -0.0323445015 +1.5616049805 0.0559399985 -0.0323445015 1.567165039 0.0611829985 -0.03144705 +1.567165039 0.0611829985 -0.03144705 1.56651001 0.0687679975 -0.0907070005 +-0.420950989 0.1964935 -0.3426579895 -0.3977164915 0.1983899995 -0.3013349915 +-0.3977164915 0.1983899995 -0.3013349915 -0.397655487 0.1911390075 -0.304234497 +-0.397655487 0.1911390075 -0.304234497 -0.420950989 0.1964935 -0.3426579895 +-0.419870514 0.139267502 -0.28238501 -0.420447998 0.143171997 -0.3134150085 +-0.420447998 0.143171997 -0.3134150085 -0.397682007 0.1788685 -0.2976524965 +-0.397682007 0.1788685 -0.2976524965 -0.419870514 0.139267502 -0.28238501 +-0.397682007 0.1788685 -0.2976524965 -0.419870514 0.139267502 -0.28238501 +-0.419870514 0.139267502 -0.28238501 -0.3974995115 0.178087494 -0.290396515 +-0.3974995115 0.178087494 -0.290396515 -0.397682007 0.1788685 -0.2976524965 +-0.4196700135 -0.1706204985 -0.2493545075 -0.3972149965 -0.198953995 -0.2773359985 +-0.3972149965 -0.198953995 -0.2773359985 -0.397188507 -0.195272995 -0.2839179995 +-0.397188507 -0.195272995 -0.2839179995 -0.4196700135 -0.1706204985 -0.2493545075 +1.5621800535 -0.053380001 -0.0332249985 1.561875 0.0447851485 -0.0345699995 +1.561875 0.0447851485 -0.0345699995 1.567630005 -0.0553880005 -0.0163743495 +1.567630005 -0.0553880005 -0.0163743495 1.5621800535 -0.053380001 -0.0332249985 +-0.414251007 -0.1823329925 0.115163498 -0.4144265135 -0.2113359985 0.102217499 +-0.4144265135 -0.2113359985 0.102217499 -0.391078003 -0.2096629945 0.1434315035 +-0.391078003 -0.2096629945 0.1434315035 -0.414251007 -0.1823329925 0.115163498 +1.5675550535 0.0427768515 -0.018049549 1.561875 0.0447851485 -0.0345699995 +1.561875 0.0447851485 -0.0345699995 1.567630005 -0.0553880005 -0.0163743495 +1.567630005 -0.0553880005 -0.0163743495 1.5675550535 0.0427768515 -0.018049549 +-0.3913515015 -0.216244507 0.1405245055 -0.4144265135 -0.2113359985 0.102217499 +-0.4144265135 -0.2113359985 0.102217499 -0.391078003 -0.2096629945 0.1434315035 +-0.391078003 -0.2096629945 0.1434315035 -0.3913515015 -0.216244507 0.1405245055 +-0.4137894895 -0.2685620115 0.162369995 -0.414034485 -0.2644345095 0.1314579925 +-0.414034485 -0.2644345095 0.1314579925 -0.3909744875 -0.2295195005 0.1544795075 +-0.3909744875 -0.2295195005 0.1544795075 -0.4137894895 -0.2685620115 0.162369995 +-0.414034485 -0.2644345095 0.1314579925 -0.39104599 -0.228850006 0.1472254945 +-0.39104599 -0.228850006 0.1472254945 -0.3909744875 -0.2295195005 0.1544795075 +-0.3909744875 -0.2295195005 0.1544795075 -0.414034485 -0.2644345095 0.1314579925 +-0.398976013 -0.306601013 -0.235866501 -0.3990870055 -0.1388285065 -0.262535492 +-0.3990870055 -0.1388285065 -0.262535492 -0.081001503 -0.136151001 -0.213808502 +-0.081001503 -0.136151001 -0.213808502 -0.398976013 -0.306601013 -0.235866501 +-0.3814909975 1.058785034 -0.303561493 -0.566875 0.317303009 -0.1569295045 +-0.566875 0.317303009 -0.1569295045 -0.3813055115 1.0620200195 -0.285816986 +-0.3813055115 1.0620200195 -0.285816986 -0.3814909975 1.058785034 -0.303561493 diff --git a/2000/2000.tar.bz2 b/2000/2000.tar.bz2 new file mode 100644 index 000000000..b17f284e1 Binary files /dev/null and b/2000/2000.tar.bz2 differ diff --git a/2000/Makefile b/2000/Makefile new file mode 100644 index 000000000..ae5f6991c --- /dev/null +++ b/2000/Makefile @@ -0,0 +1,214 @@ +#!/bin/make +# 2000 makefile +# +# Copyright (C) Simon Cooper, Landon Curt Noll, Peter Seebach +# and Leonid A. Broukhis, 2000. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from the contest judges. + +SHELL= /bin/sh +CAT= cat +RM= rm +SED= sed +TRUE= true + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O. +# A few compilers have broken optimizers and thus you may +# not want anything. +# +#OPT= +#OPT= -O +OPT= -O2 + +# flags for ANSI compiles +# +# NOTE: Some ANSI compilers make use of -Xa to turn on ANSI mode, +# others such as gcc may want -ansi, others (Compaq Tru64 Unix) +# want -std1, and others may want nothing at all. +# Adjust the CFLAGS line as needed. +# +# NOTE: Some compilers cannot optimize, or optimize some entries +# incorrectly. You might want to turn on -O to see if your +# compiler can handle them. +# +# +#CFLAGS= -Xa ${OPT} +#CFLAGS= -std1 $(OPT) +CFLAGS= -ansi ${OPT} + +NO_ANSI_CFLAGS= +#NO_ANSI_CFLAGS= + +# NOTE: On some systems, the library path does not include the location +# of the X11 libraries. You might need to use a -L/path/to/X11/lib/dir +# in order to compile with these libs. +# +X11CCFLAGS= -I/usr/X11R6/include -I/usr/X11R6/include/X11 -I/usr/include/X11 +#X11CCFLAGS= +X11LDFLAGS= -L/usr/X11R6/lib +#X11LDFLAGS= + +# Perl +# +PERL= perl +#PERL= perl5 + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +MAY_NEED_GCC= gcc + +# winners that compile under ANSI C +# +WINNERS= anderson schneiderwent primenum bellard bmeyer briddlebane dhyang \ + dmy2jd jarijyrki dlowe natori rince robison thadgavin tomx +ALT_NAMES= schneiderwent.orig briddlebane.orig thadgavin.orig +DATA_FILES= schneiderwent_files bmeyer_files jarijyrki_files + + +all: ${WINNERS} + +# Best use of flags +# +anderson: anderson.c + ${CC} ${CFLAGS} $? -o $@ + +# Most Timely Output +# +schneiderwent: schneiderwent.c + ${CC} ${CFLAGS} $? -o $@ + +schneiderwent_files: schneiderwent.data + +schneiderwent.orig: schneiderwent.orig.c + ${CC} ${CFLAGS} $? -o $@ + +# Best Abuse of CPP +# +primenum: primenum.c + ${CC} ${CFLAGS} $? -o $@ + +# Most Specific Output +# +bellard: bellard.c + ${CC} ${CFLAGS} $? -o $@ + +# Best Utility +# +# machines operating in 64 bit mode: +# +bmeyer: bmeyer.c + ${CC} -DY= -O6 $? -o $@ -lm +# +# linux/x86, glibc 2.0, libc4/5: +# +# bmeyer: bmeyer.c +# ${CC} -DY="__setfpucw(0x127f)" -O6 $? -o $@ -lm +# +# linux/x86, glibc 2.1: +# +# bmeyer: bmeyer.c +# ${MAY_NEED_GCC} -DY='int x=0x127f; __asm__ ("fldcw %0" : : "m" (*&x))' \ +# -O6 $? -o $@ -lm + +bmeyer_files: lavabus.pgm lenna.glic michael.pgm + +# Best Abuse of User +# +briddlebane: briddlebane.c + ${CC} ${CFLAGS} $? -o $@ -lm + +briddlebane.orig: briddlebane.orig.c + ${CC} ${CFLAGS} $? -o $@ -lm + +# Best Layout +# +dhyang: dhyang.c + ${CC} ${CFLAGS} $? -o $@ + +dmy2jd: dmy2jd.c + ${CC} ${CFLAGS} $? -o $@ + +# Best of Show +# +jarijyrki: jarijyrki.c + ${CC} ${X11CCFLAGS} ${CFLAGS} -DNeedFunctionPrototypes \ + -DU=40 -DT=98 '-Dz=(T+1)*U*U' -DQ=80 -DS=20 -DN=10 -DB=5 -DG=23 \ + -Dp=7 '-DM=((p+1)*Q)+S' '-DH=(G*S)+S+S' -DC=XK_Up -DL=XK_Down \ + -DO=XK_Left -DV=XK_Right -DR=XK_Escape -D_=XK_BackSpace \ + $? -o $@ ${X11LDFLAGS} -lX11 + +jarijyrki_files: sheet1.info + +# Worst Abuse of the Rules +# +# NOTE: You will need to adjust this path to the place where Perl has been +# installed on your system. Running "perl -V" may help you locate +# this place. +# +# The following bit of perl may help determining the values you need: +# +# perl -MConfig -e 'print "$Config{archlibexp}/CORE\n"' +# +# +dlowe: dlowe.c + ${CC} ${NO_ANSI_CFLAGS} -DPERL_POLLUTE \ + `${PERL} -MExtUtils::Embed -e ccopts` $? -o $@ \ + `${PERL} -MExtUtils::Embed -e ldopts` + +# Best Small Program +# +natori: natori.c + ${CC} ${CFLAGS} $? -o $@ -lm + +# Astronomically Obfuscated +# +rince: rince.c + ${CC} ${X11CCFLAGS} ${CFLAGS} -DM_PI=3.14159265358979323846 \ + $? -o $@ -lm ${X11LDFLAGS} -lX11 + +# Best game +# +robison: robison.c + ${CC} ${CFLAGS} $? -o $@ + +# Most Portable Output +# +thadgavin: thadgavin.c + ${CC} ${CFLAGS} $? -o $@ -lcurses -lm + +thadgavin.orig: thadgavin.orig.c + ${CC} ${CFLAGS} $? -o $@ -lncurses -lm + +# Most Complete Program +# +tomx: tomx.c + ${CC} ${CFLAGS} $? -o $@ + +everything: ${WINNERS} ${ALT_NAMES} ${DATA_FILES} + +clean: + ${RM} -f *.o a.out core ${WINNERS} + +clobber: clean + ${RM} -f ${WINNERS} + ${RM} -f ${ALT_NAMES} + +nuke: clobber + @${TRUE} + +install: all + ${CAT} ${WINNERS} ${ALT_NAMES} > /dev/null diff --git a/2000/README b/2000/README new file mode 100644 index 000000000..55459a2b2 --- /dev/null +++ b/2000/README @@ -0,0 +1,120 @@ +2000 marked the "The Fifteenth International Obfuscated C Code Contest" + +Copyright (C) Landon Curt Noll, Simon Cooper, Peter Seebach +and Leonid A. Broukhis, 2000. +All Rights Reserved. Permission for personal, educational or non-profit +use is granted provided this copyright and notice are included in its +entirety and remains unaltered. All other uses must receive prior permission +from the contest judges. + + +Standard IOCCC stuff +-------------------- + +Use make to compile entries. It is possible that on non-Un*x / non-Linux +systems the makefile needs to be changed. See the Makefile for details. + +Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitters. + +Read over the makefile for compile/build issues. Your system may +require certain changes (add or remove a library, add or remove a +#define). + +Some ANSI C compilers are not quite as good as they should be. If +yours is lacking, you may need to compile using gcc instead of your +local compiler. + + +New Judge +--------- + +The judges were unable to contact Jeremy Horn for judging the 2000 contest. + +As a result, Simon Cooper: + + http://www.sfik.com/ + +joined our team. Simon is well known for being a co-author of the 2nd +edition of the Building Internet Firewalls book. + + +Remarks on some of the entries +------------------------------ + +There were some outstanding entries that did not win. Unfortunately +some very good entries lost because they: + + + depended too much on non-portable side effects in expressions; + + depended too much on a particular byte order; + + required the use of a special script, data file or pseudo-machine + language that was not supplied with the entry. + +We hope the authors of some of those entries will fix and re-submit +them for the next IOCCC. + +We believe you will be impressed with this year's winners. The +Best of Show is a fine example of compact obfuscation. But don't +ignore the shorter winners. The Best Small Program, Best Abuse of +User and Most Complete Program are well worth studying in detail. + +The Worst Abuse of the Rules is technically allowed by the rules. +We gave it an award this year, but don't assume you can get away +with using it next time ... :-) + +Speaking of time, be sure to check out the Astronomically Obfuscated +and the Most Timely Output. + + +There was no 1999 contest +------------------------- + +So what happened to 1999? Landon Curt Noll was scheduled to take a +vacation from the IOCCC this year. The remaining judges were +unable to contact Jeremy Horn, so the IOCCC stalled. + +But thanks to Landon's returning early from his IOCCC vacation (Landon +will take a full IOCCC vacation during some other year), Simon Cooper +joining the IOCCC judging team as well as the hard work of Peter Seebach +and Leonid A. Broukhis the judging was completed in Dec 2000. + +It was decided that the 15th contest would be the year 2000 contest +(the year the judging completed) rather than year 1999 (the initial +scheduled start of the contest). That is why there is no 1999 contest. + + + +Final Comments +-------------- + +Please send us comments and suggestions what we have expressed above. +Also include anything else that you would like to see in future contests. +Send such email to: + + questions@ioccc.org + +If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used. + +You must include the words ``ioccc question'' in the subject of your EMail +message when sending EMail to the judges. + +If you have problems with any of the entries, AND YOU HAVE A FIX, please +EMail the fix (patch file or the entire changed file) to the above address. + +The next IOCCC is planned to start towards early spring 2001. Watch: + + http://www.ioccc.org/ + +for news of the next contest. + +=-= + +p.s. The has been mentioned in an Amici Curiae for the DeCSS case. See: + + http://cryptome.org/mpaa-v-2600-bac.htm + +and seach on the word ioccc (twice). + diff --git a/2000/anderson.c b/2000/anderson.c new file mode 100644 index 000000000..e4e07d060 --- /dev/null +++ b/2000/anderson.c @@ -0,0 +1,58 @@ +#include + +char +*T="IeJKLMaYQCE]jbZRskc[SldU^V\\X\\|/_<[<:90!\"$434-./2>]s", +K[3][1000],*F,x,A,*M[2],*J,r[4],*g,N,Y,*Q,W,*k,q,D;X(){r [r +[r[3]=M[1-(x&1)][*r=W,1],2]=*Q+2,1]=x+1+Y,*g++=((((x& 7) +-1)>>1)-1)?*r:r[x>>3],(++x<*r)&&X();}E(){A||X(x=0,g =J +),x=7&(*T>>A*3),J[(x[F]-W-x)^A*7]=Q[x&3]^A*(*M)[2 +( +x&1)],g=J+((x[k]-W)^A*7)-A,g[1]=(*M)[*g=M[T+=A ,1 +][x&1],x&1],(A^=1)&&(E(),J+=W);}l(){E(--q&&l () +);}B(){*J&&B((D=*J,Q[2]= +97&&D<123&&(*r=0,*g++=D-95)||!(D-k[ 3] +)&&(*r=0,*g++=12)||D>k[3]&&D<=k[ 1] +-1&&(*r=0,*g++=D-47),J++));}j( ){ +putchar(A);}b(){(j(A=(*K)[D* W+ +r[2]*Y+x]),++x <> <> <> <> <> + _() ()/ ()/ ()/ _\) () (/_ _\) + [] /^ |^^ /^^ /^^ [] ^^ |^^| ^^ [] [] ^^ + <>[ [][ <>][ <>][ ][ [][] ][ ][ + + + <> [] + _()_ ()/ |() () + [] ^^ [] /^^ ^^| |^^| + ][ <>][ ][] [][] + + The program is obfuscated without the use of the preprocessor or any + special compilation parameters. In fact, the program doesn't even + bother using any keywords, save the single 'char' at the beginning. + This program was crafted using only operator precedence rules, + short-circuit evaluation and recursion. Each function contains a + single, non-empty statement. (I did have to add a couple of empty + statements to format the code properly.) There is a single string + constant which encodes the flag positions and other data needed for + drawing the semaphore codes. + + The preprocessor will provide no help in un-obfuscating this code, and a + C beautifier won't get you very far either. You just have to crunch + through it. + + An ANSI C compiler will generate several warnings when it compiles this + program, as none of the functions declare their return type, nor do they + return anything. This was necessary to keep the program free of + keywords. It's valid in K&R C, and compiles in ANSI C. There are also + warnings about conversion from 'int' to 'char' and the resulting loss of + data. Again, if it's OK with K&R, it's OK with me. + + This program is a great teaching tool for learning the semaphore code; + and if you don't have any flags handy you can just use two copies of the + source file. diff --git a/2000/bellard.c b/2000/bellard.c new file mode 100644 index 000000000..dc10e16a8 --- /dev/null +++ b/2000/bellard.c @@ -0,0 +1,37 @@ +int m = 754974721, N, t[1 << 22], a, *p, i, e = 1 << 22, j, s, b, c, U; +f (d) +{ + for (s = 1 << 23; s; s /= 2, d = d * 1LL * d % m) + if (s < N) + for (p = t; p < t + N; p += s) + for (i = s, c = 1; i; i--) + b = *p + p[s], p[s] = (m + *p - p[s]) * + 1LL * c % m, *p++ = b % m, c = c * 1LL * d % m; + for (j = 0; i < N - 1;) + { + for (s = N / 2; !((j ^= s) & s); s /= 2); + if (++i < j) + a = t[i], t[i] = t[j], t[j] = a; + } +} + +main () +{ + *t = 2; + U = N = 1; + while (e /= 2) + { + N *= 2; + U = U * 1LL * (m + 1) / 2 % m; + f (362); + for (p = t; p < t + N;) + *p++ = (*p * 1LL ** p % m) * U % m; + f (415027540); + for (a = 0, p = t; p < t + N;) + a += (6972593 & e ? 2 : 1) ** p, *p++ = a % 10, a /= 10; + } + while (!*--p); + t[0]--; + while (p >= t) + printf ("%d", *p--); +} diff --git a/2000/bellard.hint b/2000/bellard.hint new file mode 100644 index 000000000..f0da21662 --- /dev/null +++ b/2000/bellard.hint @@ -0,0 +1,38 @@ +Most Specific Output: + + Fabrice Bellard + 451 chemin du mas de Matour + 34790 Grabels + France + + http://www.enst.fr/~bellard + + +Judges' Comments: + + To build: + + make bellard + + To run: + + ./bellard + + This code is an nice compact example of a Modular Fast Fourier Transform. + While its output is very specific, the internal FFT has a wide variety + of uses. + + Can you modify this code to produce primes such as 23523*2^70000-1, + 48594^65536+1 or 6917!-1? + + +Selected Author's Comments: + + This program prints the biggest known prime number (2^6972593-1) + in base 10. It requires a few minutes. It uses a Modular Fast + Fourier Transform to compute this number in a reasonable amount + of time (the usual method would take ages !). + + The program uses >= 64 bit 'long long' type. It should run on any + system with a gcc compiler. + diff --git a/2000/bmeyer.c b/2000/bmeyer.c new file mode 100644 index 000000000..1cbb6052e --- /dev/null +++ b/2000/bmeyer.c @@ -0,0 +1,60 @@ + #include + #include +#define a typedef +a long N; +#define i =m(p(r,o,v),e,d +N G,l,I,C,B,A,W,L,S +, R,O,c,k,s = +80, U=13 +,T=169; a double P; + #define F for( + a P*E; a char*w; P sqrt(P); N H(){ F; + O=scanf(" %[#]%*[^\n]",&O); ); scanf("%ld%*c",&O); + #define D return + D O; } + + + +#define V =malloc(sizeof( +#define M M( +#define X += +P M N R){ s= s>=k?printf( "%ld%c" ++3*(C<1),s-k, R&7?32:10):s; D R>0?B +/2?H():getchar ():R?.9+.7*M R+1):0; } +P t(N x,P K){ D x?(x>U?0:t(x+2,K)*(x-1) +/x/K)+1/sqrt(K): t(2,K*K/U+1)*K; } N _(N +J,N x){ F*(x?&W:& A)=W+J+x; (O=x=W/(J=k*k)) +||AW; ){ *A/=*W; F O=R; O; O--)A[O]-= +W[O]**A; A-=U; } W X 14; } D*W; } int main(int z,w*y){ N K=s,g; Y; +M z); s= B=C=15-H(); s=G= M 8); s=l=M C); G*=g=C%3?1:3; if(I=s=M 8)){ N +b=G+9,x=b*340+U,J=b*(l+5), * n V N ) * J ),*j=n+5*b; E h V P)*x),q=h+b,e=q+ +b; P d=K; F; J--; )n[J]=J0?K=R,c :-2*R; +} z=G/K+1; z X g>z; I++; c++; F ; ++ Jc; ){ P l=0 + ; N H = C+c/2+1; H%=c; H X(f+Q+c-2*H)/2/c*c; l= + Z(Q); O=(A-W)*Z(H)/Z(f); _(O,R=B?K>= H:L/k>O+W); *( + R?&Q:&f)=H; } Q X f; *S=*j=Q/=2; s=B?s:Q+k; f=Q+n[x/z]; + n[x/z]=x%z+J%(z*2/g)?f:!putc(x?l[4*g*f/z/z/I-8]:10,stderr); + H-=U; F O=156; O--; ){ H--; *H=e[O%U]*e[O/U]/y+.8**H; } C-=Q+.5 +; y i/.9)-Q-C; p(p(r+T,r,r),H,r); h[x]=.7*h[x]+C*C; u X h[x]; u*=.7 + ; d X C>0?-y:y; } } j X 9; } _(_(x,x),x); } D 0; } diff --git a/2000/bmeyer.hint b/2000/bmeyer.hint new file mode 100644 index 000000000..25cbee753 --- /dev/null +++ b/2000/bmeyer.hint @@ -0,0 +1,351 @@ +Best Utility: + + Bernd Meyer + Monash University, Melbourne, Australia + 1/832 Blackburn Rd + Clayton, VIC 3168 + Australia + + http://byron.csse.monash.edu.au/ + + +Judges' Comments: + + To build: + + make bmeyer + + Compile with the maximum possible optimization on your system. + If your system has 80-bit internal representation of floating + point values (x86, some Motorola processors) and you want the + compressed format to be portable across platforms, you need + to set your FPU to use 64 bit mode. See the extra build lines + in the Makefile, and read the author's comments below. + + If you cannot work out hwo to get into 64 bit mode, you can + try using -ffloat-store if you compile with GCC (this may have + a performance penalty). The resulting binary will have a good + chance to produce portable files, but due to the resulting + double-rounding (first internally to 80 bit, then to 64 bit + on writing the value to memory), there is a small but very real + chance any given file produced might not be portable. + + To run: + + In a video window (white text on black background): + + ./bmeyer < michael.pgm > michael.glic + + Compare the michael.pgm to the screen output. + + To test that you are compressing and decompressing the same way the + author was, try + + ./bmeyer < lenna.glic + + Also try in a reverse video window: + + ./bmeyer < michael.pgm 2>/dev/null | ./bmeyer > new.pgm + + Compare the michael.pgm to the screen output. Compare the new.pgm file + to the michael.pgm file. + + Create a large reverse video xterm, say 200 columns wide and try: + + ./bmeyer 200 < lavabus.pgm > lavabus.glic + + Produce an even smaller output: + + ./bmeyer -2 200 < lavabus.pgm > lavabus.glic2 + + Decompress that smaller glic-file: + + ./bmeyer -2 200 < lavabus.glic2 > new.pgm + + Compare the new.pgm file to the lavabus.pgm file by viewing + them. + + Don't even think of supplying different compression factors (the + dashed argument) for compression and decompression! You've been warned. + + +Selected Author's Comments: + + GLICBAWLS + + A) Function + =========== + + "GLICBAWLS" stands for: + + "Grey Level Image Compression By Adaptive Weighted Least Squares". + + And that's exactly what this program does --- feed it a .PGM file + (either raw [i.e. P5] or ascii [i.e. P2]) on stdin, and it will + output a compressed version to stdout. Feed it a compressed file + on stdin, and it will decompress it to stdout --- as either raw or + ascii .PGM, depending on what format it was compressed from. For + example: + + ./bmeyer < michael.pgm > michael.glic + + and then + + ./bmeyer < michael.glic > michael.decoded.pgm + + As it turns out, glicbawls compresses greyscale images (or, more + precisely, "natural" greyscale images) better than any other + program I am aware of (with the exception of the not-yet-published + program developed for my PhD thesis). Of course, this might take + some time, so a progress indicator is provided. To make things + more interesting, instead of a boring bar or percentage display, + an ASCII rendition of the image being compressed/decompressed is + output to stderr (assuming white text on black background). If you + have trouble recognizing the image, try squinting at it ;-). + + If you still have trouble, simply use a terminal or xterm with + more than 80 columns, and tell glicbawls about it by giving the + number of columns as an argument. For example + + ./bmeyer 260 lavabus.glic + + will allow glicbawls to use up to 260 columns, which makes things + much more recognizable. + + Still running out of space? Need to compress those images just a + tad more? And maybe you can handle some loss due to the + compression? If so, you can use glicbawls' "near lossless" + compression mode. In that mode, the decoded pixel values are + allowed to differ from tbe originals, but there is an upper limit + on the magnitude of the difference. For example, if a maximum + error of 2 is allowed, an original pixel value of 37 could be + decoded as 35,36,37, 38 or 39. In order to use this mode, simply + give the maximum allowed error as an argument, with a dash ('-') + before it. For example + + ./bmeyer -2 < graph.pgm > graph.2.glic + + will compress in a way that allows decompression with a maximum + error of two. You can combine both types of arguments, i.e. + + ./bmeyer -3 180 < graph.pgm >graph.3.glic + + will compress with a maximum error of 3, using a 180 column + terminal for the progress display, and + + ./bmeyer -3 180 < graph.3.glic > graph.3maxerr.pgm + + will decompress the result on such a terminal. + + But wait, there is more --- you can also feed glicbawls .PPM files + (i.e. colour images), raw or ascii, your choice. Glicbawls will + compress and decompress them just fine. However, it only does + "reasonably well" on them; It beats PNG easily, but there are + certainly programs out there that can compress colour images + considerably better. And don't even *think* about using it for + so-called "artistic" images (i.e. anything that wasn't scanned + from a photo or camera).... + + ***************************************************************** + * * + * WARNING WARNING WARNING WARNING WARNING WARNING WARNING * + * * + * * + * Glicball is rather CPU and FPU intensive. Don't * + * run it on anything slow. Things start to be * + * usable around 300+MHz, with 600+ being highly * + * desirable. * + * * + ***************************************************************** + + + + B) Compile Instructions + ======================= + + Unlike most compression program, glicbawls makes heavy use of + floating point maths --- and not all FPUs are created equal. Most + importantly, the x86 and 68k FPUs use 80 bit floating point + formats internally, while most other processors use IEEE 64 bit + formats by default. If not taken care of, this means that a + glicbawls file compressed on one CPU cannot generally be + decompressed on another. + + Fortunately, just about all current FPUs can be put into IEEE 64 + bit mode (or at least something close enough for + glicbawls). Unfortunately, there is no standard way of doing + so. For this reason, the build file contains *three* compile + lines; One for machines that already use 64 bit mode by default + (most RISC processors), one for linux/x86 machines using libc4, + libc5 or glibc2.0, and one for linux/x86 machines using glibc2.1 + (glibc2.1 no longer exports the __setfpucw function, necessitating + the use of gcc inline assembly. *Grumble*). + + So, if you are building on a machine that does not, by default, + use IEEE 64 bit floating point doubles, you'll have to define Y to + be a command that switches it into that mode. If you fail to do + so, your glicbawls executable will still be able to decompress its + own compressed files, but you may be unable to exchange files with + glicbawls on other machines. + + + C) Obfuscation + ============== + + Most of the obfuscation of this program was driven by the + desperate struggle to fit all of glicbawls' features into code + that fits the IOCCC's size limits. All identifiers names are + single-character, which was only possible by ruthless exploitation + of scope. There is a function M() that handles nearly all input + from stdin, handles all output to stdout, and also recursively + calculates one of the mathematical expressions needed for error + modelling. There is a function that calculates (A^(-1)*b)*x with A + a matrix and b and x being vectors, and does so in a very + efficient way --- but one would be hard pressed to find it. There + is an arithmetic coder that is even less recognizable. A lot of + loop variables don't get initialized, but instead the code is + arranged in such a way that they just happen to have the right + value when control flow reaches the loops. Lots of functions use + the same two global scratch variables. Variables change their + meaning all the time, and the differences between compressing and + decompressing are handled in rather subtle ways all over the + program. The string that holds the ascii values for displaying the + progress image doubles as a description on how to find a pixel's + causal neighbours. And then there are a few #define's that really + are just in there to save a few characters, but as an added + "benefit" make the source ever more unreadable. + + In short --- running it through the preprocessor and the + pretty-printer will give you something that looks slightly less + like line noise and slightly more like a C program, but unless you + are a true wizard, it is unlikely to gain you any insights into + what is actually going on....[0] + + + D) Bugs, Assumptions and TODOs + ============================== + + Glicbawls assumes that characters are 8 bit wide, and that the + character set used is ASCII. If one of these isn't true, all hell + will break loose. + + The .PGM headers are not checked very thoroughly --- glicbawls + will happily try to encode lots of files that it shouldn't + touch. The old adage of "garbage in, garbage out" holds in that + case. Furthermore, even if glicbawls detects an incorrect input, + it fails to provide a meaningful error message, and instead + simply aborts. + + When decompressing a near-losslessy encoded image, the maximum + allowed error is required as a command line parameter. This should + really be saved in the compressed file! + + Glicbawls relies on the decimal representation of all integers + having less than 255 digits. While ANSI C does not guarantee this, + it seems rather unlikely that anyone in the foreseeable future + would use images with 10^255 rows, columns or different levels of + grey. Also, it is assumed that any integer used can be cast to a + double and back without loss of precision. This limits the number + of rows, columns and grey levels to 9 quintillion, which should + also be sufficient for the next few years. + + There is a theoretical chance that you might get a division by + zero error. You have a MUCH better chance of getting hit by + lightning the very second you realize that you just won a few + million in a lottery. But if it happens to you, don't say I + didn't warn you! Instead, go out and buy a lightning rod and a + lottery ticket ;-) + + At one point, a pointer to int is used as the target of a "%1[#]" + conversion in a scanf, which makes gcc rather unhappy, but + shouldn't really cause anyone any trouble. The same goes for a + couple of assignments which are used as truth values. + + + E) Algorithm + ============ + + An exhaustive explanation of the algorithm used would go beyond + the scope of an info file, and would also be quite difficult in + pure ASCII, so the following is just a rough outline, and contains + some compression-speak... + + The image is handled in scanline ordering. For each pixel, an + expected value is calculated by creating a least squares predictor + of order 12 based on all of the previously encoded/decoded + pixels. However, the contribution of each pixel is weighted + according to its Manhattan-distance from the current pixel, + D. That weight used is pow(0.8,D). [1][2][3] + + + In a similar way, the prediction *errors* for all previous pixels + are combined --- a weighted average (with weight pow(0.7,D)) of + the squares of all previous prediction errors is taken, and the + square root of the (appropriately scaled) result is called sigma. + + The predicted value and sigma are then used as the parameters of a + Student or t-distribution (which is similar to a normal + distribution, but has more weight in the tails), providing a + probability distribution for the current pixel. + + Next, the possible interval of values for the current pixel is + halved, and through integration of the probability distribution, a + probability is calculated for the pixel value being in the lower + half. During encoding, the actual value is examined, and the + result encoded using an arithmetic coder. During decoding, the + arithmetic decoder provides the information which half the actual + value is in. In both cases, the interval borders are adjusted + accordingly, the arithmetic coder/decoder updated, and the + interval halving repeated until the precise value has been + en/decoded[4]. + + + [0] Yes, this could be seen as a challenge.... + [1] Actually, the weight is pow(0.8,D)/s, where s is the sigma + used for en/decoding the particular previous pixel. Dividing + by s is a rather arbitrary action justified only by the + improvement in results. Mathematically, I can only justify + dividing by s^2, or not dividing at all.... + [2] Obviously, these least squares predictors are not calculated + from scratch for each pixel. Some clever reuse of earlier + results allows O(1) calculation, rather than the + O(previous_rows*columns) this description would suggest. + [3] As anyone who has ever tried local least squares knows from + bitter experience, there is a lot of numerical instability + associated with them. So glicbawls adds a bias towards an + averaging predictor to the equation system the least squares + predictor is calculated from. The weight that is given to + this bias is constantly adjusted throughout coding/decoding, + thus justifying the 'a' in "glicbawls". + [4] In the case of near-lossless coding, the interval is not + necessarily *halved*, but rather split at a convenient point + (the split points are chosen in such a way as to minimise the + expected number of bits needed for coding). Also, the + iteration ends as soon as the interval is small enough to + guarantee decoding within the requested maximum error. + + #################################################################### + + Photo Credit: + + Lavabus was taken by the judge, Landon Curt Noll. Michael was + provided by the author. Lenna is a 1972 Playboy centerfold. + + michael.pgm + + The author's Godchild and nephew. + + lavabus.pgm + + A bus that was trapped by lava from Kilauea volcano in + Hawaii, USA. Nobody was in the bus at the time, BTW. + Photo date: 1981. + + lenna.glic + + A November 1972 Playboy centerfold was scanned in long ago and + has been used for image compression research since then. Playboy + originally threatened to prosecute unauthorized use, but + eventually granted that, having been in use for image compression + testing for so long, it was now a useful benchmark. (Note: This + picture doesn't show very much.) diff --git a/2000/briddlebane.c b/2000/briddlebane.c new file mode 100644 index 000000000..9f944cea3 --- /dev/null +++ b/2000/briddlebane.c @@ -0,0 +1,20 @@ +#include +#include +#include +#include +#define e(t, v, w) n t(u x, u y) { n a = sqrt(x+y); r ((v - a) * (w - a)); } +#define w while( +#define r return +typedef char u; typedef short q; typedef double n; +u *z = "Z\253\345\252\256\351\325\232\265f\256\246nyZf\253U^\266\232]z\352i\236\226i[m\266\351\252\255\246\235V\247e\235\226\276Z\371jUg\x3\362\212pX\254\251PH\253\332\225\373\235\b\v\336HO.\203Qf\201\x1d\207\211\357\367S7|)=\331n\x4!E<\233Z\246\x1flv\232d(r\263\274\375\313\305\200\361\302\327\274\375\300\201c\250-|\246]\304\253I\377W\227R^\251\350\x2""C\251\203\311O\346\242\vDh\r\357\306x\325\274\315\366c\th\325\272\376\311X+:\325\354q\263|\257\x1c\327\316g\204\266s\211\357\370A(\x11""D\321\x1d:\352\327\x1bk@\x11""E-\310s\271\235\304\273\x2+\x4I\274jT\256\363\214\307{\232a\3270\a+qm\270\aI\315\337\220\x17\x18\315G\217\371@\215\335\v[v\335\205\343\250-|\246\373:\225\f\2552Oe]\206U\272\355\x10\327)u\rY]\276>\243\333w{3\x19\v""acC8\3775\351\b\377\204lJnsy.:\330\2553rKx'\362'!%\302\271\376|\236skq\242C\251\263&\x15K\x4""fA\227\211\242r7]\371\333\200z%\277\207CJ\255^}\264\237\327\275Z\n;L\x1aN#\371N\354G\256skq\242K!\364\211E\214\x17\377\343z\340w\233\272\354eTD\262t\365\335[_\233\225J\313\2746\334\x3\b\244F&\240]\222\332\210\351\376rJs<\2265I;\203Xd\272\377\345\214\x17\263]2I\237\302\253\346\355\332\343\350G\327\"\350f}\301n\223\366\300\210\343j\247\316%\363\210\345\n\252\215c\255\314\3248\300\261\350RM7\203\261\371\265\r_\220\x17\x19\a(+u\x1d=I\235\314\331@\310Cl\x16\210\307\345\357\306\x1f""e\345R\354y\257\367\350!.\x1f`\345uW&\204\246\367>\226\335\205\353\x18\336;\302\334\266\213Fn\233\201vAE\325+qnVR\222e\237E=0)||(fabs(x) > 5) || (fabs(y) > 5)); +r ((y+5) * 11) + x + 7; } u k(q x, u l) { u o = 0; F = 0; w F < 189) { B =C = +0; w 1) { y = ((z[F/4]>>((F++%4)*2))&3) - 1; if (y&2) +break; C = (C*2)+y, ++B; } if (!(C - x | B - l)) r (o<26)?o+0x61:((2108973>>( +(o-26)*8))&47); ++o; } r 1; } u s[1079]; u *E(u v) { u *x = s; w v--)w *(x++) +); r x; } main() { q A = 0, B = 0, C = 1078; u l = 0; u *p = s; srand(time( 0 +) ); w C) { A = (A*2) + ((((z[B/8+48]+114)^2)>>(7-(B++%8)))&1),++l; x = k(A,l +); if (x-1) { *(p++)=x, A=l=0, C--; } } printf("%s%s %s%s%s\n", E(0), E(f(c)) +, E(f(a)), E(1), E(f(b))); } diff --git a/2000/briddlebane.hint b/2000/briddlebane.hint new file mode 100644 index 000000000..88181b3f4 --- /dev/null +++ b/2000/briddlebane.hint @@ -0,0 +1,56 @@ +Best Abuse of User: + + Moxen N. Briddlebane + 24 Oxtree Ave. + The Xoemn, MN 68214 + + Lord Zarbon + 24 Oxtree Ave. + The Xoemn, MN 68214 + + +Judges' Comments: + + To build: + + make briddlebane + + To run: + + ./briddlebane + + One could argue that this program was a "diseased dumpster of tripe" + but I suspect that would only result in the judges being heckled as a + "scum-encrusted congress of obscurity" (but only if it was in the early + evening of Dec 22, 2000). + + Can you find out how it stores the insult strings? Can you then take + an insult and figure out when it will be uttered? + + [sc] The code also contains a buffer overflow bug which I have fixed! + The array size of "s" should be 1079 characters long. (From 0 to 1078 + inclusive!). Without this it results in an error in the encoding of + "decrepit" -- For a 32bit little endian machine using GCC (because of + the way it assigns variables to memory) it will terminate "decrepit" + with the character '\200' (the last value of F) instead of '\0'. + + +Selected Author's Comments: + + This program was broadcast from deep within the Zarbonic Cluster + and received at 9:03pm on March 21st, 2000 by Moxen N. Briddlebane. + The original author, as designated by other components of the + transmission, refers to himself simply as "Lord Zarbon", though + offers no information in relation to the significance of that + post. The sole purpose of this program appears to be to degrade + and humiliate the people of this planet by calling them names. + It takes no input, only produces a single line of slanderous output. + + The program appears to be rather confused, internally. It is + unclear whether or not "Lord Zarbon" truly understands the + mechanics of programming. What is particularly disturbing is + the curious method of insult-encoding employed by this program. + Furthermore, it is ambiguous how said data is arranged and why + it is necessary to resort to trigonometric functions to handle + it. One of the real mysteries involves the numbers "114" and + "2", which are, according to Lord Zarbon, very deliberate. diff --git a/2000/briddlebane.orig.c b/2000/briddlebane.orig.c new file mode 100644 index 000000000..bc340b314 --- /dev/null +++ b/2000/briddlebane.orig.c @@ -0,0 +1,20 @@ +#include +#include +#include +#include +#define e(t, v, w) n t(u x, u y) { n a = sqrt(x+y); r ((v - a) * (w - a)); } +#define w while( +#define r return +typedef char u; typedef short q; typedef double n; +u *z = "Z«åª®éÕšµf®¦nyZf«U^¶š]zêiž–i[m¶éª­¦�V§e�–¾ZùjUg\x3òŠpX¬©PH«Ú•û�\b\vÞHO.ƒQf�\x1d‡‰ï÷S7|)=Ùn\x4!E<›Z¦\x1flvšd(r³¼ýËÅ€ñÂ×¼ýÀ�c¨-|¦]Ä«IÿW—R^©è\x2""C©ƒÉOæ¢\vDh\rïÆxÕ¼Íöc\thÕºþÉX+:Õìq³|¯\x1c×Îg„¶s‰ïøA(\x11""DÑ\x1d:ê×\x1bk@\x11""E-Ès¹�Ä»\x2+\x4I¼jT®óŒÇ{ša×0\a+qm¸\aIÍß�\x17\x18ÍG�ù@�Ý\v[vÝ…ã¨-|¦û:•\f­2Oe]†Uºí\x10×)u\rY]¾>£Ûw{3\x19\v""acC8ÿ5é\bÿ„lJnsy.:Ø­3rKx'ò'!%¹þ|žskq¢C©³&\x15K\x4""fA—‰¢r7]ùÛ€z%¿‡CJ­^}´Ÿ×½Z\n;L\x1aN#ùNìG®skq¢K!ô‰EŒ\x17ÿãzàw›ºìeTD²tõÝ[_›•J˼6Ü\x3\b¤F& ]’ÚˆéþrJs<–5I;ƒXdºÿåŒ\x17³]2IŸÂ«æíÚãèG×\"èf}Án“öÀˆãj§Î%óˆå\nª�c­ÌÔ8À±èRM7ƒ±ùµ\r_�\x17\x19\a(+u\x1d=I�ÌÙ@ÈCl\x16ˆÇåïÆ\x1f""eåRìy¯÷è!.\x1f`åuW&„¦÷>–Ý…ë\x18Þ;Âܶ‹Fn›�vAEÕ+qnVR’eŸE=0)||(fabs(x) > 5) || (fabs(y) > 5)); +r ((y+5) * 11) + x + 7; } u k(q x, u l) { u o = 0; F = 0; w F < 189) { B =C = +0; w 1) { y = ((z[F/4]>>((F++%4)*2))&3) - 1; if (y&2) +break; C = (C*2)+y, ++B; } if (!(C - x | B - l)) r (o<26)?o+0x61:((2108973>>( +(o-26)*8))&47); ++o; } r 1; } u s[1079]; u *E(u v) { u *x = s; w v--)w *(x++) +); r x; } main() { q A = 0, B = 0, C = 1078; u l = 0; u *p = s; srand(time( 0 +) ); w C) { A = (A*2) + ((((z[B/8+48]+114)^2)>>(7-(B++%8)))&1),++l; x = k(A,l +); if (x-1) { *(p++)=x, A=l=0, C--; } } printf("%s%s %s%s%s\n", E(0), E(f(c)) +, E(f(a)), E(1), E(f(b))); } diff --git a/2000/dhyang.c b/2000/dhyang.c new file mode 100644 index 000000000..34b00bf61 --- /dev/null +++ b/2000/dhyang.c @@ -0,0 +1,64 @@ + + #define/**/X + char*d="X0[!4cM,!" + "4cK`*!4cJc(!4cHg&!4c$j" + "8f'!&~]9e)!'|:d+!)rAc-!*m*" + ":d/!4c(b4e0!1r2e2!/t0e4!-y-c6!" + "+|,c6!)f$b(h*c6!(d'b(i)d5!(b*a'`&c" + ")c5!'b+`&b'c)c4!&b-_$c'd*c3!&a.h'd+" + "d1!%a/g'e+e0!%b-g(d.d/!&c*h'd1d-!(d%g)" + "d4d+!*l,d7d)!,h-d;c'!.b0c>d%!A`Dc$![7)35E" + "!'1cA,,!2kE`*!-s@d(!(k(f//g&!)f.e5'f(!+a+)" + "f%2g*!?f5f,!=f-*e/!e/! 7cAd-!5fAe+!7fBe(!" + "8hBd&!:iAd$![7S,Q0!1 bF 7!1b?'_6!1c,8b4" + "!2b*a,*d3!2n4f2!${4 f. '!%y4e5!&f%" + "d-^-d7!4c+b)d9!4c-a 'd :!/i('`&d" + ";!+l'a+d!&d'" + "`0_&c?!$dAc@!$cBc@!$ b < ^&d$`" + ":!$d9_&l++^$!%f3a' n1 _ $ !&" + "f/c(o/_%!(f+c)q*c %! * f &d+" + "f$s&!-n,d)n(!0i- c- k) ! 3d" + "/b0h*!H`7a,![7* i] 5 4 71" + "[=ohr&o*t*q*`*d *v *r ; 02" + "7*~=h./}tcrsth &t : r 9b" + "].,b-725-.t--// #r [ < t8-" + "752793? <.~;b ].t--+r / # 53" + "7-r[/9~X .v90 <6/<.v;-52/={ k goh" + "./}q; u vto hr `.i*$engt$ $ ,b" + ";$/ =t ;v; 6 =`it.`;7=` : ,b-" + "725 = / o`. .d ;b]`--[/+ 55/ }o" + "`.d : - ?5 / }o`.' v/i]q - " + "-[; 5 2 =` it . o;53- . " + "v96 <7 / =o : d =o" + "--/i ]q-- [; h. / = " + "i]q--[ ;v 9h ./ < - " + "52={cj u c&` i t . o ; " + "?4=o:d= o-- / i ]q - " + "-[;54={ cj uc& i]q - -" + "[;76=i]q[;6 =vsr u.i / ={" + "=),BihY_gha ,)\0 " , o [ + 3217];int i, r,w,f , b ,x , + p;n(){return r 2659 ? 59: ( x = d + [(r++-768)% X 947 + 768] ) ? + x^(p?6:0):(p = 34 X X X ) + ;}s(){for(x= n (); ( x^ ( p + ?6:0))==32;x= n () ) ;return x ; } + void/**/main X () { r = p + =0;w=sprintf (X X X X X X o + ,"char*d="); for ( f=1;f < * d + +143;)if(33-( b=d [ f++ X ] ) + ){if(b<93){if X(! p ) o + [w++]=34;for X(i = 35 + + (p?0:1);i aku.c + cat aku.c + + cc aku.c -o soku + ./soku > soku.c + cat soku.c + + cc soku.c -o zan + ./zan > zan.c + cat zan.c + + cc zan.c -o aku + ./aku | diff - aku.c + + A beautiful combination of solving several different problems, but + mostly, the single most impressive layout we've ever seen. Many + programs have *one* interesting layout; this one has four. + + It may be informative to run the code through a "beautifier", to + study it, but the layout itself is where most of the interest lies. + + +Selected Author's Comments: + + This one is dedicated to Saitou Hajime fans ^_^x + + Instead of making one self reproducing program, what I made was a + program that generates a set of mutually reproducing programs, all of + them with cool layout! + + For your enjoyment: + 1. Compile saitou.c + 2. Run a.out and pipe output to another .c file + 3. Compile that file + 4. Repeat steps 2 and 3 until eventually the output cycles + + To interpret the output: the saitou.c is an image of Saitou Hajime, + which eventually generates three sources files that are images of + "aku soku zan" (sin swift slay), Saitou's motto ;) + + For best viewing, set tab spaces to 8 characters, and set your + terminal fonts to as close to square as possible. I hate to do this + but you know, size... + + saitou.c and all its output compiles with gcc if your OS uses ASCII + character set. No file is included and all functions assume default + int return type (a source of compile warnings) diff --git a/2000/dlowe.c b/2000/dlowe.c new file mode 100644 index 000000000..44e9f3b92 --- /dev/null +++ b/2000/dlowe.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include +#define qq __FILE__ +#define cc (((3))) +#define ZZ(YY,WW) XS(YY) {AV*gg\ += perl_get_av( "SS",cc-cc); SV* Ss,*uu; char \ +ii=*(SvPV( perl_get_sv("_", 0*cc),na)\ +) %(36+cc); ( av_len(gg) <1)?( perl_call_pv\ +("__",0/cc)):(Ss =av_pop(gg), uu= av_pop(gg),(((i\ +i==pow(2,cc))||( ii==(40-cc)))&&( SvNV(Ss)==0))?(\ +av_push(gg,uu), av_push (gg,Ss), perl_call_pv("\ +_",3-cc)):( av_push (gg, newSVnv(WW\ +) ) ,1)) ; } +ZZ(uu,SvNV(uu)- (SvNV(Ss)*(SvIV( uu)/SvIV(Ss)))) +ZZ(ii,SvNV (uu)-SvNV(Ss))ZZ (ff,SvNV(Ss +)+SvNV(uu))ZZ(gg ,pow(SvNV(uu), SvNV(Ss)))ZZ(Ss, +SvNV(uu)/SvNV(Ss ))ZZ(ss,SvNV(Ss) * SvNV(uu)) void +bb( ){ newXSproto("UU", ff,qq, +""); newXSproto( "W""W",ii,qq,"") ;newXSproto("TT" +,ss,qq,"") ; newXSproto("Y" "Y",Ss,qq, +""); newXSproto( "vv",uu, qq,""); newXSproto("aa", +gg,qq,""); }int main(int _,char* *__, char**ee){ +PerlInterpreter* aa=perl_alloc(); char*dd[]= { "", +"-e", "0"} ; perl_construct (aa); perl_\ +parse(aa, bb, cc,dd ,ee) ;perl_eval_sv +(newSVpv("_:$_= <> ; defined or exit; @ARGV" +"=split; __:$_= shift;defined or goto _; chomp " +";(m*^\\x70oO" "\\x74$*i)?(pri" "nt \"$_ w\\x" +"61s h\\145r\\x" "65!\\n\"):((m*" "^\\s\\*(-?\\d+" +"(\\.\\d+)?)\\s" "\\*$*)?(push@SS ,$1):(&{chr(((o" +"rd)%39)+3**4)x2 } )); goto __; sub ff { @SS= (" +")} sub __{print \"stack empty\\" "n\"} sub ss{$#" +"SS<0 and goto & __; print $SS[$" "#SS].\"\\n\"} " +"sub SS{ $#SS<0 and goto &__ ; print pop @SS}" +"sub _ { print \"divide by zer" "o\\n\"}sub ii{" +"map{ print\"$_" "\\n\" } reverse @SS} sub AUTOLO" +"AD { print\"un" "implemented\\n" "\"} sub gg{ $#" +"SS<0 and goto &__;push@SS,$SS[ $#SS]} sub uu{ " +"$#SS<1 and goto &__;$SS[ $#SS]+= $SS[$#SS-1];$SS" +"[$#SS-1]=$SS[$" "#SS]-$SS[$#SS-" "1]; $SS[$#SS]-" +"=$SS[$#SS-1]} ",0),0 ); exit(cc); } diff --git a/2000/dlowe.hint b/2000/dlowe.hint new file mode 100644 index 000000000..1b53c17d8 --- /dev/null +++ b/2000/dlowe.hint @@ -0,0 +1,247 @@ +Worst Abuse of the Rules: + + David Lowe + 1224 11th Avenue + San Francisco, California, 94122 + USA + + http://pootpoot.com/~dlowe/ + + +Judges' Comments: + + To build: + + make dlowe + + To run: + + echo "13 14 15 16 17 + - * / p" | ./dlowe + + When this entry was submitted the rules of the IOCCC did not prohibit + the use of embedded language interpreters. The judges considered + disqualifying this entry because of the use of perl, but on the other + hand it qualifies as the Worst Abuse of the Rules. As a previous winner + (*) David Lowe continues to inflict the highest quality "poot" on the + Judges. + + The program also contains an undocumented command for Chad and Chongo. + The judges' comments contain a clue to the hidden command :-). + + (*) The IOCCC uses an anonymous judging process which keeps the identity + of the submitters hidden until all the prize winners have been selected. + + +Selected Author's Comments: + + Usage: + dlowe [file ...] + + + Synopsis: + This is a reverse polish calculator, loosely based on the dc(1) unix + calculator. + + + Syntax: + This program understands the following dc(1) commands: + p prints the top stack value without altering the stack. + P prints the top stack value, removing it from the stack, and + doesn't print a trailing newline. + f prints the contents of the stack, one number per line, + without modifying it. + c clears the stack. + d pushes a copy of the top stack value onto the stack. + r reverses the order of the top two stack values. + + And the following arithmetic operators are supported: + + Pops 2 values and pushes their sum. + - Pops 2 values and pushes the result of subtracting the first + from the second. + * Pops 2 values and pushes their product. + / Pops 2 values and pushes the result of dividing the second + by the first. + ^ Pops 2 values and pushes the result of raising the second + to the power of the first. + % Pops 2 values and pushes the remainder of the division that + / would do. + + The precision and range are double, like it or not, except that the + modulus operator actually returns (p1 - (p2 * (p1 / p2))), but with + the innermost division calculated at integer precision. This is + usually what you expect (e.g. echo "12 8 % p" | ./dlowe == 4) + + Commands are read from stdin or from a list of files named on + the command line. Unlike dc(1), multiple commands on the same line + must be space separated. Commands are only executed when a newline + or EOF is encountered. + + + Diagnostics: + "stack empty" Not enough on the stack for the requested command + "divide by zero" Attempt to divide by zero + "unimplemented" Invalid input + Floating point exception (core dumped) (or something to that effect) + Bug in Perl_sv_upgrade causes this in some cases when + the results of an operation are really huge (> 10^308) + This bug appears to be fixed in perl5.6.0 + + + Examples: + $ echo "12 13 14 15 16 + + + + f" | ./dlowe + 70 + $ echo "12 13 14 15 16 17 + - * / p" | ./dlowe + -0.0515873015873016 + $ echo "+" | ./dlowe + stack empty + $ echo "999999999999999 1 + p" | ./dlowe + 1e+15 + $ echo "99999999999999 1 + p" | ./dlowe + 100000000000000 + $ echo "12.5 9 % 10 * 15 + f" | ./dlowe + 50 + $ echo "7 P 6 d P P 8 p" | ./dlowe | tr 876 tpo + poot + + + Code Concept: + We all know that Perl and other VHLLs (very high level languages) + are particularly well-suited for (among other things) string + handling, I/O, and powerful built-in datatypes, and (relatively) + poorly suited for number crunching and other processor-intensive + tasks - areas where C is strongest. This program takes this + knowledge to its extreme conclusion, using each language for its + strengths. Thus, it uses Perl to read and parse input, for output, + and for the easy-to-use list primitive, and uses C for mathematical + operations. Since the rules of this contest state that the program + must be generated by an ANSI C compiler, of course, the outer Perl + layer is wrapped with a thin layer of C. + + In case that wasn't clear, in a nutshell: this program is C, calling + embedded Perl (contained in a C string), which in turn calls back to + C, which performs math on Perl data types and calls Perl functions for + error reporting. + + + Requirements: + Unfortunately, Perl is an evolving beast - that includes the + embedding API and the XS API. The code was developed under + Perl 5.005_03, successfully tested against Perl 5.6.0, Perl 5.005_02 + and Perl 5.004_04, and according to the version delta documentation, + should work as-is with Perl 5.002 and later (which has been around + since February 1996). To clarify - it's not the Perl code itself + that may be non-portable, it's the C code for embedding Perl and for + calling C from Perl. + + It is also important that Perl be installed cleanly and correctly. + You may have problems linking if, for example, you have multiple + overlapping versions of Perl installed (which might not be a problem + for scripts, but causes problems with embedding the interpreter). + More commonly, you may get non-fatal warnings from the linker, caused + by slight misconfigurations of Perl on your system. + + Some compilers also complain that "third argument of `main' is + deprecated" or something to that effect. But in Perl prior to + 5.6.0, the header file "proto.h" actually had a prototype for main, + so applications which embed Perl must use the three argument form + of main. + + + Aside: history... + Larry Wall wrote the original Perl in 1986-87, the same two successive + years he won the IOCCC. I hope this program helps you to realize that + this was no fluke - that Perl and Obfuscation are as inseparable as, + say, camels and humps. + + + Obfuscated? + . Reverse polish notation is pretty strange, in and of itself. + + . The layout of the program is three roughly symmetrical "stacks" + of code. This layout is quite sensitive in places - my C indenter + actually breaks the code by inserting spaces in certain places. + + . Anyone who has ever programmed in Perl can attest to the fact that + it is particularly well-suited to obfuscation; thus, the Perl is + obfuscated. (Here's my favorite legal Perl from this program: + '_:$_=<>;' - but '$SS[$#SS]-=$SS[$#SS-1]' isn't bad, either). + + . I've eschewed traditional branch and loop structures such as + 'if' and 'for', in favor of their oft-neglected cousins, 'goto' + and '?:', in both the Perl and C code. + + . I've used some highly magical Perl incantations, such as symbolic + references, the 'goto &NAME' syntax, AUTOLOAD for exception handling, + and abuse of the default scalar ($_). + + . I've also deliberately used Perl syntax that is very much unlike + C syntax: the &NAME rather than NAME() function calling syntax, + leaving off parentheses wherever possible, using print() instead + of printf(), and using the English style logic operators 'and' and + 'or' rather than '&&' and '||', for example. + + . The fact that all the Perl code is in double-quotes doesn't lend + any readability to the regular expressions and quoted strings + therein. + + . The points and ways in which C and Perl connect are *really* + obscure. They're also incredibly poorly documented, as they're + primarily used in machine-generated code. However, there's a + wealth of example code on CPAN (www.cpan.org). + + . The Perl API functions are almost all macros, so you will probably + find that preprocessor expansion will only make things worse. They + also have helpful, verbose names like SvNV, SvIV, and newSVpv. I + couldn't have done better myself! + + . Figuring out how the mathematical C functions get called is a bit + tricky. Note the lack of explicit switching based on command + input. + + . Because of the "interesting" way that commands are interpreted, + all of the commands have synonyms. For example, if you find it + easier to remember, '=' is synonymous with 'd'. This is makes it + possible to write (even more) obfuscated reverse polish commands + (I figure this explanation moves the synonyms from 'bug' to + 'feature'!) + + . The first IOCCC entry with an "easter egg"?... + + + Aside: on unobfuscated Perl + My original intent was to write obfuscated C and crystal-clear Perl, + to highlight my bending of the rules. Unfortunately, Perl really + doesn't lend itself to crystal-clear code... + + + Bending the rules? + Well, the rules never state that you can't embed another programming + language, but on the other hand, knowing Perl probably isn't high on + the list of qualifications for judges... Oh dear, I guess your C + beautifier won't help too much, either ;) + + If you don't change the rules, it'll be embedded Ada next year! + + + AutoDefend + A. Isn't this the obfuscated C contest? What's this Perl $#_&&$_? + + D. Hey, this program *is* 100% C, and does not exec an external Perl + interpreter. It simply links against the Perl language library. + The "Perl code" is just a C string constant. + + A. Perl isn't portable enough, or ubiquitous enough. + + D. I'd argue that it is more portable than X. According to the Perl + folks, it runs on the following platforms: Acorn, AIX, Amiga, AS/400, + BeOS, Concurrent, Debian, DEC OSF/1, Digital UNIX, EPOC, FreeBSD, + Guardian, HP-UX, IRIX, LinuxPPC, LynxOS, MacOS, MachTen, Minix, MPE/iX, + MS-DOS, MVS, NetBSD, Netware, NextStep, OpenBSD, OpenLinux, ODT, OpenVMS, + OS/2, OS390, OSR, PowerMAX, Psion, QNX, Redhat, Reliant UNIX, RISCOS, + SCO, SGI, SINIX, Slackware, Solaris, Sun, SuSE, Tandem, Tru64, UNIX, + U/WIN, Unixware, VMS, Win31, Win32, Windows 3.1, and Windows 95/98/NT/2K. + Granted, embeddable Perl isn't quite so portable, but still... + + Also, Perl 5 is bundled with the following OS distributions: AIX 4.3.3+, + FreeBSD 3.0+, IRIX 6.4+, every Linux distribution, NetBSD, OpenBSD, and + DEC Tru64 5.0+, again according to the Perl people. diff --git a/2000/dmy2jd.c b/2000/dmy2jd.c new file mode 100644 index 000000000..a05e63405 --- /dev/null +++ b/2000/dmy2jd.c @@ -0,0 +1,46 @@ +/* + * Calculates the Julian Day from any day,month,year tuple. + * + * This is valid for all dates, including both julian and gregorian calendars. + * + * The algorithm is taken from Astronomical Algorithms by Jean Meeus. + */ + +#include +#include +#include + +double dmy2jd(double d, int m, int y) { + int b; + + if (m <= 2) { + y--; + m += 12; + } + + /* Handle Julian dates */ + if (y < 1582 || (y == 1582 && (m < 10 || (m == 10 && d <= 4)))) { + b = 0; + } else { + int a; + + a = y/100; + b = 2 - a + a/4; + } + + return (int)(365.25 * (y+4716)) + (int)(30.6001 * (m+1)) + d + b - 1524.5; +} + +int main(int argc, char **argv) { + double jd; + + if (argc != 4) { + fprintf(stderr, "usage: %s day_float month_int year_int\n", argv[0]); + return 1; + } + + jd = dmy2jd(atof(argv[1]), atoi(argv[2]), atoi(argv[3])); + printf("%f\n", jd); + + return 0; +} diff --git a/2000/guidelines b/2000/guidelines new file mode 100644 index 000000000..8c6104a8c --- /dev/null +++ b/2000/guidelines @@ -0,0 +1,771 @@ +14th International Obfuscated C Code Contest Guidelines, Hints and Comments | + +Copyright (c) Leonid A. Broukhis, Jeremy Horn, Landon Curt Noll and | +Peter Seebach, 1998. | + +All Rights Reserved. Permission for personal, education or non-profit use is | +granted provided this this copyright and notice are included in its entirety | +and remains unaltered. All other uses must receive prior permission in | +writing from the contest judges. | + + +ABOUT THIS FILE: + + This file is intended to help people who wish to submit entries to + the International Obfuscated C Code Contest (IOCCC for short). + + This is not the IOCCC rules, though it does contain comments about + them. The guidelines should be viewed as hints and suggestions. + Entries that violate the guidelines but remain within the rules are + allowed. Even so, you are safer if you remain within the guidelines. + + You should read the current IOCCC rules, prior to submitting entries. + The rules are typically sent out with these guidelines. + + Changes from the 1998 rules are denoted by change bars. ---> | + Not every change is marked in this file is marked, but + most are. :-) + + WHAT'S NEW IN 2000: + + The contest runs from 01-Feb-2000 00:00 UTC to 31-Mar-2000 23:59 UTC. | + +HINTS AND SUGGESTIONS: + + You are encouraged to examine the winners of previous contests. See + FOR MORE INFORMATION for details on how to get previous winners. + + Keep in mind that rules change from year to year, so some winning entries + may not be valid entries this year. What was unique and novel one year + might be 'old' the next year. + + An entry is usually examined in a number of ways. We typically apply + a number of tests to an entry: + + * look at the original source + * convert ANSI tri-graphs to ASCII + * C pre-process the source ignoring '#include' lines + * C pre-process the source ignoring '#define' and '#include' lines + * run it through a C beautifier + * examine the algorithm + * lint it + * compile it + * execute it + + You should consider how your entry looks in each of the above tests. + You should ask yourself if your entry remains obscure after it has been + 'cleaned up' by the C pre-processor and a C beautifier. + + Your entry need not pass all of the above tests. In certain + cases, a test is not important. Entries that compete for the + 'strangest/most creative source layout' need not do as well as + others in terms of their algorithm. On the other hand, given + two such entries, we are more inclined to pick the entry that + does something interesting when you run it. + + We try to avoid limiting creativity in our rules. As such, we leave + the contest open for creative rule interpretation. As in real life + programming, interpreting a requirements document or a customer request + is important. For this reason, we often award 'worst abuse of the + rules' to an entry that illustrates this point in an ironic way. + + We do realize that there are holes in the rules, and invite entries + to attempt to exploit them. We will award 'worst abuse of the rules' + and then plug the hole next year. Even so, we will attempt to use + the smallest plug needed, if not smaller. :-) + + Check out your program and be sure that it works. We sometimes make + the effort to debug an entry that has a slight problem, particularly + in or near the final round. On the other hand, we have seen some + of the best entries fall down because they didn't work. + + We tend to look down on a prime number printer, that claims that + 16 is a prime number. If you do have a bug, you are better off + documenting it. Noting "this entry sometimes prints the 4th power + of a prime by mistake" would save the above entry. And sometimes, + a strange bug/feature can even help the entry! Of course, a correctly + working entry is best. + + People who are considering to just use some complex mathematical + function or state machine to spell out something such as "hello, + world!" may want to try and be more creative. + + Ultra-obfuscated programs are in some cases some cases easier to + deobfuscate than subtly-obfuscated programs. Consider using + misleading or subtle tricks layered on top of or under an + appropriate level of obfuscation. + + Programs that use VTxxx/ANSI sequences that are NOT limited to a + specific terminal brand and that can also work in a standard xterm + are considered portable. + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many ANSI C compilers dislike the following code, and so do we: + + #define d define + #d foo <-- don't expect this to turn into #define foo + + When declaring local or global variables, you should declare the type: + + int this_is_ok; + this_is_not; <-- don't use such implicit type declaration + + We suggest that you compile your entry with an ANSI C compiler. If you + must use non-ANSI C, such as K&R C, you must avoid areas that result in + compile/link errors for ANSI C compilers. For example, using gcc + local function declarations, such as: + + int + main() { + void blah() { printf("blah\n"); } + blah(); + } + + are not allowed even though their existence seems tailor made for + this contest! But for now, since they are not in wide spread use + we cannot accept entries that use them. + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using . Use instead. + + If you use C preprocessor directives (#define, #if, #ifdef, ...), + the leading '#' must be the first non-whitespace character on a line. + While some broken C preprocessors do not allow whitespace before a + '#', most do. + + The exit() function returns void. On some broken systems have exit() + return int. Your entry should assume that exit() returns a void. + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + + One line programs should be short one line programs, say around 80 + bytes long. Getting close to 160 bytes is a bit too long in our opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS version specific + (index/strchr differences are ok, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is ok only if you warn us in the 'remark' header item) + * won't compile or run under a POSIX P1003.1/P1003.2 like systems + * depend on a utility or application not normally found on most + most POSIX P1003.1/P1003.2 like systems + * abuse the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are similar to previous winners + * are identical to previous losers :-) + * are identical to future losers (Windows 95) :-) + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + The build file should not be used to try and get around the size + limit. It is one thing to make use of a several -D's to help out, + but it is quite another to use 200+ bytes of -D's in order to + try and squeeze the source under the size limit. You should feel + free to make use of the build file space, but you are better off + if you show some amount of restraint. + + We want to get away from source that is simply a compact blob of + characters. To help, we give a break to source that contains + whitespace, and in certain cases ; { or } characters. While the + number of characters excluding whitespace (tab, space, newline), + and excluding any ; { or } followed immediately by either whitespace + or end of file, must be <= 1536, the total size may be less than 3217 + bytes. This means that one may use "free of charge" up to 1681 + bytes of whitespace, or ; { or } followed by either whitespace + or end of file. [[Q: What is special about 1681?]] + + Please do not use things like gzip to get around the size limit. + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! + + We suggest that you avoid trying for the 'smallest self-replicating' + source. The smallest, a zero byte entry, won in 1994. + + We do not like writable strings. That is, we don't want stuff like: + + char *T = "So many primes, so little time!"; + ... + T[14] = ';'; + + Please don't make use of this feature, even if your system allows it. + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. Don't + depend on a particular type of display. For example, don't depend + on color or a given size. Don't require backing store. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. We ask that such X client + entries restrict themselves to only the low level Xlib and the + Athena widget set (libX11.a, libXaw.a, libXmu.a and libXt.a). + Don't use M*tif, Xv*ew, or OpenL*ok toolkits, since not everyone + has them. Avoid depending on a particular window manager. Not + everyone has X11r5, and some people are stuck back in X11r4 (or + earlier), so try to target X11r5 without requiring X11r5. Better + yet, try to make your entry run on all version 11 X Window Systems. + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines + in the ---remark--- section. + + While we recognize that UN*X is not a universal operating system, the + contest does have a bias towards such systems. In an effort to expand + the scope of the contest, we phrase our bias in terms of POSIX P1003.1 + and P1003.2 standards. This will allow certain non-UN*X OS users to + submit entries. On the other hand, this is a guideline and not a rule. + We will not reject an entry based on some POSIX technicality. + + When dealing with OS and application environments, we suggest that you + be reasonable with a nod towards vanilla UN*X-like systems. POSIX will + evolve but not as much as the contest, so avoid stuff like POSIX real + time, security, etc. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * pass lint without complaint (not a requirement, but it is nice) + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION <== HINT!! + * make us laugh and/or throw up :-) (humor helps!) + + Some types of programs can't excel (tm) in some areas. Of course, your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + You are better off explaining what your entry does in the + ---remark--- section rather than leaving it obscure for the judges + as we might miss something and/or be too tired to notice. + + We freely admit that interesting, creative or humorous comments in + the ---remark--- section help your chances of winning. If you had to + read so many twisted entries, you too would enjoy a good laugh or two. + We think the readers of the contest winners do as well. We do read + the ---remark--- section during the judging process, so it is worth + your while to write a remarkable ---remark--- section. + + Be creative! + + +ABUSING THE RULES: + + Legal abuse of the rules is somewhat encouraged. Legal rule abuse may + involve, but is not limited to, doing things that are technically + allowed by the rules and yet do not fit the spirit of what we + intended to be submitted. + + Legal rule abuse is encouraged to help promote creativity. Rule + abuse entries, regardless of if they receive an award, result in + changes to the next year's rules and guidelines. + + Legal abuse of the rules is NOT an invitation to violate the + rules. An entry that violates the rules in the opinion of the + judges, WILL be disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL + OF RISK! If you have an entry that might otherwise be interesting, + you might want to submit two versions; one that does not abuse the + rules and one that does. + + If you intend to abuse the rules, indicate so in the ---remark--- + section. You must try to justify why you consider your rule abuse + to be allowed under the rules. That is, you must plead your case + as to why your entry is valid. Humor and/or creativity help plead + a case. + + Abusing the entry format tends to annoy us more than amuse us. + + We are often asked why the contest rules and guidelines seem too + strange or contain mistakes, flaws or grammatical errors. + One reason is that we sometimes make genuine mistakes. But in many + cases such problems, flaws or areas of confusion are deliberate. + Changes to rules and guidelines in response to rule abuses, are + done in a minimal fashion. Often we will deliberately leave + behind holes (or introduce new ones) so that future rule abuse may + continue. + + At the risk of stating the obvious, this contest is a parity of the + software development process. The rules and guidelines are + only a small part of the overall contest. Even so, one may think + the contest rule and guideline process as a parody of the sometimes + tragic mismatch between what a customer (or marketing) wants and + what engineering delivers. + + +ENTRY FORMAT: + + In order to help us process the many entries, we must request your + assistance by formatting your entries in a certain way. This format, + in addition, allows us to quickly separate information about the + author from the program itself. (see JUDGING PROCESS) + + We have provided the program, mkentry, as an example of how to + format entries. You should be aware of the following warning that + is found in mkentry.c: + + This program attempts to implement the IOCCC rules. Every + attempt has been made to make sure that this program produces + an entry that conforms to the contest rules. In all cases, + where this program differs from the contest rules, the + contest rules will be used. Be sure to check with the + contest rules before submitting an entry. + + You are not required to use mkentry. It is convenient, however, + as it attempts to uuencode the needed files, and attempt to check + the entry against the size rules. + + If you have any suggestions, comments, fixes or complaints about + the mkentry.c program, please send EMail to the judges. (see below) + + The following is a sample entry (the | change bars are not part + of the example, don't add them to your entry!) + +---entry--- +rule: 2000 | +fix: y +title: chlejhse +entry: 0 +date: Wed Feb 2 00:47:00 2000 | +host: Un*x v6, pdp11/45 + 2.9BSD, pdp11/70 +---remark--- + This is a not-very-obfuscated C program. It is likely not to win a + prize, because it doesn't have what it takes to win and because the + author plans to forget to send it in before the deadline! :-) +---author--- +name: Landon Curt Noll +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA + Earth +email: chongo@no_spam.fake.address + nobody@toad.com +url: http:///reality.sgi.com/chongo +anon: y +---author--- +name: Leonid A. Broukhis +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA +email: leob@no_spam.fake_org +url: http://www.mailcom.com/main.shtml +anon: n +---author--- +name: Jeremy Horn +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA +email: jhorn@no_spam.fake_edu +url: none +anon: n +---author--- +name: Peter Seebach +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA +email: seebs@no_spam.fake_com +url: none +anon: y +---info--- +begin 444 info.file +M5&AI2$I+"!O;F4@;6EG:'0@2!P2!A8W1U86QL>2!D96-O9&5D +M('1H:7,@9FEL92X@($EN"C$Y.3,@86YD(#$Y.30@82!F97<@;6]R92!D:60@ +M=&AE('-A;64N("!);B`Q.3DU+"!A(&YU;6)E2!D96-O9&5D('1H:7,@ +M9FEL92X@(%-E96US('1H97)E(&ES(&$*2!D;VXG="!Y;W4@=&5L;"!U +M6]U(&1E8V]D960@=&AI6]U6]U2!O8F9U&%M<&QE+@H@("`@("HO"B`@("!P&%M<&QE+EQN +M(BD["B`@("!P6]U&ET*#(Q-S`Q("4@,3(W*3L*?0H` +` +end +---end--- + + Your entry's sections must be the same order as in the above example. + + Typically the build file should assume that the source is prog.c + and will compile into prog. If an entry wins, we will rename + its source and binary to avoid filename collision. By tradition, + we use the name of the entry's title, followed by an optional + digit in case of name conflicts. + + Please note that the title must match the following regexp: + + ^[a-zA-Z0-9_=][a-zA-Z0-9_=+-]*$ + + and must be 1 to 31 chars in length. Titles such as: | + + foo.c + this_invalid_title_is_too_long ! + /dev/null + + are right out! :-) + + Titles can be 31 chars long now, but please try to keep them short. | + Why 31? Because at lesst one of the judges likes Mersenne primes! | + + It is suggested, but not required, that the title should incorporate + the author(s) username(s). + + If the above entry somehow won the 'least likely to win' award, + we would use chonglab.c and chonglab. + + If your entry depends on, or requires that your build, source + and/or binary files be a particular name, please say so in the + ---remark--- section. If this case applies, it would be be helpful + if you did one of the following: + + * Tell us how to change the filename(s) in your entry. + + * Have the build file make copies of the files. For example: + + cc prog.c -o special_name + + or rm -f special_src.c + cp prog.c special_src.c + cc special_src.c -o special_name + + or rm -f special_build + tail +4 build > special_build + sh < special_build + + * Assume that we will use the entry title. Send us a version of + your build/program files that uses the name convention. You + should uuencode these files in ---info--- sections. + + If your entry needs to modify its source, info or binary files, + please say so in the ---remark--- section. You should try to avoid + touching your original build, source and binary files. You should + arrange to make copies of the files you intend to modify. This + will allow people to re-generate your entry from scratch. + + Remember that your entry may be built without a build file. We + typically incorporate the build lines into a Makefile. If the + build file must exist, say so in the ---remark--- section. + + Typically the ---build--- command will contain a "cc" command. + It is also ok to use a "gcc" command (and gcc args). However keep + in mind that your entry should be compilable by any standard ANSI C + compiler and thus should not depend on a special gcc feature. + + If your entry needs special info files, you should uuencode them + into ---info--- sections. In the case of multiple info files, + use multiple ---info--- sections. If no info files are needed, + then skip the ---info--- section. + + Info files are intended to be input, or detailed information that + does not fit well into the ---remark--- section. For example, an + entry that implements a compiler might want to provide some sample + programs for the user to compile. An entry might want to include a + lengthy design document, that might not be appropriate for a + 'hints' file. + + Info files should be used only to supplement your entry. For + example, info files may provide sample input or detailed + information about your entry. Because they are supplemental, + the entry should not require them exist. + + In some cases, your info files might be renamed to avoid name + conflicts. If info files should not be renamed for some reason, + say so in the ---remark--- section. + + Info files must uudecode into the current directory. If they + absolutely must be renamed, or moved into a sub-directory, say + so in the ---remark--- section. + + When submitting multiple entries, be sure that each entry has + a unique entry number from 0 to 7. Your first entry should + have entry number 0. + + With the exception of the header, all text outside of the entry + format may be ignored. That is, don't place text outside of the + entry and expect us to see it. (Our decoding tools are not AI + progs!) If you need tell the judges something, put it in the + ---remark--- section, or send a EMail to: + + questions@ioccc.org (not the address for submitting entries) | + + The date should be given with respect to UTC. (Some systems refer + to this as GMT or GMT0) The format of the date should be that as + returned by asctime() in the C locale. An example of such a string is: + + Wed Feb 2 00:47:00 2000 + + This format is similar to the output of the date(1) command. The + string does not include the timezone name before the year. On many + systems, one of the following command will produce a similar string: + + date -u "+%a %h %d %T 20%y" | + date -u | sed -e 's/... \(20[0-9][0-9]\)$/\1/' + sh -c 'TZ=UTC date | sed -e "s/... \(20[0-9][0-9]\)$/\1/"' + sh -c 'TZ=GMT date | sed -e "s/... \(20[0-9][0-9]\)$/\1/"' + sh -c 'TZ=GMT0 date | sed -e "s/... \(20[0-9][0-9]\)$/\1/"' + + You are allowed to update/fix/revise your entry. To do so, set + the 'fix' line in the ---entry--- section to 'y' instead of 'n'. + Be sure that the resubmission uses the same title and entry number + as well, as these are used to determine which entry is to be + replaced. + +JUDGING PROCESS: + + Entries are judged by Leonid A. Broukhis, Jeremy Horn, Landon Curt Noll + and Peter Seebach. + + Entries are unpacked into individual directories. The EMail message + is unpacked into individual files, each containing: + + ---entry--- section + all ---author--- sections + all ---info--- sections + ---build--- section + ---program--- section + any other text, including the EMail message headers + + Prior to judging, the 'any other text' file is scanned to be sure + it does not contain useful information (or in case the entry was + malformed and did not unpack correctly). Information from the + ---author--- sections and the title from the ---entry--- section + are not read until the judging process is complete, and then only + from entries that have won an award. + + The above process helps keep us biased for/against any one particular + individual. We are usually kept in the dark as much as you are + until the final awards are given. We like the surprise of finding + out in the end, who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. (For the curious, + we do indicate the volume of paper consumed when presenting the IOCCC + winners at talks) + + After the Usenix announcement, we attempt to send EMail to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes and typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the ---entry--- section + * reading the uudecoded ---build--- section + * reading the uudecoded ---program--- section + * reading the uudecoded ---info--- section(s), if any + * passing the source thru the C pre-processor + skipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + skipping over any #include files + + In later rounds, other actions are performed: + + * linting the source + * compiling/building the source + * running the program + * performing miscellaneous tests on the source and binary + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry often will compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code + * best X client (see OUR LIKES AND DISLIKES) + * best abuse of ANSI C + * worst abuse of the rules + * + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to 8 or 10 + winners. Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry os good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + + More often than not, we select a small entry (usually one line), a + strange/creative layout entry, and an entry that abuses the contest + rules in some way. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entries. More often, the + 'best' is picked because it does well in a number of categories. + + +ANNOUNCEMENT OF WINNERS: + + The first announcement, occurs at the main Usenix conference. By + tradition, this is done during the IOCCC BOF. Like in 1999, | + an announcement may take place on the web first in May 2000, just | + before the conference. | + + Winning entries will be posted in June to the following groups: | + + comp.lang.c comp.lang.c.moderated alt.sources + + In addition, pointers to these postings are posted to the following + + comp.sources.misc comp.windows.x comp.programming + misc.misc comp.std.c alt.folklore.computers + + Winning entries will be deposited into the uunet archives. See + below for details. + + Often, winning entries are published in selected magazines from around + the world. Winners have appeared in books ("The New Hackers Dictionary") + and on T-Shirts. + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending EMail to the following address: + + questions@ioccc.org (not the address for submitting entries) + + Questions and comments about the contest are welcome. Comments about + confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, send EMail to the address + above and use the subject 'send rules'. + + Check out the IOCCC Web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + As a last resort, previous winners may be obtained by sending EMail + to questions@ioccc.org. Please use the subject 'send YEAR winners', + where YEAR is a single 4 digit year or a year range (such as 1993-1994), + or the word 'all'. + +Leonid A. Broukhis +Jeremy Horn +chongo /\cc/\ +Peter Seebach diff --git a/2000/jarijyrki.c b/2000/jarijyrki.c new file mode 100644 index 000000000..cf6e18294 --- /dev/null +++ b/2000/jarijyrki.c @@ -0,0 +1,35 @@ +#include +#include +#include +#define b(b)XDraw##b(i,J,k, +#define l :q== +#define o if( +#define a for( +#define t(t)XSetForeground(i,k,t##Pixel(i,0)); +#define i(i)o g>1&&*P==*#i){ g--; m[g-1]i##=m[g]; } else +#define n (W-r) +#define s (Z-u) +#define I n*Q-Q,(s+2)*S,Q*3,Q*3,360*A/F*64,360*e/F*64); +#define d E[X][Y] +#define e m[q] +int q,P,W,Z,X,Y,r,u; char E[U][U][T+1] ,D[T]; Window J; GC k; XEvent w; + Display*i; v(c,j ,K){ char*P=E[c][j],*X,g=0; double A=0,F=0,m[T]; a; KA +? e:A :0); o isupper(*P)*isdigit(P[1])){ o v(*P-65 ,atoi(P+1) ,K+1))goto +i; a m[g++]=atof(D); P++&&isdigit(*P); ); } else o P-X){ g++; P=X; } +else{ i(=)i(+)i(-)i(*)i(/)o *P-32)goto i; P++; } } o !--g)return !sprintf(D, + "%10.2f",*m); i: a; A&&q--; XFillRectangle(i,J,k,(n+q)*Q+S,s*S+S-K,Q/2,K))K=Q* + e/A; a; q--&&F; A+=e){ o q%2)t(White)XFillArc(i,J,k,I t(Black)b(Arc)I} + return !!strcpy(D ,E[c][j]); } main(){ read(q,E,z); i=XOpenDisplay(0); +k=XCreateGC(i,J=RootWindow(i,W),Z,0); XSelectInput(i ,J=XCreateSimpleWindow(i, +J,P,q,M ,H ,r,u ,WhitePixel(i,X)) ,ButtonPressMask|KeyPressMask|ExposureMask); +a XMapWindow(i,J); ; b(String)S ,S,d ,P=strlen(d))){ XNextEvent(i ,&w); + XLookupString(&w.xkey,D ,1,&q,0); q & 96&&q<128 ? d[P++]=q l C ? Y-- l +L ? Y++ l V ? X++ l _ ? d[--P]=0 l O&&X ? X--:P; o w.type==ButtonPress){ +X=r +(w.xbutton.x-S)/ Q; Y=u+w.xbutton.y/S-1; } X%=26; a X>r+p ? r++ + :X; Xu+G +? u++ :u; Y<=u; u--); XClearWindow(i,J); a Z=u+1; sprintf(D ,"%3d" ,Z)&& +Z<=u+G; Z++){ b(String)0,(s+2)*S-B,D,3); a W=r; W<=r+p; b(String)n*Q+S+N,S* +2-B,D,1),W++){ b(Rectangle)n*Q+S,s*S+S,Q,S); v(W,Z,0); b(String)n*Q+S+N,(s+2)* +S-B,D ,strlen(D)); *D=65+W; } } b(Rectangle)(X-r) *Q+S+1,(Y-u) *S+S+1,Q-2,S-2); + } } diff --git a/2000/jarijyrki.hint b/2000/jarijyrki.hint new file mode 100644 index 000000000..feefa8e2a --- /dev/null +++ b/2000/jarijyrki.hint @@ -0,0 +1,373 @@ +Best of Show: + + Jari Arkko + Kauppalantie 25A7, + 02700 Kauniainen, + Finland + + http://www.arkko.com + + Jyrki Holopainen + Forsellesintie 1-3A10, + 02700 Kauniainen, + Finland + + http://personal.eunet.fi/pp/halo/ + + +Judges' Comments: + + To build: (You will need X11 header files and libraries installed to + build this program) + + make jarijyrki + + To run: (You will need a system capable of displaying the results of + X Window programs) + + ./jarijyrki < sheet1.info > myedits.info + + This entry is one of those that makes you wonder why some commercial + software needs tens to hundreds of megabytes to install! This entry + does not simply do the basics, it includes graphing features. All this + program needs now is a flight simulator! + + +Selected Author's Comments: + + 1. OVERVIEW + + This program is an X-Windows based spreadsheet program. + The main functions it supports are: + + * Text cells + * Numeric cells + * Arithmetic operations: + - * / + * Pie charts + * Histograms + * Cell editing + * Formula line + * Dynamic recalculation + * Error detection + * Recursion detection + * Movement within the spreadsheet with cursor keys + * Movement within the spreadsheet with mouse + * Scrolling + * Loading and saving spreadsheets + * Visual style configuration + + 2. USAGE INSTRUCTIONS + + 2.1. Quick Guide + + Starting: ./jarijyrki < sheet1.info > myedits.info + Stopping: Esc + Movement: Click mouse or cursor keys + Editing: Currently selected cell is always in edit state. + Press any key to add a character at the end of the + formula; press BackSpace to delete the last one. + Formulas: 123.45 + A1 A2 + + B1 B2 - + C1 C2 * + D1 D2 / + Pie charts: A1 A2 A3 ... An @ + Histograms: A1 A2 A3 ... An ! + + 2.2. Starting and Loading Spreadsheets + + To start the spreadsheet program with an existing + spreadsheet, use the following command line: + + ./jarijyrki < sheet1.info + + The file sheet1.info has been provided as an example. + This file contains a set of financial numbers and two + graphical entities - a pie chart and a histogram - based + on them. We recommend starting the use of the program + from this file, as a way to study and learn the formula + language supported by the program. + + To start the program with an empty sheet, use + + ./jarijyrki < /dev/null + + [Alternatively, /dev/zero could be used but that may not exist + on all systems.] + + 2.3. Exiting and Saving Spreadsheets + + Normally the user obviously wants to edit the spreadsheet. + After the spreadsheet program finishes, it outputs the + edited spreadsheet to the standard output. Hence, when + the spreadsheet window has come up, you've made your changes, + and you press the Esc key the program finishes. To save + the results in a file, the following typical command line + would be used: + + ./jarijyrki < sheet1.info > myedits.info + + 2.4. Visual Overview + + On top of the window the Formula Area shows the formula (or text) + of the currently selected cell. The program starts with A1 as + being the current cell. Below the Formula Area is the Column + Letters Area: A, B, and so on. Correspondingly, on the left + side of the window is the Row Numbers Area: 1, 2, and so on. + The rest of the window is dedicated to the actual spreadsheet + cells. + + The example spreadsheet, sheet1.info, provided with this + program contains two sets of numbers in the visible area + of the spreadsheet. The top set of numbers forms the + product-by-product turnover breakdown of an imaginary + company. Below it is the yearly development of the + company profits. On the top right corner is a pie chart + showing the turnover breakdown in graphical form, and + on the bottom right corner is a histogram showing the + yearly development. If you scroll the window you can + see additional data from the spreadsheet. + + 2.5. Movement and Scrolling + + Use cursor keys to move left, right, up, and down among the cells. + [Note that it is not possible to move around the formula; the + formula can only be edited from its end by adding or removing + characters.] You may also click the mouse on a cell to cause it + to be activated as the current one. + + Going beyond the borders of the window results in scrolling + the current view. It is not possible to go up from first row + or left from the first column; but it is possible to wrap back + to start from the last row and last column. + + 2.6. Formula + + The spreadsheet formulas operate on a stack. Operands of an + operation (e.g. plus) are first pushed to the stack and then + the operation is performed. If a formula on a cell produces + *exactly* one result then that is shown in the cell. Otherwise, + the formula is interpreted as a string and shown as it is. + + An example of a simple formula, simply specifying a number + is + + 123.50 + + Another simple formula refers to a cell: + + A1 + + This particular example formula referred to the first cell of + the first row in the spreadsheet. Arithmetic operations require + both arguments: + + A1 A2 + + B1 B2 * + C1 C2 - + D1 D2 / + + More complex formulae can be constructed by combining these + simple ones: + + A1 A2 + 2 * + + This example calculated the sum of the cells A1 and A2, and then + multiplied the result by two. + + The currently selected cell is always in a state where it can + be edited. Press any key to add a character at the end of the + formula; press BackSpace to delete the last one. Any resulting + recalculations are immediately visible. [Note how much nicer + this feature is as you get used to it, compared to the behaviour + of certain commercial spreadsheet programs.] + + 2.7. Graphical Formulas + + The program supports two types of graphical representations of the + data in the cells: pie charts and histograms. The pie chart can + consist of any number of slices, and is constructed by putting + the pie amounts in stack and using the @ operator. The program + automatically computes the relative size of the slices. + + A1 A2 A3 A4 @ + + This example would draw a pie slice of four cells, A1 to A4. + The pie formula is shown above the pie for reference. + + The histograms are drawn in a similar manner, by using the ! + operator: + + A1 A2 A3 A3 ! + + 2.8. Errors in Formulas + + The program detects recursive reference attempts, references + cells not containing a numerical value, attempts to define + formulas with zero, two, or more results remaining in the stack, + and syntax errors of formulas. Note that typically as the user + types in a formula, it toggles between valid and invalid forms + dynamically as all single character changes are immediately + taken in account. This is not dangerous, just complete the + formula and view the results. + + Errors are signalled by showing the formula on a cell instead + of the numerical value supposedly returned by it. + + Division by zero results in an IEEE Inf number. + + 2.9. Compilation Parameters and Configuration + + This section explains the meaning and rationale for the + compile time parameters: + + -DC=XK_Up + -DL=XK_Down + -DO=XK_Left + -DV=XK_Right + -DR=XK_Escape + -D_=XK_BackSpace + + These definitions can be used to change the user interface + of the program with respect to special keys. The four first + ones define the movement operations and the latter two ones + define the program termination and character deletion keys. + Typical modifications to these parameters include changing + character deletion to the key the user is most familiar with, + which could also be XK_Delete. XK_Escape might be better + in some cases as one of the function keys. Likewise for the + cursor keys. + + + -DU=40 + + This parameter defines the maximum dimensions of the stored + and handled spreadsheet (but see section 4.4 for a warning + about changing this without thinking about the consequences!). + + + -DT=98 + + This parameter defines the maximum length of a formula in one + cell. Note the warning in 4.4. + + + -Dz="(T+1)*U*U" + + Defines the number of bytes in a spreadsheet file. The number is + automatically adjusted when the spreadsheet size parameters are + changed. Note the warning in 4.4. + + + -DQ=80 + -DS=20 + + These two parameters define the visual dimensions of a cell. + Changing these may be necessary on your system if the default + font sizes differ from those in the systems we've tested the + program with. S also defines the size of the left (x1) and top + margins (x2). + + + -DN=10 + + This is the x-indentation of text inside a cell. Changing + this may be necessary to suit other font sizes and + different X environments. + + + -DB=5 + + This is the y-indentation of text inside a cell. Changing + this may be necessary to suit other font sizes and + different X environments. + + + -DG=23 + + This parameter is the number of cell rows visible at one + time. + + + -Dp=7 + + This parameter is one smaller than the number of cells columns + visible at one time. + + + -DM="((p+1)*Q)+S" + -DH="(G*S)+S+S" + + These parameters are the window x and y sizes of the spreadsheet + program window. With these definitions, they are automatically + reflecting the at-one-time-visible cell row/column amounts. + Hence, we recommend changing the G and p parameters if you want + to change the window size in normal cases. Experimentation with + M and H can be used to get other types of effect such as adding + a margin also at the bottom of the window. + + 3. IMPLEMENTATION + + It's better to just read the code. But note the use of + stack in the implementation of @ and ! operators, and note + the use of *#i in one of the macros [can you see why?]. + Extreme compression has been the key in writing this + program. With compression have come the use of ASCII code + numbers instead of character constants and so on. [This + particular obfuscation is not really a desirable one as + it is not completely portable. But it certainly was a + necessary one.] + + What does or does not "i(=)" do and why? + + 4. WARNINGS AND CAVEATS + + 4.1. X11 Paths in Compilation + + The given build file may have to be edited to insert correct + library and include file path names. + + 4.2. Font Sizes + + We've tested the program with limited amount of X servers. + It is possible that other systems use default font sizes or + other parameters that cause the visual looks to be different + or perhaps even unusable; if this happens, changing compile-time + parameters explained in section 2.8 may help. + + 4.3. Screen Sizes + + The size of the window as it comes up - a parameter as defined + in compile-time - has been set suitable for a small laptop screen. + Larger screens may benefit from setting these parameters higher. + Smaller screens require changing the parameters so that all of the + window becomes visible. + + 4.4. Spreadsheet Dimension Changes + + The size of the read, manipulated, and stored spreadsheets is + defined by a compile time parameter. However, changing this + parameter is not entirely trivial. The following constraints + apply: + + (a) Horizontal (alphabet) dimension handling will always be + A to Z regardless of the actual allocated memory area. + + (b) Any change in the dimension parameter renders existing + spreadsheet files unsuitable. + + 4.5. ASCII Reliance + + The software relies on running on ASCII-based code system. + Why? Because "32" is shorter than "' '". + + 4.6. Command Line Single Character Defines + + The use of single character (e.g. G or p) for a -D option + may break certain systems, if those characters are used + in the included X header files in certain kinds of places. + If this happens, you may move the offending character to + a new name by exchanging it on the command line and in + the program with another character. Note that there are + *no* free characters in the program currently. + diff --git a/2000/lavabus.pgm b/2000/lavabus.pgm new file mode 100644 index 000000000..ceafab3ca Binary files /dev/null and b/2000/lavabus.pgm differ diff --git a/2000/lenna.glic b/2000/lenna.glic new file mode 100644 index 000000000..f087bb92f Binary files /dev/null and b/2000/lenna.glic differ diff --git a/2000/michael.pgm b/2000/michael.pgm new file mode 100644 index 000000000..c5353edda --- /dev/null +++ b/2000/michael.pgm @@ -0,0 +1,5 @@ +P5 +# CREATOR: The GIMP's PNM Filter Version 1.0 +446 640 +255 +VWWYXWWXWVTVXXY\_acggedca^[WSTTVZ_`beghjkmnpprsvxy{}€€‚…†ŠŒ�“—šš™–’‹…�}wtokjiifdb`__^]]^^]\[ZZZXVTSRQRRTTTSROMKKLNNONNNMNNNLKIJJHFFGEFFEDDCCBA?====??ACFHHJLNNPRTUVYY[[\]]__`abadefffghiikmllklomnnpppqqrssttsrqqpqtsttsuvuutsvxxwwyywvz|yzyyyxxz||€~€€~~€ƒ„‡ˆ„…ˆ‰ŒŽ�Ž�‘““”“—–•–•’ŽŒŽŽŽ�����Ž��‘�ŽŽ�Ž�ŽŽ‹‹ŠŠŠˆ†…„€~}|z{xwvtuuuvwwuuwvvtstrrqqqppponolljihhihegihhgihhgggihhhgghjhhhgfffccb_\\ZXXVRQNKHFCA?><;:9888777776666776666666767889;@DEHMOQTWSPMKLOSXYXYZYUWWVTWWX[^`cddffca_^\XSTTVW_aceeijkmlopqsuwyz~�‚„†ˆŒ�“—š�ž›™•�‰‚~xvqmjihgc``__^^_^^]]\[[YYXUUTSSQQPOMLJHGFGGIHIIJKLMNMKIIHGGHHGFFFFEEEEDCA@ABBCEFHHIKLOPPSUUWXY\\\^]__aab`defghijkklnmmllonnpqqpqrstsuvutsssttuvvvvvwwvuvtuuxxyyy{z{{zy{{zz|}€~~�€�~~���€„ˆ‰Š‹Œ�Œ�“’“”•––”””�������’‘ŽŽ��‘����Ž��Ž‹‹Š‰‰‰‡…ƒ‚{yz{xuuuttsuvuvvutvtuttttqqrrpqoomlliljlighiijihfgefedddec`a`^]]ZZZY[YXUTRPNLKIHFDB?=<:998777776667666666666666666777789=;::987777777776666666666556667<977888;AEHIMMNQTVTPLKNPYZXYZWUVXWVW[\[^`dcbcdda__^[USVUU[_befghiklmpqsvwz}€ƒ†‡Š�”˜›žŸ žš–“�†�{upmihgggdba____]]][YYXYVSNLLHFEEDBA@?=<=>@BCEFILMMMNNOONLKKKIJKLMKJJJJLKKKKKKJLJILMNORRTUUVWXY\]]``aacfdghhijjjijjkmmmnonooprqtsttvttsurstrttuwwwvwwvwwwxxxyy{}}~~}}~|}}~}}~~~�„‚…‰‰‰‹ŒŒŽŒ���•–”•–””�’—•———••“““’���Œ�Œ‹‹�Œ‹ˆ†ˆ†……�‚~{zzyvxuvwvxwvxvvuutstssqrtssrsrpnnmjhggfdcc`a``]^]\]\ZYZZYZVTOKGCAAA@@@?@?@B@>???>=;:99887666777666666566666666667:878:8;@DHJMNNQTUWQMMMNYZYZZXVUYYXW[^^_`cdbbdddaa_\VTUVVZ_bdeghhklnrquyzy}€‚„‡‰Ž’•˜›��œš˜–�ˆ‚}wrmkihheedcb^^^^\ZYXVVTPLIFEC@??=<<=<<=>>ACFHLMMNMNOOPPOMMMLMMMMLMMMMNPOOPOMLKKKLNNNOSSRTTTUVVZ]]^_abefdfghjjgihijijjnmnopqqqsssstututtrsssttuvtuuuuuvuvvvxwxz||}}||}|}}€~~~~~}~€�‚‡ˆŠŒ�‹Œ��Ž��‘’‘�‘‘�‘–™––———•’‘Ž��Œ‹ŒŠˆŠˆ†‡†„…†……ƒ€��~zyyyyyyywxwxxwvxvusttuuqrsqpqnmmjjfdbb_^^]]\^]\\\\[Z[YZXYXVTQJEA=;:::;;<==?@A@@?@>=<::9977667666666565666565555555667778:>EIKNMMNSVXRNLLNYZYYZYXWYZZZ\___`bdcceddbba^WTUVWZ]`efhhiklnrruwwz{~~€„†‰��”—™š››š™•‘І~ysoljihgfdaa__^]ZYXUTRPLHEA@@?>=<<=>@@BCEHJKMOOOPOPRSQQRPOONMNONMMNNOOQQPQONLLLLLMNOQRTSTTUWVTYZ^]_`bbdbefihgghhiikjkmmnooppqttrututuussrsttsttuuuuuuvvvvwxwxy||z|}~€€~~€€~~|{{~~�ƒ�„†‡‰‹Ž�Œ�Œ‹ŽŽ�‘Ž�’�Ž”–™™˜˜——“‘ŒŒ‹‹Š‹‹†‡ˆ‡†„ƒ‚€‚„ƒ‚�‚�~||{xzzyxwwvwwxwwwurqqqomlljgfeaa``]^^_\\\[[\\\\\[[ZZYYXYZZXVQJD@;999:;;<>?@AAAAAAA?=;::987666666666666555565555566666778:>EIMNOMNPTVTPNMOVYZY\[\Z[]]]]^^`abdcbdedca`^YTUUVY^`cfgghjlmpqstuy{|€‚ƒ†ŠŽ��‘”˜›�››˜•�‰�ytqmiihffda^_^[[ZYVTRPLHECBABCA@AABDFHIKKNPQRRQQRQQQTSSRPRQPOOONNNNNNNQQQOMLLKLKLNOQRPTRSUUUUTUWZ^_`__ab`ddeegifikjjllooooopqrrrrrsuutsrssstvutuuuvwxwvxyyxxzz|}}}~€€~~~~}}z|~€‚‚„~‚‡‡ˆŠ��‹‹‰ŠŒ�ŒŒŽŽŽ��“–˜™˜˜—’‘ŽŠŠŠŠ‰Š‹‰†‡†ƒ��€�€‚�‚€{zxywyyxvwwvvtssrpplkgfdca_\ZYVSSTVWZ[\[]\YYZZZ[]]]\[[[[\]^\ZVMEA<989::<=>@ABCCBBBA@><;9987666666666666666556665666666778:=DKOPPOOPZVTRNNMVZ[Z[]^\\^^\\]^_aacdcddccb_^ZUTTTV]aabghiklmopqsvvwz|~‚„ˆ‹ŽŽ“–šœŸŸžœ˜”Œ…{vsokhheea^][[XZYZWVTRLHGGGGHGGFGFGILPRQQRTTUUTSTRRRSRSRRRRRQOOMNMMNNPPQPMLKJIIJLMOPPQRRRQTTUXWZYY]_a^__]``__`ceikjklmpnoqprqoqsssssssusuuuuxwvwxwwuwutwxz{xz{|{}}}~€„�€€~|}~~�€‚�~�…†‡ˆŒ‹Šˆ‰‰Š‹‹ŠŠŠ‡‹Ž’”––•”‘Ž���Œ‹‹‰‰ŒŠ‰‰…„�‚‚~~}}}}||xvvuututsrqpoljhfdaa^ZXVTQOLJHGGHJLMSWYZ[\[Y]^]^^aaaa```_^`^ZWMF@;989::;=@A@BDCDCBA?>=;:988866666666666666665556666666788:>EJQPQONOSVVROMNTXZZ[^_\]^^]]^__acddcddcdba`\VTTUUZ_`ddhijkjmnnoptvyz„…‡‹��—š�¡£££ œ–ކ~vqolhgfc`]\\\ZZ[[ZXWVQPMLNOPONMLKLORTUUUUVVVUTTSSSSTRRRRSRQPPNMLLMMMMOLLLKJIIHJKKLNNNOOPQTUVXV[[WTVY[^b`adcddbbbeiimmooonoqroqrqsttvtutvvtuuwwywwyxxwuxyz{yzyz{}€€€}~�€€}}~€~~~€�€�…‰‰‰ŠŠŠŠŠ‹‹Š‰‹‡„‹Ž�‘‘’‘”’�‘�ŒŒŒŒŠ‹‰ˆˆ‰…ƒƒ‚ƒ€}{zzxxutsrrplikjgdca_\\ZWUQQMJIHEA@?><<<<>CFNV[\^b`^ababbbeba`ca``__[WOHB<9899;;=?ABCEEDCBA@><;:989<766666565666666656665656667779=CJPRQPOOQUVUPMNRY][[^a_]^^^^`aa_addbeedcdaa^XUUUUY^bdcgikmmnnnopuxzxƒƒ†Š‹Ž•›Ÿ£¥¥¤¢�˜�…}sonkigeeb_]]]]\]\\[ZXXUSSUUWURPQOPRUWVVVWVVVUTTSTSSSQRQQRQPPOONKKKLLKKLJKJIHGFGGIJMMLMNOQSRTSRQRTWYYY[]_^ceegggffddhjlkkkmmnopnorstuusrttuuvwwxxwwwwvvywxwy{yyz{|}~~|z~€~||~~€�‚‚‡ˆŠŒŒŒ‰‹Š‹ŠˆŠˆƒˆŠ‹Ž�����‘���‹‰‹Š‰ˆ‰ˆ†‡‚ƒ€~}zxxqronllhfeb_]\ZWTSQPLLJGEBA?=<;:988777779>DNW^^`bb``abbccb`_`````_^[XQIC>:::9:<>@ABDEFDCBB@>=;:988:766666676666666666666666666779=;::988777766666678=DNW]_`dc^`aababbaaab`_``^ZYSJC>;:9:;<>@ABDECDCBA@><;:9887766666666666666666666666666779=;:987776666666666666666666655667;BJU[\_bb`^aaa_cbbc`aa`_`^\YULC?;999:;=@ABCDDCCBB@?=<;9887666666666665666666566666667789;AIOVXWSQQRSTUQOMVZ][]`_]]__^]_``a`cdffgjjife^XUVWW\`bceghkppqruwwxyyxz{|~�‡Š�–™›žž›š’‰…�zuqpnnihgigffeebccb`_`__]\\ZYYUTTTTTSTTSRRQQSRRRRQPRRQQQQPOOMKKJIIGGGHIIJIIHFFEEEHIIIJJKMMJHFFFHIIJIJLNQRQNKGEDHOSWX\[XZ]clqrrrqpqpkknommrqppronlmoqnnssssuvuvwxxyxxxtz}���‚{|}�ƒ†††ƒ‡‰ˆ‡‡‚uv€|~zyxtqtrnppnllifc`[ZVSRPMIGECA@?>=<;::9887666556566565666556666656666667;AHRY]^bca^bc``aaaaaaa`_`^[YTLD?;989:;<>ABCEDCCBB@?=;:9887666676665666566566666566667778;@HOUY[VSQSRTTROKSY[\\_^\[]^][^_`aacfgghkjhgebZVUTVZ_bacffhlppruvuvvvwy{}~ƒ‡‹‘—››œšš˜’Š…�}vsqnmjihggfgfc`aca`___]^\ZZYXVVTSSSRSRSTRQQRRSQQRPPPPPQQONMKJJIGGGGGIHIIIHGFFECDDDEHHIIFCDFHKMOMLLQTTTSSTUQMNNKHCBCKQTWYUWbhjkmoojjmmgfiijlnmlifdghlnnmjlmmpuxxurokhdhpouy{yz{}~{z€‚�}|~{wurpppqvvsrspmigdgfcfddc__[VRNIFCB@?><;;::99998887776665565555555555565566655555667:@GPZ]]ab__``_^bbbba`b__`_\YTME?;9999:FOUY[WRRRRRTSOIUZ[[[``^[]^^\_``aacghghkjghfc\VVUUX]`_ceghknostutuvvx|€ƒ…ŠŽ�•™šœž›�›–�‰…wsqplkkhhhhgefdcaba_^`]\[[[XXWVUSSTSRTUTSQRRRQRQPPPPOPPONLMKJIIHHHGGIGHGGGFEFECAADEEDDAADGIIIHIJKHGKJHFGHEFHJKJFFDC@=>ENJGJT`fhgcdiilkihkkffhiigc`]]`iaZUYadfikidSNS]ffjpsuyxzwsrlhhigdfhhifhd\bhljifcc\X[`]Y[[[[XTQMJEA><;:;:99988889888877766665655555565555556656565655669?ENX]^aba_ab_`acabbaa`_`_[YVNF@<:9:;;<>@ACEFDCBBA?=<:98776666666666666665666656766566789=DLSY[YSTRRRTSPIPX\\\_a_\\^^\]aabbdghggkkihge`[UVVX\^acbfhkmopsruxxz|‚ƒ†‹Ž”—›�Ÿ¢¢Ÿœš”މ�ztromjkijjihfdcba_]]]^\][[[XXXUVUUUTTTSTTRQRQPQPQPONONNMLKKKHHHFGGFGFFEFFFEFFDA@A@??>=?CCCCDA?BA>=<<<>?ADDBC@@BCGFGGC><@?=::@HPVW\_beghgdggffd_\\]_ZZ[LGBCBFTTUTIFINTNNU\`]bbbcb``_Y^_cfha\]^``ZY]_`]\\VPTWUUVWWYXSPLGC><:999999888989988888766666555555555555567665555555568>EMW\]_ca``b`aacabaaa`^_`_ZWNGA<:999:;>@BBCEEDBA@?>;:98776666667766656565555665555666679;BJSVYXUSSRSTUSHOV\]\`a`]]^^_]a``acgghfjjhggea\XWVW[_cceimnprpustwy|‚ƒ†‹Ž’•š�  £¤¤£ š”Œ„{vsoljjjkihgfdb`_^\\]\\\\ZZXYZXWWVYWVTTTTSVRQQQPPOPNMNMKKIIIFFEEFDEFEEEEDDDECA?>>=<;=>?@AA>=<;;<;;:::9:<<<;:9:=;::::;:98:@MOMQOIEEEFHPNHJONMLNTXYVVZXZZ[WQRUQRSTW[YVUOHC><:999999999999999887776655555555555555557655555555568=CLUZ^_baa`bb``aabbbca^_^_ZXQHB=:899:;>?ABBDDDCBA?><::8766666676666666666555555666666778;AGPUYYWTTSRTVSELT\\\^^`]]]`_[__accgegfgiihhgd]XTVW[adehkoprutttuxy}ƒ„†ŠŒ�“•™žŸ¡¤§¨¦¥ž—�†~wrnmkijiiggfca`__^^\\\[[[[ZYXZZYYYWWWWVSRTROOONMLNKKJJHHFGFEDDDDDDDCCBBBABBA?>==;:::<<=<;999:::887777776666667766666666666666678;@BDEHJJGIOPNLLQQQMKA8666666677887666667?@>==;;<;;<@DKNMNTUSV[[]^[TUTTRRSUXZXTQJD?=;99::999999:9999998766665555555555555555555555556668=BKU[^`baaabb`abbaabbb``_^ZXSIA=:9999;=?ABCFECCBA@=<;98876766777666666556566655556667679;@DLSXWXUTRSTUTEKS\]^_^`^]\]][^``aadegfghihigd^XVVYZaeklosssvxuvx{|~�„…‡‹�’“šŸ¤¦¨ªª©¨Ÿ›’‡}xqmlljjkkhffeba`^^_\[[[[\[[Z\\[Z[ZYXWVURQPNONLKKJIIIIGFEDDBCBAAAAAA@@??>?@@>>=;98899998888777777776666565555566666566666655666666777777889999:9>><::766566666656666566668=;9::::::::::::::988776666655555555555655566566555667;BIT]_`deaacb_`cbbba```aa_]YTKC=:999:;<;98876666777676666666655565566667678;?BIQVWXVVTRTVUCIRZ]^__`^]]_]\]aaaabeefghhijid^XWVY\chinqtrruwvxy{}€‚ƒ…ˆ�’’“–œ£¥©«¬­ª¤ž“‰vsmkkkijjhffdcba_\^^[[[]]]]]]]\Z[[[ZVTSQONMLKJHHHGGFFDDDBAA@?>?>??>>=<<=>=;<;:9878::988887777777666665555555555555556666555555555655566666667667776655555555556655556665667988888877777778:?ILURKOZa\WXUXYXVUTVXVRSQIE@<;:::::9:::::::99988777665655555555555666555555555557:@GR\^`dda``acbcbabbb`__`_[ZSJC>:999:;>=<<<<<<;;;::::;:988888877978776656656555555555554555555566655555555555555555666666666666555555555555555565555666677777667666668;?@FQMHKQWSRRWVVUSRQQSMNNHDA=<:::::::99::::9:9987766655555555555565555555555555569?FPY]_bea`ab``ccbcba___`^]ZTLD?;9899;=>ABCDDEDCA@?=<:9766655556666666555555566655666678:=@FMRUSUTSUUTU?GPY\\]`bbaaa`^^abcbdgfeehjjieeaZXVWZ_ehiinqquwyxy|{�€ƒƒ†ŠŒ�“—œ ¢§©¬¬©¥ –�ƒ|vrponmkljihgedeaaa``^^_`^^\\[YXWVUSQOMLJHGFFDBB@@@@@?>>===<;;;<;::;:9999998999877767777766655555665555554554455555555556655555555555555555665556555555555555555555565555666666866666666666789:@@?AJJORMPNKKKKMMMKLJFB@=<;::::::;:::::::9988776665555555555555555555555555569>ENV]^acb`baabcccb`aabb`_[YUNE@;9899:<>@ABCCDDCB@?=;:88766655656666665665555556655656789<@EJPSSTSRSSSU>ELW[[\^cba_^^^]`abbafhfegjjkhca[WVWY_egjjortwxyyyy{~�‚„‡‰‹�’—šž¢¥¨«­®©£š’ˆwsqopnllkjigeefcbaba___^]\Z[YXWUSTPMKIHFEDCBA@?>=<>=<<;;;<::9999999888=999977667776665566555555555555555544555555455655556666555555555655555556655555555555555555555566566666697666566666577677888;=CC>AEGLKKMMJJJGFD@>=;::;:::::::::::9988776666555555555555555655555555669>ENW\^`ba`b`_bbbbc``a_a__\ZVNF@<9889;<=@ABDDCDCBA?=<:98776555666655655555555555555666679=BFIOSUSSQQQRT=DKTZ[[\`b`_``^\_cba`cfgfghjlidb\YVUY^begjmtyvvxxzyx|��…†‡‹�‘”š�¢§¬®±°«£œ•‹�ztrqpokljiihhfeeddc``__]]ZZXWWTRONLJHDCBA@?>=<<<<;;:::9999988888777789:99876665556555555666555555555544554544455445555555765566555555555555555555555555554455555555556566665666655566666666666656668;;:8;BEECDEFJKKFDB>=:::::::::::::;::988776655555555555555555555555555568>DMX[_`b``baaabddca`a__`_[XUNFA<:889:<>@ABCDCDCBA?=<99876656665556655555555455555556667:===;:::9999998888777888988888:;97666666656666565665555555555554555555555555555555665567666555655555555555455555555555555555566656655555555555655555665555556666789<>ABAACCDDA><:::::::::;:::::::988777666566555555555555555555555568=CLVZ^`aa`acbbababca`a_`^^YVOGA<9889:;=?ABCEDCCB@?><:98775555656555565555555555555566679=AEIOSUTTUQPQS;BHPY\]\^aa^^____`dbabeffdjkkied_ZXWWZ`efjmpttvyyyy{~�ƒ†ˆŠŠŒ‘•˜Ÿ¤ª¬²³±¯©Ÿ•�‚|zspqpnmlljjigedcba``^]ZXWSRPNKHECCA>>=;;::998878777777776677767788:987766666666566555555555555455554445544455555555555455555555555555555555555554545554555555555556655666566655555555555555555555556565679@ABBDDGHDA?=;:9999:::::::::::999876666655555555555555555555555567<:98776555555666555555545555555566679<;::9888777767766666666666667889766666666555555555555555555554555544455554555555555555444554545555555555555555555445555555555566555576555556555555554555555555555566668;@CBBBCCDB><;;::999::::9999::988777666555555555555555555555555557;AJS[^^`aaabbabbacbbc_```_[XRJC?;98::;=?@ACDCCDCA?><:9976555665556>855555555454555556778ELU\][]__^___^`aabccdghhfkmljfa\[YUXaegjnqstvxxxy{}�ƒˆŒŒ�’–œŸ¦¬±²±°¬§�—Œ„|{vuqpponlkijhgedb_`[XWTQNLJHFC@>=;;:998777766666566655555666666778766666666655555555455555555445444444444444555455555545455454455545455554455544544554445555555655555556555555556655555555545555555555556679>CCCEFFD><;::::<<;:::::::99998777766555555555555555555554555556:@HSZ^^aa`aabadbccbbaaaaa^\ZSKC?:989::=>?ADEEDDCA@?=;9876555655555:955554545455455666678;AGKNRUSTTTRPR8=DKS[]\]_a`]^_`^`ccccbgihgillhfa]ZXXY`dikknrsvwwyx{}€‚…‰ŠŽ�’—œž¤«¯²²±®¨Ÿ˜�…€yvvsnonnnlkjhgea`][XWTPLKHEB@?=<::988877667566655555555555666776776666655565555554555555555555444544544455455555555555554444544544455554554555555554545545555555555555555555565555555555555555555555555555577<@@AAA@><::9::::::::::::::999887665555555555555555655555545556:@HRZ__`ba_acbabbcabaa``b`^[TLF@;9889:<>?ACEEDDDB@@=<:9766656665555555554555545557666778;@FKNRTUSTTRPP8=<:999877666666655555555556667876677677666655555555555555555555555444555555544455554555555455554445444555544445554455544455555555565555555555555555655545545555555555555555565556788999;:::889:::::9::::::9998876665555555555555555555555555569?HPX]^ad`abdb`bbaabb`^ac`\YUME@<999:;=?@ACEDECCB@?=<:8876655655655555555555555556666688:@GKNPUVTSTRPQ8;CIOW\\Z]^`_^``__`bbbacghjhijigd]\ZYZ^eimoqstuwx{z{}�„ˆ‡‹Œ�”˜œ¡¦¬¯²±°­¨¡š‘Š€~xvsqoljkiifec`^ZVVRNLIGEB@><;:97777666655565556555556666676667766766665555555555555455555545444555555555444445545444544455545444455555545555554545454544455555565555556555555555555545544445445455555555555555566666678888999:::::9::99888776665555555555556555555554555568?FNV[^`b`acebbcdbbaab``a_[YTOFA<:99:;ELX\^_`babdabcbcbbaa___`]ZVPHA<:98:;<>?ACCDDDCBA@><;9876666555555555545455555455566677:?FLOQTVTRQTQP79@EMT[\Z[^^^\]___^_cdccegeffgfhf_ZXXY^eklrrvwz{|}~€€ƒ…ˆ‹ŽŽ‘•˜ž¢¦ª®°¯«¦¢˜’Š‚{vtronmlkifca_ZXVPMJGFCA?=;:9887666655655555555556555556665677886666656655555555555555555554555555454555544445555555555545555445555545554555555455555545545454555555555555555555555555555554455554555555566555555555555556678899999:9998877776666555556665555555555555555568=CLU]_`bbacecbbcabbbaa`a`]ZWOGB=:889;=?@ABCEEDCCB@><;9876666655555555555555555555556778:?ELPQSUTRSSQP67=CJRX[Z[^^][\_^__aacbbeeeffgfgd_ZYZY_dlpsxyxz|~|�ƒ…‰‡��‘“˜š ¢§¬­­ª§Ÿ˜�‰ƒ|vrpommhigda^\WTQMKGCC@>=;99777666655555555555556555566666678887655566555555554454455554455555554444444445454555555445555554454554445554455454455544455544445444555555555555555555555554455555445555555555555555455555455566678888999998887776656555556655555555555555555557@ABCDEDDCB?><;:876666665555555555555544455656788:=DLPRTTTSSSSQ67:BHPXZY[^_]][]^^^^`dcbeffeffgfb_ZYZZ^eotuyyy{}~}|}‚…‡‰‰Œ�’•—™œ¢§¬¯°¬©¡™Ž‰‚|vsqnkkgfca]ZYTQMJGDA?=;:987666655555555555555555555677666667765555555566655455455544545554555544445555454455554555555545555544454444455455455545554555555544454455555555555555555555555555555554455555555554555555765555555666777898998887766666555665555555545555555555567<;:8776655565555555555555554456666779=DLRTUTUSRSSQ669?FOVXYZ[^^^\^^]`_acfbcdhgeehfb^YYYZ]gorswz|}}€~~|€‚„ˆˆ‰ŒŽ�•›š�¢¨­®®­¨¡™Žˆƒ}xqolhhda^[XVRPLHDA@><:98776666555555555555455555556676766676665555556666555545445544455555555444455445555544554555545554545545544454445555555455545555545554444455554555555555555555455445554544545555555455554455755555545555556678898887776665665555665555555555555555567;AIQY]a`bccdeddfdc`ab`_a`^\XQJE>:999;==?ABDEEEDCC@>><:9776665655555555555555555555666789=CKPUUVVTSRSS569>DMSWXYY]^^\^_^`^`hicadfhfffdb^YXZZ]fmsuxy|z~€~~~ƒ„‰‹Œ��‘–˜›ž¤ª®¯¯«§¢™‘‡�ywpljfc`^YVRPMJGDA>=::987766555555555545555555455567777766776555555656655555445454454445555544444444455445555554444545544554555555544455455555555655555555544455445555554555554555555555554555445545444565544455445555545555555555566798887776665555555556655555555554555557:AHQY]_`cbbedcedcccca`^``]\XTKE@;99:;<=?BCDDEDDCB@?=<:9876665655555555555555455556666789=:988766655555555545544555555556766677677665555556665545554544545555444554444444444444544455554444455554455555555555555555545555556554545454455555545555555555545555555555555555454555765445445555554444455555555566788877765665655566555556555555554555569?FQX\a`bccddcddbaacba^_a^\XULFA<:99;=>@BDDEEEDGB@@><;9886665555555555555555555555566788;AFMSWVUTUTTT557;AHPWXXY]^^__`aa_]bccabffdbbba^ZVY[]ahnqrwz{}~~€ƒ…‡ˆˆ‹�‘‘”—�¢¦©¯­­«¦ž”‹…}xrke`\ZXROKJGDA?=;98776665555555555545455555555677755556666555655655555555454454455555444445554444444544445444444444454455445555544455544555555455544444444554455466555555545555545555544555544454544445564444444454554445555555555555678777766555655565555555455555445554569?EMW\``dcbdfdcccddb`a`_``[YUNGA<:99:;=?BDDDFEEDCA@><;9976655555455555545555545555656778:?DLSVUTUUUTU667;AGNUZ[Z]a`___``_^abb``bddbbab^YUWZ]bgosswyz}~€‚�‚ƒ†‰ŠŒ�‘’–š�¢§ª­©¨¤Ÿ™�†€yrlga]WTPLJFDA?=;:88776665555555555555555555567786666566766655565666555555555445545554544455444555545554445444545544455555555555445544455555555555555555445555445445555555455555555555545555545555445555557555444555445445445555555556555677776666555565555555555555545555556;EENV[`cdbbddbcddcdbaaa`a`\[VOFC<:9::;<;988766655555555555555445455566887666655556665556555554455555555444444455444445444445555544454544555554455555445545544455444454545455444455444544454455545545554555554554444555544455544455565444455445544555554555555565665677776655555555555555555555555545568=CKUZ]`dcacedbcbacba`__a_][VPGB=:99:;=@BCDEFEEFDBA?<;:977666555555555555555555556666678:FLSZYZ\````]^_^[]`a`^`adeba_^[VUX[]ahnsvwz{}ƒ…ƒ‡‡‰�Ž‘”•–˜™šœœš—Žˆ€wrmhaZUOKGDA?><:98776665555555555554445555555567876666655666555556555555555555555454444455554444444444544544445445445554555545445444554544444455555444545444455444445455555544555444555444445544544555455455555444445544544545555555555555566667766665555555555555445555544455558:9::;=@ACDGGEFEDBB?=;:8866555555555555555455544556677779;>EKNRUUSUTT5668=EKSY[Z[_adb_a`^^^_a```bddd`_^ZWTWZ\_horwy{}}~€€‚ƒ†‰ŠŠŽ‘“’’‘‘���‹„}tmgc^VRLIDA?<;:98776655555555555554545545455556666776676555766555566655555565555555544545554445445454445555444545544455554555555455555554455455555555555554555445555554555445555555555555555445555545554555555555555545554445555545555555555567667766655555655655555555555545555557;AJS\``cbccaacdc`aaaba``a][YQJD>;:::;=@BCDFHGGEEBA@=<;9876666655555554555555555566677788:=CJNSUVTVTU5556;CIRZY[\^_ab^`b__^^_^__``cb][_[VSUZZ_fmquyyz~~€�‚‚ƒ‡†‡ˆ‰ˆ…„ƒ~{wpjd^YSOJFD@><:987766555555444555545545444455555556666766655555655555555655555566654444455544444444444444444444445544455554555544454444445554444555555555555555445445545454454555545555864555444455555544444455545555444445444454444555555455555556666666665555555555555555555555554457:AHSZ]abcccbabababbba`_aa^]YTLD?:99:;<>ACEFFGFFECB?><;9976655655455555545455455556667678:<;:987766666555555555545455545544445454455555666766555456766655555555555678765555556555444444444444554455555555445555555555455544555545444555555555555655554555555545544555555665557655554555555555444555555455545545544555545455555555666666665556666555555555555555555545455455569?GOW]^_baabcba_``ac`abaa^\ZUNG?;:9:;=:988776666665555555555555555555554454555445566668777765555568786555555565556898655455555545444444555455455555555555545555555555455455555454555555555555555554555554545544555555555655865555555545556555555555555555555554555545555555555555566666665656667665555555555555555555555555569>ENW\_`aaaaba_aa`bbb`_aa]]ZUMGA<:9:;<;9876655555555555555555555566676779;?CINQTUVTU55557=EKSZ[[]^_a`_a`a`\]``__]``_][\[UPOPOPTVXVVTSSONIHEDA@?=<;:88776666666555555555555545554544455544544454445566688877655555567875554555555678:86555445555544444555555555555445555544544444455544454554455554445555555555555554445454455555545555555655655555555555555555555545455555555565554555545455555555555566665555666665555555555555555555555555568CCEHIJHIHGECA><:9866655555555545555555555565667779:>CHNPSSTTT55557<;:976566555555555555555555566667779;?AFLPTSTSS55556:CIQX[]]^]`a_^_]_]]_`^]^^_`_]XYWPIFEB>=??>=><::988777687666666665555555555555556545455544444555555444556678888766555555566555555555569::97655555555655555577777666555555455555555544445545545556555555554455555555555655555555554555555555666555555455555555555556555455555555555555554545555555555555555555566665555555677655555555555655565555555567:99:AELQPRSRR445569@HOV[Y[[^`]^\]\]]\]`_^`^_`_]YYXPIC@>;:;;;;;:9987777766666655655555555555555455554444444444445554454445677788765565554455554454455568:;:76555555555555669:::887655455554544455555555554454445566555555445555555544555555555444545554445555555555555554456655555555555545455555555545445555545555455675545555565565555565666566555556555555555555544558;AJRZ]`ab``aba_a`cbab`^`a^ZXSJC>:99;<=@CFGHIIJJJGEB@=;:876555555555554455555555555666679=:::;;=;:9987777766665566665555555555555555454555444444445554444456676777655555555555554455555579;976555666656657889<>:9776555554545555555555545544555557776555555544455545555555554444455444545544445555555555545555555555555554455444565554455554455555454555555555555556655556566566665555579665555555555555557:AJRX]_caaaa```bbbbba__``^ZYRJD>;99:;=ADFGIJKJKIHFCA><:876555555555555555555555556667778;>BEIOPQRST554558>ELSYZ\[\___\]^_^]Y\^^`]]__]ZWWSKD?<;;:;;<;:9988777776666565555555555555555555555544554544444455554567876665555565455555555555566679987555556766678<<999987665555545555545565555545555668887666555555555455545545555545555455554455555555555545555545555555555555555554445555555545555555555544555555445555556666556666666775555567665555555555545567:@HPY\_aa_`ba``bbabb`b```_ZZULD?;99:;?ACFGIJJJKJGECA>=:976666555555555555555555566667788;?BDINPORSS555557GPUZ\`a`a`bcabbda_ab`ab`][VMFA<:9:;;:;;;;:988777666666555555555554555455455545544544444455555455566775566666554455665545567669:7899755577776777665555666656665556666555666656555677765554454444445545555545455544445555544544454445455545455555555555555555555554445444454544445555445555455555554454445555455566655555656876655556555555655555555569=ENTY\^`_`bcbbbddbabaa``_]ZVMFB<99:;FNSY[][[^_^^]]]^[[[]_][Y[]][WSQHC>;:9::998777666555555555555454545454445455545444444444444445566776667666554445665555678667778=<75555555566655555555566555667777655556655555555455565444444444444545454444455554445444544444555555455544555555555554555555555555444444444444455455545455554544445455555555556665655555556668765665566555555555455568;BKQX\b_`^abb`bdbb`abaaa`_[XPIC=:9::=?BEGHJJLLKHGEB@><987655555555555555555555555676789;@DFILONOPQ5444557;999:98876656555555555555555554445444455444444444444444455555887666766555555565555676557988:<865555556566555556555555677778876655655555555555544555444444444444455555545455554445444544455444455455545455556555555444545555554444455444454444555554555444444455555545555556666556655655567765555565555555555555557;AHQV\^``_aaaaacbb`accba__[ZRKD>:99;=?CEHIKKKJKJGEC@>;997655555555555556555555555566889;@EGKKLOOPP4455456;BJPW[[[[[`^`^]\\\[\\_]][Y[[XXSNKD?;:88887766666555555555554545455544444455555544444444444445557976557766555566765455676589::887555556666555565555555566778887665566665555555555445554444444444554544444445555555555444555544545555555544555555555555555444555555455444444544555445555555555545555555555555566666556667555566876555555555555555555567:@HOVZ]__^```aabb```abb`__]YTKC>:::<;:87665555555555555555555666667889>BDGLLNNPRQ5555456:AJQVY[[[[__`_\\]\[Z[\]\\XW[XVTNKF@<9888776656555555555454455544444454454444444545544444455554699755566654456676545556557<:98765555565556665555555555668999876667788656655565555554444444444444444544444455455554445444555544445554545555555555555555555555555444444455444554445555444455444545445455555455556666555566665566886555554555554555555567:?FMUY\^^^__```abaabaa`_`^\YUKE@;9:<;=@BGHKLKKIJHEC@><:9765555554555555555555556667777;CBDGKMMNOQP55444558@HPT[][\\^_`_]\\][\Z[\[[YXXXUVPKGB>:8777666655555545554544445555544444454544444454544444454558;8655676655577665445555569:9766554555555576655555545678:;;:98777997776665555544445444444454444444444544444455444554544445544445544455554454554555554555455555545554444554544445444444444445544454454555555545566665555555555656776555555555555555555569>FLTYY[_^^_^`aa`aadb_`]__]YTLF@;9::<>@CEGJLLKKJHEDA?<;98665555555545555555555555666779;=AGMNNMMPP55554558>FNSX[[[\]_ba]]]\[\[Z[]][WWWWVPLGB>:876665655555555555554545544554454445555555554544444455555997656676655697754555555588887655555655556655555555669;<<;::9889:977666554544444444445444444444444455444455444544445555445555455555444454444555555555545455544555444545544445544544655454544555545455555555555555566555556665556788655555555555555555568=DKRXZ[]\]]^^^```aa`___a^]ZUOGA;:::;>@CEHJLKLLKIGDB@=;98665555555555545555555556666678:=AGLMOMNPP55544557:86666555555554555554444544554544445555454444455544455545798765677655598765555455567898765555555556666655555569:<<;:99999;9766655544445444444454444444444444544445454554444554544556655555555555444555545555555554445555545554444545445454544554544455544545444455555555555556665555665555678766555555555445555569ACEHKLLLKKJGEB@=;:87655555555555555555555555677789=BHKONNNOP54554456:CLRWZ\ZZ[]]]][Z\\ZZ[Z^`YXWWWUTNHC?;8665555555554544555545454445554544544445445545444455445578776677755578765555455565678775545555556666555555679<===;97888876666655544444444444444444444444445545444554554544444545456655445555544454444555555555554455554555554544454455544555444554455554555554444455555555555656655555555567777655555555555555568A=<<:97777666666554444444444444444444444444544445444445554444445555456755554445545444454555555555555555555445554444555444554444544444455554445555455455555555555655555555555666768755555554545555568;AHPTXZ[\[\__]_`__a`_^^^_]ZWOHC=:9:;=@BEHJMMJKJIGEB@>;987655555545555555555555556667679;EGJMQPNNN445445558>HOSY[\ZXY]^^\[Y[YXYWYZYYWWWYTPID@<9665555555555554455444445545544444445555555444454455555687766777666766555455555556669755555555566655555568:???=;:877767676655544444444444444444445444444455444445555455544555445455555455555544554455545555555556555446557555555544545554555455555555555545454454455555555555666654556555556767765555555555555667;AHMSXX\\[\]]]`a^_abb`^^^\[WPHB=;::;=@CEHJLKKKJIHECA>;986665555555555555555555566667788;AEINQONMP555555557=DMUXZ[ZZY\]^\XXXYZXYWX\ZXWVVRPJD?=965555554445554444454454444444544444544455554444444455577766776667876655544556555657765555555576565555568:>AC?;87777776566555444445444444444444444444444444445555445454544444555555545554455554444545555555555555555555555555555544555544445554445554545555444554444555555566665666555555555566665555554555555567:?GLTVX\\[\_`_]`__`_`a^^`_ZWQJC=:99:<:876555555455555555554555566666789=BGMPPNMO544444456;CLSWZYYXY\^]\XWWVYZZVXYXXWTSTPKC><96555555445444444444444455444444444445544544444444444457787676656987555444566556555665556776566655555567:;?@@<8666666666554444444444444444444444444444444444444545444444444554444445444544444545545555555555544555555544445544445454554445444445555555554555444544544555555556655665555555555556665555545544555569>FLSVX\[[\\^^]`_^_a`_^^]^[VRJD?;999;>ACFHLJKJKJHFCA>;:986544555555454554555555555666679;97655554555555454545455454544545555544545554554444445557678876667665555545566665556656555555666656556679===:977667766665555444444444444444444554444444544445455544555444544545555455554444444545545555555555555555654445555555555554555555555555555555555555555554555555555566666666556555555665666555455554555579=DKRVXZY[[\\\[^__``^`_^_^YWSKE?;:9:;=@CFHJKKLKKIEDA?<:976655555555555555555576555666688;?EKMPONM4544554559@JQUWYZXYXY[ZXYWWWWVVWWYXYVRQPLE?;8755545455444444444444444554444454444445444444454444455778:87668865554444676666566655555555556566555799;=:88877678766665444444444444444444455554444444444444454554455544445554545554444444454455544555555555444555555554456555555555555554445455555555555555544554544556555556655555555555555555665555555555555569=BJQUV[[Z[[\Y[__^____]^^^ZXSLF@<:9:<>?BEGIKKMKKIGDA?<:986655555545555555555576555566678=CCHKOOML4445445458>HOUVWYWXWX[ZXXVVWWXWVXXWXXSPOLF@<9765555544444444444554444444454454444444545444444445556779:87678655555545876556665555555556765565557::998::9866677777654444444444444444444444555444444444444444455544554544444545444444444444444544555555444444445554444455555555555555445555555555555555555555454555555555555666655555555455555565555555555455569=BJQTWY\\ZZY[^^_`^a__^]^]ZYTLFA<:9:;=?BFFIJKLKKHFCB><:976655454555555555555555555566678?BAFKMPNM5545445557=EMSUVXWWUXYYYYXUVWVUVVVXVXUPMNHA<976555555444444444444444444444444444444444454444444556778897677655555555676656666565445556666655557:<989:;:9767766877644444444444444444454445555444444444444454555555444454445554544444554455444544555455544444454454544545545545444455555555555455555555665556654545555555556656666555555555555566555554555555668CGJNOM4555545557:BJRTVWWVVUXWXXXVUWWWWXVWXWWRNKIB=97655545445445444444444554444455554445444544554444446778776666555665557876555555655555566666666669<=:9;==977776799655444444444444444444454555544544444454444454455555444445455545444447`94554444554555555555544545455544555545555555555455555555545555556667656655555555556666666666555555545555565655475555555667;?FOUWWX\\]^_]]_^]_^^^]]\ZYWPHA=:99:;>ACFHJKKKIHHDA@=;:775555555555555555555555556666678:<@EHKNM54444444469?HPSVVVUVWWWXZYVTVWVUWVUWVVRNKID>9765544454444544444444444444444444544444444444444444567876666545676678876555554565555566666655679=>=;;>=9777778975544444444444444444444444454444444444444444444555544554444555555554445654444444445555554455444455544555455555555565555455555565544555555666765565554445656666667666655555555555555555565445555557;@GMPUW[\Z[^_^]^_]]]]\\\\[XVQHB=:899<>@BEHJJJIIHHEB@=;98765555555455555555555555567667789CJPVYZ\\\__^\_^^^]]\[\\[XUPJC>:999;>@CEGIIJJIIHEBA=;98765555555555555555545555566667789;?CGJKN44444444458:8865555554555556666786678;>AC?=:888877;:7644444444444444444444444444444455544444444444444555544444445555454554444444444445444555454555445555545555555555555565655555455666655555545566777666555555555667667876655555544555555555555455555557:=CKQWZ[[[^a^\\^^]\\]\[[\YUVQJC?:99:;=?CEGIJJJIGGDB@>;:8765555555555555555555555556666789:=BEHLM45444444457;BKRUVTTTTTSTVVWVUSSTUUUUTUSSNKFB=96554445555444444454455444444554454444444444444444556655677788668;?;9975444555555566665687778;?CBB>:8777679;755444444444444444444444444444455554444444444444444555444455444545444444444444444444554555555554444455454555554555555566655555555666555556555656886666555555567777668765555555454545555555555555555569>BIPUYZ^^]^]_\^\\^_\[[[ZZWUPID?;989:=?ADFHJJJIHFEBA><:8765555555555555554544555555666789:=AEHKK55554454456:AIPUYVSUUTRTTUVUURRSUUTTTUSRPJGC=9765545454444544444455554454544555445445444445444455655667876667:<<:;96555556555566666677779<@FFB=:887666898655444444444444444444444444545555555544444454544545555555444455555555544455444545544555554555555454454555544545555555555556666555666665555566767787655566555569887668766555555454555555555555555555669<:8766555555555555555555555555666779;=?CGKK44444444456:?GOVUSSSTTTSRSUUUTRRTUTTRSTSPLGDA:76545555454445545444445455445544544455444544455554665566786667:=;;;:7655565655677876666679<@CDA=<:976678866555544444444444444444444555444567654444445445444554555454555445555544554445555545545555555555555444454545555545555556666566666555677665566566667787655555565566789878877555554554455555555555555555569ACDGHIIIHFECA?=:9766665555555555555555555655667779;>?BFII55545445556:>DLSUURSSRQPQTTUTTRRSTTURQTSQOID@;8655444544444444444444454444455444444444454445445556666767768;<;:;97666665555467766666768;@CB@>=<;865799655554444444444444444444444444445566655444444444444444555444445555444554444444444444444555555554545554444454454554555655655566666566667666655566697788765556656666778877887655555555555445555555555555568ABDFHHIIHGEBA><:9765655555555555455455555555666679;=?BEHH444444444468>BIQUTSRSSRQPPTUTTSRTTTSSRSRQPJEA<96555454554444445554444454454444444555444444554555566778899:<;:;><865677655445666566678:;<@C???=<8667986555555444444444444444444444444455577655444444445444445555455444455454455544445544444555455555455555544444545555545555555555556666666667766656666677799876556556666778887889765555555545544555555555555568;AHMSXZ]]]\\^][^\\][[[[Z\YVTLGA=989:;=?BDGIIJHHGEBA><:9766655555555555555455555555666679<>@BDGH455444454557:7655444544444445555444454444554444444445545454455666678998:;:;=<866788655555576655679=;866787655655444444444444444444454444545555666555444554444444444554444445544555544454444454544455554555555555555555554555554555555566655667666777877666667778::876556656666787877878765555554544555555555555555567;@GMTXY]^]]^^]]^][]\[[[[\ZVTNGB>:899;>?ACEHHIIGGDBA?<:8776655555555555555555555555566678:=@BEGG444444544457<@FNTTTRQQPQQQQTVTTSQTUTTRQRQNJFC>:7654555544444444444555444444444444444444445444556677667788;>>;:876788655555456666568;@BABEE=:97656776655555554444444444444444444444444455665555545444554444444444454444444444555445555444455444454555555554444554555554555555655566556677666777889866678878:<<86655655577898877777765555454545544555555555555567:@ELQX[[]\\^^\[\\\]\[[Z[[ZWUNHB=:899;=?@CEHGHGFFDC@><;9876555555555555555555555555656678;=?AEFG554444444456:@FMSSTRPPQQRPOQTUTSPQSSSRPQPPLHC?;865545455555444545454444444544444444455544445555787667888;?A=97887:9755445555676668;>A@?@@=:976677666665555444444444454444444444444444445666554455554544444444444444455555444544554455454544454445555556655554555544555455555666667655688766788889977789878:=@:67655666788:9986777775555554445455554555555555567:?DLSWZ[^\]]]^\\\\\[[[[Z[ZWUMIB>;989:=?ADDFGGGGEDCA><:9876655555655555555554555555556778;>ACDEG4544444455569@EKQSTRRPRRQPPOQTVZTSTUTRPQRQNID?<865554444445544555454444444444444444444445555556876778779==::8:9:;9755545454566667;<<<<<=<9:8666767775555555444445544444445444444444444556565555444544444444554544544445545455555545544444444555555555655555555555545555555566676666655788767999:98888999789=B>76666666789:;8877967766554444555455555555555555679=DKRUY[^^]^^^]\]]\[[[[Z[YVUPIC>:889:<;:876555555555555555555455555556678;>ABDFG4444454454559?DIOSTSQRPPRQQPQSVXVTSTTSRPQQOKE@=9755554444454455445444444444444445445444555555656777887:@<8879;;>:755445555556567:<:88;?@=:9667677976665555544544454444444444444445444456666554555444454444445555555544445555445555544455445555555555455554445555545555555556668876655567887889::::99998:99:=B?966666678898:7877977865555544445554555555555555679=CJQVZ[\]\]^^]^\[\\ZYZZYZWVQJD@;889:<>@ACGGGGGFDCA><;9876555555554555455455545555566678;>@CCEF5554444455468=BINTSTTROOPOOOPRTUVTSUTRSQOQNLFA=;86554454554444544455444444444454554445555445555788888;;988888;:;865544455556667899878@BDEGFGGFEDA>=;9887665555555555555555455555556679;>ADEFF5444444444456;AGMRTTSQPOOOONOQSVWVRRSSTROPPMGB=:8655555444455554444454444444444445544454455555677777999887778::8655444555555679877789:998666666776988765555545555554444444454444444444578655555454444444454444445445445555544455554555445555555555555555654555444445555555556679=:7666678:99:<;;<=;;??<:<<:<>A=8776677888886777866666665544445445555555555555668;BIPUZZ][]\]_\\][]][]ZYZZYVSLE@<999:<=?ACEGGGFFECA><;A976655555555555544555555555666678;>ACDEE4445555544556:@FKNSUSQPNPPPOPPRVVWTSTSUSQQPLGB=:86554554444545445455444445545444544444444555567776667777888888865554444456557898788;:8877666666677777666555555555544444444454454444444588765555454445444444444555544554444554445455544555555555555455545655444554444555555556678<<8777678<<9:=>>=@?@>=<;<==<:887767878876788776655666555544455555555555555568;AIORXY\^]]]_[]\\]\[\\[[YWVRMF@<:999;=?ACFGFGFFDC@>=;:876655555555545555555555555556678;>ACEFF44455454444459>EKOPSQRROPOOPQPPUUVVSSRUTQPPMHB>;8655444444454544544444544544444554444444455667777665667788899865554444455555777778:;:9876666666677777655555555555555544455444444444445689776555444544444445454445555445544444454444555555555554555554555654555455555555555656678;<9777778;?=;>==>A@@A?ADA=<<<;;>988777778998787776665777555555545555555556555567;?FNSXZ[\\\]_[[\\[]\[Z[]ZXWSNGA<:999:<>ABDFEFEEEC@?<;:976655555555555545555455555665668;>ACEEE45545454445458:8655554444444444555444444444544444444445555666666555667899::765554454445555777779;==98766666667887777665555555575555554444444444444445578777655444444445444445444445544445544444455554555555555555555555555555555445454445666679;=:8877889=>==???AAACABFC?=><;;<;:8777777989886667765666555555555555555556655557;?ENSVZ[]\]^^[\\\[[[ZZZZZYXUNHB=9889:<>@BDFFGFEEC@?=;:876655555555555555555555555666678;>ADGGF45454455444557;@GMPQPPPQQNNPQQRQRSWUSSUTQOMLJD>:966545445445544554555444444444444444444555665555556666789;:9755555555455566777779==987667676777998987656555555565555444455444444445444577766765544445444444454445455455544545554455555455555555554545555656655545454455555566779=>=;988889<>@=?A@DEABECCIC>?=;;:;;9887876788876656655555555555455555555555655667:?ELRWZ[]]^\]]]\]Z]\[Z[YY[WSOHC>:989:<>@ADFFFEEEB@?=<:876555554555554555555555555666679;>ACFGG454544444444569>DJMOOORQPMMPPPQPRSSSSRSSQNLKJD?;865545545445555545544444444444444444444555565555565567899:9765555554445556787888;:9766677667788::988765554455555654444444444444454444456776665554454444444455554444554455444444544555445555554555555545566775554444455555555668:=BB?;99889:>?>>?@FDCCBBBIJE@?:;<<;:8988777777666565555555554555554555545557655679?DJRVY[\\^\\\[\][[[\[ZY[[VTPJD>:889:<>?ACEFEDDDCA?<;:876655555555455554544555545567788:>ADGIG554555554545568=DIMOOPSQQPOOQQPPPRSTRRPRRPLJID?;86554544444444444454544444444544444444566555555566667989;8777655555555555688888;>97767789988889<;887656655556666655544444444445555454567666665555555544444444454555444555545544455555455555554555555555556665555555455555555678:=ACCBA99:::=??@AADFBFCADDJLD@=;==;:9:98877778766555565555555554555555555556766669>CKQUZZZ^]]]]^]^^Z\Z\\YZYWUPJE>;988:<>?ACEFEEEDB@>=<:876655555555554554555555555667788;>ADHJH444445444445567;@GLMNNRSRQPNPRRQOPRSRRPQRPLHGD>:8655554444444544444444444444444444454445555556555557898:877765555555455667889:=?<867:;::::99;;=>:9866655555776655545444445444445554445576766655544455554444444445554444555455555455555555555554555545555565555555555555555556789=@@CFC<:;=<=>>>CBEFFEIECDCKJB@==;9876555555554555454455555555677778:>BEHII545554554455557;?EJLNNOSSSQOPQQRPQRUUTRPPPMGFC?:8654555544554444455544444444444444445555555555555677799888866555555555556899:<><988;==:9==>?=;9766655555776665544444544444555544445666676655545655654454444455544555545454455555555555555555555455555555555555555555545566778;DDAEHA=?BEGIIDHLDCBIQHA=;?G@:9;;98769:766666665555554555555545556555665568=BIPUXY[]][]_]]^]\]\[ZYZ\YUQKE@<9989;<>@BEDEDDCBB?=;:876655555554555555455555555676678:>BEJKJ445444444444557:?DIMONPRTTRQOORRQPOTTTRPQQMGDB>:76555455445545444444444444444444454444555555555567778::8887676555444555668:9:;;879=CB=>>;8;>AB@<:8666655566776655555544545444445554444566796655555555555454444545555545554445555555655555555555555555555556665555555555555566778:CMIFFDA<:;;9:989:767665665555555555555554445665665678;@GOUXY[][\^_]]]]]^\Z\[[ZYURMFA<:899:<>@BDEDDCCBA><;:876655555555555555555545555666678:=AEIJK554544554544556:>CIMNPOQSRRTPOPQQPOQTTROONKFB@<976554865445445445444444444444444454555555444556677778;<;:87765555555556677799999:?<99;=?HD:;<=<;99<976766666556655555555555555666666568;@GMTWZ\]]]^]]\\_^_]Z[[ZZYUSNFA<:99:;<>?ABDDCDDCA?<;:8876555555554555555555555556666789;9765545554544544444445444444444444445555555555567677888;<977665554545569:7778::<=>ADC>=;989@GB<98878766566667665555555444554545555544445678886655655555544555545545555555544555555555655555555666664566555666677666655555555578789=CGMKDBB@>BFDCFFCDNOHC@A>>?DC?><>CC<;?ABDDCDBAA?=<:9866555555555555555555445666566779<@EHLL4444444444544568::89;BB>:98778766666666765556655444444455555544455667887655555445555544555444555555555545555555555556556555666666666666679877666555555568889><@D@A;=BB>;<>>;:99;97997666656875665555555455666566567:?ELRXYZ\^\Z\][]\]]\Z[YXYWUSOIB=:8999;=?ACDCCDBBA?=;:8776555555555555544555555555566679;?DHJK5544444544545558>>@A@=:9:<>A<:988888877776666665555554444444455555544456668887655454555555544544445456555555454545555555555555666666766667777778:;:977665555568989;AEFBCCCBFFGHDBFIHDDDGF@?><<@??;:>>=:9:;<::9;:9997766656786555555545455676556667:>DKRWY[\]]\^_^]^[\]YZZYYYWTOHC>;889:;=?@BDCCDCBA?=<;9876655455565555554545455555566778;>BFJL4444444444445557;BGMQRRTSRSQTVTRPQQNLKMJGEB@=:876555544445445444444444445544544545555554445556567888778877665555555677678889;?=<<<=<9:;;=><:99998998788877766655555555455545555555555876:;9976655555455555445555455665555554555556666555555556666766777788899999;;;88766556557:::;>GKFCBADDJFHFDDGOJB?@AA>==<;=<;9;;=;99:<:;:89:8888766556876555555655558866666679=CKQUXY[\^]\]\]\[\\YZZYYXUUPIC?;989:;=?AACDDCCB@>=<;9876555555455555555455455555666678:=AEHK5544445444455557;BHNRRPRSSTPRUUQOOONLIIGFA?>;976555444444444444444454444444444555444455444555556777778987765555455577667777:;;:9:::::99:=<;:99:::;:88:9888676666555545545555555555555688:999876565555555554444555545655555555455555655556555656777777789::9999889<=;:8766565679<:;=AGKEDDCDGHFIOIFKOHC>=<<=><::9:;9:::999::<=98:888:876655797556554555668766566778=BJOTZZ\^]^]^]^^[Y^[[[Y[YVTPJC@;9889;<>?ACCCCBB@?><;:8766555555454555544554555555567779;@DHK5444445544444556;AIOTTRQQTSRRSSRPNMMIGFFD@><:8765555554444444444444444444544445545554554456655566678::8755545455555667777679;9989::<;98<>=<;:;>>;<::9:;8887667755565555455555656555565668??;:8655555555555555445555556655555555555565555565666667999878:<<;::;:9:=A?AA:87666669=<<>@EHHFGB?@CBEIQGFJJG@<;;<>?<;99:99999889::;:8;::;?:77665797655655555668766566668?@BBCCCBA?><<:8866555455555555455545555555656778:?BFI44544554544445569?FNUVUPORRSRPQRNLJJHDBBA><:97655555544544444444444444444444444456555554555655667:989765555555455656677677899899:<;;88;=?><;=?BA?=<;9998877776655555555555566765555556667:=?:876665555555554445555555665556554555555556666656698789:9:9;=?>?<<<;9:@ABIE;7766668>=??AEHIJHHEB><;<=@>;98887789888999:87::=C@88777887666865555567766665678?ABBCCBBB?><;:8776555555554555544554576555566678;>ADG44454444444444569>DKTTTRNPOPQOONNKHHFC@@?<:976655554554454544544444444444444444444544445566656668:877655555555555567766677788:;<=;8779<>A=>?ADGFB@=:::988878886656555555555666765555567789;<:86665555555555545455544557655665555455565555665557:9989;==<<<=@@?==;:;<>BKD:876767;>>?DEKJGGA?@<;:<><9888777777888899889;AB9:877876666975555557765666678;AFMTVYZ\]\\\\Z]\[\[ZZXYZXURKF@<9889:<>?@BCCDBBB@>=<:8776555555555555555454455555666678:=AEH44444444444444468>CIOSSRONMOONMMLKFCCA>=<:886655555555444444444444444444444444444544444555666679987655555556555565676666667789<>;86679>BA>?BDGLJEA<;=<98999::86665555555566666656566776789;<;8667655555555544554455555675556545555566665555555579:88:>>???=>?@>>?>><:<@C>988767:>==@DLLJGHIE@???ADCEEFF?AA<99:=::8897767788779:8789?D;:;88867666666665557766565567:?ELQVXZ]\]^]]Z]\Y[YYZZYXXURLFA<9889:;=>@BCCCCBB@>=;:8766555555555555454454554555666668:=@CG54454444444444558=CIMPQQONKNOLJHIHCA@?<;:976655555554444444544444444554444444444444444455555569988665555555555555566655666778:=>87668;ACBAAIIJIGC?>??<99:9:9;86666656666677777766566888899:<;8656665555555555555555555776555555545666555665555568:977;?AEC><>???@@?@<9:;<:888779;==?BGLLJHGGBA@?>@@?BCIG?A?<989;:8887776787888:8789:A<:<97767866676566657766665568:>ELPVXZ[[]]]\Z]\YZ[XYXXYWUSNFB=:888:;=>@BCCCBBB??=;:8766555555555555455554555555566668:<@DH44544444444445557;BHLPOPMLKJLLIGFEA?=<:987765555555554444444444444444444444444444444455555666997765555555545555555555568778779;976668>DDEEJNMKKJDAB?=;;<:999:876666666667898877666668988:9:;:87665555555555555555555555766555555556566666665555678:867:@EB?;>@BDDC@@A<:::9988878:==>BEJLMNJGGCB@?>==?@CKDBC?;888998878876777779877:88<<=;87677676666665567665556679?DLRYZ[\[][]\[][ZZZYYXXXWSRNFB>:9889;=>@BCCCBBA@>=;:9766555544455555445554544555666678:=@DH45444445444444556:AEHMOMLLKIIKIDCB@=<::876655555555445445554445444455575444445454444455566668976655555554555555555555677788778866567:D@CGLMRQOLKHGB=;;>=:9:;:88777677767::9:987655668:899:;<:98766565555555555554555556766666554555555577665555568:99779??=<<>DLMHBBBB<:::989988:<==@DLMLOOKIJIFB?<;<=?DFCB@=:878887788876777789879889;;;88776666765566557776655679>CJQW[[[\\Z^[[\[[ZZXXXXYXUSOHB@G<889;<>@ACCCBBB@?=<:9776555555554555555555555555666667;>@DI444445444444454458=BGJLKJJJIHHFCA?=<:98766655445555554444454444444444444444444444544445577779866654555555455555555556787876766665567;@DEJKLUVQMLJC?=;:;:877777788876777888678788<<98786666665565557765555668=BIOUZ[[\[\]_\\][[[YYWXXWUROGC?<9889;<>@@CCCBBA@>=;:9876665544555544445554545555556668:>@DG555544554444444558;@DHJJJJKIGEDB@=;:977665555555554544444455445444454444444444444444455578777665555555555555545555567777776655556688:=CBDJPUWSPNHC@@BA>=:<><9:9889:;:9:=A@>=:77666567:;9:<>===<97766555555556655555565556666555555566687766665566798899888:=?==@?AAFC?<::99989889;;=ACGHGGLLMPNNPJC@;;;;;<=>?B@<87777778987777888778787:D@:997676666567656865555679@ACDCBCBA?=<:9876655555555555544555555555556668:>ADI444444444444444457;=CGHHGJIHFDB@>;9877665554545555554444444654444444445444444444444455568:8866555555555544455555556876666555555556789>?=@GLPPLLJDFCEG?<;<><;::999:=><;=A@@>;877776567:<:;>???C?9766666655455565555555655566556554555668897666556667778;:889=<<>??;989::99889:;<>BEJJFILNLMLKNIG?;:99::==>B@:87776678987667666677788AA:988666676566566765555568?@BCCCBBA?=<:9876665555545544445555555555556668:=ADI4444444444444444568;?DGGGHJHECA?<:87666555555555444444444444455554444444444444444544556:;9:866555555554455455545557866666555555556678;;=?BDGFIGBFFDGB=<=><;;;;:::<@A?@D@@=;;:876776688::;=>?BF?987666566554556665556655556655665555566677766665667778899889:;989::;<>><:8667767898777666677778:<:999766788655556765555668;@FMUXYYZ\]]]\[^]\\YX[\XXURPLEA>;:::;=>?@ABCBBA@?=<:9876555555544455444455554555556678:>BEI5444444444444455567:=BFHHHIHEB?=:976655555555555555544444444545444444444444444445444456:98965555555544444445555555666655555555555666899;<>ABDDABEBEF>>;;<<;;;?BFFFB>=;:;:8778977999:;<EC@>;9:999989:::::9:99;=AINNMJLPPNPRLECC?<98889<;;;;:8778766777787666787777999B<778888655556975555668;@FLSWYY[[\\^]Z[][[ZX[XYYXSQMFB>;;:;<=>?ABBCBBAA@=<;9877655555554454455555555555556668:>BFJ44544444444444444579<@EGHGHHEA=;9866555555555555544545544444444444444444444444444545557;9876556555554454545555555556655555555555556678999;=?BB@A@A@><:;?=;;>@BHKD>=<;=<:8778::88::;>?>?AB=9887666565555566656666666567656666666667777766667788788887889=??B@?=:9::999;=<<<<;;<::;=AKSWSNKKKLXULGEB@;988889:;<<;:8877677767666669776678:?=767776665556:86555667:?ELRUX[\\]\]]\[[ZZ[YZYXXXTQMHC?<;;<<>?@@BCCCCBA@><;98776555545455554455555455556666679=AEJ44555444444444454568;?CFGGFFD@=:8765555555555545444444445444444444444444444444444544457;9665455555554444445555455655554555555555656567789::==>>;=A>:<@B><::=>==<@CFGDA=><=?<97779:=:9;?==?@<::::;99;=>=>@?>BBD@<>>ABBCCBA@@><;98766554554444455445544555555566679;?EI44544444444444447978;?CGHHGEC?<97655555555555555445444444444444444444444454444444444556875555554445554445445566555554555555556555555677899:;;;::=@=;>@?>;:=??@@?BFEB@?>???=;9778:=?=:;?BA?@BDC>;8898766555566655679766666666667666667777776666789999:998889;@A=<=?<;;;;=;<;;=>@BEBDHHIE?@EINPNKLLNPLJHFD@=:998888889:::988777777666667666679:99997766555556556565669=CKPUYZZ\[\\[[Z[ZZ[ZZXXXZVRPKEA><<==>?@ABBBBBA@?>=;:9766555555555554445544455555656678;?CG55554544554554444558:>BGIIGEB@<97655555555655655544444444444444444444444444554554444566665555565554665445545565555544455555555555556667889:9989;>>;<@?=<:=@AAA?@CDA?@BACB?=:98878>@A==@BA@EGDB@=:88776666655666678:97766666666666776899987667789:::::9978:;=A?<<<;;?=<>><=?ACECFHJMFEIKLOOPLHKJKIGHGC@>;:;98887789:<;;987877776666665667879987766555555566655669=BIPTXZZ[\[[\Z[\[X[YYZXXYVSPKFC?=<>>>>@ABCCBBA@?=<;:8776555545455555445455544555666667:=BF55544444444444444458;?BGJIEDB>;8765555555555554554544444544444444444444445444445454455665555555554445545445665554454555555555565555666789988889<=<;<;=CFCBB>@ACABEBAABA>:88978;BCA?BA?BHLDACA;88776665556666679<:7677666666655776899:9877778:<=:::::88;>?BD??GB<;=<;=?==??=>BDCBFFHPQKILNRUSOLJLLKPOIFFB?<>?>;9889<;=>?>@@AABBCBBA@><;:97765545545455555555545555555666679BFIHGDA=:876554555555555554444444444444544444444444444555444456665555555555444444545445555545455555555555555656677877779<<<<<>>=;><<=>?@C@>@HFCGHEKOLIKNQYURLKOMMQRLGB?@@>@DB=:899:<>@>::89;:97666666666788779967655555555555568=???@@ABBBBBAA@?<<:88665555544555554445555555555566789;@D55554454554454445557:=BFIHGD@=:766555556555445555444444554454444444544444444454454556666555545555544544454565555445555555655555556666677777788;;:;;<=;:>IJEHE@@ABKNNLLMNMI@;9:9989>BBAFECDEFEB@?<987766666666667:;;=977766667766667778999978:89;===@?>;99;BDFFADLMC<<>=?@??BEFC@BFGKGFEHHJJMLPWYTONNNOLHDABECC?CIFB>:988;>?<:99997666766566669:878976665555556555568;@FNRX[Z[\\][ZZ[YXZZYYWXXVTQOIEB>>@@@@AABBCBBA@@><;:98765555555555555555455555555566678:>C544444454444444444569=BEGIGCA>:875555655555555544444444444444544444444444444544444555666555555555544445544456555454444555555555556566677777789::9889=<:@JKFKE@ADDFLSUTOKNJA<::889:>BBBCHHFGIFCA>;987777766677768:>?A;88776667876677789:::989989;@>>BA?;::A545445554444445444468<@CGHHD@<986656655555455555444444444444444444444444444444444445565555544454544544444545545444544445555555555566778777788::9877:=<;>EGJHB?EFHKPUYWSQMD>=;9989;>BCDDIKGGGFDDA<988987777667788:?AA=9876766678778878:;:;:88889=D@@CD?;99@HDEEAINNKB=@A?BCEFHKPKHDCJIGE@@CHIMMPRTTQRTURMNRNOKGDC@AEGEEDA>;877777877766666665679878777665555655555557:?FKSVXYZ[ZY[ZYYXXXYYYZXWUTQNKGD@?@ABABAAABBBAA?><;:98766555554555545544455555455556679;>B445444444444444444458<@CFIIGA<97665555556555556544444444444444444444444454444444454556555554444444444454444444555444445555555555555777777779:987778<><;=BEFEACGKLNSYZVPLG@??<988:>?ACDEGLHJNMKKG>999998776667889;?BC>;987776679889988;;;<:8888:@GAAED>;::BKEHGCJNMMD>?BAEGFGILSRMKGEKKLC@@EIJOPQQQRPSWXTOQRQNLHFCABEFGEFCB@==:88::87776766566699777876766555555555569>DJQVYZYZZX[ZXYYYYZXWYVVVTROKHDA@ACCBA@@ABBAAA@?=;:98766555445455444454554455555556678;=B555555554445455445457;?CFIHH@<9865555555555555544455444544444444444444544544454445555655554545444444455454445555554444455555555566667667889:987888:?>:;>BFEBCHKLNSW\ZRMJC@DC>:99=ACCFDCGJMQSQQPI@:9:::977777889:=?BC?=:8887767998;:99<<=>:99::;CHDDGF?=<;FPHJJIOTROFCADEFIIHJKSWRPOJNONLE??CHPSUVVVTVWZXTQPRNNLIGGCDEEFEDDDBCB=::;:9776666656678878777776655665555669=CJQUXZX^[Z[[XYYXXZYYYXYXTROLHDBAAAAABA@ABAAAA@?=<;:8766555555555555555665545555666679<>A5444444444444444445569=AEFEC?;86555555556554554444444444444444444444445444444444444555445444444444444444444555555444445444555565655667779:99877889=@;8:?EGDEGLMOQWYYUNNIAEFC>:8:ADGFHEDHIKRVWWXMA;;<::9:87778::;>BEE@?<;986777:989:9:==>?;:;;;;>CLW^Z]\WVYYYXUPPQQMLJJHEEFGECCBCDEA><9::976666556667779879876655566555568=;:98766555555554555545455455455666678;?B4544444444444444444458=AEGFC>;876655554576555544444444444444444444444454444444444444454444444444444444544444444544444444555555565566679:;:98888989<;9:;@DEFHLNNRVXWUROMGBHF@=;:>@A<:;=<>HIIJHGA?;;::8766655667788:888876665556555568=<:98866555555555554545555555556776678;?C4555454444444444444568;:89:999;=AFJKJGB><:97779;9888:<=>?@=====ALJLMJGCA>ATZTHIV\^WUQKGJRXOQRTTPX_]`_WSRMNIC><>GQ^i^WXYWXYYXXWUQNKMLJFDGJMMHA@BFFB?;:997666666677888877886755556555568;?GMTXZXYZYY[[YYYXYZZYVWWURPMIFB@@AB@AA@@@A@A??>=;:98776555555455555554555555445566679;?C5445444444444444444457;@CEC@=987655555558655444444445444444444444444444544444454454444444444445444444444444444444444444555555556678:<=;98789:;;98::78:?FLKJJNQSTXWUTQRMHMMFA>@A>=>EMNSQLHFCBCWZUIM\^^\XTNJHQYVQUUURV_]be_VTQPQPE><>FSfg]VZ\[XWWWUWVQMLLLKFEGIMLGFDCDDB>:998766666678988888877665556655558;AGLSWWXXZZZZYXYXVXXWXWWWUSQNIFCA@@AAAA@@@@AA@??=<::8866655555555544555555555555555678:@D4445444444444444444457:>BCC?<97655556555444444444444444444444444444444444444455444444444444444444444444444444444444444445555555779=><;;;98::99988;878=FOOKJJOTUUV]b[TPJNUMDA>>BHORSSSVTPIGFJRTPHCBDB=<::;;;>??BKVWPOLE@?==979==;:9:;<>A?=BC???FNTWRNMKGBGY\VJU^bab[VRMIOYZTUXUSTaaagbYSRSW[OC==<:98876555555455555545455554555555668;?C45544444444444444445579>AC@>;975555555555545554444444444444445544444445454444544444444444444444444444444455444444445445555555677:??=<<<99;<:88768987:BINMJKKOUVZ^dfZQLJWWMECABFMSUUQWXWVMJFGRWPGCEDA>=<;==<;;;=>@A?@GE@BCGOZ[TQPLLFQY^XKYaaef`XWRKNY`ZSZZSQ^fehe]TPUUYVJ@??BHRY]YZ]]\YZYXVRSQOMNNMJJHGIHIHGCAA>;997776665778779988887555666555569>CIOTXXVYXXZYWXYVXYYXXVXXSQPKFCA@AA@@@@@@A@@@?>=<;:9776655555555555555555555555556668;@D55444444444444444444569FJNMJKNQXX\^^`XQKN[VKGEDFITXUSV\\\XRLHGOTNHDFEB?==>>>@REEJU]ZVWPHB@@>:9;?>==<>@@AB@DKDBBDKS_\USQLGGV\[WJWbdklf[WUNPac]U\^UPXdhjkbYRWU[ZUHBA@DINVWX\_`^[YXVQRROMNQNKKLLJGEFFCBB?=99877666566787::98787556665555569=BIPUXXWYYWXYXXZVWXWWWVWWTQOKFDB@@A@@@@@@@@@?>>=;;98876555555444555555555555455555668:>C45444444444444444445568;>@?<97655555555555445444444444444444444444444445444444444444444444444444444445444455544444444454556689;::;;<;;=?<:976666889=DIMNKMPSU[\_b`]VQLOZUNJHFILV\XW^a`d^WRLHLPNGEHGEA>=??=@IEHQX_\]]RHEBA?<:=?@A>>ACCCCEIKDDDGL[d]TUTNFHU_YTJWcfkrjbZVQP^i`Y]_\VS\fiomdYVTXb]UID@BINNTXXY[\[ZYUUSRRPNRQQOJKLKIFGFCBA=:88876766567889;:8::8655666555568<97655554454554445444444444444444444444444444444444544444454444444444444444444444444444444445566799:;;=>>==><:976666799@@B@ACFEFHNPKDEHKRckgX\UMFM[aXOMYejktlg`VTP\hbZ`b_ZV[_fnql`USU`f_TLD@GRVSVUVXXVWVWXVUUTROSVSLPLMNHGJHDB><:8897766566788:;9777665566555557=<;:88766655555555555554555455555556779<@554544554444444444445689<=<;976655555555555444444555444444555544444444554444445445455554444444444455555444455444444545555789:;<<>BA?==<;88766668:?>?BBBDFEFLSNIHIKQ[hhcY_UPIR`dZRP^gmltpkiYTR[id^`he__`bchqpfYUTV`b]WMFDLX\_\[VYZ\\XWWVUVVRTSWRLMMLLJHJGAA>;9888776567887898788766676655557;?EMRWYXXYZYZXWZYWXWXYXYVTPQMHDA@@@@A@@?@@@@?@?=<;:98766555555555555555555555555556678;@554444444444444444444578:<;:9765555545444554444444444444444444444444444444444444444555554444444444465554545444454444445579:;<<>BEC?>@>;866656779>DJMOPNQX[]^acdeg`ZOGELOV`UOSYZX\`hqqkeelf_[TLIFILNJFB@BBCDGNTZdfgpjXLLGFB>@@=>ABBEGFFLMHHJNPSaiha[_XPKWad\YUgkmmqonj]TU\fhecmmdabgjdkok_ZTU[a`_UMIHU]cc]ZZ^`_][XYXUWXVRSTOKMMIIKIHEA@=:887766667788988877665577655557:>DKQUYXXXXXZYWYWXWUVWWXWUQPLHEB???@A@>??@@????=<;:98776655555555545555554454555556678:>555544444444544444444568:;:987655555454444444444444444444444444444444444455445554444555444444444444555444455444444444568:;;;;@CEBAAA=9765666678>EJMLPQPX^_bcfefgebVJDCMTWYUQWYWX_fkppkkfghigYOLGIMPMKEBDEFJLS[bhknxnVMLGD??AA>>ACDIHEIOKJLPSTYgkh`_a[PN_fec_YmsrprppmeYX\gkjdqrg_benkiopkbXV\aef`YRJJXba^[Z]_]]_\ZWVUV^WPOPMKLLIJHHFB@?<877766666788877879766687655566:>CKQUWWXWZYZYWWVVWWVWWXYVSPMGDB>>??@@????@??@?=;;:987655555555555555545554445555566789=5554444444444444444555678::98765555445444444444444444445444444444444445545444444444555554444444444446555444544555444468:;<;?DFJKHHKOKKOVVWckieadc]QVhigkh\jyzqtyxqi^[^ilkelri`dcoooszvl^U\]bgie^TJKS\__[Y[]\\\XYWVX]UQRNLKKLJKJGGEA@<9877666667888877688656776555569>CJPTXYXWZYZYVXZWWWXVWWVVSOMHFA?>????>>>>???>>=<;9987666555556545555545555555555566679<55454444444444444445556688998765554444555544444444444444444444444444444444445444444455554444444444445555555554444445569:;;:=BA??@=9765554567:?EHMPSTST[^_\bdefdabYMCAEKRPPRW_]Y_hgjopqlkiikh`ZONPROMMFHMMPT[]^hx||zmXPIFB@@A@ACHMOMILLMKMUZX_lkmfeed[SYkmmtram|{vu|ypja^_jsnfhpnbbenqtx{�weZX]`adea\TMKQY^`^\]_^]YYWXXVVRNPPNJKKIKGFEB?;:987666667888987677655766555569=BIORWWVVXWXZXWWWWXWVWWXWSOMHEB?>?@????>>?>??>=<;9887765555444544454455554555555566679;55444444444444444445555678887665554454555544444444444444444444444444444544444445444455544444444444446765544444444455679::;<=?=;;86655555567:ADGNSTSRQX^`a]cfhfcb`VL@AGNOPSX[][]ekkmpstmjfhkhbYQUUTQQNHLQTYZce`gz~�zgXNKFA@@ABDJMPQMQQMNJQ_^^jrtukihd[T_sssz{gr€}{v|~skea`mzxihnqcbfmsovxuwqbY]^dgjjg`WPRSV[^\Z\^[[ZWXWXWUPMPQLKKKHFFED@=;;97776667888877679765776655568>>>>>>>>???>?><;:987765554554444445544555555455566678;5444455444444444444755567888766555554455656454444444444444444444444444444444444444445555444444444444466554444444455578998:;987655545555567:BEFJRUSOQY__a``deddcaZMC?AFKMPW\\\]fkokmqrqmignpkaWTYVTRUPJPV^`chkfjw|…vfYNKD@BBCGLRQTRSWURPQ\b_jsv~womhd\Ygyux~|hy„€{zz€wnmgcpƒƒqijogbbhorsvvwvm_\[bliikic\ZXTTWZZWZ[[[[\[YVVTOOQQNLJHGEFFD><:9877666688998766;866676555558>>>>????>>=<;:987665555555555445555545445555566789:54455754444444445655555568887655545555665444444444444444444444444444444444444444544455554444444444445565444444454455778779866555444556568;CIJJKSSQPZ^`acbdeeec`ZQF@@AGKLPVY\\bhknlmrsrjkmqmh]VY\WUWXQNTYcinqrlkkuyshXLFC@CDGOURSUUZ[VVW_gcisyyƒ{qpjdZ^pyv„{kw…„|}~{uqokiny…~mjpniaepruxxxxsh_\djliglkee`ZVSRVUSWX[\^YVTVUSQOOMLKJECCDE?<:99796666678;<7669876776555567;?GMQWWVVXXVXYXZWUWVVWWUWTQNJEA>=<==<>=>>?>>>>=<;9987765545555444454445555454555566779;5554554444444444555555556778776555555555544444444444444444444444444444444444444445444555444544444444455554444445555656666655555555556679=;<=<===>>>?>==<;:887665554455554455555445455555566789;55544454444444455555555566777655445455565544444454444444444444444444444444444444455445555444444444444455444444455677665667776655556679;>FJKLMMNUUT\eccceccdghd\RF>=@CJRQV`ffiosrsumutomtvpkg`_d]ZZ^]XSSZjryzwtnpkkldRFFCCGNWb_]b_X^`binqlv�ƒƒƒ}wsqpdav}†‰ˆ~n~††ƒ�€zyzypnrxwxwlhqroemvyy|zyvtqjbhfhnqsmjiggdbca_\X^_`]ZYUVWTQPONLMLIDCDC=:98866776779:=8668977886555656:?EJOTXXYYWVXXVVWVVWUWWWWUPMJDA><:;;<<<=>>>>>>=<;:887766555445454444545555555555566679;5454444444444455765555556677775544454555454444444444444444444444444445445444444445444455554544444444445554444556678777799:;976666678;=@GLLNRQQQUSX_ffdbceegifaXLB==CGLTS]hihlqwvsvouvpouvomg\^b]\]a_\YY`nw€yrmqmiiaMDEDHPZ^bacgb\_bjuysz‚ˆ‡†ƒ‚‚wtpipƒƒ‰ŠŠ‰�r„‰‰„ƒ�}~{wttz{yztnpstfftxy}|{wttumjifirsohhgeegebaa\YZ[]\[VSUUQQNNPOKIGEDB?:98877776779:=86688678865455669>EJPTVWVXXVXYVWYVTVVXWUWUQMIDA=;::;;;<==>=>==><;:988766545455555444546655545555566679<5554454444455555555455556677765555555554544444444444444445444444444454444444444445444455544444444444444544444556788877:<==<;::8888:=AIJPW[chgjotwzuuptxrrvuqle^aa\^cca]\^gtx‚�}slromcRGEEIQ]`cfcihcb_fv|vv„‰Œ‹ŠˆŒ‡~zrky€‡ŽŽ‹‰ƒx†‡Šˆ„���{vwu}‚€~yvuysrjhpyz|~~{y{„tklnijmmmmjhghe`cb^ZXZ[Z[YVVTSTPNMNIGGFFC?;:<87777768::>86679779865555569>CIOTWXWXWVWWWWXUVXVWUUVUPMIDA>::9:;;<<==>>===<;:987665554445455444447=75445555566679<5554444444544556555544556678765454444545544444444444444444444444444454444444444455444444554444444444444444445567897889=>?><>@@>=>>=AILLOPSTPPOMRX]beffhhfcdgcWK@<@HNOT[`gkjmpvxxtutwvssqrojbbdb\agi`^_cmw{~{zsnrqg\MEEIQ^bhmghljfgju~{yƒ�‘ŽŒ‹�–Œƒ|op|€Š‘��Š„zŒ‹‹ˆˆ‚„…w|}€‚‚‚yww|sllovz|z|€~|}skhmkgehjjigefddba_]YVZ][YXVTVVQPNNJFFEDC@<:>87666679;9:9767867:765545568=BHNPUXXWXVWXXWXVTUVWVTVTPMJE@>:998:;;<=>>=====;9887765545545444455445885555455566668;555544454555555544455445667776655444555454444444444444444444444444444444444444444444444444444444444444444445556788889;=@@A@BCBCEEDGLMOOSSSTSRPMT^dcdefhgdeff_SD>@FQTUWZbinnlrz{wqq{}wutrvri`db`bhmlbcclsx|�{vywrn^PLGIR]hpsolrrtvt{€~†�–“Ž‹Œ��Œƒzox„‹�����ˆˆ™“�Œ�‡†ˆ†{€€„‡„„xw}ƒsijqw}~~€|yztqrmmgcfggjjhhhgfb`\ZYZ[[XZZ\WRONKJHEDDD@=<;8777667898997788789765544568:8889:;<=>>>===<;:987766554444454455555555455555456667;55554444555555554555555556676665544445555444444444444444444444444444554444444444445444444444444444444444444566778789::98899:<====>===;9987665544444454455544445444555555667:55554444454455544554444556666666554445555444444445444444444444444444444444444444445544444444444444444445554556788988;=@BBBCDCFJJLQPMOQUVTRRUTPS^dcbdfgjifc^ZQE@JSX[`\V`flqupwz|zsppptwz|zpeiiabirtmhimx~~ˆˆxscTKNV[bjrwy{„ˆ�†Š†ƒ„Š”™˜’ˆ‹Ž’’�€v€�‘•“–•–�––›•Ž�Ž‹Œ‰‰†…‹†ˆˆ‰�Šˆ‚�‚�wnlo~|y{{y{|ztswrnljjjlomjfccb_^_\YZYXZ\\YXVPOLJHGB@?=:98777787788::76:=987666545567;?DMPTWXWWXVWUUWTUVVUVUUTROLE@=:98889;;<==>====;:987765654444544444544445444555555667:6555445455555755565554455666666655544555444444444444444444445444444455444444444444444444444444444444445655556787898:=>@ADHEDFHILPQMMQTSURRTVTUW[abdigghfec^WIBFW\[_`[Zbgouqlwyz|ytqqrv|}zmdpg`cmutmilrw€€{‚‚reUOOWfprx~€„‡Š‹…ˆ�‹ƒ…“”•š—‘Œ�“‘‰ƒy€Ž••”“–•–•�•˜”����‹Š‡ŠŠŠˆŠ‰‰��Œ…„�„~vsprvxz{yuuyutvupllkjiiiffeeca^^^][WVXYYXTSPOLIHIE@@=;:87788987889:7689898766555557:?DJPTWWVXWXXUUVUTWWVWVTTTPLGA>;9778::<<=>====<;:998765555454444445445555444445555667:6555445544445555545544555666766565545545444444444454444444444444444455444444444444444444444444445444555765566778999;?>>@CDDGJKLOQLKQSTUWTUUUTWWXbbffffgge`ZODES_^`b`Y[bkstqnvy}{vsqu|�~wjfnb_dpwtnkqz}}ztuwqc[UX`hx{„ŠŽ‹Ž�ŒŒŽŽŒ†‡�¤¦™š™–�’”�ˆ�„‘˜š•—•˜—–•‹�–““”’���‡‰Š‰Œ‹ˆ…�ŒŠˆ‚ƒƒƒ|unx{{yvwtoqrsolnlljghkkhhebb^_^\XWWXXVTRPPKHGHFAA?=:88787787889977997766775555679>DJPUXZWWXWWXVVVTVVVVVSTSOLGA>;98889;;<======<;:998765554555555545554445554455555567:6555555554545555544444555556666555555544454444444444444444444444444445544444444444444444444444444545454665566779:89<=>=@BEHLKLLNNIOTUTUWXWUTUWWZacfegjkii_RHCL^`^ee`Z_aowvqpty}}wvqq{‚�sghi]`jstsnlvz{wohhga]`frwv�ˆ†ˆ�‘”–•�’�‰†Š–ž©¨ �š”—––”„ˆ•™œž˜––™˜˜•Š�—˜”•–“�Ž‰ŽŒŽŒ�Œ†Œ�Šˆˆ†…‚‚‰ƒ{xxy{|zxurtwwssrsxwolkkjjfcc_^^]\YXUWTTTSROLJIGC@><9877777778:8877:;8876675555569=CJNRXXVXXWWWTUWTTWTTURUSPMGA><9878::;;=>>>==<;:9886665555445554454455555445555555679655555555444544455554565555566654554554444444445444444444444465444445564444444444544444444444444444455556566778999:<==?ACEHIKJMMJKSUVXYWVUQPSZ\\]cfdgiihbXNFIXa_age^^adpwuqpvwz||wqu{‚ymfhg[`mpwvnqyvusma^_^fr}†ˆ‡ŠŠˆ�Ž”™—”•“ŠˆŒ”œ¡¢ žœ–”�š˜’‰–›ž¢ �—“š™š“ˆ‘–•’‘“”��Œ�Œ��Œ�‰��ŒŠŠ‹‰……Š‚x|{zz}|zwzyxvuvy~ztmmjjjhfb]]]^^[ZWUVUTSTQMIIGB>=:8887769:79;8879;:8897776555669>CJNRTWVWWVVUUTVUUUTTUUUSPMHB?<98789:;<=>=====<:9887665554455544554444455445455555579665555555555554544444445455566655555554444444444444444444444444444445555444444444444444444444445544444457666678999;<==>@CFGIKKMKKPUXYXXVVTQPY`_[^cfehhgf\RJHWbcdghgaadfnwrrtwyy|xruyz}uc`ea]aiowvmtwsroeZ\ks{‚Š�“�‘’ŒŽ’”™•‘�ˆŠ�–œŸ ¡ž›š™Ÿžš—‘•œ›� £¡š˜™œ�’Œ“—•’”””����‹����Œ��Œ‹Œ�މ‡{x~€{||~|zwyx{z{x|zwuqpkjjifcaa_`^[[ZXVVVRTQLJGDB@=:8887779878;887:<:88:7776555679=CIMQVVVWVUWWUTUTSUTUVUVSPLID><98789:;<<=>==<<;;997766555455555444555444444454555677866555554444555454444445445566665454445554444444444444444444444444444455544444444444444444444444444455555676677899:<=>>?ABDGHHKKHKPUWUUWZXSRT[a\]abgghfe`XPJQbddfiifaajklvtsuwz{zvtxxzyobef``bhlqmourkfchgjzƒ‰Ž‘”š”•˜”��“‘ŽŒ‹�—�� ŸŸ¢ �™—š–”•›ž Ÿž¡£¤�¦žš›•’•—•’““’“‘‘�Ž���Œ���ŒŠ‹�’�‹ƒ{wz~~}~{xw|~{xwssspommjhfdaa`_]\YYXUTWTSOMJFCBA=:9887778878;8779987897776555568>==<;:988766555555544445545544444455555667865555555444444544444444445566766555445544444444444444444444444444444456444444444444444444444444444444556;:7777899;;<>=?ADGHGHHHIMRVVVWWXWURW^a`bdcfffe`[WOP]fghilkfbdopkuuvw}~|ww}ƒ�wwxiagebbdfmmgefddgr}{x€Œ‘“•—™˜•™˜‘‘�ŽŽ’–™ž ž žŸŸ¤¡—“•–—Ÿ¢¢¢¡£¤¤£¡«£œ™˜šš˜••˜—–––••�”–’�����Ž�Ž�ŽŒ‰ƒzv{€€€‚€zz}|{zwwqprppnljefa`_a_]][ZWSRSQPNKHDA@=:8988878878;8778887887786555578<@FLPTVVUVUUWTTUTUWTTVUSTRMIC@=:88899;<=>=>=><<;:98766554455544444555444444455555666766655555555555554445444445566665555544444444444444444444444444444444455444444444444444444444444444455557<:778889:::<>?ACEEGGHGKNSRUWWWXYXWTY]^`bbdefeb`^YT\gjgjkmifehprmsxwu||wvy�‹†xurc`hhebacgg_ainv}ˆ‹ˆˆ‰’•–—™—˜˜–š”�’–™—–œŸŸžž£¢¢Ÿ�—–˜œŸ¡¥¨££¥¤££§©£�œš›˜™–—š™—–––•”––”‘Œ�’’��‹���Œ‡ƒ}€~~€��}wxx}{{uwsrrqmmmlihccaa^]]\[YXRQQPOLHEB@=:988788887:;7678898777776555677;@FLPTUVUVWVVSSVTUVUSVTTURMJF@<:8789:;;<=>>>><<::98765555544445445545545444455676666776665544445444444444454444556665554444444444444444444444444444444444444444444444444444444444444454445569:988898::9:<=?AADFGFHJPQQSWWWWYXXUTV\a```bgeebba[^ekpkjkjghinuvrqz|yzzvz}€†ƒyvh``fnh``gkicr~„ˆŒ“‘��‘’“’–™™œœ•›–“–Ÿ ›™šœ�ž ¢¥£Ÿ›šž¡¢¦§¦¥¤¢§¦£¢¦¥�šœšœš———™šš ž™•”••”’ŒŽ�’’“���Ž‹‰‰…†Ž„„�ƒƒ~{|zxvvyyvsonmnnligfe``_^_c_ZXUQQPPKGDCA>:988878868<;7689887667665555567;?EKPSWUTWWVVTTUUTTUTTUUTRNJE@=:878899;<<===<<;:98876655444454444554444455545679966666665555554555554444444444445666555544544454444444444444444444444444444444444444444444444444444444444556798888;9:9:<<>A@CEGFGKPOORTWXWWZZVTVX^a_abeeecc`]_gmnmlklmmmlowxwqu{twzy~‚�zsgbcnre^botlp…����”—–‘–—••”š›�žšž™�˜ ¡ ž�££žžŸ¤¦£ Ÿ¥¦¦¥¨§¥§¤¦¥¡¡¥¥ œœœ�Ÿš™—˜œ�«£›–”“’••‘’’�•˜“��Œ�‹Š‹‘‹†…„„ƒ|}}}{xywxvsnjjmnljdca``agb\XXVSMNLJGDBA><988877778977898997667766555567:?EKORVWVVUUVUTUUUTTSUUUTSNKF@=:877789:;<=<=<<<;:9876555544445545554455544445557876676655545554445544444444444555666555544444444444444444444444444444444444444444444444444444444444444445556787889::9:;<=AABEEEHIMMNSSTVWVXZWVVWW^_`_chhga`^\fjmlheispoqqruyxptvtxz}�„‚~wkhbkwpdelszs~Š•�’’˜˜——š™—™šœ�¡ �œ™”›¡Ÿ ¡¢¦©§¦¢¤££Ÿ¥§«¨¦ª°£¢¤¦¦¡¡¥¤ �œŸ¢¡ ™™šš–Ÿ ™””•–•’“””’”™–’ŽŒ�Ž�Ї‚‚�„…�{|€�zyxyvupmlmolifcba_`db][YVTPLLIGDB@=<978877778977998:866698555556679>DJMQTWV[VTVUTTUTSTSUUTSRNJEA=:8767789::;;;;;;:998766554445444454544454444444555556776655555555555454444444454456665555544444444444444444444444444444444444444444444444444444445444444455566989:;9::;=<>AABECFIJLLOSUVXWWZ[YXXZX``cdfiic_^Ybiikgdiqtoqrrtuyxssyxxz}ƒ„€yolgeu{tkjw{xz‡’£œ–’™œ™œššš™šš�  ¡ �𛡦¡¡¤¥¥§¨¦¥¢Ÿ¤«§¦¥§®²¤ £¤¡Ÿ¢¢¦¥£ ŸŸžœ—œ�›˜–œ—”–—”–“””•”—˜š”�‘��ŽŒ‰†�‚„„†‚~~‚‚~zyzxsronnoljigdda``ab]YYWTPLLJHEC@@<9878777777789989766699655555678<@FKPTWTVWTUVTTUTTUTTVUTQNKGB=;876778899:;;:::9988766555445455444555554455554555666666654555544445444445445455555555555444454444444444444444444444444444444444444444444444444444444444455666799999;:;;=@?@CDDGJMMMQSTTUWYYZZYYYZ\bceehgd_ZZbfijjinrssutpssvxutzxw}…‚~wkkht�vmm�„q~�’ ›””™™›¡ ž�š——› ¤¢ Ÿ—— §£¢¤¥¦¤¥§¥¥¡¨­«§¤§¯³¨¡¢£ £¤¡¦¢¡ž��œœœœšœš•—•–”—••”•”•”•š¡š““�‘‘�Œ‹ƒƒ……„€}�ƒ‚~~yyxtrqpnmlkgfbabaa__\YXVSRNKJGFBA?;9888777777788887656797555555568;=CKQTVUUVUUVUUVUSTSTVTTRNKGB=;8766677889999999887665555444444455545544444455555556676655555555444444444444444555556555544444444444444444444444444444444444444444444444444444444544444455667789889;<:<=>?BDEFJLMKNRSTUVWYZYXUXYW[deeehdcb]ajklmkkqsqrusrtvwyzxvz{��€€ƒƒxmnu„…zspuˆ€t~ޓ𖔔›šœ¡ ¡ ¢ž˜�¦¥£¡¢˜– §¥¢¤¥£¤¤¥§§¥¨©«¨¤¨§¨¥¢ ¢£££ž¢££§Ÿ�œ››œ›œ™•••–—–——’–•–””—ž™–‘��‘Ž�‹‡‚ƒƒƒ�€†Š†}~zz{trqpnlnjhedcac`_][[YXTPPMHIGDB@;8789877878788887556687555555678<@DJOTVUVWVUSVTVVRVUTTSRROLHB>;876666778888888887766555544455444555555555555545566667665555444545544444544444445555655554444444444444444444454444444444444444444444444444444444555544455667777988:::;<=>@BDFHKMLNORVUUWWY[[XVXXX^bddegbda]fknqnjossttuuuqvxy}~wx|��€‚‚zsu‚‰ƒxrv‚Š}z…Ž””””“—™ž¢¢¡£¤¢žŸ¥¨£ ¤œ–œ¢¥¢¦¨¦¥§§¡¤©¨¦©«§¥§ªª¤¢¡¥¥¢ Ÿ¡¥¨¡›�››˜œžœ•“”•˜˜–•’””“”“•”‘�ŽŽŽ’��ˆ†„�„‚�„�‹…‚~{{vtponmmmjgfbb`_^][YXUTOOMIEECCA=9888777898878986556786555555578=AFKPTVWUVVUVUTUTSTUSUTRSQLHC?;866666676788777777766555554444445545455544555555556666655545454455545444444444455665655544444444444444444445544444444444444444444444444444444444445444445567778:7899:;<<>@CDFIJLJOQSVVVVVWYYUUY[X]ecded`b^bjnpomosswwtutvsxvx}ƒ~w{€~€‚ˆ‡€~‚ˆ†�yxˆ‡z…Ž�•“’’‘™ ¢¢¡¡¤¥¥£Ÿ£©¤¦§ ›œŸ¥¥¦¬§§§¤¡§¦©ªªª­ª©ª©§¨§¦£¡£¡¡ £¡Ÿ›™››š��—˜––—–•—–•”‘“‘”‘’‘��‘’“�ˆˆ‰�ƒ„ƒ‚‚‡Š‡‚{xuuvqlnmkhgdba``^[[YWTQNNIFFDC@<98888778;98999755579:7555556568;@FJRTWWVVTTUUUTTTTTRSSRRQKHD?;97656666677777677666655544554444555554455455555556566776555555555554544545444444455565555544444444444444444444444344444444444444444444444444444444444455556667888999:;;?BCFHFHIJNQPTVVUVVYVWZ_a][^a`aaabejopqljqtxytvwz{{|vpt€€�{y‚‰�‘Ž‹��Ž�|†ŽŒ‰�”–”™›–——� ¤§§¦¥¦§¨¨©©§¬«¬«¤¡¦¦¦¨©¯©§ª«©¬­«¬­ªª¬©«¥¤¨¦¦¥¡££¤žž�¡¢Ÿ£²²ª¤Ÿ ¤Ÿœ™––˜•‘“’““‘�’“’“‘‘�‰ˆŽ�†~€‚„‚€}~€}xwsrnkjjijhgecbb_^ZYVVQMKKGFCB?<989:988887787655556875555556779;?DJOQUWVVUTTWUTVTRSSRTRQPNIE@<97655555555556555555555544444544455445454445656656666776654444544454444455545444556666554444444444444444444444444444444444444444444444444444544444444445556667889:=;9;=??BDEFFHJINOPSTTSVWXWY\^_^Y_a^`adfjmponnmrtwwtwx}~}}yut{ƒ‚}}…‡Š�Œ‰ŒŽŠ„ƒ�“��•šœ–™˜–›ž¡£¦¨©¦§¨§¨©¬ª§¨§ª§¥¢¨¨¨§©¯­¥©¬­«­©§©ª«ª«­§£¦¥¤¡§¥¦©žœœ¡ žœž¢¥¢¡ Ÿœ›š˜˜˜”’”•“‘��‘“’”��Žˆ†‹Œˆ…€€†„�~~}zwwurnlkihjfgeddb]\[ZWVROJJHDDC@<98;;:88777987655557765555555678:>CINQVXWTVTUWSSVSRSTQRRRQLIEA=97655555545555555455544455454445555455545454555555566766655455544544444444445444555666654444444444444444444444444444444444444444454444444444444444444444556678779<<::=>?ABDEEGIHINOORTTUVWYVW[Z]^Y^aaacejmnmnqnlosvxuwx}|{~€z}�€‚‰‰‰‡…ŠŒŒŠŽ––‘�—˜˜•™šš ¢££¥©ª§©ª©«ªª¬©¦¨ª§¤¤¨©§¨§¨©§©ª«¬©¨©ª©®«ª¬§§¦¦¥£¤¦­´§ ��››™™˜�œš�šš™šš–—•˜——””‘�•“’“‘Ž��‰Š‹ˆ„„„‚�€�€€{xvvtqmliiiihgfebb]ZZVTRNJIHDBB@<98:<;877779877766678655545555679>BHORTWWWVTTUSRTTSTSRTRQQMJEA<9765555554555555555545555555454545445544445545555666676666545545445454444445444456687676554444444444444444444444444444444444444444444444444445444444445555667777:;;9:=>?@BCEEFHHLONQQSSUVVXXWY\_]X_bbaaeilnnoqooqstwvwvy}|~~}€yw€��†ˆ‡‚…ŒŽ���–•�”–™™—�›ž¨¦¥¢§«­®«ª§ª©«­«ª¨©©¤¢£©¨©§¨¦§¨§¥¨©«­ª©«©¨¬ª«©ª¦¤¡¤¯²©ž›žœ�›˜–šœš�œ™™™˜—˜——™œ˜•–”—•�‘�����‹�Œ‡ƒ…ƒ€�‚{xwvsqnkijjjjjfba][YVQOMJIJHDB@<99<=;87788:998767678765555555679=AGNRSUVUTUSTTSTUSTRRSSPQMJFB=:76555554455554555554445455455555554545544445545556667666545444445544444444444445:986786544444444444444444444444444444444444444444444444444444444444444455567678::89<=<>@ACEFFHGMMNQRUTVUUYUWY]_\X[abaahkknmonnoqsvstty}~~‚�€}…„{€ƒ€�†…†Š���‘‘––‘”—™›¢£œ¡¦¦§¦§¬²°¬«ª­©ªªª¬¨¦§¤£Ÿ¤¨¨©¦§¨¦¥¥¦©©««¦©ª¦¤¤¦¥¨§¢¡£§§£Ÿ Ÿ�œ›šš›š›œš˜—™˜™œ™—™£œ——••”‘Ž��ŽŽ‹‰‰‡„ƒ‡…„ƒ�~|{wxzxusrpmklopkgdb`^[XSPNIGEEDB>;98;>=8889:<99867778;<;9655555568?@ACCDFHIMNOPRUUVVXXTVZ\^_[[`cacikllnonnqqqusuwz~~‚„ƒƒ†…„†…ƒƒ‡‹‹Ž�Ž��”—•“˜š› ¨¢�¢¦£§¤¥¨­­««­ªª©¨­¬­©¦¥¦¢£¥¨ª¦¦¥¥§©¨©¤§ª«ª©§¦£¥££¢¢ £¡£¤¢ž��œ›š˜˜š›žž™•—–š ž—”šš™—–••““’�Ž���‡†‚ƒ‡‡ƒƒƒ€|{xw}{|uspmmmllieeb_\ZWRPMJHDCDA=;99<>>99::;><;97888;ADC?;76555678:86665555454554455554555555544555554445544455555555667766555444444444444444444455566666654454444444444444444444444444444444445654444444444444444444444445566678998:<;<==>@BBCFHJLLMOQWUUUYWUVXZ[_[]bc\djljimllnrrqsuvyy„„‚†„ˆŠˆ„€†‡‰ŽŽŒŽ“”–””˜™˜Ÿ§¡Ÿ¥§¥¨¥¢¥¬­¬ª¬ª¨§§¨«¨«ª§¥¤£¥¦¨¦¥¦¤¥¦§¨¦¨«¨§¨©¦¥¤££¢¡Ÿž£¡ŸŸœœž›˜ššš™›œŸ˜“–œ™›™–——•–—š˜””‘Ž���Œ�Ї€„…††„ƒ€~|{zzyxtqpnmnkjigfe`[YXVRNKFEDCA>;9:<>>;9;;<>>;:899:BIIGEA<8655568;AGLQSUWVTTSTTSTTQSTSRRPOOKGD>;86665555444455544555554445555455455444555555555555568766554554555444444444444455556777655654444444444444444444444444444444444444444444444444444444445455566678889;;;;=>>@ABCGIKMMONQUWWX[XUVY[]_Z^ed_fjljkjkoooprvvuxw|‚�ƒ…ƒ‚‡‹‹�‰…ƒ†‡‹��Ž”–™™™œž�Ÿ¤ £¨§¦©©£¨­­¯­ª«¨¬«¨ª­¬¬ª©§¦¥¦§¥¦¨¦¦©¨§¥ªª§§¨¨£¤¤¢Ÿ¢¢Ÿ™žžžžœ™›˜˜˜šš˜�š™˜•–¢Ÿ˜——˜–”•–™——“��‘‘�ŒŒ‰‰†ˆ‰‰‡„…‚}|}wuutspqpmmkighea^[YTQNKHEDAB@<9:>>><:;<>>?;:9:?>=;:<=>><;:<@KUTRLKIE>865567;@FKQSTWVSTSSURRRSRQRRRQPOLHD@<9876555545554444455545554554454555444445544455555666877665554555444544444444444455877866554445444444564444444444444444444444444444444444444444444444444555677889999:<<==>>@DIJKKMLOSRUWXXVXWYZ^^`dca`gjlljknnnptvwwvxyw€ƒƒ�ƒ„�†ŠŽŽ‘’���’��–™�Ÿ�žŸ£¢¡¡¥§¨§§¨§¥«­¬¯¯¬¨ª¨©¦ª©«¬«¨¨ª¨¨¥¥¥¦¨¬µ®©¨§ª¥¢¦¥§¦¤ž  Ÿ¤ž›œ�œž™–š››™•˜š™–˜˜™šš•—•“–š˜”“•“�’‘‘�’‘�‡‡‡ˆ‡„…„†„„‚}z~„�yyvsqlmkijhda`^[VQOIECCC@><:;>??=;::;=<;<>AHRXVSNKJGB:66567:@FJORSWWTUSSUSSTSRSSQRQRRMHE@<:866556555555555545555544445554545545455455545555556877665555544444544554444444445667766555444544444444444444444444444444444444444444444444444444444444555677799:99:;<>==>@EIGIJMMPRQTXZYUVUWY\^bdc``hkijkmmqssstvuwyz{‚ƒ„‚‚�‰Œ������Ž“‘“˜˜™�� £¦¤ ¢§§¨¦¦§¨¨¨¨«ª¦©ª¨ª«§«©«¨©¨§©©©ªª¨¨ª¨¯¯ª¦§¦¥¤¥¥´±©£¢ �¡œ™›�š›œ™›˜›™™˜™›–˜˜—š—’–—”“”“”–’‘�‘��Ž‘‹‡†ŠŠŠ…„„„‚€�~}{}„wvrpppnmklhfb__[VSKIGDCA?><;=>@?>;::::::=AJQX[WSNIIIF=76567:>CIPRUWVSUTSUTRSTSRRRRROPMIFA<:86666555554455445545545455555455544454544554555556588766555554544444444444444445567777755444444444444444444444444444444444444444444444444444444444444454667878999::<=<;<>AFGFHKMLPRRTW\XWWWVZ]acdcbcikiimopossrutvxzz~~‚†„‚~ƒˆŒŽ’’�Ž��’�—™™™›   ££¢¥¨§§¨©¨ª©¤£¥§§ª«ª«±­«¬¯®©©¨©«¯©¨¤¤¦¤¤¨¦¦¨¦¥¥¥¤ªª¥Ÿ¢ŸŸŸŸ™šœ™››™™œ›™—“™š™˜–™›—•––˜–”’–”“��‘�‘’��‰‡‰Š‹ˆˆˆ‡…ƒ‚„�|{|ytttsqonnnkjhfa_ZURMJECBA?=<;>?ACA<;:::::AGRUY]WQKGHJH?86667:>BGNPSUUTUUTUUSSTSRRRRQQOMJFB=;876675555444555445455555455544445444444555445555555988766554555544444445444445455677887655544544444444444444444444444444444444444444444444444444444444456677888899:;<<;==<>@CDA><:999:@MXY\\VNDDHIF?866679>AFLPQUWUTTTTUSSTSRRRSRPPNKGC>;977655655555555555445555555555554455555545555555556987665555444444444455554456555577877665545545444444444444444444444444444444444444444444444444444444456777788898:;<;:=@ACDEHLLMOQRSUWVVWXWZ_acdbbdijjmnopopstvwzw{~€ƒ„‚„ˆ†Š����”“–‘‘™—››�¡Ÿž�Ÿ¡ ¡Ÿ¡¤£¥¤¥¨¨§¦¦¦¤©©­²²ª§¢¤¥¥¦§¨¦¥£¥¢¤¡ ¢�¡¡¢¡¥¤¥¢¡¡¡¡  �˜™š˜™™™—˜™—˜˜————–•––•˜š˜––•’”’“‘���‘���Œ��‹Œˆ…‰ŽŠ…~~}|{xxtstsnllnmjhfb`[XTOIFDCA>=<BGMQTVVTSTTTUTSTSSSRSRPPOKGC?<976665554555555455555555554544555444455454555555556988766655444544444444444445445577887765544444444444444444444444444444444444444444444444444444444444455667787888:<<;:<>?BCDIKLNPPORTUVVXXXZ_acdebefgmmmmprqqsxx{zz~��‚‚ŠŠˆ†‹��‘•••�“•”šš› ¡¡¡¡£¤¢¢¢¤¥¨§°²ª¨¦¥§¥¦¨¤©ª¨¨¥¤¢Ÿ¤¦§¤¢£££¤¥¤£Ÿ¤¤¢¡¢ ¢¢£¢ŸŸ�››š™™˜›š—˜˜˜—––—š•—”“”––——˜˜˜”‘“‘“’’’‘��ŒŒŒ�ŠŠ‡‡…„…†€}~z{�{urtromnmmjfedd^YVRLGEE@>><BDFIJMQOQNPSSVVWXX[_bdcdccdimmkmqrqquyx}{{}}€�€�…ˆ‰ŒŠ‰Œ��’“��—š——šœœŸ¢£¥¦¦§¥¤¤¦¦§¯º©§¦©§¥¦¥¥§¦¥¤§¤¡¡¢¡¢¤¢ ¢¢¡££Ÿ £¥¡¡¢žž¤¥¡¡¡�š™››˜˜›š›šš˜–”–˜˜˜•“�‘’••––•˜–‘’‘“‘�‘����ŽŒ�Œ‹ˆ‡ƒ„��|~€€|ƒ|srttqokmkhggdb`]TQLGCEA?=<<@DDCCA;77789B[`\ZQQPPPMJIB866678=<@BEFEA:76669Lda^WUUSSSSUTH:65678;?EINUTUUTVUTUSTTVTTRRSQPPMIDA<:87665555554445544454445454445544445444444445454555;:997665654444444444444445545567789;:87655544444444444444444444444444444444444444444444444444444444455556678888;;;;;==?@DEEIMKLOQQTTUXVY\Z\^cdgccfhjllknosuxz{{}~~~{€ƒ„ˆ‰ŒŒŽ��”“�Œ•™šœœžš™˜š›   ¤¤£ £¦¥¤¥¨¤¦¦¤£¡����¡ Ÿ¢¢¤¢ Ÿ�ŸœœœŸœ ŸŸ¡¡¡  ¦­¨¡Ÿ Ÿ™™›™™—™�™••”•””•––Ž“••••˜˜˜—•˜’‘“•“��‹ŠŽ�‘ŽŽ‘�����Œ†„…„‚ƒƒ~yyxwqmkligbcecb_ZXVSLGDDA>><<@BDEKB:76679Qfa[VVVUUUUVXK;76568:@DIOTTTTSTTTTUSSUWRRQQQOOLHDA<:86655555555555544545444555544454444444445455555555;:99866555455444454444444444465679:;;:8765544444444444444444444444444444444444444444444444444444444445566668889::<;===?@BDEIIJLOOQSUWWWZ\[\]ddeddglqnjmopruv{|}}}~€{}~„Š��‰ŠŒ��’–�’˜œœ�ž�žž��›ž  Ÿ¢¢Ÿ ¡¤¡¢££¡¢žž��›Ÿ ¡¢  ¢£ £¡Ÿ �œ�Ÿ £¨ £¡¤¢ž¤³³­ œ�›ž›–˜š•”““–”“’‘“•”‹“”•—•—˜“’’”‘‘‘”’��ŠŒ‘ŽŽ‘Ž������‹ˆ†‚‚ƒ‚‚~{{wonmjkggd_bdb`ZWUTPIEC@>>==?CCFKD:6667;XfdXVYXVUWWXYK:76668:>DINRSTUTTUTUVSSTTSRRRQPOLHCA=:87665555544445555444554554554544454454445555555555;:98766554444444465444444545566678:;;:87665444444455444444444444444444444444444444444444444444444444555666777888:;;<=>?@ACFGILNOORSVWUW[\\^`bdgddgmplmoooprvwyz{}€€ƒ‡‹�ЇˆŒ�‹�’•™œž�žž ¡¡ŸžŸ ¡Ÿ ž›œŸžœœžŸž ¡žŸŸ�ž ¡¢¡£¤¡�¥¥¢Ÿ��œ� £©¤ Ÿ¡¢žŸ¬²«¡�š�¡Ÿ˜˜˜””��’”“‘”””“ˆ‘––••–”�Œ����Ž‘‘Œ��ŽŽ�ŒŽŽ��Œ‹�‹‰‰†„‚~~�}xvvsnhjlle_`[\]^\URROJFBA@=<<>CFGID:7678?\e`VW[[[ZXXZ[K:656689=BGNSTSUUTVTUVSSSSSRQRQOOLIFB>;97666555545555445545454555444555445445455445555555<:::877655544444444444444444555679;<<;98765454444444444444443444444444444444444444444444444444444444555566678788:<;<=>>?@DFGJLLLOQUVVSUVZ\a`_dfadfjllnmoopsuwxxz}~��€ƒ‡ˆŽ��ŒŽŽ��Ž‘”™šœŸžžžŸ  ¡¢£¢¢¥¦¡Ÿ¤¢¡¡¢££¢¢ŸŸŸ¡¡Ÿ ¡¡ ¡Ÿ ¡¤ ŸŸ�žžŸ ¦¤¡¡¡   ©ª£¡š™š›™™——“•“””””“’’’‹‰�•–—–•”‰‹���’‹�Œ‹�Ž�Ž‘•––�‹‹‡†ˆ‰ˆ…ƒ„€{{wvuspqkfikgc^YWWZWSONHGDBA@>=<>CHJJE;7678BZaYW[^`_][[]\I9766689=CHLRSSVTTUTTTSRTSRRQQQNNLIFB>;97765555555444544445454555554445455444444544545555<;99767654444444444444445445555679;==<;9766544444444444444444444444444544444444444444444444444444444555566678878:<;;=>>?@DEGJLMMORRTVVUWZ[_a_bfbdfhkjjnomrtux}|{~‚�€‚ˆ‹Ž’Ž�Ž’•”•““˜˜œ›œžŸžž¡ ¢£¤¢£££¡¥¤££¤¡¢ žŸžŸ¢¢ Ÿ� ž  Ÿ ¢¢ŸŸ�¡£¤¡ �ž Ÿ¡ŸŸ ¡šž›™™›š›–“””‘•“”’’‘‘’��“——”’�‘‹���’‘ŽŠŽ�’���“˜—˜‘Œ†‡‰‰…†„‚}}}vtonnmnjjhfeb_ZSSSTRMMGCBB?@>=<=BHIFF<7679F[\UY_ccd`]^^\H:666679=AELQSTUSSTTUVSTTSQQQQRPOLJFC?<:8765655555555544455445554544455445545545555555556=<::886655544444444444444444555679;=@>;9876555444444444444444444444444444444444444444454444444444444455566687778:<;<===?@CEGJKKLNSSUUVUXZ\^_^afedfhjllopqsvw{€‚€�ƒ‚ˆ‰‹ŽŽ‘‘‘•”••–••–›œ™›ž�ŸŸž  ¢  ¢¢£§§§¥¢£¢¡¢£¡£Ÿžœžœ›› ¡ŸŸŸžŸ � ¢¦¤¢ž  �žŸ¢œœ›ž�œœ—š˜•––•–•’���‘‘’““�“–’“‘��‹Œ��‹‰‹‘”””�‹Ž’’’Ž‹Œ‰ˆ……‚ƒ‚}{{zrnmidkpjicba^XVSOONKJHB?????><=BGJHC<768=MYSR]bhjfdbaa[G9766678=;9886555444444444544444444445569;@@CDGIJKMOOQUUVUUW[__`aeeehimnoopqsuuz€~}~~�€�‰‰�Ž��‘‘”’”˜˜•—–˜™š™š›Ÿ��Ÿœ�ž¢¢Ÿ¢¦¦¦¡¢¢¡  ¡¡¡Ÿ ™šŸž�œžŸ ¡Ÿžž�Ÿ £žžŸž š››Ÿœ›œ �œš›˜—•��“•’“���‘’’“’‘‘‘““���‹‹Š‰‰‰��“’“”‘Œ���Œ‹‰ˆ„�‚~~}{vsvzqlhb`iebc^`^WVUOLLIGFC?<=>>>==BDGGC<779CTTNPZdkmlgddd]G9666678;@EKPSTVUTUTSTTSTTQSRRROOOKHD@=:9876655555555554444455544455544444544545555444556>=<:986555445444444444444444455568;<>?>;:8765544444444444444444444444444444444444454444444444444444445555666789:::;<;=>@ADDFGHKMNPQSRVUTX[^addbefhkpqqomortuwyy{~€€�€„‰Š‹Œ���’”–˜––—™™››˜š›œšœžŸ�Ÿ¡¡¢¡¡¦¤¥¢ž¡¡ŸŸ¡¡ ¢˜œ žž�ŸŸžŸŸœž�œž �›œŸŸžœœŸ�š�Ÿœ�šš˜š—’’’’’’�Ž’“‘‘“‘•‘�‘‘��Ž‹�ŽŒŒŒ�Ž‘”’��‘��މЅƒ�~zvvrvvqprsmjd`_`_\^X[YVUPJLHECA?<<=>>>=ADFFE<87;JTPMQ[gnmmiggi`F8666678:?EJNSSTTSSSSTTTSTQRSQQOONKHEA>;9877766555555454554455555544444454445455445555555?=<:997655544444445444444444555568;<>??<:8765545544444444444444444444444444444444444444444454444444444455667889999<===>?ABCEEILLLPRTRVVUZ^_beedbcjkmsqooqtuvvyz{~�~��†‰ŠˆŒ�‘“–“–•–•–˜ššššš›œžŸžž¡¡¢¤¢¡¡¢¤ Ÿ¡¡ŸŸŸŸ��—œ Ÿ �ž››ž ž›šž�žœ›œŸŸ ¡ŸŸŸ��œ��š˜™™•“–““’��Ž�‘“•�™”��“‘ŒŽ�Ž�‘�Œ��‘“•‘�ŠŒŽŽ�†�€{|zspopsqonhjhhif]\_YTXVXUTTMIJFC@?<:;==>=?DFIF>87>PSOOP\hoqohgjl`E8665567:?DJNQTTUTSTSUUSSTRSRRQPNOLHEB?<:887776665554555445555545544444455545444455555555>><;:97655444444444444455444555568:;987654444444444444444444444444444444444444444444444444444444555666778899:;<=>>?@BBDDIKKLPRRQUVVZ\^`deedbgjimomrrsttuvxz}}~{ƒ†‡‰ŠˆŽ��•–””“”•—–™™�››šœ ŸŸž¡¢¡¢¤£  £¡Ÿ¡Ÿ¡£¤Ÿœ›™�Ÿ�˜™œ˜™›��žœœ›ŸŸ›�¢¤ŸŸ¡ ŸœŸ�œš��‘•••’‘‘�‘�Ž�Ž‘’›ž–����Š�‘‘���ŽŽ��“‘‘�‹Š‹‹‹„|yz{ukffddd`ce`bbahd[[[VOUTWPOMHEFC@=;::;=?=?DFJG@87AURPNNZhrtojjmmaE8655567:=CINQTSSSTUTSTRSSQRRQRQOMLIGC?=:988776665555545544444555544445444455555455555555?>=<997755544444444444444455554558:<>@@?<:87665554444444444444444444444444444444444444444444444444444455556778888::;<=>>@BCDEIHLNPQQSSUWYY]_acdgcehjjnprqrutvvxy|€€…ˆ…ˆˆˆ‹ŒŒ�”““”“—˜œš™™—œ›��žŸŸ¡£¡¡£¢£¤¡ £ŸŸ   ¡ž�žŸ�œ™•™—œ��žŸŸœœ¡�šš ¥ žžŸ¡žŸŸ�›�Ž�”••�Ž�‘‘‘‘’�’�˜›–’��Œ‹�’��‘‘������‘Œ‹Œˆ‡„~wttrjf^\ZX\XTVXW]]Z]_XTWQMOTSMLFCDCBA=::;=>=?CFHG@98DSOPPNUhttnlloqdE86565579=CHMSSSUSSSSSTRQRRRRQQQONLIGC@=;988777766555554455544445554454444544444554555555?><;:876554444444444444444455545579<>@A?=<:8765544444454444444444444444444444444444444444444444444444455556677888::;<===?ACEFHHLNPNQRSUWYY\_`beefdjkjlrqpqrsuww{|€�ƒ„…†‡ˆŠ����’“‘’”˜šš›™—™š›š™™œžž ¡¡£¡¤¤Ÿ ¡Ÿ�Ÿ¡  ¡žšš™�œ•›››Ÿ � žœ›žž�™›™œ�žŸ¡žž  œ�‹˜•š•�Œ�‘‘’ŽŽ“•–—˜–‘�ŽŽ�Ž�������‘�ŒŒˆˆˆ…�~}umc^USQNLIHKJKKNNNTTWTNLOJGJPOMJBBA@@?<::<>??BEIHB<9DOOSTOQerrnjnrqeF86556678<:99878776555455544554554544545454455554555555455?>=<:987654454444444444444455555568<>BA@=<:976555454444444444444444444444444444444444444444444444444444455678889899;;=<=>ADEFFHKLMORSSTXYZ^dhfgdfeimklnprrquyzzz~�‚�„…ƒ‰ŠŒŒŒ�Ž‘““”•—–š›œššš˜˜šš�› ¤¤££¡ ¢ Ÿ›ž¡�žžž Ÿœš–›� ¢ Ÿ ¡žŸ›ž ¢¢�›œœ›�¥¤�šž�žœ—�–—™˜•�Ž“’“’‘’��”•”�‹Ž��’Œ�‹�Ž��ŽŽŒ‰ˆ…€~wtusne]^\YVRMIGECEILNOLJHINNJEDACDEDC?==>><:9;??>AFIIF>9AMSUTQP`qqjilurbD86555568;@FKPSTTURTRRSSRTTSSQRRQONKHEB?=;:9988766655555445554555454445555545554555555555@>=<:987654444444444444444444444568;=BBA?=;9876555544444444444444444444444444444444444444444444444444444566778888899;<;<>BEDEEHJKKPPQSTWY[^ehjjgggilknmkqrsw{wxz}{€ƒ‚……‰ˆ‰‹��‹Ž“–“”••›˜š˜˜˜—––˜˜� £  ¢¢Ÿ Ÿ�š›ž œžœ��˜˜œœž¤¨ž�ž�žœ›� ¡Ÿ™›ššš™¦© ™™œœ™—™——–••Œ�Ž’�Ž‘�‹��‘’‘‹‹ŽŽ��‡�†�‹‹‡†„„|yyslmlf`ZWWVTQNNMLMKKIMQMOLHFHFEGHFCBEFDA?=<;:::>?>@FFHHB;?MUVUQO\lmiipvsaC76555567:@FJNSRRRTSQRRRRTRRSSQPQPOLGEB@=<;:988776655555555555544444454445555544557655555A?><;987654444444444444444444544558:>ABA?>=:876655554444444444444444444444444444444444444444444444444445556678788889;;;;=ACDCEGHILPQQTVYYY_fhihiihilmnpkosruzxxy|{|‚„„†ˆ‰‰Š��‹�“’’”–•—”•–›™š™˜›˜ž¡¡¡ � ž� ���ŸŸž�ž£¢›šœžž ¤ž›šš›�Ÿžž�œ–œœœž—¡ª¦–˜œœš“›š—•—”ŽŽ‘‘‘ŽŽ�Ž������Ž‹ŠŠŠˆ‹‡„†„�‚~yursonjopkfa]ZVSQPOOLPYZXWXVRPQSTPOQUXRKKNSLE@>=<:9=@@ADEIGD<>NTXUSNShkijpwr_A75555567:>CHMQRSTRRSRRRRTSRRSQSQOPLIFD@><;:998776665544555555544544444444445555445555555CA?=;:97655544444444444444444444468:=ABA@?=;977655554444444444444444444444444444444444444444444444444445556688877789;;::<:=A@ACEFHF>BHMORRSRRRSSTRRSRRRQSQPQMIFC@><;::98877655555554555554454445445555555554555555CA?><:87655444444444444444444544558:=?BBA?>=:9776555444444444444444444444544444444444444444444444444454556677888889::<::<=ABCCDGILNPQTVVZ]]`acgghkiknooqpprtvux{{}}€‚„†††‡‰Š��’”’’”••™œš™——›˜›œœž ��œœ›ž Ÿ—œ  œ™š›››Ÿ�›š˜—™œœœžžœœœ�ž ž�œ›�ž�žš™™˜—–’‘““••‘��ŽŠŒ‘���Œ�����™�Š‹ˆ�|ywqmlkfea_aejihfdegefeefljc[WY^abhnpsqkglmjlmkda^XURPJE@=<>BA@CEFHC<;MVYWVTQZegiovpX=755555679=CGMQSRTSSSQSSRRSQTRRRSQPNJGD@><;;;:9887765555555555555544555444444544555555555CA@><:976555444444444444444444444579;?BCA@@>;98766544444444444444444444444444444444444444444444444444445556778767878::99;<@BDDEFIJMQPRTUXY\bcceehjhlnnqsqsssuxy{}}|ƒƒ…†ˆ‰ŠŒŽ‹ŒŽ��’˜––™š—™šš˜›œœžŸ�žœ��ŸŸŸ›žŸžŸŸœœ�œœžœ——š˜›�™››œ�œŸ ž�š™œ�›œ�šœ�™——”•””“”‘�‹‰Š‹Œ�Ž�ŽŒŽ�‘’•ŒŠ‰…}zwpmppkfc``aegefijihikihkw{rlpstttwywuspsutoookid`]YZXQIC?=?BBABDIHC=;O[[ZYXSUcfipumQ:655555569=AGLQSSSSTTTSSQRSRQRRRSQPMJGEA>=;;;:9887766555555555444554544455444445554445554BA@><:976654444444444444444444444569;?CCBA@?<:8865554444444444574444444444444444444444444444444444444455556677667889::9:;;>BCEEFHJMNPRTUW[\_ccddijjlonppqttvvwxzz|{€�„……ˆ‰Š‹Œ‹�Ž�Ž�“‘’–˜˜˜š—”—šš��œžŸ¡ �šžžž�›Ÿžš—™›œš™˜™™˜šœœœœœœšŸ¢ž›š™œ™™›žœœœšš˜˜•••’’��Œ��ˆ‡‰�ŽŽŽ‹�Œ‹‰ˆˆ…„�zomtsle\]abcebaehkklqsssy||wy}~xz|yzvsrvyvutpmhhfa_]ZVQJFA??DCABCHIH?;K\]ZZZTSaeirtgL9655555568=<;;:9988766555555555555545554466555454544554454BA@?=;987655444444444444444554444568:>ABCB@?=;:876554555444444454444444444454444444444444444444444444455566677668:::;:::;;=BCEFGIKMNMQTUWY[^addgjklmkknrstsuuuw|z{~‚„…†ˆ‰‰‰‰Š�ŒŒŽ�’”——”——––‘–š›�ž ��  Ÿœœœžœœšœš™˜˜™–™šŸ›˜››œ›š˜›žŸž�›�žžššš™››žš™——”��‘�‘ŽŠ‹ˆ‡ˆ‹ŒŽ�Ž‹ˆ‰‰Š‰†‚~xpnqqkc\]acefdcdeimruwuy~ƒ}y{‚~}}{{twwyzwttqmljged_WQMIEC@BFDACCHLIA;GZ\[]]XR\dksqdI8655555669<@FKQSSSTSSTSRQSTTRRRRSRPMKHEB?=<;;;:998776655555555555555455555445455555555555AA@>=;987655544444454444444444444568:>ACCBB@><:987654544444444444444444444444444444444444444444444444455666777789;::::::;:<<<;:::9877665555555555555555455545454555555555BA@?=;9876554444444444444445444444579=@CCBBA><;:876555444444444444444444444444444444444444444444444444566667768:;::9;;;;;9:?BBDFHILLMQTUXW[]aeddiiikjklprrvxwwx|€‚}~‚ƒ‰‰ˆ‰‰Š‹�ŒŒ�Ž’•’––”–”••—œ›œ�œŸ žŸžœšš™™–˜–˜šš�œœž›šš™šŸŸŸœœœ˜œ›˜••—•–•–•”˜•—”“�‘“��Œ‹‰†…‰ˆ‰�‘�‰ƒ‡„‡†‚~~{wqvtnhege`bdeilouvvvx||~||{yzxtvtqtsstutsrqmkjjhfa^[WSMIEBFFIDCDFKKE>GZaeeb]UVfqsmW>7555445568:?DIPSTUTTUTRTTRSRQSRSRPPOKIFC@><<<<;:99877665555545555554545554444455555555544BBB?=;:876554444444444544444554445569<@BCCBA@=<;98765544444444444444444444444444444444444444444444444455666678:<::99;;;::9:?ACCEGHHKOPRSVXZ\acbdiijkjmmptrtvwwy|ƒ€|€�‚‡††‡‡ŠŽ�ŽŒ��’•‘“––—••“•˜˜š—œž�œ�œšš™™™˜˜—™š›���œ›˜˜–˜œœš—™™•˜š—”“‘‘““’�•˜•“Ž‹���‘‘Œ‰‰†ŠŠŒ�Ž‹‹ˆ†‡†ƒ�€xxposqjifeaegimqqtwzzz}|||zzwvvvvropnoorqqprqmklkiffc`ZVSNKFDGKJGDDFGLK@H_ejihbYXittiP;6555555568;?CHOSRSUTUUSTSQSSRSRRRQPOKIGD@><<<<<<;9877666555555555545554444554445555554555BA@><;:876554444444544455445544454569;@CDBBC@?=<:8766544444444444444444444444444444444444444444444444555666778::;:99::99:9:=@AACFHHMQRQRUXY\ca`egfkjknnpqruvww{{{}~‚�€‚……†‰ˆ�ŒŒŒ���’‘‘•˜—–•••––šš››œ›�š›œš———–™˜˜–ž  š™š˜•˜ž�››ššžŸ�—•–”“”–“’”—“’‘Œ�Œ‹‘œ�‰‹ˆ‹�‹‹�‰ˆ‰†‚~ƒ~zyvrlppmjhfefhjoqpqtwy{zzzwvvssrqnolkjkkgjikkkjlkmljhffb`]YXPLGEJMMJEDFHKLDGcilmldYYlvsaF96555555567:>CHORQSUUTSSTUQSSQRRRTSQPLJHE@><<<<<;:9987766555555665555554455445445445665545BAA>=;9876654444444444444444444444479;?BCCBCB@>=;98665444444444444444444444444444444444444444444444444455567889;:99::99::9;<>@ACFHIMOPPSUXYY^bdceghimooqtuuvwxxz{|z|~‚€‚…Іˆ‰‹‹Œ����‘��•”’“•˜—•–œœœžœœ¢¡¡¢š——•šš™˜•˜œ�›™™––œ�ž™™šœ¢§£š”••••”“”�•–’��”‘��›–�ŒŠ‹ˆˆˆŠˆ�†ˆƒyswuqlmkkjjkhimnsqrtxvvvtponnkifeda_[[ZZ[]^_aehiijhgfgffc`^YUOLHGKMNKHDFGIOIJknqsqg]Zmto\B75555554567:=BHMRRSTSSTRTSRRTTRRRSSQQMJGDA?=;;<<<;:988766555555554554445455544445555555555BB@><;9876544444455444554555444444688;?BDDCCBA?><:987655444444444444444444444444444444444444444444444555556789:;99::::;;<::;=?ACFHGKNOPQSVXY]^bcegjkmooqsutwwy{{}zy|~€�‚‚„††ˆ‰ˆ‹ŒŒŽŽ�•“”•‘‘“•�™•˜š›š›˜™œ¥¥¢›‘—˜–•””•–•–˜˜˜™™šš™˜—–™šžŸ—••””•“”’’•—“�’‘�Š‹���ŽŠŠ††„‡„†ˆ�}|tuzvomlkjhkjknomrrw}tqmifba^[\[]Y[[USSQOPSSUY`cbddcdeedb`^ZWPMJKPQOMJFGHJNIMovuurk`ZmsiT<755554555669=BGLQQRSTRTSSTRRSSSSQSTSONJGDA?=<<<<<<;:98776655555554544555555444445555655555BA@?<;9876544544455444444544444444567:>ACDDCCA@@>;98765554444444444444444444444444444444444444444444444555578;<;:;<;;<;<:::;;>ABEFGJLMOPTWYY\]`cfhgjmmnqrtvwyyz|}|{|}|}€‚ƒ†‡ˆ…††ˆ�‘”–“‘‘�‘”—žœ•–˜šš˜———œ �œ———–’’”—••™š––šš™›š˜—–”•™™“‘’“””““’’‘‘�‘�Œ‰‰ŒŒˆŒ‰‰‡ˆ†ƒ‰…�ˆ…yvrxzsnlmlfgkhklnopmpqpgb[UQUSOKPUUTXVTRQSTRQQQPRTVY\_acccd_^[VRMJNQSRQLGFHKMKLoyvusj^ZkmbH9655554445568ACCCCCBBA?=:9765444444444444444444444444444444444444444444444444545578;<;;<==>?>>=;;:<=ABBEGILNPPTWXY[\_ceiijlooqsswyzxz|}{|{{~�‚…†‚†ˆˆ†‰�‘’’‘�‘’–••˜˜—–˜˜™–—••––——”–”–••–˜”•”—––šš˜˜™™˜••–˜—’Ž�“–’“–•–’‘�’��Œ�ŽŒ‰Œ‰ˆ…†�…ˆ‡†„€€xtrwsoomniilkkkklllhd^WQJFDCFC>=@B@ACDDGHFJJMPQSSQOPUZ\accbbb^YTNMQUUSRMHGHJMLMoywvqk^YgiY@7655545555568;AFKPQRSSSSRSUSQSRRSQSRSQOJHEB?=<<<<<;<;99887665555555555544445444445555555555??><;:9776554444445444444444444444557:=ACDCDDCDD@=;:876554444444444444444454444444444444444444444444444455579<:::;<=<;;=?A@CGHKMNORTUYY[]acgiilmpssuxz{|}{}}zyy}}~€‚„…ƒ†‰ˆ†‹�Ž��’‘�“•••••–—–—™——”–—–™–•–•–—––•’‘�•˜˜˜–˜˜™™–•”“–š”�Ž’”“””•”‘‘������ŒŒŠŒ‰‡„‡„ƒ�ƒ‚�}|ttvusnkililmihhiid`ZPICA=;9999777888::9;>>=@BGKTSSQRQT[^`cacc`ZUOPSVWVTPNGGHIIKhwwvplb[cbO;6565554454568<@EJORQRSQQRSSSSRRRSRTSQQPKHFB?>=<<<<<<;:9987766555555545555554444455555555555?>=<;997665544456665554454554444445579<@DDDDEDBBA?=;986555544444444444444444444444444444444444444454444555689;;;;;;>=<<<EMSWWUV[^aadedb[UPRTYYYWRMJHGIIJeuvvsmc[a]F85555545455568;?EJOQQRSQQSSTSTRRSSSRRRRPKIFC@?=<<<<=<;:::88766555554545555455544455556555555===<:9:7655554444444544444565544445568<:976545444444444444444444454444444444444444444444444556689:;=<>@A@@@@==<<<=@ACEGILMNNQSVXZ\_cfhilnppqwxy{~{{z}}€~ƒ�…‡Š‰ˆ‰Š‹‹ŠŽŒ‘Ž�‘“‘•——š˜˜™™™šœž™—–˜—–•“’“’“��’‘””••”’“–•——”“�’’“•��’•—‘’’‘�‘��Œ‹‹Š‰‡†…„ƒ‡ˆ…‚„ƒ‡wsnmliihjljjie^ZYSH?97666666556666668;<;9888999;>FQX[]Y[^dfhda\WUVX\\ZXRKHFIGIH`vz{vod]`U?75555544455568;?DHNPPSRRRSRTTRRSSTTSTQPOLJHD@>=<<=<<<<;::98876655555544555444454555555555555@BCABA@?==<<=@AEGJKKMPQQSWX[]_dhjmnpruwv{|z}~}z{|}{~‚„†…‡‡Šˆˆ‹‹‰ˆ†�‹ŒŽ’’—–—™›—”“—™—–“•–“’’’’’“�ŽŽ�‘’“‘‘’‘’“—•–“”•�““”’�Ž”›œ–”�ŒŒŽŽŒŠŒ‰ˆ‡…††…‚…‰†€}‚zuqnlnkjkklkhc^YZVD;766666555556655668ELIA;987789:CGLPRRSRTTSSTSSTRRRRTSQPLJHDA?=<<=<<<<<;::8876666555554544445455455555555555<<;:9887655544444454545555545544455568:?BDDDFFEDCC@?=;876554444444444444444445444444444444444444444444445566688::<=?ACDDDBA?>=>=>@BEIKLNQPPRUX[[^dhjloprtxx{{y|}zy|€}{}}‚…„……†‡Š‰‰…‡‡Š‹‹�Ž’”“‘�“’’’””ŽŽŽ���Œ��Ž‹ŠˆŠŒ�Ž’“’‘Ž’�’••”’’”™š‘�“‘‘–£¢š•Œ‹�ŒŠŠŒ�І‡†††…ƒ…ˆ…~~{xvrsplljlmnlid^][RE:7666666655555565567@TWVQIA;988889<@GWadeghigb[Y\_a`^]YTMHGFHI_z||{sfYUG965554545455568:=BGLQRSTTSTSTTRSTSRRRSSPOMJHDA@====<<==<;;:9887666655554555444455555555655555<<;:98876655544475444454445444444555679>ACCDFFDDDCA?=<9766544444444444444445554444444444444444444444444455566788:?>?@BCGIKOPQQSUWZZ\bdglnqqtuuyy{||zy{~}~�€€‚‚†„„…ŠŠ‡‡ˆ†‡ˆˆŠ‹Ž��ŒŠ‹ŒŒ‹†‡„‚ƒ‚…‰ˆˆ‚……„‡Š�Œ‹Ž�’•–�‹‘“”����’”“‘�‘�“žž™•�Š‹��Œ�’ŒŠ‰‰††‚„†„�{}{ytoonllikmnjd_a`YG;776666665555555555569O^\]^WLE@<;::;<>DR\aehgcb_^\`dab`^UNJFFGH^x}{zsgYSD865544545445557:=BGLPQRTSSSSSUSQTSSSRRSRQPKIGB@=<<=====<<<::887765565555554544444444555555555;::998776555444454444455555545444555679=ACCDEDDDDDBA><:976545444444444444455444444444444444444444444444445566789:=@CEEEFEEDBA@@?>@BCFGKNMOQQUWYZ]bdgimmmrtswx||wxwv{}†„…„‚„„†‡‡‚‚‚†ˆ†ˆˆ‰‰…„„…„|zxvx}|€‡…‚}|ƒ†ˆ†‡Œ�”–—’�Ž�’’“’��’’‘Ž�Ž�“’“‘�Љ��Œ�’�ŒŠ‰ƒ†�„ƒ‚~xwzxqonkkkjlmieadg]P@9766666666655555555568H_a`edZSNIIQG>;=>AFQX\``aa``cfgda\UQKFEFG]z~|yqeXR@755555445555667:>CHLORRSRRSTSTSRUTSTQSSRRQKIFC@><====>==<;;:987766665555554444455554555655555:::998776655444444444455445555555555679<@BCDEEDDDDBA?=;987654444444455444444444444444444444444444444444455556689:;?BDCEGGGEDCA@A?@ACEFILNOPPRVZ\`cfghllnqssvvxwvyywy|€„„ƒ…ˆ�}�€„…�}||�†‚€€|vxxxx{xtqppv||{~~{w{~|y{‚ˆŽ�’‘Ž‹���‘‘������’‘Ž‘�“�‹‹ŠŒ��‘�ŽŒ‹ˆ†…€‚‚€z||zwponjjkjnjhcbgbSG<876666666::76555555656B]ccfg`YTOO^WI?;AGKPRRSSSTSRTSTTSSSSSTSRPLIGB@>==<<====<<;::98766656555545455544555445555555;::998876655545444444444544555555555679;>ABCEEDDEECAA?<:866554444444444444444444444444444444444444544444455667898<<<==<==<=<;:98877665544454444554445555555555::9998776555444444444444444555555555678;>ABDEEDDDEDBB?=;876554444444444444444444444444444444444444444444445567788;=@ABDEGGHHGEDC@@AABEGJMNQOPTVY]_achllotuvxvqmnnpmtvxxzyvwytpspmjkd_`b`]]adhgedagihikprrpqststuuwz}|€ƒ††‡…Š���Ž�‘‘”’’’�‹���ŽŠ‰Ž‘�Š��’‘�Ž‹Šˆ„†ƒƒ€~|zyspkkhfilifbgf_\_Q<77776656;y~?6555555566B[cbfjibZ\\YSONLIFABFLTZ^`cfehgea\YTOIDEIZ~„ƒudVK;6555554455555568=;<<==<=<<<<;:9876666544455444444545544555555:99998877655544444444444445555555555568:=ACDEFECDEDBA?=;977554444444444444444444444444444444444445444444455666788:<=>@CEFGIIIGFDBABCDDFHJMOMPTUWZ\_cdjlmortrpmjhgiipqpqsqnqlikic^YW[\]beeimmkifabbgkmnoruttwytstrvwyy{~‚‚ƒ…‚ˆŽŽ�ŒŽ‘’���Ž‹‰ŒŒ‹‹Ž‰Œ’’Ž�‘�’’‘Œ‰‰†„……ƒ€|xvtnkkghjkhcfmd_bnY>877665667=?86555555667D]dehmi\\^\VOMLKKKJIMORZ\]cfhhgdc^YUPIDCGY|‡‡rbUI;6555444455555668;?DIMRSSSSRRSTTRTTTSRRSRRQNKHDA>=<==<=<<;<<;;:8876665554444445444445554555555999998876555544444444444555555555555567:=@BCEFECEFDBA@>;976554444444444444444444444444444444444455554444455567778:;DHMQSTSSSSSTTRTTSSSRSRRQNJJEB?=<<<<<<<<<<<;:9877765554455545445554555555455:999988776775544444444444445555555656679<@BDEHEDEEEBA?>;9876544444444444444444444444444444444445899765445555667778:<>ACEHJLMLIIFDB@BDDEFHJLMNPTTUZ\_cfhjmmjkfdabbejlmklhddbca]ZUWY[`cegimponmlijjhhnmlnlqu{}ywwqonqty€�‚�€€„‡Š‡†‡‰ŽŽ‹‰‡…‹ŽŠŽ���“–“�Š�‘Ž‘�Ї‡……€�‚�€{ytrqgaflichuh`ixoJ;87666666666665556666@@<96544445666679:;=ABEIKKJJKKIGCABCDEEFHJLNQSRSWZ`bbgijhgecb``dhhhdjg__`b^VSRX]^Z]`a_cmsqpmjorrnkhhklkjjprtvvxuvtrwz~|~}}‚„††‚‚„ˆŽŒŒŠŠŒ�ŒŽŽ’‘‘’–“Œ‹���‘އ……ˆ‡ƒ‚ƒ‚~yutuxcbijfdoqfix�…{]A98766666676656666678Fajjhf`b^WQPNMSY]^ac_\___ceegjhihd^\VQLHCFYvzzti\VG96555555555555667:=BGKPQRTSSTSSSQRTRRSSSSRPMKHFB?=;<<<==<<<<<;;:887776555555455455555555555455::::998876655444444444444555555555555578;?ACDFEDDDEBA?>;97655444444444444444444444444444444457<@EFFD?;7554556567889:<>@DHIJLMKKKHFDCBCDEFFILNPQQUWZ]^_efc`c_^\Y]`debed[_daYRRX^a]]]_figlnprpkoloxvusqnnpqoljllmsuxut{{}~|z{‚…‡‡†��†‹��Ž�”•���‘””�‘��ŽŽ�”�‹‰‡‰ˆ‰‡ƒ€}xusnheeiiefqndr‚ˆˆˆsO=98766666:865666677>Xklhc_`^ZQNNNPRV\_ccbc`aaenkjklkid_]XSOJECVrzusg[XG965545555555555679@BDFEDDEDCA>=:8766544444444444444444444444444444456;@DHJKKID:6555666777889:<@CDHKKMMLKJHFDCCEDEGGIMPOSVWYZ\^ba_^ZYZTWY^``fc]_e^SPSV\\aglmnpopvwvutqrvvxutttrrrvxvqqnmotyuty}{{|yy}�ˆ‰†ƒ†…‹ŒŽ�•–’Ž“’”““’’‘�”“”‘�‰‰Œˆ‡†‚~{xrplfddhijmukixˆŒŒ‹‚jH<9877767A;7666667@CDEEDDDCC@?=:8655454444444444444444444444444444457>CGJLNOMJ@8655667777888:;??DILLNOMLKIFDCCDDEFGILMORVWXXZ[\ZZXVXUTV[__deZZ\XTOQW`gnsqpnmmoqyyyyywz|{~~{wzyzyy{z{zxtuxyvwstvuuwwx{��ƒ„„…ƒ„†‡ŒŽ���‘‘“““’”•˜‘“–”���‹‰„‚€~|zwtpjfcbhkmrrhn}‹�Ž�Œ`E;98777677666667:I`jb\[][WPPQRVUVZ^aa_aeedbcefiklhedc^[XVQKFAQmqqh^\XF865555555555555668;?EIMPRSSSSSSUTSSSTSQRSRPNLIGC?=;<<;;<<;;;<<;;::8876665555545444555545555554::::::9987665554444444554555555555555567:<@BDEEDDDDC@><:7655444444444444444444444444444444569@EGKMPRPLG=7657777777889;=@CHJMOOMKKJHECDDEEFIJKLNPSTUSTXUSRQSQOTY]]]_UTSPQSX`fhlonecgjnpw~€}|{}€��€~}}zyxwwwwxxvuvvtvwxy{|€ƒ„„†…ƒ…‡ˆŒŽŽ’’‘���’””’ŽŒ�‘�‹ŽŒ‰…‚}|yusnkecdipvzt]dyŒ‘�Œ�‰z\E<987776666678IV]`_^\WVWUTSSTW_fkjggefhgfehiikmljigc_]XURKGCPelic]]WD865555555555555568:>CHMRRRSSQRSTTSSRRSSSSRQPLIFC?=;;;;;;;;<;;;;;::9987766555555675555555555555;;;<;:;9876655454444444545555655555555669BGKPTUTUSM?9988877888889;=@DKLNPRQOLKHFEDEEFHIJJNNPMNNOONKKKINRVVTUQMOQUWY[X]]]`agpvx}~„‰‰‡††…‡†…„„†…ƒƒƒ„‚„�}{|{yxyvvtxxvwuvuxywx~}€…‡ˆ‹ŽŽŽ��‘““��‘‘‘‘��ŽŽ‹‰‰ˆˆƒ‚}zxplifbdn}Šˆyc]anuwxxywneXKB>BIPVZ\^\YWUTUU[^a^^]`kmmmkmjgifhjjkmkkfgc`[XUSLFCL\bb_a^UA8765755555554555689>CGKPRRSRSURTURSSSRSRSQQOLIFD?=<;;;;;;<;;;;;::::988876665555555555554555555;;;;;;:9877655444444555445555555555554568;?@BDDDCCCB?<:86554444444444444444444444444444444458<@DHNTWTSSSI==;9878878899:@BDEECCCB><:86554444444444444444444444444444444457;=?DJQVUXWWRHB>:::8899::9:;=AEILLRSROMIGFEFFGGIJJLHGFDCFGFEFHLNQMGGJKOSTWZ\cgq{z|„‰‰Š†‡†ƒ†‡ˆ‰†‡ŠŠ‹ŒŠ‡‡‡„‚�€}|wvusssvvvvwzyywsosttx{z}�ƒ…‡‡ŒŒ����““‘’’•—“‘““��ŒŠˆ…ƒ€}vsplkhejyŒ˜™’‚wuqoopnokjiec^Z\^bd_^]^^aa\]YY`ecb`^glorurqnlorqnnomlkfikkiigca^XUQOIDEPRX^b]R?8765665555445555679=BFKOQQTTRTRRTRSTSRSQQQQPNJGEA><::;;;<;<;<<:<;;::99877766665555455455555555=<<>>><:997676544444545555555555555555568:=?ADEDCDDB?<:86554544444444444444444444444444444446:=??@FMRY\\\YRJ@?<989:::99:;>DIKMQRRQNKGHEFGFHKILKFBCDDEACDEFGKIFHIKOSXZainqtv|€ƒ‡‹‰�ŒŠŒŠ‡‰��‰ˆŠ‡…„„ƒ�|zwvussmhgcgikmqrtwy{|vsrqpsuwy|€�‚ƒ†ŠŒ‹‹�‘’““’“•–—••‘‘’•�‹‰†‚�}vqompmdfp…”™•‘‹ˆ‚|{{xwxusqnjfeekmif^ca_aefd_`eklliipstvvvtsrtrqpqqqoiiikkkhfb^ZVQOLECOSZ``\O>7655654445555455678<@DJNPQSRSUTRTSRSRQRRQQPQOJHEA=<::;;:;;;;;;;;;;;;:9987765655554454555555454==>>===;:987665544444455555565555554555579=?ACECCCBB?<:86554444444444444444444444444444444447?DEDCABFOVZ]`_]NB>:99:::89::>CGKNORSROMGGFFHHHLKKJIFBBB?>@CDEEGHJJKRY_emruwyy{€ƒ„‡Š���ŽŒ‡ˆŒ‰‰‰‡„}}zsjb[WPIHEGJLPUX]djmqvz}yxurppruyz}€€ƒ…ˆ‹‰‹��’“”‘“–•”—–’‘’”’Ž…‚}wqoojgfgj{‹“‘™šš“‰ˆ…„€}|~|~xzyuyvtohirklnnmjfgiqqqptvwwyutuuuruuussrnkkmmkhhf_\XSQNFCRVX_`[L=7656555544455545579;@EJNQRSSRSSSSSRSSRRRRROOOKGEA=;;::;:::;;;;;;:;;;::987776665555455545555555>=>>>>=<;:98766544444555555555555555555679AEKLORTTQMIFFFHIJMLKJJIFCABDEDDGHLRX_ccfipqttwz|‚‚„‹‹Š‰‰Š‰‰†‡ˆ…„‚}|wohcUD>:98778<;;:;;;;;;;<;;;;;;:::98877666554444455455555>>?>>>><;:98765554554455556655555555455579<>ADEECBCB@=;97654444444444444444444444444444444446BMPPQQOIB?CQ`ggc[KC@<9:9899:<>CGMPSUSQNJGGGGJLLKMLQLIFEHIIJLQUY[_ddejlruvty~€ƒƒ…ƒ†‡‰‡‡‡†ƒ€€�{rg`PF><9666666669I_`ZTZ`_bbiswywvsomnosvx{€ƒƒ„ˆ‹�“–—™•šš—˜–—™–�‹Š‡…}xvuspmkhdghpx‚‡‰‰�‹Š‰„„€}}ztroklonmmlnomnnppttutuwyz~~}{{yuwuywvwxuwuspooklgc__YXSMIBQaW\`ZH;8766665545545455567:>CHLPQRSRSTRQSTUTSSRQSRPOKHFC><;;;;;;;;;;;;;:::;:::99887666545444555554545?????>?=<;98776667554445555555555555555569<=@CEEDCDC@>;:8655444444444444444444444444444444445?OTTSVWSJC>BRdhkdULF>;98889:;>CHILQUVVQMHGGGJMLLLLNKFJIIIJLQRUY`bghmtuyxz|~�€ƒ��€�ƒ…ƒ„‚€}xrphZLA;97666655555667BHLQQRSQSSRSSRSTRTRQQQQOKHFC?=;::::;;;;;;;;;;::::9:9887766555455445555545@>?@???><;:8776555654455555555545545555568;=@BDECCCBA><:9655544444444444444444444444444444444:OWXUWXXTMD?BPailcWPE>:88999:=@EGJOSWWSPJHGGIKLMMRMJGHHJKMPQRU[`ekoruvxz‚��€�~~~}}|{{wpgYMB<976666555555556678Fm~xkb^`baajuxxvuqpnootsv|z~„ˆŠŽ’“——››žšš›Ÿ�•–“�†‚|}zwsstsrlhgjmov~€‚†Œ†€€|~zƒ‡‰„†€ywusnmmorwyy{|{€}€€~€||zxwxy}y{xwvupoookgcb`\YTNJDG]ZZZUF:76666555444544455579=AFLNQRRSRSSTSSSRRSRRPQPPLHGC?<<::;;;:;;;;:::::::9999987765556554445555445@@@@@A?>=;:9876555654444555555555555455558;=?BDECCDDB?=;97654444444444444444444444444444444446HW[XX[\\VNE@BP]gi`RGA<989:99;=BFKPSUWUPKHHIHIKLMOMJFGGHIJNUXX^bgilooqsx}~��}zxwwwttnjbTG=987665566655555556667<\}„�wi]]``hs|~}yvronntuvz|„„‹Ž‘�’’—šžž™›�Ÿ˜“�Œˆ‚€}{wttrtonkjkkmu|}}�ˆŠ†‚€„‡ƒ|~}�‚y{|wrqv{~{|€€‚‚~}‚€~~|{|z{||}}zyxwuutqolifc^[XTOJEDX\YXQC:77766655544454454569=AFKOQPPSRRRRRSSRSRRQQRQQMIFD@><:;:::;:::::::9:9::::9988776655555555555554@AAAA@@?><;9876556655555555555555555545557:<=BDDCCDEC@><:8755544444444444444444444444444444445AU[Z\\_a_YOFADO]ebVKB><:::99:=@DJNPTVUPLJJIHJLMMMKJHGFGHJMPX\`bfhkllrvzzz{}}{zuronke]UKA:8766666666656665555667:S{ŒŒŠ€mc^]ds~‚ƒƒ}vomoqttxy€�„‰Š��“’–š›››�ž�™–“‰…~€~|xssupnlkmonry{}�…‹Š‰‡„…‡‚~|{}~~|~€}zzvz||~€�„‚€~|€�€}|}|~~~}}{yy{xutrrmhgd^\[VQLFCU][WPA977777655455545555569<@EJOPQRSRRRQSSSTPRRQQQQPLIFC@=<;:::::::::9:::::::999:98776665555555544554AAAAA@A@>=;:9866575545555555555555555545579<>@DECCDEC@?=;87555444444444444444444444444444444459N\^__`db`YQGCCLYaYOJFD>;999;=?CHLMRTVRMKKIIJLNNNMLHHJLPSST\_a`fkmnrsvxzz}{{ywtqnf]WPIA:8766665556666;@866666579MzŒŽŒŠ€tcZ]m~†‰‡‚|sooptvyz�€�„‰�’‘•™™™™›œ˜˜™“Žƒƒƒ‚€~{wttpnllorpqwz~‚�‡Š��‹Š…�€}��‚�}�‚~|}{yxz~€‚ƒƒ��{}}~�}}�~‚�€~|}€|xvrqokfb`^[XSMGBQZWTNA:98777665544455445568;@DJNQPPSQRRQRRSSRSSQRRQPMJGDA><::::;:::::::;:9::::99998877765555555555555AAAAABCBA?<:9867765555555555555555554545569;>@BEDCDFDB@><:7665444444444444444444444444444444445CYaccdefeaZNFA@FRXWTLIA;:99:;<@FKMOSTROMLLJLLOQPNMJIILQUUXYZ\`egksy{z{{z}{yuuqnf[WTLB;77766666656568j‹G76656668Ky‹���‹o[S`|Œ’’‡xpppsuxy}€�~€‡Œ‘�“š˜—–—›™˜—�މŒ‹†|{xvuqrnnnqqpuy}�ƒ†‰�’�ŒŠ…†ƒ�€€€€‚�{}~|{y|~}€€�‚ƒ{|}~~}€‚ƒ‚�}~}z{{{xwroolfbb^[XTNHAIQNOK@:98777655554444555568;?DIMORPQQQRRSRQRRRRRPQQOMJGDA?<:::::::::::::::::9999999887766555555544555@ABBBDA@?>?=;987555555555555555545544454569;=>BEDCCEDCA?=:8766544444444444344444444444444444445:R`dgefijg`WJCA@CNVYTOD>;:9:;<@FKJLPPQROMNKLOQQQNONKLMRTVXY[_bgjqtwxvy|zxvutpid\YVLC;779766656556667VsA7665566:P|�””’�„q_Y\u�››Žƒ~vrstuwy}€��ƒ„Š‹‹‘•””—–šš˜˜‘‘���†€~{xutsrpppqnptx}‚‚ƒ‡‰�’�І…ƒƒ�„��€‚€|€�~|z|~|€~~�~|z�‚ƒ………~~}{z{}|xxusomigb_\YUPJCFLIMH>:98877665555454445568;>CHNPPOQQQQQRQPSSRSQQQQONJFDA><:::;::::::::::::;:::::::998766655555555545BBBBDCA@@?=;:886655665555555555555555545568;=?BDDCDEECB@=<97655444444444444444444444444444444446D]ghffkmmh[KDEEBCKSTOH@<;99:=?CFGKNPPSRQPNOPPPOOPONLMNRWYZ_fhinpstsruvrpssof\Y[WK?:;>>A8666655555567975656667;W��“”’Œ�rc\\s�œž—‡{ssuvxz~€�‡„ŠŽ“–›˜˜š›˜œ›—•“�ŒŽ…~zwuuusrqqppnsw|�‚ƒ†‹Ž”””�‹ˆ†‡„…ˆ…ƒƒ‚~�|zv{��€€€€}zz|‚ƒ„……ƒ…ƒ�€}y}{yyvsrongf`^[XTQLDCJHJG>:99877655554455555558;>CHMNRPQQRRQRQPSRRRQPQRPPKGDB><:9::::::::;;;;:;<;<;;::::99776655555545544BBCCBBCA@>=;:876568:65555565555555555555568;=?BDDCDFECBA?=:87665444444444444444444444444344444459PdkhhjlmjaNDGJHDAFKLJC=;99:;?CFHKNNQRRSQPQSSQPQQQRPRSSWZ]aehhjoqrrtxvsrsog\XXTK@;:9APK:766565555555555556877>^†”–’�Š~n^Zez���–Œ€|tv{…~~~}†††‰Ž’•›™˜š�ž�™–’ŽŒˆ�€}{wvutrsqpmnqs|„‡ŠŽŽ‘””™‘ŽŠ‹ŒŠˆˆˆ„‚€~�}xx{~€��‚‚�{|~ƒƒ†‚„…„ƒƒƒ�|}}zyxvsnlie`_\WVSMECKHHE=::9887765554555445568:=BGMMPPPQQSSRSQQRRRRQSQONKHEC><;::;::;;;;<<<<<<=<<;;;;;::9876655545445445BCBBABCBA?>;:876657865555555555555555554567:=?BEEDDEFDCBA><98765554444444444444444444444454444445B\hlkhhmmbODGLMIEBCGHC=;99:;?BEGJMOOOQTTQRTTUUTTUSVVUUXX]aadgilprqttttqqg^]\XMA;:<>S[Q<666555555555665557988DkŒ’�‰ƒ~tgel}‹–›œ™Š�zst|}~~€}}~‚ƒ„†…‰‘–•›œ�œŸ›—��Š„�~~}yuuutsrqpppsw{€‚†ŠŽŽ�’’���Šˆ‡ˆ‡„‚�~€}wv{‚„‚‚‚€~€€ƒ€�€‚„„…�ƒƒ||zxwvtplhea][ZVTPFAKHHD<::99876655545554555679=AEKNQPPPPRRQSQRSRQQRQPNNKHEC?=;::;;<<<<<=<=<=====<<<<<;;:876665544455545CCCCBCCB@?=;:8765578556656665545555555445679<>ADEDEFFEDBA?=;98665444444434444444444444446754444449QekmjgjleRFGLOMKIGEEC=:99:<=ACGHJLOOSSUSTVVVVUXXUXYVWWX[__`dfjmqorsqomjc_a[RD=99?M\^WB86656655555566555667:LvІ€uqkmpw~Œ“–˜›–†ztsuv|}{~€€€ƒ…‰�““˜˜š��š”�Œ‡‚€€€|{vwwursspqporuz{}�††ˆŒŽŽ���‰Œ‰„„„‚„zwx}€€€�‚‚‚~~�€|€€‚„‚„€ƒ‚„€{zzxvspjhfc_\[WUPHBJGFD=;:99876655555455555569=AEINPOOQQQPQRQQQQRPQPRPNKGFD?=<::;;;<=======>>>>====<<<;:987655555444445DCCCCCCBA?>;:9766555555556655545555555455579;>@DDDDFGFCCA@>;:8766544444444444444444444444444444446C^holhhheVFFLPQORSPHA>;:9;<;?AEHJKNOQRTVVXXXYX\^\[[XXYY\`abggjmomppnkfddebWJ?;9>Qbcb_L;7666555555555656668?Xw|mjhlot~ˆ�˜—‘•™”Š�yutuxzz{~���‚�ƒ…‰‹‘“•—˜™œ™“�‹‰‚}~}zz{xyyyxutqqpprruy|‚ƒ††ˆˆ‹�ŽŽŽŽŒŠ‰ˆ‰ƒ�€ƒƒ�‚‚‚€€€€€�€€„…„‚…ƒƒƒ‚ƒƒ~}{vvvrnhgc`]\YUPJBJGEB=<;:9877666565555455679<@DIMPOORPPQQSSQQRQRPQPQOKIGDA><;;<=<====>>>>?>>??>>>>>>=;988765555454444CDCCCCCCB@>==9876656556666665555555555555579;=@DEEDFGFDDCB?=;98655444444444444444443444444444444459MdnoljeeVFGMQRTWZXLB=;:9;<;>@DFHJLOQQTWVY[ZZZ]aa_^\Y[\^accfhlnnmnkkgdfec[MB<::Hbhdbd[F976666666666666666:I`ecbhlqw€‹“—•�‘“—‘‰ƒ}yvxxyx~‚�ƒƒ�‚„ƒˆ��’–—–™—•�‰†ƒ€}}{|||}}wtqompssruz€€‚„…††Š�‘’’‘Ž‘�‹ˆ†…‡†‡††‡†…ƒ‚†ƒ€ƒ�†‚„ˆ‡†…ƒ†††„ƒ‚€~xvwrmihd`_]XUSKCIIFB=<::9887655555555555569<@DILOPOTPRSRRQQRRRRQPPPOMIGDA><<<<==>??>>?@@?@@@?@@??@>>=;99765555444455DDCDCBBCBA><:8886655555666666555555545555568:<@DFDDFGFECCBA><:9765544444444444444444444444444444445>XioolgeWGHOSTVY[XOC<::9;<<<>BDFINOSRUXXX[[[``dccb^Z\]_cdgijkkkkiigggf`YOE=9CGMOOPPPQRPRRSPRRRQQQQNMKFEB?===>=>>>???@@@AAAAAAAAA@??=;:9776555544544CDDDDDDDB@?<:9876655656666666555555555555557:<:8765555444444444444434444444444444446E^kqpjdWHHQUVWYZXRG>;:::==;>@CFHLNRSVYZYX\[`bdfecc_]_bcehjjlmjihhkmid\RLA;:>OV\cgifdbXD:7666777778779;BOZakoopy�†‹Œˆ‡Š�‘’�Œ†�~{{{||}€�€ƒ†‚~€†‰‰‹�“—˜–•”�‰‚€~|yw{{xwyxvuustrtswvvy}|}……‡ˆ�Ž�”—˜—””••“����ŒŒ�ŽŒ‹‰…†ˆˆ‡‡…ˆˆ†‰ˆ„……ƒƒ~|{vurmkgca^\YWRLEGLG@<;::9987665555555555567:>AFKOOQQPQQQRSQRRRRQRQPNNKGEC?=<<=>>>?????A@AAACBABBBA?@?=:9876654445455EEEDCDECA??=;:8766666667776655555444554455579<>BEDDEHGFEEDC@?=;98655444444444444444444444444444444458KanrneYIGSXYYY[[VND=::9;><=?BDFLOOSUY[[]]^_deihgebaabeehklmnolklkha[WMF==AJZ`__^cfijiYH=9767777778>JQW\do…}v~�‚ƒ„†‚�‹“�Ž‹ˆƒzz|z{{}~�…ƒƒƒ€€€ƒ‡‡Œ‘‘””’��Œ…~{|xxxwxxxywuuutttsuvwwyz|}€„†††‰Š�“–™•—–•˜—–••”•“’“��Ž‹ŠŠˆ‰ˆˆŠˆŠ‹ˆ„†…€}}yzwvrmkgb`]ZXURMGFNH@;;::98866655455545555579>AFKNOPPQPQQSRRRQQRQPQPONJGEC@=<<==>???@?@ABCBCCCDCCCBA@?>;9876554444455EEEEEDCDA@=<:9776666666777665555554444455457:;>BEEDEHIFEFEDB?><;9866554444444444444444444444444444445:OenqmbOGR\bbaa_]UKA<:::=<ACOX_bbba_aeih^PC=99888:?FQ^bfnovzy„�ƒƒƒƒ~�Š“‘‹Š„{y{zy|||‚„‡ˆ†ƒ��ƒ‡‡‹��–”’�‹Š†��}{xwvtwuvuvvuvvtssvwvuxz|}���‚‚�…†‹Ž’••““–˜˜—–—•—–”“’’‘‘��ŠŠ��ŽŒ�Š‹‡ˆƒ€�}yvrsolfdb][YWRMHEMF>;:::9887665555544455557:=BFJMPOQRQRQRRRRSRRRPSQNMKHFC@>=<=>>??@@ABBABBDCCDCBBBBA?=;:877655454555EDDEEDDCA><;987776666777777655555444445454568:=ADEDFHHFEGFECB@><:8766544444444444444444444444444444455;99<=<>ACFHLMPSXY]]]bdfimrpljeeefjmosstttpnje\SKECGHIQXZ[[_cbcdba]YQJGFEGLRV\cjo{�†xu~€‚~ƒ‚�€‡��ŽŠƒ�}yzxz{{}{}�€„†ƒ�‚~ƒ„ˆˆ�’�Ž���††‚|{yywstvrrqrsuuttuv|wvwxxy{~€|‚…†‹��‘—š——› Ÿ˜–——–“�’‘’‘‘����‹�Š‹‹‡†„€}~}yurpmiedea\YURMIEKC=<;:998776555445445544569==>>>>@@@ABAABBBCCCBBBBAA?=:9876555555555EDFDCDDCA><:987666666677776655555444444454467:<@CEEGHHHFFFFCBA@=;98765544444444444444444443444454444455>Telk]JL\fkmllfb[MA;99:=<=?AEGIOQSY[[]]bfilorroliggllnpprvspoolcZZQKJLMSTTX[]^\[^_][ZWWUWWVWZZYhsw�‰†w|…‚ƒ�€ƒƒ�†�””އ‚€~zxxzy{|y}‚€ƒƒ~}}�…ˆ‡‹ŒŽ��ŒŒŠ‡…~{{ywtttqsuvxyxuvxwywswx{zy}}|z~††ˆ‰ŽŽ�•™˜™ž ¡œ˜™˜˜“�””‘‘”������‰ŒŠ‡†„€€�€wurpolgda`[VVRNIDH@<;;:998776654444444444568;?DIMNOPPPRRPRRPQQQQPRQNMKHFDA?>=>>??>@@ABABBCABABBAAA@?=<:8866554544444EDEFEDEC@><:9776666667777776555545444444444679;?DFEEGIGFGGGDCB@><:98765544444444444434444444444444444556>TcidPKZgmponkg`TD=:99<<<>BFHKOQSY\Z]_cejnrssupnmklmnprtroomojccZTOPPUYZ[^]WSUZ[ZWUVSRSUZa`_]ix„‚ˆ€tƒ�‡‚�~��€ƒˆ�“˜’�†ƒyywvwz{|}�~‚��~€‚†Šˆˆ‹�‹‹†Š‡‚‚~}zxvrrrttttvtvuxzyyuvvyxxz||~}€ƒ…‰ˆ‰��”’”˜™šš™šš˜––••””•”’��Ž’‘‰‰‹Š…‚�‚}yvsqnjgeb`\XVROJCC=;;;:999876655444445444557:?CHMOOQQQQQQRQQRRRRQQQONLHFDB?>>>???@@@@@@AAA@AA@A@@?>=<:99765554544444FEFEEDDC?><:8766666777888876655555444444444579;?BEEFGHHEFFGFDCCA>;:98755544444444444444444444444444444457BXceUJWemprqome[J?;98:<<=ACFINRUX[[\`bfmnquuxttplloqrroppqnlieb_SSVZbbff_XSZ\YUSTUSSRW\^dgeiv~‰uqvŠ�Š‚ƒ€ƒƒƒ„‡Š’™˜“‹†‚€zyxvx|{|~€~�ƒ„‚~€ƒ„††ŠŠ‹Š‰„…ƒ€�|{wwssssstsrstvwyyzyywxxvx{zz}€~€ƒ‰ˆ‹Ž‘’”•—–˜™�›˜—š˜–•“••““’�‘ŽŒ‹‹ˆ‡�€ƒ~|ywspqoida_^YUROKB><;;;;:98877654454444445457:>DHLOOPRRQQQRRQRRQRQQQOMMJFDB?==>>>>>>>???>??>?????>>><;:98765554544444EEFDDEDB@><:8876666777888876555554544444444568;>BDFEGHHEFGHFDCCA?><:98755554444444444444444444444444444458EXbZKQbmrtusnhbSC=:89;<=@DFJMQSWZ[\^djmoruvwwxuqrspsqqppqnjllk`V\ahnpnic\^a\]XVSPW`_a_agkjnvssrx„Œ…„�ƒ…„„„ŠŒ–™š•�Š…€~|xxz{~||€��€‚‚‚�~~�„†ˆŠˆ‰‡‡†……�‚�{vwvusrqprrruvvyyzywvxy{{y{{{}|�‚…Œ�Ž�’–•™šš™›š›š™˜™––—–•““���Œ‰‡…ƒƒƒ€yvrqqoife]ZXTQNLC=<;;::9988776655444444445579=BFKOOOPQQPRSRQQRRRQPRPOMIGDB?===<=================<;;;:987665554544445FEEDDECA?=;98766666778888877665554544444444569:=AEFFFHHFFHGFDDCDA?=<:97655554444444444444444444444444445457FX\NK]ksuvtqlg[G>:98:<>@DGKMRTUYZ[^dknpruvx{xyuuuqqpnoqrqpssj`^jmrwxsogigda`b\Zcjkfiglptnkmqy~…ƒƒƒ†ƒ……„‚…‹‘˜™™•��‡€}{{zyy|{}€‚€��~€}}}€‚„ˆ‡†„„„……ƒ€}~zvwsqqonpnppruyxy{zywwx{zyy|{}€�„ˆŠŒŒ�‘’–››™š›™™™™—™™–——••”‘��ŒŠ‡†‚€|yuqrpnlfb][WSOMMD<;;;::9988776555444444444569=BFKMOOPPOPQQQQQQPRRQPPONKGD@><;;;;;;;;;;;;<<;;;;;;:::98877654455554444FEEEDDCA?=;98766667778898877655555544444444568:>ADEFEHHFFHHGEDEDC@?><:87655454444444444444444444444444444458IWQHVhrvyvvpjaM?;988<@?BHILQSUXX[\bimqsuwyyzwvstsqqqsvvvxvri`iuwz€wmmoiehmghkmonmlkppplox~ˆƒ………„…„†‡„…‹�—™™–“ŽŒ†{{zywy~}}�†€€€€~~~~€�€…„„„„„„‡ƒ€|}{vvspmmlqnqqsvvxyzzywxzz|€€€€……†‡‡Š‹‘�”’™™œš—™™—™››š–˜™—••”�Ž��‹‰†€€~{vtsqpjfa_\XTPNKD<;;;:9:998776555444444445569;::::::::9::9::9:999988887666555544444544DDCEEDB@><:877666678899998876655444444444445689=ADEEEGGFEHHGFDFFC@@?><:8765444444444444444444444444454444445:JRIPcpvxyzvpeTC<988;@>AIJNORUWVZ[`fkpsuwyzyvvstutuvvyzywvofksz€vruplnstsrvutprmlopty~„†ˆ„„†…„„‡‰‡…†�“˜›�–�Œ…‚~|xwwyy|~|�||€}}|}z{€€ƒ€�ƒƒƒ�yywvtsqmljmnooruuwzx~}}{{}€€��††ˆ‹‹‰Œ��”•”–›š™š™›š˜—˜—–—•”’““�Ž�ŽŒ…ƒ~€}xvsoomgb_[XSQLJC<<;;;;:999876655444444544568;@DJNOQPPQQPPRQRSQQQOOPNOKFD@=;:988999998999999888877776666555444444444FEEEEDC@=;:876666678::::98776656545454444445689<@BDDFFHHFHHHFEFFDDB@?=;98665454444444444444444444444444444455;IJI\mtx{zxtl]H>:87:>>?EHLOSTUWY\aelprtxvw{zxsuvyyz|{|y{vnit|~€}wxtwxyx}zxzzvuvrrz|}ƒ‡‡Š‡†ƒ„ЉˆŠˆ†‡ˆ’˜›š™–�‰†…€zwxz}~~~��~|}€�~|{{z||~~~€…„‚€|{zzywwtpngbjknmnsvy|{~~€�ƒ„ˆŒ‰‹Œ�Ž‘�••—˜–——š�Ÿ�™–“——–“•”””“‘“�ˆ…„ƒ}~yurqqlgd_\ZUQMHB<<;;;;:::9987655454444444568;@EIMOQPRRQQPQQRRQQQPQQOOJHD@=:9888888888888777777666666555554444444444FEEDCBB@=<:87666678899:::9866655444445455545679;?DDEFGIGFGIGFEEFECCBA?=;98665445444444444444444444444444444456>IFQhry~}{wqdOA;988<>?CHJNPRTUY]^cinpsxwwxyxxxvy|}}{xxyupqz}€€~xxwz}}~|{{{|{||~|„…ˆŠ‰Š‡‡‡„ƒ‰ˆ‰ˆ†‡Œ’™™›™˜•�†€~{zx{~€€‚~|}|}z|z||z{||}‚„€z{zzz{xvtojbfjjjnrwz{~�ƒ€�‚€€€„ˆ†�Œ�Ž””’•”“——˜˜š—�ž›—™””—•””’””�‘‘�ˆˆ„‚}{usspmhc_\ZVRMGB=<<=<;;;;:987665444444445568;?DIMOPPQQQQQPPQQQPROQRONKGDA>;9877887777777766665555555555444444444444EEDDDDA>=;:8766666789::;:9876655544444454555678;>BCEFGIGGGHGGEFGFECCCA><:97655444444444444444444444444444444457@FK_oy}}|xriYF<987:>>BGILQSSTY[_chknstvwuttxzwz}}~|z{xrot{~€~}|}|~€‚�€~~‚‚„…†ˆˆˆ‹‰Š‡‡€‚„…„ˆˆ…ƒ‰�‘”™–š˜–“�‡�~|{{z{€}|}{z|{yzxxvxy{{~€~~}~}z|{|{{ywqphegfgjquxy|€„„…†„‡†�‚‡…†ˆŽ���”–”““’“•›š˜˜œœ�›�š™™—“’‘�‘��Ž�ˆ†…�€~zxvromida\XVSKGC>===<;;;;9877665544444444457;?DHMNOPPPPQQQRPPQPRPQOOOLHCA>;9777766666666665655555555555444444554444EEDCDCA><:98766667789:;;::876655555544545555678;>ADEEGHFFGHHGFFHGFDEDC@><:87655444444444444444444444444444444459BETiw|€€}vnbM@:878>>ADGNQRRQWZ^dhlpsttvtttyz{{{}|{{{xrrv|~~€€ƒ…ƒ††„‚ƒ„„†Šˆ‡‹Œ‹�‹ˆ‡‰…„ƒƒƒ…�„ˆ†‹�‘”–™™—–‘މ„€€{~~~~�€€~}|}|yxyvtvwwzz}~}}}|yyz{|zyyxutmehgfhkquy|�†…†‡‡‡…ˆŠˆ‰‹�’“’”“’–“”””šš˜™œ�š››ž››˜–••“’����‰‡„€|}{wtsolida^XURKFD?==<;;:::9877665544444444567:>CGMOPQQQPQQRPQRPQQOPQQPLHCA=:8767666666565555555555555544444444444454EEEDCC@><:8775555679:::;::876655445544555555578:=@CDEFGGEGHHFFHHHEDEEDB@=<97654444444444444444444444444444444446:AI`py�ƒ€ztiWD;877:<;;;:99888866555444444445579>BFKOPOQPQSRSPQPPPRQPPONLHCA=:8765555655455554544555554444444444444444FEDDDB@=;:87765556789:;:;9877655555554555555578:=@CDEFHGFFHHFFFGHFEEEECA?=:87554444344444444444444444444444444457=DTht�€|xpaI>:778==CFHJLPQTX[_ehnrtsvvuuvv{yywwvustvux~€€ƒ‚ƒ†ˆŠˆŠŠ‰‰‡ŠŒ�ŒŽŒ‹Š‡„……‡…„…ƒ†ƒ‡��‘––™˜˜•–’Ž‹‚��}}€€�‚~~|{{{yvuuwvwy{{}}}~|{w{{z{yxsqmheaachmqqw{€„†ˆ‹‰‹‹ŒŽŽ�Ž�’—™™œ›˜“šœœ™™�™™œ›™—™œ�š”’’�Ž�ŽŒŒ‰ƒ€|}zwuttrkhc_]ZUOIEB=;::9999986766654444444444568::99888887666655444444444569<@EJMPPPPPPPQQQPQQQQPPPOLHCA=97655554444455454455555554555444444444444CCECCA><:98765555779:<<<;9987666555556555556678:;97654444444444444444444444444444444456=GPcr|€�}um[G=9778=>AFIKJKMRX[`ejmoqrxwttwxywxtutvyz||€}€€‚…ˆˆˆˆ‡ŒŒ‰ˆ‹‰Š�Љ‰‡„„†ƒƒ‚�€ƒˆ��’•˜™›–”•”�‹‰…‚‚���€‚‚†„€€~‚€|~}zzxsrrswyyy~}~}€���~}}|~{{zwtolifc_bfffimsz€‰Ž‹““‘��”“—”–™›™›� ŸžŸ¡ ž�ŸŸ›�ž›–˜–“—“���ŽŠˆ„€~}|yurqnlgda]YURLFD>;;:8888877765655444444444458;@EKNOQPPPOOOQOPQQQQOPPMLIEA>:7655545444444445555454555544444444444444CACBA?><:87665556789;;<<;99877655555555555555679;>ADEGHHGFIIHFEGHHHGHHFEDC?<976544444444444444444444444444444444448DIWkv|}{vpdP@:767;?@DFGIJLPV[`gkmmnrwvsswzxvwvtwx|€€ƒƒ‚‚„†‡Š‹Š‡‰‹‹ˆˆŒ‹ˆ‡‰‡„…„ƒ„„‚‚�‡‰‹�’—™™š�𗔓އ†…ƒ„‚�����………„��‚€ywutsqruxwy{|~~}~€~€��~~}}{{vrnjfc_`cfdcfjqx‚‰���’”•––—˜—šœ™œ¡¦¢¡¢¢¡ž›ž��œš›š•”““‘����ŠŠ…‚zzxuvtplkec_[XTRLFB;;;<;;98877766655444444444458:?DIMPNOQPOPOOOPQPROPPONLJEB>:8654555445454444454555455555444444444444BBBB@>=;987655556789;<=<<;:987665555555556656679;>ACEGHIGFHIHGFGHIGGHHGEDCA>;87644444444444444444444444444444444445=HM]pw{zuqhYE;8768:8654455545454455444454555554454444444444BBAA?><:98765555678:;==<<:9887665555655555656678:>ACEGHJGHIHGGFHGHGGHIIFEEB><976444434444444444444444444444444444458EKRbpwyvsm_K>9767:>CCDGIKNQX^`dhkoprsstwwyywz|~ƒ…ˆ‡‡‹Š‰‹Œ�ŒŠ‹Œ‡ˆ†„ˆ‰†ƒ„„†‰ˆ‰ˆ…ƒ„‰ŠŽ‘—™šœ›�œš•–Ž�މ„‚„„„ƒ‚‚†‡ˆ††„ƒ„€~zupponprrvwxz|~€‚ƒ‚‚ƒ‚ƒ†„ƒ‚€||xvroid`^``bb_^afq}„ˆŽ““”“�“••”“˜šŸž�š¡¡¡ ›™š›˜˜•’�’‘�‘�Œˆ‡‡„��zzxwwsplkfa_\WSPJGB9789<=<:9877766544444444444579>CGLMOONMNNNPOPQPNOPPPMKJFC?:8655555444455444444544455554444444444444@A@?=<;:87655455678:;===<<:9877665555656656666679<@CEFIHGEGIGGFGIHFGIIHGFFCA=:87544444444444444444444444444444444446?LMVhqxyvodRA:7668<@DFFGHNQTZ]aekonnqptvxyzx{}��ƒƒ†‰‰‰‹ŠŒŠŒ�ŠŒŠ†‡„„„…„„ƒ„††………„…‡‰�Ž”™ššš››™˜•“���Ї…ˆ…ƒ……‚†Šˆ‡††„€~{vtollnrrtvww}~€ƒƒƒ†‡…ƒ†ƒ�€„‚~{zxurkfbbbcccc__`iyƒˆ��‘�‘��’’““˜”™™—šŸž��š™˜™›•”’�“����Š…„„ƒ}{yxvvusnliea][XQNHFA85679<=;:876666554444444444579=AGKNNNNNNONOOPQOOPNNOMKIGC@;8755555554455454555545455545454444444444@A@@><;987765556678:;<>=<;:987776666666566666677:<@BDEHHHFFIIGGHHHGGHIIGGGEC?;976544444444444444444444444444444444458FNN[mwywoeXH=8766:>AEEEFKOTY^adinnlpqswxzz}€€€�‚„…‡‹‹ˆ‰�ŽŽŒŽ‹ŒŠˆ‡‡…„„ƒƒ‚ƒ��†…ƒ†ˆŠŒ�”˜œš››ž›™——“��ŒŠ‡ŠŠ‹‡‰ˆ‡‰Š‰Œ‹ˆ‡�~zurokjnoqswz||ƒƒ„„…ˆ‡ˆ†„ƒ†„†ƒ�}{xwtojhggffdc`_^bp‚‰�Ž�Ž�Ž���“•—””——™žž¡ž—˜š™˜•’�’•�Ž�މ†‚ƒ‚€~|xxyxtsnkhda]ZWPKGF@755578:=<;87666555555444444568=AFJLOONNNNNONOPOOPOONMKJGC@;8765555555555444545554555545444444444444???>=;:987555556779:<=>==<::977666666666666666679;?BCFHHFFHHJHFGIGHHGIJHHGEC@<:86544444444444444444444444444444444446?MQS_osqmbXL@;9778><<;9987766666666666666689;>ADEGHHFHHIHEFIIHHIJJHIGFDA>;97654444444444444444444344444444444445:JWUWbkoj`TKGB<987;ACBADFJRY]_bjlmnrtvy{||}‚ƒ……………‡ŠŽŒ��Ž�‘�ŒŒŒ‹‹‡‡‰‰‡‡††‡…†‡‰��‘•–™ Ÿ¡žŸŸ�™›”’’“’�ŒŠ‡‰‹ŒŠ�ŽŽ‹��†}{trnkeejprv|€…ˆ‰‰†Œ�‘”•““Ž�‹††‚€|zvsppqmnlkiefafw‚ˆŠŒ‹Œ‹‹Ž�”–“””™™š™™œœ™š—˜•�����‹‹‡�„…„€|{||xwvtqmkjd_\ZVNHFG?66555568;>>=;98777888776544568<@DILLNLLMMLOONOONPOPPMKJGC@<9765555555665555554445545545544544444444>>=<;:9876754556799;=>>==<::887766566666665566678:>ABDGHGFGHHHFFGHGGIIIHHHGDB?<986544444444444444444444444444444444456AU[YW]ecZNKMI@<988>BA@BDJPUZ_beglmprrvvy|}�ƒ…„…†‰Š‹��Œ��ŽŽŒŠ�‰‰ˆ……ˆŠˆ‰ˆˆ‰ˆŠŠŽ’”—–™˜¡£¡�œ�ž˜›™”’’’�Œ‰‰ŠŠ���ŽŒŒ�Œ…{zvpnifcdfmsw~€�…‡‰‹Š�“—ž£ž˜”��‡„‚€~}ywwtsrtrpomigcbq‚†‰ŠŒŠ‰‹ŒŽ’’“•™››™—–�›™˜—–”‘Ž‹Œ�Ї…|‚ƒ…}|xyvtsplkgb_[XSLIFG?655554558;>>=<;;;:9:::87554557:>CIKMMMNNLLNOMNNOONOPOLKHC@=9765555555555554554454555445544444444444===<;:9876555556789<=>?>=<;:987766556666666666679:>@CCFGHGGHHHFFHIHGHIIIIIGFC@=;86554444444444444444444444444444444445:LY\YVXYQILPOG@;98:ADAADHMRX^afgjlnqswy{|€€€‚�††ˆ�Ž�‘Ž�’�‹‹ŒŒ‰‰‡†…ˆŠ‹‰‰ˆŠ‹ŒŽ”•˜˜–šœŸžžžž›ž›˜™–“•”‘�Š�‹‹ŽŽ’‘���‡�yvpjgebaaeltx|€‚ƒ†ˆŒ���•›�¢¢›˜’�‰…�}~}{yyyxwsutomjgcr…‡ˆŠ‹‹ŒŠ�““’˜›š™•–•–™™•“•”��Œ�‹‡…�~�‚…‚€{yxyywurplifa\XVRMHGH>6555545557;?@>>>>>=<<;:9765567:>BHJLMMNNMMMONOOPPOOONLKHEA=:866555555555455554445555444544444444444===<:9986655555679;<=>?>=<;:977666655666666666678:<976544444444444444444444444444444445456BT\_\WRMKPVTPG>:89=ABABHLRW__dflmnqvyw{}~�€�††…ŒŽŽŽŒŽ‘�ˆˆ‡ˆ‰†‡ˆ‰‰Š‹‰ŠŠ��“”–•™šš™› Ÿž¡ �œ�™—š––—”’�Ž‹Œ�’’��Œˆ‚yrliebcbachnsy|ƒ…‡‰�ŽŽ�—œ¥£ Ÿ—‘�Œ†ƒ€~~~~}{zzyxtromics�„†ŠŒŒ‹ˆ‹‹‘“’”•’”’’’�”˜•”“’ŽŽŽ‹ˆ…†…‚‚���~xuwxwwvromlhb\YUOKIHE;65555445567;?@@?@??><<;:987777:>BGKMNOOMMMNNMPQPONOOMKKIEB>:866555545565544554545555545454444444444==<;:9876555555678:<=??>=<;99876765556556566666779=;::99998889:=AFJLMLMNNLMNMNPPPONMNMLIEB?;875555555555555544445454445544444544444=<;:99876655556679:<>??>=<:99866665555555556666679;?ACFIHFFGHIHGHIHGHIJIHIIHFCA>:865544444444444444444444444444444444447CU\^_ZMIT]]^XMB=:9=?@ADINTX\bgjloprtsvy{}~‚ƒ†‰‹��Ž�ŽŒŽŽ�Œ‹‰†ˆ‰ŠŒŒŽ����“”—˜˜—œž�¡¢¢¡Ÿ¡Ÿ™™™š››™—™“’’“””–•��Š‚yrljheeeddgikqvz|�ƒ…ˆ‰Š‹��‘––ž œ•�‹Š†€~}~~~}}|{vuojhy�†‰��Šˆ‰Š†ŠŠ�‹‰ŠŒ��ŽŽŽ�”���ŒŠ†‡†���‚„…��~{zvttsrpnmgb_ZXSNKGFC86554445455569=A@?><9877678889:<>AEILMMMNNMNNMNNNOOONMMLJEA?;877666555555555554454455545544544444444<<;:99866554555679;==???=<;:9766555445555555555668;>@CFIHGGGHHGGFHGIHIJJHHHHFCA>;965444444444444444444444434444444444445;LZ^a\RJR^bdcXH?:9:>A?CHNSX\ccjknooqswxz}€„‚„ˆŠ‰�ŽŒ��ŒŽ�‹ŠŠˆ‹‹‹ŽŽ“’’’”•–˜œœœ¢¤ ¢ Ÿž›žŸ›–˜˜˜–•˜š—•”•”•”’‘Œ†zqligdedffimmotz}��……ˆ‰ŠŠ‹ŒŽ““—•”�މ†ƒ~|{|}{yvuvxwvnijz€†‹‹‰ˆ†‡†„…‡�Œ‹‹‹‹�‹‡‹Œ�‘‘Œ‹ˆˆˆ„‚ƒƒƒ‚‚€}{xvvtsmlnjf`]YUQMIGGB754545444445469=??><:765555677:;<@CHJLMMNNNMNNOPNNOMNOLKJFB@<975665555555555444455444555444445544444<<;:98776555555779;=>???<<:98766555555555555555578;=@BFHHHFGHHGFGHHHHIHIIJIIGDB?<9755544444444444444444444444444444444447AS[`]SJN]cfe_QC=:9;?>AGLQT\bchlmpoquwx{}€�ƒ„ŠŠˆ‹‰�ŽŽ�Ž�‹�Ž�Œ�‹�’““”’’–˜™œž¡¤¥£¡Ÿ£¢ž� žœ�›—••–˜˜•–—––•’Žˆƒukhigefhilooquy|‚�……‡‡ˆ‰ŠŒ��Ž����‰‡ƒ€{{{z{zzxurlknssrnir|„‰ˆ‹‹Š…‡„„„ƒ‡‹‰ˆˆ†‰††ˆ‹���Œ�Œ‡‡„…†…ƒƒ€~||zwvwrnkllhfa_ZTQLHGHA7555444454444568;>@?<965444556789??>=<:98765555455555555555567:=?CEHHGGGIHFGHHIGGIIKJIIIHDBA=:765444444444444444444444444444444444445:JY``WMLWadebWI?;9:=>@DJQU\bdfjmoopuwyz}„„†ƒŠ‹Šˆ‰���Œ�������’Ž�‘“”•––˜›žžž ¤¦¦¤¤£¥¤ ›œšž�ž›››™›š™—•”•“ކ�rihifgikprtsux{�‚�€€„††‡ƒ‡‰ŠŠŠŠŒ‹ˆ‚|ywvwywtqrnhbclpnll|ƒˆ‰Š‰‰‡†‡„„‚€€„ˆ‰‰†…„ˆ�Ž�Œ‰ˆ‰‡ƒ‚ƒ…†ƒ†„|{zxuvtrnjjhid_\XULKGEI=65455544444444568<>@>;854444445568:>@EHJLLNMNPOOOMOOONMKKGB@=976555454455554444454445445554444444444=<:998776555556779;=>?@?<<:987665454444555555555679<>BDGHGFHGGGGGHHGGHJIIHIJIGDA>;8655444444444444444444444444444444444457BS[[ZPLS]cd_ZOB<99:>@EJPU\`cdhmpqruwz||‚ƒƒ…Љ‰ˆŠ‹�����’��’’ŽŽ�’•––••™œ ¡œŸ¢¥§§¥¦¥£žš�›�žžœšœ™™——”•””މ�ynehgeimqsxyxz~€‚‚~}‚†…„‚„„†††‡†‰…‚{xuurrqmmtyvrlehmnnx‚…‡ˆŠŠˆ‰‡…†…�€€€‚…††ˆ‡‡�Ї„�‡Šˆ‚€‚„…ƒ„„~{yyvuwuqmijigd^[VRMIGEF9655455444444444569=@@=:7554444555668:=ADHLNMOONONNOONMLKJGC@=:76555555454555444445555444455444444444=<;:9777655455679:<>?@?><;:987655545555555455555679;>ADFGGFGIIHEGIHGHHIJHHHJJGEB>;8655444444444444444444444444444444444446=MW[YPKPYaa_\UF=:99<@EJNV[_beglnoqtww}}ƒƒ‚ƒ†‰‹‰‹‹ŽŽŒŽ��”‘‘‘���‘”––—•›ž ¡œ ¤¥§¦¤¦¢¡ž™–™š��œš�™™—–—•““�‡|shbdehkrty|}~�‚�…„ƒ€~„†‚��€‚‚ƒ„ƒ€�„�|xtttpliipx}{zunijo{€„„„‰Š……Љˆ†ƒƒ~}|„†ˆ‡†ˆˆ„€~…„„…„�‚‚~|xzyxsrsrpmhhgfa\YTQMIGGE8554565444444444557:B@?<8654444444455679=BFILNNNNONNNNONLJGC@=:76555455555544444545455445444455444444<;;99876554445679:<>?@??=<:987665444444545554455668;?ACFHGFFGHHFGHHGFGIJHIIJJGEC@<97654444444444444444444443344444444444448CQVVNJOY_^^]XK@:98:@CHMSX^bdhkmnprtwz}�€€„„†ˆ††ŠŠŒŽŒ��‘“�‘�‘“’™™–™˜��Ÿ  ££§§£¢£¡¡Ÿœ˜›š��˜—šœ�š—•”‘ŽŠ„{ngceglntx}€~€‚ƒ€‚„„‚„ˆ€}|~~€€�}z€}zxropnljqruz{|}wtqsw}€ƒ„„‡†„ˆ‹Š†…‡…�|x|}�‚ƒ†…„}ƒ‚�‚‚€€~~yssvvwsrqpmhfgda^[XQMJGHHD86555975444444445568;>?>;8544444544454558:>BFJLMNOONMMNNMJGD@=:76555545454544444555545445444544544444<;:98776555456679:<=???><;:997665554444444444545557:=@DFIGEFHHGHHHHHGGHJIHHJIHGDA=97654444444444444433444444444444444344446=JRQLHMY_]\^\OB<:89?DFNSX^cefkloqstvy{~~ƒ„ƒ„††‰Š��Š�’�����“––š™—œšœž ¢¡¢¦¨¥¤¡ ¤¤¢žž žžœš›š™š™–•““‹ˆ…|qfcgjnrz}€�~�„‚‚‚„���|||{}{{}|~}z|wutqpnnvz~|~{zywwvy{|~‚�„†ˆ†…‡‹Š‡ˆ‰ˆ�}xww}�€‚‚€}~~€€€€~~ztttvvtqqolhgeb`\XUPMIHKH?655554444444444444458CGKMNNNOMMMLKGEA>976554445444445445554455555544454444444<;:98766654556679;<>@@>>=<;:98765544444444445544457:=<;;:97765554544444445444579??<96555444444444445579=@DIKMMMMLJIFB>;87655555544444554555555555555555444544=;:88765554566789;=<;;98766565444444444445569<>BEGGEGHHHGGHHHGHIJJIHIKJHGC@<976444444444344444433433444444343444444457?HIGFJVZY\]\TE>:99=@EKQW[_cghlpoquwxyzy}~€�‚‡…ƒ‚ƒ‰‰��””•˜˜™™›ž¡�œœ¢¦¦§¨ª¥Ÿ££ ¢££œ¢£¢¡�š›š—š™•�Œ��‹Œˆvhbgouvvyxwqpnmffhikmmnmqsusqnmnlklms‚„†ˆ†„‚�~}|}�ƒ‚…ˆ‡„ˆˆ‰‰‹‰‰‡ˆŠˆ‚„„„zunlotuw{}|yy{~{z{ywuurrsqqnkiffca^[YTPMJLIGB965544444444444445454458;??>;86554455454:65445567:=AEJLMNMJIFB?<97655555555544545556655555555455554444<;:8766554445678:;=?@@@?>>=;;:8876655544444444444568;?AEGGFGGHGFEHHHHHIJIIHIJIGFDA=:76544444344444444434444444344444344444445:DIKIHSYZ\__VJ@<:9:@GIPV[_dhikorqtwxzyy{~€…‚€…ˆŠŽ�“’”™›˜š˜œ�¡žœ�¢¦¥§©ª§¤¦¦¢Ÿ£¢¢¥§£Ÿššžœ—˜–”�‹ŒŽ��Ž…{pecipqstpmlqtwoorqqpoolljkmlkjhjhoy�……‡‰Š‡„�‚~ƒ„†Š‰†‡ˆŠ‰‡††ƒ…‰‰ˆ„�‚„€�|uninqtyzyyxy{zxyywurqqrrolhggdb^_[WRPJJJHF?7555454444444444444444568;765555556666555555567:?BFJLLLIFB?=97655555555555555556765655555554454444;:99766655556679:;=@A@@@??=<<;:987765554444444444568;>AEGHGGHHHGFGIGHGGIJIIIJIGGDA>:765444444444444443433444444444444444444458BIKIHPVY\``[QD=:99?EIPV\^`eikopqtvwxwz{{}‚‚ƒˆŠŽ‘’’“–——š™› £¤¡Ÿ ¡¤¥¤¦©­¨©¦¥£¡£¦¦¤œ›šŸ¡™™”’�Š‹Œ�ŽŒŽŠƒ}qeekoqpjjsw{zx~�ƒ€~{}~{rmjiiinsx~‡ˆˆˆ‰Œ‰‡†…†…„………Š�‹ˆ„†ˆ‰†‡†„†ˆˆ‡…ƒ�‚~~yyqggloqtvxwtwvwxzywqppqnnjffdcba^[VRMJJKHE>65554554444455444444455569=@@=98777777888766665665578;?DHJJHFC@>:8766556555565555567766666555555554444;:98765664455679;<>@A@@A??>>=<;988765555444444444558:>@DFHFFGIHGFGHHGGHJKHIIJIHFDA>:875444344344443334443343444444443444444446=EJKJPUXZ]a^UG?;99?><;99999:::999887766666679=ADGIGDA?;8776665556666555666655556665555544444;:98776654456679:<>AAA@@?@??><;:988766544444444554579:8654444433344444443334334444334444444444448AGJHLTWY]_^ZMA=99;AFKQXbabdfhjoqssstuzz|~��…ˆ‰�‹�“•‘•–•–—𙛢¡Ÿ ¤¡¡¦©§£¤¥¤§¤¡¢  ž™–˜š”•““Œ‡„‰ŒŽŽŒŒ‡„„ˆ€xspssw{}€‚‚�†‰ˆƒ‚…ˆ‰‡†‡„‚ƒŠˆˆŒŠ‰‡�‘�Œˆ‰ˆ‹‹‹‰‰†‹�‹‡†……‡„†…„ƒ„‚‚€|~|{yxtqpofadgjlnoppqrrtssronjjkgdcdc`[YWSMKJJIHD:554555444444444444444444457<;:98766544444444444569FLOY]^_ccfiopstssvww{||�†‰‰Š��‘”““—˜—•™™� ¡ Ÿž�¢¡¦¦£¤£¡¦£¡ Ÿž�œ™š˜”••’Š„„ŠŠŒŽŠ‰„ƒˆŒ‡ƒƒ€€�}~�€‚„‡ƒ„†‰‰ˆˆˆŒ‹��‹Š‹�ŒŠŒ‹ŒŽ’�Ž‹ˆŠˆŒ‹Œ‹Š�Œ‹ˆ†ˆ‡‡‰‰‡……„‚~~}}{ywurnolid`dhllnvponqqquwnmiifffdcb^ZYURMJKKMIA86544445444444554444444444469=?>?>@ABBDDDDDB@@?>=<;:9888779<@DCB?<:876666777666666776666667666655554444<:9876655445678:;=?AAAAAA@AA@@><;:987655444444454456975545444444444444444444444457<:8789;>@@><:876667776666667777677767676665555444:98766655445678:<=@AAAAAAAAA@@@=<;9876555444444555568;>AEFFEGHHFFGFHHGHIHHGHHGDBA>;8665444443433443444343434444443444444444444457>CGLOTXZ]^YKA<:99??CMY\\\[XVURPMKMOPOKGEDA=::99:;=><;877667677777677777777777776666555444;99866654545679:<>@A@@AAAA@ABA@><;:876654444444455668;>BDHGEEGFFFHHHGHFHIIGGEECA?=:86544443434444444344443444444444444455566544458>EHKPVZ^^ZPD>;98;BGLRZ\]begjnnmponquvz~ƒ†ˆˆŠ‹‰‹Ž‘”’–˜™—š—š�� žœ�ž¢£ ŸŸž›œžš››œ——”�‹Šƒ‡‹�ŒŒ‹‰Šˆ‰ˆˆˆ‰�‹‰Œ‹‰ˆ…ˆ‡ŠŒˆŒ�Œ���‘�ŽŽŒ���’“‘�‘—’•”‘’�‰‰‹‰†‡‰ˆ……‡‡ˆ˜”І……ˆ‚|||Œ��wqomnlkmieaadeehghkkiigheeddeda`^ZVVSNJJLKG@9655555445454444454444444444557;:99:;<:987777777777777777777777777666555544:98776544445678:<>ABABAABAAABA??=;:976655444444445568;=ACGGEEGFGFFGHHFEGGGFEDCA?=;9755444443333334343344334444434444455678:;8654447>EIMQVXZ[UG?;98:?FKPW\\`bfhmonlnmruvz~}€„…‡Š‰‡‡�’“–•—˜–™”•˜›š™››š›™™š™šš™š–™ššš””މ„}‚‰Œ�Œ‰Œ‰‰‹‰Œ‰‰‹‹ŒŽ�‹Š‰‹‰ŠŒ�‹��Œ‘‘��ŽŽ‘Ž�“”’“”’”””—”’“‘‹‰‹‰„„†‡‡…ˆ††‰‡„„�~|}{z|}|uusqojjjjnnieadcefegjifhgfedffeda^]YXUQLKMNJF?75554444444444444444454444454469=?AM[`^ZVOLIGGDBFKNOPNMKIGECA><;99:9987777777777777777777877767676655544988766554445678:FHLORVYVK@<:99?GJPSYZ_bfhlknlmoqtsw}��ƒ„…‡ˆ†Œ’�”–••””�‘”šœž››—•—˜›•’’•–—˜˜˜–““�‡€†ŠŽ��‹‰†ˆŠŠ‹ŠŠ‰Ž����ŽŒ‹ˆŒ‹‹‹��Ž�����Ž���‘“‘’‘‘”“––’”–�‹‰ˆ‡††…ƒ…………‡‚‚�~|}}|zxzyvtrplhgggjlojhbbdeecefgedeeedfgfda`\XXTNKKLLIE<655544444444444544444444444454569>@HNQOKHB><<;;:;?BCEECCCBCBBA?<::98887777777777777777777777776676655554987766554455679:=?AABAABBBCBBAA?><;9876555454555445679??=<;:9988777777777777777777777766676555555887656544445789;=?@ABAABBBACCAA@><:987765555554555567:;>BFGEEFFFDCDDCBCBBCA@?=;987654444444444433334444443445444444468;BKLF>96544444568>CILOPLC;988:GHJOSX[_ceffmomkopuwy~~�ƒ„…††‡‹����’““’‘��”••——˜•“•˜˜”‘—š˜•”’“‘‹ˆ„‡‹Š�Š‰Š‰ŠŠ�Ž�Œ‹Œ��Ž�Œ‰‹ŠŠ‹ˆ‡‰Œ‹���‘“‘’‘Ž��‘”—–”“––””—”��Šˆ‰‡ˆ†„…„…}€~|{|}{vvyuvqlfdbbdiiljjccffdeedgecdcceeffdb`\YWQMKMLJG?7555544444444444544444444444444446;@@?<976655555556666656666789::;;:988877777777777777777778777767665555587766555545578:;=?AAAAABBAAABBA@@=;:976555455555555569;>AEGEDFFECCCCBAA@A@??=;9866544444443433434334333344456544444569@KPH>85567877555579>DGHG?:8766>FLNRVZ]aedchlllpqvwx}€€„…‡……ˆ��Ž�Š�ŽŽ���‘•—–—•—“‘––—“�“–’‘‘•’�Šƒy€ˆ‡ŒŽ�ŒŠ‹Š‰ŒŽŽ����Ž�Ž�ŽŠ‹ŠŠŠ‰‡‹�‹��’”‘‘Ž���‘—™›———–””••”Ž�‰Š‡‡ˆ‡…€‚‚}|€|{}{}{yvuqpmkecacfjjljgdcfhihfhfggefdeefebaa\ZVQLLLLJE<76555444444445444444444444444444458=>=:86676666766697666656666677899988887877777777776777777777776665555587655544445578:ADFEEDFECBABA@@??>=;;9876554444334343343444444444467764444467?BBABCCBABBBBAA?=;9976655555555544578:=@CFEEEEDBA@??><<<=;:98765444444434333434444434444578865444468>IOF:66679;;:988::97544444544445=EJNQUX\abdgiikrvtvwzz}ƒ‡‡…†……‡‡ˆƒ�…‰Œ‹ˆŠŒ�‘�������’“��‘’’�‹‡…ƒ{|†Œ‰Šˆ‰�ŠˆŠ‰‹Œ��Ž‹Œ�Œ�Œ‹†‰‹‹‹Œ‹‰ŒŽ�‘‘‘‘•‘‘”–šž œ—–˜—˜•”•’�‹‡…‚‚†‡„‚€€}}~€}wxxusurmlfbbb^^behkkkolkjjlnmnlihihhggedc`[WRMKLOLH@8555455544444444444444444444454444458<=<::;===<<;;:98889:999887777777666777777777778777778777777777666555476655444444679:<>@BBBBBBBABABB@@?=;:877655555555555569:<@CEEDCDBA?>=<<;;::9886655544444334343434444443444467754444469AJJ>75667776667;>=;97544443444449@ELOSY\]_bfhimqsuuxwz{�„ƒ……„ƒƒ„ƒ…†ŠŒˆ†‰ŒŒŒŠ��‹‹ŽŽ�’““�Ž��Š‚„y†‹‹ŠˆŠ�Ї‡ˆˆ‹Œ‹ŒŒ�‹ŒŒ‡‹Œ‹Š‰Œ�І��‘‘‘“””’’”–•˜�š•••–—–š›˜Žˆƒ„ƒ�ƒ„‚��‚€~}{~{wuwrpppiie```a^_diomoronoonpqqpmhilkhggeb^ZVRNLLMKF<6555545444444444444444444444444444457;?><=>>>==<<;:::99:;;;:999998877776666777877777777777777777777666655576655444445678:<>@ABBBBBABBAA@@?=<:98765555565665555689??<8544444344446>CJMQWZZ]acdhloquuyw{{{€�„ƒ‚�……‡†‡ŒŒˆ‡‡ŠŠ‹‹ŽŒŠ���‘‘�’�‰ŠŠ…„€xy€‡‹‰ŠŠ‡‰‰……‡ŠŠ�‹‹‹‹ŠŠ‡‡‰�‹‹‹�Œ‹ˆŒŒ�’””‘�‘”“•“•›™–”“——–�¡˜‹‰‡„‚�€ƒ�}~{|xvvuurqokhifdba_`_^bhotruurqqusrqrrpmlmmiifc_\XTPMLMKHC955444554444444444444444444444444444569==============<<;;;<<<<<;:::988776666777778888888777777777776666555566655544455679:ADCCAA?=;::987777765554443444443343333464444444444444444456=HKB86656567;CE@=>?@?:644434444444765554554545444444444444444444444444458<>=<<=?@AABCBA@>===>?@@?>=>=;99987766677777778777877777777777776665566554454445689;=?BABABCBBAABA@?>><:98766555555556665678;=@DCBA@><:98777666655444444444343444344554444444445544444447?KK@8655679@AB@<6444444444448>DJOQXXZ^acfjkpqrtuvvz|}~€‚‚…†…†Š‰ŠŒŒ‰‰ŒŒŠŒŒ�Œ‹���‹‰‡‡†„ƒ€{rz‚„……„�‚ƒ„ˆ†„‡‡‡‡ˆŠ‡‡‚ƒ„‡ˆ‰�Ž‹‹ŠŒˆŠŽŒ’–“’““““•““”•—š˜–™˜�އ‚~}}{xxyxxxvtrqqnlkifdacda_]\\]bhotzz|~|yyzywuuurpmnmihgb^YVSNNOOLE;655445554444544444444444444444444444456:=>?@ADEEGGFDB@?>>?@ABB@?>>=<::988877777777778888888878888888777675666554444456789<>@ABCCBACBBAA@@?>=<:97765555455555555568:<@BB@?><:987665555544444344334343334344454444445677776554458BOJ?86579=AJV_XG?@AB@;6544444444346@DFGFEEEBB?=<==>@@@@?>==<<::998877787776787788989999999999877766565444444445789;=?BCCBBBCBCBAA@??>D:87765555445556555568:;>@@?=<;977665555544444444443334334444334454457:=<;<<;865458ERK>977=FQYaeaTEAAAA@;6544443444435;BGLPRVVZZ\beggjmonrsx|{}~�„„…††‡‰ˆ…‡ŒŠ‹�ˆˆŠŠ‹Œ‹‡†Š‹†…�xsx|ƒƒƒ„ƒ�‚‚‚………ƒ……ƒ†„‡‰ˆˆˆ‡‡‹�‹‡†ˆ†„„†‰‹–˜”–š�˜•”“��‘“�ˆ„�{rmhggfebccccb_]\\\YYXWURRTOPILSZelv}}€‚ƒ‚€}}}zzzwtsrpkkfe`]ZVQNNOLF=7557;654444444444454444444444444444444447;?@CDDB@>>==<;;;:;<<=<=<<<;;::::9987777766777779999:::;:::::99876666555444455678:<>@BBCCBBBAABAA@@?=;:877655554555555555679:=??><;977654544444444443444444433333433445456;<<<<>??=:766:GSK?99BSfqsum]MB@@ABB<64444443444447>DHOQSUVY\_chhhkmpuuwzz|€�‚‚ƒ…ˆ‰‰‰‰‰Š‹‹†‰‰‹Œ‹‹ˆ‡ŒŠ…€‚~xsmx~€~�~ƒ€~†ˆ„ƒ‡…‡†‹‰‡†††††‰‰……†„„…„„‰�•’”—–•“•™’���ƒypnifb]]][YXVUSSQQOOPOMMMLKGEGIKFDQ^krz€��‚ƒƒ��‚�}~{vtsrpnlifd`\WTPPPMKD:65555544444444444454444444444444454444456:=?@?>=<<<<<<<<;;:;;<==>==<;;;;::88888876777767789:;;;;<;<;;;:987666555444445578;<>@BCBCCBBBAAA@??><;:987655654555565555679:;=>=;9866544444444444444343344433433433345557876669;>?<:87:ERL@:AXo€‡„~nUD>?@@BA<75443444444345BIKLIEScmsz~�ƒ„„…�€~~{xvusrpmlhdb_\VRQOPLHC:555545445444444444444444444444444444444469<==<<==>=>>>==<;<<=>>>?==<;:9:99887888877766667899:;<<=====<;:87766655444445579:=<;9876559755555565556789;;<;:876654444444434344333333333333344344454544444569;<<;::CPMA@Qk|‡ŒŠƒoQ@=?@@BB<744444344344459?DIOPRRTY\]`cdhjlouutxyzzzz|�‚…‡‡‡†……ƒ…†ˆ‰‡†ƒ��…‚�€~}yunqx{zzy{z{}|||€‚…ƒ‚‚„„„��„„‚€‚ƒ‚‚�~||yz{xvzwy|zxyurplfb^[[YWXVSRUSRZfg`ZRLKMKLY_]QB?DJMNLHWeovx}ƒƒ€‚ƒ}}{zyxurpmkiheb]YTQPPPJE=7555545445444445544444444444444444444444458<=>=>??>>=<;;::::;====<:::9877777667778777766677789:;<>>>=>==<98766655444445689;=?ACCBCDCBBBA@@?>==<;98866665555556655566789:::97655444444444444444444334443443334444444444444557::::;ANNEK`t€†ˆŒƒmO@>?@AAA<754444444444457>DGMOPRSUZ\^bafhintuuwxxvz}}~�‚ƒ„ƒ‚„‚�ƒ…‡‡‚����€€~}|ztokrxyvvvvuw{|{}~€€„ƒ�€€~€€€~€|xwtmmkmiecefdceb__^\[YUTSTW]eorlX[a^VQPONNNO[a]SE?DJLNMKZiryx|ƒƒ�„�}}}zxvtomlifb_\VTRPPNIA96554555444444444554544444444444444444444457;=>??>=;;:9887778999:987787766666666777777777776779:<=>??@??><:9876555444445779;=?ABBBBBBBAAA@??>>=<;98776665555556666566788998866544444443444433334444433333444444444444444444456778:>HOLSeox{||s`H>>@AABA=754444344444446?CEJQSQPRXZ[`abfhklpqusuwyz}}~~~€€��€€‚ƒ‡ƒ€ƒƒƒ��~|xtrkjrwwvurssvyxzy}|}~‚�~}}}}~zz{z{{tqokdaa_^^\[[ZZZ[ZZZYYWUV_n|…Ž�Šz]QSURQQQQRPakcaVE?CILOMO\luzx}ƒ‚††‚€~}~|xvutqljfb_\USPOOLG=766555444544444455555444444444444444444444469<=<;:9877666666677776666778777777777776677777777789:==?@@@@?=;997655544544567:;=?BBBBBBBBA@@@?>>>=<;9977666555565566555667889766654454444344444444433333433333444444444444444444445679BLNS[]ccbdZPD=<@ABBB=754444444344445=BGLRVURSVW[\^^`cgjkppqtxyy|{z{~�‚€‚„…‚€~�‚‚‚‚}}xsojluwtssrrsttstxyzz€~~{{{{z{{wwvurpgb^\ZXXVVWVVVWWXYYYXXY^l}ˆ‘”•™—‘€]TUUTRRRRQPaxebXG@BINPPVcnw|}€€‚„ƒ…ƒƒ‚{yxvtrojgda^YUSPPNJB:655555445544444445554444444444444444444444558<;:87666766667667767778899;;=>>>>>=:8766677777778889;=?@@EA@><:986555444445679;=?BBBABAAA@@@A??>===<;987776665555566665667877665554474444333444334443333333443434344444434344444444455:GNMKGGGIKLIC<<>@BBA<6554444444444348?DJNRUVSRUZ\Z[[^dgikopquvuxx{|}€‚�{{‚€€€~€}{zyvrnllturoonlnonrsuuuw||{xxxvvvturmfb]YWTSRPNOOPRSUWY\^bgdYSl…‘˜š›œžœ•�aVUWUSTQTROP]acXG?CINQU\frz~~}}�ƒ†ƒ„†‚ƒ{yyusokiec`^WUSQOMG=7555555444444454444446544444444444444444444457::8666677889::99999:<=?ABEHJMQPPNMKF@<98777777777888:><<:9877766665565566566676666566444444433444444433334443444444444344334444344444444445>>?BEFA:;>ABCB<6544444444444445;AEJPTUVTTXY[\\Z]aelmmqsuvwwzyz|€}{~}€}~~~€|}{zwutqmnqxupnlmkioloruusvxyywvrqpplke_XTSQQPNQUSUZdr{~ƒƒ†‹ŽŠ‚]?WŠ›ž œ›�š�v\WWWVTURSSPMYa_UF?BINT[dlsw{~‚ƒ‚‚„„‚€}zzxuqoligc]ZWVTPNJB965554545444554444444444444444444444444444445469:8778:;=?BDFDC@?ABEINQTWZ[^bcb`_^ZUNHB>;98777677888:;=?>@@@>=:876555444445689;=?AAA@@@A????>>>==<<;:9988776566565665656665566555444444444444444334433433444443344444444444444444444444689:<<;;<>@<8:>ABDB<65544444434434449AEHLRRTTTVVWY[YZabffklmorsuwyxy{|{y|{}~z||~}}{ywtmlhkqutnmjkjinlnqqprrqusqsmlid\ZUQOMNU_hlkkc\e}ˆ‘•š˜››ž�’j?G™�œš—”Šu_WWWYWSSTTSOTY_^TD?CLRZajrsw{|~ƒ‚�‚…ƒ�}yxutqmjie`[YUURPMG=755554544444444444444444444444444444444444444468:;;>@DHMQVXZVRNMQVY^cgglnnppnmkggc^WRNHA=;9876677789::;<<>?><:876555444445679;=>?@A@@@@>>>>>>>==<;;:99886666555555555566555765455444344444344333344444444444444444334444434444444444444557:;97678879>@BCB;64444444433444447?DFIMPSSSWWVYYYZ^`cdghijmpqqsuxzz}|z|~z|||{xxwvutolknosqmjihiljkmpoprqoollheaYUSQNKGPeyƒŠŒ‰‚uXQƒ“šŸ¡Ÿ ¢¤£™rCBf�“Œ…}rcXWWVVXVTTTSSToh_\QC>EMW`hoqrw{|�ƒƒƒƒ„ƒ��|}yxwrpolic^ZXVTROJC:655555544444444444444444444444544444444444544459>DHNSX\bfilkga][bimostuvvwvtoolhfc^XTQNHD?=:988877778999:<==<:876655554445689;>>==<<=<<;;;;::8876655555555545665555544544444444343434444444444444444434444444444344444444444444457875445558=?ABA;64444444443344445>>>>?>====<<<;;;::9:988766555554445555555544444444443444443444344444444344444344444444444443444444444444445654444447<@ABB=754544444444443347?DILNPQSUUUWYXXX[^`befhijmloptvvuwwuvyvvvsuwzysrnnknqqtumiggeeglhghgba`ZVROLJJJJE?==?^{…�”—�oE>Y‹œ£¦£¢Ÿ›•ˆjONRUVVUSSSVUVUWVWUSTQNMU\\WJ?@KS^muwvwyz|~�€€‚„|}z{xrnmmib^[ZXTSPJB:655554444444444455555544454444454444444444444445:K_mrtuyxwuutpjcciswwwspmhhca\YTQNMJGEEFFEDCA@???><::9877788998776554444455679;<=>>>=>==<<<;;;;::9999877765555555444454455555444434343333444444444444344444443444444444444444444444444444444444444446<>@@@>854444444333444445;BJNQRSTTVUVXWVVXZ]aeffhhijmprtssstuvwxwvssuxwtqolkpqouvnkgedddgddb_ZURNLKJJMONMKFBABHapy„„uR@?Gp�˜›š™�raWRRSTTUTUTUUTUTSTTUSTRMMX\[UH>BMWdqu{xzyz~~~�~€ƒ€|yxwupokgb^[ZVRQMH>75555444444444444444444444444444444444444444444459Lfvxxvuuqpmkfa\\bhmliea^XURPMJHFDDBB@???@@@??@@BB@@?>=<9877777775546544445669:<<=====<<;;;::99998887777765555554455554544444444433444344444444444443444444444444444444444444444444444444444444444446=@A@?=8554444444433434449@HMORUWVUVUVXXVWZ[_cdcdfgikopqooooqsstssuspttqqonmoqsvunghfedcaab\WPLKIJKMMNPPQPMKLLLOTVZ[leLYOThuywk_YVUSTTSTTUUTVUTTUTUTTSSSPKMW[\SD?FOZhrwzywx|~}||~~}zyxvsspolfb`\YUQOLF965555544445555444444444444444444444444444444444458Kervspkhe`^[VTPOTX\\XROLJIIGEEEECBA@?>>=======>@ABBCCCB><98777665554444445668:;<;<<<;;;:::9998887777666555454544454444454444444434444344444444444444444444444444444444545555544444444444444444444446:?@AA>8544444444434443446?HLOORVVXVUVWZXWWZ\\^`bccdfjmnprqqonpssrrsrpsoponqqrswunigfddb_^ZROMIHJMNOQQQPQTSQSUTTVWY`{pw{c_aa\ZVUTSTTTTSSTTTUUVTTSSTTTTRRRKMUYYMA?IR^luz|zy{||{{{}||zwwvutqomiea][XSPOI?755555444444444444444444444444444444444465444544457H^jhf`ZWSPMKIHFEHKNMJIHHGEEEDDCBBBA?>>><;;;;:;<<=?@BEGHDA>;977765444444445567::;;;;;:::9998877776666665555555444444444444444444334444444444444444444444444444444565566888988764444444444444444444446;?ABA?95544444444333334449CHNQOTWXWWVWZXXWWYZ[\``_beggimommnooqrsqqommkmlnprrrwupkiged`]ZPQ[YKIMNOPRQRSRTUUVWYYZ[\j�Œq„�{b_b\VSSUUTUTTSTTTUTTSSTTRRRQQOLJOUYVI?@LUbmuxyvyz{y{z{}||{ywwwupmnjfd_ZWWSMKD:655444544444444444444444444444444444444444444444457BSZVTOLJIHGGFDDBDEGHHGFFFEDDDBA@@?>><=<;99999:9;:<=?@DGFEB?<:88754444444456678:::::99998877777766665555454555444444444444444444444444444444444443444444444444456999;<<>====<:85544444444444444444446<@BBA?95544444444443334445DR`iovyxv{{{z|~}|{~zzxxvuqolhdb_ZWUQLK@8555554444444444444444444444444444444444444444444446>HKIGHGFGEEGEECBBCFFFFFFFDCBA?=<;:::99887677788999:;<:7544444444455566654445:?BBA?965444444444444444448AIMPQUWWYXUUYY[XWYXZ\\]_acdggfhkloomoomljmknporvuotx{soonia[TOKGPaXKNNNPRRSUVYWXW[]]_ck��qbad_e_Z\\WUUVVUUUUUUWVVUSSRQQRQONLIKPUXPB?HVdnxz{xx}}|}ƒ€€}|zzyvvtqnifd`\XUROJD;6554554454444444444444444444444444444444444444444556;BFFGGGFEFFEEDBAACDEECDBA?>=;;9777666655555556667789:;<=?@AAA@>;44444444455567788887777666655554554444454456544443444444444444444444344444444444444444444568:=@BBCDCCAABBB@?>=;7554444455899:99766558?BB@?:65444444443444334445>?@@?>=<:988766555545454555555555667789:;<>?ACB?554444444556667777776655555454544444445445555444433344554444444443444444444444444444444558>>=<;:98657EQYeoywvwwz{|}~~€|{y{{{vrnkifb_ZVQNKD:65545444444444444444444444444444444444444444444444445;BDDDCCA@@?><;:9:::99987665555444444444455454444555557789:;<>@AA4544444445555666666666575554444444444454444434444444456654444444444344555544444444454557:>BDFFFHIHFHJNSW\_]^^YMC;76668:>=:8656=;:9987666666665555554555454445554444455544554555789::;=>?55444444565555666655555855444444444555554444444444445897544444444444566787665556666789;>@BDEHHGJKMRW]flprusqkeYLB<:;8544444444444434344446?FKQSVY\\\\Z]][[[Y[ZYXZ^]ababfhggjlopssutwx{||yv|}{yxxwvpbVVURMXg`VNOPRRTTUWWWZWYXY\k…jd^_\_fgde~‡w^XYYVUUUTUSRRRPONMMJIFEEKKGC>ALXbqxuvx|}~}�~~~}~}~|wsnmhec_]YUOJD;6555454554444454444544444554444444444444444444444444558<<:98766665555555555555555544445544444445445544445445556689:;<=55444444444445555555555444444443433456555443334443457::86554455544568:<<::998899::;<=>@ABCEFIHJOU`jqrw}}|}{vpg^TJ@>@ACCCBCFLUZ\]SI?879>@@@?85444444444444444343448BIMOSX[\][Z\\\\[\ZZZYZ]]\]^_cfffinpqrsvswy}}}}{}}|xwzztkYVWRMPce\OLOQRSTTUWVUUWXW^x‚f†wdk‰€xy}uue\XXVUTUTTUTQROMLLKHFDBBHGEA>DNWdtwwvw{z}~}€€€€}|~{wsnmhfc^ZURNI?765554455444444444444444444444444444444444444444444444598766554555555545544455554554445444554444444555545454545556789:;55544444554445455544544444444443444447654445444444457;<:765446667778;>==<==<=<;<<==>@AAAADGILPXcnw�€~€�}ytne[WTLD@BCCEFHLU_jqpmf[L>89=@@B@:6555444444444444434444:EIPRUZ[]]\]^__]^]\Z[[\\Z]]`ccfgikmqsttuy{�~|€€~||yx|~{rdYYUPL[c^TMORRQRSUUUTXWY[fwhj‹Žp~†Š�u‰—ue_ZXVUTTUSSSSQPNLLKIFDBAACDE@>ISYivtuwwz}~~�ƒ�€�}~€|{wsolhda]XSOKD;6555444444444444444444444444444444444444444444444444446655444445545555544444454445444444544445444444555544444444565678954544444444444444444444444444433344345654444444445557:;:978767:;;:::;??ADFGGEDB@?>>@@BAACFMU_hpy~�…„ƒ{vncZTMGEEEEDCEHKQW^hoxzzwncUG=;>?@CB;65444444444444444443445><;=@@??><;?CQZ]]^WTOIDB@BCEEFIR\ju|�€�€|zraWNF@><:9:<@EKQX]gmrvxwwrpg]UMC>>ABCC>854444444444444434434446?JMTVZ[Z[^^^^````__^_][[[\]adhlnqsuwz|~‚ƒƒ€‚‚�~|{|‚‚~vmf`XRNXb_WLMQRSSTSTWWWYYZ[^gh\`a]][[_[YWVUTUUSRSRQPOMMKKIGFFFEC>BFB?FRWcusrvwxy}{{}~~~~}||{uqnlid^YUOKF@:6555445544445444445444444454444444444554444444444444455544445454445454455444444544444455445554444444544444554544455555555544444444444444444444434434333443344445444458987655568;>ABCCCB@ABABEOgomlh_YSJC>==?BEGNZfr~�€}yyribTFA>;87666669CThruz~zutoeZUOJHJIC?ABCC?8544454444444444343444446AJPSXZZ\]]^]]_`aa````^][[Z`ehhmrtsxx|‚�‚„ƒ†……€~}€���€xuoe[URPZ_]TLORRSSTUTVX[ZXYZ\\Y[\ZZWXXXVUTTSTRPQQQPNNMLJIHGFHIID>DE?AMV[iunqyz{~€}z}€||~}zvurmlgb]ZSNHFD:65455544454444444444444444444444544444454444444444455544544444544445555444445454444454445544544444444444445445545554455554444444444444443344444444443343333444576557>ILF=:765567:>CGFDDDELSYY\otpkaSGC>:77789<>CLZepvuqicVKE@<:9766555666=Vo}‚†ƒwicXJ@><;<@HHC@ABC@96544444444544444443344448BJPUWYY[[]^aaabcbcbbc_\ZZ]adgkoruxz}‚�~ƒ„†ˆ†ƒƒƒ€�ƒ��}|vneYVRO[`\RNPRSTTTTVWXYWW[[XXWY[YVUTTSSSSSSQOOOOVNOLJHGFFHJNKD@EB?FQZ_iqmtzyz{~~|z{|~|yz}|yutqmjd_]WQKGJG:654545544445444444444444444444444444444444444444444454454445444445555444444444454444454455544544444554444454454455544445555554544444444433343333334443434343444555:GVdc[LA<8665679?EGGFFObknmhjkeZKA;9765556889:=CJR[YRLF@=;8776666667777:Om~„„}nYLC<987778AGCA@ADB;65444444444444444434333458BJOVXX[\`__`a`abfedefc\[\^cfjoqtz}~€€…‡ˆ‡………ƒ€‚}}xyy{p`]XRR[_Z[SPQRTTUTTUVUVWXUVUUZUUTUTSSRSRRPOOOOPNMKIHGHGKNOKBAD?AKR[`glowxxy{||{z}}}{yzxwtrplhb\XTNJKQJ:655555444544444444444444444444444444444554444444444444444444444454455544444444444554444445444445444444444444444455455545554444444444444444434444434443333343444569EXiqpndTE=:75557:@FKKJXkrvupe[QD=976656799;::999;>@><;;:876666789;<==<;:C[p{ugXF=:8665556:BC?>AA?;65444444444454444444444444:DJOSVZ\^^_aabddcdfghhd_]^bgkorrvxz{‚„„‡‡†‡…ƒƒ‚�~|}}z}�ujf^VQT]]`UPPPRTTSRRSWVUUTSSV]TSSSTSSRRRRPOONMMNMIHHJLLLPPJBA@?GOSYcknsywzxx||}z}~}}xxyyxtrpke_YWRLHSYN<65555555455444445444444444444444444444544444444544444444455444445554444544444444544445445544444444454445455544455555444555544444444444444434344443444333333333458>HUesxwukWE>:766669?GJKXhostn]KA<976679;=>><;;::::::97766667679FS]VKB<8766566667:>>?A??<755444444444444444444444445GLQamh`TG>98767:>BBA?=<=>A@?>=<:9776778:=?BEEEEC@??>==>?><9776679;;;:88:<>@@B@8544544444445444444444444446=HMQV\]^_`_bddfhjlkqqjdbdfjkmpswz{{„†…‚…ƒ…ˆ‡†ƒ�~€€‚€€€yse^ZTQX]^RMMMPPPOQQQQRPPQQPQQQQQPQQPPOPONMMMLKHILMMPOLLKE=>AINRUZ]fpv||{yxzwwy~|{zxwxsspifa\VSNJT_`R<7555555455554444444444444444444444444444544444444444444444444545555444544444445444444444444444444444556554444454555444555544444444444444344433444443433443343449@CDHOarx{wm]OE@=;:7669@HMX`VH>;87668;AEFB?=>AEJMKHFB@@=:99:;=>ABBB@@@@??@>=;977776679=@AAA>;99;=@@A?96544444444445544444444443446>GMRWY[\^_bacdehlnnomkfcdhknnruvuy~‚ƒ„‚„ˆ‡…‚€‚‚�����|wtl^WSQWXTNJJKMNNPPQPQPPOOOPNOOPPOPOONNNNNMKN_OQSONPNLLF?<@HMOSX]ahnux{{xx{xuw}{~|wwwsoqnfd_]WPKR]edS<755554555555454444544444454444454444455444444444444444555444555544555454454544444444444444444555444555655555555455554445555444444444444444444343334333334334444697679@JOQF<976557@@???@ACDFHGC=:766679=:8:=??@?;65444444444444444444444444446>FNTUXZ]_`bcdfgimllmnjfgilpptvwx{€€€…†ƒƒ‡ˆ„†„„„ƒƒƒ€�€€~zpcZUQSVSNKEHJKLLNNNNOOONMNNMMMNMNNMMNLLKHEKhVVZSOMKKH@=>EKOSTY]biry|yyxxyyuyz{zyvusqmpkdb^ZRMO`iokV>765555554544444544444444444444444444444454444554444444445554444444454555444454444544444444454544445544555455455554544445555444444444434434443433334443434443444579:?FJRbrzuj^_c_QD>:7678?GG?:76678;DIFA???ACBBBAA@?>?=;:::::<<>?@ADINRRRSRKB<989:=ADCDA>>=<<:99<>@@>:654444444444454444444543444447>ELPUYZ]__bdfhjjkomlhjkjlmmqrxy|‚ƒ…ˆ‡€‚†‡…††„†„‚���}|xqnf\VSQRSPLCACEHIKLLMLNNMMLLLLLMMMKLMLKJGDDKRRVZSOMJF@=@FKMPSTWZahmuyvvxxyyw{zy{{vuuqmlffb]WPK\ovxr\@7655555554445444444444454444445444444444444457754444445544554444455444454544445555544445445455544455444445555555545544555554444444444433344333333333434444444444557E@:777;@ABFB>?A?===>@@ABBBB@>=;:::;<>AGKNSWVQNNKHA=;=@BEGEBA??@@?>;98;=?>>;7544444444444444444444444444447?GLQUWY\\^abegkllmljjjjmklpsw|}€�ƒ……„ƒ†‰‰ˆ†…†…„‚ƒ�~yuqoqaVSPR`\LCACEEFGIJKMMMNMMNMLKJKJJKKKLKJJMQUXXSMKD?>BGKNNPTYY\gnuwwvxyvxx{zz{€xutqpmljd^YTMTn}~yt`A76555554544444444444444444444444444444444444444444444445554444444455444444444444455444445555454554545455554555544554445554544444444444444444344344443344444444445558@EILU`dbbehmqm[JA;8778=@;89=<>ADFFHHJIFEDB><::;=AGLKKIGDAA@>=<FMRUXYZZ^bdefhhlmljigikoqrwz{}‚ƒƒ„„…‡‰‡††ˆ‡…„„ƒ�}ytqƒy`VSO[`YOHJMLGEFFHIJLLLKLIHGGFGJMSWRPONQTWYUOHC?@EHKOPOPUZ\dkt{|usrtuyxxz{~€xuponnjfa]WONd|‡€ztaB75555554444444444444444444444444444444444544444444444454444544444554444454545454544455555555555555766555555554555544454555544544444434444343433434444444444444445556:BILMPTXafiprun_RB;8768:<;?CC@?>>@IOE>?@AEIJJIKKLIFFF@=<;::<>@????@??>=<;;>@ABA@ACIOUVSOKD=;<>@??;75444444444444444444444444444556>FNRTXWX[adcdhgikonkhimqrvvy{{~‚„„‡ˆˆŠ‡‡‡……ˆ‡…†‡…€~|wt|…w[URQUYVOLPTOLKLLJJLNOaYHGGGGMTVVWSPNPSTUTME@@CHJKMPRRRV]`fowy{wrqtwvtwzwxzztrpolhdb\TNXt‡‰…~ycB76555555544444544444444444444444444445444444444444444445444444444445454445555455455555556666777778:::9887766655544444455555444444444434444443444444443444444444445446;BGJJKOXemruwwtjSB:7678:=BFB@?ACGPLAADAABDGFEDCC@>>>;9:989:;;;<>@AABA@><;<>@BDGJNSQPMGECB><<>>@B?854444444444444444444444444444346>FMRTVWY^babfhffhkmklmnqruy|y{ƒ…†‡‰‰…†…†…„…‡‡……ƒ€}zwv~‚gZUQNS[XNNSRPQTWROQTYgbTPONMPUUVYTPONPRQKC@CGIKLNQRTQSWZ_isxyyvrrtvvswzwwwtqonlifb]XRUqˆŽŒ††€gC7655555555544444544444444444444444444444544444444444445444444444444445555455555555567778:;;;;<:99=?A@?>==<:98776555444455444444444443333343444434444444444444445555557>DHHHIOZempvz{xiQ@:76679=BA@BISNHC@CC>;:;<;::98877767666789:;=?AA@?@@?><>AFLQXZTMFCA?>==<;:?AAAAB@>=BJTVK@>AE?976666666666666666556778;;<<;:;::;;=CMTX[VLC?>?@>=<:9:=??A?:6544444444444444444444454444444446=EKOQSVW[]`abcdfiilkmmptvxww{}�ƒ„……ŠŒˆ‡‰‡‡ˆ……„ƒ�€}xsq{oaXSPOW]YNMTUX[\YZ`a\\`_ZXUSRQUVPNLJFCADHJLMMOPSRSSTWZ^cszwvwurtuuuux{z|wtrmljeb]WPUr‰›˜”‘“ŒoF866655555554445455444444444444444444444444444444444454444555554454455555667789:;<=?@@BDDEFEDEC@>@BDGFFEEFFDCA@?<:876655554444444444444444444333444444444444444444444446:@EHHGJJJPYagsupdRB:77777;GVSHB><@B:76566667777888888887666667777666677:>FJJKHB@?ACCA@>;99<>?B@;64444444444444444444444444444444445;CILORUW\_^_ddcfghikjossuv{}|�…‡†…†‡‡‰‰ˆˆ‡……†ƒ‚~~|xrmrjaWRPMPWSLQUY\]\\ab_]]`][XVTRPQMKGDBCGJKMOPPRTVTTUUX\ajz{xttrrsrttuwwywurqmlhd_YSPd‘˜™––•�sI8655555554555444444444444444454544444444444444444544445444445555566777789:;=>>?ABCDDEFFGFFFFDD@@DGJJJHGGHFFEDBA?>=;976655554444444444343334443334344444444444444444444559>EIHKHEFJNUblqofVB:87779JVH@@?=?=8667::99;<======>>>=<;976665666666567:>A@BA@ACDFCAA?>;:@ABDDDDFFFGGFFGHGHGEDCELUXXVRNLJGEEECBBA?><;97554444443443443333444443444444443444444444444444557;BHKGDDEHKR[fpql\B99877?E@?BC@<9767:?CB@BDEFIHFEFIIGFEB><:877889997678<@ABCEFEC@><<<<::<>?@A?85544444444444444444444444444443444459AHKMQVX[\]^^`adfijjopruwvz}€„„„ƒ†‰Œˆ†ˆ…‚„„‡ƒ�€{ywrjjnb[TQOMJKKQV\]^YYWY[[ZXUTTQPJCCEHJLMOPPQRUTSWWVWWX_cmvxvttolrsttuuwvuvvpnihe`YPSlƒ“™�žœ™š�rH9655555544554444444444444444444444444444444444444554455567899;=>AABA@@@@CCDFEEFEFHHGIHIIIIJIGFFMYdklid`ZVPMKHFDDBB@?=;95554544444444444334443444444444444544444444444445556;AECDFFFHJMUds{w[A;:878:=ADB=8667;CS`[RS_fhomihhikkhea[SIB??@A@A@<988;AEGHHFC>:87777789?>@@BCCCCCBBBBEGGHHGGHIHKLNQUTVTTRQMMSbt|{zusnib_[WQKHEDBA>=<555544444444433444444444444444444444444444444444545569>ACDEEEGIHSj}‚w]C;;977:@C>87569BWnxvljyˆˆŠ‡†„„…„‰‡…ƒvj_WUWVVWSIA=99=BECCA<9766655567:?A@?<754444444444444444444444444444444444458>EJORRUX[]^``ccfeglooqux}�ƒ…‡†…ˆˆ„†…„…„„„�}|yuvohegeaYSONLLJJIJKLNMLLLKKIHGFGIKMNPPRTRSV]g]ZYVTXYW\gpvxwvuqpopttrsvwvvsqmlhc`YRUn†–ž  ŸŸž›�kF8655556544444444444444445444444444444444444444444444459?BCDCCCDFFFDBCCCDGJJLLNOQRUZ\^dghhhfa^XSYhw‚�„ƒ}zusnia[URMHFCA>5554444444444434455555566656665555554544444444444444569>CDCDDIIEI^y‡…yZA=<:88<>96678>Qo~�„€u€�•’�‹ˆ‰‹Š��‘�ŽŠ‚|vtvurplbWL?99<=;:9766666665569=@B@=8544444444444444444444444444444444444447=CHMNQTWYZ^]beddehlmqty}~€ƒ…‡‡ˆˆˆ‰‰‰†…†……ƒ|{yyvofbcdaXSONLLKKJIIIIIJJJJIKLKLMPPQRRUZYafa]WYZWWYVYbltxyzwtrrpqtvtsvxuwqpnmga\UPaz�™ ¢¢¡¡ž–…cC865555554444444444444444444444454444444444444444444446;BDDEEDEDFFGFEEFFHNSV[\_bdgkmstwy{zyuqlbWYguƒ‚ƒƒ„ƒƒƒ€{tmge_YTNHC5555444444444456677899:=?A@>;:99988898765544444454444558;>>ABEGEFSm�‡…uXA>=;899768;>Gc{†ˆ‹…wv‡“–�І†‡†‰�“”‘�Š…‚�‚€~{wslaK<8777666679::;;9878=96544444444444454444444444444444444444446;BHLORTUWZ[__`bdeijnqw{}~‚‚††ˆ‡†…†‡‰†…„ƒ‚�€~|wqjd_`i^WRQPNMLLMLMLLLLLMLOOPRQRSSTXXbhmh]\XVWXYX[ajot{{xvrprrsvussuuutpnnkc_XRYr‡•›¡¢¤¢¢›“}X>765555445554444444444444444455444444444444444444444447=CEEFFEFFIJKKKKMPT]bgkquxyz}ƒ„…„„ƒ€}yqdVQZfpvzz‚„„‡†‚~zwsoje^WO6655444444444579:<=?BDHNU]\XRLEBB?@@@?>;96554444444444556689:=BDEJ[u‡ˆ†uQ@>>;9768ADGGD?:9:<=??<754444444444444444444444444444454433444459?FKORTTWZ\\^acdhhlotyz{|}�‚ƒ…„…†ˆˆˆ††ƒ‚���}~|ysmia]_Z[WTROOONNNNNNNNNNPQQQSRUXY\_irk`[XXWV[_[bjpsw{yvurqsspssssvtuspnlhb^SRf}’›Ÿ¤¦§§¢š‹rM;765555555544444444444444444444444444444444444444444447?FGHJKLNQTVYZWZ\^ajqx|€………††‡‰ˆ††„�}ypbQHKQX^cflqy€„„‚‚€~||vokh_:866554445556:=AFHGLPSZ^epsrmk\PKEDFEFECB<855554554454444555579>CGQf‰Š‡mQBB?<98?ADHNT[emty{|}}{|xxtrnKB>854444446:@DJONMRVV^fo{€~z|th^OHHGGIFEB>:65444544444444545567FN]vƒ…„t]UPHA>Lm}…�…odWRMLLLLJLQOMKIGDHLKKPQNNMNNNTZ][aa`YVV[_dmsx}�„„‚~pXD>?@BB=85444444444444444444444444444444444444444446:BHKNQRUWZ^^abhlqruy|}}~}€‚…ˆˆˆ‡†‡†ƒ‚~|{{yw{ytof]YVUURQRTSVXXZfhimu}‚ˆkehgqd]__\^cabYX^doutx{{zvsspquusrsruyxusqqmhcZS_w‹—� ¥©ª«©¢�oH:766555555555455444445444444445545544444444444444444455D_rx|€��€|ytnjggimnqpokkib_ZXUSPNJGE@<9877767889;>BHOUXabfhkoor{|ucP?86569>BCHLLGCFFCNXhry}ƒ�}|{rfYMKMKJHGFB;6555445544445444455:CIO^p}ƒ�tYRZPEOo}‡‡v]RRQOKKKJFILONOKGEDGIJMOPOLKKGHJKJRX_djt{~‚‚‚€‚…‡„‚udOB?@ABB=754444444444444444444444444444444444444444458@EJMOQSX[\_bdkmoswxxxy}�ƒ„„…„†…†……ƒ}|{xwwtuule]YSWUQQPQSVU\`jloqxsni^Z[]a]Z\`_ae^[\]fnsxyyzwwvsorruwsurrx{zutqnkf`WXlƒ”˜ž¤§ª««¨¢“tJ:755555555554444444444444544444454545544444444444444457Nn}ƒ„…„‚€€~|ztmea^[ZYYXXTRQMJGEB@?>=;::888888787766788:<==><::9:?AFMYalswxxuqj\QNLMLIIHA;7544454444445445557?EIMXj}†€dUgkWMbw‚y_PMOPNLIHHCADKMOKIFDEGHLMPOONMIHIGFGJTds�‰‹�Їƒ�‚~yxsoeTF@@ACE?7544444444444444444444444444444444444444434447=<<;:9:988777778:;::B;776666788:;<>@CHOTƒŠ�…{tRA<879:988:98768::9:;>EQ[dhkklg`RMMKJJHFC=755555544445555556:AHJNWh}�v^_so^\kpaOLKHJLLIEA;9C|‰‹Š…�iI@;8778:887655666666679>CITX[be`PKJLLJJHE>865554444444445556=DHLNTev{dWmzvia[PKLKFEGHD=8668<>?><<<;=@DIKLLMMKKIGGDCDN\m~††ƒxj_\UROMLIHHFDC@@?;654444444444444443444444444444444444444444444458>FJLPTWZZ[``fjnprsux}~€�‚ƒ…………‚zyxuutssqnhic]XVRRUVUWWXXX^_abbacd`a_``ccgjlouz}{{ywwuuuurrsuvxyxxxzzyxuojc\Ve|‘ž¢¥¨¬®­­¬§ž„]@9765555665554455544455444555444455554444444444444444459TkmkfaZQLEBA?<;988777777766666667787777789:;:;:;:98887776766767789iŠ�‹‰~aF?:778:76556666777788:>BDLV]\OJJKIKHJH>854544444445444559AEJKMRapn^bv€zjWMKLMHCC?:755556666655678;@CCEGHHFGDEBACFLWdilkaVPNLLKHFCADCBABA@<7644444444444444444444444444444444444444433444446;BHMORUW\]^agjmnrqtyz}€‚€�‚‚ƒ†„„xxvsutsssqmkjf`ZWVTUTTTVXZ[]`_`^`dbedihiimnrvxzzxyxwvtuuwutsuwyzy~€}||zuok`W\m„𤤤ª®±¯­©¢–{XA9666556555555555544444444444455455555444444444444444557EVWQLGB><;:97777677788888766779:<=<<:9899:;<;;;<;<<;;:998877776677Xmƒ����{RB=9778?FB>98878:;<;==;;;;;;=DJUXOIIHHGHIE?96554444444444455:@EJMOT^gbTh|…}dQMMNLB=965555555554444455788:<>????A@>@CFLQSUUSOMMLLKIHEA@@?@A@@?:65444454434444444444444444444444444444444444444458?FJMPTZ]]^bellptvu{~{~ƒƒ……ƒ{yuttrportqnomhc^ZXYUSSTUVV\][`bbggkjjjlmptxz{wwxwxxvvsvwusvuxy{…�€}|xqle[WgyŒ�¦ª¨¬®±¯­¦›†nTB9765665555545545544454444444455545444444455454444444455:@@><;9876666667789::::::9889:=ACEC>:9:;==>??>>??@AAA@?><::8777777JYvˆŽ’’ŒmH@;8779AHE>;;<=?A?>?>==<=<<;>@??AB<754444544444444444444444444444444444444444444444456???@??>==<<=?DIHC=:9<=?@ABBBAACEFEFECA><:9998887DH\x†‰ŒŒ€ZB>:777;GKG@=@E@==<<<;=@A?><;@C8655544444444444444444444455555556;@CEIKNPNLIILKHGEB?==>?@A@=96544444444444444454444444444444544444445444444444459?EJLOTX\`chlnqsvy{x|~~~�ƒƒ�~yxvsstqptsoorqlkhhgba_^^^`adgigghhhgkmsvvwxwwuvvyxvuvvxxyx|}‚„‡ƒ~}|qic\Yj“Ÿ¤¥©¯°±¯ª¦š‚k[QA9765555555555554555554455554455555445454455544444544445566655555558;?BEFHHGFGEECB@??>@CFC?;;=?@AABBCEEEEFGGFCA><;::9:99:9>?Kaw…‡‚hI@<8779GPNF>@LJ@==<<;;@;:765555555444455444444444455544444557:><<>@@@@A<75444444444444444444444444444444444544444444444444446EJLPPQQPPQONKGDBA????>>?ACCCDDDDDDEHHFECA?>>>>==<;;;;;8:=EWm}sOB?9777@NLKA?GVM??@>=><<===>>?><<;?AAAACGKMC>85555544444445556HKLOTY\aejlptyxvyz|~}€‚€{yyvqnpoqmllortutqpoqoonjjlmnpnnompoptsrtvxxvwwwyyv}€€�ƒƒ…‡ƒ�ƒ‰……�}|ulbY[pˆš¤¦¨«®²³°­¤—�cXUPG:6566556655555555445555555554555454555555555555555455666776555569@IMQTWXYXXXXUTRNIEB@>==?BEHHHHHFGFFFFGFD@?>?BDEEEDBA?=<<6679>QfszxbF>:6779EKID?@M[J?@C?978:>BCB@=98789;==@DJJIF?85555445444454556=DHIJMNHIc~ƒiC7545555554544445444444444444444454444557:=??=;97755554557:=?@>>><7544444444444444444444444444444444444444444444444444447MNIC@DY[E?FF>978>AA>:866677678;@EIIJF?86554544444555556?AB=854444444444444444444444444444445444444444444444444444458=CHOSU[_aejntqsvxyz~�|vuwrqmjjknnnnnnooqtttsrstvuxvuvuwuvwwy{~€~}‚†‰‹ˆŠ‹�Š‹Œ‰‡„‡Š‰Š†‚}vlcY_yŽ §¨©±±´±­­ª ˆdVTQTN@86655667899;@DA=97655556555565555555556789989:;::;;<>>>;865558?HPV\\_bccddddeec\TMD??DKNPRSRRPONOLLIFB>>@CEHKLNONNMKIFDB6655678;H^jaG>:767;KPOHBBK_SBDHC<879=@?:7767888888:@DGJIE=86554454444454557>FIJMKA=MakT:5555455444444444444444444444444444444444445555444444444457;@AA@=9655444444444444444444444444444454444444444444444444444456;BHKQUY\_cioosuuxz}~€|y|wrqoolnpomnmknprwwyvvvyxwzyxvx|w{{~€…†‰…ƒ‹Ž‹�Š‹�‹Š��‰ˆˆ‰‹‰ˆƒ}yog_Xm‰œ§¨ª­³³¶²¯©¥™vZUTUYXG:655567:AFIN]b[OC:766656666666666656679;<>>??@@AAAAAAA?;75557=FNSX]]]`cefjmkhhe_WOEAFLPRTVUVTTRQPONJE@>ACEGJKJLMMOPNMMIF665555668>N_V@:7668EONKD@E\^I@BCB:77:DRJ@;:<=>>@B><=@EHJGF>85544444444444557;AHKJD;?O`Z>65444445445444444444444444444444444444444544444444444444569>@@@?;75444444444444444444444444444444444444444444444454444444458?FLPRTY_dhiosvvwz{~~}{zwutrrqqrrpmnmppptwzvyyxwxzz|{}�‚‡ŠŽ��Ž‹Š��Ž�Œ‰Š‰‹Ž�Œˆˆˆˆ…„|tjaXb€–¥ª¨«¯´¶¶°®§Ÿ‹gTVRV[]M<655669DQ\]cpuiWF;8766666666666677778;?ABDEDDDCCBBBA@?<965559BJRUVZY\_begionljgbYNFGLPRSUUXVWWVURQPHB@BEHIJLKKKKKLOPQONK55555555568DRC<8677>LOPG@CSeRA@GJ@978>Vd\NE@DKT^f\TIEDHHIHF?855444444444444558BJJG?;CPP?65554454444444444444444444444444444444444445454544444444457<@AB@=:65444444444444444444444444444444444444444444444544444444446:AGIMTY_dhjostxw{|~|{yyyzxssqsturoolnqosuxuuwwx~}�…‡‡ŠŒ‘’”“’���Š�Љ††ˆ†‹��ŽŒˆŠ‡„zuod\[uŽ¡§©ª¯±´´²­­¦™zYRTPQTTL=75557@Sdnkhnl]J>977666767677789:;::;?CEDEDCBBAA@@??>=:65456=ENRSUWZZ]_bcglkmkhaXNILPSUVWWUUVWWVTRNFBDGJNPOQRQPNMNSTTUTO655555555557>><97668IPOI@ALc[F@DJG<87;Lgqk[MRbt}~}xj^RJJHIKG>755544445444445559AEFB:>GF?75445544444444444444444444444444444444444544444444444444445:???AC>8544444444444444444444444444444444444444444444444444444444457=BEKSX\beimqttvz{~|{{}~|yvvvwvvuuurpprtsutvx|�„ˆ�ŒŒ�’•”‘‘’�ŽŒ‰Š††‚ƒ…†�ŽŽŽ‹‰‡‡„}yqj_Zk…™¥§©ª±³µµ­­ª ŽiQRSNNPQJ?8665:OfsuhZVPG<8676777899:<===>@@=<=?BBBAA@@?@??@AA@>:65558@IPRSUWYZ]_bcfikmlf]TLNPOPUUXYWVTUWWURLCCILOSTTVXWTRRUYXXYVS77666555554567:98667CKMHAAF`gOBAEH?989@UqzsdZat€…ˆ„whVMGHILF;654444444444444457=CB;;CFC955544444454444444444444444444444444444444454444444444444448==@DEA;64444444444444344344444444444444444444444444444444444444444558=DKPTY^cimosrwz{z€~}}}|ywwyxxywwvutuvxx{|…ˆŠŒ�”’‘�’““����‘ŒŽŠ‰†…‚†‡ˆ‹‹Œ�Œˆ„�|ulcZd€”¢¥ª®°³³µ°­­«�}XORPQU\^UF:666B`svnYHB=977789:;===?BDDDEDDC?=<=?@@A@BBCDFGIKLLF;6546:CJORTWY[]]^adjlmnleYQNQSSPPPQSSSUUXZYTJEHMPVXWXVXVVUW[^^]\ZW??=<:9765454555665568BLMDAD`o_F@DID<87;In~}vjZ^m|†ˆ‡ƒwnbOHHIFA8655444444444444446:@>9?GF<65444445444444444444444344444444443444444444444444444444446<@ABBA>8544434444444444444444444444444444445444444444444444444444444469?FMRX]fglppruwz€}|}}zz{yz{zxwy}}z|}}�…‡‹ŒŽ�‘“““•“�‘‘””“�ŒŠ‹ˆ‡†…ˆ‡ˆ‹��Ž�‹…�}ypf]`}’£©§ª­³´¶´¯¬¬¥ŽiPOQSY`ee_S?767Jkvr`H=9989:;=@BCDDEGHHFEEDBA><<>ADHJLOONRVUTWUSJ<6445;EKPRUXZ\^`ddgkmnmi`RNQSUVVVTRRRSUVZ[[SHGKORVWXY[[[Z]^`aaca^[FHIEDB?<:766555555556;AGFBBQnjJACJKA:78?]|}zygWWgr|ƒ‚~}r_OFGEC>7555544444444444445:?:ACEFGHHHGGEEDCCA?>=<=CKQVY\[YWY[WTSRMC95545=FLPTW[\^`dfimqnmmeWONQQRUUXXXXWXY[\[ZSHINPTVWYY\]a`ddeeeeba^MIJJIHGEEA;97655555558;CFC@IhnQBBHKF<87:Jovy‚z`SRY`ghhfaYRGEEHE;6554444444444444556:;;BHB965544444444444444444444444444565444444444444444444444444458>ACBBA=85444454444444544444444444444444444444444444454454545555544544456:?DJRY_dkooqsx}~‚�ƒ~~�‚ƒ††ˆŠ‹Œ��ŒŒ��‘’�����’’‘’�‘‘“�‘�‹‰††‚€�ƒŠ‹ˆˆˆ‡�zune^r� ¨¨©©¯³µµ³®©©¢�dJKUX`gloomj[D97EYWK?98:<@EHHGGFFEDDCAAABBAA@??AIPVYZZWUPPPKGGEA;65546>IMQUYY_`bdfjlppni_SNNQTSSRUXXYXZZ__^[QHKMRSVYZZ[]_adfgfgfgc`[WPMKKJGLHDC@<976545557@FD@E`mYFBDHI?978?\yˆ‚kVOKGJOPNKIJDAADFA9654444444444444444578?GC;65445444444444444444444444444454444444444444444444444444446<@AADDA:654444444444444444454444444444444444444444444444454444554454455557:@IQV]dmoqsx{�‚ƒ……ƒƒƒ�…†ˆ‰‰‰Š‹Ž���Œ�ŽŽ�Œ�’“”’“’“�Ž��‘�ŽŒ‹…„€‚„‹Š‰ˆ†„~wod_n‹¡««©ª­²´³±¯¬¨¤—vPGQY_efgghge_N;7:DC=:9;>ADFGFEECBAAABCDHKKJKJFCCGLNLKJGFDCBA@A?=955556@JPSVZ]_adhkloppngYNNNQSVTRRUVVVY]ba_[OJOPTWXZ]\]^^addfggfgf`^_[VTOLIIGGIHFE>9655556:@@>AOhcKBCHHD;88;Np†„t\OJEBCHJJJGB?>BED@855454444444444444446;BE>754444444544444444444444444555444444444444444444444544444558=ADDCC>85444444444444444444444444544444444444444444544544445545455544444558>FLT[dhmosx}ƒ†ˆ„„…†…‡‡‰Š��Ž�ŽŒŒŒ‹�����’‘“’’’‘‘Ž�����Š…€�~~„„ˆŠ‰†„�yrg^mŠŸ©«««²³²´±¬¨§¦ž†aHKV]diecdili]L;77:;;=?@CCBBBBBBCCDFJMQUZZWTSQKB?ABBAA@@?@@@@AAB?965546BMQTWZ]`dfjloqpqlaTLMOORSTSTVVXX]`fc_WLLQVXYZ\__`abcbdehgddc\\a`\^[VQOKIHHIJEA=865556;>;>IgoVCBFIH?879BWvƒ…~dOIHD?AILMGE@>?@DD>744444444444444444456;CC954444444444444454444444444444454544444444444444444445444456:ACABEE<654444444444444444444444444444444444444445444444444554544445544444569@IR[aglpv{{…†††……†„‡�ŽŒ��ŒŒŽ‹‹‹Ž�‘��’’”“��Ž����ŽŒ‹ˆxwy~‚„‰‹‡‚€{qjal� ¨ª¨ª®³µ³µ¯¨¤¦£“rPGPZ`ehginxufM>877:?CEEDBAABBDFIMORV[_bcb\WQPKD>?@DFD>7544444444444444444444444444444444444444444444444445555444454555444557=<>AA:654444444444444544445:;75544445679;:865555555444444445544444444444444444444444444468779=CHHFDEJS[^_ccb_\YWQNKHDB@@@>;:<@DEFFDCCCA@?>>=:65555:GOTY\abdhlpnprqk\OKMQSVWY\^a`cb`ehhaUORUV[[]_abdffhgffehghi]RPWOOS\u|xqia[UMLIMLGHFA:76689A_eOCBJOL@878=Ry‚‚�hOJGE>78>EEDB@<:;@C>7554444444444444445555664455669>@BBB<8787777655444444555554444444444445444444544445:>@CEED>8654444444444444444444444444444444445444444444445545445544555555555544568789=@CEEGGJPY``\[WSOJFECBBBABACC@<;=??@@@?<;;;:9888754545AGGHGGA988:>BCDGJNMMNQROIGEDBAABBDFEEEDFFA=;::::999887777766655456>MUX]_ehjmntrroh\NKNSWX\^`a`cdegikie]PSX[\__bcceffhiklkkljh`W]ZUXTYQOV\y†‡q`RIIIIJGLJGA:867AZYFAFMLF;879@Zw€€y^LIEB;76655555669?DA85544444444444444444445569>EHIKLKHHEAEHHHIHD>85565444554454444444444444444444444445;AABEFC>96554444444444444444444444444444555444444544444554444544455555555555455556977HVF@DPQJ=878=Sw€�{eMHGE>86555555556:AB;65454444444444444445456:DIKKLLMMJIFCJKMLKKGB<76555544455554444444445444544454544457=@DECCA=754444454544444444444444444444454444454444454445544444545555555555555545558?KT]cjpsux{~‚„„†ŠŠ�Љˆ‹ŠŠŠŒ‡‡‡…†„‚‚€}}~~{|~}xwsrog]SIDCLu�±³³´··´°­ª«ª¢‹jTSUX^jv‚„zkRB=>BEHMTX[\ZUNEBAABBCDDFGEHJIFC@=>@BBA?=<;998888899:;<<:655559FPWY_bdhloqqqohZOMSWY]`beegiihikkjicUTY^bbehkjlmkkkmpqpmnld\`gMPS\VVRUSQZf„�ކzeMCEHMLIMKGA97=KI@AKQK<877;:976665555555554445554445555455544456<@BBCEEA9555454444544454444554444544444444444444544444444555555555555555555555655567;DPZ_fgosux{}�‡…‡‹Šˆˆ‡‰…‡†„††††�€~{z|yvxxzusnjfaSLIEDDCR¤´·¹µ´¯­¬¯¬£�nTQWZ_l}…‚}o]QIBEJMPSY[YVOJE@ACDFGHHGGGDDEC>;:;>DHJJHHGEDB@><<<>AEILLC95556=JQWZ^ccfkkopojbQMPVZ]`cgefhilmnnnkf_TU[`dfijmlnnnmnppsromia_fh<:987666555555555555555445555544458>CDEFEB;65545554445544444445544444444444444444444444545555555554555555455566656666568==;887556@NQTY\^adfiknlgXMOUY]^bfigghknmnolleZUZ_cfjklpqorpqqprronkfabjl89=LOQQQSQSSTgz’›–��kRB@CJLLIFC<8=?=CKNF<879>Tyƒ…{dMHGB;765555545545:@?;755444565444444446656EQY_dkmnsuwz}~~|}~|zzzzwvtpmmpojhec\TNIFFEDDDCCBAHnš­²°¬¬«­¨›bSRV]ix…ЇqYMFDAACEDCBBBBBBBBCDCBCA?><;:87767=HNTVVYWWWVWUTRPMLIFM[jsoZ@6557BLOOTW[^_ehjlg_QNS[]_bceijkmmnooplkaWX^bfjlnnrrorrrrtsspljebglm=<;>CIKTQNNLRUa€“˜•�†sS>;BKKKLJF=9:<@HLH=878>Mvƒ„�pRHFC=8655554555557<@A:655445554444444554559FMQYdazˆ‡…p\bptrxviXHBACEHJIHHEECA@=:9:::::;;<<>>=;;9765556>BCFGHFC=755455554455444444445454544444455544545444445545555554455555556669>ADILKGB>97778=EOV]dhjlnqsruyyzzyxtrrqponmkhfgd`YSQKFEDDDDDCCCBBAANu™­­¨«¬¦�ˆlZWTZfv‚‹’‹mTHEDCDDEEECBBCDCBA@><;::9887776668FPVXXZ\[[ZZ[ZWWVTQNJKQY^]O=6558BLOPUY\]```chdWMPX^``dehjlnnnpopqol_V\bghkknprrprstrrponnibcilo?@BDDEEEBBABFNSa�‰‰�ŽƒmN?=@GKLPJD>99A<865544454444444455559KXer|u…��‹„tepƒ‹ŠŽŽƒnUDABEHJJKLJJJIHEBBEGEEDBBDEHIFDDC?;8656:@DEFGGEA:65445555544454444444445655454445444544444445545555545555555567=DQahhfgllh]H<98889<:98776677777666=MUY\\^^^___]_[ZYWUROMIGFGA:756;FMRTWY]^`ba``YNMWZ`aacfilloopopqonk]X^dghikkmorsqsvttqqomd`bfkpQTPLJE?>;;;<>CFJU`fgjnfYG><=@IKNKGA;:@HJ@888;Ceƒ‡„}cJEDB:6555555555547=@@<75555544444444455558Ss‚ŠŒ„Š“‘�„qfp‡’”—–�}`HBCDGKKLMLLMLKIFGKLMMMGFHJLLJIIHEA>:768=BEIJHHE>75555544444444444544446<655655545444444454554555555545555569@M[cs‚ŠŽ‰Š���ˆhF>=<::9:;@GNTY^abefgjikjgfb`^XTQNIGFDCBBCCCCCCCBBBBBBAAA@AWˆ¡�š’…tveZ^fs|‚Š��bIBAAA@ABAA@@?>><;98777778899:::867DQX[\^_`aaaaa`_\[YWTQPNIFD?<967@IMPTVZ]_adda\QJOW\^bbdgijmnoppqsoofXZ^cdeggilnpstuwututpia`dgilcaUEA>=<8889?Y}�}{iLDDA:76555454554569=AE;655555444444445556>=<<=>BGLQTXY[\^][ZWRLKGCBCBBBABCBBCCBBABBBABAAAA@?>Ek�“‡yj_[\`mwzrjop]G?;;:::::::::999887889:;<<==?@CC<79IRZ\^abbbcdefea^_]YUQQQNKFC?:8?>?DGJGEBAA@???@@@A?>@??@ADILJF>:=>;8888>Lr‚|qUFCB=76655555555558<@HE96554544455544556599@IMOTWX[_``a_\TJLSZ]_^_``eikppqqpmlfYRV[]]^`adhnpsuwyvssqmb`iprrpA?>?>DHIIGCA@AACCCAAAAAA??@?BB>?AFIKH@<<;8779?Fgƒ…„z_ICB>86555455555556:@GG:655455544455555559bˆ‘�‰scaXLHB?AS[[afhc\\cgdeb^\\[XUSQRQOOPPPOMLJMNNNMMNNIHEB@=;@CFKID@?ABBEEEFED@BCDA?@??A@??@AEIFH@<;9778>D`€…‡hLFC?976555555555568>EE=755545555555555559`…‹�nPFCA?=::9=??ACFFKUdrx{{|wzxrmigca_\]^_`\VRTWWWWWVUQMKFDB?=CGFIHFEC?9655555554455544555555454555545455555555555555679;=:9<<<=>?A@>=@BCCEGKPV`jpuz~�…†…‡Œ�†oH;FT^behijikmnmljjhd`ZWSRQOMF<:AJLNQUVXXYZ\ZZRGGNSX[^_bcfgkkmoppniaVQTY\^^aadgfhimoqrpoqqnoqomnpm@DHMKEBBCCCEFGHFEFC=;::98898::<=>>@ACGE?:8777965555554555555558Ysp[J@;;;:877889999::>J\p}„‰Ž‘‘��‹‡…‚~{x{}�€wmfhpruttsqka\UMGC?CHHIIHEFB<7655555555554445555555555555555555555555555579;=>==<;98888:>><::;?GMNMLMKC?@BDEDCDDEEEEB=;:9;AB<8778????>>?AGMYeqz|wjZJFGHGDCDHKOUXVPQZ]__cgoty‚ˆŽ���‘’‘ŽŒ�”ŒxP;CT^cfgklmonoppmljif_XRNOOLD;;76555555555555557JQIA<:9888778888877779?Tq�†�“—˜™™™˜—–“‘�•—š—�v|„ˆ�’‘�Žˆ~}tcVKCBFGIKJHHE@:75555555555555555554455555555555545555555679::::9877778889;<:98778:=<<<;::=ABBCCDCCDEEB?>=::?@ABBBAAAABAA@@?>???>>>@ELWhtxvneZWZ`a`^\[`gmsvzukly€€€�„‰�Œ‘–—•••““‘�Œ��ŠzV;>P\dgkmnommnpqmlijfb[TMLLJ@:?KQRQSV\]]\\YVNFGMQVZ]`ccfgijlmporl_TPTZ\^^acbc`bcflmnllkllqx{zysng]TLECDFGEGKJD?<:76655555555556555679;?CFA:7779?Lt��†~cKED@96555555555556:<<=>;7555556555555556:><:88877788899:9887779Ed}†�••™˜™šš›šš™˜›�ŸŸ–…|€Š�”˜›˜•“��‰zk]QHDHLLKKIFD@96555555555555555555554555555545555555667777777666677899<@CC@;98999988878:>??DKNMFDDFFC@=<=@BBBBCBBBABABAAA??@@>>@DM[m{�uaVT\iuƒ…„‚zy~†‰‰‹�‡~��”“�‘‘‘‘’””•“�Ž�Œˆƒ€ƒ�znS;9I[bhmnnonpqpnlkhidb]SLIJF=:COTTSVZ_a``a\SHFKQUZ_`cfedgjkjjnnogYPSWZ]_`bdcfbaabgklgfhhkt{~{}woiRHFDDFHEJKMJ<7665665555555555555665679Gpˆ‰ˆƒkNGDA;7655555555557;<;=@@:65556655555555668888888::<>??>=<;:9877;Jcw�ˆ‹‘“•–—˜œšœœšžŸž–…|Š’“˜ž™˜””�Œ…|tiYIEGJMMJGGC;7565554555444545555555555555555555656666766667667789;>BGKKJGA<;=?@=<::;=CD@?@ABBCBDDDB@?@?@AFMNOMJEB>;::?BCCCCBBBCBBABBBA@@?>>?DN]o{€~lSP_p‚Œ—š™•�ŒŒ‘‘�‘�Œ…Š•—•’�މ‡‰‰††ƒ|yzxplggca\J;8AVeimpqpnommkgfefc`[SLJIF=;HTWVW[]``aa_YMFHNSZ]acdfhgijiiinnj`SNSWZ]]]`adec__acfeddbdluz~}zuroIGIJFHGHGFA99766555555555555555556555668;;9777;Bfƒ‚„�qQHEA=8655555555556:><>DE?96566555555656667888:@CFEECAADKKE@?@ABCCCCCCA?@AA@BEGKJFC@=;;=ACCCDDBBCBBABBBBBAA?>@FQbq{yrohalzƒŽ—�Ÿž›”‘‘’��Ž‹ƒ{~‡Šˆ†ƒvsrpljhb`_]YUSTRPOH>9:J_ijmoljihgdca`_]ZWSOMMI>=JSUV[^_abdc^UJFKQVZ^`dhkjikjjjijkeXNQTWZZ\^a_`a_^]`bbccb]amtz|~{xtrHIJJIGJA<9766555555555555555555554555555677686775555555556665678:=BFKMNNLMJGC?CFFB=87688655545555545555555555555556666899999999;==>>>=?CEGJKLKKIGCBAADFHGGEECDFFDBBA@AABBBBCBAABBCCDDEDCAAAA@BCCCCCCBBBAAAABBBB@?=@HTesxrcU]n|Š‘‘’–�œ™•�ˆ‰Š…�ypka`dijkgc^[YXUSRQPNOONMMLKKIB:8@Tcegffddbaa_^[\ZYVURPOLA?JRVY\`bdffd]OFHLPUX]_dhhhkkighggh`SOQTVWXZ[^]^__^_`baaa^Y_ktv{~}zvtKLLOLOF<7666655555545545555555555555555566667667;BFOXXE>>@A;7655555555556>@@GMMOONNJIGDA>@CDC?:76779:=>?ABDIKLNQQNLLLGEHNRW\]\YUXZ^^ajoldTDCIJLLIHHD>986555555455455555556666667789=ABBBB@?@BDDCCA?@CDEFFFEDCDEHNRVRKFEDDDEDDFJNLEAABBCCCCBBCCCDDEDCDDCCCDDDCDDCCBBBBBBBBBBA?>?GWguskaSPg‚‘’’��Ž‘Œˆ€yttuof^XVQOPQSSQPNOONPPONNLLLKIFFFGHEA@GU_bbaaa___^]]]\[YZWTRQND@MV[``baeggdYIGKMQSW\`cehjlljegffbWPPTXXYZ]^]^_]^]\_]\^\XRZfnqv}||xtLMPPOB;8665556555555555555555555555555555555866666788:8889;976555555555559B=>BGF@86555555556667EHIMOLHGFECCBA@?AAA@>:876677899:;;=>>?@????>=;<=?ABBBBBBBCDFLRQPLC>ADJJHIKGA;7655555555555556678:;;::::;>AFJIJJJFCDDCCCBA@@@AABBCBDHNU]hkiaTGCDHPSPLR[aYJBACDCDDDDDDCCDCDDDDEDDDEEEDDDCCCCCCCBBBBB@??GWlrn`VSVat‰�ˆ‚|ywrokd]Z[YWSQNMLKLMMLLLKMLLNNLKIIHHGGGHJKMOMPT[_a`__^]^]]^_^[[ZYYWTSRKDMV[_dhfbca]PHJNOQV[^`bfgikhffed`XPNSWX[]_a`_]][[[ZZZYYYQHQ\gjnruronPPML?876555555555545555555555555554545555556666655556656656665565555655557;:::655555555566:KNKJGDCBBBACDGLNIDED?;987777777788889999998888889::;;;;;;::;=>=??<9;@FJJJMJC=865555555556788::;>?@?==>>ABEHIJKJGDCCBA@ACDEEFHGGJKNT[dlorndXNEABIY`YVZ\ZRGBABCDDEEEEDDDDCDDEEEEEDDEEEDEDCCDCCCCBBB@?@IYjriTDEKWgnqslf`^[YWURPOOOPNLJLKJIIJJJIIIJHHIIIJKIJMMNOQQSTUVY^]`a``_^^^_^]\[\][ZZYYXTIMV]bdggfd]SJLPQRSY]addgggffcdd]WOMPTXY[__`ac_\[Z[ZXYXXRJDELSZ^bed_YLJC=966566555555555555555555545555554555555667655655555565555555555555555566667788655655555556:IIECBAGJMMQSX`c_OHPRH?:988888777788888878877777787888888877887888778?AB@>>?>=<=>>??ACDFEEDFHIKJHKORPMMOOPTVW]befeaXMHEBAAFPURNMKIFEEDBABDEEEEDEDEEEEEFEEEEEEEEEEDDCDCCCCCB@=?J^lpfQ?=BJT[ZZ[YUQRRRQOLLLKLMLMLKIEBCEEFFFGHHIKLMOOPQSRTUUVVVYXZ]_`acba`b`___^]]^]]\[]^^UNS[adefjeYLOTVTVY^`dfhjhghfbb_YSPQSVY\]_`b`a`\XWZZY[YUKB??BDFGJNOJCF?:76655555555555555555555555554546555555556666555555555555555555555555555555555666555555556569@ABGLK]cdcgggh`WHCOUMC<:;;<:9:;;:999999::9988788787788888887777666679=BGGHHFC>766679;;=@ACCCA?>====<=>=>>?@BCCFKT[^`[SQSQNHFGGGIIJNNMLKIFCCEFGHFGFGECCEHJKICACDEDEEEEEFEEFFFFEEEEEDDDEDDDDCDDCBB??K`qvmVD?CKOQTRQRQPNOPNMMKLJJIIJJIIECBDFGHIHJMNPPQRRSSRUTVWXZYYZ]_``bdcccccd`aaaa`aaba`ddd_WTW^abde^PKTYXWY^`abghljggeca\TPRTX[^abbbdac^YWXYYYYYOB==>@>=?BCA>:C:876555555555555555555545455555555555555555565555655555555555555555555545555555555555555566567=@HX\O\`]\^\VPHB?>BGFA=:;<>>?ADDB@?AA@@BA@?>;:::9999999::::9988777777:>BCDEC@;8789?=;98:8766555555555555555555555545545455555555545555555656655555555555555555556655556555555576556668====>>=;;;:<>ADHIIHHKLIILJHHFC@?@>>?ABBBCDCDDC@?><::99;=?AAA@=<;;>?@AAA@@BDFJNPRQSTROLKFEDEEFKNU^`ZSLHDCCCCCCCDDB@?>?@ABDGIKNMOOIC><;;?CDEEEEDDDEEEEEDDDDDDCDDDEEDDDDDC@>H]q€‡ŒˆnRPNMMMOPPPPNMLKJKLKJJLKLMNOOOORQRQTVUUVVVUVWWXXYZ[\]]]_^^abdfghgggggfhgihgffgffjjkikljd^]\\YMFQWXZ_cggfgfghggcb_^WRVY^`dfhjkmmiga__]][ZWM?::999:::;:99887766555555555555555544555555555554545555455555555555555555555555555555587555555655565676789;<>?@@ABA@AAAAABAABBA@@@?>?>=<==@BEHIIKMJIJKKJIFDDEFFHKKKLNPPOMJIJHEB@A@@@ABCDB@>==>??>@@BHOWZ^cfe^ZWRLIGC@???@CDHLKHDCCDFHIJIGHEDA>=;<>@ACFHIJHGD@;9889;?@=;987;BDDDEEDDDDDEEDEDDCCCDDCDDDDCDCCA?EZpz„��}aNKIJKKKLNLKLLLMLNNNPQRRRRRRSTUUVVVVXY[YZZYZZ[Z[\]_aa``acedehijjjijkjhkkkkhggigghhjhgiiieb^]WGEQZ^_cdhgiljjjiiba^\USZ]bfjjmnookgdbcca][XQC:888899:999998777666665555555555555455555555554555555555555555555555555555555555555555665555565655678:=@BCDDDEEEFGFGGHHGGHHIHGGGGFFFEECCAAA@ACDCEGEDEEEEFEECDHJJLLNPQRQPLJKJIHGFEDBABBCBB@???@ABDHMT]fkigeb]SLGEB@?>>=<====>@@ABCEGJNNLHEA><;:988:;;<>@AA@=;9888779::98789:88889::998888776655655555555555545555545555554545445555555555555555555555555555555555665555566779>?AEHIJGHE?<:98887888:::;;;::8788899;<==<;:;>BFGEDDDDDDDDGFDDDCCBBCCCDCCCCCCB?D^vympziVPNLMNNPPOPQPPRRSTSTVWWVXXXXWX\[[]]]^__`bccddccffdefhiijjkljihijigjmhhihgecddba`^^^\[VUUSPNLKI>>R[bfjlnomlklljd]Z\WNOY^beghkmnnllhfhgc^WNA:8888888898888777766666656555555555545555555555555545555555555555555555555556556555675556656679;=@BDFHIIKLMMMNNNPPOQNOQPPQPQSRRQPQQPRQQQPPMNMKJJIHFFDBABDFDB@@AABBCCDEEEDCCCCDCCAABABBFHLPQRW]_]\^[XVROJECCBAABBCEFFEFDCBA@>=<;;=?ABB?=;9888789:;=>@BEEB?<;9899;=?BEHMQNECIUbbQFDCDDEDCCDDCDDCBACDCBBCBCCCBALbsshfjc\ZXWVUUTTTTSTTUVXVVXYYZY\ZZXZ[]_`abdedefghhijhiijiklkkkjiijhhhgfgceedfca``_^`\ZXXWURMHGFFBBAAA<=L\cgjlosspkigfb^ZYTDEU^_acfgjjkjjjigfb\QD<988888888887877677665555555555555555555555555555545555555555555555655555555566555555555556669=ACFGIJKLNOONPPQRRSUTTTTSTTTTSTUUVVUUUUTVUUVTQQQQOOONMLIHECBDEHHHGFFEEFGFHIJKLMNQQMKHIJNS[]``_[Y[WPMKIHFCCBBCCCEFFGJJJIHGB?><;:8878899999888789;=>AEJRYagj`SLE@==?AEKU_mtyp_U^uЉlLDDDDEDDDDDCDCBBBBCDDEEGHHJKMT^hiefigc`\[ZXYYXWVWWXYZ\\[[\[\]_^^__bdcggihijgjkkkllmjiklkikjiffedeba`bba_^]]]\ZYXVTQNMKHEC@??@@??@@A>==<<<=>>????>;AP[bimntussnigd`]TD:8:987777777666666677666565555555555555545555544555555555555555545555554455555555555555556569?DGIKKMPQSSTTUWWXYXVXXXXXXYYZZYZ[[Z]_[[]\][[][[ZYYYXWWXVSSRTQPONLJIFDFLX`diiglllniafjfda\]\VTQNIFFCBBCCCBDFGFGIKLKIJIGFDA><:887777777889999899:<=@DLYh|Œ–™�¡žœš�‡zl]WZi{‹—�¡¤¡ž–‹{|‡—–tMDDDEGHIKLMOOPQRSTUUTUUVUVWYZZ[_bdgkijd___^aaa``acdacedceegfhihgjkkmmlkmmmkjhhiiifefdbccccbba_a_^\[XTROLKHDBBA>=<<<<<<<;;;;<===>>==;=JV]bjnpsspnlie_YK<878=HRXY\accbba_ZQF<888778666777766666766665555555555555554555455545555544555555554555545555555555555555555567;CHJMMNOPSUVVWWVWY[\\ZYZ\[YZ[]]\\]]^^_`^aaa`\___^]\\\ZZ[ZXXWWWTSTSPOOMJGDDJOQRRTSPROJMNKJJHHHEDCCBBBCDFIJIIIKKJJGIIGC@?><;9877777889::;=>?@@?>?@DIKQ\k�𠤢¥¥¤£ –Š}pcXT^q…”�£¦¤£œ“‚st‚†rTLNPQRTSVWXYXXYYXWWYYZYZYZ[[[[[__cgjlkhdcccdfffefggfefhjjikjjlllnommkmjkigffdcefedcbbb_bda`_\YXUVVRMIGDCB?>===<;;;<<;;::::::;<<<<<<;:AMW]ejlmnmkjid\N?97767FILNPQSSUWXXYZYZ\\]^]]^_]^^a_`_````bcaba`aaa`aaab__^^^^]][YY[ZYWVTTRRROKJHJC@@@A??>>=>>>>==>>=>?@AABEHJLLKKJIGEE@?><:98776777789:;<>@ADHMSXVRPRV`howƒ‹”œ¢¥¤¤¥¤¢œ”„vh_XPIKWk€�—™—–�†wkgikcZY[[[Z[Z[ZZ\\\[Z[[\ZZ\\]]^]]^__b`dhjjnlhijijhiiiiijkijkmlmmlkkkkjkkkhfffeecc`bbbbca_^^]][YWSPKIIJJFC@@?>=>===<<<;;;;:99999999:9::::99:@KV^afihgdeb[M?87766779>DLQTURNH@:8776666656666666656657766555555555555555555555555555454545554455545555554555555555555565568BJMOQSTTXYXYY[[[]_^^a`__`_aaaabbababdcbdeccccdacbbcbcabb`abaa^]]]ZYWYWVUTPMJHFEFECBBBAA@?@@@AA@???@@?@A@@ACDEB@=<;9888776677789;<>@CFKS]gqz}vsrx‚ŠŽ‘”™™Ÿ¢££Ÿœ–‹�qbZTQMKIJOZjz~{wlgca`b``aa_]\][\\]]]^^\^_`_``__`acbbdccdfijkooonoonmnljklmnnomkkliiihffhghgedddecaaaa`]^^]ZYVURMKHFCAAAA@?====<<<=<;:::;::99888877888888898878=FNVY\[ZXVOD<877766677779:<<:9977667666666666666666666777665565555555555555555555555555555555554455555555445555455556666669ENPPQUWXZ\YY\^^_b`^``ba`ba`acbdcccdddddfffdefefffdccdedfedddbdb``_[[[[[XUUSQPMKKKJKJJIHJGGHIIGHGGFFGEEDDCBAAA@?><;:988877778:<>ABEKR\fq~ˆ�˜šš–ŒŽˆˆŠ�“”•”—•–•”�‡}tkaXSTRRRSUW]`inspqnjecccbbdddcbb`a`]]`ba```bbdcbaacdeffgffigiklmoqorqqpponlmnoomkihhheeffdeddfffecbca^^]]ZWWUSOLJHGDA@??>>>====;;;;:::999999988988877877777777777789;?@BBBA=;98777767767777777777766676666666666666666667666665555555555555555555555554445554556555555555455555555555566666;GOQTUVX[\\][]__bbabddbbadcbcbbcffffeedfggfihhggihgfdgffgeeccdbeca`__]\\\YXWWVQPPOOPPOONONNNONNMNMLLLLJJJJIIIIIHFEDCBB@?>=<;;<=BJR\dn|Š�˜ ¢¥¦¤¤¡š‘Œ‰Œ‘’�ŒŠ‰‡ƒune\YVUVUWWXZ[^aefimoollgfeddedeffeeddecdbdecddggghedeegigiikhhjkkkmooooqqqrpnnllkkljkihghhifedeedcdcb`^\YWVVSRONJHEDBAA@>>>>>==<;=<<:988888:88888777877767777766776667777888888877777776666666667677666677666667666666666666776666666555555554555554445555555445555545445555554444555555555566:IPUWXXY[^__^_`aaabdeghfddccfeecegghhhhhjkkijgjhjkhfhigfffggcdeeeabb`a^`_]][XXTRRSSTSSRPQSSQQQQRQQQROOOOMONNNMLLKKKJHGGFFEDDBBA@@CHT`u…’𡤍©©¦¢¡›—Œ„�…ƒyuspngd`\ZWYZY\[Z[[[]`afiijkkijhiiheefghgfhhihfhhhihijkljjjhhhikjlkliklmmllmkmmmmmmjmljjkljilkjgfigdefdcbba]ZWVSPLKKJFFDBCBA@>>=<<<<<;:::>C=8888778;8777777777776666666666666667777777776776766665666676666666666767666666666565555677665555555455555555555555455544555555555555454555555555555555666;HRTXYYZ]^acdddaceffheeihihggfdedeijijkkkmmkiikkklkkkjihgigjjfgeeghedaa__ba^^[WTVVWWVVTTTUUVTTTTTSSUUTSTSQQPQPPOPPMOMLLLJKJHGGGFDDCDDEGMXfx…”žŸ�˜–�‰~roongcdb`^^]\\\^^^]\\]]__^adcfiliiiilkkhkjjlijkjllllllkmlkmlklkjmjjjllkjjhhjiighgiighjljjiklmlkjkljhfddcc``^\ZWRPLIIFECCBA@@@??>==<<;::;:::99;C98888879:887777776666666655566665666677777767677666666666666667766777776766666666656555557776666555555555555455555555555555755555454455554454555555555666:GSVVY[Z^`cdcefeffhhgfgikljjjhhihhiiklnpmnomlkmlmnllmlmjiklkijgghhhggecbaabc_^]XYZZZZYWXXZXWXYWWWXVXYXXWWVUUVUTTRSSQRRQPOOONMKLKMJIJJIHHHGEFIQ^mz~{wrlfdecaba_`aaa`aaa`___^^_`a`cefhjlklllmlmklnnnnnnlnmnpqqoppmnnollmmllkjjhfggffdfghhhiijjkllkllkjihhfgecda`\[XTPNKHECBB@@>??>>>====<;;;;:::::9989;888888777777666666666555666656556666677777777766666665666666777777777676776666666656656557666555555555555555555554555455555765555554445555545454455556669HTX\_`_`abdhfghihhikihhiljjkkjjhjlklnmonllnooomonkkmmkkjmmmmjkkjjhkkjhfeccbb_^\Z[\[[\\[YZYZZ[Z[YY[Z[YY[[[YWWXXXWUWVVUSSQSSSROPPQRPOONMNMMLJHGFFGKMS[cededcbdddddbdacbcbabbaa`cddeehiklllnnmmmopqpopppoqrqooqpopmnmmilljhihgfccdeggggjiigiijiikjiggeeebab`^Z`WTPOMHFDCA@???>=<<<<<<<;;:;;::::::::9988988777766666665666655665555555555566666667777766655655666566677777777766666666556565655555776655555555554555554555555555555576554455555545445555555556668BRXZ^bdcbabfhhijkkjkljjikmnnmlkjjlmnorrpopoooppppnoooolklnmllkjklkjlllkihggdd``]\\[]__]^[]]\^^Z\ZXY\^[Z\]][[[ZYZZZZXXXWVVWWUSSRSSUTRSRRSQQQQONMKJIHGGJR\dgefefgghfeebcbddedffedggjkknmnlnnpqrqqrsqsrqrqqqqonomjmjjighihhhfddeceffjhhijgfhiggfdfddca_]\ZYWURSqPKHFFDCA@??>=<;;;;;;;;;;;:99::;:::99987777876666666666666666555555555555555566666676776666666666677667777766666666665665566566555577766555555555565555555555555455555555554444455554555455655667BRX\^_abddegjlklkmlmnlllmpnnnommllooopprutsqqrqqqsqppqropqpmmmlklmnkmnmkjjiihdba_`^__ab``^^]^a^]Z]_\\]]Z_a^_^^^\\^\]\[ZZYYZXWWWUUWVUVVVUTTSTUSRRQQPOMLJIJQ^eghiigiighfefhiiijkkjmmnmoqmnnnpqrssrtsqqpqpprpmmllkjkiiiijihhigghhggfhgfffffgggcda`^^\YXUSQPOKKJHGEEDAA@@????=<<;<;;;;;;;::9988898998878776666666565666665655555555545555555556556666676666665666555666776666666666666556566655555556666555555555545555555555555555555544455555555555555555655667@OY]_bceefggjlmlnllmlnmlmpoopmnooqpqqqspruvtrrsrqrsttqppnqpponnponnmlmnklkjhggdba```acbb`b`__````a`_a``a_aa`a```_^^`^]^\\]^][Z[[YWYXYXXXWWWUTTVUVUUSSQQQNKIJRakiimljlkkllmlnonpppqqrrqpopqqsqtrppqqmpoonmmkklkkiilijklmlkkighiifefeddbcbc```_YVUTRPNLJJHHGDDDDCABA@?>>>>>=<;;;;;;;::9999988788777877766666655655565655555555555555555555555566666667665666655656666666666555665555555555555655555776665555555555555555555554555555555555555545555555555555667=RY\^adfhhjiknnopoomoqsnoqprqnnqsqppststttuvwwusvtqsstsrrqrsqpqpqpomnnpolmlkjiiffgebbdddcdccbcdbbcccbedcdccddaaacc``b`a]`a_`_^_]\ZZ[\[\[ZY[[ZYYXWXYXXYYXXWSPLJMXglnoorqopnpqrpptsvsssrqqprtrqoqnnnomlmlnnpnmnonnllklmmklmjkighhfddddaa_\\ZYXVTOMKIHFEEEDDCCBAAA@@@???====<;:::;::::::998888777777766666665665555556555556556555555555555555555666666666656665665655566656555555555556555555565556567665555555555454555555555555555444555555545555555555545556:M[]_cefiijjknooppqpqpqsrrrrvrqrrtsrstrqrutvwxzvutuuuutusurttrsrpoqpmoonlomklkjhggfgeeddfgdefebcfefddfedfedeefdcacccb`ab_`bacab`]]]\\\^^]\\]_][[Z\[Z[Z]\[[\ZWSPMJQgoqusttstsutssttutrqponooponnlmoopmmmnnoponooolmljkpnkkkggfedb_]^\[ZYWVTQPMLLIFECBBBBA@@???>?>?>>>?>===;;;::899::988888877776666666656565555555555555567555555555555555555565555666655555655555566556765555555555565655555565555566666555555555555455445555555555554555555555555555555555667H\bcbfhiklnnonpprsrssvrstvsrvttrttuuuxssvvttxywvuvvwvvxzyutwurqqqqsqqqqpnnpolkljghhifhghgghhjigghhgggfeeffghddcedeeeebdebcedccdda^___`a^_^_a``_^^^`a``_^^^^_]\YTOKL]ovwvuqutttutrusqnrqonmnnmoooponooopnoqppqoqnnmljknkkheedb`^\YWWUSQPPNMJIHHFFEBA@>?>>====<<=<>>=====;;;9::98877887777777766666655555555555555555555555555555666655555556555555555556555555555569655666655555555555555555556555557776655555555555555555555555555555555555455445544455555566=T^cffhiklmoponnrrsrsruutuxvvxvvwsssvtwwuwvswwzxvx|{zyvz{xwvvtsrsrtutsqqqoopnlmjjjjghikhhjigfhhhjkiggjghffgihefcgfcdhgffdbcegecc_baca_a`_`_bccccaaaccecbabba`a`]ZTQMJVntutpqrrsqpqrqrpoqoonnqooporpqppppppqpppoommkijjgedc`_[XXVTQOJIHFEFECBA@@??>>==<<<<<;;;;;<<==>=<<::::9998887776666666656555555555565655555555555555556668:=@B>7556555556655555555555556665555656566555555555555655555555555555877655555555555554454555555555554555555555455555545555566=<;;::9998988888999999:::9::;:;;::99999888876666666555555555555555556655555555555566779<>BEGGIID9655555555555555566655666776555555566655555556555555555555555555777656655555655555555555455555555555555555455555555555669M`cgjlmknrqspprvstvuuwxwxxyyxxyxyzxxy|~}}||zz{{|}~~}|{|{{yyywuuvvwwvtutussqpnmmkmppmnmnlmmllnnnliikkijjkkjlkjijegggkiiffgehgfedeffbdedfdadedfhgefeeeedbbgfedddcdb`]UNJL]monopsrstqqsrqrrpoonnlnoqporqqnonnkhiifc``]WXTQNIEB?><;99777776666666666666666777777888887888887887776666656555555555555555557676555555555679<=ADHHIJJIJJHE<76555555555555655555665555555555556665555555555655555555555555566666655555555554454555555555554455555555555555555555567G^fglmnpnprtuusrvusvwwzyyzyyz{yz{{zy{~~€|}{{{{}}|}~~~|{{}}}|{{wxxyywtuvwvsrpppoonpppnomnopoloqnnmlmlkjkllmqmjkklihhjijifffgjgghfegeeggecbefhihfghihfffeeffhgicabbddb^VOKLZmpqoprrrsrqrpqqomlnoooqnoqqonmmigdca^\XTSOLIFB?<987666666656555555566556566666566666666666666766666666555555555555555655555565556655578;=@CFIKJKLJKKJIJJIHA8656555555555555555555555555555555665555555555555555555555555557666655555555555455555554555555455555555555555555555566:877666666556655555555555655555565555665555655555555555555555556555555555555555678:>@DGJKLMMMMNMLMMNMMMNMMNMNNKLMMKJLKJIJE:65555555555555555555555555555555655555555555555555555555555557666655555455555555555545555555555444545455555555566:Oginssrvuxyyxyzz|}}€�€€ƒƒ„ƒ„„ƒ„……ƒ„‚„…†…ƒ‚€‚ƒ‚„ƒƒ„„„‚ƒƒ†ƒƒƒ„…ˆ†‚€€€}||~~{xyz{ywutxxvvvvvvuuuusprtrquttrqqtrsprpqspopqronqommnnnomnkmkllkjigfghiiighighfhjgigjggfhgfhfdb^]^^^YWWUSQQ^jlnpkkigfeb_\ZTRPOOMJIFB>:876666655556655555555565555555555555555555555555555555555555555555565555555667:76555555555555555555555555555555555555555555555555555555555557666655555555555555555555555555555555555455555555668Hbmosrquwwy|{y|wz|}����€�„…„‚�„„††…†ƒ‚…‡‡„„„�„…„„…………‡‰‰‡‡„‡††……‡„‚€€€~€||}~{{vwz{zxvwwxvuwvtrttruusrprqttrqpqrvqpprsrqqorqopponommnqolkighghijkkikikhikhgfiijgfiiifgfb`]\\[ZZWUUROTcikhfeba^XSQOLKJHHGEB>;8766666666655565555555555556655555555555565555655555555555555555656555566679;>BFHJKMMMMNNMOPNNOMMMMMMNMMMNNMMMMMMLKLNLJKKLKJJB8665555555555555555555555665555555555555555555555555555555555666665655555555555555555545555545445444555555555556>Zjpsswvwyx|~}z}|}‚‚�ƒ�ƒƒƒ„…‡ˆ††‡‡‡†‡†‡‡†ˆ„„„‡‡‡‡…†…†ˆ‰Š‰†††‡…†„„„ƒ��‚‚…‚|}|€€}{z{||€}{xxwvwvvvuuususssvqrrtssqqrrprrqqrssqrqpnopmmllponnljikkjlmmmkjjjgjkifhehghgjkjgghgca\][\[ZZYUTQQW`a][WTQNKJIGGFCB@=;9766666566665555555555555556555555555555555555555555555555555455555556678;?CFGJKLMLMMNMNNNOPOONONMNOONMLMMNMLKJKMMMKMMLMKKJKJKJE:755455555555555545555555555555555555555555555555555555655555667655555555555565555555455545544555545544454555659Ogqrtuxyyz~~||{}€€�‚ƒ……‡…„…†Š‰Š‰‰†…‹‰‡†‡‡‰‰‡…†„ˆ††ˆ‡‡‰‰‡‡………††ƒ…„ƒ€��„„ƒ‚||~}‚}}~}}ƒ€}|}yyvwwwuvxxzvuttqrttsroqrrqrsrrrsrsqqnlnoopoqoonlkklkiiilmlmnomlnojjihhggegghihggfc^]][Z[^^[XXVSRQQPLIIIIFEDA?=<;97656565655666555555565555555555555555555555555555555455555555556555678;?DIKLNMLMNNNNMNONNNPQOONONNNMNMMMMLJFC@>=?FLMMMMLLKLKKKKJH>76555555555555555555555555555555555555555555555555555555555566665655555555555555555555556555445555545555554556Dbltvuvxx{|}�€~}~‚€€€�„†‡‡‡†„…ˆŠŠ‡‡‡…†‡‡ŠŠ‰Š‰Š‹ŠŠ‡‰‰ŠŠ‰ˆˆ‡‰‰‡‡††‰†ˆ‡†„„ƒ„„‚~�€„~€}~}z|xzyxw{}xyyyvtpqquutqpqpnqqrpqoqspqorpooorqomookkmnhllmpoqqqqppompmhheedegffihfgb`a_\Z\^a`^_^[VSOJHHHHFDB?;<;987666666556655566555556677888877666655555565555555555555555555566678;?CHLNOOPNOONNOOPOONMNOPPNNOPPONNNNLJFDA><;::::>HMMMNLMLLLLKJIJB86555555555555554555555555555555556555555555555555555556555676666666565555555555565555555555544554555555555568Rhqwxyyz|~~��€||‚„‚ƒƒ†‡††…‡‡†‰Š‰‰‰‰Š�ŒŒŒ‹Š�‹Š�Œ‰ˆˆ‹‹ŠŠŒŠŒ‹‹‡†‡‡ˆ‡ˆ†„ƒ„‡‡†‚„��‚ƒ‚‚„€��‚��€~{y{z{{x{yy{wvvuvstvtsssopqpqrqoqqrpoporqprqonlmnnpnmpppsqrrqprttrpnihgcbcehijihgfcba__`bb`acca`[VPKIGFC@><;:986666566656556565556789=>ACCDEDCA?<:8655555555555555555555566679;>@DGJMOOOPPQPPPOOPPONNNPOPOOPPNOONNJHEB?><;:::99999;FMMMMKMNMKJJLKIF:655555555554555555555555555555556655554555555555555555766557666555555555555555555555555555444554555555555667A\jtvxzz}~€€�€‚�}}ƒƒ‡‡ˆˆ‰ˆ‰‹ˆ‰‹��Œ�Œ‹‰Œ�Œ‹�ŒŽŽ‹ŒŒ‰�‹��‹‹ŒŒŒŽŽŒ‹ˆŠ‰ˆ‰ˆ†‡†ˆ†ƒ……‚„ƒ€ƒ„…ƒ‚„‚ƒ€€„‚ƒ�€{~}}}xxw{{ytxxwvuuuvtrqsppopoqqpqqonprwwrnnooopoqpoonrruwtttsttusomigggheehhjjhhhfeacdbbbfgfec`]YTOHC?=;::976666666555665556667<@EHKJLMLKMLJIIGEB<866555555555555566679;>BEGIKLNNOOOONOPPPPPOQPONNOPPQPOOPNLKHDA><<;;;:9:9999999:CKMNNKLMMLKJLJJH=755555555555555555555555555555565555555555555555555655555557766655555555555555555555555555555455554555555669Sipvvx|}~�€�ƒ„‚‚ƒ…‡‡‰‡†ˆ‰‰ŠŒ��ŽŽŒ�‹ŒŠŒŽ����Ž�ŽŒŽ‹‹‹��ŒŽŒŒŒ��Š�Œ‹‹‹‹‹‰††ˆ…€ƒ‡„…‚„„‡†„„ƒ‚‚�„‚„�‚ƒ‚€€{yx{{xyxwyyvvvwurpqqpoqpooqqooppsz{tqoqqoppqqpsuutsruutrrtwxsnmkjjjeghjhjjjkhgdcddedfghfgeb`]XRIA;:987666655665565566668?GLOMNMNNLLLMMMNMLKKHA:755555555565669=AEHKKNMMMNNMNPPOOONOONNOPPPPNNNPONLJGEB@>=<;:::;:::9999999999?ILNMJLMMJKKKJIIB86555555555555555555555555555555555555555555555555555555555776666655555555545555555555554554445455555455657>\oux|~€€‚ƒ……ƒ„ƒƒ††‡ˆ‡ˆˆŒŠŠˆŒŽ���‹‹ŒŽŒ�‘��“�����ŽŒ�Ž���Ž�Œ���ŒŽŒŠŒ�‹‹ŠŠŠ‰ˆ…ˆ‰ˆ†ƒ…††…†‡†…„…†‡ˆƒ�ƒ€ƒƒ‚|}zz{yyzwwwyyxxursqssqtrpnqqrqrqquvuvsomqsqpqqqtutstrutsrrwwvtromkkkhikihiljmjhjfhijhihijjieca_\WNB;8766566655555665669BKRRONLLKLIIJJKLLOOOONLJD;76555556569?EJOPPOMMMNNNONNONOQONNPPOOQPOOONKIHDA@>=<<;;;;::::::9::999999999=HMMMKLNMJKLKLIJE96555554555555555555555665555555555555555555555555555555556666655555555555554555555554544445544455555555567?Snwy|}�€ƒƒ…„…†‰‰‰‰‰‰ŠˆŠ�Œ‹ŽŒ��Ž�Š��‘�Ž‘‘�‘’��‘‘Ž��‘�Ž�Ž���Ž�Ž‹�ŒŽŽŽ�‰‹‹ŠŒ‡‰‰�‡‰‹‹ˆ‡†ˆŠ‰†‰ˆ††…�‚~‚‚}{}}{xy{|zwwyywxsuxtuusttsqsrqsqquusrsrrpsuwvstsstusttuttsututsusollkkjhhhgjjkjiggjlnnlllmnkhfedb_XOC:7666555556655668?MVUROLJHHGFEEEEFILPPPQPONLD:66555556=<;;;;;::;;:::::::::::::999:99999::9999999>JLMNMKLLLKKLKIID86555555555555555566555555555555555555555555555555555555566666655555555655555555544555545555555555555667AU^mvz~�ƒ†„„ƒ†‰Š‰Š‹Œ‹�����‹�Ž‹�Ž‘��“�“‘��’‘��’�‘Ž�‘��‘‘’‘’””•”‘���““”‘��’’‘���ŒŽ“™”’Ž�Œ�ŽŽ‘‘ŽŒŠ‰Š‰ˆ„ƒ��€~}€}||yxywtwyywuvwuuwvurqrtttstuuwwutwvwzvxz{zzwyzzyxwxvstuuuroqmomjillloknkjnpu~|yzxystqmlged_[QA8666656677>U^XPKFDA??CDGLLNOPRQQMJLQUVVSQNH<7667=KOPQRQSRQPQPQQQOQQRMEA>=<;;;;:;;;;:::::::::::::::::99999999999999:9989AEIKMPQSUVUVWTPOSUXXTQNJ<766=JPPQPSUTSQQRQQRQOOQND=<:;;;;:::;;;::::::::::::::99::9999999999999999999;EMMMNLLLLLLLLLJJ>765555555555555555555555555555555555555555665555566666666777666555555555555455555555555555865555555566:GXat|€‚„…†‡‡…†‰‰Š�‹Ž‘��’‘’‘������““““‘‘�’“’��’“’‘“•”•”“•”““•–•““”“•“””•••™™“�‘�’’˜––”“�’�ŽŽ��‘����‹…„†„†ˆ†„„„„€~}|zxxyz{{zxzxyxwvusuutuvwvuutstvyzyxxz{|{zy}‚‚�~}~}zwsrrnmolmlkonllmknx�ƒƒ…„ƒ�€|xwrnmig_XUH:7655668K]UOIEB>=BGLMNPRRVUYWXYXURTVYYUROI<77<@FILNOPQSTVYZ\\[YVX[]\WQNH:7HMMNNMMMMMLKLJKG:6655555555555555555555555555555565556555566556566566666676665555555565555655555555555555555544455566>^ot|~€€‚ƒ‰Š‹ŠŒ‹����Ž�Ž‘��ŽŽ��‘’•“•”’”–““–“•—””•“““––“”•••—•—•––™–—𙕕–˜šŸš™–’””“•–˜™—“”““�‘‘��’�Œˆ‡†‡………†……ƒ€�}{|{|zywz{yzz{}|yustwwzvyyvwxzzzxuux{}|y{}{}€ƒ†„„……„†‡‰ˆ„€}uoppqrnmmnmmmkivˆ�‹‹ŠŠˆˆ†ƒ‚|wuqif_[WSF<7666FYRKDB?;>:8:=?ABDFILPV_gotvush`\WPMMOQRRSTWVSTVUUTQSSQQTSQPQTQQN@;::::9::;::;;:::::::::999999:999999999:9:;<>?CEGJMOOONOONLNMMMLLLKJH<65556555555555555555555555565556656556666666665566566667666555555555555555555555555554555545566667Ekz}�…‡‡ˆŠˆ‰‰Œ���ŒŽ�‘�”‘”•”“”““–—————•˜—–•˜˜——••—•––›˜–˜˜™š˜ššš™™›š™šœ››�žžœ›—šœ�š—˜˜˜™™™™š˜˜–—•’�ŠŠŒ��Š‹‡„…††‡‡†„ƒ‚�€~€€€~}{~~{|}zy{}~{z|}|||{xyz~||zx}}}�‚‚‚ƒ…‰†ˆ‰‰ˆˆ‰‡ˆ„€€}vumnnnjlljhfbiˆ��“•“‘��Žˆ„ƒ{qigd]Z[SMNJISNE?>=:78;=?@BDHMQXafmpqmd][VQNNOSTSRSVUTTWWUVTRSTRPRSPOQSQQOC;::::::;;:;;;::::::99:999999999999:;;<>@DGIKMMNMNNOONOPNNMNOMMMKKLJJ?76555555555555555555555555566555666665666666656566666666666655655555555455555555555555554545556767Ioz€ƒ†ˆ†‰‰‰‰‹ˆ���Œ�‘’““•—–˜–”•”™˜•—––˜š™–•–˜˜˜–••–™š™˜–˜—™œ›››™›š™š›™›ž  žŸ���Ÿœž›�Ÿœœ™››šš›™™˜”’�Š���‹ŠŒŠ†……‡‡…„„„€~�~}}{z|}~}~}}~}}}~|{{||~}{z||{{€€€��ƒˆ‡Š‹ˆ‰‹ˆ„‡†ƒ�}uspnqnmlkligeet…��‘”“““��Œ‹ˆ}tmjc\\`YTVRJKJD?<=;878:=>@BEIOVY^eid^YWSONOSRSRRSSTUUUVVWTJHSURPRRPQSTRQQC<::::::::9:;;;:999:99:99::999::<<>CFHIKMOOOOONNOPQOOOPONNNMOMLOLLLLJC86555555555555555555555555555566666666666666665656665666666656555555556656555555555555455555555678Qv{‚„…††‡Œ‹Œ‹ŒŽŽ‘��‘“’“”•–˜˜••–—––—˜™™˜•—•—˜™˜˜—™•——–—™˜–˜›�žœœ›žœœœšžŸ¡žžŸœœŸ¡ž�›ž�›››™š››™˜˜•”�ŒŒ�ŠŒ�‹ˆ‡……ƒ…†…ƒ�~~€€�€~‚}�€z|~~~€‚~||}}}||||{z{yz‚ƒ‚„†‡†ˆ‡‡†ˆ‡††‡„„‚}xttppmooolkeedl~‰Œ�“•–•’‘��Š‚{qle`baY[^YOKID?<<<:8889<APSSQSPQSRRQQPE<:;::9:::::::;:999:9999:::;dx~�ƒˆ‰ˆˆŠŽ��Ž����‘‘“–•”•˜˜—•–—˜˜˜š™™™˜˜šš™š››š˜™–•–—›™™˜›››œœ›žž›œœ›œžŸ�  ŸŸ Ÿžžš›œ››�Ÿ��œžš—–’’ŒŽŒ‹�‹Œ‰‰†…†ˆ‰†ƒ€�€‚ƒ�€�~|~}}€…„~}|€€€|{||~||}{{~|yz|€„…†‡Šˆ‰ˆ†‡†‡…ƒ„„…ƒ}xwurqoonnnlkgbdr‚‹‹‘”™—–’”’�‰�wojda]]b`[VUPJC><<;;:999;<>AFILPONMLLNOQSQRRSSTTSTTTVTKB=@CFKNOORSOPPRRQQQQQRRQPOQOQQQRPQPNMNNMLNMKMLJ>765555555555555555555566555666666777677677666666666666777666556665555555555555555555555555555667Bk{ƒ„‡‹ˆŠ�Ž�‘��’‘“’“”“’”••—––••™šš˜›˜™™››œœœš››š™˜—˜š›™›™›››œžŸ Ÿ�ž Ÿ¡¡Ÿ�ŸŸŸ ŸŸžœš˜�žœ Ÿ  �Ÿ�š–”�‹Œ�Œ�‹Œ�Ž‹‡†ˆ‰…ƒ�€~‚ƒ…‚€€���€��€|€„„�‚�~‚€ƒ~{}~~~|z‚ƒ‰‹Š‰‰ˆˆ‡ˆ†††ƒ„„…‚zyvsqoqtpookigbhwƒ‡Ž”—•–”–”‘އ�xqkc^cgd[ZYVRME?<;<;;;<<>ABDGHHJJKNPQRTQQRRTSTTTTTTPE?<<<>MUSSSRTSRQPQRI=:;:::::::::::::;<>ADHJLNPQQQSRRQNQQSRRRPQQQRQPQPPPPQRPOOOMMNPMMNLKLLB755555554555555555666566666676777777777777666676666666766665555555555555555555555555554555565667Bgw|„‡‡Š‹Œ‰ŠŽŽ�‘‘’��’““”�””–™–––™š›˜™š˜˜™œ›œ›œœž›™—•˜›˜—™š›œžžžŸŸŸœžŸŸ Ÿ¢ Ÿ�ž žœžœ�œžž�Ÿ ŸžŸ›šš”�‹ˆŠ�Šˆ‰Š‹Š‡„„ƒ…ƒ‚ƒ‚€ƒƒ…ƒ‚„€���€�~€}€�‚‚€€���‚�~~~||}ƒ‡ˆ‰‰‹‰‡†‰ˆˆ…‚…„…„€yy{utqrtppnmlfcalz„Š‘’——–—”“�Œ„xpfckld\^^[XUNHA=<;;<===?@@CEHKOQQQQQSQSRRSRTTTTRI@<<<;;;:::::::::;;?@CFILNPPQRROPPRVQPQQQSRQQQQRRQQRQQQQPOPQPOOONMMPNLNMKLLF:65555555555555566666666556677788889888878776767776666767666555555555555555555455586555555555667Diy‚…†‰ˆ‹‰‹Œ‹�‘‘”“�‘’”–”‘‘••–”—š™š››››š›š™œ›œœœœ›˜–˜šŸœ™ššœ�ž  £  ŸŸŸ £¡¢Ÿž ¡ Ÿ�žŸŸ›žŸž¡¡žŸž™™™—‘ˆˆŠŠŠŠŒ‹‰‰†‡„ƒ†…„…†ƒƒ†…†‚‚‚ƒ‚‚‚‚�}}}|~€�ƒ€ƒ†ƒ‚�ƒƒƒ�„†„‚€€€�€ƒ…†ˆ‰Š‰‹‰‡‡‚ƒ…ƒ†…ƒ|{{ysruuqpqllkecdq}†��”–•–“”’�‰„�rjmrpgbdb]][XRMD?<;;<<=>AFJMQQRQSTRSSTSSSSSSTSLC=;;;;;;;GQSRSTTUTPQSQL?::::::<>@BFHMQPOPQRSRSRRRTUSRQQRTRRSSSSRRQRRSRRRRPOKHJQNMNMLQPLONJMLI<75555555555555566666665666799::::99898888777776677666777666555555555555555555555555554455456677Lqz€ƒ‡‡‡ŠŠŒŒ��Ž‘“”’““”•“’““”———˜˜—š™™˜››š™™œš™œ™˜—˜˜šž›ššœ�›� ž¢ Ÿ    ¢ ¡¡ £¡�žŸ  ¡›œ  �� Ÿœ››––‘‹Š‹ŠŠ‰ŒŠ‡‡†‡†‡††††…………„„…†ƒ‚ƒ„„�€€€€€€€„…‚‚…‚�ƒ…„„ƒ‚……€}‚ƒ~~}‚„ƒ‡‰‰ˆ…�…ƒƒ†ƒ�ƒƒ~{{xvtvpqqlnnhgdds€†Œ�””•—“’��‹ƒwtyzshggd`b^\YUOF@==>@DIMPPPTTRRRSRSSUSRRTUSLC><;;;;;;;;DRTUTRUURPQSRNB==>@AFHLOPPPQRQRRRQQSRSTTTSQSSRPRSSRRQQRRQSTSNKHD@=<;>KNNONJMPMPNJLLJA75555555555556666666656569:;;;;<;;;:::999877777766666777665666655655555555555555555555555555668Nr}ƒ†‰Š‰ŽŽŽ���’“”’“”—•’––˜™—•˜š™™š—˜š�›�Ÿ�œ™™˜›™ššœœš›š���›Ÿ£¡ŸŸŸœ�¡¡¡Ÿ¢¢ ¢£¡�¡¡ž  �ž ŸŸ  �œ�™—ŽŠŒŠ‹ŒŠ‹Š‰‡†ˆƒ†„†ˆˆˆ‰‰‰‰†…†ƒ…ƒ†„†…�ƒ�ƒ‚‚„†‡„…ƒ„‚…‰ˆ‡‡‡„„€{~‚€€€~€‡†††„„ƒ‡…†ƒ�ƒ‚‚}|y|zwvrtsqrmkhcagu�‡Œ‘•—˜–’�’”‡|€�tgnlhihea_^YQHCHKNONOSSSVTSUUTTTSSTRSSNE?<;;;;;;;;;;BQUUTRSVRQRSQRMJKLOPSQRRRQRRRSSQSSSUTSSRRRSUTSRSSRSSRRRQNJFB><<;:9::;EOOONLMONQMKMMLE9665555555556666666666678;>@?@???@@?><;;::98887777776777666555555555555555555555555545555566668Lr|€ƒ„Š‹��ŽŽ���‘”–““•—•“—™—–˜˜š™™™™˜˜��›™›žž˜˜›š™š™›™š™™�ž Ÿ� ¢ŸŸž�ž¢£Ÿ¡¢¢Ÿ ¢ ¢¢¡Ÿ¢¢ žž¡ŸŸ¡�šœ˜‘ˆ…‹ŠŒ‹‰Š‡‰‰…ƒ††‡‡…‡‰‰ˆˆ‡†‡‡…ˆŠ…‡†……ƒ‚†…ƒ„ƒˆ‡†††…†ˆŒŒ‰‡‡ˆ‡€~€‚‡†�|{}�‚……€‚ƒ�„‚‚ƒ�„}}}{}yytttrroljgd`jv‚ˆŽ‘“–—”’’��‡‚~uotqpomggca_XRLJNPPPQRSQQSRUUTUSRSRQLD><;;;;;;;;;;:;?PUSSSTVTRRRPRQPQRQRQRRQRRRTTTSRSSSUSTSRSTUTTSSSTRQNIEA?=;;:::::::99:?LMPPMNOORLMONMI;66555555556556666656668;>ACCCCCDDCC@?==;;:8877766667777666665555555555455555555555555555556678Vw|‚†ˆŠŒŽŽ���Ž�’“••“–”••–™˜—™™—™œœ™š˜š›�›œœ›™šš›™™™™˜š››�žŸžžŸ¢ žž–�¡¡ Ÿ£ ž  ¡Ÿž�Ÿ ¡���Ÿž�žž�›˜Žƒ†ˆŠŒ‹‰‹Š‰Šˆ‡ˆ‡‡†ˆŠ‹‹ŠŠ‹‡‰‡„‰‰…„…„ƒ……††„„ƒ‚………„„†‰Ž�‹‹‹‹‰…ƒ�‚„„‚€||~�‚€€‚‚„„‚�ƒƒ‚‚}z}}|xtssttrmkhbamx†ŠŽ‘’‘‘”�Œˆ~}wz}xutqmkifc^ZUMLOQPPRRPRQSRTSSTSNGA=;;;;;;;;;;;;;;;?MSRTTTTTRRSQQSSRRSSRSRRRRRSQRSSVSTSRRRTTUUTTRNJFC?=;;:::::::::::99::;HNNQMONONLMLPMJ>7555555555656666555567:=ADGIIIIGGHEC@?=;:98777776666777666666555655566565555555555555555566669Zy„†‰‹‹ŒŽ‘“’��’““••–––•˜™—™™š˜™šž››™š››šœžŸžžœ›˜˜–˜˜˜›šž žŸ  ¢ Ÿœ�ž� Ÿ¡¢¡Ÿ¡ Ÿ Ÿ¡¡¡ ŸœžŸŸŸ ¡ ›–‹‡ŠŠŠ�‹‹Šˆ‰ˆŠŠŠ‹ŠŠ��Ž�Œ�Ž‹‰ŠŠ‡…„ˆŠ†‡‡‡‡‡‡†…‡‰††‡ŠŒŒ�Œ�ŒŠ‹‹†‚�„…†‚}~��‚ƒ�…‚ƒƒ„…�ƒ€ƒ€~~zzxvtustsnifacmw~„ŠŽ��‘”�‰†ƒ…�~‚…}~ywtqpnje_[VPMNQURQSRSSTTSQJC?<;;;;::;;<;;;;<>ADJPTTUUSTUTQTQRRRSSSRSSTTSSRTUUTRSTUTUVUUSPLGB@><;::;:::9:::9:9:::99:9:CMNNOOORNLNPPMKB86655555555655565655679=AEJLNONJIHGDB?=:98887677677677776655556565555555555555555555575555677:Zu�…ŠŠŒŽ�”“”““”“’•””–•–——˜™™š˜˜››�œ�œ›œ›œž�žž�œ™˜˜šš™™›�œœ�  Ÿœœ›žŸŸž¢¡¢¥¢£Ÿ ¢ Ÿ�žž���ž ¡£¥¡š”…‰‹Ž����ˆŠ‹‡Šˆ��ŒŽŒ�ŽŽ������ŒŠ‰……ЉЉˆ‰‡‡…‡‡Š‰‡ŒŽ‹‰‰Š‹ŽŒŒŠˆ†ƒ„‚…ƒ€€~‚‚ƒ‚†‚‚�‚…��ƒ‚€�{|{xxytqsnlic`ert|ƒ‰‹ŽŽŽ�ЇЋ‡‡‰†„�~}vtsnjfa]XRKNRQRSQRRQID?<;;;;:;;;;;;<>?BEIMQSTSSTUUURTUSSSSSRQRSTSSRRQSSSSSSSUVVSPMHB@>=<;;::;:::::9::99::::9999::9?JNOOOQNNNPOLMLF965555555556665555666789<<;;;;::;;:::::::9999:::99999999:;:98887776766767877766556555555555555555555555555555566679Xs{ƒ†‰‹Œ���‘‘’““”–™˜˜•—˜—˜š™˜šššœŸŸŸœš›žšš˜››™ž›™šš›����ž¡ ¡¡ ¢¢žœž žŸŸ££ŸŸ ¢¡ �œžžœžž ¢£¢¡œ—Œ|‚ŒŽŽ�Ž�Šˆ‹ŒŠ‰ŒŽ‘Ž�Œ����Ž�Ž��‹Œ�ŒŒ�Ž���Ž‹‹Š‹Š†ˆ‹‹‹‹Š‹�Ž�‰‰‰ŒŽ�‡„��€}|y{|~‚‚~}€„‚~€‚…ƒƒ~~}|zyuvtpnjd`bntxy|‚‡‰Š�‹�Ž���ŽŒŒŠŠ‡‚}wurohc]XQLJID>;;::::::;;<>AEJMNPQTSSRSTRRTTTVWTVTSRRQPRSRRQSTSTUUTUPLGDA><<;;;::;;;;:::::::::::::999:99999999:9:DOOPONPQMMMMPOL>66555555556655555566667778=;;::;;:;:;:;::;:::::::::999:::::::9::99::::APPPNQQMMNPNPOMB86555555666666666666667677;EHEB?<:98767777777777778877776665565565655655555555555555555555668Lp{}€†ŠŠŠ�Ž‘��’“•“•˜š™–˜™——™™›™šœœœ��žœš�œœ�œŸŸœ��š™›™›ž žŸž¢  ž¡  ¢¢ŸžŸ ¡¢Ÿž ŸžŸ  ššœ ¢¡Ÿžž›”‚z„Œ‹ŒŒŽ����Œ‹�’�’Ž��’‘”””“”‘��‘�‘‘ŽŒ����‘Ž‹‹‰ŠŽŒŽ��Ž•˜��Œ‰‰Š�Š‹‰†�€}zxx{€~}€€~ƒ‚†Š‹‹‡‡�ƒ}}zvurmjf`^gntwww�†‹‹Š‹�Ž�’“’�‘’‹‡…„~{tnkf]UYXVVQKD?ADHLMOPPRRSSRSRTRTUSSSTTTVWUTUSTSTVTTQTWXVMFA><<<<;;;;;;;::::;;:::;;::::::::::::99::::::::::::?777876655666555555555555555555655555555667@ex~�„†‡‹Œ��Ž�‘�‘“”——––˜™–™™™š˜™™š™››�›˜œžžžœ���ž�›˜™š™šž�ŸŸ �   ¡   ¡ ¡¡ ŸžŸ��œœ››šœœ�œŸ Ÿ›—Œz}„‰ŠŠ�Œ‹Š�ŽŽ����’��’�“““’””’�‘�‘‘�’‘����Ž�ŒŽŠŒ�‰�Œ���’”�‹‹ˆ‰‹Š‰†…„�‚|{yv|}|~|z|}€�‚†Š�Ž‹‰…‡„�|zywpnifaYXckpttx…‡ˆ‰ŠŽ��’“’”“ŽŒ‰‡‚{vqmg^]_^[[XTQKJNPQQQSQRSRSRSTVVTSTUVTSUWWUUUUTUSSUXSUYZH><;;;;;;;;::::;::::;;:::::::::::::::::::::::::;;<>@CHOPPQPOPPNOMNNOOJ:6556665677:;9776777767678<><:87777767777789<@ELSWU777766665655655555555565555555555555555677;Wr|�„…†‹ŽŽŽ���“�‘•–––™™˜˜š™—˜š™™œ�œœžšœ››™›š�›œ›š˜˜ššš™›�žžŸ›  Ÿ¡¡  žž  Ÿ�œ�œœš™š™–——›� Ÿ�›•ˆv€ˆŒŠŠŠ‹‹‹Ž���’‘“‘�’“’•“””–““’“�”–—–‘“‘‘“‘“���ŽŽ����‘“’Ž�Ž‹‰Œ‹‰‡‰‡†��}zyy{z|{zyyy{z~ˆŽ��Ž‹ˆˆ‰ƒ~{||xsrjgb[GKV`hljnv~‚…†‰Œ‘�‘““��ŒŒˆ„€~wqkbfedba^ZWTRONOQSSRSRSTTTVUTUUUTTUVVWUUWVTSUSRUYTTWXH=;;;<;;;:;:;:;;;;;;;:;;:;;::;;::::;::;;;;;;<>@DGJMOOPRQRPQRQOOPPNNNOL<76665557ADHJNPQQQQQRQPPRTSPOQPNONONOO@7666556:?=?DFIKIHGH=76667777779;>BGKQVXYYXYVTSRPOK8777777565556555556565555555555555565556667Bew}�„…ŠŽ��‘‘‘•—–––”“•––––˜™šœš›››�œ››š˜™›™›™—˜——˜—šš›ššš›œ��žŸœ¡ Ÿ� ž�œ�˜™˜—–’“—’‘”–™˜˜––’€z…Œ�ŒŠ‰…ˆ‰Š‰Œ�‘‘���’”–––••’•”•‘“•˜——•—˜™—•““�Ž�Ž���Ž‘“�’��Ž��‹ŒŠ„‡†�|yywwxwvuuuuvuttz„�‘���ŽŠ‡…„€~|xtplifU@;::9:DXcgpx}}�ˆŽ��ŽŒŒŠ‰ˆ„~{vonookmlgb]XWY[[[TRSSSSSSUUUSVVWXWUSNJGMTUWVTUTWZTWWYUA<;;;;;::;;;:;;;;;;;;:;:::;;;;<<<=>ACFJNPRSRRSRRQRSPRPSVRPRQOOPPPQNPPC86666678:>B@>;98777666666779;?BEEECA?><;;:::><;;;:7766665555555556566555555555555555555566667;[ryzz{‡‰Š�ŽŽ�‘’•”””–––—–•–•˜˜™œœ�š™›››š˜˜˜˜˜˜–™—˜˜™šš˜šœœœœ�ŸŸŸ¡ žžžžœ�ž�œš˜˜—•––�Œ•˜˜—˜—–�z~ˆŠ��Œ�Љ‰‹‹�Ž���“‘�”••–––––•–”——š™˜™˜—˜œ—–”����Ž��‘��’’�’Ž‘Ž�‹ˆ‚„†ƒ|xyxvvvtusqrttnktƒŽ���”�Œ‡ˆ†�€}{wspmli[D<;;:88?Sbikos|ƒŠ‹�‰‰‡„††ƒ�~tpsssnqnid_]YWX]``]VQRUUUVWVWWUQLFB?=<877777787766666665667676777777789887877667<<;;;<;<;;:;;;;;;;;;;;;;;<<<==@CGJNQQRUXVSSSSRQSRRPPPRRSVTQPSSQRRRPQPTWZ]cccXLA97766666666666676666566666666:;::998987778<<;;;<;<;;<866666666676666555555555656658=>>=====>==:99<787776666666665666666566565555555555556566676:Hanu{z€†„ŠŠŠŒŽ�ŽŽ�‘‘””“”•“‘‘‘’––•”•–•–”””–—˜–––˜•—˜”–˜˜˜—–—˜š™—˜™™—™—˜–™—–“’‹�kfsuu{ˆ‹�…rp|�ˆ‡‡ˆ‹�‹‹ŒŒˆ‡‡‡‰Œ�Ž‘•��‘’“•—›™˜™˜œœŸŸ���š™—‘��Š‰ŠŒ�Ž‘”’Ž�‹‹‰‡†€��|{{{zyyvsrssppqohhz„‰�‘��Ž��Šˆ…ƒ}}wusmje[IGKMPRRSSRNDCM]fjmqw}‚��ƒƒ����ywrnomkhhfecb_\ZJ=<<<<<;;;;;;;<<=>LWYUUZYW[VTSWXL>==<<==?BEGKQQSSUUTSSVTUUTSTSSTUTTTRSUUTUTSRRTVXZ]befggfd_ZTKD>:9778<:877766555555555555566778999887777=GKLNOQPQOMMKIF77776666565555555665556666555555555555555667679Ganuu{€�†…‡‰‹��Ž��‘‘“’“’“•’‘‘––•“”••–‘’“”“—”•–•–••”•˜—”—•——™•”•—––•”“’–—“�އ}kceZdw�†…~lp|�…†‡†ˆ‰ŠŠ�ŽŠ…†ˆˆŒŽ�‘’��‘”•”–—˜–—›œž ŸŸžœœ›—‘�‘�†…‹Ž��‘‘��Œ‹Š‡…€~~|{|{z|zyustsuvsroiev‚†����‘�Šˆ‹ˆ…€zzwrojdYOQRRRRSTTSTRMEEP]ejosw}‚ƒ�€~}€…‡}ztvtupmmigfbabR?<<;<<<;;;;;;<<==EVYVVUVZXUUTXYSE@?AEIKOSUVUUSSTTVVVSSTVUUSTTRRTRSSRRQRRSTW[_beiiiigb\SKD>:98777777:JA8665555556789;<;999::::::988776677;ENRTWWWWWUURQ877766665555556556666566555555555555555566677779Eaorwz�„…‰‹Š‹‰���‘’‘��’“’‘“”•““•‘“”““’‘”–•””“’“’’“”“’“‘”““’•““”•””’”“‘‘�‰…{pkbFOnz€wjox{……‚„ˆŠŒ��Œ††…‰ŒŠ‰‹�Œ�””••™––”™™��œ�¡Ÿ�Ÿœ˜”•“ŽŠŠ��Ž����’�ŽŒ‡ƒ€~}~€€}}}zvvwtvvtsokeo|…‹���Ž‹‹�‹‹Šƒ|zvroldYQSRSRSTWUSSVWTMEGT`giqw~}���ƒ‚‚€}vy€‚}zvpmjfeeZB<<<<;;;<<<<<<<<A<86777768=?:75556665555556555555555555567>M\_bbb^]^77876766666656555565555555565565566656566668777778?Qbjorx}€�‚‡‡ˆŠ‹Œ���Ž���Ž����’�Ž���‘��’‘’“‘”�’‘��‘���ŽŽŒŽŽ���ŒŒŽ’‘ŽŒ‹ˆ‡…�vj[OE>;>Mblkqprw{€�„†ŠŠ�‹†Š‹�ˆŒ‹…ˆ‹����Ž‘’“–šœ��¡¢Ÿ Ÿ�œš–’’ŽŠ‰‰Š‹��Ž�Ž�‹‡ƒ€~|{z|}~}‚�}|zzyxxyyutnifq|…‰Œ�Ž����Œ…„~yvqmhc[STSTTUTUUUUUTVTUVVPLLRZfpuxy{|z}€ƒ†‡~yz„�•›—‡~xpjg^C<<<<<;;<<<<<<==?DQWSUWVSSUWUUVYWXUUVUTTX[ZWUSUUVTUUVTRTTUVY\adggjikie`YPG@<:8877877676666777667776666666:>?;765555555555555666666667766555567=IYdgffb877766655666556666665666665666566666666666766;:9878:AP_korx|�‚††ˆ‰Œ��ŒŽ�Ž�������Œ����ŽŽ‘Ž������ŽŽŒ�Œ‰‰ŒŒ‹Ž‹��Љ‰‡Š�Šˆˆ„„�xj\OSQLA=>AR`oprsw{~�ƒ‡Š‹ˆ†Š�Œ‹‹ŠŠ‹‹��‹Œ�‘’“”šœ�� Ÿ ¢   ˜–•“��‹‹‹�ŒŒŽ��‹‰†„~{yxxz~€€€€}{}}{zxyztsokehw�†ŠŽŽ��ŽŽŠ…ƒ~{wnjjfZRUSTSUUVVVXYXVUVV[VZUSJM\iqrtwz{{‚„…€yz�Œ”©´›†~vph\A<<=<<<;<<=>@ADHLQUUUVXUUVWVVWYWUUVUUWXWXVTSVVUUVUTTTWZ\^dejklkke`YQHB<:9887898776665668:<<8665666666779::8666656666778889:;<??><;>A@<:9877777778M^iosw|~€‚‚„††‡†ˆˆ‰ˆŠŒ‹Š…‡‹‰‰‰ŠŠ‹‰Š‰‰‰‰‹ŠŠ‹‰ˆˆ†„†„ƒƒƒ‚‚~~}zwtqh^YTONOTVUOE=::BZjqpsur|�…ƒ„ƒ…‡ˆ‰�ŽŒ‹ŒŠŠŠŠ‰‹�“–”˜›œž��›�Ÿž››™––•ŽŒŠ‰Œ���Œ‹Šˆ†€zutvwx{~€„ƒ‚€�€~{yzutqmj`gu~†�ŒŒŠŒ�‡ƒ}yvplhbVUUVTSQMIFA?=<=HUWWYYVYVVWPP[cinrxy{~ˆŽŒ†‰‘›³Ä¬�~uiK>>?@BDHKOPSVVWWWXXVWTUUVSOPTVVVSSXXXVVYXVWYW\]^dgjlkljh`WNGA<98778877777666668655566666666656789987766567:>BFGGGDBA=;:9999::;<>><;<;9777666766767677798877666556565656555556556556666666655666666666667777878879?N[dkqtwz}�‚ƒƒ„„…†ˆˆˆ…‡††ˆ…††„……ˆ†…††‡††…†„ƒ‚€€�}zzwyvqmg`WRUVSOLNUXVSOF?<;>Pgmnopy~~€‚ƒ……ˆ�Ž��Œˆ‰ˆ‡ˆ�Ž�“•—™››ž›šœœŸž›–˜–”‘��ŒŽ��ŽŒŒŒ†‚zqoottw‚�……ƒƒ�€|||wusojbbny‚‡…ˆ‡ˆˆ‰†�{ytnjg\ONJEB?=;<<<<;;:9:9876666789;9887777776665555555555556545556666678887666555666666677999998878899;=@DFILNNPPMJEB@=;;<=>?@@><;:88787776666665555556566665566566666666666666666667777777678887899:?GQ[aiprvwxvyx{|{~��~}|}�€}~||~|~~{zwvpnje`^\ZXZZYQRVXUROSXVTPORVVUROJMPH@<MX[]YYYY\Y[_][E?@CKYekr{€‚‚ˆŠ˜�~ma^]ZXWYZXWWWVVWWWXWTLFLLDEECFHFJKHQQOZfjkid]VMD>:98888877776555555555555555665555566767:;:8666555566666766777789:;=?BFLPRTVSKC<877:>CGHD?<:988888766666668877666666666656566655555656666666666667666666666677777788879<888;>CIRX`dfgmnotuwyxwxvwxwwutxvtuusqnje_ZUTQRRTSVVWRQYWTSQQUWVRNPWYUSRNKUVOE=:?Pfquxy}y|{€‡ˆ‹�Š……ˆ†ƒˆˆ‹Ž‘•–˜™™›™›žŸŸ�œšš˜˜—”�����‹Š‰‰…�xtrla[kw€ƒƒ…†‡†‚~€{xwxvnhf\\dlsy�‚�€�}wsmhaRB=;;:;;;<<;;;;;;=HW[Z[XY[[[^b\`K@@@ADKWbjtwx}{rjd`\[YZYZZXVYYXWWXXZZULDINIBEINQLKGFPSSNIMJC>;98888899:9876655555555555555555555555556777766665556656667789<>BEGJJKJHFHIIHEA=:77665666677777776667666666666777776665666666556666666656566566665666666666666777877777887:;Fcoqvzxxv}�„†‰‰„‰Š†‚…†ŠŽŽ‘–˜ššœš�Ÿ¡ž�›š˜™™˜•’��Ž��‰‰ˆ‡…}wtpkbepy~‚†‡‡†ƒ��}{xvrpie\[bipu{{}~}{xtplg\UQIC?=<;;<<;;;;;<@?@???>=<;:987777888:<>><<:999:>??@A??<;:9988888999777776665666666655655555556665686666666666666666667777777777898887777877888888999<>@@@BGLNQX\^]]YXUVXZVVVVTTQSVWWVTSVXXVSSVVXUQNVYVVROKSXYYRI@;;C\mqtxtw|�„ƒ†…„‡…†�†‰Œ�“––š›�žžœžŸŸ›œœš™–—˜•“’��ŽŽ�‰†�{trnjcir|‚……„……ƒ�€}wsqifZW[bhoqw{{zvqokf\UVUUSQLHCA@?>=<=<=>DRWYZ[ZYZ[\]Z]ZY[^_````abcdedfba`a_^_[YY[[Z[ZWUQNPMLVWMQ][MAKVZZO@AWbe]RH=8879;=>BDMX[\UG=:9765555555555555555555555555556656666777665666555665555666679>JPOIDBF?<;;:99999:;<<<;:999999:;<><;777766666655565666655666766666666666666666666766677777777777787887888888888778777889:@FKSVXYXVTVWXZ\XWUTVTUURTUUWWVQT[\YXTVY[WRNTZYWSOIMZ^[XSPNLF@>FWhnnu{|�€€‚�€ƒˆ‰‹Œ’•––™œŸŸ�ž ¢¡ ŸŸ��›œœ–“‘’�ˆ‹Šˆƒ�ywpnlgerz�‚‚‚„ƒ€€~|{wpnf]\^Z[_djlmmg`ZTUUUVVXXWWWWXWVVVVXXXYXYZ[[Z[[[\[]^_`__`\[]]_`_`a``_`_^`^]]\\]]acdgknnfVX\VG>BOVZXRSW\abZVY]`abZURPMILW_SD;76555555555555555556555555555566665666765665555556655666778:>FMLID@><;:<9889899888999:::998899:=?><;:88877666667666766666666686656656655556666666666777777777887777778988888878887888899ADJOTTRKB?=;::9999:::;;;;<<;:99999989:<==>=<;98777766667766666666666656666666566666666666666677777777777777778888778777787778889>CJPUVWVUWY\XWVTUUSSRTXWVSTTXWZYXUSZ\\YWUZ]ZVRRYYXTOHJX^\YXUQUYZWQG@@H[lrtw}{zxzy}|�‡�’•˜–�ž ¡¢¤¢�ŸžŸ ŸŸ�™›š˜•••��‰††…~xtrqngo|�ƒƒ€‚ƒ‚}xvsnibXIGFFHHHC@CMUTUTWWWVUVWVVXXXXYXWUXZYXXZ\[]]^\\]Z[\^_]\]]^]]^^^`a`bbdfimpqrqmie`WNG@;:9:BMU^`[YW]``]]]`bbdab_`acbbab`T>766655556655555555555555556655556666566876666689;<@CEHHIKMLLMJGFDDEFFGGIJLMLLLKJHHKRSRPHIIIHFEGKSWVQNKJE878776666666666666666666665566666666666666666676677777677677776787877877778888889>ELRRQSSTXXXZVUSRUTRSRTWWWUWWWXY[YUSZ[\YYTY][XRQV\YUPLIT^\YZVRUZ[[XSKGDCNZgpwxxvwy{}}†�’”•—šš� ž ¡ ž�Ÿ¢¡�œ›Ÿ™™™••“Ž‹‰‰ˆ„|xwrpjhs�€�‚~yxtrkh_UIHGHHHGD=9:ALTWWXXWWXWWXWWVYWXXYXYYX[]a]]\\ZXX\]`_^___`___`bbijlortvtqmf^TLD>;::98877779>KUZ\WWZ[\[]a^\^bcaaaacdb^R=76655555576566665565555555656556555566687667;>?AA@?>=<;:::;>AEKRSPKGDBA?>>=<;9998889;<<<::::999:;>@A?<:::877766556666666666666666666666566566666666666666676777787777877777777887788889;?CHLRVSRSUUTSUVRQNMNMMOPVWWWUWUVYZZXXTY^^YYTU\\XQPUZXWSMJPZ\\[YSSX[[ZUQTVNGDGUclporwtxy€‡Š‘•””—™œ››  žœ  ¡œžŸœ�œ™—–““��Šˆ‡†��ztpmilx}}~€~}yvsnjf_RIIIJHHHGFB<99=FPZZXYYWVYXXXXYWWYYXZZ]^\[[Z[\][]ba_^`aceeflnptwvusph^TKD?;::9:9765776555555555555555555556766667::887888999:<=?CDHJF@;876666666666665566666666666555666666666887776666666666666666666667666666676666666666666666667777787888777777887888:<:99999:<>:9:8767776677789>DLSY[]]^___]_baa`XI;876666665559D9657<866555555555556665566555555667888878899:98766666666666666566676666556666566665666655888766666666666666666666666666666767677666666677777666767777787777778899:=AEKPSRRSTVUQNKLORTTPQVVSORQQOTX[ZYZZY[\\\ZWV\`\YYY^][VSRZ[XTRLLY^]\ZUQW[^ZXUU\[ZZVXTMHEJS`hotru„Ž‘�‘�—˜•”“™ž£¢£¢¢¡žžŸžœ�™–”‘“��Š„ƒ€~xtqjgu~~}zzztokd]VLKKLLKJJJJJIIHE?<988:=DKPV\]_^]^^_``adfeecehknqonrtsrnmjg^VMFA=<;;;;;:988789:887777777777777789;::FTZ^^]_``aaa^TC:766656556556;A9668?87776555556665599655555565666789:<>@EJOVYSC966676676778878999::::=::::98899878778:;98887687877666666665556665666666666666666676776666677677777777777778877899:BHLPSWZ]acbdeecdbb`]ZUQMIDB?=<;:;;<>?@A@=97779:9<9877777777677778989GTY_`__^]ZRE;86666675566569@H@77;>867966656766655555555555666;@CEHHGFFFGHGB<989::;<>?ACCDFIHIIIIIIJE>IKLKJJKKIHHHJMPQIBAA?:88877666666666666666665666666666666666766666667677666777778889999;:888888899::;<=>=>>===<<;;;;;;;<=>?@AAABAAA@?;76667:A<877777777777789;JUC:78=BHIJHE@=9766666668655557?ER>78@A778865558:76655665555555656:::9988877789AJKJKNPNLJIGDB@><;;::999:;9:;;<=>??>>>>?@B@<98888877766766666666666666666666666666666666667777778877789;;;<=>@CB@AHOPSSQPOPQRSRQOKIIJILQNMMNOQQQOOQOQOPRTZ[^^\\ZZ_a^\[V[ba__]Z`^]XTW_^ZXSOR]][[[UTZ^^ZXVY_`_]V\\\ZVY`[TKEABXpz|z~ƒ‚�Š�‘–š™šœžžžŸŸŸŸ�š™–—–‘��‰‡ƒ€}upjajsrrpoogbZQKKKLLMMLLOMLMMLLLLLJKKJIIFCA?>=;:999::99:::::;;<<=>>?AABCDDBBBBAA@@@@@=877779=;98777777777789:CZUB977677877777766666666655669CBLT=77AF889976667;7765666555555665556666566667:HTSMIFC@<::9999:9:::99999999;=?AABBBA@@@?@?>;86666887777766666666656666566665666666667777899;<<=>><;=?ACFFEDDFHJJKOSURRONONOPPNMMLJKOUSTRONJHINPNNPNNRUVUW]^^^^^Z[__``^YYa`__a[`_^[WV^_ZYVPS]`]\]XS[^^\ZXX^a]]WZ]^\[W]]YVTPJFKYflrxxy€…Š“””–™›Ÿ ¡¡¡žŸœ™˜˜˜””�ŒŒ‡ƒxskbdqqolhgb]QKJLLMNMLMNONLMMLMMLLMMLLKLLKJJIHIHGGGEFEEEEEEEEFFGHGHHGEEEEDCBCBBBBBABBA<87789:;:9777778888889SH967@H::9977668=8666;765555555555666666667:AHC><;<==<;::999999877777788889:><:866668788776666666666666676666667777889;;;;==@@CDDEFECBCGGIIIJIJMKMQTSROQRPQQPLKJLJNPSUWWQOPNNLKMQKKMOQUYYVU]a]\^__]\]^ac^YX_a`^b^_aa]YV]a\XYTTZ_]]_[VY__]\YW__`^ZZ]`]ZW]a`YZ^ZRPONMRZ`hu~…‹ŒŒ‘˜›œœœžŸ Ÿžžž�™•–’‘Ž�‡€yumd`lojheb]SLJKLLNOONNNNONNNNMONMNMONMLNLKLLLLLLNOMMNNPPQQPQSQOPPOONMNLKKKJJJJJKKJKKID:8889:<<:88888889999:=AD?;997766666677666668665567>OMAGR<667AI:=;:8668CF9777D;765555555566899:<@ELQLE@====<;;:;<<=>?CFE<777=DC;9AFILOQSTUTQONNONMJB977688888777767666666666666789;=>>@BBBCCCCFEFEGIGHIIEDEFHJLKKLLNQSTSRRRTSQQKHHIMPSVWWTSQONNOONOPOOQUVYWWUSS_c_]``a^\\_`b`ZX\bcaba_b`_XV\a\[\WSX^]`a\XY_`a`ZV^ac`\[_`_[U[a][[]]ZY\XULCIYfovwp{Š•—™š›ŸŸžŸ žœš™––“��‹‡†~yqf^gfec`\RJJKLMNNPQQQPOOONPNOOOOONNONLMMLMMMMMMMNNONOQQSUSSRRPPQRQOPPOOLMKLNMLKKKMLKJB:889:=;;::98666676666676666678DGKNRUUWPJDA@?ACFJJHJKHIHFEED@:7668;;889;;;;;;;:999:>EJIC=876688887776766787788889:<;C@=;:999:9:::;<=<;;;::766566666667778;AN\XJDSO<7658FUIEAMS<8?J;8876@Q?866665677=HJHFECBABENXZWVTTRMD=;:9877777667776666666665555666666677765556888777789:;>?<<>==<>?@>?DEEFEHIHHIHGEEFGHGDHJIJJJLNMKMOPOPRPNMMOPONMLIGMPQPPOOLLJIKMLLMKLNPTVYXUSPQRQVX\_^\]`aa]^__ca^Z]ddfca]db^]YZcb^\ZUT_a_]^YT[b_^]YXaaab[]`a`Y[beaZZ][Y[\\W[MG[iobSi~ˆ�•š˜š�œŸ  ž›š—–’‘‘�†‚yuqhZURONLMMMMNNORPPPPPPQQRRQPRRPRRPONONMNNNLNNNLMOPQSSTSTUUSRQQRQQPONNNMMNMMMMMNMMMMNMMKA;99:BFILPV[^[ND?HQ=7668@JFBALVC9;IB88988?>868::656778;<>?@BDDFNQGA>><::87666766666667:;<;;;:9866565566566655566655569999::???@CENRD:77777767766666676667;<=<<;;;<<:987666778998789:9877;<=@CCADEFCCDDBACBA@AAA>@FFGHGGKLJJIGFHGHHGIHIKMNOPPSVSQPOOQRRQONLNNRQRSUQROMJHIKJIJKLNPVW[XSPQRQUURY\W[Z[_`^cdca]_beec_^ejhec_dda^[Y`ea_\YWZddcc\XZ`a`_^X\bab`\``_[Ya`a[[aaYX\[Y\aWHOin`Zpˆ�“šš˜œ££¤ �™˜‘“”�†‚xtqgWOPPQQQQOQQPPNOQQQPPRSSRTSSSSSTRQRPPONNOOONQRRTTSRRSTTTTTQRQQOPOPPQPONNNONNNPPOOONNMMNMG@=<;@PbYA99@TH9;<877866=EB<87777666788889:<;;:99:;;;<;;;;:;:;;;::9887667:AJONKA8;JJPPJEFFECDFDAACBAAB@?=@EGHHJHHJJLKIGGIIHIKLKJJLOOPRRNNOSQRQPPQOPSTTSSSSOOLJKJJKKMNOQQSVVWTOPTTVXSR[]Y]Y[_b^ccea^bcefd`^ejiihbcee^`Zafeb_^WZccae`YWbccc`Y]dccc\ab_\\acc_Z`_[U_^YZ`]RFVlk]bt€Š�–—˜šž¡¢œš™•““�‹…�{xoeUOPPSSRQPPPPOPPPQRRPQRRRUTSSSTSRQPPQOONOOOPTTUUTTSSSTTSSRRQRSSQQQPPQQONOOONOQPPOONNMMMNPMHB>===>@><;;;:;;;;;:;;<;;;<<<<;====;:9888889<@FHFB?APa_M=87?UW>:977:DTVF;8777=HGFTZYXSOG>:89;?A>>?>?DGEDFIGCBA>;;;;;<;::999:9::::987779>BCF@77QRTQJEGGEDEHEBAB@@DDBA?AFHIHIHGIIIHIIFIJJKNNNNOPRSPNNQSSRPOQQQRRRRQQRQPMLLJJHHJMORSQRPPQPTTTWURXZVW\Z[]Y[`^]deec_dgegeb`eihimdfffbd]_hfc``ZYbbacb\W_cccaZ^bbed^_bb^]`a``\^^^X]`YY``ZNH]nlbjz„��”˜˜›�››š˜•’ŽŒŠ„‚{uo`QOQQRRSRQRQPRQQPPRRQRTTTTSTTTSQRRPQQPPNMQTSSSTSRRSSTUSTSSQQRQRQQQPOPOOONPPPOPQPOOMNNOMOPQONMJFDDDCBBAAABBBBDCDDEDDEFEFEFHFFDACDFIKKKNMJFA>BSd`N?977@T`E:878?PYJ=9BEIHEGFFKKJKJHHIKMMLKNPTVRONRSTTRPQRQQQPTRPNNNKKKKJHIKMOQSRQOPQRPTURWWRT[ZV[_\_]UZb`_effc`effjfdbfkjjlfifgdc`afeeaa^Zcefed_X^cdcc[\`ede^`abbaaaa`\`c_Z^b\[`c_TMLdvk^m{ˆ�‘˜™››š™˜™’ŽŠ‰‡…„�|sgXPPQQQRRRQPQQQQQQPSQRQUUVVVVTTVSQRQQPOQQRUTSSTTSSTVTRSRUTSRQSRQQPRRQQPQPPRSQQPQROPOOPOOOOOOOPPOPNNNMNLKKLLMLLKLKKKJJKKKIIJIHHHIOWVPJKHE@@IZfaP@9778ATVC979>JWTD;9GJKIHFGFEDB><;;:;::976566WSSPKJJIGEFJGEGFBBEDCA@BDFFEEGGHJJIIHHIGILRWVVUVUWVSQOOQUYWURPPPNMLLMKKLMOPQSRLJJIORRTQUWRXYUU[XWX`_[ba[\ddhiiebbljhijfdglnllhgkhgc_ahigdc^Z`fhfea[[dfdc_Zbhhfb]bee__bbb[_cc^\^_]bfc\V[P[uiflw�Œ“–—›š˜”’Œˆ���€~uk`RNOQRSRSRQRQQSRRQRRRSTTTTTUUSRRSTSSTSUUSTSTUUTSTVRTSSSRRRRRSRQRTSQRRQRQPQRRRQQQPPQPPRQQOPPPPPPQPOOOOOONNNNNNLNOONLMLLMKLLKJJJJIIIIIHGGEGGFEECA<;:9888;@LWWLDCEE?<>=977779<<;::::;;;;=FIKFMTEDGGHIGFDA><;;:98666SQQOMLJJHDHKGDGGECEECB@BDHGFEIHGKKHGFGGHPTWYVXWXURQSTTVUWWROMMNPNLOMKLMNNPPPSROQNOTTVTUYVSZYSV\ZW\b`\bc\^dgjlkigeiimllidgonmmjjljhe`_gkgca_[`figda^[ffddb[bhgfc_dgeaafed`^cda^`_\_ge^Z^YPbljnty‚�”•˜——’�Š„€}xm]RMOPRSRQSRSTSTTTTTSRSRSTUUUVSSRRUWVUTSTTTTUUVUVTVUUTUTSTTSTSSRSSSQRSRQPQQRSRRRRRQPQRPROOPQQQQPOPQRPOPPPNPOONNNMONNMMMNMLMMKKKJKKIIIIIIIIJJIIIIF@<;:=ENU[UG>EQSNF=:9=EPXTUZKKY\YSMGDDCA?@@><@@>?><76668:;;::::;;;<>EHHD?DOGJQDACEFFHGC@>><;977QQONJHKJHEHJGDFHEBDFDB@CFGGGHHGGHIHFDGJPVXXXVVVTQQUXYVUQROOPONNOOMKMOOQQPMMQRPSSRWVUVUYZUZ[YW[]^Z_b_\da\`gkkkijhhjklmllikoonmiinkjhdbjlhba_Z_hiheda^fifgb^bhgee`cffb`cega\cec]dda_edc\_b[Sdlkox{~†Œ‘‘ދЅ�~|sjZOONPQRRSRSTWUTTSSUSSRRSRSUWUUTSVWXVUURUVTTUUVVTUTVTTSTRSTTTSSTRSSRQRSSQQQQQRSQQRPRQQRQQQQPQQQQRRQQRRPQQPOPPQOPONNNONMMNMLLMKKLLJLKKKKKIIIIIIHIIGFHKMSXYVH?:89>@<977<<;>>=>=;<<;<===>>?@?<;9PSPNJIKKJFHJIDGHEACHHEBCFIHGGGIHFGEFHOSUSUTSQSUSVWXWVUQQSQRQPPPMLLONMNPPNNSTQUVUWYVXTV[XW_^ZU^^\[ac`^dc]_jjjjhhdhkkmkkmgipqpliimjjidafkidbc\_gjjkfc`diigc_bfighcbefc_ceeb\ded_bca^cif]\d`XScqrosy}}ƒ‚~yzzytql_SOPOPOQRTUSTSTTRSSSSRSTRTUTVVVVWWXYUUUTSUTTVUTUTUTTTUUTUTSSTTSTURQRRSRQQSSQQRRTTTSRRQQQQRRSPRQQRQRRRRRQPQRPQRQQQPMONNONLMMMNONLKKKLLKMLLKJHIIIIIJHGGHJJJMPMF>:887768CHIPNA=@==DHHHJPPMJC;86656665555569;;;;;:::99:9;<:>?D?=B>>?=?>==>??<;NQOOJHJLJFEJHDFGDBEGHEBDGHIHHGIHEFHJLOQNPQPPQRWXXXVURQPRTROQONLNPQOMOUWQPWWTWYUVZVVXV\]XY_^VWaa]\cc`]ce`^gjlkifcikmojlihjnpomljmlkfcagnkfbc^^gkkihd`bgihe`_fiihbbeffacdcb^ehc^`da`gkhb^ce`TRcmtrpppqpmjjigb\TRQPRQQPPRUVTUTSTSTSRSSURSSUTYXWWWXXXXWTUTTUUUUTUTUTUUVUSRSSSRSSSRRRSTSRQRRQRRSQRTSRSSRPQSRSSRRRRRRRQPQQRQSRRPQRQQQQQOOONNOOOONMMLLKLLLMLLLKJJJIJKJJIIIHHHHHIF@>>==;8:FMMHCJMD>;>>:>>;;:9:99::;=>CAFEFC@?>PSQPKGKLIFDHF@FIEBBEFFDFGFJKHGFFEHLLLJJILPTTUTUVVTSQQRRRSSQNKNPSVSQSVYXUW[WY]ZW[ZWZWX\^Z\a\XY`b_\ceb]de`^hjmjifdhllmkkgejpqqojjmnmieeinkgcb`ahkkjgdaagigfa`jkfgccgigcacffbcgca`feachh`]efaXUZ]cinmkie`_]_dXSRQQQQRQQPRSVTTVTUUTTUVUSRTUTVWYXXZXVYXWXWUTUUUUVUSTUTUUUVSTUSSSRTRQSSSQQRRRRRQRQRRQRQRSRPSRQRSSRSRRSRRSRRQRSRRSRSSQPONOPOOONOOPNMNOMLLMKLLKKLKKKKJJIHIIIIIIIIHGGHFGEA<;<:77?RWOFA@@?;::99=;76565555556888999:@>=@<;;999:::::9999899999999:;>CNPUIEOSQOIFJJGEEEC@BCAACDFHEGIHMKHFGHIMOJIHGKQSVXXVSTRQOPQQRSSQOKKPOQPNORTUTX[YWZYWZ[Z\]XY\^X]b_Y[bb`_dfd^bfb`hjkkighlklnliiflqqpolknmlieilnkfcd`ahklijeccgiigcbghgigdgjhdaghib`gcbbccbdjjc_ilgb]______^da^_]`j[UTTRSRSSRQRTVWVVXUWVVVUUVUVVUXYXXYYXYXXVWWTSTVWVWWVTVUTSTTSRSTTTSTSTSSRSQRPRRSRRRSRSSRSTSRSSSRRRSSSRSTSTUSRQRRUTQSSQRQQOOOQPPPQQOPOOOMMMNMLMMLKJKKLNJIJJIJIIHHHGHHHHHGHLOH?99;AED@<:;CMOICE<7655555556678:<=?=@?:::;<=>@BACDDB@??>?>>>>>>=>=<<=??@A@?===FJJIIHNQLHDDGKQTTTTUQPOPPQQOOOOOLMNMQQONNNSUTRX\[WXZ[YX\^Y]]X[^_\]`_]]cdb_fhecfgd`hikmigeijlnmkjimrsooklolmlhiomjhefcemkljkgedikhhgbehkkicejkgafjfcaeff_dfecijiafkjg^`efffecjgefdcnaYXWUUTUUSSSVWVWXXYWUUVVVVYVVXXY[Z[YYZZXWWWUUVVXVWWWVTTSUTTTTSSRSRSRQRRSSRQRRRSTRSTSTSTQRSQRQSRTSTVTTTUTVTTUTTTTSSSSSTQQQSRQQQQPQPQQPOQPOONONMMMNPNLLKJKKKJJIJHHIJIIIJJKIIJJIJKJKHHGHJJD>=EH;76655566779:<>;;::<>CHKKJLKNNLKJIKKJJKKJIHEEEEDC@?<;;<;NQMGFJKHD>;<>?>?ADEEEDCHIHIKNPKDBDIMPRSUTRRQQQQQOMNQQQQONQOPPPOPRUWSSYZXWZ\[W[_]Y\^Y[`b^aed^^eda`hjfaehe`hjjkiedijjnnljhosqnnmkommlifklkheddgkkkmmgdagmkjgafjljjeflkhbdlhd`dfdaagecgjhbdmmjb_ehhifdifffedndZXXVVUTSUTSUWXYXYXWWUUUTVVXWXXY[Z[ZYYYYWXVWWVVVVWXXWTUUUUTUUUSRRSRRRRRRRQRRQQSRSRTTSSSTRRRTTUSTUTTRSUUTTUUTTUUVSSSTTSRRSRPQSRRQRRPQPOPPQONOONNOLMMKLKKKJJJJJKIIHHIIIJIJHIJIKJIJLIHIHGFE<AFJNNNMNMLLJJHGHIGJMONMKIFDCCEFFDB@A?OPMGJMJEB?@A@@BGGDDDEDDGIIMPOHA?ELPRPOPPOLOORTQOMMQQPPOQSRRURPPQVX[VV\\[U[`^X\__\`^X___\ace__ee``fjf_dgeagjjkjgdhjjnmohgnrqmnolnopnifklliggbaimnlkifcknjkhbfkmllehmmjdahhf`fhe`adfcflkfbjmjd_ghhigfliegffoh][XWYWVUUUUVYZYXWYXYVWVWWWYWWYYY[[[XYWXXYWUWWUVWYWVWUTSUTSRSTSTRSSSSRRRSSSTSSSSRSSTSTSSSRQRTSRTUSTTTUUTVVTUVUUVVTSUUTTVSSRSRSRRTRQQQPPOPOOONMMOMLLLMLKLLJKJJKKJJJJJJIIJJJJIJIJIKJJJKJJJFGJG@<;;:8778889:89=<<==<<>?AEFIHIIHINSTSQPNMOQNHGHHC@>BHDCDGEB@@>=9879>BBDHKMMKJJFB?<<<;;<:;>ELOOKJILNNNOOOPNNMLHRLGHHFDCACFDB@??><:99;BMSPNKKNSRNNOOOPONLNQQPPPNORUVURTSSVVWSRSWYXTVX^`[Y[]ZZbc`\`\[`bb]cfd^cffcafihbeih`dljkkjfilkookhdjnqnmjipppkidjnkkijebjkoopkhcinlkkddopmljgjlnhcimkfekmhdgkigjihcglki_`ffefdhheeegird\ZXWWWVTTSTVXZZZZYWXYXVWXWYXYZZZYZZZYYXXXYYXVWWVWWVVUUUTUVUTUUUUTVUTTSUUSRUTVTVTUUUWUVUTTTWUWUVVVVWVWXXXXXWXXXZVVUVTUTUUUSTTUTXTSRQRQQRQQOONNMMMMMLMLKJLKLKKKJJKJKKJIKILKJLKJJKKKJJLLKKLKKLKKLMMLKF=99>CCDHLLMMKGD?<::;===>?DLV\]XSOMPVWYZ\\^[[YTOSJHIHGFIMMKHEB@AB?<@ABDFGHKNT\a^VRSZacfhkkjjhd[QRKEHIIJPXVROJGHIIIHGKLJMLPOLORQPOQTTTTQNQTTTUTPQTUUUTSSTUVVSSVYYXWW[_\\Y\`a^\bb_`aY]bca`hgdadggggjjjefiibimnmkihhkmnnljfhpromkjponmkfhnokihdagmlonkhfglmmkgejpmmjgklkiaeiihgklgdcihfjnkhcknia]cccbbgihihgisj^[[XWVWXWVUUUYZ[[ZYXXVXVVVXWYZZYZ[ZXYYXXXWWVVWVVXXVWXVVUUUVVVTUTUTUUUTUWUVUVVVUTWWWWWWWXYWTWYWWWXVUVXXWWWYWWWXWYZWWVVVVWVUUVTV[UTTTSRSRQSQOONNNMMMLMNNLLMLKJKKKKKLLMJIIJKJJKLKLJKLKKLKLKKLLLLNMLLNMNKFDEDFJJJHGGJOSPLLLKJHHJIJLPVWTV^hloqrstsqndSJRLFKJKMPSUWVTQPMKILNNJHKKLMMPPNNNRTSRQQSRVUUTRRUVWVWVVRUVWTSRW\\XUX[]^]Z]_`]\ba``aY_ccaaiffcbhiikllkehkhchlmkkkiiijlomkhgoqpolhnonmhehnpjggfchlknlkjfemlnkhdjonmjdjjjjecikjelljeckiffjkgbjihc[acccchifjjigtpb[[ZXYYXWWVVYYYZYZYXWWWXXXXXYYYZZ\\ZYYXVWXXXWXXXWUWVUTVUVTTUTUUUUUUWVVWUUVVTUVVWWVWYZXXXXWVYWWVVXXWXVXXXYZXWWYXY\WXVVVUVUVWWVUYTTSSRRTSRSQPPPOOMNLLNNMLNLKKKKKLLKLLLKJJKKJJKJJJIKMLKLKMLMLLLLMMLMMMMIFECDEGGEDDIOVZXRNKIFEDCDEKQSTZbiptstronlhh_STTOHHJKJIILLIIJHECCJLJFGJHLMKMNLMOQRSUQPRSUTTSRTVWUWWVTUVVTRSTY[ZXUZ]_`][_`_\]cbaa`]accdagigbeikjikmmdikjehlnkjjiilmpomjhfmmlkigppmnidgnpljggdfkmlmkhfdmmomjdionnkghkllfdjkjegjje`ihfhnkhbfjkd\acdedgjggihjvvc^][YXZZYXXYY[ZY[[YYWWWVXXXZ[YZ[[\[[ZYXWWWWXUXYXWWVXWVXVWVVVWVWUVUVWVVXUVWXWXXVYXYXWYXYZYYYXXXXXVXWWXZZZZZZZYZXVXWXWVVVXVUVVUWZVVTTURSRSQRQPOPNONNMNNMKMLKLMLLKLJJKKKKLJJKKKKKKJKLLMLLKMMMMMMMNNONLKGDEDEGIJIIGHKPUTMGDCEJMORW\^Z\cgjiie_[VVVVWXUXVQHFILJGFMLFEGGEBAILKGIMMNNMOOLNOPRRTQRVWUVSPRUVVUUVUUWVXUPTWZ[[XW[^`^Z[]`_\_bc`ab\`bdbafkhbfkihhkmlfhkkfgjlljljjkllonjhgknnkjjkomnkghnpmkhhdflnkmmhhejnolkfgpppnhilllhchlkfikigbgjggllebfjkg^`cdd`dhhiihmrzf]][[ZYYXYWWYYZZZYZYUVUWXZYZZY[Z[[[YZYXYWWYWYYYVXYXZVXXXWUUVWWWVWXXXYWWXYYXXX[[YX[ZZYXWYXXWYZ[Z\Z[Y[\\\\\[YY\\[YYXYWYVWXWTWWUVYWVYSTRSSRRQQOOPPOLMNNNNLNOMMLMLKLKKKKKLLJIJKJKLKKKMLLLLLMNLMLNNNOMMGEEDEFIKMPSTSQPONMIMRRS[ehhfe_`a]YUSPMJHGGFEGGHNYUMFIMJFEILJEHJGBAHLKIIMPRMMOLMPQSRQTXTSSVUQPQVXUTTUVUWXXTSUVZ]\XX]^_^Z\]b`]bec^cg`bdfcaiigcfijjgklkfiljdfkllklljnnlnnligkmnkmilomnkfgnpnlkhchmnnmnigdjnolkghnoppigkkmhdfjkfgnkhbgjhdkmicdkhf^acdfcdkggkhjpyja^\\^[YZYXWWX[YYXXXWWUWWZZYZY[YZ[ZYWXXZYXWXZZYWWWXXYXXXVVXXXXWWXYYYZ[YXZ\[[[]Z[[\[\ZZ[[Z[YW[\\\^]]____^]][\[[[XYYXXXXXVVXXVWXYVVUSVUTUSSSRQPQPPPNNNNNNNNMMLMLLLKKKLLMLKKKKKLLKKMMMMMMNNNMMNNMLONKGFGFGJNOTY^acbb^ZVPQVY^gptsnia[TPLHD@=;::9:<@CEGXTNIIMMGDIMLEGJGDCLNLJHKOOLMLJKNRSQRWYVUTTRQSSXYYURUVUWXXSSUY[\ZVX]_a_\^_`^^cdc_de]cfgcchiidellienmkgiljeflkllkjilmlopmigkmnppkmpppkffnpmkijgjloomkifcijnkkghnlonkgkkmkcflligjljcgjhdhokcckkjcbbccccihhkikq~nba`^^\[\YXYXWZZ[Z[ZXVUZYVZ[ZXZ\[[[ZZYYYZYXZZXXWWXWWYWXXXXYZZZXY[Z[[\]^^^``^^^]]\ZZ\\[[Z[ZZZ[^a`acccc_`b__]\[]\[[[XZXWXYWXXWWXYWVWUWVUVSTRRSQQPQPOONNNMMNNLLMKMMKKKLLMLJLLLKKMKLMMLKMLONNMMNMNMNNJFEEGKOUZ`fhjmmoid`ZVY\bejpokaTMKJF?:877789=BEFGHXURJJNLJDJOKHGJHDDLNLIHLOMMLJJLORSPQWVTTSTSQUUWXWTTVVWX[URRVZ]]ZWY]`a`\_`__\bdcbec]ehfceghkhgkjgflolgjlkegmmjnmljkoorqmjhkmoprjknppmjfmpolhjefjpppmjgdkonmjgiopmmofilmmeflljdhlldilkehmhecimkfbbcbebgjjkjlq�sfaa_^]]^Z[h\\\\\][[YXXXYXZZY[Z][YZYZYYZYYWY\ZXYXXYVZYXXZ][[\]]]]^]^^bdbbdcdbdcb____]\]]^^^^_cceffjjggdfec`^^\Z\\\ZXXXZYWVVYWXZXUWWUUTVVUURRSSSQPQPQPOONNOOMLMMNMNLLMMLKLLMMMNLLMNMLMNNONNNONNOONJGCBHMU\agkmoqpib[VRPPQUX^dd`VMFFE>;989:=?CBDCDJOQQPMKHGEEDDDDEHJMPRPONYXSKMSOJFKMNHHLKHHKMKHJMPOONLMQRSTPQRTTSSQPRVXZXSRTUUVZZSRUWX[ZYX\`ca___aba`cedbfeagfgegiifcfkiheillikmlgcoppoonlknporoohinqmomkmqrmhfipqnhgfchonomjhhhnmnkhcioqomiimnkgdkmkggkkheikffkiihhlnicdefgefhjlmpp}‚medbb_^^]]][[\\\]]]ZZVYYZXY\YZZZZZYYYYXXXY[[ZYXXYYYZZZY\]^_`abddegjjkkonnnpnnnkiigfhijjiihjmlmoonmmkigebdbb^^\[[Y\\YYXYZZZYZY[XXXXXXWXWUWUUSTSRSQQRQQQOPOOOONNNMNLMMNNMMLMONOOOOOMMNOOMNNOOONONFBDB>CKPQQNLGD?<97778=>@BDJMOOONNNMKJIJKLNQQSQONNMZWRLMPNJGKMNGFKLIHKLJGJMOOOLJMPQSRRPQRSSSPPTVWVXTSUUVWVXTSVY[\[YX]_``a^_ac__eggcggbgigegkjgdhplkhkomihmlhdlqqpoomimoosomkhnqpooikqolgegonjhggciqmommjhhnnnlifhnppokilnlleilkiilliekligklmifkmiffcdfcfkjmlmpz„sidbba_^]]]\\\\\]\\[X[YYZYZZY[[ZY[XXYYWWXZZZYYYXZY[ZY[[\\^_`bacegjlmnppqrqomnpmmmkllppomnmpqqqqpnlkifecbbb`]__^\ZZ[YZZYZYYZYYXXZXXWXXWUTUSTRSSTSSQQPQPOQPPNMNOOONMMNMMMMMNOMNOOONNONOOOOOOPPPOLD?ACACIKLLGD?;987788:=@ACFJLMPOPQRRRRQQTTRQPPONNNO[YVOQTRKHMMMGIKLKJKJHGJMOQONLLRRRSRSTUVTTSSUWZWXSSVUVWWXTSWZYZZXY_``b_^aab_`egfbfgbeigdekikfemlifjnnifjlhbkpomnmljmmpqrqmhmqpqnjlqpnjghnnlhggehnqqonjfempnmjhilqqolhlnlkginmkgjkjdglkekmnnhknkfc`cebglijlnov†ujecbb]]^]^[]\]\\[[Y[ZYXYYZ[Z[ZYXZZYYYZYYXYYYZYYYX[[\[]]\\^_^abggklnppnqqqonpooqqppqpqsqprsprroljiggdcb`acb_^]]]\Z[Z[[ZYWXZXZYXYWYYXTQOMMNOLMOMMNONNNNMMMMNLMMNNNNLMLMMLNNMNONNOPPOOOOPOPOPPPPMA<<@AAFHIGDC@?===>?ABBBBDHLNNPRTUTTTSTTUTSTSSSRRSTYWTNOPSJKPLMJHKLLJKJJHLPPQNPLNSTSTPRUUVTTUTUWVXWUTUVWYXWQSW[^\YYZ]`ab^]abb[`efebhgcfigbdknlfekkjgimplfklkdlomlllmlknrqrqmjlqrpoklpomiffmnlhhjeglonookhcmnnnmhelqpmlhnonkhholiehjidfmjgmooqjhmmgaabcbejjimnps†vkdcca`__]]\\^][[\[YZZYYXXZZZYZ[YXZZZZZZYYYXYZYXZYXYYZ\\[[]`_`acehklmooonoqprpppqrrqssqppqustqnjggeddaa^``_`__^]\\\[[[YZZYYZZ[ZZYWYTLIFEDEEEDFEEGGFFFEFFEHFFGGHGIIJJJJJKKKLNNNOONOOOOONONOOPOOL@;:=<======>>?DDA@????@@@@AABACBCEDEEFGGGHHIIIKLJLNMMNNOPPOOMC<;989>CDDBBCEFFDCCEJLNPQQRSSTUVVWXWWWZ[\\_`bdb`a`XWVPQSPLJMOKHHLMMKIJKHMQTQRPNQTRSSQUVVWWWTUXXZYXRSZZYZYWUUY_`]XY^`bfb^`cdc`beeedgfdijfdflmjgflkjfiokkilmkfmqpponnkmmpsromikprqomlrqplgelonjjjffjoqpolhejmpppjhmprsnhlnonifloneipkfbkmlionjfinoldcbaacjklonop‚~ngeca`^]]\^^\\][[\\Z[Y[ZZZYZ[]ZYY]Z[ZYZZ[\Z[Y\[[YX\[[XYZ\[Z]]^`cbehiikjiijkjkmiklnlkmkjkmkkjifdabacb`a__``____^\\\][[[[]][[Y[\[[WQG>:988899999=FB?=======>>>?>>>>=????@@@@@@BBBCDDEFFGGHJKIKKID;8777:?ACCCGJJLLKJNPQQRRSSRTWXYWWWUVWVVUZ_cdefcabZXWQQQRMINNLGGKLNMKKJHLQRSRQPQSTRTRRUWWXXVXZXZXXTWYZ\[YVTV[\[\Z\^ace`]addd_bhfdcgjcijifenmihgkkjfiqomhmmlfjpopnlmimopttpnjnqqrrnkorpkgfmpokjkiekopmnokhimopqlglpqokhjnkkkfnrohjnmielnihophglnkjcccaecjkkmnmn€niedab`^_]\\]][[[\[YZY[YZ[[Z[Z[Z\\[[ZZZY\ZYYXZ[[YZ[[[ZZZZ][]^^]]addfeeggffeeggffehhiihfghgfhefda`ab`a```a_a`__]]]]_^]][[[[\\Z\[ZTI@:8888787889;??>>======>>?>>>====>>>===>>>>>??>???@@@AAABCCC?987778;=>?@EGIIKJLLMOPQRTVTWWXWVTNJJKGFHOUTUWTQPV\YWPRQOMJNPNHHMMPLIKIILPRTRNNRSQQTSTV[YXWVXZYZYWVVWX][YVTUZ]ZYY\^adc`^aded`chggehidfjjfgllkjimiifgonljmnkeiqqronolmnprspokknqsrompsqlifkopjiiifkooopmjghmoqplimqpnkfkmnmmgnonifnoleilnjnolhknokbbbbedhjilnnp}‚rifebb`^^]]^^]\[[[YYZ\YZ[[\[ZZ\]\Z[[Z[[[[\[YZZY[ZZZZ[\[Z\[\^]^__`b`bbbbac`abcaccffedfgefdeddfegcabcbbbbbdbba_`_]^]^_^\]\\]^\]^]YNC<9878888778:=>>>>>>>====>>>>>>=>======>====>>====>>>>>>>>>>><;:9889:;;<<>@BCCDGGILMOQTVUVXXWRJ@<=?@@BHJIGEEFHM]YUPRQNKKNMKHHMNOMIKIJPRV[VPPSSTTTSVWZYVWWXZZYYXVTYZZYZXUVZ]^]Z^bbbb`_bced`dihgcghdjkjhhlkkjglkkhgmmjhlmlehpqssomlkmmqsrolkprrpoloupljchqrnijgfinnmolifgmpqplilnspnjjpmnlejnohfmsoehllilomjkopmfcb`cafjjlkmo|†uhdcc`_^^]]]]^\]\\X[[Z[[]\[[\\\[[[[]\Z[[]]]ZZZ[[[ZXY\[ZYZ[[\[Z^__^^^__aa`_``a`bbbcdbfedcddgfgfddcbeeedeeedeccc```_^]^]^_^^^_^`\UG>98888877889;=>?>>>>?>=>>>>?>>>>>==>=======>=>=====>>========<<;;;;;;<<<<<<==>>@@BCFGGILMOPOLE>988;>@BED?>CHHHO[XVQQPNMJONKHIMLKMJKJLPUVUTSQTSTSSVYYXYWVVXXY\\YVVXY[ZZVTW[_`\Z]`acec_bdeb`fjigdhieijjgdjkkjinmlejonljlklefnnqpnnmllkorqpmknprqqloronjeinpokihdippoqojgfnoopoihnromilpopkglopkhlqnfhllioonmjnongbdbdbgklkllnu‡xkgcbaa`^`^]^^^_][[\[[[\]_]Z[]ZZ[]\[\Z[\\\][[Z\[[\[[][[\\\[[\\^]^^]_\_`____````aabccceeddfiijhgfefegheghhhggfecbb`__^a__^^^___ZNA;9878887778:==>>>>>>>>==???>>>???>>>===>>>>=======>>========<=<<<<<<=><<<=<<<<<===>??>@@BCBA@<:9889;@?=;;?AACKTYXXSSRNLLOOKHGLMMKHKLLPSTQSRSSSSSSTX[ZZXXWXYY\YXVUVZ[YYUUXZ__\Y\^_bb`abefccglkfdhiejkigfmlkhhmmmikplkhlljcfopoomnplnmnsrrokprtssnprppkfgnooljjffrtqpnjhgooppnjjoqsohjnonkhlqolikokehmojmpplglooiabbcbdikinlnuˆ}ldca`ba`__^_]^]\\Z[[[[Y[]][Z\[[Z\]\[[\[[\^\[[\\]\[[[ZZ[\\^\\]_^_^_____`^^^b`_`bbbddfffggikmkljkljikknmmmkjijhecccc`acbaaaccbaVG<8887888777:;==>>=>>>>>==?>>===>??>>===>>A?>=>>====>>>============<=<===<=<<<;<<<;<<=======<<=;:999:;<;:9;<<<@JK\XVSTQONLQRPKHMNOLHKLKNQQQSRRUWUSRTX]YYXXWZZ[[ZXWWX[[ZZXVW[`^]Z^a_abb`ddfecgjiedhgejkigelmmhinmkggpmmjopneempproppomlmqsqokpuxutpnqpnkfgoppkkkeenqqomnldmpoqmjilqsnijoppohhqpoknnmhjkjknnplgnnmj`ba`celjhmomqˆ}mfccbaa__^a_^][\[]\[\Z\][\[[\]\[[]\\[]]\^^^][Z][[\\[]_^_^___a``acabbb_abbcbbddedffdgkiijmkjopoommmlmoonqomjmkjhfebegfefeeffgaQA:9888788779:<>?>?>>>??>>>>>>>=>>?>>>?>>??@>>>>>>>>>>>==>?>>>=>>========<====<<<<<<<=<==<=<<<<=<<;:;;;<<;;;;;<>B@ZYVRSRNKLSQOJIMNNKGJLLOTRQRPRUVWUVUWXYXYUW[XYZYWUYY]\ZZXUWZ__]\]^adfdadghebghgedefdjljfhlmkefklkfglkkjlmlgcmoqrpomlllnorppllrturnkprnjfglqnkjiddkoomlnjfmppookhnrrojinpnmifmomikopiimmjmopkhmomk`accccjliklkn‡ƒlfdbbaaaa__]\][\[\[\ZZZZZ\Z\[Z\\\[]^\\]\^]][][[\^]\\\]\_b`_`cbdedcedbebdeeddghhiihjmmmmnponqoqqqpopnrtrqqnnljjgggejjhiikjijh_K>98887777789;=>?>>?>>>??>>==>>==>>?>>>>=>======>>=>>>>==>>>=====>============<==<<<<<=<===<<===<;;;<<<<<<<<<<<=>=\YVRUUOLOSRQJILLMIGJMLNRRSRQUXWUUUXYY[ZXWXYY[\[XX[Z^`]\XWY]a_[Z\`cfgbbehie`hihffhjfjmkffmmlgiklnhhmlmgnnlgcloqqsppmmlmqspnimrtutroprpjgfmpnlkjfdlopommjekppopkknrronlnqnniglpnjkoqkiookkqroimqni_bdfechlgjklo„†ofedbb```_^_`^]\\\\\ZZY[[\[[\\\^\Z]^][][\\]]\^]^^]]_^`^adcegffffgkihgihjjijknmnnmpnooqoqrtqqrprqtssrtttutuspnjhhjkmklklmoqpfWD;9988888889:=>>????>>>>>>>>=>>>>>>=>>>>>>==>===>>>=>>=>>>?>=>>>>>===>==>===>===>=======>===<===<==<<=====<<====<<\YVQSSPOOTUPKILMLJHLLKPSSRQSUXXVUUXXZ[[YWZ\Z[]\ZX\\\\]]XWY_``\[]`befbbcfieafkkjfhjfhjjgfllkiikmkfiopokomkhcnqrosqonnmnpsrnklstuurlosrmifmnmljkedmqsonnkfknnnpmlnrsqmjoqonmhornhmoojfmmkjpppjloolbbbeddhjiikkm}…tieccb``^_^_^_\^\]]][ZZ[[]][[Z[]][]][\\^^]]\\_^`a___abbefgjiiljllnnnmmllnnpqrqrvtstrsursqsqnpprssuvsvuuuvutrqmnmmnnommqqpsqbN?:8888888899<>>????>>>>?>==>>>>==>>>>>?=>==>>==>>==>>>?>>>>=>?>>?>?>>>>>>>>>===>>>=>====>==>======================_YURTTQMMTSPKJMNLKILNMRSTSSUVVVUUVXZYYZXVY[Z\\ZX[[]]\\[XXY^a^^[^cddfdacegeagjifgkheikigckkjhinljiipqohmolhdmqsqrsplikoorpqmlptusqmnpqlifmolkkkgfmrqopomgimopqnhorqqmhmrqomjnqqkknolhnpnmqqogjonlhabcdegljhjjm|‡vifdbb_``_``^]]_]\[]]\[[Y\][\\^]][\^^]\^^]^_``bbaaccdddginljmmmnoonnnnooptusvwwxxxyxutuuuronqqtrssuwyvxuuwttsqrpqsrpoqsrtqoZF<99899::988:=?????@???>>??>>>>>?>>>?>?>>>=>>>==>>>>@?@>?>>?@BCBAA@A@@@???>?>>>>>????>>>==>=>==>================<==^\URTSRNMTVSMILNMKIMNORRTWTTVWWWVWXZ\\ZYTW\]\][YXY[[[[\WY\_a_\[]bdfgb`efge_ehhiikhdijieflmjghomnijppnikmlkgnqrrsrpmkmnpuqomntvuspmmpolggknnnkjifkqponpnhhnpproimpqpoioqqpkgmpplkpolimpolorohfmnngbddcbcjjghlmw†xjdcc`_a`_^_^^_^]]^\[[\[Z\\\[\]\[^_]]__]^]_`babbbcdgiggiklmlnonmnnpopoonquuvvyy{{y|yuvvvttrqsttvtvwwzxxvwyvvtuwtxvuvtvwttseP@:988889888:;=??>?>>?>>>>?>>>>>>?????>?>>>>==>>>>>=>@???>>?BHNQQPMKIGFECBBA@@???@ACC@??>>>>>>============>=>======>^YURTTQMPVXSMIMOPNJMNPTTXXTVXXXUVXZ]^[[YUW[]^][Z[\[\][[VY[^b^ZZ_cehgdbgfhgbeikjiijchkhfemnlhjlmlkkopngkokielrrsqpqnlmmmtsomlsttrqooqrniggmnoljjijqoqoqmjhnopqofinqppikopokinqojiqomhkpplnrrjfmqpiccdecchjiijksˆ|iedc`]`_aa``_]_]\]]\\[Z[[[\\\[\^\\[]^^`b_`acdedddfijilkjmlkkklllllnpoopssrvuxxyxwywvuuvwvwuvxwwxzxyzwxwxyxuzzx{{yywxyyxwo^G=9988899899;>???????>???>?>?>>>>>?BABBBA@?>>>>>>>>=>@>>??>BJ\mtrpnhc_\YVQROLKGFFHLPSHB@??????>>>=====>=>>=>=====>==`\WTTVROPWWSNIMNQNILNPUVXZZYXXWVWX[]^[ZXVX]_]]ZX[^\^a\XVZ]]`]YY^defcbbefhfbghhhijhdjljhejkmjinlnjkoplhknnkgkqrqqspnlmnqrpqomqstusppponjggmpplijgipoqpnmjhlpppoiinopohkpplkilpomhmonhinlkosrlhllmkbbddddjiihjkp‡|keccb_`___^^_]_][]][\Z[\\\\\]]]^^_`_^__abbcbcgfefghfhjjjiihigijjjkomnopqrtruxyxyvwuwvustuuwvxxyyxxwuwyyzxzxz||}|z|}||zxwiSB;998888889;<>>?@???????>?????>>>?BFGGFFGB@>>=?>>>=>??@???@FUs…�Ž‹�Іƒ�~|usplga_\]dniZOIFECCBA@???>?>>>>>>?>>===>>==`[TRVTQOPWWSPKNOPPKKNPUYZ\XXZ[WWWX\]^[YWWZ\_]\[WZ[\^]\[WY[]a^ZZ^acfcbceghgehkjjjjheilihgjkniilqnjkpooijlmidipprrrqnjnnprqpomoruuqsoomqlihmonmilgfpqpqookfiorsqiiprrqkinpnlklqqkgmonjjlnjnrqmgmsplcceecehhhhklo†€mfdba^``__]^]\^[^\`][]\\\]]^^^ba____``abeefbejihhhhhggghhfgfffhhhkkmnomqrtvuxwxwvxzxwxwvwyyxyyywuxzzxxz{x|{||||€€~~}|{xn^I=998888888;;??ADHJJHIHC?>>>>>>=>???????BKdƒ“™›˜š—˜˜—”’‘�ŒŠˆ‡„�ƒ…‡ƒvjc]YTRPMKIGECDCAA@?>??>>>>>>>>_[URVVQPPVWTRKPQROLNOPVYZ[TY[[XXWW[\]\]XW[\^\\[XY]\_`^ZWZ\^a]Y]`bdegddgiggegmikkjidjlkhfjmlihkjljiorpjlljheknnrrqqmjmnnstrpnmrturrooprljglpqlkjffnqsppoiglorrnkiosrplkponlikpomioromimnllqomjlsqnfaefcdegggijmƒ„pfdb`aa_````\]_^]]\\][[[^\\^]^\`f_`^`abbeffffijkjkifghfefbccehhjgjjkmmnrtuzzzyxyzy||zzzy{z{{xyyyzxxz{{|{~}}}€€€~{uhSA:898888889;;>AAA@@B@???A@@@??@>>?BEHIJJJGC@>>?>>>=>??>>??@ESs�œŸŸ ŸŸŸž¡Ÿžžœš™™˜š˜š™˜˜’‹ˆ�ywrmhb][VTQNKHGEDCCA@@@?@?^]VTWYSOMSURRKMQROLOPPWZZYTWY[YXZZ\\]]\XV\]^`^\Y[^]``]\WY]_`_\[`deeeechhihegkjjjjhbhlkigkmmhgklmijpqollnjhejooppqqnilnqsrponpruuvsorrqnkimqolkjhdkqronlkgloropkgntromknoqmhinominppnjlnlkprokkrqofbdfbcdgehjjk€†tfcbb``___^^\[^]]]\[][[[\\^^^\^_`b```abbdfegfgkjkihegfdgfceefgkhijloopqsxy{{}z}}||€~}zz{{zy{{zzw{{€‚…‚�‚‚�~�~}}zwo]H<98887888889<>AA?@@@????@?@??>>>>>ACFGJJFDA??>=>>>>>?>>>??AJ_”ŸŸ¡¡¡¡¢¡¢£¢£ ¡¡Ÿ££¡¢¢£Ÿž›™™˜”“’�‹‡ƒ|vrjgb`\WTSOJHFFED]\YUXXUONRUTRKMSSNLLPPUYWVVXZZZYY\_]\Z\XX]]]]_[YZ[_`]]\XZ]``_^]adfgeccgjihdjkkkikhfjkkggmmiihkkihlopnllklgbenorqqpqlonqrqrpkmrvutqptspnigkoojjkhdgnqqpmjhioqnpkgkpromhmpqolimnnilnrrkkmkltspjjpqnhbefbadfcdhhkx‰tfbcaa^]]^\]\\]^^^]\\[^]]Z^]^]]^]a`cbbcefggggjjkljihfedefeefiijijijnppsxy{}€�€��€�~}}}}~}z{xyy|~~‚€ƒ‡„‚ƒ‚ƒƒ„…|{wrfSA:8878777888<=?@@@@@??@????B@@?>>>>@ABDGFC@?>>>>>>>=??>==>?CNlŠ˜ŸŸ ¢¢¡¡¢¢¢¡¦¡£¥££¤¤£¤¡¢¡¢¡¡¡ ž�œ�™™—”“�Œ‰†ƒ�{vrngc]ZVT__\UWWVRPWVSQKMRROKLMPTWXYVZYZYYYZ]]_^]Z[\_]`a[XY[_`^^[X[]aa^]_cdfghedfjigekkjkhkjfgjljhnmifhmmmjjoomkjkmjbfnpqrpoolknprqqolosuwtrpsuromhlqoljkjdhoqppomhlnnoolhlnqpminsqojhmookjmnqjkoomorsmkmmnicbdcacgddiigtŠvfaab_]^^___^[^^^^[^\]^]^^\^^]^__^_cedgjhhijjjkjkkigfhghihijkjlilonpsuy|}~€�€��ƒ�~€�€�€€}~z~�ƒ…ƒ…„……„„ƒ‚�‚€|xpeXG<887777889:;>?@ABABA@@@?@AAF@?????????@A@?>=>>>>>>>>??>==?@GYy’� Ÿ ££¢£¦¤£££¤¦¦£¤¤¤¡£ ž¢¤£¢¢¢ ¡Ÿ ¡  Ÿ ž›š›˜—”“�‘‹ˆƒ€|xb`YWYZVRSUSROLMQQNJLNRXYYYZYYZYXXZ]^^^\ZZ\]]]^ZX[\\]]]ZY[^bdba`ddfgffdehjheilkhhihfilllgmllhiknljinnmhglnnehprsponollnqspnqlnruvusrssqonjippmikidjpspormhjnomnlhkoqpnlmoonkkmoqmknnojhnkklpslflqpjbbbcbcedeghhsˆzhca`___a`]^^\^_^]^_[\\]^]]_][`baddgiijllmmjkjjkjkjhglijmjhiknpqsstsw||€‚…„‚�ƒ‚‚����€‚}|}z|}~�ƒ‡…„ƒ………‚ƒ��‚€|xl`SH>9777878:=BHEBACCDBA@A@AA@@AB@?>=?>???>?@?>>===>>>>>?>>==>?BLf…™¢¡¡£¤¤¤¦§£¤££¤¨¨§¤¡›™—”—™™›ž�ž�ŸœŸŸ¡£¢¡¢ ¡££¡ ¢Ÿœš˜———”daXX[\VTPTUROLQSSQJLPRW[YZYXZ[XVX\^^]]]Z\___[]ZY[\\^^_^Z\`adeb_aefffefjklkeiijhfjhgkmnlfnmkhgnpmiinrnkkpnkehorrroqolmonoprspmrttsupsutqpjioqmkllfhnrpnrmhgopopnglqpponmnpnmjkoqmionnkfnlllppmgkonjfefb`aeedgjhn‡~kcca`_^`_]\\^_^__\\\]^^^]__`abccgikmmlnnqpomnmnmqmllnmlonnpoqrrtuyz~‚�€€‚„†ƒ�ƒƒ€�‚~‚��‚~|||{}�‚…‡ˆ…†…ƒ��€{ujXMC=9877789=DQ_[LDCBCBBAAB@AABADA@????@?>>>>>>>>?=>>?>>>?>>>?>@ETs��¢¡¢£¥¦¨¦¥¤¤§ª«©©©¢œ‘…|z{�ƒ…ˆ�Ž’••—˜œžŸŸŸ¡££¤¤¦¤› ¤¤£¢¡¡b^YVXXUSPTTRNLPTTPLMPUY]\_YWXYXYZ\_`^\][\a_]\^[Y\\^^]^][[abdda_befgecdjjhgehjlhghigjjkifmnkihlmpkhnpolkmmkdgnpooqoomknmtsrsppruuusqrsppmjimpomlkgglppoolignmoomjlnppsminmmngjmmmkkormgnmmkpqlikmmlgegc`_acafhjm‡ƒnc_`a_``_`]]]^]\`]\^_\[\\^_cdeehjkpoqtuussstqmqrqoqnlnqpqtttuutvz|�€ƒ�ƒ�ƒƒ„€€~~}~��~€€~~~|~}}|‚�‚‚‚„„€xmcWIA<988888;?Lax~fQEBBCBA@@CBC@EDC@@@@@@?@?>>>>??=>>>>>>>>>???>?AJ^~– ¢¤¤¦¦¨¦§¥£¥¦§«ª©§Ÿ”€k_X[^aeimorx|€…‰‹Ž‘”šš�¡£¤¦¤¥¨§¥¦£¦``XUXXUSQVVSPNQSTPLMPUY[\_ZYWXYY\_a`^\\[]``^^]^Z\[\^^`\[\abcda^beghddeihhgdfmkihjhellihfllljkllmhgmqmkjnllcdmppqoooljllrttsqprttssrrspmjkjmpnjijgelpopomigmonmmhjmopsnjlllmiinplhkookgiillpqnghmpmgffda`cdbfjin……odabaa`^^\]]_]\^`\^^]^^_a_bbdghjlptpqsuvtvywvutrrrssqstqtsutuvvx~~��€ƒ‚��}}}~~|{{}|||}zz~}}|~{|€~}~z}{ug\OE>:888889>???????>>>>>=>>@@???DQk‰›¤¢¢¤§¥¦¦¥¦¤§©§¨¨§¢™ˆnVLJKJKMORRUY]`dhlpsw€ˆ“œŸ¡¢£¤¨§¦£¤¦b]XXYXXTSUUUQPRTSQLNPUY][^[YXYWW\^``]^]Z\`_]_^][^^``_a\[\_becb_afeheegiihdcfmkmikgckiihemolihijkjgmolkkmmmcemnoopnnlmoortssonqtrrqqqtppmlklonnjkgflponookgkoooolgnpnoninonplhmomjknonhjknknpokglomhffccaegedfim‚‰sc`dda`^]]]]]]^^`^^`^]__acdhgilnprttutwvux{yyzwxvvuuvuuvuvxyvvxz}~��‚€|{zyz|zz{z}|z{{zz|{{{|~|{zyxywvwvvrrmbTI@<988778:?Le“›—}[GBAAA@@@@AA@@CA@@@????@?>>>>?@?>>@?>>?>??????AGZz”ž¥¤¦¦¥§¦¨¥¥¨§ª«¬©¥ ”~_LECDCCDDEFGHIKNORUX\co„�—� ŸŸ¥¥¥§¥¦daWXZXXVVXXUQNQSTPLMRUY\]^ZYZXXY\^^`^\]Z]`]\^^^[]^__]_]Z]_cdd_^bggfgcchjkfbilllhkgdhkhdcjlmifjlliilonkilkkeemonnonnnkmnpttsomqsstrposrrnkkkonnjkidllpnpojhnoopliiopmqmilmmqlhlomjiopqokpokmqqkhlnmiggdbafhdbdgl~Œ{gb`_``^]^^\\]_^]]_^`_^_afghimrstvxxyxyyvy{}{|}z}zyxuvxy{zywuwz{|}~}{yxustyvxyzz{zyzzzzzzyyxzy{yxuuqqqokh_WMC=9877789??@@??????>???????????>>>@@@@BMd„𣣦¦§§©¨©¨¥§«­­ª¨¨ ŽtVGCABABBBBCCCCCCEFGIKQ_uˆ‘”˜›œ  ¡£¥¤b_YY\ZWUVWXWSNPTUPLNRUZ[]_[Y\YZY\^a_]\\[\]]\^^][]_```a][\_ade`_ejhhhcghkiedilkihjhbhkiiejlnigklnlhmnnlilnmffmnooqpomkolnrrtrnptusrqqsrpnkikqsollhckosqpljhjnppmljlqppmillkpojklnlgmpmtkqokmplkhnoljfgfb`eiedcfjxŒ|j`_^a`^]]__]^`_^_^__`_bcgijnqvvyz|xxw{|}|}~€€‚�}|zzwyxxyxvuuxxwx{wtussprrvvywyz{zwwxxxtuvwvwuxvtrnlkhc\SLF?;987888:@L`~–£§¨ž…cJBAABAA@@@?@@A@@@>@@@?@??>????>?????>??>>>???AFTt�Ÿ¥¤§§¨§¨©©©§ª««¬ª¦¤›ˆhRFBBBBBBBCBBBBBBBCCDFLZs„Œ�”˜››šž¡ ¡b\YZZZWUTVXWUPTWUROPRUZ\^]ZZZZYX[^`_]Z[Y]_\\^_ZY^````a^[]`aeea_dghhfdehhgddimmlikhfhkkifjmlhglknkennpljjlkgenomonnnmlllostqnlnsvurqprppokikprpjkhdhpsonmjghopmljgjnpnmjlmlmkfhmmjfkoojgomkorpmjlnljgggebbedbehis‰~j`a``^^][]^^^_^``aaaabfghmlptwxy|}|||~}}€ƒƒ��‚‚}{{zyyvvrrtrqqsrqmnmmilootwvx{zxwxxtustsstrrqqnlid_ZSKF@<:98888:>GZr‡š£ªª¤˜uVEBBBAAAAA@@@@A@@@?@@@@???????>>????>??>>>??@@CK`€–¡¥§¨ª©«§¨©¬ªª©¬«©¥¤˜�cQGFFGFEEFGFFFFEEFGGGJP`v„‹�“—™š™œ��Ÿec`Z\\YVVZZZVSUVUQOOTWZ\^[[[[ZY\^``_^^][^_]`^^Z[_a_a_`^^]aaeb^^cehhfdceiheejlkhhhgdjkkgeilighkmlgfimolhjkkgemomoooqojlmnmrpnlmrvrqpporqlmijoqmlohehnooomkihonnljiipqomiknoolhinnkioqokglnkkopljjllkggggbacfbbgisŠ�laa_`a_^]```^`_``caadgeiloqruwzz}~}}~}����‚‚‚�}||xyxtsrqooollkljhfgihhloruyzyyxzurpqnooollkkie`^VPIE@<:98888:>ERh~‘›¦««¨¢‹hMCBBBA@AAAA@@@?@@A@@@@@@>>????>>>???>>?@>>?@ACHUo‹�¤¦§§©©©ªª««©««­©§¦ ˜€j\UTSTUUVVVWVWXWVWWXWZ_m{…���’””–—™™šdd`\^\ZVSV\[TORWURPPTXZ\]\Y[\YY\^`_`__]^^^_`_^[\aaa`ba\\^`dfb^]dhhggddhggdcijihihfdgjjgdimjghjlligmoplikllhfnmlooommlkknprrplmssqpnopsqmjiinpmlljhhnnomlmjhmmnkjhimppngjnnplghnpmilnnigknkiqqmkhklkggggd_cdbcikr‰ƒpdb^`a_]^__`_`ccaddcceijoqruvyz}~}~�€}~}|€€€€~yvvuvtrpomjjhgecgdccdffilqrvwwvwvwsopokihghfd_]XSOID?<:98889;?EQdzŠ— ¤¦ª«¨™{[HBBBBAAAA@@@@@?@@@@@@@@?@???>@@???@??>????@ADLVg€•Ÿ¤¥§­©©©«¨©©ª¬°¬­¬¨¤œ�ƒzxyxyzzyzz{|||{{||zz||}‚ˆ‹Ž��“��‘”””gg`[\[[WRT[\VQSWVQPPSYZ[]^[[\ZZ[]^`a_^^]\^aaa]\]a`bb`^][_adea__fjhifedghgc`gigggifagjifcjkkjgjjkjfilnlhlnkhfkmmnmonnlllmqrprnostrolmorqojhjnnmllmggmornkkienonljiinoonkhlnolhglpnhknmidilklrpmgelnkfgfdb`cfbdhin…†qda^`^\^^^^^^`abbccbdeklortwxx||€€~‚�}{|~{{|}{ywwrrrrpnkkffdcbaababbbeeilortsrutsmlnjieccaa]XSOJFC?;:9889:=BJXhy‰”›¢¤§¨©¨¡ŽkQEBAABAAAAA?@@@@@@@@@A@@???>@??>>?@????@@@@@DL]p�‘�¥¨¦¨ªª¬«¬¬­¬­±±¯±¬©©¥¢ž™™šœ™š˜—š™š—š™™™™™”•—’‹Šˆ‰‰�ŠŠ‹‹‹‹ŠŠig^\]ZXXTU[[WRTVWROPT[]]_^\][[Y\]`ba_^\[\a`_^]]^`_ac_]ZZ^aecb^^dfgihgcfhfa`fijhfhhdhijhejllhfjlljchnmnhlqmhgmmolmomolknmppopmlostrppopqrkkknmnkkkgfmprnkiiehmmnljimlookhikmogflnnhipmiciljjnpnlhlomhghfa^bcbbegk�†sea^`^\]^aa`abaacdfeehlorswy{{~|{}~~€z{{yzvxvtrprpnjiiheccb`a^^_`_`baeghknnonoqnligfeca]ZWSOJFC@=;99889;>EO_q�‹–› ž £¦¥¨¥šaKCBBAAA@BAA@@A?@@?@@@@???????>>>>????@??@@@BHXvŠ—Ÿ§©©©«««¬­­­¯°°²³±±¯­­«©©§¦§¨¨©¥§§§¥§§¦¦¨¥¨¥¥¢Ÿ—�ˆˆ‰‹‰‰ˆ‡‡‡‡ˆhf]Y]^ZWTV[[XRTWWUOPTZ^ac`]_][YZ\_b`^^\[\_`_^\\^aaa`a_\[]cbc_^]cggfgedfjfbbijigdhgdhkjhekkligkkmkikljkhknlfekmmnooplilmopsnmkjorrppnorrokijlnnkjmgekorookjfjommmjglooqnikknohhkolgipnlgjjiglonkfjmmjhhhc]^caaefh{Šyea``_^_a``^`_``cefgikpruvwy{y{zzzxxwwxxwxwxtrromkkjheedcaaa___]]]]aabacfggjkmkllffbb`a]ZTNIGD@=;:8888:???>>>>??>>@@@???BJb„™¡§©ª¬«®°®¬¯±®¯°°°´±±±°®®¬¯¯­­¯¯®ª¬ª«¬¬««¬­­­­©©¦�“ŒŒŒ‹Šˆ‡ˆ‰ˆ‰Šhd]Z`_ZYVX\\ZSSWWVQPU[^``\[\[ZY[]`ca__][]`a_^\[\``a`a^Z\_cab`^\dfihhecehfcafifeeijehjjleljighlkljgmnllilnkgdhnooooomkjnpoqnmkjmpqpmonpqpmhhloqllkhfimsonnihjnonjjgkpqsmfjnqnihlomhhlnlgillknoolfinmkffea__bbbdfhz‹}j`__]]`ba`_aa`abbfhikoqrrvvuxywvttqrtuurqqokljiihdbc`_``^_^]^\^\\]```cdgfhhjjggecca]^]ZSLE@><:987778?>>>>>>>>??>?@????@CMh‹ž§¨©©­­¬¯­±±®±±²¯¯±±±±±²¯¯°±®°±°®°®®®®¯®¬­­­¯°«¬¥ž•�ŽŒŠ‹Œ‰ŒŠˆˆ‰je_]da]\VW\_\SRVVTQQU[^_`\\[[[Z[[_a`_``[]_`^_\\^abba_]Y[_aba_\^dfhihgghjhcbhkifdhhegikifjlihjjmljfjllkijlkgdhnpmnmnokhlmmnokjgkqpppqopppliijopnljgfjoponmjiinnonmilpsroijnooihmmojgnmigikkimnnlginnkfdda__bccehkvŒ‚lb_\_^^`_```````cghjjkooooopsppqoppnonommkighfcbaaa`]^^^_]]\[[[[]_^_adcgdegfecca``^]]\XQE>;98877778????>>=??>>???@??@CNhŠŸ§«­ª¬°®°²±¯­®°³°°²²±²²²²°²±²°°°­±°®±°®¯®­¬­®®¬©¥ž˜”��Ž��Œ�Ž‹‰Œif`_a__ZTW\^[SRWVTRSV[^`a\\\ZZYZZ^`b`ca]^a``a^[]cbdca_[\`abb_^^bfhgiffgiifcjkiefkibgkkgekklhhhljifkmlkjinkgegnnmmonmjimmmopmjjjoqrroqnopnihjppmkkifhmoqomjggmmonnkjnqqokillniilookipplgilkjkqomffppjdecc]_bccdfit�ƒmc^^^]_````___aacehhhhijkjlikiikjkkkjiihiedgda__^^`_^_]]^][[\\[]^`^``_abaccaa__^]^]\ZZXQE<987777778Bb�”¢§§©§§ª¨¤¦§¦¨¨©«©¢”qUGBABBBABA@@@A@@@@@@@@@?????>>>>>>>>>>?>>>??@CNf‹Ÿª­¬­®¯°¯®±¯°°±²¯±³´²²³±³±±°°¯±³²²²±²±¯®°­­®¬¯¯«¨ �•‘‘��Ž��ŽŽŒŒje`^a`]YVV[][SRTVUSSY^^^^\]]\[ZYZ_bc^_^\`abc]^]`dfedb`[Y^cca^_`eefefcehifdagkhffkjdgkkfcjjkjggjljfhknmjlojhgiolmmpnkkjmlnppljiknnnoptppomjhjmmlkhheflpoomhfgmonmnjkpqppjinmojfjnlkjoolhiljhjonkegmnkgdd`\_bdabghnˆ†qda`^]^^^]_^_^_`aacbdeejgeeghfhhfhgfcghdedcba``_^]^]^]]][[[Z[\]\\__`_]___`^^__]\Z[Z[XXXSI?:77767789CdŠ¡««ª©§©©§§§§§¦¦§¨¦ŸˆhOEBBCBAAAAAAAAA@@@@A@@@??>>>??>>>?>?>>???>??@DOiŠž¨ªª­«®°°°¯®°°³³³³µ´±±°±²²²³³³±³³±±±²°®°°®­¯®±±¯ª¤�˜“’�‘‘�‘���Žkea_ae`ZUU\]ZSSUUVSRU\^^][[^\[YZZ_ad]]\\^aa_^][^cccca_Z[^bbba_`defdecffifb`hjiefiicfhigcikkiegmlhfgllkijlifbfnmnmpnmhfijmmnmliinqsporopolihgmnnlikedlppnnjeejopppilnqqojhlmmiehmominnmkhkligoplhhjnlhccc_``dcbefn††sda^^\a___]]]^^_``abcacebcddecdddebbcdbd`cba``_`_]]_]\\[ZYYY[[Z[]]]^[Z\\\\\\[[Y[ZXYXWYXUOE<87777679@W|š¥ª­®ªª©¨ª¦¤¥¦¨§¦ —|\JDBABBBBAAA@@A@@@@AB@????>?>?>>>>>>?>>?>>???@CNhŠž§¬­«¬¯°±±²±±±±³±²µ¶±³²²±±³³²´±°³´³²³±±®¯°¯­°²²°¬§ž—–“’‘�‘’��‘Žlgeacb_ZTY]^ZSTVWUQSVZ^^]]\]]ZXXZ_bb`^\\^`b_^[[]bbdda^YZ_cabb_`defegddedhfcgihgegfcfiifchjljfhjjgdgjjjhjmke_gnopommkhgkjlmpnqmjnptsppnnplhgimmmkjjeglmnonieflmponjjmqqoljkookfioooijnnkhjkiiqnohdjlliebb_^`dcadhn�‡vd`__`_]]]^_\]__`_``__`_`a_bcb``abcec````a^`_^___\]^]Z[[[ZYXZYYZZ]\]ZZZZ[ZYY[XX[ZXXXWXVUTMD;8777767:Gb†¡«®°­««©©§¦¨§©¨¥œ�pTEBBCBBAABBA@A@@@@@AAA@@????????>>>>>>>>>????@FOg‹ž¨¯­¬­°±°¯®²²²´µ´³·µ´²±±³²´²³µ³±±¶µ´´´²°±³²°°¯±°¬©£›–“”“‘“•’’“‘ohd`b_]\VY^`[TTXXURQV\]]]\]\][XXZ_ab`]\\_`aa^[\^bdde`]Y[]_b`_^`dehffbcffhgeijhgfjidfhfgdejllghhljcemlmijlkfadmnnnnljihkllmnqqmjnptronnpnmjhhmmnlggghilonmligjmonplknopnkknoolghommjipmkhlmjhmnmicikjjfba^^bcecefjŠyg__^]\]^\[]^_^__^a`]^^^^^a``_^a```__aa_]``\]^\\][[Z\[YY[Y[ZZZZXZ]Z]XXYXXYXY[ZYXXWVXYWVWVSLB;8767778?>>??>>?????AGUrŒ¡¬®¯¬¯±±±¯²²±±³´²²µµ´±´´³²µ¶µ²³µ³¶µ´³°³±²³±°±±²°®ª£Ÿ˜”•“•—”•””“lfa_ca^\X[_a\URXWWSSV\\]]^\^^Z[YZ^a`_^\^aac_]]]^bcffb^\\_ada^]affgedbdfgdbbfjhgfhgdghifafkljeikllhemomgeijeaclmnmmmmlhilnoooojjnpsqpmmqmmjhfkonkhihelooponheklnnoniooommikklmfgllmjimjiflkiilqmkdgllkgca__`dfdeej{Œ|jb^_^]]][]_^\^_^^_^_^[^\]a_]^]__`_^`a`__]]]]]^[\[[Z\[YY[Z[[[[ZYX\Z]YWYZXXXXWYXWWWVWWXUWWTSJ@97767779>Qs’¦®±¯®«©ª©¨¦¦¦¢“w]JDCBAAAAAAAAABAAA@@?@A@@?@@????????>>>>?>???@CLb•¤¬¬®®¯®®²±´²²³³²²±³µ´µ¶µµµ²¶µ²±¶³´¶³³²µ³´²±¯±´´³¯«£š™˜”•’““’“’’kja_`aa[V[`_[SS[WUSQU]]^]]^^^\[YZ_a_]^^\_ab`^^^_cafgc^\]_bbb`_aefffebegfebdijgffjhcgihhdgjmjdgkijidhlmggkje^bjlnllnnkgjkmmponkkknrroklnlmjhejonmklgflqonkkieklomllhlqqmkhhnmkfejnnkhmmmlonormpokdfkjjiea^\^dfcefiu‹k`__^^]][[]]\^^`^\]^^[]]]__^^^`_````_^^]]^^^]\]\[ZZZYYYZXXXXYYXW[[_XWWXYXXWWWXWXWWXWWXWWVVQH>98777779AXz™¨°²±­««©§§¦£œ‹nVGCCBBABAAA@ABAAA@@A@@@@@@@@??@@??????>>>>??@AFSoŠ›§¬®±±¯®¯®®³²³±²´³²µ´µ¶·´´¶´´³´³¶´µµµµ²²±²·µ´³´´µ±­£œ˜–•—”•“‘’’“lnba`a`[X^a^XSVXWURPV\]_^____[ZY[acb]]^^````^_^_bdbfb_]\_abcb_bdghgebcggdbdgjhifgeaehhgbfikkfgljjgfjmmihlje_akmmnnmllhgihlmomljmprrniilnmjgdjoonjjggloponjifhnnnnmglnnmkijpmmkhmonjfkligmslimmlkefkiijea][_dgfegiq‰„la_]\]]]\[\]]]\`\\]\_[[]]\]^`_`___]^_`^]\\^^^\\[\ZZZYXWXZYYXXYXWZY]ZXWWWWWXWVWWYXXWXWWWWXWTOF=9777778:E^}›«²³°­¬ª¨§¨¢š�dPFCCBBAAAAA@ABA@AAAA@A@?@@@@@@?@@?????>?>>??@DL^|�¡©«°¯³±²±°±´²·µ´¶´³³¶¶µ·¶´´µ·´¶µ¶¶¶·¶¶²´´´¶µµµµµ´³¯¤œ˜—•—•””“’‘‘nkcbbfc\X^_`XSTVXWSRW]^a__^^_[]Z\ddb`^`___ba`_\_ceffb_\\]`bba^_chhhgdcefdadijgefhfabihfcejkjhgkihiehikjfhhf^akmnmonjigjijkmomljlnrpokhjnmjfchnnmhjgeinpmnliffnnmniejoonkggnmokglpmiekkhdgmjfnnnlifjklhfa`^`cfecegpЉra^]^][[\\]\\]^]\\][]\[]][\]^]__]^]^`^^^]]^]]\^Z[\Y[ZYZYZZZYYYXYZXZXWVWWWXXWWUXXWXXYWVWVXWUTND<9777778;Hc„ž­±²°­««©§ “u[LCBBBCBBA@AAAA@AAAAA@@@?@@@?@@??????????>>?@@EQjˆ™¤ª­®°³²²±±³³µµ³´µ´µ´´µ´µ·¶³µµµ¶¶´¶¶¶·´³µ³µµ·³µ¶¶´±°§ �š˜–•––•””•oib_cf_\W\`_WSSXYWRSW\^^^_]\\\\[_bdbbcb_aac`_^[^accdb``^`a`ba\_dghheddfedeehjgddheafiidcfiljeeiiiheijkjfhif^alnmlnmlkghijlomnmilnooolfhlmkfdjnnmkkjegnqpmmjeckllnhdhnmmlghmnnifjnnjflljffkijhnnlhdjkmjfa`]^bbbcefoˆŠuc_]^^^]\\]\]_][]]\[[[\\\]]^^]^^]_`^^^^\]Y\\]\[[\[\]Y[[ZZZYYYXWXYW\XWVVVVWWXXYXVVYYXYXWXWVWVRKB;8778879=Kk‰£®²²²®­©£ž�oUHDCCBBCBBAAAAAAABAAA@A@@@?@@@@?@@@@@?????>?@BIYzŸ©¦ª®²°³²±°²´µ³´²µµ³²µ´¶¶·´·¸¸¶¶·µµ¶µ¸µ·µ·µ·¶µµµ¶¸·´±«¥ž˜–˜™™••–”•olc`dc^ZY]_^WSTWXWSTX^``b`^^^\[[]aba`a_^aab`__\^babb`^a^aa`ba_^dhhidaegfdccdhfdfhfadgifceihgdfhjigeijkhgljg_almkjlljjhijklolkokknqpnhfjmolgfjnqnkkidgmmnnmjgdjllmlhgonnmjionmjghlnmikllgejmlimojecklmlga`^\_cbbdfk‚‹xib]\[\]][]^^_\\\\\\\]]\\\^^]]`^^`_^]^\]^\\\]][[Z\\[\ZZYXYZYYXWYYY[YXXWVWXXXXYWVVWWWXWWYYVWVURJ@:8798789>Oo’§®°°¯®«£œ†fPFDBBBBABBAAAAAA@@AAAA@@@@@@?@@??@A@@???????@IQg†œ§¨«­¯°°°±¯±µµ³´µµ¶¶µ·µ¶µ·³·µ··³¸·¶¶¸¹¶¸´¶³¶µ¸¶··¸·¶²§¢Ÿš›––˜—–˜••olc`cd`[W\`_XTTVXVRSY__aa_]_^\Z\]aa__`^^`ac_]_^_deda_^__aaacb]^begfddchgfccgjgfehfadhgfbdffgecgiiecilkgeige_ahllllffdhhjkkmmkmjjqqolgfilligeioomkkhegkmomnkgcglmllhhnpnljgkomjfgoplhkkljfhkihknldcgklifc`^]`ddbcclŽ~l`^]YYZ]]^^]_]][\]\\]\[[]_^^_`__^][^\\][[]\\][YY[Z[[YZZYXXYYYXXZZ^YXWXXWWXWXVWWWVYXVWYWXXWVVUPG?:8877789@Tt”§­±¯¯ª¡•y_KDDCBBBABBAAAA@@@@@@@A@@@A@@A@@@?AD@@??????ABHWr�¡§ª­®­±²²°²³´µ´´´¶¸µ·¸µ¶·¶´¶·µµ¶¹¸¸¸º¸µ´³µ´µµ¸¶··¸¸¶³¬¢Ÿ›š——˜—˜—–”pkcceecZW\`^\XWYYXSTY_`aa^]]\^\\_ca_`b``bbc_\`_`cec`^^_^`bac`]_cdfgebfhgfabghhfcdfcdhkgdcghifchjihdgllgeehe^`hmmmljeiigmlnolmmiinoomhfjkkkeeglqnlmiefjnrrpjfbhmnnkkhnpnnjhjlmljhopmhhkmkhhihhijidbfknjfeba^_cebbekz�€l`^]]\]\_]]^^]^^\^`]][]]__^_`_]^__\^^\]\\]\^\[YZZZ[[YZX[ZZXYYZXZY_ZWYZYYYXWXXWXXWXYWXXXXXWUVVVPF>9777778:CZz—§®±¯« ‹sYICCBCBCBBAAA@@@AA@A@@@@@@A@@@AA@@A@@???@@@@ADMa�˜¦¨¨¬²±¯±´²µ³··¶´µ¶·¸¸¹·»¹µ¶·¸·¸¸º¹··¸¹¸··¶·¸¸¸¶º¹¹»¸´¯¥žž™˜™™™˜–™˜nkacee`ZW[_`ZUVZZYUUZ]_ab`_^]\[[]cba`a`_bac`_a^cdddaaa]^`adc`]^cegfdaeceeccfgfdafhbbkiebchheddfgffchjmhehgg`aejlnllkjhgkmlnomlkiomoligiligdbempmkkkfglnpnnjgfklomnlhnoomlikmlkkgjmlkillheilkfimieadkkkfca^^_dfcbeivŽ…pc`^]\[\]^]]^\\^^^^]^]]^]]^]a_]]__]\]]\\\^][[Y[[[ZZZ[[Z[YWYYYXWYZ^ZYXYXXYWXXXYXXWWXWVWXWXXWWWWTOE=9877778;F_~™©¯¯ª ˆiRFDDCCBBBBAAAA@@AA@@@AA@@?@@@?@@@@A@@@?????@AGSm‹Ÿª©§ª±²°²´µ²µµ·µ¶·µ···º··¶¸º··¹¶··¹¹·¹·¹¸¶··¹»ººº¹¼º¶µ¬§ žš›™™™™—š—qkcdffb\Y^`^XUV[ZWUUZ[^`a__\][[Z]adb__`_ccca`__`adba`_]]bfeda\\aeedcaceddaadfgecdg`bffeabgffbefgffdgjmigjig_`giklllljffjllonmmiknnpmjehkjfdbdlooljkfglmonokgfhonoojfjmnoojjnmlkfhlnkhmmjgjmjhkolfackjkgccb_]becdglu�ˆrc_^]]]\]]]\]^]^__^]]][[[\_]^]\]]][[Z\[]]\][[Z\\Z[ZX[ZZYYYYYWWXY[^\YYYYYZYXWXXZWWXVWWXXWXXWXXZUTMC<9777789ACCCEISfwƒ‹ŒŒ‡�q\KEBBAABAAA@@@@A@@@@A@@?@?@@CHXt‘¥­´±²®®²·¹¶¶º»»¼¼¼¾¼º¼»¼¾¼¾¼¾¼¼»¾¾½½¼¾¾¿½¾¿¾½¾¾¼½¾¾»½À½º¹·±­¦¡Ÿ¡¡   Ÿ�qlefgfb\[]a_[WZ^]]ZX\abba^^`\[[[^ecaaa`aba_a_]^bdfa```\__deddb`cege`bdefc``fefccheaagfebaehhdcfigb`cgjigfgfbafmmlmkkhhggklklonjjloqpommmlliebfnoommnkfmopomliejmppmjgloromikoonmilnoljnolhiomknmligfkpkihgb][^ehfijt�˜…mb`]]^_`^a_]_^^]^__^_]^]]]_`aa_]^a^`_`_^`___^__^^^_^_]]]^\\\\^^c]Z[[\\ZZZ[]]\[Z[ZY[\ZZ[\\\[]^\YQE<877766777789ABCCCEIP^lx‚‚|wfVHCBBBABB@@@@@@@@@@@@@??@AAEN^{—¥¯³²´·±´´¶¹¹º¹º¼¼»º½¼¿À¿¼¼¾½¾À¿¿½¿¿½½ÀÀ¾¾¾¿ÂÀ½ÀÀ¿¿À¿¿¿¿À¿¿»¶®©£¡ž¡¢¢¢  skfeiga[[^ab]X\`a`\W^`__\\Z[\ZYY^baa_^]^]`_^^`_bcddb`a\]cefgdaaeffedacffd`_fgeccce`addb_`gfhdcfihgdgjkhfhjfbagjkilkikjgfkijlolllkrsqqnjkmlkffejpolklkfiqpnmlhhelmnokhkqprojknoopnjoooiipolilnhiqnlhgjlnmhgdb_^ceggjo†•Šqeb`_^^_]\^]]`a``_]^]^]]^]``____`a`bbb_``^````a_`_]_`_^__^___fbf^^_^^^]]_]^_]\]\]_]_^]^^`^^`]XOC;877797667779;?ACCCCCFJQ\ejnljaTJDCBBA@AAA@@A@AB@@?@@@@?@@CGRiˆœ¬³µµµ·µµ·º¼¾¹¹»º½¼¼¼½¾¿¿¿¿¾¿¿½¾ÀÀ½¿½ÀÀÁ½Á¿ÀÁÁÀÀÂÁ¿À¿¿Â¿¿½¿¹·¯¨¥¢ £¢¡  ¡qkefhg`][^bb]V\`cb\Y\^``^]]\[\[[`ded`a_```^_^^_`ccdca_\\bdffebbegecdbchfcbaghfebdd`bddd``gghdbejiddejkkghigdahkllkmkkiggjkmmonlkjpqrmljknmjhfhjppkmljejnpoklfffjlpplgjqpoolkomnsngloqmkmomhkmkionmjgkmlligfca_cegfio‚•Œvhb`____]^_^_`_^``_^]]]]__`_^^_a`^a`a``abb`bcaa__]^`aa`a___`^gcha_____`__^nt_`a^`_`__a_^_`]_\TI?:87777777778:=@ABCCCCCEHLRUVVRMHDCCBBAAAAAAAA@AAA@@@?@@?@ACJYy–¥±´´µ··µ¶º»½½¸»»¿À¾½½¾¿ÀÀ¿¾¿¿¿ÀÂÀÁÀÀÁ¿¿À¾ÁÁÁ¿¿¿¿ÂÄÁÀ¿ÃÁÀ¿ÁÁ¼¶±ª¦¤¡¡¡¢Ÿ¢ olffje`^[^``\VY__^\Z]`a`_]^^]\\\adea_aaaaacb_]\`aabc_]]^dehgfbbdihecadfgdb`fgeebgebcddc_`fffdbejhgcgikieeifdagmlkmklmihilllmoomjjpqroljknmliefjmpnmlkfimpommhffkopolimqqqojimnqsphnprqlonlhjmlknomieikkmkihfa`abeein–‘yia`____`_`__a^____^]]^]^_`___a`a`aabcbaaababaa``a`aa`_`_`__agdh`_^b````b`be``^aaaba`a````]^ZPD<987887777788:>@BCCCCCCCGEEHHGFEDCBBBBBAAAAABBCBAAA@@@A@@@AEPc†ž©²¶¸·¸º¸·º¼¾¼ººº¼¿½¾ÀÀÁÃÀ½¾¿ÀÁÁÀÀÀÀÀÀÁÁÀ¿ÁÁÁ¿ÁÁÁÂÂÃÃÁÂÂÂÁÁÁ¾¹²¬ª¦£¡£¤¥¢ rleffeb_[_a`ZUV\^_[[^`aaa^_^__\\`ceb``adccdd^_[`b``a`_Z_dfiggb`egggcafgec`adhhcbefabefc``ghiecekifbejkhcdgfe`fjljlklmiegikmmonkjlnoqrmikmnjggejnonlkiginptomiefjppnkjkorqmjilopolhmpqokmomjimnklmmjgglllmkffe_`dhjhnz’’}lc``^^`aaa`^__`_``_^^]^^__^`aaa_accdbababcbaabbaa``baaa```aajfiaaccbaabbcca`a`bebbcababba_]WL@:876778:97899;?ACBBBCCBBCCCDCCCCDCBBCCBA@@AA@ABCBA@@@@A@BACHUn�¢¯´¸¹¶¸¹¼»¸¼½¿¼¹¼½¼½½¿À¿ÂÁ¿¿ÁÁ¿ÀÁÂÀÁÂÂÂÂÀÁÄÂÁÀÃÁÂÂÂÃÃÀÄÂÁÁÁÁ¾¹´¯ª¦¥¢£¦¥££pkdfggf_]`a^ZUX]^`\Z^`ccb`_]^^\]`dccabaddbcca__cba`a`]]_dgjffdafhgddafhffa_dgfcbed`cdfeaadffdbfihfcfjigfelje_dlllklkkmghlllkmmmkjmmrpokklkjiifhnpplkjggmppnljgfjooomjinqpnmgkopnkilpppknomiimmmlonlfglnnojihfb`dhgjmw‘‘�oe___a_``^___a`_b_`__]^^_`^a``baacccbbaa`cbaccababcbccddbbbejhmcccdebcccceeefbhedcdedcddcb]TF=877776997678:=@ABBBBCCBCCCCCDCCCBCBBBBBAAAAAABBA@AA@@@@@@BEM^z•§±¸¹¸¶·»ºº·¹¾¿»¼¾¼½¿¾¿À¿¿ÁÁÀ¿ÀÁÀÂÁÆÂÀÀÂÂÂÃÂÂÃÃÅÁÂÄÂÄÃÁÄÁÁÃþ»¶¯ª§¤££¥¢£¥qkfegfc^\___ZUZ^``[X\adgdaa_^\Z[`cdbba`ccedeb__dccb^a_^`ffggfgchjgcecdhgeb`fghebedbdffeccfhgcagjhfdehiigfiie_ekjmlkkljghjjllppoiiorssljkqljkffinpokjlhfoppnmlhennoppkioqrolhlnplkikmppmpllghnnnmprohfkponiigecacifgmuŽ•ƒpdb`_ba`_a_``a`]_```a^___aa`bbacbda`ccbbbecabccdbbbcbcbdedcflildfeffcghigegghffegeeecbeeec[NB:877777777789=?ABABCCBBCCCBCCBBCCBCCBBBABAAABABBAAA@@@@@@@BHTiŠž­´··¹º¹¹º¸ºº½¿¼¼¾¾½¾¿ÁÂÀÂÀÁþÀÁÃÃÂÂÀÂÁÃÃÁÂÂÂÄÄÁÄÃÂÁÁÀÀÁÂÄÃÀÁ»¶®«¦¤¥¢£¡£¥pjfegeb][`b`\XY^_^ZX^cehfc`^^]\]`bcbab`bcefdba_dfdfaaa]_beffeecfggddcciidaadefgdeebceheabegfcbfigfefhkidfhieaehlnmjmkjggjmlinpnjhlqrqmhjpolkgfhppmllmhimrrnmkhfknpoolhnpsplilqpnmijlnmjnomikonnlopnigjnmmlihebabfhhktŠ˜‰shbb`a_`__a_`a_a`__`b___`babcbccbe`cedecdeecddeddcdefgfeegginkmeiijkhhijklkjlihiihhffedfc_UH>977777978788:=?ABBBCBCCCCCCBCBBCBBCBBAAABAAAABBCBBA@ABAAAACK[v”©°···º¼¼»º¹º»¿ÀÀ¾½Á¿ÂÀÁÂÁÂÄÂÁÂÁÀÁÂÅÂÁÁÃÃÃÂÁÂÄÄÄÄÄÄÄÄÄÃÃÃÄÃÄÃÃþ¸´°¨¦¥¦§¦¤¤qjdggfc_\`c_[WZ^^\XZ^bcfeb```^]]adba``bcbcbdd`_efdeaa`\\bcgffddgghfcbbgdfcbffedefe`bffgcbdggfbfjhfdfhkiffiha_bhmmlikkifglmlmopnllppqrommmppkjfgmpnmkkijoqqpnlkhiooookhmorqnjioopmjjnopmnolljmnljoomhfkmmljigfebafgfio…™�ykcc_`aa`__^^acab`aba``abbcdedbdcbbeedgdceddddfedeehghfhihjkporklkllnoonosrpnnlljjifffhfc]PC;8777777;RJ98;>?BCCCCBCBBCCBBBCCBBBCBBBAAABBACCDCCCBBBAAABCFRgƒ�¬²¸¹¹»¿¾¼ÀÆ»º¿ÁÀ¿¾¿¿À¿ÂÂÁÃÂÃÂÁÄÂÃÄÅÁÃÂÄÄÄÁÅÆÄÃÆÅÅÇÅÄÄÃÄÄÆÅÅÄÃÀ¹´®§¤¨¦¦¦£¦pjghjjc^\`ba^Y]``_YX^dca``a_`]]_bcbbda`aadcdc`_cddeb`_]]bfffcdcjfgfebchgfebdgggghe_cdfhd`efefbejhhgbefhgghhdabhlllmmkjfiikklorollnurqpmmmppnjeglpojjkjikprqnnlmkppqolgkpqspkkppnnkjopqnlonkkoqmiloomfglkjkmhefcagigin‚˜Žzkeb``aab`a`_aaaccba`baaccedddegecededgfceggdghfghffhhjkkklovtyrrqrrrvsvyuutrqoqmkjhhihgdZK?97777777\a;9:987777777788;=?ABBCCCCBCBBCCCCCCBBCBBBBCBBDFKMPPQQQRQQQOMKJN]x–§°¸½¼¾¾½¿¾½¹·¸¾ÁÁÁ¾ÁÅÂÂÂÀÃÅÃÁÂÆÄÁÆÇÅÈÆÄÇÅÉÈÇÇÈÄÇÇÇÉÉÆÇÈÈÉÈÆÇÈÄÆÇľ¸²¯ª©ª¦§¥¥rmklmjd_^`bb][^b_\YZ_ccbb`aa_^]^bdcbbcaaceab`a_bcdceec``bffgcbbgfhhggffhiefffhffgeabeffdafihgaaededahhjgefigcaiijklkllihnmllopoplnrtsqqokorpkhhinnkkjjgkoqpplmnloponjjlssqqolmopqkjlqtrmpromjmlkjnpojilooljhffcbbghjlu“š‹wkdcdebabedddgfdggfefeghhhhikkmpnnolmoprpopqpoqrqrruxy{|~~„Š‹Ž‹ŠŒ‰‰‹‡ˆˆ…ƒ…�€}xvvtrqooibQD<877777777788;=@BBCDCCCCCBBCDECCCCBCBCBCCBCDIMPRRQRRSSSRQONMTg†œ­´º»»¼À¾½¼¹¸¶»½ÂÄÄÁÅÇÅÃÄÃÅÇÅÅÅÅÇÅÇÈÈÇÆÆÆÉÊÇÆÇÈÆÆÈÊÉÉÊÉÊÊÆÉÆÇÈÅÇÈÇÁ¼³²«ª¦ª¨¨¨snmmnlg_]aa`\\_d_]\[^cddbb``a_]\`eebdb``baacbccdfecfh`]_`edfdacefhfeccegfdfdgigfhdachecb`gijieadhidbegligghhecgklnllnkhglljkoppomnsttsqlkpqqmjijnnliihdhnpponnkkppommljptrqmmnqrqmikorsnoqpnkmnkknppjhlopmjigfecceiikt‘œ‘lfdfecdbefffddghhiigjiihllllmpnprsrqttrtttsuttvvvxy{‚‚†‡Š‘‘“‹��ŽŒ‰Š‰‡†…†���~|~}ysqpi\L?:877777777789 +#include +#include +#include +#include +#include +#include + +/* logic */ +#ifndef TRUE +# define TRUE 1 +#endif /* TRUE */ +#ifndef FALSE +# define FALSE 0 +#endif /* FALSE */ +#define EOF_OK TRUE +#define EOF_NOT_OK FALSE + +/* global limits */ +#define RULE_YEAR 2000 /* NOTE: should match the current year */ +#define START_DATE "01Feb2000 00:00 UTC" /* first confirmation received */ +#define MAX_COL 79 /* max column a line should hit */ +#define MAX_BUILD_SIZE 256 /* max how to build size */ +#define MAX_PROGRAM_SIZE 3217 /* max program source size */ +#define MAX_PROGRAM_SIZE2 1536 /* max program source size not counting + whitespace and {}; not followed by + whitespace or EOF */ +#define MAX_TITLE_LEN 31 /* max chars in the title */ +#define MAX_ENTRY_LEN 1 /* max length in the entry input line */ +#define MAX_ENTRY 8 /* max number of entries per person per year */ +#define MAX_FILE_LEN 1024 /* max filename length for a info file */ + +/* where to send entries */ +#define ENTRY_ADDR "entry@ioccc.org" + +/* uuencode process - assumes ASCII */ +#define UUENCODE(c) ((c) ? encode_str[(int)(c)&0x3f] : '`') +#define UUENCODE_LEN 45 /* max uuencode chunk size */ +#define UUINFO_MODE 0444 /* mode of an info file's uuencode file */ +#define UUBUILD_MODE 0444 /* mode of the build file's uuencode file */ +#define UUBUILD_NAME "build" /* name for the build file's uuencode file */ +#define UUPROG_MODE 0444 /* mode of the program's uuencode file */ +#define UUPROG_NAME "prog.c" /* name for the program's uuencode file */ + +/* encode_str[(char)val] is the uuencoded character of val */ +char encode_str[] = "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"; + +/* global declarations */ +char *program; /* our name */ +long start_time; /* the startup time */ + +/* forward declarations */ +void parse_args(int argc, char **argv, char **rname, + char **bname, char **pname, char **oname); +void usage(int exitval); +FILE *open_remark(char *filename); +FILE *open_build(char *filename); +FILE *open_program(char *filename); +FILE *open_output(char *filename); +void output_entry(FILE *output, char *oname); +void output_remark(FILE *output, char *oname, FILE *remark, char *rname); +void output_author(FILE *output, char *oname); +void output_info(FILE *output, char *oname); +void output_build(FILE *output, char *oname, FILE *build, char *bname); +void output_program(FILE *output, char *oname, FILE *prog, char *pname); +void output_end(FILE *output, char *oname); +int get_line(char *buf, int siz, int maxcol); +void output_till_dot(FILE *output, char *oname, char *leader); +int col_len(char *string); +void check_io(FILE *stream, char *name, int eof_ok); +void uuencode(FILE *output, char *oname, FILE *infile, + char *iname, int umode, char *uname); + +int +main(argc, argv) + int argc; /* arg count */ + char **argv; /* the args */ +{ + FILE *remark=NULL; /* open remarks stream */ + FILE *build=NULL; /* open build file stream */ + FILE *prog=NULL; /* open program stream */ + FILE *output=NULL; /* open output stream */ + char *rname=NULL; /* file with remarks about the entry */ + char *bname=NULL; /* file containing how prog.c should be built */ + char *pname=NULL; /* the obfuscated program source file */ + char *oname=NULL; /* ioccc entry output file */ + struct tm *tm; /* startup time structure */ + + /* + * check on the year + */ + start_time = time((long *)0); + tm = gmtime(&start_time); + if (tm->tm_year != RULE_YEAR-1900 && + (tm->tm_year != RULE_YEAR-1900+1 || tm->tm_mon != 0)) { + fprintf(stderr, + "%s: WARNING: this program applies to %d, which may differ from %d\n\n", + argv[0], RULE_YEAR, 1900+tm->tm_year); + } + + /* + * parse the command line args + */ + parse_args(argc, argv, &rname, &bname, &pname, &oname); + + /* + * open/check the input and output files + * + * We open and truncate the output file first, in case it is the same + * as one of the input files. + */ + output = open_output(oname); + remark = open_remark(rname); + build = open_build(bname); + prog = open_program(pname); + if (output==NULL || remark==NULL || build==NULL || prog==NULL) { + exit(1); + } + + /* + * output each section + */ + output_entry(output, oname); + output_remark(output, oname, remark, rname); + output_author(output, oname); + output_info(output, oname); + output_build(output, oname, build, bname); + output_program(output, oname, prog, pname); + output_end(output, oname); + + /* + * flush the output + */ + if (fflush(output) == EOF) { + fprintf(stderr, "%s: flush error in %s: ", program, oname); + perror(""); + exit(2); + } + + /* + * final words + */ + printf("\nYour entry can be found in %s. You should check this file\n", + oname); + printf("correct any problems and verify that the uudecode utility will\n"); + printf("correctly decode your build file and program.\n\n"); + printf("This program has been provided as a guide for submitters. In\n"); + printf("cases where it conflicts with the rules, the rules shall apply.\n"); + printf("It is your responsibility to ensure that your entry conforms to\n"); + printf("the current rules.\n\n"); + printf("EMail your entries to:\n"); + printf("\t%s\n\n", ENTRY_ADDR); + printf("Please use the following subject when you EMail your entry:\n"); + printf("\tioccc entry\n\n"); + /* all done */ + return 0; +} + +/* + * parse_args - parse the command line args + * + * usage: + * argc arg count + * argv the args + * rname file with remarks about the entry + * bname file containing how prog.c should be built + * pname the obfuscated program source file + * oname ioccc entry output file + * + * Given the command line args, this function parses them and sets the + * required name flags. This function will return only if the command + * line syntax is correct. + */ +void +parse_args(int argc, char **argv, char **rname, + char **bname, char **pname, char **oname) +{ + char *optarg; /* -flag option operand */ + int flagname; /* the name of the -flag */ + int i; + + /* + * Not everyone has getopt, so we must parse args by hand. + */ + program = argv[0]; + for (i=1; i < argc; ++i) { + + /* determine the flagname */ + if (argv[i][0] != '-') { + usage(1); + /*NOTREACHED*/ + } + flagname = (int)argv[i][1]; + + /* determine the flag's operand */ + if (flagname != '\0' && argv[i][2] != '\0') { + optarg = &argv[i][2]; + } else { + if (i+1 >= argc) { + usage(2); + /*NOTREACHED*/ + } else { + optarg = argv[++i]; + } + } + + /* save the flag's operand in the correct global variable */ + switch (flagname) { + case 'r': + *rname = optarg; + break; + case 'b': + *bname = optarg; + break; + case 'p': + *pname = optarg; + break; + case 'o': + *oname = optarg; + break; + default: + usage(3); + /*NOTREACHED*/ + } + } + + /* + * verify that we have all of the required flags + */ + if (*rname == NULL || *bname == NULL || *pname == NULL || *oname == NULL) { + usage(4); + /*NOTREACHED*/ + } + return; +} + +/* + * usage - print a usage message and exit + * + * usage: + * exitval exit with this value + * + * This function does not return. + */ +void +usage(int exitval) +{ + fprintf(stderr, + "usage: %s -r remarks -b build -p prog.c -o ioccc.entry\n\n", program); + fprintf(stderr, "\t-r remarks\tfile with remarks about the entry\n"); + fprintf(stderr, "\t-b build\tfile containing how prog.c should be built\n"); + fprintf(stderr, "\t-p prog.c\tthe obfuscated program source file\n"); + fprintf(stderr, "\t-o ioccc.entry\tioccc entry output file\n"); + exit(exitval); +} + +/* + * open_remark - open/check the remark file + * + * usage: + * filename remark filename + * + * The remark file should be indented by 4 spaces, and should not extend + * beyond column MAX_COL. These are not requirements, so we only warn. + * + * This function returns NULL on I/O or format error. + */ +FILE * +open_remark(char *filename) +{ + FILE *stream; /* the opened file stream */ + char buf[BUFSIZ+1]; /* input buffer */ + int toolong=0; /* number of lines that are too long */ + int non_indent=0; /* number of lines not indented by 4 spaces */ + + /* + * open the remark input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open remark file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * look at each line + */ + while (fgets(buf, BUFSIZ, stream) != NULL) { + + /* count lines that do not start with 4 spaces */ + if (buf[0] != '\n' && strncmp(buf, " ", 4) != 0) { + ++non_indent; + } + + /* count long lines */ + if (col_len(buf) > MAX_COL) { + /* found a line that is too long */ + ++toolong; + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* note long lines if needed */ + if (toolong > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s extend beyond the 80th column\n", + program, toolong, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* note non-indented lines, if needed */ + if (non_indent > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s are not indented by 4 spaces\n", + program, non_indent, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_build - open/check the build file + * + * usage: + * filename build filename + * + * The how to build file must not be longer than MAX_BUILD_SIZE bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_build(char *filename) +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + + /* + * open the how to build input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_BUILD_SIZE) { + fprintf(stderr, + "%s: FATAL: the how to build file: %s, is %ld bytes long\n", + program, filename, (long) statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_BUILD_SIZE); + return(NULL); + } + + /* return the open file */ + return(stream); +} + +/* + * open_program - open/check the program source file + * + * usage: + * filename source filename + * + * The program source file must be <= 3217 bytes. The number of + * non-whitespace and }{; chars not followed by whitespace must + * be <= 1536 bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_program(char *filename) +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + int count; /* special count size */ + int c; /* the character read */ + + /* + * open the program source input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open program source file: %s: ", + program, filename); + perror(""); + exit(7); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat program source file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_PROGRAM_SIZE) { + fprintf(stderr, + "%s: FATAL: the program source file: %s, is %ld bytes long\n", + program, filename, (long) statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_PROGRAM_SIZE); + return(NULL); + } + + /* + * count the non-whitespace, non {}; followed by whitespace chars + */ + count = 0; + c = 0; + while ((c=fgetc(stream)) != EOF) { + /* look at non-whitespace */ + if (!isascii(c) || !isspace(c)) { + switch (c) { + case '{': /* count if not followed by EOF or whitespace */ + case '}': + case ';': + /* peek at next char */ + c = fgetc(stream); + if (c != EOF && isascii(c) && !isspace(c)) { + /* not followed by whitespace or EOF, count it */ + ungetc(c, stream); + ++count; + } + break; + default: + ++count; + break; + } + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* look at the special size */ + if (count > MAX_PROGRAM_SIZE2) { + fprintf(stderr, + "%s: FATAL: the number of bytes that are non-whitespace, and\n", + program); + fprintf(stderr, + "%s: that are not '{', '}', ';' followed by whitespace\n", + program); + fprintf(stderr, + "%s: or EOF must be <= %d bytes\n", + program, MAX_PROGRAM_SIZE2); + fprintf(stderr, + "%s: in %s, %d bytes were found\n", + program, filename, count); + return(NULL); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_output - open/check the entry output file + * + * usage: + * filename output filename + * + * This function returns NULL on open error. + */ +FILE * +open_output(char *filename) +{ + FILE *stream; /* the opened file stream */ + + /* + * open the ioccc entry output file + */ + stream = fopen(filename, "w"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open ioccc entry file for output: %s: ", + program, filename); + perror(""); + exit(8); + } + + /* return the open file */ + return(stream); +} + +/* + * output_entry - output the ---entry--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_entry(FILE *output, char *oname) +{ + char title[MAX_TITLE_LEN+1+1]; /* the entry's title */ + char buf[MAX_COL+1+1]; /* I/O buffer */ + int entry=0; /* entry number */ + int ret; /* fields processed by fscanf */ + int ok_line=0; /* 0 => the line is not ok */ + char skip; /* input to skip */ + time_t epoch_sec; /* seconds since the epoch */ + char *p; + + /* + * write the start of the section + */ + fprintf(output, "---entry---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the rule year + */ + fprintf(output, "rule:\t%d\n", RULE_YEAR); + check_io(output, oname, EOF_NOT_OK); + + /* determine if this is a fix */ + printf("Is this a fix, update or resubmittion to a "); + printf("previous entry (enter y or n)? "); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + if (buf[0] == 'y') { + fprintf(output, "fix:\ty\n"); + check_io(output, oname, EOF_NOT_OK); + printf("\nBe sure that the title and entry number that you give\n"); + printf("are the same of as the entry you are replacing\n"); + } else { + fprintf(output, "fix:\tn\n"); + check_io(output, oname, EOF_NOT_OK); + } + + /* + * write the title + */ + printf("\nThe first character of your title should match [a-zA-Z0-9_=]\n"); + printf("The next 0 to %d characters should match [a-zA-Z0-9_=+-]\n\n", + MAX_TITLE_LEN-1); + printf("It is suggested, but not required, that the title should\n"); + printf("incorporate your username; in the\n"); + printf("case of multiple authors, consider using parts of the usernames\n"); + printf("of the authors.\n\n"); + printf("enter your title: "); + do { + /* prompt and read a line */ + if ((ok_line = get_line(title, MAX_TITLE_LEN+1, MAX_COL-9)) <= 0) { + printf("\ntitle is too long, please re-enter: "); + continue; + } + + /* verify the pattern, not everyone has regexp, so do it by hand */ + if (!isascii((int)title[0]) || + !(isalnum((int)title[0]) || title[0] == '_' || title[0] == '=')) { + printf("\ninvalid first character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } else { + for (p=(&title[1]); *p != '\0' && *p != '\n'; ++p) { + if (!isascii((int)*p) || + !(isalnum((int)*p) || + *p == '_' || *p == '=' || *p == '+' || *p == '-')) { + printf("\ninvalid character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } + } + } + } while (ok_line <= 0); + fprintf(output, "title:\t%s", title); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the entry number + */ + printf("\nEach person may submit up to %d entries per year.\n\n", + MAX_ENTRY); + printf("enter an entry number from 0 to %d inclusive: ", MAX_ENTRY-1); + do { + /* get a valid input line */ + fflush(stdout); + ret = fscanf(stdin, "%d[\n]", &entry); + check_io(stdin, "stdin", EOF_NOT_OK); + /* skip over input until newline is found */ + do { + skip = fgetc(stdin); + check_io(stdin, "stdin", EOF_NOT_OK); + if (skip != '\n') { + /* bad text in input, invalidate entry number */ + entry = -1; + } + } while (skip != '\n'); + + /* check if we have a number, and if it is in range */ + if (ret != 1 || entry < 0 || entry > MAX_ENTRY-1) { + printf( + "\nThe entry number must be between 0 and %d inclusive\n\n", + MAX_ENTRY-1); + printf("enter the entry number: "); + } + } while (ret != 1 || entry < 0 || entry > MAX_ENTRY-1); + fprintf(output, "entry:\t%d\n", entry); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the submission date + */ + /* returns a newline */ + epoch_sec = time(NULL); + fprintf(output, "date:\t%s", asctime(gmtime(&epoch_sec))); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the OS/machine host information + */ + printf( + "\nEnter the machine(s) and OS(s) under which your entry was tested.\n"); + output_till_dot(output, oname, "host:"); +} + +/* + * output_remark - output the ---remark--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * remark stream to the file containing remark text + * rname name of the remark file + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_remark(FILE *output, char *oname, FILE *remark, char *rname) +{ + char buf[BUFSIZ+1]; /* input/output buffer */ + + /* + * write the start of the section + */ + fprintf(output, "---remark---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * copy the remark file to the section + */ + while (fgets(buf, BUFSIZ, remark) != NULL) { + fputs(buf, output); + check_io(output, oname, EOF_NOT_OK); + } + check_io(remark, rname, EOF_OK); + + /* be sure that the remark section ends with a newline */ + if (buf[strlen(buf)-1] != '\n') { + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + } +} + +/* + * output_author - output the ---author--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * + * Read the needed information from stdin, and write the author section. + * If multiple authors exist, multiple author sections will be written. + */ +void +output_author(FILE *output, char *oname) +{ + char buf[MAX_COL+1+1]; /* I/O buffer */ + int more_auths; /* TRUE => more authors to note */ + int auth_cnt=0; /* number of authors processed */ + + /* + * prompt the user for the author section + */ + printf("\nEnter information about each author. If your entry is after\n"); + printf("%s and before the contest deadline, the judges\n", START_DATE); + printf("will attempt to EMail back a confirmation to the first author\n"); + + /* + * place author information for each author in an individual section + */ + do { + + /* write the start of the section */ + fprintf(output, "---author---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* write the author */ + printf("\nAuthor #%d name: ", ++auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nname too long, please re-enter: "); + } + fprintf(output, "name:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the organization */ + printf("\nEnter the School/Company/Organization of author #%d\n", + auth_cnt); + printf("\nAuthor #%d org: ", auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter: "); + } + fprintf(output, "org:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the address */ + printf( + "\nEnter the postal address for author #%d. Be sure to include\n", + auth_cnt); + printf("your country and do not include your name.\n"); + output_till_dot(output, oname, "addr:"); + + /* write the EMail address */ + printf( + "\nEnter the EMail address for author #%d. Use an address from\n", + auth_cnt); + printf( + "a registered domain or well known site. If you give several\n"); + printf("forms, list them one per line.\n"); + output_till_dot(output, oname, "email:"); + + /* write the home page URL */ + printf( + "\nEnter the fully qualified home page URL for author #%d\n", + auth_cnt); + printf("including the http: part or type none: "); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0 || + (strncmp(buf, "http://", sizeof("http://")-1) != 0 && + strcmp(buf, "none\n") != 0)) { + printf("\nURL too long, does not begin with http:// or\n"); + printf("is not the word none\n"); + } + fprintf(output, "url:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the anonymous status */ + printf("\nShould author #%d remain anonymous (enter y or n)? ", + auth_cnt); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + fprintf(output, "anon:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* determine if there is another author */ + printf("\nIs there another author (enter y or n)? "); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + if (buf[0] == 'y') { + more_auths = TRUE; + } else { + more_auths = FALSE; + } + } while (more_auths == TRUE); + return; +} + +/* + * output_info - output the ---info--- section(s) + * + * usage: + * output entry's output file stream + * oname name of the output file + * + * Read the needed information from stdin, and write the info section. + * If multiple info files exist, multiple info sections will be written. + */ +void +output_info(FILE *output, char *oname) +{ + char infoname[MAX_FILE_LEN+1]; /* filename buffer */ + char yorn[1+1]; /* y or n answer */ + char *uuname; /* name to uuencode as */ + FILE *infile; /* info file stream */ + + /* + * prompt the user for info information + */ + printf("\nInfo files should be used only to supplement your entry.\n"); + printf("For example, info files may provide sample input or detailed\n"); + printf("information about your entry. Because they are supplemental,\n"); + printf("the entry should not require them to exist.\n\n"); + + /* + * while there is another info file to save, uuencode it + */ + printf("Do you have a info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + while (yorn[0] == 'y') { + + /* read the filename */ + printf("\nEnter the info filename: "); + while (get_line(infoname, MAX_FILE_LEN+1, 0) <= 0) { + printf("\nInfo filename too long, please re-enter: "); + } + + /* compute the basename of the info filename */ + /* remove the trailing newline */ + uuname = &infoname[strlen(infoname)-1]; + *uuname = '\0'; + /* avoid rindex/shrrchr compat issues, do it by hand */ + for (--uuname; uuname > infoname; --uuname) { + if (*uuname == '/') { + ++uuname; + break; + } + } + + /* attempt to open the info file */ + infile = fopen(infoname, "r"); + if (infile == NULL) { + fprintf(stderr, "\n%s: cannot open info file: %s: ", + program, infoname); + perror(""); + continue; + } + + /* + * write the start of the section + */ + fprintf(output, "---info---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* uuencode the info file */ + uuencode(output, oname, infile, infoname, UUINFO_MODE, uuname); + + printf("\nDo you have another info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + }; + return; +} + +/* + * output_build - output the ---build--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * build open build file stream + * bname name of the build file + * + * Read the needed information from stdin, and write the build section. + */ +void +output_build(FILE *output, char *oname, FILE *build, char *bname) +{ + /* + * write the start of the section + */ + fprintf(output, "---build---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, build, bname, UUBUILD_MODE, UUBUILD_NAME); + return; +} + +/* + * output_program - output the ---program--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * prog open program stream + * pname name of program file + * + * Read the needed information form stdin, and write the program section. + */ +void +output_program(FILE *output, char *oname, FILE *prog, char *pname) +{ + /* + * write the start of the section + */ + fprintf(output, "---program---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, prog, pname, UUPROG_MODE, UUPROG_NAME); + return; +} + +/* + * output_end - output the ---end--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * + * Read the needed information form stdin, and write the 'end section'. + */ +void +output_end(FILE *output, char *oname) +{ + /* + * write the final section terminator + */ + fprintf(output, "---end---\n"); + check_io(output, oname, EOF_NOT_OK); + return; +} + +/* + * get_line - get an answer from stdin + * + * usage: + * buf input buffer + * siz length of input, including the newline + * maxcol max col allowed, 0 => disable check + * + * This function will flush stdout, in case a prompt is pending, and + * read in the answer. + * + * This function returns 0 if the line is too long, of the length of the + * line (including the newline) of the line was ok. This function does + * not return if ERROR or EOF. + */ +int +get_line(char *buf, int siz, int maxcol) +{ + int length; /* the length of the input line */ + + /* flush terminal output */ + fflush(stdout); + + /* read the line */ + if (fgets(buf, siz+1, stdin) == NULL) { + /* report the problem */ + check_io(stdin, "stdin", EOF_NOT_OK); + } + + /* look for the newline */ + length = strlen(buf); + if (buf[length-1] != '\n') { + int eatchar; /* the char being eaten */ + + /* no newline found, line must be too long, eat the rest of the line */ + do { + eatchar = fgetc(stdin); + } while (eatchar != EOF && eatchar != '\n'); + check_io(stdin, "stdin", EOF_NOT_OK); + + /* report the situation */ + return 0; + } + + /* watch for long lines, if needed */ + if (maxcol > 0 && (length > maxcol || col_len(buf) > maxcol)) { + /* report the situation */ + return 0; + } + + /* return length */ + return length; +} + +/* + * output_till_dot - output a set of lines until '.' by itself is read + * + * usage: + * output entry's output file stream + * oname name of the output file + * leader the lead text for the first line + * + * This routine will read a set of lines until (but not including) + * a single line with '.' is read. The format of the output is: + * + * leader:\tfirst line + * \tnext line + * \tnext line + * ... + * + * This routine will not return if I/O error or EOF. + */ +void +output_till_dot(FILE *output, char *oname, char *leader) +{ + char buf[BUFSIZ+1]; /* input buffer */ + int count; /* lines read */ + int done=FALSE; /* TRUE => finished reading input */ + + /* instruct the user on how to input */ + printf("\nTo end input, enter a line with a single period.\n"); + + /* read lines until '.' or EOF */ + count = 0; + while (!done) { + /* issue the prompt */ + printf("%s\t", (count>0) ? "" : leader); + fflush(stdout); + + /* get the line */ + if (get_line(buf, BUFSIZ, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter:\n\t"); + continue; + } + + /* note if '.' was read */ + if (strcmp(buf, ".\n") == 0) { + done = TRUE; + } + + /* write line if we read something */ + if (!done) { + fprintf(output, "%s\t%s", (count++>0) ? "" : leader, buf); + check_io(output, oname, EOF_NOT_OK); + } + } + + /* if no lines read, at least output something */ + if (count <= 0) { + fprintf(output, "%s\t.\n", leader); + check_io(output, oname, EOF_NOT_OK); + } + return; +} + +/* + * col_len - determine the highest that a string would reach + * + * usage: + * string the string to examine + * + * Given a string, this routine returns that a string would reach + * if the string were printed at column 1. Tab stops are assumed + * to start at 9, 17, 25, 33, ... + */ +int +col_len(char *string) +{ + int col; /* current column */ + char *p; /* current char */ + + /* scan the string */ + for (col=0, p=string; *p != '\0' && *p != '\n'; ++p) { + /* note the column shift */ + col = (*p=='\t') ? 1+((col+8)/8*8) : col+1; + } + if (*p == '\n') { + --col; + } + + /* return the highest column */ + return col; +} + +/* + * check_io - check for EOF or I/O error on a stream + * + * usage: + * stream the stream to check + * name the name of this stream + * eof_ok EOF_OK or EOF_NOT_OK + * + * Does not return if EOF or I/O error. + */ +void +check_io(FILE *stream, char *name, int eof_ok) +{ + /* test for I/O error */ + if (ferror(stream)) { + fprintf(stderr, "%s: error on %s: ", program, name); + perror(""); + exit(1); + + /* test for EOF */ + } else if (eof_ok == EOF_NOT_OK && feof(stream)) { + fprintf(stderr, "%s: EOF on %s\n", program, name); + exit(1); + } + return; +} + +/* + * uuencode - uuencode a file + * + * usage: + * output output file stream + * oname output filename + * infile input file stream + * iname input filename + * umode the mode to put on the uuencode file + * uname name to put on the uuencode file + * + * Perform the uuencoding process identical to the process performed + * by the uuencode(1) utility. + * + * This routine implements the algorithm described in the uuencode(5) + * 4.3BSD Reno man page. + */ +void +uuencode(FILE *output, char *oname, FILE *infile, + char *iname, int umode, char *uname) +{ + char buf[UUENCODE_LEN+1]; /* the uuencode buffer */ + int read_len; /* actual number of chars read */ + int val; /* 6 bit chunk from buf */ + char filler='\0'; /* filler uuencode pad text */ + char *p; + + /* + * output the initial uuencode header + */ + fprintf(output, "begin %o %s\n", umode, uname); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + + /* + * We will process UUENCODE_LEN chars at a time, forming + * a single output line each time. + */ + while ((read_len=fread(buf,sizeof(buf[0]),UUENCODE_LEN,infile)) > 0) { + + /* + * the first character is the length character + */ + fputc(UUENCODE(read_len), output); + check_io(output, oname, EOF_NOT_OK); + + /* + * We will convert 24 bits at a time. Thus we will convert + * 3 sets of 8 bits into 4 sets of uuencoded 6 bits. + */ + for (p=buf; read_len>0; read_len-=3, p+=3) { + + /* bits 0 to 5 */ + val = (p[0]>>2)&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 6 to 11 */ + val = ((p[0]<<4)&0x30) | ((p[1]>>4)&0x0f); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 12 to 17 */ + val = ((p[1]<<2)&0x3c) | ((p[2]>>6)&0x03); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 18 to 23 */ + val = p[2]&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + } + + /* end of UUENCODE_LEN line */ + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer (don't depend on bzero() or memset()) + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + } + + /* check the last read on the input file */ + check_io(infile, iname, EOF_OK); + + /* write end of uuencode file */ + fprintf(output, "%c\nend\n", UUENCODE(filler)); + check_io(output, oname, EOF_NOT_OK); +} diff --git a/2000/natori.c b/2000/natori.c new file mode 100644 index 000000000..25dfa66ce --- /dev/null +++ b/2000/natori.c @@ -0,0 +1,3 @@ +#include +#include +double l;main(_,o,O){return putchar((_--+22&&_+44&&main(_,-43,_),_&&o)?(main(-43,++o,O),((l=(o+21)/sqrt(3-O*22-O*O),l*l<4&&(fabs(((time(0)-607728)%2551443)/405859.-4.7+acos(l/2))<1.57))[" #"])):10);} diff --git a/2000/natori.hint b/2000/natori.hint new file mode 100644 index 000000000..a507c7f2f --- /dev/null +++ b/2000/natori.hint @@ -0,0 +1,31 @@ +Best Small Program: + + NATORI Shin + Univ. of Tokyo + Rigakubu 7-goukan 311 + Hongou 7-3-1, Bunkyou-ku, Tokyo + Japan + + +Judges' Comments: + + To build: + + make natori + + To run: + + ./natori + + Here is a nice compact program that changes with the phase of the moon. + Can you figure out how it does it? + + +Selected Author's Comments: + + This program outputs a rough image of the moon in its current phase. + The main obfuscation of this entry is its complicated double recursion + (without any loop or conditional statement). + + People living in the southern hemisphere may want to change acos(l/2) + into acos(-l/2). diff --git a/2000/primenum.c b/2000/primenum.c new file mode 100644 index 000000000..ab228e996 --- /dev/null +++ b/2000/primenum.c @@ -0,0 +1,49 @@ +#define BeginProgram void main(int argc, char *argv[]) +#define CloseBrace } +#define CommandLineArgument -1 +#define Declare int i,j,n,Flag=1; +#define EndOfProgram return; +#define False 0; +#define ForLoop ;for +#define GetCommandLineArgument n=atoi(argv[1]); +#define i F1ag +#define If if +#define Increment ++ +#define Is == +#define LessThan *(c&64)* +#define LessThanOrEqualTo != +#define Modulo % +#define OpenBrace { +#define PossibleFactor j +#define PossiblePrime i +#define Possib1ePrime (c=getchar()) +#define PrimeNumber (c^(!i*n%64)); +#define Print putchar +#define SetTo = +#define SmallestPrime 2 +#define True 1 +#define Variables char c; +#define Zero i%j + +BeginProgram +OpenBrace + Declare Variables + GetCommandLineArgument + + ForLoop (PossiblePrime SetTo SmallestPrime ; + Possib1ePrime LessThanOrEqualTo CommandLineArgument ; + Increment PossiblePrime) + OpenBrace + F1ag SetTo True + ForLoop (PossibleFactor SetTo SmallestPrime ; + PossibleFactor LessThan PossiblePrime ; + Increment PossibleFactor) + If (PossiblePrime Modulo PossibleFactor Is Zero) + F1ag SetTo False + + If (Flag Is True) + Print PrimeNumber + CloseBrace + + EndOfProgram +CloseBrace diff --git a/2000/primenum.hint b/2000/primenum.hint new file mode 100644 index 000000000..e517fba5f --- /dev/null +++ b/2000/primenum.hint @@ -0,0 +1,75 @@ +Best Abuse of CPP: + + Raymond Cheong + [address subject to change] + MD, USA + + +Judges' Comments: + + To build: + + make primenum + + To run: + + ./primenum n (where n is an integer) + + Don't read the author comments until you're ready for the spoiler. + Just stop and read the program; it won't take long. Once you've figured + out what it does, run it. It may surprise you. + + This entry won, not because the obfuscation is impenetrable, but because + it successfully fooled half of the judges, including me. + + +Selected Author's Comments: + + Description + =========== + + For 15 years, IOCCC winners have obfuscated programs using esoteric, + difficult-to-interpret, confusing algorithms. This entry finally bucks + that trend and obfuscates in the most "obvious" way possible: by + painstakenly describing the algorithm in clear pseudocode. Even novice + programmers will recognize that the program should find and print prime + numbers up to a given number (as specified on the command line). + + But novice programmers especially know that mistakes are often made in + translating pseudocode to real code, often resulting in programs with + unexpected and confusing output. Clearly, the program contains several + syntax "mistakes" (e.g. LessThanOrEqualTo) and blatant "errors" (e.g. + Zero). This program clearly requires "debugging." + + As a result of these "bugs", the program does not primes at all. + Instead, the program reads input from stdin and returns garbled text on + stdout. Fortunately, you can recover the original message simply by + running the program a second time. Try: + + ./primenum n < textfile | ./primenum n > textfile2 + diff textfile textfile2 + + where n is the same number (modulo 64). So, the prime number generator + is actually a simple text encoder/decoder! Of course, don't forget that + argument, otherwise the "bugs" in the program will cause it to crash! + + Features + ======== + + - The program attempts to mislead the reader into thinking that it + generates prime numbers. It does this by + o describing a correct algorithm in pseudocode, + o using partially correct conversion of pseudocode to real code, + o using suggestive variable names, and + o using a suggestive program name. + - The program demonstrates a novel method of abusing the C preprocessor. + - How the filter algorithm works is left as an exercise to the reader. + - OK, so running it through the preprocessor strips away the prime + number front. But ye be warned: not a11 variab1es1es are identica1 :-) + - Other features include + o useless variables + o useless if + o a for loop that's used as an if statement + o dependence on the high bit being 0 + - Try also + echo THIS MESSAGE IS IN ALL CAPS | primenum 32 diff --git a/2000/rince.c b/2000/rince.c new file mode 100644 index 000000000..75389f2d3 --- /dev/null +++ b/2000/rince.c @@ -0,0 +1,56 @@ +# include +# include +# include +# define W(f) f##Window(S, +# define O ; break ; case +# define _ * s + + XID w,r,l=45<<9, d,v =1,E; GC V[2]; typedef + char * K; Display *S; XGCValues g; typedef int Y; K j; + double *o,I [99] ,T= 0,t ,_, atof( ); K X(K + i){ for (r=0 ; o=s-1 ,*i ; i ++ ) { switch (*i){ + struct { K Y; Y K, t ; XID k ; } Z; K z= j++; + O 32L :*o *=_ --O '}' :*o /=_ --O 73: + *o += _ --O 61 :*o -=_ --O 123 + :_= sin (_) O 94 :_= asin (_) O 47 + :_= cos (_) O 45 : _= fmod(_ ,2* M_PI + )O 076 :_= sqrt (_) O 33: t=*o; *o= + _; _=t O 48 :_= cos (_) <0 O 86 + :j= i O 43: X(z ="K I@I-" )O 93: + X(z ="/ =")O 60 : i =++ r - 4 ? j-1 :i O 79 + :XDrawArc(S, d,V [(Y )_] ,(Y ) ( 399 +14 _ [ + -2] ),( Y)( *"' "+14 _ [ -1]) ,2,2 ,0,l + ) ; { Z. Y = i - 127 +r/ 3*2 ; Z.K= r%3+ + r/3 +1; Z.t =0; Z.k=E ; XDrawText (S,d,*V,(Y + ) ( 399 +14 *1[s-= strlen(z) ]),20, + + &Z,1); } O 1:default:*i>90?I[*i-32]=_--:(*++s + =I[*i+(*i<73)*r]); } } } Y main + (Y G,K*A){ *A= + +" 8<$ $li >d# -d8Z'Et#)wWP]WM C\\TI)#%!DcUAvz% H2&08M\\%YaHAW}4+%g ;|XN%W|l!_Kz+$UgBix41r=H7b@_:X 4zS EFo1i}= _D.%biA xF>)k*T(7&m \"G~ )TY *.^@$0.#yl< 66,/dI ;\\[![:- $u6 VnD X+ )TY-L38 :%\" )TY%8Z$ \"G|BfCb m@{;M} ^`K !T PIIIV[;I{ k;I/@{ K!=k;!={LM=M} K!=jM!}T!=k@P=`+e+f+g+hK I-[K I-pEF=Q `FG=Q k@]aK]b;]cP]d@{ EIeK{ FIf;{ GIgP{ HIhVAE{ J{AE/ E0\117<"; + + w = DefaultScreen ( S = + XOpenDisplay(0)); W( XMap + )d =W(XCreateSimple ) W( + Root )w),0,0,800,80 ,0,0 + ,BlackPixel(S,w ))) ; g. + foreground=WhitePixel (S,w + ); *(Y *) &g=6; for (; v + [V ]=XCreateGC( S,d ,4 + + v, &g),!--v; ); for ( E= + XLoadFont(S,"10x20" ),81 + [I]=2; I[84]=( G>2? + atof(2[A]) -2451545 + :time (0 )/ 3.75 + /l - 10957.5)+ (T+=G + > 1? atof(A[1]):0); ){ t + =5e4 *6013; s=I; for(j=*A + ;_++ =pow (t,(j[ 2]*'_'- + 3028 +3[j])/t)*pow(6e-4+ + 1,j[ sizeof* X(++j) ]+95 + **j- 3072.)-1; )j+=4; s-= + 2; W (XClear)d); XFillArc + (S,d ,*V,385,25,0x1c,28, + 0,l) ; X( j+4); XSync(S, + 0) ; usleep(10000); } } diff --git a/2000/rince.hint b/2000/rince.hint new file mode 100644 index 000000000..e3428f453 --- /dev/null +++ b/2000/rince.hint @@ -0,0 +1,333 @@ +Astronomically Obfuscated: + + James Bonfield + MRC Laboratory of Molcular Biology + Hills Road, + Cambridge + CB2 2QH + England + + +Judges' Comments: + + To build: + + make rince + + To run (using an X windows server): + + ./rince + + Also try: + + make dmy2jd + ./rince 0.001 `./dmy2jd 7.8 1 1610` + + + This program may have you going around in circles :-) Try running it + first before reading the Selected Author's Comments below. + + The judges verified the correctness of output for recent dates + thru visual observation. + + +Selected Author's Comments: + + How to use it + ------------- + + The simplest way to run it is with no arguments. Just type: + + ./rince + + You will need to have access to X windows, although it doesn't require + desperately high resolution and there are no known limitations on colour + depth. + + The display will change slowly over time, although it may take 10 minutes + or more to be visible. For those that cannot wait that long the program + has a built in time machine. Indeed the program knows the speed of light, + which is used to ensure that we see the "live" pictures. Simply specify + the fraction of a day to skip forward for each screen refresh. I suggest: + + ./rince 0.01 + + To display the output (still guessing?) for a given date, specify two + arguments. The first argument is as before and the second argument is a + Julian day number (given as a fractional component). Eg: + + ./rince 0 2441193.6 + ./rince 0.01 2441193.6 + + A Julian day is defined to be the number of days since January 1st in + the year -4712 (4713BC), starting at 12 noon GMT.[1] To aid conversion + from our time (GMT) to Julian day there is a supplementary program + named: dmy2jd.c. Run it with "day_float month year" as arguments. See + below for an example. + + + What it does + ------------ + + This program plots the positions of the four Galilean moons of Jupiter, + as seen from earth. It doesn't correct for your location on earth, but I + assure you that the parallax is minimal! + + The moons are labelled with roman numerals from I to IV. I being the + closest to the planet and IV being the furthest. They are: + + I Io + II Europa + III Ganymede + IV Callisto + + Amazingly, all it takes is a pair of binoculars to see the Galilean moons, + so the results can be experimentally checked. (Note that at present, the + best views of Jupiter are over the autumn/winter.) + + The positions of the moons should be correct for binoculars, but possibly + not if you have a telescope or if you are in the southern hemisphere. In + that case I suggest that to get the correct image you look at the screen + from inside the monitor whilst standing on your head. In case of + confusion, please consult the following chart (*): + + N + ^ + | + E <---+---> W + | + v + S + + (*) Not to scale. + + + History + ------- + + Galileo discovered the moons in January 1610. + "http://www-isds.jpl.nasa.gov/cwo/cwo_54ga/html/cd/galileo.htm" states + the following: + + By early 1610, Galileo had further improved his telescope by + double its power, so it now enlarged objects a thousand + times. He began looking at the stars and couldn't believe how + many more he could now see! The number seemed infinite. He was + beginning to realize the fixed stars weren't a flat distant + wall on a globe, but a three-dimensional expanse bigger than + anyone had ever thought! + + Then, on January 7, about an hour after sunset, Jupiter rose + in the east, and Galileo happened to turn his powerful scope + on its bright disk. It wasn't the first time he had looked at + Jupiter, but before it was with one of his lesser-powered + telescopes. This time, though, he noticed three small but + bright stars near the planet, two to one side and one to the + other. He wondered at how bright the small stars were and how + they were arranged in what seemed like a straight line. The + next night he decided to look at Jupiter again, and to his + surprise, the stars had moved. But not in such a way as he + would expect. If Jupiter was moving as it normally should, the + stars would be east of Jupiter. But all three were to the + west! The next night was cloudy, but on January 10, Galileo + was able to observe the planet again. One of the stars was + gone, and the other two were now on the east side. As the + stars moved around Jupiter on each succeeding night, and were + finally joined by a fourth star, it dawned on Galileo that + what he had found were moons orbiting Jupiter! Almost at once + he realized that this was proof that not all objects orbited + the Earth. Here were four bodies that were orbiting + Jupiter. One argument against the sun-centered theory was, if + the Earth orbited the sun, wouldn't the moon get left behind? + Here he could see for himself that somehow, a planet could + orbit the sun, and not leave a moon behind! + + Thus we can plot Galileo's discoveries using the following three plots: + + ./rince 0 `./dmy2jd 7.8 1 1610` + ./rince 0 `./dmy2jd 8.8 1 1610` + ./rince 0 `./dmy2jd 10.8 1 1610` + + However we can go one better by seeing what Galileo would have seen if it + wasn't cloudy on the 9th. Try "./rince 0 `./dmy2jd 9.85 1 1610`" to see + what he was missing out on. I wonder what he'd have made of that! + + Galileo discovered the fourth moon a few days later. + + I've tried typing these dates in to two Java based Jovian moon plotters, + but both I tried had problems dealing with dates earlier than 1900. More + professional software, such as the SkyMap program [3] gets these values + correct and this compares well with the above description and with this + IOCCC entry. + + + The year 4713BC was chosen by Joseph Justus Scaliger in the 16th Century, + so clearly this program has a long history :-) A more complete description + of the origins of Julian Days can be found at: + + http://aa.usno.navy.mil/AA/faq/docs/millennium.html + + + Assumptions + ----------- + + 1. The ASCII character set is used. + + 2. That an enormous comet hasn't changed the course of Jupiter (or Earth!). + + 3. That the date has not been specified as the gap between the Julian + and Gregorian calendar. + + 4. That the DISPLAY environment variable is set and the X display can + opened. If this is not the case the program will crash. + + 5. There is a year 2000BC problem :-) + More specifically, the plots for dates that far back are too inaccurate + to be of realistic use. Comparisons against SkyMap Pro [3] show that + there is a good similarity (but not much more) up to about 500BC. + + 6. The code definitely is not portable - it will produce incorrect results + if run from the surface of Mars. + + + Obfuscations + ------------ + + In addition to the normal obfuscations, I feel that the code contains + some less common tricks. Taken through the standard rounds listed in the + guidelines, the code attempts to pass these as follows: + + 1. Look at the original source + + With luck, pure casual inspection should not reveal much except + that the program contains the X Windows logo (a big clue) and + contains a date. This date may give a clue to a few people that + this is an astronomical program. + + Unfortunately I was stretched for space which meant that the + large string constant could not be split up using a "partA" + "partB" method which clearly limits the code layout. However the + space saved by using a single long string constant is more than + outweighed by ability to further obfuscate. + + 2. convert ANSI tri-graphs to ASCII + + These are not used. + + 3. C pre-process the source ignoring #include lines + 4. C pre-process the source ignoring #define and #include lines + + This does a good job of expanding out the code, but it does not + clarify things greatly. The use of #defines has been restricted + primarily to a space-saving mechanism. + + Additionally, the use of typedefs means that the types used are + still obscured unless further replacement edits are made. + + 5. Run it through a C beautifier. + + GNU indent seems to do a reasonable job, provided that the + #defines are expanded first. This doesn't lay the algorithm + particularly bare though as most of the obfuscations are not + simple code layouts. + + 6. Examine the algorithm. + + The algorithm operates on two levels. The main visible level is + by taking a large string and breaking this down into a series of + op-codes (which I have termed J-code). These are then executed. + + To get to the real method of how it works, you need to decode + the op-code string (which deliberately contains as many ; { and + } symbols as possible), which will give you a reverse-polish + notation chunk of mathematics. + + Sensible people amongst you will simply refer to the referenced + book :-) + + 7. Lint it. + + I no longer have lint, although I do have access to Purify. I'm + happy to say that purify does not detect any memory errors or + memory leaks. + + See below for compilation warnings. + + 8. Compile it. + + I'm sorry to say that there are several warnings issued by the + compiler. + + Firstly, the return type for X() is not specified, so it + defaults to int. Horror of all horrors - this function does not + return an integer type (it doesn't contain any specific + returns). The return value from X() is not accessed. The same + problem occurs in main - it does not return. However main never + exits unless there is a serious error. + + The 6th argument of XDrawText (which should be XTextItem) is + passed as a compatible structure, but without casting. This is + to reduce code space. A more elegant solution is to remove the + "struct {...} Z" completely and use "XTextItem + f={i-127+r/3*2,r%3+r/3+1,0,E}" at the start of XDrawText + block. Although this is accepted by several compilers, it is not + strict ANSI due to the non-constant initialisers. A pity. + + Note that I make use of usleep(). This is a POSIX call (it is + BSD), but it supported on many systems. It may be implemented + using select() or poll() if required, or as a final solution you + may change the usleep(10000) to sleep(1). To compile on systems + which do not have usleep, but do have select, the following may + suffice as an additional compiler argument: + + -Dusleep={time_t v[2]={0,10000};select(0,0,0,0,v);} + + Gcc complains about "unreachable code at beginning of switch + statement", although removing some of this code will prevent + the algorithm from working. + + Gcc also suggests that I should be using extra parenthesis, but + I'm taking this as good comment :-) + + + In addition to the above, the program has the following useful(?) + obfuscations: + + 1. The algorithm requires many floating point numbers (about + 50). These are encoded as ASCII. + + 2. The J-code algorithm has op-codes designed to be space + saving. They are all one byte, but many are also considered as + white-space by the rules. This algorithm forms part of the same + string that the floating point constants are embedded + within. What does the ";" command do in J-code? + + 3. The J-code language is both stack based and variable based. This + "uncleanliness" is not ideal from a computer science angle, but + when has cleanliness been considered as good in IOCCC? :-) + + 4. Association of unconnected data by implied function usage. Eg + use of strlen() and sizeof() simply to return useful numerical + values, using irrelevant arguments. + + 5. As we already have a dependency on ASCII this has been abused + further. Specifically some integer constants are specified as + ASCII and some ASCII constants are integers. This hides the true + meaning for the values. + + 6. Red herrings: there's a couple of pieces of code whose + appearance is just there to mislead the unfirm of mind. + I've only tried to include such examples in places where at + first glance the code appears to be executed. + + + References + ---------- + [1] Astronomical algorithms (1st ed): page 59 + Jean Meeus. Published by Willmann-Bell Inc. + + [2] Astronomical algorithms (1st ed): pages 285-299. + Jean Meeus. Published by Willmann-Bell Inc. + + [3] Skymap Pro, by Chris Marriott + http://www.skymap.com/ diff --git a/2000/robison.c b/2000/robison.c new file mode 100644 index 000000000..0cd09773d --- /dev/null +++ b/2000/robison.c @@ -0,0 +1,829 @@ +#define A B. +#define C if( +#define D >>E&1 +#define F return +#define G typedef +#define H printf( I( +#define J(E,K) for(E=K; E--; ) +#define L(M) =N(O.M)+3*N(O.M&O.P), +G +int +Q; +G +unsigned +R; +G +struct +{ +Q +N, +S, +P, +T, +U, +V; +} +W; +R +_; +R +N( +R +X) +{ +R +Y= +2, +Z; +for +(; + Y +; +Y*= +Y) +{ +Z= +-1 +/- +~Y +; +X= +(X +/Y +&Z +)+ +(X +&Z +)* +(Y +*_ +-~- +_) +; +} +F +X; +} +W +S( +W +a) +{ +W +B; +_= +1; +A +N= +N( +a. +S) +; +A +S= +N( +a. +N) +; +A +P= +N( +a. +P) +; +A +U= +-1 +<< +30 +; +A +V= +-a +.U +; +F +B; +} +Q +P( +Q +Y, +Q +b, +R +c) +{ +Q +E= +Y+ +(b ++8 +)% +10 +-5 ++Y +/4 +%2 +&31 +; +F +c +D|| +Y/ +4- +E/ +4- +~- +(b +&2 +)? +-1 +:E +; +} +Q +T( +W +B, +Q +a, +Q +b) +{ +Q +E= +P( +a, +b, +A +N) +; +F~ +E? +A +S +D? +~P +(E +,b +,A +S| +A +N) +?128 +|b +*32 +|a +:- +1: +b* +32 +|a +:E +; +} +Q +U( +W +B, +R +c, +Q +Y) +{ +Q +E, +b; +J( +E, +32 +)C +(A +N& +c) +D) +J( +b, +2<< +(A +P +D) +)C +T( +B, +E, +b) +>= +Y<< +7) +F +1; +F +0; +} +W +V( +W +B, +Q +Z) +{ +R +E= +Z& +31 +,b +=Z +/32 +&3 +,Y +=A +T= +P( +E, +b, +0) +,K +=1 +<< +Y; +A +N|= +K; +A +P&= +~K +; +A +P|= +(A +P +D) +<< +Y; +_= +A +S +D&& +U( +B, +K, +1) +; +A +P|= +K&- +1<< +28 +; +A +N&= +E= +~( +1<< +E) +; +A +P&= +E; +A +S&= +E; +F +Z>> +7? +V( +B, +b<< +5| +Y) +:B +; +} +W +d( +W +B, +Q +b) +; +R +e; +W +f( +W +B, +Q +E, +Q +b, +Q +g) +{ +Q +h, +i= +0, +I, +j, +K, +k, +Z, +Y; +J( +h, +2<< +(A +P +D) +){ +j= +T( +B, +E, +h) +; +C~ +j&& +j>> +7!= +!~ +g) +{ +++ +i; +C +A +U<= +A +V) +{ +W +O; +O= +V( +B, +j) +; +K= +g< +0? +j: +g; +++ +e; +I= +_? +f( +O, +O. +T, +b, +K) +.U +:( +Y= +b+ +U( +O= +S( +O) +,- +1, +1) +)? +-( +d( +O, +~- +Y) +.U +): +(_ +=0 +,Z +L( +N) +k +L( +S) +(k +-Z +<< + 24 +)/ +(k ++Z +)+ +(short +)rand +() +); +C +I>= +A +U) +{ +A +U= +I; +A +T= +K; +} +} +} +} +_= +i; +F +B; +} +W +d( +W +B, +Q +b) +{ +Q +E= +32 +,Y += +~U +(B +,- +1, +1) +; +for +(; +E-- +&& +A +U<= +A +V; +)C +A +N +D) +{ +B= +f( +B, +E, +b, +Y) +; +} +F +B; +} +char +l[ +4095 +], +*O +=l +,* +b; +char +*I +(char +*X +){ +Q +Z= +1, +W= +0, +E, +M= +0, +B; +b= +O; +for +(; + E += +*X +++ +; +){ +E= +E% +65 +%6 +^2 +; +M+= +B= +Z+ +1+ +E/ +4; +W= +W<< +B^ +E; +Z= +E< +2; +J( +E, +M/ +7) +{ +M%= +7; +W^= +(* +O++= +W>> +M) +<< +M; +} +} +*O +++= +0; +F +b; +} +Q +main +() +{ +Q +K, +Y, +E, +m, +n, +o= +4, +g, +b, +Z; +W +B; +srand +(clock +() +); +A +S= +(A +N= +4095 +)<< +20 +; +A +P= +0; +for +(; +; +){ +J( +K, +8) +{ +J( +Y, +8) +{ +E= +K* +4+ +Y/ +2; +H" } { }" +)+ +(K +^Y +^1 +)% +2* +2, +".xoXO" +[( +A +P +D) +*2 ++( +A +S +D) +*2 ++( +A +N +D) +]) +; +} +H" } } } } } } " +), +-~ +E) +; +} +J( +g, +1) +{ +O= +l; +H"} } } } { } } } } { ; ; }" +)+ +o/ +2* +2) +; +e= +0; +C +o< +4) +B= +S( +B) +; +C! +U( +B, +-1 +,0 +)) +{ +H" } } { ; { ; } ; } } " +)) +; +F +0; +} +H" { { ; { ; ; { ; ; { { } } ; ; { } } } ; ; { ; } } } { ; { ; ; { { ; } } " +)+ +(o +&1 +)* +13 +,I +(" } { { } ; } " +)+ +U( +B, +-1 +,1 +)) +; +C +o& +4) +{ +o& +1? +scanf +("%d" +,& +n) +:( +scanf +("%d%d" +,& +m, +&n +), +-- +m) +; +Z= +A +N>> +m& +1? +T( +B, +m, +n) +:- +1; +C +g= +Z>> +7!= +U( +B, +-1 +,1 +)) +{ +H"{ ; { { } { } { ; } ; { " +)) +; +} +} +else +{ +A +U= +-( +A +V= +1<< +30 +); +for +(b +=4 +; +e< +65536 +&& +b< +20 +; +b++ +){ +Z= +(o +&1 +?f +(B +,m +,b +,- +2) +:d +(B +,b +)) +.T +; +} +o& +1? +H" } { } " +), +Z>> +5& +3^ +3) +:H +" } { } } } { } " +), +32 +-( +Z& +31 +), +Z>> +5& +3^ +3) +; +} +} +B= +V( +B, +Z) +; +g= +o; +C +_) +{ +o|= +1; +m= +A +T; +} +else +{ +o= +o/ +2* +2^ +4; +} +C +g< +4) +{ +B= +S( +B) +; +} +} +} diff --git a/2000/robison.hint b/2000/robison.hint new file mode 100644 index 000000000..f01a1672c --- /dev/null +++ b/2000/robison.hint @@ -0,0 +1,172 @@ +Best game: + + Arch D. Robison + 1406 Country Lake Drive + Champaign IL 61821 + USA + + +Judges' Comments: + + To build: + + make robison + + To run: + + ./robison + + The program plays almost always reasonably, but does not always detect + illegal moves. Try "9 1" as your first move, then "13 2". Also it + tends to think for quite a while in the beginning of a game. It is + also smart enough to give up by making a losing move at the end of + a game when its position is hopeless. + + Unfortunately, due to the contest rules, we're unable to grant the + author a patent he applied for. :-) + + +Selected Author's Comments: + + TITLE OF INVENTION + + Highly Compressed Program for Playing Hygienic Checkers + + FIELD OF INVENTION + + The present invention generally relates to checkers. + + BACKGROUND OF THE INVENTION + + Within the field of checkers, the problem of finding a hygienic opponent + is difficult, as good opponents are peculiar to the tavern habitat of + cracker-barrels, pot-belly stoves, tobacco, and spittoons. + + BRIEF SUMMARY OF THE INVENTION + + The present invention plays checkers without spitting. + + BRIEF DESCRIPTION OF SEVERAL VIEWS OF THE INVENTION + + FIG. 1 shows a numbering of positions. + + FIG. 2 shows a numbering of directions. + + FIG. 3 shows a sample board. + + FIG. 4 shows a method in accordance with the present invention. + + DETAILED DESCRIPTION OF THE INVENTION + + Operator plays Black (x); the program plays White (o). Said Black goes + first. On operators turn, said program requests a position and direction. + FIG. 1 shows the numbering of the squares. FIG. 2 shows the numbering of + directions. As per standard rules, if one or more jumps are possible, one + of the jumps must be taken in preference to other moves. Said operator + enters the numbers for the position and direction. If after jumping over a + piece, another jump is possible, and said piece did not become a king after + said jump, standard rules require that another jump be taken. In said case, + said program requests a direction only in which to continue jumping from the + present position. Kings are denoted by upper case. FIG 3. shows a sample + board. There is a black king (X) on square 30 and a red king (O) on square + 2. The numbers on the right are the numbers of the rightmost square in each + row. + + A player loses if they cannot make a legal move. Said loss is trivially + true if player loses all of his/her pieces. The present invention announces + said loser. + + FIG. 4 shows a C program in accordance with the present invention. Control + flow is straightforward: control enters routine ``main'', executes a + plurality of statements, and exits via return statement. FIG. 4 presumes + that type int is 32 bits and short is 16 bits, which are essential to the + preferred embodiment of the invention. FIG. 4 also presumes that the host + computer uses ASCII encoding for characters. It should be obvious that + practitioners skilled in the art of C programming can remove said + limitations. + + The disclosure here describes a particular embodiment of the present + invention, and other embodiments within the spirit of this disclosure + are possible, as well as consumption of spirits while playing. + + CLAIMS + + I claim, by letters patently absurd: + + 1. A method for playing checkers on a computer-based system, where said + method's source code fits into 1536 countable bytes of source code, + where a byte is countable if + + (a) it is not whitespace and + (b) it is not a {, }, or ; immediately followed by whitespace. + + 2. The method of claim 1, further comprising a method of alpha-beta pruning + that exploits the zero-sum nature of the game to unify alpha + and beta cuts. + + 3. The method of claim 1, further comprising the step of formatting the + source code with short lines, in order to impress manager with + high productivity, when measured in lines of code. + + 4. The method of claim 3, further comprising the step for telling + skeptical manager that this is the well-known technique of + "linear programming". + + 5. The method of claim 1, where ~- and -~ replace the obvious arithmetic + operations. + + 6. The method of claim 1, further comprising a method where + + (a) strings are encrypted in a manner suitable as C strings, and + (b) 7-bit ASCII characters with uniform distribution are maximally + packed subject to the restriction that + (c) each byte is not countable. + + 7. A method for a computer-based system that uses a single shared code + sequence to either sum a plurality of bits in an N-bit word or reverses + them, in lg(N) time, depending upon a parameter. + + DRAWINGS + + FIG 1. + + +--+--+--+--+--+--+--+--+ + |32| |31| |30| |29| | + +--+--+--+--+--+--+--+--+ + | |28| |27| |26| |25| + +--+--+--+--+--+--+--+--+ + |24| |23| |22| |21| | + +--+--+--+--+--+--+--+--+ + | |20| |19| |18| |17| + +--+--+--+--+--+--+--+--+ + |16| |15| |14| |13| | + +--+--+--+--+--+--+--+--+ + | |12| |11| |10| | 9| + +--+--+--+--+--+--+--+--+ + | 8| | 7| | 6| | 5| | + +--+--+--+--+--+--+--+--+ + | | 4| | 3| | 2| | 1| + +--+--+--+--+--+--+--+--+ + + FIG. 2. + + 1 0 + \ / + . + / \ + 3 2 + + FIG. 3. + + o o X . 29 + o . . . 25 + o . . o 21 + . o . o 17 + x . . . 13 + . . x . 9 + x x . . 5 + x x O x 1 + + FIG. 4 + + [See attached listing.] diff --git a/2000/rules b/2000/rules new file mode 100644 index 000000000..a86d05da1 --- /dev/null +++ b/2000/rules @@ -0,0 +1,218 @@ + 15th International Obfuscated C Code Contest Rules | + +Copyright (c) Leonid A. Broukhis, Jeremy Horn, Landon Curt Noll and | +Peter Seebach, 2000. | + +All Rights Reserved. Permission for personal, education or non-profit use is | +granted provided this this copyright and notice are included in its entirety | +and remains unaltered. All other uses must receive prior permission in | +writing from the contest judges. | + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: his emotions obfuscated his + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show the importance of programming style, in an ironic way. + * To stress C compilers with unusual code. + * To illustrate some of the subtleties of the C language. + * To provide a safe forum for poor C code. :-) + +The 15th IOCCC contest window is: | + + 01-Feb-2000 00:00 UTC to 31-Mar-2000 23:59:59 UTC | + +NOTE: Some of the changes from the 1998 rules are denoted by change bars. ---> | + However some changes such as 1998 to 2000 are not marked. | + + +RULES: + + To help us with the volume of entries, we ask that you follow these rules: + + 1) Your entry must be a complete program. + + 2) Your entry must be <= 3217 bytes in length. The number of characters + excluding whitespace (tab, space, newline), and excluding any ; { or } + immediately followed by whitespace or end of file, must be <= 1536. + + 3) Your entry must be submitted in the following format: + +---entry--- +rule: 2000 +fix: y or n (n => this is a new entry, y => this replaces an older entry) +title: title of entry (see comments below) +entry: Entry number from 0 to 7 inclusive (your 1st entry should by 0) +date: Date/time of submission in UTC (see comments below) +host: Machine(s) and OS(s) under which your entry was tested + Use tab indented lines if needed +---remark--- + Place remarks about this entry in this section. It would be helpful if + you were to indent your remarks with 4 spaces, though it is not a + requirement. Also, if possible, try to avoid going beyond the 79th + column. Blank lines are permitted. +---author--- +name: your name +org: School/Company/Organization +addr: postal address + use tab indented lines to continue + don't forget to include the country +email: EMail address from a well known site or registered domain. + If you give several forms, list them on separate tab indented lines. +url: http://your/home/page.html or say none if you don't have one +anon: y or n (y => remain anonymous, n => OK to publish this info) +---info--- +If your program needs an info file, place a uuencoded copy of it in +this section. In the case of multiple info files, use multiple info +sections. If your entry does not need a info file, skip this section. +---build--- +Place a uuencoded copy of the command(s) used to compile/build your program +in this section. It must uudecode into a file named 'build'. The resulting +file must be 255 bytes or less. +---program--- +Place a uuencoded copy of your program in this section. It must uudecode +into a file named is 'prog.c'. The resulting file must follow rule #2. +---end--- + + Regarding the above format: + + * The title must match the expression: | + + ^[a-zA-Z0-9_=][a-zA-Z0-9_=+-]*$ | + + and must be 1 to 31 characters in length. | + + It is suggested, but not required, that the title should + incorporate the author(s) username(s). + + * The date in the ---entry--- section should be given with respect + to UTC. The format of the date should be as returned by asctime() + using the C locale. (see guidelines for more info) + + * You may correct/revise a previously submitted entry by sending + it to the contest email address. Be sure to set 'fix' in the + ---entry--- section to 'y'. The corrected entry must use the same + title and entry number as submission that is being corrected. Be + sure that you note the re-submission in the ---remark--- as well. + + * With the exception of the header, all text outside of the above + format may be ignored by the judges. If you need to tell the judges + something, put it in the ---remark--- section, or send a separate + EMail message to the judges. + + * Information from the ---author--- section will be published unless + 'y' was given to the respective author's 'anon' line. + + * To credit multiple authors, include an ---author--- section for + each author. Each should start with ---author--- line, and + should be found between the ---entry--- and ---build--- sections. + + * The home page URL in the ---author--- section must be fully | + qualified or must be the word `none'. | + + * The entry's remarks should include: + - note if this entry is a re-submission of a previous entry. + - what this program does + - how to run the program (sample args or input) + - special compile or execution instructions, if any + - special filename requirements (see rule 4 and 5) + - information about any ---info--- files + - why you think the program is obfuscated + - any other remarks (humorous or otherwise) + + * Do not rot13 your entry's remarks. You may suggest that certain + portions of your remarks be rot13ed if your entry wins an award. + + * Info files should be used only to supplement your entry. They + should not be required to exist. + + * If your entry does not need an info file, skip the ---info--- + section. If your entry needs multiple info files, use multiple + ---info--- sections, one per info file. You should describe + each info file in the ---remark--- section. + + * Your sections must in the same order as in the above template. + + 4) If your entry is selected as a winner, it will be modified as follows: + + 'build' is incorporated into a makefile, and 'build' is removed + 'prog.c' is renamed to your entry's title, followed by an optional + digit, followed by '.c' + your entry is compiled into a file with the name of your entry's + title, possibly followed by a digit + + If your entry requires that a build file exist, state so in your + entry's remark section. The makefile will be arranged to execute a + build shell script containing the 'build' information. The name of + this build shell script will be your entry's title, possibly followed + by a digit, followed by '.sh'. + + If needed, your entry's remarks should indicate how your entry must + be changed in order to deal with the new filenames. + + 5) The build file, the source and the resulting executable should be + treated as read-only files. If your entry needs to modify these files, + it should make and modify a copy of the appropriate file. If this + occurs, state so in your entry's remarks. + + 6) The uudecoded ---program--- section must be able to be compiled + cleanly by an ANSI C compiler, or if there are any compile errors, + they must be documented in the ---remark--- section. + + 7) The program must be of original work. All programs must be in the + public domain. All copyrighted programs will be rejected. + + 8) Entries must be received prior to 31-Mar-2000 23:59:59 UTC. (UTC is + essentially equivalent to Greenwich Mean Time) EMail your entries to: + + entry@ioccc.org + + We request that your message use the subject 'ioccc entry'. + + If possible, we request that you hold off on EMailing your entries + until 01-Feb-2000 00:00 UTC. Early entries will be accepted, however. + We will attempt to EMail a confirmation to the sender of any entry + received after 01-Feb-2000 00:00 UTC and before the close + of the contest. + + 9) Each person may submit up to 8 entries per contest year. Each entry + must be sent in a separate EMail letter. + + 10) Entries requiring human interaction to be built are not allowed. + + 11) Programs that require special privileges (setuid, setgid, super-user, + special owner or group) are not allowed. + + 12) Legal abuse of the rules is somewhat encouraged. An entry that, in + the opinion of the judges, violates the rules will be disqualified. + Entries that attempt to abuse the rules must try to justify why + their rule abuse is legal in the ---remark--- section. + + +FOR MORE INFORMATION: + + The judging will be done by Leonid A. Broukhis, Jeremy Horn, Landon + Curt Noll and Peter Seebach. Please send questions or comments + about the contest, to: + + questions@ioccc.org (not the address for submitting entries) + + Comments about confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, visit the IOCCC web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + As a last resort, previous winners may be obtained by sending EMail + to questions@ioccc.org. Please use the subject 'send YEAR winners', + where YEAR is a single 4 digit year or a year range (such as 1993-1994), + or the word 'all'. diff --git a/2000/schneiderwent.c b/2000/schneiderwent.c new file mode 100644 index 000000000..a32d98eee --- /dev/null +++ b/2000/schneiderwent.c @@ -0,0 +1,103 @@ + +#include +#include +#include +#include +#include + +#define I ??(i??)??(j??) +#define K ??(i-1??)??(j??) +#define S strtok(NULL,",\n\0") +#define P printf( +#define NB_MSGS 42 +#define C( f, m ) mNb = m;\ + s = setjmp( sT??( sI++ ??) );\ + if (!s) goto f; +#define bck longjmp( sT??( --sI ??), 0 ); + +jmp_buf sT??( 256 ??); +int m5??(84??),sI=0,c1='J'%2,mNb=0,s=0,mI=0,r=1; +unsigned long m1??(32??),q=0,z; +unsigned char m??( NB_MSGS ??)??( 11 ??); + +int main( int argc, char *argv??(??) ) +{ + time_t tmT = time( NULL ); + struct tm *tmS = localtime( &tmT ); + char tms??( 7 ??); + int hr,n,i=1,j=0; + FILE *info = NULL; + char iS??( 2048 ??); + + if ( argc > 1 ) info = fopen( argv??(1??), "r" ); + strftime( tms, 7, "%H:%M\n", tmS ); + if ( info != NULL ) { + fgets( iS, 2048, info ); + m5??( 0 ??) = atoi( strtok( iS, ",\0" ) ); + for ( hr = 1; hr < 85; hr++ ) m5??(hr??) = atoi(S); + for ( hr = 0; hr < 32; hr++ ) + m1??( hr ??) = strtoul( S, NULL, 10 ); + for ( hr = 0; hr < NB_MSGS; hr++ ) + for ( n = 0; n < 11; n++ ) + m??(hr??)??(n??) = (unsigned char)atoi( S ); + fclose( info ); + hr = atoi( strtok( tms, ":\0" ) ); + n = atoi( strtok( NULL, ":\0" ) ); + C( mA, 0 ) + C( out, 40 ) + s = setjmp( sT??( sI++ ??) ); + if ( s ) { + s = setjmp( sT??( sI++ ??) ); + if ( s ); else goto doHr; + } else goto doMin; + } else { + P "%s", tms ); + goto eoj; + doMin: + z = 22; + C( doIt, 0 ) + bck + doHr: + hr = ( n >= 36 ) ? hr+1 : hr; + if ( hr == 24 ) hr=0; + if (hr&&hr!=12)(hr<12)?(P "%d ",hr)):(P "%d ",hr-12)); + n = hr + 61; + q = 0; + r = 1; + z = 16; + C( doIt, 0 ) + P "\n" ); + bck + doIt: + if ( r & m1??( m5??(n??) ??) ) { + if (z == 22) q = q << 1; + C( out, q ) + if (z == 22) q = q >> 1; + } + r = r << 1; + q++; + if ( q < z ) goto doIt; + bck + out: + mI = 0; + mNb += c1; + while ( m??( mNb ??)??( mI ??) ) + P "%c", m??( mNb ??)??( mI++ ??) ); + bck + mA: + 129<=m I ? 137>=m I ? m K=m I-32 + : 145<=m I ? 153>=m I ? m K=m I-39 + : 162<=m I ? 169>=m I ? m K=m I -47 + : j : j : j : 125==m I ? m K=39 + : 64==m I ? m K=32 : j; + j++; + if (m I) goto mA; + i+=2; + j = 0; + if ( i < NB_MSGS ) goto mA; + bck + } + + eoj: exit( 0 ); + +} diff --git a/2000/schneiderwent.data b/2000/schneiderwent.data new file mode 100644 index 000000000..8fdded903 --- /dev/null +++ b/2000/schneiderwent.data @@ -0,0 +1,2 @@ +0,1,1,1,1,1,2,2,2,2,3,4,4,5,5,6,7,7,8,8,9,10,10,10,10,10,11,11,11,11,12,13,13,13,13,13,14,14,14,14,15,16,16,17,17,18,19,19,20,20,21,22,22,22,22,22,23,23,23,23,24,25,26,26,26,27,27,27,27,27,27,27,27,28,29,29,29,29,30,30,30,31,31,31,31,256,2560,561152,557312,166400,143360,139520,140800,200704,196864,199168,544768,540928,542208,331776,327936,329216,274432,270592,271872,299008,295168,296448,4096,0,1,20,68,256,1028,4100,16384,0,0,0,0,0,0,0,0,0,0,0,148,137,132,149,137,135,136,163,64,0,0,0,0,0,0,0,0,0,0,0,0,0,137,149,64,163,136,133,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,133,133,64,136,150,164,153,162,64,0,0,0,0,0,0,0,0,0,0,0,0,148,150,153,149,137,149,135,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,149,150,150,149,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,134,163,133,153,149,150,150,149,64,0,0,0,0,0,0,0,0,0,0,0,0,133,165,133,149,137,149,135,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,163,64,149,137,135,136,163,64,0,0,0,0,0,0,0,0,0,0,0,0,0,133,167,129,131,163,147,168,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,164,162,163,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,134,163,133,153,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,151,129,162,163,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,147,148,150,162,163,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,64,152,164,129,153,163,133,153,64,0,0,0,0,0,0,0,0,0,0,0,0,136,129,147,134,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,163,133,149,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,163,166,133,149,163,168,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,134,163,133,153,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,125,163,137,147,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,151,129,162,163,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,163,125,162,64,0,0,0,0,0,0 + diff --git a/2000/schneiderwent.hint b/2000/schneiderwent.hint new file mode 100644 index 000000000..e31302809 --- /dev/null +++ b/2000/schneiderwent.hint @@ -0,0 +1,65 @@ +Most Timely Output: + + Craig Schneiderwent + WI, USA + + +Judges' Comments: + + To build: + + make schneiderwent + + To run: + + ./schneiderwent schneiderwent.data + + Very nice play by the rules and portable text obfuscation. + This far surpasses old tricks like adding or subtracting 1 + from every character in a C string. + + Translating the messages into your language of preference while + keeping the program portable between different encodings + (Chinese, Japanese, Russian - anyone?) may be an entertaining task. + + +Selected Author's Comments: + + This entry displays the current time to the console, for example: + + it's just after ten 'til 6 in the evening + + FWIW, none of the compilers with which this entry was tested issued + any warnings or errors in compiling the source for this entry. No + doubt lint will complain about the goto statements. + + The schneiderwent.data file consists of the values used by multiple + table lookups. This is simply good program design, separating + these values from the source code allows changing the behavior of + the application without recompiling. + + Having learned COBOL at an early age, the pthreads of my thought + processes tend to be translated into code in a verbose manner. Some + of the #defines in this entry's code are to mitigate this personal + deficiency. + + Obfuscation in this entry consists of: + + > printfing console messages stored as EBCDIC character values - this + is not an attempt at encryption, but rather at cross platform + compatibility + > ASCII character values are calculated from the EBCDIC in a + particularly ugly abuse of the '?' operator + > detection of whether to print the ASCII or EBCDIC values is done by + taking the remainder of dividing the character 'J' by 2 - the ASCII + value of the character is even, the EBCDIC value is odd + > the messages to be printfed are determined via multiple table + lookups and bitmasked values + > for minutes, the bit position turned on is multiplied by two + to determine the message to be printfed + > for hours, the straight bit position is used + > this entry mostly eschews function calls for the often overlooked + setjmp/longjmp combination + > the trigraphs are not there as obfuscation nor are they there to + annoy the judges - it's just the easiest way to get around the + absence of square brackets in a normal 3270 environment diff --git a/2000/schneiderwent.orig.c b/2000/schneiderwent.orig.c new file mode 100644 index 000000000..e59e79c41 --- /dev/null +++ b/2000/schneiderwent.orig.c @@ -0,0 +1,103 @@ + +#include +#include +#include +#include +#include + +#define I ??(i??)??(j??) +#define K ??(i-1??)??(j??) +#define S strtok(NULL,",\n\0") +#define P printf( +#define NB_MSGS 42 +#define C( f, m ) mNb = m;\ + s = setjmp( sT??( sI++ ??) );\ + if (!s) goto f; +#define bck longjmp( sT??( --sI ??), 0 ); + +jmp_buf sT??( 256 ??); +int m5??(84??),sI=0,c1='J'%2,mNb=0,s=0,mI=0,r=1; +unsigned long m1??(32??),q=0,z; +unsigned char m??( NB_MSGS ??)??( 11 ??); + +int main( int argc, char *argv??(??) ) +{ + time_t tmT = time( NULL ); + struct tm *tmS = localtime( &tmT ); + char tms??( 7 ??); + int hr,n,i=1,j=0; + FILE *info = NULL; + char iS??( 2048 ??); + + if ( argc > 1 ) info = fopen( argv??(1??), "r" ); + strftime( tms, 7, "%H:%M\0", tmS ); + if ( info != NULL ) { + fgets( iS, 2048, info ); + m5??( 0 ??) = atoi( strtok( iS, ",\0" ) ); + for ( hr = 1; hr < 85; hr++ ) m5??(hr??) = atoi(S); + for ( hr = 0; hr < 32; hr++ ) + m1??( hr ??) = strtoul( S, NULL, 10 ); + for ( hr = 0; hr < NB_MSGS; hr++ ) + for ( n = 0; n < 11; n++ ) + m??(hr??)??(n??) = (unsigned char)atoi( S ); + fclose( info ); + hr = atoi( strtok( tms, ":\0" ) ); + n = atoi( strtok( NULL, ":\0" ) ); + C( mA, 0 ) + C( out, 40 ) + s = setjmp( sT??( sI++ ??) ); + if ( s ) { + s = setjmp( sT??( sI++ ??) ); + if ( s ); else goto doHr; + } else goto doMin; + } else { + P "%s", tms ); + goto eoj; + doMin: + z = 22; + C( doIt, 0 ) + bck + doHr: + hr = ( n >= 36 ) ? hr+1 : hr; + if ( hr == 24 ) hr=0; + if (hr&&hr!=12)(hr<12)?(P "%d ",hr)):(P "%d ",hr-12)); + n = hr + 61; + q = 0; + r = 1; + z = 16; + C( doIt, 0 ) + P "\n" ); + bck + doIt: + if ( r & m1??( m5??(n??) ??) ) { + if (z == 22) q = q << 1; + C( out, q ) + if (z == 22) q = q >> 1; + } + r = r << 1; + q++; + if ( q < z ) goto doIt; + bck + out: + mI = 0; + mNb += c1; + while ( m??( mNb ??)??( mI ??) ) + P "%c", m??( mNb ??)??( mI++ ??) ); + bck + mA: + 129<=m I ? 137>=m I ? m K=m I-32 + : 145<=m I ? 153>=m I ? m K=m I-39 + : 162<=m I ? 169>=m I ? m K=m I -47 + : j : j : j : 125==m I ? m K=39 + : 64==m I ? m K=32 : j; + j++; + if (m I) goto mA; + i+=2; + j = 0; + if ( i < NB_MSGS ) goto mA; + bck + } + + eoj: exit( 0 ); + +} diff --git a/2000/sheet1.info b/2000/sheet1.info new file mode 100644 index 000000000..e501a6efd Binary files /dev/null and b/2000/sheet1.info differ diff --git a/2000/thadgavin.c b/2000/thadgavin.c new file mode 100644 index 000000000..d8c9bac8a --- /dev/null +++ b/2000/thadgavin.c @@ -0,0 +1,93 @@ + + int + X=320 ,Y=200, + n=0,m, x,y, j=1024; + double T=44.0 /7,P[ + 333333 ],C[5] ={ 0,3, + 0,0,8} ,p=1, B=11.0 + /630, f=0,r = 3,g + =7,b =13,*q=P, D,*J; + unsigned char + U[66666],*v=U,*h,l[5555] + ,c=0,*e,*a,*z; + + #include + #define R1(t) t=(int)(t\ + *123456789 )%j; t/=j; + #define Rl(C,t)\ + n++[C] = t*n/12; + #define RI(C) B=-B; R1\ + (r)R1(g )R1(b )for(n\ + =0; n + #include + #include + #define Q(u,v) u##portb(0x3##v + #define W ; Q(out,C9),*h++/4) + void F(int i){ __dpmi_regs r + ; if(i){ for(; i>=0; i-=8)while( + ~Q(in,DA) + )&8^i); for(m=0,z + =h+j; h pixels; } } + #else + #include "curses.h" + void F(i){ if(i){ for(y=0; + y=X/2?x=-X/2,y++:4) + {*q++ = sqrt(x*x+y*y); + + *q++ = atan2(x,y); + + }for (;n1){p=2-p;RI(l+j)} + else if (p<0){p=-p;RI(l)} + + while(aT) + {C[1] += (f-T)/8; + + if (f>T*2) + C[0]=sin(f)+sin(f*2)/2; + } + } +} diff --git a/2000/thadgavin.hint b/2000/thadgavin.hint new file mode 100644 index 000000000..7eea7023e --- /dev/null +++ b/2000/thadgavin.hint @@ -0,0 +1,70 @@ +Most Portable Output: + + Thaddaeus Frogley + Creature Labs + 164 Hornbeams, + Harlow, Essex, + UK + + Gavin Buttimore + Creature Labs + 9 Elizabeth Way, + Cambridge, + UK, CB4 1DE + + +Judges' Comments: + + To build: + + make thadgavin + + To run: + + ./thadgavin + + This entry is a nice play by the rules. It can use curses, if the + SDL graphic library is not present, and is quite good at that, + but the colors used in graphic mode (16 bit depth) are unfortunately + less than dazzling. We could not test this entry in DOS mode. + + +Selected Author's Comments: + + To run under DOS: + + Compile using DJGPP as follows: + + gcc thadgavin.c -o thadgavin.exe -Wall -lm -O6 -mpentium -fomit-frame-pointer +-ffast-math + + To run under Windows, X-Windows or MacOS using the + Simple DirectMedia Layer: + + For example: + + gcc -O6 -lpthread -g -o thadgavin thadgavin.c -lSDL -DSDL -lm + + + In gcc you may get the following warning: + + prog.c:46: warning: passing arg 2 of `SDL_SetColors' from incompatible + pointer type + + In Microsoft Visual Studio you may get warnings as follows: + + prog.c(46) : warning C4133: 'function' : incompatible types - from 'unsigned + char *' to 'struct SDL_Color *' + prog.c(63) : warning C4026: function declared with formal parameter list + prog.c(77) : warning C4244: '=' : conversion from 'double ' to 'unsigned + char ', possible loss of data + + + But don't worry, this is completely normal. + + Recommended dosage: + + At least 3 minutes taken 3 times a day when tired. + + Do not exceed 3 times recommended dose. May cause + sickness, dizziness, nausea. diff --git a/2000/thadgavin.orig.c b/2000/thadgavin.orig.c new file mode 100644 index 000000000..6d2174339 --- /dev/null +++ b/2000/thadgavin.orig.c @@ -0,0 +1,101 @@ +// Initially you will be calm and serene: + + int + X=320 ,Y=200, + n=0,m, x,y, j=1024; + double T=44.0 /7,P[ + 333333 ],C[5] ={ 0,3, + 0,0,8} ,p=1, B=11.0 + /630, f=0,r = 3,g + =7,b =13,*q=P, D,*J; + unsigned char + U[66666],*v=U,*h,l[5555] + ,c=0,*e,*a,*z; + + #include + #define R1(t) t=(int)(t\ + *123456789 )%j; t/=j; + #define Rl(C,t)\ + n++[C] = t*n/12; + #define RI(C) B=-B; R1\ + (r)R1(g )R1(b )for(n\ + =0; n + #include + #include + #define Q(u,v) u##portb(0x3##v + #define W ; Q(out,C9),*h++/4) + void F(int i){ __dpmi_regs r + ; if(i){ for(; i>=0; i-=8)while( + ~Q(in,DA) + )&8^i); for(m=0,z + =h+j; h pixels; } } + #else + #include "curses.h" + void F(i){ if(i){ for(y=0; + y=X/2?x=-X/2,y++:4) + {*q++ = sqrt(x*x+y*y); + + // store result of atan2 of x and y in *q++ + *q++ = atan2(x,y); + + }for (;n1){p=2-p;RI(l+j)} + else if (p<0){p=-p;RI(l)} + + // will the maintenance programmer get this? + while(aT) + {C[1] += (f-T)/8; + + // sorry + if (f>T*2) + C[0]=sin(f)+sin(f*2)/2; + } + } +} diff --git a/2000/tomx.c b/2000/tomx.c new file mode 100644 index 000000000..f3bbedb0b --- /dev/null +++ b/2000/tomx.c @@ -0,0 +1,22 @@ +#include +#define true + +true /*:all + +CC=cc +PROG=tomx + +false : + make -f $0 $1 + exit 0 + +all: $(PROG) + +%:%.c + $(CC) $< -o $@ + +clean: + rm $(PROG) + +.PHONY: /* true clean */ + int main() {return!printf("Hello, world\n");} diff --git a/2000/tomx.hint b/2000/tomx.hint new file mode 100644 index 000000000..c2dba0630 --- /dev/null +++ b/2000/tomx.hint @@ -0,0 +1,114 @@ +Most Complete Program: + + Thomas P John + Mishybi Plamoottil + Parottukonam + Nalanchira P.O, Trivandrum-695015 + India + + http://tomx.tripod.com/ + + +Judges' Comments: + + To build: + + make tomx + + Try: + + rm -f ./tomx + sh tomx.c + ./tomx + + If sh is your shell: + + rm -f ./tomx + chmod +x ./tomx.c + ./tomx.c + ./tomx + + Also try: + + rm -f ./tomx + make -f tomx.c + ./tomx + + Polyglots have come and gone, but this was the first one we'd seen + where one language *used* another to perform its tasks. An interesting + approach. Admittedly, it's not all that obfuscated - but there's more + to it than you might think, since you have to make sure that your + changes don't change the shell code or the makefile. + + +Selected Author's Comments: + + Summary + ------- + This program works as a C source file, a Makefile and also as a + Shell (/bin/sh) script. But unlike some other multi-language prog- + rams, this one is NOT meant to print "Hello, world" in all 3 cases + (At least in the true sense ;-)). The C, make and shell code build + upon each other to create a C program (?) which when executed as a + shell script will compile itself through the C compiler using a + makefile! - Pretty useful, Eh?. + + Probably, this is the first entry ever to fully satisfy Rule #1 + ("Your entry must be a complete program") in the strictest sense;-) + + Top 5 reasons (IMHO) why this code is an entry for IOCCC + -------------------------------------------------------- + 1. A glance at the source itself will tell U that most of the + Obfuscation is NOT in the C code per se, but in the comments + to the C code. (But sadly, I could not find an "International + Obfuscated C COMMENT contest". So I HAD to sent this entry + here to the IOCCC itself). + + 2. Of the 3 languages in the source, the least obfuscated is + C (But again, there was NO obfuscated make/shscript contest) + (Does this hint for a rule in IOCCC-2001 that the major + obfuscation should be in C and not elsewhere???. Mmmmm...) + + 3. Extending Argument #2... Obfuscation done in the C code + (comments?) create obfuscated code for the other 2 languages. + This opens new possibilities to be explored in depth in future + IOCCCs + + 4. LOOKS like a makefile, WORKS like a shell script and COMPILES + like a C program + + 5. Does something useful (See Notes #1, #2) + + Notes + ----- + 1. The program could have been something other than the simple + "Hello, world" program that it is. It is possible to do + #include "prog2.c" in the place of the main(), leaving the + complexities of the C file elsewhere and making this source + still acceptable to "make" and "sh". The following modif- + ication to the last few lines will compile IOCCCs famous + "mkentry.c" + + .PHONY: /* true clean */ + #undef true + #include "mkentry.c" + + Ain't that useful? + + 2. By extending this program's idea, It is possible to do some + very interesting things like generating C code on execution + by adding additional code in make/sh (open up a loop????). + This opens the possibilities of generating & compiling some + [obfuscated?] C code.(Maybe should try this if this program + fails at IOCCC 2000) + + 3. Changing the "%:%.c" dependency to a "$(PROG):$(PROG).c" form + can compile this program with some other make-s (I got it to + work in Windows using nmake and Gnuwin32's sh ;-) + + 4. Interesting things to do: try "$ ./tomx.c clean". This will + do the same as "make clean" :-)). Also: "$ ./tomx.c all" + + 5. Be careful about the Tabs in the source code. Removing them + or converting Tabs to spaces can be disasterous + diff --git a/2001/2001.tar.bz2 b/2001/2001.tar.bz2 new file mode 100644 index 000000000..dab5f9c3e Binary files /dev/null and b/2001/2001.tar.bz2 differ diff --git a/2001/Makefile b/2001/Makefile new file mode 100644 index 000000000..199c83c41 --- /dev/null +++ b/2001/Makefile @@ -0,0 +1,197 @@ +#!/bin/make +# 2001 makefile +# +# Copyright (C) Simon Cooper, Landon Curt Noll, Peter Seebach, 2001. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# from the contest judges. + +SHELL= /bin/sh +CAT= cat +RM= rm +SED= sed +TRUE= true + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O. +# A few compilers have broken optimizers and thus you may +# not want anything. +# +#OPT= +#OPT= -O +OPT= -O2 + +# flags for ANSI compiles +# +# NOTE: Some ANSI compilers make use of -Xa to turn on ANSI mode, +# others such as gcc may want -ansi, others (Compaq Tru64 Unix) +# want -std1, and others may want nothing at all. +# Adjust the CFLAGS line as needed. +# +# NOTE: Some compilers cannot optimize, or optimize some entries +# incorrectly. You might want to turn on -O to see if your +# compiler can handle them. +# +# +#CFLAGS= -Xa ${OPT} +#CFLAGS= -std1 $(OPT) +CFLAGS= -ansi ${OPT} + +# NOTE: On some systems, the library path does not include the location +# of the X11 libraries. You might need to use a -L/path/to/X11/lib/dir +# in order to compile with these libs. +# +X11CCFLAGS= -I/usr/X11R6/include -I/usr/X11R6/include/X11 -I/usr/include/X11 +#X11CCFLAGS= +X11LDFLAGS= -L/usr/X11R6/lib -Wl,-R/usr/X11R6/lib +#X11LDFLAGS= + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +MAY_NEED_GCC= gcc + +# winners that compile under ANSI C +# +WINNERS= anonymous bellard bellard.otccex cheong coupard \ + ctk dgbeards herrmann1 herrmann2 jason kev ollinger rosten \ + schweikh westley williams +ALT_NAMES= westley.orig +DATA_FILES= anonymous_files bellard_files herrmann1_files herrmann2_files + + +all: ${WINNERS} + +# Most likely to amaze +# +anonymous: anonymous.c + magic='${MAY_NEED_GCC} -O1'; \ + X='-DA(X)=#X'; \ + warning='-pedantic -Dprocessor'; \ + $$magic $$warning -Dmagic= $$X "-DX=A($$magic \"$$X\")" \ + -o anonymous anonymous.c + +anonymous_files: anonymous.ten.c + +# Best abuse of the rules +# +bellard: bellard.c + ${CC} -rdynamic ${CFLAGS} bellard.c -o bellard -ldl + +bellard_files: bellard.otccex.c + +# Best short program +# +cheong: cheong.c + ${CC} ${CFLAGS} cheong.c -o cheong + +# Most obfuscated sound +# +coupard: coupard.c + ${CC} ${CFLAGS} -o coupard coupard.c + +# Worst Driver +# +ctk: ctk.c + ${CC} ${CFLAGS} -o ctk ctk.c + +# Worst AI +# +dgbeards: dgbeards.c + ${CC} ${CFLAGS} -DE=break -DF=char -DK=case -DP=int -DR=return \ + -DI=0xFFFF dgbeards.c -o dgbeards + +# Best abuse of the C preprocessor +# +herrmann1: herrmann1.c herrmann1.sh + @echo "NOTE: $@ must be built/run using the script $@.sh" + ${SHELL} ./herrmann1.sh + +herrmann1_files: herrmann1.gcd herrmann1.sh herrmann1.times2 + +# Most eye-crossing +# +# This entry requires the GCC -include feature. +# +herrmann2: herrmann2.c + ${MAY_NEED_GCC} ${CFLAGS} herrmann2.c -o herrmann2 \ + -include /usr/include/stdlib.h -include /usr/include/stdio.h \ + -include /usr/include/time.h -include /usr/include/unistd.h + +herrmann2_files: herrmann2.cup herrmann2.ioccc + +# Best Of Show +# +jason: jason.c + ${CC} ${CFLAGS} -o jason jason.c + +# Best Curses Game +# +kev: kev.c + ${CC} ${CFLAGS} -DPORT=5455 -DSPEED=50 -o kev kev.c \ + -lcurses -ltermcap \ + -Dl_="socket(il.sin_family=AF_INET,SOCK_STREAM,0)" + +# Best primal ASCII graphics +# +ollinger: ollinger.c + ${CC} ${CFLAGS} ollinger.c -o ollinger + +# Best abuse of the user +# +rosten: rosten.c + ${CC} ${CFLAGS} rosten.c ${X11CCFLAGS} ${X11LDFLAGS} -pedantic -lX11 \ + -o rosten + +# Best one-liner +# +schweikh: schweikh.c + ${CC} ${CFLAGS} schweikh.c -o schweikh + +# Best position-independant code +# +westley: westley.c + ${CC} ${CFLAGS} westley.c -o westley + +westley.orig: westley.orig.c + ${CC} ${CFLAGS} westley.orig.c -o westley.orig + +# Best position-independant code +# +williams: williams.c + ${CC} williams.c ${X11CCFLAGS} ${X11LDFLAGS} -lX11 -o williams + +everything: ${WINNERS} ${ALT_NAMES} ${DATA_FILES} + +love: + @echo 'not war?' + +haste: + ${MAKE} waste + +waste: + @echo 'waste' + +clean: + ${RM} -f *.o a.out core ${WINNERS} + +clobber: clean + ${RM} -f ${WINNERS} + ${RM} -f ${ALT_NAMES} + +nuke: clobber + @${TRUE} + +install: all + ${CAT} ${WINNERS} ${ALT_NAMES} > /dev/null diff --git a/2001/README b/2001/README new file mode 100644 index 000000000..1cee3ffa4 --- /dev/null +++ b/2001/README @@ -0,0 +1,97 @@ +2001 marked the "The Sixteenth International Obfuscated C Code Contest" + +Copyright (C) Landon Curt Noll, Simon Cooper, Peter Seebach +and Leonid A. Broukhis, 2001-2002. +All Rights Reserved. Permission for personal, educational or non-profit +use is granted provided this copyright and notice are included in its +entirety and remains unaltered. All other uses must receive prior permission +from the contest judges. + + +Standard IOCCC stuff +-------------------- + +The IOCCC has a web site and now has a number of international mirrors. The +primary site can be found at, + + http://www.ioccc.org + +Use make to compile entries. It is possible that on non-Un*x / non-Linux +systems the makefile needs to be changed. See the Makefile for details. + +Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitters. + +Read over the makefile for compile/build issues. Your system may +require certain changes (add or remove a library, add or remove a +#define). + +Some ANSI C compilers are not quite as good as they should be. If +yours is lacking, you may need to compile using gcc instead of your +local compiler. + + +Remarks on some of the entries +------------------------------ + +There were some outstanding entries that did not win. Unfortunately +some very good entries lost because they: + + + depended too much on non-portable side effects in expressions; + + depended too much on a particular byte order; + + required the use of a special script, data file or pseudo-machine + language that was not supplied with the entry. + +We hope the authors of some of those entries will fix and re-submit +them for the next IOCCC. + +We believe you will be impressed with this year's winners. The Best of Show +is a fine example of obfuscation. But don't ignore the other winners! +There are games, programs that speak, ones that compile code and one that +might run binaries you already have! + +The Worst Abuse of the Rules is technically allowed by the rules. This year +we awarded it again, but don't assume you can get away with using the same +technique next time ... :-) + +This year there were several repeat winners. This is understating the +achievement a little - one person has won 8 times before! (Please note that +judging is done completely anonymously). + + +Why has it taken so long to post the winning source? +---------------------------------------------------- + +This is somewhat my (Simon Cooper) fault. I do apologize to the IOCCC +community for this! Judging does take quite a lot of time, and I +over-committed myself several times this year. Without divulging too much, +we do look at and work out what every entry does. + + +Final Comments +-------------- + +Please send us comments and suggestions what we have expressed above. +Also include anything else that you would like to see in future contests. +Send such email to: + + questions@ioccc.org + +If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used. + +You must include the words ``ioccc question'' in the subject of your EMail +message when sending EMail to the judges. + +If you have problems with any of the entries, AND YOU HAVE A FIX, please +EMail the fix (patch file or the entire changed file) to the above address. + +Watch: + + http://www.ioccc.org/ + +for news of the next contest. + +=-= diff --git a/2001/anonymous.c b/2001/anonymous.c new file mode 100644 index 000000000..2ec73c9fb --- /dev/null +++ b/2001/anonymous.c @@ -0,0 +1,39 @@ +#define processor x86 + +#include +#include + +#define l int* +#define F char + struct stat t; +#define c return +#define I (P+=4,*L(P-4,0)) +#define G (signed F)E(*L(P++,0)) +#define C(O,D)E (D[B+V(010)/4+O*10]) +#define U R[4]=E(V(17)-4),*(l)V(021)= +F M [99],Q[99],b[9999],*ss,*d=b,*z; +#define O =(n=*(l)V(021),R[4]=E(V(17)+4),n) +#define p(a,b,c) system((sprintf(a,b,k[1]),c)),z +#define g (y/010&7) +#define R (B+13) +#define x86 (F*)index\ +(ss+V(i ),0100) +#define D(y,n,a,m,i,c )d+=sprintf( d,y,n,a,m,i,c ),(F*\ + ) P + l B,i,n,a,r,y , + P ; +#define Tr(an,sl,at,or) l an##i(d,sl){ c at? an##i(d,r):or; } \ +l an(d, sl){ c \ +r=V(014 )&63,an##i(d,sl); } +#define add(Ev,Gv) Ev(){ i=((a-=16)+C(r,4))/4,(\ +Gv?Ev() :0) ; } Ev##n(){ a=C(r,5),Ev(); } +Tr(L,r, C(r,3)&&C(r,3)<=d?(l)(((int)B)+d+C(r,4)-C(r,3)):(((int)B)^d)>>24&&--\ +r,(l)d) Tr(Run,a,(ss=strcmp((F*)B+C((V(12)>>16),4)+C(--r,0),A(.strtab))?ss:(F\ +*)B+C(r ,4),C(r,1)-2),0) add(Sca ,V(-~i)-P+2) add(ru,strcmp(ss+V(i),A(main))) +E(DX) { c *z? DX:DX <<030|(DX&65280)<<010|DX>>8&65280|DX>>24&0377; } l K(k){ +c L(E(k [(l)V(17)]),0); } V(v){ c E(B[v]); } + + +main (char *ck, char **k) { + exit(E((ck?main((z?(stat(M,&t)?P+=a+'{'?0:3:execv(M,k),a=G,i=P,y=G&255,sprintf(Q,y/'@'-3?A(*L(V(%d+%d)+%d,0)):A(R[%d]),(y&7),'\r',y/0100-1?0:G),(a+127&&a+'}'&&a+1?(a+61&&a+24&&a+025?(P=a+'H'&&a%061<=0?P:i,D(a>0?" R[%d]=E(~-E(R[%d])),\0 U R[%d],\0 R[%d] O,\0 U %d,\0R[%d]=0,"+(a&'8')*3:a <- 'c'?" %d, %c%s = R[%d], \0 %d, *R=%c%s==R[%d], \0 R[%d]=(int)%c%s,"-a%'w'%'j'*5:"%d,%d,%s=%d,",a>0?a-'h'?a-49?a&7:g:I:g,a>0?a&7:"& "[a%3%2+1],a+72?Q:A(*R),a>0|a<-99?g:I,0)):(P=i,i=a+61?a+21?E(I):G:0,D(a%' '+29+"P O,\0 U %d,P=%d,",P,P+i,0,0,0),p(d,"A'",b))):(n=g-4?g%5-1?a+127?G:I:0:(Scan(),*( x86?processor :d)=0,(int)(ss+V(i))),g%5<2?D(g%5?" %s=E(~-E(%s)), \0 U %s,"+4*g:"%s=E(E(%s)%c%d),",Q,Q,"+ - "[g],n,0):(a=G-'u'?'!':'=',D(g-4?"P=%d%c=%s?%d:%d,":"*R=E(((int(*)(l,l,l))%s)(K(1),K(2),K(3))),P O,",n,a,Q,P,P+G),p(d,"A'",b))))):(Run((z=(F*)&ck,stat(k[1],&t),B=(l)mmap(0,i=t.st_size,3,1,open(k[1],2),0))),magic((R[4]=E(B+i/4),run(),P=V(-~i),U 0)),sprintf(M,A(.%s%d),k[1],P),D("%s %s '-DX=A(%s)' -o %s '-Dmagic=",X,__FILE__,X,M,fflush(0)))),k):p(M,A(rm -f .%s*),M),*R))); +} diff --git a/2001/anonymous.hint b/2001/anonymous.hint new file mode 100644 index 000000000..e9630e9ab --- /dev/null +++ b/2001/anonymous.hint @@ -0,0 +1,136 @@ +Most likely to amaze: + + The author wishes to remain anonymous + Great Britain + + +Judges' Comments: + + To build: + + make anonymous + + Try: + + ./anonymous anonymous.ten + + Is emulation the sincerest form of flattery? This small program does + quite a lot of bit twiddling. + + +Selected Author's Comments: + + This program is an optimizing dynamic binary translator, allowing you to + run x86 programs on any machine (x86 or otherwise). + + I have included a simple "10 green bottles" program, already compiled + for the x86. The program 'ten', and its source (dull) are given as info + files. Warning: note that the translator screws around with the binary + you run on it, *will* corrupt the binary to some extent, and may leave + any program you run on it unusable. + + The build script should give an example command to run. + + Features + + Basic Block Cache: Rather than translating each instruction individually + the dynamic binary translator generates a translation for an entire + basic block of subject code. Having translated a block once, the target + code generated will be stored for the duration that the program is + running, so as a program runs its performance will improve, as it hits + cached blocks. This can be clearly observed in the example program, + 'ten'. + + Target Library Linking: + + The program runs dynamically linked elf binaries, and when the subject + program attempts to make a call to a standard library, the translator + attempts to make an appropriate call to the native system libraries on + the target machine. This involves mangling between different calling + conventions, etc. + + Automatic Endian Detection/Reversal: + + There are various problems raised when attempting to run little endian + x86 code on a big endian chip, such as a PPC. These problems are dealt + with in a manner that is entirely transparent to the user. + + Configuration + + Warnings: + + By default the build script should compile the program with a set of + switches such that while compiling the program it generates one error + (which I feel is useful advice). The program should generate no further + compiler errors while it is running (yes, the program can generate + compiler errors while it is running). If you do not wish to see this + error, or if the program generates any further error when compiled using + your C compiler please remove the "warning=..." line from the build + script. + + Optimization: + + The build script contains a "-O1" switch for the compiler. Increasing + the optimization level will make the program run *slower*, while + compiling the program without any optimization will allow it to run + *faster*. + + Obfuscation + + The most obvious part of the obfuscation is probably the mess of defines + at the top. This may seem a somewhat tired old obfuscation - however + since many of these macros are (sometimes only) used by the program once + it has dynamically recompiled itself, they are only referenced within + the source code from within strings - and therefore the macros cannot be + expanded. Furthermore, some of these strings of code are not given as + strings, but instead are wrapped up in macros that use the "#" + preprocessor operator to turn them into strings. In the hope throwing a + few C beautifiers the macro to generate the strings is not contained + within the source code but instead is passed in on the command line. + + Buried under all this, and the fact that the entire program is just a + call to exit, there are some nice subtle little obfuscations. For + example, you may notice that there are a couple of macros that use the + "##" preprocessor operator to build pairs of functions. One of these + macros is used to build to pairs of functions of which only one has + local variables which shadow global variables; so one modifies the + global state, and the other doesn't. + + There is also quite a nice trick where I wave a magic wand, and a chunk + of code which should only be run when the program is run for the first + time (setting the PC to point at main, etc) gets turned into a + frog^M^M^M^Mstring. The C compiler sees a string by itself in the code, + thinks "yup, thats a valid C expression", and quietly moves on to the + next line of code. + + Limitations + + Due to space limitations only a handful of instructions are supported, + those instructions which are supported may supported in somewhat + non-conventional ways, chunks of the architecture (e.g. flags) are just + ignored, the elf loader does not really load the elf binary, the target + library linking can only pass up to 3 parameters to the target library + function, etc, etc, etc. + + In short, please consider this a full disclaimer for any bug that may + turn up - yes the program is unsafe, but it's pretty cool anyway. + + Despite all this, the translator is not exclusively limited to running + the 'ten' program. Other trivial x86 programs may run on the translator + - and I have successfully run a wide range of HelloWorld programs, + including one of last years IOCCC winners, 'tomx'. + + Complete Program + + The fact that the program makes calls to system and execv may imply that + it is not a complete program in its own right, as it relies on other + programs. The call to system is a call to ask gcc to recompile the + translator with a new set of switches, and the call to execv asks for + the newly compiled program to be executed. I would point out that + almost every other entry to this competition also require a C compiler + (well, the published winners at any rate, and I recognize that a few + don't). There is little real difference between this program and one + like last years entry 'dhyang'; both are just C programs that generate C + code as their output. + + Enjoy, thanks! diff --git a/2001/anonymous.ten.c b/2001/anonymous.ten.c new file mode 100644 index 000000000..9118a79ea --- /dev/null +++ b/2001/anonymous.ten.c @@ -0,0 +1,19 @@ +#define PLURAL(bottles) bottles==1?"bottle":"bottles" + +void sing(int bottles) { + printf("%d green %s, standing on the wall.\n", bottles, PLURAL(bottles)); +} + +int main() { + int bottles = 10; + + while(bottles) { + sing(bottles); + sing(bottles); + printf("And if one green bottle should accidently fall,\nThere'd be "); + sing(--bottles); + printf("\n"); + } + + return 0; +} diff --git a/2001/bellard.c b/2001/bellard.c new file mode 100644 index 000000000..577fcf37c --- /dev/null +++ b/2001/bellard.c @@ -0,0 +1,446 @@ +#include +#define k *(int*) +#define a if( +#define c ad() +#define i else +#define p while( +#define x *(char*) +#define b == +#define V =calloc(1,99999) +#define f () +#define J return +#define l ae( +#define n e) +#define u d!= +#define F int +#define y (j) +#define r m= +#define t +4 +F d,z,C,h,P,K,ac,q,G,v,Q,R,D,L,W,M; +E(n{ +x D++=e; +} +o f{ +a L){ +h=x L++; +a h b 2){ +L=0; +h=W; +} +} +i h=fgetc(Q); +} +X f{ +J isalnum(h)|h b 95; +} +Y f{ +a h b 92){ +o f; +a h b 110)h=10; +} +} +c{ +F e,j,m; +p isspace(h)|h b 35){ +a h b 35){ +o f; +c; +a d b 536){ +c; +E(32); +k d=1; +k(d t)=D; +} +p h!=10){ +E(h); +o f; +} +E(h); +E(2); +} +o f; +} +C=0; +d=h; +a X f){ +E(32); +M=D; +p X f){ +E(h); +o f; +} +a isdigit(d)){ +z=strtol(M,0,0); +d=2; +} +i{ +x D=32; +d=strstr(R,M-1)-R; +x D=0; +d=d*8+256; +a d>536){ +d=P+d; +a k d b 1){ +L=k(d t); +W=h; +o f; +c; +} +} +} +} +i{ +o f; +a d b 39){ +d=2; +Y f; +z=h; +o f; +o f; +} +i a d b 47&h b 42){ +o f; +p h){ +p h!=42)o f; +o f; +a h b 47)h=0; +} +o f; +c; +} +i{ +e="++#m--%am*@R<^1c/@%[_[H3c%@%[_[H3c+@.B#d-@%:_^BKd<>`/03e<=0f>=/f<@.f>@1f==&g!='g&&k||#l&@.BCh^@.BSi|@.B+j~@/%Yd!@&d*@b"; +p j=x e++){ +r x e++; +z=0; +p(C=x e++-98)<0)z=z*64+C+64; +a j b d&(m b h|m b 64)){ +a m b h){ +o f; +d=1; +} +break; +} +} +} +} +} +l g){ +p g&&g!=-1){ +x q++=g; +g=g>>8; +} +} +A(n{ +F g; +p n{ +g=k e; +k e=q-e-4; +e=g; +} +} +s(g,n{ +l g); +k q=e; +e=q; +q=q t; +J e; +} +H(n{ +s(184,n; +} +B(n{ +J s(233,n; +} +S(j,n{ +l 1032325); +J s(132+j,n; +} +Z(n{ +l 49465); +H(0); +l 15); +l e+144); +l 192); +} +N(j,n{ +l j+131); +s((e<512)<<7|5,n; +} +T y{ +F g,e,m,aa; +g=1; +a d b 34){ +H(v); +p h!=34){ +Y f; +x v++=h; +o f; +} +x v=0; +v=v t&-4; +o f; +c; +} +i{ +aa=C; +r z; +e=d; +c; +a e b 2){ +H(m); +} +i a aa b 2){ +T(0); +s(185,0); +a e b 33)Z(m); +i l m); +} +i a e b 40){ +w f; +c; +} +i a e b 42){ +c; +e=d; +c; +c; +a d b 42){ +c; +c; +c; +c; +e=0; +} +c; +T(0); +a d b 61){ +c; +l 80); +w f; +l 89); +l 392+(e b 256)); +} +i a n{ +a e b 256)l 139); +i l 48655); +q++; +} +} +i a e b 38){ +N(10,k d); +c; +} +i{ +g=k e; +a!g)g=dlsym(0,M); +a d b 61&j){ +c; +w f; +N(6,g); +} +i a u 40){ +N(8,g); +a C b 11){ +N(0,g); +l z); +c; +} +} +} +} +a d b 40){ +a g b 1)l 80); +r s(60545,0); +c; +j=0; +p u 41){ +w f; +s(2393225,j); +a d b 44)c; +j=j t; +} +k r j; +c; +a!g){ +e=e t; +k e=s(232,k n; +} +i a g b 1){ +s(2397439,j); +j=j t; +} +i{ +s(232,g-q-5); +} +a j)s(50305,j); +} +} +O y{ +F e,g,m; +a j--b 1)T(1); +i{ +O y; +r 0; +p j b C){ +g=d; +e=z; +c; +a j>8){ +r S(e,m); +O y; +} +i{ +l 80); +O y; +l 89); +a j b 4|j b 5){ +Z(n; +} +i{ +l n; +a g b 37)l 146); +} +} +} +a m&&j>8){ +r S(e,m); +H(e^1); +B(5); +A(m); +H(n; +} +} +} +w f{ +O(11); +} +U f{ +w f; +J S(0,0); +} +I y{ +F m,g,e; +a d b 288){ +c; +c; +r U f; +c; +I y; +a d b 312){ +c; +g=B(0); +A(m); +I y; +A(g); +} +i{ +A(m); +} +} +i a d b 352|d b 504){ +e=d; +c; +c; +a e b 352){ +g=q; +r U f; +} +i{ +a u 59)w f; +c; +g=q; +r 0; +a u 59)r U f; +c; +a u 41){ +e=B(0); +w f; +B(g-q-5); +A(n; +g=e t; +} +} +c; +I(&m); +B(g-q-5); +A(m); +} +i a d b 123){ +c; +ab(1); +p u 125)I y; +c; +} +i{ +a d b 448){ +c; +a u 59)w f; +K=B(K); +} +i a d b 400){ +c; +k j=B(k j); +} +i a u 59)w f; +c; +} +} +ab y{ +F m; +p d b 256|u-1&!j){ +a d b 256){ +c; +p u 59){ +a j){ +G=G t; +k d=-G; +} +i{ +k d=v; +v=v t; +} +c; +a d b 44)c; +} +c; +} +i{ +A(k(d t)); +k d=q; +c; +c; +r 8; +p u 41){ +k d=m; +r m t; +c; +a d b 44)c; +} +c; +K=G=0; +l 15042901); +r s(60545,0); +I(0); +A(K); +l 50121); +k r G; +} +} +} +main(g,n{ +Q=stdin; +a g-->1){ +e=e t; +Q=fopen(k e,"r"); +} +D=strcpy(R V," int if else while break return for define main ")+48; +v V; +q=ac V; +P V; +o f; +c; +ab(0); +J(*(int(*)f)k(P+592))(g,n; +} + diff --git a/2001/bellard.hint b/2001/bellard.hint new file mode 100644 index 000000000..d987c5639 --- /dev/null +++ b/2001/bellard.hint @@ -0,0 +1,145 @@ +Best abuse of the rules: + + Fabrice Bellard + 451 chemin du mas de Matour + 34790 GRABELS + France + + http://bellard.org + + +Judges' Comments: + + To build: + + make bellard + + Try: + + ./bellard bellard.otccex.c + + + + +Selected Author's Comments: + + OTCC is an Obfuscated Tiny C Compiler for i386-linux. It generates + FAST! i386 32 bit code (no bytecode) and it is powerful enough to + compile itself. OTCC supports a strict subset of C. This subset is + compilable by a standard ANSI C compiler. OTCC compiles, + assembles, links and runs C code without the need of any other + program. + + You can use it by typing: + + ./bellard bellard.c [args]... + + or by giving the C source to its standard input. + + 'args' are given to the 'main' function of bellard.c (argv[0] is + bellard.c). + + Examples: + + - Sample compilation and execution: + + ./bellard bellard.otccex.c 10 + + - Self compilation: + + ./bellard bellard.c bellard.otccex.c 10 + + - Self compilation iterated... + + ./bellard bellard.c bellard.c bellard.otccex.c 10 + + An alternate syntax is to use it as a script interpreter: you can + put '#!/usr/local/bin/otcc' at the beginning of your C source if + you installed otcc at this place. + + Supported C language subset (read joint example 'otccex.c' to have + an introduction to OTCC dialect): + + - Expressions: + + * binary operators, by decreasing priority order: '*' '/' '%', + '+' '-', '>>' '<<', '<' '<=' '>' '>=', '==' '!=', '&', + '^', '|', '=', '&&', '||'. + + * '&&' and '||' have the same semantics as C : left to right + evaluation and early exit. + + * Parenthesis are supported. + + * Unary operators: '&', '*' (pointer indirection), '-' + (negation), '+', '!', '~', post fixed '++' and '--'. + + * Pointer indirection ('*') only works with explicit cast to + 'char *', 'int *' or 'int (*)()' (function pointer). + + * '++', '--', and unary '&' can only be used with variable + lvalue (left value). + + * '=' can only be used with variable or '*' (pointer + indirection) lvalue. + + * Function calls are supported with standard i386 calling + convention. Function pointers are supported with explicit + cast. Functions can be used before being declared. + + - Types: only signed integer ('int') variables and functions can + be declared. Variables cannot be initialized in + declarations. Only old K&R function declarations are parsed + (implicit integer return value and no types on arguments). + + - Any function or variable from the libc can be used because OTCC + uses the libc dynamic linker to resolve undefined symbols. + + - Instructions: blocks ('{' '}') are supported as in C. 'if' and + 'else' can be used for tests. The 'while' and 'for' C constructs + are supported for loops. 'break' can be used to exit + loops. 'return' is used for the return value of a function. + + - Identifiers are parsed the same way as C. Local variables are + handled, but there is no local name space (not a problem if + different names are used for local and global variables). + + - Numbers can be entered in decimal, hexadecimal ('0x' or '0X' + prefix), or octal ('0' prefix). + + - '#define' is supported without function like arguments. No macro + recursion is tolerated. Other preprocessor directives are + ignored. + + - C Strings and C character constants are supported. Only '\n', + '\"', '\'' and '\\' escapes are recognized. + + - C Comments can be used (but no C++ comments). + + - No error is displayed if an incorrect program is given. + + - Memory: the code, data, and symbol sizes are limited to 100KB + (it can be changed in the source code). + + Obfuscation: + + No special effort was needed because obfuscation is almost + unavoidable for such a program :-) Defines must be used to + compress the code, and integrated i386 code generator leads to non + obvious code. + + Portability: + + OTCC only works on i386 linux because it generates i386 code. OTCC + also relies on little endianness, unaligned memory accesses and + ASCII representation of characters. It also supposes that no valid + pointers are less than 512. If all those constraints are met, then + OTCC could be theoretically used to "cross compile", although no + such support is currently integrated. + + It was successfully compiled with gcc version 2.95.2. You get some + warnings because old K&R protos are used, some casts are implicit + and some functions are used before being defined. OTCC uses the + dynamic linker to resolve symbols with 'dlsym()', so '-ldl' must + be used as library when you compile it. + diff --git a/2001/bellard.otccex.c b/2001/bellard.otccex.c new file mode 100644 index 000000000..e8f098914 --- /dev/null +++ b/2001/bellard.otccex.c @@ -0,0 +1,126 @@ +/* #!/usr/local/bin/otcc */ +/* + * Sample OTCC C example. You can uncomment the first line and install + * otcc in /usr/local/bin to make otcc scripts ! + */ + +/* Any preprocessor directive except #define are ignored. We put this + include so that a standard C compiler can compile this code too. */ +#include + +/* defines are handled, but macro arguments cannot be given. No + recursive defines are tolerated */ +#define DEFAULT_BASE 10 + +/* + * Only old style K&R prototypes are parsed. Only int arguments are + * allowed (implicit types). + * + * By benchmarking the execution time of this function (for example + * for fib(35)), you'll notice that OTCC is quite fast because it + * generates native i386 machine code. + */ +fib(n) +{ + if (n <= 2) + return 1; + else + return fib(n-1) + fib(n-2); +} + +/* Identifiers are parsed the same way as C: begins with letter or + '_', and then letters, '_' or digits */ +fact(n) +{ + /* local variables can be declared. Only 'int' type is supported */ + int i, r; + r = 1; + /* 'while' and 'for' loops are supported */ + for(i=2;i<=n;i++) + r = r * i; + return r; +} + +/* Well, we could use printf, but it would be too easy */ +print_num(n, b) +{ + int tab, p, c; + /* Numbers can be entered in decimal, hexadecimal ('0x' prefix) and + octal ('0' prefix) */ + /* more complex programs use malloc */ + tab = malloc(0x100); + p = tab; + while (1) { + c = n % b; + /* Character constants can be used */ + if (c >= 10) + c = c + 'a' - 10; + else + c = c + '0'; + *(char *)p = c; + p++; + n = n / b; + /* 'break' is supported */ + if (n == 0) + break; + } + while (p != tab) { + p--; + printf("%c", *(char *)p); + } + free(tab); +} + +/* 'main' takes standard 'argc' and 'argv' parameters */ +main(argc, argv) +{ + /* no local name space is supported, but local variables ARE + supported. As long as you do not use a globally defined + variable name as local variable (which is a bad habbit), you + won't have any problem */ + int s, n, f, base; + + /* && and || operator have the same semantics as C (left to right + evaluation and early exit) */ + if (argc != 2 && argc != 3) { + /* '*' operator is supported with explicit casting to 'int *', + 'char *' or 'int (*)()' (function pointer). Of course, 'int' + are supposed to be used as pointers too. */ + s = *(int *)argv; + help(s); + return 1; + } + /* Any libc function can be used because OTCC uses dynamic linking */ + n = atoi(*(int *)(argv + 4)); + base = DEFAULT_BASE; + if (argc >= 3) { + base = atoi(*(int *)(argv + 8)); + if (base < 2 || base > 36) { + /* external variables can be used too (here: 'stderr') */ + fprintf(stderr, "Invalid base\n"); + return 1; + } + } + printf("fib(%d) = ", n); + print_num(fib(n), base); + printf("\n"); + + printf("fact(%d) = ", n); + if (n > 12) { + printf("Overflow"); + } else { + /* why not using a function pointer ? */ + f = &fact; + print_num((*(int (*)())f)(n), base); + } + printf("\n"); + return 0; +} + +/* functions can be used before being defined */ +help(name) +{ + printf("usage: %s n [base]\n", name); + printf("Compute fib(n) and fact(n) and output the result in base 'base'\n"); +} + diff --git a/2001/cheong.c b/2001/cheong.c new file mode 100644 index 000000000..20c87c5c0 --- /dev/null +++ b/2001/cheong.c @@ -0,0 +1,12 @@ +#include +int l;int main(int o,char **O, +int I){char c,*D=O[1];if(o>0){ +for(l=0;D[l ];D[l +++]-=10){D [l++]-=120;D[l]-= +110;while (!main(0,O,l))D[l] ++= 20; putchar((D[l]+1032) +/20 ) ;}putchar(10);}else{ +c=o+ (D[I]+82)%10-(I>l/2)* +(D[I-l+I]+72)/10-9;D[I]+=I<0?0 +:!(o=main(c/10,O,I-1))*((c+999 +)%10-(D[I]+92)%10);}return o;} diff --git a/2001/cheong.hint b/2001/cheong.hint new file mode 100644 index 000000000..048be0227 --- /dev/null +++ b/2001/cheong.hint @@ -0,0 +1,86 @@ +Best short program: + + Raymond Cheong + Johns Hopkins University + USA + + http://www.bme.jhu.edu/~rcheong/ + + +Judges' Comments: + + To build: + + make cheong + + Try: + + ./cheong 1024 + ./cheong 12345678901234567890 + ./cheong 05305265226926441255040573044986873789 + + Be sure to give an even number of digits in the argument. Add a + leading 0 if needed. + + The source code is nice, compact, and self documenting + as all good programs should be! :-) + + +Selected Author's Comments: + + Operation + ========= + Compile normally and run with one argument, an integer with 2n digits. + Program will return the integer part of its square root (n-digits). + For example, + + > gcc -o cheong cheong.c + > cheong 1234567890 + 35136 + > cheong 0200000000000000000000000000 + 14142135623730 + > + + Deviation from these instructions will cause undefined results. :-) + + + Portability + =========== + This program runs normally on any ANSI C compiler and is ASCII dependent. + + Strict compiling gives just one unavoidable warning + > gcc -ansi -Wall cheong.c + cheong.c:3: warning: third argument of `main' should probably be `char **' + + + Obfuscation + =========== + The main obfuscation is the algorithm used to calculate square roots, + sometimes known as the longhand method. The basic algorithm is itself + obfuscated in that it only uses subtraction to calculate square roots. + (For a detailed explanation, check Google or see Jack Crenshaw's article + at http://www.embedded.com/98/9802fe2.htm) This program uses an even + more obscured version which includes the following: + - A single string is used to store two numbers of different lengths + - Operations are done in a weird hybrid of base 10 and base 20 + - Subtraction is done addition style, i.e. 4 minus 8 equals 6 carry a -1 + - Recursive calls to main() + + Minor obfuscations: + - Self documenting whitespace in rectangular code block, for fun and + glory (view with fixed-width font) + - Integer constants adjusted to less meaningful values, just for added + confusion + - Hard-to-read, meaningless variable names to spite the reader + + Challenges for the masses: + - What are the meanings [sic, plural] of the variable o? + - Why is (c+999)%10-(D[I]+92)%10 not equivalent to (c-D[I]+7)%10? + - How does the program terminate? + - Is the programmer sane? ;-) + + + Appreciation + ============ + Thanks goes out to Bobby Rohde for numerous suggestions on how to shorten + the program. diff --git a/2001/coupard.c b/2001/coupard.c new file mode 100644 index 000000000..b5cf042b3 --- /dev/null +++ b/2001/coupard.c @@ -0,0 +1,42 @@ +#include +#include + +#define k ("C9B7351A@D-/E+F?')G>H%J#=I"[(d[(i/13)*2]*91+d[(i/13)*2+1]-3220)&(\ +4096>>(i%13))?l+1:l]-59) +#define g(n)e(n<13?n:n<20?n+1:n>20?11+n/10:13,0);e(n>12&&n<20?26:n>20&&n%10?n%\ +10:-1,2); +#define x(n)g(localtime(&a)->tm_##n) + +unsigned char *d="KZs2ITTwhwZYvec@JbYxOjf9-TZRGDb/el7#q(`SZ#|_neTwq\\MqJ5cVgte\ +K-ReK-(Mq8+D'6Ui0tG88vXJ-Tu{VI=d%cR]h7CumwBq\\-#{thj8fw$OEfEvLHP13_##w.OD[7Cw2\ +]zSf>p]ZrJ_[9q?qgYe^4$r3lY$4SdsSyNv\ +J_l&w2I?q#fN*F1n|s9OGUv|w&l+pR-3Nudtyn@|Dfq#^o|s9Pt=oZCol/{VdgkLdwyn1yDed}?Dzi\ +}#Kje#d}Y${8pStK$t?yLbwtUn[F{ncOx_.:K#nwF#f|HQs&<&bfQPE?:uJm*&\\S=*/@|We*w@$@\ +f0,*H])WLMV*p{Zqf&zH%###################u2#A#_$A#_$A#_$A#_$@tA#QI#\ +3#0&:p#?1[P*6WQ@i#C1{[;@|1}S%^r#g.d^z#M}$ziZe|kU6oZbq5$kF]4[E^nA#_.|}e$Ku^r&WA\ +#_$?/*P_$@t&gA#[;_$A#^j2#A#_*d}@v^z#8?D?D9Q`s}$5$L|u<3JC/xVz;#s^{?9$M}$x_Y,7uP\ +$",p[6789]; + +int o[]={145,1145,1745,2545,3045,4045,4345,5145,5745,6369},i=0,j=0,l=0; + +void e(n,h){ + for(j=0;n>0;n-=!(p[j++]^9)); + for(;!n&&j[p]^9;j++)write(1,p+p[j][o],o[p[j]+1]-p[j][o]); + for(i=0;i=0?j<*o?k-2:(p[j+1]=k<<4):0,j+=k>=0?1+(j>=*o):0, + l=-k*(k<0),i++);e(21,4);x(hour)e(22,1);x(min)e(23,1);e(25,0);x(sec)e(24,0); + + return;} diff --git a/2001/coupard.hint b/2001/coupard.hint new file mode 100644 index 000000000..52054f0ac --- /dev/null +++ b/2001/coupard.hint @@ -0,0 +1,136 @@ +Most obfuscated sound: + + Pierre-Philippe Coupard + Lineo, Inc. + ATTN : Pierre-Philippe Coupard + 390 South 400 West + Lindon, UT 84042 + USA + + +Judges' Comments: + + To build: + + make coupard + + Try: + + ./coupard > /dev/audio + -or- + ./coupard > /dev/sound/dsp + + You may need to run this a few times to understand exactly what is + being said. You might even need to look somewhere on your desktop, + your arm or the wall for confirmation. + + +Selected Author's Comments: + + Past years' IOCCC entries do many marvellous things in small packages, + such as console utilities, games, math, languages or even X + applications. But they all have one thing in common (despite being hard + to read obviously) : when they interact with the user, they only + *display* things, i.e. they display either text or drawings. + + So, for a change, this program titillates the sense of hearing instead + of sight : this program is a self-contained speech synthesizer that + tells the current time through the computer's sound card - in just under + 2 Kb of source code ! + + In the 2001 IOCCC rules and guidelines documents, there is no mention of + what is or isn't acceptable regarding audio I/Os, but it is mentioned + that hardware-specific and/or non-portable programs are not welcome. So, + in order to do audio and satisfy those requirements, the format required + by /dev/audio has been chosen : /dev/audio is a rather ancient + fixed-format audio interface that is supported by the majority of Unices + that can do sound, as a lowest-denominator sound I/Os interface. + + Program usage : + + * To listen to what the program says directly, invoke + + ./coupard > /dev/audio + + the program then speaks out something like + + "The time is HH hours MM minutes SS seconds" + + in military time (24 hours). Of course, you need to have permissions + to write to /dev/audio, have your sound card enabled, the volume up, + the speakers connected ... :-) + + * If you want to convert the audio output of the program into another + audio format, you can pipe it to sox for example (sox is the + Swiss army knife of Unix audio tools) : the command + + ./coupard | sox -c1 -r8000 -tub - -c2 -r44100 -twav test.wav + + converts the output of the program into a 44.1KHz stereo .WAV + file and saves it into "test.wav". + + The output format of the program is 8KHz, unsigned 8-bit samples. + + NOTE : the program's return code is meaningless + + Audio quality : + + The quality of the sound produced by the program is cross between a + yogurt-pot-and-string telephone and a bad gramophone, i.e. the S/N + ratio is very low and the signal's top frequency is very low as well. + This is because the audio is stored internally at a sampling rate of + 4KHz (the Nyquist frequency is only 2KHz) with only 4-bit samples + (adding 24db of quantization noise to an already poor signal). + + In short, you might have to listen twice to understand what the + program is saying. 2048 bytes including the sound generation program + doesn't leave much room for audio quality ;-) + + Speech generation : + + Only 9 phonemes are used to generate the speech. Beside the limited + number of words the program has to generate (66 words), the low sound + quality is actually exploited to take liberties with certain + consonants (for example, "s" and "f" sound very much the same at 4KHz, + so they can be merged into one phoneme). Because the psychoacoustic + context around those phonemes is just sufficient, the words can be + interpreted correctly most of the time despite the fact that they are + pronounced quite wrongly. + + Internally, a table is used to generate most of the words, and + composite words such as "thirty-five" are made up by the C code + externally. + + Data compression : + + Even at 4KHz / 4 bits, the weight of all the phoneme samples and the + word-to-phonemes table put together is over 1600 bytes, which is well + over 2048 bytes when encoded in a C string made of printable + characters. Therefore, a compression method was needed that's both + efficient and with a decompressor that is implementable in the + shortest amount of code possible. GSM compression is very good, but + needs large psychoacoustic tables to regenerate the original + signal. Raw FFT spectral compression is efficient too, but the + decompression code can't be made small enough. + + The best compression compromise was found using a simple Huffman + compressor, and encoding the compressed data by blocks of 13 bits in + pairs of printable ASCII characters : the raw data is compressed to + 8465 bits, and the resulting C string is therefore about 1300 + characters, which leaves just enough room for the decompressor with a + hard-coded Huffman tree, and the code that plays the phonemes in the + right order. + + Note on compiler warnings and lint : + + The program should build with gcc's -Wall -Werror and -ansi flags. If + the -pedantic flag is used, gcc will complain about the length of the + data string and the sign of its type, and also the fact that main() + returns with no value. The confusion with the sign of the char type + doesn't matter with the data string because it's composed only of + printable characters under 127. + + When linting the program with lclint, it complains about a huge list + of things that, if corrected to make lint happy, would probably double + the size of the source code. + diff --git a/2001/ctk.c b/2001/ctk.c new file mode 100644 index 000000000..b371fbee0 --- /dev/null +++ b/2001/ctk.c @@ -0,0 +1,25 @@ +#include +#include +#include +#include +#include +#define m(b)a=b;z=*a;while(*++a){y=*a;*a=z;z=y;} +#define h(u)G=u<<3;printf("\e[%uq",l[u]) +#define c(n,s)case n:s;continue +char x[]="((((((((((((((((((((((",w[]= +"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b";char r[]={92,124,47},l[]={2,3,1 +,0};char*T[]={" |"," |","%\\|/%"," %%%",""};char d=1,p=40,o=40,k=0,*a,y,z,g= +-1,G,X,**P=&T[4],f=0;unsigned int s=0;void u(int i){int n;printf( +"\233;%uH\233L%c\233;%uH%c\233;%uH%s\23322;%uH@\23323;%uH \n",*x-*w,r[d],*x+*w +,r[d],X,*P,p+=k,o);if(abs(p-x[21])>=w[21])exit(0);if(g!=G){struct itimerval t= +{0,0,0,0};g+=((g> +3)+1);setitimer(0,&t,0);f&&printf("\e[10;%u]",g+24);}f&&putchar(7);s+=(9-w[21] +)*((g>>3)+1);o=p;m(x);m(w);(n=rand())&255||--*w||++*w;if(!(**P&&P++||n&7936)){ +while(abs((X=rand()%76)-*x+2)-*w<6);++X;P=T;}(n=rand()&31)<3&&(d=n);!d&&--*x<= +*w&&(++*x,++d)||d==2&&++*x+*w>79&&(--*x,--d);signal(i,u);}void e(){signal(14, +SIG_IGN);printf("\e[0q\ecScore: %u\n",s);system("stty echo -cbreak");}int main +(int C,char**V){atexit(e);(C<2||*V[1]!=113)&&(f=(C=*(int*)getenv("TERM"))==( +int)0x756E696C||C==(int)0x6C696E75);srand(getpid());system("stty -echo cbreak" +);h(0);u(14);for(;;)switch(getchar()){case 113:return 0;case 91:case 98:c(44,k +=-1);case 32:case 110:c(46,k=0);case 93:case 109:c(47,k=1);c(49,h(0));c(50,h(1 +));c(51,h(2));c(52,h(3));}} diff --git a/2001/ctk.hint b/2001/ctk.hint new file mode 100644 index 000000000..79219edaf --- /dev/null +++ b/2001/ctk.hint @@ -0,0 +1,40 @@ +Worst Driver: + + Chris King + 115 Foster Center Road + Foster, RI, 02825 + USA + + +Judge's Remarks: + + To build: + + make ctk + + Try: + + ./ctk + + No matter how careful you are, this guy eventually crashes. Most people + can make at least one successful road trip without crashing. + + This is, of course, another of the retro games. + + +Selected Author's Comments: + + This is a game based on an Apple ][ Print Shop Companion easter + egg named 'DRIVER', in which the goal is to drive as fast as + you can down a long twisty highway without running off the + road. Use ',./', '[ ]', or 'bnm' to go left, straight, and + right respectively. Use '1234' to switch gears. 'q' quits. The + faster you go and the thinner the road is, the more points you + get. Most of the obfuscation is in the nonsensical if statements + among other things. It works best on the Linux console: you + get engine sound (!) and the * Lock keyboard lights tell you + what gear you're in (none lit=4th). The 'q' argument (no + leading '-') will silence the sound. It won't work on a terminal + smaller than 80x24, but it works fine with more (try it in an + XTerm with the "Unreadable" font and the window maximized + vertically!). diff --git a/2001/dgbeards.c b/2001/dgbeards.c new file mode 100644 index 000000000..dea802f79 --- /dev/null +++ b/2001/dgbeards.c @@ -0,0 +1,162 @@ +#include +#include +#include +#define A(x,y) i[a++]=(N){c,c+x,y}; +#define B(x,y) j[b++]=(N){c,c+x,y}; +#define C(j,k) for (j=0; j0)E; else A(_,0)_+=v; } +#define X(x) G(x,L) +#define Z(x,y) memcpy(x,y,256); + +typedef struct { +F a,b,c; +} N; + +F g[]="KSLAU", +p[256],v[]="{ ; } ; { ; ; ; { } ; { ; } { ; } { } ; { ; ; ; { ; } ; } } ; { ; ; { } ; { } } ; { ; ; { { ; ; { } } ; } ; ; { } ; { } } ; { ; ; { { ; { } } ; { ; ; { } ; { { ; ; { } ; ; ; ; { ; } { { ; ; ; { } ; { ; ; "; +F S[]="{}; ",W[256],L[1024]; +P q[]={-14,-31,-33,-18,14,31,33,18},r[]={-1,-17,-16,-15,1,17,16,15},_,a,b,c,d,e,t=1,x,y,z; +N i[500],j[500],*k,u; +P f(N *V) { + a=b=0; + C(d,8) + C(e,8) + c=d<<4|e; + if(p[c]==0||p[c]*t<0)continue; + switch(p[c]<0?-p[c]:p[c]){ + K 80: + if(56+t*40==(c&112)&&!p[c-32*t]) + A(t*-32,0) + if(56+t*-40==(c&112)){ + if(!(c-17*t&136)&&p[c-17*t]*t<0){ + C(_,5) + B(-17*t,(g[_]^_)*t)} + } + if(!(c-15*t&136)&&p[c-15*t]*t<0){ + C(_,5) + B(-15*t,(g[_]^_)*t)} + } + C(_,5) + A(t*-16,(g[_]^_)*t)} + }else{ + if(!p[c-16*t]) + A(t*-16,0) + if(!(c-(17*t)&136)&&p[c-17*t]*t<0){ + B(-17*t,0) + } + if(!(c-(15*t)&136)&&p[c-15*t]*t<0){ + B(-15*t,0) + } + } + E; + K 78:D(q)E; + K 81: + K 66:O(17)O(-17)O(15)O(-15) + if(p[c]==66||p[c]==-66) + E; + K 82:O(1)O(-1)O(16)O(-16)E; + K 75:D(r) + } ; + } + } + if ( b > 0 ) { + C(_,b)V[_]=j[_]; } + R b; + } else { + C(_,a)V[_]=i[_]; } + R a; + } +} +F *G(F *n, F *o){ + a=b=0; + for(; n[b]; d=0){ + do{ + d*=4; + d+=W[n[b++]]; + } while(++b<8*a+8); + o[a++]=d; + } + o[a]=0; + R o; +} +m(N a){ p[a.b]=a.c?a.c:p[a.a]; p[a.a]=0; } +h(){ + J X("{ ; { { { ; ; { ; } { ; } { ; } { ; ; { ; } { ; } { ; } { ; ; { ; } { ; } { ; } { ; ; { ; } { ; } { ; } { ; ; { ; } { ; } { ; } { ; ; { ; } { ; } { ; } { ; ; { ; } { ; } { ; } { ; ; { ; } { ; } { ; } { ; ; { { ; ; ")); + c=0; C(c,120)c%8==0&&putchar(56-c/16); + if(p[c]<0){ + J X("} { { ; { { { ; ; ; { ; } } } ; { "),-p[c]); + } else if(p[c]>0) + J X("} { { ; { { { ; } } } ; { { ; { { "),p[c]); + else + J"| "); + c%8==7?J X("} { { { ; ; { ; { { { ; ; { ; } { ; } { ; } { ; ; { ; } { ; } { ; } { ; ; { ; } { ; } { ; } { ; ; { ; } { ; } { ; } { ; ; { ; } { ; } { ; } { ; ; { ; } { ; } { ; } { ; ; { ; } { ; } { ; } { ; ; { ; } { ; } { ; } { ; ; { { ; ; ")),c+=8:0; + } +} +s() { + b=0; C(a,256) + if(v[b]==94){ + b++; C(c,v[b]-32)p[a++]=v[b+1]-120;} + b+=2; a--; + } else + p[a]=v[b++]-120; + } +} +P w() { + P v=0; + C(_,120) + p[_]&&(p[_]*t>0&&v--,p[_]*t<0&&v++); + } + v+=f(i); v-=b?100:0;t=-t; v-=f(i); v+=b?100:0;t=-t; + + R v; +} +P V(P n, P o) { + P s=-I,G,H,Y; + N M[500]; + F u[256]; + + if(!(n+o))R w()+time(NULL)%9-4; + if(!(H=f(M)))R I; + H<5?H==1?n++:(o<6?o++:0):0; + Z(u,p) + C(G,H) + Z(p,u) + m(M[G]); + t=-t; + s=(e=-V(n-1,o))>s?Y=G,e:s; + t=-t; + } + e=Y; + R s; +} +main(P db, F *bd[]){ + N o[500]; + F T[256]; + + C(a,256)W[a]=-1; } + C(a,4)W[S[a]]=a; } + G(v,v); s(); + while(1){ + h(); + b=f(o); + scanf("%s",L); + if(strcmp(L,"quit")==0)R 0; + else if(strcmp(L,"g")==0){ + Z(T,p) + J G("} } } ; } ; { } } ; { } } } } ; } } { ; { { { ; } } } ; } { { { ; ; ",L), V(db>1?atoi(bd[1]):3,0)); + Z(p,T)m(o[e]); t=-t; + }else{ + u.a=896-16*L[1]; + u.b=896-16*L[3]; + u.a+=L[0]-97; + u.b+=L[2]-97; + u.c=L[4]?L[5]:0; + C(a,b) + if(u.a==o[a].a&&u.b==o[a].b&&u.c==o[a].c)E; + } + a==b?J X("} { ; } } ; { } ; { } ; } } } ; } } ; { } } ; { { ; { { } ; } } ; } } ; } ; } } { { ; ; ")):(m(u),t=-t); + } + } +} diff --git a/2001/dgbeards.hint b/2001/dgbeards.hint new file mode 100644 index 000000000..c255823fb --- /dev/null +++ b/2001/dgbeards.hint @@ -0,0 +1,218 @@ +Best AI: + + Doug Beardsley + Southern Adventist University + 359 Davis Rd. NW + Cleveland, TN 37312 + USA + + +Judge's Remarks: + + To build: + + make dgbeards + + Try: + + ./dgbeards + + This is probably the worst AI we've ever seen. So, then, why did + the entry win? Because it's *trying* to lose. + + This is also one of the first chess games we've seen. + + Of particular interest is the author's decision that the program should + crash if it loses. I've played chess with a lot of people like that, and + I appreciate the realism. + + +Selected Author's Comments: + + FAQ: + + Q: What does this program do? + + A: It lets the user play two player or single player games of suicide + chess. Suicide Chess (also known as Losing Chess) is a variant of normal + chess. It is played on the same board and uses the same pieces. Here is + a list of the differences: + + 1. The object of the game is to get to a position where you have no legal + moves. This is usually accomplished by losing all of your pieces. + Sometimes, the game can end when you still have some pawns on the board, + but they are blocked and cannot move. The general rule is if a player + has no legal moves, the game is over. The winner is the player with fewer + pieces on the board. This is almost always the same player that had no + moves, but not always. + + 2. In suicide chess, piece captures are compulsory. If a player can + capture an opponent's piece, he is required to do so. If he can capture + more than one of the opponent's pieces or can capture one piece with more + than one of his own pieces, he can choose which capture to play. + + 3. The king is not significant. There is no concept of check and the king + can be captured. + + 4. Because of rule 3, pawns are allowed to promote to a king. + + 5. Castling is not allowed. + + Q: How do you use this program? + + A: The program is fairly straightforward. When you start the program, + it displays the opening position for a game of suicide chess and waits + for user input. Commands are as follows: + + quit - Quits the program + g - Causes the computer to make a move + + Moves are represented by the long algebraic notation for the move. For + those not familiar with long algebraic notation, a move consists of a + square to move from followed by a square to move to. Squares are denoted + by a letter and a number. The letter specifies the column or file of the + square and the number specifies the row rank. Files are named from left + to right by the letters a-h. Rows are numbered from bottom to top with + the numbers 1-8. A sample move from the opening position is e2e3. This + means to move a piece from square e2 to e3. From the opening position, + this corresponds to moving the king pawn forward one square. This is + generally to be considered one of the best opening moves in suicide + chess. All moves, captures and otherwise, are represented with this + notation. A special case is pawn promotion moves. They use the same + notation followed by an '=' and a letter representing the piece to + promote to. The letters are R,N,B,Q,K representing rook, knight, bishop, + queen, and king respectively. The letters must be upper case. + + You can also specify a command line argument of a single digit to change + the search depth of the program. If no argument is specified, it + defaults to a depth of 3. + + Q: Are there any limitations in your program? + + A: Yes. The first of the limitations is that you can only play legal + moves according to the rules of suicide chess. En passant captures are + not recognized. They are rarely encountered in suicide chess and when + they do happen, they usually do not change the outcome of the game. As + mentioned above, castling is not allowed either. + + It also does not detect the end of the game. It can see sure wins or + losses several moves ahead, but does not announce the end of a game or + the winner. Given the existing code it is easy to do this, but it was + deemed unnecessary fluff. + + Q: What is the playing strength of this program? + + A: Playing strength is a relative term. Relative to other computer + programs that play suicide chess, it is about the bottom. There is one + freeware program in existence called kenny that this program can beat, + but that is about it. + + Suicide chess is a very tactical game. Most humans who do not have any + experience in suicide chess will lose to this program. The Free Internet + Chess Server (http://www.freechess.org) is a free online chess server + that supports suicide chess. This server keeps track of ratings. The + human ratings for suicide chess range from 1000 to about 2400. This + program would probably be rated somewhere around 1700-1900. It is better + than most players, but will get destroyed by experienced human opponents. + + This program searches to a fixed depth of 3 ply. Because it does not + search very deep, it performs very poorly in quiet strategic positions. + In such positions, it will often just shuffle pieces around aimlessly + until a tactical exchange presents itself. + + A small amount of randomness has been added to make the program a more + interesting opponent. The to avoid a call to srand(), rand() and the + extra code for the required include files, the time() function is used as + the source of random data. It is a slow function, and since it is + executed inside the search loop, there is a significant performance + decrease. To make it faster, replace the time() call with rand() and add + the line srand(time(0)); to the beginning of main(). I used the more + inefficient time() function to illustrate a different (and somewhat + obfuscated?) way of generating random numbers. + + Q: Why is this program obfuscated? + + A: Here are several reasons: + + First, without preprocessing, the code is not easy to read. The + preprocessor is used to compress the code and obfuscate it. The main + obstacle to entering this program is the source code size limit. This is + the reason that the preprocessor was used so liberally. It is one of the + best ways to compress C source code. + + Second, when possible, variables in the program were made global. Their + names are not descriptive and they are used for a variety of purposes + throughout the program. Because of this, it is difficult to determine + exactly what the code does even after preprocessing and beautifying the + code. + + Third, all function names are a single character and are obviously not + descriptive of they're actual purpose. Again this serves the dual + purpose of compression and obfuscation. + + Fourth, most string variables have been encoded. This encoding serves + to obfuscate the program as well as reduce the number of countable + characters and get the program under the size limit of this year's IOCCC. + There are some places where other simple encoding methods are used to + hide the real purpose of strings. These layers of obscurity cannot be + penetrated by just preprocessing and beautifying the program. + + Fifth, various small obfuscations have been used in places all over the + program. Short circuit evaluation is used as a substitute for if() + statements in some places. The ternary operator is used. In the + author's opinion, use of the ternary operator is almost always a strong + argument for employee turnover. + + Last, if you have succeeded in wading through the previous layers of + obfuscation, you are confronted by the fact that the game that it + implements is an obscure game. Casual inspection of the program might + lead one to believe that it is an implementation of classic chess, but + this is not so. + + Q: What about the compiler warnings? + + A: When compiled with gcc -Wall, the compiler generated the following + warnings: + + suggest parentheses around + or - in operand of & + array subscript has type 'char' + return type defaults to 'int' + control reaches end of non-void function + value computed is not used + + The "value computed is not used" warning happens because I use the && + operator and take advantage of short circuit evaluation instead of using + an if() statement. + + The "suggest parentheses..." warnings are given because of expressions + that depend on operator precedence details in the C language. + Eliminating these warnings would reduce obfuscation. + + The other warnings are there because it would require more code to + eliminate them and that can't be done given the size limit. + + Q: Why does this program crash when it loses? + + A: What better way to admit defeat? The author thought this was + appropriate sportsmanship for a program of this genre and can think of + no worse job than trying to find an elusive bug in an intentionally + obfuscated program. + + [judge's note: This was followed by a description of the bug, and + the comment:] + + (Note, if this program wins, the author thinks it would be good to leave + this information out of the remarks and encourage others to try and + figure it out for themselves) + + [should you be too lazy to figure it out yourself, here's the author's + fix. I would have rot13'd it, but the punctuation would have survived.] + +begin 644 fix.txt +M5&AI&5D(&EN(&$@;G5M8F5R(&]F('=A>7,L(&)U +M="!T:&5R90II2!T:&%T(&%D9',@;VYL>2!O;F4@8GET92!T;R!T +M:&4@ | + Not every change is marked in this file is marked, but + most are. :-) + + WHAT'S NEW IN 2001: | + + The contest runs from 01-Oct-2001 00:00 UTC to 01-Dec-2001 23:59 UTC. | + +HINTS AND SUGGESTIONS: + + You are encouraged to examine the winners of previous contests. See + FOR MORE INFORMATION for details on how to get previous winners. + + Keep in mind that rules change from year to year, so some winning entries + may not be valid entries this year. What was unique and novel one year + might be 'old' the next year. + + An entry is usually examined in a number of ways. We typically apply + a number of tests to an entry: + + * look at the original source + * convert ANSI tri-graphs to ASCII + * C pre-process the source ignoring '#include' lines + * C pre-process the source ignoring '#define' and '#include' lines + * run it through a C beautifier + * examine the algorithm + * compile it (with flags to enable all warnings) | + * execute it + + You should consider how your entry looks in each of the above tests. + You should ask yourself if your entry remains obscure after it has been + 'cleaned up' by the C pre-processor and a C beautifier. + + Your entry need not pass all of the above tests. In certain + cases, a test is not important. Entries that compete for the + 'strangest/most creative source layout' need not do as well as + others in terms of their algorithm. On the other hand, given + two such entries, we are more inclined to pick the entry that + does something interesting when you run it. + + We try to avoid limiting creativity in our rules. As such, we leave + the contest open for creative rule interpretation. As in real life + programming, interpreting a requirements document or a customer request + is important. For this reason, we often award 'worst abuse of the + rules' to an entry that illustrates this point in an ironic way. + + We do realize that there are holes in the rules, and invite entries + to attempt to exploit them. We will award 'worst abuse of the rules' + and then plug the hole next year. Even so, we will attempt to use + the smallest plug needed, if not smaller. :-) + + Check out your program and be sure that it works. We sometimes make + the effort to debug an entry that has a slight problem, particularly + in or near the final round. On the other hand, we have seen some + of the best entries fall down because they didn't work. + + We tend to look down on a prime number printer, that claims that + 16 is a prime number. If you do have a bug, you are better off + documenting it. Noting "this entry sometimes prints the 4th power + of a prime by mistake" would save the above entry. And sometimes, + a strange bug/feature can even help the entry! Of course, a correctly + working entry is best. + + People who are considering to just use some complex mathematical + function or state machine to spell out something such as "hello, + world!" may want to try and be more creative. + + Ultra-obfuscated programs are in some cases some cases easier to + deobfuscate than subtly-obfuscated programs. Consider using + misleading or subtle tricks layered on top of or under an + appropriate level of obfuscation. + + Programs that use VTxxx/ANSI sequences that are NOT limited to a + specific terminal brand and that can also work in a standard xterm + are considered portable. + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many ANSI C compilers dislike the following code, and so do we: + + #define d define + #d foo <-- don't expect this to turn into #define foo + + When declaring local or global variables, you should declare the type: + + int this_is_ok; + this_is_not; <-- don't use such implicit type declarations | + + We suggest that you compile your entry with an ANSI C compiler. If you + must use non-ANSI C, such as K&R C, you must avoid areas that result in + compile/link errors for ANSI C compilers. For example, using gcc + local function declarations, such as: + + int + main() { + void blah() { printf("blah\n"); } + blah(); + } + + are not allowed even though their existence seems tailor made for + this contest! But for now, since they are not in wide spread use + we cannot accept entries that use them. + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using . Use instead. + + If you use C preprocessor directives (#define, #if, #ifdef, ...), + the leading '#' must be the first non-whitespace character on a line. + While some broken C preprocessors do not allow whitespace before a + '#', most do. + + The exit() function returns void. On some broken systems have exit() + return int. Your entry should assume that exit() returns a void. + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + + One line programs should be short one line programs, say around 80 + bytes long. Getting close to 160 bytes is a bit too long in our opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS version specific + (index/strchr differences are ok, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is ok only if you warn us in the 'remark' header item) + * won't compile or run under a POSIX P1003.1/P1003.2 like systems + * depend on a utility or application not normally found on most + most POSIX P1003.1/P1003.2 like systems + * abuse the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are similar to previous winners + * are identical to previous losers :-) + * are identical to future losers (Windows XP) :-) | + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + The build file should not be used to try and get around the size + limit. It is one thing to make use of a several -D's to help out, + but it is quite another to use 200+ bytes of -D's in order to + try and squeeze the source under the size limit. You should feel + free to make use of the build file space, but you are better off + if you show some amount of restraint. + | + You should try to restrict commands used on the build file to | + POSIX-like or common Un*x-like commands. You can also compile | + and use your own programs. If you do, try to build and execute | + from the current directory. This restriction is not a hard and | + absolute one. The intent is to ensure that the building if your | + program is reasonably portable. | + | + Don't forget that the building of your program should be done | + ***without human intervention***. So don't do: | + | + cat > prog.c | + cc prog.c -o prog | + | + However, you can do something cute such as making your program | + do something dumb (or cute) when build 'automatically'. However | + when it is run with a human involved, do something more cleaver. | + For example, one could use the build instructions: | + | + cc prog.c -DNONHUMAN -o prog | + echo "See remarks section about alternate ways to compile" | + | + and then include special notes in the ---remarks--- section for | + alternate / human intervention based building. | + + We want to get away from source that is simply a compact blob of + characters. To help, we give a break to source that contains + whitespace, and in certain cases ; { or } characters. While the + number of characters excluding whitespace (tab, space, newline), + and excluding any ; { or } followed immediately by either whitespace + or end of file, must be <= 2048, the total size may be less than 4096 | + bytes. This means that one may use "free of charge" up to 2048 | + bytes of whitespace, or ; { or } followed by either whitespace + or end of file. + + Please do not use things like gzip to get around the size limit. + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! + + We suggest that you avoid trying for the 'smallest self-replicating' + source. The smallest, a zero byte entry, won in 1994. + + We do not like writable strings. That is, we don't want stuff like: + + char *T = "So many primes, so little time!"; + ... + T[14] = ';'; + + Please don't make use of this feature, even if your system allows it. + However, initialized char arrays are OK to write over. This is OK: | + | + char b[] = "Is this Ok"; | + b[9] = 'K'; | + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. Don't + depend on a particular type of display. For example, don't depend + on color or a given size. Don't require backing store. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. + + We don't like entries that use proprietary M*tif, Xv*ew, or OpenL*ok | + toolkits, since not everyone has them. Use of OpenMotif is permitted | + because it is more widely and freely available. | + + You should avoid depending on a particular window manager. + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines + in the ---remark--- section. + + While we recognize that UN*X is not a universal operating system, the + contest does have a bias towards such systems. In an effort to expand + the scope of the contest, we phrase our bias in terms of POSIX P1003.1 + and P1003.2 standards. This will allow certain non-UN*X OS users to + submit entries. On the other hand, this is a guideline and not a rule. + We will not reject an entry based on some POSIX technicality. + + When dealing with OS and application environments, we suggest that you + be reasonable with a nod towards vanilla UN*X-like systems. POSIX will + evolve but not as much as the contest, so avoid stuff like POSIX real + time, security, etc. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION <== HINT!! + * make us laugh and/or throw up :-) (humor helps!) + + Some types of programs can't excel (tm) in some areas. Of course, your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + You are better off explaining what your entry does in the + ---remark--- section rather than leaving it obscure for the judges + as we might miss something and/or be too tired to notice. + + We freely admit that interesting, creative or humorous comments in + the ---remark--- section help your chances of winning. If you had to + read so many twisted entries, you too would enjoy a good laugh or two. + We think the readers of the contest winners do as well. We do read + the ---remark--- section during the judging process, so it is worth + your while to write a remarkable ---remark--- section. + | + We dislike C code with trailing control-M's (\r or \015) that results | + in compilation failures. Some non-Un*x/non-Linux tools such as | + MS Visual C and MS Visual C++ leave trailing control-M's on lines. | + Users of such tools should strip off such control-M's before submitting | + their entries. In some cases tools have a "Save As" option that will | + prevent such trailing control-M's being added. | + | + We dislike entries that depend on non-portable libcurses features such | + as halfdelay(). One should restrict libcurses to portable features | + found on BSD and SVR4/System V curses. | + | + The rules disallow source that contains unescaped octets with values | + between 128 and 255. You must use \octal or \hex escapes instead: | + | + /* 123456789 123456789 123456789 123456 */ | + char *foo = "This string is 36 octets in length \263"; | + /* This octet requires 4 octets of source ^^^^ */ | + if (strlen(foo) == 36) printf("foo is 36 octets a final NUL\n"); | + + Be creative! + + +ABUSING THE RULES: + + Legal abuse of the rules is somewhat encouraged. Legal rule abuse may + involve, but is not limited to, doing things that are technically + allowed by the rules and yet do not fit the spirit of what we + intended to be submitted. + + Legal rule abuse is encouraged to help promote creativity. Rule + abuse entries, regardless of if they receive an award, result in + changes to the next year's rules and guidelines. + + Legal abuse of the rules is NOT an invitation to violate the + rules. An entry that violates the rules in the opinion of the + judges, WILL be disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL + OF RISK! If you have an entry that might otherwise be interesting, + you might want to submit two versions; one that does not abuse the + rules and one that does. + + If you intend to abuse the rules, indicate so in the ---remark--- + section. You must try to justify why you consider your rule abuse + to be allowed under the rules. That is, you must plead your case + as to why your entry is valid. Humor and/or creativity help plead + a case. + + Abusing the entry format tends to annoy us more than amuse us. + + We are often asked why the contest rules and guidelines seem too + strange or contain mistakes, flaws or grammatical errors. + One reason is that we sometimes make genuine mistakes. But in many + cases such problems, flaws or areas of confusion are deliberate. + Changes to rules and guidelines in response to rule abuses, are + done in a minimal fashion. Often we will deliberately leave + behind holes (or introduce new ones) so that future rule abuse may + continue. + + At the risk of stating the obvious, this contest is a parity of the + software development process. The rules and guidelines are + only a small part of the overall contest. Even so, one may think + the contest rule and guideline process as a parody of the sometimes + tragic mismatch between what a customer (or marketing) wants and + what engineering delivers. + + +ENTRY FORMAT: + + In order to help us process the many entries, we must request your + assistance by formatting your entries in a certain way. This format, + in addition, allows us to quickly separate information about the + author from the program itself. (see JUDGING PROCESS) + + We have provided the program, mkentry, as an example of how to + format entries. You should be aware of the following warning that + is found in mkentry.c: + + This program attempts to implement the IOCCC rules. Every + attempt has been made to make sure that this program produces + an entry that conforms to the contest rules. In all cases, + where this program differs from the contest rules, the + contest rules will be used. Be sure to check with the + contest rules before submitting an entry. + | + NOTE: A copy of the mkentry program may be found at: | + | + http://www.ioccc.org/official/mkentry.c | + + You are not required to use mkentry. It is convenient, however, + as it attempts to uuencode the needed files, and attempt to check + the entry against the size rules. + + If you have any suggestions, comments, fixes or complaints about + the mkentry.c program, please send EMail to the judges. (see below) + + The following is a sample entry (the change bars are not part + of the example, don't add them to your entry!) + +---entry--- +rule: 2001 | +fix: y +title: chlejhse +entry: 0 +date: Wed Feb 2 00:47:00 2001 | +host: Un*x v6, pdp11/45 + 2.9BSD, pdp11/70 +---remark--- + This is a not-very-obfuscated C program. It is likely not to win a + prize, because it doesn't have what it takes to win and because the + author plans to forget to send it in before the deadline! :-) +---author--- +name: Landon Curt Noll +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA + Earth +email: chongo@no_spam.fake.address + nobody@toad.com +url: http://www.isthe.com/chongo/index.html | +anon: y +---author--- +name: Leonid A. Broukhis +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA +email: leob@no_spam.fake_org +url: http://www.mailcom.com/main.shtml +anon: n +---author--- +name: Simon Cooper | +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA +email: sc@no_spam.fake_edu | +url: http://www.sfik.com | +anon: n +---author--- +name: Peter Seebach +org: IOCCC Judging Group +addr: Toad Hall + PO Box 170608 + San Francisco, California + 94117-0608 + USA +email: seebs@no_spam.fake_com +url: none +anon: y +---info--- +begin 664 info.file +M5&AI2!D96-O9&5D('1H:7,@9FEL92X@(%-E96US('1H +M97)E(&ES(&$*2!D;VXG="!Y;W4@=&5L;"!U6]U(&1E8V]D +M960@=&AI6]U6]UGIB:6XA"@`` +` +end +---build--- +begin 664 build +M9V-C("UA;G-I('!R;V2!O8F9U&%M<&QE+@H@("`@("HO"B`@("!P&%M<&QE+EQN +M(BD["B`@("!P6]U special_build + sh < special_build + + * Assume that we will use the entry title. Send us a version of + your build/program files that uses the name convention. You + should uuencode these files in ---info--- sections. + + If your entry needs to modify its source, info or binary files, + please say so in the ---remark--- section. You should try to avoid + touching your original build, source and binary files. You should + arrange to make copies of the files you intend to modify. This + will allow people to re-generate your entry from scratch. + + Remember that your entry may be built without a build file. We + typically incorporate the build lines into a Makefile. If the + build file must exist, say so in the ---remark--- section. + + Typically the ---build--- command will contain a "cc" command. + It is also ok to use a "gcc" command (and gcc args). However keep + in mind that your entry should be compilable by any standard ANSI C + compiler and thus should not depend on a special gcc feature. + + If your entry needs special info files, you should uuencode them + into ---info--- sections. In the case of multiple info files, + use multiple ---info--- sections. If no info files are needed, + then skip the ---info--- section. + + Info files are intended to be input, or detailed information that + does not fit well into the ---remark--- section. For example, an + entry that implements a compiler might want to provide some sample + programs for the user to compile. An entry might want to include a + lengthy design document, that might not be appropriate for a + 'hints' file. + + Info files should be used only to supplement your entry. For + example, info files may provide sample input or detailed + information about your entry. Because they are supplemental, + the entry should not require them exist. + + In some cases, your info files might be renamed to avoid name + conflicts. If info files should not be renamed for some reason, + say so in the ---remark--- section. + + Info files must uudecode into the current directory. If they + absolutely must be renamed, or moved into a sub-directory, say + so in the ---remark--- section. + + When submitting multiple entries, be sure that each entry has + a unique entry number from 0 to 7. Your first entry should + have entry number 0. + + With the exception of the header, all text outside of the entry + format may be ignored. That is, don't place text outside of the + entry and expect us to see it. (Our decoding tools are not AI + progs!) If you need tell the judges something, put it in the + ---remark--- section, or send a EMail to: + + questions@ioccc.org (not the address for submitting entries) + | + You must include the words 'ioccc question' in the subject of your | + EMail message when sending EMail to the judges. | + + The date should be given with respect to UTC. (Some systems refer + to this as GMT or GMT0) The format of the date should be that as + returned by asctime() in the C locale. An example of such a string is: + + Wed Feb 2 00:47:00 2001 + + This format is similar to the output of the date(1) command. The + string does not include the timezone name before the year. On many + systems, one of the following command will produce a similar string: + + date -u "+%a %h %d %T 20%y" + date -u sed -e 's/... \(20[0-9][0-9]\)$/\1/' + sh -c 'TZ=UTC date sed -e "s/... \(20[0-9][0-9]\)$/\1/"' + sh -c 'TZ=GMT date sed -e "s/... \(20[0-9][0-9]\)$/\1/"' + sh -c 'TZ=GMT0 date sed -e "s/... \(20[0-9][0-9]\)$/\1/"' + + You are allowed to update/fix/revise your entry. To do so, set + the 'fix' line in the ---entry--- section to 'y' instead of 'n'. + Be sure that the resubmission uses the same title and entry number + as well, as these are used to determine which entry is to be + replaced. + + Again, you may want to use the mkentry program may be found at: | + | + http://www.ioccc.org/official/mkentry.c | + | + to format your entry. | + + | +JUDGING PROCESS: + + Entries are judged by Leonid A. Broukhis, Simon Cooper, Landon Curt Noll + and Peter Seebach. + + Entries are unpacked into individual directories. The EMail message + is unpacked into individual files, each containing: + + ---entry--- section + all ---author--- sections + all ---info--- sections + ---build--- section + ---program--- section + any other text, including the EMail message headers + + Prior to judging, the 'any other text' file is scanned to be sure + it does not contain useful information (or in case the entry was + malformed and did not unpack correctly). Information from the + ---author--- sections and the title from the ---entry--- section + are not read until the judging process is complete, and then only + from entries that have won an award. + + The above process helps keep us biased for/against any one particular + individual. We are usually kept in the dark as much as you are + until the final awards are given. We like the surprise of finding + out in the end, who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. (For the curious, + we do indicate the volume of paper consumed when presenting the IOCCC + winners at talks) + + After the initial announcement, we attempt to send EMail to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes and typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the ---entry--- section + * reading the uudecoded ---build--- section + * reading the uudecoded ---program--- section + * reading the uudecoded ---info--- section(s), if any + * passing the source thru the C pre-processor + skipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + skipping over any #include files + + In later rounds, other actions are performed: + + * compiling/building the source + * running the program + * performing miscellaneous tests on the source and binary + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry often will compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code + * best X client (see OUR LIKES AND DISLIKES) + * best abuse of ANSI C + * worst abuse of the rules + * (anything else so strange that it deserves an award) + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to 8 or 10 + winners. Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry os good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + + More often than not, we select a small entry (usually one line), a + strange/creative layout entry, and an entry that abuses the contest + rules in some way. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entries. More often, the + 'best' is picked because it does well in a number of categories. + + +ANNOUNCEMENT OF WINNERS: + + In Jan or Feb 2002 the judges will post an initial announcement of who | + won, the name of their award, and a very brief description of the | + winning entry on the IOCCC web site: | + | + http://www.ioccc.org/whowon.html | + | + We will also submit a brief announcement story to /.: | + | + http://www.slashdot.org | + | + that, depending on the willingness of the /. editors, may be posted | + to their site at the same time. | + | + Note that initial announcement will NOT contain source. This is because | + the winning authors are given a chance to review the judges comments, | + and test our Makefile. This review process typically takes a few weeks. | + | + Sometime after the initial announcement, and once the the review by | + the winners has been completed (perhaps Feb or Mar 2002), the winning | + source will be posted to the IOCCC web site: | + | + http://www.ioccc.org/years.html | + | + NOTE: previous winners are available at that URL | + | + We will submit a story announcing the availability of the winners | + to /. at the same time. | + + Finally (again perhaps Feb or Mar 2002) the winning entries will be | + posted to the following groups: | + + comp.lang.c comp.lang.c.moderated alt.sources + + In addition, pointers to these postings are posted to the following + + comp.sources.misc comp.windows.x comp.programming + misc.misc comp.std.c alt.folklore.computers + + Often, winning entries are published in selected magazines from around + the world. Winners have appeared in books ("The New Hackers Dictionary") + and on T-Shirts. + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending EMail to the following address: + + questions@ioccc.org (not the address for submitting entries) + + You must include the words 'ioccc question' in the subject of your | + EMail message when sending EMail to the judges. | + | + Questions and comments about the contest are welcome. Comments about + confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. + + Check out the IOCCC Web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ +Peter Seebach diff --git a/2001/herrmann1.c b/2001/herrmann1.c new file mode 100644 index 000000000..4466a2881 --- /dev/null +++ b/2001/herrmann1.c @@ -0,0 +1,327 @@ +#define D define +#define U undef +#define n # + + +#undef __FILE__ + n U __FILE__ + n D f __FILE__ + n D N endif + n D p e(prg) + n D e(x) #x + n D q # + n D o E #F + n D E Q( + n D G x,y,z) + n D H E y,z) + n D F ,) + n D g o else + n D d o D + n D u o U + n D w E o F D +#ifdef prg + + + +#ifndef tape +n include p +n ifndef tape +n D tape O +n endif +#endif +n D O Z(O, +n D I Z(I, +q D i tape +n U O +n U I +n D O ,) +n D I ,) +q D v tape +n U O +n U I +#undef tape + n U tape + q U tape +#endif /* tape */ + + +q ifndef P +q D H y ## z +#ifdef prg +d c 0 & 0 +d R i W v +d B Initializing... +d L V /* the turing */ +d M Y(O)/* state to */ +d S(x) T(O,1, start ##x) +#else +d c 0 +#endif +q D P P +q include f +q U Q +q D H H +q N +q U f +o ifndef P +E # D H y ## z F +d O 3 +d I 3 +d x 3 +o if c+2 +E o F include + + +int main() { + return 2+c|! + printf + ( + d y "\n" + d z ".." + d j " " + d P "*" + d k " " + o if c + w Y(Z) #Z + "Un" + "define" + "d state " + Y(B) y y +"Tape:" + o elif !c +"Usage:" + d M 0 + " prg=myprg.turing " + d L , + d R , + "[" + "tape=" + "\"" + "O I O..." + "\"" + "]" + g + "Final " +"tape:" + o N + u O + u I + d O "O" + d I "I" + g + d j _ + d z ... + d k ~ + +/*StarBox*/ +/*********/ + d P * + d y * + E E /,*) F + * + * State: B +/*********/ + + u O + u I + o N + u x + u a + u c + u B + o ifdef s + d J s + d A l + d B m + d C r + d t K + d a L + d b M + d c R + g + d J S + d A L + d B M + d C R + d T K + d a l + d b m + d c r + o N + y + + + /*Triangles*/ + d V j j j j + d W j j j j + d X(G y j + d Z(G j y + d Y(x) P + y A B C + u X + u Y + u Z + u V + u W + + d X(G y x + d Z(G x y + d V z O O + d W O O z + d Y(x) x + y A B C + u X + u Y + u Z + u V + u W + + d V k k k k + d W k k k k + d X(G y k + d Z(G k y + d Y(x) P + y A B C + u X + u Y + u Z + u V + u W + y + u j + u k + u z + u P + u y + u O + /*EndOfTriang*/ + + + /* Rain */ + o ifndef I /*/*/ /*/*/ + /*/*/*/*/*/ /*/*/ + E E /*/*/*/*/*/,/) F + d K(G /*/*/ y + o if J(x) + u K + d K(G x + w a X(J(x),A F + u K + d Z(G x + d W O + w b Y(C) + d P C + u Z + o U W + + + d Z(G z ## y + w c C + u Z + g /* <- exit */ + u K + d X(G z ## y + + + w a A + u X + d X(G x + d V O + w b Y(A) + d P A + u X + u V + d K(G x + w c Z(J(x),C F + u K + o N + u a + u b + o U c + + + d X(G J(_ ## x) + d V J(_O) + d Z(G J(_ ## x) + d W J(_O) + d Y(x) J(_ ## x) + + + o ifdef s + u t + d t(G z + d j S(x) + d k T + + g + u T +d T(G z + d j s(x) + d k t + o N + u tape + o include p + u tape + d stop_O x + d stop_I x + w a(P) O&I&x + + + d O 0 + d I 0 + d x 0 + w c a(P) + u O + u I + u x + d left 0 + d right 1 + w j k(P ## x) + u P + u left + u right + u stop_O + u stop_I + + + u Y + o U X + u V + u Z + o U W + u A + u B + o U C + u j + u k + w B J (.) + u J + u t + o U T + + + /*Codeblk*/ + o D P P + o include f + E n U Q F + E n D H H F + + + g + ); +} +w P x +o N +o N +o U f +u l +u L +o U m +u M +u r +o U R +u S +u s +o U B +u a +u c diff --git a/2001/herrmann1.gcd b/2001/herrmann1.gcd new file mode 100644 index 000000000..a81f70034 --- /dev/null +++ b/2001/herrmann1.gcd @@ -0,0 +1,46 @@ +/* Calculates the greatest common divisor of two numbers in + unary representation. Default tape: gcd(6, 10) = 2. */ + + + +#define tape I I I I I I O I I I I I I I I I I + +#define start_O O, right, start +#define start_I I, left , st10 +/* st1_O may not happen */ +#define st1_I O, right, st2 +#define st2_O O, right, st11 +#define st2_I I, right, st3 +#define st3_O O, right, st4 +#define st3_I I, right, st3 +#define st4_O O, right, st4 +#define st4_I I, right, st5 +#define st5_O I, left , st6 +#define st5_I I, right, st5 +/* st6_O may not happen */ +#define st6_I O, left , st7 +#define st7_O O, right, st13 +#define st7_I I, left , st8 +#define st8_O O, left , st9 +#define st8_I I, left , st8 +#define st9_O O, left , st9 +#define st9_I I, left , st10 +#define st10_O I, right, st1 +#define st10_I I, left , st10 +#define st11_O O, right, st11 +#define st11_I O, right, st12 +#define st12_O O, right, st16 +#define st12_I I, right, st13 +#define st13_O O, right, st14 +#define st13_I I, right, st13 +#define st14_O O, left , st_next_iteration +#define st14_I O, right, st14 +/* The state "st_next_iteration" means the the turing machine + is about to do the next iteration of the Euklid algorithm. + (That is, during that state, there are two numbers on the + tape with the same gcd as the initial numbers.) */ +#define st_next_iteration_O O, left , st_next_iteration +#define st_next_iteration_I I, left , st8 +#define st16_O O, right, stop +#define st16_I O, right, st16 + diff --git a/2001/herrmann1.hint b/2001/herrmann1.hint new file mode 100644 index 000000000..9dfb867be --- /dev/null +++ b/2001/herrmann1.hint @@ -0,0 +1,363 @@ +Best abuse of the C preprocessor: + + Immanuel Herrmann + University of Freiburg, Germany + Rehlingstr. 17 + 79100 Freiburg + Germany + + http://pcpool.mathematik.uni-freiburg.de/~immi/ + + +Judges' Comments: + + To build: + + Running and building are combined for this entry. + + Try: + ./herrmann1.sh 'prg=herrmann1.times2' + -or- + ./herrmann1.sh 'prg=herrmann1.gcd' + + There are some clear hints in the source code as to the + purpose of this program. Perhaps the only way to figure out what is + going on is to look at the differences between the runs of the C + preprocessor! Computer Science students should recognize what is going + on. + + +Selected Author's Comments: + + Many cool things have been done with the preprocessor, + e. g. calculation of prime numbers or the tower of Hanoi. However, + up to now, no one proved that the preprocessor is Turing complete, + and I wondered why. Well, the answer is simply that the + preprocessor is _not_ Turing complete, at least not if the program + is preprocessed only once. This is true even if the program is + allowed to include itself. (The reason being that for a given + program, the preprocessor has only a finite number of states, plus + a stack consisting of the places which the file has been included + from. This is only a push-down automaton.) + + Well, this entry _is_ a Turing machine implemented in the + preprocessor; so of course, it has to be preprocessed several + times. Here are the main features: + + - Easy to program: Write your own Turing programs in a nice + syntax. + + - Easy to debug: (some) errors in the Turing machine program will + be reported nicely. (That's something which is not often seen in + IOCCC programs.) + + - Ultra-fast: The resulting C program will print the output in + time O(n), where n is the length of the output. This means for + example that you can solve NP hard problems in polynomial time! + ;-) + + - And best of all: During the preprocessing, watch the animated + Turing machine running over the tape and doing its work in your + terminal! + + + + How to use it + ============= + + For the impatient + ----------------- + + The info files "herrmann1.turing" and "herrmann1.gcd" are sample + programs for the Turing machine. For example, type + + ./herrmann1.sh 'prg=herrmann1.times2' + + and watch the animated Turing machine multiply 8 by two (in + unary representation). Here's a screen shot during compilation: + + /* + * + * State: st2. + * + * _ _ _ _ _ * _ _ _ _ _ _ _ _ _ _ _ _ _ + * ... O O I I I I I O I I I I I O O ... + * ~ ~ ~ ~ ~ * ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + * + * + */ + + (As on real videos, you'll see a bit of "white noise" at the + beginning and at the end.;-) After compilation has terminated, + type ./prog to see the final result. The output will be + + Final tape: + + * + ..OOIIIIIIIIIIIIIIIIOOOO.. + * + + (Note that the last frame of the animation is _not_ the final + result.) + + + In the previous example, the Turing machine started on the default + tape of the program "times2.turing". To provide your own tape, type + (for example) + + ./build prg=times2.turing tape="O O O I I I O O O" + + (The O's and I's are letters, not digits.) You might prefer to + provide only a finite portion of the tape, like I did above. In + this case, the remainder of the tape is filled with O's. ;-) + + If you just type + ./build + and run the program, you'll get a usage message (and the return + code will be 2). + + Note: To get a really nice animation, you'll need a terminal which + is able to scroll fast enough. (xterm is not very good. The + kde terminal "konsole" or the text console under linux are much + better. Simply try some out.) + + + + Writing your own programs + ------------------------- + + Now, let's assume you want to write a program which adds 1 to a + number in unary representation. (That is, a row of I's is + expected, and one more I is appended to the row.) Let's call it + "plus1.turing". Here's what it could look like: + + /* Search beginning of number. */ + #define start_O O, right, start + /* Number found. Move one step to the left. */ + #define start_I I, left, st2 + /* Write a I and stop */ + #define st2_O I, left, stop + + Some explanations: + - The tape alphabet is always O and I. + - The states can be anything starting with "st". "start" and + "stop" are the start and stop states, respectively. + - to define a state, use two lines: one for each letter on the + tape. You may omit one of the lines if the Turing machine will + never enter the state reading that letter. (In the example, the + line defining st2_I has been left out.) + - The order of the lines is irrelevant. + - You may use c-style comments. (Would you have guessed it?) + + Now, the program can be used with + + ./herrmann1.sh 'prg=plus1.turing' 'tape="I I I"' + + But what happens if no tape is provided? Up to now, the Turing + machine would start on an empty tape (that is, a tape filled with + O's). For many programs, this doesn't make much sense (as is + the case for "plus1.turing"). So you might want to provide a + default tape by adding a line like + + #define tape O O O O O I I I I + + to your program. + + + + Debugging + --------- + + When writing long programs, the most common errors are to forget + to define a state or to misspell one. Let's assume you forgot the + line + + #define start_I I, left, st2 + + Remove it and type + + ./herrmann1 'prg=plus1.turing' + + The output will be + + Undefined state start. + + Tape: + + * + ..OOOOOOOOIIIIOO.. + * + + and the return code will be 1. As you can see, the Turing machine + moved over the O's, but when it arrived at the I (still in state + start), the error occurred. + + Note that other kinds of errors can cause compilation to fail. + If this happens, the build script will write the error message of + gcc into a file called "error" and then exit. + + + + + What the build script does + ========================== + + In principle, the build script simply runs the preprocessor over + and over again, until nothing changes anymore; then, the program + is compiled. After each preprocessing step, the script outputs the + beginning of the program; this is where the animation takes place + (except in the first and last few steps). + + However, there's a technical problem to overcome: Some compilers + (including gcc) insert a lot of white space during the + preprocessing. This is bad for two reasons. First, the animated + picture won't look right. And second, after some time, the file + will grow too big for your hard disk. (The amount of white space + grows exponentially.) So after each preprocessing, the first thing + the build script does is remove all the unnecessary white space + using sed. + + (gcc would even insert #line directives if I didn't suppress + them with the -P option.) + + + Some more details + ----------------- + + - The arguments passed to the build script are passed on to gcc + with a "-D" before. I had a slight technical problem doing this + (especially with the spaces that can appear within the tape + argument). That made the build script a bit longer. + + - It would be enough to pass the defines in the first + preprocessing. The program then "remembers" them. However, it + doesn't matter if they are passed in all preprocessings. (This + doesn't sound very impressive, but it has required some extra + lines of code.) + + - During the preprocessing, intermediate files "herrmann1-1.c" and + "herrmann1-2.c" are generated. + + - Also, a file "error" is generated. This file is removed after + the compilation, except if gcc produced an error; then it contains + the error message. (I can't let gcc output all its messages + directly, because the warnings would clobber the animation. I + could have made the compile script output the error file in case + of an error, but I didn't want to make it yet longer.) + + + + + Some technical details / obfuscations + ==================================== + + - The program is compressed. In the first three preprocessing + passes, it uncompresses itself and initializes the + "variables". So if you want to understand how it works, the best + thing is to preprocess it three times and then look at it + again. (However, I wouldn't have wasted three passes if they + weren't needed anyway to initialize the tape in certain + cases. Find out why.) + + - The first problem I had to solve when writing this program was + to write a preprocessor program which outputs itself. Of course, + each program which doesn't contain any preprocessor directives + is such a program, but that's not what I needed. In fact, to do + this, the program has to include itself, but even then, it's not + easy. + + - The next problem to solve was how to pass results of a + calculation of one preprocessing to the next one. This is done + by outputting #defines with the result. But there's a problem + with this: it is impossible to output a "#define result xxx", + where xxx depends on the previous value of result. Try it if you + don't believe it. And find out what I did instead. + + - What's a useful way to store information, especially the content + of the tape? Of course, a "#define tape OOIOOIOIIIIO" contains + the information, but then, how do you access the information? + (For example, you won't be able to write preprocessor code which + replaces the first O by I.) My answer looks very much like the + way a stack would have been implemented in lambda calculus. (The + tape is implemented as two stacks, to be exact.) And still, + there were some technical problems to solve. Look at the program + for more details. + + - There are many other interesting things to look at, e.g. the way + to access the information in the user-provided program, the way + a non-defined state is detected, the way the picture is + produced, etc. If you want a real challenge, try to understand + what the line "w j k(P ## x)" does. + + - Due to the fact that our alphabet has only 53 ;-) letters, I had + to use many variables more than once. + + - I couldn't refrain from doing a little bit of nasty stuff like + + #define a 0&0 + #if !a + + Of course, it is a bit more subtle, and even useful. + + - The layout of the source code..., well, let's call it the + "modern art of programming" - a mixture of program-like + indenting and modern art. There are even some comments... + + + + + Compatibility + ============= + + - It works with many versions of gcc. I tested it with versions + 2.7.2.1, 2.8.1, 2.95.2, and ecgs-2.91.66. However, an old version + of gcc produced "internal compiler errors" (obviously not my + fault). + + - The only warnings I get tell me that I'm undefining __FILE__ and + that preprocessing directives are not recognized within macro + args. My answer to this is "yes, I know this and it's all + right". With "-Wall", I also get some warnings about "/*" + inside comments (Well, _I_ like some well-placed "/*/*/".) as + well as some suggestions where to place some more parentheses + (as if I didn't know the operator precedence). + + - Different versions of cc all produced only rubbish. Apparently, + the preprocessors didn't really work. (I don't feel guilty + there, either. Even with very simple programs, they produced + mysterious output.) + + - For Mac-Users: It works with the C compiler of Codewarrior (an + old version). This compiler even leaves out all that unnecessary + white space, so that no clean-up is needed. (It would be useful + to write a kind of script which does the equivalent to the build + script, so that one does not have to choose "preprocess" from + the menu over and over again. I leave this as an exercise to the + experienced Mac programmer.) + + - In the build script, I passed the -P option to gcc to suppress + the insertion of #line directives. If your compiler doesn't + support this option (and does insert #line directives), you + should change the call to sed to remove them, too: Add + + -e "/^#line/ d" + + to the sed parameters. Or, if your #line directives look like + + # 15 "filename" + + add + + -e "/^# [0-9]/ d" + + instead. + + - First, I had "-ansi -pedantic" turned on, but on some systems, + the stdio.h is not compatible to that, so I turned it back off. + + - The build script probably needs a bash to run in. So perhaps you + have to add "#!/bin/bash" or something like this at the + beginning. + + - On SunOS, I had to remove the "-q" option from diff in the build + script. diff --git a/2001/herrmann1.sh b/2001/herrmann1.sh new file mode 100644 index 000000000..330397f71 --- /dev/null +++ b/2001/herrmann1.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +name=herrmann1 + +# Make sure things are clean to start with... +rm -f ${name} ${name}-1.c ${name}-2.c ${name}-3.c + +defs="" +for p in ${1+"$@"}; do + defs="$defs \"-D$p\"" +done + +cp ${name}.c ${name}-1.c +touch ${name}-3.c + +until cmp -s ${name}-1.c ${name}-3.c > /dev/null; do + eval ${CC:-cc} -E ${name}-1.c -o ${name}-2.c -P $defs 2> error || exit + mv -f ${name}-1.c ${name}-3.c + sed -e 's/ */ /g' -e 's/^ //' -e '/^$/ d' -e 's:^/ \*:/*:' \ + < ${name}-2.c > ${name}-1.c + head ${name}-1.c +done + +eval ${CC:-cc} ${name}-1.c -o ${name} 2> error && rm error + +eval ./${name} + +# Clean up intermediates... +rm -f ${name}-1.c ${name}-2.c ${name}-3.c diff --git a/2001/herrmann1.times2 b/2001/herrmann1.times2 new file mode 100644 index 000000000..2de318f8a --- /dev/null +++ b/2001/herrmann1.times2 @@ -0,0 +1,19 @@ + +/* Takes a number in unary representation and + multiplies it by two +*/ + +/* Default Tape: Multiply 8 by 2 */ +#define tape I I I I I I I I + + +#define start_O O, right, start +#define start_I O, left, st1 +#define st1_O I, left, st2 +#define st2_I I, left, st2 +#define st2_O I, right, st3 +#define st3_I I, right, st3 +#define st3_O O, right, st4 +#define st4_O O, left, stop +#define st4_I O, left, st1 + diff --git a/2001/herrmann2.c b/2001/herrmann2.c new file mode 100644 index 000000000..27e47aab7 --- /dev/null +++ b/2001/herrmann2.c @@ -0,0 +1,23 @@ +char*d,A[9876];char*d,A[9876];char*d,A[9876];char*d,A[9876];char*d,A[9876];char +e;b;*ad,a,c; te;b;*ad,a,c; te;*ad,a,c; w,te;*ad,a, w,te;*ad,and, w,te;*ad, +r,T; wri; ;*h; r,T; wri; ;*h; r; wri; ;*h;_, r; wri;*h;_, r; wri;*har;_, r; wri + ;on; ;l ;i(V) ;on; ;l ;i(V) ;o ;l ;mai(V) ;o ;mai(n,V) ;main (n,V) + {-!har ; {-!har ; {har =A; {h =A;ad =A;read +(0,&e,o||n -- +(0,&e,o||n -- +(0,&o||n ,o-- +(0,&on ,o-4,- +(0,n ,o-=94,- +(0,n +,l=b=8,!( te-*A,l=b=8,!( te-*A,l=b,!( time-*A,l=b, time)|-*A,l= time(0)|-*A,l= +~l),srand (l),~l),srand (l),~l),and ,!(l),~l),a ,!(A,l),~l) ,!(d=A,l),~l) +,b))&&+((A + te,b))&&+((A + te,b))+((A -A+ te,b))+A -A+ (&te,b+A -A+(* (&te,b+A +)=+ +95>e?(*& c)=+ +95>e?(*& c) +95>e?(*& _*c) +95>(*& _*c) +95>(*&r= _*c) +95> +5,r+e-r +_:2-195,r+e-r +_:2-195+e-r +_:2-1<-95+e-r +_-1<-95+e-r ++?_-1<-95+e-r +|(d==d),!n ?*d||(d==d),!n ?*d||(d==d),!n ?*d||(d==d),!n ?*d||(d==d),!n ?*d||(d= + *( (char**)+V+ *( (char)+V+ *( (c),har)+V+ (c),har)+ (V+ (c),r)+ (V+ ( c), ++0,*d-7 ) -r+8)+0,*d-7 -r+8)+0,*d-c:7 -r+80,*d-c:7 -r+7:80,*d-7 -r+7:80,*d++-7 ++7+! r: and%9- +7+! rand%9-85 +7+! rand%95 +7+!! rand%95 +7+ rand()%95 +7+ r +-(r+o):(+w,_+ A-(r+o)+w,_+*( A-(r+o)+w,_+ A-(r=e+o)+w,_+ A-(r+o)+wri,_+ A-(r+o) ++(o)+b)),!write+(o)+b,!wri,(te+(o)+b,!write+(o=_)+b,!write+(o)+b,!((write+(o)+b +-b+*h)(1,A+b,!!-b+*h),A+b,((!!-b+*h),A+b,!!-b+((*h),A+b,!!-b+*h),A-++b,!!-b+*h) +, a >T^l,( o-95, a >T,( o-=+95, a >T,( o-95, a)) >T,( o-95, a >T,(w? o-95, a >T +++ &&r:b<<2+a ++ &&b<<2+a+w ++ &&b<<2+w ++ ) &&b<<2+w ++ &&b<<((2+w ++ && +!main(n*n,V) , !main(n,V) , !main(+-n,V) ,main(+-n,V) ) ,main(n,V) ) ,main),(n, +l)),w= +T-->o +l)),w= +T>o +l)),w=o+ +T>o +l,w=o+ +T>o;{ +l,w=o+T>o;{ +l,w &=o+ +!a;}return _+= !a;}return _+= !a;}return _+= !a;}return _+= !a;}return _+= !a;} diff --git a/2001/herrmann2.cup b/2001/herrmann2.cup new file mode 100644 index 000000000..cad95f2b8 --- /dev/null +++ b/2001/herrmann2.cup @@ -0,0 +1,38 @@ +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppppppqqqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqppppqqqppppqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppqqqqqpppqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppqqqqqpppqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqppqqqppqqqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppqqqqqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppqqqqqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppppppqqqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppppppppppppppppqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqpppppppppppppppppppppppppppppqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqppoooooooooooooooooooooooooooooooooooppqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqpppooooooooooooonnnnnnnooooooooooooopppqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqppooooooooooooonnnnnnnnooooooooooooooppqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqppoooooooooooonnnooooooooooooooooooooppqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqppoooooooooooonnnooooooooooooooooooooppqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqppoooooooooooonnnooooooooooooooooooooppqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqppoooooooooooonnnnnnnnoooooooooooooppqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqppoooooooooooonnnnnnnooooooooooooppqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqppoooooooooooooooooooooooooooppqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqppoooooooooooooooooooooppqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppooooooooooooooopppqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppooooooopppqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppppppqqqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppppqqqqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppppqqqqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppppppppqqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppppppppqqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppppqqqqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppppqqqqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppppqqqqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppppqqqqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppppppqqqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpppppppppqqqqqqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoooooooooooooooooooqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoooooooooooooooooooqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoooooooooooooooooooqqqqqqqqqqqqqqqqqq +qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq diff --git a/2001/herrmann2.hint b/2001/herrmann2.hint new file mode 100644 index 000000000..761f9636a --- /dev/null +++ b/2001/herrmann2.hint @@ -0,0 +1,195 @@ +Most eye-crossing: + + Immanuel Herrmann + University of Freiburg, Germany + Rehlingstr. 17 + 79100 Freiburg + Germany + + http://pcpool.mathematik.uni-freiburg.de/~immi/ + + +Judges' Comments: + + To build: + + make herrmann2 + + Try: + + ./herrmann2 < herrmann2.ioccc + ./herrmann2 < herrmann2.cup + + Be careful when staring at the source code - your eyes might cross, but + if you concentrate on your focus you will find illumination! + + +Selected Author's Comments: + + You probably know those "magic eye" 3D pictures - pictures looking + like random noise, but when you look "through" the paper, you + either get a three dimensional picture or a head-ache. With this + program, you can create your own 3D pictures in ascii art. And + yes, the program itself is such a 3D picture. + + + How to use it + ============= + + 1. Create a file which describes the desired 3D picture. The file + must be a block of lowercase letters the size of the desired + picture. The letters specify the depth of the corresponding pixel: + "a" means close to the paper, "z" means far away. The info files + are examples. Be aware that the size of the picture is restricted + to about 9k. + + 2. Pipe your picture into the program. The output will be your + 3D picture, constructed of random characters (with ascii code between + 32 and 126). For example, type + + ./herrmann2 < herrmann2.ioccc + + + 3. If you want to control the characters used in the output (for + example if your picture is to consist only of digits), pass them + as the first argument. In this case, each time the program needs a + new random character, it will take the next one from the + argument. When it arrives at the end of the argument, it will + start over at the beginning. Example: + + ./herrmann2 "234 84 045 5 6765 7487 65190 84 656 254 12 43931 818 0 6542\ + 341 45 567 76967 7244 606 976567 895 81898 095 68678 1843 4650547\ + 565980691 389 04974" < herrmann2.ioccc + + + Some hints to get better results + -------------------------------- + + - Due to the way these 3D pictures work, the left part of the + picture won't look really 3D, so don't put things too much on + the left. The reason is that for each letter in the source file, + a character for the right eye is printed. The 3D effect appears + when the left eye sees the same character more to the left. This + is of course impossible on the left border of the picture. + + - Don't use too different depths and don't use the depths very + close to the paper (beginning of the alphabet). This would make + it more difficult to see the picture. + + - When passing an argument, don't use a too short one; the + repeating pattern which arises from the repetition of the argument + could interfere with the repeating pattern which creates the 3D + effect. + + + Extra-Features + ============== + + - The program is able to handle all common kinds of line breaks: + Unix, Dos and Mac. To get an output with a certain kind of line + breaks, simply use the same kind of line breaks in the input + file. + + - As the source code is a 3D picture itself, the easiest way to + get it (if you lost it or if you don't have it already) is to use + the program itself on the right picture and with the right + argument: + +./herrmann2 \ +'char*d,A[9876];e;b;*ad,a,c; tw,ndr,T; wri; ;*h; _,ar ;on;'\ +' ;l ;i(V)man,n {-!har ; =Aadre(0,&e,o||n -- +,o4,=9,l=b=8,'\ +'!( te-*Aim)|(0~l),srand (l),,!A,d=,b))&&+((A + te-A(&(*)=+ +95>'\ +'e?(*& c_*r=5,r+e-r +_:2-19<-+?|(d==d),!n ?*d| *( (char**)+V+), ('\ +' +0,*d-7 ) -r+8)c:7:+++7+! r: and%9- 85! ()-(r+o):(+w,_+ A*(=er'\ +'i+(o)+b)),!write,(=_((-b+*h)(1,A+b,!!((((-+, a >T^l,( o-95=+))w?'\ +'++ &&r:b<<2+a +w) ((!main(n*n,V) , +-) ),l)),w= +T-->o +o+;{ &!'\ +'a;}return _+= ' < herrmann2.ioccc + + - If I had submitted the program last year, I would have said that + it has exactly the maximum allowed length: 1536 characters. Now + let's say it's a way of protesting against the inflation in + program length. + + - The size of the source 3D picture has been chosen carefully: as + big as possible, but small enough to be viewed without problems + on normal-sized terminals. + + + Why this program should win + =========================== + + - The layout is of a completely new kind. And it describes what + the program does more precisely than any comment could. + + - I don't think there has ever been an ioccc program with so + severe layout constraints. Once the 3D picture has been fixed, + only a sixth of the characters can be chosen freely! (457 of + 1840, to be exact.) In contrast, in palindrome programs, for + example, half of the characters can be chosen freely. + + - I did not cheat by using comments or -D options - something + I've seen even some palindrome programs do. In fact, at my first + attempt at writing the program I became convinced that it + isn't possible without cheating. But then I found out that with + comments or defines, it would become trivial, so I had to try + harder... + + - If you don't believe the constraints are hard, try to write just + one single line which satisfies them. (To be able to make one + function call, for example, you have to fill an entire line with + stuff doing mostly nothing.) + + - Just in case this is not enough: Yes, the code itself is + obfuscated: It's (almost) only one big expression, with deep + nesting of () and ?:, and full of unnecessary operations which + do not really help making it readable. And it contains a lot of + "magic numbers". (My favourite is the "7" in line 15 (each + one). Which is the other digit I could have put there instead, + and what other changes to the program would have been necessary? + Without violating the constraints of course.) + + - The fact that the main loop of the program calls "main" + recursively is nothing new. New however is that this program + only needs a logarithmic recursion depth! (Find out how this + works.) + + - When still in doubt about how to judge this program, type + + ./herrmann2 < herrmann2.cup + + and let the result inspire you. ;-) + + + + Requirements to the compiler / Compatibility + ============================================ + + - I fear that gcc is the only compiler for which this program + works. Due to the severe restrictions, I was forced to use + declarations of int variables, functions and parameters without + specifying their type. The biggest problem was to put "int + main(int c, char ** v){" into the program. After some time, I + became convinced that this is impossible. Finally, at least I + managed to squeeze "main(c, v){" into the constraints instead. + + - Also, a lot of warnings are produced - most of them "data + definition has no type or storage class", but also some + "parameter names (without types) in function declaration" and + "assignment from incompatible pointer type". I wasn't able to + get rid of them. + + - At least, it probably works with all sufficiently recent + versions of gcc. I tested it with versions 2.7.2.1, 2.8.1, + 2.95.2, and ecgs-2.91.66. + + - Of course I couldn't put "#include"-lines at the beginning of + the program. Usually, this is not really necessary with + gcc. However, for this program it would have been, because some + functions appear as function pointers, and as such they are not + generated implicitly. So the build script has to pass "-include + ..." to gcc. A problem with this is that the complete path of + the include files has to be provided. In the build script, I + assume that the path is /usr/include, but this can easily be + adapted. + + diff --git a/2001/herrmann2.ioccc b/2001/herrmann2.ioccc new file mode 100644 index 000000000..5ac3c98a9 --- /dev/null +++ b/2001/herrmann2.ioccc @@ -0,0 +1,23 @@ +nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnlllllllllllnnnnnnnnnnnllllllllllllnnnnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnlllllllllllnnnnnnnnnllllllllllllllllnnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnlllllnnnnnnnnnnnllllllnnnnnnllllllnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnlllllnnnnnnnnnnnlllllnnnnnnnnlllllnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnlllllnnnnnnnnnnnlllllnnnnnnnnlllllnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnlllllnnnnnnnnnnnlllllnnnnnnnnlllllnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnlllllnnnnnnnnnnnlllllnnnnnnnnlllllnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnlllllnnnnnnnnnnnllllllnnnnnnllllllnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnlllllllllllnnnnnnnnnllllllllllllllllnnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnlllllllllllnnnnnnnnnnnllllllllllllnnnnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnnnnllllllllllnnnnnnnnnnllllllllllnnnnnnnnnnllllllllllnnnnn +nnnnnnnnnnnnnnnnnnnnnnllllllllllllnnnnnnnnllllllllllllnnnnnnnnllllllllllllnnnnn +nnnnnnnnnnnnnnnnnnnnnllllllnnnnnnnnnnnnnnllllllnnnnnnnnnnnnnnllllllnnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnlllllnnnnnnnnnnnnnnnlllllnnnnnnnnnnnnnnnlllllnnnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnlllllnnnnnnnnnnnnnnnlllllnnnnnnnnnnnnnnnlllllnnnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnlllllnnnnnnnnnnnnnnnlllllnnnnnnnnnnnnnnnlllllnnnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnlllllnnnnnnnnnnnnnnnlllllnnnnnnnnnnnnnnnlllllnnnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnllllllnnnnnnnnnnnnnnllllllnnnnnnnnnnnnnnllllllnnnnnnnnnnnn +nnnnnnnnnnnnnnnnnnnnnnllllllllllllnnnnnnnnllllllllllllnnnnnnnnllllllllllllnnnnn +nnnnnnnnnnnnnnnnnnnnnnnnllllllllllnnnnnnnnnnllllllllllnnnnnnnnnnllllllllllnnnnn +nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn diff --git a/2001/jason.c b/2001/jason.c new file mode 100644 index 000000000..1382731b8 --- /dev/null +++ b/2001/jason.c @@ -0,0 +1,184 @@ +#include +#include +#include + +#define __ "Y\n : ! ,.?>" +#define D(f) ; } int f(int i) { return +#define E(a,b,c,d,e) b##d,c,e,a +#define e(a,b,c,d) a##b##c##d +#define B *p++ - ' ' || !p++ +#define _(k) o(*#k - 64) +#define G(g,l,k,o,e,d,n,c,i,b,a,f,j,m,p) \ +a#b#c#d#e#f#g#a#i#j#k#l#m#n#o e,i l##c,m##b; d g j n h(k 30:1); o p f} + + G(E(f ( 9) -s + ? -s + 'q' + ? f( 5 ) -s &&'d' - + s?U( 3 ) ||_(J) + :A ( s- f( 5 )) + :(c= 4 * + 4): + + g(0)D( + + V)c <= 3 *4 + 3&&c && V(X ( i) ) ; + } + + int , time ( 0)& , c - 15 || P + + (1 + +):0, + & ( !!d ( 0 ) + ||(a=! _(S)) ,b= 0 )|| + a + ?d(a = 0) + ? _ +(I): w ( j =!W(j=_ (V ))) , + + l(_ + (Y+ s ) ) + )e + + ( + main(){; + ;;;s , ra, + n, d), && C ( j +R( s-j+t( i- 1) ) + )D( W)m[ c* 4| z( j ) ] + &&_( X )E (d ( 0 + )&& R( 6)/ 6 + ? c= 17|_ ( T ) + :01,||+ + , v =i & 3 ^ 2 + ,+j & 3&&W ( j)||y ( 10 )D (k) -- + j ? k ( O[j]=R(15 )) +: 1 D + ( H )o ( 7+! ! i+3 )+ + + i? + + c=i /4 & 63, + a= 1 + +:0) + + D ( f )( p =M ,q ( i),*p+86) + D ( l) * f, B? + + B ?B ?B? B ?B ?B + ?7 :B?B ?36: 59 * 89 *5 * 2 :B?6587 + *77 :9 + 2:B ?B?B?9: 5 : 37 : B ? 5 +5:4:20: + B?B?B?32 + + :e( 4, 3 , 1 *4 * 59 * 1 , 7):B? + 17: 34 : 19 :B ? + 8 *2 :B ? + 2:26: B? + B?B ?B ? + + 82 *+ 576: B ?33 :22 :5 * 5:3 *4 :3:B ?B ?B? B ?6 + + + 17 : B?B?13:6 : 9 *2:B?15 : 7 *2 : + + B ? + B ? + 27:24: 31 : B? + + + B? + 29 :, + m [a^ 2 ] =T( 8 * 7) ;j= 3 + ; + ; + Q, ;int + P ( int + i ) + + {time_t(x ) =+ 0+ + time(0) ; j=E( u (i ) : i D(R )e(r , + a ,n ,d) ()% i+1, ( e( l , o, + caltim , e ) (& x)) ->e( tm_h , o, u , r) + ;retur , i?_( W +): _( U) D(Y) *p&& *p<3 * 11 ? + ( ++ p ), n j= + 34 +( j< 6 + ||j>19 ),Y (i) +: *p + + D ( F) i == 9 ?1 : + F( (i+ 7)% ( 7 + 3) ) +!O[ i + ]D(u) *p &&* p -32? p ++) + D (h ) i ?*++*S=i% ( 38)- 1, + D ( A )! n?i&&!g ( (0 ) ) ||K ( j=4| ! !i ) : N(!i )D( + Q)++j< + + (s ) &&Q ( t( i)^i ) + D( U )i>= 0 ?U( i- 1 )||~f (i+1 ) == ~ s + &&H (m[c* 4 |z(i)] ) +:0;D + + + ( X) + b && b<, for (*S = M ; * +p; ), + + gets ( L, + 98 , stdin ) ? + p= L, E (r( 0 ): 0 ,h( i / 38 ) : 0;D( C)! + ( m[j]+m [a= i] ) ?m[j[m]= i]=j:0;D (d) ! + b+(* O- + c)* + * O; D (z ) + + + -~- ~ -~i + + v + & 3 D(y)( putchar ) ( i) + D ( q ) i& ,!(O[j = i] + || _ ( O))+a :0; + D (w)O[ j] ==c && o + + (( !i ++ ? ! !_ (M + +): + + 0) +15)|| ++ j<9 &&w ( +i)D ( r )*p? *p -4? + * p -6 ? + y(*p <9 + 2?__[ + * p +]: * p+ 7 +79):o( j+1) : o (26+j),&q ( -! + * p ++ + i )D(x)i? a=x ( ( -- i)), ++ p ) + D( t ) i, | C((j=i* + T(i-4 )) +R + (3 ) + 4 ) + D(J) !j --E( 0 D ( K )!-!N, || i &, + _( R ) :i* c== (O + [ j ] ) &&n==f (j+ 6 + 5 * 4)?O + [j]= !i * c-_ ( L) :J(i ) + D ( N ) j=9, & d(0 )? j= 6 | ! i , J(i )D + ( o)(*S = p , ++ S,p = M , r (q (i) ),-- S, p = *S)) + ( (l (_ (Q )),n =s,i ^5 ) ) ;, E(j , + sign , v ,ed ( b ) ;; + int c =1 ,O[9]) + ;int( s +)= + E (n ;char, 1 ,a,6 ,o ())* Z[ + E(M [37 * 9 *3 ] ,0,L [ 99] ,3] , * *S=Z ) ; + E (*p=+1 ,char( m)[6 , co , 4 ],ol) + +, + V ( v=*O = k( j= 9 )) ; + return ! c&& - ~ ~ - -! printf + ( ( "%d \n") , F (P ( 0) +6) *50 + ! ! b* + ( +b - (int)time ( 0 )) ) +;, ( b= 60 + time ( 0)+ 60 * 4) ;, n =Y + (u (s =Y (i) ) ) + + : (exit( 0) + ,i)D( g )x ( _(N) ^ 9)? !( a =0) : _ ( P )D (T)! i|, + (2); s=35; Q(3); + + s=59; Q(6); + + + a=1; + + + + + ) diff --git a/2001/jason.hint b/2001/jason.hint new file mode 100644 index 000000000..b0f736fbb --- /dev/null +++ b/2001/jason.hint @@ -0,0 +1,122 @@ +Best Of Show: + + Jason Orendorff + 5 Buchanan St. + Nashua, NH 03060 + USA + + http://www.jorendorff.com/ + + +Judge's Remarks: + + To build: + + make jason + + Try: + + ./jason + + You are in a maze of twisty little passages, all alike. + + The really amazing part of this is tha it's a text adventure, and there's + not a single word in the source that isn't a C keyword or function name, + being used as such. + + The interface isn't very tolerant of errors, but you can't really + expect that from something this small. + + Of particular interest: Go ahead, run it through the preprocessor. You + *still* won't see the words that are used in the game. + + +Selected Author's Comments: + + TED shroyer came up with the idea that made it possible to hide all + the text. Thanks, TED. You won. :) + + + $ cc -o prog prog.c + $ ./prog + you are in a maze of twisty little passages + caves lead: left forward back + you see + a lamp + > _ + + This program is a rather nostalgic little labyrinth game. Start + out by typing "get lamp", then use the direction words "left", + "right", "forward", and "back" to explore the caves. Note that + these words can refer to different passages depending on which way + you're facing. "back" always takes you back the way you came. + Type "quit" to quit. + + The maze is randomly generated each time you play. The algorithm + ensures that you start at least 6 hops away from the exit. All + passages are two-way. + + (There is a trick, well-known among adventure game fans, to + keeping one's bearings in games like this. Unless you know the + trick, it can be very difficult to find your way around. Try it + out first; I'll give away the secret at the bottom of this + document.) + + The goal is to collect 8 treasures (plus the lamp) and escape into + the sunlight - or moonlight, as the case may be. After a few + minutes, the lamp runs out of oil, and things become perilous. + + If you manage to escape, you score 50 points for your hide, 50 + points per item, and bonus points for speed. + + Why I think this program is obfuscated: + + * 70% more # symbols than the average entry. + + * Where are all the messages? The game is downright chatty for + only having two string literals ("%d \n" and "Y\n : ! ,.?>"). + + * There is exactly one loop in the program, a for loop, and it is + clearly the product of a deranged mind. Running the + preprocessor only makes it worse. + + * Microsoft Visual C++ won't even compile this program, even + though it is plain ANSI C (*innocent look*) and limits itself to + the most standard and portable of the standard library + facilities. + + * Most of the whitespace is significant, so attempts to + beautify it can easily lead to segmentation faults. + + * Attempts to replace the one-character identifiers with longer, + more meaningful names will likewise cause problems. In fact, + simply changing all the Y's to Z's and vice versa results in + some unexpected side effects. + + When all warnings are enabled, some compilers express the desire + to see a few more parentheses. I respectfully submit that there are + plenty of parentheses in the program (370 in all.) Besides, any + more would put me over the size limit. gcc also generates a + warning about some calculations not being used. Having just spent + 19 hours staring at this program, sweating over every character, I + swear gcc is wrong. + + The program is formatted as a poem, to make it more readable. + I find the plaintive chorus "B? B?" particularly poignant. + Also, smiley faces are formatted flush left. (If you don't find + the game entertaining, see if you can find + + the fish scales Q)++j< + the shooting star -~- ~ -~i + + + in the source code.) + + + + + + + + [GAME STRATEGY SPOILER: The trick, of course, is to drop items in + empty rooms to mark them. That way you usually know if you're in a + room you've seen before. It greatly aids mapping.] diff --git a/2001/kev.c b/2001/kev.c new file mode 100644 index 000000000..b3c967311 --- /dev/null +++ b/2001/kev.c @@ -0,0 +1,121 @@ +#include +#include +#include +#include +#include +#include + +#define o0(M,W) mvprintw(W,M?M-1:M,"%s%s ",M?" ":"",_) +#define O0(M,W) M##M=(M+=W##M)-W##M +#define l1(M,W) M.tv_##W##sec +#define L1(m,M,l,L,o,O) for(L=l;L--;)((char*)(m))[o]=((char*)(M))[O] +#define I1 lL,(struct sockaddr*)&il +#define i1 COLS +#define j LINES +#define L_ ((j%2)?j:j-1) + +fd_set I;struct socka\ +ddr_in il;struct host\ +ent*LI; struct timeval +IL,l;char L[9],_[1<<9] + ;void ___(int __ + ){_[__--]=+0;if( + ++__)___(--__);_ + [__]='=';}double + o,oo=+0,Oo=+0.2; + long O,OO=0,oO=1 + ,ii,iI,Ii,Ll,lL, + II=sizeof(il),Il + ,ll,LL=0,i=0,li, + lI;int main(int\ + iL,char *Li[]){\ + initscr();cbreak + ();noecho();nonl + ();___(lI=i1/4); + _[0]='[';_[lI-1] + =']';L1(&il,&_,\ + II,O,+O,+lI);il. + sin_port=htons(( + unsigned long)(\ + PORT&0xffff));lL + =l_;if(iL=!--iL) + {il. sin_addr .\ + s_addr=0;bind(I1 + ,II);listen(lL,5 + );lL=accept(I1,& + II);}else{oO-=2; + LI=gethostbyname + (Li[1]);L1(&(il. + sin_addr),(*LI). + h_addr_list[0],\ + LI->h_length,iI, + iI,iI);(*(&il)). + sin_family=(&(*\ + LI))->h_addrtype + ;connect(I1,II); + }ii=Ii=(o=i1*0.5 + )-lI/2;iI=L_-1;O + =li=L_*0.5;while + (_){mvaddch(+OO, + oo,' ');o0(ii,iI + );o0(Ii,Il-=Il); + mvprintw(li-1,Il + ,"%d\n\n%d",i,LL + );mvhline(li,+0, + '-',i1);mvaddch( + O,o,'*');move(li + ,Il);refresh();\ + timeout(+SPEED); + gettimeofday(&IL + ,+0);Ll=getch(); + timeout(0);while + (getch()!=ERR);\ + if(Ll=='q'&&iL)\ + write(lL,_+1,1); + if(ii>(ll=0)&&Ll + ==','){write(lL, + _,-(--Il));}else + if(Ll=='.'&&ii+\ + lIi1){o=i1+i1-o + ;Oo*=-1;}if(o>=( + Ii+=ll)&&O<1&&oO + <0&&o= + (ii+=Il)&&O>iI-1 +&&oO>0&&o+iI){O-=O;i++; +}}endwin();return(0);} + diff --git a/2001/kev.hint b/2001/kev.hint new file mode 100644 index 000000000..f44a69246 --- /dev/null +++ b/2001/kev.hint @@ -0,0 +1,195 @@ +Best Curses Game: + + Kevin Pulo + School of Information Technologies + Madsen Building F09 + University of Sydney, NSW, 2006 + Australia + + http://www.kev.pulo.com.au/ + + +Judge's Remarks: + + To build: + + make kev + + Try: + + ./kev + + and then in another window, + + ./kev localhost + + Continuing with this year's "retro game" theme, this is another old game; + arguably, one of the oldest. Requires a functioning network, and curses. + + The graphics aren't the impressive part; the graphics and network are. + How many games come out at $50 and still require you to wait for a patch + to come out before you can play multiplayer? This one works out of the + box. + + +Selected Author's Comments: + + NETWORK P*NG! + [=================] + + Kevin Pulo + kev@pulo.com.au + + + REQUIREMENTS + ------------ + + * TCP sockets + * curses + * usleep + + + DESCRIPTION + ----------- + + This program is a two-player networked version of the eighties + arcade classic, "pong". It uses standard TCP sockets to + communicate over the net, and ncurses for display. It supports + variable terminal sizes (though both players must have the same + terminal size) and game speeds. Each player has a paddle to hit + the ball, and you get points for getting the ball past your + opponent's paddle. It's pretty fun! :) + + + RUNNING + ------- + + Run the server first without any command line arguments, ie. + + ./kev + + Then run the client with a single command line argument which is + the name of the machine running the server, eg. + + ./kev localhost + + Make sure that the terminals on both ends are the same size. + Also, the TCP port number specified in the build file mustn't be + blocked by a firewall. + + Here's a good quick example to see it in action on your own + machine, assuming you have Xwindows: + + xterm -geometry 80x40 -fg green -bg black -fn 9x15bold -e ./kev & + xterm -geometry 80x40 -fg green -bg black -fn 9x15bold -e ./kev localhost& + + + PLAYING + ------- + + Your paddle is the one at the bottom of the screen, your opponent + is at the top. To move your paddle left, hold down ',' (ie. '<' + but don't press shift). To move your paddle right, hold down '.'. + To quit, either player may press 'q'. + + The current score is shown on the left side of the halfway line. + Your score is the lower number, your opponents score is the upper + number. Your score is the number of times your opponent has + missed the ball. + + You can control the speed of the ball by the motion of your paddle + when the ball hits it. If your paddle is still, then the ball + just bounces normally off it. If your paddle is moving in the + same direction as the ball, then the ball's speed in that + direction will increase. If your paddle is moving in the opposite + direction to the ball, then the ball's speed in that direction + will decrease (or if the ball is going slowly enough, it'll turn + around). + + You might want to increase your keyboard repeat rate before + playing. On the Linux console try "kbdrate -r 24.0 -d 250" + (kbdrate might be "hidden" from normal users in /sbin, and you + might need to be root anyway), in Xwindows try "xset r rate 250 + 24" (find out your current rate first with "xset q", so that you + can reset it later). + + Look below in the Building section for info on how to speed up or + slow down the game (useful if your increase or decrease the + terminal size). + + + BUILDING + -------- + + Just run the Makefile as above. The "SPEED" variable in the Makefile + controls the speed of the game (defaults to 50). This speed is + the delay between frames in milliseconds. Thus a value of 0 will + make the game go as fast as your network can handle, and values + less than 50 are useful for larger terminals or more exciting + games. The program needs bandwidth equal to 1/s bytes per second + (where "s" is the speed value). Any latency on the network will + be added to s - so you should probably subtract any latency from + the value of s you want to have. Given that loopback and fast + Ethernet LANs are both much less than 1ms of latency, you should + only need to worry about this if you plan on playing over a slower + link like a cable modem, DSL, or (God-forbid) dialup. + + The TCP port to use for network communications is specified by the + "PORT" variable in the Makefile. If the default of 5455 is + blocked for whatever reason, you can change it to something else. + Of course if you use a port < 1024, you'll need to be root. + + + OBFUSCATION + ----------- + + The program's broad structure is fairly straightforward, but + individual tasks are rarely done in a straightforward manner. ;) + + Identifier names have mostly been chosen to resemble paddles and + balls, and to generally decrease readability. + + The source has been cleverly formatted to resemble one of the + paddles from the game, rotated 90 degrees. ;) (The "source + paddle" has approximately the same aspect ratio as the game at 80 + columns wide, which is 1:10.) + + Finally, the number of "non-whitespace characters" (as defined by + the rules) in the file is exactly 2048, which I think is rather + unexpectedly cool. :) + + + BUGS + ---- + + There are 3 warnings when I compile with gcc 2.95.3 (-Wall -ansi + -pedantic) on my Linux system, but all are completely harmless. + + I don't like the curses and/or termcaps/terminfos on IRIX and + Solaris (the only two non-Linux systems I have access to). + Despite calling timeout(0), notimeout(win, TRUE), nodelay(win, + TRUE) and/or keypad(win, FALSE), it still seems to force a delay + into calls to getch() - I'm guessing at a termcap/terminfo level. + At any rate, I can't seem to force no delay. This is a shame, + because it basically plays havoc with the input code, particularly + the read-ahead canceller. It still works, but not nearly as well + (keypresses are dodgey and holding down keys doesn't always work), + and so I _much_ prefer and recommend Linux libncurses. + + Sometimes when 'q' is pressed in one, the other will crash out + with "Broken pipe". + + If the specified port can't be bound or connected to, the program + segfaults. + + If your terminal is too wide (we're talking gigantic here - over + 500 characters wide) then the program can segfault. It's also + possible to crash the program a player scores over a billion + points (1e9). Maybe you can consider that the goal... ;) + + If you run the client and server on different architectures, both + architectures need to have the same character systems (ie. don't + try mixing ASCII and EBCDIC). It is independent of endianness + though. + + diff --git a/2001/mkentry.c b/2001/mkentry.c new file mode 100644 index 000000000..5842012d3 --- /dev/null +++ b/2001/mkentry.c @@ -0,0 +1,1301 @@ +/* $Id: mkentry.c,v 1.48 2001/10/01 01:03:40 chongo Exp $ */ +/* + * Copyright (c) Leonid A. Broukhis, Simon Cooper, Landon Curt Noll and + * Peter Seebach, 2001. + * + * All Rights Reserved. Permission for personal, education or non-profit use + * is granted provided this this copyright and notice are included in its + * entirety and remains unaltered. All other uses must receive prior + * permission in writing from the contest judges. + */ +/* + * mkentry - make an International Obfuscated C Code Contest entry + * + * usage: + * mkentry -r remarks -b build -p prog.c -o ioccc.entry + * + * -r remarks file with remarks about the entry + * -b build file containing how prog.c should be built + * -p prog.c the obfuscated program source file + * -o ioccc.entry ioccc entry output file + * + * compile by: + * cc mkentry.c -o mkentry + */ +/* + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* + * WARNING: + * + * This program attempts to implement the IOCCC rules. Every attempt + * has been made to make sure that this program produces an entry that + * conforms to the contest rules. In all cases, where this program + * differs from the contest rules, the contest rules will be used. Be + * sure to check with the contest rules before submitting an entry. + * + * FOR MORE INFORMATION: + * + * You may contact the judges by sending EMail to the following address: + * + * questions@ioccc.org (not the address for submitting entries) + * + * Questions and comments about the contest are welcome. + * + * NOTE: You must include the words ``ioccc question'' in the + * subject of your EMail message when sending EMail to the judges. + * + * Entries must be sent to: + * + * entry@ioccc.org + * + * but be sure to follow the rules and read the guidelines first! + * + * NOTE: You must include the words ``ioccc entry'' in the subject + * of your EMail when sending in your entry! + * + * The rules and the guidelines may (and often do) change from year to + * year. You should be sure you have the current rules and guidelines + * prior to submitting entries. To obtain them, visit the following URL: + * + * http://www.ioccc.org + * + * Because contest rules change from year to year, one should only use this + * program for the year that it was intended. + */ + +#include +#include +#include +#include +#include +#include +#include + +/* logic */ +#ifndef TRUE +# define TRUE 1 +#endif /* TRUE */ +#ifndef FALSE +# define FALSE 0 +#endif /* FALSE */ +#define EOF_OK TRUE +#define EOF_NOT_OK FALSE + +/* global limits */ +#define RULE_YEAR 2001 /* NOTE: should match the current year */ +#define START_DATE "01Oct2001 00:00 UTC" /* first confirmation received */ +#define MAX_COL 79 /* max column a line should hit */ +#define MAX_BUILD_SIZE 521 /* max how to build size */ +#define MAX_PROGRAM_SIZE 4096 /* max program source size */ +#define MAX_PROGRAM_SIZE2 2048 /* max program source size not counting + whitespace and {}; not followed by + whitespace or EOF */ +#define MAX_TITLE_LEN 31 /* max chars in the title */ +#define MAX_ENTRY_LEN 1 /* max length in the entry input line */ +#define MAX_ENTRY 8 /* max number of entries per person per year */ +#define MAX_FILE_LEN 1024 /* max filename length for a info file */ + +/* where to send entries */ +#define ENTRY_ADDR "entry@ioccc.org" + +/* uuencode process - assumes ASCII */ +#define UUENCODE(c) ((c) ? encode_str[(int)(c)&0x3f] : '`') +#define UUENCODE_LEN 45 /* max uuencode chunk size */ +#define UUINFO_MODE 0444 /* mode of an info file's uuencode file */ +#define UUBUILD_MODE 0444 /* mode of the build file's uuencode file */ +#define UUBUILD_NAME "build" /* name for the build file's uuencode file */ +#define UUPROG_MODE 0444 /* mode of the program's uuencode file */ +#define UUPROG_NAME "prog.c" /* name for the program's uuencode file */ + +/* encode_str[(char)val] is the uuencoded character of val */ +char encode_str[] = "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"; + +/* global declarations */ +char *program; /* our name */ +long start_time; /* the startup time */ + +/* forward declarations */ +void parse_args(int argc, char **argv, char **rname, + char **bname, char **pname, char **oname); +void usage(int exitval); +FILE *open_remark(char *filename); +FILE *open_build(char *filename); +FILE *open_program(char *filename); +FILE *open_output(char *filename); +void output_entry(FILE *output, char *oname); +void output_remark(FILE *output, char *oname, FILE *remark, char *rname); +void output_author(FILE *output, char *oname); +void output_info(FILE *output, char *oname); +void output_build(FILE *output, char *oname, FILE *build, char *bname); +void output_program(FILE *output, char *oname, FILE *prog, char *pname); +void output_end(FILE *output, char *oname); +int get_line(char *buf, int siz, int maxcol); +void output_till_dot(FILE *output, char *oname, char *leader); +int col_len(char *string); +void check_io(FILE *stream, char *name, int eof_ok); +void uuencode(FILE *output, char *oname, FILE *infile, + char *iname, int umode, char *uname); + +int +main(argc, argv) + int argc; /* arg count */ + char **argv; /* the args */ +{ + FILE *remark=NULL; /* open remarks stream */ + FILE *build=NULL; /* open build file stream */ + FILE *prog=NULL; /* open program stream */ + FILE *output=NULL; /* open output stream */ + char *rname=NULL; /* file with remarks about the entry */ + char *bname=NULL; /* file containing how prog.c should be built */ + char *pname=NULL; /* the obfuscated program source file */ + char *oname=NULL; /* ioccc entry output file */ + struct tm *tm; /* startup time structure */ + + /* + * check on the year + */ + start_time = time((long *)0); + tm = gmtime(&start_time); + if (tm->tm_year != RULE_YEAR-1900 && + (tm->tm_year != RULE_YEAR-1900+1 || tm->tm_mon != 0)) { + fprintf(stderr, + "%s: WARNING: this program applies to %d, which may differ from %d\n\n", + argv[0], RULE_YEAR, 1900+tm->tm_year); + } + + /* + * parse the command line args + */ + parse_args(argc, argv, &rname, &bname, &pname, &oname); + + /* + * open/check the input and output files + * + * We open and truncate the output file first, in case it is the same + * as one of the input files. + */ + output = open_output(oname); + remark = open_remark(rname); + build = open_build(bname); + prog = open_program(pname); + if (output==NULL || remark==NULL || build==NULL || prog==NULL) { + exit(1); + } + + /* + * output each section + */ + output_entry(output, oname); + output_remark(output, oname, remark, rname); + output_author(output, oname); + output_info(output, oname); + output_build(output, oname, build, bname); + output_program(output, oname, prog, pname); + output_end(output, oname); + + /* + * flush the output + */ + if (fflush(output) == EOF) { + fprintf(stderr, "%s: flush error in %s: ", program, oname); + perror(""); + exit(2); + } + + /* + * final words + */ + printf("\nYour entry can be found in %s. You should check this file\n", + oname); + printf("correct any problems and verify that the uudecode utility will\n"); + printf("correctly decode your build file and program.\n\n"); + printf("This program has been provided as a guide for submitters. In\n"); + printf("cases where it conflicts with the rules, the rules shall apply.\n"); + printf("It is your responsibility to ensure that your entry conforms to\n"); + printf("the current rules.\n\n"); + printf("EMail your entries to:\n"); + printf("\t%s\n\n", ENTRY_ADDR); + printf("IMPORTANT NOTE: You must include the words:\n"); + printf("\tioccc entry\n\n"); + printf("in the subject of your EMail when sending in your entry!\n"); + printf("Failure to do so may result in the loss of your entry!\n"); + /* all done */ + return 0; +} + +/* + * parse_args - parse the command line args + * + * usage: + * argc arg count + * argv the args + * rname file with remarks about the entry + * bname file containing how prog.c should be built + * pname the obfuscated program source file + * oname ioccc entry output file + * + * Given the command line args, this function parses them and sets the + * required name flags. This function will return only if the command + * line syntax is correct. + */ +void +parse_args(int argc, char **argv, char **rname, + char **bname, char **pname, char **oname) +{ + char *optarg; /* -flag option operand */ + int flagname; /* the name of the -flag */ + int i; + + /* + * Not everyone has getopt, so we must parse args by hand. + */ + program = argv[0]; + for (i=1; i < argc; ++i) { + + /* determine the flagname */ + if (argv[i][0] != '-') { + usage(1); + /*NOTREACHED*/ + } + flagname = (int)argv[i][1]; + + /* determine the flag's operand */ + if (flagname != '\0' && argv[i][2] != '\0') { + optarg = &argv[i][2]; + } else { + if (i+1 >= argc) { + usage(2); + /*NOTREACHED*/ + } else { + optarg = argv[++i]; + } + } + + /* save the flag's operand in the correct global variable */ + switch (flagname) { + case 'r': + *rname = optarg; + break; + case 'b': + *bname = optarg; + break; + case 'p': + *pname = optarg; + break; + case 'o': + *oname = optarg; + break; + default: + usage(3); + /*NOTREACHED*/ + } + } + + /* + * verify that we have all of the required flags + */ + if (*rname == NULL || *bname == NULL || *pname == NULL || *oname == NULL) { + usage(4); + /*NOTREACHED*/ + } + return; +} + +/* + * usage - print a usage message and exit + * + * usage: + * exitval exit with this value + * + * This function does not return. + */ +void +usage(int exitval) +{ + fprintf(stderr, + "usage: %s -r remarks -b build -p prog.c -o ioccc.entry\n\n", program); + fprintf(stderr, "\t-r remarks\tfile with remarks about the entry\n"); + fprintf(stderr, "\t-b build\tfile containing how prog.c should be built\n"); + fprintf(stderr, "\t-p prog.c\tthe obfuscated program source file\n"); + fprintf(stderr, "\t-o ioccc.entry\tioccc entry output file\n"); + exit(exitval); +} + +/* + * open_remark - open/check the remark file + * + * usage: + * filename remark filename + * + * The remark file should be indented by 4 spaces, and should not extend + * beyond column MAX_COL. These are not requirements, so we only warn. + * + * This function returns NULL on I/O or format error. + */ +FILE * +open_remark(char *filename) +{ + FILE *stream; /* the opened file stream */ + char buf[BUFSIZ+1]; /* input buffer */ + int toolong=0; /* number of lines that are too long */ + int non_indent=0; /* number of lines not indented by 4 spaces */ + + /* + * open the remark input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open remark file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * look at each line + */ + while (fgets(buf, BUFSIZ, stream) != NULL) { + + /* count lines that do not start with 4 spaces */ + if (buf[0] != '\n' && strncmp(buf, " ", 4) != 0) { + ++non_indent; + } + + /* count long lines */ + if (col_len(buf) > MAX_COL) { + /* found a line that is too long */ + ++toolong; + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* note long lines if needed */ + if (toolong > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s extend beyond the 80th column\n", + program, toolong, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* note non-indented lines, if needed */ + if (non_indent > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s are not indented by 4 spaces\n", + program, non_indent, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_build - open/check the build file + * + * usage: + * filename build filename + * + * The how to build file must not be longer than MAX_BUILD_SIZE bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_build(char *filename) +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + + /* + * open the how to build input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_BUILD_SIZE) { + fprintf(stderr, + "%s: FATAL: the how to build file: %s, is %ld bytes long\n", + program, filename, (long) statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_BUILD_SIZE); + return(NULL); + } + + /* return the open file */ + return(stream); +} + +/* + * open_program - open/check the program source file + * + * usage: + * filename source filename + * + * The program source file must be <= 3217 bytes. The number of + * non-whitespace and }{; chars not followed by whitespace must + * be <= 1536 bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_program(char *filename) +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + int count; /* special count size */ + int c; /* the character read */ + int control_m; /* 1 ==> warn about trailing ^M's */ + + /* + * open the program source input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open program source file: %s: ", + program, filename); + perror(""); + exit(7); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat program source file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_PROGRAM_SIZE) { + fprintf(stderr, + "%s: FATAL: the program source file: %s, is %ld bytes long\n", + program, filename, (long) statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_PROGRAM_SIZE); + return(NULL); + } + + /* + * count the non-whitespace, non {}; followed by whitespace chars + */ + control_m = 0; + count = 0; + c = 0; + while ((c=fgetc(stream)) != EOF) { + + /* look at non-whitespace */ + if (isascii(c) && !isspace(c) && c != '\r') { + switch (c) { + case '{': /* count if not followed by EOF or whitespace */ + case '}': + case ';': + /* peek at next char */ + c = fgetc(stream); + if (c != EOF && isascii(c) && !isspace(c) && c != '\r') { + /* not followed by whitespace or EOF, count it */ + ungetc(c, stream); + ++count; + } + break; + default: + ++count; + break; + } + + /* look for trailing ^M's */ + } else if (c == '\r') { + /* peek at next char */ + c = fgetc(stream); + if (c != EOF && c == '\n') { + control_m = 1; + } + /* put the peeking char back */ + ungetc(c, stream); + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* look at the special size */ + if (count > MAX_PROGRAM_SIZE2) { + fprintf(stderr, + "%s: FATAL: the number of bytes that are non-whitespace, and\n", + program); + fprintf(stderr, + "%s: that are not '{', '}', ';' followed by whitespace\n", + program); + fprintf(stderr, + "%s: or EOF must be <= %d bytes\n", + program, MAX_PROGRAM_SIZE2); + fprintf(stderr, + "%s: in %s, %d bytes were found\n", + program, filename, count); + return(NULL); + } + + /* warn about trailing ^M's */ + if (control_m) { + fprintf(stderr, + "\nWARNING: Trailing Control-M's (\\r or \\015) found.\n" + "\t If these chars result in a compilation failure,\n" + "\t your entry may be rejected\n\n"); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_output - open/check the entry output file + * + * usage: + * filename output filename + * + * This function returns NULL on open error. + */ +FILE * +open_output(char *filename) +{ + FILE *stream; /* the opened file stream */ + + /* + * open the ioccc entry output file + */ + stream = fopen(filename, "w"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open ioccc entry file for output: %s: ", + program, filename); + perror(""); + exit(8); + } + + /* return the open file */ + return(stream); +} + +/* + * output_entry - output the ---entry--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_entry(FILE *output, char *oname) +{ + char title[MAX_TITLE_LEN+1+1]; /* the entry's title */ + char buf[MAX_COL+1+1]; /* I/O buffer */ + int entry=0; /* entry number */ + int ret; /* fields processed by fscanf */ + int ok_line=0; /* 0 => the line is not ok */ + char skip; /* input to skip */ + time_t epoch_sec; /* seconds since the epoch */ + char *p; + + /* + * write the start of the section + */ + fprintf(output, "---entry---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the rule year + */ + fprintf(output, "rule:\t%d\n", RULE_YEAR); + check_io(output, oname, EOF_NOT_OK); + + /* determine if this is a fix */ + printf("Is this a fix, update or resubmittion to a "); + printf("previous entry (enter y or n)? "); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + if (buf[0] == 'y') { + fprintf(output, "fix:\ty\n"); + check_io(output, oname, EOF_NOT_OK); + printf("\nBe sure that the title and entry number that you give\n"); + printf("are the same of as the entry you are replacing\n"); + } else { + fprintf(output, "fix:\tn\n"); + check_io(output, oname, EOF_NOT_OK); + } + + /* + * write the title + */ + printf("\nThe first character of your title should match [a-zA-Z0-9_=]\n"); + printf("The next 0 to %d characters should match [a-zA-Z0-9_=+-]\n\n", + MAX_TITLE_LEN-1); + printf("It is suggested, but not required, that the title should\n"); + printf("incorporate your username; in the case of multiple authors,\n"); + printf("consider using parts of the usernames of the authors.\n\n"); + printf("enter your title: "); + do { + /* prompt and read a line */ + if ((ok_line = get_line(title, MAX_TITLE_LEN+1, MAX_COL-9)) <= 0) { + printf("\ntitle is too long, please re-enter: "); + continue; + } + + /* verify the pattern, not everyone has regexp, so do it by hand */ + if (!isascii((int)title[0]) || + !(isalnum((int)title[0]) || title[0] == '_' || title[0] == '=')) { + printf("\ninvalid first character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } else { + for (p=(&title[1]); *p != '\0' && *p != '\n'; ++p) { + if (!isascii((int)*p) || + !(isalnum((int)*p) || + *p == '_' || *p == '=' || *p == '+' || *p == '-')) { + printf("\ninvalid character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } + } + } + } while (ok_line <= 0); + fprintf(output, "title:\t%s", title); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the entry number + */ + printf("\nEach person may submit up to %d entries per year.\n\n", + MAX_ENTRY); + printf("enter an entry number from 0 to %d inclusive: ", MAX_ENTRY-1); + do { + /* get a valid input line */ + fflush(stdout); + ret = fscanf(stdin, "%d[\n]", &entry); + check_io(stdin, "stdin", EOF_NOT_OK); + /* skip over input until newline is found */ + do { + skip = fgetc(stdin); + check_io(stdin, "stdin", EOF_NOT_OK); + if (skip != '\n') { + /* bad text in input, invalidate entry number */ + entry = -1; + } + } while (skip != '\n'); + + /* check if we have a number, and if it is in range */ + if (ret != 1 || entry < 0 || entry > MAX_ENTRY-1) { + printf( + "\nThe entry number must be between 0 and %d inclusive\n\n", + MAX_ENTRY-1); + printf("enter the entry number: "); + } + } while (ret != 1 || entry < 0 || entry > MAX_ENTRY-1); + fprintf(output, "entry:\t%d\n", entry); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the submission date + */ + /* returns a newline */ + epoch_sec = time(NULL); + fprintf(output, "date:\t%s", asctime(gmtime(&epoch_sec))); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the OS/machine host information + */ + printf( + "\nEnter the machine(s) and OS(s) under which your entry was tested.\n"); + output_till_dot(output, oname, "host:"); +} + +/* + * output_remark - output the ---remark--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * remark stream to the file containing remark text + * rname name of the remark file + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_remark(FILE *output, char *oname, FILE *remark, char *rname) +{ + char buf[BUFSIZ+1]; /* input/output buffer */ + + /* + * write the start of the section + */ + fprintf(output, "---remark---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * copy the remark file to the section + */ + while (fgets(buf, BUFSIZ, remark) != NULL) { + fputs(buf, output); + check_io(output, oname, EOF_NOT_OK); + } + check_io(remark, rname, EOF_OK); + + /* be sure that the remark section ends with a newline */ + if (buf[strlen(buf)-1] != '\n') { + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + } +} + +/* + * output_author - output the ---author--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * + * Read the needed information from stdin, and write the author section. + * If multiple authors exist, multiple author sections will be written. + */ +void +output_author(FILE *output, char *oname) +{ + char buf[MAX_COL+1+1]; /* I/O buffer */ + int more_auths; /* TRUE => more authors to note */ + int auth_cnt=0; /* number of authors processed */ + + /* + * prompt the user for the author section + */ + printf("\nEnter information about each author. If your entry is after\n"); + printf("%s and before the contest deadline, the judges\n", START_DATE); + printf("will attempt to EMail back a confirmation to the first author\n"); + + /* + * place author information for each author in an individual section + */ + do { + + /* write the start of the section */ + fprintf(output, "---author---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* write the author */ + printf("\nAuthor #%d name: ", ++auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nname too long, please re-enter: "); + } + fprintf(output, "name:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the organization */ + printf("\nEnter the School/Company/Organization of author #%d\n", + auth_cnt); + printf("\nAuthor #%d org: ", auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter: "); + } + fprintf(output, "org:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the address */ + printf( + "\nEnter the postal address for author #%d. Be sure to include\n", + auth_cnt); + printf("your country and do not include your name.\n"); + output_till_dot(output, oname, "addr:"); + + /* write the EMail address */ + printf( + "\nEnter the EMail address for author #%d. Use an address from\n", + auth_cnt); + printf( + "a registered domain or well known site. If you give several\n"); + printf("forms, list them one per line.\n"); + output_till_dot(output, oname, "email:"); + + /* write the home page URL */ + printf( + "\nEnter the fully qualified home page URL for author #%d\n", + auth_cnt); + printf("including the http: part or just enter none: "); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0 || + (strncmp(buf, "http://", sizeof("http://")-1) != 0 && + strcmp(buf, "none\n") != 0)) { + printf("\nURL too long, does not begin with http:// or\n"); + printf("is not the word none\n"); + } + fprintf(output, "url:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the anonymous status */ + printf("\nShould author #%d remain anonymous (enter y or n)? ", + auth_cnt); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + fprintf(output, "anon:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* determine if there is another author */ + printf("\nIs there another author (enter y or n)? "); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + if (buf[0] == 'y') { + more_auths = TRUE; + } else { + more_auths = FALSE; + } + } while (more_auths == TRUE); + return; +} + +/* + * output_info - output the ---info--- section(s) + * + * usage: + * output entry's output file stream + * oname name of the output file + * + * Read the needed information from stdin, and write the info section. + * If multiple info files exist, multiple info sections will be written. + */ +void +output_info(FILE *output, char *oname) +{ + char infoname[MAX_FILE_LEN+1]; /* filename buffer */ + char yorn[1+1]; /* y or n answer */ + char *uuname; /* name to uuencode as */ + FILE *infile; /* info file stream */ + + /* + * prompt the user for info information + */ + printf("\nInfo files should be used only to supplement your entry.\n"); + printf("For example, info files may provide sample input or detailed\n"); + printf("information about your entry. Because they are supplemental,\n"); + printf("the entry should not require them to exist.\n\n"); + + /* + * while there is another info file to save, uuencode it + */ + printf("Do you have a info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + while (yorn[0] == 'y') { + + /* read the filename */ + printf("\nEnter the info filename: "); + while (get_line(infoname, MAX_FILE_LEN+1, 0) <= 0) { + printf("\nInfo filename too long, please re-enter: "); + } + + /* compute the basename of the info filename */ + /* remove the trailing newline */ + uuname = &infoname[strlen(infoname)-1]; + *uuname = '\0'; + /* avoid rindex/shrrchr compat issues, do it by hand */ + for (--uuname; uuname > infoname; --uuname) { + if (*uuname == '/') { + ++uuname; + break; + } + } + + /* attempt to open the info file */ + infile = fopen(infoname, "r"); + if (infile == NULL) { + fprintf(stderr, "\n%s: cannot open info file: %s: ", + program, infoname); + perror(""); + continue; + } + + /* + * write the start of the section + */ + fprintf(output, "---info---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* uuencode the info file */ + uuencode(output, oname, infile, infoname, UUINFO_MODE, uuname); + + printf("\nDo you have another info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + }; + return; +} + +/* + * output_build - output the ---build--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * build open build file stream + * bname name of the build file + * + * Read the needed information from stdin, and write the build section. + */ +void +output_build(FILE *output, char *oname, FILE *build, char *bname) +{ + /* + * write the start of the section + */ + fprintf(output, "---build---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, build, bname, UUBUILD_MODE, UUBUILD_NAME); + return; +} + +/* + * output_program - output the ---program--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * prog open program stream + * pname name of program file + * + * Read the needed information form stdin, and write the program section. + */ +void +output_program(FILE *output, char *oname, FILE *prog, char *pname) +{ + /* + * write the start of the section + */ + fprintf(output, "---program---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, prog, pname, UUPROG_MODE, UUPROG_NAME); + return; +} + +/* + * output_end - output the ---end--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * + * Read the needed information form stdin, and write the 'end section'. + */ +void +output_end(FILE *output, char *oname) +{ + /* + * write the final section terminator + */ + fprintf(output, "---end---\n"); + check_io(output, oname, EOF_NOT_OK); + return; +} + +/* + * get_line - get an answer from stdin + * + * usage: + * buf input buffer + * siz length of input, including the newline + * maxcol max col allowed, 0 => disable check + * + * This function will flush stdout, in case a prompt is pending, and + * read in the answer. + * + * This function returns 0 if the line is too long, of the length of the + * line (including the newline) of the line was ok. This function does + * not return if ERROR or EOF. + */ +int +get_line(char *buf, int siz, int maxcol) +{ + int length; /* the length of the input line */ + + /* flush terminal output */ + fflush(stdout); + + /* read the line */ + if (fgets(buf, siz+1, stdin) == NULL) { + /* report the problem */ + check_io(stdin, "stdin", EOF_NOT_OK); + } + + /* look for the newline */ + length = strlen(buf); + if (buf[length-1] != '\n') { + int eatchar; /* the char being eaten */ + + /* no newline found, line must be too long, eat the rest of the line */ + do { + eatchar = fgetc(stdin); + } while (eatchar != EOF && eatchar != '\n'); + check_io(stdin, "stdin", EOF_NOT_OK); + + /* report the situation */ + return 0; + } + + /* watch for long lines, if needed */ + if (maxcol > 0 && (length > maxcol || col_len(buf) > maxcol)) { + /* report the situation */ + return 0; + } + + /* return length */ + return length; +} + +/* + * output_till_dot - output a set of lines until '.' by itself is read + * + * usage: + * output entry's output file stream + * oname name of the output file + * leader the lead text for the first line + * + * This routine will read a set of lines until (but not including) + * a single line with '.' is read. The format of the output is: + * + * leader:\tfirst line + * \tnext line + * \tnext line + * ... + * + * This routine will not return if I/O error or EOF. + */ +void +output_till_dot(FILE *output, char *oname, char *leader) +{ + char buf[BUFSIZ+1]; /* input buffer */ + int count; /* lines read */ + int done=FALSE; /* TRUE => finished reading input */ + + /* instruct the user on how to input */ + printf("\nTo end input, enter a line with a single period.\n"); + + /* read lines until '.' or EOF */ + count = 0; + while (!done) { + /* issue the prompt */ + printf("%s\t", (count>0) ? "" : leader); + fflush(stdout); + + /* get the line */ + if (get_line(buf, BUFSIZ, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter:\n\t"); + continue; + } + + /* note if '.' was read */ + if (strcmp(buf, ".\n") == 0) { + done = TRUE; + } + + /* write line if we read something */ + if (!done) { + fprintf(output, "%s\t%s", (count++>0) ? "" : leader, buf); + check_io(output, oname, EOF_NOT_OK); + } + } + + /* if no lines read, at least output something */ + if (count <= 0) { + fprintf(output, "%s\t.\n", leader); + check_io(output, oname, EOF_NOT_OK); + } + return; +} + +/* + * col_len - determine the highest that a string would reach + * + * usage: + * string the string to examine + * + * Given a string, this routine returns that a string would reach + * if the string were printed at column 1. Tab stops are assumed + * to start at 9, 17, 25, 33, ... + */ +int +col_len(char *string) +{ + int col; /* current column */ + char *p; /* current char */ + + /* scan the string */ + for (col=0, p=string; *p != '\0' && *p != '\n'; ++p) { + /* note the column shift */ + col = (*p=='\t') ? 1+((col+8)/8*8) : col+1; + } + if (*p == '\n') { + --col; + } + + /* return the highest column */ + return col; +} + +/* + * check_io - check for EOF or I/O error on a stream + * + * usage: + * stream the stream to check + * name the name of this stream + * eof_ok EOF_OK or EOF_NOT_OK + * + * Does not return if EOF or I/O error. + */ +void +check_io(FILE *stream, char *name, int eof_ok) +{ + /* test for I/O error */ + if (ferror(stream)) { + fprintf(stderr, "%s: error on %s: ", program, name); + perror(""); + exit(1); + + /* test for EOF */ + } else if (eof_ok == EOF_NOT_OK && feof(stream)) { + fprintf(stderr, "%s: EOF on %s\n", program, name); + exit(1); + } + return; +} + +/* + * uuencode - uuencode a file + * + * usage: + * output output file stream + * oname output filename + * infile input file stream + * iname input filename + * umode the mode to put on the uuencode file + * uname name to put on the uuencode file + * + * Perform the uuencoding process identical to the process performed + * by the uuencode(1) utility. + * + * This routine implements the algorithm described in the uuencode(5) + * 4.3BSD Reno man page. + */ +void +uuencode(FILE *output, char *oname, FILE *infile, + char *iname, int umode, char *uname) +{ + char buf[UUENCODE_LEN+1]; /* the uuencode buffer */ + int read_len; /* actual number of chars read */ + int val; /* 6 bit chunk from buf */ + char filler='\0'; /* filler uuencode pad text */ + char *p; + + /* + * output the initial uuencode header + */ + fprintf(output, "begin %o %s\n", umode, uname); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + + /* + * We will process UUENCODE_LEN chars at a time, forming + * a single output line each time. + */ + while ((read_len=fread(buf,sizeof(buf[0]),UUENCODE_LEN,infile)) > 0) { + + /* + * the first character is the length character + */ + fputc(UUENCODE(read_len), output); + check_io(output, oname, EOF_NOT_OK); + + /* + * We will convert 24 bits at a time. Thus we will convert + * 3 sets of 8 bits into 4 sets of uuencoded 6 bits. + */ + for (p=buf; read_len>0; read_len-=3, p+=3) { + + /* bits 0 to 5 */ + val = (p[0]>>2)&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 6 to 11 */ + val = ((p[0]<<4)&0x30) | ((p[1]>>4)&0x0f); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 12 to 17 */ + val = ((p[1]<<2)&0x3c) | ((p[2]>>6)&0x03); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 18 to 23 */ + val = p[2]&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + } + + /* end of UUENCODE_LEN line */ + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer (don't depend on bzero() or memset()) + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + } + + /* check the last read on the input file */ + check_io(infile, iname, EOF_OK); + + /* write end of uuencode file */ + fprintf(output, "%c\nend\n", UUENCODE(filler)); + check_io(output, oname, EOF_NOT_OK); +} diff --git a/2001/ollinger.c b/2001/ollinger.c new file mode 100644 index 000000000..318773a22 --- /dev/null +++ b/2001/ollinger.c @@ -0,0 +1,21 @@ +#define n ((e[++a]-42)/9-f[d+1])? +#define o printf("%c",c[" 01./:;|\\"]); + +char e[]="**3H[`mr25\ +\?Hx,P,B2Gs-KTfzRdv1SeyCR-ISeu.H[m1JSey*DH[m*3EJMUY`ejov#$59@CJOXYZbfhlnrxy&+.57=@IMR[``bcfmnq!#),@",*f; + +int main(int j,char *k[]) { + int a,b,c,d,g,h,i=19; + + printf(" "); + for(g=0[f=(char *)calloc(80+(h=atoi(1[k])),1)]=1; g<=h; g++) { + if ((g>30)&&(f[i-2]+f[i-1]!=0)) i++; + for(d=c=0; d=s(g)||s(o + )<=0)&&(k=1), + (p>=h||p<=0)&& + (l=1),(e==1)&&( + c=o,d=p,e=0,1)||( + (k==0&&o-c-(z)(a+y + (a)*.5)!=0)&&(a=o-c + ),(l^-1==-1&&p-d-(z)( + b+y(b)*.5)!=0)&&(b=p-d),a/=f,b/=f + ,k=0,l=0);(o >=s(g)||o<=0)&&(a=-a),( + p>=h||s(p)<=0) &&(b=-b),c=o,d=p,I(XWarpP + ,ointer)(i,None,None,0,0,s + (g),h,(z)(a+y(a)*.5),(int)( + b+y(b)*.5 JJ(float B;int)C,D; + #else/*Egads! something has */ + #include/*taken a*/ + #include/*huge bite o-*/ + #include/*ut of the m-*/ + #include/*ouse pointer!!!*/ + #define H(a, b) (((a)&(7<<3*(b)))>>3*(b)) + #define G(c,d) ((H(c,d)<<3*(d+1))|((H(c,d+1)<<3*d)|/* + _XSetPointer(display, screen,GREASY|BOUNCY)*/c&~(63<<3*(d)))) +#define s(e) (G(G(G(G(G(G(e,(z)0),1),2),1),0),1)) + typedef int z;float a=0,b=0,c,d,f=1.03;z e + =s(512),g,h,j; + Display/**/*i; + #define y(X)((X>0)-(X<0)) + #define x o,p; Window m; + #define ghj unsigned int* + #define I(aa,bb)aa##bb + #define JJ(X)\ + ));return 0;}X + z r();int main + (z X,char**Y){ + clock_t q=0;(X + ==2)&&(f=atof(Y[1])),((i + =XOpenDisplay(0) )==0)&&(exit(1 + ),1),j=I(Defa, ultScreen)(i), + g=s(I(Display, + Width)(i,j)-1) + ,h=I(DisplayH, + eight)(i,j)-1; + for(;;((I(clo, + ck)()-q)*100>( + CLOCKS_PER_SEC + ))&&(r(),q=clock()));} + #include __FILE__ +#endif + diff --git a/2001/rosten.hint b/2001/rosten.hint new file mode 100644 index 000000000..f4309145e --- /dev/null +++ b/2001/rosten.hint @@ -0,0 +1,143 @@ +Best abuse of the user: + + Edward Rosten + Oxford University + 34 The Chilterns + Gloucester Green + Oxford + OX1 2DF + United Kingdom + + http://users.ox.ac.uk/~scat1148 + + +Judges' Comments: + + To build: + + make rosten + + Try: + + ./rosten 1.03 + ./rosten 1.00 + + For some abuse, try: + + ./rosten 0.99 + + Friction can be your friend if it does not rub you (or your mouse + cursor) in the wrong way. :-) + + +Selected Author's Comments: + + NAME + + rosten - make the mouse act as if it has been greased + + SYNOPSIS + + rosten [greasiness] + + + DESCRIPTION + + This program is designed primarily to make your X windows interface more + obfuscated. Try doing something mouse driven (such as using a mouse + driven editor on this program) whilst it is running. If you're not sure + what it does, looking at the code should give a fair idea. + + It also has a [cat] man page if you want to install it as a `utility'. + + + OPTIONS + + It only takes one optional option: the greasiness factor. This is the + number that the speed is divided by on each iteration. The default is + 1.03. A setting of 1 (no friction is fun), as is 0.99. + + Being an X program, it recognised the DISPLAY variable. + + + PORTABILITY + + The program is very portable, even to non X architectures. All that is + required is a large desk and some good grease. + + + COMMENTS + + It is really rather surprising that code like this should not only be + portable, but compile with almost no warnings on most of the compilers + tested. It's a kind of shame that none of the compilers do anything + like this: + + $make greasymouse + cc greasymouse.c -o greasymouse -lX11 + greasymouse.c:30: This macro should have more text and spaces in it + greasymouse.c:32: This is a really stupid way to perform this operation + greasymouse.c:42: This program would look better with a newline here + greasymouse.c:48: That's a really silly thing to do + greasymouse.c:55: So is that + ... + greasymouse.c:58: This program is rubbish. I'm not going to link it. + + The code is best viewed with tabstops every 8 spaces. + + + BUGS + + The mouse gets stuck completely if you give it an option of less + than 1 and leave it for too long. This is quite annoying if it + didn't leave the terminal if was run from in focus. + + It gets very jerky if the processor is being used. There are + better time functions than clock() but I haven't used them. + + It deflects slightly when it gets very slow. + + It annoys other people if you run it on their display too + often. Maybe I should make future versions print funny jokes to + keep the humor fresh. + + It's pretty ropey over a 56K modem. + + It's even ropier over a 56K modem and tunneled through 3 ssh links. + + + WARNINGS + + Pages and pages and pages of things, with GCC at any rate. + + It suggests loads of ()'s where they're not needed. + + It reckons I have not used some of the values I have computed. I + would never do a thing like that: I just haven't used them in + the way it's used to. + + The MIPS compiler suggests an == instead of an = in expressions + such as: + + &&(a=b) + + but I its suggestions would break my program. It also reckons + that r() has no prototype. + + Giving the -pedantic option to the MIPS compiler causes it to generate + warnings about its own header files, but not any extra ones with this + program. + + With all warnings enabled, the DEC compiler, oddly enough finds some + problems with its own include files, but none with my program. + + + ERRORS + + The DEC compiler of this version: + + DEC C V5.6-079 on Digital UNIX V4.0 (Rev. 878) + + can't compile the code. It thinks that preprocessor lines can not have + whitespace preceding the #. Moving the preprocessor directives to the + beginning of the line wrecks the layout but makes it compile. diff --git a/2001/rules b/2001/rules new file mode 100644 index 000000000..aea6c7a89 --- /dev/null +++ b/2001/rules @@ -0,0 +1,234 @@ + 16th International Obfuscated C Code Contest Rules | + +Copyright (c) Leonid A. Broukhis, Simon Cooper, Landon Curt Noll and | +Peter Seebach, 2001. | + +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in +writing from the contest judges. + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: his emotions obfuscated his + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show the importance of programming style, in an ironic way. + * To stress C compilers with unusual code. + * To illustrate some of the subtleties of the C language. + * To provide a safe forum for poor C code. :-) + +The 16th IOCCC contest window is: | + + 01-Oct-2001 00:00 UTC to 01-Dec-2001 23:59:59 UTC | + +NOTE: Some of the changes from the 2000 rules are denoted by change bars. ---> | + + +RULES: + + To help us with the volume of entries, we ask that you follow these rules: + + 1) Your entry must be a complete program. + + 2) The uudecoded size of your program source must be <= 4096 bytes in | + length. The number of characters (after uudecoding your program) | + excluding whitespace (tab, space, newline, formfeed, return), and | + excluding any ; { or } immediately followed by whitespace or end | + of file, must be <= 2048. + + 3) Your entry must be submitted in the following format: + | + NOTE: The change bars are not part of the rules, don't add the | + change bars to your entry! | + +---entry--- +rule: 2001 | +fix: y or n (n => this is a new entry, y => this replaces an older entry) +title: title of entry (see comments below) +entry: Entry number from 0 to 7 inclusive (your 1st entry should by 0) +date: Date/time of submission in UTC (see comments below) +host: Machine(s) and OS(s) under which your entry was tested + Use tab indented lines if needed +---remark--- + Place remarks about this entry in this section. It would be helpful if + you were to indent your remarks with 4 spaces, though it is not a + requirement. Also, if possible, try to avoid going beyond the 79th + column. Blank lines are permitted. +---author--- +name: your name +org: School/Company/Organization +addr: postal address + use tab indented lines to continue + don't forget to include the country +email: EMail address from a well known site or registered domain. + If you give several forms, list them on separate tab indented lines. +url: http://your/home/page.html or say none if you don't have one +anon: y or n (y => remain anonymous, n => OK to publish this info) +---info--- +If your program needs an info file, place a uuencoded copy of it in +this section. In the case of multiple info files, use multiple info +sections. If your entry does not need a info file, skip this section. +---build--- +Place a uuencoded copy of the command(s) used to compile/build your program +in this section. It must uudecode into a file named 'build'. The resulting +file must be 521 bytes or less. | +---program--- +Place a uuencoded copy of your program in this section. It must uudecode +into a file named is 'prog.c'. The resulting file must follow rule #2. +---end--- + + Regarding the above format: + + * The title must match the expression: + + ^[a-zA-Z0-9_=][a-zA-Z0-9_=+-]*$ + + and must be 1 to 31 characters in length. + + It is suggested, but not required, that the title should + incorporate the author(s) username(s). + + * The date in the ---entry--- section should be given with respect + to UTC. The format of the date should be as returned by asctime() + using the C locale. (see guidelines for more info) + + * You may correct/revise a previously submitted entry by sending + it to the contest email address. Be sure to set 'fix' in the + ---entry--- section to 'y'. The corrected entry must use the same + title and entry number as submission that is being corrected. Be + sure that you note the re-submission in the ---remark--- as well. + + * With the exception of the header, all text outside of the above + format may be ignored by the judges. If you need to tell the judges + something, put it in the ---remark--- section, or send a separate + EMail message to the judges. + + * Information from the ---author--- section will be published unless + 'y' was given to the respective author's 'anon' line. + + * To credit multiple authors, include an ---author--- section for + each author. Each should start with ---author--- line, and + should be found between the ---entry--- and ---build--- sections. + + * The home page URL in the ---author--- section must be fully + qualified or must be the word `none'. + + * The entry's remarks should include: + - note if this entry is a re-submission of a previous entry. + - what this program does + - how to run the program (sample args or input) + - special compile or execution instructions, if any + - special filename requirements (see rule 4 and 5) + - information about any ---info--- files + - why you think the program is obfuscated + - any other remarks (humorous or otherwise) + + * Do not rot13 your entry's remarks. You may suggest that certain + portions of your remarks be rot13ed if your entry wins an award. + + * Info files should be used only to supplement your entry. They + should not be required to exist. + + * If your entry does not need an info file, skip the ---info--- + section. If your entry needs multiple info files, use multiple + ---info--- sections, one per info file. You should describe + each info file in the ---remark--- section. + + * Your sections must in the same order as in the above template. + | + * The size limits of the program source apply to the decoded version | + of the ---program--- section. | + + 4) If your entry is selected as a winner, it will be modified as follows: + + 'build' is incorporated into a makefile, and 'build' is removed + 'prog.c' is renamed to your entry's title, followed by an optional + digit, followed by '.c' + your entry is compiled into a file with the name of your entry's + title, possibly followed by a digit + + If your entry requires that a build file exist, state so in your + entry's remark section. The makefile will be arranged to execute a + build shell script containing the 'build' information. The name of + this build shell script will be your entry's title, possibly followed + by a digit, followed by '.sh'. + + If needed, your entry's remarks should indicate how your entry must + be changed in order to deal with the new filenames. + + 5) The build file, the source and the resulting executable should be + treated as read-only files. If your entry needs to modify these files, + it should make and modify a copy of the appropriate file. If this + occurs, state so in your entry's remarks. + + 6) The uudecoded ---program--- section must be able to be compiled + cleanly by an ANSI C compiler, or if there are any compile errors, + they must be documented in the ---remark--- section. + + 7) The program must be of original work. All submitted programs are | + are thereby put in the public domain. All explicitly copyrighted | + programs will be rejected. | + + 8) Entries must be received prior to 01-Dec-2001 23:59:59 UTC. (UTC is | + essentially equivalent to Greenwich Mean Time) EMail your entries to: + + entry@ioccc.org + | + You must include the words ``ioccc entry'' in the subject | + of your EMail when sending in your entry! Failure to do so may | + result in the loss of your entry! ! + + If possible, we request that you hold off on EMailing your entries + until 01-Oct-2001 00:00 UTC. Early entries will be accepted, however. | + We will attempt to EMail a confirmation to the sender of any entry + received after 01-Oct-2001 00:00 UTC and before the close | + of the contest. + + 9) Each person may submit up to 8 entries per contest year. Each entry + must be sent in a separate EMail letter. + + 10) Entries requiring human interaction to be built are not allowed. + + 11) Programs that require special privileges (setuid, setgid, super-user, + special owner or group) are not allowed. + + 12) Legal abuse of the rules is somewhat encouraged. An entry that, in + the opinion of the judges, violates the rules will be disqualified. + Entries that attempt to abuse the rules must try to justify why + their rule abuse is legal in the ---remark--- section. + | + 13) Your source may not contain unescaped octets with the high bit set. | + I.e., your source may not contain octet values between 128 and 255. | + | + 14) Any program that fails to compile because of lines with trailing | + control-M's (\r or \015) will be rejected. | + + +FOR MORE INFORMATION: + + The judging will be done by Leonid A. Broukhis, Simon Cooper, Landon | + Curt Noll and Peter Seebach. Please send questions or comments + about the contest, to: + + questions@ioccc.org (not the address for submitting entries) + + You must include the words ``ioccc question'' in the subject of your | + EMail message when sending EMail to the judges. | + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, visit the IOCCC web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + | + NOTE: A copy of the mkentry program may be found at: | + | + http://www.ioccc.org/official/mkentry.c | diff --git a/2001/schweikh.c b/2001/schweikh.c new file mode 100644 index 000000000..b24af7599 --- /dev/null +++ b/2001/schweikh.c @@ -0,0 +1 @@ +main(int c,char**v){return!m(v[1],v[2]);}m(char*s,char*t){return*t-42?*s?63==*t|*s==*t&&m(s+1,t+1):!*t:m(s,t+1)||*s&&m(s+1,t);} diff --git a/2001/schweikh.hint b/2001/schweikh.hint new file mode 100644 index 000000000..3e868854e --- /dev/null +++ b/2001/schweikh.hint @@ -0,0 +1,73 @@ +Best one-liner: + + Jens Schweikhardt + Marconi Communications + Schlartaeckerweg 3 + D-71384 Weinstadt + Germany + + http://www.schweikhardt.net/ + + +Judges' Comments: + + To build: + + make schweikh + + Try: + + ./schweikh foo 'f??'; echo $? + ./schweikh 'best short program' '??st*o**p?*'; echo $? + ./schweikh bar 'f??'; echo $? + + Do you get the pattern here? + + +Selected Author's Comments: + + This one-liner program is a glob pattern matcher. It understands + the glob characters `*' meaning `zero or more characters' and + `?' meaning exactly one character, just like your unix shell. + + Run it with two args, the string and the glob pattern. The exit + status is 0 (shell true) when the pattern matches, 1 otherwise. + The glob pattern must match the whole string, so you may want to + use * at the beginning and end of the pattern if you are looking + for something in the middle. + + You can use it for your shell scripting needs similar to a silent grep + (and without stdout redirected to /dev/null): + + if prog "${VARIABLE}" ''; then + echo VARIABLE matches + else + echo no match + fi + + Bugs: there is no way to escape the meta characters. Dammit Jim, I'm a + one-liner, not a regexp lib. + + All obfuscation is obviously in the recursive m() function, an 86 + character glob pattern evaluator, returning nonzero for a match: + * just a single complex return expression. + * nested ternary operator ?: to save on if/else verbosity. + * short circuiting && and || to save even more on if/else verbosity. + * Subtraction instead of an equality operator in "*t - 42". + * ASCII codes for '*' and '?'. + * careful use of blanks even though this year's rules have extended + that resource limit. + * the source is a complete preprocessed C program. Because it communicates + with the world out there by means of argv and the exit status, there + is no need for stdio bloat. An asm guru could surely squeeze this + program in less than a screenful. + * indent(1) is probably not too helpful. + + The recursion wonderfully and magically takes care of iteration and + backtracking. I could tell you how it works but then I would have to + kill^Wrequest an NDA from you :-) Run it under a debugger with several + inputs, it will be quite helpful and instructive. Handling of '?' is + straightforward; for '*' start out with '*foo' and 'foo*' against 'foo'. + How does it deal with sequences of adjacent `*'? How could this be + improved? If all else fails, recode the ?: operators with if/else and + try again. For extra credit implement character classes like [a-z]. diff --git a/2001/westley.c b/2001/westley.c new file mode 100644 index 000000000..36ebdc2d5 --- /dev/null +++ b/2001/westley.c @@ -0,0 +1,37 @@ +main(i)?? + /* { /KC 0000 K } */ +S(c,r,i)char*c; ?? + + char* B,*r; X(c,k)?? +J(i,c,j)char*c; ?? + U(c,i)char*c; ?? + +A(i ,c,j ,k) char *c; ??< for(j= -1; ++j +R(c,r) char *c; ??< printf( "/%-80s|??/n" ,c); for (; r< 13; r++)S (c,r,0); ??> + t(a,b)?? + +M(i,c)char c??(81??)??(81??);?? + char*d= "yyzzyzz zz z0y000 zz 00yzz00y00yzz Brian Westley zyy00yy0yy 0" ; ; ; +#define t(a,b) t(b,a) + +char* K;Y (c ,r) ??< int i=V ( tolower (c) ,K); return(i <0)?1 :Z(c ,r, i); ??> +char*m= "7831734578 9547693564569528334164263z284106579 52626423135477"; ; ; ; +P(c)char*c; ?? + +char* d,*m,*B; Z(c,i,k)?? +char*K= "gh$j|lm'pq&rvz#);@_winky,.%/+*!=3-284106579 (:obfuscated??/?" ; ; + L(c,i,j)char c??(81??)??(81??);?? + char*r= "008y8yy8yyyyz8z8z88888z0yyz888 8888 88y00zz00z0088"; +D(c,i,j) char c??(81??)??(81??);?? + + E(r,s)char*r,*s; ??< if(t( 0,1)&& F(r,s)<0)G(r,s); ??> +H()?? return rand()-rand(); ??> +F(r,s)char*r,*s; ?? + + T(c,r) ??< return Y(c, r)?'??(' :' '; ??> +G(r,s)char*r,*s; ?? + W(r,a,b,c)?? + +Q(t,i)??< printf(t?" ":"|"); for(; i<80; i++) printf("_"); puts(t?"_":"|"); ??> + char*B=" yz0123456789"; +V(c,k,i) char*k; ?? diff --git a/2001/westley.hint b/2001/westley.hint new file mode 100644 index 000000000..90e2eeae9 --- /dev/null +++ b/2001/westley.hint @@ -0,0 +1,155 @@ +Best position-independent code: + + Brian Westley + Firesign Theatre webmaster + 1906 James Ave + St. Paul, MN 55105 + USA + + http://www.firesigntheatre.com + + +Judges' Comments: + + To build: + + make westley + + Try: + + ./westley < westley.c > westley2.c + cc westley2.c -ansi -o westley2 + echo 'Bozos, please deflate shoes before entering the bus!'| ./westley2 + sort -b < westley2.c > westley3.c + cc westley3.c -ansi -o westley3 + ./westley3 < westley.c | diff - westley.c + ./westley3 < westley.c | diff - westley2.c + ./westley3 < westley.c | diff - westley3.c + + Try copying the source to a new file and changing around the + order of the lines. Does it produce the exact same output? + + By changing the order of the source, figure out in how many different + ways this program can transform input to output. + + NOTE: The entry has been modified for portability reasons. The + original source may be found in the westley.orig.c file. + + This assortment obfuscated lines takes position-independant code + to a new level! :-) + + +Selected Author's Comments: + + Punch cards, or Hollerith cards, were becoming obsolete just + as C was becoming more popular*; this is rather unfortunate, + because C has an advantage over many other languages when it + comes to punch cards - C programs can be written to be "drop + proof". + + Consider the following C program: + + main(){a();b();c();} + a(){printf("A");} + b(){printf("B");} + c(){printf("C");} + + This program will compile and run no matter what order the + lines are in. If you punch it on cards (one line of code per + card, naturally) and drop them, you don't need to put them in + any particular order**; it will always produce "ABC" as output. + + You can also use global variables: + + char *greet = "Hello, world!"; + char *greet; main(){puts(greet);} + + It would be trivial to write an entire C program that is + "drop proof" using the above techniques; surprisingly, it's + possible to write a program that will always compile but + behave differently depending on the line order: + + test(a,b){return a;} + #define test(a,b) test(b,a) + main(){if (test(0,1)) printf("T"); else printf("F");} + + This program will print out "T" if the #define statement + falls between the declaration of test() and its use in + main(), otherwise it will print out "F". Furthermore, + you can use the same call to test() repeatedly in + different lines to return different values: + + #define test(x,y) test(y,x) + main(){int i=0;a(&i);b(&i);c(&i);d(&i);printf("%d\n",i);} + a(i)int*i;{if (test(0,1)) *i += 1;} + b(i)int*i;{if (test(0,1)) *i += 2;} + c(i)int*i;{if (test(0,1)) *i += 4;} + d(i)int*i;{if (test(0,1)) *i += 8;} + test(x,y){return x;} + + If you enter the above program on punch cards, throw them + up in the air, gather them up, and run it, you will get + a number from 0 to 15 printed out. Now *that's* a random + number generator... + + Of course, there are drawbacks to C programming on punch + cards; an 80-character line limit can be restricting, and + (to be maximally portable) you need to use trigraphs for + the characters "^[]{}\" (these aren't found on every + keypunch, and have various encodings). + + My C program entry does the following: + + 1) reads in lines + 2) rearranges the lines, or not + 2a) if it rearranges the lines, they are sorted or scrambled + 3) reverses the order of the lines, or not + 4) prints out the lines as either text or EBCDIC punch cards. + + The code, as written, scrambles the input and prints it out + as normal text, so you can simulate 'dropping' the cards. + You can repeatedly scramble the code to get all 12 variants + (but the scrambling isn't very random; it's just a bubble + sort with a random number, so some variants are more common + than others). You can also just swap the arguments in the + calls to t() in all combinations to get all the variations. + + If you sort the lines, you will get the version that just + prints out the input as punch cards (you will need to display + at least 82 columns of text, or clip the last few chars by + piping it through "sed s/...$//"). If you use this on the + original code, you will see that it spells out "HOLLERITH" + when punched on cards (you can see the tall, thin letters + spelling out "HOLLERITH" if you turn the C code sideways). + You will also see why "/KC 0000 K" is a "Hollerith emoticon". + Unrecognized characters are punched as a lace column. + (You can see an ASCII simulation of the code as punch cards + by looking at card.gif) + + For a nice test pattern, try + &-0123456789ABCDEFGHIJKLMNOPQR/STUVWXYZ:#@'=".<(+|!$*);,%_>?abcmnoxyz^[]{}\ + + If you want to analyze the program, sorting the lines while + ignoring leading blanks works best (sort -b). This will + produce the version that just reverses the line order, and + the routines in the code are in a sensible order. + + This program should work on EBCDIC computers. It assumes + that the time_t ptr param to time() will work with an int + ptr, and that "passing through" a char[][] array as a simple + char* is ok. Your compiler MUST understand trigraphs, or it + will miss the trigraph backslash before the double quote in + the K string and complain about a malformed string; for GNU + C, use -ansi or -trigraphs. Entering a line of more than 80 + characters, or more than 81 lines, will jam the card reader. + + I've used the a[b] ==> *(a+b) trick, because this is + actually shorter than the trigraph version of a??(b??). + + With 28 lines of code (not counting the blank lines or the + comment), there are technically 28! different programs, or + 304,888,344,611,713,860,501,504,000,000 different versions, + all legal C. + + *except in Florida voting machines + **all cards must be face down, nine-edge first, of course. diff --git a/2001/westley.orig.c b/2001/westley.orig.c new file mode 100644 index 000000000..bb2b30d88 --- /dev/null +++ b/2001/westley.orig.c @@ -0,0 +1,37 @@ +main(i)?? + /* { /KC 0000 K } */ +S(c,r,i)char*c; ?? + + char* B,*r; X(c,k)?? +J(i,c,j)char*c; ?? + U(c,i)char*c; ?? + +A(i ,c,j ,k) char *c; ??< for(j= -1; ++j +R(c,r) char *c; ??< printf( "/%-80s|??/n" ,c); for (; r< 13; r++)S (c,r,0); ??> + t(a,b)?? + +M(i,c)char c??(81??)??(81??);?? + char*d= "yyzzyzz zz z0y000 zz 00yzz00y00yzz Brian Westley zyy00yy0yy 0" ; ; ; +#define t(a,b) t(b,a) + +char* K;Y (c ,r) ??< int i=V ( tolower (c) ,K); return(i <0)?1 :Z(c ,r, i); ??> +char*m= "7831734578 9547693564569528334164263z284106579 52626423135477"; ; ; ; +P(c)char*c; ?? + +char* d,*m,*B; Z(c,i,k)?? +char*K= "gh$j|lm'pq&rvz#);@_winky,.%/+*!=3-284106579 (:obfuscated??/"?" ; ; + L(c,i,j)char c??(81??)??(81??);?? + char*r= "008y8yy8yyyyz8z8z88888z0yyz888 8888 88y00zz00z0088"; +D(c,i,j) char c??(81??)??(81??);?? + + E(r,s)char*r,*s; ??< if(t( 0,1)&& F(r,s)<0)G(r,s); ??> +H()?? return rand()-rand(); ??> +F(r,s)char*r,*s; ?? + + T(c,r) ??< return Y(c, r)?'??(' :' '; ??> +G(r,s)char*r,*s; ?? + W(r,a,b,c)?? + +Q(t,i)??< printf(t?" ":"|"); for(; i<80; i++) printf("_"); puts(t?"_":"|"); ??> + char*B=" yz0123456789"; +V(c,k,i) char*k; ?? diff --git a/2001/williams.c b/2001/williams.c new file mode 100644 index 000000000..f4f334931 --- /dev/null +++ b/2001/williams.c @@ -0,0 +1,73 @@ +#include +#include +typedef long O; typedef struct { O b,f,u,s,c,a,t,e,d; } C; +Display *d; Window w; GC g; XEvent e; +char Q[] = "Level %d Score %d", m[222]; +#define N(r) (random()%(r)) +#define U I[n++]=L[n]=l; n%=222 +#define K c=-l.u; l=I[i]; l.t=0; c+=l.u +#define E l.e--&&!--L[l.e].d&&(L[l.e].t=3) +#define M(a,e,i,o) a[0]=e,(a[1]=i)&&XFillPolygon(d,w,g,(void*)a,o,1,1) +#define F return +#define R while( +#define Y if(l.t + + + O p ,B, + D,A=6,Z ,S=0,v= + 0,n=0,W=400 ,H=300,a[7] + ={ 33,99, 165, 231,297,363} ; + XGCValues G={ 6,0 ,~0L,0,1} ; short + T[]={ 0,300,-20,0,4 ,-20,4,10,4,-5,4,5, + 4,-20,4,20,4,-5,4,5,4, -10,4,20},b[]={ 0,0,4, + 0,-4,4,-4,-4,4,-4,4,4} ; C L[222],I[222];dC(O x){ + M(T,a[x],H,12); } Ne(C l,O s) { l.f=l.a=1; l.b=l.u=s; + l.t=16; l.e=0; U; } nL(O t,O a,O b,O x,O y,O s,O p){ C l; + l.d=0; l.f=s; l.t=t; y-=l.c=b; l.e=t==2?x:p; x-=l.s=a;s=(x|1) + %2*x; t=(y|1)%2*y; l.u=(a=s>t?s: t)>>9;l.a=(x<<9)/a;l.b=(y<<9)/a; + U; } di(C I){ O p,q,r,s,i=222;C l; B=D=0; R i--){ l=L[i]; Y>7){ p=I.s + -l.s>>9; q=I.c-l.c>>9; r=l.t==8?l.b: l.a; s=p*p+q*q; if(sa[i]+d)); F i; } dL(){ O c,r=0, i=222,h; C l; R i--){ l=L[i]; + Y){ r++;c=l.f; Y==3){c=l.u; l.t=0; E; }R c--){-- l.u;h=l.c>>9; Y>7){XDrawArc(d,w,g, +(l.s>>9)-++l.a,h-l.a,l.a*2,l.a*2,0 ,90<<8); if(!l.u){ I[i].t-=8; l=I[i]; } } else Y==2)M +(b,l.s>>9,h,6); else XDrawPoint(d ,w,g,(l.s+=l.a)>>9, h=(l.c+=l.b)>>9); Y==4&&!l.u){ Ne +(l,20); K; } Y&&l.t<3&&(di(l)||h> H)){ if(h>H&&(c=hi( l.s>>9,25))>=0){ dC(c); a[c]=a[-- +A]; }Ne(l,30); Y==1){ E;K; } else c=l.t=0;} Y==1&&h>9,l.c>>9,6); } + } L[i]=l; } } F r; } J(){ + R A) { XFlush(d); v&&sleep( + 3); Z=++v*10; p=50-v; v%2&&hi + ((a[A]=N(W-50)+25),50)<0 &&A++; + XClearWindow (d,w); for(B=0; B kernel + ${CC} ${GAVIN_OPT} -c ${GAVIN_FLAGS} -DB=_start '-Dputchar(a)=' gavin.c + ${RM} -f sh + ${LD} -s -o sh gavin.o + ${RM} -f vi + ${CP} sh vi + ${RM} -f fs.tar + ${TAR} -cvf fs.tar sh vi gavin.c gavin.hint prim + +gavin_clean: + ${RM} -f sh vi kernel gavin.o + +gavin_clobber: gavin_clean + ${RM} -f gavin fs.tar + +gavin_files: boot.b lilo.conf prim gavin_install.txt + + +# Best Abuse of the Guidelines +# +hibachi: hibachi.tar.gz + ${RM} -f hibachi.tar + ${GUNZIP} < hibachi.tar.gz > hibachi.tar + ${TAR} -xvf hibachi.tar + ${RM} -f hibachi.tar + (cd hibachi && ${SHELL} ./configure) + ([ -f hibachi/makefile ] && cd hibachi && $(MAKE) -f makefile || true) + +hibachi_clean: + ${RM} -f hibachi/hibachi.o hibachi.tar + +hibachi_clobber: hibachi_clean + ${RM} -rf hibachi + +hibachi_files: hibachi.tar.gz + + +# Most Functional Output +# +hoyle: hoyle.c + ${CC} hoyle.c -o hoyle -lm + +hoyle.orig: hoyle.orig.c + ${CC} hoyle.orig.c -o hoyle.orig -lm + +hoyle_clean: + ${RM} -f hoyle.o hoyle.orig.o + +hoyle_clobber: hoyle_clean + ${RM} -f hoyle hoyle.orig + + +# Best Abuse of the Periodic Table +# +jdalbec: jdalbec.c + @${RM} -f jdalbec2.c + -${CC} -E jdalbec.c > jdalbec2.c + @${RM} -f jdalbec3.c + ${SED} -e 's/ (/(/g' < jdalbec2.c > jdalbec3.c + ${CC} -ansi jdalbec3.c -o jdalbec + +jdalbec_clean: + ${RM} -f jdalbec2.c jdalbec3.c jdalbec.o + +jdalbec_clobber: jdalbec_clean + ${RM} -f jdalbec + + +# Best one-liner +# +kopczynski: kopczynski.c + ${CC} -Dif=while kopczynski.c -o kopczynski + +kopczynski.orig: kopczynski.orig.c + ${CC} -Dif=while kopczynski.orig.c -o kopczynski.orig + +kopczynski_clean: + ${RM} -f kopczynski.o kopczynski.orig.o + +kopczynski_clobber: kopczynski_clean + ${RM} -f kopczynski kopczynski.orig + +kopczynski_files: kopczynski-10 kopczynski-11 kopczynski-8a kopczynski-8b \ + kopczynski-8c kopczynski-9 + + +# Best Font Engine +# +newbern: newbern.c + ${CC} newbern.c -o newbern + +newbern_clean: + ${RM} -f newbern.o + +newbern_clobber: newbern_clean + ${RM} -f newbern + +newbern_files: newbern.dat + + +# Best Utility +# +omoikane: omoikane.c + ${CC} -O omoikane.c -o omoikane + +omoikane_clean: + ${RM} -f omoikane.o + +omoikane_clobber: omoikane_clean + ${RM} -f omoikane + +omoikane_files: omoikane.info + + +# Best Non-Use of Curses +# +schnitzi: schnitzi.c + ${CC} schnitzi.c -o schnitzi + +schnitzi_clean: + ${RM} -f schnitzi.o + +schnitzi_clobber: schnitzi_clean + ${RM} -f schnitzi + +schnitzi_files: schnitzi.inp0 schnitzi.inp1 + + +# Best Abuse of Indentation +# +sds: sds.c + ${CC} -o sds sds.c + +sds_clean: + ${RM} -f sds_encoder.c sds_encoder.o sds.o + +sds_clobber: sds_clean + ${RM} -f sds sds_encoder + + +# Best X11 Game +# +vik1: vik1.c + ${CC} -ansi -O2 -o vik1 vik1.c -L${X11_LIBDIR} -lX11 + +vik1_clean: + ${RM} -f vik1.o + +vik1_clobber: vik1_clean + ${RM} -f vik1 + + +# Best Abuse of CPP +# +vik2: vik2.c + @${RM} -f vik2_1.c + ${CC} -E '-DSTOP=_5' '-DFNAME="vik2_1.c"' vik2.c > vik2_1.c + @${RM} -f vik2_2.c + ${CC} -E vik2_1.c > vik2_2.c + ${CC} -O vik2_2.c -o vik2 + +vik2_clean: + ${RM} -f vik2_1.c vik2_2.c vik2.o + +vik2_clobber: vik2_clean + ${RM} -f vik2 + + +# utility rules +# +everything: ${WINNERS} ${ALT_NAMES} ${DATA_FILES} + +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +clean: ${CLEAN} + ${RM} -f a.out core + +clobber: ${CLOBBER} + ${RM} -f ${WINNERS} + ${RM} -f ${ALT_NAMES} + +nuke: clobber + @${TRUE} + +install: all + ${CAT} ${WINNERS} ${ALT_NAMES} > /dev/null diff --git a/2004/README b/2004/README new file mode 100644 index 000000000..562eb110b --- /dev/null +++ b/2004/README @@ -0,0 +1,86 @@ +2004 marked the "The Seventeenth International Obfuscated C Code Contest" + +Copyright (C) 2001-2004, Landon Curt Noll, Simon Cooper, Peter Seebach +and Leonid A. Broukhis. All Rights Reserved. Permission for personal, +educational or non-profit use is granted provided this copyright and +notice are included in its entirety and remains unaltered. All other +uses must receive prior permission from the contest judges. + + +Standard IOCCC stuff +-------------------- + +The IOCCC has a web site and now has a number of international mirrors. +The primary site can be found at, + + http://www.ioccc.org/ + +Use make to compile entries. It is possible that on non-Un*x / non-Linux +systems the makefile needs to be changed. See the Makefile for details. + +Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitters. + +Read over the makefile for compile/build issues. Your system may +require certain changes (add or remove a library, add or remove a +#define). + +Some ANSI C compilers are not quite as good as they should be. If +yours is lacking, you may need to compile using gcc instead of your +local compiler. + + +Remarks on some of the entries +------------------------------ + +There were some outstanding entries that did not win. Unfortunately +some very good entries lost because they: + + + depended too much on non-portable side effects in expressions; + + depended too much on a particular byte order; + + required the use of a special script, data file or pseudo-machine + language that was not supplied with the entry. + +We hope the authors of some of those entries will fix and re-submit +them for the next IOCCC. + +We believe you will be impressed with this year's winners. The Best +of Show is a fine example of obfuscation. But don't ignore the other +winners! There are games, utilities, programs that output images and +a one-liner that is incredibly compact for what it can do. + +The Best Abuse of the Guidelines is technically allowed by the rules. +This year we allowed it due to the functionality of the program. This +entry is one of the easiest to read! Don't assume you can win using +similar techniques next time ... :-) + +This year a single person won two awards! We also had repeat winners +with their 6th, 4th and 2nd winning entries this year! (Please note that +judging is done completely anonymously. Be warned that we may disqualify +entries that reveal the identity of the submitter). + + +Final Comments +-------------- + +Please feel free to send us comments and suggestions about the +competition, this README or anything else that you would like to see in +future contests. + +If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used. + +If you have problems with any of the entries, AND YOU HAVE A FIX, please +send us the fix (patch file or the entire changed file). + +For the latest information on how to contact the IOCCC Judges please visit + + http://www.ioccc.org/contact.html + +Watch: + + http://www.ioccc.org/ + +for news of the next contest. diff --git a/2004/anonymous.c b/2004/anonymous.c new file mode 100644 index 000000000..4ccc87dd8 --- /dev/null +++ b/2004/anonymous.c @@ -0,0 +1,47 @@ + #include\ + + #include + #include + + #define w "Hk~HdA=Jk|Jk~LSyL[{M[wMcxNksNss:" + #define r"Ht@H|@=HdJHtJHdYHtY:HtFHtF=JDBIl"\ + "DJTEJDFIlMIlM:HdMHdM=I|KIlMJTOJDOIlWITY:8Y" + #define S"IT@I\\@=HdHHtGH|KILJJDIJDH:H|KID"\ + "K=HdQHtPH|TIDRJDRJDQ:JC?JK?=JDRJLRI|UItU:8T" + #define _(i,j)L[i=2*T[j,O[i=O[j-R[j,T[i=2*\ + R[j-5*T[j+4*O[j-L[j,R[i=3*T[j-R[j-3*O[j+L[j, + #define t"IS?I\\@=HdGHtGIDJILIJDIItHJTFJDF:8J" + + #define y yy(4),yy(5), yy(6),yy(7) + #define yy( i)R[i]=T[i],T[i ] =O[i],O[i]=L [i] +#define Y _(0 ], 4] )_ (1 ], 5] )_ (2 ], 6] )_ (3 ], 7] )_=1 +#define v(i)( (( R[ i ] * _ + T [ i ]) * _ + O [ i ]) * _ + L [ i ]) *2 +double b = 32 ,l ,k ,o ,B ,_ ; int Q , s , V , R [8 ], T[ 8] ,O [8 ], L[ 8] ; +#define q( Q,R ) R= *X ++ % 64 *8 ,R |= *X /8 &7 ,Q=*X++%8,Q=Q*64+*X++%64-256, +# define p "G\\QG\\P=GLPGTPGdMGdNGtOGlOG" "dSGdRGDPGLPG\\LG\\LHtGHtH:" +# define W "Hs?H{?=HdGH|FI\\II\\GJlHJ" "lFL\\DLTCMlAM\\@Ns}Nk|:8G" +# define U "EDGEDH=EtCElDH{~H|AJk}" "Jk?LSzL[|M[wMcxNksNst:" +# define u "Hs?H|@=HdFHtEI" "\\HI\\FJLHJTD:8H" +char * x ,*X , ( * i )[ 640],z[3]="4_", +*Z = "4,8O4.8O4G" r U "4M"u S"4R"u t"4S8CHdDH|E=HtAIDAIt@IlAJTCJDCIlKI\\K:8K"U + "4TDdWDdW=D\\UD\\VF\\FFdHGtCGtEIDBIDDIlBIdDJT@JLC:8D"t"4UGDNG\\L=GDJGLKHL\ +FHLGHtEHtE:"p"4ZFDTFLT=G|EGlHITBH|DIlDIdE:HtMH|M=JDBJLDKLAKDALDFKtFKdMK\ +\\LJTOJ\\NJTMJTM:8M4aGtFGlG=G|HG|H:G\\IG\\J=G|IG|I:GdKGlL=G|JG|J:4b"W +S"4d"W t t"4g"r w"4iGlIGlK=G|JG|J:4kHl@Ht@=HdDHtCHdPH|P:HdDHdD=It\ +BIlDJTEJDFIdNI\\N:8N"w"4lID@IL@=HlIH|FHlPH|NHt^H|^:H|MH|N=J\\D\ +J\\GK\\OKTOKDXJtXItZI|YIlWI|V:8^4mHLGH\\G=HLVH\\V:4n" u t t +"4p"W"IT@I\\@=HdHHtGIDKILIJLGJLG:JK?JK?=JDGJLGI|MJDL:8M4\ +rHt@H|@=HtDH|BJdLJTH:ITEI\\E=ILPILNNtCNlB:8N4t"W t"4u" +p"4zI[?Il@=HlHH|HIDLILIJDII|HKDAJ|A:JtCJtC=JdLJtJL\ +THLdFNk|Nc|\ +:8K"; main ( +int C,char** A) {for(x=A[1],i=calloc(strlen(x)+2,163840); +C-1;C<3?Q=_= 0,(z[1]=*x++)?((*x++==104?z[1]^=32:--x), X = +strstr(Z,z)) &&(X+=C++):(printf("P2 %d 320 4 ",V=b/2+32), +V*=2,s=Q=0,C =4):C<4?Q-->0?i[(int)((l+=o)+b)][(int)(k+=B) +]=1:_?_-=.5/ 256,o=(v(2)-(l=v(0)))/(Q=16),B=(v(3)-(k=v(1) +))/Q:*X>60?y ,q(L[4],L[5])q(L[6],L[7])*X-61||(++X,y,y,y), +Y:*X>57?++X, y,Y:*X >54?++X,b+=*X++%64*4:--C:printf("%d " +,i[Q][s]+i[Q ][s+1]+i[Q+1][s]+i[Q+1][s+1])&&(Q+=2)anonymous.pgm + + Then view the output using your favourite "pgm" viewer. If you + don't have a "pgm" viewer then we suggest the "netpbm" toolkit + (http://netpbm.sourceforge.net/) to convert the image to a + graphics format that you can view - most graphical Web browsers + can display PNG or JPEG images. + + p.s. Frodo lives! + + +Selected Author's Comments: + + This program takes a single command line argument, transcribes the + argument text into Tolkien's Elvish letters, and writes the + transcription to standard output as a portable graymap (PGM) file. + + The specific transcription mode is the Black Speech Tengwar mode, as + used in the inscription on the One Ring. The program handles the + following diagraphs: + + - "gh", "sh", "th": the corresponding tengwar are output for these + specific sounds + - "mh" denotes the full tengwa for [m]; "m" by itself means a + horizontal bar above the next letter + - "rh" denotes the [r\] tengwa + - "uh" denotes the tehta for long vowel [u:] + - "zh" selects the up-reaching tengwa for [z], while "z" selects the + down-reaching one + + Punctuation marks other than commas and periods are ignored, as are + whitespace characters. In addition, the argument text must be entirely + in lower case. + + The following command thus writes a rendering of the Ring inscription to + the file out.pgm: + + ./anonymous "ash nazg durhbatuluhk, ash nazg gimbatul, \ + ash nazg thrakatuluhk, agh burzhumh-ishi krimpatul." >anonymous.pgm + + The source code assumes the ASCII character set; also, due to space + constraints, the program uses rather inefficient algorithms, so it may + waste a lot of time and space even when rendering moderately long + strings. + + The code contains a vector font which was derived by toying with Harri + Pera:la:'s Tengwar Cursive font. Currently, only the glyphs used in the + Ring inscription are included in the font. diff --git a/2004/arachnid.c b/2004/arachnid.c new file mode 100644 index 000000000..0f727f403 --- /dev/null +++ b/2004/arachnid.c @@ -0,0 +1,51 @@ +#include /*****************************************************/ + int m[256 ] [ 256 ],a + ,b ;;; ;;; WINDOW*w; char*l="" "\176qxl" "q" "q" "k" "w\ +xm" "x" "t" "j" "v" "u" "n" ,Q[ + ]= "Z" "pt!ftd`" "qdc!`eu" "dq!$c!nnwf"/** *** */"t\040\t";c( +int u , int v){ v?m [u] [v- + 1] |=2,m[u][v-1] & 48?W][v-1 ] & 15]]):0:0;u?m[u -1][v]|=1 ,m[ + u- 1][ v]& 48? W-1 ][v ]& +15] ]):0:0;v< 255 ?m[ u][v+1]|=8,m[u][v+1]& 48? W][ v+1]&15]] +):0 :0; u < 255 ?m[ u+1 ][v ]|= +4,m[u+1][ v]&48?W+1][v]&15]]):0:0;W][ v]& 15] ]);}cu(char*q){ return + *q ?cu (q+ 1)& 1?q [0] ++: +q[0 ]-- :1; }d( int u , int/**/v, int/**/x, int y){ int +Y=y -v, X=x -u; int S,s ;Y< 0?Y =-Y ,s, +s=- 1:( s=1);X<0?X=-X,S =-1 :(S= 1); Y<<= 1;X<<=1; if(X>Y){ +int f=Y -(X >>1 );; while(u!= x){ +f>= 0?v+=s,f-=X:0;u +=S ;f+= Y;m[u][v]|=32;mvwaddch(w,v ,u, m[u + ][ v]& 64? 60: 46) ;if (m[ u][ +v]&16){c(u,v);; ;;; ;;; return;}} }else{int f=X -(Y>>1);; while + (v !=y ){f >=0 ?u +=S, f-= Y:0 + ;v +=s ;f+=X;m[u][v]|= 32;mvwaddch(w,v ,u,m[u][v]&64?60:46);if(m[u + ][ v]& 16) {c( u,v ); + ; return;;;}}}}Z( int/**/a, int b){ }e( int/**/y,int/**/ x){ +int i ; for (i= a;i <=a ++S;i++)d(y,x,i,b),d(y,x,i,b+L);for(i=b;i<=b+L;i++)d(y,x,a,i),d(y,x,a+ S,i + ); ;;; ;;; ;;; ;;; ; + mvwaddch(w,x,y,64); ;;; ;;; ;;; prefresh( w,b,a,0,0 ,L- 1,S-1 +);} main( int V , char *C[ + ] ){FILE*f= fopen(V==1?"arachnid.c"/**/ :C[ 1],"r");int/**/x,y,c, +v=0 ;;; initscr (); Z(Z (raw + () ,Z( curs_set(0),Z(1 ,noecho()))),keypad( stdscr,TRUE));w =newpad + ( 300, 300 ) ; for (x= 255 ; x >=0 ;x-- + ) for (y= 255 ;y>=0;y-- )m[ x][ y]= 0;x=y=0;refresh( );while + ( (c= fgetc (f) )+1) {if( +0||c==10|| x== 256){x=0;y++;if(y==256 )break;;} else{m[x][y]=(c == +'~' ?64 : c ==32 ?0: 16) ;;x ++; + }}for(x=0 ;x< 256;x++)m [x][0]=16 ,m[ x][ 255]=16;for(y=0 +;y< 256 ; y ++) m[0 ][y ] = 16, +m[255][y] =16 ;a=b=c=0; x=y =1; do{v++;mvwaddch (w, y,x ,m[ +x][ y]& 32? m[x ][y ] & 16? + 0| acs_map[l[m[x][y]&15]]:46 : 32);c==0163&&!(m[x][y+1]&16)?y++: 0;c + == 119 &&! (m[ x][ + y- 1]& 16) ?y--:0;;c ==97 &&!(m[x-1][y]&16)?x--:0;c==100&&!(m[x+1 + ][ y]& 16) ? x ++:0 ;if( c== + 3- 1+1 ){endwin( );; return(0) ;}x -a<5?a>S- 5?a-=S-5:(a=0): +0;x -a> S-5?a<255 -S* 2?a +=S +-5:(a=256-S):0; y-b<5?b>L-5?b-=L-5:(b =0) :0; y-b>L-5?b<255-L *2? +b+= L-5 :(b =256 +-L) :0;e(x,y);if(m[x][y]&64)break;}while((c=getch())!=-1);endwin();cu(Q); +printf(Q,v);} + diff --git a/2004/arachnid.hint b/2004/arachnid.hint new file mode 100644 index 000000000..ac1fbe43d --- /dev/null +++ b/2004/arachnid.hint @@ -0,0 +1,54 @@ +Best use of Vision: + + Nick Johnson + 25 Harvey Tce + Richmond + Christchurch + New Zealand + + http://www.notdot.net/ + + +Judges' Comments: + + To build: + + make arachnid + + Try: + + ./arachnid + ./arachnid arachnid.info + + The fun part comes when you realize that the maze scrolls. The overall + visual effect is quite pleasing (at least on some displays), and, well, + it's a lot of fun. + + Navigation is through the use of the "wasd" inverted-T formation on + Qwerty keyboards. Rogue players, vi users, and Dvorak typists are + invited to get lost! + + +Selected Author's Comments: + + This program accepts ASCII formatted mazes as input, and renders + them onscreen for the user to explore, complete with Line Of Sight + - you cannot see parts of the maze your avatar (the '@') could not + have seen. + + The maze files will be interpreted with spaces ' ' as gaps, tilde + '~' symbols (if any) as exits (which get represented as a NetHack + style '<' once loaded), and any other characters as walls. + + Feed the program its own source for a default maze. Running it with + no command line parameters will do this. In a nice symmetry, the + character constant '~' that recognises exits to input mazes itself + forms the exit to the default maze. Another maze, 'maze1' has also + been provided. This maze is 255x255, about the largest maze supported, + for the particularaly insane maze explorers out there. + + Usage: + ./prog.c [mazefile] + + You can explore the maze using the w,a,s, and d keys. + diff --git a/2004/arachnid.info b/2004/arachnid.info new file mode 100644 index 000000000..9657d1f6c --- /dev/null +++ b/2004/arachnid.info @@ -0,0 +1,256 @@ ++ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ + + + + +-+ + + +-+-+ + +-+ + +-+-+ + +-+ + + + +-+ + + +-+-+-+ +-+-+-+-+ + +-+ + + + +-+-+-+ + +-+-+ +-+ + + + + + +-+ +-+-+-+ + + +-+-+-+-+-+ + +-+-+-+-+ + + +-+ + + + +-+ +-+-+-+ + +-+-+ +-+ + + + +-+-+ +-+ + + +-+ +-+-+ + +-+ + + + +-+ + +-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+ +-+-+ +-+ + + +-+-+ + +-+ + + +-+ + +-+-+ + + + +-+ +-+-+-+-+ + +-+ +-+-+ + +-+ +-+-+-+ + + + +-+-+ + +-+ +-+ + +-+ +-+-+-+ +-+ +-+-+ + +-+-+-+-+-+-+-+-+-+ + + + +-+ +-+-+-+ +-+ + + + +-+ + + + + + + +-+-+ +-+ +-+ + + +-+ + +-+-+ +-+-+ +-+-+-+-+ + +-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ +-+-+ + +-+ + + + + + + + +-+-+ + +-+ +-+-+ + + +-+ +-+-+ + +-+-+-+ +-+-+-+ + + + + +-+-+-+-+-+ +-+-+ + + + +-+ +-+ + + + +-+-+ + +-+ + +-+-+ + +-+-+-+ +-+ +-+-+ +-+ + +-+ +-+-+ +-+-+ + +-+-+ +-+ + + +-+-+-+-+-+-+ + + +-+-+-+ +-+ +-+-+ + +-+ + +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+ +-+ + + +-+-+ + + + + +-+-+ + + +-+-+ + + + +-+-+-+-+ +-+-+ + + +-+ +-+ + + + + +-+ +-+ + +-+-+ + +-+-+ + + +-+ +-+-+ +-+ +-+-+-+ +-+-+ +-+-+-+-+ + +-+ +-+-+ +-+ + +-+-+-+-+-+-+-+ + + + + + + +-+-+-+ +-+-+-+ +-+-+ +-+-+-+-+-+ +-+-+-+-+-+-+ +-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + + + +-+-+ +-+-+ + +-+ + + +-+ + + + + +-+ +-+-+-+-+-+ +-+-+-+-+ + + +-+-+-+ + +-+ + +-+ + + +-+-+ +-+ +-+ + + + + + +-+-+ + +-+-+ +-+-+ +-+-+-+-+-+-+ + + + + +-+ +-+-+-+ +-+ + + + +-+-+ + + + + + +-+ + + + + + +-+ + + + +-+-+-+-+ +-+-+-+-+-+-+-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+-+-+ + + +-+ +-+-+ + +-+-+-+ + +-+-+ +-+-+-+ + +-+ + + + + + + +-+-+-+ + + +-+ +-+-+-+-+-+-+ + + +-+ + + +-+ + +-+-+ + + + +-+-+-+-+ + +-+-+ +-+-+-+ + +-+ + + + + +-+-+ + + +-+-+-+-+ + +-+ + + + +-+ + +-+ +-+ + + +-+ + +-+ +-+-+ + + + + + +-+-+ + +-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ + +-+ +-+-+ + + +-+-+ + +-+ + +-+-+-+ +-+-+ + + + +-+-+-+-+ +-+ + + +-+-+-+-+ +-+-+ + +-+ +-+-+ + +-+-+-+-+-+ +-+ +-+ + +-+-+-+ + +-+-+-+-+-+ +-+-+-+-+ +-+ + +-+-+ +-+-+-+-+-+-+-+ +-+-+ +-+-+-+ + + +-+-+-+ + +-+-+ + +-+-+-+-+ + +-+ + + + +-+ + +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+ + +-+-+ + +-+-+ + +-+ + +-+-+-+-+-+-+ +-+ + + + + +-+-+-+-+ + +-+-+-+ + +-+-+ + +-+-+ +-+ +-+ + + +-+-+-+ +-+ + +-+-+ + + + +-+-+-+-+-+-+-+-+ +-+-+ + + +-+ + +-+ +-+-+-+-+ + + +-+ + +-+-+ + + +-+-+ + + +-+-+ + + +-+ + +-+ +-+-+ +-+-+ +-+ + + +-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+-+-+ +-+-+-+ + + +-+-+-+-+ + +-+ +-+ + + +-+-+ + + + +-+-+-+ +-+ +-+-+ + +-+ +-+-+ + +-+ +-+ +-+-+ + +-+-+-+ +-+-+-+ +-+-+-+-+ +-+ + + +-+-+ +-+ + + + +-+ +-+ + +-+-+ + +-+ + +-+ +-+-+ + +-+ +-+-+ +-+-+-+ + +-+ + +-+-+-+ +-+-+ + + +-+-+ + +-+ + +-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+ + +-+ +-+ + +-+-+ +-+ +-+-+ +-+ + + + +-+ +-+-+ +-+ +-+-+ + + +-+ + + + +-+ + +-+ +-+ +-+ +-+ +-+-+-+ + +-+-+-+-+ + + + + + + + + + +-+-+-+ + + + +-+ + +-+ +-+ +-+-+ + + +-+ +-+-+ + + +-+-+ + +-+-+ +-+ +-+ + + +-+-+ + +-+-+-+ + +-+-+ +-+-+-+-+-+-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+ + +-+-+-+ +-+-+ + + + +-+ +-+ + +-+-+ +-+ +-+ +-+ +-+-+ +-+-+-+-+-+-+ + +-+ +-+-+ + + + +-+ +-+ +-+-+-+-+-+ + +-+-+ +-+-+ + + +-+ +-+ + +-+ + +-+ +-+ +-+-+-+-+-+-+ +-+ +-+-+ + + +-+-+ + + +-+ +-+ + + + +-+-+ +-+-+ +-+-+ + +-+-+ + + + + + + +-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + +-+ +-+-+-+-+ +-+ +-+-+-+ +-+-+-+ + + +-+ + +-+-+ +-+-+-+-+ +-+ + + +-+-+-+ + + + +-+ +-+-+-+ +-+ + + + +-+-+-+ + +-+ + + +-+ + + +-+ +-+-+-+-+-+ +-+ +-+-+-+-+-+ + +-+-+-+ + + +-+-+ +-+-+ +-+ +-+-+-+-+-+-+ +-+-+-+-+-+ + +-+-+ + + + + + +-+ + +-+ +-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+ + +-+-+-+-+-+ +-+ +-+ + + +-+ +-+-+ + +-+-+-+-+-+ + +-+-+-+ +-+-+ + + + +-+ +-+-+ +-+-+ +-+-+ +-+ + +-+ + + +-+ + +-+-+-+-+-+-+ +-+ +-+ + + +-+ + + +-+-+ + + +-+-+-+ + +-+-+-+-+ +-+ + + + + + + +-+-+-+-+-+ +-+ + + + + + +-+-+-+ + + +-+ + +-+-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ +-+ + + + + +-+ + + + + +-+ +-+-+-+-+ + +-+-+-+ + +-+-+ + +-+-+ +-+-+-+ +-+-+-+-+ + + + + + +-+ + + + + + +-+-+ + + + +-+-+-+ + +-+ +-+ + + +-+ + +-+-+ + +-+ + +-+-+ + +-+ + +-+-+-+ +-+ + + + +-+-+-+-+ + +-+-+ + + +-+-+-+-+ +-+-+-+-+-+ + + + + +-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+ +-+ +-+-+ +-+ + +-+-+ +-+-+ + +-+-+-+-+-+-+ + + +-+ +-+-+ +-+ +-+-+ +-+-+ +-+ +-+-+-+-+-+ + + + +-+ +-+-+-+-+ + +-+-+ + +-+-+-+-+-+ +-+-+ + +-+ +-+-+ + + +-+-+ +-+ +-+-+ + + + + +-+ + + +-+-+-+-+ +-+-+-+ +-+ +-+-+-+ +-+-+-+ +-+ + + + +-+ + +-+ + + + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ +-+ + + + +-+ + +-+-+ + +-+-+ + + +-+-+-+-+-+-+ +-+ + +-+ +-+-+ +-+-+ +-+ +-+-+-+ + +-+-+-+-+-+ + +-+ +-+-+-+ + +-+-+-+-+ + + +-+ +-+ + + + + +-+ + + + + + + + +-+ + + + + + +-+ +-+-+ + + + + +-+-+-+ +-+-+-+ + +-+-+-+ +-+ +-+-+-+-+ + +-+ + +-+ + + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+ + + + +-+ +-+-+ +-+ + + + +-+-+-+-+ + +-+-+-+-+ + + +-+-+ +-+-+ + +-+-+-+ + +-+-+ + + +-+ + +-+ + +-+ +-+ +-+-+ +-+-+ + + +-+ + + +-+-+-+-+-+ + + + + + + + + + + +-+-+-+-+-+ +-+ + + + + + + + +-+-+-+ +-+-+-+ + + + +-+ +-+ +-+-+ +-+-+ + + + +-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+ + +-+-+-+-+-+-+ + +-+ +-+-+ + + + + +-+-+-+ + + + + +-+-+ + + + +-+-+-+-+-+-+ + + + + +-+ + +-+ + + + + +-+ +-+ + +-+ + + + +-+ +-+-+-+ + +-+-+ + +-+ +-+-+ + +-+-+-+-+ + + + + +-+ + +-+-+ +-+ +-+-+ + +-+ +-+-+ + + +-+-+ + +-+ + + +-+-+-+-+ +-+-+ +-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ +-+ + + + + + +-+ +-+-+ + + + +-+-+ +-+-+-+ + +-+ + + + + +-+-+-+-+-+ + + + + + +-+-+-+-+-+ + + +-+ +-+-+ + +-+-+ + +-+-+-+ + + +-+ + + +-+ +-+-+ +-+ + + +-+ + +-+-+-+ + + + + + +-+-+-+-+ +-+-+ + +-+ + + +-+ + +-+ + + +-+-+-+-+-+ + + + +-+ +-+-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+ + + + +-+ +-+-+-+ + + + +-+ +-+-+-+ +-+ +-+ +-+-+ +-+ + + +-+-+-+-+-+-+-+ +-+-+ +-+ + + + +-+-+-+-+-+-+ +-+-+ + + + + + +-+ + + +-+ + + +-+ + + + + + +-+ +-+ + +-+-+-+ +-+-+-+ + +-+-+-+ + + + + +-+-+-+-+-+ +-+ +-+ + + +-+-+ + + +-+-+ + +-+ +-+ + +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+ + + +-+ + + +-+-+ +-+ + + +-+ +-+ +-+ + + + + + +-+ +-+-+ + + +-+ + + + + +-+-+-+-+ + + + +-+ + + +-+-+-+-+-+ + + +-+ +-+-+-+ +-+-+-+-+-+ + + + +-+ +-+-+-+ +-+ + +-+ + + + +-+-+-+ + + + + +-+-+-+-+ +-+ + +-+-+-+-+ +-+ +-+ +-+-+-+-+ + +-+ + +-+-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+-+-+ + + +-+-+ + + +-+ +-+-+-+-+ + + +-+ + + + + + +-+-+ + + + +-+-+-+-+ + +-+ +-+ + +-+ +-+-+-+-+-+-+ + +-+-+-+-+-+-+ +-+ +-+ + + +-+ + +-+-+-+ + + + + +-+-+-+ +-+-+-+-+-+-+ + + + + + +-+ +-+-+-+-+ +-+ +-+ + + + + +-+ +-+ + + +-+-+-+-+-+-+-+-+ +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+ + +-+-+ + + + + +-+-+ +-+-+-+-+-+ +-+-+-+ +-+-+ + + + +-+ +-+-+-+ + +-+-+ + +-+ + +-+-+ +-+ + +-+-+ + +-+ + + + +-+-+ + +-+ +-+-+-+ +-+-+ +-+-+-+-+-+-+-+ + +-+ + +-+ + +-+ + + +-+-+ + + + +-+-+ + +-+-+-+ +-+-+ + +-+ + +-+-+ + +-+ +-+ +-+ + + +-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+ + +-+-+-+ + +-+ +-+-+ + + +-+-+ + + +-+ + + + +-+-+-+ + + +-+ + +-+ + + + +-+-+ + + +-+ +-+-+ +-+ + + +-+ + + + + +-+ + + + +-+-+-+ + +-+ + + + + +-+ + + + + +-+ + + + + + +-+-+ + + + +-+-+-+-+ +-+-+-+-+ + + + + + +-+-+ + + + + + +-+ + +-+-+-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+ +-+-+ + +-+ +-+-+ + + + + +-+-+ + + +-+ + +-+ +-+ + + + +-+-+-+ +-+-+ +-+-+-+-+-+ +-+-+ + +-+ + +-+ + + + + + + + +-+-+ + +-+ + +-+ + +-+ + +-+-+ + +-+ +-+-+-+ + +-+-+-+-+-+ +-+ +-+-+-+ +-+-+-+-+ + + +-+-+ + +-+-+-+-+ + + +-+-+-+-+-+-+-+-+-+ + +-+-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + +-+-+-+-+-+-+ + +-+ +-+ +-+ + + + + +-+-+ + + +-+-+-+-+ + +-+ + + + +-+-+ + +-+-+ + +-+-+ +-+-+-+-+-+ +-+ +-+-+-+-+-+-+ + +-+-+-+ + + +-+ +-+ + +-+ + + +-+-+-+-+-+-+ + + + + +-+ +-+-+-+ + + + +-+-+-+ + +-+ + +-+-+-+-+ +-+-+ + + + + +-+-+ +-+-+ +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + +-+ + + + + +-+ +-+ + + + +-+ +-+ + +-+-+-+ +-+ + +-+ + + + +-+ + +-+ + +-+-+-+-+ + +-+-+-+ + + +-+ +-+-+-+ + + +-+ + +-+ + +-+-+-+ +-+ +-+ + +-+-+ + +-+ + +-+-+ +-+ +-+ + +-+ +-+ + + + +-+ + + + + +-+-+-+ + + + + +-+-+ +-+-+-+-+-+-+ + +-+ +-+-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+ + +-+-+-+ + +-+ + +-+-+-+ + + +-+-+ +-+ + + +-+ +-+-+-+-+-+ +-+-+ +-+ + + + + + +-+ + + + + +-+-+-+ + +-+-+-+ + +-+-+-+-+ +-+ +-+ + +-+-+-+ + + +-+-+-+ + + + +-+-+-+ +-+-+ + + +-+ + +-+ +-+ +-+-+ +-+ + +-+ +-+-+-+-+ +-+ + +-+-+-+-+-+ + +-+ +-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+-+-+ + + +-+ +-+-+ + +-+ + + + + +-+-+ + + +-+ + +-+ + + +-+ + +-+-+-+ + +-+-+ +-+ + +-+-+ + + + + +-+-+ + +-+-+-+ + +-+-+-+ +-+ + +-+ + + + +-+ +-+-+-+-+-+-+ +-+ + + +-+-+-+-+-+ +-+-+-+ + +-+ +-+-+ + +-+ + +-+-+-+ +-+ +-+-+ +-+-+-+-+-+-+-+-+ +-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+ +-+ + +-+ +-+ +-+-+-+-+-+-+ +-+-+ + +-+ +-+ +-+ + + + + +-+ +-+-+ + +-+-+-+-+ + + + +-+-+ +-+-+-+ +-+-+-+ +-+-+-+ + +-+-+-+-+-+-+ +-+ + +-+-+ + + +-+ + + +-+-+-+-+-+-+ + + +-+-+ +-+-+ +-+ + +-+-+ + + + + + +-+-+ +-+-+-+ +-+ + +-+ + +-+ + +-+-+ +-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ + +-+ + + +-+-+-+-+ +-+ +-+-+-+-+-+-+-+ + + + + + + +-+ + + + +-+-+-+ + + + + + + +-+-+ +-+ + +-+-+-+-+-+ + +-+-+-+ +-+ + +-+ + + +-+ + + + +-+-+-+-+-+-+ + +-+ + +-+ +-+-+ + + +-+-+-+-+-+-+ + + + +-+-+-+ + + + + + + +-+ + +-+ + + + +-+ +-+ + +-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+-+ +-+-+-+-+ + + +-+ + + +-+-+ + + + +-+ + +-+-+ + +-+-+-+-+ + + + + + +-+-+-+-+-+-+ +-+ + +-+-+ + +-+ + +-+-+-+-+-+-+-+ + +-+-+-+-+-+ +-+ +-+-+ +-+ + +-+-+ + +-+-+ + + + + + +-+ +-+ + +-+-+ + + + + + +-+ + + + +-+-+-+ +-+-+-+-+-+ + + + + + +-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+ +-+-+ +-+ +-+-+ +-+-+-+-+-+ + +-+-+ +-+-+-+ + + + +-+-+ + + +-+ + + + + + + +-+-+ + + +-+-+ + +-+ + +-+-+-+ +-+-+-+-+-+ +-+-+ + + + + +-+-+-+ + +-+ +-+-+-+ + + + + +-+ +-+-+-+-+ +-+ +-+-+-+-+ +-+-+ +-+-+ + +-+ + +-+ + +-+ +-+-+ + +-+ + +-+-+-+ +-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ +-+ + + + +-+ +-+ + +-+-+ + +-+-+ + + + + + +-+-+-+ + + +-+ +-+-+-+-+-+-+ + + +-+-+ +-+-+ + +-+ + + + + + +-+-+-+ + + +-+-+-+-+ + + + + + + +-+ + +-+ + +-+-+ +-+-+-+-+-+ +-+-+ +-+-+ + + +-+ +-+-+ + + + +-+-+ +-+-+-+ + + +-+ + + + + + + + + +-+-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+ +-+-+-+-+ + + +-+-+ + + +-+ +-+-+ + +-+ +-+-+ + +-+-+-+ +-+-+ + +-+-+ +-+-+ + + + + + + +-+ + + +-+ + +-+-+-+ + +-+-+ +-+ + +-+-+ + +-+-+-+ +-+ + + + + +-+-+-+ + + + +-+ + +-+-+ + +-+-+ + +-+ +-+ +-+-+-+ + + +-+-+-+ +-+ +-+ + + +-+ + + +-+-+-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+ + + +-+ +-+ + + + +-+ + +-+-+ + +-+-+ +-+-+ +-+ +-+-+ +-+-+-+-+-+ +-+-+ + +-+-+-+ + +-+-+ +-+ +-+ +-+-+-+ + +-+-+-+-+-+ + +-+-+ +-+-+-+ + +-+-+-+-+-+ +-+-+ + +-+-+ + +-+-+ + + + + +-+-+ + + +-+-+-+-+ + +-+ + +-+ +-+-+-+-+ +-+-+-+ +-+-+ +-+-+-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+-+-+ +-+ +-+ + + +-+-+ +-+ + + + +-+ + + + + +-+ +-+ +-+-+ +-+ +-+ + + +-+ + + + + +-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+ + +-+ + +-+ + + +-+ + +-+-+ + +-+-+ +-+-+ + +-+-+-+-+ + +-+-+ +-+ +-+-+ +-+-+-+ + +-+-+-+ + +-+ + +-+ +-+ + + + +-+-+ + + + + +-+ + +-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+-+-+-+-+ + + + + + + + + + + + +-+-+ + + + + +-+ +-+ +-+-+-+ + +-+ + + +-+-+ +-+-+ +-+-+-+ + + +-+-+-+-+-+ + +-+-+-+ +-+ +-+ + +-+ + +-+ +-+-+ + + +-+ + +-+-+ + +-+ + + +-+ + + +-+-+-+-+ + +-+-+ + +-+-+-+-+-+ +-+-+-+ + + + +-+-+ + + +-+-+ + + +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + +-+-+-+-+-+ +-+-+-+-+-+ + +-+ + + + +-+ +-+ + +-+ +-+-+-+ + +-+ + +-+-+-+ + +-+ + +-+ + + +-+ +-+-+ + + + +-+-+-+-+-+-+ +-+ +-+ + +-+ + +-+-+ +-+ +-+ +-+ + + + + + +-+-+ + + + + + + + +-+-+-+-+ + + +-+ + + + + + +-+-+-+-+-+-+ + +-+-+-+ + + +-+-+ +-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+-+ + +-+ +-+-+-+ + +-+-+-+-+ +-+-+-+-+ +-+-+-+ +-+ + +-+-+-+-+-+-+ + + +-+-+-+-+-+-+ + + +-+-+-+ + +-+ +-+-+ + +-+-+ + +-+-+ +-+-+-+-+-+-+ + + + +-+-+ + + +-+ + +-+-+-+-+-+ +-+-+-+-+ + + + +-+-+-+-+-+-+-+-+ + + + + +-+ + +-+-+ + + + +-+-+-+-+-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+-+-+-+ +-+-+ + + + + + +-+ +-+-+-+ + + +-+-+-+-+-+-+ + + + +-+-+ +-+-+ + +-+-+-+-+-+-+ + + +-+ + + + +-+ +-+-+ + +-+-+ + + + + + + + +-+-+-+ +-+ +-+ + +-+-+ +-+ +-+-+-+ + + + +-+ + +-+ + +-+ + + +-+-+ + +-+-+-+ +-+ + +-+-+ + +-+-+-+ +-+-+ + + + + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+ + + + +-+-+ + +-+-+ + +-+ +-+-+-+ +-+-+ + +-+-+ + +-+-+-+-+ + + + + +-+-+-+-+ + +-+ + +-+-+ + + + +-+-+ +-+ +-+-+ + +-+-+ +-+-+-+-+-+-+-+-+-+-+ +-+ +-+-+ +-+ + + + +-+ +-+-+-+ +-+-+ + + + + + + +-+ +-+-+-+-+-+ +-+-+ +-+ + +-+ +-+-+ + + + + +-+-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+-+-+ + +-+-+-+-+-+-+-+ + + + + + + +-+-+-+ + + +-+ + + + +-+-+ + + + +-+-+ + +-+ + + +-+ +-+-+-+ +-+-+ +-+-+ +-+-+-+-+ +-+ +-+-+-+-+ + + + +-+-+ +-+-+ +-+-+-+-+-+-+ + + +-+ +-+ + + + + + + + +-+-+-+-+ + +-+-+-+ + +-+ +-+-+ + +-+ + + +-+ +-+-+ +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+-+-+ + + + +-+ + + + +-+-+ + +-+-+-+-+-+ + +-+-+-+ + +-+ + + +-+-+ + +-+-+ + +-+ + + +-+-+-+-+-+-+-+ + +-+-+ +-+ + + + +-+ +-+ + + + + + + + + + + + +-+-+-+ + + +-+ + +-+-+ + +-+-+-+-+ + +-+-+ + +-+ + +-+-+ + + + + + +-+-+-+-+-+ +-+ + +-+-+-+ + + +-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + +-+-+-+-+ + +-+-+ + + + +-+-+-+-+-+ + +-+-+-+-+-+-+ + +-+ +-+ + +-+-+-+-+-+-+-+-+ +-+-+ + +-+-+-+-+-+-+ + + + + +-+-+-+ +-+ +-+-+-+-+-+ +-+-+ +-+-+ + +-+-+ + + + +-+-+ + +-+-+ + +-+-+ + + + +-+-+ + +-+ + +-+ + + +-+ +-+ + +-+ +-+ + +-+ +-+ + +-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ + +-+ +-+-+ + +-+-+-+-+-+ +-+ + +-+-+ + +-+-+-+ + + + +-+ + +-+-+-+-+ +-+ +-+ +-+-+ + + + + + + + + + +-+-+-+ +-+ +-+-+-+-+ +-+-+ +-+ + +-+-+-+-+ +-+ +-+ +-+ + +-+-+-+-+-+ +-+ +-+ +-+-+ + +-+-+-+-+-+-+-+-+-+-+ +-+-+-+ +-+-+ + + +-+-+-+-+ + +-+-+-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + + + + +-+-+-+-+ +-+ +-+ +-+-+-+-+-+ + +-+-+ + +-+ + + + +-+-+ + + + + +-+-+ +-+ + + +-+ +-+-+ +-+-+ +-+-+ + +-+ + + +-+-+ +-+-+ + +-+-+ +-+-+-+ +-+ +-+-+ +-+-+ + +-+-+ + +-+ +-+ +-+-+ + + + + +-+ + +-+ + +-+-+ + +-+-+-+-+ + +-+ + + + + +-+-+ + +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+-+-+ + +-+ + +-+ + + + +-+ + +-+-+ + + + +-+ +-+-+ + +-+-+-+-+ + + +-+ + + + +-+-+ + + + +-+-+ +-+ + + +-+-+-+-+ + +-+-+ + +-+-+-+ + +-+-+-+-+-+ + +-+-+-+ + + + +-+ +-+-+ + +-+-+-+ + +-+-+ + + +-+-+ + + + + + +-+-+ + +-+-+-+ +-+-+ + +-+-+-+-+-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ + +-+-+-+ +-+ +-+-+-+-+ +-+-+-+ + +-+ +-+-+ +-+-+-+ +-+-+ + +-+-+ +-+ +-+-+-+ + + + +-+-+-+-+ +-+ +-+ + + +-+ + +-+-+ + +-+ + +-+-+-+ + + + + + + +-+ + +-+-+-+-+-+ + +-+-+-+ +-+-+-+-+ + + +-+-+-+-+-+-+-+-+-+ +-+ + +-+-+ +-+-+-+ + +-+ +-+-+-+-+-+-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+ +-+ + +-+-+ + +-+-+-+ + +-+-+-+-+-+-+ +-+-+ +-+ + + +-+-+-+-+-+-+-+-+ + + +-+ +-+-+-+-+-+-+ + + +-+-+ +-+-+-+ + +-+ + +-+-+ +-+ + + + +-+ + + + +-+-+-+-+-+ + + + +-+ + + + +-+-+-+-+ +-+-+ + + +-+ + +-+-+ + + + +-+-+ + + +-+ +-+ +-+-+ +-+ +-+-+ + + + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ +-+-+-+ + +-+-+-+-+-+ +-+-+-+-+-+-+-+ +-+-+ +-+ +-+-+ +-+-+-+-+-+-+-+ +-+ +-+-+-+ + +-+ +-+-+ +-+ + + +-+-+-+-+-+-+-+ + + + + +-+-+-+ +-+-+-+-+-+ + + + +-+-+ +-+-+-+ +-+-+ + +-+ + +-+ +-+ + + +-+-+-+ + +-+ + +-+ +-+-+-+-+ + + + +-+-+-+-+ + +-+-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+ +-+ +-+ + +-+-+ + + +-+ + +-+-+-+ + + +-+ + + + + +-+ + + +-+ + +-+ + +-+-+-+ + +-+-+ + + +-+ +-+ +-+-+-+ + +-+-+-+-+-+ +-+ +-+-+-+ + +-+ + +-+-+-+-+-+-+ + + +-+-+ + +-+-+ +-+ + +-+-+-+-+ +-+-+-+ + +-+-+ + +-+-+ +-+-+-+ + +-+-+-+ + + + + +-+-+ +-+-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ +-+-+-+-+-+ + +-+ +-+-+-+-+-+-+-+ +-+ + + + + + + + +-+-+ +-+-+-+ + + + + + +-+ + +-+ +-+ +-+ + + + +-+-+-+ + + +-+-+-+-+-+ +-+-+-+-+ +-+-+ + +-+-+ + + + +-+ +-+-+ + + + + +-+ + + + + +-+ +-+ +-+-+ + + + +-+-+ +-+-+ + + + +-+-+-+ + +-+-+-+ +-+ + + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+ + + + +-+-+-+ +-+ +-+ +-+ + + +-+ +-+-+ + +-+ + + + +-+-+ +-+-+-+-+-+-+-+-+ + + + + + +-+ +-+-+-+-+ + + +-+-+-+-+-+ +-+ + + +-+-+ +-+ + +-+ + +-+-+ +-+-+ + + +-+-+ +-+ + + +-+ +-+ + + + + +-+ +-+-+ +-+ +-+ +-+ + +-+-+-+ + + + +-+-+ + + +-+ +-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+ +-+-+ + +-+ + +-+ + + + + +-+-+-+-+-+ + + +-+ +-+ + + + + +-+-+-+-+ + + +-+-+-+ + + +-+-+ +-+ + + + +-+ +-+ + +-+-+ + +-+-+ +-+-+-+ + +-+ + +-+-+-+ +-+-+ +-+-+-+ + +-+ + + + + +-+ +-+-+-+-+-+-+-+ + +-+ +-+ + + +-+ + +-+-+-+-+-+ + + +-+-+ + + +-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + + +-+-+ +-+-+-+-+ + +-+ +-+-+-+-+ + + +-+-+ + + +-+-+ + + +-+ + + + + +-+-+-+ + +-+ +-+-+ +-+-+-+-+-+ +-+ +-+-+ + + + +-+-+-+ +-+ + + +-+-+-+ +-+ + + + +-+-+ + +-+-+-+-+-+-+-+-+ + + +-+ + +-+-+ + +-+ +-+-+-+ +-+-+-+-+ + +-+-+ +-+-+-+ + + +-+-+ + + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+ + +-+-+ +-+-+-+-+-+ + + +-+-+ + +-+-+ +-+-+-+-+ +-+-+ +-+ + +-+-+ + + +-+-+-+-+ + + + + + + + +-+ +-+ +-+-+-+ +-+ + + +-+ +-+ + + +-+ + +-+-+ +-+-+-+-+-+-+-+-+ + +-+-+ + +-+-+-+-+ + +-+ +-+ +-+-+ +-+-+-+ + + +-+-+ + + + + + + + +-+ + +-+-+ +-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+ +-+-+ + +-+-+-+ + + +-+-+ + + +-+-+ +-+-+-+-+ +-+ +-+-+-+ + + + +-+-+ + + +-+-+ + +-+-+ +-+-+ + +-+-+ + +-+-+-+-+ +-+ +-+ +-+ +-+-+-+ +-+-+ +-+ +-+-+-+-+-+-+-+ +-+-+ + + + + +-+-+ + +-+ +-+ + + + + + + + +-+ +-+ + +-+ + +-+-+ + + + +-+-+-+-+-+ +-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+ + +-+-+ + +-+-+-+ + + +-+-+-+ +-+-+ + +-+ +-+ + + +-+ +-+-+-+-+ +-+-+-+-+-+-+ + + +-+-+ + + +-+ + + +-+ + + + + + +-+-+-+ +-+-+-+ + +-+-+-+ +-+ +-+ + + +-+ + + + +-+-+ + + + + +-+-+ +-+ +-+-+-+ +-+-+ + + + +-+-+ +-+-+-+ + + + + +-+ + +-+ + + +-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+-+-+ + +-+ + +-+ +-+-+-+-+-+ + + + + +-+ +-+-+-+-+ + +-+-+-+ + +-+-+-+ +-+-+ +-+-+-+ +-+-+-+ + + +-+-+ +-+ +-+ +-+ + + + +-+-+ + + +-+-+ + +-+-+ +-+-+ + + + + +-+-+ +-+-+-+-+-+-+ + +-+ +-+ + +-+-+-+-+-+ + + + + + +-+ +-+-+ +-+-+-+ + +-+ + +-+ +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+ + +-+ + + + +-+-+-+-+-+ + + + +-+ +-+-+ +-+-+-+-+-+-+-+-+-+-+ + +-+ + + +-+ + +-+ +-+ + + + + + + +-+ + +-+ + + +-+ +-+-+ + + +-+-+-+ + + + + +-+-+-+ + +-+-+-+ +-+ + +-+-+ +-+ + + +-+-+ +-+ +-+-+-+-+-+-+ + +-+ + + +-+ + + + +-+-+-+ + +-+ +-+ + +-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ +-+-+-+-+-+ + + +-+-+-+ +-+-+ +-+-+-+-+-+ +-+ + + + +-+ +-+-+ +-+-+ + + +-+ + +-+ +-+-+-+ + +-+-+-+-+-+-+-+-+ +-+ +-+-+-+-+ +-+-+-+-+ +-+-+-+-+ + +-+ + +-+ + + +-+-+-+ +-+-+-+-+-+-+-+-+-+-+ +-+-+-+ + + + + +-+-+-+ + + + + +-+ + +-+ + +-+-+-+ + + +-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + + + + + + + + +-+-+-+ +-+-+ + + +-+-+ + +-+ +-+ +-+-+ +-+ + +-+-+-+-+ + + +-+-+ +-+-+-+ +-+-+ +-+-+-+ + + + + +-+-+ +-+-+ + +-+-+-+ + + +-+-+-+ +-+ +-+-+ + + +-+ +-+-+-+ + + +-+-+ +-+ + + +-+-+-+-+-+ +-+-+ + +-+ +-+-+-+-+-+ + + + +-+ + + +-+ + +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+ +-+-+ + +-+-+-+-+-+ + +-+ +-+-+-+-+ + +-+ + + + + + + +-+ +-+-+ + +-+-+-+ + + +-+ + +-+ +-+-+ +-+-+ + +-+-+ + +-+ +-+-+ +-+-+-+ +-+-+-+ + +-+-+ + +-+-+-+ + +-+ + + + +-+ +-+-+-+ + + + +-+ + + + +-+-+ +-+-+-+-+ +-+-+ + +-+-+-+-+-+-+-+-+ +-+ + +-+-+-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ +-+-+-+ +-+-+ + + +-+-+-+ +-+ +-+-+-+ + +-+-+-+-+-+-+-+-+ + +-+ +-+ + + + +-+ +-+-+ + + + + +-+ + +-+-+ + +-+-+-+-+ + +-+-+ +-+-+ + +-+ + +-+-+-+ + +-+ + + + + +-+ + +-+-+ + +-+-+ +-+ + +-+ + +-+ + + + +-+ +-+-+ + +-+ + +-+ + + + + +-+ +-+-+-+ + +-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + + +-+-+-+-+-+-+ + + + + +-+ +-+ + + + +-+ + + +-+ + + + + + +-+-+ +-+ +-+ + +-+ + +-+-+-+-+-+-+ + + +-+-+-+ +-+-+ + + + +-+-+ +-+ + + +-+-+ + + +-+ + +-+-+-+ +-+ +-+ + + + +-+-+ + + +-+-+ + +-+ + + + +-+-+-+ +-+-+-+-+-+-+ + + + +-+ +-+-+ +-+ + +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+-+-+ + + + + + +-+ +-+-+-+-+-+ + +-+-+-+ +-+ + + +-+-+ + + +-+ + +-+-+-+ + + +-+-+ + + + + +-+ + + +-+ + + +-+-+ +-+ +-+-+-+ +-+ +-+ +-+-+ +-+-+-+ +-+-+ +-+ +-+-+ +-+-+ +-+ +-+ + + +-+ + +-+-+-+-+-+-+ + +-+ + + +-+ +-+-+-+ +-+-+ + + +-+-+-+ +-+ + +-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+-+-+-+-+ + +-+-+-+ + +-+ + + +-+-+-+ +-+ +-+-+-+ + +-+ + +-+ + + + + + +-+-+ +-+-+ + +-+-+ +-+ + + +-+-+-+-+ + + +-+ + +-+-+-+-+-+-+-+-+-+ +-+ + + +-+-+ + +-+ + + +-+-+ +-+ + +-+ + +-+ + + + +-+-+ + + + +-+-+ + +-+ +-+-+-+ +-+-+ +-+-+-+-+-+ +-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ + + + + + + + + + +-+-+ + +-+ +-+-+ + + +-+ +-+ +-+-+ + +-+ +-+-+-+-+-+ + + + + + + + +-+ +-+ + +-+-+ +-+-+ +-+ +-+ + +-+ +-+-+ + +-+-+-+ +-+-+ +-+-+-+ + + + + +-+-+ +-+-+-+-+-+ +-+ + +-+-+-+-+-+ + +-+-+-+ +-+-+ + +-+ + + +-+ + +-+-+-+ + + + + +-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+-+-+-+ +-+-+-+-+ +-+ +-+-+-+-+ + +-+-+-+ + +-+-+-+ +-+-+-+-+-+ +-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+ + + + +-+-+ + +-+ + + + + + + +-+ +-+-+-+ +-+ +-+ + +-+-+-+-+ +-+ + +-+ + +-+-+-+-+ + +-+ + +-+-+-+-+ + + +-+ + + + +-+ +-+-+ + +-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + +-+ + +-+-+ + +-+ +-+ +-+ + +-+-+-+ + + +-+-+-+ + +-+ +-+-+ +-+ + +-+ + + +-+-+-+-+-+-+ + + + +-+-+ + +-+-+ + + +-+ +-+ +-+-+ + + + + + + +-+ + + +-+ +-+ + + +-+-+ + +-+-+-+-+-+ +-+ +-+ + +-+-+ +-+-+-+-+-+ +-+-+-+-+-+ + + +-+-+ + + +-+-+-+ + +-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+ +-+-+-+-+-+-+ +-+-+-+ +-+ + + + + +-+-+ +-+-+-+ + + + +-+-+ +-+-+ + + +-+-+ + +-+ +-+-+-+ +-+-+ +-+-+-+ + + +-+ +-+-+-+ +-+ +-+ +-+-+ + + + +-+ + +-+ + +-+-+-+ +-+ +-+ + + + +-+ + +-+-+ +-+ + + + +-+-+-+-+-+-+-+ + +-+ + + + + +-+-+ + + + +-+ + +-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+ +-+ +-+-+-+-+ +-+-+ + +-+ + + +-+-+-+-+ + + + +-+-+-+-+-+-+-+-+-+ +-+ +-+-+-+-+-+-+-+ +-+ +-+-+-+ +-+-+ +-+ + + +-+ + + +-+-+-+ +-+ + +-+-+-+ + + +-+-+-+-+ +-+ +-+ +-+ + + +-+-+-+-+-+-+-+ + + +-+-+-+ + +-+-+ + + + +-+ + +-+-+-+-+ +-+-+ +-+-+ + +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + + +-+ + + +-+-+ + +-+-+ + +-+-+ + + + + + + + + +-+-+-+ + +-+-+ +-+ +-+-+ + + +-+ + +-+-+-+ +-+ +-+-+-+-+ + +-+-+-+-+ +-+-+-+-+-+-+ +-+-+ + + + +-+-+ +-+ + + + + +-+ +-+ + +-+-+-+-+-+-+-+-+-+-+ + + +-+ +-+ +-+ + +-+ +-+-+ +-+-+ + +-+-+ + + +-+-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+-+ + + + +-+ + +-+-+ + +-+-+ + + + + + +-+-+-+-+ +-+ +-+ + +-+-+-+-+ +-+-+ +-+ +-+ + +-+ +-+ +-+ + +-+ + + +-+ +-+ +-+ + + +-+-+-+-+ + +-+-+ +-+-+-+-+-+-+-+ +-+-+ +-+ +-+ + + +-+-+ +-+-+-+-+ + +-+ + +-+ +-+-+-+ + +-+ +-+ + + +-+-+ + +-+ + + +-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+-+ + + + +-+ + +-+-+-+ +-+-+-+-+-+-+-+ + + + + +-+-+ +-+ +-+ +-+ + + +-+ + +-+ + +-+-+-+ + +-+ + +-+-+ +-+ +-+ +-+-+ +-+-+ +-+ +-+ +-+ + + + + + +-+ + + + +-+ + + +-+-+-+-+-+ +-+ + +-+ +-+-+-+-+ + +-+-+ +-+ + +-+-+-+-+-+-+-+ + +-+-+-+-+-+-+ +-+-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+ + + + +-+-+ + +-+-+ + + +-+-+ + +-+ + + + +-+ +-+ +-+ + + + + + + +-+ +-+-+ +-+-+ +-+ + +-+ +-+-+-+ +-+ + + + +-+ +-+ + +-+-+-+ +-+ +-+-+ + + +-+ + + +-+-+ +-+ +-+-+ +-+ + +-+ +-+-+-+-+ +-+-+-+-+-+ +-+-+-+ + + + + + + + + +-+-+ +-+-+-+-+ + + + + + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+-+-+ + +-+-+ + +-+-+ +-+-+ +-+-+ +-+-+-+-+ +-+ + +-+ + +-+ +-+-+-+-+-+ +-+-+ +-+ + + +-+-+-+ + + +-+ + + + +-+-+-+ + +-+ +-+-+ +-+-+ +-+-+ + + +-+ +-+ + +-+ +-+ + +-+ + +-+ + + +-+-+ +-+ +-+-+-+-+-+ +-+ + + +-+ +-+ + +-+ + +-+-+ + +-+ + +-+-+ + +-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + + +-+-+-+-+ + +-+-+ +-+-+ +-+-+-+-+ + +-+ + + +-+-+ +-+-+ +-+-+-+ + + +-+ + + + + +-+ + +-+-+ +-+-+ +-+ + + + +-+ +-+-+ + + + +-+ + + +-+-+-+-+ +-+-+-+ + +-+-+-+ +-+-+-+-+ +-+-+ +-+ + +-+-+ +-+-+ + +-+ + +-+ + +-+ +-+-+-+-+-+ + +-+-+ + + +-+ +-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+-+ +-+ +-+ +-+-+ +-+-+ + + + +-+ + + + + + +-+-+ +-+-+-+-+-+-+ + +-+-+ +-+-+-+ + +-+-+-+-+ +-+ + + +-+ + +-+-+ + + +-+ +-+-+ + +-+-+-+-+ + + + + +-+ + +-+ + + +-+-+-+ + +-+-+-+-+ +-+ + +-+-+ +-+-+-+-+-+ +-+-+ + + +-+ + +-+ +-+ +-+ + + + + + + + + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+-+-+ +-+-+-+ + + + +-+-+ +-+ + +-+-+-+-+-+ + + + + +-+-+-+-+ +-+ +-+ +-+ + +-+-+ + +-+-+-+-+ + +-+ + +-+ + +-+ + + + +-+-+-+-+ + + + +-+-+ +-+-+ + +-+ + + + + + + + + +-+ +-+-+ +-+ + + +-+ + +-+ + + + + + + + +-+ +-+-+-+ +-+ + +-+-+ + + + +-+ + + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ + +-+-+-+ + + + +-+ + + + +-+-+-+ + + + + + + +-+-+-+-+ +-+ + +-+-+ + +-+ + +-+-+-+-+ +-+ + + +-+ + +-+ + + + +-+ +-+-+ +-+ +-+ +-+ +-+ +-+ + + +-+ + +-+-+-+ + + + + +-+ +-+-+-+-+ + +-+-+-+-+ + +-+ +-+ +-+ + + + +-+ +-+ + + +-+-+-+-+-+ + + + +-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+-+ +-+-+-+ + +-+-+-+ +-+-+ + +-+-+ +-+ +-+ + + +-+-+ +-+ +-+-+ + +-+ + +-+-+-+-+-+ +-+ + + +-+ +-+-+-+-+ + +-+ +-+ + +-+ +-+ +-+ +-+-+ +-+-+ +-+-+-+ + + + +-+ +-+ +-+ + + +-+ +-+ + + + + +-+ +-+ +-+ +-+ + +-+-+ + + + +-+-+-+-+ + + + + + + +-+-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+ + +-+-+-+-+ + + + +-+-+-+-+-+ + + +-+ +-+-+-+ +-+-+ +-+ +-+-+ +-+ + + +-+-+-+-+-+-+ + + + +-+ + + +-+-+ + +-+ + + +-+-+-+-+-+ + +-+ + +-+ + +-+ + + + + + +-+ +-+ + + + + +-+ +-+ + + + + +-+ +-+-+-+-+-+ + +-+ +-+ + + + + +-+-+ +-+-+-+-+-+ +-+-+-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + + + + +-+ + + + +-+ + + + +-+-+ +-+ +-+ + + +-+-+-+ + +-+-+-+-+ +-+ + + + + +-+ + +-+-+-+ + + +-+-+-+ +-+-+ +-+ +-+ + + +-+ +-+ +-+ +-+ + + + +-+ +-+-+ +-+ +-+ + + + + +-+ + + + +-+-+ +-+ + +-+ + +-+-+-+-+ +-+-+-+-+ + + +-+-+-+-+ + +-+-+-+ +-+ + +-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+ + + + +-+-+ +-+ + + + +-+ +-+ +-+-+-+ + +-+-+-+-+-+-+ + + + +-+-+ +-+-+ + + +-+ + + + +-+ +-+-+-+ +-+-+-+ + + + + + +-+ +-+ +-+ +-+ +-+-+ + +-+ + + +-+-+ + +-+ + + +-+ + +-+ + + +-+-+ +-+ + + + + + + +-+-+-+-+ + + + +-+ + + + +-+ +-+ + +-+ +-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + +-+ +-+ + + + + +-+ + + + +-+ +-+ + + +-+-+-+-+ + +-+ +-+-+ +-+-+ + +-+-+-+-+-+ +-+-+ +-+-+-+-+ + + + +-+-+-+ +-+-+-+-+-+ + +-+-+ + +-+ +-+-+ +-+-+-+-+ +-+-+-+ +-+-+-+ +-+ +-+-+-+-+-+ +-+ +-+ +-+-+ + +-+ + + + +-+-+-+-+-+ + +-+-+ +-+ + + + + +-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+-+ +-+-+-+ + + +-+-+ + + +-+-+ + + +-+-+ + +-+-+-+-+ +-+-+ +-+-+ + +-+-+ + + +-+-+ + +-+-+-+ + +-+ +-+-+ +-+ +-+ +-+-+ + + + + + +-+-+-+-+ + + + + +-+ + +-+-+-+ +-+-+ +-+-+-+ + +-+ +-+-+ +-+ + + + + +-+ +-+-+-+ +-+-+ + +-+-+ + + +-+ + +-+-+-+ + +-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + + +-+ + + +-+-+-+ +-+ + + +-+-+ +-+ + + + +-+-+ +-+-+ + + +-+ + + + +-+-+ +-+-+-+-+-+ + +-+-+-+ +-+-+-+-+ +-+-+-+ +-+-+-+ +-+-+ + +-+-+-+-+ + + + + +-+ +-+ + +-+ + + +-+-+ + + + +-+ + +-+-+-+ + +-+-+ +-+-+-+ + +-+ +-+ + + +-+ +-+ +-+ + + + + + + +-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+ + +-+-+ +-+-+-+ + + +-+ +-+-+ +-+ +-+-+ +-+-+ +-+ + +-+-+ + +-+-+ + +-+ +-+ +-+ + +-+-+-+ +-+ +-+-+ + +-+-+ + + +-+-+-+-+-+ + + +-+-+ + + +-+-+ +-+ +-+-+ +-+-+-+-+ + + +-+-+-+-+ + + +-+-+ + +-+-+-+ + + + +-+-+-+-+-+ +-+ +-+ +-+-+-+ + + +-+ + +-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + + + + + +-+-+ +-+-+-+ + +-+-+-+ + + + + + + +-+ +-+ + + +-+-+-+-+-+-+ +-+ +-+ + + + +-+ + + +-+ +-+-+ + +-+ +-+-+-+-+ + + + +-+-+ + +-+ + + + +-+ +-+ + +-+-+-+-+ + +-+-+ +-+-+ + +-+-+-+ +-+ + +-+ + + +-+ +-+-+ +-+ + + +-+-+-+ +-+-+ +-+-+ + +-+ +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+-+ +-+ + + + + + +-+-+-+ + +-+-+ + + +-+-+ + +-+ + + + + + + + + + +-+ +-+ +-+-+-+-+ +-+-+-+ + +-+ +-+-+ + + + +-+-+ +-+-+ + +-+-+ + +-+ + +-+ + + +-+ + +-+-+ + + + +-+-+ +-+-+ + +-+ +-+-+-+-+ + +-+-+-+-+ +-+-+ +-+ +-+-+-+ + + + +-+ + +-+ + +-+-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+ +-+ + + +-+-+-+-+ + + +-+ +-+ +-+ + +-+-+ +-+ +-+-+ +-+ +-+-+-+-+-+ +-+ +-+ +-+ + +-+ +-+ + + + +-+-+-+-+-+-+-+ + +-+ + +-+ +-+ + +-+ + +-+-+-+ + +-+-+ + + +-+-+ +-+-+ + +-+-+-+-+ +-+-+-+-+ + + + +-+ + +-+ + +-+-+-+ +-+ + +-+ + + + + + +-+ + + + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ +-+-+ + + +-+ + +-+ + +-+ +-+ +-+ + +-+-+-+-+ + +-+ + +-+-+-+ +-+-+ +-+ + +-+ + + +-+ + + +-+ + + + + + +-+-+ + +-+-+-+-+ + +-+ + +-+ +-+ + + +-+-+ +-+-+-+-+ +-+ +-+-+-+ + +-+ +-+ + + + + + +-+-+-+-+ + +-+-+-+-+ +-+ +-+ + +-+-+-+-+ + +-+-+ + +-+-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+ +-+-+ + + + + + +-+-+ +-+ +-+ + +-+-+-+-+ + +-+ + + + +-+ + + + +-+ + +-+ +-+ +-+ + +-+-+ +-+-+ + +-+-+-+-+-+-+ + +-+-+-+-+-+ +-+ +-+-+-+-+-+-+ + + +-+ + + + +-+ +-+-+-+ + +-+-+-+ + + + + + +-+-+-+-+ + +-+ +-+-+ +-+ +-+ + + +-+-+-+-+-+-+ + +-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + + + + + + +-+-+ +-+ + +-+ + +-+-+-+-+ + +-+-+-+-+ +-+ + + + + +-+-+ + +-+ +-+-+ +-+-+ + + + + +-+-+ + + + +-+-+ + + + + + +-+ +-+ +-+-+-+ + +-+-+-+-+ + +-+ +-+-+ + + + + +-+-+-+ +-+-+ +-+-+ + + + + +-+-+-+ + +-+ +-+ + + +-+-+-+ + + +-+-+ + +-+-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ +-+-+ + + + + +-+ + +-+-+-+-+-+-+ + +-+-+-+ + + +-+ +-+-+-+-+-+ + + + +-+-+ + +-+ + +-+ + +-+ +-+ +-+ +-+-+-+ + + +-+-+-+-+-+-+-+ +-+-+ +-+-+ + +-+-+-+-+ +-+-+ + +-+-+ +-+ + +-+-+ + + + +-+-+-+ +-+ + +-+-+-+-+-+-+-+-+-+-+ +-+-+ + + + + + + + + + + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+ +-+-+ + +-+-+-+-+ + + +-+-+ +-+-+ + +-+-+-+ +-+ +-+ +-+ +-+-+-+-+ +-+ +-+ + +-+ +-+-+ +-+-+-+ + + +-+-+-+ + + + + +-+ + + + + + + +-+ + +-+ + +-+ +-+-+-+-+ +-+ +-+-+-+-+-+ + + +-+ + + +-+-+-+ + +-+ +-+-+ + + + + + +-+ + +-+-+-+-+-+ + +-+ +-+-+-+-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ + + + + + + + +-+-+-+-+ + + + + +-+ +-+ +-+ +-+ + +-+-+ +-+-+ +-+ +-+ + +-+-+-+ + +-+ +-+ + + + + +-+-+-+-+-+ + +-+-+-+-+ + + +-+ +-+ + + +-+-+-+ + + + + + + +-+-+ + + +-+-+-+-+-+-+ +-+-+ + +-+ +-+-+-+-+ + + + +-+ + + + + + +-+ +-+-+ + + + +-+-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+ + +-+-+ +-+ + +-+ + +-+ + + +-+-+-+ + + +-+ +-+ +-+ + + + + +-+-+ +-+-+-+-+ + +-+ + + +-+-+ + + +-+-+ + +-+-+ + +-+ + +-+ +-+ +-+ +-+-+-+-+ +-+-+-+-+-+-+-+-+-+ + + + +-+-+ +-+-+ + +-+-+ +-+-+-+ +-+ + +-+-+-+ + +-+-+-+ +-+-+ + +-+-+ + +-+ + + +-+-+-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+ + +-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+ + + +-+ +-+ +-+-+ + +-+-+ +-+-+-+-+ + +-+ + +-+-+-+ +-+-+-+-+-+-+-+ +-+ + + +-+-+-+-+ +-+ +-+ + +-+ + +-+ +-+-+ + +-+-+-+-+ + +-+ +-+ + +-+-+ + + +-+ + + +-+ + + + +-+-+-+ + +-+-+ +-+-+ +-+ + + + + +-+ +-+-+-+ +-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + +-+-+-+-+ + + + +-+-+-+-+-+-+ + + + + + + + + + + +-+ +-+ + +-+-+-+-+ + +-+-+-+-+-+ + + +-+-+-+-+ + + +-+ + +-+-+ + +-+-+-+ +-+ + + + +-+-+ + + + +-+-+-+ +-+-+ +-+ +-+ +-+-+-+ +-+ + + + + + + +-+-+ +-+-+ +-+ +-+ +-+-+ + +-+-+ + +-+ + + +-+ +-+ +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+ + +-+-+-+-+-+-+-+ + +-+-+ + +-+-+-+-+ +-+ + + +-+-+ +-+ + + +-+-+-+-+-+-+-+ +-+-+ + + +-+-+ + + +-+-+ + + + + +-+-+-+-+-+-+-+ + + +-+-+ +-+-+-+-+-+-+-+-+-+ + +-+-+ + +-+ + + +-+-+-+-+ + +-+ + + +-+-+ + +-+ +-+ +-+-+-+ +-+ +-+-+-+ + +-+-+ +-+-+-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+-+ +-+-+ +-+ + +-+-+ + +-+-+-+ + +-+ +-+-+-+-+ + +-+-+-+ +-+-+ + +-+-+-+ + + + +-+ + +-+-+-+ +-+ + + + + +-+-+-+ + + + +-+-+-+-+-+ + +-+ + +-+ +-+ + + +-+-+-+-+ + +-+ + + +-+-+-+-+-+-+ +-+-+-+-+ + + +-+-+-+ + + + + +-+ +-+-+-+ + + +-+-+ + +-+ + + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+-+-+ +-+-+ + +-+-+ + +-+ + + +-+ +-+-+ +-+-+ + +-+-+-+ +-+-+ + + + + +-+-+-+-+ + +-+-+ + + +-+ +-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + +-+ +-+ + + + + +-+ +-+ +-+ +-+-+ + + +-+-+-+-+ + + +-+ + +-+-+ +-+-+ + +-+ + + + +-+ + + + + + +-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+ +-+-+ + + + +-+-+-+-+-+-+ + +-+-+-+-+-+ + +-+ + + +-+-+ + +-+-+-+-+ +-+-+-+-+-+-+-+ + + + +-+ + +-+ + +-+-+-+-+-+ + + + +-+-+ + +-+-+ + +-+-+-+-+ +-+-+ + +-+-+-+ + + +-+ + +-+-+ + +-+-+ +-+ + +-+-+ + +-+-+ +-+-+-+ + + + + +-+ + +-+ +-+ +-+-+-+-+-+-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ +-+ + + +-+ + + +-+-+-+-+ + + + +-+-+-+ + +-+ + + +-+-+ + + +-+ +-+ +-+ +-+-+-+ + + + +-+-+-+ + + +-+ + + + + +-+-+-+-+ + + + + + +-+-+ + + + +-+ + +-+-+-+ + +-+ + + +-+-+-+ + +-+-+-+ +-+-+-+ +-+-+-+ + +-+-+ +-+ + +-+-+-+ +-+-+-+-+ +-+ + + + + +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+ + + + + + +-+ +-+ +-+-+-+-+ +-+-+ + +-+ + +-+ +-+ + +-+-+-+-+-+ + + + + + + + + +-+ + +-+ + +-+ + +-+-+-+-+-+ + +-+ +-+-+-+-+ + + + +-+ + + + + + +-+ + + + + + +-+-+ + + + +-+-+ + +-+ + + +-+ +-+-+-+-+-+ +-+ + +-+ + + + + +-+-+-+-+ +-+-+-+-+-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + +-+-+-+-+ +-+ + + +-+-+ + + +-+ + +-+ + +-+-+ +-+ +-+ + + + +-+-+-+ +-+-+-+ +-+-+-+ +-+-+ + +-+ +-+-+ + + +-+-+-+ + +-+ +-+-+ + +-+-+-+ +-+ + +-+-+-+-+-+ + + + +-+-+-+-+ + +-+-+ + + + +-+ +-+-+-+ +-+ +-+-+-+-+-+ + + +-+ + +-+-+-+-+ +-+-+-+ + +-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+ +-+ + + + +-+ +-+ + + +-+-+ + + +-+ + + + + + + + +-+ + + + + + +-+-+-+ +-+-+-+ +-+ +-+-+-+ + + + + + + + + + + +-+-+ + + + + +-+-+ + + +-+ + +-+ + + +-+-+ +-+-+-+ +-+-+ + +-+ + +-+-+ +-+ + + + + +-+ +-+ + + + + +-+-+ + + + +-+-+-+ +-+-+ + + + + + + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+-+-+ +-+ + + + +-+-+-+ +-+-+-+-+-+-+ +-+-+-+ +-+-+-+ + + + +-+ +-+ +-+ +-+-+-+ + + +-+ + + + +-+-+-+-+-+ +-+ +-+ + + +-+ + +-+ + + +-+-+-+ + +-+-+ +-+-+-+ + + +-+ + +-+-+ + +-+-+ + + + +-+-+-+ + +-+ + + +-+ +-+-+ + +-+-+ +-+-+-+-+-+ +-+ +-+-+ +-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+ + + +-+-+-+-+ +-+ + + +-+ + +-+-+ + +-+ + + +-+-+-+-+ + +-+-+ +-+ +-+-+-+-+ + +-+-+ + +-+ + +-+ + + +-+ +-+ +-+-+-+ + + +-+ + +-+ + +-+ + + + + +-+-+ + + +-+ +-+-+ +-+ + + + + + + +-+-+-+ + + +-+-+ + +-+ + +-+-+ +-+ + + + + + + + + + + + + +-+-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+ +-+-+-+-+ +-+ + + + +-+-+-+-+-+ +-+-+-+ + + +-+-+-+-+-+-+ +-+ +-+ + +-+ + +-+-+ + +-+-+ + + +-+-+-+ + + +-+ + + +-+-+ + + + + +-+ +-+-+ + + +-+ + +-+ + +-+-+ + +-+ +-+ +-+ + + + + + + +-+ +-+-+ + +-+ + +-+-+ + + +-+ + +-+ +-+-+ +-+ + +-+-+-+-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + +-+ + + +-+-+ + + +-+ + + + +-+-+-+ + +-+ + +-+-+-+ + +-+ +-+ +-+-+-+ +-+-+ +-+-+-+-+-+-+-+ + + + + +-+-+ +-+-+-+ +-+ + +-+-+ +-+-+-+ +-+-+-+ + +-+ + +-+ + + +-+-+ + + + + +-+ +-+-+-+-+-+-+-+ + +-+-+ + +-+-+ + + + +-+-+-+ +-+ + + + + +-+-+ + +-+-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ + +-+ + + +-+-+-+ + +-+ +-+-+-+ +-+ + +-+-+-+ + + +-+ +-+-+ + +-+-+ + + +-+-+ +-+ + + + + + +-+-+ +-+-+ +-+ + + + + +-+ + + +-+-+ +-+ + + +-+-+-+ + +-+-+-+ + +-+-+-+ + +-+ + + + + + + + + + +-+ +-+ + + + + +-+ +-+-+-+ + + + + + +-+-+-+-+ + +-+-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+ +-+-+-+ + +-+-+-+-+-+ +-+-+ + +-+ + + +-+ + +-+ + +-+-+-+-+-+ + + + +-+-+-+-+ + + + + +-+ + +-+-+-+ + +-+-+ +-+-+ +-+-+-+-+ +-+-+ +-+-+-+-+ + + +-+-+-+ +-+ +-+-+-+ + +-+ + +-+-+-+ + +-+-+ + + + + + + + +-+-+ + + + + + + + + + +-+ + + + +-+-+ + +-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+-+-+ + + + + + + + +-+ + +-+ +-+-+-+-+ +-+-+ +-+-+-+-+-+ + +-+-+ + + + +-+-+ + + + + +-+-+ + + + +-+ + + +-+-+ +-+ + +-+ +-+ + +-+ + +-+-+-+-+ + +-+ +-+ +-+-+ + + +-+-+ +-+-+ + +-+ + + +-+ +-+-+ +-+ + + +-+-+-+-+-+-+ +-+-+-+-+ + + +-+-+ +-+ + + +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+ +-+-+ + +-+-+-+-+ + + + + + + + +-+-+ +-+ +-+ + + + +-+-+-+-+-+-+-+ + +-+-+ + +-+-+ +-+ +-+-+ +-+-+ +-+ +-+ + + + +-+-+ +-+ +-+ + +-+-+-+-+-+ + +-+ + + +-+-+-+-+-+-+-+ +-+-+ + + + + +-+-+ +-+-+ + +-+-+ +-+-+-+-+-+-+ +-+-+ + + +-+-+-+-+-+-+-+ + + +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ + +-+-+ + +-+ + + +-+ +-+ +-+-+-+-+ + +-+ + + +-+-+ +-+ + + +-+-+-+ +-+ +-+-+ + + + +-+ +-+-+ +-+-+-+-+ +-+-+ +-+ + + +-+-+-+-+-+ + + +-+ + + + +-+-+ + +-+-+-+-+-+ +-+ + +-+ +-+-+ + + +-+ + + +-+ + +-+-+ + +-+ +-+-+-+ + + +-+ +-+ +-+-+-+ +-+ + + + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+ +-+-+-+ +-+ +-+-+-+ +-+ +-+-+-+-+ + +-+-+-+ + + +-+-+-+-+-+-+ +-+ +-+ +-+-+ +-+ + +-+ + +-+-+-+ +-+ + +-+ + +-+ +-+ +-+-+ + + + +-+-+-+ +-+ + + + +-+-+ + +-+ + +-+ + + + + + + + + +-+ + +-+ + +-+-+ + +-+-+ +-+ +-+-+ +-+-+ + +-+ + + + +-+-+-+-+ + + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + +-+ + + + + +-+ +-+ +-+-+ +-+-+ + + +-+ + +-+-+ + +-+ + + + + +-+ +-+-+-+ +-+-+ +-+ + +-+ + +-+ +-+-+-+-+-+-+-+-+-+ + + + +-+ +-+ +-+ +-+-+-+ +-+-+-+-+ +-+-+-+-+-+ +-+ +-+ + +-+-+ +-+ +-+-+ +-+-+-+ + +-+-+ + + +-+ + +-+ + + + + +-+-+-+ + +-+-+-+-+-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + +-+-+-+-+ + +-+ +-+-+ + + + + + + + +-+-+-+ + + + +-+-+ + + + +-+ + + +-+-+ +-+-+-+ + +-+ + +-+ + +-+ +-+ + + + + +-+-+ + +-+-+-+-+-+ +-+ + +-+-+-+-+-+-+-+-+-+ +-+ + + +-+-+-+ + + +-+-+ + + + + + + +-+ + +-+-+ +-+-+ + +-+-+ + + + + + +-+-+ + + +-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ +-+-+ + + +-+ +-+ + +-+-+-+ + +-+ + +-+-+ + + + + + + + + + + + +-+-+-+ +-+-+ + + +-+ +-+-+-+-+-+ +-+-+ + +-+-+-+-+-+ +-+-+ +-+-+-+ + + +-+-+ + + + + + +-+ + +-+ + + +-+-+-+ + + + +-+ + +-+ + + +-+-+ +-+ +-+ +-+ +-+ +-+ + + +-+-+ + + + +-+ + +-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+-+-+ + + +-+-+-+ +-+ +-+ + + + + +-+ + + + +-+-+-+-+ +-+ +-+ +-+-+-+-+ + + +-+ + +-+ +-+-+-+ + + + + + +-+-+ +-+ +-+-+-+-+ + + +-+-+-+ + + + +-+-+-+-+-+-+ +-+-+ +-+-+-+-+-+-+-+ + + +-+-+ +-+-+-+ + +-+-+ +-+ +-+ +-+ + + +-+ +-+-+ + + +-+-+ +-+-+ +-+-+ +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ +-+ + +-+-+-+-+ + +-+-+ + +-+-+ +-+-+ +-+-+ + + +-+-+-+-+ +-+ + + + +-+ +-+-+ +-+-+-+ +-+ +-+-+-+-+ +-+-+-+-+ +-+ +-+-+-+ + +-+-+-+-+-+ + + +-+-+-+-+-+ +-+-+-+-+-+ +-+-+ + +-+ +-+ +-+ + + + +-+-+-+-+ + +-+-+ +-+ + +-+-+-+ + +-+-+ + +-+-+ + + + + +-+ + + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++ + + + + +-+ + +-+ + + +-+-+ + + + + + +-+-+-+-+-+ + +-+ + + + + + + + +-+ + +-+ + +-+-+-+ +-+ +-+ +-+ + + + + + +-+ + + +-+-+ + + +-+ + +-+ + + +-+-+-+-+ + +-+ + +-+ +-+-+-+ +-+ +-+ + +-+-+-+ + +-+ + + + +-+-+-+-+ +-+-+ +-+-+-+-+-+-+ + +-+ +-+-+-+-+-+ + +| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+~+ + diff --git a/2004/arachnid.orig.c b/2004/arachnid.orig.c new file mode 100644 index 000000000..54e6c694a --- /dev/null +++ b/2004/arachnid.orig.c @@ -0,0 +1,50 @@ +#include /*****************************************************/ + int m[256 ] [ 256 ],a + ,b ;;; ;;; WINDOW*w; char*l="" "\176qxl" "q" "q" "k" "w\ +xm" "x" "t" "j" "v" "u" "n" ,Q[ + ]= "Z" "pt!ftd`" "qdc!`eu" "dq!$c!nnwf"/** *** */"t\040\t";c( +int u , int v){ v?m [u] [v- + 1] |=2,m[u][v-1] & 48?W][v-1 ] & 15]]):0:0;u?m[u -1][v]|=1 ,m[ + u- 1][ v]& 48? W-1 ][v ]& +15] ]):0:0;v< 255 ?m[ u][v+1]|=8,m[u][v+1]& 48? W][ v+1]&15]] +):0 :0; u < 255 ?m[ u+1 ][v ]|= +4,m[u+1][ v]&48?W+1][v]&15]]):0:0;W][ v]& 15] ]);}cu(char*q){ return + *q ?cu (q+ 1)& 1?q [0] ++: +q[0 ]-- :1; }d( int u , int/**/v, int/**/x, int y){ int +Y=y -v, X=x -u; int S,s ;Y< 0?Y =-Y ,s, +s=- 1:( s=1);X<0?X=-X,S =-1 :(S= 1); Y<<= 1;X<<=1; if(X>Y){ +int f=Y -(X >>1 );; while(u!= x){ +f>= 0?v+=s,f-=X:0;u +=S ;f+= Y;m[u][v]|=32;mvwaddch(w,v ,u, m[u + ][ v]& 64? 60: 46) ;if (m[ u][ +v]&16){c(u,v);; ;;; ;;; return;}} }else{int f=X -(Y>>1);; while + (v !=y ){f >=0 ?u +=S, f-= Y:0 + ;v +=s ;f+=X;m[u][v]|= 32;mvwaddch(w,v ,u,m[u][v]&64?60:46);if(m[u + ][ v]& 16) {c( u,v ); + ; return;;;}}}}Z( int/**/a, int b){ }e( int/**/y,int/**/ x){ +int i ; for (i= a;i <=a ++S;i++)d(y,x,i,b),d(y,x,i,b+L);for(i=b;i<=b+L;i++)d(y,x,a,i),d(y,x,a+ S,i + ); ;;; ;;; ;;; ;;; ; + mvwaddch(w,x,y,64); ;;; ;;; ;;; prefresh( w,b,a,0,0 ,L- 1,S-1 +);} main( int V , char *C[ + ] ){FILE*f= fopen(V==1?"prog.c"/******/ :C[ 1],"r");int/**/x,y,c, +v=0 ;;; initscr (); Z(Z (raw + () ,Z( curs_set(0),Z(1 ,noecho()))),keypad( stdscr,TRUE));w =newpad + ( 300, 300 ) ; for (x= 255 ; x >=0 ;x-- + ) for (y= 255 ;y>=0;y-- )m[ x][ y]= 0;x=y=0;refresh( );while + ( (c= fgetc (f) )+1) {if( +0||c==10|| x== 256){x=0;y++;if(y==256 )break;;} else{m[x][y]=(c == +'~' ?64 : c ==32 ?0: 16) ;;x ++; + }}for(x=0 ;x< 256;x++)m [x][0]=16 ,m[ x][ 255]=16;for(y=0 +;y< 256 ; y ++) m[0 ][y ] = 16, +m[255][y] =16 ;a=b=c=0; x=y =1; do{v++;mvwaddch (w, y,x ,m[ +x][ y]& 32? m[x ][y ] & 16? + 0| acs_map[l[m[x][y]&15]]:46 : 32);c==0163&&!(m[x][y+1]&16)?y++: 0;c + == 119 &&! (m[ x][ + y- 1]& 16) ?y--:0;;c ==97 &&!(m[x-1][y]&16)?x--:0;c==100&&!(m[x+1 + ][ y]& 16) ? x ++:0 ;if( c== + 3- 1+1 ){endwin( );; return(0) ;}x -a<5?a>S- 5?a-=S-5:(a=0): +0;x -a> S-5?a<255 -S* 2?a +=S +-5:(a=256-S):0; y-b<5?b>L-5?b-=L-5:(b =0) :0; y-b>L-5?b<255-L *2? +b+= L-5 :(b =256 +-L) :0;e(x,y);if(m[x][y]&64)break;}while((c=getch())!=-1);endwin();cu(Q); +printf(Q,v);} diff --git a/2004/boot.b b/2004/boot.b new file mode 100644 index 000000000..2013872dd Binary files /dev/null and b/2004/boot.b differ diff --git a/2004/burley.c b/2004/burley.c new file mode 100644 index 000000000..3fd9bdcb6 --- /dev/null +++ b/2004/burley.c @@ -0,0 +1,90 @@ +char a[80]; +int e[4],g[5],c=100,h,i,j,k,b,f,s,t,p[4][1000]; +int main(char*d){ +return main((char*)(srand(time(&h)), +setjmp(p[2]), +(k=atoi((gets(a), +a+strspn(a," -")))) +&&(b=k), +b||++b, +j+=-j, +d=(char*)(&j), +setjmp(p[1]), +1<<1>j&&(k&=4>>3, +i=1<>9)%0x4, +setjmp(p[0]), +t+=(rand()>>3)%015-t, +e[s]&(1<>=1, +i+=1<<1, +longjmp(p[3])), +setjmp(p[0]), +putchar(0x20+!putchar(012+"(.7-A,G+@*J)/"[(017&(i=g[4-k]))*013%13])), +++k^005&&longjmp(p[0]), +putchar('\n'), +setjmp(p[3]), +putchar(0x1F+!!putchar(("BCDHS"[g[--k]>>4]))), +k&&longjmp(p[3]), +putchar('\n'), +j+=1<<0, +1^j||(d=(char*)gets(a)), +longjmp(p[1])), +s=1==(f=0), +i=0<<1, +setjmp(p[3]), +i<4&&(j=i+1, +setjmp(p[1]), +j<5&&((017&g[j])>(g[i]&15)&&(k=g[i], +g[i]=g[j], +g[j]=k), +j++, +longjmp(p[1])), +i++, +longjmp(p[3])), +setjmp(p[0]), +i--&&!((g[1+i]^g[i])>>4)&&longjmp(p[0]), +setjmp(p[1]), +--j&&(!(k=(g[j]&15)-(g[j-1]&017)+1)||(!(j-1)&&(8==-k)))&&longjmp(p[1]), +s+=3*!j|!(++i^17), +(j*=i*=4)&&(i=1), +setjmp(p[3]), +5-j<2&&(j=0, +setjmp(p[1]), +5-i>j&&((g[j]^g[j+1])&0xf?g[j]^=g[j]:(s+=((g[j]&0xf)>8&&f++, +!!g[j]*i)), +j++, +longjmp(p[1])), +i++, +longjmp(p[3])), +s=1^s?"AACEDJQZHello World"[s]-'A':!!f, +s+=(!i)*(6+12*s-!!s*(g[2]&017^0xa?8:-192)), +s--, +s*=b, +printf("$%d (%d) \n", +c+=s, +s+b), +i=0, +setjmp(p[0]), +6>i&&(j=1, +setjmp(p[1]), +0<=j&&(e[i+j]^=*(i-j+e+(j<<1)), +--j, +longjmp(p[1])), +i+=++i, +longjmp(p[0])), +longjmp(p[2]))); +} diff --git a/2004/burley.hint b/2004/burley.hint new file mode 100644 index 000000000..8db186e17 --- /dev/null +++ b/2004/burley.hint @@ -0,0 +1,61 @@ +Best Calculated Risk: + + Brent Burley + 500 S. Buena Vista St. + Burbank, CA 91521 + USA + + +Judges' Comments: + + To build: + + make burley + + Try: + + ./burley + + This is a draw poker program. You start with $100. Input alternates + between your bet and which cards to keep. Example: + + 5 <== you enter a bet of $5 (defaults to $1) + J Q J 9 5 <== your hand is Jack of Clubs, Queen of Hearts, + C H D S C Jack of Diamonds, 9 of Spades, 5 of Clubs + 123 <== you enter which cards you want to keep + (enter 0 to 5 digits between 1 and 5) + J Q J J Q <== your new hand is Jack of Clubs, Queen of Hearts, + C H D S C Jack of Diamonds, Jack of Spaces, Queen of clubs + $145 (45) <== Your new balance is now $145. You had a Full House + so your payoff is 9 times your bet == 45 + + The payout is according to "Vegas rules": + + Straight Flush 50 times your bet + Four of a Kind 25 times your bet + Full House 9 times your bet + Flush 6 times your bet + Straight 4 times your bet + 3 of a Kind 3 times your bet + 2 Pair 2 times your bet + Jacks or Better 1 times your bet + + The program allows you to go into debt. However I'm sure you would + never control-C kill the program just because you got behind, right? + On the other hand the program never willingly exits, so you have + to leave even when you are ahead. :-) + + Can you figure out a winning betting "strategy"? Then can you modify + the program so this "strategy" no longer works? + + Notice the clever use of setjmp() and longjmp() calls. Can you keep + track of what state is being saved and restored? + + +Selected Author's Comments: + + This program plays draw poker. What is unusual about it is that it + is written as a single statement -- count the semicolons! (OK, there + are really three statements if you count the variable declarations.) To + keep things simple, I have avoided the C preprocessor and tricky + statements such as "if", "for", "do", "while", "switch", and "goto". diff --git a/2004/burley.orig.c b/2004/burley.orig.c new file mode 100644 index 000000000..c53d23295 --- /dev/null +++ b/2004/burley.orig.c @@ -0,0 +1,94 @@ +char a[80]; +int e[4],g[5],c=100,h,i,j,k,b,f,s,t,p[4][100]; +int main(char*d){ +return main((char*)(srand(time(&h)), +setjmp(p[2]), +(k=atoi((gets(a), +a+strspn(a," -")))) +&&(b=k), +b||++b, +j+=-j, +d=(char*)(&j), +setjmp(p[1]), +1<<1>j&&(k&=4>>3, +i=1<>9)%0x4, +setjmp(p[0]), +t+=(rand()>>3)%015-t, +e[s]&(1<>=1, +i+=1<<1, +longjmp(p[3])), +setjmp(p[0]), +putchar(0x20, +putchar(012+"(.7-A,G+@*J)/"[(017&(i=g[4-k]))*013%13], +' ')), +++k^005&&longjmp(p[0]), +putchar('\n','\t'), +setjmp(p[3]), +putchar(0x20, +putchar(("BCDHS"[g[--k]>>4]), +'\n')), +k&&longjmp(p[3]), +putchar('\n','\t'), +j+=1<<0, +1^j||(d=(char*)gets(a)), +longjmp(p[1])), +s=1==(f=0), +i=0<<1, +setjmp(p[3]), +i<4&&(j=i+1, +setjmp(p[1]), +j<5&&((017&g[j])>(g[i]&15)&&(k=g[i], +g[i]=g[j], +g[j]=k), +j++, +longjmp(p[1])), +i++, +longjmp(p[3])), +setjmp(p[0]), +i--&&!((g[1+i]^g[i])>>4)&&longjmp(p[0]), +setjmp(p[1]), +--j&&(!(k=(g[j]&15)-(g[j-1]&017)+1)||(!(j-1)&&(8==-k)))&&longjmp(p[1]), +s+=3*!j|!(++i^17), +(j*=i*=4)&&(i=1), +setjmp(p[3]), +5-j<2&&(j=0, +setjmp(p[1]), +5-i>j&&((g[j]^g[j+1])&0xf?g[j]^=g[j]:(s+=((g[j]&0xf)>8&&f++, +!!g[j]*i)), +j++, +longjmp(p[1])), +i++, +longjmp(p[3])), +s=1^s?"AACEDJQZHello World"[s]-'A':!!f, +s+=(!i)*(6+12*s-!!s*(g[2]&017^0xa?8:-192)), +s--, +s*=b, +printf("$%d (%d) \n", +c+=s, +s+b), +i=0, +setjmp(p[0]), +6>i&&(j=1, +setjmp(p[1]), +0<=j&&(e[i+j]^=*(i-j+e+(j<<1)), +--j, +longjmp(p[1])), +i+=++i, +longjmp(p[0])), +longjmp(p[2]))); +} diff --git a/2004/gavare.c b/2004/gavare.c new file mode 100644 index 000000000..aa8e16910 --- /dev/null +++ b/2004/gavare.c @@ -0,0 +1,28 @@ +X=1024; Y=768; A=3; + +J=0;K=-10;L=-7;M=1296;N=36;O=255;P=9;_=1<<15;E;S;C;D;F(b){E="1""111886:6:??AAF" +"FHHMMOO55557799@@>>>BBBGGIIKK"[b]-64;C="C@=::C@@==@=:C@=:C@=:C5""31/513/5131/" +"31/531/53"[b ]-64;S=b<22?9:0;D=2;}I(x,Y,X){Y?(X^=Y,X*X>x?(X^=Y):0, I (x,Y/2,X +)):(E=X); }H(x){I(x, _,0);}p;q( c,x,y,z,k,l,m,a, b){F(c +);x-=E*M ;y-=S*M ;z-=C*M ;b=x* x/M+ y*y/M+z +*z/M-D*D *M;a=-x *k/M -y*l/M-z *m/M; p=((b=a*a/M- +b)>=0?(I (b*M,_ ,0),b =E, a+(a>b ?-b:b)): -1.0);}Z;W;o +(c,x,y, z,k,l, m,a){Z=! c? -1:Z;c <44?(q(c,x ,y,z,k, +l,m,0,0 ),(p> 0&&c!= a&& (p0 +&&Z>=0? (e+=h*W/M,f+=i*W/M,g+=j*W/M,F(Z),u=e-E*M,v=f-S*M,w=g-C*M,b=(-2*u-2*v+w) +/3,H(u*u+v*v+w*w),b/=D,b*=b,b*=200,b/=(M*M),V=Z,E!=0?(u=-u*M/E,v=-v*M/E,w=-w*M/ +E):0,E=(h*u+i*v+j*w)/M,h-=u*E/(M/2),i-=v*E/(M/2),j-=w*E/(M/2),n(e,f,g,h,i,j,d-1 +,Z,0,0),Q/=2,T/=2, U/=2,V=V<22?7: (V<30?1:(V<38?2:(V<44?4:(V==44?6:3)))) +,Q+=V&1?b:0,T +=V&2?b :0,U+=V &4?b:0) :(d==P?(g+=2 +,j=g>0?g/8:g/ 20):0,j >0?(U= j *j/M,Q =255- 250*U/M,T=255 +-150*U/M,U=255 -100 *U/M):(U =j*j /M,UO? O: Q;T=T<0? 0:T>O?O:T;U=U<0?0: +U>O?O:U;}R;G;B ;t(x,y ,a, b){n(M*J+M *40*(A*x +a)/X/A-M*20,M*K,M +*L-M*30*(A*y+b)/Y/A+M*15,0,M,0,P, -1,0,0);R+=Q ;G+=T;B +=U;++a ioccc_ray.ppm + + For users of systems that distinguish between text and binary mode + (you know who you are), add a library call that specifies binary mode + for stdout as the first statement of main(), + or use freopen("ioccc_ray.ppm", "wb", stdout) and do not use redirection. + + A freely distributable command-line version of Microsoft Visual C + exhibits an optimizer bug when compiling this entry. Disable /Og for + best results. + + The judges were able to figure out how to control position + (in all 3 coordinates), size, and color (to some extent) of the balls. + + +Selected Author's Comments: + + + It is possible to write some kinds of programs in C without using reserved + words. For very short and trivial programs, it usually isn't very hard to + write a variant using no reserved words, but with this program I want to + show that also non-trivial programs can be written this way. This IOCCC + entry contains no reserved words (I don't count 'main' as a reserved word, + although the compiler gives it special meaning) and no preprocessor + directives. + + The program is a small ray-tracer. The first line of the source code may + be modified if you want the resulting image to be of some other resolution + than the predefined. The 'A' value is an anti-alias factor. Setting it to + 1 disables the anti-aliasing feature (this makes the output look bad), but + setting it too high makes the trace take a lot more time to complete. + + The ppm image can then be viewed using an image viewer of your own choice. + (Running the ray-tracer may take several minutes, even on fast machines, + so be patient.) + + I am very much aware about the fact that I'm breaking the guidelines. For + example, the word 'int' is a reserved word and therefore all variable + declarations are implicit. There will no doubt be _lots_ of warnings, + no matter which compiler is used. Still, the source code should be word- + length-independent and endianess-independent. + + + Another reason for writing code without using reserved words is that many + text editors will make all reserved words turn BOLD when printed on + paper. Since I care for the global environment, we shouldn't waste any + more laser toner, or ink, than necessary. Everyone should write C code + with no reserved words, and our world will be a better place. + + diff --git a/2004/gavin.c b/2004/gavin.c new file mode 100644 index 000000000..c967b7e57 --- /dev/null +++ b/2004/gavin.c @@ -0,0 +1,165 @@ +#define G(n) int n(int t, int q, int d) +#define X(p,t,s) (p>=t&&p<(t+s)&&(p-(t)&1023)<(s&1023)) +#define U(m) *((signed char *)(m)) +#define F if(!--q){ +#define I(s) (int)main-(int)s +#define P(s,c,k) for(h=0; h>>14==0; h+=129)Y(16*c+h/1024+Y(V+36))&128>>(h&7)?U(s+(h&15367))=k:k + +G (B) +{ + Z; + F D = E (Y (V), C = E (Y (V), Y (t + 4) + 3, 4, 0), 2, 0); + Y (t + 12) = Y (t + 20) = i; + Y (t + 24) = 1; + Y (t + 28) = t; + Y (t + 16) = 442890; + Y (t + 28) = d = E (Y (V), s = D * 8 + 1664, 1, 0); + for (p = 0; j < s; j++, p++) + U (d + j) = i == D | j < p ? p--, 0 : (n = U (C + 512 + i++)) < ' ' ? p |= + n * 56 - 497, 0 : n; +} + +n = Y (Y (t + 4)) & 1; +F +U (Y (t + 28) + 1536) |= +62 & -n; +M +U (d + D) = +X (D, Y (t + 12) + 26628, 412162) ? X (D, Y (t + 12) + 27653, + 410112) ? 31 : 0 : U (d + D); +for (; j < 12800; j += 8) + P (d + 27653 + Y (t + 12) + ' ' * (j & ~511) + j % 512, + U (Y (t + 28) + j / 8 + 64 * Y (t + 20)), 0); +} + +F if (n) + { + D = Y (t + 28); + if (d - 10) + U (++Y (t + 24) + D + 1535) = d; + else + { + for (i = D; i < D + 1600; i++) + U (i) = U (i + 64); + Y (t + 24) = 1; + E (Y (V), i - 127, 3, 0); + } + } +else + Y (t + 20) += ((d >> 4) ^ (d >> 5)) - 3; +} +} + +G (_); +G (o); +G (main) +{ + Z, k = K; + if (!t) + { + Y (V) = V + 208 - (I (_)); + L (209, 223) L (168, 0) L (212, 244) _((int) &s, 3, 0); + for (; 1;) + R n = Y (V - 12); + if (C & ' ') + { + k++; + k %= 3; + if (k < 2) + { + Y (j) -= p; + Y (j) += p += U (&D) * (1 - k * 1025); + if (k) + goto y; + } + else + { + for (C = V - 20; + !i && D & 1 && n + && (X (p, Y (n + 12), Y (n + 16)) ? j = n + 12, Y (C + 8) = + Y (n + 8), Y (n + 8) = Y (V - 12), Y (V - 12) = + n, 0 : n); C = n, n = Y (n + 8)); + i = D & 1; + j &= -i; + } + } + else if (128 & ~D) + { + E (Y (n), n, 3, U (V + D % 64 + 131) ^ 32); + n = Y (V - 12); + y:C = 1 << 24; + M U (C + D) = 125; + o (n, 0, C); + P (C + p - 8196, 88, 0); + M U (Y (0x11028) + D) = U (C + D); + } + } +} + +for (D = 720; D > -3888; D--) + putchar (D > + 0 ? + " )!\320\234\360\256\370\256 0\230F .,mnbvcxz ;lkjhgfdsa \n][poiuytrewq =-0987654321 \357\262 \337\337 \357\272 \337\337 ( )\"\343\312F\320!/ !\230 26!/\16 K>!/\16\332 \4\16\251\0160\355&\2271\20\2300\355`x{0\355\347\2560 \237qpa%\231o!\230 \337\337\337 , )\"K\240 \343\316qrpxzy\0 sRDh\16\313\212u\343\314qrzy !0( " + [D] ^ 32 : Y (I (D))); +return 0; +} + +G (o) +{ + Z; + if (t) + { + C = Y (t + 12); + j = Y (t + 16); + o (Y (t + 8), 0, d); + M U (d + D) = + X (D, C, j) ? X (D, C + 1025, j - 2050) ? X (D, C + 2050, + j - 3075) ? X (D, + C + 2050, + j - + 4100) ? + X (D, C + 4100, + ((j & 1023) + 18424)) ? 176 : 24 : 20 : 28 : 0 : U (d + D); + for (n = Y (t + 4); U (i + n); i++) + P (d + Y (t + 12) + 5126 + i * 8, U (n + i), 31); + E (Y (t), t, 2, d); + } +} + +G (_) +{ + Z = Y (V + 24); + F Y (V - 16) += t; + D = Y (V - 16) - t; +} + +F for (i = 124; i < 135; i++) + D = D << 3 | Y (t + i) & 7; +} + +if (q > 0) + { + for (; n = U (D + i); i++) + if (n - U (t + i)) + { + D += _(D, 2, 0) + 1023 & ~511; + i = ~0; + } + F if (Y (D)) + { + n = _(164, 1, 0); + Y (n + 8) = Y (V - 12); + Y (V - 12) = n; + Y (n + 4) = i = n + 64; + for (; j < 96; j++) + Y (i + j) = Y (t + j); + i = D + 512; + j = i + Y (i + 32); + for (; Y (j + 12) != Y (i + 24); j += 40); + E (Y (n) = Y (j + 16) + i, n, 1, 0); + } + } +} + +return D; +} diff --git a/2004/gavin.hint b/2004/gavin.hint new file mode 100644 index 000000000..8d921cd09 --- /dev/null +++ b/2004/gavin.hint @@ -0,0 +1,140 @@ +Best of Show: + + Gavin Barraclough + Flat 20, 83 Newton Street, + Manchester, + M1 1EP, + U.K. + + +Judges' Comments: + + To build and run (on any platform, without root privileges): + + make gavin + + To enjoy the results (on a Linux/x86 machine): + + su + + # Make a floppy with an ext2 filesystem (mke2fs /dev/fd0), + # mount it under /mnt/floppy + + cp kernel fs.tar lilo.conf boot.b /mnt/floppy + + # If the version of your lilo is not 21.4, use the appropriate boot.b + # If your floppy drive is not /dev/fd0, edit lilo.conf appropriately + + lilo -C /mnt/floppy/lilo.conf + + # Boot from the floppy on an x86 machine with a PS/2 keyboard and mouse + # Move the window away from the corner + + vi gavin.c + + # Scroll the file with up-arrow and down-arrow + + sh + + # Can have several shell windows + + vi gavin.hint + prim + + # Press and hold any key + + Over the years, we've seen a program that dumps core + if executed on a "wrong" architecture immediately (1984/mullender), + or after a while (2001/bellard). This entry will happily compile and + execute on any architecture - the trick is that the result, to be useful, + must be produced (and can only be enjoyed) on a particular architecture. + We have not decided yet whether to disallow this for future contests. + + If you do not want to mess with a floppy and you use GRUB, see below + in the author's notes. + You can put additional text files in fs.tar for browsing with vi. + If you do not want to bother rebooting your computer at all, + see http://bellard.org/ for QEMU (Fabrice Bellard is an IOCCC 2001 winner), + but your experience will be limited (replace -DK=0 with -DK=1 in the Makefile, + and you will have to move the mouse to trigger the initial screen update). + + The judges were able to write a few more programs to run on this OS + What are the limitations for such programs? + What you can do and what you cannot do in such programs? + + The program called "prim", written by the judges, + computes and prints prime numbers. + + +Selected Author's Comments: + + This is a 32-bit multitasking operating system for x86 computers, + with GUI and filesystem, support for loading and executing user + applications in elf binary format, with ps2 mouse and keyboard drivers, + and vesa graphics. And a command shell. And an application - + a simple text-file viewer. + + The OS has ended up as a traditional monolith with one entry point + for syscalls, with apps treated as cooperative-multitasking tasks + that can be sent different messages (e.g. 'initialize', 'key hit', + 'render to buffer') through their main entry point, and which will + return control to the OS having performed the necessary work. + Applications are are passed a pointer to their task structure, + which is partially defined by the OS, and partially for + the application's own use. + + The program compiles into a tool to build a kernel image, + so having built the program, the makefile will run it, + piping the output into a file called 'kernel'. + The makefile will then proceed to build a root filesystem image. + This involves rebuilding the program with different compiler flags, + then building a tar file containing the resulting programs + (the filesystem format supported by the OS is the tar-file format). + + For further usage information see 'gavin_install.txt'. + + The filenames 'vi' and 'sh' are significant, and should not be changed. + + Known 'features'. + + Known issues are really too plentiful to list. + + If the mouse pointer goes off the left hand side of the screen + it will reappear on the right, and vice-versa. + If it goes off the top or bottom, it will go and corrupt some memory. + + The file system is kinda optimistic about matching names, so, + for example if you type the command 'shell' into a command-line + it will execute the program 'sh' - close enough a match for it. + + The elf binaries are not loaded at the correct address, + and their entry point must be the start address of the text segment. + + The keyboard driver can cope with the basic alpha-numeric keys, + but gets confused by fancy things like 'shift' or 'backspace'. + + In the text-file viewer, 'vi', the up/down and pgup/pgdn keys + scroll up or down by one line. There is nothing to stop you + [from] scrolling above the top of the file, and pressing any + other keys may have an undefined effect. + + The x86 is bootstrapped into 32bit mode in 6 instructions, + with 4 more to set up data/stack segments and a stack-pointer + to allow C code to be run. On top of this there are also about + a dozen instructions to switch the video card into graphics mode. + All in all, a relatively tiny number of instructions next to + the size of the C program. Also, the string is mostly composed + of data - a Linux-esque kernel header for the bootloader, + protected mode descriptor tables, keyboard maps, etc. + (I should also mention that it contains mini functions + to perform an x86 'in' and 'out' instruction - to allow + the keyboard & mouse to be driven from C code). + + Porting to another architecture should be relatively easy* - + the string simply needs be replaced with one containing + data & code suitable for the new target platform. + Accesses to data in the string are made relative to the define 'V', + so these may need updating as appropriate (0x90200 is the address + at which a Linux bootloader loads an x86 kernel image). + + * ;-) diff --git a/2004/gavin_install.txt b/2004/gavin_install.txt new file mode 100644 index 000000000..6be70899e --- /dev/null +++ b/2004/gavin_install.txt @@ -0,0 +1,16 @@ +1) First, build the kernel and filesystem (just 'make'). In short, you need to build this on an x86 Linux machine. If you wish to try to compile on an OS other than Linux you may need modify the makefile to compile 'sh' using a cross-compiler that produces elf binaries - i.e. a cross-compiler targeting x86 Linux. In short, you need to build this on an x86 Linux machine. + +2) Next, find a suitable machine to run the OS on. It should be perfectly safe, and since it does not directly attempt to access any hard disk drives (only a ramdisk loaded by the bootloader) it should do no damage to your existing setup, BUT I ACCEPT NO LIABILITY FOR ANY DAMAGE DONE BY THIS PROGRAM. Run it at your own risk. The OS has been tested on half a dozen machines or so, and worked on all but one. The failure came in the form of the machine rebooting itself midway through loading the OS, with no nasty side-effects. + +Hardware requirements - i386 or better processor, but the GUI is surprisingly power-hungry, so I would recommend a fast p3 or p4 processor (has been tested on p3/p4/athlon machines). Minimum RAM is something like 32MB. PS2 mouse & keyboard required - no USB I'm afraid, and the keyboard map is for a UK keyboard. Uses Vesa VBE 3.0, so should work on any modern graphics card (has been tested on Nvidia, Matrox, and SiS cards). + +3) Now you need to setup a bootloader to load the OS. If you have a system using a lilo bootloader you can simply add the OS to your boot menu. Just add appropriate "image=" and "initrd=" lines to your /etc/lilo.conf, pointing at 'kernel' and 'fs.tar' respectively (as built by make earlier), then run lilo. If you do not wish modify your lilo setup, one easy option is to get yourself a grub bootdisk image, and follow the instructions for grub below - debian users can simple "apt-get install grub-disk" to get themselves a grub bootdisk. + +If you run grub, then at the boot menu simply hit 'c' to get a console, then type "kernel=(hd0,0)//kernel" (substituting appropriate harddrive/partition numbers & path, or using "(fd0)" to load a kernel on the floppy), then "initrd=(hd0,0)//fs.tar", and finally "boot". + +4) Assuming the OS has booted, what can you do now? Well, start by trying "sh", to open another shell. Then, try "vi prog.c" (although this file may have been re-named...), to open up the OS source in a text file viewer (up/down or pgup/pgdown to scroll). [Note that the provided applications, 'sh' and 'vi' both have windows of the same size, and that open in the top left corner of the screen, so you may need drag the windows around a bit to tell them apart.] + +5) To shut down - just hit the power button. :-) + + + diff --git a/2004/guidelines b/2004/guidelines new file mode 100644 index 000000000..6882a7fcf --- /dev/null +++ b/2004/guidelines @@ -0,0 +1,547 @@ +17th International Obfuscated C Code Contest Guidelines, Hints and Comments + +Copyright (C) 2004 Leonid A. Broukhis, Simon Cooper, Landon Curt Noll and +Peter Seebach. + +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in +writing from the contest judges. + + +ABOUT THIS FILE: + + This file contains guidelines intended to help people who wish to + submit entries to the International Obfuscated C Code Contest (IOCCC + for short). + + This is not the IOCCC rules, though it does contain comments about + them. The guidelines should be viewed as hints and suggestions. + Entries that violate the guidelines but remain within the rules are + allowed. Even so, you are safer if you remain within the guidelines. + + You should read the current IOCCC rules, prior to submitting entries. + The rules are typically sent out with these guidelines. + + WHAT'S NEW IN 2004: + + The contest runs from 07-Jan-2004 00:00 UTC to 29-Feb-2004 23:59:59 UTC + + An online submission mechanism will be available after + 26-Jan-2004, 00:00 UTC. See the following for details, + + http://www.ioccc.org/2004/submit + +HINTS AND SUGGESTIONS: + + You are encouraged to examine the winners of previous contests. See + FOR MORE INFORMATION for details on how to get previous winners. + + Keep in mind that rules change from year to year, so some winning entries + may not be valid entries this year. What was unique and novel one year + might be 'old' the next year. + + An entry is usually examined in a number of ways. We typically apply + a number of tests to an entry: + + * look at the original source + * convert ANSI tri-graphs to ASCII + * C pre-process the source ignoring '#include' lines + * C pre-process the source ignoring '#define' and '#include' lines + * run it through a C beautifier + * examine the algorithm + * compile it (with flags to enable all warnings) + * execute it + + You should consider how your entry looks in each of the above tests. + You should ask yourself if your entry remains obscure after it has been + 'cleaned up' by the C pre-processor and a C beautifier. + + Your entry need not pass all of the above tests. In certain + cases, a test is not important. Entries that compete for the + 'strangest/most creative source layout' need not do as well as + others in terms of their algorithm. On the other hand, given + two such entries, we are more inclined to pick the entry that + does something interesting when you run it. + + We try to avoid limiting creativity in our rules. As such, we leave + the contest open for creative rule interpretation. As in real life + programming, interpreting a requirements document or a customer request + is important. For this reason, we often award 'worst abuse of the + rules' to an entry that illustrates this point in an ironic way. + + We do realize that there are holes in the rules, and invite entries + to attempt to exploit them. We will award 'worst abuse of the rules' + and then plug the hole next year. Even so, we will attempt to use + the smallest plug needed, if not smaller. :-) + + Check out your program and be sure that it works. We sometimes make + the effort to debug an entry that has a slight problem, particularly + in or near the final round. On the other hand, we have seen some + of the best entries fall down because they didn't work. + + We tend to look down on a prime number printer, that claims that + 16 is a prime number. If you do have a bug, you are better off + documenting it. Noting "this entry sometimes prints the 4th power + of a prime by mistake" would save the above entry. And sometimes, + a strange bug/feature can even help the entry! Of course, a correctly + working entry is best. + + People who are considering to just use some complex mathematical + function or state machine to spell out something such as "hello, + world!" may want to try and be more creative. + + Ultra-obfuscated programs are in some cases some cases easier to + deobfuscate than subtly-obfuscated programs. Consider using + misleading or subtle tricks layered on top of or under an + appropriate level of obfuscation. + + Programs that use VTxxx/ANSI sequences that are NOT limited to a + specific terminal brand and that can also work in a standard xterm + are considered portable. + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many ANSI C compilers dislike the following code, and so do we: + + #define d define + #d foo <-- don't expect this to turn into #define foo + + When declaring local or global variables, you should declare the type: + + int this_is_ok; + this_is_not; <-- don't use such implicit type declarations + + We suggest that you compile your entry with an ANSI C compiler. If you + must use non-ANSI C, such as K&R C, you must avoid areas that result in + compile/link errors for ANSI C compilers. For example, using gcc + local function declarations, such as: + + int + main() { + void blah() { printf("blah\n"); } + blah(); + } + + are not allowed even though their existence seems tailor made for + this contest! But for now, since they are not in wide spread use + we cannot accept entries that use them. + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using . Use instead. + + If you use C preprocessor directives (#define, #if, #ifdef, ...), + the leading '#' must be the first non-whitespace character on a line. + While some broken C preprocessors do not allow whitespace before a + '#', most do. + + The exit() function returns void. On some broken systems have exit() + return int. Your entry should assume that exit() returns a void. + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + + One line programs should be short one line programs, say around 80 + bytes long. Getting close to 160 bytes is a bit too long in our opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS version specific + (index/strchr differences are ok, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is ok only if you warn us in the 'remark' header item) + * won't compile or run under a POSIX P1003.1/P1003.2 like systems + * depend on a utility or application not normally found on most + most POSIX P1003.1/P1003.2 like systems + * abuse the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are similar to previous winners + * are identical to previous losers :-) + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + The build file should not be used to try and get around the size + limit. It is one thing to make use of a several -D's to help out, + but it is quite another to use 200+ bytes of -D's in order to + try and squeeze the source under the size limit. You should feel + free to make use of the build file space, but you are better off + if you show some amount of restraint. + + You should try to restrict commands used on the build file to + POSIX-like or common Un*x-like commands. You can also compile + and use your own programs. If you do, try to build and execute + from the current directory. This restriction is not a hard and + absolute one. The intent is to ensure that the building if your + program is reasonably portable. + + Don't forget that the building of your program should be done + ***without human intervention***. So don't do: + + cat > prog.c + cc prog.c -o prog + + However, you can do something cute such as making your program + do something dumb (or cute) when build 'automatically'. However + when it is run with a human involved, do something more clever. + For example, one could use the build instructions: + + cc prog.c -DNONHUMAN -o prog + echo "See remarks section about alternate ways to compile" + + and then include special notes in the program "remarks" for + alternate / human intervention based building. + + We want to get away from source that is simply a compact blob of + characters. To help, we give a break to source that contains + whitespace, and in certain cases ; { or } characters. While the + number of characters excluding whitespace (tab, space, newline), + and excluding any ; { or } followed immediately by either whitespace + or end of file, must be <= 2048, the total size may be less than 4096 + bytes. This means that one may use "free of charge" up to 2048 + bytes of whitespace, or ; { or } followed by either whitespace + or end of file. + + Please do not use things like gzip to get around the size limit. + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! + + We suggest that you avoid trying for the 'smallest self-replicating' + source. The smallest, a zero byte entry, won in 1994. + + We do not like writable strings. That is, we don't want stuff like: + + char *T = "So many primes, so little time!"; + ... + T[14] = ';'; + + Please don't make use of this feature, even if your system allows it. + However, initialized char arrays are OK to write over. This is OK: + + char b[] = "Is this Ok"; + b[9] = 'K'; + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. Don't + depend on a particular type of display. For example, don't depend + on color or a given size. Don't require backing store. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. + + We don't like entries that use proprietary M*tif, Xv*ew, or OpenL*ok + toolkits, since not everyone has them. Use of OpenMotif is permitted + because it is more widely and freely available. + + You should avoid depending on a particular window manager. + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines + in the program "remarks". + + While we recognize that UN*X is not a universal operating system, the + contest does have a bias towards such systems. In an effort to expand + the scope of the contest, we phrase our bias in terms of POSIX P1003.1 + and P1003.2 standards. This will allow certain non-UN*X OS users to + submit entries. On the other hand, this is a guideline and not a rule. + We will not reject an entry based on some POSIX technicality. + + When dealing with OS and application environments, we suggest that you + be reasonable with a nod towards vanilla UN*X-like systems. POSIX will + evolve but not as much as the contest, so avoid stuff like POSIX real + time, security, etc. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION <== HINT!! + * make us laugh and/or throw up :-) (humor helps!) + + Some types of programs can't excel (tm) in some areas. Of course, your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + You are better off explaining what your entry does in the program + "remarks" section rather than leaving it obscure for the judges + as we might miss something and/or be too tired to notice. + + We freely admit that interesting, creative or humorous comments in + the program "remarks" help your chances of winning. If you had to + read so many twisted entries, you too would enjoy a good laugh or two. + We think the readers of the contest winners do as well. We do read + the program "remarks" during the judging process, so it is worth your + while to write remarkable program "remarks". + + We dislike C code with trailing control-M's (\r or \015) that results + in compilation failures. Some non-Un*x/non-Linux tools such as + MS Visual C and MS Visual C++ leave trailing control-M's on lines. + Users of such tools should strip off such control-M's before submitting + their entries. In some cases tools have a "Save As" option that will + prevent such trailing control-M's being added. + + We dislike entries that depend on non-portable libcurses features such + as halfdelay(). One should restrict libcurses to portable features + found on BSD and SVR4/System V curses. + + The rules disallow source that contains unescaped octets with values + between 128 and 255. You must use \octal or \hex escapes instead: + + /* 123456789 123456789 123456789 123456 */ + char *foo = "This string is 36 octets in length \263"; + /* This octet requires 4 octets of source ^^^^ */ + if (strlen(foo) == 36) printf("foo is 36 octets a final NUL\n"); + + Be creative! + + +ABUSING THE RULES: + + Legal abuse of the rules is somewhat encouraged. Legal rule abuse may + involve, but is not limited to, doing things that are technically + allowed by the rules and yet do not fit the spirit of what we intended + to be submitted. + + Legal rule abuse is encouraged to help promote creativity. Rule abuse + entries, regardless of if they receive an award, result in changes to + the next year's rules and guidelines. + + Legal abuse of the rules is NOT an invitation to violate the rules. + An entry that violates the rules in the opinion of the judges, WILL be + disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK! If you + have an entry that might otherwise be interesting, you might want to + submit two versions; one that does not abuse the rules and one that + does. + + If you intend to abuse the rules, indicate so in the program + "remarks". You must try to justify why you consider your rule abuse + to be allowed under the rules. That is, you must plead your case as + to why your entry is valid. Humor and/or creativity help plead a + case. + + Abusing the entry format tends to annoy us more than amuse us. + + We are often asked why the contest rules and guidelines seem too + strange or contain mistakes, flaws or grammatical errors. One reason + is that we sometimes make genuine mistakes. But in many cases such + problems, flaws or areas of confusion are deliberate. Changes to + rules and guidelines in response to rule abuses, are done in a minimal + fashion. Often we will deliberately leave behind holes (or introduce + new ones) so that future rule abuse may continue. + + At the risk of stating the obvious, this contest is a parody of the + software development process. The rules and guidelines are only a + small part of the overall contest. Even so, one may think the contest + rules and guideline process as a parody of the sometimes tragic + mismatch between what a customer (or marketing) wants and what + engineering delivers. + + +JUDGING PROCESS: + + Entries are judged by Leonid A. Broukhis, Simon Cooper, Landon Curt Noll + and Peter Seebach. + + Each entry submitted is given an id number and subdirectory. The + "program", "info", "build" and "remarks" portions of a submission are + stored and judged from this directory. + + Any "author" and identifiable "entry" information is not read until + the judging process is complete, and then only from entries that have + won an award. + + The above process helps keep us biased for/against any one particular + individual. We are usually kept in the dark as much as you are + until the final awards are given. We like the surprise of finding + out in the end, who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. (For the curious, + we do indicate the volume of paper consumed when presenting the IOCCC + winners at talks) + + After the initial announcement, we attempt to send EMail to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes and typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the "build" information + * reading the "program" + * reading the program "info", if any + * passing the source thru the C pre-processor + skipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + skipping over any #include files + + In later rounds, other actions are performed: + + * compiling/building the source + * running the program + * performing miscellaneous tests on the source and binary + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry will often compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code + * best X client (see OUR LIKES AND DISLIKES) + * best abuse of ANSI C + * worst abuse of the rules + * (anything else so strange that it deserves an award) + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to 8 or 10 + winners. Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry os good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + + More often than not, we select a small entry (usually one line), a + strange/creative layout entry, and an entry that abuses the contest + rules in some way. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entries. More often, the + 'best' is picked because it does well in a number of categories. + + +ANNOUNCEMENT OF WINNERS: + + The judges will post an initial announcement of who won, the name + of their award, and a very brief description of the winning entry + on the IOCCC web site: + + http://www.ioccc.org/whowon.html + + We will also submit a brief announcement story to /.: + + http://slashdot.org + + that, depending on the willingness of the /. editors, may be posted + to their site at the same time. + + Note that initial announcement will NOT contain source. This is because + the winning authors are given a chance to review the judges comments, + and test our Makefile. This review process typically takes a few weeks. + + Sometime after the initial announcement, and once the the review + by the winners has been completed, the winning source will be + posted to the IOCCC web site: + + http://www.ioccc.org/years.html + + NOTE: previous winners are available at that URL + + We will submit a story announcing the availability of the winners + to /. at the same time. + + Finally the winning entries will be posted to the following groups: + + comp.lang.c comp.lang.c.moderated alt.sources + + In addition, pointers to these postings are posted to the following + + comp.sources.misc comp.windows.x comp.programming + misc.misc comp.std.c alt.folklore.computers + + Often, winning entries are published in selected magazines from around + the world. Winners have appeared in books ("The New Hackers Dictionary") + and on T-Shirts. + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending EMail to the following address: + + q.2004@ioccc.org (not the address for submitting entries) + + You must include the words 'ioccc 2004 question' in the subject of your + EMail message when sending EMail to the judges. + + Questions and comments about the contest are welcome. Comments about + confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. + + Check out the IOCCC Web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ +Peter Seebach diff --git a/2004/hibachi.hint b/2004/hibachi.hint new file mode 100644 index 000000000..f9b593ce5 --- /dev/null +++ b/2004/hibachi.hint @@ -0,0 +1,169 @@ +Best Abuse of the Guidelines: + + Anthony Howe + Snert + 42 av. Isola Bella + 06400 Cannes + France + + http://www.snert.com/ + + +Judges' Comments: + + To build (simple: Cygwin, FreeBSD, Linux, Mac OS X): + + tar -zxf hibachi.tgz + cd hibachi + ./configure + make + + Try: + + cd hibachi + ./hibachi-start.sh + + Then use your web browser to visit http://localhost:8008/ + + This entry violates the guidelines in so many ways! We are not + exactly sure how many org's will be upset with this entry, but we + are considering starting an IOCCC standards body just to reign in + the likes Mr Howe. + + This entry also has the dubious honour of being the only one to have + been submitted with its own ./configure script. + + +Selected Author's Comments: + + README.TXT Feb 2004 + ========== + + Hibachi is a simple, small, and (probably) very secure web server. + + There is a `hibachi.tgz' file that unpacks several support + files and a sub-directory tree containing the documentation and + examples. It can be viewed by: + + tar -zxf hibachi.tgz + lynx hibachi/localhost/index.html + + Or once Hibachi is running, use a web browser, preferably one that + supports images and JavaScript, to view the documentation and try + some of the CGI examples: + + http://localhost:8008/ + + + Building + -------- + + To build just the executable: + + # Cygwin, FreeBSD, Linux (newer), Mac OS X + gcc -o hibachi hibachi.c + + # Linux (older) + gcc -DSHUT_WR=1 -o hibachi hibachi.c + + # SunOS + gcc -o hibachi hibachi.c -lnsl -lsocket + + Since some systems place socket and network functions into other + libraries, a GNU autoconf ./configure script has been provided to + figure out the necessary link libraries, to verify all the + necessary headers and functions are present, and setup the #! + paths for the CGI examples. In which case the preferred build + commands are: + + ./configure [--enable-port=number] + make + + To start the server on the default port (8008): + + ./hibachi-start.sh & + + To test the server: + + lynx http://localhost:8008/ + + To stop the server: + + kill %1 + + + Features + -------- + + o Supports virtual hosts. + + o Supports all MIME types. + + o Supports Common Gateway Interface (CGI) scripts and programs. + + o Supports multiple index.* file types: + + index.htm, index.html, index.php, index.pl, + index.sh, index.rb, index.py + + o Supports subset of RFC 2616 HTTP/1.1 methods: + + GET, HEAD, and POST + + o Simple & straight forward configuration using environment variables. + + o Portability across Unix-like environments, such as: + + Cygwin, FreeBSD, Linux, SunOS. + + o Known to work with Lynx, Mozilla, Opera, and Internet Explorer + web browsers. + + o Is a dedicated process-forking server that does not use inetd. + + o Is secure against relative path file snooping. + + o Is secure against directory searches. + + o CGI script execution managed through Unix file permissions. + + o ~155 lines of source, + 1940 bytes long by IOCCC 2004 rules, + ~6KB compiled & stripped for FreeBSD. + + o Superior & smaller than micro_httpd from http://www.acme.com/ + + o And has a really cool tongue-in-cheek animated logo too. + + + Comments + -------- + + o This code is properly indented using the One True Brace style. + + o HTTP/1.0 200 OK == HTTP/1.1 200 OK CRLF Connection: close ? + + o getenv() == putenv() ? + + o Hibachi can serve www.ioccc.org. + + o Commented spoiler available. + + + Known Issues + ------------ + + o The "links" text browser does not support RFC 2616 section 7.2.1 + paragraph 3 sentence 2, and so fails to display responses from + hibachi. + + + Suggested IOCCC Categories + -------------------------- + + Best Utility + Best Support + Most Portable Package + Most Likely to Cook Apache + Best Interpretation of RFC 2616 + Winner of The Far Too Much Free Time Award diff --git a/2004/hibachi.tar.gz b/2004/hibachi.tar.gz new file mode 100644 index 000000000..d84c6d4e9 Binary files /dev/null and b/2004/hibachi.tar.gz differ diff --git a/2004/hoyle.c b/2004/hoyle.c new file mode 100644 index 000000000..c5d8fe5f0 --- /dev/null +++ b/2004/hoyle.c @@ -0,0 +1,20 @@ +#include +#include +#include + +#define _ ;double +#define void x,x +#define case(break,default) break[O]:default[O]: +#define switch(bool) ;for(;xint##if? +#define true (--void++) +#define false (++void--) + +char*O=" <60>!?\\\n"_ doubIe[010]_ int0,int1 _ Iong=0 _ inIine(int eIse){int +O1O=!O _ l=!O;for(;O1O<010;++O1O)l+=(O1O[doubIe]*pow(eIse,O1O));return l;}int +main(int booI,char*eIse[]){int I=1,x=-*O;if(eIse){for(;I<010+1;I++)I[doubIe-1] +=booI>I?atof(I[eIse]):!O switch(*O)x++)abs(inIine(x))>Iong&&(Iong=abs(inIine(x +)));int1=Iong;main(-*O>>1,0);}else{if(booI<*O>>1){int0=int1;int1=int0-2*Iong/0 +[O]switch(5[O]))putchar(x-*O?(int0>=inIine(x)&&do(1,x)do(0,true)do(0,false) +case(2,1)do(1,true)do(0,false)6[O]case(-3,6)do(0,false)6[O]-3[O]:do(1,false) +case(5,4)x?booI?0:6[O]:7[O])+*O:8[O]),x++;main(++booI,0);}}} diff --git a/2004/hoyle.hint b/2004/hoyle.hint new file mode 100644 index 000000000..84159b759 --- /dev/null +++ b/2004/hoyle.hint @@ -0,0 +1,59 @@ +Most Functional Output: + + Jonathan Hoyle + 162 Burwyck Park + Saline, MI 48176 + USA + + http://www.jonhoyle.com + + +Judges' Comments: + + To build: + + make hoyle + + Try: + + ./hoyle 10 0.5 + ./hoyle 1 1 1 1 + ./hoyle 2 0 1 0 -0.001 + + This obfuscation functions at several levels. Note the clever + use of use of #defines. The do(if,else) #define, for example, + is delightful. The code itself contains a bunch of curves + designed to throw you off axis. :-) + + The original source may be built by: + + make hoyle.orig + + A missing newline was added and tab stops were converted to standard + 8 character width in the new code. + + +Selected Author's Comments: + + This application graphs polynomials on a standard Cartesian coordinate + system. Polynomials of the form ax^0 + bx^1 + cx^2 + ... are graphed by + passing the coefficients a, b, c, etc. as double precision arguments. + It allows up to 8 parameters (thus up to x^7). + + Points of note: + - the x axis goes from -32 to +31 + - the y axis auto scales! + - up to 8 coefficients may be passed in + - the graph will determine direction and use slashes and + dashes rather than simple block X's. + + Example: + To graph y = x^2 + + ./hoyle 0 0 1 + + Note that: + + ./hoyle 0 0 2 + + will produce the same graph, since the y-axis is auto scaling. diff --git a/2004/hoyle.orig.c b/2004/hoyle.orig.c new file mode 100644 index 000000000..424dee209 --- /dev/null +++ b/2004/hoyle.orig.c @@ -0,0 +1,20 @@ +#include +#include +#include + +#define _ ;double +#define void x,x +#define case(break,default) break[O]:default[O]: +#define switch(bool) ;for(;xint##if? +#define true (--void++) +#define false (++void--) + +char*O=" <60>!?\\\n"_ doubIe[010]_ int0,int1 _ Iong=0 _ inIine(int eIse){int +O1O=!O _ l=!O;for(;O1O<010;++O1O)l+=(O1O[doubIe]*pow(eIse,O1O));return l;}int +main(int booI,char*eIse[]){int I=1,x=-*O;if(eIse){for(;I<010+1;I++)I[doubIe-1] +=booI>I?atof(I[eIse]):!O switch(*O)x++)abs(inIine(x))>Iong&&(Iong=abs(inIine(x +)));int1=Iong;main(-*O>>1,0);}else{if(booI<*O>>1){int0=int1;int1=int0-2*Iong/0 +[O]switch(5[O]))putchar(x-*O?(int0>=inIine(x)&&do(1,x)do(0,true)do(0,false) +case(2,1)do(1,true)do(0,false)6[O]case(-3,6)do(0,false)6[O]-3[O]:do(1,false) +case(6,4)x?booI?0:6[O]:7[O])+*O:8[O]),x++;main(++booI,0);}}} \ No newline at end of file diff --git a/2004/jdalbec.c b/2004/jdalbec.c new file mode 100644 index 000000000..6eeee74a4 --- /dev/null +++ b/2004/jdalbec.c @@ -0,0 +1,249 @@ +#define Nd Np define +#define Ni(N) Np include +#define Np ??= + +Ni(def) +Ni(io) +Ni(lib) + +Nd Ba BC(B, I) +Nd Be BC(Br, I) +Nd Ca(C, Ca) CB(B, In C, Ca) +Nd Cl(Cl) Cl Cl +Nd Cs const +Nd FrB N = Zr; Fr((O, B = BrB(BrF, I))) +Nd Fe(F) FO (In = Zr; F; In++) +Nd FF FB(B); FB(BF); +Nd FI Fe(IO) +Nd FO for +Nd Fr(F) FO (I = Zr; F; I++) +Nd II I I, In +Nd In(I, Ir) main(I, Ir) +Nd IO In[O[C + I]] +Nd Ir(I) if (I) +Nd Nb N > N && N > -O +Nd Rb(Rb, B) BBr(Br, Rb, B) +Nd Re return +Nd Sc struct +Nd Si(Te) sizeof (Te) +Nd Te typedef +Nd Zn N < Zr + +Te char C; +Te int I; +Te size_t Si; +Te void V; + +Cs C *Na = + + "H " "He " + "Li Be " "B C N O F Ne " + "Na Mg " "Al Si P S Cl Ar " + "K Ca Sc Ti V Cr Mn Fe Co Ni Cu Zn Ga Ge As Se Br Kr " + "Rb Sr Y Zr Nb Mo Tc Ru Rh Pd Ag Cd In Sn Sb Te I Xe " + "Cs Ba* Lu Hf Ta W Re Os Ir Pt Au Hg Tl Pb Bi Po At Rn " + "Fr Ra**" + + " *La Ce Pr Nd Pm Sm Eu Gd Tb Dy Ho Er Tm Yb " + " **Ac Th Pa U Np Pu "; +Cs C *Xe = "111%%d:\0\n"; +Cs C H[] = "22"; +Cs C U[] = "3"; +Cs I Zr = 0; +Cs I O = 1; +Cs I W = 2; + +V (*At)(V) = abort; +V (*F)(V *) = free; +V *(*Mo)(Si) = malloc; +I (*Pr)(Cs C *, ...) = printf; +I (*P)(I) = putchar; + +Nd Tm(B,C) \ +Sc B { \ + C *B; \ + I N; \ +} ; \ +Te Sc B *B; \ +\ +B N##B (I) ; \ +V F##B (B) ; \ +C B##C (B, I) ; \ +V C##B (B, I, C) ; \ +\ +B N##B (I N) { \ + B B; \ +\ + Re (W, B = Mo(Si(Sc B))) ? \ + (O, B->B = Mo(((W, B->N = N) ? N : O) * Si(C))) ? \ + B Cl(: (At(), B)); \ +} \ +V F##B (B B) { \ + F(B->B); \ + F(B); \ +} \ +C B##C (B B, I N) { \ + Re B->Nb ? B->B[N] : (C) Zr; \ +} \ +V C##B (B B, I N, C C) { \ + N; \ + B->Nb ? B->B[N] = C : C ? At(), C : C; \ +} + +Tm(B,C) + +V Pb (B) ; +I Bi (B) ; +C Co (B, B, I) ; +B Sb (B, I) ; + +V Pb (B B) { + I I; + Fr(Ba) + P(Ba); +} +I Bi (B B) { + I I; + Fr(Ba) ; + Re I; +} +C Co (B Br, B B, I N) { + I I; + Fr(I < N) + Ir(Be - Ba) + Re Be - Ba; + Re Zr; +} +B Sb (B Br, I N) { + B B; + I I; + + B = NB(Zn ? Bi(Br) + N : N); + FO(I = Zn ? -N : Zr; Zn ? Be : I < N; I++) + CB(B, Zn ? I + N : I, Be); + Re B; +} + +Tm(Br,B) + +V PBr (Br, I) ; + +V PBr (Br B, I N) { + I I; + Pr(W * W + Xe, N); + Fr(BrB(B, I)) { + P(O[Na]); + Pb(BrB(B, I)); + } + P(Xe[W << W]); +} + +B Dy (B, I) ; +I S (C, B) ; +Br Sr (Br) ; + +B Dy (B Br, I N) { + B B; + C C, Cr; + II; + + B = NB(W * Bi(Br)); + FO(In = I = Zr; (O, C = Be); I++) { + FO(Cr = O; (W, C == BC(Br, I + Cr)); Cr++) ; + I += Cr - O; + Ca(++, Cr + Si(H)**H - Si(U)**U); + Ca(++, C); + } + Ir(N) + FB(Br); + Ca(-N, W[H]); + Re B; +} +I S (C C, B Br) { + B B, BF; + II; + + Ir(C == BC(Br, Zr)) + Re Zr; + + Fr(Be) { + B = Cl(BF = Sb(Br, I); ) + + Fe(BC(B, Zr)) { + B = Dy(B, W); + Ir(C == BC(B, Zr)) { + FF + Re Zr; + } + + Ir(In % W) + BF = Dy(BF, W); + + Ir(Zr == Co(B, BF, Bi(BF))) { + FF + Re O; + } + } + + FF + } + B = Dy(Br, Zr); + I = S(C, B); + FB(B); + Re I; +} +Br Sr (Br BrF) { + Br Br; + B B, BF; + II, N; + + FrB + N += Bi(B); + Br = NBr(N); + FrB { + Rb(N++, B); + Fe(BC(B, In + O)) + S(BC(B, In), BF = Sb(B, -In - O)) ? + Ca(+O, O[U]), + Rb(N++, B = BF), + In = Zr : + (FB(BF), W); + } + FBr(BrF); + Rb(N, (V *) Zr); + Re Br; +} + +I In (I, C **) ; + +I In (I N, C ** C) { + Br Br; + B B; + II; + + Br = NBr(--N); + Fr(I < N) { + FI ; + Rb(I, B = NB(In)); + FI + Ca(-Zr, IO); + } + + Fr(BrB(Br, Zr)) { + Br = Sr(Br); + PBr(Br, I); + + Fe((W, B = BrB(Br, In))) { + Rb(In, Dy(B, Zr)); + FB(B); + } + } + + { } { } { } { } { } { } { } { } { } { } { } +{ } { { } } { } { } { } { } { } { } { } { } { { } } +{ { } } { } { } { } { } { } { } { { } } { } { } { { } } C; +{ } { { } } { } { } { } { } { } { } { } { } { { } } + { } { } { } { } { } { } { } { } { } { } { } + + Re Zr; +} diff --git a/2004/jdalbec.hint b/2004/jdalbec.hint new file mode 100644 index 000000000..4a87681f0 --- /dev/null +++ b/2004/jdalbec.hint @@ -0,0 +1,163 @@ +Best Abuse of the Periodic Table: + + John Dalbec + 20 Squire's Ct. + Canfield OH 44406 + USA + + http://cc.ysu.edu/~jpdalbec/ + + +Judges' Comments: + + To build: + + make jdalbec + + Try: + + ./jdalbec 1 + ./jdalbec 11 + ./jdalbec 1 1 + + We still aren't sure whether or not this is a useful program, but + it's the first atomic fission we've seen in the IOCCC. + + +Selected Author's Comments: + + It's elementary! + + See http://mathworld.wolfram.com/LookandSaySequence.html, + http://mathworld.wolfram.com/CosmologicalTheorem.html, + and the references listed there. + + Go read the web pages and come back. + + This program implements the look-and-say sequence with the + added feature that each "decay product" is automatically split + into its constituent "elements" separated by spaces. Furthermore, + arguments passed to the program are treated as separate elements + for the purpose of computing further decay products. (Compare + the output of "prog 1", "prog 11", and "prog 1 1".) This + allows output lines from the program to be passed back to the + program as input (minus the initial generation number). + + The common elements are listed in CosmologicalTheorem.html. + The non-primordial transuranic elements are the isotopes of + Neptunium and Plutonium. Isotopes of a given element differ + only in the last digit. Four common elements could also be + written as isotopes of these two elements: He=Np(2), Li=Pu(2), + Ta=Np(3), W=Pu(3). To get other isotopes, just change the + last digit to a number greater than 3. + + The build file runs prog.c through the C preprocessor to + generate prog2.c which is edited with ed to correct spacing + problems caused by some preprocessors. (I know you dislike + Perl, but hopefully ed is more common on POSIX systems than + Perl.) The build file then compiles prog2.c and removes the + prog2.c file. + + I don't think I'm abusing the build file since I'm only using + 147 characters including white space and the #! line and the + commented-out "-Wall -pedantic" options. The rules for the + 16th IOCCC rules specifically allowed build files up to 521 + characters long so my build file would have been well within + those limits. (What typo?) + + gcc -E -Wall -pedantic complains that trigraphs are present and that + "pasting ... does not yield a valid processing token". + + gcc -ansi -Wall -pedantic complains about #line directives, + trigraphs, and expressions and statements that have no effect. + The last complaint is false in all but one case. Removing + the offending expressions causes some compilers to report + syntax errors because they can't determine whether a name + refers to a variable or a type. + + Since buffer overflows are a common security problem these + days I have stolen the idea of using a "safe" buffer API from + vsftpd. This means the program should never crash, right? + + The program was tested on: + AMD K6/MMX 266MHz, Debian GNU/Linux testing "Sarge", gcc 3.3.2 + Intel 486DX 33MHz, Red Hat Linux 7.3, gcc 2.96 + PowerPC Macintosh G4 Quicksilver, Mac OS X 10.3.2, gcc 3.3 + PowerPC Macintosh G4 Quicksilver, Mac OS X 10.1.5, cc 2.95.2 + PowerPC Macintosh Performa 5200CD, Mac OS 8.6, CodeWarrior 11 + Sun SPARC Ultra 10, Solaris 8, gcc 3.2 + + Compiling on Mac OS 8.6 requires some degree of manual + intervention because Mac OS 8.6 doesn't have shell scripting + or even a normal command prompt. The CodeWarrior 11 compiler + is the reason I had to use trigraphs. I have to preprocess + prog.c without trigraphs, save the result as prog2.c, then + compile prog2.c with trigraphs to get the program to work. + I also have to add an include file and a function call to the + program to get a pseudo command line so I can pass arguments. + The compiler also requires function prototypes by default, + which is why I have prototypes for all my functions. + + Compiling on Mac OS X 10.1.5 requires changing ??= to \# on + line 3 because the compiler doesn't recognize ??= as a trigraph + (which I consider a compiler bug). The initial preprocessing + step on Mac OS X 10.1.5 generates lots of errors in "smart + mode" because the "smart" preprocessor expects a valid C + program as input. The preprocessor then falls back to "basic + mode" and preprocesses prog.c successfully without warnings, + even when I give it the "-Wall -pedantic" options. It inserts + a lot of extra spaces into the preprocessed output which is + why I had to add the "ed" step to the build file so that my + macro #defines would work. The compile step gives the usual + messages with "-Wall -pedantic". The link step generates a + warning about a name conflict between my BC() and a BC() from + curses in the main system library. + + BUGS, I mean FEATURES: + Arguments matching /[^2]22$/ cause the program to segfault + after rapidly exhausting the available stack space. I could + probably fix this by adding some special cases to the code, + but [Blaine the Mono] it's quite a bit more exciting this way, + don't you think?[/Blaine] Since the trailing "22" will be + its own atom anyway, you can just insert a space in front of + it if you run into this feature (e.g. "1 22" instead of "122"). + + Note: you may want to be sure you have a limit on stack size + before trying this. I ran it on Debian GNU/Linux and discovered + that I did not have a limit on stack size. Fortunately the + OS killed the process after a while. This is consistent with + the output of 1996/schweikh3 which reports "malloc lied! + Killed by SIGKILL". + + Arguments matching /(?:.){10,}/ will produce visually incorrect + results (e.g., generation 1 starting from 1111111111 will + print as ": 1"), but there's nothing interesting about these + arguments that can't be modeled using shorter runs of the same + symbol. + + Arguments matching /(?:.){257,}/ may produce mathematically + incorrect results (e.g., generation 1 starting from a string + of 257 1's will be calculated as "11"); the remark from the + previous paragraph applies here also. + + The program has exactly 2004 IOCCC countable bytes. It's + tailor-made for this competition! + + Although there are no comments, the program still manages to + be self- documenting in an obscure fashion (periodic table of + the (non-primordial) elements, "OBFUSCATED C"). + + The program is obfuscated: + By invoking cpp twice + By the use of #defines + By the use of typedefs + By the use of global constants + By the use of global functions that replace the standard ones (I + particularly like substituting At (Astatine, highly unstable) for abort.) + By overloading symbols (For example, B is a type, a structure, a structure + member, a macro parameter, and a variable.) + By standard tricks like writing '\0' as 1["3"] or 2["22"] + By using ternary operators to avoid "else" + By using the Sb function to create subbuffers from either end + By naming everything after chemical elements or pairs of elements + Because it says so in the source. ;) diff --git a/2004/kopczynski-10 b/2004/kopczynski-10 new file mode 100644 index 000000000..bb73ddd86 --- /dev/null +++ b/2004/kopczynski-10 @@ -0,0 +1,6 @@ + # ### +## # # + # # # + # # # +### ### + diff --git a/2004/kopczynski-11 b/2004/kopczynski-11 new file mode 100644 index 000000000..f9d61354e --- /dev/null +++ b/2004/kopczynski-11 @@ -0,0 +1,5 @@ +# # + # # + # # + # # + diff --git a/2004/kopczynski-8a b/2004/kopczynski-8a new file mode 100644 index 000000000..83e25182e --- /dev/null +++ b/2004/kopczynski-8a @@ -0,0 +1,10 @@ + #### +###### +## ## +## ## + #### +## ## +## ## +###### + #### + diff --git a/2004/kopczynski-8b b/2004/kopczynski-8b new file mode 100644 index 000000000..59533a065 --- /dev/null +++ b/2004/kopczynski-8b @@ -0,0 +1,4 @@ +##### +# # # +##### + diff --git a/2004/kopczynski-8c b/2004/kopczynski-8c new file mode 100644 index 000000000..573672dac --- /dev/null +++ b/2004/kopczynski-8c @@ -0,0 +1,6 @@ + # +# # + # +# # + # + diff --git a/2004/kopczynski-9 b/2004/kopczynski-9 new file mode 100644 index 000000000..b2c2aa2bc --- /dev/null +++ b/2004/kopczynski-9 @@ -0,0 +1,6 @@ +### +# # +### + # +### + diff --git a/2004/kopczynski.c b/2004/kopczynski.c new file mode 100644 index 000000000..d18e60a23 --- /dev/null +++ b/2004/kopczynski.c @@ -0,0 +1 @@ +main(O){int I,Q,l=O;if(I=l*4){l=6;if(l>5)l+=Q-8?l-(Q=getchar()-2)%2:l;if(Q*=2)O+="has dirtiest IF"[(I/-Q&12)-l/Q%4];}printf("%d\n",8+O%4);} diff --git a/2004/kopczynski.hint b/2004/kopczynski.hint new file mode 100644 index 000000000..cab236af0 --- /dev/null +++ b/2004/kopczynski.hint @@ -0,0 +1,172 @@ +Best one-liner: + + Eryk Kopczynski + Faculty of Mathematics, Informatics and Mechanics + ul. Banacha 2 + 02-097 Warszawa + Poland + + http://www.mimuw.edu.pl/~erykk/ + +Judges' Comments: + + To build: + + make kopczynski + + Try: + + ./kopczynski < kopczynski-8a + ./kopczynski < kopczynski-8b + ./kopczynski < kopczynski-8c + ./kopczynski < kopczynski-9 + ./kopczynski < kopczynski-10 + ./kopczynski < kopczynski-11 + + What is in a line? A lot when you obfuscate the way Eryk Kopczynski + did it. This small one line program is an outstanding technical + work of art as well as one of the better one-liner programs that + we have seen in years! + + Compile and run without arguments. As input, give it an ASCII graphics + figure 8, 9, 10, or 11 made of pound signs and spaces, of any size, + shape, or orientation (that's right, an upside down 9 is still 9 :-). + There is one restriction: the only line not containing "#" characters + must be the last. + + The program will print what it thinks you've entered. If you enter + anything that does not resemble 8, 9, 10, or 11, the result is + seemingly arbitrary. Actually it is not pseudo-random; can you find + a pattern when it does not resemble 8, 9, 10 or 11? + + Here is a related puzzle: how to continue the sequence: + + 1, 0, 0, 0, 0, 0, 1, 0, 2, 1, ... + + The judges modified the program to print its result. The original + program returned the result as an exit code: + + make kopczynski.orig + + ./kopczynski.orig < kopczynski-10 + echo $? + + With certain arguments, you can alter the exit value. Can you figure + out how and why? + + +Selected Author's Comments: + + The program proves it is not as hard to recognize numbers. The current + one liner version should correctly recognize all numbers from 8 to 11. + (Unless you give it some very hard cases. For example, it cannot + recognize negatives, zeros which have dots or slashes inside them, + digits should be separated, and numbers should be "complete".) + + This program returns the number as its exit status. (In most shells, + you can see the exit status of the last command with 'echo $?' (or + just '$?').) + + [[NOTE: The judges altered the primary version to output a number.]] + + On the input, give numbers formed as a sequences of empty spaces and # + signs (you can also use dots instead of spaces), ending with an empty + line. (No number has an empty line in it.) The program should return + the number from 8 to 11 that it thinks it is. + + * The line is 131 bytes long (in 1986 165 bytes was OK, and the size + limit has grown from 1986...). + + * I have decided that it is better for this program to return the + number, not to print it, but if you think otherwise, the change would + cost 6 chars (plus a warning). Change 'return *' to 'printf("%d",*)'. + ('$?' is shorter) + + * I achieved some additional tightness by '-Dif=while', saved 9 chars + of source for cost of 11 chars of build file. If I used '-DB=while', + I would save 12 for 10, but I think the current version is slightly + more obfuscated. + + * A remark on portability: + + It only requires two's compliment arithmetics, as far as I + know. The maximum length of an input line is N-9, where + N is the size of int in bits (you can try to compile with + an option '-Dint=long long' for longer lines). + + -- Algorithm & Obfuscation -- + + 1. This program works by calculating the Euler characteristics of input, + plus 9. It is the number of digits (i.e. separated #-regions) minus the + number of holes in them. It turns out that this algorithm works + correctly for all numbers from 8 to 11. + + 2. We know that Euler characteristics is the number of "vertexes" + + # + + minus the number of "edges" + + ## # #. .# + # .# #. ('.' must be empty) + + plus the number of "faces" + + ## + ## + + 3. If we fill all these patterns to 2x2 squares, + + #? ## #? #. .# ## + ?? ?? #? .# #. ## + +1 -1 -1 -1 -1 +1 + + substitute all possible "values" of '?' and sum up, we get that it is + enough to calculate: + + #. .# ## + .. #. #. + +1 -1 -1 + + Note now it is simple and obfuscated enough to be used as + a "magic trick". + + 4. I make a 16-character array; when indexed by 4-bit value which + represents the 2x2 squares, it will return a number to add/subtract + {-1,0,+1} + + 5. We convert lines of input to bitmaps (N-bit integers). Additionally, + it is heavily obfuscated by using negative numbers (two's compliment). + For example, it turns out that 6 in "z=6" in the only 1-digit number + which works here (and it's not only because we have "z>5" in the + following while). The conversion routine also sets n=8 in an obfuscated + and concise way. + + 5. Since we always return the number from 8 to 11, we can calculate + modulo 4. Instead of 16 {-1,0,+1} values, we use a 15-character string + which agrees modulo 4 to the array in (4). (NUL fits very well as the + 16th character, so we use 15-character string.) + + 6. Since the rule found in (3) did not produce any funny messages, I + changed it until it did. (The # character to find vertexes is in the + top right corner, not the top left one.) The following messages will + also work instead of "has dirtiest IF": + + HighlandYachter + TestDirtiestTen + has lintiest IF + TighterLaughter + HustlerDaughter + TighterDemoThen + + They can be mixed, of course! + + 7. [[NOTE: Item 7 was removed by the judges so as to not spoil the + challenge of figuring how arguments can be used to alter + the exit value.]] + + 8. The variable names are confusing. + + 9. Finally, the program tries to be as concise as possible. Some + obfuscation comes from this. For additional obfuscation and + conciseness, 'if' means 'while'. diff --git a/2004/kopczynski.orig.c b/2004/kopczynski.orig.c new file mode 100644 index 000000000..1101dd7dd --- /dev/null +++ b/2004/kopczynski.orig.c @@ -0,0 +1 @@ +main(O){int I,Q,l=O;if(I=l*4){l=6;if(l>5)l+=Q-8?l-(Q=getchar()-2)%2:l;if(Q*=2)O+="has dirtiest IF"[(I/-Q&12)-l/Q%4];}return 8+O%4;} diff --git a/2004/lilo.conf b/2004/lilo.conf new file mode 100644 index 000000000..c2b20433e --- /dev/null +++ b/2004/lilo.conf @@ -0,0 +1,9 @@ +boot=/dev/fd0 +map=/mnt/floppy/map +install=/mnt/floppy/boot.b +default=ioccc + +image=/mnt/floppy/kernel + label=ioccc + read-only + initrd=/mnt/floppy/fs.tar diff --git a/2004/mkentry.c b/2004/mkentry.c new file mode 100644 index 000000000..2de41495d --- /dev/null +++ b/2004/mkentry.c @@ -0,0 +1,1302 @@ +/* $Id: mkentry.c,v 1.3 2004/01/27 06:53:08 chongo Exp $ */ +/* + * Copyright (c) Leonid A. Broukhis, Simon Cooper, Landon Curt Noll and + * Peter Seebach, 2004. + * + * All Rights Reserved. Permission for personal, education or non-profit use + * is granted provided this this copyright and notice are included in its + * entirety and remains unaltered. All other uses must receive prior + * permission in writing from the contest judges. + */ +/* + * mkentry - make an International Obfuscated C Code Contest entry + * + * usage: + * mkentry -r remarks -b build -p prog.c -o ioccc.entry + * + * -r remarks file with remarks about the entry + * -b build file containing how prog.c should be built + * -p prog.c the obfuscated program source file + * -o ioccc.entry ioccc entry output file + * + * compile by: + * cc mkentry.c -o mkentry + */ +/* + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* + * WARNING: + * + * This program attempts to implement the IOCCC rules. Every attempt + * has been made to make sure that this program produces an entry that + * conforms to the contest rules. In all cases, where this program + * differs from the contest rules, the contest rules will be used. Be + * sure to check with the contest rules before submitting an entry. + * + * FOR MORE INFORMATION: + * + * You may contact the judges by sending EMail to the following address: + * + * questions@ioccc.org (not the address for submitting entries) + * + * Questions and comments about the contest are welcome. + * + * NOTE: You must include the words ``ioccc question'' in the + * subject of your EMail message when sending EMail to the judges. + * + * Entries must be sent to: + * + * entry@ioccc.org + * + * but be sure to follow the rules and read the guidelines first! + * + * NOTE: You must include the words ``ioccc entry'' in the subject + * of your EMail when sending in your entry! + * + * The rules and the guidelines may (and often do) change from year to + * year. You should be sure you have the current rules and guidelines + * prior to submitting entries. To obtain them, visit the following URL: + * + * http://www.ioccc.org + * + * Because contest rules change from year to year, one should only use this + * program for the year that it was intended. + */ + +#include +#include +#include +#include +#include +#include +#include + +/* logic */ +#ifndef TRUE +# define TRUE 1 +#endif /* TRUE */ +#ifndef FALSE +# define FALSE 0 +#endif /* FALSE */ +#define EOF_OK TRUE +#define EOF_NOT_OK FALSE + +/* global limits */ +#define RULE_YEAR 2004 /* NOTE: should match the current year */ +#define START_DATE "07Jan2004 00:00 UTC" /* first confirmation received */ +#define MAX_COL 79 /* max column a line should hit */ +#define MAX_BUILD_SIZE 521 /* max how to build size */ +#define MAX_PROGRAM_SIZE 4096 /* max program source size */ +#define MAX_PROGRAM_SIZE2 2048 /* max program source size not counting + whitespace and {}; not followed by + whitespace or EOF */ +#define MAX_TITLE_LEN 31 /* max chars in the title */ +#define MAX_ENTRY_LEN 1 /* max length in the entry input line */ +#define MAX_ENTRY 8 /* max number of entries per person per year */ +#define MAX_FILE_LEN 1024 /* max filename length for a info file */ + +/* where to send entries */ +#define ENTRY_USER "e.2004" +#define ENTRY_HOST "ioccc.org" + +/* uuencode process - assumes ASCII */ +#define UUENCODE(c) ((c) ? encode_str[(int)(c)&0x3f] : '`') +#define UUENCODE_LEN 45 /* max uuencode chunk size */ +#define UUINFO_MODE 0444 /* mode of an info file's uuencode file */ +#define UUBUILD_MODE 0444 /* mode of the build file's uuencode file */ +#define UUBUILD_NAME "build" /* name for the build file's uuencode file */ +#define UUPROG_MODE 0444 /* mode of the program's uuencode file */ +#define UUPROG_NAME "prog.c" /* name for the program's uuencode file */ + +/* encode_str[(char)val] is the uuencoded character of val */ +char encode_str[] = "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"; + +/* global declarations */ +char *program; /* our name */ +long start_time; /* the startup time */ + +/* forward declarations */ +void parse_args(int argc, char **argv, char **rname, + char **bname, char **pname, char **oname); +void usage(int exitval); +FILE *open_remark(char *filename); +FILE *open_build(char *filename); +FILE *open_program(char *filename); +FILE *open_output(char *filename); +void output_entry(FILE *output, char *oname); +void output_remark(FILE *output, char *oname, FILE *remark, char *rname); +void output_author(FILE *output, char *oname); +void output_info(FILE *output, char *oname); +void output_build(FILE *output, char *oname, FILE *build, char *bname); +void output_program(FILE *output, char *oname, FILE *prog, char *pname); +void output_end(FILE *output, char *oname); +int get_line(char *buf, int siz, int maxcol); +void output_till_dot(FILE *output, char *oname, char *leader); +int col_len(char *string); +void check_io(FILE *stream, char *name, int eof_ok); +void uuencode(FILE *output, char *oname, FILE *infile, + char *iname, int umode, char *uname); + +int +main(argc, argv) + int argc; /* arg count */ + char **argv; /* the args */ +{ + FILE *remark=NULL; /* open remarks stream */ + FILE *build=NULL; /* open build file stream */ + FILE *prog=NULL; /* open program stream */ + FILE *output=NULL; /* open output stream */ + char *rname=NULL; /* file with remarks about the entry */ + char *bname=NULL; /* file containing how prog.c should be built */ + char *pname=NULL; /* the obfuscated program source file */ + char *oname=NULL; /* ioccc entry output file */ + struct tm *tm; /* startup time structure */ + + /* + * check on the year + */ + start_time = time((long *)0); + tm = gmtime(&start_time); + if (tm->tm_year != RULE_YEAR-1900 && + (tm->tm_year != RULE_YEAR-1900+1 || tm->tm_mon != 0)) { + fprintf(stderr, + "%s: WARNING: this program applies to %d, which may differ from %d\n\n", + argv[0], RULE_YEAR, 1900+tm->tm_year); + } + + /* + * parse the command line args + */ + parse_args(argc, argv, &rname, &bname, &pname, &oname); + + /* + * open/check the input and output files + * + * We open and truncate the output file first, in case it is the same + * as one of the input files. + */ + output = open_output(oname); + remark = open_remark(rname); + build = open_build(bname); + prog = open_program(pname); + if (output==NULL || remark==NULL || build==NULL || prog==NULL) { + exit(1); + } + + /* + * output each section + */ + output_entry(output, oname); + output_remark(output, oname, remark, rname); + output_author(output, oname); + output_info(output, oname); + output_build(output, oname, build, bname); + output_program(output, oname, prog, pname); + output_end(output, oname); + + /* + * flush the output + */ + if (fflush(output) == EOF) { + fprintf(stderr, "%s: flush error in %s: ", program, oname); + perror(""); + exit(2); + } + + /* + * final words + */ + printf("\nYour entry can be found in %s. You should check this file\n", + oname); + printf("correct any problems and verify that the uudecode utility will\n"); + printf("correctly decode your build file and program.\n\n"); + printf("This program has been provided as a guide for submitters. In\n"); + printf("cases where it conflicts with the rules, the rules shall apply.\n"); + printf("It is your responsibility to ensure that your entry conforms to\n"); + printf("the current rules.\n\n"); + printf("EMail your entries to:\n"); + printf("\t%s@%s\n\n", ENTRY_USER, ENTRY_HOST); + printf("IMPORTANT NOTE: You must include the words:\n"); + printf("\tioccc entry\n\n"); + printf("in the subject of your EMail when sending in your entry!\n"); + printf("Failure to do so may result in the loss of your entry!\n"); + /* all done */ + return 0; +} + +/* + * parse_args - parse the command line args + * + * usage: + * argc arg count + * argv the args + * rname file with remarks about the entry + * bname file containing how prog.c should be built + * pname the obfuscated program source file + * oname ioccc entry output file + * + * Given the command line args, this function parses them and sets the + * required name flags. This function will return only if the command + * line syntax is correct. + */ +void +parse_args(int argc, char **argv, char **rname, + char **bname, char **pname, char **oname) +{ + char *optarg; /* -flag option operand */ + int flagname; /* the name of the -flag */ + int i; + + /* + * Not everyone has getopt, so we must parse args by hand. + */ + program = argv[0]; + for (i=1; i < argc; ++i) { + + /* determine the flagname */ + if (argv[i][0] != '-') { + usage(1); + /*NOTREACHED*/ + } + flagname = (int)argv[i][1]; + + /* determine the flag's operand */ + if (flagname != '\0' && argv[i][2] != '\0') { + optarg = &argv[i][2]; + } else { + if (i+1 >= argc) { + usage(2); + /*NOTREACHED*/ + } else { + optarg = argv[++i]; + } + } + + /* save the flag's operand in the correct global variable */ + switch (flagname) { + case 'r': + *rname = optarg; + break; + case 'b': + *bname = optarg; + break; + case 'p': + *pname = optarg; + break; + case 'o': + *oname = optarg; + break; + default: + usage(3); + /*NOTREACHED*/ + } + } + + /* + * verify that we have all of the required flags + */ + if (*rname == NULL || *bname == NULL || *pname == NULL || *oname == NULL) { + usage(4); + /*NOTREACHED*/ + } + return; +} + +/* + * usage - print a usage message and exit + * + * usage: + * exitval exit with this value + * + * This function does not return. + */ +void +usage(int exitval) +{ + fprintf(stderr, + "usage: %s -r remarks -b build -p prog.c -o ioccc.entry\n\n", program); + fprintf(stderr, "\t-r remarks\tfile with remarks about the entry\n"); + fprintf(stderr, "\t-b build\tfile containing how prog.c should be built\n"); + fprintf(stderr, "\t-p prog.c\tthe obfuscated program source file\n"); + fprintf(stderr, "\t-o ioccc.entry\tioccc entry output file\n"); + exit(exitval); +} + +/* + * open_remark - open/check the remark file + * + * usage: + * filename remark filename + * + * The remark file should be indented by 4 spaces, and should not extend + * beyond column MAX_COL. These are not requirements, so we only warn. + * + * This function returns NULL on I/O or format error. + */ +FILE * +open_remark(char *filename) +{ + FILE *stream; /* the opened file stream */ + char buf[BUFSIZ+1]; /* input buffer */ + int toolong=0; /* number of lines that are too long */ + int non_indent=0; /* number of lines not indented by 4 spaces */ + + /* + * open the remark input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open remark file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * look at each line + */ + while (fgets(buf, BUFSIZ, stream) != NULL) { + + /* count lines that do not start with 4 spaces */ + if (buf[0] != '\n' && strncmp(buf, " ", 4) != 0) { + ++non_indent; + } + + /* count long lines */ + if (col_len(buf) > MAX_COL) { + /* found a line that is too long */ + ++toolong; + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* note long lines if needed */ + if (toolong > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s extend beyond the 80th column\n", + program, toolong, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* note non-indented lines, if needed */ + if (non_indent > 0) { + fprintf(stderr, + "%s: WARNING: %d line(s) from %s are not indented by 4 spaces\n", + program, non_indent, filename); + fprintf(stderr, + "%s: This is ok, but it would be nice to avoid\n\n", + program); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_build - open/check the build file + * + * usage: + * filename build filename + * + * The how to build file must not be longer than MAX_BUILD_SIZE bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_build(char *filename) +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + + /* + * open the how to build input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat how to build file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_BUILD_SIZE) { + fprintf(stderr, + "%s: FATAL: the how to build file: %s, is %ld bytes long\n", + program, filename, (long) statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_BUILD_SIZE); + return(NULL); + } + + /* return the open file */ + return(stream); +} + +/* + * open_program - open/check the program source file + * + * usage: + * filename source filename + * + * The program source file must be <= 3217 bytes. The number of + * non-whitespace and }{; chars not followed by whitespace must + * be <= 1536 bytes. + * + * This function returns NULL on I/O or size error. + */ +FILE * +open_program(char *filename) +{ + FILE *stream; /* the opened file stream */ + struct stat statbuf; /* the status of the open file */ + int count; /* special count size */ + int c; /* the character read */ + int control_m; /* 1 ==> warn about trailing ^M's */ + + /* + * open the program source input file + */ + stream = fopen(filename, "r"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open program source file: %s: ", + program, filename); + perror(""); + exit(7); + } + + /* + * determine the size of the file + */ + if (fstat(fileno(stream), &statbuf) < 0) { + fprintf(stderr, "%s: cannot stat program source file: %s: ", + program, filename); + perror(""); + return(NULL); + } + if (statbuf.st_size > MAX_PROGRAM_SIZE) { + fprintf(stderr, + "%s: FATAL: the program source file: %s, is %ld bytes long\n", + program, filename, (long) statbuf.st_size); + fprintf(stderr, + "%s: it may not be longer than %d bytes\n", + program, MAX_PROGRAM_SIZE); + return(NULL); + } + + /* + * count the non-whitespace, non {}; followed by whitespace chars + */ + control_m = 0; + count = 0; + c = 0; + while ((c=fgetc(stream)) != EOF) { + + /* look at non-whitespace */ + if (isascii(c) && !isspace(c) && c != '\r') { + switch (c) { + case '{': /* count if not followed by EOF or whitespace */ + case '}': + case ';': + /* peek at next char */ + c = fgetc(stream); + if (c != EOF && isascii(c) && !isspace(c) && c != '\r') { + /* not followed by whitespace or EOF, count it */ + ungetc(c, stream); + ++count; + } + break; + default: + ++count; + break; + } + + /* look for trailing ^M's */ + } else if (c == '\r') { + /* peek at next char */ + c = fgetc(stream); + if (c != EOF && c == '\n') { + control_m = 1; + } + /* put the peeking char back */ + ungetc(c, stream); + } + } + + /* watch for I/O errors */ + check_io(stream, filename, EOF_OK); + + /* look at the special size */ + if (count > MAX_PROGRAM_SIZE2) { + fprintf(stderr, + "%s: FATAL: the number of bytes that are non-whitespace, and\n", + program); + fprintf(stderr, + "%s: that are not '{', '}', ';' followed by whitespace\n", + program); + fprintf(stderr, + "%s: or EOF must be <= %d bytes\n", + program, MAX_PROGRAM_SIZE2); + fprintf(stderr, + "%s: in %s, %d bytes were found\n", + program, filename, count); + return(NULL); + } + + /* warn about trailing ^M's */ + if (control_m) { + fprintf(stderr, + "\nWARNING: Trailing Control-M's (\\r or \\015) found.\n" + "\t If these chars result in a compilation failure,\n" + "\t your entry may be rejected\n\n"); + } + + /* return the open file */ + rewind(stream); + return(stream); +} + +/* + * open_output - open/check the entry output file + * + * usage: + * filename output filename + * + * This function returns NULL on open error. + */ +FILE * +open_output(char *filename) +{ + FILE *stream; /* the opened file stream */ + + /* + * open the ioccc entry output file + */ + stream = fopen(filename, "w"); + if (stream == NULL) { + fprintf(stderr, "%s: cannot open ioccc entry file for output: %s: ", + program, filename); + perror(""); + exit(8); + } + + /* return the open file */ + return(stream); +} + +/* + * output_entry - output the ---entry--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_entry(FILE *output, char *oname) +{ + char title[MAX_TITLE_LEN+1+1]; /* the entry's title */ + char buf[MAX_COL+1+1]; /* I/O buffer */ + int entry=0; /* entry number */ + int ret; /* fields processed by fscanf */ + int ok_line=0; /* 0 => the line is not ok */ + char skip; /* input to skip */ + time_t epoch_sec; /* seconds since the epoch */ + char *p; + + /* + * write the start of the section + */ + fprintf(output, "---entry---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the rule year + */ + fprintf(output, "rule:\t%d\n", RULE_YEAR); + check_io(output, oname, EOF_NOT_OK); + + /* determine if this is a fix */ + printf("Is this a fix, update or resubmittion to a "); + printf("previous entry (enter y or n)? "); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + if (buf[0] == 'y') { + fprintf(output, "fix:\ty\n"); + check_io(output, oname, EOF_NOT_OK); + printf("\nBe sure that the title and entry number that you give\n"); + printf("are the same of as the entry you are replacing\n"); + } else { + fprintf(output, "fix:\tn\n"); + check_io(output, oname, EOF_NOT_OK); + } + + /* + * write the title + */ + printf("\nThe first character of your title should match [a-zA-Z0-9_=]\n"); + printf("The next 0 to %d characters should match [a-zA-Z0-9_=+-]\n\n", + MAX_TITLE_LEN-1); + printf("It is suggested, but not required, that the title should\n"); + printf("incorporate your username; in the case of multiple authors,\n"); + printf("consider using parts of the usernames of the authors.\n\n"); + printf("enter your title: "); + do { + /* prompt and read a line */ + if ((ok_line = get_line(title, MAX_TITLE_LEN+1, MAX_COL-9)) <= 0) { + printf("\ntitle is too long, please re-enter: "); + continue; + } + + /* verify the pattern, not everyone has regexp, so do it by hand */ + if (!isascii((int)title[0]) || + !(isalnum((int)title[0]) || title[0] == '_' || title[0] == '=')) { + printf("\ninvalid first character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } else { + for (p=(&title[1]); *p != '\0' && *p != '\n'; ++p) { + if (!isascii((int)*p) || + !(isalnum((int)*p) || + *p == '_' || *p == '=' || *p == '+' || *p == '-')) { + printf("\ninvalid character in the title\n\n"); + printf("enter your title: "); + ok_line = 0; + } + } + } + } while (ok_line <= 0); + fprintf(output, "title:\t%s", title); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the entry number + */ + printf("\nEach person may submit up to %d entries per year.\n\n", + MAX_ENTRY); + printf("enter an entry number from 0 to %d inclusive: ", MAX_ENTRY-1); + do { + /* get a valid input line */ + fflush(stdout); + ret = fscanf(stdin, "%d[\n]", &entry); + check_io(stdin, "stdin", EOF_NOT_OK); + /* skip over input until newline is found */ + do { + skip = fgetc(stdin); + check_io(stdin, "stdin", EOF_NOT_OK); + if (skip != '\n') { + /* bad text in input, invalidate entry number */ + entry = -1; + } + } while (skip != '\n'); + + /* check if we have a number, and if it is in range */ + if (ret != 1 || entry < 0 || entry > MAX_ENTRY-1) { + printf( + "\nThe entry number must be between 0 and %d inclusive\n\n", + MAX_ENTRY-1); + printf("enter the entry number: "); + } + } while (ret != 1 || entry < 0 || entry > MAX_ENTRY-1); + fprintf(output, "entry:\t%d\n", entry); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the submission date + */ + /* returns a newline */ + epoch_sec = time(NULL); + fprintf(output, "date:\t%s", asctime(gmtime(&epoch_sec))); + check_io(output, oname, EOF_NOT_OK); + + /* + * write the OS/machine host information + */ + printf( + "\nEnter the machine(s) and OS(s) under which your entry was tested.\n"); + output_till_dot(output, oname, "host:"); +} + +/* + * output_remark - output the ---remark--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * remark stream to the file containing remark text + * rname name of the remark file + * + * Read the needed information form stdin, and write the entry section. + */ +void +output_remark(FILE *output, char *oname, FILE *remark, char *rname) +{ + char buf[BUFSIZ+1]; /* input/output buffer */ + + /* + * write the start of the section + */ + fprintf(output, "---remark---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * copy the remark file to the section + */ + while (fgets(buf, BUFSIZ, remark) != NULL) { + fputs(buf, output); + check_io(output, oname, EOF_NOT_OK); + } + check_io(remark, rname, EOF_OK); + + /* be sure that the remark section ends with a newline */ + if (buf[strlen(buf)-1] != '\n') { + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + } +} + +/* + * output_author - output the ---author--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * + * Read the needed information from stdin, and write the author section. + * If multiple authors exist, multiple author sections will be written. + */ +void +output_author(FILE *output, char *oname) +{ + char buf[MAX_COL+1+1]; /* I/O buffer */ + int more_auths; /* TRUE => more authors to note */ + int auth_cnt=0; /* number of authors processed */ + + /* + * prompt the user for the author section + */ + printf("\nEnter information about each author. If your entry is after\n"); + printf("%s and before the contest deadline, the judges\n", START_DATE); + printf("will attempt to EMail back a confirmation to the first author\n"); + + /* + * place author information for each author in an individual section + */ + do { + + /* write the start of the section */ + fprintf(output, "---author---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* write the author */ + printf("\nAuthor #%d name: ", ++auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nname too long, please re-enter: "); + } + fprintf(output, "name:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the organization */ + printf("\nEnter the School/Company/Organization of author #%d\n", + auth_cnt); + printf("\nAuthor #%d org: ", auth_cnt); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter: "); + } + fprintf(output, "org:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the address */ + printf( + "\nEnter the postal address for author #%d. Be sure to include\n", + auth_cnt); + printf("your country and do not include your name.\n"); + output_till_dot(output, oname, "addr:"); + + /* write the EMail address */ + printf( + "\nEnter the EMail address for author #%d. Use an address from\n", + auth_cnt); + printf( + "a registered domain or well known site. If you give several\n"); + printf("forms, list them one per line.\n"); + output_till_dot(output, oname, "email:"); + + /* write the home page URL */ + printf( + "\nEnter the fully qualified home page URL for author #%d\n", + auth_cnt); + printf("including the http: part or just enter none: "); + while (get_line(buf, MAX_COL+1, MAX_COL-9) <= 0 || + (strncmp(buf, "http://", sizeof("http://")-1) != 0 && + strcmp(buf, "none\n") != 0)) { + printf("\nURL too long, does not begin with http:// or\n"); + printf("is not the word none\n"); + } + fprintf(output, "url:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* write the anonymous status */ + printf("\nShould author #%d remain anonymous (enter y or n)? ", + auth_cnt); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + fprintf(output, "anon:\t%s", buf); + check_io(output, oname, EOF_NOT_OK); + + /* determine if there is another author */ + printf("\nIs there another author (enter y or n)? "); + while (get_line(buf, 1+1, 0) <= 0 || !(buf[0]=='y' || buf[0]=='n')) { + printf("\nplease answer y or n: "); + } + if (buf[0] == 'y') { + more_auths = TRUE; + } else { + more_auths = FALSE; + } + } while (more_auths == TRUE); + return; +} + +/* + * output_info - output the ---info--- section(s) + * + * usage: + * output entry's output file stream + * oname name of the output file + * + * Read the needed information from stdin, and write the info section. + * If multiple info files exist, multiple info sections will be written. + */ +void +output_info(FILE *output, char *oname) +{ + char infoname[MAX_FILE_LEN+1]; /* filename buffer */ + char yorn[1+1]; /* y or n answer */ + char *uuname; /* name to uuencode as */ + FILE *infile; /* info file stream */ + + /* + * prompt the user for info information + */ + printf("\nInfo files should be used only to supplement your entry.\n"); + printf("For example, info files may provide sample input or detailed\n"); + printf("information about your entry. Because they are supplemental,\n"); + printf("the entry should not require them to exist.\n\n"); + + /* + * while there is another info file to save, uuencode it + */ + printf("Do you have a info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + while (yorn[0] == 'y') { + + /* read the filename */ + printf("\nEnter the info filename: "); + while (get_line(infoname, MAX_FILE_LEN+1, 0) <= 0) { + printf("\nInfo filename too long, please re-enter: "); + } + + /* compute the basename of the info filename */ + /* remove the trailing newline */ + uuname = &infoname[strlen(infoname)-1]; + *uuname = '\0'; + /* avoid rindex/shrrchr compat issues, do it by hand */ + for (--uuname; uuname > infoname; --uuname) { + if (*uuname == '/') { + ++uuname; + break; + } + } + + /* attempt to open the info file */ + infile = fopen(infoname, "r"); + if (infile == NULL) { + fprintf(stderr, "\n%s: cannot open info file: %s: ", + program, infoname); + perror(""); + continue; + } + + /* + * write the start of the section + */ + fprintf(output, "---info---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* uuencode the info file */ + uuencode(output, oname, infile, infoname, UUINFO_MODE, uuname); + + printf("\nDo you have another info file to include (enter y or n)? "); + while (get_line(yorn, 1+1, 0) <= 0 || !(yorn[0]=='y' || yorn[0]=='n')) { + printf("\nplease answer y or n: "); + } + }; + return; +} + +/* + * output_build - output the ---build--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * build open build file stream + * bname name of the build file + * + * Read the needed information from stdin, and write the build section. + */ +void +output_build(FILE *output, char *oname, FILE *build, char *bname) +{ + /* + * write the start of the section + */ + fprintf(output, "---build---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, build, bname, UUBUILD_MODE, UUBUILD_NAME); + return; +} + +/* + * output_program - output the ---program--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * prog open program stream + * pname name of program file + * + * Read the needed information form stdin, and write the program section. + */ +void +output_program(FILE *output, char *oname, FILE *prog, char *pname) +{ + /* + * write the start of the section + */ + fprintf(output, "---program---\n"); + check_io(output, oname, EOF_NOT_OK); + + /* + * uuencode the program file + */ + uuencode(output, oname, prog, pname, UUPROG_MODE, UUPROG_NAME); + return; +} + +/* + * output_end - output the ---end--- section + * + * usage: + * output entry's output file stream + * oname name of the output file + * + * Read the needed information form stdin, and write the 'end section'. + */ +void +output_end(FILE *output, char *oname) +{ + /* + * write the final section terminator + */ + fprintf(output, "---end---\n"); + check_io(output, oname, EOF_NOT_OK); + return; +} + +/* + * get_line - get an answer from stdin + * + * usage: + * buf input buffer + * siz length of input, including the newline + * maxcol max col allowed, 0 => disable check + * + * This function will flush stdout, in case a prompt is pending, and + * read in the answer. + * + * This function returns 0 if the line is too long, of the length of the + * line (including the newline) of the line was ok. This function does + * not return if ERROR or EOF. + */ +int +get_line(char *buf, int siz, int maxcol) +{ + int length; /* the length of the input line */ + + /* flush terminal output */ + fflush(stdout); + + /* read the line */ + if (fgets(buf, siz+1, stdin) == NULL) { + /* report the problem */ + check_io(stdin, "stdin", EOF_NOT_OK); + } + + /* look for the newline */ + length = strlen(buf); + if (buf[length-1] != '\n') { + int eatchar; /* the char being eaten */ + + /* no newline found, line must be too long, eat the rest of the line */ + do { + eatchar = fgetc(stdin); + } while (eatchar != EOF && eatchar != '\n'); + check_io(stdin, "stdin", EOF_NOT_OK); + + /* report the situation */ + return 0; + } + + /* watch for long lines, if needed */ + if (maxcol > 0 && (length > maxcol || col_len(buf) > maxcol)) { + /* report the situation */ + return 0; + } + + /* return length */ + return length; +} + +/* + * output_till_dot - output a set of lines until '.' by itself is read + * + * usage: + * output entry's output file stream + * oname name of the output file + * leader the lead text for the first line + * + * This routine will read a set of lines until (but not including) + * a single line with '.' is read. The format of the output is: + * + * leader:\tfirst line + * \tnext line + * \tnext line + * ... + * + * This routine will not return if I/O error or EOF. + */ +void +output_till_dot(FILE *output, char *oname, char *leader) +{ + char buf[BUFSIZ+1]; /* input buffer */ + int count; /* lines read */ + int done=FALSE; /* TRUE => finished reading input */ + + /* instruct the user on how to input */ + printf("\nTo end input, enter a line with a single period.\n"); + + /* read lines until '.' or EOF */ + count = 0; + while (!done) { + /* issue the prompt */ + printf("%s\t", (count>0) ? "" : leader); + fflush(stdout); + + /* get the line */ + if (get_line(buf, BUFSIZ, MAX_COL-9) <= 0) { + printf("\nline too long, please re-enter:\n\t"); + continue; + } + + /* note if '.' was read */ + if (strcmp(buf, ".\n") == 0) { + done = TRUE; + } + + /* write line if we read something */ + if (!done) { + fprintf(output, "%s\t%s", (count++>0) ? "" : leader, buf); + check_io(output, oname, EOF_NOT_OK); + } + } + + /* if no lines read, at least output something */ + if (count <= 0) { + fprintf(output, "%s\t.\n", leader); + check_io(output, oname, EOF_NOT_OK); + } + return; +} + +/* + * col_len - determine the highest that a string would reach + * + * usage: + * string the string to examine + * + * Given a string, this routine returns that a string would reach + * if the string were printed at column 1. Tab stops are assumed + * to start at 9, 17, 25, 33, ... + */ +int +col_len(char *string) +{ + int col; /* current column */ + char *p; /* current char */ + + /* scan the string */ + for (col=0, p=string; *p != '\0' && *p != '\n'; ++p) { + /* note the column shift */ + col = (*p=='\t') ? 1+((col+8)/8*8) : col+1; + } + if (*p == '\n') { + --col; + } + + /* return the highest column */ + return col; +} + +/* + * check_io - check for EOF or I/O error on a stream + * + * usage: + * stream the stream to check + * name the name of this stream + * eof_ok EOF_OK or EOF_NOT_OK + * + * Does not return if EOF or I/O error. + */ +void +check_io(FILE *stream, char *name, int eof_ok) +{ + /* test for I/O error */ + if (ferror(stream)) { + fprintf(stderr, "%s: error on %s: ", program, name); + perror(""); + exit(1); + + /* test for EOF */ + } else if (eof_ok == EOF_NOT_OK && feof(stream)) { + fprintf(stderr, "%s: EOF on %s\n", program, name); + exit(1); + } + return; +} + +/* + * uuencode - uuencode a file + * + * usage: + * output output file stream + * oname output filename + * infile input file stream + * iname input filename + * umode the mode to put on the uuencode file + * uname name to put on the uuencode file + * + * Perform the uuencoding process identical to the process performed + * by the uuencode(1) utility. + * + * This routine implements the algorithm described in the uuencode(5) + * 4.3BSD Reno man page. + */ +void +uuencode(FILE *output, char *oname, FILE *infile, + char *iname, int umode, char *uname) +{ + char buf[UUENCODE_LEN+1]; /* the uuencode buffer */ + int read_len; /* actual number of chars read */ + int val; /* 6 bit chunk from buf */ + char filler='\0'; /* filler uuencode pad text */ + char *p; + + /* + * output the initial uuencode header + */ + fprintf(output, "begin %o %s\n", umode, uname); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + + /* + * We will process UUENCODE_LEN chars at a time, forming + * a single output line each time. + */ + while ((read_len=fread(buf,sizeof(buf[0]),UUENCODE_LEN,infile)) > 0) { + + /* + * the first character is the length character + */ + fputc(UUENCODE(read_len), output); + check_io(output, oname, EOF_NOT_OK); + + /* + * We will convert 24 bits at a time. Thus we will convert + * 3 sets of 8 bits into 4 sets of uuencoded 6 bits. + */ + for (p=buf; read_len>0; read_len-=3, p+=3) { + + /* bits 0 to 5 */ + val = (p[0]>>2)&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 6 to 11 */ + val = ((p[0]<<4)&0x30) | ((p[1]>>4)&0x0f); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 12 to 17 */ + val = ((p[1]<<2)&0x3c) | ((p[2]>>6)&0x03); + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + + /* bits 18 to 23 */ + val = p[2]&0x3f; + fputc(UUENCODE(val), output); + check_io(output, oname, EOF_NOT_OK); + } + + /* end of UUENCODE_LEN line */ + fputc('\n', output); + check_io(output, oname, EOF_NOT_OK); + + /* + * clear out the input buffer (don't depend on bzero() or memset()) + */ + for (p=buf; p < &buf[sizeof(buf)/sizeof(buf[0])]; ++p) { + *p = '\0'; + } + } + + /* check the last read on the input file */ + check_io(infile, iname, EOF_OK); + + /* write end of uuencode file */ + fprintf(output, "%c\nend\n", UUENCODE(filler)); + check_io(output, oname, EOF_NOT_OK); +} diff --git a/2004/newbern.c b/2004/newbern.c new file mode 100644 index 000000000..36031c125 --- /dev/null +++ b/2004/newbern.c @@ -0,0 +1,125 @@ +#include +#include +#include +#include +#define t(x) typedef x +#define G return +#define Y(x) x;x +#define e(s) exit(s); +#define b(x,o) x o x +#define Z while +#define y fclose +#define end static + +t(signed)char U;t(struct) b(O,); + +t( U*) +H; t(O +*) *o; +struct O{ O* l, **h; void* L; } ; t(int)i; i P(U g) { G +isspace(g); } H D(H s){H p,r;if(!s)G 0;for(p=(H)s;*p && +!P(*p); p++); if(r=malloc(p-s))for(p=r; *s&&! P(*s);p++ +,s++)b(*,p=) s; G r;} void l(o p,O*x){*(o)x=* p; *p=x;} +#define m(x) do{ if(!(q = malloc(sizeof(O)))) e(1)q->l\ +=0 ;q\ +-> L=\ + x ; } while (0) + i(*R)(i) =putchar;i h( + o f,H d,U c){O*q; f+=c;Z(d&&*d) + { m(D(d)); l(f++, q); Z(*d && !P(*d + )) d++; Z(*d && P(*d)) d++; } G b(,0);} + void k() { static U b(c,;) ?R(c):(c='\n'); } + i main (i Q, H *l){static o + X;i t,j; switch (Q + ){ case 1: { H + *p, I [] ={ +"aH" " " +"B" "0" +" " "B" +"" "B" +"" " " +"B" "," +" " "," + " `" "0 " + "b0 " "@, " + "0 Hb," " B2 " + "H0 b, B b" "H HB b`, " + "H, @ 2 `, " "@2 H2 BH Bb" + " b@","AH B0 BB B, , `0 b0 @, 0 Hb, B2 H0" + " b, B bH HB b`, H, @ 2 `, @2 H2 BH Bb" + " b@","0bHb, HbH `H2 @b, @H @0 B@ " + "b@ bH0 bHB",".HHH","?`H0", + ",b@b,"," +", 0}; p=I; + + if (!(X=calloc( + 6<<6,sizeof(O*))))e(1) + do{h(X,(*p)+1,**p);} Z(*(++p)); + D: if ((t = getchar()) >= 0) { k(); + goto u;}e(0)}case 2:{U *p,e[33]; b(i, ) + ,w;for(i=0;i<34;i++)i[e]=b(0,;w=);p=e; Z(1){ + t = (w == 200) ? 10:getchar(); + switch(t) { case 0xa: + case EOF: if(w-- + ){R(1[l ][0]) +;for(i =0, +p=e;i <=w +;i+= 6){ +R ( *p+ +'+' );* +p++ =0; + ;} R( + 0xa );w + =-1 ;}p= + e- 1;case + 32: if (t<0) e( + 0) break; /*/* + /*/ default : * + p + |=(001<<(w%6)); + }if((++w%6)==0)p++;}e( + 0)}case 3:{O*u,*q,*x;U s[0400]; + i i;FILE*F; j:j=1;if(!(X=calloc(6<< + 6,sizeof(O*)))) e(1) if(!(F=fopen(j[l], + "r")))e(1)Z(fgets(s,j<<8,F))(*s)&&h(X,s+j,*s + );j=b(i,=)&0xff; i:u=0;x=X[i]; + Z(x){q=Y(*( o)x)=Y(u) + =Y(x)=q;} i[X]=u + ;i=(i-2 +9)%( +sizeof (s)) +;if(i ^j) +goto i;; +y(F) ; } +case 4:{ +end i i + ;if (! + X){ i=j + =1; goto + j;} if(i){O + **x ,*m=*(x=X); + do* x=1[x];Z(++ + xL;Z(*p>=n){i=(*p++)-n;for(c=0;c<6;c++,i=i + >>1){ if(b(!, i &&)(*p >= n)) + break;R(32+ (i&1)*3); + }}R(10);a =a->l; + }if(Q<2 )goto +D;if(* l[2 +]){R( 10) +;main (4, +l); }}} +Z(Q ++< +1){ X+= + t; if + ((t &7) + >3) goto + i; else { + t-- ;putchar(t) + ;t =(t&7)?t:t- + '*' ;}}exit(0); + } diff --git a/2004/newbern.dat b/2004/newbern.dat new file mode 100644 index 000000000..cd475b603 --- /dev/null +++ b/2004/newbern.dat @@ -0,0 +1,1682 @@ +!+++c,++++ij, +5+++K +v++++++++1 +W+++++++++++K. +l+++1+++++++K. +k+++1+++++++K. +h+++1+++++++K. +x+++1++++1 +yc+++++++1 +;+++c,++c, +D+++1+++++++K. +t++++++++1 +,+++c, +X+++1+++++++K. +c+++++j: +%+++1++++++c. +'+++++++++++G +s+++i2+c. +F+++1+++++++K. +E+++1+++++++K. +/+++1 +z+++++++g2 +r+++1++++1 +2+++- +jK. +N+++1+++++++K. +u++++++++1 +7++++++++++3 +d++++[jj +g+g.+++j, +:+++c,++c, +w++++++++1 +6+++++[jjj: +.+++c, +K+++1+++++++K. +4+++++, +*++++++++1 +U+++++++++++K. +M+++1+++++++K. +o+++++j: +Y+++++++++++K. +q++++[jj +i+++1++++1 +$++++,+++cjj. +Q++++++cjj +A+++1 +-++++++1 +b+++1+++++++K. +J++++c, +(++++++cjj +m+++1++++1 +G++++++cjj +B+++1+++++++K. +3+ +8+++++j, +O++++++cjj +e+++++j: +1+++1 +V+++++++++++K. +Z++++++++++cj. +`++++++++++j+ +=+++++CC +R+++1+++++++K. +)++++++++++++- ++++++++1 +a++++g, +I+++1+++++++K. + + +H+++1+++++++K. +S+++ij +@+++++[j, +?++++++++++J +n+++1++++1 +9++++++++cj, +f++++++++1 +C++++++cjj +L+++1+++++++K. +0++++++ijj. +T++++++++++cj. +P+++1+++++++K. +p1+++++++1 +#++++++++K.7 +x+++1++++1 +r+++1++++1 +S+++ij +m+++1++++1 +W+++++++++++K. +`+++++++++Kj. +l+++1+++++++K. +U+++++++++++K. +3++++, +(+++++Kjjj2 +Q+++++Kjjj2 +R+++1+++++++K. +Y+++++++++++K. +i+++1++++1+I +F+++1+++++++K. +n+++1++++1 +;+++g.++g. +H+++1+++++++K. +jc: +/+++I + + +2+++I +A+++1 +0+++++cjjjj +X+++1+++++++K. +c++++cjj. +=+++++CC +$++++,+++gjj2 +9+++++++Kjj: +M+++1+++++++K. +D+++1+++++++K. +w++++++++1 +v++++++++1 +d++++gjj. +-++++++1 +u++++++++1 +yg,++++++1 +o++++cjj. +P+++1+++++++K. +C+++++Kjjj2 +?+++++++++Kj, +t++++++++1 +N+++1+++++++K. +J++++i2 +a++++j2 +6+++++ijjjj, +.+++g. +f+++1++++1 +s+++i2+i: +'+++++++++++i, +z+++-+++g2 +p1+++++++1 +O+++++Kjjj2 +T++++++++++cj. +b+++1+++++++K. +V+++++++++++K. +)+++9+++++++K. +E+++1+++++++K. +5+++[+++K, ++++++++1 +g+j:++[j2 +!+++g.++cjjj: +Z+++1++++++cj. +%+++I++++++i: +,+++g. +I+++1+++++++K. +h+++1+++++++K. +B+++1+++++++K. +8++++cj: +q++++gjj. +4+++++2 +e++++cjj. +k+++1+++++++K. +1+++1++++++- +:+++g.++g. +K+++1+++++++K. +@+++++ij: +*++++++++1 +L+++1+++++++K. +7++++++++++c, +G+++++Kjjj2 +#++++++++K.7 +1+++1++++++9 +o++++jjj: +*+++++++,1C +9+++[+++gjjj, +H+++1+++++++K. +c++++jjj: +(+++++jjjjj2 +L+++1+++++++K. ++++++++1 +?+++++++++Kj: +e++++jjj: +%+++g2++++K2g+ +u++++jjjj2 +jg: +Y+++++++++++K. +E+++1+++++++K. +r+++ijjjj2 +Z+++i++++++cj. +B+++1+++++++K. +R+++1+++++++K. +@++++[j+i. +6++++cjjjjjJ +.+++i2 +J+++[j: +X+++1+++++++K. +pijjjjjjj2 +7++++++++++[J +m+++ijjjj2 +t++++ijjjjJ +T++++++++++cj. +-++++++1 +,+++i2 +'++++++++++Kj. +s+++i2Kjj+ +/+++g2 +V+++++++++++K. +;+++i2++i2 + + +#++++++++gjj, +I+++1+++++++K. +x+++9+++K2 +2+++i2++++++7 +Q+++++ijjjj. +N+++1+++++++K. +z+++i+++[2 +5+++c,+++jj+ +=+++++CC +k+++ijjjjjjjj. +U+++++++++++K. +)+++i2+++++Kj, +h+++ijjjjjjjj. +4+++++J +M+++1+++++++K. +!+++i2cjjjjjj, +8++++ijj,+g: +3+++[2++++++/ +l+++ijjjjjjjj. +f+++ijjjjjjj+ +w+++++++c2 +d+++KjjjJ +v+++++++c2 +b+++ijjjjjjjj. +A+++1 +K+++1+++++++K. +D+++1+++++++K. +0++++[jjjjj: +a+++cjj+G +$+++[,++Kjjj: +g[.Gg+ijj +`+++++++++[jJ +i+++ijjjj2Kj, +S+++ij+++[jj+ +F+++1+++++++K. +G+++++ijjjj. +O+++++ijjjj. +C+++++ijjjj. +W+++++++++++K. +q+++KjjjJ +n+++ijjjj2 +yi.+++++c2 +:+++i2++i2 +P+++1+++++++K. +L+++ijjjjjjjj. +4+++++j+ +f+++ijjjjjjj. +R+++ijjjjjjjj. +c+++KjjjJ +5+++g,+++jjj+ ++++++++1 +m+++ijjjj2 +ji: +-++++++1 +'+++++++++K[j. +C++++Kjjjjj: +,++Mj2 +l+++ijjjjjjjj. +*++++++[.1g +t+++KjjjjjJ +w+++++++i2 +A+++9 +u+++[jjjj2 +D+++ijjjjjjjj. +z+++i,++K2 +I+++ijjjjjjjj. +r+++ijjjj2 +b+++ijjjjjjjj. +P+++ijjjjjjjj. +d+++[jjjj+ +V+++++++++++[. +X+++1+++++++[. +h+++ijjjjjjjj. +.+++i2 +x+++9+++c2 + + +#++++++++gjj, +$+++[,++KjjjJ +Q++++Kjjjjj: +;++Mj2++i2 +?+++++++++Kj: +a+++gjj+j+ +pijjjjjjj2 +v+++++++i2 +E+++ijjjjjjjj. +M+++ijjjjjjjj. +%+++[:++++K.[, +!+++i2cjjjjjj, +O++++Kjjjjj: +U+++++[jjjjjj. +2+++i:++++++7 +T+++++++++++i. +9+++c+++ijjj. +0++++cjjjjjj+ +=+++++CC +q+++[jjjj+ +H+++ijjjjjjjj. +S+++c:+++cjj, +@++++c.+KJ +Z+++i.++++++i. +s+++g,[jj, +:+++i2++i2 +o+++KjjjJ +G++++Kjjjjj: +7++++++++++Kj. +yi.+++++i2 +gc,[j,ijj+ +K+++ijjjjjjjj. +8++++jjj.+jj+ +(++++cjjjjjJ +N+++ijjjjjjjj. +)+++gj+++++gj, +W+++++++++++[. +e+++KjjjJ +3+++[2++++++9 +`+++++++++[jN, +Y+++++++++++[. +n+++ijjjj2 +F+++ijjjjjjjj. +1+++ijjjjjjJ +/+++[: +6++++gjjjjjj, +J+++cj: +k+++ijjjjjjjj. +B+++ijjjjjjjj. +i+++ijjjj2Kj, +yi.++++gj2 +0++++jjjjjjj. +E+++ijjjjjjjj. +P+++ijjjjjjjj. +d+++gjjjj. +e+++cjjjj, +N+++ijjjjjjjj. +h+++ijjjjjjjj. +(++++jjjjjjj2 +i+++ijjjj2Kj, +H+++ijjjjjjjj. ++++++++1 +a+++ijj,j. +ja: +#++++++++K.7 +f+++ijjjjjjjJ +x+++i,++j2 +5+++g++++1gjj. +/++++g. +U++++[jjjjjjj. +k+++ijjjjjjjj. +9+++g+++jjjj: +t+++gjjjjjJ +V++++++++++[j. +z+++iJ+++2 +m+++ijjjj2 +pijjjjjjj2 +4+++++j2 +6++++jjjjjjj2 +s+++g+cjj. +Q++++cjjjjjj+ +n+++ijjjj2 +Y+++++++++++j. +l+++ijjjjjjjj. +F+++ijjjjjjjj. +M+++ijjjjjjjj. +)+++gjj,++ijj+ +A+++i. +:+++i2++g2 +w++++++gj2 +?++++++++++:I +o+++cjjjj, +$+++g+++cj2Kj+ +u+++gjjjj2 +c+++cjjjj, +v++++++gj2 +B+++ijjjjjjjj. +1+++ijjjjjjj, +@++++9+++g +-++++++1 +G++++cjjjjjj+ +r+++ijjjj2 +Z+++ij++++++[. +S+++g,+++jjj: +3+++g,++++++I +D+++ijjjjjjjj. +X+++9+++++++i. +.+++i2 +7++++++++++Kj. +O++++cjjjjjj+ +J+++gj: +L+++ijjjjjjjj. +R+++ijjjjjjjj. +*+++++++J1: +`+++++++++KJ +b+++ijjjjjjjj. +K+++ijjjjjjjj. +%++++g.+++[+K, +q+++gjjjj. +2+++ij,+++++G +T+++++++++++[. +C++++cjjjjjj+ + + +8+++[jjj2cjj2 +!+++i2+cjjjjJ +;++cj2++g2 +'++++++++++gj, +gG+Kj2jjj. +,++cj2 +W++++++++++[j. +=+++++CC +I+++ijjjjjjjj. +'+++++++++++J +gI+Kjjj+g2 +N+++1++++++Kj. +1+++ijjjjjjj2 +%+++++j+++[+K, +C++++jjjjjjj. +,+++i, +e+++g,[+c. +-++++++1 +q+++i.++g2 +.+++c, +a+++i+c.j2 +D+++ijjjjjjjj. +h+++ijjjjjjjj. ++++++++1 +)+++[jjjjjjj: +5+++9++++I+Kj. +d+++i.++g2 +4+++++jj +I+++ijjjjjjjj. +k+++ijjjjjjjj. +=+++++CC +i+++ijjjj2+j+ +l+++ijjjjjjjj. +6+++[jjjjjjjJ +G++++jjjjjjj. +$+++7+++cj++g, +c+++g,++c. +E+++ijjjjjjjj. +m+++ijjjj2 +L+++ijjjjjjjj. +t+++ijjjjjJ +9+++9++[j2+gJ +;+++i,++c, +Y++++++++++gj. +X+++i,+++++cj. +u+++ijjjj2 +V+++++++++Kjj. +!+++c,++++ij, +/+++++j +7++++++++++Kj. +O++++jjjjjjj. +0+++[jjjjjjj: +R+++ijjjjjjjj. +*+++++++gj. +w+++++[jj2 +P+++ijjjjjjjj. +b+++ijjjjjjjj. +H+++ijjjjjjjj. +o+++g,++c. +v+++++[jj2 +A+++Qj+ +Z+++ij2+++++K. +s+++9+cJ+2 +3+++g+++++++g, +?+++++++++++[, +S+++g+++Kj.+I +W+++++++++Kjj. +pijjjjjjj2 +z+++ij.++1 + + +Q++++jjjjjjj. +j1 +8+++g2+KJijjJ +M+++1++++++cj. +:+++c,++c, +`++++++++++: +J+++Ii2 +x+++Q:+cj2 +n+++ijjjj2 +r+++ijjjj2 +T+++++++++++K. +@++++2+j.[. +B+++ijjjjjjjj. +yc:+++[jj2 +#++++++++K.7 +F+++ijjjjjjjj. +U++++gjjjjjjj. +f+++ijjjjjjjj, +2+++iR:+++++c, +K+++ijjjjjjjj. +(+++cjjjjjjjJ +W+++++++++gjj. +'++++++++++++ +`+++++++++++ +P+++ijjjjjjjj. +E+++ijjjjjjjj. +g9+[jd2+[2 +j1 +/+++++i, +z+++ij:++1 +i+++ijjjj2+I +)++++jjjjjjj2 +k+++ijjjjjjjj. +,+++++ +f+++ijjjjjjjj, +0+++[j,++++gJ +x+++1J+gj2 +9+++9++[J+++j+ + + +o+++g+++[. +:+++++++++ +C++++jj2++gj2 +b+++ijjjjjjjj. +L+++ijjjjjjjj. +a+++I+[.72 +B+++ijjjjjjjj. +u+++ijjjj2 +N+++1++++++[j. +r+++ijjjj2 +Q++++jj+++gj2 +M+++1+++++Kjj. +t+++ijjjjjJ +Y++++++++++ij. +s+++9+g:+1 +v+++++ijj2 +w+++++ijj2 +l+++ijjjjjjjj. +4+++++jj, +5+++9++++G+Kj. +?+++c,K.++++[, +3+++I+++++++c, +7++++++++++Kj. +c+++g+++[. +D+++ijjjjjjjj. +q+++i+++[2 +@++++.[j2K. +pijjjjjjj2 +T+++++++++++K. +V+++++++++gjj. +6+++cj,+c++gJ +F+++ijjjjjjjj. +e+++g+[+[. +%+++++i,++[+K, +;+++++++++ +J+++9g2 +(+++gjj,++ijj+ +h+++ijjjjjjjj. +K+++ijjjjjjjj. +=+++++CC +m+++ijjjj2 +R+++ijjjjjjjj. +8+++g,++IjjjJ +yKj+++ijj2 +X+++i2+++++ij. ++++++++1 +1+++ijjjjjjj: +#++++++++K.7 +!++++++++++++ +Z+++ijJ+++++K. +n+++ijjjj2 +.+++++ +S+++G+++Kj,+G +2+++i2J+++++[, +$+++9+++gJ++[, +U++++ijjjjjjj. +I+++ijjjjjjjj. +-++++++1 +H+++ijjjjjjjj. +O++++jj+++gj2 +*+++++++cj, +A+++1i2 +d+++i+++[2 +G++++jj2++gj2 +A+++1+j, ++++++ijjj2 +e+++9+[++2 +k+++1+[J +W++++++++cjjj. +t+++i,+++1 +M+++1++++Kjjj. +P+++ijjjjjjjj. +v++++cjjJ1 +i+++1 +D+++ijjjjjjjj. +4+++++jb2 +$+++1+++gJ++K. + + +U+++[jjjjjjjj. +H+++ijjjjjjjj. +u+++i+ +1+++ijjjjjjjj, +0+++g.++++++i+ +G+++[j2++++gJ +(+++gj+++++gj, +L+++ijjjjjjjj. +d+++9++++2 +R+++ijjjjjjjj. +c+++9++++2 +#++++++++gjj, +?+++i2cj++++K, +l+++1 +a+++9+[.+1 +-++++++1 +r+++1+++I +w++++cjjJ1 +B+++ijjjjjjjj. +Y+++++++++cjj. +9+++1++c.+++g, +6+++g,++K.++i, +z+++ajj,+1 +s+++1+g:+1 +*++++++gjjj. +E+++ijjjjjjjj. +T+++++++++++K. +J+++1 +5+++1++++G+Kj. +h+++1+++c+ +m+++1+++c+ +V++++++++cjjj. +3+++9+++++++[, +2+++i2c,++++K, +X+++1i,+++[jj. +n+++1+++c+ +b+++[,++c+ +j9+++++++1 +%+++++KJ++K.[, +O+++[j+++++gJ +K+++ijjjjjjjj. +g9+[j[,++2 +p+++K.++G +C+++[j2++++gJ +o+++9++++2 +f+++1++++1++[. +q+++9++++2 +F+++ijjjjjjjj. +N+++1++++++jj. +I+++ijjjjjjjj. +8+++I+++cjJ+j, +y+c:+cjjJ1 +/+++++KJ +)++++cjjjjjJ +Q+++[j+++++gJ +@+++[,i+G+2 +7++++++++++Kj. +x++++cLjj2 +Z+++ijj2++++K. +S+++9+++cj++[, +=+++++CC +n+++++++K. ++++++ijjj2 +y++ibjjj +V+++++++cjjjj. +-++++++1 +3+++1+++++++K. +A+++++[j +u+++I +p+++g+++K. +s+++1+i2+1 +w+++[jjj +F+++1++++1++K. +h+++++++K. +r+++++++g+ +*++++++gjjj. +#++++++++gjj, +Z+++1ijj++++K. +b+++G+++K. +4+++++j2j +I+++1+++++++K. +8+++9+++[j.+c, +9+++1++c,+++[, +L+++1+++++++K. +e+++1+[++1 +o+++1++++1 + + +f++++++++1+[N. +6+++I++++1++[, +%++++++c2++jJ +M+++++++Kjjjj. +7+++iJ+++++Kj. +T+++1+++++++K. +v+++[jjj +E+++1++++1++K. +C+++gJ++++++j+ +m+++++++K. +t+++i++++1 +?+++i2gj:+++K. +R+++1+++K2++K. +(+++i+++++++g. +q+++9++++2 +g9+cJ[+++1 +S+++1+++cj++K, +2+++i2[:++++K. +/++++++c2 +5+++1++++g+Kj. +@+++[,9+c+1 +B+++1++++1++K. +U+++cj2+++++K. +$++Kjjjjjjjjj: +W+++++++cjjjj. +P+++1++++1++K. +Y++++++++Kjjj. +x++++Kjj21 +z+++1ij:+1 +d+++9++++2 +X++++[:+++jjj. +D+++1+++++++K. +O+++g2++++++j+ +N+++++++++cjj. +1+++1 +G+++gJ++++++j+ +=+++++CC +0+++I+++++++[, +Q+++g2++++++j+ +a+++9+[,+1 +K+++1+++K2++K. +J+++1 +)+++++gjjjj+ +c+++1++++1 +k+++++ij, +jgjjjjjjj2+j+ +H+++1++++1++K. +m+++1+++[. +r+++++++c, +c+++1++++1 +R+++1+++c2++K. +N+++++++++gjj, +S+++1+++cJ++K, +x+++++jj. +G+++g2++++++g, +D+++1+++++++K. +7+++ij:++++Kj. +p+++G+++K. +0+++9+++++++[, +-++++++1 +s+++1+i2+1 +Y++++++++cjjZ. +U+++gj,+++++K. +(+++9+++++++K. +a+++9+[,+2 ++++++++1 +u+++I +8+++9+++cj,+[, +g9+gJ[+++1 +K+++1+++cJ++K. +q+++9++++2 +E+++1++++1++K. +%++++++[J++i: +M+++++++ijjjj, +w+++gjj: +H+++1++++1++K. +@+++[+9+[+1 +y++[jjj: +F+++1++++1++K. +v+++gjj: +V+++++++ijjjN. +6+++9++++7++[, +o+++1++++1 +T+++1+++++++K. +#++++++++K.7 +A++++++j. +B+++1++++1++K. +$++Kjjjjjjjjj: + + +d+++9++++2 +9+++1++c++++K. +/++++++[J +?+++i2gjJ+++K. +2+++i2K:++++K. +h+++++++K. +5+++1++++i+Kj. +3+++1+++++++K. +J+++1 +X+++++J++KjjZ. +b+++9++++2 +I+++1+++++++K. +n+++++++K. +k+++++jj. +W+++++++ijjjN. +O+++g,++++++g, +L+++1+++++++K. +e+++1+[++1 +1+++1 +t+++i++++1 +f++++++++1+cR. +jgjjjjjjj2Kj, +=+++++CC +P+++1++++1++K. +)+++++Kjjj2 +*+++++++Kj +Q+++g,++++++g, +z+++1cjj+1 +Z+++1gjj.+++K. +4+++++j2g. +C+++g2++++++g, +A++++++.j, +5+++9++++i+Kj. +V++++++ijjj2K. +c+++1++++1 +K+++1++Kjj,+K. +Z+++1+jjJ+++K. +H+++1++++1++K. +j[jjjjjjj2Kj, +M++++++ijjjj, +d+++9++++2 +b+++9++++2 +n+++++++K2 +y+++gjJ +9+++1++c++++K. +G+++i,++++++[, +Y+++1++++jjjK. ++++++++1 +f++++++++1+gj, +t+++G +U+++g:++++++K. + + +I+++1+++++++K. +a+++g+c+K2 +8+++1+++gj++K. +1+++1 +E+++1++++1++K. +#++++++++K.7 +L+++1+++++++K. +m+++ijjjj2 +2+++i2+j++++K. +7+++ijjJ+++Kj. +W++++++ijjj2K. +z+++1+jj21 +%++++j++g. +o+++1++++1 +h+++++++K2 +=+++++CC +@+++[+1+[+1 +0+++1+++++++K. +6+++1++++G++K. +D+++1+++++++K. +x++++cjJ +P+++1++++1++K. +k++++cj:: +B+++1++++1++K. +)+++++++++ +v+++gjJ +q+++9++++2 +J+++9 +gI+g:[,++2 +C+++i,++++++[, +O+++I+++++++[, +/+++++++g. +u+++I +S+++1+++gJ++K. +R+++1++Kj2++K. +4+++++j2K: +s+++1+i2+2 +-++++++1 +w+++gjJ +T+++1+++++++K. +X+++++c2+ijjK. +F+++1++++1++K. +3+++1+++++++K. +N++++++++[jj: +p+++9++++2 +e+++1+[++1 +r+++++++c. +(+++++++++++++ +$+++1+++j2++K. +?+++g.c2i.++K. +*+++++++gj. +Q+++I+++++++[, +G+++i+++++++K. +O+++9+++++++K. +H++++++++1 +@+++[+9+[+1 +9+++1++[++++K. +Z+++1+cjj2++K. +%+++[j.++j +C+++i+++++++K. +w++++i. +z+++1+cjj2 +s+++9+j.K. +F++++++++1++K. +*+++++++J1: +m+++ijjjj2 +v++++i. +P++++++++1++K. +V+++++ijjj2 +?+++++++c:++[. +Y+++1+++gjj. +2+++i2+i.+++K. +R++++++gj2++K. + + +7+++ijjjJ++Kj. +o+++9++++2 +gI+i2[2+[2 +p+++9++++2 +S+++1+++gJ++K. +U+++i, +D+++1+++++++K. +u+++g +c+++1++++2 +x+++1jj: +n+++++++K2 +k+++1jj,g1 +T+++ijjjjjjjj. +-++++++1 +t+++[+ +0+++1+++++++K. +b+++9++++2 +r+++++++[2 +E+++1++++1++K. +K++++++gjj2 ++++++++1 +A++++++.[j +/++++++++j +d+++g+++K. +q+++g+++K. +Q+++9+++++++K. +h+++++++K2 +=+++++CC +e+++1+[++2 +W+++++ijjj2 +B+++1++++1++K. +j+ijjjjjj2Kj, +f++++++++++gj, +3+++9++++.++K. +5+++9++++j+Kj. +L+++1 +6+++1++++G++K. +J+++I+++++++K. +M+++++ijjjj +X++++++jcjj. +a+++[jjjj2 +y++++i. +N++++++++jjj+ +8+++1+++gJ++K. +$+++1+++j2++K. +4+++++j2+i+ +b+++9++++2 +W++++[jjjj+ +A++++++.+j. +D+++1+++++++K. +f++++++++++gj+ +?+++++++[J++g. +j+cjjjjjj2+j+ + + +@+++[,9+[+1 +E+++1++++1++K. +O+++9+++++++K. +s+++9+j.[. +z+++1+Kjj2 +F++++++++1++K. ++++++++1 +R++++++jj2++K. +N+++++++Kjj: +6+++1++++G++K. +T+++ijjjjjjjj. +8+++9+++iJ++K. +9+++9++[++++K. +M++++cjjjj2 +t++++, +u+++c+ +o+++9++++2 +2+++i2+g2+++K. +=+++++CC +m+++ijjjj2 +n+++++++K2 +V++++[jjjj+ +%+++g+2++g. +J+++i+++++++K. +v++++c: +h+++++++K2 +G+++I+++++++K. +y++++c: +Q+++9+++++++K. +L+++1 +H++++++++1 +q+++[,++c+ +p+++9++++2 +-++++++1 +B+++1++++1++K. +w++++c: +*++++++K21I +5+++I++++j+Kj. +0+++1+++++++K. +r+++++++j2 +K++++++jjj2 +d+++[,++c+++K. +P++++++++1++K. +4+++++j2+g. +C+++I+++++++K. +Y+++ijjjjjj+ +x+++Qjjj +k+++ajj+c2 +a+++gjjjj. +3+++9+++K2++K. +S+++1+++gJ++K. +U+++i, +/++++++++g. +c+++9++++2 +$+++1+++j2++K. +7+++ijjjj,+Kj. +X++++++gjjj+ +e+++9+[+K2 +Z+++1+KjjJ++K. +gi+i.[j+g2 +V+++Kjjjj. +2+++i2+cJ+++[. ++++++++1 +E+++1++++1++K. +$++Kjjjjjjjjj: +x+++ij:c. +A++++++.+Kj, +s+++g[j,g2 +j+++++++++++ +8+++9+++j2++K. +%+++7+9++KJ +Z+++1++gjj.+K. +K+++++cjj.g +ggjj.+jjj. +7+++ijjjjj+Kj. +-++++++1 +3+++I+++[J++[, +r++++++[j2 +F++++++++1++K. +G+++9+++++++K. +c+++7+++K. +o+++g+++[. +9+++I++K.+++[, +a+++ijjjj, +W+++Kjjjj. +M+++gjjjj. +P++++++++1++K. +0+++9+++++++[, +@+++[,cjj+1 +/++++++++KJ +?+++++++Kj2Kj, +qijjjjjjj2 +Q+++11++++++K. +y+++++i2 +v+++++i2 +O+++1+++++++K. +T+++ijjjjjjjj. +S+++9+++i:++K. +4+++1+j2+KJ +B+++1++++1++K. +H++++++++1 +n+++1+++g2 +b+++i+++[2 +C+++9+++++++K. +d+++ijjjjjjjj. +N+++++++gjj, +f++++++++++[. +*+++++++,1C +h+++1+++g2 +U+++i + + +z+++1++gj2 +6+++9++++G++K. +p+++I+++K2 +w++++cj2 +u+++K.+++1 +k+++ij2+K2 +5+++g,++cJ+Kj. +R+++++cjj2++K. +X++++++[jj2 +D+++9+++++++K. +=+++++CC +m+++ijjjj. +L+++1 +J+++g2++++++K. +Y+++ijjjjj2 +e+++7+[+c. +@+++K,gjj+1 +S+++9+++j2++[, +gcjj,+ijj. +L+++1 +qijjjjjjj2 +-++++++1 +$++Kjjjjjjjjj: +e+++c+[jj, +v++++++j.1 +%+++1+3+++c2 +k+++ij+++2 +d+++ijjjjjjjj. +3+++i,++gj,+i, +V+++ijjj. +o+++g:++j. +A++++++.++[J +B+++1++++9++K. +P++++++++9++K. +W+++ijjj. +?++++++++ijjj+ +E+++1++++1++K. +5+++gj+KjJ+Kj. +8+++i++KjJ++[, +R++++KjjJ9++K. +O+++1+++++++K. +r++++++[j2 +4+++1+j2++g, +c+++c+++g, +h+++ijjjj2 +K++++KjjJ+[. +M+++cjjj. +a+++ijjjJ +x+++ij,+J1 +C+++9+++++++K. +y++++++j.1 +2+++i2+[j,++g, +z+++9++Kj2 +Z+++1+++jjj+K. ++++++++1 +Q+++1I++++++K. +*++++++++1 +G+++9+++++++K. +0+++g+++++++g, +U+++I +s+++cjj,g2 +9+++g,++2+++i, +p+++i.++g2 +u+++ijjjj2 +=+++++CC +T+++ijjjjjjjj. +n+++ijjjj2 +J+++[jjjjjjjj. +7++++++cjj2Kj. +b+++gJ+Kj. +X++++++ijj +D+++9+++++++[. +Y+++ijjjjJ +m+++ijjjj +6+++g++++J++K. +F++++++++1++K. + + +N++++++[jj2 +H++++++++1 +w+++[jjJ +/+++++++++c2 +9+++g2++9++Kj+ +%+++1+3+++KJ +d+++ijjjjjjjj. +C+++9+++++++K. +W+++gjjJ +K+++1[jj2+K2 +h+++ijjjj2 +Q+++9i++++++K. +=+++++++ +b+++gjjjj. +X+++++Kjj: +T+++ijjjjjjjj. +B+++9++++:++K. +*+++++++++ ++++++++1 +J+++[jjjjjjjj. +m+++1+++G +y++++++cJ1 +N++++++gjj. +Z+++1+++gjj.K. +u+++ijjjj2 +qijjjjjjj2 +z+++9+++i2 +4+++1+j2++c. +O+++9+++++++K. +M++++ij: +2+++i2+[j.++i, +0+++g.++++++i+ +c+++[,++g+ +S+++I++Kj2++[, +o+++cjjjj, +E+++1++++1++K. +G+++9+++++++K. +H++++++++1 +x+++iJ++i1 +R+++1[jj29++K. +s+++[jj+g2 +8+++i,+[jJ++c, +F++++++++1++K. +p+++gJ+Kj. +@++++.7+++2 +U+++I +7+++++++cjJKj. +e+++[,[jj+ +D+++I+++++++[, + + +v++++++cJ1 +g[jj,+ijjM, +a+++ijjj: +6+++g,++KJ++K. +-+++++++ +A++++++.++Kj. +?++++++++gjjJ +L+++1 +5+++cjjjj:+Kj. +V+++gjjJ +k+++i:+++1 +r++++++[j2 +3+++i.++jj2Kj, +P++++++++9++K. +$+++9++[j,++K. +n+++ijjjj2 +Y+++ijjjj2 +w+++gjj2 +/+++++++++KJ +/++++++++++g. +Y+++ijjjj +g+j:++[j2i. +w+++gjJ +D+++g+++++++g, +r++++++[j. +A++++++.++jjj, +G+++9+++[+++K, +y+++++++g2 +B+++9++++J++[. +P++++++++I++[. +5+++[jjjj2+Kj. +a+++9 +$+++I++cj+++K, +H++++++++1 +n+++ijjjj. +F+++++++KJ++K. +v+++++++g2 +J++++jjjjjjjj. +V++++gj +3+++gj+ijcjjJ +s++++j: +@++++11++K. +k+++i. +c++++2++3 +4+++ijjjjjjJ +R+++1jjj+I++[. +x+++i.++[2 +0+++[j,++++gJ +m+++++++[, +U+++I +C+++7+++++++K, +O+++9+++++++[, +?++++++++cjj: +X+++++ijjj, +S+++g++cj.++g, +6+++cj,+j:++[, +N+++++KjjJ +K+++1jjj+++I +e++++2[j: +2+++i2++jj+cj, +z+++i+++K2 +9+++[jjjjjjjJ +o+++KjjjJ +qijjjjjjj2 +Q+++9j++++++[, +T+++1+++++++K. +E+++1+++KJ++K. +h+++ijjjj. +L+++1 +%+++7+9++++g. +d+++ijjjjjjjj. +W++++gj +Z+++1+++KjjJK. +8+++g:+ijf2Kj+ +p+++cjjjj, +u+++ijjjj2 + + +b+++[jjjj+ +7++++++++KjNj. +M+++++gj. +4+++ijjjjjjj. +w++++i. +m+++1+++[. +d+++ijjjjjjjj. +z+++i2+++/ +b++++jjj: +s++++++ +v++++++++2 +$+++g,+ij+++[, +8+++cjjjjKjjJ +u+++ijjjj2 +X+++1[jj2K: +/+++++++++++j+ +T+++1+++++++K. +@++++71++[, +P++++++++G++[, +h+++ijjjJ +Z+++1++++cjjR. +2+++i2++ijjjJ +M++++++cj2 +g++++++++g. +c++++++++ +N+++++ijj, +6+++Kjjjj2++c+ +J++++gjjjjjjj. +k+++I +qijjjjjjj2 +G+++g+++[+++[, +E+++1+++cj.+K. +A++++++.+gjjj, +%+++g+2+++++j+ +R+++ijj2+G++[, +C+++G+++++++[, +V+++++gJ +O+++g+++++++c, +Y+++1+++c: +r+++++++J +W+++++gJ +K+++ijj2+++cL. +e+++++[j. +F+++++++cj.+K. +o++++ijj2 +x+++I++++2 +0+++Kjjjjjjj: +S+++g.+ij,+KJ +9++++jjjjjjj2 +7+++++++++Kjj. +?+++++++++jj, +a+++- +B+++i+++KJ++[, +p+++KjjjJ +Q+++gj++++++c, +n+++ijjjJ +D+++g.++++++i+ +y++++++++2 +U+++I +H++++++++1 +3+++cjjjJ[jj: +5++++jjjj,+Kj. + + +L+++1 +x+++9++++1 +C+++c+++++++g+ +S+++c:Kjj++cJ +a+++- +A++++++.Kjjj: +@++++31++c+ +o++++cjj. +4+++ijjjjjjj2 +2+++i2++gjjjJ +F+++++++cj.+K. +T+++1+++++++K. +Z+++1++++Kjjj. +V+++++Kj. + + +7++++++++++ij. +z+++i2 +9++++ijjjjjj. +3+++[jjj:Kjj: +J++++[jjjjjjj. +H+++1++++1++K. +0++++jjjjjjj. +Q+++gj++++++g, +u+++ijjjj2 +%+++[j.+++++g. +M+++++++ij+ +W+++++Kj. +?+++++++++gJ +Y+++1+++Kj +P++++++++g++g, +N+++++jjJ +/+++++++++++g. +m+++1+++c2 +E+++1+++cj.+K. +e+++++[: +8+++[jjjj+jj: +k+++9 +U+++i +X+++1gjj.+j +r++++++++ +L+++1 +d+++1 +b++++gjj. +p++++jjj: +v++++++++1 +K+++ijj,+++[N. +R+++ijj,+g++g, +w++++c: +D+++g:+++++Kj+ +B+++i+++[j++g, +n+++ijjj. +q1+++++++1 +5++++ijjj++Kj. +G+++g,++[+++g+ +$+++g2+jJ+++c+ +O+++g,++++++g, +g++++++++c. +6++++jjjj.++g+ +y++++++++1 +h+++ijjj. +M++++++++gj. +R+++ij:++g.+i, +K+++ij:+++++Z. +%++++i+++++++. +0++++cjjjjjj+ +Z+++1+++++gjj. +O+++c:+++++KJ +o+++++++ +D+++[j,++++gJ +U+++g+ +k+++1 +F+++++++++++K. +h+++1 +q+++++++++ +6++++gjjj+++C +?+++++++++++ +9++++cjjjjjJ +@++++;g+K: +L+++1 +Y+++1++++c: +$+++[jjj:+++G +v++++++++1 +2+++i:++[jjj2 +7++++++++++Kj. +V++++++[j. +H+++1++++1++K. +Q+++gJ+++++KJ +4+++ijjjjjjjJ +P++++++++g.+i, +A++++++.ijjJ +W++++++[j. +b+++++++ +w+++++i2 +3++++jjj.+gj, + + +E+++1+++++++K. +8++++jjj2+cj, +T+++++++++++K. +g++++++++++ +C+++K,+++++KJ +p++++[jj +G+++cj++[++KJ +B+++g,++cj.+i, +J+++++++++++K. +X+++ajj:++c2 +m+++ijjjj2 +n+++1 +u+++1 +d++++ +S+++[jjjJ++cj. +/+++++++++++K. +5++++Kjj.+++g. +x+++1++++1 +y++++++++1 +N++++cjj. +3++++gjj +$+++Kjjj.+++9 +L+++9 +K+++ij++++++g. +S++++jjj2++cj. +A++++++jjjj+ +0+++++jjjjj. +5++++++++++++- +G+++[jjjj++cj. +W+++++[jjj. +X+++ijj++++iK. +J+++++++++++K. +D+++Kjj,++ij: + + +M+++1+++++cj. +9+++++ijjjj, +E+++9+++++++K. +N+++Kjj:++++K. +O+++[j2+++Kj: +4+++ijjjjjjjj. +P++++++++cjjj+ +@+++++[jj+ +w++++++j.1 +m+++ijjjj2 +U+++c, +T+++++++++++K. +B+++g:++jdjjj+ +F+++++++++++K. +8++++gjj, +R+++ij+++cjjj+ +6++++Kjj2 +H+++ijjjjjjjj. +7+++++++++++[. +C++++9+++++cj. +Y+++++++++i.K. +2+++[:+++jjj, +V+++++++Kj. +Q+++ij2+++Kj: +Z+++9+++++Kjj. +P++++++++cjjJ +N+++[jj2++++K. +Q+++ijj+++gj2 +R+++i:+++cjjJ +9+++++[jjj: +F+++++++++++K. +w++++++cJ1 +D++++jjjjjjj. +B+++cj,cjcjjJ +Y+++++++++c:K. +H+++ijjjjjjjj. +G++++jjjj++cj. +K+++i:++++++c. +$++++jjj,+++1 +A++++++jjj: +6+++++ij +3++++[j: + + +O++++jj+++gj2 +8++++cjJ +C++++C+++++cj. +V++++++++iJ +S++++ijj. +@++++++iJ +J+++++++++++K. +M+++1++++++ij+ +U+++[2 +7+++++++++++K. +T+++++++++++K. +L+++9 +m+++ijjjj2 +E+++9+++++++K. +Z+++9++++++ij. +2++++9+++gj: +5+++++++++++++ +W+++++ijjj2 +X+++ij:++++cN. +0+++++cjjjj +4+++1+j2 +X+++ij,+++++j. +F+++++++++++c. +2++++K +N+++ijjjjjjjj. +O++++ijjjjjj, +W++++gjjj: +m+++ijjjj. +$++++++++++++ +E+++i+++++++c. +4+++1+j2 +7+++++++++++++ +B+++[jjjJKjj: +8+++++++ +Z+++i++++++Kj. +H+++ijjjjjjjj. +K+++i,++++++K. +D++++gjjjjjj, +S++++[jj +R+++i,+++Kjj: +G++++ijjj++cj. +T+++++++++++[. +Q+++ijjjjjjj, +L+++i +M+++ijjjjjjjj. +V+++++++++iJK. +P++++++++Kjj: +U++++J++++++K. +A+++1+ijjj +0++++++++++ +w+++++++g2 +Y++++++++++gR. +C+++++2++++cj. +3+++++++ +Z+++i,++++++i. +Q+++idjjjjjj+ +S+++++j2 +4+++1+j2 +B+++KjjjJ+jj2 +M+++ijjjjjjjj. +w+++++++c2 +U++++i,+++++K. +R+++i+++++jj2 +m+++ijjjj +2+++++ +L+++i, +X+++ij++++++g. +P+++++++++jj2 +W+++Kjjjj. +K+++i+++++++K. +O++++cjjjjjj+ +D++++cjjjjjJ +G++++cjjj+ +V+++++++++[jN. +T+++++++++++c. +F+++++++++++i. +Y++++++++++[j. +H+++ijjjjjjjj. +N+++ijjjjjjjj. +E+++i,++++++i. +C+++++- +A+++1[jjj2 +m+++1 +P+++++++++cj+ +D+++++jjjjj. +O++++Kjjjjj: +R+++1+++++cj+ +V++++++++++[j. +A+++1jjjJ +Y+++++++++++g. +G+++++gjj+ +T++++++++++cj. +Q+++iKjjjjj: +w++++++++1 +F++++++++++cj. +U++++cjjjjjjj. +W+++ijjj. +Z+++ij++++++[. +M+++ijjjjjjjj. +H+++ijjjjjjjj. +K+++1+++++++K. +N+++ijjjjjjjj. +X+++i.++++++K. +E+++ij+++++cj. +B++++ijj2+cj+ +L+++ij +O+++++cjjjj +W++++jj2 +R+++1 +D+++++[jjj: +B++++[jj+ +Z+++ij+++++++- +Y+++++++++++K. +L+++ij +w++++++++1 +V+++++++++++[. +G+++++++++ +X+++9+++++++K. +K+++1 +U+++++ijjjjjj. +E+++ij+++++cj. +T++++++++++cj. +Q+++g+cjjjj +M+++ijjjjjjjj. +N+++++++++++K. +A+++ijjj+ +F++++++++++cj. +P+++++++++++ +H+++ijjjjjjjj. +U+++++[jjjjjj. +V+++++++++++K. +X+++1+++++++K. +A+++ijj: +Z+++++++++++++ +R+++1 +N+++++++++++K. +W++++gj +M+++ijjjjjjjj. +Q+++[+Kjjj2 +T++++++++++cj. +O+++++Kjjj2 +w+++++++++ +F+++++++++++++ +H+++1+++++++K. +D++++++ijj, +Y+++++++++++K. +E+++++++++++++ +L+++++ +K+++1 +B+++++j: +W+++++gJ +H+++1+++++++K. +X+++1+++++++K. +Y+++++++++++K. +U+++++++++++K. +M+++ijjjjjjjj. +Q+++++++++ +O+++++++++ +A+++ijJ +N+++++++++++++ +V+++++++++++K. +H+++++++++++++ +W++++++iJ +Y+++++++++++K. +X+++++++++++++ +M+++1+++++++K. +A+++ij, +U+++++++++++K. +V+++++++++++++ +A+++i: +M+++1+++++++K. +W++++++[j. +Y+++++++++++++ +U+++++++++++++ +A+++i +W+++++++Kj. +M+++++++++++++ +W++++++++[j.K. +A+++1 +W+++++++++iJK. +A+++1 +W++++++++++ij. +A+++1 +W+++++++++++i. +W+++++++++++[. +W+++++++++++K. +W+++++++++++K. +W+++++++++++++ diff --git a/2004/newbern.hint b/2004/newbern.hint new file mode 100644 index 000000000..4ae968d3d --- /dev/null +++ b/2004/newbern.hint @@ -0,0 +1,48 @@ +Best Font Engine: + + Jeff Newbern + 28 Jeanette Ave. #1 + Belmont, MA 02478 + + +Judges' Comments: + + To build: + + make newbern + + Try: + + ./newbern newbern.dat "IOCCC 2004" + echo SOS | ./newbern + + The program is formatted using the same font glyphs as the example + data file. + + +Selected Author's Comments: + + This is a configurable banner-like program. + + Examples: + + - To convert a character glyph into a data file + + ./newbern char < some_nicely_shaped_text >> data_file + + - To print a string using glyphs from a data file + + ./newbern data_file a_string + + Extra functionality: + + The program can also act as a Morse encoder, unarguably. + + It also has double-super-secret encryption capabilities. + Decryption is left as an exercise for the reader. + + Portability: + + The program assumes an ASCII operating environment. + + The program is best viewed with tab-stops set to 8. diff --git a/2004/newbern.orig.c b/2004/newbern.orig.c new file mode 100644 index 000000000..4b4d7a187 --- /dev/null +++ b/2004/newbern.orig.c @@ -0,0 +1,125 @@ +#include +#include +#include +#include +#define t(x) typedef x +#define G return +#define Y(x) x;x +#define e(s) exit(s); +#define b(x,o) x o x +#define Z while +#define y fclose +#define end static + +t()char U;t(struct) b(O,); + +t( U*) +H; t(O +*) *o; +struct O{ O* l, **h; void* L; } ; t(int)i; i P(U g) { G +isspace(g); } H D(H s){H p,r;if(!s)G 0;for(p=(H)s;*p && +!P(*p); p++); if(r=malloc(p-s))for(p=r; *s&&! P(*s);p++ +,s++)b(*,p=) s; G r;} void l(o p,O*x){*(o)x=* p; *p=x;} +#define m(x) do{ if(!(q = malloc(sizeof(O)))) e(1)q->l\ +=0 ;q\ +-> L=\ + x ; } while (0) + i(*R)(i) =putchar;i h( + o f,H d,U c){O*q; f+=c;Z(d&&*d) + { m(D(d)); l(f++, q); Z(*d && !P(*d + )) d++; Z(*d && P(*d)) d++; } G b(,0);} + void k() { static U b(c,;) ?R(c):(c='\n'); } + i main (i Q, H *l){static o + X;i t,j; switch (Q + ){ case 1: { H + *p, I [] ={ +"aH" " " +"B" "0" +" " "B" +"" "B" +"" " " +"B" "," +" " "," + " `" "0 " + "b0 " "@, " + "0 Hb," " B2 " + "H0 b, B b" "H HB b`, " + "H, @ 2 `, " "@2 H2 BH Bb" + " b@","AH B0 BB B, , `0 b0 @, 0 Hb, B2 H0" + " b, B bH HB b`, H, @ 2 `, @2 H2 BH Bb" + " b@","0bHb, HbH `H2 @b, @H @0 B@ " + "b@ bH0 bHB",".HHH","?`H0", + ",b@b,"," +", 0}; p=I; + + if (!(X=calloc( + 6<<6,sizeof(O*))))e(1) + do{h(X,(*p)+1,**p);} Z(*(++p)); + D: if ((t = getchar()) >= 0) { k(); + goto u;}e(0)}case 2:{U *p,e[33]; b(i, ) + ,w;for(i=0;i<34;i++)i[e]=b(0,;w=);p=e; Z(1){ + t = (w == 200) ? 10:getchar(); + switch(t) { case 0xa: + case EOF: if(w-- + ){R(1[l ][0]) +;for(i =0, +p=e;i <=w +;i+= 6){ +R ( *p+ +'+' );* +p++ =0; + ;} R( + 0xa );w + =-1 ;}p= + e- 1;case + 32: if (t<0) e( + 0) break; /*/* + /*/ default : * + p + |=(001<<(w%6)); + }if((++w%6)==0)p++;}e( + 0)}case 3:{O*u,*q,*x;U s[0400]; + i i;FILE*F; j:j=1;if(!(X=calloc(6<< + 6,sizeof(O*)))) e(1) if(!(F=fopen(j[l], + "r")))e(1)Z(fgets(s,j<<8,F))(*s)&&h(X,s+j,*s + );j=b(i,=)&0xff; i:u=0;x=X[i]; + Z(x){q=Y(*( o)x)=Y(u) + =Y(x)=q;} i[X]=u + ;i=(i-2 +9)%( +sizeof (s)) +;if(i ^j) +goto i;; +y(F) ; } +case 4:{ +end i i + ;if (! + X){ i=j + =1; goto + j;} if(i){O + **x ,*m=*(x=X); + do* x=1[x];Z(++ + xL;Z(*p>=n){i=(*p++)-n;for(c=0;c<6;c++,i=i + >>1){ if(b(!, i &&)(*p >= n)) + break;R(32+ (i&1)*3); + }}R(10);a =a->l; + }if(Q<2 )goto +D;if(* l[2 +]){R( 10) +;main (4, +l); }}} +Z(Q ++< +1){ X+= + t; if + ((t &7) + >3) goto + i; else { + t-- ;putchar(t) + ;t =(t&7)?t:t- + '*' ;}}exit(0); + } diff --git a/2004/omoikane.c b/2004/omoikane.c new file mode 100644 index 000000000..c106b9c81 --- /dev/null +++ b/2004/omoikane.c @@ -0,0 +1,49 @@ + + /* ,*/ + #include + #include/* _ ,o*/ + #define c(C)/* - . */return ( C); /* 2004*/ + #include /*. Moekan "' `\b-' */ + typedef/* */char p;p* u ,w [9 + ][128] ,*v;typedef int _;_ R,i,N,I,A ,m,o,e + [9], a[256],k [9], n[ 256];FILE*f ;_ x (_ K,_ r + ,_ q){; for(; r< q ; K =(( + 0xffffff) &(K>>8))^ n[255 & ( K + ^u[0 + r ++ ] )]);c (K + )} _ E (p*r, p*q ){ c( f = + fopen (r ,q))}_ B(_ q){c( fseek (f, 0 + ,q))}_ D(){c( fclose(f ))}_ C( p *q){c( 0- puts(q ) )}_/* / + */main(_ t,p**z){if(t<4)c( C("" "\40 " + /*b9213272*/"" ) )u=0;i=I=(E(z[1],"rb")) ?B(2)?0 : (((o =ftell + (f))>=8)?(u =(p*)malloc(o))?B(0)?0:!fread(u,o,1,f):0:0)?0: D():0 ;if( + !u)c(C(" bad\40input "));if(E(z[2],"rb" )){for(N=-1;256> i;n[i++] =-1 )a[ + i]=0; for(i=I=0; i-1;i++)++a[R] ?(R==N)?( ++I>7)?(n[ + N]+1 )?0:(n [N ]=i-7):0: (N=R) |(I=1):0;A =-1;N=o+1;for(i=33;i<127;i++ + )( n[i ]+ 1&&N>a[i])? N= a [A=i] :0;B(i=I=0);if(A+1)for(N=n[A]; + I< 8&& (R =fgetc(f ))> -1&& i N+7)?(R==A)?((*w[I + ] =u [i])?1:(*w[I]= 46))?(a [I++]=i):0:0:0;D();}if(I<1)c(C( + " bad\40la" "yout "))for(i =0;256>(R= i);n[i++]=R)for(A=8; + A >0;A --) R = ( (R&1)==0) ?(unsigned int)R>>(01):((unsigned + /*kero Q' ,KSS */)R>> 1)^ 0xedb88320;m=a[I-1];a[I + ]=(m R;R++)if(R-47&&R-92 + && R-(_)* w[i])*( v++)= (p)R;*v=0;}for(sprintf + /*'_ G*/ (*w+1, "%0" "8x",x(R=time(i=0),m,o)^~ + 0) ;i< 8;++ i)u [N+ i]=*(*w+i+1);for(*k=x(~ + 0,i=0 ,*a);i>- 1; ){for (A=i;A-1?!w[i][++ e[+ i]]:0; + ) for( A=+i--; A + + All three arguments may reference the same file. All files is + assumed to be of ASCII character set. + + 1. Input % + + Any file larger than 8 bytes is valid. Upper limit on file size is + limited by memory. + + If input file can't be loaded for any reason, Rinia will say "bad + input" and exit immediately. + + 2. Layout _ + + The layout file contains a map of where Rinia can patch. The + content consists of marker characters (where Rinia is allowed to + change in the original text) and other characters (where the + original text will stay as is). Rinia will select the marker + character using these heuristics: + + 1. Ignore all space/control/extended characters. + 2. Select characters that appeared 8 times in a row. + 3. Of those selected characters, pick one with the lowest + frequency. + + One way to create the layout file is to make a copy of the original + file, replace where you want Rinia to match with a rare character, + then replace the remaining ones with space. Often it's possible to + write the original file in such a way that it can be used as a + layout. + + Example file/layout: + + file: layout: + crc = ######## ... . XXXXXXXX + patch = ###### ..... . XXXXXX + other text here ..... .... .... + + And Rinia may generate a file similar to this: + + crc = 1bad73cf + patch = #FR-QQ + other text here + + Note that the original file by itself is a valid layout file, since + Rinia will recognize that only # marks enough space to hold the + checksum, and has the lowest frequency. + + If layout file can't be used for any reason, Rinia will say "bad + layout" and exit immediately. + + 3. Output m + + If Rinia finds a usuable checksum, she will say "OK." and write to + the specified output file. Otherwise the exit message is "fail" + and nothing is written. + + Chances of success and how long it takes to run to completion is + completely dominated by the layout file design. In general, Rinia + runs faster if the checksum is placed before the other marker + characters rather than after, e.g.: + + a: X X XXX b: XXXXXXXX c: XXXXXXXX + XXXXXXXX X X XXX XXXXX + + "a" usually takes the longest time, while "c" usually is the + fastest. + + That said, each run is randomized with respect to system time, so + it's not always certain whether Rinia will succeed in a short time + or not. In general, 5 marker characters is sufficient, and takes + a few minutes. + + For reference, rinia.c was produced on a 1.7GHz machine (the + checksum is at line 17). Out of 25 runs, the shortest was 2 + seconds while the longest took 5 minutes. Average was about a + minute. Checksum for this file (b7a81524) took about 4 minutes. + + 4. Algorithm 3 + + Inserting a checksum in the file you are computing the checksum of + isn't quite trivial, since changing the file content would change + the final checksum value. + + To insert the checksum, Rinia first assumes a random final + checksum, insert that string, then modify other parts to compensate + for the change in content. + + The compensation bytes are very easy to compute for binary files + with enough consecutive scratch areas, but for text files with + non-consecutive areas and limited degrees of freedom, Rinia has to + try out all character combinations. This is done in a hierarchical + fashion, computing only smallest partial checksum after each + change. + + For computers few years ago, this is probably still too slow to be + acceptible... but at the speed the IOCCC judges run the contest + these days, I am sure you have enough patience for it ^_^; + + 5. Source code = + + rinia.c should compile anywhere (but with a few warnings). I don't + have a big-endian machine to test but Rinia should work there as + well. ASCII character set required though. + + Code is formatted to the shape of "Rinia" from the anime/game + "Moekko Company". Of course at 90x50 it's hard to recognize anything + ^_^; + + Rinia is the slow but hardworking android. On some jobs she does + very well, on others she would spend lots of time and effort but + still fail... + + (text above is also included as an info file, so that the checksum + would match) diff --git a/2004/omoikane.info b/2004/omoikane.info new file mode 100644 index 000000000..625d43f5a --- /dev/null +++ b/2004/omoikane.info @@ -0,0 +1,121 @@ +Rinia (1/14/04) + +Rinia is a tool for embedding CRCs in text files. No need to assign +strange file names or package .SFVs with your files! Rinia will +insert a human-readable checksum string in the text itself! ^_^ + +0. Usage ` + + rinia + + All three arguments may reference the same file. All files is + assumed to be of ASCII character set. + +1. Input % + + Any file larger than 8 bytes is valid. Upper limit on file size is + limited by memory. + + If input file can't be loaded for any reason, Rinia will say "bad + input" and exit immediately. + +2. Layout _ + + The layout file contains a map of where Rinia can patch. The + content consists of marker characters (where Rinia is allowed to + change in the original text) and other characters (where the + original text will stay as is). Rinia will select the marker + character using these heuristics: + + 1. Ignore all space/control/extended characters. + 2. Select characters that appeared 8 times in a row. + 3. Of those selected characters, pick one with the lowest + frequency. + + One way to create the layout file is to make a copy of the original + file, replace where you want Rinia to match with a rare character, + then replace the remaining ones with space. Often it's possible to + write the original file in such a way that it can be used as a + layout. + + Example file/layout: + + file: layout: + crc = ######## ... . XXXXXXXX + patch = ###### ..... . XXXXXX + other text here ..... .... .... + + And Rinia may generate a file similar to this: + + crc = 1bad73cf + patch = #FR-QQ + other text here + + Note that the original file by itself is a valid layout file, since + Rinia will recognize that only # marks enough space to hold the + checksum, and has the lowest frequency. + + If layout file can't be used for any reason, Rinia will say "bad + layout" and exit immediately. + +3. Output m + + If Rinia finds a usuable checksum, she will say "OK." and write to + the specified output file. Otherwise the exit message is "fail" + and nothing is written. + + Chances of success and how long it takes to run to completion is + completely dominated by the layout file design. In general, Rinia + runs faster if the checksum is placed before the other marker + characters rather than after, e.g.: + + a: X X XXX b: XXXXXXXX c: XXXXXXXX + XXXXXXXX X X XXX XXXXX + + "a" usually takes the longest time, while "c" usually is the + fastest. + + That said, each run is randomized with respect to system time, so + it's not always certain whether Rinia will succeed in a short time + or not. In general, 5 marker characters is sufficient, and takes + a few minutes. + + For reference, rinia.c was produced on a 1.7GHz machine (the + checksum is at line 17). Out of 25 runs, the shortest was 2 + seconds while the longest took 5 minutes. Average was about a + minute. Checksum for this file (b7a81524) took about 4 minutes. + +4. Algorithm 3 + + Inserting a checksum in the file you are computing the checksum of + isn't quite trivial, since changing the file content would change + the final checksum value. + + To insert the checksum, Rinia first assumes a random final + checksum, insert that string, then modify other parts to compensate + for the change in content. + + The compensation bytes are very easy to compute for binary files + with enough consecutive scratch areas, but for text files with + non-consecutive areas and limited degrees of freedom, Rinia has to + try out all character combinations. This is done in a hierarchical + fashion, computing only smallest partial checksum after each + change. + + For computers few years ago, this is probably still too slow to be + acceptible... but at the speed the IOCCC judges run the contest + these days, I am sure you have enough patience for it ^_^; + +5. Source code = + + rinia.c should compile anywhere (but with a few warnings). I don't + have a big-endian machine to test but Rinia should work there as + well. ASCII character set required though. + + Code is formatted to the shape of "Rinia" from the anime/game + "Moekko Company". Of course at 90x50 it's hard to recognize anything + ^_^; + + Rinia is the slow but hardworking android. On some jobs she does + very well, on others she would spend lots of time and effort but + still fail... diff --git a/2004/prim b/2004/prim new file mode 100644 index 000000000..b8ffc3f3b Binary files /dev/null and b/2004/prim differ diff --git a/2004/rules b/2004/rules new file mode 100644 index 000000000..f69dd2018 --- /dev/null +++ b/2004/rules @@ -0,0 +1,146 @@ + 17th International Obfuscated C Code Contest Rules + +Copyright (C) 2004 Leonid A. Broukhis, Simon Cooper, Landon Curt Noll and +Peter Seebach. + +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in +writing from the contest judges. + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: his emotions obfuscated his + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show the importance of programming style, in an ironic way. + * To stress C compilers with unusual code. + * To illustrate some of the subtleties of the C language. + * To provide a safe forum for poor C code. :-) + +The 17th IOCCC contest window is: + + 07-Jan-2004 00:00 UTC to 29-Feb-2004 23:59:59 UTC + +RULES: + + To help us with the volume of entries, we ask that you follow these rules: + + 1) Your entry must be a complete program. + + 2) The size of your program source must be <= 4096 bytes in length. + The number of characters excluding whitespace (tab, space, + newline, formfeed, return), and excluding any ; { or } immediately + followed by whitespace or end of file, must be <= 2048. + + 3) Submissions should be performed using the instructions outlined at, + + http://www.ioccc.org/2004/submit + + NOTE: After 26-Jan-2004, 00:00 UTC an online submission mechanism will + be available. See the above URL for details. + + 4) If your entry is selected as a winner, it will be modified as follows: + + Your 'build' instructions will be incorporated into a + makefile. If your build instructions *is* a makefile then + it should be portable and usable from within a master + makefile. + + Your program source will be renamed using an identifier of + our choice (usually your family name or anonymous) followed + by an optional digit, followed by '.c' + + Your entry will be compiled into a file with the above name + minus the '.c'. + + If your entry requires that a build file exist, state so in + your entry's remark section. The makefile will be arranged to + execute a build shell script containing the 'build' + information. The name of this build shell script will be your + entry's title, possibly followed by a digit, followed by '.sh'. + + If needed, your entry's remarks should indicate how your entry + must be changed in order to deal with the new filenames. + + 5) The build file, the source and the resulting executable should be + treated as read-only files. If your entry needs to modify these files, + it should make and modify a copy of the appropriate file. If this + occurs, state so in your entry's remarks. + + 6) Your program source must be able to be compiled cleanly by an ANSI C + compiler, or if there are any compile errors, they must be documented + in the "remarks" section of your submission. + + 7) The program must be of original work. All submitted programs are + are thereby put in the public domain. All explicitly copyrighted + programs will be rejected. + + 8) Entries must be received prior to 29-Feb-2004 23:59:59 UTC. (UTC is + essentially equivalent to Greenwich Mean Time). + + An EMail a confirmation of submission will be sent to the sender + before the close of the contest. + + 9) Each person may submit up to 8 entries per contest year. Each entry + must be submitted separately. + + 10) Entries requiring human interaction to be built are not permitted. + + 11) Programs that require special privileges (setuid, setgid, super-user, + special owner or group) are not permitted. + + 12) Legal abuse of the rules is somewhat encouraged. An entry that, in + the opinion of the judges, violates the rules will be disqualified. + Entries that attempt to abuse the rules must try to justify why + their rule abuse is legal in the submitted "remarks". + + 13) Your source may not contain unescaped octets with the high bit set. + I.e., your source may not contain octet values between 128 and 255. + + 14) Any program that fails to compile because of lines with trailing + control-M's (\r or \015) will be rejected. + + 15) When you submit your entry you must have a valid email address + that can both send and receive email. The online submission + method is a two phase process that requires the use of an + approval code. This code will be emailed to you as part of + phase 1. + + Entries submitted without a working or valid email address will + be disqualified. + + The judges are not responsible for delays in email, please plan + enough time for one automated exchange of email as part of your + submission. + + 16) You are STRONGLY encouraged to submit an original entry. + Submissions that are similar to previous entries are discouraged. + +FOR MORE INFORMATION: + + The judging will be done by Leonid A. Broukhis, Simon Cooper, Landon + Curt Noll and Peter Seebach. Please send questions or comments + about the contest, to: + + q.2004@ioccc.org (not the address for submitting entries) + + You must include the words ``ioccc 2004 question'' in the subject of + your EMail message when sending EMail to the judges. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, visit the IOCCC web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + Detail of how to submit your entry are located at, + + http://www.ioccc.org/2004/submit diff --git a/2004/schnitzi.c b/2004/schnitzi.c new file mode 100644 index 000000000..15d36f47b --- /dev/null +++ b/2004/schnitzi.c @@ -0,0 +1,48 @@ +#include +#define l "==================================================" +#define m " " +int _( +float x, +float y){ +return x>=0&&x<50&&y>=0&&y<20;} +int main (){ +char a[2][20][51],c[9][4][51][51],d[100]; +int e,f,g,h=0,i,j=0,k,b=0,n[9],o[9],p[9],x[9],y[9],q[9],r,s,t; +float u[9],v[9],w[9],z[9]; +printf ("i%s\033Yppppppppppppppppppp1G0",l); +do sprintf(a[0][j],"%s",m, +sprintf (a[1][j],"%s",l)); +while (++j<20); +scanf ("%d %d\n",&r,&s); +gets (d); +do { +sscanf (d,"%d %d %f %f %f %f %d %d %d",&o[b],&p[b],&u[b],&v[b],&w[b],&z[b],&x[b],&y[b],&q[b],j=n[b]=i=0); +do do c[b][i][j][x[b]]=! +gets (c[b][i][j]); +while (++j=o[i]&&t<=p[i]&&!(k=j=0)) +do do if (_(u[i]+k,v[i]+j))a[h][( +int )v[i]+j][( +int )u[i]+k]=c[i][n[i]][j][k]; +while (++kk&& +printf ("0%d ",k,g+=4);k&&e1&& +printf ("%d ",k-e,g+=3);k&&eschnitzi.out0 + ./schnitzi schnitzi.out1 + + This exemplifies the meaning of Visual Editor, but we don't think + that any benchmarking sites are going to use this to tout the + performance of the latest hardware! + + +Selected Author's Comments: + + If you've ever pasted a large chunk of text into an editor (such as + 'vi') without first putting it into insert mode, or turning off + the auto-indent, you know the dismay of watching your screen fill + up with misaligned junk. + + It's not the editor's fault. The editor is just acting just as if + you typed exactly what you're pasting. (Of course, you could blame + the editor for being modal in the first place, but that's a + discussion for another time.) + + It occurred to me that you could get interesting results by pasting + a carefully designed string into the editor. In fact, if the pasted + string contains cursor navigation commands, you can go back and + overwrite things that were already inserted earlier in string, + anywhere on the screen. Can you see where this is going? + + + ANIMATION! + + The program takes input from stdin which defines the animated + elements (sprites) that appear on the screen. For each sprite, + you can specify exactly when and how long it will appear, and which + direction it is moving. Also, the sprite can oscillate between + up to four different views, which appear in subsequent frames. + Forgive me, animators, if I'm mangling the terminology. Sprites + which appear later in the input file will be drawn in front of + sprites which appear earlier. + + The output, to stdout, is a string which, when pasted into vi, will + perform the animation defined in the input. [The vi editor is a + common (and ancient) editor that should be available on most Unix, + Linux, Solaris, and Mac OS X machines; you can get it on Windows + by installing Cygwin, which is how I do it.] + + + THE INPUT + + It's easiest to place the input in a file, so you can redirect it + to stdin when running the program. What follows is a detailed + description of the input file format. + + The first line is specified thusly: + + [duration] [timefactor] + + The first parameter, duration, defines how long the animation will + run. The second, timefactor, is used as sort of a fudge factor + for machines that run too fast to see the animation. A timefactor + of 0 means, "run the animation as fast as you can". On a pretty + fast machine, I've had to set it as high as 2000 to get the + animation to slow down sufficiently. Note that the higher the + timefactor, the longer the output string that you'll have to copy- + and-paste, as extra characters are necessary to "waste time" between + frames. + + Following the first line parameters, you may have up to nine + different sprites, each up 50 by 50 in size, and with up to four + different 'views' of that object, which are cycled through with + each successive frame. Each sprite begins with a line of parameters + of the following form: + + [start] [end] [x] [y] [dx] [dy] [cols] [rows] [viewcount] + + where: + + 'start' is the time at which this sprite first appears + 'end' is the time at which it disappears + 'x' is the horizontal position at which it starts + 'y' is the vertical position + 'dx' is the amount that the x position changes per frame + 'dy' is the amount that the y position changes per frame + 'cols' is the number of columns in each view + 'rows' is the number of rows in each view + 'viewcount' is the number of views to cycle through + + Each such parameter line will be followed by 'viewcount' + view frames, each with 'rows' rows and 'cols' columns. + + Input is terminated by end of file. Duh. + + Two samples input files are included; one a nice pastoral park + scene, the other a bit of scrolling text. + + + RUNNING THE ANIMATION + + Try one of these methods to get the animation to run: + + 1. Redirect the output directly to vi, like this: + + ./schnitzi < input.dat | vi + + 2. Redirect the output to a file, like this: + + ./schnitzi < input.dat > output.dat + + Then, open the output file, select the text, and copy it + to your system pasteboard/cut/selection buffer and paste + it into vi. The paste is NOT the vi paste command, but + rather an action you take within your operating system. + On a Windows machine running vi via Cygwin, "Edit|Paste" + is a right-click menu option on the top window bar. + + 3. Memorize the output, and type it into vi really really fast. + + + A FINAL NOTE + + I would like to remind the Pixar Animation Studios that I retain + royalties on this technique. diff --git a/2004/schnitzi.inp0 b/2004/schnitzi.inp0 new file mode 100644 index 000000000..b1ea4df59 --- /dev/null +++ b/2004/schnitzi.inp0 @@ -0,0 +1,42 @@ +100 1000 +0 1000 0 10 0.0 0.0 50 2 1 +------------------------------\~~~~~~~~~~~~~~~~~~~ + \__________________ +0 1000 44 7 -0.1 0.0 7 4 1 + |\ + | \ +__----_ +\_____/ +0 90 40 2 -0.2 0.1 4 2 4 +_ _ + \/ + +____ +_/\_ + + +____ +0 1000 15 8 0.0 0.0 5 6 1 + * + *** +***** + *** + I + I +0 1000 2 12 0.5 0.0 8 3 1 + __o + _ \<,_ +(_)/ (_) +0 1000 20 10 0.0 0.0 5 6 1 + * + *** +***** + *** + I + I +0 1000 3 2 0.0 0.0 9 5 1 + \_|_/ + / \ +-( :-) )- + \___/ + / | \ diff --git a/2004/schnitzi.inp1 b/2004/schnitzi.inp1 new file mode 100644 index 000000000..bd5ab7412 --- /dev/null +++ b/2004/schnitzi.inp1 @@ -0,0 +1,6 @@ +30 2000 +0 100 10 25 0.0 -1.0 25 4 1 + A long time + ago, in a + galaxy far, far + away.... diff --git a/2004/sds.c b/2004/sds.c new file mode 100644 index 000000000..84e0f8de1 --- /dev/null +++ b/2004/sds.c @@ -0,0 +1,679 @@ +#include + + /* + + O + b + f u s + c + + a + + t + e + + d + */ + + int m + ( + + int + + + c ) + + { + + int + + x + + = + 3 + + + + ( + c + + - + 1 + ) + * + + 9 + + + + ( + + c + + - + + 1 + ) + + * + 27 + + + + + ( + + c + - + + + 1 + + ) + * + ( + + + ( + 993 + - + '!' + + * + c + + ) / + 320 + + ) + + ( + + c + - + + '9' + + + '8' + ) + * + c + + + + ( + + c + - + 1 + ) + * + 243 + / + 9; return c + - + 32 + ? + + c + - 9 ? + + c + - 10 + ? + x + % x : 3 + : 2 + + : + 1 + ; + } + + + int + a , + b , + + c + + , + d + , + e + + + , + + v, + + f + ; + + int + main + /* n + ( + + c + + ) + { return + c + + ++ + + - + + 32 + + + ? + + c + - + 9 + + ? + + c + + - + + 10 + + + ? + + 0 + : + + 3 : + + 2 + + : 1 + ; + } + + x + + ( ) + { + + int + a + + , + b , + c + + , + + d + + , + + + e + + , + v + ; + + while + + ( + + ( + + v + + = + putchar ( + + d ) + ) + + != EOF + ) + { if + ( + ( + + a + = + + m */ + ( ) { + while + ( + ( + + e + + = d + = c + = + b + + = + v + = + getchar + + ( + + ) + ) + - + EOF + ) + { for + ( ; + d + < + + 0 + + ; + d + ++ + ) + { f + = + f + / + getchar + ( + ) + ; a + <<= + f + ; + ( + v + * + v + * v + + - + + v + || + + e + + * + e * + e + - + e + ) + + && ( + + e + + + - + + 2 + || + ( d + & + + f + ) + + - + 4 || + ( a + >> v + != ( + e - + 1 ? + f + : + + 0 + + + ) ) + + ) ; + + } if + + ( + + + ( v % + + v + + + + f * + + --f + + + + v + + ) && + + ( v + + < + + + f ? v / + + v + - + + 992 * + + b + : + + v + + * + v ) && + + /* + o + + ( c + + ) + { + + return + + c - + + 32 + ? + c + + - + + 9 ? + + c - 10 + + ? + + + 0 : 3 : 2 + + : + 1 + + ; } + + y + ( + + ) + + { + int a , + + f + , + + b , + + c + , + + d + + , e + + , + v + ; + + while + + ( + ( v = getchar + + ( + ) + + ) != + + EOF + ) + + { + + if + ( ( a + + = + m + + ( c + + ) + ; + + */ + + ( a + + = + m + ( + + b + + + ++ + + f + * + 3888 + + ) + + ) && + + ( b + + = + + + m ( getchar ( ) ) + + - f + / + + 243 ) + + && + ( + + c + + = + m ( getchar + + ( + ) + + ) + + + f + ) + + && + + ( + + f + == + 1 + + ? + + 124 + - ( ( c + + < + 8 + + && ( + + ( + c + + & + + b + ) != e + + || + ( + + c >> + + d + ) + + != + + 3888 ) + + ) + ) + : + + 1 + + ) && + + ( + d + = + + m + + ( + getchar ( ) + f + + ) + ) + + && ( + + e + = + + m + + ( + getchar ( ) + + ) + ) + + ) putchar ( + + f + + + + a + + - 1 + + + + ( + b + + - + + 1 + ) * ( ( + + 993 + - + + '!' ) + + / + ( + + '(' + + * + 8 ) ) + + + + ( + + c - + + f + - + + '9' + + + '8' + + ) + * + 9 + + - + + 4 + + + ( + d + - + + 1 + + ) * + + 243 + / + 9 + + + + + f + + 11 + + + + + ( + + e - + 1 + + ) + * 3888 / + + '0' + - + + 7 + ) + ; } + return + ( + + f + + && + + getchar + ( + + ) + + ) + + ; } diff --git a/2004/sds.hint b/2004/sds.hint new file mode 100644 index 000000000..c97d620be --- /dev/null +++ b/2004/sds.hint @@ -0,0 +1,95 @@ +Best Abuse of Indentation: + + Stephen Sykes + Laivalahdenportti 2 + 00810 Helsinki + Finland + + http://www.stephensykes.com + + +Judges' Comments: + + To build: + + make sds + + Try: + + ./sds < sds.c > encoder.c + cc -o encoder encoder.c + ./encoder sds.hint sds_msg.c + + Why not use the program to hide another program in the program? It + must have seemed reasonable at the time. + + The ability to hide a message in plain text is quite charming, really. + We must admit to a bit of uncertainty about where you'd find such + messages, or how useful they'd be. Or, of course, whether all those + horribly badly formatted emails spammers send might contain secret + messages. Annoyingly, it's a little too obvious that SOMETHING has + been done to a message for us to hide one in the remarks. :) + + +Selected Author's Comments: + + Steganography is the term for the family of techniques used for + hiding information within other information. Today, it has many real + world uses, particularly for digital watermarking. + + This program uses a steganographic technique to hide information in + any text file. The specific technique used is aimed at writers of + obfuscated programs for the IOCCC, as the the hidden information is + encoded in the whitespace in the source file. As we know, there are + up to an additional 2048 characters of whitespace available to + entrants to the IOCCC, so it turns out that this is an ideal place to + hide things. + + The program as provided is the steganographic decoder. Rather than + provide a seperate encoding program, you should not be surprised to + learn that I opted to steganographically hide the encoder inside the + decoder. + + Try it out. Compile the program, then type + + sds < sds.c + + You should see the encoder program displayed. Now save it, like: + + sds < sds.c > encoder.c + + Then compile encoder.c. You now have the complete system ready. + + The encoder expects to get a filename as an argument. This filename + is the name of the file containing the information to be hidden. It + expects the file in which to hide the information to be on the + standard input, and will output the results on the standard output. + + You can use it like this (assuming you have a file called remarks): + + echo 'Hello, World!' > message + encoder message < remarks > remarks_msg + + Then to decode: + + sds < remarks_msg + Hello, World! + + C programs are mostly unaffected by adding steganographic content, + but it is possible in certain circumstances for whitespace to be + changed inside strings where it should be left alone. Plain text + files are good candidates for hiding information in, but the added + spacing may render the text somewhat difficult to read. + + This program is obfuscated in a number of ways: + + * The code is all but impossible to read due to the spacing + * The algorithm is well hidden in the code due to copious red-herrings + * The long expressions cause indentation tools to give poor results + * And good old fashioned ternery operators are the icing on the cake + + Compiling the program + + The program (and the encoder program) should compile on any + reasonable compiler. In particular, they are known to compile under + GNU C. diff --git a/2004/vik1.c b/2004/vik1.c new file mode 100644 index 000000000..5c730bed2 --- /dev/null +++ b/2004/vik1.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include + +#define Z(a)main(a,T) + Window L; +#define J (K, + GC N; +#define I ; for( + int g,h,i,j,k,l,m,n,p,q,r,v,w,x,y,z, +#define W(a)(y/v*!w+((S+1)>>a&255)*(D+y/(z|w-2))/D)<p?q=Y(h,q),u%=p,Z(c=0):c,t+=j*(s+A)/e-s/i*(C[u+4]-C[u]),s=t + *t>p?t*=.97,s*.8:g>a&&b*b6?h=r*(3+z) + /5:r),n=x/13/e,Z(k?h:r),o++:(f=x/D+70+C[i+p]-C[u+p],o=x?o:f,k=2*i/41%2,l=C[-- + i]-C[u]-t,x+=D-(y=i-u),g=(d-i)%410?g:(a=o,b=l+B*x/e,x)/A,i>u); )I k=i=0,x=g, + l=b; ++i==41+!f&&k?f=k=i=l=0,x=190,a=163:i==42?i=9,k=r:!k|i-41; n=(Y(Y(Y(75,A + -i)/3,95-2*i),r-k+2*i)-k/r)*x/D,m=i<9?x*14/D:k?(i-31)/5*(i%12)?0:n-1:0,o=a-i* + x/D,y=D-o,h=Z(k*r+k*f/F))I B=g?B:1-h%3,i=60,y=n=m,XDrawString J M,N,30,x,P, + sprintf(P,V(Time)V(High)"Speed: %03dmph",h/A/i,h/A%i,h%A,q/A/i,q/A%i,q%A,s,Z( + A<<17))),x=h; ++f<2*z*e; l=(x*=3)%e,o=x*x%a,Z(-1)); } return A**H+1[H]/p-c; } diff --git a/2004/vik1.hint b/2004/vik1.hint new file mode 100644 index 000000000..c4fd24b70 --- /dev/null +++ b/2004/vik1.hint @@ -0,0 +1,142 @@ +Best X11 Game: + + Daniel Vik + 926 Genter Street + La Jolla, Ca 92037 + USA + + http://www.vik.cc/ + + +Judges' Comments: + + To build: + + # you may have to edit the Makefile to set X11_LIBDIR correctly + make vik1 + + Try: + + # requires an X11 server + ./vik1 + ./vik1 a + ./vik1 d2 + ./vik1 ad3 + + Danial Vik has presented a tour de force feature rich X11-based + racing game that fit within the contest size limits. Take a + glace at the feature list he provided below. Amazing! + + Happy touring on the road and in the code! + + +Selected Author's Comments: + + Features + ======== + + This program is a complete car race game with a lot of nice features: + + * Drive on a road in a 3-d landscape with hills and curves + + * Mountains in the horizon + + * A sun in the sky when driving during the day. + + * Dark sky and reduced visibility when driving at night. + + * Snow when driving in the winter. + + * Slippery road when driving in the winter. + + * When driving off the road, the car slows down to a halt + + * Three different race tracks that takes about one minute to + complete. + + * Speed meter. + + * Computer driven opponent cars. + + * Collision detection when driving into other cars. + + * Lap time measurement. + + * The best lap time is stored as reference. + + + Build and Run + ============= + + Compile the source code and link x libraries if necessary. + The program takes three options which have to be typed in a specific + order as described below. + + Usage: vik1 ['a']['d'][#] + + a - Advanced racing in a winter landscape + d - Racing in at night in the dark + # - Race track selection 1-3 are valid numbers + + Here are a few examples: + + Command line: Description: + $ ./vik1 Run track 1 at daytime in the summer + $ ./vik1 a Run track 1 at daytime in the winter + $ ./vik1 d Run track 1 at night in the summer + $ ./vik1 3 Run track 3 at daytime in the summer + $ ./vik1 d3 Run track 3 at night in the summer + $ ./vik1 ad2 Run track 2 at night in the winter + + Note that the order in which the argument characters are entered is + important. It is for example not possible to type ./vik1 da. (Well it is + possible, but the result will not be as expected.) + + The space key accelerates the car. Releasing the space key slowly + reduces the speed. The left and right arrow keys are used to steer the + car. + + + Obfuscation + =========== + + The main obfuscation is the fact that the program is extremely compact. + There are a few things I didn't want to do, e.g. define #define to a + single letter to save some space, or to remove casts to save some space. + + The program uses a lot of variables. In fact, all letters a-z are used + and most letters A-Z. + + The constants are chosen very carefully and thy have multiple purposes, + e.g. a constant can be both the length of the track and a color. + + Most of the code is kept inside five for loops without body. Each for + loop does many things. One for loop draws all cars by restarting a + couple of times. Another draws the road, mountains, and the sun. + + Main is called recursively. The return value and output depends on the + arguments. main can return the current time, draw lines and of course be + the entrypoint of the application. + + The program frequently uses the ? operator mainly to save space but it + makes the program more obscure. + + + Compiler warnings + ================= + + There are no compiler warnings when compiling with -ansi but there are + quite many warnings from lclint. Mainly because the program is very + optimized for code size. + + + Limitations + =========== + + The program only compiles and runs on X based systems. + + The program requires a display with 24 bit color depth. It also assumes + that the byte order of the colors are as on my Linux PC. That is, The + colors are represented by a 32 bit value where the bytes (from high to + low) are { 0, RED, GREEN, BLUE }. + diff --git a/2004/vik2.c b/2004/vik2.c new file mode 100644 index 000000000..54fbe215b --- /dev/null +++ b/2004/vik2.c @@ -0,0 +1,1028 @@ +#define O \ +#ifdef +#define Q \ +#undef +#define C \ +#define +#define G \ +#else +#define D \ +#ifndef +#define l \ +#include FNAME +#define I \ +#endif + + + +O i +O o +O c +Q c +I +O d +Q d +I +O e +Q e +I +O f +Q f +I +O g +Q g +I +O h +Q h +I +O Z +Q Z +I +O j +Q j +I +O k +Q k +I +O m +Q m +I +O n +Q n +I +Q o +G +O E +O t +Q t +I +O s +Q s +I +O u +Q u +I +O v +Q v +I +O w +Q w +I +O x +Q x +I +O y +Q y +I +O z +Q z +I +O A +Q A +I +O B +Q B +I +O r +Q r +I +Q E +G +O _L +O a +O b +D q +Q a +C q +I +G +O q +Q a +I +I +G +O b +D q +C a +I +G +O q +C a +Q q +I +I +I +O p +Q p +I +O a +C p +Q a +I +O b +Q b +I +G +O F +O q +Q q +I +C _L +O c +Q c +C a +I +O t +C b +I +l +O p +C c +I +O d +Q d +C a +I +O s +C b +I +l +O p +C d +I +O e +Q e +C a +I +O u +C b +I +l +O p +C e +I +O f +Q f +C a +I +O v +C b +I +l +O p +C f +I +O g +Q g +C a +I +O w +C b +I +l +O p +C g +I +O h +Q h +C a +I +O x +C b +I +l +O p +C h +I +O Z +Q Z +C a +I +O y +C b +I +l +O p +C Z +I +O j +Q j +C a +I +O z +C b +I +l +O p +C j +I +O k +Q k +C a +I +O A +C b +I +l +O p +C k +I +O m +Q m +C a +I +O B +C b +I +l +O p +C m +I +O n +Q n +C a +I +O r +C b +I +l +O p +C n +I +Q _L +Q F +G +O H +C E +l +C s +C F +l +Q s +Q H +G +O _u +O t +Q t +G +C t +I +O s +Q s +G +C s +I +O u +Q u +G +C u +I +O v +Q v +G +C v +I +O w +Q w +G +C w +I +O x +Q x +G +C x +I +O y +Q y +G +C y +I +O z +Q z +G +C z +I +O A +Q A +G +C A +I +O B +Q B +G +C B +I +O r +Q r +G +C r +I +C F +l +O _v +Q _v +I +O q +C _v +I +C E +l +C t +C F +l +O _v +O q +Q q +G +C q +I +I +Q _u +G +O _w +O J +Q J +I +O _q +Q _q +I +C _u +l +D c +D d +D e +D f +D g +D h +D Z +D j +D k +D m +D n +C J +I +I +I +I +I +I +I +I +I +I +I +D q +C _q +I +Q _w +G +O _x +O K +Q K +I +O \ +STOP +C K +I +O _r +C K +I +D K +D _s +C _s +D L +C L +I +D M +C M +I +D N +C N +I +D P +C P +I +D R +C R +I +D S +C S +I +D T +C T +I +D U +C U +I +D V +C V +I +D W +C W +I +D X +C X +I +D Y +C Y +I +D _i +C _i +I +D _a +C _a +I +D _b +C _b +I +D _c +C _c +I +D _d +C _d +I +D _e +C _e +I +D _f +C _f +I +D _g +C _g +I +I +C E +l +C t +O _h +C s +I +O _t +C u +I +O _3 +C v +I +O _4 +C w +I +O _5 +C x +I +O _6 +C y +I +O _7 +C z +I +O _8 +C A +I +O _9 +C B +I +O _r +C r +I +C _w +l +C o +l +D J +O _q +C c +O X +Q X +C d +I +O Y +Q Y +C e +I +O _i +Q _i +C f +I +O _a +Q _a +C g +I +O _b +Q _b +C h +I +O _c +Q _c +C Z +I +O _d +Q _d +C j +I +O _e +Q _e +C k +I +O _f +Q _f +C m +I +O _g +Q _g +C n +I +C H +l +C E +l +C t +O d +C X +C s +I +O e +C Y +C u +I +O f +C _i +C v +I +O g +C _a +C w +I +O h +C _b +C x +I +O Z +C _c +C y +I +O j +C _d +C z +I +O k +C _e +C A +I +O m +C _f +C B +I +O n +C _g +C r +I +G +C c +O L +Q L +C d +I +O M +Q M +C e +I +O N +Q N +C f +I +O P +Q P +C g +I +O R +Q R +C h +I +O S +Q S +C Z +I +O T +Q T +C j +I +O U +Q U +C k +I +O V +Q V +C m +I +O W +Q W +C n +I +C H +l +C E +l +C t +O d +C L +C s +I +O e +C M +C u +I +O f +C N +C v +I +O g +C P +C w +I +O h +C R +C x +I +O Z +C S +C y +I +O j +C T +C z +I +O k +C U +C A +I +O m +C V +C B +I +O n +C W +C r +I +I +I +C o +l +O _y +Q _y +C c +I +O _z +Q _z +C d +I +O _A +Q _A +C e +I +O _B +Q _B +C f +I +O _C +Q _C +C g +I +O _D +Q _D +C h +I +O _E +Q _E +C Z +I +O _F +Q _F +C j +I +O _G +Q _G +C k +I +O _H +Q _H +C m +I +O _I +Q _I +C n +I +O J +C o +l +O _s +C c +I +O L +C d +I +O M +C e +I +O N +C f +I +O P +C g +I +O R +C h +I +O S +C Z +I +O T +C j +I +O U +C k +I +O V +C m +I +O W +C n +I +C H +l +C E +l +O _M +C t +I +O X +C s +I +O Y +C u +I +O _i +C v +I +O _a +C w +I +O _b +C x +I +O _c +C y +I +O _d +C z +I +O _e +C A +I +O _f +C B +I +O _g +C r +I +C _w +l +O J +Q i +l +O _h +| 2 +I +O _t +| 4 +I +O _3 +| 8 +I +O _4 +| 16 +I +O _5 +| 32 +I +O _6 +| 64 +I +O _7 +|128 +I +O _8 +|256 +I +O _9 +|512 +I +) +; +I +C o +l +C c +O _h +Q _h +C d +I +O _t +Q _t +C e +I +O _3 +Q _3 +C f +I +O _4 +Q _4 +C g +I +O _5 +Q _5 +C h +I +O _6 +Q _6 +C Z +I +O _7 +Q _7 +C j +I +O _8 +Q _8 +C k +I +O _9 +Q _9 +C m +I +O _r +Q _r +C n +I +C H +l +O d +C _h +I +O e +C _t +I +O f +C _3 +I +O g +C _4 +I +O h +C _5 +I +O Z +C _6 +I +O j +C _7 +I +O k +C _8 +I +O m +C _9 +I +O n +C _r +I +C o +l +Q _s +G +O _q +C F +G +C _u +I +l +O c +C _y +I +O d +C _z +I +O e +C _A +I +O f +C _B +I +O g +C _C +I +O h +C _D +I +O Z +C _E +I +O j +C _F +I +O k +C _G +I +O m +C _H +I +O n +C _I +I +I +I +G +O _J +C _x +l +l +l +l +l +l +l +l +l +l +Q _x +G +O _K +C _J +l +l +l +l +l +l +l +l +l +l +Q _J +G +C _K +l +l +l +l +l +l +l +l +l +l +Q _K +D K +l +I +I +I +I +I +I +I +I +I +I +I +G +C i +O _N +pri\ +ntf( +"%d" +"\n" +, +1 +G +# \ +inc\ +lud\ +e +int\ + ma\ +in() +C _N +C _h +C _M +Q i +{ +l ++ +1 +) +; +l +} +I +I diff --git a/2004/vik2.hint b/2004/vik2.hint new file mode 100644 index 000000000..799308a45 --- /dev/null +++ b/2004/vik2.hint @@ -0,0 +1,207 @@ +Best Abuse of CPP: + + Daniel Vik + 926 Genter Street + La Jolla, Ca 92037 + USA + + http://www.vik.cc/ + + +Judges' Comments: + + To build: + + make vik2 + + To run: + + ./vik2 + + The fun thing about CPP abuses is that, in most cases, running the + preprocessor on them doesn't help you decipher the obfuscated code. + That's assuming your preprocessor can take it at all. + + +Selected Author's Comments: + + Introduction + ============ + + It's been a while since the last pre-processor killer won the ioccc. + I thought it was time to relive hour long compile times so I made a + program that does (almost) all computation in the pre-processor. The + program even causes gcc (and other pre-processors) to crash when + configured to do maximum number of computations. + The default configuration of the makefile is set to make the program + compile in a not too long time. + + I've got cpp to crash in a couple of diffenent ways. Most common is to + get a segmentation fault, but a couple of times it just got stuck in + some infinite loop. + + I actually had to write my own pre-processor to verify that the program + was doing the right thing... + + Since it takes a very long time to compile the program, there is a + symbol that can be defined to shorten the compile time and avoid + compiler errors. + + + Features + ======== + + The program implements an 11-bit ALU in the pre-processor. The ALU has + two registers, X and Y, for calculations and one status register SR. + Each bit in the registers are represented by one symbol that are either + defined or undefined. + + The ALU has six instructions: + + CLR_X - Clear register X + + CLR_Y - Clear register Y + + ADD - Calculates X + Y and stores the result in X. If the result + is larger than 11 bits, the CARRY bit in SR is set otherwise + the CARRY bit is cleared. + + SUB - Calculates X - Y and stores the result in X. If Y was larger + than X, the CARRY bit in SR is set otherwise the CARRY bit + is cleared. + + TST - If X == Y the EQ bit in SR is set, otherwise the EQ bit is + cleared. If X < Y the LT bit in SR is set, othervise the LT + bit is cleared. + + INC2 - Calculates X + 2 and stores the result in X. The CARRY bit + is handled as in the ADD instruction. + + Internally the ALU implements a one bit adder with a carry in and carry + out. This adder is the core of the ALU. The ADD instruction uses the one + bit adder to create the 11-bit adder. The SUB instruction is implemented + by adding ~Y to X and then add 1. Finally the TST instruction calculates + X-Y and checks the result and the CARRY bit in the SR register to set + the EQ and LT bits. + + All calculations are made using only the #ifdef, #infdef, #else, #endif, + #define and #undef. I never assign a value to a defined symbol. The + logic is done by assuming that a defined symbol is 1 and an undefined + symbol is 0. (I guess this means that I have unlimited memory as long as + I only store zeroes (!)). + + The application that uses the pre-processor ALU is a prime number + generator. The application uses the same pre-processor directives. + Needed variables are stored in memory represended by one defined or + undefined symbol per bit. When doing arithmetics, the variables are + loaded into the X and Y registers by defining / undefining the X and Y + register bits. Then the calcualtion is made and the result is moved back + to the memory. + + The choice of application may be a bit unfortunate since we've already + seen a winning entry calculating prime nubmers in the pre-processor. + There is a big difference though. The 1988 applin entry uses pre- + processor arithmethic (in a very nice way though). This program only + defines and undefines symbols in a well defined ;) way and doesn't do + any pre-processor arithmetics. + + The reason why I choosed to do a prime number application is that the + algorithm can be written to do a lot of calculations without a lot of + nesting (gnu cpp allows only 200 nested includes). + + + Build and Run + ============= + + First, do a first pre processing of the initial definitions. The FNAME + symbol must be defined to the name of the output file. If you want to + speed up the compilation, define the STOP symbol to anything from _3 to + _10. (The default value is _10 which will make the compilation take some + time.) Prime numbers up to 2^STOP will be calculated. + + $ cpp '-DSTOP=_5' '-DFNAME="tmp1.c"' prog.c tmp1.c + + Then use cpp or any other pre-processor to do the actual work. This will + take some time.... + + $ cpp tmp1.c > tmp2.c + + Finally compile the pre processed file + + $ cc -O tmp2.c -o prog + + Then run the program to reveil all prime numbers up to 32 (if you used + STOP=_5 as above): + + $ ./prog + + + Verification + ============ + + I wasn't able to compile the full program which calculates prime numbers + up to 1024 using gnu cpp (or any other pre-processor) so I had to write + my own. Knowing how the program works it was quite easy to reduce the + compilation time from several hours to about one second. I also added + some statistics to my home made pre-processor and I found that + calculating prime numbers up to 1024 makes the program include itself + over 6.8 million times (see the statistics table below). + + + Obfuscation + =========== + + Well, since 98.5% of the program is preprocessor directives, the main + obfuscation is the use of preprocessor directives. + + Doing arithmetics without acutally using any arithmetic operations makes + the program quite hard to follow. + + In order to actually do the calculations, the program includes itself a + lot. + + The symbol names are made as short as possible to meet the space limits. + This of course adds to the obfuscation (even though the program is + quite obfuscated with longer, readable macro names. + + Finally, I made the 1.5% c code a bit harder to read by breaking all + lines after three characters. + + The program has 1029 lines which makes it the longest entry (so far). + + Even though the pre-processed and indented output is easier to read, it + is quite hard to find the code in it. The size of the pre-processed file + is several Mb when using gnu cpp. + + + Limitations + =========== + + In order to fit the program within the space limits, I had to define the + #define, #endif, and some other directives as single character symbols. + This does not compile on all pre-processors but using gnu cpp as a first + compilation step solves this. + + + Statistics + ========== + + The table below contains some interesting statistics about the + compilation of the program. The intermediate file size is the size of + the output file of the cpp pre-processor. The time taken to pre process + the program were measured using gnu cpp on my 2.0MHz P4 with 512Mb ram + and a lot of disk. + + Generated Recursive Max nest Intermediate + Level prime nrs includes count file size Time + + _3 < 8 2 322 9 74 748 4" + _4 < 16 4 672 9 182 652 9" + _5 < 32 14 237 9 629 121 32" + _6 < 64 43 748 9 1 998 134 1'41" + _7 < 128 149 851 11 6 823 575 5'50" + _8 < 256 526 874 17 24 028 933 20'37" + _9 < 512 1 920 272 38 65 527 808(*) 1h 42'19"(*) + _10 < 1024 6 826 389 114 63 782 912(*) 2h 47'58"(*) + + (*) Before cpp crashed. diff --git a/2005/2005.tar.bz2 b/2005/2005.tar.bz2 new file mode 100644 index 000000000..aabeebe72 Binary files /dev/null and b/2005/2005.tar.bz2 differ diff --git a/2005/Makefile b/2005/Makefile new file mode 100644 index 000000000..56e789e1a --- /dev/null +++ b/2005/Makefile @@ -0,0 +1,124 @@ +#!/bin/make +# +# 2005 makefile +# +# Copyright (C) 2005, Landon Curt Noll, Simon Cooper, Peter Seebach +# and Leonid A. Broukhis. All Rights Reserved. Permission for personal, +# educational or non-profit use is granted provided this copyright and +# notice are included in its entirety and remains unaltered. All other +# uses must receive prior permission from the contest judges. + + +# tool locations +# +SHELL= /bin/sh +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCLUDEDIR= /usr/X11R6/include + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers and thus you may +# not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 + + +# flags for ANSI compiles +# +# NOTE: Some ANSI compilers make use of -Xa to turn on ANSI mode, +# others such as gcc may want -ansi, others (Compaq Tru64 Unix) +# want -std1, and others may want nothing at all. +# Adjust the CFLAGS line as needed. +# +# NOTE: Some compilers cannot optimize, or optimize some entries +# incorrectly. You might want to turn on -O to see if your +# compiler can handle them. +# +# +#CFLAGS= -Xa ${OPT} +#CFLAGS= -std1 $(OPT) +CFLAGS= -ansi ${OPT} + + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +MAY_NEED_GCC= gcc + + +# 2005 winners +# +WINNERS= aidan anon boutines chia giljade jetro klausler mikeash mynx persano sykes timwi toledo vik vince + +# default build +# +build: + for i in ${WINNERS} ; do (cd $$i; ${MAKE} "CC=${CC}" "CFLAGS=${CFLAGS}" "X11_LIBDIR=${X11_LIBDIR}" "X11_INCLUDEDIR=${X11_INCLUDEDIR}" build) done + +# alternative executable +# +alt: + for i in ${WINNERS} ; do (cd $$i; ${MAKE} "CC=${CC}" "CFLAGS=${CFLAGS}" "X11_LIBDIR=${X11_LIBDIR}" "X11_INCLUDEDIR=${X11_INCLUDEDIR}" alt) done + +# data files +# +data: + for i in ${WINNERS} ; do (cd $$i; ${MAKE} data) done + + + +# utility rules +# +everything: build alt data + +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +clean: + for i in ${WINNERS} ; do (cd $$i; ${MAKE} clean) done + + +clobber: ${CLOBBER} + for i in ${WINNERS} ; do (cd $$i; ${MAKE} clobber) done + +nuke: clobber + @${TRUE} + +install: all + @${TRUE} + diff --git a/2005/README.text b/2005/README.text new file mode 100644 index 000000000..5c2c44cde --- /dev/null +++ b/2005/README.text @@ -0,0 +1,110 @@ +2005 marked the "The Eighteenth International Obfuscated C Code Contest" +======================================================================== + +Copyright (C) 2005, Landon Curt Noll, Simon Cooper, and Leonid A. +Broukhis. All Rights Reserved. Permission for personal, educational +or non-profit use is granted provided this copyright and notice are +included in its entirety and remains unaltered. All other uses +must receive prior permission from the contest judges. + + +Standard IOCCC stuff +-------------------- + +The IOCCC has a web site and now has a number of international mirrors. +The primary site can be found at, + +> + +Use make to compile entries. It is possible that on non-Un*x / non-Linux +systems the makefile needs to be changed. See the Makefile for details. + +Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitters. + +Read over the makefile for compile/build issues. Your system may require +certain changes (add or remove a library, add or remove a #define). + +Some ANSI C compilers are not quite as good as they should be. If +yours is lacking, you may need to compile using gcc instead of your +local compiler. + + +Remarks on some of the entries +------------------------------ + +There were some outstanding entries that did not win. Unfortunately +some very good entries lost because they: + ++ depended too much on non-portable side effects in expressions; + ++ depended too much on a particular byte order; + ++ required the use of a special script, data file or pseudo-machine + language that was not supplied with the entry. + +We hope the authors of some of those entries will fix and re-submit +them for the next IOCCC. + +We believe you will be impressed with this year's winners. + +In particular: + ++ The Abuse of the rules used local dictionary data to get around the +size limit. + ++ The Most beauteous visuals made cleaver use of {}'s and whitespace in their source code and during execution. + ++ The most circuitous walk entry is just amazing. + ++ The Best game makes full use of its single function. + ++ The Best emulator may allow you to re-connect to your first PET. + ++ Our Best of Show this year was simply (or non-simply) the best! + ++ (And we need only mention (parenthetically speaking) that the the best use of parenthesis is self re-producing). + ++ The most sonorous output might sound like a good idea. + ++ The Best 2D puzzle takes editorial license with expressions as well as the +with the vi editor. + ++ The Most ambiguous language winner is really a C program. + ++ The superfluous output winner is simply Voronoilific! + ++ Try not to have your sense of good coding offended by the Most +discourteous interpreter winner. + ++ The Best use of the www doesn't include those letters + ++ You will be puzzled by Best 3D puzzle winner, we are sure! + ++ The Most ingenious puzzle solution might puzzle you more while it +puzzles out some puzzles: all in a puzzling way! :-) + + +Final Comments +-------------- + +Please feel free to send us comments and suggestions about the +competition, this README or anything else that you would like to see in +future contests. + +If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used. + +If you have problems with any of the entries, AND YOU HAVE A FIX, please +send us the fix (patch file or the entire changed file). + +For the latest information on how to contact the IOCCC Judges please visit + +> + +For news of the next contest watch: + +> + diff --git a/2005/aidan/Makefile b/2005/aidan/Makefile new file mode 100644 index 000000000..ac3871770 --- /dev/null +++ b/2005/aidan/Makefile @@ -0,0 +1,15 @@ + +build: aidan + +clean: + +clobber: + -rm aidan + +aidan: aidan.c + ${CC} ${CFLAGS} ${LDFLAGS} $< -o $@ + +alt: + +data: + diff --git a/2005/aidan/aidan.c b/2005/aidan/aidan.c new file mode 100644 index 000000000..bb5438c2e --- /dev/null +++ b/2005/aidan/aidan.c @@ -0,0 +1,74 @@ +#include +#include + +#define N(I,l) s l]=(I?1<>10));\ + } else if((s]>>l0)&1) c[o]=c[o]+1?-2:l;\ + if(*#k) { f(l,81) if(s]>>10||(s]&=c[o]),!s]) Ba(o,k) }\ + else f(l,9) l[c]<0||s[c]]>>10||(N(l0,[c]),C++); + +struct{ int s[81],I,l,O; } S[0123]; +int I, l, l0, o, C, O=0, w=0, c[10], L; long i; +char z[] = "\007 & & \n"; + +#define s S].s[l + +int main(int n,char**N) { + S->O=0; L=n>1?*N[1]-85?1:6:0; i=L&1?atol(N[1]):123; +#define i (int)(81.0*(i=1103515245*i+12345&0x7fffffff)/2147483648.0) + for(l=C=0;l<81;) { + I=L&1?0:getchar()^48; i; I=I-30?I:0; + if(I<10) { + #define S S[O + if(C<22) z[C++]^=13; N(I,)NO + } + } + + for(;;) { + l0: + Su(row,col,box) C=l0=0; + f(l,81) if(!(s]>>10&&++l0)) { + o=s]&1022; for(I=0;~o&1&&(o/=2);I++); o-1||(s]|=I<<10,C++); + } if(l0==l) { + if(O&&L&2) { O--; goto l0; } goto O; + } for(l0=1;10>l0;l0++) { Su(,,) } + + if(!C) { + l=(o=S].O)?S].I:0; I=o?S].l%9+1:(S].O=i%9+1); + for(;l<81;l++,I=S].O,o=0) if(!(s]>>10)) { + for(;;I=I%9+1,o=1) { + l0=0; if(o&&I==S].O) goto O; + if(s]>>I&1) { + S].l=I; S++].I=l; S]=S-1]; + N(I,); O>w&&(w=O); goto lO; + } + } + } + } + lO: S].O=0; goto l0; l: if(!(l0=O)) { L=0; goto O; } O--; + s,S].I] &=~ (1<>10,~s]&1) { + s]=1023; S].I=l; S&0]=S]; w=O=0; L=2; goto lO; + } + L=0; l0=1; + } else { + l=S=82].I; N(S].O,)|1; goto O1; + } + } + + printf("\n\n"); for(l=0;l<81;) {I=s]>>10 NO} + printf("\n%s (stk %i %i)\n",l0?"Done":"No way!",O,w); + L|=2; if(L-3||!l0) return!l0; S,82]=S]; goto O; +} diff --git a/2005/aidan/blank.sudoku b/2005/aidan/blank.sudoku new file mode 100644 index 000000000..b8beeb088 --- /dev/null +++ b/2005/aidan/blank.sudoku @@ -0,0 +1,11 @@ +. . . | . . . | . . . +. . . | . . . | . . . +. . . | . . . | . . . +------+-------+------ +. . . | . . . | . . . +. . . | . . . | . . . +. . . | . . . | . . . +------+-------+------ +. . . | . . . | . . . +. . . | . . . | . . . +. . . | . . . | . . . diff --git a/2005/aidan/hint.text b/2005/aidan/hint.text new file mode 100644 index 000000000..57f9f721d --- /dev/null +++ b/2005/aidan/hint.text @@ -0,0 +1,260 @@ +# Most ingenious puzzle solution + + Aidan Thornton + United Kingdom + makomk@lycos.co.uk + +## Judges' comments + +Are you puzzled about puzzles? This entry might puzzle you +more while it puzzles out some puzzles: all in a puzzling way! + +Goto the source and notice the lack of functions. Jump +to the switch statement. And if you think you can puzzle +it out better, try solving insane1.sudoku all by yourself! + +### To build + + cc -O2 -o aidan aidan.c + +## Author's comments + +This program can solve a type of logic puzzle known as a Sudoku, and also +generate new ones. (Apparently, the puzzle is known as Number Place in the US, +but we in the UK got it via Japan, where it's quite common in magazines, etc. +These things happen sometimes.) + +### Contents + + * build file: build.txt - you don't need this + * program file: sudoku-sf.c - sudoku solver and generator + * remarks file: sudoku-sf.txt - this file + * info file: test-su.perl - optional test script (written for Perl5) + * info file: eg-sudoku.tar - various assorted example sudokus + +**XXX - now the tar file includes the test script and the examples** + +Yes, the test suite really is 5 times larger than the actual program. You +**did** say this was a parody of the software development process... + +> **IMPORTANT!** +> +> test.perl expects the sudoku-sf executable to be `./sudoku-sf`. If you rename +> it, please change the definition of $sf_exe to the new name +> +> **IMPORTANT!** + +### Legal blurb + +This program comes with NO WARRANTY, not even that it'll do what I say it +should. Any misfortunes that occur as a result of using this are not my fault. +Go find some unpopular multinational to sue instead. + +This program is not copyrighted and is entirely my work. Distribute or modify +it as you wish, though please give me credit. + +### What is a sudoku? + +(If you know, feel free to skip this section. Get more details from [the +wikipedia entry]) + + [the wikipedia entry]: http://en.wikipedia.org/wiki/Sudoku + +A sudoku is a type of logic puzzle. You are given a grid of 9x9 boxes, some +of which contain digits. This is divided into nine 3x3 boxes, e.g. (from the +Wikipedia article - fairly easy): + + . . . | 1 . . | 7 4 . + . 5 . | . 9 . | . 3 2 + . . 6 | 7 . . | 9 . . + ------+-------+------ + 4 . . | 8 . . | . . . + . 2 . | . . . | . 1 . + . . . | . . 9 | . . 5 + ------+-------+------ + . . 4 | . . 7 | 3 . . + 7 3 . | . 2 . | . 6 . + . 6 5 | . . 4 | . . . + +You have to fill in the remaining boxes so that each row, column, and smaller +box contains all of the digits 1-9. That's all the information I needed to +figure out how to solve them, but there's a useful tutorial on +, which is roughly affiliated with the Daily +Telegraph (a UK newspaper). + +Now, with modern computers this **can** be solved using brute force, e.g.: + + #include /* sudoku-bfi.c */ + #define S(t) for(n=0;n<9;v[n++]=0);for(n=0;n<81;n++)if(i[n]){z=1<80)goto + d;for(n=p;i[++p];);s[p]=n;i[p]=1;goto f;d:z=p<81;printf("\n%s!\n\n",z?"Fail": + "Success");for(n=0;n<81;){p=i[n];printf("%c %s",(p?p|48:'.'),(++n%3?"":n%9?"| " + :n%27?"\n":n%81?"\n------+-------+------\n":"\n\n"));}return z;} + +That isn't the approach I've used; it's slow (particularly in worst-case or +nearly so scenarios), inelegant, and not a good starting point for sudoku +generation. It's also much too easy to understand ;-) Instead, I've written a +program which solves them in much the same way as I do, only a lot faster (and +hopefully more reliably). + +Oh, and if you think that example sudoku is too easy, try this one (which my +program generated): + + --- insane1.sudoku -- + . . 4 | . . . | . 5 6 + 5 . . | . 7 2 | . . . + . . 1 | . . . | 8 . . + ------+-------+------ + . . . | . . . | . . . + . . . | 6 9 3 | . . 5 + . . . | . . . | 7 3 4 + ------+-------+------ + . 5 . | 2 . 1 | 4 . 8 + 3 . . | . . . | . . . + . . . | . . . | . 6 1 + +Be warned - it's evil! (I certainly haven't been able to solve it by hand. The +brute-force program given above, sudoku-bfi.c, also has trouble - it took 66 +seconds to solve it - but probably for different reasons. That's the worst +performance I've had from brute-force so far!) + +### Usage + +#### Building + + cc -o sudoku-bf sudoku-bf.c + +-- or, if using gcc, try -- + + gcc -O2 -Wall -Wextra -ansi -pedantic-errors -o sudoku-sf sudoku-sf.c + +-- or, if using gcc and feeling lazy -- + + sh build.txt + +#### Testing (optional) + + perl ./test-su.perl + +Note that this requires Perl 5 (I use 5.8.5, earlier versions untested) and is +somewhat slow (should take under a minute on a fairly modern PC - try +appending "-n 0" if you're in a hurry). I wrote it mostly for my own benefit, +really. + +#### Solving + + ./sudoku-sf < somefile.txt + +Input should be the numbers of each row in turn. Empty spaces can be +represented as a period (.) or zero (0). Other characters are ignored, so you +can cut-and-paste either example sudoku from above into a file and feed that +in. The program has coped with every input I've thrown at it so far, including +an empty grid. + +Output consists of the problem, then the solution, then a message of +success/failure. + +`./sudoku-sf U` (capital U), may also be useful, or perhaps not. It only took +an extra 15 bytes of (very simple) code to add, so it doesn't really matter to +me. (It's the same as the normal mode for most input you're likely to feed in, +though slightly slower. See if you can figure out what it does.) + +#### Generating + + ./sudoku + +Output is a blank grid, then the solution, then the problem. There's no +control over the difficulty. Sorry. However, all generated sudokus should have +exactly one solution - if one doesn't, that's a bug. + +### Speed + +Fast enough. Solving and generating are practically instant on my 1Ghz Duron. +Of course, there could be some cases which take longer... + +More precisely - 400 random sudokus are generated and solved in about 45 +seconds in tests on my PC (1Ghz Duron, gcc 3.4.1, -O2 optimisation - takes +about 60 seconds with no optimisation). If that isn't fast enough, what on +Earth are you doing with it? + +### Bugs + +None known - hopefully I've worked out all the major ones. Nothing has come up +in testing since the last bugfix, but what does that mean? + +Tested on: + + - gcc 3.4.1-3mdk, Linux/x86 + + *RETEST* Borland C 4.5, 16-bit DOS .exe (small memory model) + +I don't count the fact that it first prints a blank grid whenever asked to +generate a sudoku as a bug - just a minor quirk. The fix is slightly awkward +and would make the program slightly longer, so I haven't bothered - it's not +important. + +### Missing Features + + * No control over the difficulty of generated sudokus - they vary from easy +to hair-tugging near-impossibility. Solver beware. Seeing as apparently one +program [took six years], I'm in no hurry. + + [took six years]: http://news.bbc.co.uk/1/hi/magazine/4469719.stm + + * Some sort of curses-based UI to let you solve interactively might be cool, +but I don't feel like learning curses just for this. Besides, I spent enough +of the time swearing as it is. + + * If you mistype a sudoku (e.g. from a paper/magazine) - and you will it +can't help you figure out where the mistake is, sadly. + +### Portability + +Dependant on ASCII, requires that an int is at least 15 bits and a long at +least 32. (No, that isn't a typo - I did say 15, not 16). + +Also requires that cpp can properly handle something like: + + #define foo(x,y) x y + foo(bar,) + +Apparently, a few can't (ANSI C specifically doesn't require that this works, +though it usually does). Unfortunately, I didn't discover this issue until too +late. (It was mentioned in the notes for people modifying GCC in the "beware +of obscure compiler limitations" section, so I'm figuring it's quite unusual.) + +### Compiler warnings + +Some when compiled with `gcc -Wall -Wextra -ansi -pedantic`: + + * The left-hand operand of a comma has no effect in two places + * Parentheses are suggested around a + in an operand of & in the "i" macro +definition. + +Borland C also spots some code in expressions which has no effect, and some +uses of '=' where you'd expect a comparison operator. + +### Obfuscation + +Let's see now: + + * Squint-inducing variable naming + * Slightly odd `#defines` (which will be cleaned up by cpp + a code + beautifier, but see the next item) + * No functions but main() - all code reuse via #defines, or by various other + methods (usually somewhat icky ones). This wasn't deliberate - it just ended + up that way somehow... + * Gotos from everywhere to everywhere else + * A slightly... interesting switch statement. + * Generally odd flow of control (see above items) + * Plenty of bit-twiddling + * To save space, no 'A'-style char constants - hard-coded numbers are used. + (There's one, but it isn't used to make things **clearer**) + * `array[index]` notation, because: + - a) it's traditional + - b) take a look at how the s and N(I,l) macros are used + * various other little things not worth mentioning + +So basically, just what you'd normally expect in an IOCCC entry diff --git a/2005/aidan/insane1.sudoku b/2005/aidan/insane1.sudoku new file mode 100644 index 000000000..652fc6a5c --- /dev/null +++ b/2005/aidan/insane1.sudoku @@ -0,0 +1,11 @@ +. . 4 | . . . | . 5 6 +5 . . | . 7 2 | . . . +. . 1 | . . . | 8 . . +------+-------+------ +. . . | . . . | . . . +. . . | 6 9 3 | . . 5 +. . . | . . . | 7 3 4 +------+-------+------ +. 5 . | 2 . 1 | 4 . 8 +3 . . | . . . | . . . +. . . | . . . | . 6 1 diff --git a/2005/aidan/insane2.sudoku b/2005/aidan/insane2.sudoku new file mode 100644 index 000000000..0679d7487 --- /dev/null +++ b/2005/aidan/insane2.sudoku @@ -0,0 +1,13 @@ +2 . . | . . . | . . 4 +. . . | . . . | 2 . . +9 . 4 | . 2 3 | . 8 . +------+-------+------ +4 . . | . . . | . 9 . +1 9 2 | . . . | 8 . . +3 . 6 | . 1 . | 5 2 . +------+-------+------ +. 1 . | . . 8 | . . . +. . . | 6 9 . | 3 . . +. . . | . . 5 | . . 9 + +Seed #100440625 diff --git a/2005/aidan/insane3.sudoku b/2005/aidan/insane3.sudoku new file mode 100644 index 000000000..e4cb8585b --- /dev/null +++ b/2005/aidan/insane3.sudoku @@ -0,0 +1,13 @@ +. . . | 4 . . | . . 5 +. . . | . . 1 | 6 . 9 +7 . . | . . 3 | . . . +------+-------+------ +. . . | . 6 . | 2 . 1 +4 . 5 | . . . | 7 3 . +. 7 . | . . . | . . . +------+-------+------ +. . . | 3 7 2 | . . . +. . . | . . . | . 1 . +3 . . | . 4 . | 9 . . + +Seed #105761662 diff --git a/2005/aidan/insane4.sudoku b/2005/aidan/insane4.sudoku new file mode 100644 index 000000000..8e2043096 --- /dev/null +++ b/2005/aidan/insane4.sudoku @@ -0,0 +1,13 @@ +. . . | 2 . 9 | . . . +. . 7 | . . . | . . 3 +3 . . | . . . | . 5 6 +------+-------+------ +. 5 . | . . . | . . . +. 9 . | . . . | 3 6 5 +. 4 . | . . 6 | 7 8 . +------+-------+------ +. . . | 6 . . | . 4 . +. . 4 | . 2 5 | 8 . 7 +9 . . | . 8 . | . . . + +Seed unknown diff --git a/2005/aidan/insane5.sudoku b/2005/aidan/insane5.sudoku new file mode 100644 index 000000000..dd1ccd2ab --- /dev/null +++ b/2005/aidan/insane5.sudoku @@ -0,0 +1,13 @@ +. . . | . . 2 | . . . +. . 1 | . 5 6 | . . . +4 5 6 | 3 . . | . . . +------+-------+------ +3 . . | 7 . 9 | . 4 5 +. . . | . . . | 6 . . +. . . | . . . | 9 . . +------+-------+------ +5 . . | . . 8 | 7 . 2 +. 3 . | . . . | . . 4 +8 . 2 | 5 4 . | . . . + +Seed #909990524 diff --git a/2005/aidan/test-su.perl b/2005/aidan/test-su.perl new file mode 100644 index 000000000..096297711 --- /dev/null +++ b/2005/aidan/test-su.perl @@ -0,0 +1,366 @@ +#!/usr/bin/perl -- +#use strict; +use warnings; +use IPC::Open2; + +my $sf_exe = "./sudoku-sf"; # location of sudoku-sf executable + +my $vflg=0; my $gcmd=$sf_exe; my $scmd=$sf_exe; +my $gcnt=400; my $soff=2; my $fbad=1; my $ffile=1; +my $fgen=1; my $zoom=0; my $rflg=1; my $fint=1; + +my $n; my $stkc; my $stkw; + +my $squstr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" . "abcdefghijklmnopqrstuvwxyz" + . "0123456789,."; + + +sub sq($); +sub read_file($); + +sub sq_tst($) { + my $i; + $i = substr($_[0],1) if($_[0]=~/^-./); + $i = read_file($_[0]) unless($i); + $i = squish($i); print $i,"\n"; +} + +for($n=0;$n<@ARGV;$n++) { + if($ARGV[$n] eq "-h"||$ARGV[$n] eq "--help") { + print "\n", + "test-su.perl - automated testing for the sudoku-sf sudoku solver\n", + "Assumes sudoku-sf executable is at \"$sf_exe\" (\$sf_exe)\n", + "This code is PUBLIC DOMAIN and comes with NO WARRANTY\n\n", + "Usage:\n", + "------\n", + "test-su.perl [-v] [-s solver] [-g ] [-n ] \n", + " -v - verbose mode\n", + " -s - path to sudoku solver executable ($sf_exe)\n", + " -g - path to sudoku generator executable ($sf_exe)\n", + " -n - number of random sudokus to generate and solve (400)\n", + " -s +Z -Z -z - none of your business (obscure & useless)\n", + " -h|--help - show this usage screen and exit\n\n", + "flags (+ enables, - disables):\n", + " +B|-B - enable/disable testing bad sudoku detection (+B)\n", + " +F|-F - enable/disable testing sudokus from *.sudoku files (+F)\n", + " +G|-G - enable/disable sudoku generation (+G)\n", + " +R|-R - enable/disable PRNG tests (+R, may change)\n", + " +I|-I - test using included sudoku (+I)\n", + "Basic usage is just: test-su.perl\n", + "Add -R if the PRNG tests cause problems, and -n 0 if in a hurry\n"; + exit; + } + if($ARGV[$n] eq "-v") { $vflg = 1; next; } + if($ARGV[$n] eq "-s") { $scmd = $ARGV[++$n]; next; } + if($ARGV[$n] eq "-g") { $gcmd = $ARGV[++$n]; next; } + if($ARGV[$n] eq "-n") { $gcnt = 0+$ARGV[++$n]; next; } + if($ARGV[$n] eq "-S") { $soff = 0+$ARGV[++$n]; next; } + if($ARGV[$n] eq "-B") { $fbad = 0; next; } + if($ARGV[$n] eq "+B") { $fbad = 1; next; } + if($ARGV[$n] eq "-F") { $ffile = 0; next; } + if($ARGV[$n] eq "+F") { $ffile = 1; next; } + if($ARGV[$n] eq "-G") { $fgen = 0; $gcnt = 0; next; } + if($ARGV[$n] eq "+G") { $fgen = 1; next; } + if($ARGV[$n] eq "+Z") { $zoom = 1; next; } + if($ARGV[$n] eq "-Z") { $zoom = 0; next; } + if($ARGV[$n] eq "+R") { $rflg = 1; next; } + if($ARGV[$n] eq "-R") { $rflg = 0; next; } + if($ARGV[$n] eq "+I") { $fint = 1; next; } + if($ARGV[$n] eq "-I") { $fint = 0; next; } + if($ARGV[$n] eq "-z") { sq_tst($ARGV[++$n]); exit; } + printf "\nUnknown option '%s', try '-h' for valid options\n\n", $ARGV[$n]; + die("Bad command-line options"); +} + + + +sub rpe() { + my $n = ""; my $c=0; local $_; + foreach(@l) { + if(/^\s*[\d.]\s*[\d.]\s*[\d.]\s*\|\s*[\d.]\s*[\d.]\s*[\d.]\s*\|\s*[\d.]\s*[\d.]\s*[\d.]\s*$/) { + s/[^.\d]//g;s/0/./g; $n = $n . $_; + } + }; + return $n; +} + +sub read_proc($$) { + my $s; my $pid; my $ret; my $file=""; my $wfile=""; my $e = ""; + $stkc = -1; $stkw = -1; + if($_[0] eq 'G') { + print "--------- Generating (#" . $_[1] . ") ---------\n"; + $pid = open2($file, $wfile, $gcmd,$_[1]); + } elsif($_[0] eq 'S') { + print "--------------- Solving... ---------------\n"; + $pid = open2($file, $wfile, $scmd); + print $wfile $_[1]; + } elsif($_[0] eq 'U') { + print "--------------- Solving... ---------------\n"; + $pid = open2($file, $wfile, $scmd,'U'); + print $wfile $_[1]; + } else { + die("Internal error: bad input to read_proc()"); + } + local @l = ( ); my $n = 0; + while($_=<$file>) { + push(@l, $_); print "> " . $_ if($vflg); + $e = $1 if(/^(!!!.*)$/); + ($stkc = $1+0, $stkw = $2+0) if(/\(stk (\d+) (\d+)\)$/); + } +# local @l = <$file>; + close $file; close $wfile; + waitpid $pid, 0; + if($?) { + return $e if($e); return "ret=$?"; + }; $s = rpe(); return $s; +} + +sub read_file($) { + my $s; + open FILE,"<",$_[0]; local @l = ; $s = rpe(); + close FILE; return $s; +} + +sub squish($) { + my $n = 0; my $c; my $bc = 0; my $dc = 0; my $s = $_[0]; + my $os = "#"; + while($s ne "") { + $c = substr $s, 0, 1; $s = substr $s, 1; + if($c eq "." || $c eq "0") { + $dc++; if($dc==7||$s eq "") { + $n |= (($dc==1?0:$dc+8)<<$bc); $bc += 4; $dc = 0; + } + } else { + if($dc) { + $n |= (($dc==1?0:$dc+8)<<$bc); $bc += 4; $dc = 0; + } + $n |= (($c)<<$bc); $bc += 4; + } + while($bc >= 6) { + $os .= substr $squstr, $n & 63, 1; + $n = $n >> 6; $bc -= 6; + } + } + + $os .= substr $squstr, $n, 1 if($bc); + return $os; +} + +sub unsq($) { + my $n = 0; my $bc = 0; my $os=""; my $i; my $s = $_[0]; my $j; + if('#' ne substr($s,0,1)) { + return $s if(81==length($s)); die("Bad compressed sudoku"); + }; $s = substr $s,1; + while((length $os)<81) { + if($bc < 4) { + die("Compressed sudoku ends prrematurely") if($s eq ""); + $i = index $squstr, substr($s, 0, 1); $s = substr($s,1); + die("Bad compressed sudoku") if($i == -1); + $n = ($i<<$bc) | $n; $bc +=6; + } + $bc -= 4; $i = $n & 15; $n = $n >> 4; + if($i < 10) { + $os .= ($i == 0?".":$i); + } else { + for($j=8;$j<$i;$j++) {$os .= '.';} + } + } return $os; +} + +sub chksq($$) { + my $i = squish($_[0]); my $j = unsq($_[1]); + die("Squash check failed") if($i ne $_[1]); + die("Unsquash check failed") if($j ne $_[0]); +} + +sub chk_fi($$) { + my $i; my $j; my $k = $_[1]; my $n= $_[0]; + if($k) { + print "================== Inbuilt $n ==================\n"; + $k = unsq($k); + } else { + print "================== File $n ==================\n"; + $k = read_file("$n.sudoku"); + } + die("*** Problem isn't even valid!") if(chk($k)==1); + print $k, "\n" if($vflg); + $i = read_proc('S', $k); + (length $i) == (81*$soff) or die("*** Failed!!!"); + $i = substr $i,81*($soff-1),81; + die("*** Solution isn't even valid!") if(chk($i)); + die("*** Solution doesn't fit the problem!") if(scmp($i,$k)); + if(-f "$n.sol") { + $j = read_file("$n.sol"); + die("*** 'Correct' solution isn't valid!") if(chk($j)); + die("*** Mix-up - solution is for another problem!") if(scmp($j,$k)); + ($i eq $j) or die("*** Wrong answer!!!"); + } + print "*** Correct answer\n"; +} + +sub chk_fail($$$$) { + my $i = $_[2]; my $e; my $n = $_[0]; my $c=$_[1]; my $o = $_[3]; + print "================ Bad problem '$n' ================\n"; + $i = unsq($i) if($i =~ /^#/); + $i = read_file("$n") unless(81 == length $i); + print $i . "\n" if($vflg); + die("*** Invalid file!") if(81 != length $i); + if($o eq 'I') { + die("*** Internal error - chk() passed invalid sudoku!") + if(chk($i)!=1); + } + $o = 'S' if($o ne 'U'); + $e = read_proc($o, $i); + if($c) { + print "Expected '" . $c . "' got '" . $e . "'\n"; + } else { return 2 unless((length $c) == 81); + return 0; + + print "Got '" . $e . "'\n"; + } + die("*** Didn't spot a bad problem!") if($e !~ /^!!! /); + die("*** Took too long to spot bad problem!") if($_[3] eq 'I' && $stkw); + die("*** Failed test!") if($c ne "" && $c ne $e); + print "*** Detected bad sudoku successfully\n"; +} + +sub genrand($$) { + my $i; my $j; my $k; my $s = $_[0]; my $c = $_[1]; + if($s) { + print "================== #$s ==================\n"; + } else { + print "================== Random ==================\n"; + $s = int(rand(999999999)) unless($s); + } + $i = read_proc('G', $s); + (length $i) == (81*3) or die("*** Failed!!!"); + $j = substr $i,81,81; + $k = substr $i,81*2,81; + print $k . "\n" . $j . "\n" if($vflg); + die("*** Problem isn't even valid!") if(chk($k)!=2); + die("*** 'Correct' solution isn't!") if(chk($j)); + die("*** Solution doesn't fit the problem!") if(scmp($j,$k)); + print "*** Generated problem OK\n"; + + $c = unsq($c) if($c); + if($c && ($c ne $k)) { + if($rflg) { + print "\n Sudoku generated was valid, but not the expected one.\n", + " This probably isn't serious, and may not even be an error.\n", + " To ignore this, add the -R option to the command line.\n\n"; + die("*** Not expected sudoku!") + } else { + print "*** Not expected sudoku, but -R specified; ignoring\n"; + } + } + + $i = read_proc('S', $k); + (length $i) == (81*2) or die("*** Failed!!!"); + $i = substr $i,81,81; + print $i . "\n" . $j . "\n" if($vflg); + ($i eq $j) or die("*** Wrong answer!!!"); + print "*** Correct answer\n"; +} + +sub scmp($$) { + my ($i,$a,$b); + for($i=0;$i<81;$i++) { + $a = substr $_[0], $i, 1; + $b = substr $_[1], $i, 1; + return 1 unless($a eq $b || $a eq "." || $b eq "."); + }; return 0; +} + +sub chk($) { + my @a; my $n; my $i; my @v; my $c = 0; + for($n=0;$n<81;$n++) { $v[$n] = gi($_[0], $n); $c++ if($v[$n]); } + if($zoom) { + return 2 unless($c == 81); + return 0; + } + for($n=0;$n<81;$n++) { $a[$n] = 0; } + for($n=0;$n<81;$n++) { + next unless $v[$n]; + $i = int($n/9)*9 + $v[$n]-1; + if($a[$i]) { + print "row ". int($n/9) . " many " . ${$v[$i]} . " \n"; + return 1; + }; $a[$i] = 1; + } + for($n=0;$n<81;$n++) { $a[$n] = 0; } + for($n=0;$n<81;$n++) { + next unless $v[$n]; + $i = ($n % 9)*9 + $v[$n]-1; + if($a[$i]) { + print "col ". (($n % 9)+1) . " many " . ${$v[$i]} . " \n"; + return 1; + }; $a[$i] = 1; + } + for($n=0;$n<81;$n++) { $a[$n] = 0; } + for($n=0;$n<81;$n++) { + next unless $v[$n]; + $i = ( int(($n % 9)/3)+int($n/27)*3 )*9 + $v[$n]-1; + if($a[$i]) { + print "box ". (int(($n % 9)/3)+int($n/27)*3+1) . " many " . ${$v[$i]} . " \n"; + return 1; + }; $a[$i] = 1; + } + return 2 unless($c == 81); + return 0; +} + +sub gi($$) { + my $n = substr $_[0], $_[1], 1; + $n = 0 if($n eq "."); $n = $n + 0; + return $n; +} + +srand; +if(!$zoom) { + print "================ Unsquash Test ==============\n"; + chksq(".............9.........1.............4..1..1....................2.." + . "...1..........", "#vnvGvTaox.u0xv"); + chksq("........2.....5.3..58..7...326....158...........362..8..7...4.....5" + . "1....6...841..", "#PIdBjWoe7IGHF,8Yii6tUXBbLShC"); + print "*** Passed\n" +} +if($fint) { + chk_fi("blank","#.......z"); + chk_fi("tough1","#PIdBjWoe7IGHF,8Yii6tUXBbLShC"); + chk_fi("insane1","#KxlV7Jds4.WOa53QQBCEEgz.gF"); + chk_fi("insane2","#yTuoJQgMACknQkyi6AGEQJasobJMfpJ"); + chk_fi("insane3","#LxVHGkHPvBCEEU7N697cyvBMLBpC"); + chk_fi("insane4","#rAZf9MeZQ9QyjVAt2hst0SgUIc5iM"); + chk_fi("insane5","#t0BU2SlN9oHkAVu9QqFjHIw4ECSRM"); + chk_fi("wikipedia","#boHplm6Iqdaqkiu0hnapkejejKqpWp0C"); +} +if($ffile) { foreach(glob("*.sudoku")) { + chk_fi($1,"") if(/^(.+)\.sudoku$/); +} } +if($fbad) { + chk_fail("row","!!! row 5","#vnvGvTaox.u0xv",'I'); + chk_fail("col","!!! col 5","#vnvGvTa8.Gt0xv",'I'); + chk_fail("box","!!! box 5","#vnvGe4kG..q0xv",'I'); + chk_fail("tele13-mang.bad","","",'S') if(-f "tele13-mang.bad"); + chk_fail("unique",'',"#.XwoFq3OixRhPPmooeL1Vw2iUo",'U') +} +if($fgen) { + genrand(951464,"#axiBBIPgN1RPQCEc4rDECkbYqome7A"); + genrand(975900,"#GCnOKdlh.7BkvWCQwh.WcqBEoakC"); + genrand(168996,"#tdjO0ahA3LbsmOg55K3G1wIY3Ses"); + genrand(250762,"#s8GCxADk.WnpFq2KawIk6cVTu4HA"); + genrand(909990524,"#t0BU2SlN9oHkAVu9QqFjHIw4ECSRM"); + genrand(105761662,"#LxVHGkHPvBCEEU7N697cyvBMLBpC"); + genrand(100440625,"#yTuoJQgMACknQkyi6AGEQJasobJMfpJ"); + genrand(957749705,"#Q0GnEIAu1OEyHLaU6kXQeCy8e9G"); + genrand(914809978,"#NCDJw9bt5RjGijAt2WhbN,EkQcAC"); + genrand(774849286,"#soDgbcqF.D3a1mTiCHlBBkIQa,7Z0C"); + genrand(862977530,"#xvTUcBJBnwWtHc0i6oyGM5jeYnrQK"); + genrand(103980293,"#oKadABTt4vpO0.nGixnGQpEcashWmo"); + genrand(122255857,"#34lWbkaAkBzr2rhelmblAyCEnS68G"); + genrand(596684993,"#cB2DhAJcMSxiANgo1sBYJfKCpV.vko"); +} +for($n = 0; $n<$gcnt; $n++) { + genrand(0,""); +} +print "\n######### All tests passed! #########\n\n"; diff --git a/2005/aidan/tough1.sudoku b/2005/aidan/tough1.sudoku new file mode 100644 index 000000000..3d912b362 --- /dev/null +++ b/2005/aidan/tough1.sudoku @@ -0,0 +1,11 @@ +. . . | . . . | . . 2 +. . . | . . 5 | . 3 . +. 5 8 | . . 7 | . . . +------+-------+------ +3 2 6 | . . . | . 1 5 +8 . . | . . . | . . . +. . . | 3 6 2 | . . 8 +------+-------+------ +. . 7 | . . . | 4 . . +. . . | 5 1 . | . . . +6 . . | . 8 4 | 1 . . diff --git a/2005/aidan/wp.sudoku b/2005/aidan/wp.sudoku new file mode 100644 index 000000000..65bed8ee9 --- /dev/null +++ b/2005/aidan/wp.sudoku @@ -0,0 +1,15 @@ +From Wikipedia article "Sudoku": + +. . . | 1 . . | 7 4 . +. 5 . | . 9 . | . 3 2 +. . 6 | 7 . . | 9 . . +------+-------+------ +4 . . | 8 . . | . . . +. 2 . | . . . | . 1 . +. . . | . . 9 | . . 5 +------+-------+------ +. . 4 | . . 7 | 3 . . +7 3 . | . 2 . | . 6 . +. 6 5 | . . 4 | . . . + +http://en.wikipedia.org/wiki/Sudoku diff --git a/2005/anon/Makefile b/2005/anon/Makefile new file mode 100644 index 000000000..4b714cc97 --- /dev/null +++ b/2005/anon/Makefile @@ -0,0 +1,15 @@ + +build: anon + +clean: + +clobber: + -rm anon + +anon: anon.c + ${CC} ${CFLAGS} ${LDFLAGS} $< -o $@ + +alt: + +data: + diff --git a/2005/anon/anon.c b/2005/anon/anon.c new file mode 100644 index 000000000..96908d1fd --- /dev/null +++ b/2005/anon/anon.c @@ -0,0 +1,178 @@ +#include +#include +#include + + +/* Defines */ + +#ifndef NO_STTY +#define S1 system("stty cbreak -echo")|| +#define S2 system("stty sane")|| +#else +#define S1 +#define S2 +#endif + +#define A(i) (((q*)R(8))[i]) +#define B p(b) +#define C p(&a) +#define H(i) sscanf(A(i),"%ld",&R(i+11))&0 || +#define P q* +#define M(a,b) main((i)(a),(P)(b)) + +#define p(x) ((i*)(x)) +#define D T(B-C,C-B) +#define T(x,y) ((a&1)*((i)(x))+(~a&1)*((i)(y))) +#define R(x) (*(B+x)) +#define q char* +#define Q(x) ((q)(x)) +#define W(x,y) ((B[x]=(i)(y))&0)|| +#define BS (w*l*h) +#define do(x,y) (a-x||y)&& +#define f(x) M(x,b) +#define if(p,q,r,s) ((p)&&!(q)||(s))&&(r)|| +#define i long +#define I (int) + +#define while(x,y,z) do(x, y && !(z) && f(a)) +#define for(s,i,x,y,z,Z) W(i,x)f(s)||Z) && while(s,R(i)-y,z||W(i,R(i)+1)0)(s +#define return return do +#define w R(12) +#define l R(13) +#define h R(14) +#define X(i) (R(i)%w) +#define Y(i) ((R(i)%(w*l))/w) + +#define Z(i) (R(i)/(w*l)) +#define pr !printf +#define switch(x) (W(32+R(15),R(32+x+R(15))) W(32+x+R(15),0) (B[15]+=x)|1) +#define case(k,x,y) R(a)==k && x && switch(y) && f(13)|| +#define TL(i) R(32+R(i)) + + +/* Main program */ + +int main(int a, P b) { + return(1>>1^1, M(6+!!M(5,C),C)) + + do( + 13, + pr("\x1b[;H")|| + + for(14,4,0,BS,!X(4)&&pr( + "%*s", + I(l-Y(4)), + "" + ) + + || + + if(TL(4),pr( + "%*ld",I + R(31), + TL(4)),0, + pr("%*.*s",I + R(31), + I R(31),"#####") + ) + if(X(4)==w-1 , pr("\n"),0 , pr("%*s", I(l+1), "")) ( + (R(4)+1)%(w*l)==0 && l>1)&& + pr("\n"),0)) + do( + 1&~1, + pr("Syntax: %s []\n", b[0])||f(15) + )((a&~1) + + -6||D>>12 + &&(*(p(T(C,b))+8)=*p(Q(b)+(Q(&b)-Q(C))) + ) + + &&(*(p(T(C,b))+9) = *p(b))&&M( + 8,T(C,b)) + || + + f( a) )&&do( + 8, + if(R(9)&1,H(1)H( + 2 ) 0,W(14, + l)W(13,1)0, + H(1 + ) + + H(2) + H(3) + 0)(srand(time(0)),0 + ) ||for(9,4, 0,BS, f(16) + + || W(R(4)+32,R(0))!R(0) && W(15,R(4) )0, + + W( + 31, + snprintf(A(0),1,"%ld",BS)) + S1 pr("\x1b[2J") || + f(13) + || + + f(18) || + f(15) + )) + + do( + 16,W(0,rand()%BS + ) W(1,0) + + for(17, 5, 0,R(4),! ( + TL( + 5)-R(0))&&! ( + W(1,1) + W(5,R(4)-1) + 0),R(1)&&f(16)) + ) + + do( + 18,W(0,0 + ) for(19,4,0,BS, TL(4)-(R(4)+1) + + %BS&& ( + W(0,1) + W(4,BS-1 + ) 0)||0,!R(0) && + + pr( + "You win!\n" + ) + || + R(0)&& ( + W(a,getchar()) + case('i', + 0 + #include + + typedef double n; n *d,*b,*f; typedef unsigned char c; +char _[ ]=" \n<%s %s=\"%d\" %s=\"%d\">\n", q [7][7] = { +"ivory","black","width","height","text"};int v,std(i,scan),std(o,print); + +int cc(str(const void*,x,y)) +{ + rt(*(n*)x>*(n*)y)-(*(n*)x<*(n*)y); + } + n t(n f,n g,str(n*,x,y)) + { + f=*x++-f,g=g-*x,*y=f*f;rt *y+g*g; + } + c*ln(n*p) + { + c*f=((c*)(d+2*(2+v))+2*(p-d)); while(!*f) mx(f,rand(),rand());rt f; + } + n*put(str(n*,f,l),n z) + { + int r=(l-f)/4,p=*(f+(r*=2))0?put(f+p*r,p?l:f+r,z):f; + } + n*g(n u,n w) + { + n y=u/(U-1),*s=put(d,d+v+2,y),z=w/(U-1),k,l=t(y,z,s,&k), + m=l,*r[4],g[4],*f; c p; for(mx(r,s,0),mx(g,k,l); + p=*(1+g)<*g,(m>*(g+1))+(*gu;++u) + i+=*ln(y),j+=*(1+ln(y)),k+=*(ln(y)+2); + *_=i/u,*(1+_)=j/u,*(_+2)=k/u;rt(c*)_; +} + +void tr(n x,n y,n i) +{ + c*h,w;n*m=g(y,i); for(w=4*(x<2);++w<4&&m==g(w/2*x+y,i+w%2*x);); + for(w=4*(w>3&&(h=x>1?ln(m):a(&y,&i))&&o("\n",*h,*(1+h),*(2+h),str(F+, + y,i),vi(x))),x/=2;x>0&&w<4;++w)tr(x,y+w/2*x,w%2*x+i); +} + +int main() +{ + long k,r=1e6,h;d=calloc(r,k=sizeof(n)),f=d+r,b=d; + + while(0<(h=i("%lf",b)))*--f=*b++;v=b-d;if + + (!h+v%2+!v&&(r=0x630C65u)){o("\n0x7");while(r-->0)o("F");rt -1;} + mx((d+v),-r,r);qsort(d,2+(v/=2),2*k,cc); + tr(U,0&o(4+_,"xml","svg",vi(2*F+U)),0); + + for(b=d-1+r,k=0;r=1,v>k++;b-=2) + str(o("<%s x=\"%f\" y=\"%f\" fill=\"%s\" %s-anchor=\"end\">%d\n", + 4+q,str(F+r/2.-5+U**,b,(b-1)),q+r,q+4,k+!o + ("\n", + r+q,str(F+r/4.+U**,b,(b-1))),4+q),&&r--,); + + free(d);rt o("\n")-7; +} diff --git a/2005/boutines/boutines.orig.c b/2005/boutines/boutines.orig.c new file mode 100644 index 000000000..f8c3f850d --- /dev/null +++ b/2005/boutines/boutines.orig.c @@ -0,0 +1,75 @@ + +#define F 0xF +#define U 512 + +#define std(x,y) (*x)(const char *,...)=y##f +#define str(l,e,x) l##e,l##x +#define mx(p,v1,v2) p[3]=v2,p[1]=v1,p[2]=v2,*p=v1 +#define mov(x,y) y=*f + #include + + typedef float n; n *d,*b,*f; typedef unsigned char c; +char _[ ]=" \n<%s %s=\"%d\" %s=\"%d\">\n", q [7][7] = { +"ivory\0","black\0","width\0","height\0","text"};int v,std(i,scan),std(o,print); + +int cc(str(const void*,x,y)) +{ + rt(*(n*)x>*(n*)y)-(*(n*)x<*(n*)y); + } + n t(n f,n g,str(n*,x,y)) + { + f=*x++-f,g=g-*x,*y=f*f;rt *y+g*g; + } + c*ln(n*p) + { + c*f=((c*)(d+2*(2+v))+2*(p-d)); while(!*f) mx(f,rand(),rand());rt f; + } + n*put(str(n*,f,l),n z) + { + int r=(l-f)/4,p=*(f+(r*=2))0?put(f+p*r,p?l:f+r,z):f; + } + n*g(n u,n w) + { + n y=(.5+u)/U, *s=put(d,d+v+2,y),z=(w+.5)/U,k,l=t(y,z,s,&k), + m=l,*r[4],g[4],*f; c p; for(mx(r,s,0),mx(g,k,l); + p=*(1+g)<*g,(m>*(g+1))+(*gu;++u) + i+=*ln(y),j+=*(1+ln(y)),k+=*(ln(y)+2); + *_=i/u,*(1+_)=j/u,*(_+2)=k/u;rt(c*)_; +} + +void tr(n x,n y,n i) +{ + c*h,w;n*m=g(y,i); for(w=4*(x<=1);++w<4&&m==g(w/2*x+y,i+w%2*x);); + w=4*(w>=4&&(h=x>1?ln(m):a(&y,&i))&&o + ("\n",*h,*(1+h),*(2+h),str(F+,y,i),vi(x))); + for(x/=2;x>0&&w<4;++w)tr(x,y+w/2*x,w%2*x+i); +} + +int main() +{ + long k,r=1e6,h;d=calloc(r,k=sizeof(n)),f=d+r,b=d; + + while(0<(h=i("%f",b)))*--f=*b++;v=b-d;if + + (!h+v%2+!v&&(r=0x630C65u)){o("\n0x7");while(r-->0)o("F");rt -1;} + mx((d+v),-r,r);qsort(d,2+(v/=2),2*k,cc); + tr(U,str(0,*o(4+_,"xml","svg",vi(2*F+U)),0)); + + for(b=d-1+r,k=0;v>k++;b-=2)for(r=1;0<=r;--r) + o("<%s x=\"%f\" y=\"%f\" fill=\"%s\" %s-anchor=\"end\">%d\n", + 4+q,str(F+r/2.-5+U**,b,(b-1)),q+r,q+4,k+!o + ("\n", + r+q,str(F+r/4.+U**,b,(b-1))),4+q); + + free(d);rt o("\n")-7; +} diff --git a/2005/boutines/eqn.png b/2005/boutines/eqn.png new file mode 100644 index 000000000..0997a0c65 Binary files /dev/null and b/2005/boutines/eqn.png differ diff --git a/2005/boutines/hint.text b/2005/boutines/hint.text new file mode 100644 index 000000000..1c5f37a7e --- /dev/null +++ b/2005/boutines/hint.text @@ -0,0 +1,130 @@ +# Most superfluous output + + Francois Boutines + Toulouse, France + francois.boutines@gmail.com + +## Judges' Comments + +### To build + + cc -o boutines boutines.c + +### To run + +You will need an [SVG] viewer. Look here to find some [SVG Viewer Implementations]. + + [SVG]: http://www.w3.org/Graphics/SVG/ + [SVG Viewer Implementations]: http://wiki.svg.org/Viewer_Implementations + +The following will create an SVG file, + + perl -e 'map{print rand," ",rand,"n";}(1..20);' | ./boutines > test.svg + +Can you explain the author's remark "[generated files] are not as scalable as their name suggests"? + +## Author's Comments + +_In memory of my father Pierre Boutines-Vignard._ + +### Walkthrough + +My program works as follows: + +**Input** +> a list of 2D points in the unit square + +**Output** +> a Voronoi diagram of the set as an [SVG] stream + +This will possibly save a compressed SVG file and may be useful: + + ./boutines | gzip > result.svgz + +Input consists of a list of floating points values separated by whitespaces +(ranging preferably in [0,1]). Alternating an horizontal coordinate, a +whitespace then the other coordinate (pointing downwards in the resulting +graph) and a newline will just go fine : + + 0 0 + 0 1 + 1 0 + 1 1 + .5 .5 + +Strictly speaking, you have to provide a **set** of points. If there are +duplicates in the list, there is no guarantee on the one to be shown (in +addition their labels will overlap) in the resulting colored Voronoi diagram. + +### Caution + +This program might have been a lot shorter, but nearly impractical even for +medium sized datasets. On the other hand it could have been a lot faster, but +hard to qualify under the IOCCC size limit. So guess what I did a compromise +favoring innermost obfuscation, sacrificing sometimes speed and other tedious +factors. + +Therefore this entry is limited to + +> ![floor\bigg(\frac{10^6}{4\times(sizeof(double)+1)}-1\bigg)](eqn.png) + +points and won't even be suitable for more than a few thousand : although +generated files do pass [W3C SVG Validator], and are highly compressible, +they are not as scalable as their name suggests… For serious applications +about Voronoi diagrams, see [Qhull], [CGAL] and the like : but you may +still encounter large output volumes (and have to handle some sort of clipping +in order to represent properly infinite regions of the diagram in SVG). + + [W3C SVG Validator]: http://jiggles.w3.org/svgvalidator/ + [Qhull]: http://www.qhull.org/ + [CGAL]: http://www.cgal.org/ + +Beware, compilation may report warnings about precision loss, linting may be a +disaster, but the code should remain portable, and the output accurate enough +for most devices (including many inkjet printers). If you ever miss precision +on a particular dataset or peripheral, you may want to dive in and let U be +the next power of `__LINE__`. + +Note : bad inputs will be sanctioned by the production of the 42nd Mersenne +prime (ie. 2^25964951 -1), memory will be kept. + +### Why I think this code is Obfuscated ? + +I'm quite divided on the subject because I wrote : + + * clear SVG key words but complicated output statements + * no nested loops but loads of function calls + * easy recursion but no clear data struture + * easy maths but no use of math.h + * a single if + +Be sure to check the antepenultimate line of code. + +### Missing Features + +**Color control** +> Cell colors are chosen randomly (with a questionable rejection scheme). It +might have been useful to input them along with sites coordinates, turning the +application into a puzzling graphics engine. + +**Site labelling** +> The points are implicitly numbered in the order they were entered +(starting at one). This can be overridden however, via a simple XSL +transformation. + +**Site radius** +> The site radius is hardwired in the code, I still wonder why I did not +design it as a function of the underlying cell's area (which can be averaged +for free) or at least a command line parameter. Same with the char set, the +viewport and potentially every SVG property. + +## See Also + + [Voronoi at Wikipedia](http://en.wikipedia.org/wiki/Voronoi_diagram), + [An Excerpt from The Algorithm Design Manual](http://www2.toki.or.id/book/AlgDesignManual/BOOK/BOOK4/NODE187.HTM), + [Voronoi and Art](http://www.snibbe.com/scott/bf) + +## Example Output + +> ![Voronoi diagram of two regular pentagon vertices](Voronoi.png) + diff --git a/2005/chia/Makefile b/2005/chia/Makefile new file mode 100644 index 000000000..1f94dc5d5 --- /dev/null +++ b/2005/chia/Makefile @@ -0,0 +1,15 @@ + +build: chia + +clean: + +clobber: + -rm chia + +chia: chia.c + ${CC} ${CFLAGS} ${LDFLAGS} $< -o $@ + +alt: + +data: + diff --git a/2005/chia/chia.c b/2005/chia/chia.c new file mode 100644 index 000000000..6469642a8 --- /dev/null +++ b/2005/chia/chia.c @@ -0,0 +1,82 @@ +/* + * Sun's Java is often touted as being "portable", even though my code won't + * suddenly become uber-portable if it's in Java. Truth is, Java's one of + * the most ugly, slow, and straitjacketed languages ever. It's popular + * mainly because people hear the word "portable" and go "ewww". + * + * This program, then, is dedicated to bringing about the death of Java. We + * good coders have been oppressed for too long by the lame language + * decisions of pointy-haired bosses and academics who should know better. + * It's time we stand up against this junk, and bring back the fun in + * programming! Viva La Revolution! + */ + +#define aSet c +#define BufferedReader(x)1 +#define byte Y[I][_^1]?do(:):_&1?do(.):do(`):8;++y;} +#define class int N=0,_,O=328,l=192,y=4,Y[80][64]={0},I;struct +#define do(c)a(#c "\b") +#define err c,c +#define getAllStrings(x));q() +#define if(x)b(#x) +#define IOException +#define line c +#define main(a)b(char*x){write(1,"\033[",2),null}main() +#define new +#define null a(x);}a(char*x){write(1,x,strlen(x));try;try;try;try; +#define out c,c +#define println(x)c +#define private int d(int +#define public short c;}c;typedef int BufferedReader;char*F="JF>:>FB;;BII"; +#define return {return +#define static f(x){N=(N+x)%6,y--?f(0),f(1),f(4),f(1):++Y[(I=O+N[F]-66) +#define String +#define System c +#define this if(D):1,O=I,I/=16,l<_/32?if(B):l>_/32?if(A):2,l=_,_/=16,byte +#define throws +#define toArray(x)c +#define try for(;--c.c;) +#define void /16][(_=l+N[6+F]-66)/16]?O/=16,l/=32,OI/16?this +#define while(k)if(2J),if(7;21H),f(0),f(4),f(4),if(H),/* + +import java.io.*; +import java.util.*; + +/** + * A lame Java program. + * @author J. Random Worker + */ +class LameJavaApp +{ + + /** The infamous Long-Winded Signature From Hell. */ + public static void main(String[] args) + throws IOException + { + /* Don't get me started on this. */ + BufferedReader reader = + new BufferedReader(new FileReader(args[0])); + + /* What, this long incantation just to print a string? */ + System.err.println("Hello world!"); + + /* At least this is sane. */ + String line; + while ((line = reader.readLine()) != null) + System.out.println(line.length()); + } + + /** + * Method with a needlessly long name. + * @param aSet a set (!) + */ + private String[] getAllStrings(Set aSet) + { + /* + * This dance is needed even in J2SE 5, which has type + * templates. It was worse before that. + */ + return aSet.toArray(new String[0]); + } + +} diff --git a/2005/chia/hint.text b/2005/chia/hint.text new file mode 100644 index 000000000..fbafa69a2 --- /dev/null +++ b/2005/chia/hint.text @@ -0,0 +1,46 @@ +# Most ambiguous language + + V. Chia + Singapore + bi@mncw.tk + +## Judges' comments + +Have you had your morning cup of Java? You might want a +second cup before parsing this entry. And give your C +pre-processor a triple shot as it tries to handle parameters +for "stringification". + +### To build + + cc chia.c -o chia + +### To run + + chia + +## Author's comments + +Two things inspired this entry. First, there were the C programs which were +`#define`'d to look like Pascal or Visual Basic: the /bin/sh code from V7 Unix +(which reportedly was the motivation behind this contest!), the VAL Linker by +David Troendle, the 2000/primenum entry, ... Looking at these programs, I +thought, "hmm... if it's possible to make C code look like some weird cross +between Pascal, VB, and COBOL, then how about making C code look like some +other language?" + +As chance would have it, I was writing some Java code at that time, and one of +my net.friends was also working on someone else's Java code. We both hated +Java; indeed, I hated Java so much that I was tired of hating it. Then I +remembered my earlier idea: "Of course! Why not write C code that looks like +Java? And poke fun at Java while I'm at it? All ye behold, as I turn anger +into action! PH34R MII!!!!!!!" And so, this entry was born. :-) + +Besides carrying a revolutionary message in the comments, this entry also +draws a spiffy little Koch snowflake fractal on the screen, with the help of +ANSI escape sequences. + +The code requires a preprocessor that can stomach all kinds of nonsense that +are passed as parameters to macros for stringification. GNU cpp handles such +things just fine, but certain broken preprocessors may decide to freak out +when they see macro parameters that don't look like C tokens. diff --git a/2005/giljade/Makefile b/2005/giljade/Makefile new file mode 100644 index 000000000..592d62ed3 --- /dev/null +++ b/2005/giljade/Makefile @@ -0,0 +1,15 @@ + +build: giljade + +clean: + +clobber: + -rm giljade + +giljade: giljade.c + ${CC} ${CFLAGS} ${LDFLAGS} $< -o $@ + +alt: + +data: + diff --git a/2005/giljade/giljade.c b/2005/giljade/giljade.c new file mode 100644 index 000000000..11a8398d2 --- /dev/null +++ b/2005/giljade/giljade.c @@ -0,0 +1,49 @@ + #define/**/F/***/for/*A*/ + #define/***/H()f=*E<<4|*\ + E,f=~(f|f<<1|E[3]|E[1]|E\ + [1]<<4|E[2]|E[(2)]<<(1)); + #define/***/I(x,d)F(;s;C\ + ()){s=s^(b=s&s-1^s);F(N[\ + 4]=q=0;q<4;q++)N[q]=E[q]\ + ;N[5]=E-B;N[d]^=+b^(b)x;} + #define/**/o(p,t,i,m,a,l\ +\ +)u=(f&p)i(m) ;s=u&E[3];I(t(m),3)s=(u)a &E[l];I(t(m\ +),l)u=u>>5-m &u;s=u&E[3-l];I(t(m),3-l) s=(u)a&*E;I\ +(t(m),(0));; /*echo/Line/%d;sed/-n/-e/ %d,%dp/%s>*/ +/*c.c;cc/c.c /-c*/;;char*A=0,*_,*R,*Q, D[9999],*r,l +[9999],T=42, M,V=32;long*E,k[9999],B[1 <<+21],*N=B+ +1234567,q=0, h=3,j=2,O,b,f,u,s,c,a,t,e ,d;C(){F(h=N +[3];(B[h]&&+ memcmp(N,B+B[h],16));h=B[ h]+4);B[h]|| +(B[h]=N-B,N= N+6);}main(char*U,int*w[] ){;;F(_=A=D+ +6666,A[fread (A,1,3333,fopen(__FILE__, "r"))]=0;*++ +_;h||(*_=V)) +*_-59|_[1]-* _||(h&&(*_=+ 35),h---2||(_[9]=V));;F(_ +=A;*_;_++)10 -*_&&*_-V&&( *_-92)&&(k[q]=isalnum(l[q +]=*_),q++);M =47;*(E=N-6) =64;E[1]=289;E[2]=270336; +F(E[3]=32782 ;E>,4,>>4, +1)o(+489335, >>,<<,1,,2)o (978670,<<,>>,1,>>1,2)o(+ +65535,>>,<<, 4,,1)if(8192 &*E){F(N=B;E>B;E=B+E[5])* +N++=E-B;F(;N >B;){h=*(E=B +*--N);H()s=~(E[1]|h|h<<1 +);u=~(E[2]|h |h<<4);r=l;_ =D;d=1;a=2;O=8;F(q=74;q;q +--){F(b=0;b< 72;b++){h=+1 <<(q-1)/14*4+(b-1)/18;j=b + ?(!(b%18)&&u &h)|h&f|(!(q%14)&&s&h)?1: +0:2;if(O<3)O ?j?j-1&&(O-2 &&d--,*R=34,O=2):(*_++=O- +2?l[d]?l[d++ ]:(d=t,O=e=3 ,34):(O=1,34)):j||(*_++=d +j &&(sprintf(l +,r+1,j,j,O=j +75,w[1]),j= O,!system(l) ););exit(j<+ +13499);}t=d+ 9;_[-1]=l[++ d];}a-1|+j-2 ||(R-Q<3?(*( +Q++R;) ;}}};O-b-f-u -s-c-a-t-e;} diff --git a/2005/giljade/hint.text b/2005/giljade/hint.text new file mode 100644 index 000000000..eaa426ac0 --- /dev/null +++ b/2005/giljade/hint.text @@ -0,0 +1,158 @@ +# Best 2D puzzle + + Gil Dogon + 1 HaBeer Alley + Jerusalem + Israel + gil_jade@netvision.net.il + +## Judges' comments + +This entry takes editorial in how it deals with its output. After using +vi to look at the source, use vi to look at its output. We especially +recommend it on a 78 column xterm while leaning on Control-F. + +Do you really understand expressions, then understand this: + + s=s^(b=s&s-1^s) + +... and understand why it is found in the source code. + +### To build + + cc giljade.c -o giljade + +### To run + + giljade > out + +Open an xterm with 78 lines + + vi out + +Press ^F repeatedly + +## Author's comments + +### So what do we have here ? + +Just run the executable with no command line args and look at the output. In +order to properly enjoy it you will need two good old programs: xterm and vi. +Do the following: open an xterm with precisely 78 lines, and use the tiny font +size for best results. Then vi (vim will also do) the output. Type ^F's and +enjoy the show ... + +The program solves (very very fast) a sliding block puzzle. There are many +variants of such puzzles which are usually made from wood or plastic pieces. +The start position can be recognized by looking at the program itself. The +goal is to move the big piece (2 by 2) to the center top, which takes 179 +steps in the shortest move sequence. + +Notice: the step count used by the program is longer than the traditional step +count for such puzzles, as normally if the same piece is moved twice in a row +it is counted as only one step, but here it is counted as two. + +The printout of the solution however is in a rather unorthodox form, as can be +easily discerned. As you have probably suspected each of the steps in the +solution printout is a C program which compiles to result in - surprise +surprise! - the original (well almost). + +Actually, This program is smarter than merely printing ITSELF in 180 different +layouts. It is self-improving, in that the programs it prints have three +advantages over the original: + +1. Their layout is more precise (Notice the annoying \ at the 10'th line of +the original program which is actually a 'layout bug' + +2. Their binary output does not rely on the source file being in the same +directory, and will not dump core like the original if it doesn't. :) + +3. They have much more comments (Not very helpful ones though). + +In addition as we all know bugs can creep on us in the most unexpected of +places, and checking that indeed the output is composed of 180 legal C +programs by hand can be quite tedious, hence the program also include a self- +test mode. Just run it with the output file as command line argument. It will +then try to compile each of the programs (printing the line number where the +program starts) It will stop where any compilation fails and the culprit +program would be in the file 'c.c'. The exit code of the self-test will be +non-zero in that case. In case this entry wins, I do hope nobody by the name +of 'c' also wins this year otherwise that part of the program would have to be +changed! + +Notice that the self-test does not try to run the result of the compilations +but this can easily be done. try it and diff the output of any of the 180 +results with the original output. Of course all 180 programs also include the +self-test mode. + +### Why I think this program is obfuscated. + + * Because its says so, and twice is better than once! + * All the usual suspects i.e. ?: && || , used to compress code length in the +noble tradition of this contest, meaningless one character variable names, +etc... + * The board representation is efficiently compressed hence obfuscated, and +the algorithm that is used to generate possible moves is extremely efficient. + +In fact it can compute several moves in parallel on one processor! Moreover +Only the most efficient bitwise logical operations, shift,and subtraction by +one is used. No inefficient conditional tests and jumps are needed in that +part of the program. + + * The single expression I'm most proud of, and would have submitted to the +category of 'best obfuscated short expression' if there was one is: + + s=s^(b=s&s-1^s) + +Can you figure out what it does (very efficiently) and how it fits in the +scheme of things? + + * IMHO the program is easier to understand before running cpp on it. It is +also shorter that way to be sure. + * It even takes care to obfuscate the comments in the output programs. + * Having the output programs a bit different than the original is more +interesting. + * I have written an earlier version of the program about half a year ago and +when returning to it now I had to sweat quite a lot to understand the f***ing +mess I've made. + +### Known Bugs/problems/warnings/portability issues + +Some CPPs issue a warning about empty macro parameters. + +-pedantic informs me that 'ISO C' does not allow extra ; outside of a +function, and I to this I say ISO what ??? + +-Wall of course will suggest adding a lot of parenthesis, function prototypes, +and remove some unnecessary expressions, and to this I say: if I listen to you +where is my freedom to obfuscate in style? + +As mentioned earlier if you try to run the original program without its source +nearby it will dump core. + +The program relies heavily on the ASCII coding system (have I seen this +comment before ?). It also implicitly assumes that sizeof(int) = sizeof(FILE +*). On systems when that is not the case expect a core dump... + +### Challenges + +What use are the ;; for ? + +Why do I use 126& in the program? (except for the rather obvious fact that it +serves as comment obfuscater). + +Why not write s^= instead of s=s^ In the expression I'm most proud of ? + +What is 40-(h&62) doing ? + +Use the program to solve for a different starting position. It is not that +difficult. Notice however that if there are more than two empty spaces the +outputs would not compile as the layout would not be sufficient to contain the +program. + +Use the program to solve for board size different than 4*5. Thats a bit more +tricky. + +### Hint for the challenges + +Just try to change the program, and use the self test to see what happens ... diff --git a/2005/guidelines.txt b/2005/guidelines.txt new file mode 100644 index 000000000..71749ae5a --- /dev/null +++ b/2005/guidelines.txt @@ -0,0 +1,555 @@ +18th International Obfuscated C Code Contest Guidelines, Hints and Comments + +Copyright (C) 2005 Leonid A. Broukhis, Simon Cooper, Landon Curt Noll and +Peter Seebach. + +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in +writing from the contest judges. + + +ABOUT THIS FILE: + + This file contains guidelines intended to help people who wish to + submit entries to the International Obfuscated C Code Contest (IOCCC + for short). + + This is not the IOCCC rules, though it does contain comments about + them. The guidelines should be viewed as hints and suggestions. + Entries that violate the guidelines but remain within the rules are + allowed. Even so, you are safer if you remain within the guidelines. + + You should read the current IOCCC rules, prior to submitting entries. + The rules are typically sent out with these guidelines. + +| WHAT'S NEW IN 2005: + +| The contest runs from 21-Mar-2005 00:00 UTC to 22-May-2005 23:59:59 UTC. + +| We will only accept online submissions this year. + See the following for details, + +| http://www.ioccc.org/2005/submit + +| Most of the changes in the rules and guidelines for this year have been +| marked with a "|" character on the left hand side. + +HINTS AND SUGGESTIONS: + + You are encouraged to examine the winners of previous contests. See + FOR MORE INFORMATION for details on how to get previous winners. + + Keep in mind that rules change from year to year, so some winning entries + may not be valid entries this year. What was unique and novel one year + might be 'old' the next year. + + An entry is usually examined in a number of ways. We typically apply + a number of tests to an entry: + + * look at the original source + * convert ANSI tri-graphs to ASCII + * C pre-process the source ignoring '#include' lines + * C pre-process the source ignoring '#define' and '#include' lines + * run it through a C beautifier + * examine the algorithm + * compile it (with flags to enable all warnings) + * execute it + + You should consider how your entry looks in each of the above tests. + You should ask yourself if your entry remains obscure after it has been + 'cleaned up' by the C pre-processor and a C beautifier. + + Your entry need not pass all of the above tests. In certain + cases, a test is not important. Entries that compete for the + 'strangest/most creative source layout' need not do as well as + others in terms of their algorithm. On the other hand, given + two such entries, we are more inclined to pick the entry that + does something interesting when you run it. + + We try to avoid limiting creativity in our rules. As such, we leave + the contest open for creative rule interpretation. As in real life + programming, interpreting a requirements document or a customer request + is important. For this reason, we often award 'worst abuse of the + rules' to an entry that illustrates this point in an ironic way. + + We do realize that there are holes in the rules, and invite entries + to attempt to exploit them. We will award 'worst abuse of the rules' + and then plug the hole next year. Even so, we will attempt to use + the smallest plug needed, if not smaller. :-) + + Check out your program and be sure that it works. We sometimes make + the effort to debug an entry that has a slight problem, particularly + in or near the final round. On the other hand, we have seen some + of the best entries fall down because they didn't work. + + We tend to look down on a prime number printer, that claims that + 16 is a prime number. If you do have a bug, you are better off + documenting it. Noting "this entry sometimes prints the 4th power + of a prime by mistake" would save the above entry. And sometimes, + a strange bug/feature can even help the entry! Of course, a correctly + working entry is best. + + People who are considering to just use some complex mathematical + function or state machine to spell out something such as "hello, + world!" may want to try and be more creative. + + Ultra-obfuscated programs are in some cases some cases easier to + deobfuscate than subtly-obfuscated programs. Consider using + misleading or subtle tricks layered on top of or under an + appropriate level of obfuscation. + + Programs that use VTxxx/ANSI sequences that are NOT limited to a + specific terminal brand and that can also work in a standard xterm + are considered portable. + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many ANSI C compilers dislike the following code, and so do we: + + #define d define + #d foo <-- don't expect this to turn into #define foo + + When declaring local or global variables, you should declare the type: + + int this_is_ok; + this_is_not; <-- don't use such implicit type declarations + + We suggest that you compile your entry with an ANSI C compiler. If you + must use non-ANSI C, such as K&R C, you must avoid areas that result in + compile/link errors for ANSI C compilers. For example, using gcc + local function declarations, such as: + + int + main() { + void blah() { printf("blah\n"); } + blah(); + } + + are not allowed even though their existence seems tailor made for + this contest! But for now, since they are not in wide spread use + we cannot accept entries that use them. + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using . Use instead. + + If you use C preprocessor directives (#define, #if, #ifdef, ...), + the leading '#' must be the first non-whitespace character on a line. + While some broken C preprocessors do not allow whitespace before a + '#', most do. + + The exit() function returns void. On some broken systems have exit() + return int. Your entry should assume that exit() returns a void. + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + + One line programs should be short one line programs, say around 80 + bytes long. Getting close to 160 bytes is a bit too long in our opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS version specific + (index/strchr differences are ok, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is ok only if you warn us in the 'remark' header item) + * won't compile or run under a POSIX P1003.1/P1003.2 like systems + * depend on a utility or application not normally found on most + most POSIX P1003.1/P1003.2 like systems + * abuse the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are similar to previous winners + * are identical to previous losers :-) + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + The build file should not be used to try and get around the size + limit. It is one thing to make use of a several -D's to help out, + but it is quite another to use 200+ bytes of -D's in order to + try and squeeze the source under the size limit. You should feel + free to make use of the build file space, but you are better off + if you show some amount of restraint. + + You should try to restrict commands used on the build file to + POSIX-like or common Un*x-like commands. You can also compile + and use your own programs. If you do, try to build and execute + from the current directory. This restriction is not a hard and + absolute one. The intent is to ensure that the building if your + program is reasonably portable. + + Don't forget that the building of your program should be done + ***without human intervention***. So don't do: + + cat > prog.c + cc prog.c -o prog + + However, you can do something cute such as making your program + do something dumb (or cute) when build 'automatically'. However + when it is run with a human involved, do something more clever. + For example, one could use the build instructions: + + cc prog.c -DNONHUMAN -o prog + echo "See remarks section about alternate ways to compile" + + and then include special notes in the program "remarks" for + alternate / human intervention based building. + + We want to get away from source that is simply a compact blob of + characters. To help, we give a break to source that contains + whitespace, and in certain cases ; { or } characters. While the + number of characters excluding whitespace (tab, space, newline), + and excluding any ; { or } followed immediately by either whitespace + or end of file, must be <= 2048, the total size may be less than 4096 + bytes. This means that one may use "free of charge" up to 2048 + bytes of whitespace, or ; { or } followed by either whitespace + or end of file. + + Please do not use things like gzip to get around the size limit. + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! + + We suggest that you avoid trying for the 'smallest self-replicating' + source. The smallest, a zero byte entry, won in 1994. + + We do not like writable strings. That is, we don't want stuff like: + + char *T = "So many primes, so little time!"; + ... + T[14] = ';'; + + Please don't make use of this feature, even if your system allows it. + However, initialized char arrays are OK to write over. This is OK: + + char b[] = "Is this Ok"; + b[9] = 'K'; + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. Don't + depend on a particular type of display. For example, don't depend + on color or a given size. Don't require backing store. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. + + We don't like entries that use proprietary M*tif, Xv*ew, or OpenL*ok + toolkits, since not everyone has them. Use of OpenMotif is permitted + because it is more widely and freely available. + + You should avoid depending on a particular window manager. + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines + in the program "remarks". + + While we recognize that UN*X is not a universal operating system, the + contest does have a bias towards such systems. In an effort to expand + the scope of the contest, we phrase our bias in terms of POSIX P1003.1 + and P1003.2 standards. This will allow certain non-UN*X OS users to + submit entries. On the other hand, this is a guideline and not a rule. + We will not reject an entry based on some POSIX technicality. + + When dealing with OS and application environments, we suggest that you + be reasonable with a nod towards vanilla UN*X-like systems. POSIX will + evolve but not as much as the contest, so avoid stuff like POSIX real + time, security, etc. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION <== HINT!! + * make us laugh and/or throw up :-) (humor helps!) + + Some types of programs can't excel (tm) in some areas. Of course, your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + You are better off explaining what your entry does in the program + "remarks" section rather than leaving it obscure for the judges + as we might miss something and/or be too tired to notice. + + We freely admit that interesting, creative or humorous comments in + the program "remarks" help your chances of winning. If you had to + read so many twisted entries, you too would enjoy a good laugh or two. + We think the readers of the contest winners do as well. We do read + the program "remarks" during the judging process, so it is worth your + while to write remarkable program "remarks". + + We dislike C code with trailing control-M's (\r or \015) that results + in compilation failures. Some non-Un*x/non-Linux tools such as + MS Visual C and MS Visual C++ leave trailing control-M's on lines. + Users of such tools should strip off such control-M's before submitting + their entries. In some cases tools have a "Save As" option that will + prevent such trailing control-M's being added. + + We dislike entries that depend on non-portable libcurses features such + as halfdelay(). One should restrict libcurses to portable features + found on BSD and SVR4/System V curses. + + The rules disallow source that contains unescaped octets with values + between 128 and 255. You must use \octal or \hex escapes instead: + + /* 123456789 123456789 123456789 123456 */ + char *foo = "This string is 36 octets in length \263"; + /* This octet requires 4 octets of source ^^^^ */ + if (strlen(foo) == 36) printf("foo is 36 octets a final NUL\n"); + + Be creative! + + +ABUSING THE RULES: + + Legal abuse of the rules is somewhat encouraged. Legal rule abuse may + involve, but is not limited to, doing things that are technically + allowed by the rules and yet do not fit the spirit of what we intended + to be submitted. + + Legal rule abuse is encouraged to help promote creativity. Rule abuse + entries, regardless of if they receive an award, result in changes to + the next year's rules and guidelines. + + Legal abuse of the rules is NOT an invitation to violate the rules. + An entry that violates the rules in the opinion of the judges, WILL be + disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK! If you + have an entry that might otherwise be interesting, you might want to + submit two versions; one that does not abuse the rules and one that + does. + + If you intend to abuse the rules, indicate so in the program + "remarks". You must try to justify why you consider your rule abuse + to be allowed under the rules. That is, you must plead your case as + to why your entry is valid. Humor and/or creativity help plead a + case. + +| Abusing the web submission procedure tends to annoy us more +| than amuse us. Spend your creative energy on content of your +| entry rather than on the submission process itself. + + We are often asked why the contest rules and guidelines seem too + strange or contain mistakes, flaws or grammatical errors. One reason + is that we sometimes make genuine mistakes. But in many cases such + problems, flaws or areas of confusion are deliberate. Changes to + rules and guidelines in response to rule abuses, are done in a minimal + fashion. Often we will deliberately leave behind holes (or introduce + new ones) so that future rule abuse may continue. + + At the risk of stating the obvious, this contest is a parody of the + software development process. The rules and guidelines are only a + small part of the overall contest. Even so, one may think the contest + rules and guideline process as a parody of the sometimes tragic + mismatch between what a customer (or marketing) wants and what + engineering delivers. + + +JUDGING PROCESS: + + Entries are judged by Leonid A. Broukhis, Simon Cooper, Landon Curt Noll + and Peter Seebach. + + Each entry submitted is given an id number and subdirectory. The + "program", "info", "build" and "remarks" portions of a submission are + stored and judged from this directory. + + Any "author" and identifiable "entry" information is not read until + the judging process is complete, and then only from entries that have + won an award. + + The above process helps keep us biased for/against any one particular +| individual. Therefore you MUST refrain from putting any information +| that reveals your identity in the "program", "info", "build", or "remarks" +| portions of your entry. We are usually kept in the dark as much as you +| are until the final awards are given. We like the surprise of finding + out in the end, who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. (For the curious, + we do indicate the volume of paper consumed when presenting the IOCCC + winners at talks) + + After the initial announcement, we attempt to send EMail to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes and typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the "build" information + * reading the "program" + * reading the program "info", if any + * passing the source thru the C pre-processor + skipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + skipping over any #include files + + In later rounds, other actions are performed: + + * compiling/building the source + * running the program + * performing miscellaneous tests on the source and binary + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry will often compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code + * best X client (see OUR LIKES AND DISLIKES) + * best abuse of ANSI C + * worst abuse of the rules + * (anything else so strange that it deserves an award) + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to 8 or 10 + winners. Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry is good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + + More often than not, we select a small entry (usually one line), a + strange/creative layout entry, and an entry that abuses the contest + rules in some way. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entries. More often, the + 'best' is picked because it does well in a number of categories. + + +ANNOUNCEMENT OF WINNERS: + + The judges will post an initial announcement of who won, the name + of their award, and a very brief description of the winning entry + on the IOCCC web site: + + http://www.ioccc.org/whowon.html + + We will also submit a brief announcement story to /.: + + http://slashdot.org + + that, depending on the willingness of the /. editors, may be posted + to their site at the same time. + + Note that initial announcement will NOT contain source. This is because + the winning authors are given a chance to review the judges comments, + and test our Makefile. This review process typically takes a few weeks. + + Sometime after the initial announcement, and once the the review + by the winners has been completed, the winning source will be + posted to the IOCCC web site: + + http://www.ioccc.org/years.html + + NOTE: previous winners are available at that URL + + We will submit a story announcing the availability of the winners + to /. at the same time. + + Finally the winning entries will be posted to the following groups: + + comp.lang.c comp.lang.c.moderated alt.sources + + In addition, pointers to these postings are posted to the following + + comp.sources.misc comp.windows.x comp.programming + misc.misc comp.std.c alt.folklore.computers + + Often, winning entries are published in selected magazines from around + the world. Winners have appeared in books ("The New Hackers Dictionary") + and on T-Shirts. + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending EMail to the following address: + +| q.2005@ioccc.org (do not submit entries to this address) + +| You must include the words 'ioccc 2005 question' in the subject of your + EMail message when sending EMail to the judges. + + Questions and comments about the contest are welcome. Comments about + confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. + + Check out the IOCCC Web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ +Peter Seebach + diff --git a/2005/jetro/Makefile b/2005/jetro/Makefile new file mode 100644 index 000000000..843680777 --- /dev/null +++ b/2005/jetro/Makefile @@ -0,0 +1,18 @@ + +INCDIR=`sdl-config --cflags` +LDFLAGS+=`sdl-config --libs` + +build: jetro + +clean: + +clobber: + -rm jetro + +jetro: jetro.c + sdl-config --version && ${CC} ${CFLAGS} ${INCDIR} ${LDFLAGS} $< -o $@ + +alt: + +data: + diff --git a/2005/jetro/hint.text b/2005/jetro/hint.text new file mode 100644 index 000000000..864ae16cf --- /dev/null +++ b/2005/jetro/hint.text @@ -0,0 +1,33 @@ +# Most sonorous output + +Jetro Lauha +Talonpojantie 5A9, +00790 Helsinki + + +## Judges' Comments + +We have seen entries with SDL graphics in the past, now it's time for SDL +sound. This entry can even be run on a computer without a sound card with an +appropriate setting of an environment variable - for that you'll have to dig +into the SDL documentation. + +Can you figure out how the notes are encoded and program a different melody? + +### To build + +Download and install the portable [Simple DirectMedia Layer library](http://www.libsdl.org/) + + cc -o jetro `sdl-config --cflags --libs` jetro.c + +### To run + + ./jetro + +## Selected Author's Comments + +To compile the entry you need SDL library, which is used only for audio +output. To run the entry make sure you have audio output available. The entry +plays 22KHz 16 bit mono music with a small softsynth. When the music plays, +you can stop the application by pressing enter, as the code will just wait +with one call to getchar() before it quits. diff --git a/2005/jetro/jetro.c b/2005/jetro/jetro.c new file mode 100644 index 000000000..97770bb1e --- /dev/null +++ b/2005/jetro/jetro.c @@ -0,0 +1,47 @@ +#include +#include +#include +#include "SDL.h" + +#define X2(a) a a +#define X4(a) a a a a +#define S1(a,b,c) #a".."#b".."#c"." +#define S14(a,b,c) X4(S1(a,b,c)) +#define S2(a) #a"."#a"....." +#define S24(a) X4(S2(a)) +#define S4(a) #a#a#a#a +#define S3(a,b,c) S1(a,b,c)S4(..) +#define SE X4(X4(S4(..))) + +char l[]=SE SE X2(S3(J,H,M)S3(J,H,E)S3(F,E,A)S3(F,E,J)S3(H,E,O)S3(H,E,C)S3(H,F, +x)S3(H,F,L)),b[]=SE X2(S4(j.jv.j.v)S4(f.fr.f.r)S4(e.eq.e.q)S4(h.ht.h.t))SE,*r[3 +]={S14(v,v,q)S14(r,r,m)S14(q,q,l)S14(t,t,o),S24(J)S24(F)S24(E)S24(H),S24(M)S24( +J)S24(H)S24(L)}; + +#define B int +#define C double +#define S static +#define I(a,b,c,d,f,g) a=(f-d)/10.,b=1e-2*(d*(28-g)-f),c=1e-2*(d*f-8*g/3);\ +d+=a,f+=b,g+=c; +S C T;typedef float A;S B D,R,U,p=0;S A F[5][0100000]={{0},{0}}; + +void AA(void*u,Uint8*_,B L){u=u;while(L>0){B M=p&037777,s=p>>12,u=(s%R)[ +l],J=(s%U)[b],w=0,a=0,n;A v,q,m,E=(0x2000-(p&017777))/8192e0f;v=q=0; +#define EF_(x) F[w][1638##x+M +#define EF(l,s,ms) ((s*ms+EF_(4)-l]*(1-ms))/2.f+EF_(3)]/2.f) +#define FQ(s) (A)sin((0.12*pow(2,n/12.))*p*s) +#define IZ(v,c) v*=v c?v:0; +#define BF F[w][M]=F[w][M+16384]=q;v+=q;++w +#define IP(n,x,y,z,c) if(n!=46){x}q=EF(y,q,z);c;BF; +#define IS(s,c) if(q c s 0.75f)q=s 0.75f; +#define NQ(x,a,m) n=x-(x>=97?121:65)+a;q=FQ(m); +IP(u,NQ(u,12,1)m=FQ(1.01f);IZ(q,>6e-1)IZ(m,>6e-1)q+=m;q*=5e-1f*(E+1);,12288, +0.2f,;)for(;a<3;++a){char sn=(s%D)[a[r]];q=0;IP(sn,NQ(sn,12,0.25f)IZ(q,<0.3), +12288,0.2f,;)}q=0;IP(J,NQ(J,0,1/8.f)X4(q*=q;)q=(A)fmod(q*20,4)*4;,6144,0.25f,IS +(-,<)IS(+,>)q*=E)v*=0.6f;*(Sint16*)_=(Sint16)(v*32767);_++,++_,++p,--L,L--;}} + +B main(B c,char**a){SDL_AudioSpec f,d;c=c,a=a;D=strlen((!!c&24)[r]),R=strlen(l) +,U=strlen(b);if(SDL_Init(16)<0)exit(1);atexit(SDL_Quit);f.freq=22050,f.format=\ +AUDIO_S16,f.channels=1,f.samples=4096,f.callback=AA,f.userdata=0;if(SDL_OpenAu\ +dio(&f,&d)<0)exit(2);T=0;SDL_PauseAudio(0);getchar();SDL_CloseAu\ +dio();return 0;} diff --git a/2005/klausler/Makefile b/2005/klausler/Makefile new file mode 100644 index 000000000..561a43864 --- /dev/null +++ b/2005/klausler/Makefile @@ -0,0 +1,29 @@ + +build: klausler + +clean: + -rm dict.h + +clobber: clean + -rm klausler + +klausler: klausler.c dict.h + ${CC} ${CFLAGS} ${LDFLAGS} $< -o $@ + +alt: + +data: dict.h + +dict.h: + dict="";\ + for f in mydict /usr/share/dict/words /usr/dict/words /usr/lib/dict/words ;\ + do if [ -r $$f ]; then dict="$$dict $$f"; fi; done; \ + if [ ".$$dict" = . ]; then echo no dictionary found; exit 1; fi; \ + cat $$dict | \ + tr -cd 'A-Za-z\n' |\ + tr A-Z a-z |\ + egrep -v '^[^ais]$$' |\ + sort |\ + uniq |\ + sed 's/^/"/;s/$$/",/' >dict.h + diff --git a/2005/klausler/hint.text b/2005/klausler/hint.text new file mode 100644 index 000000000..d9574c13f --- /dev/null +++ b/2005/klausler/hint.text @@ -0,0 +1,71 @@ +# Abuse of the rules + +Peter Klausler +Cray Inc. +2802 W 40th St +Minneapolis MN 55410 +USA +pmk@cray.com + +## Judges' comments + +To reduce the size of the source, include other people's data. +That is what Peter suggests when he describes how to generate +a critical header file. + +In other words: make use of other words! :-) + +Rules might have to be changed! + +### To build + + #!/bin/sh + dict="" + for f in mydict /usr/share/dict/words /usr/dict/words /usr/lib/dict/words + do if [ -r $f ]; then dict="$dict $f"; fi; done + + if [ ".$dict" = . ]; then echo no dictionary found; exit 1; fi + + cat $dict | \ + tr -cd 'A-Za-z\n' | \ + tr A-Z a-z | \ + egrep -v '^[^ais]$' | \ + sort | \ + uniq | \ + sed 's/^/"/;s/$/",/' >dict.h + + cc -o klausler klausler.c + +### To run + + klausler peter klausler | head + +## Author's comments + +A useful tool to help one appear extra smart and witty when IRCing, or even +just highly annoying. + +Finds best anagrams for word or phrase given as program arguments. Use only +lower-case letters in these arguments. Output is sorted firstly in ascending +order of word count (fewer words are better) and secondly in descending order +of word length. Pipe the output into more(1)/less(1)/head(1) and you're likely +to find the most amusing possibilities in the first few screenfuls of output. +For example, "ana fawlty towers | more" quickly prints "waterfowl sty". The +fewer obscure short words in your system's dictionary, the better the quality +of the output; indeed, all one-letter words apart from "a", "i", and "s" (for +plurals) are ignored when the dictionary is constructed by build.sh. + +Some history and explanation: When I noticed the call for entries in this +year's IOCCC, I submitted two of them. I worked on the first one very hard to +obfuscate it beautifully, using a goofy algorithm, wonderful two's-complement +arithmetic tricks, and cute formatting. It was a glorious work so lovely as to +make even strong men weep in admiration... but it didn't win anything. On the +other hand, this crappy little other program, which was only mildly obfuscated +from its original hacked form, took home an award! + +I'm embarrassed to admit that I don't even know which specific rule this entry +has abused. It's just yet another anagram generator and it was written very +late one night. And now I honestly do not know how it works, so please don't +ask. Upon reviewing the program after its unexpected honor, I guess that it's +remarkable only for its complete lack of macros, sneaky naming, main() +recursion, or other tricks. Enjoy! diff --git a/2005/klausler/klausler.c b/2005/klausler/klausler.c new file mode 100644 index 000000000..74f2bd8c0 --- /dev/null +++ b/2005/klausler/klausler.c @@ -0,0 +1,14 @@ +typedef unsigned char B;char*x[]={ +#include "dict.h" +0};typedef struct L{B*s;struct L*n;}L; +L*h[128],*l[128],*s[128],Z[sizeof x/sizeof*x],*F=Z;int c[256],m,a=1; +int k(B*q){int g=0;B*p=q;while(*p)g|=!c[*p++]--;return g-1&p-q;} +void u(B*p){while(*p)c[*p++]++;} +void S(int N,int r,int t,L*W){L*w;int i,n; + for(n=r0;n--)for(w=n==N?W:h[n];s[t]=w;u(w->s),w=w->n)if(k(w->s)) + if(n==r){if(t==m-1)for(i=a=0;i<=t;i++)printf("%s%c",s[i]->s,in:&h[g])=F++)->s=p; + while(++m<128)S(127,n,0,h[127]); + return a;} diff --git a/2005/klausler/klausler.orig.c b/2005/klausler/klausler.orig.c new file mode 100644 index 000000000..be7f3fd96 --- /dev/null +++ b/2005/klausler/klausler.orig.c @@ -0,0 +1,14 @@ +typedef unsigned char B;B*x[]={ +#include "dict.h" +0};typedef struct L{B*s;struct L*n;}L; +L*h[128],*l[128],*s[128],Z[sizeof x/sizeof*x],*F=Z;int c[256],m,a=1; +int k(B*q){int g=0;B*p=q;while(*p)g|=!c[*p++]--;return g-1&p-q;} +void u(B*p){while(*p)c[*p++]++;} +void S(int N,int r,int t,L*W){L*w;int i,n; + for(n=r0;n--)for(w=n==N?W:h[n];s[t]=w;u(w->s),w=w->n)if(k(w->s)) + if(n==r){if(t==m-1)for(i=a=0;i<=t;i++)printf("%s%c",s[i]->s,in:&h[g])=F++)->s=p; + while(++m<128)S(127,n,0,h[127]); + return a;} diff --git a/2005/mikeash/Makefile b/2005/mikeash/Makefile new file mode 100644 index 000000000..060c0439e --- /dev/null +++ b/2005/mikeash/Makefile @@ -0,0 +1,16 @@ +C99=--std=c99 + +build: mikeash + +clean: + +clobber: + -rm mikeash + +mikeash: mikeash.c + ${CC} ${CFLAGS} ${C99} ${LDFLAGS} $< -o $@ + +alt: + +data: + diff --git a/2005/mikeash/hint.text b/2005/mikeash/hint.text new file mode 100644 index 000000000..a198e59cf --- /dev/null +++ b/2005/mikeash/hint.text @@ -0,0 +1,128 @@ +# Best use of parenthesis + +Michael Ash +USA +mike@mikeash.com + +## Judges' comments + +Having problems speaking code? Do you LISP? Parenthetically +speaking, this entry takes advantage of C99 features, while +speaking parenthetically. Best of all, it self-reproduces! + +John McCarthy might not of imagined it quite like this! :-) + +### To build + + gcc --std=c99 -o mikeash mikeash.c + +### To run + + mikeash < mikeash.c + mikeash < mikeash.c | diff - mikeash.c + +## Author's comments + +This program is a self-reproducing program, which is on the IOCCC's list +of discouraged program types. Worse, it's a self-reproducing program +written in Common Lisp. What's this doing as an entry to the IOCCC? + +Start over; this program, when compiled with a C99 compiler, is an +interpreter for an extremely limited and highly broken subset of Common +Lisp. + +It requires C99 because of C99's ability to declare variables in the +initializer of a for loop. Unfortunately, C99 mode typically warns about +implicitly declared functions, and preprocessor directives prevent the +program from being valid Common Lisp. As a result, several warnings will +be printed about implicit declarations of functions. There are also +warnings about unknown escape sequences in the constant string, due to +different string escape semantics in C and Lisp, and some implicit +integer-to-pointer conversions due to the implicitly-declared functions. + +Try: + + echo '(format t "~s" (+ 2 2 ))' | ./lispob + +You should see '4"' echoed on your command prompt. The " after the 4 and +the lack of a newline are due to the somewhat broken implementation of +the format function. More sophisticated arithmetic expressions may be +used: + + echo '(format t "~s" (* (+ 2 2 ) (- 5 (/ 9 3 ))))' | ./lispob + +This evaluates the expression (2+2) * (5 - 9/3) giving the correct +result, 8. Note that due to the highly ad-hoc nature of the tokenizer, +the spaces before the closing paretheses are mandatory. + +The program can also be run in an interactive mode, by simply executing +./lispob and then typing lisp expressions, but this is difficult due to the +lack of proper editing facilities and the total lack of error recovery in the +interpreter. Typos will most likely crash the program. + +Aside from being required to put spaces between tokens and closing +parentheses, there are other limitations on the dialect of Common Lisp +that this program understands: + + * The only built-in functions are defvar, format, substitute, char-upcase, ++, -, *, and /. + + * Only one variable is available. This variable is called 'q', although any +symbol name starting with the letter 'q' will be mapped to this variable. + + * Only the first letter of a function name is significant. For example, +format, f, farm, and various other words starting with 'f' will all map to the +format function. + + * The defvar function completely ignores its first parameter. It will always +store the result of evaluating its second parameter in 'q'. Unlike in Common +Lisp, multiple invocations of defvar on the same variable will overwrite old +values. + + * Character constants are limited to #\Newline and single-character +constants such as #\x. + + * The char-upcase function will give strange results if passed something +other than a lowercase character. + + * The format function takes exactly three parameters. The first parameter is +ignored; output always goes to stdout. The second parameter must have exactly +one ~s format specifier in it, and no other format specifiers are permitted. + + * The arithmetic functions take exactly two parameters. + + * All tokens must be separated from a following ) by whitespace. + + * A lot of other things. Notably, the language which this program interprets +is nowhere near Turing-complete. + +Basically, the lisp interpreter is good for some basic math operations, and +for running itself. To do the latter, try this: + + ./lispob < lispob.c > lispob2.c + diff lispob.c lispob2.c + +The program can also be run from an implementation of common lisp. To do +this, run the common lisp compiler and then type the following command: + + (load "lispob.c") + +The source code of lispob.c will be printed. + +Lispob is obfuscated in several ways. First, it's actually two programs +in one, which actually share a small amount of code. Running a C code +beautifier will destroy the lisp program contained within. Second and +more importantly, it is very badly written, which will presumably +confuse people who are used to looking at well-implemented interpreters. + +The program comes in at just under 2k of significant characters. +However, this size is exaggerated, because it contains a complete copy +of itself for the self-reproducing lisp program, making it twice the +size. This doubling effect made it something of a challenge to fit +inside the IOCCC's size limit. + +This code should be highly portable. It was tested under Mac OS X and +Linux on i386, but it should run elsewhere. It requires ASCII due to +hardcoding various character constants. Other than this requirement, it +should run anywhere there's a conforming C99 compiler and a standard +C library. diff --git a/2005/mikeash/mikeash.c b/2005/mikeash/mikeash.c new file mode 100644 index 000000000..9fd18abb2 --- /dev/null +++ b/2005/mikeash/mikeash.c @@ -0,0 +1,22 @@ +;typedef char n;typedef n*m;int C;n c[11];n y[]={37,100,0};n b[2048];int i +;int A(void){return C=getchar();}int B(m s){return strlen(s) +;}n w[2048];typedef m defvar;m R(void){do A();while(isblank(C) || C == '\n') +;if(C<0) return 0;i=0;if(C==';'){for +(defvar q= +";typedef char n;typedef n*m;int C;n c[11];n y[]={37,100,0};n b[2048];int iY;int A(void){return C=getchar();}int B(m s){return strlen(s)Y;}n w[2048];typedef m defvar;m R(void){do A();while(isblank(C) || C == '\n')Y;if(C<0) return 0;i=0;if(C==';'){forY(defvar q=Y~sY;C!='\n';A()Y);R();}else if(C=='('||C==')')b[i++]=C;else if(C==34)do b[i++]=CY;while(A()!=34);else do b[i++]=C;while(!isblank(A())&&C!='\n')Y;b[i] = 0;return b;}typedef defvar*format;m E(void){Y;m a=R();if(!a) return 0;if(*a==34)return aY;if(*a=='#'){c[0]=a[2]=='N'?'\n':a[2];return c;}if(*a=='q')return wY;if(*a=='('){a=R();if(*a=='d'){R();strcpy(w,E());R();return wY;}else if(*a=='f'){R();m f = strdup(E());*strchr(f,126)=37Y;m s=E();s[B(s)+1]=0;s[B(s)]=34;printf(f+1,s);R()Y;}else if(*a=='s'){n p=*E();n o=*E();m r=strdup(E());a=r;forY(format t ;*a;a++)*a=*a==o?p:*aY;R();return r;}else if(*a=='c'){c[0]=*E()-32/*Y(substitute #\Newline (char-upcase #\y ) q= )q= );*/Y;R();return c;}else{n z=*a;int d=atoi(E()),e=atoi(E())Y;sprintf(c,y,z-'+'?z-'-'?z-'*'?d/e:d*e:d-e:d+e);R();return cY;}}return a;}int main(void){while(C+1)E();return 0;}Y" +;C!='\n';A() +);R();}else if(C=='('||C==')')b[i++]=C;else if(C==34)do b[i++]=C +;while(A()!=34);else do b[i++]=C;while(!isblank(A())&&C!='\n') +;b[i] = 0;return b;}typedef defvar*format;m E(void){ +;m a=R();if(!a) return 0;if(*a==34)return a +;if(*a=='#'){c[0]=a[2]=='N'?'\n':a[2];return c;}if(*a=='q')return w +;if(*a=='('){a=R();if(*a=='d'){R();strcpy(w,E());R();return w +;}else if(*a=='f'){R();m f = strdup(E());*strchr(f,126)=37 +;m s=E();s[B(s)+1]=0;s[B(s)]=34;printf(f+1,s);R() +;}else if(*a=='s'){n p=*E();n o=*E();m r=strdup(E());a=r;for +(format t ;*a;a++)*a=*a==o?p:*a +;R();return r;}else if(*a=='c'){c[0]=*E()-32/* +(substitute #\Newline (char-upcase #\y ) q= )q= );*/ +;R();return c;}else{n z=*a;int d=atoi(E()),e=atoi(E()) +;sprintf(c,y,z-'+'?z-'-'?z-'*'?d/e:d*e:d-e:d+e);R();return c +;}}return a;}int main(void){while(C+1)E();return 0;} diff --git a/2005/mynx/Makefile b/2005/mynx/Makefile new file mode 100644 index 000000000..2c3337133 --- /dev/null +++ b/2005/mynx/Makefile @@ -0,0 +1,15 @@ + +build: mynx + +clean: + +clobber: + -rm mynx + +mynx: mynx.c + ${CC} ${CFLAGS} ${LDFLAGS} $< -o $@ + +alt: + +data: + diff --git a/2005/mynx/configure b/2005/mynx/configure new file mode 100644 index 000000000..15cebf156 --- /dev/null +++ b/2005/mynx/configure @@ -0,0 +1,4192 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.59 for mynx 1.0. +# +# Copyright (C) 2003 Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME='mynx' +PACKAGE_TARNAME='mynx' +PACKAGE_VERSION='1.0' +PACKAGE_STRING='mynx 1.0' +PACKAGE_BUGREPORT='' + +ac_unique_file="$PACKAGE_NAME.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS autoconf_tool ac_ct_autoconf_tool platform CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP LIBOBJS LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures mynx 1.0 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +_ACEOF + + cat <<_ACEOF +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of mynx 1.0:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-w32 generate Cygwin binary in Cygwin environment + + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_srcdir/configure.gnu; then + echo + $SHELL $ac_srcdir/configure.gnu --help=recursive + elif test -f $ac_srcdir/configure; then + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF +mynx configure 1.0 +generated by GNU Autoconf 2.59 + +Copyright (C) 2003 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by mynx $as_me 1.0, which was +generated by GNU Autoconf 2.59. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_sep= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + + + + + + + + + + + + +platform=`uname -s|sed -e 's/^\([a-zA-Z0-9]*\)[^a-zA-Z0-9].*/\1/'` +echo "platform is... $platform" +my_configure_command="$0 $@" +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}autoconf", so it can be a program name with args. +set dummy ${ac_tool_prefix}autoconf; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_autoconf_tool+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$autoconf_tool"; then + ac_cv_prog_autoconf_tool="$autoconf_tool" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_autoconf_tool="${ac_tool_prefix}autoconf" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +autoconf_tool=$ac_cv_prog_autoconf_tool +if test -n "$autoconf_tool"; then + echo "$as_me:$LINENO: result: $autoconf_tool" >&5 +echo "${ECHO_T}$autoconf_tool" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_autoconf_tool"; then + ac_ct_autoconf_tool=$autoconf_tool + # Extract the first word of "autoconf", so it can be a program name with args. +set dummy autoconf; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_autoconf_tool+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_autoconf_tool"; then + ac_cv_prog_ac_ct_autoconf_tool="$ac_ct_autoconf_tool" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_autoconf_tool="autoconf" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_autoconf_tool=$ac_cv_prog_ac_ct_autoconf_tool +if test -n "$ac_ct_autoconf_tool"; then + echo "$as_me:$LINENO: result: $ac_ct_autoconf_tool" >&5 +echo "${ECHO_T}$ac_ct_autoconf_tool" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + autoconf_tool=$ac_ct_autoconf_tool +else + autoconf_tool="$ac_cv_prog_autoconf_tool" +fi + +if test ${autoconf_tool:-no} != 'no' -a \( aclocal.m4 -nt configure -o configure.in -nt configure \); then + echo 'Rebuilding the configure script first...' + autoconf -f + echo 'Restarting configure script...' + echo $my_configure_command + exec $my_configure_command +fi +platform=$platform + + + ac_config_files="$ac_config_files makefile" + +# Check whether --enable-w32 or --disable-w32 was given. +if test "${enable_w32+set}" = set; then + enableval="$enable_w32" + +fi; +if test $platform = 'CYGWIN' -a ${enable_w32:-yes} != 'no' ; then + CFLAGS="-mno-cygwin ${CFLAGS}" + LIBS="-lws2_32 ${LIBS}" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std1 is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std1. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for library containing socket" >&5 +echo $ECHO_N "checking for library containing socket... $ECHO_C" >&6 +if test "${ac_cv_search_socket+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_socket=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char socket (); +int +main () +{ +socket (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_socket="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_socket" = no; then + for ac_lib in socket nsl; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char socket (); +int +main () +{ +socket (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_socket="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_socket" >&5 +echo "${ECHO_T}$ac_cv_search_socket" >&6 +if test "$ac_cv_search_socket" != no; then + test "$ac_cv_search_socket" = "none required" || LIBS="$ac_cv_search_socket $LIBS" + cat >>confdefs.h <<_ACEOF +#define HAVE_SOCKET 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + + + + +for ac_header in arpa/inet.h netdb.h netinet/in.h sys/socket.h sys/ioctl.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------- ## +## Report this to the mynx lists. ## +## ------------------------------- ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +else + { { echo "$as_me:$LINENO: error: Missing required I/O header. +See \`config.log' for more details." >&5 +echo "$as_me: error: Missing required I/O header. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +fi + +done + + + +for ac_header in windows.h winsock2.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------- ## +## Report this to the mynx lists. ## +## ------------------------------- ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then we branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +cat >confdef2opt.sed <<\_ACEOF +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +t quote +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +t quote +d +: quote +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,\[,\\&,g +s,\],\\&,g +s,\$,$$,g +p +_ACEOF +# We use echo to avoid assuming a particular line-breaking character. +# The extra dot is to prevent the shell from consuming trailing +# line-breaks from the sub-command output. A line-break within +# single-quotes doesn't work because, if this script is created in a +# platform that uses two characters for line-breaks (e.g., DOS), tr +# would break. +ac_LF_and_DOT=`echo; echo .` +DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` +rm -f confdef2opt.sed + + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by mynx $as_me 1.0, which was +generated by GNU Autoconf 2.59. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +mynx config.status 1.0 +configured by $0, generated by GNU Autoconf 2.59, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2003 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_shift=: + ;; + -*) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + + + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "makefile" ) CONFIG_FILES="$CONFIG_FILES makefile" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@autoconf_tool@,$autoconf_tool,;t t +s,@ac_ct_autoconf_tool@,$ac_ct_autoconf_tool,;t t +s,@platform@,$platform,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@abs_srcdir@,$ac_abs_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t +s,@builddir@,$ac_builddir,;t t +s,@abs_builddir@,$ac_abs_builddir,;t t +s,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + +echo +echo $PACKAGE_STRING +echo +echo "$as_me:$LINENO: result: platform...: $platform" >&5 +echo "${ECHO_T} platform...: $platform" >&6 +echo "$as_me:$LINENO: result: prefix.....: $prefix" >&5 +echo "${ECHO_T} prefix.....: $prefix" >&6 +echo "$as_me:$LINENO: result: CFLAGS.....: $CFLAGS" >&5 +echo "${ECHO_T} CFLAGS.....: $CFLAGS" >&6 +echo "$as_me:$LINENO: result: LDFLAGS....: $LDFLAGS" >&5 +echo "${ECHO_T} LDFLAGS....: $LDFLAGS" >&6 +echo "$as_me:$LINENO: result: LIBS.......: $LIBS" >&5 +echo "${ECHO_T} LIBS.......: $LIBS" >&6 +echo diff --git a/2005/mynx/configure.in b/2005/mynx/configure.in new file mode 100644 index 000000000..8ecabe516 --- /dev/null +++ b/2005/mynx/configure.in @@ -0,0 +1,41 @@ +AC_PREREQ(2.59) +AC_INIT(mynx, 1.0, []) +platform=`uname -s|sed -e 's/^\([[a-zA-Z0-9]]*\)[[^a-zA-Z0-9]].*/\1/'` +echo "platform is... $platform" +my_configure_command="$[]0 $[]@" +AC_CHECK_TOOL(autoconf_tool, autoconf) +if test ${autoconf_tool:-no} != 'no' -a \( aclocal.m4 -nt configure -o configure.in -nt configure \); then + echo 'Rebuilding the configure script first...' + autoconf -f + echo 'Restarting configure script...' + echo $my_configure_command + exec $my_configure_command +fi +AC_SUBST(platform, $platform) +AC_CONFIG_SRCDIR($PACKAGE_NAME.c) +AC_CONFIG_FILES(makefile) +AC_ARG_ENABLE(w32, + [AC_HELP_STRING([--disable-w32],[generate Cygwin binary in Cygwin environment])] +) +if test $platform = 'CYGWIN' -a ${enable_w32:-yes} != 'no' ; then + CFLAGS="-mno-cygwin ${CFLAGS}" + LIBS="-lws2_32 ${LIBS}" +fi +AC_PROG_CC +AC_HEADER_STDC +AC_SEARCH_LIBS(socket, [socket nsl],[AC_DEFINE_UNQUOTED([AS_TR_CPP([HAVE_SOCKET])])]) +AC_CHECK_HEADERS( + [arpa/inet.h netdb.h netinet/in.h sys/socket.h sys/ioctl.h], + [], [AC_MSG_FAILURE([Missing required I/O header.], 1)] +) +AC_CHECK_HEADERS([windows.h winsock2.h]) +AC_OUTPUT() +echo +echo $PACKAGE_STRING +echo +AC_MSG_RESULT([ platform...: $platform]) +AC_MSG_RESULT([ prefix.....: $prefix]) +AC_MSG_RESULT([ CFLAGS.....: $CFLAGS]) +AC_MSG_RESULT([ LDFLAGS....: $LDFLAGS]) +AC_MSG_RESULT([ LIBS.......: $LIBS]) +echo diff --git a/2005/mynx/entities.txt b/2005/mynx/entities.txt new file mode 100644 index 000000000..b5efff475 --- /dev/null +++ b/2005/mynx/entities.txt @@ -0,0 +1,103 @@ +quot 34 +amp 38 +lt 60 +gt 62 +euro 128 +nbsp 160 +iexcl 161 +cent 162 +pound 163 +curren 164 +yen 165 +brvbar 166 +sect 167 +uml 168 +copy 169 +ordf 170 +laquo 171 +not 172 +shy 173 +reg 174 +macr 175 +deg 176 +plusmn 177 +sup2 178 +sup3 179 +acute 180 +micro 181 +para 182 +middot 183 +cedil 184 +sup1 185 +ordm 186 +raquo 187 +frac14 188 +frac12 189 +frac34 190 +iquest 191 +Agrave 192 +Aacute 193 +Acirc 194 +Atilde 195 +Auml 196 +Aring 197 +AElig 198 +Ccedil 199 +Egrave 200 +Eacute 201 +Ecirc 202 +Euml 203 +Igrave 204 +Iacute 205 +Icirc 206 +Iuml 207 +ETH 208 +Ntilde 209 +Ograve 210 +Oacute 211 +Ocirc 212 +Otilde 213 +Ouml 214 +times 215 +Oslash 216 +Ugrave 217 +Uacute 218 +Ucirc 219 +Uuml 220 +Yacute 221 +THORN 222 +szlig 223 +agrave 224 +aacute 225 +acirc 226 +atilde 227 +auml 228 +aring 229 +aelig 230 +ccedil 231 +egrave 232 +eacute 233 +ecirc 234 +euml 235 +igrave 236 +iacute 237 +icirc 238 +iuml 239 +eth 240 +ntilde 241 +ograve 242 +oacute 243 +ocirc 244 +otilde 245 +ouml 246 +divide 247 +oslash 248 +ugrave 249 +uacute 250 +ucirc 251 +uuml 252 +yacute 253 +thorn 254 +yuml 255 + + \ No newline at end of file diff --git a/2005/mynx/hint.text b/2005/mynx/hint.text new file mode 100644 index 000000000..d4bdc13e4 --- /dev/null +++ b/2005/mynx/hint.text @@ -0,0 +1,60 @@ +# Best use of the www + +Anthony Howe +Snert +42 av. Isola Bella +06400 Cannes, +France +achowe@snert.com + +## Judges' comments + +This little mynx will give any Fiery Fox a run for its money. A nice complement +to last years winning hibachi. The judges double dare any eager +Obfuscationalists to submit the missing pieces to get a functioning LAMP stack. + +### To build + + cc -O2 -o mynx mynx.c + +If this does not work for you, use the enclosed configure script. + +### Try + + mynx http://www.ioccc.org/ + +## Author's comments + +I was rather impressed by last year's mini web server. So much so that +it inspired me to try my hand at writing the client side complement. + +A typical build would be command would be: + + $ gcc -omynx mynx.c + +While some others like to be a little different: + + $ gcc -omynx mynx.c -lnsl -lsocket + +I even managed to figure out a basic configure script, given last year's +example, which is kinda of useful when you consider how many OSes put +all the network functions in a variety of places. So a simpler build +command sequence would be: + + $ ./configure + $ make + +After which, the rest of the documentation can be read by saying: + + $ mynx manual.html + +Manifest: + + mynx.c + makefile pre-built generic Un*x + README.TXT + manual.html + makefile.in makefile template + entities.txt ISO 8859-1 entites + configure.in configure script description + configure pre-built configure script diff --git a/2005/mynx/makefile.in b/2005/mynx/makefile.in new file mode 100644 index 000000000..e788442ac --- /dev/null +++ b/2005/mynx/makefile.in @@ -0,0 +1,21 @@ +PACKAGE = @PACKAGE_NAME@ +CC = @CC@ +CFLAGS = @CFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +E = @EXEEXT@ + +build: ${PACKAGE}$E + +clean: + -rm ${PACKAGE}$E ${PACKAGE}-alt$E + +distclean: clean + -rm config.status configure.lineno config.log makefile + -rm -rf autom4te.cache + +${PACKAGE}$E: ${PACKAGE}.c + ${CC} ${CFLAGS} ${LDFLAGS} -o${PACKAGE} ${PACKAGE}.c ${LIBS} + +${PACKAGE}-alt$E: ${PACKAGE}-alt.c + ${CC} ${CFLAGS} ${LDFLAGS} -o${PACKAGE}-alt ${PACKAGE}-alt.c ${LIBS} diff --git a/2005/mynx/manual.html b/2005/mynx/manual.html new file mode 100644 index 000000000..bcdaa3bef --- /dev/null +++ b/2005/mynx/manual.html @@ -0,0 +1,87 @@ + + +Mynx + + +

+ + +
+ +

The Mynx Web Browser

+ +

Usage

+
+mynx filepath|url +
+ +

Description

+ +

+View the web as it once was with the Mynx web browser. A fusion of something between more(1) and lynx(1). +It allows you to surf the web in complete safety and tranquility. The ideal web browser +for small children and their sensitive minds. It contains +a window popup blocker, it filters banner ads, and is easy to configure! +

+

+You can view local HTML files or give an http:// URL. Simply press +the ENTER key to page down through long documents. To navigate, just type the number +found in square brackets to the left of any link, followed by the ENTER key. To +quit, simply visit link zero (0), or type CTRL+C. +

+ +

Features

+
    +
  • A lean simple interface verses +Mozilla Firefox, +Opera, or Internet Explorer. +
  • +
  • Can navigate frames and image links.
  • +
  • Integrated popup window blocker.
  • +
  • No forms to fill out.
  • +
  • No banner ads.
  • +
  • No cookie crumbs.
  • +
  • No past to worry about.
  • +
+ +

Technical Overview

+
    +
  • Parses well formed XHTML documents as given by the +W3C XHTML 1.0 Specification. +
  • +
  • Recognises the terminal window dimensions and performs line wrapping.
  • +
  • Supports the ISO 8859-1 character entities, which can be easily redefined.
  • +
  • The compact HTML scanner supports trivial wildcard matching.
  • +
  • With minor changes, can be built as a Windows native console application.
  • +
+ +

Known Issues

+ +

The following issues are related to space constraints:

+
    +
  • HTTP redirection responses (301, 302, 303, and 307) are not handled, assuming +that a short HTML message with a clickable link will be provided as recommended by +RFC 2616. However, not all sites properly adhere to this useful recommendation. +Symptoms of this are a couple of blank lines and a return to the prompt after +selecting a link. +
  • +
  • HTML 4.01 or older documents should +still display, though the formatting may be a little different as these documents +often omit closing tags for many elements such as: </p>, </li> +
  • +
  • MIME types other than text/html are not handled.
  • +
+ +
+ +Top + - IOCCC + - USENIX + - SAGE + - CNet News + - Slashdot + +
+
+ + \ No newline at end of file diff --git a/2005/mynx/mynx.c b/2005/mynx/mynx.c new file mode 100644 index 000000000..c0a95094b --- /dev/null +++ b/2005/mynx/mynx.c @@ -0,0 +1,221 @@ +#define I int +#define c char * +#define G fscanf(f, +#define W while( +#define k return +#define Q if( +#define Z 512 +#include +#include +#include +#include +#include +#include +#include +#include +FILE *f; +short w[4] = { 24, 80 }; +I L, B, r, H; +c l[Z], b[Z], s[Z], S[Z][10], T[Z], h[Z]; +I +e(c s) +{ + I n = 0; + Q *s == '#') + k (I) strtol(s+1, 0, 0); + W n < Z) { + Q *S[n] && !strcmp(s, S[n]+1)) + k *S[n]; + n++; + } + k '?'; +} +void +P(I x) +{ + Q x == '\n' || w[1] - 3 < B) { + b[B] = 0; + b[B+1] = 0; + B = printf("%s", b); + B = snprintf( + b, Z, + "\n %s", + b + B + 1 + ); + r++; + } + Q b[B-1] != ' ' || !isspace(x)) { + b[B++] = isspace(x) ? ' ' : x; + Q w[1] - 3 < B) + *strrchr(b, ' ') = 0; + } +} +void +p(c t, ...) +{ + va_list x; + va_start(x, t); + vsnprintf(s, Z, t, x); + t = s; + W *t) + P(*t++); + va_end(x); +} +I +X(c s) +{ + I x; + c t = s; + long m = ftell(f); + W *t && (x = fgetc(f)) != EOF) { + Q *t == '*') + s = t++; + Q tolower(x) != *t) { + Q *s != '*') + break; + t = s; + } + t++; + } + Q *t) + fseek(f, m, SEEK_SET); + k !*t; +} +void +d(c s) +{ + Q 4 < B) + P('\n'); + P('\n'); + Q *s == 'h') + B = 1; +} +void +a(c s) +{ + *T = 0; + G + ungetc(fgetc(f), f) == '"' + ? "\"%511[^\"]" + : "'%511[^']", + T + ); + Q *s == 'a' || *s == 'f' || s[1] == 'f') { + free(l[++L]); + l[L] = strdup(T); + p(" [%d] ", L); + } + Q *s != 'a') + p("%s%s\n", T, *s == 'b' || s[1] == 'h' ? "" : "\n"); + X("*>"); +} +void *Y[] = { + "!--*-->" , 0 , + "a *href=" , a , + "ifr*src=" , a , + "fra*src=" , a , + "img*src=" , a , + "p*>" , d , + "bl*>" , d , + "br" , a , + "hr" , a , + "h*>" , d , + "/h" , a , + "/tr" , a , + "/dt" , a , + "/dd" , a , + "li*>" , d , + "*>" , 0 , + 0 , 0 +}; +I +main(I V, c *v) +{ + I x, n = 0; + c t = v[1]; + ioctl(0, TIOCGWINSZ, w); + f = fopen("entities.txt", "r"); + Q f) { + W G "%s %d", S[n]+1, &x) == 2) + *S[n++] = x; + fclose(f); + n = 0; + } + W t) { + I m = 0; + struct hostent *y; + struct sockaddr_in A; + L = 0; + B = 1; + Q !sscanf(t, "http://%255[^/]%n", h, &n) && !*h) { + Q !(f = fopen(t, "rb"))) + k 1; + goto e; + } + Q 0 < sscanf(h, "%*[^:]%n:%d", &x, &H)) + h[x] = 0; + else + H = 80; + y = gethostbyname(h); + Q !y) + k 1; + memcpy(&A.sin_addr.s_addr, y->h_addr, y->h_length); + A.sin_port = htons( (short) H); + A.sin_family = y->h_addrtype; + f = tmpfile(); + Q !f) + k 1; + W + connect( + m = socket( + A.sin_family, SOCK_STREAM, 0 + ), (void *) &A, sizeof A + ) + || errno == EINTR + ) + ; + n = snprintf( + b, Z, + "GET %s%s HTTP/1.0\r\nHost: %s:%d\r\n\r\n", + t[n] == '/' ? "" : "/", t+n, h, H + ); + Q send(m, b, n, 0) == n) { + W 0 < (n = recv(m, b, Z, 0))) + fwrite(b, 1, n, f); + } + close(m); + rewind(f); + X("*\r\n\r\n"); +e: + r = 3; + *b = ' '; + W r < *w && (x = fgetc(f)) != EOF) { + Q x == '<') { + void **p = Y; + W *p) { + Q X(*p)) { + Q p[1]) + (* (void (*)(c )) + p[1])(*p); + break; + } + p += 2; + } + } else { + Q x == '&') { + G "%9[^;];", T); + x = e(T); + } + P(isspace(x) ? ' ' : x); + } + } + printf("\n? "); + fflush(stdout); + fgets(T, Z, stdin); + Q *T == '\n') + goto e; + t = l[strtol(T, 0, 0)]; + fclose(f); + } + k 0; +} diff --git a/2005/persano/Makefile b/2005/persano/Makefile new file mode 100644 index 000000000..ab657f699 --- /dev/null +++ b/2005/persano/Makefile @@ -0,0 +1,15 @@ +LDFLAGS+=-lm +build: persano + +clean: + +clobber: + -rm persano + +persano: persano.c + ${CC} ${CFLAGS} ${LDFLAGS} $< -o $@ + +alt: + +data: + diff --git a/2005/persano/hint.text b/2005/persano/hint.text new file mode 100644 index 000000000..88fd90ed1 --- /dev/null +++ b/2005/persano/hint.text @@ -0,0 +1,116 @@ +# Best of show + +Mauro Persano +São Paulo +Brazil +mauro_persano@yahoo.com + +## Judges' Comments + +### To build + + cc -lm persano.c -o persano + +If your system is one of those that distinguish between text and binary +streams, you must know what to do to switch the standard output into +binary mode (e.g. adding a line to the source code or specifying a +linker option). + +### Try + + persano 3 16 > knot3-16.gif + +Open the GIF file with a viewer capable of displaying animated GIFs and +watch closely at the bottom of the picture (you may need to use +"gifsicle" - a great tool to manipulate animated GIFs - to slow down the +animation and to compress the GIFs generated by the entry). + +What needs to be done to fix the problem? + +Solving the author's exercises below may or may not help. + +At the time of judging, the approximation of π used in the program could +not be found on mathworld.com. + +## Selected Author's Comments + +### NAME + +**knot** +> writes animated GIF images of rendered torus knots to standard output. + +### SYNOPSIS + + knot p q [num frames] + +### DESCRIPTION + +A (p,q)-torus knot is a closed, non-intersecting curve on the surface of +a torus in R3 that winds p times around one cycle of the torus and q +times around the other. p and q should be coprime; otherwise, the +resulting curve will _not_ be a knot (that is, imagining the resulting +curve as a loop of rubber, there will be a way to bend, twist and +stretch it, without cutting it [1], until it ends up looking just like a +circle embedded in R3 [2]). + +Sample usage: + + knot 3 2 1 > foo.gif + +writes a non-animated GIF (a single frame) stream of a rendered trefoil +knot to the file foo.gif. + + knot 5 2 + +writes a GIF stream with a rendering of Solomon's Seal knot to standard +output; since the number of frames is not specified, an animation with +40 frames will be written. + +Please view the code with 8-character tabs! + +### OUTPUT FORMAT + +The program writes fully valid GIF 89 streams. + +It is suggested that the output be viewed with a program capable of +displaying animated GIFs, such as almost any graphical HTTP browser. + +Due to code size constraints, full LZW compression was not implemented +[3]. In fact, the output images are even somewhat expanded, thanks to +GIF overhead. + +The GIF format supports only a limited number of bits per pixel, so the +program uses ordered dithering to emulate full RGB output. + +### PORTABILITY + +The program was tested on Linux, with gcc 3.1; Cygwin, with gcc 3.3; and +Solaris/Sparc, with Sun's C compiler. + +The only major portability issue should be reliance on ASCII. + +It should also be mentioned that the program won't work on systems that +distinguish between text and binary streams; however, since hardly +anyone uses such systems in this day and age, this is a minor issue. [4] + +### EXERCISES FOR THE READER + + 1. (1 point) The surface is composed of many small polygons. Try to make it +smoother by increasing the number of polygons. + + 2. (2 points) Figure out how to change the radius of the tube cross section. + + 3. (5 points) Locate the famous transcendental constant π in the code. + +### FOOTNOTES + +[1] You can call such a transformation an "ambient isotopy" if you want to +impress people at parties. + +[2] Also known as the "unknot", which sounds slightly less impressive than +"ambient isotopy". + +[3] Unfortunately (for the author), the convenient excuse that LZW compression +was not implemented in order to avoid the Unisys patent can no longer be used. + +[4] ;) diff --git a/2005/persano/persano.c b/2005/persano/persano.c new file mode 100644 index 000000000..9b5d26c56 --- /dev/null +++ b/2005/persano/persano.c @@ -0,0 +1,138 @@ +#include +#include +#include +#include + +#define H 20 + +#define X for +#define F(v,b) X(k = 0; k < 3; k++) v[k] = b; + +typedef double R, V[3], U[4], (*J)(R); +typedef void Z; +typedef int _; + +V o, d, v; +R (*q)[H][6], C[4*H][H][6], sr = 15, br = 25, A, s, t; +_ P, Q, g, S, k, e = 256, (*u)(_) = putchar, D[64]; +J f = cos, Y = sin; +char B[256]; + +Z +T(_ *p, _ k, _ n) +{ + _ g; + + *p = n; + + X(g = 0; k && g < 4; g++) + T(p + (9 & (g * 4|g))*(1< e-2 || c==129) && (*B = S, S = fwrite(B, S+1, 1, stdout) - 1); +} + + + + + + + Z N + (R*v){R w=sqrt + (*v**v +1[v]*v[1] + +v[2]*2[v]);F(v,v[k] + /w)}Z K(_ j){V + n,p ;R*b=(* + q) [j],w=f + (A),x= + Y(A); + F(p, + br*o[ + k]+sr + * (n[ k] =f(t)*k[v]+ + Y(t)*(v[(k+1)%3]* d[( k+2)%3]-v[(k+2)% + 3]*d[(k+1)%3])))*b++=p[1 ]+e/ 2,*b++=-*p*x+ + p[2]*w-e*e,*b++=(*p*w+p[2]*x)+e/2;F( b,fabs(*n + *!!k+n[1]*( k<2)+n[2])/sqrt(2+ !(k-1))) + }Z M(R*a,_ s,Z(*m)(_)){_ i;R d= + pow(25/log (36),4)/s/ 377;X( + *a=i=0;i + 97)));}Z E(_ z){R + *r,*a,*b;U*q,l,x,d + ,I[256];_ i,j,m,c,y, + w,h,Y=sizeof l;fputc( + 46,stderr),M(&s,4*H,G), + W("ibcbcbbbbb,"),g=130, + O(e/2);X(y=0;yC[i /H][i%H][1 + ]&&( memcpy(*q, + x,Y),* *q=C[i/H][ + i%H][1 ]),h=1;h< + 4;h++)x [h]+=h[d]; + memcpy(l ,x,Y);}X( + i=0;iD[(y*8&56)+(i&7) + ]), c<<=k/4+2,c|=(m|-(m>k))& + k;} O(129);u(0);}_ + + + +main(_ c, char **v) +{ + if (c < 3) + return fprintf(stderr, "Usage: %s P Q [F]\n", *v), 1; + + P = atoi(v[1]), + Q = atoi(v[2]), + + T(D, 3, 0); + + W("bb\346cbcba98FIG"); + + X(; k < 384; k++) + u(k / 3<<("gdb"[k%3] - 97) | 31 | (k % 3!=1)<<5); + + W("bbbce0.2EPACSTEN\x0b\xff!"), + + M(&A, c > 3 ? atoi(v[3]) : 40, E), + + u(59); + + return 0; +} + +/* vi:set ts=8: */ diff --git a/2005/rules.txt b/2005/rules.txt new file mode 100644 index 000000000..d05d5b094 --- /dev/null +++ b/2005/rules.txt @@ -0,0 +1,152 @@ + 18th International Obfuscated C Code Contest Rules + +Copyright (C) 2005 Leonid A. Broukhis, Simon Cooper, Landon Curt Noll and +Peter Seebach. + +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in +writing from the contest judges. + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: his emotions obfuscated his + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show the importance of programming style, in an ironic way. + * To stress C compilers with unusual code. + * To illustrate some of the subtleties of the C language. + * To provide a safe forum for poor C code. :-) + +The 18th IOCCC contest window is: + +| 21-Mar-2005 00:00 UTC to 22-May-2005 23:59:59 UTC + +RULES: + + To help us with the volume of entries, we ask that you follow these rules: + + 1) Your entry must be a complete program. + + 2) The size of your program source must be <= 4096 bytes in length. + The number of characters excluding whitespace (tab, space, + newline, formfeed, return), and excluding any ; { or } immediately + followed by whitespace or end of file, must be <= 2048. + + 3) Submissions should be performed using the instructions outlined at, + +| http://www.ioccc.org/2005/submit + + 4) If your entry is selected as a winner, it will be modified as follows: + + Your 'build' instructions will be incorporated into a + makefile. If your build instructions *is* a makefile then + it should be portable and usable from within a master + makefile. + + Your program source will be renamed using an identifier of + our choice (usually your family name or anonymous) followed + by an optional digit, followed by '.c' + + Your entry will be compiled into a file with the above name + minus the '.c'. + + If your entry requires that a build file exist, state so in + your entry's remark section. The makefile will be arranged to + execute a build shell script containing the 'build' + information. The name of this build shell script will be your + entry's title, possibly followed by a digit, followed by '.sh'. + + If needed, your entry's remarks should indicate how your entry + must be changed in order to deal with the new filenames. + + 5) The build file, the source and the resulting executable should be + treated as read-only files. If your entry needs to modify these files, + it should make and modify a copy of the appropriate file. If this + occurs, state so in your entry's remarks. + + 6) Your program source must be able to be compiled cleanly by an ANSI C + compiler, or if there are any compile errors, they must be documented + in the "remarks" section of your submission. + + 7) The program must be of original work. All submitted programs are + are thereby put in the public domain. All explicitly copyrighted + programs will be rejected. + +| 8) Entries must be received prior to 22-May-2005 23:59:59 UTC. + + An EMail a confirmation of submission will be sent to the sender + before the close of the contest. + + 9) Each person may submit up to 8 entries per contest year. Each entry + must be submitted separately. + + 10) Entries requiring human interaction to be built are not permitted. + + 11) Programs that require special privileges (setuid, setgid, super-user, +| special owner or group) are highly discouraged. + + 12) Legal abuse of the rules is somewhat encouraged. An entry that, in + the opinion of the judges, violates the rules will be disqualified. + Entries that attempt to abuse the rules must try to justify why + their rule abuse is legal in the submitted "remarks". + + 13) Your source may not contain unescaped octets with the high bit set. + I.e., your source may not contain octet values between 128 and 255. + + 14) Any program that fails to compile because of lines with trailing + control-M's (\r or \015) will be rejected. + + 15) When you submit your entry you must have a valid email address + that can both send and receive email. The online submission + method is a two phase process that requires the use of an + approval code. This code will be emailed to you as part of + phase 1. + + Entries submitted without a working or valid email address will + be disqualified. + + The judges are not responsible for delays in email, please plan + enough time for one automated exchange of email as part of your + submission. + + 16) You are STRONGLY encouraged to submit an original entry. + Submissions that are similar to previous entries are discouraged. + +| 17) The total size of your submission: the sum of the size of the program, +| hints, comments, build and info files MUST be less than one megabyte +| in size. + +FOR MORE INFORMATION: + + The judging will be done by Leonid A. Broukhis, Simon Cooper, Landon + Curt Noll and Peter Seebach. Please send questions or comments + about the contest, to: + +| q.2005@ioccc.org (for questions only!) + +| You must include the words ``ioccc 2005 question'' in the subject of + your EMail message when sending EMail to the judges. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, visit the IOCCC web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + Details of how to submit your entry are located at, + +| http://www.ioccc.org/2005/submit + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ +Peter Seebach + diff --git a/2005/sykes/6502test b/2005/sykes/6502test new file mode 100644 index 000000000..b524e58bb Binary files /dev/null and b/2005/sykes/6502test differ diff --git a/2005/sykes/DEMO b/2005/sykes/DEMO new file mode 100644 index 000000000..c626c2d4b Binary files /dev/null and b/2005/sykes/DEMO differ diff --git a/2005/sykes/Makefile b/2005/sykes/Makefile new file mode 100644 index 000000000..1190e6e87 --- /dev/null +++ b/2005/sykes/Makefile @@ -0,0 +1,38 @@ +LDFLAGS+=-lcurses + +build: sykes + +clean: + -rm *.bin + +clobber: clean + -rm sykes pet.rom + +sykes: sykes.c + ${CC} ${CFLAGS} ${LDFLAGS} $< -o $@ + +alt: sykes.orig + +sykes.orig: sykes.orig.c + ${CC} ${CFLAGS} ${LDFLAGS} $< -o $@ + +data: pet.rom + +pet.rom: basic-2-c000.901465-01.bin basic-2-d000.901465-02.bin edit-2-n.901447-24.bin nullfill.bin kernal-2.901465-03.bin + cat basic-2-c000.901465-01.bin basic-2-d000.901465-02.bin edit-2-n.901447-24.bin nullfill.bin kernal-2.901465-03.bin >pet.rom + +basic-2-c000.901465-01.bin: + wget http://www.zimmers.net/anonftp/pub/cbm/firmware/computers/pet/basic-2-c000.901465-01.bin + +basic-2-d000.901465-02.bin: + wget http://www.zimmers.net/anonftp/pub/cbm/firmware/computers/pet/basic-2-d000.901465-02.bin + +edit-2-n.901447-24.bin: + wget http://www.zimmers.net/anonftp/pub/cbm/firmware/computers/pet/edit-2-n.901447-24.bin + +kernal-2.901465-03.bin: + wget http://www.zimmers.net/anonftp/pub/cbm/firmware/computers/pet/kernal-2.901465-03.bin + +nullfill.bin: + dd bs=2k count=1 if=/dev/zero of=nullfill.bin + diff --git a/2005/sykes/chess b/2005/sykes/chess new file mode 100644 index 000000000..46c7fc1f7 Binary files /dev/null and b/2005/sykes/chess differ diff --git a/2005/sykes/hint.text b/2005/sykes/hint.text new file mode 100644 index 000000000..b2e66984e --- /dev/null +++ b/2005/sykes/hint.text @@ -0,0 +1,224 @@ +# Best emulator + +Stephen Sykes +Maxisat +Laivalahdenportti 2 +00810, Helsinki +Finland +sds@maxisat.fi + +## Judges' comments + +For those who fondly remember their first PET, this entry will start you +down memory lane ... starting with $C000 of course! + +We encourage you to try and grok the obfuscated expression on line 56, +after C pre-processor gets finished with it! + +You will need to download the ROM contents to use the emulator in PET +mode. + + wget http://www.zimmers.net/anonftp/pub/cbm/firmware/computers/pet/basic-2-c000.901465-01.bin + wget http://www.zimmers.net/anonftp/pub/cbm/firmware/computers/pet/basic-2-d000.901465-02.bin + wget http://www.zimmers.net/anonftp/pub/cbm/firmware/computers/pet/edit-2-n.901447-24.bin + wget http://www.zimmers.net/anonftp/pub/cbm/firmware/computers/pet/kernal-2.901465-03.bin + + dd bs=2k count=1 if=/dev/zero of=nullfill.bin + + cat basic-2-c000.901465-01.bin basic-2-d000.901465-02.bin edit-2-n.901447-24.bin nullfill.bin kernal-2.901465-03.bin >pet.rom + +### To build + + cc -o sykes sykes.c -lcurses + +### To run + + sykes binary_file + +### Author's comments + +This program is not only a complete 6502 processor emulator, but also an +emulation of the Commodore PET 2001. + +This is the second version of the same entry, but this one takes care to +not include any possibly copyrighted items in the info files, to be sure +to not infringe the rules. + +### Test + +Compile the program, then test the 6502 emulation like this: + + ./prog 6502test + +A basic test is done for each instruction and addressing mode, all tests +should pass. At the end of the tests, it loops forever - break out with +control-C. + +### PET EMULATION + +Cast your mind back to 1977... a little company called Commodore +introduced the "PET", the Personal Electronic Transactor. + +The machine was a hit, and history was made. + +Now you can re-live those wonderful times with this PET emulator! + +To emulate the PET, you must download the pet rom. Use the script +provided (fetchrom), it will fetch the parts from right place, and will +compile it into the file pet.rom. + +Or if you don't have wget, navigate to here: + + + +and fetch the files basic-2-c000.901465-01.bin, +basic-2-d000.901465-02.bin, edit-2-n.901447-24.bin, +kernal-2.901465-03.bin. Concatenate them in that order into one pet.rom +file, adding a 2048 byte filler in between the edit-2 and kernal-2 +files. The resulting file should be 16384 bytes. + +Make sure you have a terminal window of 40x25 chars or bigger, and then +run the emulator like this: + + ./prog pet.rom + +You should see the startup message. Try typing in some BASIC - for +instance: + + PRINT "HELLO, WORLD" + +There is an optional numeric parameter, which controls the speed. For a +slower cursor blink, try + + ./prog pet.rom 6 + +and for faster + + ./prog pet.rom 2 + +the default is 4. + +The control keys are as follows: + + ^A HOME + ^L CLR + ^R RVS + ^E OFF + ^Y INST + ^X STOP (break) + ^F cursor forward + ^B cursor back + ^N cursor down + +Supplied also is a short demo program written in BASIC. Try typing + + LOAD "DEMO" + RUN + +Many other old programs will run in this emulator too. Files with a .PRG +extension should work. (Look, for instance, here: +, +or try this one: ) +The filenames must be upper case in order to be loaded by the emulator. + +You can save programs too - try + + 10 PRINT "HELLO!" + SAVE "HELLO" + NEW + + LOAD "HELLO" + RUN + +You also might try typing this to see an ancient easter egg: + + WAIT 6502,12 + +### 6502 EMULATION + +The program is basically a 6502 emulator, and it does NOT need the +commodore rom to work. + +Supplied as a demonstration is a compiled-for-6502 version a chess +program (heh, I found a use for a previous losing entry :). Try: + + ./prog chess + +It works as you would expect (it plays very badly). There's no castling +or en-passant, and to win you must actually take the opponent's king. + +You can write your own programs too, any 6502 assembler should work. + +The emulator loads the supplied file at $C000, and starts execution from +that address also (the reset vector is ignored). + +The screen memory begins at $8000, and is 40 columns * 25 rows. +Keypresses appear when they occur in memory location $A2, and are OR'd +with $80 - this is a way of indicating a fresh character. The program +can frequently check this byte, and when it sees a new character, it can +AND it with $7F to indicate that it has been read. + +The 6502 emulator receives an interrupt 60 times a second or so, you may +want to disable interrupts (with SEI) if you do not need this. + +In 6502 emulation mode the special PET character codes are not used and +the screen understands normal ASCII. + +Lastly, the before emulation starts, the low byte from a time() call is +placed at address 0 - this can be used as a random seed. + +### Technical description + +Most of the program comprises the 6502 emulator. Curses is used for the +screen and keyboard handling. + +Much of the obfuscation comes from the need to squeeze in the 6502 +emulation as well as faking enough of the PET hardware for it to work. + +If the supplied file is exactly 16384 bytes, the emulator assumes it is +a PET rom, and goes into PET emulation mode. Otherwise some PET specific +features are skipped during normal 6502 emulation. + +The main processing all happens in a heroic expression containing no +less than 64 ternery operators (after cpp) starting on line 56. This +decodes the 6502 instructions according to a table and executes them. + +The addressing mode is decoded in a similar expression starting on line +53. + +### Bugs + +The machine emulated is an older 40 column PET, so 80 column programs +will not show correctly. + +There is no emulation of PET graphics characters. + +The parameter controls the speed of the 60Hz "jiffy clock", and not the +processor speed. This means many games may run too fast to be usable - +it really depends on the speed of your machine. + +Although the PET emulator can do LOAD and SAVE, it cannot VERIFY or OPEN +and CLOSE files. + +The PET hardware emulation is not at all complete - features such as the +hardware timers are completely missing. Some programs will not run +correctly. + +The 6502 emulation does not include the seldom used decimal mode, or any +of the "undocumented" instructions. + +### IMPORTANT NOTE + +I think it is great fun to run the PET emulation and mess around with +Microsoft BASIC. However, this obviously needs the rom file to work. My +program is original and completely free of any copyright, but, of +course, the pet rom is not my work. So I ask the user to download it +from the internet. This is to avoid directly infringing any copyright. + +### Finally + +What does this do? + + ./prog pet.rom -1 + +Have fun! diff --git a/2005/sykes/sykes.c b/2005/sykes/sykes.c new file mode 100644 index 000000000..5587970dc --- /dev/null +++ b/2005/sykes/sykes.c @@ -0,0 +1,66 @@ +#include +#include +#include +#define P *p +#define E (s?s-1?s-2? +#define T (s=fgetc(g)) +#define _ m[n& +#define L R( +#define b ):L +#define G ):( +#define r =t& +#define F _++k+O] +#define W t--?t--? +#define Y _ k--+O]= +#define M W W W W W W W +#define J *E&D:&V:&I:&C) +#define q C|Z|I|D|B|V|S|32 +#define H E Z:C:V:S)&&(d+=P&l?P-O:P) +#define U(z,w)(t=w,d+=z,_ t]+_ t+1]*O) +int d,C,Z,I,D,B,V,S,i=49152 +,t,s,o,h,z,O=256,n=65535,l=128,f=255,e,w; unsigned char*p,m[65536],a,x,y,k,*u, +*j=" ./ p/ 7 ] . 6 6 p t7 r(0)1*+2,4WgcovGn^f_NVO>F?T\\swldiHZYI9QJ" +"RCKSL[b<% <% '< <% +< <% 7$ ($A @$A " +"($A &$ $A *$ $A C2 2; =2; 62; '2 2; +2 2; D# #B ?#B 6#B &# #B " +"*# #B F HFG 1 L HFG 'F HFG NFM F :89 :89 J8I :89 &8 :89 +8K :89 ., " +".,/ 5,0 .,/ ', ,/ +, ,/ -E -E3 4E -E3 &E E3 *E E3 2133024425660788" +; R(x){ Z=x?0:2; S=x&l; } K(x){ R(x-P); C=x1?v[1]:"", j+32); t=i; if(g) { ; + for(; T+1; + _ t++ ]=s); + w r /* ### COMMODORE BASIC ### */n ; + d=w?i: U(C, n + -3); /* READY. */z=c> + 2?atoi( v[2])+1 + :4; c=z ? n * z + / 4 : n; nodelay( + initscr( ), 1 ) ; + curs_set(I); cbreak(); noecho( ) ; for (; ; + ) { o++ % ( c *4) ?h :( h= getch () ,h-ERR?(_ + 162]=h|l):0); if(!w){ s=(_ 59408] + |=z?l:0)&15; _ 59410]=~(h-ERR?(s^8?0:j[h|l]&1)|(j[h]/8 + -5-s?0:1<>6; t=j[i+O]-35; M M M W 0 : L a = y G k = x G L + a=x)G L x = k ) G L y=a)G L x = a ) G P =y G P = x G P + =a G t=a-P-1+C,C r O?0:1,V=((a^ P ) & ( a ^ t )&l)/2 , L a r + f)G d=F,d+=F*O+1 G A(),d=F,d|=F*O G t=P,L P=P/2|C*l),C r 1 G t=P,L P=P*2| + C),C=t/l):A(b a=F G Y q G Y a G L a|=P)G C=P&1,L P/=2)G L y=P)b x=P b a=P G + s=U(1,--d),X(),d=s G d=i&32?U(0,e):e b++y b++x b++P b a^=P b--y b--x b--P): + K(y):K(x):K(a G J=0 G J=E 8:8:4:1)G d--,B=16,N() G L a&P),V=P&64 + ,S=P&l):!H:H:(C=P/l,L P*=2)b a&=P G t=a+P+C,C r O?1:0,V=(~(a^P)& + +(a^t)&l)/2,L a r f)); t=e^O*O/2; if(t<1000){ s=P%l; i=A_REVERSE; P>s?attron(i) +:attroff(i); mvaddch(t/40,t%40,s+w<32?s+64:s>95+w?s-32:s); } } } perror(*v); } diff --git a/2005/sykes/sykes.orig b/2005/sykes/sykes.orig new file mode 100644 index 000000000..30fa5d195 Binary files /dev/null and b/2005/sykes/sykes.orig differ diff --git a/2005/sykes/sykes.orig.c b/2005/sykes/sykes.orig.c new file mode 100644 index 000000000..bc420c490 --- /dev/null +++ b/2005/sykes/sykes.orig.c @@ -0,0 +1,66 @@ +#include +#include +#include +#define P *p +#define E (s?s-1?s-2? +#define T (s=fgetc(g)) +#define _ m[n& +#define L R( +#define b ):L +#define G ):( +#define r =t& +#define F _++k+O] +#define W t--?t--? +#define Y _ k--+O]= +#define M W W W W W W W +#define J *E &D:&V:&I:&C) +#define q C|Z|I|D|B|V|S|32 +#define H E Z:C:V:S)&&(d+=P&l?P-O:P) +#define U(z,w)(t=w,d+=z,_ t]+_ t+1]*O) +int d,C,Z,I,D,B,V,S,i=49152 +,t,s,o,h,z,O=256,n=65535,l=128,f=255,e,w; unsigned char*p,m[65536],a,x,y,k,*u, +*j=" ./ p/ 7 ] . 6 6 p t7 r(0)1*+2,4WgcovGn^f_NVO>F?T\\swldiHZYI9QJ" +"RCKSL[b<% <% '< <% +< <% 7$ ($A @$A " +"($A &$ $A *$ $A C2 2; =2; 62; '2 2; +2 2; D# #B ?#B 6#B &# #B " +"*# #B F HFG 1 L HFG 'F HFG NFM F :89 :89 J8I :89 &8 :89 +8K :89 ., " +".,/ 5,0 .,/ ', ,/ +, ,/ -E -E3 4E -E3 &E E3 *E E3 2133024425660788" +; R(x){ Z=x?0:2; S=x&l; } K(x){ R(x-P); C=x1?v[1]:"", j+32); t=i; if(g) { ; + for(; T+1; + _ t++ ]=s); + w r /* ### COMMODORE BASIC ### */n ; + d=w?i: U(C, n + -3); /* READY. */z=c> + 2?atoi( v[2])+1 + :4; c=z ? n * z + / 4 : n; nodelay( + initscr( ), 1 ) ; + curs_set(I); cbreak(); noecho( ) ; for (; ; + ) { o++ % ( c *4) ?h :( h= getch () ,h-ERR?(_ + 162]=h|l):0); if(!w){ s=(_ 59408] + |=z?l:0)&15; _ 59410]=~(h-ERR?(s^8?0:j[h|l]&1)|(j[h]/8 + -5-s?0:1<>6; t=j[i+O]-35; M M M W 0 : L a = y G k = x G L + a=x)G L x = k ) G L y=a)G L x = a ) G P =y G P = x G P + =a G t=a-P-1+C,C r O?0:1,V=((a^ P ) & ( a ^ t )&l)/2 , L a r + f)G d=F+F*O+1 G A(),d=F+F*O G t=P,L P=P/2|C*l),C r 1 G t=P,L P=P*2|C),C=t + /l):A(b a=F G Y q G Y a G L a|=P)G C=P&1,L P/=2)G L y=P)b x=P b a=P G s=U(1 + ,--d),X(),d=s G d=i&32?U(0,e):e b++y b++x b++P b a^=P b--y b--x b--P):K(y): + K(x):K(a G J=0 G J=E 8:8:4:1)G d--,B=16,N() G L a&P),V=P&64,S=P& + l):!H:H:(C=P/l,L P*=2)b a&=P G t=a+P+C,C r O?1:0,V=(~(a^P)&(a^t) + +&l)/2, L a r f)); t=e^O*O/2; if (t<1000) { s=P%l; i=A_REVERSE; P>s ? attron(i) +:attroff(i); mvaddch(t/40,t%40,s+w<32?s+64:s>95+w?s-32:s); } } } perror(*v); } diff --git a/2005/timwi/Makefile b/2005/timwi/Makefile new file mode 100644 index 000000000..5bebb85ae --- /dev/null +++ b/2005/timwi/Makefile @@ -0,0 +1,15 @@ + +build: timwi + +clean: + +clobber: + -rm timwi + +timwi: timwi.c + ${CC} ${CFLAGS} ${LDFLAGS} $< -o $@ + +alt: + +data: + diff --git a/2005/timwi/hint.text b/2005/timwi/hint.text new file mode 100644 index 000000000..429b66124 --- /dev/null +++ b/2005/timwi/hint.text @@ -0,0 +1,84 @@ +# Most discourteous interpreter + +Arne "Timwi" Heizmann +Germany +timwi@gmx.net + +## Judges' notes + +### To build + + cc timwi.c -o timwi + +### To run + + timwi < bf_program + +Unlike most BF interpreters that we have been receiving for the last few +years, this one, in our opinion, is the most obfuscated albeit the most +discourteous to the language it interprets. A simple 3-character fix will make +it slightly less so. + +Quite a few BF programs found on the Net expect byte-based memory, quite a few +exceed the capacity of this interpreter, but there are many that work. Some +small quines work, some don't. + +Why? + +## Selected notes from the author + +This is an interpreter for the programming language BrainFuck (BF). + +Input must be provided in the following format: First a sequence of integers +separated by whitespace (this will be the input to the BF program), then a +colon (:), then the BF program itself. + +Example: + + (echo "20 : ,-->+.>+.<<[>[>>+>+<<<-]>[>>+>+<<<-]>"; + + echo "[<+>-]>[<<<+>>>-]>[-]<<<<.<-]") | timwi + +This will print the first 20 Fibonacci numbers. + +You must not pass any command-line arguments. + +### Features + + * Supports the complete set of 8 BF instructions (+-<>[].,). + * Supports the use of alternative characters for some of those instructions. +Use this to obfuscate your BF programs! + +For a challenge, figure out what this obfuscated BF program does: + + J4mzt?Vazexx-20d~&&~AxdUV!x(~Jz&V)x*(P=J)JUN(dizz)xx_!xx'0&{Vz;}&Jj + +It takes two integers as input and outputs one integer. + + * Ignores all whitespace (newlines, spaces and tabs) in the input program. + +### Limitations + +Since the program, naturally, uses ints, the calculations must not exceed the +range of an int. (But then again, you can use the integer overflow to further +obfuscate your BF programs in creative ways!) + +You are limited to 3125 input integers and 3125 instructions. If you exceed +one of these limits, the behaviour is undefined. + +### Obfuscations + +Some of the superficial obfuscations are pretty obvious: I'm using #defines to +make everything look nice and liney, and the program is merely a recursive +main function with only a single 'return' statement which uses nested ternary +operators to make even the pre-processed code unreadable. + +However, the more subtle obfuscations relate to the way the program works. +After applying the pre-processing, you will see a lot of "1+1+1+...etc.", and +even if you replace these with their result, those numbers will still not +represent (or even relate to) the ASCII codes of the BF instructions. + +The program will first read in all the input integers, but it will begin +execution immediately and only read program instructions as they are needed. +Yet there is no global variable storing how far it has read! Perhaps the +hardest thing to figure out is how it finds the matching square brackets. diff --git a/2005/timwi/timwi.c b/2005/timwi/timwi.c new file mode 100644 index 000000000..d29f4d5d4 --- /dev/null +++ b/2005/timwi/timwi.c @@ -0,0 +1,26 @@ +#include +#define _ main( +#define _l ___l ___l ___l ___l ___) +#define __l int +#define ___l ___)*( +#define ____l (_l], +#define ____ 1 +#define ___ __+_____ +#define __ ____+____ +#define _____ __+____ +#define ______1 *(l__ +#define _____1 *__1%(__ +#define ____1 )?( +#define ___1 _1&(__ +__l __I[____l _I[____l*l__=_I,*l_=__I;__l _ __l _1,__l*__1){__l _l_; +return ___1+ __ ____1 ___1 ____1*__1 = getchar()):__ ____1*__1<____? +____:_____1+___ ____1 _____1+_____ ____1 _____1+____)____1 ___1+___+ +____ ____1 _____1 +__)____1 _____1 )____1 *l__)++:_____1+____)-____? +______1 ++) :_____1+_____) -____?__:printf("%d\n",*l__):_____1+____+ +___ ____1 *l__) =*(l_++ ):__:___l ____- ____):_____1 +_____)-3?__-2: +____:(___1+____+___ ____1 _____1)____1*l__)-- :_____1+__)?__:______1 +--):___l 0))?__:_ _1,__1+____)+____:(___1+____+___ )) &&* l__?_ ___1 ++___+___+__),__1+____)?_ ___1+11 )|(___1)?____:__- 2),__1):____-1 :( +_l_=_ ___1 -____+___l ____),__1+____ )) ?_l_+_ ___1 )?_1 :___1+10)|( +___1-____ ____1 __):0),__1+_l_):0):__:_1%(__ ____1 _1/(__)) ?_ scanf +("%i",__1 ____1 _____):(___l _____)-____,__1 +____):_ _____,l_):__;} diff --git a/2005/toledo/Makefile b/2005/toledo/Makefile new file mode 100644 index 000000000..94666cc28 --- /dev/null +++ b/2005/toledo/Makefile @@ -0,0 +1,18 @@ + +build: toledo + +clean: + +clobber: + -rm toledo toledo2 + +toledo: toledo.c + ${CC} ${CFLAGS} ${LDFLAGS} $< -o $@ + +alt: toledo2 + +toledo2: toledo2.c + ${CC} ${CFLAGS} ${LDFLAGS} $< -o $@ + +data: + diff --git a/2005/toledo/hint.text b/2005/toledo/hint.text new file mode 100644 index 000000000..5c2881aab --- /dev/null +++ b/2005/toledo/hint.text @@ -0,0 +1,117 @@ +# Best game + +Oscar Toledo G. +Familia Toledo +Av. Santa Cruz del Monte 9-304 +Ciudad Satelite Edo de Mexico +CP 53110 +Mexico +uno@biyubi.com + +## Judges' comments + +Challenge yourself with your ability to look 5, 6 or more moves ahead. +Challenge your knowledge of C operator precedence. The following the +move analysis via recursion while it executes moves. All while playing +by the rules of C and Chess within a single function! + +## Improved version + +Better mate searching + +### To build + + cc toledo.c -o toledo + +### To run + +For two human players + + toledo + +To play against the program + + toledo a + +## Author's comments + +### What does this program + +This is a chess program, it can work in two modes: two-players, and one player +(always white) against the machine. To get the first mode, run the program +without arguments: + + prog + +The other mode is accesible running the program with one argument (5-ply +analysis): + + prog a + +Two arguments for 6-ply analysis: + + prog a b + +And each succesive argument will analyze one ply more. There is no ply limit, +but beyond 7 ply is very slow, try it at your own risk and computing time. + +### Entering movements + +When is your turn, you can enter your move, by example, as "d2d4" (without the +quotes) and press the Enter key, the computer will check move legality and +will warn you of illegal moves. All legal chess moves are permitted. + +One special case is when you are doing promotion, you must enter the move with +an extra letter indicating the desired piece. + +By example "f7f8n" (supossing you have a pawn on f7), will promote it to a +knight, substitute 'n' for the desired piece (N/Q/R/B). + +Note that the program requires the piece letter, it will not select +automatically a queen, so don't be surprised if it doesn't accept your move. + +### Game status + +The computer will check for checkmate and stalemate, also after each machine +move, it will show the score of the position, an higher number is better for +the computer, i.e. worst for you. + +### Quirks + +None. + +### Program operation + +This is a good example of a chess program reduced to the essential. In order +to get it into the contest limits, I used short but slow and unintelligible +algorithms. + +The interface accounts for only a fraction of the code, the core does +multiples functions, it is called recursively to analyze and evaluate each +ply, does alpha-beta cutting, move generation, machine playing, check +detection, illegal move verification and does moves after they are verified. + +Also sets an standard on ultra-mini-chess programs, the player and the +computer can do all legal chess moves, other features are: + + * Illegal move verification. + * Checkmate detection. + * Stalemate detection. + * Computer is tough (check 7-ply), even in 5 ply can give a surprise to +amateur players. + +### Obsfucation tricks + + * Only one C function, really modular. + * Extensive use of the trinary and comma operators, save a hard drive today. + * Extensive use of C operator precedence, all good C programmers remember +it... I cannot. + * Exchanged operands every place is possible, someday someone will +understand it, + * Mixed and multifunction expressions on statements, in good old-BASIC +style. + * Macros used to hide C syntax, check unballanced parenthesis and calls with +empty arguments! + * Only includes strictly necessary standard headers, the linker takes care, +and compiles faster... but I'm still not seeing the difference. + * Uses only one string, very easy to I18N ;) diff --git a/2005/toledo/toledo.c b/2005/toledo/toledo.c new file mode 100644 index 000000000..cf98e3cbe --- /dev/null +++ b/2005/toledo/toledo.c @@ -0,0 +1,64 @@ +#define F getchar()) + #define H(z)*n++=z; + #include + #define v main(0,0,0 + #define Z while( + #define _ if( +#define o(d) (u[l]=0,l[d]=6^e,q=1e4>v,0),l[d]=0,u[l]=e^6,q) +#define I(H,n) { _ r=l[x=H],!r|(r^e)<-1){ _ j=u[l],-7==r|6==r\ +){ n; e=~e; return 1e5- f; } u[l]=0,t=j+1,i=j-1; _!i&89x)t=j,i=-7; Z++ix)*(9*O[28+i]-288))+O[r+28\ +]*9-288+O[x%10+33]-f-O[33+u%10]; x[l]=i; S|=(21=\ +=u|21==x)*2+(u==28|28==x)*4+(91==u|x==91)*16+32\ +*(u==98|x==98)+(20==d)*64*x; a-=k>f?main(a,f+1\ +,M,k):0; _ i==c&u==h&!f&N&a>-1e4&x==y)longjm\ +p(z,1); S=b; _!N|f&&(a>M||!f&a==M&&1&rand()\ +)){ _!f){ _ k){ c=i; h=u; y=x; } } else _ \ +L-aGK[_`fFDZXEYR" "L\t####" +"##B#A#@#G#F#E#D#K\t\3Zlv#tjm" "\3J#tjm\3Pwb" +"ofnbwf\3Joofdbo\3)&`&`.&`&`" "#+&g*\t"; G y, +c,h,e,S,*s,l[149]; jmp_buf z ; G main(G L,G f, +G N,G k){ G u=99,p,q,r,j,i,x ,t, a, b,d,M=-1e9 +; char *n; if( *l){ e=~e; Z u >21){ q= l[--u]^e; +_!-- q){ _!l[p=e?u-10:u+10]){ I(p,)_ e?u>80 & !l[p +-=10]:u<39&!l[p+=10])I(p,)} _ l[p=e?u-11:9+u] )I(p,) +else _ u-1==S>>6){ l[u-1]=0; I(p,l[u-1]=-2^e); } _ l[ +p=e?u-9:11+u])I(p,)else _ S>>6==1+u){ l[1+u]=0; I(p,l +[1+u]=e^-2); } } _!--q){ n=O+41; Z++n<50+O)I(u+80-*n, +)} _ 0q){ n=q==2?53+O:O+49; Z++nh|98(h+1 )% + 10); O[h++]^=3; } n=O +14; s=20+l; Z + ++s<29+l){ 10[s]=1; 70[s]=~ ( * s = * + n++ -+84); 60 [ s] =-2; } Z n=J){ puts + (58+O); u=19; Z++u<100){ H(32)_!( u%10 + ))H(32)H(O[7+l[u]])_(9+u)%10>7){ H(58 + -u/10)H(32)_ u&1)puts(n=J); } } puts + (O+58); _-1e4 >v , 1)){ e=~e; puts + (O+(v,0)> 1e4?e?90:82:96)); break + ; } _ 11&&u!=c + [O]); c=e^c-7; } } _! + setjmp(z)){ v+1,1); + puts( 106+ + O); } } Z + 10!= + F; } diff --git a/2005/toledo/toledo2.c b/2005/toledo/toledo2.c new file mode 100644 index 000000000..f58aaa991 --- /dev/null +++ b/2005/toledo/toledo2.c @@ -0,0 +1,64 @@ +#define F getchar()) + #define H(z)*n++=z; + #include + #define v main(0,0,0 + #define Z while( + #define _ if( +#define o(d)(S=63,l[d]=6^e,q=1e4>v,u[l]=0),l[d]=0,u[l]=e^6,S=b,q) +#define I(H,n) { _ r=l[x=H],!r|(r^e)<-1){ _ j=u[l],-7==r|6==r\ +){ n; e=~e; return 1e5-443*f; } u[l]=0,t=j+1,i=j-1; _!i&89<\ +x)i=j,t=6; _-1==t&30>x)t=j,i=-7; Z++ix)*(9*O[28+i]-288))+O[r+28\ +]*9-288+O[x%10+33]-f-O[33+u%10]; x[l]=i; S|=(21=\ +=u|21==x)*2+(u==28|28==x)*4+(91==u|x==91)*16+32\ +*(u==98|x==98)+(20==d)*64*x; a-=k>f?main(a,f+1\ +,M,k):0; _ i==c&u==h&!f&N&a>-1e4&x==y)longjm\ +p(z,1); S=b; _!N|f&&(a>M||!f&a==M&&1&rand()\ +)){ _!f){ _ k){ c=i; h=u; y=x; } } else _ \ +L-aGK[_`fFDZXEYR" "L\t####" +"##B#A#@#G#F#E#D#K\t\3Zlv#tjm" "\3J#tjm\3Pwb" +"ofnbwf\3Joofdbo\3)&`&`.&`&`" "#+&g*\t"; G y, +c,h,e,S,*s,l[149]; jmp_buf z ; G main(G L,G f, +G N,G k){ G u=99,p,q,r,j,i,x ,t,a,b=S,d,M=-1e9 +; char *n; if( *l){ e=~e; Z u >21){ q= l[--u]^e; +_!-- q){ _!l[p=e?u-10:u+10]){ I(p,)_ e?u>80 & !l[p +-=10]:u<39&!l[p+=10])I(p,)} _ l[p=e?u-11:9+u] )I(p,) +else _ u-1==S>>6){ l[u-1]=0; I(p,l[u-1]=-2^e); } _ l[ +p=e?u-9:11+u])I(p,)else _ S>>6==1+u){ l[1+u]=0; I(p,l +[1+u]=e^-2); } } _!--q){ n=O+41; Z++n<50+O)I(u+80-*n, +)} _ 0q){ n=q==2?53+O:O+49; Z++nh|98(h+1 )% + 10); O[h++]^=3; } n=O +14; s=20+l; Z + ++s<29+l){ 10[s]=1; 70[s]=~ ( * s = * + n++ -+84); 60 [ s] =-2; } Z n=J){ puts + (58+O); u=19; Z++u<100){ H(32)_!( u%10 + ))H(32)H(O[7+l[u]])_(9+u)%10>7){ H(58 + -u/10)H(32)_ u&1)puts(n=J); } } puts + (O+58); _-1e4 >v , 1)){ e=~e; puts + (O+(v,0)> 1e4?e?90:82:96)); break + ; } _ 11&&u!=c + [O]); c=e^c-7; } } _! + setjmp(z)){ v+1,1); + puts( 106+ + O); } } Z + 10!= + F; } diff --git a/2005/toledo/toledo3.c b/2005/toledo/toledo3.c new file mode 100644 index 000000000..b60e295f7 --- /dev/null +++ b/2005/toledo/toledo3.c @@ -0,0 +1,64 @@ +#define F getchar()) + #define H(z)*n++=z; + #include + #define v main(0,0,0 + #define Z while( + #define _ if( +#define o(d)(S=63,u[l]=0,l[d]=6^e,q=1e4>v,0),l[d]=0,u[l]=e^6,S=b,q) +#define I(H,n) { _ r=l[x=H],!r|(r^e)<-1){ _ j=u[l],-7==r|6==r\ +){ n; e=~e; return 1e5-443*f; } u[l]=0,t=j+1,i=j-1; _!i&89<\ +x)i=j,t=6; _-1==t&30>x)t=j,i=-7; Z++ix)*(9*O[28+i]-288))+O[r+28\ +]*9-288+O[x%10+33]-f-O[33+u%10]; x[l]=i; S|=(21=\ +=u|21==x)*2+(u==28|28==x)*4+(91==u|x==91)*16+32\ +*(u==98|x==98)+(20==d)*64*x; a-=k>f?main(a,f+1\ +,M,k):0; _ i==c&u==h&!f&N&a>-1e4&x==y)longjm\ +p(z,1); S=b; _!N|f&&(a>M||!f&a==M&&1&rand()\ +)){ _!f){ _ k){ c=i; h=u; y=x; } } else _ \ +L-aGK[_`fFDZXEYR" "L\t####" +"##B#A#@#G#F#E#D#K\t\3Zlv#tjm" "\3J#tjm\3Pwb" +"ofnbwf\3Joofdbo\3)&`&`.&`&`" "#+&g*\t"; G y, +c,h,e,S,*s,l[149]; jmp_buf z ; G main(G L,G f, +G N,G k){ G u=99,p,q,r,j,i,x ,t,a,b=S,d,M=-1e9 +; char *n; if( *l){ e=~e; Z u >21){ q= l[--u]^e; +_!-- q){ _!l[p=e?u-10:u+10]){ I(p,)_ e?u>80 & !l[p +-=10]:u<39&!l[p+=10])I(p,)} _ l[p=e?u-11:9+u] )I(p,) +else _ u-1==S>>6){ l[u-1]=0; I(p,l[u-1]=-2^e); } _ l[ +p=e?u-9:11+u])I(p,)else _ S>>6==1+u){ l[1+u]=0; I(p,l +[1+u]=e^-2); } } _!--q){ n=O+41; Z++n<50+O)I(u+80-*n, +)} _ 0q){ n=q==2?53+O:O+49; Z++nh|98(h+1 )% + 10); O[h++]^=3; } n=O +14; s=20+l; Z + ++s<29+l){ 10[s]=1; 70[s]=~ ( * s = * + n++ -+84); 60 [ s] =-2; } Z n=J){ puts + (58+O); u=19; Z++u<100){ H(32)_!( u%10 + ))H(32)H(O[7+l[u]])_(9+u)%10>7){ H(58 + -u/10)H(32)_ u&1)puts(n=J); } } puts + (O+58); _-1e4 >v , 1)){ e=~e; puts + (O+(v,0)> 1e4?e?90:82:96)); break + ; } _ 11&&u!=c + [O]); c=e^c-7; } } _! + setjmp(z)){ v+1,1); + puts( 106+ + O); } } Z + 10!= + F; } diff --git a/2005/vik/Makefile b/2005/vik/Makefile new file mode 100644 index 000000000..86d64a368 --- /dev/null +++ b/2005/vik/Makefile @@ -0,0 +1,15 @@ +LDFLAGS+=-L${X11_LIBDIR} -lX11 -lm +build: vik + +clean: + +clobber: + -rm vik + +vik: vik.c + ${CC} ${CFLAGS} ${LDFLAGS} $< -o $@ + +alt: + +data: + diff --git a/2005/vik/a.bmp b/2005/vik/a.bmp new file mode 100644 index 000000000..3c0e622a7 Binary files /dev/null and b/2005/vik/a.bmp differ diff --git a/2005/vik/b.bmp b/2005/vik/b.bmp new file mode 100644 index 000000000..18cd7821e Binary files /dev/null and b/2005/vik/b.bmp differ diff --git a/2005/vik/c.bmp b/2005/vik/c.bmp new file mode 100644 index 000000000..0aaf3458c Binary files /dev/null and b/2005/vik/c.bmp differ diff --git a/2005/vik/hint.text b/2005/vik/hint.text new file mode 100644 index 000000000..da2948587 --- /dev/null +++ b/2005/vik/hint.text @@ -0,0 +1,110 @@ +# Most circuitous walk + +Daniel Vik +926 Genter Street +La Jolla Ca 92037 +USA +daniel@vik.cc + +## Judges' comments + +An amazing use of the X libraries with twisty code passages, +all different. One risks running in code path circles as main is +called again and again. be sure to pay attention to commas! :-) + +### To build + + cc -O3 -ansi vik.c -L/usr/X11R6/lib -lX11 -lm -o vik + +### To run + + vik + vik maze.map + +## Author's comments + +This entry is a Wolfenstein style graphics engine where a user can navigate in +a 3D world. The maze has walls with bitmap textures. The application contains +a default world with textures, but the power of the engine is exposed through +user configured maps. User defined worlds support up to 26 different wall +textures that can even be animated. One example of a user defined world is +submitted with the entry. + +### Features + +This program is a complete 3D engine with + + * Easy configurable maze maps + * Up to 26 differnt bitmap textures in a maze + * Support for animated bitmap textures + * Uses default bitmaps in case the configured bitmaps can't be found + * A default map in case no one is specified + * Configurable window size + * Navigation using cursor keys (rotate left and right, move forward and +backward) + +### Build and Run + +Compile the source code and link x libraries if nessecary. The program takes +three options which have to be typed in a specific order as described below. + + Usage: prog [-w ] [mapfile] + width - Specifies the width of the window + mapfile - Filename containing a map + +Here are a few examples: + +> | Command line: | Description: | +> | ------------------------ | ---------------------- | +> | $ ./prog | Starts the engine using a built in labyrinth and texture bitmaps | +> | $ ./prog maze.map | Starts the engine and loads the labyrinth defined in the file maze.map | +> | $ ./prog -w 400 maze.map | Starts the engine using maze.map in a window that is 400 pixels wide | + +Note that the mapfile has to be the last argument and the -w option if present +has to be the first. The map definition files and the bitmap files should be +located in the current directory. + +Use the cursor keys to navigate through the labyrinth. + +### Creating mazes + +A maze consist of a map file and texture bitmap files. The map file is an +ascii text file where lower case letters represent walls. The letter tells the +engine what bitmap texture file to use. The '*' character lets the engine know +where to position the user. The example below shows how a map file can look: + + aaaaaaaaaaaaa + a a + a * a + a bbbb cccccccc + c c + cccccccccccccccccccc + +The engine loads the map, and creates walls. When a character 'a'-'z' is found, +the engine will load the corresponding texture bitmap. The bitmap file must be +named `*.bmp` where `*` is substituted with the letter of the wall in the map. + +So to load the map above, the files `a.bmp`, `b.bmp`, and `c.bmp` should be +located in the same directory as the engine executable (or rather in the +current directory). + +### Obfuscation + +The program is obfuscated in several ways, bad use of variables, use of the ? +operator, recursive calls to main, bad use of for variables and the comma +operator. To make the final obfuscated touch I ran indent which really made +the program unreadable (I guess that is not really the intent with indent ;) + +### Compiler warnings + +There are no compiler warnings when compiling with -ansi but there are quite +many warnings from lclint. Mainly because the program is very optimized for +code size. + +### Limitations + +The program only compiles and runs on X based systems. + +The program does not run that smooth under cygwin. It seems to be a priority +issue with cygwin and it can easily be solved by increasing the priority of +the application a little bit. diff --git a/2005/vik/maze.map b/2005/vik/maze.map new file mode 100644 index 000000000..a252758cd --- /dev/null +++ b/2005/vik/maze.map @@ -0,0 +1,18 @@ +aaaaaaaaaaaaaaaaaaaaaaaaa +a a +a b a +a * a +a a +aaaaa aaaaaaaa aaaaaaaaaaaa +ccccc c a a +c c a a +c c a a a +c ccccccca a a +c ca a a +c ca a a +c caaaaaa a a +c cccc ccccccaaaaaa a +c cccc ca a +c cb a +c ca a +ccccccccccccccccccccccaaaaaaaaaaaa \ No newline at end of file diff --git a/2005/vik/vik.c b/2005/vik/vik.c new file mode 100644 index 000000000..73a6a69c2 --- /dev/null +++ b/2005/vik/vik.c @@ -0,0 +1,109 @@ +#include +#include +#include +#include +#include +#include +Window L; +GC N; +Display *K; +XEvent O; +XImage *Q; +float w, x, y[7 << 16]; +struct timeval S, U; +int a, b, c, d = + 92, e, f, g, h, i, j, k, l, m, n, o, p, *q[96], r[7 << 16], s[96], *t, + *u = r, *v, P = 256, R[64], T, J = 12288; +struct +{ + int a, b, c, d, e; +} A[9999], *B, *G, *H; +unsigned char C, D[9999], *E = D, F[] = " .bmp"; +FILE *I; + +#define Q(o,X,Y,C)B->b=b+32*o,B->c=c+32*X,B->d=Y,B->e=C,B++->a=l, +#define D(o,X)(int)((X*(B->b-e)-o*(B->c-f))/(x*B->e-w*B->d)) + +int +main (int X, char **Y) +{ + for (j = J << 8, x = y[i], w = y[i + 32], B = A; k = D (x, w), B->b; + k >> 8 ? 0 : (l = D (B->d, B->e), l > 0 + && l < j) ? j = l, h = k, g = B->a : 0, B++); + for (; + X + && (p = + 1 | 3 * (o = (--X < 2 || 119 - 1[Y[1]] ? 320 : atoi (2[Y]))) / 4);) + { + for (e = f = J / 2, K = XOpenDisplay (0); m < o << 8; + y[m] = + sin ((m & 255) / 20.4 + asin ((m / P - o / 2) / 3.2 / o)), + D[m & 511] = 10 + d * !(1 & (m >> 3 & m)), r[m++] = + m / 18 << (16 & (m >> 6 ^ m))); + for (N = + XCreateGC (K, L = + XCreateSimpleWindow (K, RootWindow (K, 0), 0, 0, o, p, + 0, 0, 0), 0, 0), ((I = + fopen (X ? + Y[X] + : "", + "r")) ? + fread (E + 1, + 1, + 1 << 15, + I), + fclose (I) : + 0), B = G = + A + J / 3; *++E; f = l == 32 ? e = b + 99, c + 99 : f) + for (l = *E - 10, *F = *E, k = !l, b *= !k, c += P * k, b += P; + l > 54 && l < 96 + && (Q (0, 0, 1, 0) Q (8, 0, 0, 1) Q (8, 8, -1, 0) + Q (0, 8, 0, -1) + ! q[l] && (s[l] = 1, q[l] = u, I = fopen (F, "r"))); l = J) + for (q[l] = ++u + 19, m = 2; + n = (m++ % 3 ? n : 0 ** ++u) >> 8 | C << 16, *u = + n, 0 < fread (&C, 1, 1, I) + || (m /= J, s[l] = m ? m : 1) * fclose (I);); + for (XMapWindow (K, L), + XSelectInput (K, L, KeyPressMask | KeyReleaseMask), H = A; G->b; + *H = *G++, H += !B->b) + for (B = A + J / 3; + B->b && !(B != G && B->b == G->b - 128 * (B->d - G->d) + && B->c == G->c - 128 * (B->e - G->e)); B++); + for (Q = + XCreateImage (K, DefaultVisual (K, 0), DefaultDepth (K, 0), + ZPixmap, 0, (char *) (v = + malloc (4 * o * p)), o, p, + 32, 0); + d = (d + R[19] - R[17]) & 127, n = R[18] - R[20], n ? (i = + o * 128 + + d + (n < + 0) * + 64, main (0, + Y) + > + 200) ? e += + (int) (y[i] * 64), f += (int) (y[i + 32] * 64) : 1 : 1; + XSync (K, 0), gettimeofday (&S, 0), m = T - S.tv_usec) + { + for (T -= + (m > 0 + && m < J * 4 ? U.tv_usec = + m, select (0, 0, 0, 0, &U) : m) - 4 * J, a = + a + 1 & -1 >> 1, m = 0; + k = + 1 + + (int) (p * 512 / + ((i = m * P + d, g = n = + 0, main (0, Y)) * y[m * P + 32])), m < o; m++) + for (t = g ? c = + 64 * s[g], q[g] + h / 4 + 64 * (a / 3 % s[g]) : t; + l = 32 - (17 << (k < 2)) * (2 * n - p) / k, n < p; + v[m + o * n++] = l >> 6 ? 4477904 << (l < 0) : t[c * l]); + for (XPutImage (K, L, N, Q, 0, 0, 0, 0, o, p); XPending (K); + R[63 & XLookupKeysym (&O.xkey, 0 & XNextEvent (K, &O))] ^= + O.type == KeyPress || O.type == KeyRelease); + } + } + return j; +} diff --git a/2005/vince/Makefile b/2005/vince/Makefile new file mode 100644 index 000000000..534e58b04 --- /dev/null +++ b/2005/vince/Makefile @@ -0,0 +1,19 @@ +LDFLAGS+=-lGL -lGLU -L${X11_LIBDIR} -lX11 + +build: vince + +clean: + +clobber: + -rm vince vince.improved + +vince: vince.c + ${CC} ${CFLAGS} -I${X11_INCLUDEDIR} ${LDFLAGS} $< -o $@ + +alt: vince.improved + +vince.improved: vince.improved.c + ${CC} ${CFLAGS} -I${X11_INCLUDEDIR} ${LDFLAGS} $< -o $@ + +data: + diff --git a/2005/vince/hint.text b/2005/vince/hint.text new file mode 100644 index 000000000..416b03d77 --- /dev/null +++ b/2005/vince/hint.text @@ -0,0 +1,98 @@ +# Most beauteous visuals + +Vincent Weaver +Ithaca, NY +USA +vince@deater.net + + +## Judges' comments + +This beauteous entry makes use of visual {}'s and whitespace to instruct +the OpenGL development libraries to create beauteous visuals. Even +hitting the space bar while the program runs produces a "spacey" effect! :-) + +Challenge: Try modifying the texture to something of your own design. + +## Improved Version + +This following improved version of the submission will run on SGI Irix and +also has the recursive CPP macro (which snuck in accidentally) removed. + +### To build + +Before building, make sure that you have the OpenGL development libraries +installed. + + cc -Wall -O2 -o vince vince.c -L/usr/X11R6/lib -lGL -lGLU -lX11 + +If you are on a 64 bit platform you might need to substitute `-L/usr/X11R6/lib64`. + +### To run + + vince + +Under MacOSX run from within an xterm while the X11 server is running. + +## Author's comments + +### ABUSE OF RULES + + * The executable needs to read in its own source code in order to run. As +long as the source is in the same directory as the executable it should be +able to find it... + + * The program requires the OpenGL library. + + * The program abuses severely the whitespace and { } ; exceptions in the +filesize limits. + +### Requirements + + * OpenGL. It works (slowly) with Mesa. + + * 16bpp graphics capability (but might work at other depths) + + * The original source needs to be in the same directory as the executable, +and the source's name should be the same as the executable but with .c on the +end. + +### Background + +I was annoyed after the last IOCCC because I slaved away on a clever text +based game only to find all of the game winners used X11. X11 isn't standard +C! + +So to one up them, I decided to use OpenGL. It's standard, and most Unix-like +systems these days have either accelerated graphics or else software +rendering. + +### Obfuscation + +It was a challenge getting the source code below the 2k limit. OpenGL has way +too many GRATUITOUSLY_LONG_CONSTANTS and glLongStudlyFunctionNames(); + +Therefore, much of the obfuscation comes secondary to just reducing the code +size to fit under the limit while still having some semblance of a demo. + +There are some interesting abuses scattered about. + +### Usage + +Try hitting the spacebar when the program is running. + +### For Fun + +Try modifying the texture to your own custom design... + +### Thanks + +Many thanks to John Clemens for testing this on various machines for me. + +### Errors you can get + + 0 = no error + 1 = X problem + 2 = Can't open glx + 3 = Can't open 16bpp visual + 4 = can't open source file diff --git a/2005/vince/vince.c b/2005/vince/vince.c new file mode 100644 index 000000000..d758fbd92 --- /dev/null +++ b/2005/vince/vince.c @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include +#define E(x) { printf("%i\n",x); goto l; } +#define G fgetc(F) +#define H glEnable( +#define I glMaterialfv(GL_FRONT, +#define J glMatrixMode( +#define L (y +#define M 640,480 +#define N NULL +#define O GL_DIFFUSE , i +#define P glCallList(u); +#define T glTexCoord2i +#define U glLightfv(GL_LIGHT0, +#define V R(); glVertex3i(c,m,n); +#define X GL_TEXTURE_2D +#define Z(x) G; x=G; x=x<50-(x==59); + +void Y() +{ { { { { { { { { { { { { { { { + + { { { { { { { { { { { + { { { { { { + { { { { { { { { + { { { { { { + { { { { { ; { } } } } } + + + } } } } } } } + } } } } } } + } } } } } } + } } } } } } + } } } } } } } + +} } } } } } } } } } } } } } } } + +void Q() +{ { ; { { { { { { { { + { { { { { { +{ { { { { { +; { { } } } } } } } } +} ; } } } } } } } } } +} } } } } } + + + + FILE *F; int u,t,l,m,n,x=0,a=0,b[]={ GLX_DOUBLEBUFFER, + GLX_RGBA , GLX_DEPTH_SIZE , 16, None},o,n,c ; void R() { + Z(c); Z(m); Z(n); } int main( int _, char **A) { char f[ + BUFSIZ ] ; GLXContext r ; XVisualInfo * v ; Display *y; + XEvent e ; GLfloat g=0, h=10, i[ ]= { 1,1, 1, 1, 5,5, 100 + ,0, .6, .6, .6 ,1 } ; XSetWindowAttributes s; GLubyte j[1 + <<10] ; Window w; if(! L= XOpenDisplay ( N ) ) ) E(1) ;if + ( ! +glXQueryExtension L , N , N ) ) E (2); v=glXChooseVisual L , +DefaultScreen (y ) , b ) ; s.colormap = XCreateColormap L , +RootWindow (y,v -> screen), v -> visual, AllocNone ); if (!( +r= glXCreateContext L, v, N, 1) ) ) E (3) ; strcpy(f, *A ) ; +s.event_mask=KeyPressMask; strcat(f,".c"); F=fopen(f,"r" ) ; +w= XCreateWindow L, RootWindow( y, v -> screen ), M , M, 0,v +->depth,InputOutput, v->visual , CWColormap|CWEventMask, &s) +;glXMakeCurrent L , w , r ); H GL_DEPTH_TEST ); if ( ! F )E( +4 ) ; glShadeModel ( GL_SMOOTH ) ; while ( a != 89 ) a = G ; +G; G ; glGenTextures( 1, & t ); while ( x< 1024 ) { G; a =G; +j[ x++ ] = 128; j[ x++ ] = 128 & - ( a<33 ); j [ x ]= j[ x-1 +]; x++; j[x++] =-1;} glBindTexture(X,t); glTexParameteri (X, +GL_TEXTURE_MIN_FILTER , GL_NEAREST ) ; glTexImage2D( X ,0, +GL_RGBA, 16 , 16 , 0 , GL_RGBA, GL_UNSIGNED_BYTE , j ) ; J +GL_PROJECTION ) ; gluPerspective( 60 , 1.333 , 1 , 100) ; J +GL_MODELVIEW); u=glGenLists(1); glNewList(u,GL_COMPILE); H X +) ; while ( a != 81 ) a = G ; G ; G ; for (x=0; x<6; x++ ) { +glBegin(GL_QUADS); R(); glNormal3f( c, m,n); T(1,1); V T (1, +0 ) ; V T ( 0 , 0 ) ; V T( 0 , 1 ) ; V glEnd ( ) ; } +glEndList( ) ; XMapWindow L , w ) ; c = 0; for ( ; ; ) { if( +XPending L ) ) { XNextEvent L , &e ) ; if((XLookupKeysym ( ( +XKeyEvent *)&e,0))&1<<5){ h=10; i[c]=!i[c]; c++; c&=3; } else +E(0)} glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ; +glLoadIdentity(); gluLookAt ( -2 ,0 ,5 ,0,0 ,0,0 ,0 ,1 ) ; H +GL_LIGHTING); H GL_LIGHT0 ); U GL_POSITION, i + 4); U O) ; U +GL_SPECULAR,i); glLightModelfv( GL_LIGHT_MODEL_AMBIENT,i +8) +; I GL_AMBIENT, i+8); I O + 8 ) ; glRotatef( g, 1, 1, 1) ; P +glTranslatef(-h,0,0); P usleep (4000); g+=.07*x; if (g>360) +g-=360.0; h-=x /100.0; glFlush(); glXSwapBuffers L ,w);} + +l: +return 0; +} diff --git a/2005/vince/vince.improved.c b/2005/vince/vince.improved.c new file mode 100644 index 000000000..ee116f03b --- /dev/null +++ b/2005/vince/vince.improved.c @@ -0,0 +1,88 @@ +#include +#include +#include +#include +#include +#define E(x) { printf("%i\n",x); goto l; } +#define G fgetc(F) +#define H glEnable( +#define I glMaterialfv(GL_FRONT, +#define J glMatrixMode( +#define L (y +#define N NULL +#define O GL_DIFFUSE , i +#define P glCallList(u); +#define T glTexCoord2i +#define U glLightfv(GL_LIGHT0, +#define V R(); glVertex3i(c,m,n); +#define X GL_TEXTURE_2D + +void Y() +{ { { { { { { { { { { { { { { { + + { { { { { { { { { { { + { { { { { { + { { { { { { { { + { { { { { { + { { { { { ; { } } } } } + + + } } } } } } } + } } } } } } + } } } } } } + } } } } } } + } } } } } } } + +} } } } } } } } } } } } } } } } + +void Q() +{ { ; { { { { { { { { + { { { { { { +{ { { { { { +; { { } } } } } } } } +} ; } } } } } } } } } +} } } } } } + + + + FILE* F; void Z (int* x) { G; *x=G; *x=*x<50- (*x==59); } + int u,t,l,m,n,x=0, a=0,b[]={ GLX_DOUBLEBUFFER, GLX_RGBA , + GLX_DEPTH_SIZE,16, None},o,n,c; void R() { Z(&c); Z(&m ); + Z(&n ) ; } int main( int _, char **A) { char f [BUFSIZ ] ; + GLXContext r; XVisualInfo* v ; Display *y; GLfloat g=0 ,h= + 10, i[]= { 1,1, 1,1, 5,5, 100, 0, .6,.6,.6,1 } ; XEvent e ; + XSetWindowAttributes s; GLubyte j[ 1<<10] ; Window w,u; if( + ! L +=XOpenDisplay ( N ) ) ) E( 1 ) ; if ( ! glXQueryExtension L,N +,N ) ) E( 2 ) ; v = glXChooseVisual L , DefaultScreen (y ),b +); s. colormap = XCreateColormap L , u = RootWindow ( y , v-> +screen),v->visual, AllocNone ); if ( !(r=glXCreateContext L,v +,N , 1 ) ) ) E ( 3 ) ; strcpy (f , * A) ; strcat (f, ".c" ) ; +F = fopen ( f , "r" ) ; s . event_mask = KeyPressMask ; w = +XCreateWindow L,u, 0,0,640, 480,0,v -> depth, InputOutput , v +-> visual , CWBorderPixel | CWColormap | CWEventMask ,& s); +glXMakeCurrent L , w , r ) ; H GL_DEPTH_TEST ) ; if ( ! F )E( +4 ) ; glShadeModel ( GL_SMOOTH ) ; while ( a != 89 ) a = G ; +G; G ; glGenTextures( 1, & t ) ; while ( x< 1024 ) { G; a =G; +j[ x++ ] = 128; j[ x++ ] = 128 & - ( a<33 ); j [ x ]= j [ x-1 +]; x++; j[x++] = -1;} glBindTexture(X,t); glTexParameteri (X, +GL_TEXTURE_MIN_FILTER , GL_NEAREST ) ; glTexImage2D ( X ,0, +GL_RGBA, 16 , 16 , 0 , GL_RGBA, GL_UNSIGNED_BYTE , j ) ; J +GL_PROJECTION ) ; gluPerspective ( 60 , 1.333 , 1 , 100) ; J +GL_MODELVIEW); u=glGenLists(1); glNewList (u,GL_COMPILE); H X +); while(a!=81)a=G; G;G;for(x=0;x<6;x++){glBegin(GL_QUADS ) ; +R(); glNormal3f(c,m,n); T(1,1); V T(1,0); V T(0,0); V T(0 ,1) +; V glEnd(); } glEndList(); XMapWindow L, w) ; c=0; for(; ; ) +{ if (XPending L)){ XNextEvent L, &e); if ((XLookupKeysym ( ( +XKeyEvent *)&e,0))&1<<5){ h=10; i[c] =!i[c]; c++; c&=3; } else +E(0) } glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ; +glLoadIdentity (); gluLookAt ( -2 ,0 ,5 ,0,0 ,0,0 ,0 ,1 ) ; H +GL_LIGHTING); H GL_LIGHT0 ); U GL_POSITION, i + 4 ); U O) ; U +GL_SPECULAR, i); glLightModelfv( GL_LIGHT_MODEL_AMBIENT,i +8) +; I GL_AMBIENT, i+8 ); I O + 8 ) ; glRotatef( g, 1, 1, 1) ; P +glTranslatef (-h,0,0); P usleep (4000); g+=.07*x; if (g > 360) +g-=360.0; h-=x / 100.0; glFlush () ; glXSwapBuffers L, w); } + +l: +return 0; +} diff --git a/2006/2006.tar.bz2 b/2006/2006.tar.bz2 new file mode 100644 index 000000000..d74029ac1 Binary files /dev/null and b/2006/2006.tar.bz2 differ diff --git a/2006/Makefile b/2006/Makefile new file mode 100644 index 000000000..0a6e2679e --- /dev/null +++ b/2006/Makefile @@ -0,0 +1,118 @@ +# +# 2006 makefile +# +# Copyright (C) 2006-2009, Landon Curt Noll, Simon Cooper, Peter Seebach +# and Leonid A. Broukhis. All Rights Reserved. Permission for personal, +# educational or non-profit use is granted provided this copyright and +# notice are included in its entirety and remains unaltered. All other +# uses must receive prior permission from the contest judges. + + +# tool locations +# +SHELL= /bin/sh +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + + +# optimization +# +# Most compiles will safely use -O3. Some can use only -O2 or -O1 or -O. +# A few compilers have broken optimizers and thus you may +# not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + + +# default flags for ANSI C compilation +# +#CFLAGS= +#CFLAGS= -Wall -W -ansi +#CFLAGS= -Wall -W -ansi -pedantic +#CFLAGS= -Wall -W -ansi ${OPT} +CFLAGS= -Wall -W -ansi -pedantic ${OPT} + + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +MAY_NEED_GCC= gcc + + +# 2006 winners +# +WINNERS= birken borsanyi grothe hamre meyer monge night sloane stewart sykes1 \ + sykes2 toledo1 toledo2 toledo3 + + +# default build +# +build: + for i in ${WINNERS} ; do (cd $$i && ${MAKE} "ENTRY=$$i" "CC=${CC}" "X11_LIBDIR=${X11_LIBDIR}" "X11_INCDIR=${X11_INCDIR}" build) done + +# alternative executable +# +alt: + for i in ${WINNERS} ; do (cd $$i && ${MAKE} "ENTRY=$$i" "CC=${CC}" "CFLAGS=${CFLAGS}" "X11_LIBDIR=${X11_LIBDIR}" "X11_INCDIR=${X11_INCDIR}" alt) done + +# data files +# +data: + for i in ${WINNERS} ; do (cd $$i && ${MAKE} "ENTRY=$$i" data) done + + +# utility rules +# +everything: build alt data + +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +clean: + for i in ${WINNERS} ; do (cd $$i && ${MAKE} "ENTRY=$$i" clean) done + + +clobber: + for i in ${WINNERS} ; do (cd $$i && ${MAKE} "ENTRY=$$i" clobber) done + +nuke: clobber + @${TRUE} + +install: all + @${TRUE} + diff --git a/2006/README.text b/2006/README.text new file mode 100644 index 000000000..5e7be9c8a --- /dev/null +++ b/2006/README.text @@ -0,0 +1,81 @@ +2006 marked the "The Nineteenth International Obfuscated C Code Contest" +======================================================================== + +Copyright (C) 2006, Landon Curt Noll, Simon Cooper, and Leonid A. +Broukhis. All Rights Reserved. Permission for personal, educational +or non-profit use is granted provided this copyright and notice are +included in its entirety and remains unaltered. All other uses +must receive prior permission from the contest judges. + + +Standard IOCCC stuff +-------------------- + +The IOCCC has a web site and now has a number of international mirrors. +The primary site can be found at, + +> + +Use make to compile entries. It is possible that on non-Un*x / non-Linux +systems the makefile needs to be changed. See the Makefile for details. + +Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitters. + +Read over the makefile for compile/build issues. Your system may require +certain changes (add or remove a library, add or remove a #define). + +Some ANSI C compilers are not quite as good as they should be. If +yours is lacking, you may need to compile using gcc instead of your +local compiler. + + +Remarks on some of the entries +------------------------------ + +There were some outstanding entries that did not win. Unfortunately +some very good entries lost because they: + ++ depended too much on non-portable side effects in expressions; + ++ depended too much on a particular byte order; + ++ required the use of a special script, data file or pseudo-machine + language that was not supplied with the entry. + +We hope the authors of some of those entries will fix and re-submit +them for the next IOCCC. + +We believe you will be impressed with this year's winners. The Best +of Show is a fine example of (retro) obfuscation. But don't ignore the other +winners! There are games, puzzles, puzzle solvers, simulators, emulators, +calculators and graphical and audio tools. + +This year a single person won three awards and another two awards! Many +winners won for the first time. (Please note that judging is done completely +anonymously. Be warned that we may disqualify entries that reveal the identity +of the submitter). + +Final Comments +-------------- + +Please feel free to send us comments and suggestions about the +competition, this README or anything else that you would like to see in +future contests. + +If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used. + +If you have problems with any of the entries, AND YOU HAVE A FIX, please +send us the fix (patch file or the entire changed file). + +For the latest information on how to contact the IOCCC Judges please visit + +> + +For news of the next contest watch: + +> + diff --git a/2006/birken/Makefile b/2006/birken/Makefile new file mode 100644 index 000000000..e862d6727 --- /dev/null +++ b/2006/birken/Makefile @@ -0,0 +1,31 @@ +# 2006 makefile +# +# Copyright (C) 2006-2009, Landon Curt Noll, Simon Cooper, Peter Seebach +# and Leonid A. Broukhis. All Rights Reserved. Permission for personal, +# educational or non-profit use is granted provided this copyright and +# notice are included in its entirety and remains unaltered. All other +# uses must receive prior permission from the contest judges. + +# data files for this entry +# +DATA= adder.tofu buffer.tofu computer.tofu counter.tofu divider.tofu \ + lfsr.tofu memory.tofu multiplier.tofu multiplier2.tofu oneline.tofu \ + shift.tofu zuse.tofu zuse2.tofu + +build: ${ENTRY} + + +clean: + -${RM} ${ENTRY} + +clobber: clean + + +alt: + + +data: + + +${ENTRY}: ${ENTRY}.c ${DATA} + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} diff --git a/2006/birken/adder.tofu b/2006/birken/adder.tofu new file mode 100644 index 000000000..4a522c6c6 --- /dev/null +++ b/2006/birken/adder.tofu @@ -0,0 +1,72 @@ +# Buffer +def buf input output : + r input output 1 0 + +# Inverter +def inv input output : + r input output 0 1 + +# AND Gate +def and i1 i0 o : + r i0 z 1 0 + r i1 o z 0 + +# NAND Gate +def nand i0 i1 o : + r i0 1 0 o + r i1 1 0 o + +# OR Gate +def or i0 i1 o : + r i0 1 o 0 + r i1 1 o 0 + +# NOR Gate +def nor i0 i1 o : + r i0 1 0 z + r i1 z 0 o + +# XOR Gate +def xor i0 i1 o : + r i0 1 b a + r i1 o a b + +# XNOR Gate +def xnor i0 i1 o : + r i0 1 a b + r i1 o a b + +# Half Adder +def halfAdder a b s1 s0 : + and a b s1 + xor a b s0 + +# Full Adder +def fullAdder carryIn a b carryOut sum : + halfAdder a b s1 s0 + halfAdder s0 carryIn carry sum + or s1 carry carryOut + +# 2-bit Adder +def adder2 carryIn a1 a0 b1 b0 carryOut s1 s0 : + fullAdder carryIn a0 b0 carry s0 + fullAdder carry a1 b1 carryOut s1 + +# 4-bit Adder +def adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carryOut s3 s2 s1 s0 : + adder2 carryIn a1 a0 b1 b0 carry s1 s0 + adder2 carry a3 a2 b3 b2 carryOut s3 s2 + +# 8-bit Adder +def adder8 carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carry s3 s2 s1 s0 + adder4 carry a7 a6 a5 a4 b7 b6 b5 b4 carryOut s7 s6 s5 s4 + +# 57 + 142 = ? +run 100 1 adder8 0 + 0 0 1 1 1 0 0 1 + 1 0 0 0 1 1 1 0 + ? ? ? ? ? ? ? ? ? diff --git a/2006/birken/birken.c b/2006/birken/birken.c new file mode 100644 index 000000000..eb5398792 --- /dev/null +++ b/2006/birken/birken.c @@ -0,0 +1,133 @@ +#include +#include +#include +#define PI 314 +#define Z if +#define P a->b +#define Q else +#define W =f(); +#define X char +#define J while +#define N return +#define V struct e + +#define g(_,a)((_&&a)?!strcmp(_,a):0) +typedef V*d; V{ d o,_; X*b; int c; }; +d f() { d _=(d)malloc(sizeof(V)); _ +->b=0; _->o=_->_=0; _->c=1>>1>1; +N _; } d k,l,m,n,o,p,q,r; d j +() { d _=l; d a W a->o W +l->o=a; l W l-> _=_; +N a; } d u(d _, +X*a){ J(_){ +Z(g(a,_ +->b) +){ + N +_; +} _= +_->_; } +N 0; } d s +(X*q){ d _=n; Z +(g("q", q)){ N o; } +J(PI){ _=u(_,"cde"); _=_ +-> _ ; Z ( g (q, _->b) ){ N _ +->_ ; } } } void t(d a, d _) { d + S,I,M,U,L,A,T,O,R ; Z(a==o){ S W +S->o W m->o=S; I=m; m W m->_=I; _=_-> +_; J(_) { S->o->o=_->o; I=S->o; S->o W +S->o->_=I; _->o->o->o=S; I=_->o->o; _ +->o->o W _->o->o->_=I; _=_->_; } } +Q { M W _=_->_; J(57-*P){ U=M; U +->b=P; U->o=_->o; M W M->_=U; +_=_->_; a=a->_; } a=a->_ +; J(a&&!g("qtm",P)&& +!g("cde",P)){ L +=s (P); a=a +->_; A= +L; T + W +O= +T; +J(*L +->b-57){ R +=g("/",P)?j():g +(P,"0")?p:g("b",P)? +q:g(P,"j")?r:0; Z(!!!R){ +R=u(M,P); Z(!R) { R=j(); U=M; +U->b=P; U->o=R; M W M->_=U; } Q{ +R=R->o; } } O=O->_ W O->o=R; O->b=L +->b; L=L->_; a=a->_; } t(A, T); } } } +void h(d e){ d _,a,c, z=e->o->_; J(z){ +_=z->o; c=_->o->_; a= c->_->_->o; c=_ +->c?c->_->o :c->o; Z(c->cc) { c +->c++; h(c); } Q Z(a->cc){ a +->c++; h(a); } z=z->_; } } X* +v(X*_,int O){ X*s=(X*)m\ +alloc(strlen(_)*siz\ +eof(X)); X*l=s; +J((*l++=*_? +*_-O:0) +)_++ +;N +s; + } +/**/ +int ma\ +in(){d a,_ +,b;d T,O,F,U +, R, E, L, A, Y +; X c[PI],x[PI],w[PI],*y +,*B,*d,*K=v("Cvjme!dpnqmfuf;\ +!&e!dpnqpofout-!&e!opeft/\x0b",1 +),*e=v("&e;!&t\x0b\0nbjo)*|jou!j>1\ +b=i&4?v(";",2): +v("s",2); b=b->_ W } H=p->c=1; p +->o W r->o W q->o W a=n; J(g\ +ets(c)){ d=c; J(*d){ *d= +*d<65||*d>90 ?*d:*d+ +32; d++; } y=s\ +trchr(c,35) +; Z(y){ +*y=0 + ; + } + B +=st\ +rtok(c, +" "); J(B) +{ a=a->_ W P=v( +B,1); Z(g("qtm",P)) +{ _=a; } B=strtok(0," ") +; } } _=_->_; z=atoi(v(_->b,- +1)); _=_->_; C=atoi(v(_->b,-1)); +G=C; _=_->_; T=s(_->b); _=_->_; O W +F=O; U=k; J(_&&!g( "cde",_->b)){ i=*_ +->b; R=i-47?48-i?i-98?106-i?0:r:q:p:j( +); Z(!R){ R=j(); U=U->_ W U->o=R; } F += F->_ W F->o=R; _=_->_; } t(T, O); +E=m->_; J(E){ D++; E=E->_; } L=l +->_; J(L){ I++; L =L->_; } p\ +rintf(K,D,I); for(i='\'' +/'\''; z>i; i++){ J( +!--G){ G=C; H=1 +-H ; break; +} r->c= +! (q +-> +c= +H) +; L= +l->_; J +(L) { L->o +->c=!1; L=L->_; +} h(p); Z(q->c){ h( +q); } Q{ h(r); } E=m->_; +J(E){ A=E->o; A->c=A->o->_->_ +->_->_->o->c; E= E->_; } Y=k->_; +d=w; J(Y){ *d++=48+Y->o->c; Y=Y->_; +} *d=0; Z(!g(w,x)){ strcpy(x,w); pri\ +ntf (e, i, w ) ; } } N 0 ; } diff --git a/2006/birken/buffer.tofu b/2006/birken/buffer.tofu new file mode 100644 index 000000000..763ec955d --- /dev/null +++ b/2006/birken/buffer.tofu @@ -0,0 +1,5 @@ +# Buffer +def buf input output : + r input output 1 0 + +run 100 10 buf c ? diff --git a/2006/birken/computer.tofu b/2006/birken/computer.tofu new file mode 100644 index 000000000..9d34ee2a1 --- /dev/null +++ b/2006/birken/computer.tofu @@ -0,0 +1,799 @@ +# Harry Porter's Relay Computer + +# Buffer +def buf i o : + r i o 1 0 + +# Inverter +def inv i o : + r i o 0 1 + +# AND Gate +def and i0 i1 o : + r i0 1 z 0 + r i1 z o 0 + +# NAND Gate +def nand i0 i1 o : + r i0 1 0 o + r i1 1 0 o + +# OR Gate +def or i0 i1 o : + r i0 1 o 0 + r i1 1 o 0 + +# NOR Gate +def nor i0 i1 o : + r i0 1 0 z + r i1 z 0 o + +# XOR Gate +def xor i0 i1 o : + r i0 1 b a + r i1 o a b + +# XNOR Gate +def xnor i0 i1 o : + r i0 1 a b + r i1 o a b + +# Dual-rail-carry Full Adder (Konrad Zuse design) +def fullAdder carryIn carryInNeg a b carryOutNeg carryOut sum : + r a carryIn 2 3 + r a 1 3 4 + r a sum 5 7 + r a carryInNeg 4 6 + r b carryOut 3 2 + r b carryIn 5 7 + r b carryInNeg 7 5 + r b carryOutNeg 6 4 + +# 2-bit Full Adder +def fullAdder2 carryIn carryInNeg a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + fullAdder carryIn carryInNeg a0 b0 carryOutNeg0 carryOut0 s0 + fullAdder carryOut0 carryOutNeg0 a1 b1 carryOutNeg carryOut s1 + +# 4-bit Full Adder +def fullAdder4 carryIn carryInNeg a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + fullAdder2 carryIn carryInNeg a1 a0 b1 b0 carryOutNeg0 carryOut0 s1 s0 + fullAdder2 carryOut0 carryOutNeg0 a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# 8-bit Full Adder +def fullAdder8 + carryIn carryInNeg a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + fullAdder4 carryIn carryInNeg a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg0 carryOut0 s3 s2 s1 s0 + fullAdder4 carryOut0 carryOutNeg0 a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# Zero-Detect Circuit +def zeroDetector b7 b6 b5 b4 b3 b2 b1 b0 zero : + r b7 1 0 i6 + r b6 i6 0 i5 + r b5 i5 0 i4 + r b4 i4 0 i3 + r b3 i3 0 i2 + r b2 i2 0 i1 + r b1 i1 0 i0 + r b0 i0 0 zero + +# Enable Circuit +def enable enabled a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 : + r enabled a7 b7 0 + r enabled a6 b6 0 + r enabled a5 b5 0 + r enabled a4 b4 0 + r enabled a3 b3 0 + r enabled a2 b2 0 + r enabled a1 b1 0 + r enabled a0 b0 0 + +# Byte MUX +def muxByte + address + h7 h6 h5 h4 h3 h2 h1 h0 + l7 l6 l5 l4 l3 l2 l1 l0 + o7 o6 o5 o4 o3 o2 o1 o0 : + r address o7 h7 l7 + r address o6 h6 l6 + r address o5 h5 l5 + r address o4 h4 l4 + r address o3 h3 l3 + r address o2 h2 l2 + r address o1 h1 l1 + r address o0 h0 l0 + +# Byte AND +def andByte + enabled + b7 b6 b5 b4 b3 b2 b1 b0 + c7 c6 c5 c4 c3 c2 c1 c0 + o7 o6 o5 o4 o3 o2 o1 o0 : + and b7 c7 z7 + and b6 c6 z6 + and b5 c5 z5 + and b4 c4 z4 + and b3 c3 z3 + and b2 c2 z2 + and b1 c1 z1 + and b0 c0 z0 + enable enabled z7 z6 z5 z4 z3 z2 z1 z0 o7 o6 o5 o4 o3 o2 o1 o0 + +# Byte OR +def orByte + enabled + b7 b6 b5 b4 b3 b2 b1 b0 + c7 c6 c5 c4 c3 c2 c1 c0 + o7 o6 o5 o4 o3 o2 o1 o0 : + or b7 c7 z7 + or b6 c6 z6 + or b5 c5 z5 + or b4 c4 z4 + or b3 c3 z3 + or b2 c2 z2 + or b1 c1 z1 + or b0 c0 z0 + enable enabled z7 z6 z5 z4 z3 z2 z1 z0 o7 o6 o5 o4 o3 o2 o1 o0 + +# Byte XOR +def xorByte + enabled + b7 b6 b5 b4 b3 b2 b1 b0 + c7 c6 c5 c4 c3 c2 c1 c0 + o7 o6 o5 o4 o3 o2 o1 o0 : + xor b7 c7 z7 + xor b6 c6 z6 + xor b5 c5 z5 + xor b4 c4 z4 + xor b3 c3 z3 + xor b2 c2 z2 + xor b1 c1 z1 + xor b0 c0 z0 + enable enabled z7 z6 z5 z4 z3 z2 z1 z0 o7 o6 o5 o4 o3 o2 o1 o0 + +# Byte NOT +def notByte enabled b7 b6 b5 b4 b3 b2 b1 b0 o7 o6 o5 o4 o3 o2 o1 o0 : + inv b7 z7 + inv b6 z6 + inv b5 z5 + inv b4 z4 + inv b3 z3 + inv b2 z2 + inv b1 z1 + inv b0 z0 + enable enabled z7 z6 z5 z4 z3 z2 z1 z0 o7 o6 o5 o4 o3 o2 o1 o0 + +# Shift Left Circular Circuit +def shlByte enabled b7 b6 b5 b4 b3 b2 b1 b0 o7 o6 o5 o4 o3 o2 o1 o0 : + enable enabled b7 b6 b5 b4 b3 b2 b1 b0 o0 o7 o6 o5 o4 o3 o2 o1 + +# 2-to-4 Decoder +def decoder2to4 f1 f0 o3 o2 o1 o0 : + r f1 1 t1 n1 + r f0 t1 o3 o2 + r f0 n1 o1 o0 + +# 2-to-4 Decoder With Output Enable +def eDecoder2to4 enabled f1 f0 o3 o2 o1 o0 : + decoder2to4 f1 f0 z3 z2 z1 z0 + r enabled o3 z3 0 + r enabled o2 z2 0 + r enabled o1 z1 0 + r enabled o0 z0 0 + +# 3-to-8 Decoder +def decoder3to8 f2 f1 f0 o7 o6 o5 o4 o3 o2 o1 o0 : + r f2 1 t2 n2 + r f1 t2 t11 n11 + r f1 n2 t10 n10 + r f0 t11 o7 o6 + r f0 n11 o5 o4 + r f0 t10 o3 o2 + r f0 n10 o1 o0 + +# 3-to-8 Decoder With Output Enable +def eDecoder3to8 enabled f2 f1 f0 o7 o6 o5 o4 o3 o2 o1 o0 : + decoder3to8 f2 f1 f0 z7 z6 z5 z4 z3 z2 z1 z0 + enable enabled z7 z6 z5 z4 z3 z2 z1 z0 o7 o6 o5 o4 o3 o2 o1 o0 + +# 3-bit Flag Register +# B is bus, A for bulbs +def flagRegister + load select Bzero Bcarry Bsign + Azero Acarry Asign : + inv load loadNeg0 + inv load loadNeg1 + inv load loadNeg2 + buf load load2 + buf load2 select + r select Azero Bzero 0 + r select Acarry Bcarry 0 + r select Asign Bsign 0 + r Azero Azero loadNeg0 0 + r Acarry Acarry loadNeg1 0 + r Asign Asign loadNeg2 0 + +# 8-bit Register +# B is bus, A can feeds ALU and for bulbs +def register8 + load select b7 b6 b5 b4 b3 b2 b1 b0 + a7 a6 a5 a4 a3 a2 a1 a0 : + inv load loadNeg + buf load load2 + buf load2 select + enable select a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 + r a7 a7 loadNeg 0 + r a6 a6 loadNeg 0 + r a5 a5 loadNeg 0 + r a4 a4 loadNeg 0 + r a3 a3 loadNeg 0 + r a2 a2 loadNeg 0 + r a1 a1 loadNeg 0 + r a0 a0 loadNeg 0 + +# 16-bit Register +# B is bus, A for bulbs +def register16 + load select b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 : + inv load loadNeg + buf load load2 + buf load2 select + enable select a15 a14 a13 a12 a11 a10 a9 a8 b15 b14 b13 b12 b11 b10 b9 b8 + enable select a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 + r a15 a15 loadNeg 0 + r a14 a14 loadNeg 0 + r a13 a13 loadNeg 0 + r a12 a12 loadNeg 0 + r a11 a11 loadNeg 0 + r a10 a10 loadNeg 0 + r a9 a9 loadNeg 0 + r a8 a8 loadNeg 0 + r a7 a7 loadNeg 0 + r a6 a6 loadNeg 0 + r a5 a5 loadNeg 0 + r a4 a4 loadNeg 0 + r a3 a3 loadNeg 0 + r a2 a2 loadNeg 0 + r a1 a1 loadNeg 0 + r a0 a0 loadNeg 0 + +# High-low Register +# H/L/B buses, A for bulbs +def registerHighLow + loadHigh selectHigh + loadLow selectLow + load16 select16 + h7 h6 h5 h4 h3 h2 h1 h0 l7 l6 l5 l4 l3 l2 l1 l0 + b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 : + nor load16 loadHigh loadHighNeg + nor load16 loadLow loadLowNeg + buf loadHigh loadHigh2 + buf loadHigh2 selectHigh + buf loadLow loadLow2 + buf loadLow2 selectLow + buf load16 load162 + buf load162 select16 + enable selectLow a7 a6 a5 a4 a3 a2 a1 a0 l7 l6 l5 l4 l3 l2 l1 l0 + enable selectHigh a15 a14 a13 a12 a11 a10 a9 a8 h7 h6 h5 h4 h3 h2 h1 h0 + enable select16 a15 a14 a13 a12 a11 a10 a9 a8 b15 b14 b13 b12 b11 b10 b9 b8 + enable select16 a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 + r a15 a15 loadHighNeg 0 + r a14 a14 loadHighNeg 0 + r a13 a13 loadHighNeg 0 + r a12 a12 loadHighNeg 0 + r a11 a11 loadHighNeg 0 + r a10 a10 loadHighNeg 0 + r a9 a9 loadHighNeg 0 + r a8 a8 loadHighNeg 0 + r a7 a7 loadLowNeg 0 + r a6 a6 loadLowNeg 0 + r a5 a5 loadLowNeg 0 + r a4 a4 loadLowNeg 0 + r a3 a3 loadLowNeg 0 + r a2 a2 loadLowNeg 0 + r a1 a1 loadLowNeg 0 + r a0 a0 loadLowNeg 0 + +# Arithmetic Logic Unit +def ALU selectB loadB selectC loadC selectFlag loadFlag f2 f1 f0 + d7 d6 d5 d4 d3 d2 d1 d0 zero carry sign + b7 b6 b5 b4 b3 b2 b1 b0 + c7 c6 c5 c4 c3 c2 c1 c0 : + flagRegister loadFlag selectFlag zero carry sign Azero Acarry Asign + register8 loadB selectB d7 d6 d5 d4 d3 d2 d1 d0 b7 b6 b5 b4 b3 b2 b1 b0 + register8 loadC selectC d7 d6 d5 d4 d3 d2 d1 d0 c7 c6 c5 c4 c3 c2 c1 c0 + muxByte incSig 0 0 0 0 0 0 0 1 c7 c6 c5 c4 c3 c2 c1 c0 i7 i6 i5 i4 i3 i2 i1 i0 + decoder3to8 f2 f1 f0 0 shlSig notSig xorSig orSig andSig incSig addSig + fullAdder8 0 1 b7 b6 b5 b4 b3 b2 b1 b0 i7 i6 i5 i4 i3 i2 i1 i0 + 0 carryOut s7 s6 s5 s4 s3 s2 s1 s0 + or incSig addSig adderSig + enable adderSig s7 s6 s5 s4 s3 s2 s1 s0 d7 d6 d5 d4 d3 d2 d1 d0 + andByte andSig + b7 b6 b5 b4 b3 b2 b1 b0 c7 c6 c5 c4 c3 c2 c1 c0 d7 d6 d5 d4 d3 d2 d1 d0 + orByte orSig + b7 b6 b5 b4 b3 b2 b1 b0 c7 c6 c5 c4 c3 c2 c1 c0 d7 d6 d5 d4 d3 d2 d1 d0 + xorByte xorSig + b7 b6 b5 b4 b3 b2 b1 b0 c7 c6 c5 c4 c3 c2 c1 c0 d7 d6 d5 d4 d3 d2 d1 d0 + notByte notSig b7 b6 b5 b4 b3 b2 b1 b0 d7 d6 d5 d4 d3 d2 d1 d0 + shlByte shlSig b7 b6 b5 b4 b3 b2 b1 b0 d7 d6 d5 d4 d3 d2 d1 d0 + zeroDetector d7 d6 d5 d4 d3 d2 d1 d0 zeroOut + r loadFlag zero zeroOut 0 + r loadFlag carry carryOut 0 + r loadFlag sign d7 0 + +# 16-bit Incrementer +def incrementer + i15 i14 i13 i12 i11 i10 i9 i8 i7 i6 i5 i4 i3 i2 i1 i0 + o15 o14 o13 o12 o11 o10 o9 o8 o7 o6 o5 o4 o3 o2 o1 o0 : + fullAdder8 1 0 i7 i6 i5 i4 i3 i2 i1 i0 0 0 0 0 0 0 0 0 + carryOutNeg carryOut o7 o6 o5 o4 o3 o2 o1 o0 + fullAdder8 carryOut carryOutNeg i15 i14 i13 i12 i11 i10 i9 i8 0 0 0 0 0 0 0 0 + 0 0 o15 o14 o13 o12 o11 o10 o9 o8 + +# Latch, stores when w = 1 +def latch w d q : + r w c2 d q + r c2 q 1 0 + +# Latch, stores when w = 0 +def latchNeg w d q : + r w c2 q d + r c2 q 1 0 + +# Flip flop, stores when w rises to 1, expresses new value when w drops to 0 +def flipFlop w d q : + latch w d q2 + latchNeg w q2 q + +def trans enabled a b : + r enabled a b 0 + +# 2-bit transmission gate +def trans2 enabled a1 a0 b1 b0 : + trans enabled a1 b1 + trans enabled a0 b0 + +# 4-bit transmission gate +def trans4 enabled a3 a2 a1 a0 b3 b2 b1 b0 : + trans2 enabled a3 a2 b3 b2 + trans2 enabled a1 a0 b1 b0 + +# 8-bit transmission gate +def trans8 enabled a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 : + trans4 enabled a7 a6 a5 a4 b7 b6 b5 b4 + trans4 enabled a3 a2 a1 a0 b3 b2 b1 b0 + +# 2-to-1 Mux +def mux a i1 i0 o : + r a o i1 i0 + +# Multiplication program in ROM +def rom select d7 d6 d5 d4 d3 d2 d1 d0 a6 a5 a4 a3 a2 a1 a0 : + mux a0 ad0000001 ad0000000 ad000000 + mux a0 ad0000011 ad0000010 ad000001 + mux a0 ad0000101 ad0000100 ad000010 + mux a0 ad0000111 ad0000110 ad000011 + mux a0 ad0001001 ad0001000 ad000100 + mux a0 ad0001011 ad0001010 ad000101 + mux a0 ad0001101 ad0001100 ad000110 + mux a0 ad0001111 ad0001110 ad000111 + mux a0 ad0010001 ad0010000 ad001000 + mux a0 ad0010011 ad0010010 ad001001 + mux a0 ad0010101 ad0010100 ad001010 + mux a0 ad0010111 ad0010110 ad001011 + mux a0 ad0011001 ad0011000 ad001100 + mux a0 ad0011011 ad0011010 ad001101 + mux a0 ad0011101 ad0011100 ad001110 + mux a0 ad0011111 ad0011110 ad001111 + mux a0 ad0100001 ad0100000 ad010000 + mux a0 ad0100011 ad0100010 ad010001 + mux a0 ad0100101 ad0100100 ad010010 + mux a0 ad0100111 ad0100110 ad010011 + mux a0 ad0101001 ad0101000 ad010100 + mux a0 ad0101011 ad0101010 ad010101 + mux a0 ad0101101 ad0101100 ad010110 + mux a0 ad0101111 ad0101110 ad010111 + mux a0 ad0110001 ad0110000 ad011000 + mux a0 ad0110011 ad0110010 ad011001 + mux a0 ad0110101 ad0110100 ad011010 + mux a0 ad0110111 ad0110110 ad011011 + mux a0 ad0111001 ad0111000 ad011100 + mux a0 ad0111011 ad0111010 ad011101 + mux a0 ad0111101 ad0111100 ad011110 + mux a0 ad0111111 ad0111110 ad011111 + mux a0 ad1000001 ad1000000 ad100000 + mux a0 ad1000011 ad1000010 ad100001 + mux a1 ad000001 ad000000 ad00000 + mux a1 ad000011 ad000010 ad00001 + mux a1 ad000101 ad000100 ad00010 + mux a1 ad000111 ad000110 ad00011 + mux a1 ad001001 ad001000 ad00100 + mux a1 ad001011 ad001010 ad00101 + mux a1 ad001101 ad001100 ad00110 + mux a1 ad001111 ad001110 ad00111 + mux a1 ad010001 ad010000 ad01000 + mux a1 ad010011 ad010010 ad01001 + mux a1 ad010101 ad010100 ad01010 + mux a1 ad010111 ad010110 ad01011 + mux a1 ad011001 ad011000 ad01100 + mux a1 ad011011 ad011010 ad01101 + mux a1 ad011101 ad011100 ad01110 + mux a1 ad011111 ad011110 ad01111 + mux a1 ad100001 ad100000 ad10000 + mux a2 ad00001 ad00000 ad0000 + mux a2 ad00011 ad00010 ad0001 + mux a2 ad00101 ad00100 ad0010 + mux a2 ad00111 ad00110 ad0011 + mux a2 ad01001 ad01000 ad0100 + mux a2 ad01011 ad01010 ad0101 + mux a2 ad01101 ad01100 ad0110 + mux a2 ad01111 ad01110 ad0111 + mux a2 ad10001 ad10000 ad1000 + mux a3 ad0001 ad0000 ad000 + mux a3 ad0011 ad0010 ad001 + mux a3 ad0101 ad0100 ad010 + mux a3 ad0111 ad0110 ad011 + mux a3 ad1001 ad1000 ad100 + mux a4 ad001 ad000 ad00 + mux a4 ad011 ad010 ad01 + mux a4 ad101 ad100 ad10 + mux a5 ad01 ad00 ad0 + mux a5 ad11 ad10 ad1 + mux a6 ad1 ad0 select + trans8 ad0000000 d7 d6 d5 d4 d3 d2 d1 d0 1 1 0 0 0 0 0 0 + trans8 ad0000001 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 0 0 0 0 0 + trans8 ad0000010 d7 d6 d5 d4 d3 d2 d1 d0 0 1 0 0 0 0 0 1 + trans8 ad0000011 d7 d6 d5 d4 d3 d2 d1 d0 1 0 0 1 0 0 0 0 + trans8 ad0000100 d7 d6 d5 d4 d3 d2 d1 d0 0 0 1 1 0 0 0 0 + trans8 ad0000101 d7 d6 d5 d4 d3 d2 d1 d0 1 1 0 0 0 0 0 0 + trans8 ad0000110 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 0 0 0 0 0 + trans8 ad0000111 d7 d6 d5 d4 d3 d2 d1 d0 0 1 0 0 0 0 1 0 + trans8 ad0001000 d7 d6 d5 d4 d3 d2 d1 d0 1 0 0 1 0 0 0 0 + trans8 ad0001001 d7 d6 d5 d4 d3 d2 d1 d0 0 0 1 1 1 0 0 0 + trans8 ad0001010 d7 d6 d5 d4 d3 d2 d1 d0 0 0 1 0 0 1 0 0 + trans8 ad0001011 d7 d6 d5 d4 d3 d2 d1 d0 0 0 1 0 1 1 1 0 + trans8 ad0001100 d7 d6 d5 d4 d3 d2 d1 d0 0 1 0 1 1 0 0 1 + trans8 ad0001101 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 1 1 0 0 0 + trans8 ad0001110 d7 d6 d5 d4 d3 d2 d1 d0 0 1 1 0 0 0 0 0 + trans8 ad0001111 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 1 0 1 1 1 + trans8 ad0010000 d7 d6 d5 d4 d3 d2 d1 d0 1 0 0 0 0 0 1 1 + trans8 ad0010001 d7 d6 d5 d4 d3 d2 d1 d0 1 1 1 1 0 0 0 0 + trans8 ad0010010 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 0 0 0 0 0 + trans8 ad0010011 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 1 0 1 0 1 + trans8 ad0010100 d7 d6 d5 d4 d3 d2 d1 d0 0 0 1 0 1 0 0 1 + trans8 ad0010101 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 0 1 1 0 0 + trans8 ad0010110 d7 d6 d5 d4 d3 d2 d1 d0 1 0 0 0 0 1 1 0 + trans8 ad0010111 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 1 0 0 0 0 + trans8 ad0011000 d7 d6 d5 d4 d3 d2 d1 d0 0 1 1 1 1 1 1 0 + trans8 ad0011001 d7 d6 d5 d4 d3 d2 d1 d0 1 0 0 0 0 0 1 0 + trans8 ad0011010 d7 d6 d5 d4 d3 d2 d1 d0 0 0 1 0 0 0 0 0 + trans8 ad0011011 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 0 1 1 0 1 + trans8 ad0011100 d7 d6 d5 d4 d3 d2 d1 d0 1 0 0 0 0 1 0 1 + trans8 ad0011101 d7 d6 d5 d4 d3 d2 d1 d0 1 1 1 1 0 0 0 0 + trans8 ad0011110 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 0 0 0 0 0 + trans8 ad0011111 d7 d6 d5 d4 d3 d2 d1 d0 0 0 1 0 0 0 1 1 + trans8 ad0100000 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 0 1 1 0 0 + trans8 ad0100001 d7 d6 d5 d4 d3 d2 d1 d0 1 0 0 0 0 0 0 1 + trans8 ad0100010 d7 d6 d5 d4 d3 d2 d1 d0 0 0 1 0 0 0 0 0 + trans8 ad0100011 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 0 1 1 0 1 + trans8 ad0100100 d7 d6 d5 d4 d3 d2 d1 d0 1 0 0 0 0 1 1 0 + trans8 ad0100101 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 1 0 0 0 0 + trans8 ad0100110 d7 d6 d5 d4 d3 d2 d1 d0 0 1 1 1 1 1 1 0 + trans8 ad0100111 d7 d6 d5 d4 d3 d2 d1 d0 1 0 0 0 0 0 1 0 + trans8 ad0101000 d7 d6 d5 d4 d3 d2 d1 d0 0 0 1 0 1 0 0 0 + trans8 ad0101001 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 0 1 1 1 1 + trans8 ad0101010 d7 d6 d5 d4 d3 d2 d1 d0 1 0 0 0 0 1 1 0 + trans8 ad0101011 d7 d6 d5 d4 d3 d2 d1 d0 0 0 1 1 1 0 0 0 + trans8 ad0101100 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 0 1 1 1 1 + trans8 ad0101101 d7 d6 d5 d4 d3 d2 d1 d0 1 0 0 0 0 1 0 1 + trans8 ad0101110 d7 d6 d5 d4 d3 d2 d1 d0 1 1 1 1 0 0 0 0 + trans8 ad0101111 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 0 0 0 0 0 + trans8 ad0110000 d7 d6 d5 d4 d3 d2 d1 d0 0 0 1 1 1 0 1 1 + trans8 ad0110001 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 0 1 1 0 1 + trans8 ad0110010 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 1 0 1 1 0 + trans8 ad0110011 d7 d6 d5 d4 d3 d2 d1 d0 1 0 0 0 0 0 0 0 + trans8 ad0110100 d7 d6 d5 d4 d3 d2 d1 d0 0 0 1 0 1 0 0 0 + trans8 ad0110101 d7 d6 d5 d4 d3 d2 d1 d0 1 1 1 0 1 0 0 0 + trans8 ad0110110 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 0 0 0 0 0 + trans8 ad0110111 d7 d6 d5 d4 d3 d2 d1 d0 0 0 1 1 1 0 1 1 + trans8 ad0111000 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 0 1 1 0 0 + trans8 ad0111001 d7 d6 d5 d4 d3 d2 d1 d0 1 0 0 0 0 0 0 1 + trans8 ad0111010 d7 d6 d5 d4 d3 d2 d1 d0 0 0 1 0 0 0 0 0 + trans8 ad0111011 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 0 1 0 1 1 + trans8 ad0111100 d7 d6 d5 d4 d3 d2 d1 d0 1 0 0 0 1 0 0 1 + trans8 ad0111101 d7 d6 d5 d4 d3 d2 d1 d0 1 1 1 0 0 0 1 0 + trans8 ad0111110 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 0 0 0 0 0 + trans8 ad0111111 d7 d6 d5 d4 d3 d2 d1 d0 0 0 0 1 0 1 0 1 + trans8 ad1000000 d7 d6 d5 d4 d3 d2 d1 d0 1 0 1 0 1 1 1 0 + trans8 ad1000001 d7 d6 d5 d4 d3 d2 d1 d0 1 1 0 1 1 1 0 1 + trans8 ad1000010 d7 d6 d5 d4 d3 d2 d1 d0 1 0 1 1 0 0 1 1 + +# Putting it all together +def computer + ra7 ra6 ra5 ra4 ra3 ra2 ra1 ra0 + rb7 rb6 rb5 rb4 rb3 rb2 rb1 rb0 + rc7 rc6 rc5 rc4 rc3 rc2 rc1 rc0 + rd7 rd6 rd5 rd4 rd3 rd2 rd1 rd0 + m15 m14 m13 m12 m11 m10 m9 m8 m7 m6 m5 m4 m3 m2 m1 m0 + xy15 xy14 xy13 xy12 xy11 xy10 xy9 xy8 xy7 xy6 xy5 xy4 xy3 xy2 xy1 xy0 : + rom selectMemory d7 d6 d5 d4 d3 d2 d1 d0 a6 a5 a4 a3 a2 a1 a0 + register16 loadPC selectPC + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + pc15 pc14 pc13 pc12 pc11 pc10 pc9 pc8 pc7 pc6 pc5 pc4 pc3 pc2 pc1 pc0 + registerHighLow loadIN 0 loadIN 0 0 selectIN + ic15 ic14 ic13 ic12 ic11 ic10 ic9 ic8 ic7 ic6 ic5 ic4 ic3 ic2 ic1 ic0 + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + in15 in14 in13 in12 in11 in10 in9 in8 in7 in6 in5 in4 in3 in2 in1 in0 + incrementer + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + ic15 ic14 ic13 ic12 ic11 ic10 ic9 ic8 ic7 ic6 ic5 ic4 ic3 ic2 ic1 ic0 + ALU selectB loadB selectC loadC selectFlag loadFlag + alu2 alu1 alu0 + d7 d6 d5 d4 d3 d2 d1 d0 zero carry sign + rb7 rb6 rb5 rb4 rb3 rb2 rb1 rb0 + rc7 rc6 rc5 rc4 rc3 rc2 rc1 rc0 + register8 loadA selectA + d7 d6 d5 d4 d3 d2 d1 d0 ra7 ra6 ra5 ra4 ra3 ra2 ra1 ra0 + register8 loadD selectD + d7 d6 d5 d4 d3 d2 d1 d0 rd7 rd6 rd5 rd4 rd3 rd2 rd1 rd0 + register8 loadInst selectInst + d7 d6 d5 d4 d3 d2 d1 d0 ns7 ns6 ns5 ns4 ns3 ns2 ns1 ns0 + registerHighLow loadM1 selectM1 loadM2 selectM2 loadM selectM + d7 d6 d5 d4 d3 d2 d1 d0 d7 d6 d5 d4 d3 d2 d1 d0 + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + m15 m14 m13 m12 m11 m10 m9 m8 m7 m6 m5 m4 m3 m2 m1 m0 + registerHighLow loadJ1 selectJ1 loadJ2 selectJ2 loadJ selectJ + d7 d6 d5 d4 d3 d2 d1 d0 d7 d6 d5 d4 d3 d2 d1 d0 + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + j15 j14 j13 j12 j11 j10 j9 j8 j7 j6 j5 j4 j3 j2 j1 j0 + registerHighLow loadX selectX loadY selectY loadXY selectXY + d7 d6 d5 d4 d3 d2 d1 d0 d7 d6 d5 d4 d3 d2 d1 d0 + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + xy15 xy14 xy13 xy12 xy11 xy10 xy9 xy8 xy7 xy6 xy5 xy4 xy3 xy2 xy1 xy0 + + # BOOT (starts as 0, locks into 1 forever) + flipFlop C 1 boot + inv boot bootNeg + + # PC = 0 + flipFlop C bootNeg state4 + buf state4 loadPC + buf state4 mainLoop + + # -- COPY INSTRUCTION IN MEMORY TO INSTRUCTION REGISTER BEGIN ---------------- + flipFlop C mainLoop stateMainLoop + + flipFlop C stateMainLoop state5 + buf state5 selectPC + + flipFlop C state5 state6 + buf state6 selectPC + buf state6 selectMemory + buf state6 loadInst + buf state6 loadIN # IN = PC + 1 + + flipFlop C state6 state7 + buf state7 selectPC + buf state7 selectMemory + + flipFlop C state7 state8 + buf state8 loadPC # PC = IN + buf state8 selectIN + + flipFlop C state8 state9 + buf state9 selectIN + buf state9 processInst + # -- COPY INSTRUCTION IN MEMORY TO INSTRUCTION REGISTER END ------------------ + + # -- RETURN (1010 dss0) BEGIN ------------------------------------------------ + r ns7 rt7 processInst 0 + r ns6 rt6 0 rt7 + r ns5 rt5 rt6 0 + r ns4 rt4 0 rt5 + flipFlop C rt4 state38 + buf state38 state38b + buf state38 state38c + r ns3 state38c loadPC loadXY + eDecoder2to4 state38b ns2 ns1 halt selectJ selectXY selectM + + flipFlop C state38 state39 + buf state39 state38b + inv halt haltNeg + and haltNeg state39 mainLoop + # -- RETURN (1010 dss0) END -------------------------------------------------- + + # -- 16-BIT INSTRUCTION (11rs cznx) BEGIN ------------------------------------ + r ns7 nx7 processInst 0 + r ns6 nx6 nx7 0 + flipFlop C nx6 state24b + buf state24b selectPC + + flipFlop C state24b state25 + buf state25 selectPC + buf state25 selectMemory + buf state25 state25b + r ns5 state25b loadJ1 loadM1 # M1/J1 <- MEM + buf state25 loadIN # IN = PC + 1 + + flipFlop C state25 state26 + buf state26 selectPC + buf state26 selectMemory + + flipFlop C state26 state27 + buf state27 loadPC # PC = IN + buf state27 selectIN + + flipFlop C state27 state28 + buf state28 selectIN + + flipFlop C state28 state29 + buf state29 selectPC + buf state29 selectMemory + buf state29 state29b + r ns5 state29b loadJ2 loadM2 # M2/J2 <- MEM + buf state29 loadIN # IN = PC + 1 + + flipFlop C state29 state30 + buf state30 selectPC + buf state30 selectMemory + + flipFlop C state30 state31 + buf state31 loadPC # PC = IN + buf state31 selectIN + + flipFlop C state31 state35 + buf state35 selectFlag + inv carry carryNeg + inv zero zeroNeg + and ns4 sign jmp0 + and ns3 carryNeg jmp1 + and ns2 zero jmp2 + and ns1 zeroNeg jmp3 + buf jmp0 jmp + buf jmp1 jmp + buf jmp2 jmp + buf jmp3 jmp + inv jmp jmpNeg + and state35 jmp doJump + and state35 jmpNeg mainLoop + + flipFlop C doJump state32 + inv ns0 ns0neg + and state32 ns0 savePC + and state32 ns0neg dontSavePC + + flipFlop C savePC state33 + buf state33 selectPC + buf state33 loadXY # XY = PC + + flipFlop C state33 state34 + buf state34 selectPC + buf state34 dontSavePC + + flipFlop C dontSavePC state36 + buf state36 state36b + r ns5 state36b selectJ selectM + buf state36 loadPC # PC = M/J + + flipFlop C state36 state37 + buf state37 state36b + buf state37 mainLoop + # -- 16-BIT INSTRUCTION (11rs cznx) END -------------------------------------- + + # -- INC XY (1011 0000) BEGIN ------------------------------------------------ + r ns7 ix7 processInst 0 + r ns6 ix6 0 ix7 + r ns5 ix5 ix6 0 + r ns4 ix4 ix5 0 + r ns3 ix3 0 ix4 + r ns2 ix2 0 ix3 + r ns1 ix1 0 ix2 + r ns0 ix0 0 ix1 + flipFlop C ix0 state21 + buf state21 selectXY + buf state21 loadIN + + flipFlop C state21 state22 + buf state22 selectXY + + flipFlop C state22 state23 + buf state23 loadXY + buf state23 selectIN + + flipFlop C state23 state24 + buf state24 selectIN + buf state24 mainLoop + # -- INC XY (1011 0000) END -------------------------------------------------- + + # -- ALU (1000 rfff) BEGIN --------------------------------------------------- + r ns7 al7 processInst 0 + r ns6 al6 0 al7 + r ns5 al5 0 al6 + r ns4 al4 0 al5 + flipFlop C al4 state19 + buf state19 aluing + r aluing alu2 ns2 1 + r aluing alu1 ns1 1 + r aluing alu0 ns0 1 + buf state19 loadFlag + buf state19 state19b + r ns3 state19b loadD loadA + + flipFlop C state19 state20 + buf state20 aluing + buf state20 mainLoop + # -- ALU (1000 rfff) END ----------------------------------------------------- + + # -- LD (1001 0xrr) BEGIN ---------------------------------------------------- + r ns3 ld3 0 sto4 + flipFlop C ld3 state17 + buf state17 selectM + buf state17 selectMemory + eDecoder2to4 state17 ns1 ns0 loadD loadC loadB loadA + + flipFlop C state17 state18 + buf state18 selectM + buf state18 selectMemory + buf state18 mainLoop + # -- LD (1001 0xrr) END ------------------------------------------------------ + + # -- STO (1001 1xrr) BEGIN --------------------------------------------------- + r ns7 sto7 processInst 0 + r ns6 sto6 0 sto7 + r ns5 sto5 0 sto6 + r ns4 sto4 sto5 0 + r ns3 sto3 sto4 0 + flipFlop C sto3 state14 + buf state14 storing + buf storing selectM + eDecoder2to4 storing ns1 ns0 selectD selectC selectB selectA + + flipFlop C state14 state15 + buf state15 storing + buf state15 loadMemory + + flipFlop C state15 state16 + buf state16 storing + buf state16 mainLoop + # -- STO (1001 1xrr) END ----------------------------------------------------- + + # -- MOV (00dd dsss) BEGIN --------------------------------------------------- + r ns7 mo7 0 processInst + r ns6 mo6 0 mo7 + flipFlop C mo6 state12 + or state12 state13 movSrc + eDecoder3to8 state12 ns5 ns4 ns3 + loadY loadX loadM2 loadM1 loadD loadC loadB loadA + eDecoder3to8 movSrc ns2 ns1 ns0 + selectY selectX selectM2 selectM1 selectD selectC selectB selectA + + flipFlop C state12 state13 + buf state13 mainLoop + # -- MOV (00dd dsss) END ----------------------------------------------------- + + # -- SET-8 (01rv vvvv) BEGIN ------------------------------------------------- + r ns7 se7 0 processInst + r ns6 se6 se7 0 + flipFlop C se6 state10 + buf state10 state10load + r ns5 state10load loadB loadA + or state10 state11 enable1011 + enable enable1011 ns4 ns4 ns4 ns4 ns3 ns2 ns1 ns0 d7 d6 d5 d4 d3 d2 d1 d0 + + flipFlop C state10 state11 + buf state11 mainLoop + # -- SET-8 (01rv vvvv) END --------------------------------------------------- + +run 41000 10 computer + ? ? ? ? ? ? ? ? + ? ? ? ? ? ? ? ? + ? ? ? ? ? ? ? ? + ? ? ? ? ? ? ? ? + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \ No newline at end of file diff --git a/2006/birken/counter.tofu b/2006/birken/counter.tofu new file mode 100644 index 000000000..3c9f0ffb9 --- /dev/null +++ b/2006/birken/counter.tofu @@ -0,0 +1,311 @@ +# Four double-pole relay +def r4 coil l3 nd3 nc3 l2 nd2 nc2 l1 nd1 nc1 l0 nd0 nc0 : + r coil l3 nd3 nc3 + r coil l2 nd2 nc2 + r coil l1 nd1 nc1 + r coil l0 nd0 nc0 + +# Buffer +def buf input output : + r input output 1 0 + +# Inverter +def inv input output : + r input output 0 1 + +# AND Gate +def and i1 i0 o : + r i0 z 1 0 + r i1 o z 0 + +# NAND Gate +def nand i0 i1 o : + r i0 1 0 o + r i1 1 0 o + +# OR Gate +def or i0 i1 o : + r i0 1 o 0 + r i1 1 o 0 + +# NOR Gate +def nor i0 i1 o : + r i0 1 0 z + r i1 z 0 o + +# XOR Gate +def xor i0 i1 o : + r i0 1 b a + r i1 o a b + +# XNOR Gate +def xnor i0 i1 o : + r i0 1 a b + r i1 o a b + +# Half Adder +def halfAdder a b s1 s0 : + and a b s1 + xor a b s0 + +# Full Adder +def fullAdder carryIn a b carryOut sum : + halfAdder a b s1 s0 + halfAdder s0 carryIn carry sum + or s1 carry carryOut + +# 2-bit Adder +def adder2 carryIn a1 a0 b1 b0 carryOut s1 s0 : + fullAdder carryIn a0 b0 carry s0 + fullAdder carry a1 b1 carryOut s1 + +# 4-bit Adder +def adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carryOut s3 s2 s1 s0 : + adder2 carryIn a1 a0 b1 b0 carry s1 s0 + adder2 carry a3 a2 b3 b2 carryOut s3 s2 + +# 8-bit Adder +def adder8 carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carry s3 s2 s1 s0 + adder4 carry a7 a6 a5 a4 b7 b6 b5 b4 carryOut s7 s6 s5 s4 + +# Konrad Zuse Dual-Rail-Carry Full Adder +def zuseFullAdder carryInNeg carryIn a b carryOutNeg carryOut sum : + r4 a carryInNeg y z sum w x 1 v y carryIn u v + r4 b carryOutNeg z y carryInNeg x w carryIn w x carryOut v u + +# Konrad Zuse Dual-Rail-Carry 2-bit Adder +def zuseAdder2 carryInNeg carryIn a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + zuseFullAdder carryInNeg carryIn a0 b0 cOutNeg cOut s0 + zuseFullAdder cOutNeg cOut a1 b1 carryOutNeg carryOut s1 + +# Konrad Zuse Dual-Rail-Carry 4-bit Adder +def zuseAdder4 carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + zuseAdder2 carryInNeg carryIn a1 a0 b1 b0 cOutNeg cOut s1 s0 + zuseAdder2 cOutNeg cOut a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# Konrad Zuse Dual-Rail-Carry 8-bit Adder +def zuseAdder8 carryInNeg carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + zuseAdder4 carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 cOutNeg cOut s3 s2 s1 s0 + zuseAdder4 cOutNeg cOut a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# 1-bit Partial Adder/Subtractor +def xFullAdder subtract carryInNeg carryIn a b carryOutNeg carryOut sum : + xor subtract b bNeg + zuseFullAdder carryInNeg carryIn a bNeg carryOutNeg carryOut sum + +# 2-bit Partial Adder/Subtractor +def xFullAdder2 subtract carryInNeg carryIn + a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + xFullAdder subtract carryInNeg carryIn a0 b0 cOutNeg cOut s0 + xFullAdder subtract cOutNeg cOut a1 b1 carryOutNeg carryOut s1 + +# 4-bit Partial Adder/Subtractor +def xFullAdder4 subtract carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + xFullAdder2 subtract carryInNeg carryIn a1 a0 b1 b0 cOutNeg cOut s1 s0 + xFullAdder2 subtract cOutNeg cOut a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# 8-bit Partial Adder/Subtractor +def xFullAdder8 subtract carryInNeg carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + xFullAdder4 subtract carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + cOutNeg cOut s3 s2 s1 s0 + xFullAdder4 subtract cOutNeg cOut a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# 8-bit Adder/Subtractor +def adderSubtractor subtract + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + inv subtract carryInNeg + xFullAdder8 subtract carryInNeg subtract + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg cOut s7 s6 s5 s4 s3 s2 s1 s0 + xor cOut subtract carryOut + +# 2-to-1 Mux +def mux a i1 i0 o : + r a o i1 i0 + +# 4-to-1 Mux +def mux4to1 a1 a0 i3 i2 i1 i0 o : + mux a0 i1 i0 x + mux a0 i3 i2 y + mux a1 y x o + +# 8-to-1 Mux +def mux8to1 a2 a1 a0 i7 i6 i5 i4 i3 i2 i1 i0 o : + mux4to1 a1 a0 i3 i2 i1 i0 x + mux4to1 a1 a0 i7 i6 i5 i4 y + mux a2 y x o + +# 3-to-8 Decoder +def decoder3to8 a2 a1 a0 o7 o6 o5 o4 o3 o2 o1 o0 : + mux8to1 a2 a1 a0 o7 o6 o5 o4 o3 o2 o1 o0 1 + +def trans enabled a b : + r enabled a b 0 + +# 2-bit transmission gate +def trans2 enabled a1 a0 b1 b0 : + trans enabled a1 b1 + trans enabled a0 b0 + +# 4-bit transmission gate +def trans4 enabled a3 a2 a1 a0 b3 b2 b1 b0 : + trans2 enabled a3 a2 b3 b2 + trans2 enabled a1 a0 b1 b0 + +# 8-bit transmission gate +def trans8 enabled a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 : + trans4 enabled a7 a6 a5 a4 b7 b6 b5 b4 + trans4 enabled a3 a2 a1 a0 b3 b2 b1 b0 + +# 16-bit transmission gate +def trans16 enabled + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 : + trans8 enabled a15 a14 a13 a12 a11 a10 a9 a8 b15 b14 b13 b12 b11 b10 b9 b8 + trans8 enabled a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 + +# Latch, stores when w = 1 +def latch w d q : + mux w d q z + buf z q + +# Latch, stores when w = 0 +def latchNeg w d q : + mux w q d z + buf z q + +# Flip flop, stores when w rises to 1, expresses new value when w drops to 0 +def flipFlop w d q : + latch w d q2 + latchNeg w q2 q + +def flipFlopRegister w d7 d6 d5 d4 d3 d2 d1 d0 q7 q6 q5 q4 q3 q2 q1 q0: + flipFlop w d7 q7 + flipFlop w d6 q6 + flipFlop w d5 q5 + flipFlop w d4 q4 + flipFlop w d3 q3 + flipFlop w d2 q2 + flipFlop w d1 q1 + flipFlop w d0 q0 + +def latchRegister w d7 d6 d5 d4 d3 d2 d1 d0 q7 q6 q5 q4 q3 q2 q1 q0: + latch w d7 q7 + latch w d6 q6 + latch w d5 q5 + latch w d4 q4 + latch w d3 q3 + latch w d2 q2 + latch w d1 q1 + latch w d0 q0 + +def tinyLatchRegister writeNeg d7 d6 d5 d4 d3 d2 d1 d0 : + r d7 d7 writeNeg 0 + r d6 d6 writeNeg 0 + r d5 d5 writeNeg 0 + r d4 d4 writeNeg 0 + r d3 d3 writeNeg 0 + r d2 d2 writeNeg 0 + r d1 d1 writeNeg 0 + r d0 d0 writeNeg 0 + +def memoryRegister select load d7 d6 d5 d4 d3 d2 d1 d0 : + inv load writeNeg + inv writeNeg select + trans8 select d7 d6 d5 d4 d3 d2 d1 d0 z7 z6 z5 z4 z3 z2 z1 z0 + tinyLatchRegister writeNeg z7 z6 z5 z4 z3 z2 z1 z0 + +# 2 Bytes of memory +def memory2 address select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux address select1 select0 select + mux address load1 load0 load + memoryRegister select0 load0 d7 d6 d5 d4 d3 d2 d1 d0 + memoryRegister select1 load1 d7 d6 d5 d4 d3 d2 d1 d0 + +# 4 Bytes of memory +def memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a1 select1 select0 select + mux a1 load1 load0 load + memory2 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory2 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 8 Bytes of memory +def memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a2 select1 select0 select + mux a2 load1 load0 load + memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 16 Bytes of memory +def memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a3 select1 select0 select + mux a3 load1 load0 load + memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 32 Bytes of memory +def memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a4 select1 select0 select + mux a4 load1 load0 load + memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 64 Bytes of memory +def memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a5 select1 select0 select + mux a5 load1 load0 load + memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 128 Bytes of memory +def memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a6 select1 select0 select + mux a6 load1 load0 load + memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 256 Bytes of memory +def memory256 a7 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a7 select1 select0 select + mux a7 load1 load0 load + memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +def counterElement andIn andOut value : + xor andIn value data + flipFlop c data value + and andIn value andOut + +def counter2 andIn andOut v1 v0 : + counterElement andIn x v0 + counterElement x andOut v1 + +def counter4 andIn andOut v3 v2 v1 v0 : + counter2 andIn x v1 v0 + counter2 x andOut v3 v2 + +def counter8 andIn andOut v7 v6 v5 v4 v3 v2 v1 v0 : + counter4 andIn x v3 v2 v1 v0 + counter4 x andOut v7 v6 v5 v4 + +run 160 5 counter8 1 0 ? ? ? ? ? ? ? ? + + + diff --git a/2006/birken/divider.tofu b/2006/birken/divider.tofu new file mode 100644 index 000000000..68324f6b2 --- /dev/null +++ b/2006/birken/divider.tofu @@ -0,0 +1,598 @@ +# Four double-pole relay +def r4 coil l3 nd3 nc3 l2 nd2 nc2 l1 nd1 nc1 l0 nd0 nc0 : + r coil l3 nd3 nc3 + r coil l2 nd2 nc2 + r coil l1 nd1 nc1 + r coil l0 nd0 nc0 + +# Buffer +def buf input output : + r input output 1 0 + +# Inverter +def inv input output : + r input output 0 1 + +# AND Gate +def and i1 i0 o : + r i0 z 1 0 + r i1 o z 0 + +# NAND Gate +def nand i0 i1 o : + r i0 1 0 o + r i1 1 0 o + +# OR Gate +def or i0 i1 o : + r i0 1 o 0 + r i1 1 o 0 + +# NOR Gate +def nor i0 i1 o : + r i0 1 0 z + r i1 z 0 o + +# XOR Gate +def xor i0 i1 o : + r i0 1 b a + r i1 o a b + +# XNOR Gate +def xnor i0 i1 o : + r i0 1 a b + r i1 o a b + +# Half Adder +def halfAdder a b s1 s0 : + and a b s1 + xor a b s0 + +# Full Adder +def fullAdder carryIn a b carryOut sum : + halfAdder a b s1 s0 + halfAdder s0 carryIn carry sum + or s1 carry carryOut + +# 2-bit Adder +def adder2 carryIn a1 a0 b1 b0 carryOut s1 s0 : + fullAdder carryIn a0 b0 carry s0 + fullAdder carry a1 b1 carryOut s1 + +# 4-bit Adder +def adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carryOut s3 s2 s1 s0 : + adder2 carryIn a1 a0 b1 b0 carry s1 s0 + adder2 carry a3 a2 b3 b2 carryOut s3 s2 + +# 8-bit Adder +def adder8 carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carry s3 s2 s1 s0 + adder4 carry a7 a6 a5 a4 b7 b6 b5 b4 carryOut s7 s6 s5 s4 + +# Konrad Zuse Dual-Rail-Carry Full Adder +def zuseFullAdder carryInNeg carryIn a b carryOutNeg carryOut sum : + r4 a carryInNeg y z sum w x 1 v y carryIn u v + r4 b carryOutNeg z y carryInNeg x w carryIn w x carryOut v u + +# Konrad Zuse Dual-Rail-Carry 2-bit Adder +def zuseAdder2 carryInNeg carryIn a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + zuseFullAdder carryInNeg carryIn a0 b0 cOutNeg cOut s0 + zuseFullAdder cOutNeg cOut a1 b1 carryOutNeg carryOut s1 + +# Konrad Zuse Dual-Rail-Carry 4-bit Adder +def zuseAdder4 carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + zuseAdder2 carryInNeg carryIn a1 a0 b1 b0 cOutNeg cOut s1 s0 + zuseAdder2 cOutNeg cOut a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# Konrad Zuse Dual-Rail-Carry 8-bit Adder +def zuseAdder8 carryInNeg carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + zuseAdder4 carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 cOutNeg cOut s3 s2 s1 s0 + zuseAdder4 cOutNeg cOut a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# 1-bit Partial Adder/Subtractor +def xFullAdder subtract carryInNeg carryIn a b carryOutNeg carryOut sum : + xor subtract b bNeg + zuseFullAdder carryInNeg carryIn a bNeg carryOutNeg carryOut sum + +# 2-bit Partial Adder/Subtractor +def xFullAdder2 subtract carryInNeg carryIn + a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + xFullAdder subtract carryInNeg carryIn a0 b0 cOutNeg cOut s0 + xFullAdder subtract cOutNeg cOut a1 b1 carryOutNeg carryOut s1 + +# 4-bit Partial Adder/Subtractor +def xFullAdder4 subtract carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + xFullAdder2 subtract carryInNeg carryIn a1 a0 b1 b0 cOutNeg cOut s1 s0 + xFullAdder2 subtract cOutNeg cOut a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# 8-bit Partial Adder/Subtractor +def xFullAdder8 subtract carryInNeg carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + xFullAdder4 subtract carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + cOutNeg cOut s3 s2 s1 s0 + xFullAdder4 subtract cOutNeg cOut a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# 8-bit Adder/Subtractor +def adderSubtractor subtract + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + inv subtract carryInNeg + xFullAdder8 subtract carryInNeg subtract + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg cOut s7 s6 s5 s4 s3 s2 s1 s0 + xor cOut subtract carryOut + +# 2-to-1 Mux +def mux a i1 i0 o : + r a o i1 i0 + +# 4-to-1 Mux +def mux4to1 a1 a0 i3 i2 i1 i0 o : + mux a0 i1 i0 x + mux a0 i3 i2 y + mux a1 y x o + +# 8-to-1 Mux +def mux8to1 a2 a1 a0 i7 i6 i5 i4 i3 i2 i1 i0 o : + mux4to1 a1 a0 i3 i2 i1 i0 x + mux4to1 a1 a0 i7 i6 i5 i4 y + mux a2 y x o + +# 3-to-8 Decoder +def decoder3to8 a2 a1 a0 o7 o6 o5 o4 o3 o2 o1 o0 : + mux8to1 a2 a1 a0 o7 o6 o5 o4 o3 o2 o1 o0 1 + +def trans enabled a b : + r enabled a b 0 + +# 2-bit transmission gate +def trans2 enabled a1 a0 b1 b0 : + trans enabled a1 b1 + trans enabled a0 b0 + +# 4-bit transmission gate +def trans4 enabled a3 a2 a1 a0 b3 b2 b1 b0 : + trans2 enabled a3 a2 b3 b2 + trans2 enabled a1 a0 b1 b0 + +# 8-bit transmission gate +def trans8 enabled a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 : + trans4 enabled a7 a6 a5 a4 b7 b6 b5 b4 + trans4 enabled a3 a2 a1 a0 b3 b2 b1 b0 + +# 16-bit transmission gate +def trans16 enabled + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 : + trans8 enabled a15 a14 a13 a12 a11 a10 a9 a8 b15 b14 b13 b12 b11 b10 b9 b8 + trans8 enabled a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 + +# Latch, stores when w = 1 +def latch w d q : + mux w d q z + buf z q + +# Latch, stores when w = 0 +def latchNeg w d q : + mux w q d z + buf z q + +# Flip flop, stores when w rises to 1, expresses new value when w drops to 0 +def flipFlop w d q : + latch w d q2 + latchNeg w q2 q + +def flipFlopRegister w d7 d6 d5 d4 d3 d2 d1 d0 q7 q6 q5 q4 q3 q2 q1 q0: + flipFlop w d7 q7 + flipFlop w d6 q6 + flipFlop w d5 q5 + flipFlop w d4 q4 + flipFlop w d3 q3 + flipFlop w d2 q2 + flipFlop w d1 q1 + flipFlop w d0 q0 + +def latchRegister w d7 d6 d5 d4 d3 d2 d1 d0 q7 q6 q5 q4 q3 q2 q1 q0: + latch w d7 q7 + latch w d6 q6 + latch w d5 q5 + latch w d4 q4 + latch w d3 q3 + latch w d2 q2 + latch w d1 q1 + latch w d0 q0 + +def tinyLatchRegister writeNeg d7 d6 d5 d4 d3 d2 d1 d0 : + r d7 d7 writeNeg 0 + r d6 d6 writeNeg 0 + r d5 d5 writeNeg 0 + r d4 d4 writeNeg 0 + r d3 d3 writeNeg 0 + r d2 d2 writeNeg 0 + r d1 d1 writeNeg 0 + r d0 d0 writeNeg 0 + +def memoryRegister select load d7 d6 d5 d4 d3 d2 d1 d0 : + inv load writeNeg + inv writeNeg select + trans8 select d7 d6 d5 d4 d3 d2 d1 d0 z7 z6 z5 z4 z3 z2 z1 z0 + tinyLatchRegister writeNeg z7 z6 z5 z4 z3 z2 z1 z0 + +# 2 Bytes of memory +def memory2 address select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux address select1 select0 select + mux address load1 load0 load + memoryRegister select0 load0 d7 d6 d5 d4 d3 d2 d1 d0 + memoryRegister select1 load1 d7 d6 d5 d4 d3 d2 d1 d0 + +# 4 Bytes of memory +def memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a1 select1 select0 select + mux a1 load1 load0 load + memory2 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory2 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 8 Bytes of memory +def memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a2 select1 select0 select + mux a2 load1 load0 load + memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 16 Bytes of memory +def memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a3 select1 select0 select + mux a3 load1 load0 load + memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 32 Bytes of memory +def memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a4 select1 select0 select + mux a4 load1 load0 load + memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 64 Bytes of memory +def memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a5 select1 select0 select + mux a5 load1 load0 load + memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 128 Bytes of memory +def memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a6 select1 select0 select + mux a6 load1 load0 load + memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 256 Bytes of memory +def memory256 a7 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a7 select1 select0 select + mux a7 load1 load0 load + memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +def counterElement andIn andOut value : + xor andIn value data + flipFlop c data value + and andIn value andOut + +def counter2 andIn andOut v1 v0 : + counterElement andIn x v0 + counterElement x andOut v1 + +def counter4 andIn andOut v3 v2 v1 v0 : + counter2 andIn x v1 v0 + counter2 x andOut v3 v2 + +def counter8 andIn andOut v7 v6 v5 v4 v3 v2 v1 v0 : + counter4 andIn x v3 v2 v1 v0 + counter4 x andOut v7 v6 v5 v4 + +def shift2 shiftIn q1 q0 : + flipFlop c shiftIn q1 + flipFlop c q1 q0 + +def shift4 shiftIn q3 q2 q1 q0 : + shift2 shiftIn q3 q2 + shift2 q2 q1 q0 + +def shift8 shiftIn q7 q6 q5 q4 q3 q2 q1 q0 : + shift4 shiftIn q7 q6 q5 q4 + shift4 q4 q3 q2 q1 q0 + +def shiftOne q7 q6 q5 q4 q3 q2 q1 q0 : + flipFlop c 1 q + inv q shiftIn + shift8 shiftIn q7 q6 q5 q4 q3 q2 q1 q0 + +def loop q7 q6 q5 q4 q3 q2 q1 q0 : + flipFlop c 1 q + inv q shiftIn + shift8 shiftIn q7 q6 q5 q4 q3 q2 q1 q0 + buf q0 shiftIn + +# 1-bit adder +def mAdder add carryInNeg carryIn a b carryOutNeg carryOut sum : + trans add b s + zuseFullAdder carryInNeg carryIn a s carryOutNeg carryOut sum + +# 2-bit adder +def mAdder2 add carryInNeg carryIn a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + mAdder add carryInNeg carryIn a0 b0 cOutNeg cOut s0 + mAdder add cOutNeg cOut a1 b1 carryOutNeg carryOut s1 + +# 4-bit adder +def mAdder4 add carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + mAdder2 add carryInNeg carryIn a1 a0 b1 b0 cOutNeg cOut s1 s0 + mAdder2 add cOutNeg cOut a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# 8-bit adder +def mAdder8 add + carryInNeg carryIn a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + mAdder4 add carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + cOutNeg cOut s3 s2 s1 s0 + mAdder4 add cOutNeg cOut a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# 16-bit adder +def mAdder16 add + carryInNeg carryIn a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s15 s14 s13 s12 s11 s10 s9 s8 s7 s6 s5 s4 s3 s2 s1 s0 : + mAdder8 add carryInNeg carryIn a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 + cOutNeg cOut s7 s6 s5 s4 s3 s2 s1 s0 + mAdder8 add cOutNeg cOut + a15 a14 a13 a12 a11 a10 a9 a8 b15 b14 b13 b12 b11 b10 b9 b8 + carryOutNeg carryOut s15 s14 s13 s12 s11 s10 s9 s8 + +def multiplier + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0 : + mAdder16 b0 1 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 + 0 0 d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 + mAdder16 b1 1 0 + d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 + 0 0 0 0 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 + 0 0 e15 e14 e13 e12 e11 e10 e9 e8 e7 e6 e5 e4 e3 e2 e1 e0 + mAdder16 b2 1 0 + e15 e14 e13 e12 e11 e10 e9 e8 e7 e6 e5 e4 e3 e2 e1 e0 + 0 0 0 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 + 0 0 f15 f14 f13 f12 f11 f10 f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 + mAdder16 b3 1 0 + f15 f14 f13 f12 f11 f10 f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 + 0 0 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 0 + 0 0 g15 g14 g13 g12 g11 g10 g9 g8 g7 g6 g5 g4 g3 g2 g1 g0 + mAdder16 b4 1 0 + g15 g14 g13 g12 g11 g10 g9 g8 g7 g6 g5 g4 g3 g2 g1 g0 + 0 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 0 0 + 0 0 h15 h14 h13 h12 h11 h10 h9 h8 h7 h6 h5 h4 h3 h2 h1 h0 + mAdder16 b5 1 0 + h15 h14 h13 h12 h11 h10 h9 h8 h7 h6 h5 h4 h3 h2 h1 h0 + 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 0 0 0 + 0 0 i15 i14 i13 i12 i11 i10 i9 i8 i7 i6 i5 i4 i3 i2 i1 i0 + mAdder16 b6 1 0 + i15 i14 i13 i12 i11 i10 i9 i8 i7 i6 i5 i4 i3 i2 i1 i0 + 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 0 0 0 0 + 0 0 j15 j14 j13 j12 j11 j10 j9 j8 j7 j6 j5 j4 j3 j2 j1 j0 + mAdder16 b7 1 0 + j15 j14 j13 j12 j11 j10 j9 j8 j7 j6 j5 j4 j3 j2 j1 j0 + 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 0 0 0 0 0 + 0 0 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0 + +# 16-bit Partial Adder/Subtractor +def xFullAdder16 subtract carryInNeg carryIn + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s15 s14 s13 s12 s11 s10 s9 s8 s7 s6 s5 s4 s3 s2 s1 s0 : + xFullAdder8 subtract carryInNeg carryIn + a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 + cOutNeg cOut s7 s6 s5 s4 s3 s2 s1 s0 + xFullAdder8 subtract cOutNeg cOut + a15 a14 a13 a12 a11 a10 a9 a8 b15 b14 b13 b12 b11 b10 b9 b8 + carryOutNeg carryOut s15 s14 s13 s12 s11 s10 s9 s8 + +# 16-bit Adder/Subtractor +def adderSubtractor16 subtract + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s15 s14 s13 s12 s11 s10 s9 s8 s7 s6 s5 s4 s3 s2 s1 s0 : + inv subtract carryInNeg + xFullAdder16 subtract carryInNeg subtract + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg cOut s15 s14 s13 s12 s11 s10 s9 s8 s7 s6 s5 s4 s3 s2 s1 s0 + xor cOut subtract carryOut + +def signedMultiplier signed + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0 : + and signed a7 negateA + and signed b7 negateB + adderSubtractor negateA 0 0 0 0 0 0 0 0 + a7 a6 a5 a4 a3 a2 a1 a0 0 c7 c6 c5 c4 c3 c2 c1 c0 + adderSubtractor negateB 0 0 0 0 0 0 0 0 + b7 b6 b5 b4 b3 b2 b1 b0 0 d7 d6 d5 d4 d3 d2 d1 d0 + multiplier + c7 c6 c5 c4 c3 c2 c1 c0 + d7 d6 d5 d4 d3 d2 d1 d0 + q15 q14 q13 q12 q11 q10 q9 q8 q7 q6 q5 q4 q3 q2 q1 q0 + xor a7 b7 negateProduct + and signed negateProduct negateQ + adderSubtractor16 negateQ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + q15 q14 q13 q12 q11 q10 q9 q8 q7 q6 q5 q4 q3 q2 q1 q0 + 0 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0 + +# 4-input OR gate +def or4 i3 i2 i1 i0 o : + or i3 i2 o + or i1 i0 o + +# 8-input OR gate +def or8 i7 i6 i5 i4 i3 i2 i1 i0 o : + or4 i7 i6 i5 i4 o + or4 i3 i2 i1 i0 o + +def multiplier2 + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0 : + + # 16-bit register made of flip flops + flipFlop c d15 p15 + flipFlop c d14 p14 + flipFlop c d13 p13 + flipFlop c d12 p12 + flipFlop c d11 p11 + flipFlop c d10 p10 + flipFlop c d9 p9 + flipFlop c d8 p8 + flipFlop c d7 p7 + flipFlop c d6 p6 + flipFlop c d5 p5 + flipFlop c d4 p4 + flipFlop c d3 p3 + flipFlop c d2 p2 + flipFlop c d1 p1 + flipFlop c d0 p0 + + # Transmission gates and 8-bit adder + trans8 loadB d7 d6 d5 d4 d3 d2 d1 d0 b7 b6 b5 b4 b3 b2 b1 b0 + trans8 p0 a7 a6 a5 a4 a3 a2 a1 a0 z7 z6 z5 z4 z3 z2 z1 z0 + zuseAdder8 1 0 p15 p14 p13 p12 p11 p10 p9 p8 z7 z6 z5 z4 z3 z2 z1 z0 + 0 s8 s7 s6 s5 s4 s3 s2 s1 s0 + trans16 tallyShift d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 + s8 s7 s6 s5 s4 s3 s2 s1 s0 p7 p6 p5 p4 p3 p2 p1 + trans16 keepValue d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 + p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0 + + # State machine + flipFlop c 1 boot + inv boot loadB + flipFlop c loadB state1 + flipFlop c state1 state2 + flipFlop c state2 state3 + flipFlop c state3 state4 + flipFlop c state4 state5 + flipFlop c state5 state6 + flipFlop c state6 state7 + flipFlop c state7 state8 + flipFlop c state8 keepValue + or8 state1 state2 state3 state4 state5 state6 state7 state8 tallyShift + buf keepValue keepValue + +def signedMultiplier2 signed + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0 : + and signed a7 negateA + and signed b7 negateB + adderSubtractor negateA 0 0 0 0 0 0 0 0 + a7 a6 a5 a4 a3 a2 a1 a0 0 c7 c6 c5 c4 c3 c2 c1 c0 + adderSubtractor negateB 0 0 0 0 0 0 0 0 + b7 b6 b5 b4 b3 b2 b1 b0 0 d7 d6 d5 d4 d3 d2 d1 d0 + multiplier2 + c7 c6 c5 c4 c3 c2 c1 c0 + d7 d6 d5 d4 d3 d2 d1 d0 + q15 q14 q13 q12 q11 q10 q9 q8 q7 q6 q5 q4 q3 q2 q1 q0 + xor a7 b7 negateProduct + and signed negateProduct negateQ + adderSubtractor16 negateQ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + q15 q14 q13 q12 q11 q10 q9 q8 q7 q6 q5 q4 q3 q2 q1 q0 + 0 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0 + +# Divider (A = Dividend, B = Divisor, P = Quotient, Q = Remainder) +def divider + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + divideByZeroError + p7 p6 p5 p4 p3 p2 p1 p0 + q7 q6 q5 q4 q3 q2 q1 q0 : + + # 16-bit register made of flip flops + flipFlop c d15 q7 + flipFlop c d14 q6 + flipFlop c d13 q5 + flipFlop c d12 q4 + flipFlop c d11 q3 + flipFlop c d10 q2 + flipFlop c d9 q1 + flipFlop c d8 q0 + flipFlop c d7 p7 + flipFlop c d6 p6 + flipFlop c d5 p5 + flipFlop c d4 p4 + flipFlop c d3 p3 + flipFlop c d2 p2 + flipFlop c d1 p1 + flipFlop c d0 p0 + + # Transmission gates and 8-bit subtractor + trans8 loadA d7 d6 d5 d4 d3 d2 d1 d0 a7 a6 a5 a4 a3 a2 a1 a0 + trans16 positive d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 + s7 s6 s5 s4 s3 s2 s1 s0 p6 p5 p4 p3 p2 p1 p0 1 + trans16 negative d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 + q6 q5 q4 q3 q2 q1 q0 p7 p6 p5 p4 p3 p2 p1 p0 0 + trans16 keepValue d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 + q7 q6 q5 q4 q3 q2 q1 q0 p7 p6 p5 p4 p3 p2 p1 p0 + adderSubtractor 1 q6 q5 q4 q3 q2 q1 q0 p7 b7 b6 b5 b4 b3 b2 b1 b0 + 0 s7 s6 s5 s4 s3 s2 s1 s0 + inv s7 s7Neg + and shift s7 negative + and shift s7Neg positive + + # Divide-by-zero check + or8 b7 b6 b5 b4 b3 b2 b1 b0 divideByZeroErrorNeg + inv divideByZeroErrorNeg divideByZeroError + + # State machine + flipFlop c 1 boot + inv boot bootNeg + trans divideByZeroErrorNeg bootNeg loadA + flipFlop c loadA state1 + flipFlop c state1 state2 + flipFlop c state2 state3 + flipFlop c state3 state4 + flipFlop c state4 state5 + flipFlop c state5 state6 + flipFlop c state6 state7 + flipFlop c state7 state8 + flipFlop c state8 keepValue + or8 state1 state2 state3 state4 state5 state6 state7 state8 shift + buf keepValue keepValue + +run 1000 5 divider + 0 0 0 0 1 1 1 0 + 0 0 0 0 0 0 1 1 + ? + ? ? ? ? ? ? ? ? + ? ? ? ? ? ? ? ? + + + + + + diff --git a/2006/birken/hint.text b/2006/birken/hint.text new file mode 100644 index 000000000..71add21cd --- /dev/null +++ b/2006/birken/hint.text @@ -0,0 +1,52 @@ +# EDAMAME Award +# (Electronic Design Automation - Mechanical Abstract Machine Emulator) + +Michael Birken +US +o__1 at hotmail dot com + +## Judges' comments: + +### To build + + make birken + +Try: + + ./birken < counter.tofu + +What is TUFO? It's not a veggy friendly food, nor it is Verilog or +VHDL. It is not even Pascal! + +NOTE: On some systems, file(1) claims one of the .tofu files is Pascal +source. :-) + +It may not be the most readable hardware description language, but it is +one of the easiest 55 page long manual to learn. :-) + +For a small but non-trivial design, try implementing a +[Linear Feedback Shift Register](http://en.wikipedia.org/wiki/LFSR) + +And for those who are still confused: + +> +> + +## Author's comments: + +If man is capable of creating tofu hotdogs (simulated meat), then why +not tofu circuitry (simulated circuits)? This program is my tribute to +the early computer pioneers like Konrad Zuse. It's an educational tool +designed to introduce students to digital circuit theory using +technology that was considered state of the art in the 1940's! To +enable you to fully understand the capabilities of this circuit +simulator, I have included a 55 page manual (info.pdf) in the info +portion of the entry submission. + +The primary obfuscation is the data structure chosen for parsing the +input file and for executing the simulation. Oh man... coding that +data structure gave me such a bad headache. But, I figure, who needs +more than a pair anyway? Subtle obfuscations abound. Bonus points go +out the one who discovers the hidden program within the source. + +Note that the shape of the source is a wave, not a waveform. diff --git a/2006/birken/info.pdf b/2006/birken/info.pdf new file mode 100644 index 000000000..4ca94361d Binary files /dev/null and b/2006/birken/info.pdf differ diff --git a/2006/birken/lfsr.tofu b/2006/birken/lfsr.tofu new file mode 100644 index 000000000..4a522c6c6 --- /dev/null +++ b/2006/birken/lfsr.tofu @@ -0,0 +1,72 @@ +# Buffer +def buf input output : + r input output 1 0 + +# Inverter +def inv input output : + r input output 0 1 + +# AND Gate +def and i1 i0 o : + r i0 z 1 0 + r i1 o z 0 + +# NAND Gate +def nand i0 i1 o : + r i0 1 0 o + r i1 1 0 o + +# OR Gate +def or i0 i1 o : + r i0 1 o 0 + r i1 1 o 0 + +# NOR Gate +def nor i0 i1 o : + r i0 1 0 z + r i1 z 0 o + +# XOR Gate +def xor i0 i1 o : + r i0 1 b a + r i1 o a b + +# XNOR Gate +def xnor i0 i1 o : + r i0 1 a b + r i1 o a b + +# Half Adder +def halfAdder a b s1 s0 : + and a b s1 + xor a b s0 + +# Full Adder +def fullAdder carryIn a b carryOut sum : + halfAdder a b s1 s0 + halfAdder s0 carryIn carry sum + or s1 carry carryOut + +# 2-bit Adder +def adder2 carryIn a1 a0 b1 b0 carryOut s1 s0 : + fullAdder carryIn a0 b0 carry s0 + fullAdder carry a1 b1 carryOut s1 + +# 4-bit Adder +def adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carryOut s3 s2 s1 s0 : + adder2 carryIn a1 a0 b1 b0 carry s1 s0 + adder2 carry a3 a2 b3 b2 carryOut s3 s2 + +# 8-bit Adder +def adder8 carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carry s3 s2 s1 s0 + adder4 carry a7 a6 a5 a4 b7 b6 b5 b4 carryOut s7 s6 s5 s4 + +# 57 + 142 = ? +run 100 1 adder8 0 + 0 0 1 1 1 0 0 1 + 1 0 0 0 1 1 1 0 + ? ? ? ? ? ? ? ? ? diff --git a/2006/birken/memory.tofu b/2006/birken/memory.tofu new file mode 100644 index 000000000..90201cde1 --- /dev/null +++ b/2006/birken/memory.tofu @@ -0,0 +1,293 @@ +# Four double-pole relay +def r4 coil l3 nd3 nc3 l2 nd2 nc2 l1 nd1 nc1 l0 nd0 nc0 : + r coil l3 nd3 nc3 + r coil l2 nd2 nc2 + r coil l1 nd1 nc1 + r coil l0 nd0 nc0 + +# Buffer +def buf input output : + r input output 1 0 + +# Inverter +def inv input output : + r input output 0 1 + +# AND Gate +def and i1 i0 o : + r i0 z 1 0 + r i1 o z 0 + +# NAND Gate +def nand i0 i1 o : + r i0 1 0 o + r i1 1 0 o + +# OR Gate +def or i0 i1 o : + r i0 1 o 0 + r i1 1 o 0 + +# NOR Gate +def nor i0 i1 o : + r i0 1 0 z + r i1 z 0 o + +# XOR Gate +def xor i0 i1 o : + r i0 1 b a + r i1 o a b + +# XNOR Gate +def xnor i0 i1 o : + r i0 1 a b + r i1 o a b + +# Half Adder +def halfAdder a b s1 s0 : + and a b s1 + xor a b s0 + +# Full Adder +def fullAdder carryIn a b carryOut sum : + halfAdder a b s1 s0 + halfAdder s0 carryIn carry sum + or s1 carry carryOut + +# 2-bit Adder +def adder2 carryIn a1 a0 b1 b0 carryOut s1 s0 : + fullAdder carryIn a0 b0 carry s0 + fullAdder carry a1 b1 carryOut s1 + +# 4-bit Adder +def adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carryOut s3 s2 s1 s0 : + adder2 carryIn a1 a0 b1 b0 carry s1 s0 + adder2 carry a3 a2 b3 b2 carryOut s3 s2 + +# 8-bit Adder +def adder8 carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carry s3 s2 s1 s0 + adder4 carry a7 a6 a5 a4 b7 b6 b5 b4 carryOut s7 s6 s5 s4 + +# Konrad Zuse Dual-Rail-Carry Full Adder +def zuseFullAdder carryInNeg carryIn a b carryOutNeg carryOut sum : + r4 a carryInNeg y z sum w x 1 v y carryIn u v + r4 b carryOutNeg z y carryInNeg x w carryIn w x carryOut v u + +# Konrad Zuse Dual-Rail-Carry 2-bit Adder +def zuseAdder2 carryInNeg carryIn a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + zuseFullAdder carryInNeg carryIn a0 b0 cOutNeg cOut s0 + zuseFullAdder cOutNeg cOut a1 b1 carryOutNeg carryOut s1 + +# Konrad Zuse Dual-Rail-Carry 4-bit Adder +def zuseAdder4 carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + zuseAdder2 carryInNeg carryIn a1 a0 b1 b0 cOutNeg cOut s1 s0 + zuseAdder2 cOutNeg cOut a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# Konrad Zuse Dual-Rail-Carry 8-bit Adder +def zuseAdder8 carryInNeg carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + zuseAdder4 carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 cOutNeg cOut s3 s2 s1 s0 + zuseAdder4 cOutNeg cOut a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# 1-bit Partial Adder/Subtractor +def xFullAdder subtract carryInNeg carryIn a b carryOutNeg carryOut sum : + xor subtract b bNeg + zuseFullAdder carryInNeg carryIn a bNeg carryOutNeg carryOut sum + +# 2-bit Partial Adder/Subtractor +def xFullAdder2 subtract carryInNeg carryIn + a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + xFullAdder subtract carryInNeg carryIn a0 b0 cOutNeg cOut s0 + xFullAdder subtract cOutNeg cOut a1 b1 carryOutNeg carryOut s1 + +# 4-bit Partial Adder/Subtractor +def xFullAdder4 subtract carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + xFullAdder2 subtract carryInNeg carryIn a1 a0 b1 b0 cOutNeg cOut s1 s0 + xFullAdder2 subtract cOutNeg cOut a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# 8-bit Partial Adder/Subtractor +def xFullAdder8 subtract carryInNeg carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + xFullAdder4 subtract carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + cOutNeg cOut s3 s2 s1 s0 + xFullAdder4 subtract cOutNeg cOut a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# 8-bit Adder/Subtractor +def adderSubtractor subtract + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + inv subtract carryInNeg + xFullAdder8 subtract carryInNeg subtract + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg cOut s7 s6 s5 s4 s3 s2 s1 s0 + xor cOut subtract carryOut + +# 2-to-1 Mux +def mux a i1 i0 o : + r a o i1 i0 + +# 4-to-1 Mux +def mux4to1 a1 a0 i3 i2 i1 i0 o : + mux a0 i1 i0 x + mux a0 i3 i2 y + mux a1 y x o + +# 8-to-1 Mux +def mux8to1 a2 a1 a0 i7 i6 i5 i4 i3 i2 i1 i0 o : + mux4to1 a1 a0 i3 i2 i1 i0 x + mux4to1 a1 a0 i7 i6 i5 i4 y + mux a2 y x o + +# 3-to-8 Decoder +def decoder3to8 a2 a1 a0 o7 o6 o5 o4 o3 o2 o1 o0 : + mux8to1 a2 a1 a0 o7 o6 o5 o4 o3 o2 o1 o0 1 + +def trans enabled a b : + r enabled a b 0 + +# 2-bit transmission gate +def trans2 enabled a1 a0 b1 b0 : + trans enabled a1 b1 + trans enabled a0 b0 + +# 4-bit transmission gate +def trans4 enabled a3 a2 a1 a0 b3 b2 b1 b0 : + trans2 enabled a3 a2 b3 b2 + trans2 enabled a1 a0 b1 b0 + +# 8-bit transmission gate +def trans8 enabled a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 : + trans4 enabled a7 a6 a5 a4 b7 b6 b5 b4 + trans4 enabled a3 a2 a1 a0 b3 b2 b1 b0 + +# 16-bit transmission gate +def trans16 enabled + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 : + trans8 enabled a15 a14 a13 a12 a11 a10 a9 a8 b15 b14 b13 b12 b11 b10 b9 b8 + trans8 enabled a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 + +# Latch, stores when w = 1 +def latch w d q : + mux w d q z + buf z q + +# Latch, stores when w = 0 +def latchNeg w d q : + mux w q d z + buf z q + +# Flip flop, stores when w rises to 1, expresses new value when w drops to 0 +def flipFlop w d q : + latch w d q2 + latchNeg w q2 q + +def flipFlopRegister w d7 d6 d5 d4 d3 d2 d1 d0 q7 q6 q5 q4 q3 q2 q1 q0: + flipFlop w d7 q7 + flipFlop w d6 q6 + flipFlop w d5 q5 + flipFlop w d4 q4 + flipFlop w d3 q3 + flipFlop w d2 q2 + flipFlop w d1 q1 + flipFlop w d0 q0 + +def latchRegister w d7 d6 d5 d4 d3 d2 d1 d0 q7 q6 q5 q4 q3 q2 q1 q0: + latch w d7 q7 + latch w d6 q6 + latch w d5 q5 + latch w d4 q4 + latch w d3 q3 + latch w d2 q2 + latch w d1 q1 + latch w d0 q0 + +def tinyLatchRegister writeNeg d7 d6 d5 d4 d3 d2 d1 d0 : + r d7 d7 writeNeg 0 + r d6 d6 writeNeg 0 + r d5 d5 writeNeg 0 + r d4 d4 writeNeg 0 + r d3 d3 writeNeg 0 + r d2 d2 writeNeg 0 + r d1 d1 writeNeg 0 + r d0 d0 writeNeg 0 + +def memoryRegister select load d7 d6 d5 d4 d3 d2 d1 d0 : + inv load writeNeg + inv writeNeg select + trans8 select d7 d6 d5 d4 d3 d2 d1 d0 z7 z6 z5 z4 z3 z2 z1 z0 + tinyLatchRegister writeNeg z7 z6 z5 z4 z3 z2 z1 z0 + +# 2 Bytes of memory +def memory2 address select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux address select1 select0 select + mux address load1 load0 load + memoryRegister select0 load0 d7 d6 d5 d4 d3 d2 d1 d0 + memoryRegister select1 load1 d7 d6 d5 d4 d3 d2 d1 d0 + +# 4 Bytes of memory +def memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a1 select1 select0 select + mux a1 load1 load0 load + memory2 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory2 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 8 Bytes of memory +def memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a2 select1 select0 select + mux a2 load1 load0 load + memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 16 Bytes of memory +def memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a3 select1 select0 select + mux a3 load1 load0 load + memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 32 Bytes of memory +def memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a4 select1 select0 select + mux a4 load1 load0 load + memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 64 Bytes of memory +def memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a5 select1 select0 select + mux a5 load1 load0 load + memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 128 Bytes of memory +def memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a6 select1 select0 select + mux a6 load1 load0 load + memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 256 Bytes of memory +def memory256 a7 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a7 select1 select0 select + mux a7 load1 load0 load + memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +run 100 1 memory256 0 0 0 0 0 0 0 0 1 0 ? ? ? ? ? ? ? ? + + diff --git a/2006/birken/multiplier.tofu b/2006/birken/multiplier.tofu new file mode 100644 index 000000000..35a00a7c2 --- /dev/null +++ b/2006/birken/multiplier.tofu @@ -0,0 +1,414 @@ +# Four double-pole relay +def r4 coil l3 nd3 nc3 l2 nd2 nc2 l1 nd1 nc1 l0 nd0 nc0 : + r coil l3 nd3 nc3 + r coil l2 nd2 nc2 + r coil l1 nd1 nc1 + r coil l0 nd0 nc0 + +# Buffer +def buf input output : + r input output 1 0 + +# Inverter +def inv input output : + r input output 0 1 + +# AND Gate +def and i1 i0 o : + r i0 z 1 0 + r i1 o z 0 + +# NAND Gate +def nand i0 i1 o : + r i0 1 0 o + r i1 1 0 o + +# OR Gate +def or i0 i1 o : + r i0 1 o 0 + r i1 1 o 0 + +# NOR Gate +def nor i0 i1 o : + r i0 1 0 z + r i1 z 0 o + +# XOR Gate +def xor i0 i1 o : + r i0 1 b a + r i1 o a b + +# XNOR Gate +def xnor i0 i1 o : + r i0 1 a b + r i1 o a b + +# Half Adder +def halfAdder a b s1 s0 : + and a b s1 + xor a b s0 + +# Full Adder +def fullAdder carryIn a b carryOut sum : + halfAdder a b s1 s0 + halfAdder s0 carryIn carry sum + or s1 carry carryOut + +# 2-bit Adder +def adder2 carryIn a1 a0 b1 b0 carryOut s1 s0 : + fullAdder carryIn a0 b0 carry s0 + fullAdder carry a1 b1 carryOut s1 + +# 4-bit Adder +def adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carryOut s3 s2 s1 s0 : + adder2 carryIn a1 a0 b1 b0 carry s1 s0 + adder2 carry a3 a2 b3 b2 carryOut s3 s2 + +# 8-bit Adder +def adder8 carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carry s3 s2 s1 s0 + adder4 carry a7 a6 a5 a4 b7 b6 b5 b4 carryOut s7 s6 s5 s4 + +# Konrad Zuse Dual-Rail-Carry Full Adder +def zuseFullAdder carryInNeg carryIn a b carryOutNeg carryOut sum : + r4 a carryInNeg y z sum w x 1 v y carryIn u v + r4 b carryOutNeg z y carryInNeg x w carryIn w x carryOut v u + +# Konrad Zuse Dual-Rail-Carry 2-bit Adder +def zuseAdder2 carryInNeg carryIn a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + zuseFullAdder carryInNeg carryIn a0 b0 cOutNeg cOut s0 + zuseFullAdder cOutNeg cOut a1 b1 carryOutNeg carryOut s1 + +# Konrad Zuse Dual-Rail-Carry 4-bit Adder +def zuseAdder4 carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + zuseAdder2 carryInNeg carryIn a1 a0 b1 b0 cOutNeg cOut s1 s0 + zuseAdder2 cOutNeg cOut a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# Konrad Zuse Dual-Rail-Carry 8-bit Adder +def zuseAdder8 carryInNeg carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + zuseAdder4 carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 cOutNeg cOut s3 s2 s1 s0 + zuseAdder4 cOutNeg cOut a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# 1-bit Partial Adder/Subtractor +def xFullAdder subtract carryInNeg carryIn a b carryOutNeg carryOut sum : + xor subtract b bNeg + zuseFullAdder carryInNeg carryIn a bNeg carryOutNeg carryOut sum + +# 2-bit Partial Adder/Subtractor +def xFullAdder2 subtract carryInNeg carryIn + a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + xFullAdder subtract carryInNeg carryIn a0 b0 cOutNeg cOut s0 + xFullAdder subtract cOutNeg cOut a1 b1 carryOutNeg carryOut s1 + +# 4-bit Partial Adder/Subtractor +def xFullAdder4 subtract carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + xFullAdder2 subtract carryInNeg carryIn a1 a0 b1 b0 cOutNeg cOut s1 s0 + xFullAdder2 subtract cOutNeg cOut a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# 8-bit Partial Adder/Subtractor +def xFullAdder8 subtract carryInNeg carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + xFullAdder4 subtract carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + cOutNeg cOut s3 s2 s1 s0 + xFullAdder4 subtract cOutNeg cOut a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# 8-bit Adder/Subtractor +def adderSubtractor subtract + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + inv subtract carryInNeg + xFullAdder8 subtract carryInNeg subtract + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg cOut s7 s6 s5 s4 s3 s2 s1 s0 + xor cOut subtract carryOut + +# 2-to-1 Mux +def mux a i1 i0 o : + r a o i1 i0 + +# 4-to-1 Mux +def mux4to1 a1 a0 i3 i2 i1 i0 o : + mux a0 i1 i0 x + mux a0 i3 i2 y + mux a1 y x o + +# 8-to-1 Mux +def mux8to1 a2 a1 a0 i7 i6 i5 i4 i3 i2 i1 i0 o : + mux4to1 a1 a0 i3 i2 i1 i0 x + mux4to1 a1 a0 i7 i6 i5 i4 y + mux a2 y x o + +# 3-to-8 Decoder +def decoder3to8 a2 a1 a0 o7 o6 o5 o4 o3 o2 o1 o0 : + mux8to1 a2 a1 a0 o7 o6 o5 o4 o3 o2 o1 o0 1 + +def trans enabled a b : + r enabled a b 0 + +# 2-bit transmission gate +def trans2 enabled a1 a0 b1 b0 : + trans enabled a1 b1 + trans enabled a0 b0 + +# 4-bit transmission gate +def trans4 enabled a3 a2 a1 a0 b3 b2 b1 b0 : + trans2 enabled a3 a2 b3 b2 + trans2 enabled a1 a0 b1 b0 + +# 8-bit transmission gate +def trans8 enabled a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 : + trans4 enabled a7 a6 a5 a4 b7 b6 b5 b4 + trans4 enabled a3 a2 a1 a0 b3 b2 b1 b0 + +# 16-bit transmission gate +def trans16 enabled + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 : + trans8 enabled a15 a14 a13 a12 a11 a10 a9 a8 b15 b14 b13 b12 b11 b10 b9 b8 + trans8 enabled a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 + +# Latch, stores when w = 1 +def latch w d q : + mux w d q z + buf z q + +# Latch, stores when w = 0 +def latchNeg w d q : + mux w q d z + buf z q + +# Flip flop, stores when w rises to 1, expresses new value when w drops to 0 +def flipFlop w d q : + latch w d q2 + latchNeg w q2 q + +def flipFlopRegister w d7 d6 d5 d4 d3 d2 d1 d0 q7 q6 q5 q4 q3 q2 q1 q0: + flipFlop w d7 q7 + flipFlop w d6 q6 + flipFlop w d5 q5 + flipFlop w d4 q4 + flipFlop w d3 q3 + flipFlop w d2 q2 + flipFlop w d1 q1 + flipFlop w d0 q0 + +def latchRegister w d7 d6 d5 d4 d3 d2 d1 d0 q7 q6 q5 q4 q3 q2 q1 q0: + latch w d7 q7 + latch w d6 q6 + latch w d5 q5 + latch w d4 q4 + latch w d3 q3 + latch w d2 q2 + latch w d1 q1 + latch w d0 q0 + +def tinyLatchRegister writeNeg d7 d6 d5 d4 d3 d2 d1 d0 : + r d7 d7 writeNeg 0 + r d6 d6 writeNeg 0 + r d5 d5 writeNeg 0 + r d4 d4 writeNeg 0 + r d3 d3 writeNeg 0 + r d2 d2 writeNeg 0 + r d1 d1 writeNeg 0 + r d0 d0 writeNeg 0 + +def memoryRegister select load d7 d6 d5 d4 d3 d2 d1 d0 : + inv load writeNeg + inv writeNeg select + trans8 select d7 d6 d5 d4 d3 d2 d1 d0 z7 z6 z5 z4 z3 z2 z1 z0 + tinyLatchRegister writeNeg z7 z6 z5 z4 z3 z2 z1 z0 + +# 2 Bytes of memory +def memory2 address select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux address select1 select0 select + mux address load1 load0 load + memoryRegister select0 load0 d7 d6 d5 d4 d3 d2 d1 d0 + memoryRegister select1 load1 d7 d6 d5 d4 d3 d2 d1 d0 + +# 4 Bytes of memory +def memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a1 select1 select0 select + mux a1 load1 load0 load + memory2 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory2 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 8 Bytes of memory +def memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a2 select1 select0 select + mux a2 load1 load0 load + memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 16 Bytes of memory +def memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a3 select1 select0 select + mux a3 load1 load0 load + memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 32 Bytes of memory +def memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a4 select1 select0 select + mux a4 load1 load0 load + memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 64 Bytes of memory +def memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a5 select1 select0 select + mux a5 load1 load0 load + memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 128 Bytes of memory +def memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a6 select1 select0 select + mux a6 load1 load0 load + memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 256 Bytes of memory +def memory256 a7 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a7 select1 select0 select + mux a7 load1 load0 load + memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +def counterElement andIn andOut value : + xor andIn value data + flipFlop c data value + and andIn value andOut + +def counter2 andIn andOut v1 v0 : + counterElement andIn x v0 + counterElement x andOut v1 + +def counter4 andIn andOut v3 v2 v1 v0 : + counter2 andIn x v1 v0 + counter2 x andOut v3 v2 + +def counter8 andIn andOut v7 v6 v5 v4 v3 v2 v1 v0 : + counter4 andIn x v3 v2 v1 v0 + counter4 x andOut v7 v6 v5 v4 + +def shift2 shiftIn q1 q0 : + flipFlop c shiftIn q1 + flipFlop c q1 q0 + +def shift4 shiftIn q3 q2 q1 q0 : + shift2 shiftIn q3 q2 + shift2 q2 q1 q0 + +def shift8 shiftIn q7 q6 q5 q4 q3 q2 q1 q0 : + shift4 shiftIn q7 q6 q5 q4 + shift4 q4 q3 q2 q1 q0 + +def shiftOne q7 q6 q5 q4 q3 q2 q1 q0 : + flipFlop c 1 q + inv q shiftIn + shift8 shiftIn q7 q6 q5 q4 q3 q2 q1 q0 + +def loop q7 q6 q5 q4 q3 q2 q1 q0 : + flipFlop c 1 q + inv q shiftIn + shift8 shiftIn q7 q6 q5 q4 q3 q2 q1 q0 + buf q0 shiftIn + +# 1-bit adder +def mAdder add carryInNeg carryIn a b carryOutNeg carryOut sum : + trans add b s + zuseFullAdder carryInNeg carryIn a s carryOutNeg carryOut sum + +# 2-bit adder +def mAdder2 add carryInNeg carryIn a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + mAdder add carryInNeg carryIn a0 b0 cOutNeg cOut s0 + mAdder add cOutNeg cOut a1 b1 carryOutNeg carryOut s1 + +# 4-bit adder +def mAdder4 add carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + mAdder2 add carryInNeg carryIn a1 a0 b1 b0 cOutNeg cOut s1 s0 + mAdder2 add cOutNeg cOut a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# 8-bit adder +def mAdder8 add + carryInNeg carryIn a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + mAdder4 add carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + cOutNeg cOut s3 s2 s1 s0 + mAdder4 add cOutNeg cOut a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# 16-bit adder +def mAdder16 add + carryInNeg carryIn a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s15 s14 s13 s12 s11 s10 s9 s8 s7 s6 s5 s4 s3 s2 s1 s0 : + mAdder8 add carryInNeg carryIn a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 + cOutNeg cOut s7 s6 s5 s4 s3 s2 s1 s0 + mAdder8 add cOutNeg cOut + a15 a14 a13 a12 a11 a10 a9 a8 b15 b14 b13 b12 b11 b10 b9 b8 + carryOutNeg carryOut s15 s14 s13 s12 s11 s10 s9 s8 + +def multiplier + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0 : + mAdder16 b0 1 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 + 0 0 d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 + mAdder16 b1 1 0 + d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 + 0 0 0 0 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 + 0 0 e15 e14 e13 e12 e11 e10 e9 e8 e7 e6 e5 e4 e3 e2 e1 e0 + mAdder16 b2 1 0 + e15 e14 e13 e12 e11 e10 e9 e8 e7 e6 e5 e4 e3 e2 e1 e0 + 0 0 0 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 + 0 0 f15 f14 f13 f12 f11 f10 f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 + mAdder16 b3 1 0 + f15 f14 f13 f12 f11 f10 f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 + 0 0 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 0 + 0 0 g15 g14 g13 g12 g11 g10 g9 g8 g7 g6 g5 g4 g3 g2 g1 g0 + mAdder16 b4 1 0 + g15 g14 g13 g12 g11 g10 g9 g8 g7 g6 g5 g4 g3 g2 g1 g0 + 0 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 0 0 + 0 0 h15 h14 h13 h12 h11 h10 h9 h8 h7 h6 h5 h4 h3 h2 h1 h0 + mAdder16 b5 1 0 + h15 h14 h13 h12 h11 h10 h9 h8 h7 h6 h5 h4 h3 h2 h1 h0 + 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 0 0 0 + 0 0 i15 i14 i13 i12 i11 i10 i9 i8 i7 i6 i5 i4 i3 i2 i1 i0 + mAdder16 b6 1 0 + i15 i14 i13 i12 i11 i10 i9 i8 i7 i6 i5 i4 i3 i2 i1 i0 + 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 0 0 0 0 + 0 0 j15 j14 j13 j12 j11 j10 j9 j8 j7 j6 j5 j4 j3 j2 j1 j0 + mAdder16 b7 1 0 + j15 j14 j13 j12 j11 j10 j9 j8 j7 j6 j5 j4 j3 j2 j1 j0 + 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 0 0 0 0 0 + 0 0 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0 + +# 100 x 200 = 20,000 +run 100 1 multiplier + 0 1 1 0 0 1 0 0 + 1 1 0 0 1 0 0 0 + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? + + + + + diff --git a/2006/birken/multiplier2.tofu b/2006/birken/multiplier2.tofu new file mode 100644 index 000000000..db8cb180b --- /dev/null +++ b/2006/birken/multiplier2.tofu @@ -0,0 +1,516 @@ +# Four double-pole relay +def r4 coil l3 nd3 nc3 l2 nd2 nc2 l1 nd1 nc1 l0 nd0 nc0 : + r coil l3 nd3 nc3 + r coil l2 nd2 nc2 + r coil l1 nd1 nc1 + r coil l0 nd0 nc0 + +# Buffer +def buf input output : + r input output 1 0 + +# Inverter +def inv input output : + r input output 0 1 + +# AND Gate +def and i1 i0 o : + r i0 z 1 0 + r i1 o z 0 + +# NAND Gate +def nand i0 i1 o : + r i0 1 0 o + r i1 1 0 o + +# OR Gate +def or i0 i1 o : + r i0 1 o 0 + r i1 1 o 0 + +# NOR Gate +def nor i0 i1 o : + r i0 1 0 z + r i1 z 0 o + +# XOR Gate +def xor i0 i1 o : + r i0 1 b a + r i1 o a b + +# XNOR Gate +def xnor i0 i1 o : + r i0 1 a b + r i1 o a b + +# Half Adder +def halfAdder a b s1 s0 : + and a b s1 + xor a b s0 + +# Full Adder +def fullAdder carryIn a b carryOut sum : + halfAdder a b s1 s0 + halfAdder s0 carryIn carry sum + or s1 carry carryOut + +# 2-bit Adder +def adder2 carryIn a1 a0 b1 b0 carryOut s1 s0 : + fullAdder carryIn a0 b0 carry s0 + fullAdder carry a1 b1 carryOut s1 + +# 4-bit Adder +def adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carryOut s3 s2 s1 s0 : + adder2 carryIn a1 a0 b1 b0 carry s1 s0 + adder2 carry a3 a2 b3 b2 carryOut s3 s2 + +# 8-bit Adder +def adder8 carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carry s3 s2 s1 s0 + adder4 carry a7 a6 a5 a4 b7 b6 b5 b4 carryOut s7 s6 s5 s4 + +# Konrad Zuse Dual-Rail-Carry Full Adder +def zuseFullAdder carryInNeg carryIn a b carryOutNeg carryOut sum : + r4 a carryInNeg y z sum w x 1 v y carryIn u v + r4 b carryOutNeg z y carryInNeg x w carryIn w x carryOut v u + +# Konrad Zuse Dual-Rail-Carry 2-bit Adder +def zuseAdder2 carryInNeg carryIn a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + zuseFullAdder carryInNeg carryIn a0 b0 cOutNeg cOut s0 + zuseFullAdder cOutNeg cOut a1 b1 carryOutNeg carryOut s1 + +# Konrad Zuse Dual-Rail-Carry 4-bit Adder +def zuseAdder4 carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + zuseAdder2 carryInNeg carryIn a1 a0 b1 b0 cOutNeg cOut s1 s0 + zuseAdder2 cOutNeg cOut a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# Konrad Zuse Dual-Rail-Carry 8-bit Adder +def zuseAdder8 carryInNeg carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + zuseAdder4 carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 cOutNeg cOut s3 s2 s1 s0 + zuseAdder4 cOutNeg cOut a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# 1-bit Partial Adder/Subtractor +def xFullAdder subtract carryInNeg carryIn a b carryOutNeg carryOut sum : + xor subtract b bNeg + zuseFullAdder carryInNeg carryIn a bNeg carryOutNeg carryOut sum + +# 2-bit Partial Adder/Subtractor +def xFullAdder2 subtract carryInNeg carryIn + a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + xFullAdder subtract carryInNeg carryIn a0 b0 cOutNeg cOut s0 + xFullAdder subtract cOutNeg cOut a1 b1 carryOutNeg carryOut s1 + +# 4-bit Partial Adder/Subtractor +def xFullAdder4 subtract carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + xFullAdder2 subtract carryInNeg carryIn a1 a0 b1 b0 cOutNeg cOut s1 s0 + xFullAdder2 subtract cOutNeg cOut a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# 8-bit Partial Adder/Subtractor +def xFullAdder8 subtract carryInNeg carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + xFullAdder4 subtract carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + cOutNeg cOut s3 s2 s1 s0 + xFullAdder4 subtract cOutNeg cOut a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# 8-bit Adder/Subtractor +def adderSubtractor subtract + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + inv subtract carryInNeg + xFullAdder8 subtract carryInNeg subtract + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg cOut s7 s6 s5 s4 s3 s2 s1 s0 + xor cOut subtract carryOut + +# 2-to-1 Mux +def mux a i1 i0 o : + r a o i1 i0 + +# 4-to-1 Mux +def mux4to1 a1 a0 i3 i2 i1 i0 o : + mux a0 i1 i0 x + mux a0 i3 i2 y + mux a1 y x o + +# 8-to-1 Mux +def mux8to1 a2 a1 a0 i7 i6 i5 i4 i3 i2 i1 i0 o : + mux4to1 a1 a0 i3 i2 i1 i0 x + mux4to1 a1 a0 i7 i6 i5 i4 y + mux a2 y x o + +# 3-to-8 Decoder +def decoder3to8 a2 a1 a0 o7 o6 o5 o4 o3 o2 o1 o0 : + mux8to1 a2 a1 a0 o7 o6 o5 o4 o3 o2 o1 o0 1 + +def trans enabled a b : + r enabled a b 0 + +# 2-bit transmission gate +def trans2 enabled a1 a0 b1 b0 : + trans enabled a1 b1 + trans enabled a0 b0 + +# 4-bit transmission gate +def trans4 enabled a3 a2 a1 a0 b3 b2 b1 b0 : + trans2 enabled a3 a2 b3 b2 + trans2 enabled a1 a0 b1 b0 + +# 8-bit transmission gate +def trans8 enabled a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 : + trans4 enabled a7 a6 a5 a4 b7 b6 b5 b4 + trans4 enabled a3 a2 a1 a0 b3 b2 b1 b0 + +# 16-bit transmission gate +def trans16 enabled + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 : + trans8 enabled a15 a14 a13 a12 a11 a10 a9 a8 b15 b14 b13 b12 b11 b10 b9 b8 + trans8 enabled a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 + +# Latch, stores when w = 1 +def latch w d q : + mux w d q z + buf z q + +# Latch, stores when w = 0 +def latchNeg w d q : + mux w q d z + buf z q + +# Flip flop, stores when w rises to 1, expresses new value when w drops to 0 +def flipFlop w d q : + latch w d q2 + latchNeg w q2 q + +def flipFlopRegister w d7 d6 d5 d4 d3 d2 d1 d0 q7 q6 q5 q4 q3 q2 q1 q0: + flipFlop w d7 q7 + flipFlop w d6 q6 + flipFlop w d5 q5 + flipFlop w d4 q4 + flipFlop w d3 q3 + flipFlop w d2 q2 + flipFlop w d1 q1 + flipFlop w d0 q0 + +def latchRegister w d7 d6 d5 d4 d3 d2 d1 d0 q7 q6 q5 q4 q3 q2 q1 q0: + latch w d7 q7 + latch w d6 q6 + latch w d5 q5 + latch w d4 q4 + latch w d3 q3 + latch w d2 q2 + latch w d1 q1 + latch w d0 q0 + +def tinyLatchRegister writeNeg d7 d6 d5 d4 d3 d2 d1 d0 : + r d7 d7 writeNeg 0 + r d6 d6 writeNeg 0 + r d5 d5 writeNeg 0 + r d4 d4 writeNeg 0 + r d3 d3 writeNeg 0 + r d2 d2 writeNeg 0 + r d1 d1 writeNeg 0 + r d0 d0 writeNeg 0 + +def memoryRegister select load d7 d6 d5 d4 d3 d2 d1 d0 : + inv load writeNeg + inv writeNeg select + trans8 select d7 d6 d5 d4 d3 d2 d1 d0 z7 z6 z5 z4 z3 z2 z1 z0 + tinyLatchRegister writeNeg z7 z6 z5 z4 z3 z2 z1 z0 + +# 2 Bytes of memory +def memory2 address select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux address select1 select0 select + mux address load1 load0 load + memoryRegister select0 load0 d7 d6 d5 d4 d3 d2 d1 d0 + memoryRegister select1 load1 d7 d6 d5 d4 d3 d2 d1 d0 + +# 4 Bytes of memory +def memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a1 select1 select0 select + mux a1 load1 load0 load + memory2 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory2 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 8 Bytes of memory +def memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a2 select1 select0 select + mux a2 load1 load0 load + memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 16 Bytes of memory +def memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a3 select1 select0 select + mux a3 load1 load0 load + memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 32 Bytes of memory +def memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a4 select1 select0 select + mux a4 load1 load0 load + memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 64 Bytes of memory +def memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a5 select1 select0 select + mux a5 load1 load0 load + memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 128 Bytes of memory +def memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a6 select1 select0 select + mux a6 load1 load0 load + memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 256 Bytes of memory +def memory256 a7 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a7 select1 select0 select + mux a7 load1 load0 load + memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +def counterElement andIn andOut value : + xor andIn value data + flipFlop c data value + and andIn value andOut + +def counter2 andIn andOut v1 v0 : + counterElement andIn x v0 + counterElement x andOut v1 + +def counter4 andIn andOut v3 v2 v1 v0 : + counter2 andIn x v1 v0 + counter2 x andOut v3 v2 + +def counter8 andIn andOut v7 v6 v5 v4 v3 v2 v1 v0 : + counter4 andIn x v3 v2 v1 v0 + counter4 x andOut v7 v6 v5 v4 + +def shift2 shiftIn q1 q0 : + flipFlop c shiftIn q1 + flipFlop c q1 q0 + +def shift4 shiftIn q3 q2 q1 q0 : + shift2 shiftIn q3 q2 + shift2 q2 q1 q0 + +def shift8 shiftIn q7 q6 q5 q4 q3 q2 q1 q0 : + shift4 shiftIn q7 q6 q5 q4 + shift4 q4 q3 q2 q1 q0 + +def shiftOne q7 q6 q5 q4 q3 q2 q1 q0 : + flipFlop c 1 q + inv q shiftIn + shift8 shiftIn q7 q6 q5 q4 q3 q2 q1 q0 + +def loop q7 q6 q5 q4 q3 q2 q1 q0 : + flipFlop c 1 q + inv q shiftIn + shift8 shiftIn q7 q6 q5 q4 q3 q2 q1 q0 + buf q0 shiftIn + +# 1-bit adder +def mAdder add carryInNeg carryIn a b carryOutNeg carryOut sum : + trans add b s + zuseFullAdder carryInNeg carryIn a s carryOutNeg carryOut sum + +# 2-bit adder +def mAdder2 add carryInNeg carryIn a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + mAdder add carryInNeg carryIn a0 b0 cOutNeg cOut s0 + mAdder add cOutNeg cOut a1 b1 carryOutNeg carryOut s1 + +# 4-bit adder +def mAdder4 add carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + mAdder2 add carryInNeg carryIn a1 a0 b1 b0 cOutNeg cOut s1 s0 + mAdder2 add cOutNeg cOut a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# 8-bit adder +def mAdder8 add + carryInNeg carryIn a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + mAdder4 add carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + cOutNeg cOut s3 s2 s1 s0 + mAdder4 add cOutNeg cOut a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# 16-bit adder +def mAdder16 add + carryInNeg carryIn a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s15 s14 s13 s12 s11 s10 s9 s8 s7 s6 s5 s4 s3 s2 s1 s0 : + mAdder8 add carryInNeg carryIn a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 + cOutNeg cOut s7 s6 s5 s4 s3 s2 s1 s0 + mAdder8 add cOutNeg cOut + a15 a14 a13 a12 a11 a10 a9 a8 b15 b14 b13 b12 b11 b10 b9 b8 + carryOutNeg carryOut s15 s14 s13 s12 s11 s10 s9 s8 + +def multiplier + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0 : + mAdder16 b0 1 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 + 0 0 d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 + mAdder16 b1 1 0 + d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 + 0 0 0 0 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 + 0 0 e15 e14 e13 e12 e11 e10 e9 e8 e7 e6 e5 e4 e3 e2 e1 e0 + mAdder16 b2 1 0 + e15 e14 e13 e12 e11 e10 e9 e8 e7 e6 e5 e4 e3 e2 e1 e0 + 0 0 0 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 + 0 0 f15 f14 f13 f12 f11 f10 f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 + mAdder16 b3 1 0 + f15 f14 f13 f12 f11 f10 f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 + 0 0 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 0 + 0 0 g15 g14 g13 g12 g11 g10 g9 g8 g7 g6 g5 g4 g3 g2 g1 g0 + mAdder16 b4 1 0 + g15 g14 g13 g12 g11 g10 g9 g8 g7 g6 g5 g4 g3 g2 g1 g0 + 0 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 0 0 + 0 0 h15 h14 h13 h12 h11 h10 h9 h8 h7 h6 h5 h4 h3 h2 h1 h0 + mAdder16 b5 1 0 + h15 h14 h13 h12 h11 h10 h9 h8 h7 h6 h5 h4 h3 h2 h1 h0 + 0 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 0 0 0 + 0 0 i15 i14 i13 i12 i11 i10 i9 i8 i7 i6 i5 i4 i3 i2 i1 i0 + mAdder16 b6 1 0 + i15 i14 i13 i12 i11 i10 i9 i8 i7 i6 i5 i4 i3 i2 i1 i0 + 0 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 0 0 0 0 + 0 0 j15 j14 j13 j12 j11 j10 j9 j8 j7 j6 j5 j4 j3 j2 j1 j0 + mAdder16 b7 1 0 + j15 j14 j13 j12 j11 j10 j9 j8 j7 j6 j5 j4 j3 j2 j1 j0 + 0 a7 a6 a5 a4 a3 a2 a1 a0 0 0 0 0 0 0 0 + 0 0 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0 + +# 16-bit Partial Adder/Subtractor +def xFullAdder16 subtract carryInNeg carryIn + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s15 s14 s13 s12 s11 s10 s9 s8 s7 s6 s5 s4 s3 s2 s1 s0 : + xFullAdder8 subtract carryInNeg carryIn + a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 + cOutNeg cOut s7 s6 s5 s4 s3 s2 s1 s0 + xFullAdder8 subtract cOutNeg cOut + a15 a14 a13 a12 a11 a10 a9 a8 b15 b14 b13 b12 b11 b10 b9 b8 + carryOutNeg carryOut s15 s14 s13 s12 s11 s10 s9 s8 + +# 16-bit Adder/Subtractor +def adderSubtractor16 subtract + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s15 s14 s13 s12 s11 s10 s9 s8 s7 s6 s5 s4 s3 s2 s1 s0 : + inv subtract carryInNeg + xFullAdder16 subtract carryInNeg subtract + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg cOut s15 s14 s13 s12 s11 s10 s9 s8 s7 s6 s5 s4 s3 s2 s1 s0 + xor cOut subtract carryOut + +def signedMultiplier signed + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0 : + and signed a7 negateA + and signed b7 negateB + adderSubtractor negateA 0 0 0 0 0 0 0 0 + a7 a6 a5 a4 a3 a2 a1 a0 0 c7 c6 c5 c4 c3 c2 c1 c0 + adderSubtractor negateB 0 0 0 0 0 0 0 0 + b7 b6 b5 b4 b3 b2 b1 b0 0 d7 d6 d5 d4 d3 d2 d1 d0 + multiplier + c7 c6 c5 c4 c3 c2 c1 c0 + d7 d6 d5 d4 d3 d2 d1 d0 + q15 q14 q13 q12 q11 q10 q9 q8 q7 q6 q5 q4 q3 q2 q1 q0 + xor a7 b7 negateProduct + and signed negateProduct negateQ + adderSubtractor16 negateQ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + q15 q14 q13 q12 q11 q10 q9 q8 q7 q6 q5 q4 q3 q2 q1 q0 + 0 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0 + +# 4-input OR gate +def or4 i3 i2 i1 i0 o : + or i3 i2 o + or i1 i0 o + +# 8-input OR gate +def or8 i7 i6 i5 i4 i3 i2 i1 i0 o : + or4 i7 i6 i5 i4 o + or4 i3 i2 i1 i0 o + +def multiplier2 + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0 : + + # 16-bit register made of flip flops + flipFlop c d15 p15 + flipFlop c d14 p14 + flipFlop c d13 p13 + flipFlop c d12 p12 + flipFlop c d11 p11 + flipFlop c d10 p10 + flipFlop c d9 p9 + flipFlop c d8 p8 + flipFlop c d7 p7 + flipFlop c d6 p6 + flipFlop c d5 p5 + flipFlop c d4 p4 + flipFlop c d3 p3 + flipFlop c d2 p2 + flipFlop c d1 p1 + flipFlop c d0 p0 + + # Transmission gates and 8-bit adder + trans8 loadB d7 d6 d5 d4 d3 d2 d1 d0 b7 b6 b5 b4 b3 b2 b1 b0 + trans8 p0 a7 a6 a5 a4 a3 a2 a1 a0 z7 z6 z5 z4 z3 z2 z1 z0 + zuseAdder8 1 0 p15 p14 p13 p12 p11 p10 p9 p8 z7 z6 z5 z4 z3 z2 z1 z0 + 0 s8 s7 s6 s5 s4 s3 s2 s1 s0 + trans16 tallyShift d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 + s8 s7 s6 s5 s4 s3 s2 s1 s0 p7 p6 p5 p4 p3 p2 p1 + trans16 keepValue d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 + p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0 + + # State machine + flipFlop c 1 boot + inv boot loadB + flipFlop c loadB state1 + flipFlop c state1 state2 + flipFlop c state2 state3 + flipFlop c state3 state4 + flipFlop c state4 state5 + flipFlop c state5 state6 + flipFlop c state6 state7 + flipFlop c state7 state8 + flipFlop c state8 keepValue + or8 state1 state2 state3 state4 state5 state6 state7 state8 tallyShift + buf keepValue keepValue + +# 170 x 105 = 17850 +run 1000 3 multiplier2 + 1 0 1 0 1 0 1 0 + 0 1 1 0 1 0 0 1 + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? + + + + + diff --git a/2006/birken/oneline.tofu b/2006/birken/oneline.tofu new file mode 100644 index 000000000..bad7a9706 --- /dev/null +++ b/2006/birken/oneline.tofu @@ -0,0 +1 @@ +run 3 1 r 1 1 ? ? diff --git a/2006/birken/shift.tofu b/2006/birken/shift.tofu new file mode 100644 index 000000000..c7b1f0e86 --- /dev/null +++ b/2006/birken/shift.tofu @@ -0,0 +1,323 @@ +# Four double-pole relay +def r4 coil l3 nd3 nc3 l2 nd2 nc2 l1 nd1 nc1 l0 nd0 nc0 : + r coil l3 nd3 nc3 + r coil l2 nd2 nc2 + r coil l1 nd1 nc1 + r coil l0 nd0 nc0 + +# Buffer +def buf input output : + r input output 1 0 + +# Inverter +def inv input output : + r input output 0 1 + +# AND Gate +def and i1 i0 o : + r i0 z 1 0 + r i1 o z 0 + +# NAND Gate +def nand i0 i1 o : + r i0 1 0 o + r i1 1 0 o + +# OR Gate +def or i0 i1 o : + r i0 1 o 0 + r i1 1 o 0 + +# NOR Gate +def nor i0 i1 o : + r i0 1 0 z + r i1 z 0 o + +# XOR Gate +def xor i0 i1 o : + r i0 1 b a + r i1 o a b + +# XNOR Gate +def xnor i0 i1 o : + r i0 1 a b + r i1 o a b + +# Half Adder +def halfAdder a b s1 s0 : + and a b s1 + xor a b s0 + +# Full Adder +def fullAdder carryIn a b carryOut sum : + halfAdder a b s1 s0 + halfAdder s0 carryIn carry sum + or s1 carry carryOut + +# 2-bit Adder +def adder2 carryIn a1 a0 b1 b0 carryOut s1 s0 : + fullAdder carryIn a0 b0 carry s0 + fullAdder carry a1 b1 carryOut s1 + +# 4-bit Adder +def adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carryOut s3 s2 s1 s0 : + adder2 carryIn a1 a0 b1 b0 carry s1 s0 + adder2 carry a3 a2 b3 b2 carryOut s3 s2 + +# 8-bit Adder +def adder8 carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carry s3 s2 s1 s0 + adder4 carry a7 a6 a5 a4 b7 b6 b5 b4 carryOut s7 s6 s5 s4 + +# Konrad Zuse Dual-Rail-Carry Full Adder +def zuseFullAdder carryInNeg carryIn a b carryOutNeg carryOut sum : + r4 a carryInNeg y z sum w x 1 v y carryIn u v + r4 b carryOutNeg z y carryInNeg x w carryIn w x carryOut v u + +# Konrad Zuse Dual-Rail-Carry 2-bit Adder +def zuseAdder2 carryInNeg carryIn a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + zuseFullAdder carryInNeg carryIn a0 b0 cOutNeg cOut s0 + zuseFullAdder cOutNeg cOut a1 b1 carryOutNeg carryOut s1 + +# Konrad Zuse Dual-Rail-Carry 4-bit Adder +def zuseAdder4 carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + zuseAdder2 carryInNeg carryIn a1 a0 b1 b0 cOutNeg cOut s1 s0 + zuseAdder2 cOutNeg cOut a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# Konrad Zuse Dual-Rail-Carry 8-bit Adder +def zuseAdder8 carryInNeg carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + zuseAdder4 carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 cOutNeg cOut s3 s2 s1 s0 + zuseAdder4 cOutNeg cOut a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# 1-bit Partial Adder/Subtractor +def xFullAdder subtract carryInNeg carryIn a b carryOutNeg carryOut sum : + xor subtract b bNeg + zuseFullAdder carryInNeg carryIn a bNeg carryOutNeg carryOut sum + +# 2-bit Partial Adder/Subtractor +def xFullAdder2 subtract carryInNeg carryIn + a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + xFullAdder subtract carryInNeg carryIn a0 b0 cOutNeg cOut s0 + xFullAdder subtract cOutNeg cOut a1 b1 carryOutNeg carryOut s1 + +# 4-bit Partial Adder/Subtractor +def xFullAdder4 subtract carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + xFullAdder2 subtract carryInNeg carryIn a1 a0 b1 b0 cOutNeg cOut s1 s0 + xFullAdder2 subtract cOutNeg cOut a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# 8-bit Partial Adder/Subtractor +def xFullAdder8 subtract carryInNeg carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + xFullAdder4 subtract carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + cOutNeg cOut s3 s2 s1 s0 + xFullAdder4 subtract cOutNeg cOut a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# 8-bit Adder/Subtractor +def adderSubtractor subtract + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + inv subtract carryInNeg + xFullAdder8 subtract carryInNeg subtract + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg cOut s7 s6 s5 s4 s3 s2 s1 s0 + xor cOut subtract carryOut + +# 2-to-1 Mux +def mux a i1 i0 o : + r a o i1 i0 + +# 4-to-1 Mux +def mux4to1 a1 a0 i3 i2 i1 i0 o : + mux a0 i1 i0 x + mux a0 i3 i2 y + mux a1 y x o + +# 8-to-1 Mux +def mux8to1 a2 a1 a0 i7 i6 i5 i4 i3 i2 i1 i0 o : + mux4to1 a1 a0 i3 i2 i1 i0 x + mux4to1 a1 a0 i7 i6 i5 i4 y + mux a2 y x o + +# 3-to-8 Decoder +def decoder3to8 a2 a1 a0 o7 o6 o5 o4 o3 o2 o1 o0 : + mux8to1 a2 a1 a0 o7 o6 o5 o4 o3 o2 o1 o0 1 + +def trans enabled a b : + r enabled a b 0 + +# 2-bit transmission gate +def trans2 enabled a1 a0 b1 b0 : + trans enabled a1 b1 + trans enabled a0 b0 + +# 4-bit transmission gate +def trans4 enabled a3 a2 a1 a0 b3 b2 b1 b0 : + trans2 enabled a3 a2 b3 b2 + trans2 enabled a1 a0 b1 b0 + +# 8-bit transmission gate +def trans8 enabled a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 : + trans4 enabled a7 a6 a5 a4 b7 b6 b5 b4 + trans4 enabled a3 a2 a1 a0 b3 b2 b1 b0 + +# 16-bit transmission gate +def trans16 enabled + a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 + b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 : + trans8 enabled a15 a14 a13 a12 a11 a10 a9 a8 b15 b14 b13 b12 b11 b10 b9 b8 + trans8 enabled a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0 + +# Latch, stores when w = 1 +def latch w d q : + mux w d q z + buf z q + +# Latch, stores when w = 0 +def latchNeg w d q : + mux w q d z + buf z q + +# Flip flop, stores when w rises to 1, expresses new value when w drops to 0 +def flipFlop w d q : + latch w d q2 + latchNeg w q2 q + +def flipFlopRegister w d7 d6 d5 d4 d3 d2 d1 d0 q7 q6 q5 q4 q3 q2 q1 q0: + flipFlop w d7 q7 + flipFlop w d6 q6 + flipFlop w d5 q5 + flipFlop w d4 q4 + flipFlop w d3 q3 + flipFlop w d2 q2 + flipFlop w d1 q1 + flipFlop w d0 q0 + +def latchRegister w d7 d6 d5 d4 d3 d2 d1 d0 q7 q6 q5 q4 q3 q2 q1 q0: + latch w d7 q7 + latch w d6 q6 + latch w d5 q5 + latch w d4 q4 + latch w d3 q3 + latch w d2 q2 + latch w d1 q1 + latch w d0 q0 + +def tinyLatchRegister writeNeg d7 d6 d5 d4 d3 d2 d1 d0 : + r d7 d7 writeNeg 0 + r d6 d6 writeNeg 0 + r d5 d5 writeNeg 0 + r d4 d4 writeNeg 0 + r d3 d3 writeNeg 0 + r d2 d2 writeNeg 0 + r d1 d1 writeNeg 0 + r d0 d0 writeNeg 0 + +def memoryRegister select load d7 d6 d5 d4 d3 d2 d1 d0 : + inv load writeNeg + inv writeNeg select + trans8 select d7 d6 d5 d4 d3 d2 d1 d0 z7 z6 z5 z4 z3 z2 z1 z0 + tinyLatchRegister writeNeg z7 z6 z5 z4 z3 z2 z1 z0 + +# 2 Bytes of memory +def memory2 address select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux address select1 select0 select + mux address load1 load0 load + memoryRegister select0 load0 d7 d6 d5 d4 d3 d2 d1 d0 + memoryRegister select1 load1 d7 d6 d5 d4 d3 d2 d1 d0 + +# 4 Bytes of memory +def memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a1 select1 select0 select + mux a1 load1 load0 load + memory2 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory2 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 8 Bytes of memory +def memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a2 select1 select0 select + mux a2 load1 load0 load + memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory4 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 16 Bytes of memory +def memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a3 select1 select0 select + mux a3 load1 load0 load + memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory8 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 32 Bytes of memory +def memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a4 select1 select0 select + mux a4 load1 load0 load + memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory16 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 64 Bytes of memory +def memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a5 select1 select0 select + mux a5 load1 load0 load + memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory32 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 128 Bytes of memory +def memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a6 select1 select0 select + mux a6 load1 load0 load + memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory64 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +# 256 Bytes of memory +def memory256 a7 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 : + mux a7 select1 select0 select + mux a7 load1 load0 load + memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + memory128 a6 a5 a4 a3 a2 a1 a0 select load d7 d6 d5 d4 d3 d2 d1 d0 + +def counterElement andIn andOut value : + xor andIn value data + flipFlop c data value + and andIn value andOut + +def counter2 andIn andOut v1 v0 : + counterElement andIn x v0 + counterElement x andOut v1 + +def counter4 andIn andOut v3 v2 v1 v0 : + counter2 andIn x v1 v0 + counter2 x andOut v3 v2 + +def counter8 andIn andOut v7 v6 v5 v4 v3 v2 v1 v0 : + counter4 andIn x v3 v2 v1 v0 + counter4 x andOut v7 v6 v5 v4 + +def shift2 shiftIn q1 q0 : + flipFlop c shiftIn q1 + flipFlop c q1 q0 + +def shift4 shiftIn q3 q2 q1 q0 : + shift2 shiftIn q3 q2 + shift2 q2 q1 q0 + +def shift8 shiftIn q7 q6 q5 q4 q3 q2 q1 q0 : + shift4 shiftIn q7 q6 q5 q4 + shift4 q4 q3 q2 q1 q0 + +run 100 5 shift8 1 ? ? ? ? ? ? ? ? + + + diff --git a/2006/birken/zuse.tofu b/2006/birken/zuse.tofu new file mode 100644 index 000000000..a074fa475 --- /dev/null +++ b/2006/birken/zuse.tofu @@ -0,0 +1,106 @@ +# Four double-pole relay +def r4 coil l3 nd3 nc3 l2 nd2 nc2 l1 nd1 nc1 l0 nd0 nc0 : + r coil l3 nd3 nc3 + r coil l2 nd2 nc2 + r coil l1 nd1 nc1 + r coil l0 nd0 nc0 + +# Buffer +def buf input output : + r input output 1 0 + +# Inverter +def inv input output : + r input output 0 1 + +# AND Gate +def and i1 i0 o : + r i0 z 1 0 + r i1 o z 0 + +# NAND Gate +def nand i0 i1 o : + r i0 1 0 o + r i1 1 0 o + +# OR Gate +def or i0 i1 o : + r i0 1 o 0 + r i1 1 o 0 + +# NOR Gate +def nor i0 i1 o : + r i0 1 0 z + r i1 z 0 o + +# XOR Gate +def xor i0 i1 o : + r i0 1 b a + r i1 o a b + +# XNOR Gate +def xnor i0 i1 o : + r i0 1 a b + r i1 o a b + +# Half Adder +def halfAdder a b s1 s0 : + and a b s1 + xor a b s0 + +# Full Adder +def fullAdder carryIn a b carryOut sum : + halfAdder a b s1 s0 + halfAdder s0 carryIn carry sum + or s1 carry carryOut + +# 2-bit Adder +def adder2 carryIn a1 a0 b1 b0 carryOut s1 s0 : + fullAdder carryIn a0 b0 carry s0 + fullAdder carry a1 b1 carryOut s1 + +# 4-bit Adder +def adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carryOut s3 s2 s1 s0 : + adder2 carryIn a1 a0 b1 b0 carry s1 s0 + adder2 carry a3 a2 b3 b2 carryOut s3 s2 + +# 8-bit Adder +def adder8 carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carry s3 s2 s1 s0 + adder4 carry a7 a6 a5 a4 b7 b6 b5 b4 carryOut s7 s6 s5 s4 + +# Konrad Zuse Dual-Rail-Carry Full Adder +def zuseFullAdder carryInNeg carryIn a b carryOutNeg carryOut sum : + r4 a carryInNeg y z sum w x 1 v y carryIn u v + r4 b carryOutNeg z y carryInNeg x w carryIn w x carryOut v u + +# Konrad Zuse Dual-Rail-Carry 2-bit Adder +def zuseAdder2 carryInNeg carryIn a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + zuseFullAdder carryInNeg carryIn a0 b0 cOutNeg cOut s0 + zuseFullAdder cOutNeg cOut a1 b1 carryOutNeg carryOut s1 + +# Konrad Zuse Dual-Rail-Carry 4-bit Adder +def zuseAdder4 carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + zuseAdder2 carryInNeg carryIn a1 a0 b1 b0 cOutNeg cOut s1 s0 + zuseAdder2 cOutNeg cOut a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# Konrad Zuse Dual-Rail-Carry 8-bit Adder +def zuseAdder8 carryInNeg carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + zuseAdder4 carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 cOutNeg cOut s3 s2 s1 s0 + zuseAdder4 cOutNeg cOut a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# 57 + 142 = ? +run 100 1 zuseAdder8 1 0 + 0 0 1 1 1 0 0 1 + 1 0 0 0 1 1 1 0 +? ? ? ? ? ? ? ? ? ? + + diff --git a/2006/birken/zuse2.tofu b/2006/birken/zuse2.tofu new file mode 100644 index 000000000..30bd60145 --- /dev/null +++ b/2006/birken/zuse2.tofu @@ -0,0 +1,105 @@ +# Four double-pole relay +def r4 coil l3 nd3 nc3 l2 nd2 nc2 l1 nd1 nc1 l0 nd0 nc0 : + r coil l3 nd3 nc3 + r coil l2 nd2 nc2 + r coil l1 nd1 nc1 + r coil l0 nd0 nc0 + +# Buffer +def buf input output : + r input output 1 0 + +# Inverter +def inv input output : + r input output 0 1 + +# AND Gate +def and i1 i0 o : + r i0 z 1 0 + r i1 o z 0 + +# NAND Gate +def nand i0 i1 o : + r i0 1 0 o + r i1 1 0 o + +# OR Gate +def or i0 i1 o : + r i0 1 o 0 + r i1 1 o 0 + +# NOR Gate +def nor i0 i1 o : + r i0 1 0 z + r i1 z 0 o + +# XOR Gate +def xor i0 i1 o : + r i0 1 b a + r i1 o a b + +# XNOR Gate +def xnor i0 i1 o : + r i0 1 a b + r i1 o a b + +# Half Adder +def halfAdder a b s1 s0 : + and a b s1 + xor a b s0 + +# Full Adder +def fullAdder carryIn a b carryOut sum : + halfAdder a b s1 s0 + halfAdder s0 carryIn carry sum + or s1 carry carryOut + +# 2-bit Adder +def adder2 carryIn a1 a0 b1 b0 carryOut s1 s0 : + fullAdder carryIn a0 b0 carry s0 + fullAdder carry a1 b1 carryOut s1 + +# 4-bit Adder +def adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carryOut s3 s2 s1 s0 : + adder2 carryIn a1 a0 b1 b0 carry s1 s0 + adder2 carry a3 a2 b3 b2 carryOut s3 s2 + +# 8-bit Adder +def adder8 carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + adder4 carryIn a3 a2 a1 a0 b3 b2 b1 b0 carry s3 s2 s1 s0 + adder4 carry a7 a6 a5 a4 b7 b6 b5 b4 carryOut s7 s6 s5 s4 + +# Konrad Zuse Dual-Rail-Carry Full Adder +def zuseFullAdder carryInNeg carryIn a b carryOutNeg carryOut sum : + r4 a carryInNeg y z sum w x 1 v y carryIn u v + r4 b carryOutNeg z y carryInNeg x w carryIn w x carryOut v u + +# Konrad Zuse Dual-Rail-Carry 2-bit Adder +def zuseAdder2 carryInNeg carryIn a1 a0 b1 b0 carryOutNeg carryOut s1 s0 : + zuseFullAdder carryInNeg carryIn a0 b0 cOutNeg cOut s0 + zuseFullAdder cOutNeg cOut a1 b1 carryOutNeg carryOut s1 + +# Konrad Zuse Dual-Rail-Carry 4-bit Adder +def zuseAdder4 carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 + carryOutNeg carryOut s3 s2 s1 s0 : + zuseAdder2 carryInNeg carryIn a1 a0 b1 b0 cOutNeg cOut s1 s0 + zuseAdder2 cOutNeg cOut a3 a2 b3 b2 carryOutNeg carryOut s3 s2 + +# Konrad Zuse Dual-Rail-Carry 8-bit Adder +def zuseAdder8 carryInNeg carryIn + a7 a6 a5 a4 a3 a2 a1 a0 + b7 b6 b5 b4 b3 b2 b1 b0 + carryOutNeg carryOut s7 s6 s5 s4 s3 s2 s1 s0 : + zuseAdder4 carryInNeg carryIn a3 a2 a1 a0 b3 b2 b1 b0 cOutNeg cOut s3 s2 s1 s0 + zuseAdder4 cOutNeg cOut a7 a6 a5 a4 b7 b6 b5 b4 + carryOutNeg carryOut s7 s6 s5 s4 + +# 255 + 1 = ? +run 100 1 zuseAdder8 1 0 + 1 1 1 1 1 1 1 1 + 0 0 0 0 0 0 0 1 + ? ? ? ? ? ? ? ? ? ? + diff --git a/2006/borsanyi/Makefile b/2006/borsanyi/Makefile new file mode 100644 index 000000000..aa4f18704 --- /dev/null +++ b/2006/borsanyi/Makefile @@ -0,0 +1,31 @@ +# 2006 makefile +# +# Copyright (C) 2006-2009, Landon Curt Noll, Simon Cooper, Peter Seebach +# and Leonid A. Broukhis. All Rights Reserved. Permission for personal, +# educational or non-profit use is granted provided this copyright and +# notice are included in its entirety and remains unaltered. All other +# uses must receive prior permission from the contest judges. + +# data files for this entry +# +DATA= + + +build: ${ENTRY} + + +clean: + -${RM} ${ENTRY} + +clobber: clean + + +alt: + + +data: + + +${ENTRY}: ${ENTRY}.c ${DATA} + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} + diff --git a/2006/borsanyi/borsanyi.c b/2006/borsanyi/borsanyi.c new file mode 100644 index 000000000..e433de173 --- /dev/null +++ b/2006/borsanyi/borsanyi.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#undef D +#undef E +#undef U +#ifndef C +#define I int n,r; +#define D(N) void*N(void*); +#define C pthread_create +#define E int l;char *ak(char *u){return (*u=(l+=6,*u)=\ +='@'?'K':*u=='.'?'P':*u=='-'?'M':tolower(*u))?ak(u+1)-1:u;} +#define U int +#elif ! defined J +#define H "x\0\b\0\200\1\0\0\0\0\377\377\377,\0\0\0\0x\0\b\0\0\3" +#define E tn; char h[30]="GIF87a" H;void *(*fn[25])(void*)={ +#define U }; +#define D(N) N, +#define L return fwrite("\1\t\0;",1,4,stdout)!=4; +#define K {I for(r=0;r<8;r++)for(n=0,putchar(l);n example.gif + +This entry uses a very user-friendly representation of the font +it uses (with a few exceptions). Check out the source and see +yourself! :-) + +The resulting GIF file is likely to puzzle optical character +recognition tools. The amount ofimagination necessary to +recognise the @ character will certainly challenge a few +anti-CAPTCHA tools. + +## Author's comments: + +Email address to gif converter +============================== + +Introduction: +------------- + +Most spam robots collect email addresses from the web sites of +innocent people, like you. Conference organizers cannot disclose +the participant's address to prevent malicious users from +grabbing them. One solution is to write as my_email _at_ address +_dot_ com. But robots are clever enough to sort that out. A +more sophisticated approach is to create an image file with the +email address and put that on the web page. + +This program creates a GIF image file from the address given +in the command line. To avoid complications with patent issues +the LZW compression feature is not used. A typical email address +is stored in less than 1-2 kilobytes. + +Usage: +------ + + $ gcc email.c -lpthread -o email + $ ./email my@email.address.com > email.gif + $ my_favourite_gif_viewer email.gif + +The address cannot be longer than 42 characters, and may consist of +the characters: a-z_A-Z0-9@.- +The program is (like email addresses are) case insensitive. + +Obfuscation: +------------ + +Multicore support is a must in present-day applications. This +entry supports up to 25 cores. The odd names in the bottom +part of the program do have a meaning, they are not there just +for obfuscation. The preprocessor is used to keep the program +small, in fact, everything is a macro. Are you familiar with +the GIF format? Studying this program will give you a (very +little) insight. + +Questions: +---------- + +After analyzing the source code, try to answer these questions: +1. How can you add a further supported symbol? +2. Can you alter the look of the output characters? +3. What limits the number of input characters to 42? + +Portability: +------------ + +The program uses posix threads (using the linker flag -lpthread). +The program accepts email addresses not longer than 42 bytes +composed from letters, digits, and the @._- symbols. An address +not obeying these rules will cause undefined behaviour. The +program is not expected to depend on endianness. The standard +output is used for a binary output, which might cause problems. +To avoid most caveats, the program does not output the octet +0x0a. The program assumes the use of ASCII. diff --git a/2006/grothe/Makefile b/2006/grothe/Makefile new file mode 100644 index 000000000..b3a4d2629 --- /dev/null +++ b/2006/grothe/Makefile @@ -0,0 +1,35 @@ +# 2006 makefile +# +# Copyright (C) 2006-2009, Landon Curt Noll, Simon Cooper, Peter Seebach +# and Leonid A. Broukhis. All Rights Reserved. Permission for personal, +# educational or non-profit use is granted provided this copyright and +# notice are included in its entirety and remains unaltered. All other +# uses must receive prior permission from the contest judges. + +# Special flags for this entry +# +LOCAL_FLAGS= -I${X11_INCDIR} -L${X11_LIBDIR} -lX11 ${OPT} + +# Data files for this entry +# +DATA= arabian.txt olympic.txt twinkle.txt test.txt + + +build: ${ENTRY} + + +clean: + -${RM} ${ENTRY} + + +clobber: clean + + +alt: + + +data: + + +${ENTRY}: ${ENTRY}.c ${DATA} + ${CC} ${CFLAGS} ${LOCAL_FLAGS} ${ENTRY}.c -o ${ENTRY} diff --git a/2006/grothe/arabian.txt b/2006/grothe/arabian.txt new file mode 100644 index 000000000..34510ef43 --- /dev/null +++ b/2006/grothe/arabian.txt @@ -0,0 +1 @@ +453,54,4569564459,9#95458,8987453 54 diff --git a/2006/grothe/grothe.c b/2006/grothe/grothe.c new file mode 100644 index 000000000..3a89d944a --- /dev/null +++ b/2006/grothe/grothe.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include +#include +#include + +static +Display +*b;static +Window d; static GC e; +static int f,g,i;static +double j,k;static void l +(int m){int _=00,__,x;double +y,_x;y=m/j*02.0;_x=k/j*02.0;(void) +XSetForeground(b,e,BlackPixel(b,DefaultScreen +(b)));(void)XFillRectangle(b,d,e,00,00,(unsigned +int)g,(unsigned int)f);if(m==00){for(__=0x0;__ + +Tempest AM - Another early program in this field + +> + +Paper by Markus G. Kuhn's and Ross J. Anderson's, +"Soft Tempest: Hidden Data Transmission Using Electromagnetic Emanations" + +> diff --git a/2006/grothe/olympic.txt b/2006/grothe/olympic.txt new file mode 100644 index 000000000..5a684e7b5 --- /dev/null +++ b/2006/grothe/olympic.txt @@ -0,0 +1 @@ +3-9-91231,2222-321123123-9-91231,2222-32112321 diff --git a/2006/grothe/test.txt b/2006/grothe/test.txt new file mode 100644 index 000000000..9bbb4af49 --- /dev/null +++ b/2006/grothe/test.txt @@ -0,0 +1 @@ +123456789#0*123456789#0*123456789#0*123456789#0* diff --git a/2006/grothe/twinkle.txt b/2006/grothe/twinkle.txt new file mode 100644 index 000000000..542ae3880 --- /dev/null +++ b/2006/grothe/twinkle.txt @@ -0,0 +1 @@ +1199##9-6633221-9966332-9966332-1199#9-6633221- diff --git a/2006/guidelines.txt b/2006/guidelines.txt new file mode 100644 index 000000000..bba090b5e --- /dev/null +++ b/2006/guidelines.txt @@ -0,0 +1,558 @@ +19th International Obfuscated C Code Contest Guidelines, Hints and Comments + +Copyright (C) 2006 Leonid A. Broukhis, Simon Cooper, Landon Curt Noll and +Peter Seebach. + +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in +writing from the contest judges. + + +ABOUT THIS FILE: + + This file contains guidelines intended to help people who wish to + submit entries to the International Obfuscated C Code Contest (IOCCC + for short). + + This is not the IOCCC rules, though it does contain comments about + them. The guidelines should be viewed as hints and suggestions. + Entries that violate the guidelines but remain within the rules are + allowed. Even so, you are safer if you remain within the guidelines. + + You should read the current IOCCC rules, prior to submitting entries. + The rules are typically sent out with these guidelines. + +| WHAT'S NEW IN 2006: + +| The contest runs from 31-Dec-2006 23:59 UTC to 28-Feb-2007 23:59 UTC. + +| Only online submissions will be accepted this year. + See the following for details, + +| http://www.ioccc.org/2006/submit + +| Most of the changes in the rules and guidelines for this year have been +| marked with a "|" character on the left hand side. + +HINTS AND SUGGESTIONS: + + You are encouraged to examine the winners of previous contests. See + FOR MORE INFORMATION for details on how to get previous winners. + + Keep in mind that rules change from year to year, so some winning entries + may not be valid entries this year. What was unique and novel one year + might be 'old' the next year. + + An entry is usually examined in a number of ways. We typically apply + a number of tests to an entry: + + * look at the original source + * convert ANSI tri-graphs to ASCII + * C pre-process the source ignoring '#include' lines + * C pre-process the source ignoring '#define' and '#include' lines + * run it through a C beautifier + * examine the algorithm + * compile it (with flags to enable all warnings) + * execute it + + You should consider how your entry looks in each of the above tests. + You should ask yourself if your entry remains obscure after it has been + 'cleaned up' by the C pre-processor and a C beautifier. + + Your entry need not pass all of the above tests. In certain + cases, a test is not important. Entries that compete for the + 'strangest/most creative source layout' need not do as well as + others in terms of their algorithm. On the other hand, given + two such entries, we are more inclined to pick the entry that + does something interesting when you run it. + + We try to avoid limiting creativity in our rules. As such, we leave + the contest open for creative rule interpretation. As in real life + programming, interpreting a requirements document or a customer request + is important. For this reason, we often award 'worst abuse of the + rules' to an entry that illustrates this point in an ironic way. + + We do realize that there are holes in the rules, and invite entries + to attempt to exploit them. We will award 'worst abuse of the rules' + and then plug the hole next year. Even so, we will attempt to use + the smallest plug needed, if not smaller. :-) + + Check out your program and be sure that it works. We sometimes make + the effort to debug an entry that has a slight problem, particularly + in or near the final round. On the other hand, we have seen some + of the best entries fall down because they didn't work. + + We tend to look down on a prime number printer, that claims that + 16 is a prime number. If you do have a bug, you are better off + documenting it. Noting "this entry sometimes prints the 4th power + of a prime by mistake" would save the above entry. And sometimes, + a strange bug/feature can even help the entry! Of course, a correctly + working entry is best. + + People who are considering to just use some complex mathematical + function or state machine to spell out something such as "hello, + world!" may want to try and be more creative. + + Ultra-obfuscated programs are in some cases some cases easier to + deobfuscate than subtly-obfuscated programs. Consider using + misleading or subtle tricks layered on top of or under an + appropriate level of obfuscation. + + Programs that use VTxxx/ANSI sequences that are NOT limited to a + specific terminal brand and that can also work in a standard xterm + are considered portable. + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many ANSI C compilers dislike the following code, and so do we: + + #define d define + #d foo <-- don't expect this to turn into #define foo + + When declaring local or global variables, you should declare the type: + + int this_is_ok; + this_is_not; <-- don't use such implicit type declarations + + We suggest that you compile your entry with an ANSI C compiler. If you + must use non-ANSI C, such as K&R C, you must avoid areas that result in + compile/link errors for ANSI C compilers. For example, using gcc + local function declarations, such as: + + int + main() { + void blah() { printf("blah\n"); } + blah(); + } + + are not allowed even though their existence seems tailor made for + this contest! But for now, since they are not in wide spread use + we cannot accept entries that use them. + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using . Use instead. + +| On 28 January 2007, the Judges recinded the following guidline regarding +| "whitespace" before a preprocessor directive. + +| If you use C preprocessor directives (#define, #if, #ifdef, ...), +| the leading '#' must be the first non-whitespace character on a line. +| While some broken C preprocessors do not allow whitespace before a +| '#', most do. + + The exit() function returns void. On some broken systems have exit() + return int. Your entry should assume that exit() returns a void. + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + + One line programs should be short one line programs, say around 80 + bytes long. Getting close to 160 bytes is a bit too long in our opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS version specific + (index/strchr differences are ok, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is ok only if you warn us in the 'remark' header item) + * won't compile or run under a POSIX P1003.1/P1003.2 like systems + * depend on a utility or application not normally found on most + most POSIX P1003.1/P1003.2 like systems + * abuse the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are similar to previous winners + * are identical to previous losers :-) + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + The build file should not be used to try and get around the size + limit. It is one thing to make use of a several -D's to help out, + but it is quite another to use 200+ bytes of -D's in order to + try and squeeze the source under the size limit. You should feel + free to make use of the build file space, but you are better off + if you show some amount of restraint. + + You should try to restrict commands used on the build file to + POSIX-like or common Un*x-like commands. You can also compile + and use your own programs. If you do, try to build and execute + from the current directory. This restriction is not a hard and + absolute one. The intent is to ensure that the building if your + program is reasonably portable. + + Don't forget that the building of your program should be done + ***without human intervention***. So don't do: + + cat > prog.c + cc prog.c -o prog + + However, you can do something cute such as making your program + do something dumb (or cute) when build 'automatically'. However + when it is run with a human involved, do something more clever. + For example, one could use the build instructions: + + cc prog.c -DNONHUMAN -o prog + echo "See remarks section about alternate ways to compile" + + and then include special notes in the program "remarks" for + alternate / human intervention based building. + + We want to get away from source that is simply a compact blob of + characters. To help, we give a break to source that contains + whitespace, and in certain cases ; { or } characters. While the + number of characters excluding whitespace (tab, space, newline), + and excluding any ; { or } followed immediately by either whitespace + or end of file, must be <= 2048, the total size may be less than 4096 + bytes. This means that one may use "free of charge" up to 2048 + bytes of whitespace, or ; { or } followed by either whitespace + or end of file. + + Please do not use things like gzip to get around the size limit. + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! + + We suggest that you avoid trying for the 'smallest self-replicating' + source. The smallest, a zero byte entry, won in 1994. + + We do not like writable strings. That is, we don't want stuff like: + + char *T = "So many primes, so little time!"; + ... + T[14] = ';'; + + Please don't make use of this feature, even if your system allows it. + However, initialized char arrays are OK to write over. This is OK: + + char b[] = "Is this Ok"; + b[9] = 'K'; + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. Don't + depend on a particular type of display. For example, don't depend + on color or a given size. Don't require backing store. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. + + We don't like entries that use proprietary M*tif, Xv*ew, or OpenL*ok + toolkits, since not everyone has them. Use of OpenMotif is permitted + because it is more widely and freely available. + + You should avoid depending on a particular window manager. + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines + in the program "remarks". + + While we recognize that UN*X is not a universal operating system, the + contest does have a bias towards such systems. In an effort to expand + the scope of the contest, we phrase our bias in terms of POSIX P1003.1 + and P1003.2 standards. This will allow certain non-UN*X OS users to + submit entries. On the other hand, this is a guideline and not a rule. + We will not reject an entry based on some POSIX technicality. + + When dealing with OS and application environments, we suggest that you + be reasonable with a nod towards vanilla UN*X-like systems. POSIX will + evolve but not as much as the contest, so avoid stuff like POSIX real + time, security, etc. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION <== HINT!! + * make us laugh and/or throw up :-) (humor helps!) + + Some types of programs can't excel (tm) in some areas. Of course, your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + You are better off explaining what your entry does in the program + "remarks" section rather than leaving it obscure for the judges + as we might miss something and/or be too tired to notice. + + We freely admit that interesting, creative or humorous comments in + the program "remarks" help your chances of winning. If you had to + read so many twisted entries, you too would enjoy a good laugh or two. + We think the readers of the contest winners do as well. We do read + the program "remarks" during the judging process, so it is worth your + while to write remarkable program "remarks". + + We dislike C code with trailing control-M's (\r or \015) that results + in compilation failures. Some non-Un*x/non-Linux tools such as + MS Visual C and MS Visual C++ leave trailing control-M's on lines. + Users of such tools should strip off such control-M's before submitting + their entries. In some cases tools have a "Save As" option that will + prevent such trailing control-M's being added. + + We dislike entries that depend on non-portable libcurses features such + as halfdelay(). One should restrict libcurses to portable features + found on BSD and SVR4/System V curses. + + The rules disallow source that contains unescaped octets with values + between 128 and 255. You must use \octal or \hex escapes instead: + + /* 123456789 123456789 123456789 123456 */ + char *foo = "This string is 36 octets in length \263"; + /* This octet requires 4 octets of source ^^^^ */ + if (strlen(foo) == 36) printf("foo is 36 octets a final NUL\n"); + + Be creative! + + +ABUSING THE RULES: + + Legal abuse of the rules is somewhat encouraged. Legal rule abuse may + involve, but is not limited to, doing things that are technically + allowed by the rules and yet do not fit the spirit of what we intended + to be submitted. + + Legal rule abuse is encouraged to help promote creativity. Rule abuse + entries, regardless of if they receive an award, result in changes to + the next year's rules and guidelines. + + Legal abuse of the rules is NOT an invitation to violate the rules. + An entry that violates the rules in the opinion of the judges, WILL be + disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK! If you + have an entry that might otherwise be interesting, you might want to + submit two versions; one that does not abuse the rules and one that + does. + + If you intend to abuse the rules, indicate so in the program + "remarks". You must try to justify why you consider your rule abuse + to be allowed under the rules. That is, you must plead your case as + to why your entry is valid. Humor and/or creativity help plead a + case. + +| Abusing the web submission procedure tends to annoy us more +| than amuse us. Spend your creative energy on content of your +| entry rather than on the submission process itself. + + We are often asked why the contest rules and guidelines seem too + strange or contain mistakes, flaws or grammatical errors. One reason + is that we sometimes make genuine mistakes. But in many cases such + problems, flaws or areas of confusion are deliberate. Changes to + rules and guidelines in response to rule abuses, are done in a minimal + fashion. Often we will deliberately leave behind holes (or introduce + new ones) so that future rule abuse may continue. + + At the risk of stating the obvious, this contest is a parody of the + software development process. The rules and guidelines are only a + small part of the overall contest. Even so, one may think the contest + rules and guideline process as a parody of the sometimes tragic + mismatch between what a customer (or marketing) wants and what + engineering delivers. + + +JUDGING PROCESS: + + Entries are judged by Leonid A. Broukhis, Simon Cooper, Landon Curt Noll + and Peter Seebach. + + Each entry submitted is given an id number and subdirectory. The + "program", "info", "build" and "remarks" portions of a submission are + stored and judged from this directory. + + Any "author" and identifiable "entry" information is not read until + the judging process is complete, and then only from entries that have + won an award. + + The above process helps keep us biased for/against any one particular +| individual. Therefore you MUST refrain from putting any information +| that reveals your identity in the "program", "info", "build", or "remarks" +| portions of your entry. We are usually kept in the dark as much as you +| are until the final awards are given. We like the surprise of finding + out in the end, who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. (For the curious, + we do indicate the volume of paper consumed when presenting the IOCCC + winners at talks) + + After the initial announcement, we attempt to send EMail to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes and typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the "build" information + * reading the "program" + * reading the program "info", if any + * passing the source thru the C pre-processor + skipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + skipping over any #include files + + In later rounds, other actions are performed: + + * compiling/building the source + * running the program + * performing miscellaneous tests on the source and binary + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry will often compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code + * best X client (see OUR LIKES AND DISLIKES) + * best abuse of ANSI C + * worst abuse of the rules + * (anything else so strange that it deserves an award) + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to 8 or 10 + winners. Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry is good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + + More often than not, we select a small entry (usually one line), a + strange/creative layout entry, and an entry that abuses the contest + rules in some way. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entries. More often, the + 'best' is picked because it does well in a number of categories. + + +ANNOUNCEMENT OF WINNERS: + + The judges will post an initial announcement of who won, the name + of their award, and a very brief description of the winning entry + on the IOCCC web site: + + http://www.ioccc.org/whowon.html + + We will also submit a brief announcement story to /.: + + http://slashdot.org + + that, depending on the willingness of the /. editors, may be posted + to their site at the same time. + + Note that initial announcement will NOT contain source. This is because + the winning authors are given a chance to review the judges comments, + and test our Makefile. This review process typically takes a few weeks. + + Sometime after the initial announcement, and once the the review + by the winners has been completed, the winning source will be + posted to the IOCCC web site: + + http://www.ioccc.org/years.html + + NOTE: previous winners are available at that URL + + We will submit a story announcing the availability of the winners + to /. at the same time. + + Finally the winning entries will be posted to the following groups: + + comp.lang.c comp.lang.c.moderated alt.sources + + In addition, pointers to these postings are posted to the following + + comp.sources.misc comp.windows.x comp.programming + misc.misc comp.std.c alt.folklore.computers + + Often, winning entries are published in selected magazines from around + the world. Winners have appeared in books ("The New Hackers Dictionary") + and on T-Shirts. + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending EMail to the following address: + +| q.2006@ioccc.org (do not submit entries to this address) + +| You must include the words 'ioccc 2006 question' in the subject of your + EMail message when sending EMail to the judges. + + Questions and comments about the contest are welcome. Comments about + confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. + + Check out the IOCCC Web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ +Peter Seebach + diff --git a/2006/hamre/Makefile b/2006/hamre/Makefile new file mode 100644 index 000000000..31788eae5 --- /dev/null +++ b/2006/hamre/Makefile @@ -0,0 +1,31 @@ +# 2006 makefile +# +# Copyright (C) 2006-2009, Landon Curt Noll, Simon Cooper, Peter Seebach +# and Leonid A. Broukhis. All Rights Reserved. Permission for personal, +# educational or non-profit use is granted provided this copyright and +# notice are included in its entirety and remains unaltered. All other +# uses must receive prior permission from the contest judges. + +# data files for this entry +# +DATA= + + +build: ${ENTRY} + + +clean: + -${RM} ${ENTRY} + + +clobber: clean + + +alt: + + +data: + + +${ENTRY}: ${ENTRY}.c ${DATA} + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} diff --git a/2006/hamre/hamre.c b/2006/hamre/hamre.c new file mode 100644 index 000000000..f645c1898 --- /dev/null +++ b/2006/hamre/hamre.c @@ -0,0 +1,26 @@ +#define q [v+a] +#define c b[1] +#define O 1 q +#define o 0 q +#define r(v,a\ +)v<0&&( v*=-1, a*=-1); +#define p(v,m, s,w)*c==*#v?2 q\ + +#include + +#define JF 0 +#define JG 1 +#define JH 2 +#define JI 3 + +#define a(p,q,r,s) s=(pM=L[J##p]; ((p##0)s->M[0])(s r); U s; } + +#define k(p, q) C struct { K* M; q } p + +#define l(p) printf(O+p + +#define m(p, q) (_->P+(q<<4&0360))[017&p] + +#define n void +#define o int + +#define A char +#define B const +#define C typedef + +#define D C n +#define E C o + +#define U return +#define V(p) (p<3)?0:(p<6)?3:6 +#define W(p,q,r) ((p)q->M[r])(q) + +B A* B O = " %c%s\0\n0 1 2 3 4 5 6 7 8\n\n\0%s\n\0you win\0you: \0%1s\0%d %d\0you lose\0cpu: %c %d %d\n\0 \0"; + +D (*K)(n); + +k(F, o P[00400]; ); +k(G, F* Q; B A* R; ); +k(H, F* Q; B A* R; ); +k(I, F* Q; B A* R; ); + +D (*F0)(F*); +E (*F1)(F*); +D (*F2)(F*, o, o, o); +E (*F3)(F*, o, o, o); +D (*F4)(F*); +D (*G0)(G*, F*); +E (*G1)(G*); +E (*G2)(G*, o*, o*, o*); +E (*G3)(G*); +D (*H0)(H*, F*); +D (*I0)(I*, F*); + +n OOOO(F* _) { + o p; + c(p, 0, 0xFF) _->P[p] = 0; +} + +o OOOl(F* _) { + o p, q, r; + e(p, 0, 9, q, 0, 9, r, 1, 10) if(((F3)_->M[3])(_, p, q, r)) U 1; + U 0; +} + +n OOlO(F* _, o p, o q, o r) { + m(p,q) = r; +} + +o OOll(F* _, o r, o s, o t) { + o u = 0; + if(t > 0 && t < 10 && r >= 0 && r < 9 && s >= 0 && s < 9 && m(r,s) == 0) { + o p, q; + o w = V(r); + o x = V(s); + c(p, 0, 9) if(m(p,s) == t || m(r,p) == t) goto v; + d(p, w, w+3, q, x, x+3) if(m(p,q) == t) goto v; + u = 1; + v: U u; + } + goto v; +} + +n OlOO(F* _) { + o p, q; + for(q = 0, l(28)), p = 0; q < 9; p++, q = (p < 9)?q:(p=0,l(0), q+'a', O+((q == 2 || q == 5) ? 27 : 28)),q+1)) { + l(2), m(p,q) == 0 ? '.' : '0' + m(p,q), O+((p == 2 || p==5) ? 82 : 83)); + } + l(7)); +} + +n lOll(G* _, F* p) { + _->Q = p; + _->R = O+6; +} + +o OlOl(G* _) { + o p, q, r; + if(((G2)_->M[2])(_, &p, &q, &r)) { + ((F2)_->Q->M[2])(_->Q, p, q, r); + U 1; + } + U 0; +} + +n OllO(G* _) { + l(30), _->R); +} + +n Olll(H* _, F *p) { + lOll((G*)_, p); + _->R = O+34; +} + +o lOOO(H* _, o* p, o* q, o* r) { + do { + A s[3]; + l(42)); + fflush(stdout); + scanf(O+48, s); + if(*s == 'q') U 0; else *q = (*s >= 'a' && *s <= 'i') ? *s - 'a' : 9; + scanf(O+52, p, r); + } while(!((F3)_->Q->M[3])(_->Q, *p, *q, *r)); + U 1; +} + +n lOOl(I* _, F* p) { + lOll((G*)_, p); + _->R = O+58; +} + +o lOlO(I* _, o* p, o* q, o* r) { + o s, t, u; + o v = 0; + o w[01331]; + e(s, 0, 9, t, 0, 9, u, 1, 10) if(((F3)_->Q->M[3])(_->Q, s, t, u)) w[v++] = s | (t << 5) | (u << 10); + s = rand() % v; + *p = w[s] & 0x1f; + *q = (w[s] & 0x3e0) >> 5; + *r = (w[s] & 0x7c00) >> 10; + l(67), *q + 'a', *p, *r); + U 1; +} + +K M[17] = { + (K)OOOO, + (K)OOOl, + (K)OOlO, + (K)OOll, + (K)OlOO, + (K)0000, + (K)OlOl, + (K)0000, + (K)OllO, + (K)Olll, + (K)OlOl, + (K)lOOO, + (K)OllO, + (K)lOOl, + (K)OlOl, + (K)lOlO, + (K)OllO +} ; + +K* L[4] = { + M+0x0, + M+0x5, + M+0x9, + M+0xD +} ; + + +h(F) +i(G, F*) +i(I, F*) +i(H, F*) + +o main(o s, A** t) { + o p = 42; + + F* q = 0; + G* r[2] = { 0, 0} ; + + if(s-- > 1) { + srand(atoi(t[s])); + U main(s, t); + } + + q = NF(); + r[0] = (G*)NH(q); + r[1] = (G*)NI(q); + + for(p&=1; !(p&4); p&=5) { + W(F4,q,4); + if(W(G1,r[p],1)) { + if(!W(F1,q,1)) { + W(F4,q,4); + W(G3,r[p],3); + p = 4; + } + } else { + p = 4; + } + p++; + } + + free((n*)q); + free((n*)r[0]); + free((n*)r[1]); + + U 0; +} diff --git a/2006/monge/Makefile b/2006/monge/Makefile new file mode 100644 index 000000000..b948789f0 --- /dev/null +++ b/2006/monge/Makefile @@ -0,0 +1,41 @@ +# 2006 makefile +# +# Copyright (C) 2006-2009, Landon Curt Noll, Simon Cooper, Peter Seebach +# and Leonid A. Broukhis. All Rights Reserved. Permission for personal, +# educational or non-profit use is granted provided this copyright and +# notice are included in its entirety and remains unaltered. All other +# uses must receive prior permission from the contest judges. + +# Special flags for this entry +# +LOCAL_FLAGS= -O3 `sdl-config --libs --cflags` + +# For Mac OS X with Darwin Ports installed +# LOCAL_FLAGS= -O3 `/opt/local/bin/sdl-config --libs --cflags` + +# Data files for this entry +# +DATA= + + +build: ${ENTRY} ${ENTRY}_orig + + +clean: + -${RM} ${ENTRY} ${ENTRY}_orig + + +clobber: clean + + +alt: + + +data: + + +${ENTRY}: ${ENTRY}.c ${DATA} + ${CC} ${LOCAL_FLAGS} ${ENTRY}.c -o ${ENTRY} + +${ENTRY}_orig: ${ENTRY}_orig.c + ${CC} ${LOCAL_FLAGS} ${ENTRY}_orig.c -o ${ENTRY}_orig diff --git a/2006/monge/hint.text b/2006/monge/hint.text new file mode 100644 index 000000000..59b85fed3 --- /dev/null +++ b/2006/monge/hint.text @@ -0,0 +1,185 @@ +# Best Compiled Graphics + +Maurizio Monge +Department of Mathematics +University of Pisa +Pisa +Italy +maurizio.monge at gmail dot com + +## Judges' comments: + +### To build: + + echo Make sure you have the SDL development environment installed + make monge + +### Try: + + ./monge "z = 0" "z = z*z*z + c; Abs2(z) < 4" + +For those who are familiar with the previous IOCCC winners, this program +is best described as "1994/tvr meets 2001/bellard". Here you have +mouse-manipulated fractals AND generated binary code, all in one package. + +A more appropriate award could have been "Best abuse of the +rules", because on a non-x86-based architecture this program +is, quite predictably, a dud. + +At the time of judging we were too mesmerized by the graphics +to realize it; and, after all, this entry does take a special +effort to work on both i386 and x86_64. Portable it is! :) + +## Author's comments: + +### For the impatients + +0. Compile using the Makefile, or just run: + + gcc monge.c -o monge -O3 `sdl-config --libs --cflags` + +1. Run: + + ./monge "z = 0" "z = z*z + c; Abs2(z) < 4" + +2. Keep clicked with left or right button to zoom in or out. + +3. Use the numpad '+' and '-' to increase/decrease the iteration + count when needed. + +4. Enjoy, unless you're more interested in trying to understand + how it works. :) + +### Introduction + +This is a fractal generator that supports custom formulas and +real time zoom. The program needs to be run with two arguments, +the first being a semicolon separated list of assignments to +do once per pixel, and the second a semicolon separated list +of assignents and conditions that will be executed (and conditions +checked) for each iteration (up to the maximum). Using the +left and right mouse buttons you will be able to zoom in and +out (a la Xaos), the zooming algorithm is a bit slower than +Xaos's but it should give slightly better results. + +Formulas can use all a-z (lowercase) variables, and the special +variables 'c' and 'i' are respectively set by default to the +complex coordinate of the pixel and to the complex imaginary 'i'. + +All the constant numbers will be interpreted as real double +values. Each expression must be an assignment ([variable] = +[expr]) or a comparison with < or > ([expr1] < or > [expr2]), +and you can add spaces as you like (as understood by the c +function 'isspace'). + +Supported operations and functions are: + +> Operation | Description +> :-------- | :---------- +> +,-,*,/ | Arithmetic operations, priority of *,/ over +,- is respected. +> <,> | Compares the real parts of two complex numbers (the imaginary part is ignored). Any number of conditions is allowed, the iteration will just stop as soon as one of them fails. +> Abs2 | Calculates the squared norm, ie: Abs2(a+b*i) is (a*a+b*b)+0*i +> Re | Extract the real part, ie: Re(a+b*i) is a+0*i +> Im | Extract the imaginary part, ie: Im(a+b*i) is b+0*i +> Exp | Calculates the complex exponential, ie Exp(a+b*i) is e^a*(cos(b)+sin(b)*i) +> Ln | Calculates the principal value of the natural logarithm, ie Ln(a+b*i) is ln(a*a+b*b)/2 + atan(b/a)*i + +Here are a few examples of fractals you can draw: + +- Mandelbrot: + + ./program "z=1" "z=z*z+c; Abs2(z)<4" + +- Mandelbrot (return time variation): + + ./program "z=c" "z=z*z+c; Abs2(z-c)>0.0001" + +- Julia, for c=0.31+i*0.5: + + ./program "z=c; c=0.31+i*0.5" "z=z*z+c; Abs2(z)<4" + +- Julia (return time variation), for c=0.31+i*0.5: + + ./program "z=c; c=0.31+i*0.5" "z=z*z+c; Abs2(z-c)>0.0001" + +- Newton, for x^3-1: + + ./program "z=c" "p=z; z=0.6666*z+0.3333/(z*z); Abs2(p-z) > 0.001" + +- Newton-Mandelbrot: + + ./program "z=0" "p=z; z=z-(z*z*z + (c-1)*z - c)/(3*z*z+c-1); Abs2(p-z) > 0.001" + +- Phoenix, Mandelbrot version: + + ./program "z=0; q=0" "t=z; z=z*z+Re(c)+Im(c)*q; q=t; Abs2(z)<4" + +- Phoenix, Julia version for c=0.56667-i*0.5 + + ./program "z=c; c=0.56667-i*0.5; q=0" "t=z; z=z*z+Re(c)+Im(c)*q; q=t; Abs2(z)<4" + +### Compilation and portability + +This program will only work on x86 (with an x87 FPU) or x86_64 machines, +and requires the SDL library. + +Another system requirement is the mmap function (as #define'd +at the beginning of the program). If it is not available the +macro M(a) will have to be replaced with a system dependent +function that allocates readable, writable *AND* executable +memory (it will not be possible to make this program run on +paranoid systems (like OpenBSD IIRC) do not allow rwx memory). + +However i was able to compile and make work the program under +Linux (Debian/x86 and OpenSuSE/x86_64) and under Cygwin/x86. A +friend of mine was able to make it work under MacOSX too. + +If you want you can change the window width and height, or the default +number of iterations (that one can be tweaked at runtime, anyway) by +changing the definitions of W, H and I at the beginnning of the code. + +### Caveats (i just a selected few of them!) + +- The zooming speed depends on the speed of the computer. +- Incorrect formulas will ungracefully crash the program. +- Many SDL identifiers are hardcoded as number, this is safe up to ABI + incompatibility. +- Better optimization could be done treating known real numbers as just one + double, instead of adding a 0 imaginary part to treat them as complex + numbers. +- There should be some way to switch from Mandelbrot to Julia with choosen + parameter. + +### Spoiler + +Sure, i don't want to deprive you of the pleasure of digging +into the infernal mess created by my corrupted mind (writing +this remark i noticed that i was ending senteces with ';' instead +that with '.', and i worried for my sanity), but just in case... + +I used many obfuscation techniques, including a few ones that +are different from the tricks used in most common IOCCC program +(more 'highlevel', in the sense that they require an understanding +of how all the program works to be worked out). + +This program is a formula parser that outputs machine code that +calculates the formula and check the given conditions. The +machine code targets the x87 stack based FPU, and it is almost +identical for x86 and x86_64 (except for the comparison +instructions, that have to be generated differently). The +program keeps track of the FPU stack (the FPU has a cyclic stack +of 8 registers) and will automatically swap to and from the +main memory when required (ie, adds instructions to the generated +machine code to take care of this issue). + +The formulas are parsed recursively and machine code for the +inner iteration loop is also generated. + +After generating the machine code, a big event loop creates (or +zooms into) the factal executing the generated code when needed, +and then waits for input events. + +The zooming algorithm works by remembering for each pixel the +floating point offset to where the value was actually calculated. +When zooming, the best match is searched, and if the offset is +too big (>1) the pixel is recalculated. diff --git a/2006/monge/monge.c b/2006/monge/monge.c new file mode 100644 index 000000000..4a0e84d3b --- /dev/null +++ b/2006/monge/monge.c @@ -0,0 +1,64 @@ +#include +#include + +#include +#define M(a) mmap(0, a, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0) + +#define W 400 +#define H 300 +#define I 128 + +#define L char* +#define _ Sint32 +#define h(a,b) for(a=0; a7?J(Yv]#JJ), P(S++):o++ + :s(4); } s(_ n){ O o96?a(A),P(Z+i-97),a + (A),P (Z+*e++-71) :(p(index( e, 40)+1,1,t), i^82?i^73?i^65?i^69?i^76?1:J + (%YhY`%YmY}]YYB%YBXHYIXH$^A$YqYJ$Ys):J(%Y{YJ%Yj^IY@Y|\\iYIYp%Yh$^AY}$]Y\\J$^I) + : J(XHYIXH^AYn):J(]YYn) : J (]XYn),e= index( *t,41 )+ 1): p ( e , q+ 1, &e); A + = "&%YCXJYLXIYK\\J$^I$^k$^A"; (x -=3)<1?J(&]X]Y),1L <<31<0? J(Zi_`#JO):J(_i]X),x + ?J (#HH):J(#HC),J(#AD#IJPC) ,o-=4:--x?--x?--x?x-3?J(&%YA%YAXHYIXH^AYh$^q\\J$^IY`) + , a(A): 1:a(A):J(&$^j$^j):J(&$^B$^B); } O q==(x=*(*t=e++))/2); } main(_ r,L*U){ + X =V=(Z =(S=(K=M(Y*32))+Y)+ Y)+Y; J(h#AA#AA#AA#AA#FJ:+-*/); h(q,2){ A =E =Q=U[ q+1]; O * A=*A^B++ + [ ";<>+-*/" ]?*A:B,(B%=7)||(isspace(*E=*A)||++E,*A++)); E=V; O B=*Q){ if(Q[1]-61)p( + Q,1,&Q); else{ p(Q+2,1,&Q); h(j,2){ J(]#JJ); P(Z+B-71-j*26); o--; } } *Q&&Q++; } + } J(#PPJ#AP#IF); P (E -V+X +1); J(#IJPC); 0[u =X+7] =I; SDL_Init( 32 ); F= + SDL_SetVideoMode(W,H,8 ,0); A=F->pixels; B=F->pitch; O 1){ C^=3; h(j,H)h(i, + W )b C+2]=9; if(r=(k =SDL_GetMouseState(&x,&y))&5){ f=z/50; f=k&1 ?f:-f ; + c+=(x*T-T/R)*f; g += f*y*T-f; z*=f=1-f/z; v=1/f; h(j,H)h(i,W)h(q,4){ k= + x+(i- x)* f +q/2; l=y+(j-y)*f+q%2; if(k>=0&k=0&l +#include + +#include +#define M(a) mmap(0, a, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0) + +#define W 400 +#define H 300 +#define I 128 + +#define L char* +#define _ Sint32 +#define h(a,b) for(a=0; a7?J(Yv]#JJ), P(S++):o++ + :s(4); } s(_ n){ O o96?a(A),P(Z+i-97),a + (A),P (Z+*e++-71) :(p(index( e, 40)+1,1,t), i^82?i^73?i^65?i^69?i^76?1:J + (%YhY`%YmY}]YYB%YBXHYIXH$^A$YqYJ$Ys):J(%Y{YJ%Yj^IY@Y|\\iYIYp%Yh$^AY}$]Y\\J$^I) + : J(XHYIXH^AYn):J(]YYn) : J (]XYn),e= index( *t,41 )+ 1): p ( e , q+ 1, &e); A + = "&%YCXJYLXIYK\\J$^I$^k$^A"; (x -=3)<1?J(&]X]Y),1L <<31<0? J(Zi_`#JO):J(_i]X),x + ?J (#HH):J(#HC),J(#AD#IJPC) ,o-=4:--x?--x?--x?x-3?J(&%YA%YAXHYIXH^AYh$^q\\J$^IY`) + , a(A): 1:a(A):J(&$^j$^j):J(&$^B$^B); } O q==(x=*(*t=e++))/2); } main(_ r,L*U){ + X =V=(Z =(S=(K=M(Y*32))+Y)+ Y)+Y; J(h#AA#AA#AA#AA#FJ:+-*/); h(q,2){ A =E =Q=U[ q+1]; O * A=*A^B++ + [ ";<>+-*/" ]?*A:B,(B%=7)||(isspace(*E=*A)||++E,*A++)); E=V; O B=*Q){ if(Q[1]-61)p( + Q,1,&Q); else{ p(Q+2,1,&Q); h(j,2){ J(]#JJ); P(Z+B-71-j*26); o--; } } *Q&&Q++; } + } J(#PPJ#AP#IF); P (E -V+X +1); J(#IJPC); 0[u =X+7] =I; SDL_Init( 32 ); F= + SDL_SetVideoMode(W,H,8 ,0); A=F->pixels; B=F->pitch; O 1){ C^=3; h(j,H)h(i, + W )b C+2]=9; if(r=(k =SDL_GetMouseState(&x,&y))&5){ f=z/50; f=k&1 ?f:-f ; + c+=(x*T-T/R)*f; g += f*y*T-f; z*=f=1-f/z; v=1/f; h(j,H)h(i,W)h(q,4){ k= + x+(i- x)* f +q/2; l=y+(j-y)*f+q%2; if(k>=0&k=0&l + +## Judges' Comments: + +### To build: + + make night + +### To run: + + ./night + +You'd never guess, from looking at the code, that there is a +genetic algorithm involved. Somewhere. But what does it do? +Well, it might take you a while to navigate the results, let +alone the code. + +## Selected Author's Comments: + +Don't worry; this is not a self-reproducing program, as you might at +first guess from the layout. I would never be so foolhardy as to +submit an entry on an over-used theme! + +Oh, wait a second... it is a maze-generating program. Oops! + +### What it does: + +This program solves an optimization problem, namely, generating a +challenging maze. It uses a very simple genetic algorithm: a maze +layout's DNA is represented as a 32-bit integer, and mutations consist +of flipping three different bits. The algorithm is simple in that it +doesn't employ sexual reproduction, only mutations, and it has a +population size of 1. So much for diversity! + +This particular optimization problem, I believe, has a unique maximum: +there is but one maze out of 2^32 that requires 64 moves to solve. The +program will run until finding this global maximum, or if you get +bored, you can accept a sub-optimal solution by pressing any key. On +my system, it takes an average of 15 minutes to find the maximum, +whereas a random search would take an average of 3.5 days. + +Should you take my word for it that the maze it generates requires as +many moves as I say it does? The answer is yes. But if you're not +convinced, you can try to solve it yourself. The goal is to traverse +from the upper-left to the upper-right and out the top, where the +number of moves remaining is printed. Use the arrow keys for suckers +(w, a, s, d) to move around. q quits and r restarts. Also, the maze +changes as you move through it, in a predicatable way. It should be +easy enough to figure out the pattern. For best results, use a display +with bold-text capabilities and color. + +Finally, in the world of DNA, the medium is truly the message. There's +a short message encoded in here that will only appear when you +complete the optimal maze in the required 64 moves. + +### Issues: + +These depend on your compiler, and they were all intentionally +added for obfuscation purposes. No, really! + +My compiler warns of nulls in a string literal, and the redefinition +of the macro T. + +On one compiler, compilation took about two minutes. + +`sizeof(unsigned short)` must be 2, and `sizeof(unsigned long)` must be 4. + +CLOCKS_PER_SEC is assumed to be 1000000. If it's a lot less than that, +expect delays. + +### Algorithmic obfuscation: + +The representation of the maze layout in a 32-bit integer type is +pretty opaque. As a hint, the optimum layout's DNA is, in base 4, +2102231031201230. Try getting from there to the maze that appears on +screen. + +The recursive function CGAC replaces a nested for loop in a handy way. + +The maze-solving function TGA returns no solution both if no solution +exists, and if the search space grows too large, with a single test. + +### Stylistic obfuscation: + +Four-letter alphabets are confusing. I don't know how ribosomes +manage. + +Overloaded symbols, such as G and G(). + +Who needs != when you've got ^? + +Who needs if when you've got while? + +For that matter, who needs fixed-iteration-count for and while when +you can just duplicate code with the preprocessor? Duplication by this +macro causes one particular graphics line to be replicated 512 +times. On my system the preprocessed code is over 80KB in length, +hindering the preprocessor's ability to deobfuscate. + +Keypad support was removed to save space. To restore, modify the +following two macros to: + + #define ATG srand(time(0)); initscr(); cbreak(); noecho(); start_color(); keypad(stdscr,1); + #define AGG A&2?KEY_UP:KEY_DOWN:A&1?KEY_RIGHT:KEY_LEFT + +Code on! diff --git a/2006/night/night.c b/2006/night/night.c new file mode 100644 index 000000000..ac175d69f Binary files /dev/null and b/2006/night/night.c differ diff --git a/2006/rules.txt b/2006/rules.txt new file mode 100644 index 000000000..ef2a5bd6f --- /dev/null +++ b/2006/rules.txt @@ -0,0 +1,152 @@ + 19th International Obfuscated C Code Contest Rules + +Copyright (C) 2006 Leonid A. Broukhis, Simon Cooper, Landon Curt Noll and +Peter Seebach. + +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in +writing from the contest judges. + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: his emotions obfuscated his + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show the importance of programming style, in an ironic way. + * To stress C compilers with unusual code. + * To illustrate some of the subtleties of the C language. + * To provide a safe forum for poor C code. :-) + +The 19th IOCCC contest window is: + +| 31-Dec-2006 23:59 UTC to 28-Feb-2007 23:59 UTC + +RULES: + + To help us with the volume of entries, we ask that you follow these rules: + + 1) Your entry must be a complete program. + + 2) The size of your program source must be <= 4096 bytes in length. + The number of characters excluding whitespace (tab, space, + newline, formfeed, return), and excluding any ; { or } immediately + followed by whitespace or end of file, must be <= 2048. + + 3) Submissions should be performed using the instructions outlined at, + +| http://www.ioccc.org/2006/submit + + 4) If your entry is selected as a winner, it will be modified as follows: + + Your 'build' instructions will be incorporated into a + makefile. If your build instructions *is* a makefile then + it should be portable and usable from within a master + makefile. + + Your program source will be renamed using an identifier of + our choice (usually your family name or anonymous) followed + by an optional digit, followed by '.c' + + Your entry will be compiled into a file with the above name + minus the '.c'. + + If your entry requires that a build file exist, state so in + your entry's remark section. The makefile will be arranged to + execute a build shell script containing the 'build' + information. The name of this build shell script will be your + entry's title, possibly followed by a digit, followed by '.sh'. + + If needed, your entry's remarks should indicate how your entry + must be changed in order to deal with the new filenames. + + 5) The build file, the source and the resulting executable should be + treated as read-only files. If your entry needs to modify these files, + it should make and modify a copy of the appropriate file. If this + occurs, state so in your entry's remarks. + + 6) Your program source must be able to be compiled cleanly by an ANSI C + compiler, or if there are any compile errors, they must be documented + in the "remarks" section of your submission. + + 7) The program must be of original work. All submitted programs are + are thereby put in the public domain. All explicitly copyrighted + programs will be rejected. + +| 8) Entries must be received prior to 28-Feb-2007 23:59 UTC. + + An EMail a confirmation of submission will be sent to the sender + before the close of the contest. + + 9) Each person may submit up to 8 entries per contest year. Each entry + must be submitted separately. + + 10) Entries requiring human interaction to be built are not permitted. + + 11) Programs that require special privileges (setuid, setgid, super-user, +| special owner or group) are highly discouraged. + + 12) Legal abuse of the rules is somewhat encouraged. An entry that, in + the opinion of the judges, violates the rules will be disqualified. + Entries that attempt to abuse the rules must try to justify why + their rule abuse is legal in the submitted "remarks". + + 13) Your source may not contain unescaped octets with the high bit set. + I.e., your source may not contain octet values between 128 and 255. + + 14) Any program that fails to compile because of lines with trailing + control-M's (\r or \015) will be rejected. + + 15) When you submit your entry you must have a valid email address + that can both send and receive email. The online submission + method is a two phase process that requires the use of an + approval code. This code will be emailed to you as part of + phase 1. + + Entries submitted without a working or valid email address will + be disqualified. + + The judges are not responsible for delays in email, please plan + enough time for one automated exchange of email as part of your + submission. + + 16) You are STRONGLY encouraged to submit an original entry. + Submissions that are similar to previous entries are discouraged. + +| 17) The total size of your submission: the sum of the size of the program, +| hints, comments, build and info files MUST be less than one megabyte +| in size. + +FOR MORE INFORMATION: + + The judging will be done by Leonid A. Broukhis, Simon Cooper, Landon + Curt Noll and Peter Seebach. Please send questions or comments + about the contest, to: + +| q.2006@ioccc.org (for questions only!) + +| You must include the words ``ioccc 2006 question'' in the subject of + your EMail message when sending EMail to the judges. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, visit the IOCCC web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + Details of how to submit your entry are located at, + +| http://www.ioccc.org/2006/submit + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ +Peter Seebach + diff --git a/2006/sloane/Makefile b/2006/sloane/Makefile new file mode 100644 index 000000000..6b78d6dfc --- /dev/null +++ b/2006/sloane/Makefile @@ -0,0 +1,35 @@ +# 2006 makefile +# +# Copyright (C) 2006-2009, Landon Curt Noll, Simon Cooper, Peter Seebach +# and Leonid A. Broukhis. All Rights Reserved. Permission for personal, +# educational or non-profit use is granted provided this copyright and +# notice are included in its entirety and remains unaltered. All other +# uses must receive prior permission from the contest judges. + +# Special flags for this entry +# +LOCAL_FLAGS= ${CFLAGS} -lm + +# data files for this entry +# +DATA= + + +build: ${ENTRY} + + +clean: + -${RM} ${ENTRY} ${ENTRY}_orig + + +clobber: clean + + +alt: + + +data: + + +${ENTRY}: ${ENTRY}.c ${DATA} + ${CC} ${LOCAL_FLAGS} ${ENTRY}.c -o ${ENTRY} diff --git a/2006/sloane/hint.text b/2006/sloane/hint.text new file mode 100644 index 000000000..928225971 --- /dev/null +++ b/2006/sloane/hint.text @@ -0,0 +1,74 @@ +# Homer's Favorite + +Andy Sloane +1041 Seneca St. +Hartford, WI 53027 +US + +## Judges' Comments: + +### To build: + + make slone + +### To run: + + ./sloane + +Looks almost good enough to eat, dunnit? I suppose you could argue that, +at first blush, this looks like a self-reproducing program. + +## Selected Author's Comments: + +This program doesn't require any special build options, other than that it +uses sin and cos and hence requires the math library. + +You will almost certainly get a compiler warning because I declared a bunch +of global ints without types. The code looks better this way, though, I +think. There are also no #includes, so there may be warnings for +undeclared references to printf, etc. There's a chance that my failure to +include math.h or declare sin or cos will make the donut not render +properly -- it's worked on every system I've tried so far though. + +You will need some kind of VT100-ish emulation; so while this compiles and +runs OK in Windows, you will need PuTTYcyg or something like that. + +The shape of the source gives a hint about its output: it's a little +animation of a shaded donut rotating over an infinite checkerboard. Like +many IOCCC entries, it is thus self-documenting. + +I wanted to create something as "pure" as I could - meaning that the +entire source code is shaped into a work of art, without being prefixed +by any #define hacks, or even #includes, _and_ is portable enough to not +require any special libraries to do the animating. I achieved this with +two standard escape codes for clearing the screen and moving the cursor +back to the top-left. + +The donut isn't raytraced. It's much simpler than that. + +### How is it obfuscated? + +There are three main pieces to this program: the donut, the checkerboard, +and the ASCII logo. The first two are programmed in a straightforward way +(with z-buffering even!), but the mathematics for drawing them is +"optimized". The ASCII logo has been shrunk into the smallest I could make +it by any means necessary. + +The logo can actually be compressed much better (ironically, by doing +something simpler), but I didn't discover this until well after submitting. + +### Puzzles + +In increasing order of difficulty: + + - Can you change the shading of the donut and checkerboard? + + - Can you change the movement rates of the donut, the checkerboard, and + the scrolling logo? + + - Can you change the inner/outer radii of the donut? The height/scaling + of the checkerboard? + + - How is the "IOCCC 2006" logo encoded? Can you put something else in its + place? Can you find a smaller encoding? + diff --git a/2006/sloane/sloane.c b/2006/sloane/sloane.c new file mode 100644 index 000000000..b2f405699 --- /dev/null +++ b/2006/sloane/sloane.c @@ -0,0 +1,32 @@ +_,x,y,o ,N;char b[1920] ;p(n,c) +{for(;n --;x++) c==10?y +=80,x= +o-1:x>= 0?80>x? c !='~'?b +[y+x]=c :0: 0:0;}c( + q,l,r) char*l,*r;{while (q>=0)q + =("E" "?yYrIxC{e^}KhE>[|LXbj}" "dOVsJ" + "@" "idOV{Yab[bW}[bW}\\qFywyv{D" "ma\\A" + "" "Ztq?Lyw>e{|Zq>Y\\gq\\qI[tYBe{w" "yvDZE\ +vBA[`_" "Lo>}KcqdYrWqKxzKtW]|DXRwsfcUaT\\\ +KXw{Y" "RsFwsFwsFw{zaqyaz|FmMpyaoyI\\]cuUw{J" +[_/6] -62>>_++%6&1?r[q]:l[q])-99;return q;}E(a +){for (o=x=a,y=0,_=0;_ <1006;)a=" /\\\n" + "~|_."[c(6,"b" "cd\\a[g","^`" "_e" + "]fh")+8], p( "#$%" "&'()*+,-.1"[ c(11 + ,"_ac[]\\YZi" "jkm", "`bd^efghXWlV" )+13 + ]-34,a);}main (k,Z){ float z[1920] ,A=0 +,B=0 ,i,j; puts("" "\x1b" "[2J");for(;; +) { float e=sin(A ), n= sin(B),g=cos( +A),m =cos(B);for(k =0;k< 1840;k++)y=-k +/80- 10,o=41+(k%80- 40)*1.3/y+n,N= + A-100.0/y, b[k]= ".#"[o+N&1],z[k] =0;E( + 80-(int)(9*B)%250);for(j=0;6.28>j;j+=0.07 )for( + i=0;6.28>i;i+=0.02) { float c=sin(i),d =cos(j + ),f=sin(j),h=d+2,D=15/(c*h*e+f*g+5 ),l=cos +(i),t=c *h*g-f*e;x=40+2*D*(l*h*m-t*n),y= 12 ++D*(l*h *n+t*m),o=x+80*y,N=8*((f*e-c *d* +g)*m-c* d*e-f*g-l*d*n);if(D>z[o] )z[o] +=D,b[o] =" ..,,-++=#$@"[ N>0?N:0 + ] ; } printf( + "\x1b[" "H" );for(k =1;1841 + >k;k++) putchar (k%80?b [k]:10) + ; A += 0.053;B +=0.037 ; } } diff --git a/2006/stewart/Makefile b/2006/stewart/Makefile new file mode 100644 index 000000000..d706882ca --- /dev/null +++ b/2006/stewart/Makefile @@ -0,0 +1,39 @@ +# 2006 makefile +# +# Copyright (C) 2006-2009, Landon Curt Noll, Simon Cooper, Peter Seebach +# and Leonid A. Broukhis. All Rights Reserved. Permission for personal, +# educational or non-profit use is granted provided this copyright and +# notice are included in its entirety and remains unaltered. All other +# uses must receive prior permission from the contest judges. + +# Special flags for this entry +# +#CFLAGS= + +# data files for this entry +# +DATA= altar box box2 box3 carpet circles cross cross2 cross3 \ + crystal curve diamonds diamonds2 dragon dragon2 dragon3 \ + fern gasket gasket_mod gasket_mod2 ioccc maze octagon \ + pentagon pentagons rings rings2 spirals spirals2 spirals3 \ + spirals4 squares stars stars2 tree tree2 tree3 tree4 triangle + + +build: ${ENTRY} + + +clean: + -${RM} ${ENTRY} + + +clobber: clean + + +alt: + + +data: + + +${ENTRY}: ${ENTRY}.c ${DATA} + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} diff --git a/2006/stewart/altar b/2006/stewart/altar new file mode 100644 index 000000000..8eedde68b --- /dev/null +++ b/2006/stewart/altar @@ -0,0 +1,6 @@ +3 0 0 1 1 + -.5 0 0 .5 .5 0 .333 + .5 0 0 .5 .5 0 .333 + 0 -.5 .5 0 .5 .5 .334 + + diff --git a/2006/stewart/box b/2006/stewart/box new file mode 100644 index 000000000..d53e008df --- /dev/null +++ b/2006/stewart/box @@ -0,0 +1,5 @@ +4 0 0 1 1 + 0 -.5 .5 0 .5 0 .25 + .5 0 0 .5 0 .5 .25 + -.5 0 0 .5 1 .5 .25 +.333 0 0 .333 .33 .33 .25 diff --git a/2006/stewart/box2 b/2006/stewart/box2 new file mode 100644 index 000000000..cfc7e4b9d --- /dev/null +++ b/2006/stewart/box2 @@ -0,0 +1,7 @@ +5 0 0 1 1 + 0 -.5 .5 0 .5 0 .1 + .5 0 0 .5 0 .5 .1 + -.5 0 0 .5 1 .5 .1 + -.5 0 0 -.5 1 .5 .1 +.333 0 0 .333 .33 .33 .6 + diff --git a/2006/stewart/box3 b/2006/stewart/box3 new file mode 100644 index 000000000..fe9081092 --- /dev/null +++ b/2006/stewart/box3 @@ -0,0 +1,6 @@ +3 0 0 1 1 + .5 0 0 .5 0 0 .333 + .5 0 0 .5 .5 0 .333 + 0 -.5 .5 0 1 .5 .334 + + diff --git a/2006/stewart/build b/2006/stewart/build new file mode 100644 index 000000000..ba58e2534 --- /dev/null +++ b/2006/stewart/build @@ -0,0 +1,3 @@ +#To build + +gcc prog.c -o prog diff --git a/2006/stewart/carpet b/2006/stewart/carpet new file mode 100644 index 000000000..22e5c920f --- /dev/null +++ b/2006/stewart/carpet @@ -0,0 +1,9 @@ +8 0 0 1 1 +.3333333 0 0 .3333333 0 0 .125 +.3333333 0 0 .3333333 0 .3333333 .125 +.3333333 0 0 .3333333 0 .6666667 .125 +.3333333 0 0 .3333333 .3333333 0 .125 +.3333333 0 0 .3333333 .3333333 .6666667 .125 +.3333333 0 0 .3333333 .6666667 0 .125 +.3333333 0 0 .3333333 .6666667 .3333333 .125 +.3333333 0 0 .3333333 .6666667 .6666667 .125 \ No newline at end of file diff --git a/2006/stewart/circles b/2006/stewart/circles new file mode 100644 index 000000000..45d5d7019 --- /dev/null +++ b/2006/stewart/circles @@ -0,0 +1,15 @@ +6 -.75 -.75 .75 .75 + .1 0 0 .1 .5 0 .1667 + .05 0 0 .05 .2 0 .1666 + .76604444 .64278761 -.64278761 .76604444 0 0 .1667 + .76604444 -.64278761 .64278761 .76604444 0 0 .1667 + .01 0 0 .01 0 0 .1666 + .30901699 .95105652 -.95105652 .30901699 0 0 .1667 + .30901699 .95105652 -.95105652 .30901699 0 0 .25 + .30901699 .95105652 -.95105652 .30901699 0 0 .25 + -.80901699 .58778525 -.58778525 -.80901699 0 0 .25 + -.80901699 -.58778525 .58778525 -.80901699 0 0 .25 + + + + diff --git a/2006/stewart/cross b/2006/stewart/cross new file mode 100644 index 000000000..8abe195af --- /dev/null +++ b/2006/stewart/cross @@ -0,0 +1,15 @@ +5 -.5 -.5 .5 .5 + .5 0 0 .2 .25 0 .4 + .25 0 0 -.25 .125 0 .0 + 0 1 -1 0 0 0 .2 + 0 -1 1 0 0 0 .2 + .70710678 .70710678 -.70710678 .70710678 0 0 .2 + + -1 0 0 -1 0 0 .0 +// rotations + 90 +180 +270 + + + diff --git a/2006/stewart/cross2 b/2006/stewart/cross2 new file mode 100644 index 000000000..ed7151736 --- /dev/null +++ b/2006/stewart/cross2 @@ -0,0 +1,17 @@ +4 -.75 -.75 .75 .75 + .5 0 0 .2 .25 0 .4 + .25 0 0 -.25 .125 0 .0 + 0 1 -1 0 0 0 .2 + 0 -1 1 0 0 0 .4 + + + .70710678 .70710678 -.70710678 .70710678 0 0 .0 + + -1 0 0 -1 0 0 .0 +// rotations + 90 +180 +270 + + + diff --git a/2006/stewart/cross3 b/2006/stewart/cross3 new file mode 100644 index 000000000..a061f025b --- /dev/null +++ b/2006/stewart/cross3 @@ -0,0 +1,17 @@ +4 -.75 -.75 .75 .75 + .5 0 0 .2 .25 0 .4 + .125 0 0 .125 .125 .125 .1 + 0 1 -1 0 0 0 .2 + 0 -1 1 0 0 0 .3 + + + .70710678 .70710678 -.70710678 .70710678 0 0 .0 + + -1 0 0 -1 0 0 .0 +// rotations + 90 +180 +270 + + + diff --git a/2006/stewart/crystal b/2006/stewart/crystal new file mode 100644 index 000000000..1ca72b4be --- /dev/null +++ b/2006/stewart/crystal @@ -0,0 +1,7 @@ +4 0 0 1 1 + .255 0 0 .255 .3726 .6714 .25 + .255 0 0 .255 .1145 .2232 .25 + .255 0 0 .255 .6306 .2232 .25 + .370 -.642 .642 .370 .6356 -.0061 .25 + + \ No newline at end of file diff --git a/2006/stewart/curve b/2006/stewart/curve new file mode 100644 index 000000000..ac36b6313 --- /dev/null +++ b/2006/stewart/curve @@ -0,0 +1,5 @@ +4 0 -.5 1 .5 + .3333333 0 0 .3333333 0 0 .25 + .1666667 -.289 .289 .1666667 .3333333 0 .25 + .1666667 .289 -.289 .1666667 .5 .289 .25 + .3333333 0 0 .3333333 .6666667 0 .25 diff --git a/2006/stewart/diamonds b/2006/stewart/diamonds new file mode 100644 index 000000000..223b918da --- /dev/null +++ b/2006/stewart/diamonds @@ -0,0 +1,8 @@ +5 0 0 1 1 +.3333 0 0 .3333 .3333 .3333 .2 +.3333 0 0 .3333 .3333 0 .2 +.3333 0 0 .3333 0 .3333 .2 +.3333 0 0 .3333 .6667 .3333 .2 +.3333 0 0 .3333 .3333 .6667 .2 + + diff --git a/2006/stewart/diamonds2 b/2006/stewart/diamonds2 new file mode 100644 index 000000000..fa59adfcd --- /dev/null +++ b/2006/stewart/diamonds2 @@ -0,0 +1,17 @@ +4 -.75 -.75 .75 .75 + .5 0 0 .3 .25 0 .4 + .25 0 0 -.25 .125 0 .0 + 0 1 -1 0 0 0 .2 + 0 -1 1 0 0 0 .4 + + + .70710678 .70710678 -.70710678 .70710678 0 0 .0 + + -1 0 0 -1 0 0 .0 +// rotations + 90 +180 +270 + + + diff --git a/2006/stewart/dragon b/2006/stewart/dragon new file mode 100644 index 000000000..1d334b430 --- /dev/null +++ b/2006/stewart/dragon @@ -0,0 +1,3 @@ +2 -.5 -1 1.5 1 + .5 -.5 .5 .5 0 0 .5 +-.5 -.5 .5 -.5 1 0 .5 diff --git a/2006/stewart/dragon2 b/2006/stewart/dragon2 new file mode 100644 index 000000000..4382eef78 --- /dev/null +++ b/2006/stewart/dragon2 @@ -0,0 +1,3 @@ +2 -.5 -.5 1.5 1.5 + .5 -.5 .5 .5 0 0 .5 + .5 .5 -.5 .5 .5 .5 .5 diff --git a/2006/stewart/dragon3 b/2006/stewart/dragon3 new file mode 100644 index 000000000..89daeb4a5 --- /dev/null +++ b/2006/stewart/dragon3 @@ -0,0 +1,3 @@ +2 -7 -2 7 12 +.824074 .281428 -.212346 .864198 -1.882290 -.110607 .8 +.088272 .520988 -.463889 -.377778 .785630 8.095795 .2 diff --git a/2006/stewart/fern b/2006/stewart/fern new file mode 100644 index 000000000..555fd5879 --- /dev/null +++ b/2006/stewart/fern @@ -0,0 +1,5 @@ +4 -5.5 0 5.5 11 + 0 0 0 .16 0 0 .01 + .85 .04 -.04 .85 0 1.6 .85 + .2 -.26 .23 .22 0 1.6 .07 +-.15 .28 .26 .24 0 .44 .07 \ No newline at end of file diff --git a/2006/stewart/gasket b/2006/stewart/gasket new file mode 100644 index 000000000..8a51f5221 --- /dev/null +++ b/2006/stewart/gasket @@ -0,0 +1,4 @@ +3 0 0 1 1 + .5 0 0 .5 0 0 .33 + .5 0 0 .5 .5 0 .33 + .5 0 0 .5 .25 .433 .34 diff --git a/2006/stewart/gasket_mod b/2006/stewart/gasket_mod new file mode 100644 index 000000000..6e94f10b8 --- /dev/null +++ b/2006/stewart/gasket_mod @@ -0,0 +1,5 @@ +4 0 0 1 1 + .5 0 0 .5 0 0 .25 + .5 0 0 .5 .5 0 .25 + .5 0 0 .5 .25 .5 .25 + .25 0 0 .25 .375 .25 .25 diff --git a/2006/stewart/gasket_mod2 b/2006/stewart/gasket_mod2 new file mode 100644 index 000000000..d9467f7c4 --- /dev/null +++ b/2006/stewart/gasket_mod2 @@ -0,0 +1,8 @@ +4 0 -0.05 1.05 1 + .5 0 0 .5 0 0 .25 + .5 0 0 .5 .5 0 .25 + .5 0 0 .5 .25 .433 .25 + .15556349 -.15556349 .15556349 .15556349 .475 .18 .25 + +// a .22 scale and 25 degrees + .19938771 -.092976018 .092976018 .2265 .43 .21 .25 diff --git a/2006/stewart/hint.text b/2006/stewart/hint.text new file mode 100644 index 000000000..10912bb22 --- /dev/null +++ b/2006/stewart/hint.text @@ -0,0 +1,159 @@ +# Best Computed Graphics + +Thomas Stewart +US + +## Judges' Comments: + +### To build: + + make stewart + +### Try: + + stewart 640 480 FILE + +where FILE is one of: + + altar box box2 box3 build carpet circles cross cross2 cross3 + crystal curve diamonds diamonds2 dragon dragon2 dragon3 + fern gasket gasket_mod gasket_mod2 ioccc maze octagon + pentagon pentagons rings rings2 spirals spirals2 spirals3 + spirals4 squares stars stars2 tree tree2 tree3 tree4 triangle + +Note the interesting choice of using a #define in the output. +The selection of input files makes this one endlessly fun to play +with. Many image viewers will be able to read the results, as will +a reasonably experienced user who can parse formats in their mind. :-) + +## Selected Author's Comments: + +### Execution + +The program should be run with the following + + prog + m = The size of the picture (picture will be m X m in size). + n = The number of iterations to run (More will make for a + clearer picture). + ifs = The file to use as input. + +The program will spit out a xbm image on standard out. +Minimal checking is done on the arguments mainly that there are 3. +Wrong arguments will cause the program to bomb out. + +Ex: + + ./stewart 1024 1000000 gasket > gasket.xbm + +### Compilation/Testing + +The program compiles without warning with gcc -ansi -Wall. +lint also seems to like the code. This must be a bug in lint. + +The program was tested on Linux on a x86 and NetBSD on an alpha. +Only gcc was tested for compilers (4.0.3 and 3.3.3) + + +### Entry originality + +In looking through past winners. THere seem to be only 2 (92 and 94) +that generated fractals. Both of those were Julia fractals from the +Mandlebrot set. Those do make for some pretty pictures. I figured +it would be nice to add some more fractals to the IOCCC, since one +hasn't won since 1994. + +Instead of something that has already won I figured I would go with +another kind of fractal, those from the Iterated Function System (IFS). + + +### Input File + +The format of the input file is as follows: + + +

+

+ . + . + . + +This file describe an IFS. + +One of the most well known would be the Sierpinski Gasket: + + 3 0 0 1 1 + .5 0 0 .5 0 0 .33 + .5 0 0 .5 .5 0 .33 + .5 0 0 .5 .25 .433 .34 + +or the fern: + + 4 -5.5 0 5.5 11 + 0 0 0 .16 0 0 .01 + .85 .04 -.04 .85 0 1.6 .85 + .2 -.26 .23 .22 0 1.6 .07 + -.15 .28 .26 .24 0 .44 .07 + +etc... + +Included in my submission will be a tar ball of some ifs files, +including one that attempts (not very well) to mimic the IOCCC logo +(I figure it can't hurt to attempt to suck up, right?) + +I would try to explain how to create an IFS file but I am not smart +enough to condense it down to something that is coherent. + +Basically the break down is: +num is the number of equations in the IFS. +x (min, max) and y (min, max) define the ranges that will be displayed +in the xbm. + +The a b c d e f are used to iterative find points that lie in the IFS +from the algorithm + + x = a * prevx + b * prevy + e; + y = c * prevx + d * prevy + f; + +The p is for the probability that the equation will run. + + +### Obfuscations + +The main obfuscation is using a void* as my only variable (aside from +the args for main). This causes me to do much casting and porinter +arithmetic to get the correct location and completely does away with +any meaning the variables could have. This also makes the code more +convientient to read in the current form vs preprocessed. After +preprocessing there will almost be 300 casts in the code and I believe +they are all needed... (I would double check but my brain is kinda +mushy right now from chasing down a segfault in the code.) + +The other main obfuscation being that it generates an IFS. Which isn't +all that common for a program to do. I mean google only has something +like 66,000 hits for "Iterated function system" so that means it is +obscure, right? + +Some other minor obfuscations: +Since I formatted it as a "normal" program I did inject something that +on first glance will looks like a possible bug. (When you run it through +a c-beautifier this will be removed.) + +I decided not to use rand() to generate a pseudo random number. Instead +I use xor and bit shifting. + +The input file is used to make the program flexible and to allow it to +generate many different IFSs. This has the added bonus of hiding +information about the algorithm. + +The use of many magic numbers. I figured if I get yelled about them in +a review they must be bad, right? + +Silly things: +The use of decimal numbers where one would expect hex. Octal numbers +where one would expect decimal. Shifts instead of devides. + +Using xbm as the output format. This might confuse someone who doesn't +have an X background. It happens to be easy but is probably a very bad +choice from a filesize standpoint. 1024x1024 image is 641k in size. diff --git a/2006/stewart/ioccc b/2006/stewart/ioccc new file mode 100644 index 000000000..f47c78c57 --- /dev/null +++ b/2006/stewart/ioccc @@ -0,0 +1,18 @@ +14 -.5 -3.5 10.5 7.5 + 0 .25 .4 0 0 0 .071428571 + .09 0 0 .24 2.25 3 .071428571 + .09 0 0 .24 2.25 0 .071428571 + 0 .25 .2 0 1.5 1 .071428571 + 0 .25 .2 0 3 1 .071428571 + .09 0 0 .24 5 3 .071428571 + .09 0 0 .24 5 0 .071428571 + 0 .25 .2 0 4.5 1 .071428571 + .09 0 0 .24 7 3 .071428571 + .09 0 0 .24 7 0 .071428571 + 0 .25 .2 0 6.5 1 .071428571 + .09 0 0 .24 9 3 .071428571 + .09 0 0 .24 9 0 .071428571 + 0 .25 .2 0 8.5 1 .071428571 + + + diff --git a/2006/stewart/maze b/2006/stewart/maze new file mode 100644 index 000000000..26861d746 --- /dev/null +++ b/2006/stewart/maze @@ -0,0 +1,6 @@ +3 0 0 1 1 + .3333333 0 0 .3333333 .3333333 .6666667 .3333333 + 0 .3333333 1 0 .6666667 0 .3333333 + 0 -.3333333 1 0 .3333333 0 .3333333 + + \ No newline at end of file diff --git a/2006/stewart/octagon b/2006/stewart/octagon new file mode 100644 index 000000000..9c5a09e4f --- /dev/null +++ b/2006/stewart/octagon @@ -0,0 +1,13 @@ +3 -.75 -.75 .75 .75 + .01 0 0 .4 .3 0 .33 + .76604444 .64278761 -.64278761 .76604444 0 0 .33 + .76604444 -.64278761 .64278761 .76604444 0 0 .34 + .30901699 .95105652 -.95105652 .30901699 0 0 .25 + .30901699 .95105652 -.95105652 .30901699 0 0 .25 + .30901699 .95105652 -.95105652 .30901699 0 0 .25 + -.80901699 .58778525 -.58778525 -.80901699 0 0 .25 + -.80901699 -.58778525 .58778525 -.80901699 0 0 .25 + + + + diff --git a/2006/stewart/pentagon b/2006/stewart/pentagon new file mode 100644 index 000000000..26dacd9b1 --- /dev/null +++ b/2006/stewart/pentagon @@ -0,0 +1,6 @@ +5 -.4 -.25 1.6 1.75 + .382 0 0 .382 0 0 .2 + .382 0 0 .382 .618 0 .2 + .382 0 0 .382 .809 .588 .2 + .382 0 0 .382 .309 .951 .2 + .382 0 0 .382 -.191 .588 .2 diff --git a/2006/stewart/pentagons b/2006/stewart/pentagons new file mode 100644 index 000000000..cd4ee967d --- /dev/null +++ b/2006/stewart/pentagons @@ -0,0 +1,9 @@ +4 -.75 -.75 .75 .75 + .5 0 0 .4 .25 0 .25 + .30901699 .95105652 -.95105652 .30901699 0 0 .25 + -.80901699 .58778525 -.58778525 -.80901699 0 0 .25 + -.80901699 -.58778525 .58778525 -.80901699 0 0 .25 + + + + diff --git a/2006/stewart/rings b/2006/stewart/rings new file mode 100644 index 000000000..b94fb16ee --- /dev/null +++ b/2006/stewart/rings @@ -0,0 +1,9 @@ +4 -.5 -.5 .5 .5 + .5 0 0 -.5 0 -.25 .2 + -.5 -.8660254 .8660254 -.5 0 0 .3 + .25 0 0 -.25 0 .125 .2 + -.5 .8660254 -.8660254 -.5 0 0 .3 + + + + diff --git a/2006/stewart/rings2 b/2006/stewart/rings2 new file mode 100644 index 000000000..aa5b16d80 --- /dev/null +++ b/2006/stewart/rings2 @@ -0,0 +1,13 @@ +4 -.75 -.75 .75 .75 + .1 0 0 .1 .3 0 .25 + .76604444 .64278761 -.64278761 .76604444 0 0 .25 + .76604444 -.64278761 .64278761 .76604444 0 0 .25 + .30901699 .95105652 -.95105652 .30901699 0 0 .25 + .30901699 .95105652 -.95105652 .30901699 0 0 .25 + .30901699 .95105652 -.95105652 .30901699 0 0 .25 + -.80901699 .58778525 -.58778525 -.80901699 0 0 .25 + -.80901699 -.58778525 .58778525 -.80901699 0 0 .25 + + + + diff --git a/2006/stewart/spirals b/2006/stewart/spirals new file mode 100644 index 000000000..6f56b7bd3 --- /dev/null +++ b/2006/stewart/spirals @@ -0,0 +1,4 @@ +3 -8 -3 8 13 + 0.787879 -0.424242 0.242424 0.859848 1.758647 1.408065 0.90 +-0.121212 0.257576 0.151515 0.053030 -6.721654 1.377236 0.05 + 0.181818 -0.136364 0.090909 0.181818 6.086107 1.568035 0.05 \ No newline at end of file diff --git a/2006/stewart/spirals2 b/2006/stewart/spirals2 new file mode 100644 index 000000000..b4e1ec255 --- /dev/null +++ b/2006/stewart/spirals2 @@ -0,0 +1,18 @@ +2 -.75 -1 1.25 1 + .25 0 0 .25 .75 0 .49 + .77942286 .45 -.45 .77942286 0 0 .49 + -.45 .77942286 -.77942286 -.45 0 0 .1 + .76604444 .64278761 -.64278761 .76604444 0 0 .1 + .76604444 -.64278761 .64278761 .76604444 0 0 .1 + .01 0 0 .01 0 0 .1 + .30901699 .95105652 -.95105652 .30901699 0 0 .1 + -.37460659 -.92718385 .92718385 -.37460659 0 0 .1 + .99026807 -.1391731 .1391731 .99026807 0 0 .1 + .8480481 .52991926 -.52991926 .8480481 0 0 .1 + 1 0 0 -1 0 0 .1 + -.80901699 .58778525 -.58778525 -.80901699 0 0 .25 + -.80901699 -.58778525 .58778525 -.80901699 0 0 .25 + + + + diff --git a/2006/stewart/spirals3 b/2006/stewart/spirals3 new file mode 100644 index 000000000..4a26cafa6 --- /dev/null +++ b/2006/stewart/spirals3 @@ -0,0 +1,21 @@ +5 -1 -1 1 1 + .333 0 0 .333 .6 -.6 .25 + -.3 0 0 -.3 -.25 -.75 .25 + .7517541 .27361611 -.27361611 .7517541 0 0 .5 + .77036162 .35922552 -.35922552 .77036162 0 0 .5 + .7878462 .13891854 -.13891854 .7878462 0 0 .5 + .8 0 0 .8 0 0 .2 + .70710678 .70710678 -.70710678 .70710678 0 0 .2 + .70710678 -.70710678 .70710678 .70710678 0 0 .2 + -.70710678 .70710678 -.70710678 -.70710678 0 0 .2 + -.70710678 -.70710678 .70710678 -.70710678 0 0 .2 + + -1 0 0 -1 0 0 .0 +// rotations + 20 * .8 + 25 * .85 + 10 * .8 +270 + + + diff --git a/2006/stewart/spirals4 b/2006/stewart/spirals4 new file mode 100644 index 000000000..b79a82761 --- /dev/null +++ b/2006/stewart/spirals4 @@ -0,0 +1,23 @@ +5 -1.1 -1.5 1.1 .5 + .333 0 0 .333 .6 -.6 .25 + -.060776862 -.34468271 .34468271 -.060776862 -.75 -.85 .25 + .72504623 .33809461 -.33809461 .72504623 0 0 .5 + .77036162 .35922552 -.35922552 .77036162 0 0 .5 + .7517541 .27361611 -.27361611 .7517541 0 0 .5 + .7878462 .13891854 -.13891854 .7878462 0 0 .5 + .8 0 0 .8 0 0 .2 + .70710678 .70710678 -.70710678 .70710678 0 0 .2 + .70710678 -.70710678 .70710678 .70710678 0 0 .2 + -.70710678 .70710678 -.70710678 -.70710678 0 0 .2 + -.70710678 -.70710678 .70710678 -.70710678 0 0 .2 + + -1 0 0 -1 0 0 .0 +// rotations + 25 * .8 + 25 * .85 + 20 * .8 + 10 * .8 +270 + + +full window diff --git a/2006/stewart/squares b/2006/stewart/squares new file mode 100644 index 000000000..047e050ff --- /dev/null +++ b/2006/stewart/squares @@ -0,0 +1,8 @@ +5 0 0 1 1 + .4 0 0 .4 0 0 .2 + .4 0 0 .4 0 .6 .2 + .4 0 0 .4 .6 0 .2 + .4 0 0 .4 .6 .6 .2 + .2 0 0 .2 .4 .4 .2 + + diff --git a/2006/stewart/stars b/2006/stewart/stars new file mode 100644 index 000000000..8621ae859 --- /dev/null +++ b/2006/stewart/stars @@ -0,0 +1,6 @@ +3 0 0 1 1 + .5 0 0 .5 .25 .25 .333 + 0 .35 .75 0 0 .125 .333 + 0 .35 .75 0 .65 .125 .334 + + diff --git a/2006/stewart/stars2 b/2006/stewart/stars2 new file mode 100644 index 000000000..d87e24e75 --- /dev/null +++ b/2006/stewart/stars2 @@ -0,0 +1,9 @@ +4 -.75 -.75 .75 .75 + .5 0 0 .2 .3 0 .25 + .30901699 .95105652 -.95105652 .30901699 0 0 .25 + -.80901699 .58778525 -.58778525 -.80901699 0 0 .25 + -.80901699 -.58778525 .58778525 -.80901699 0 0 .25 + + + + diff --git a/2006/stewart/stewart.c b/2006/stewart/stewart.c new file mode 100644 index 000000000..02103ec9e --- /dev/null +++ b/2006/stewart/stewart.c @@ -0,0 +1,65 @@ +#include +#include +#include +#define P printf +#define F(x,y) ((FILE*)Z(x,y)) +#define U(x,y) ((unsigned char*)Z(x,y)) +#define X(x,y,z) ((double*)x+y+7*z) +#define Y(x,y) ((double*)x+y) +#define Z(x,y) *(long*)Y(x,y) +#define R(x,y) (x=y,y^=(y<<11),y^=(y>>15),y^=(y<<3),(x+y)&0x7fffffff) + +int main(int c,char**o) +{ + void* v=malloc(0170UL); + memset(v,0,0170UL); + if(c!=4)P("bad args\n"),exit(1); + Z(v,2)=atoi(o[1]); + Z(v,1)=atoi(o[2]); + Z(v,0)=Z(v,2)*Z(v,2)>>3; + Z(v,6)=(long)malloc(Z(v,0)); + memset((void*)Z(v,6),0,Z(v,0)); + Z(v,13)=(long)fopen(o[3],"r"); + fscanf(F(v,13),"%ld",(long*)Y(v,3)); + Z(v,8)=(long)malloc(050+Z(v,3)*070); + Z(Z(v,8),0)=Z(v,3); + fscanf(F(v,13),"%lf %lf %lf %lf",Y(Z(v,8),1),Y(Z(v,8),2),Y(Z(v,8),3),Y(Z(v,8),4)); + for(Z(v,3)=0;Z(v,3)10) + if((*Y(v,9)>=*Y(Z(v,8),1))&&(*Y(v,9)<=*Y(Z(v,8),3))&&(*Y(v,10)>=*Y(Z(v,8),2))&&(*Y(v,10)<=*Y(Z(v,8),4))) + *Y(v,11)=(*Y(v,9)+-*Y(Z(v,8),1))/(*Y(Z(v,8),3)-*Y(Z(v,8),1)), + *Y(v,12)=(*Y(v,10)+-*Y(Z(v,8),2))/(*Y(Z(v,8),4)-*Y(Z(v,8),2)), + *(U(v,6)+((((long)(Z(v,2)-*Y(v,12)*Z(v,2))*Z(v,2))+(long)(*Y(v,11)*Z(v,2)))>>3))|= + 1<<((((long)(Z(v,2)-*Y(v,12)*Z(v,2))*Z(v,2))+(long)(*Y(v,11)*Z(v,2)))&7); + } + P("#define x_width %ld\n#define x_height %ld\nstatic char x_bits[] = {\n",Z(v,2),Z(v,2)); + for(Z(v,3)=0;Z(v,3) + +## Judges' Comments: + +### To build: + + make sykes1 + +### To run: + + ./sykes1 + +next point your browser to the file: + + sykes1.html + +in the same directory. Next try: + + ./sykes1 10 + +and refresh your browser. Now read the sykes1.html page source. +Now then read the C source. Confused? :-) + +For extra credit, understand what happens when you give this entry +an negative number argument, and why. + +## Selected Author's Comments: + +This cube shaped program solves the fiendishly difficult "Bedlam Cube" + +If you did not get one for Christmas, there is an article about these +puzzles in wikipedia: + +> + +There is also website dedicated to them - +And some instructions on how to make your own cube here: + +Finally, you can watch it being solved here: + +> + +Actually the cube is very hard to do by hand by just trying to fit it +together. I have not known anyone to solve it in this way - you would +need to be very lucky indeed to stumble across a solution. + +### Instructions + +Compile the program, then test that it works: + + ./sykes1 + +Shortly you should see the first solution pop out on your screen. It +shows you how to build the cube piece by piece, rendered in glorious +3d ascii. + +Ascii art is all very well, but you also have a web browser, right? +Well, just open the file sykes1.html. This html file is just a copy +of prog.c, which helpfully contains an html document that should make +the browser display for you a nice animated gif, showing you how to +build the cube. Rendered in glorious 3d color. + +Want to see another solution? Try: + + ./sykes1 some_number + +The program will discard solutions up to the number, and output numbered +solution. Refresh your browser window to see the new solution. + +Try some more - there are exactly 19186 solutions to choose from. + +If you have a fast machine you might try the last solution: + + ./sykes1 19186 + +On my machine this takes about half an hour to run. + +### Implementation + +The implementation is an optimized recursive algorithm that tries to fit +the pieces into the cube one by one. The cube pieces are defined near +the start of the program: + + int s[ ] = { 186, 94, 1426, 3098 + ,1047 , 122 , 1082 , 3083 , 1039 + , 569 , 527 , 1054 , 531 } ; + +Each piece is a bitmap, and represents a 3x3x3 cube. + +For instance the first piece is 186 - this is 010111010 in binary. +Written out like this you can see that it is the cross shaped piece: + + 010 + 111 + 010 + +The other pieces are defined similarly. Most of the rest require more +than one layer, such as piece 3 (1426): + + 000 + 000 + 010 + + 110 + 010 + 010 + +Imagine the two layers on top of each other, and you should see this +shape: + + +---------+ + / +----+ /| + +-/ /| / | + |+----+ |/ + + || | + / + +| | / + | | / + | | / + | |/ + +----+ + +The program is in fact a general solver - you can change the shape of +the pieces, and provided that a solution is possible, it will be found. + +For example, if you modify line 13 of the source like this, the program +will solve for a different piece set: + + int s[ ] = { 187, 94, 402, 3098 + +And of course you can make your own. + +After the pieces are defined, the first thing the program does it to +fit them into a 4x4 cube. It collects every possible placing of each +of the pieces. + +Once those placings are ready, the program recursively checks each +combination thereof. + +In order to complete in a reasonable time, care is take to eliminate +any branches that cannot result in a solution. This is done by checking +after each placing if all the remaining pieces can be placed somewhere, +and that all the free space in the cube can be filled by at least one +viable placing. Also if a piece is found to only have one possible +placing, it is placed immediately without invoking a recursive function +call. + +Once the solution is found, the ascii and gif representations are +generated. Care must be taken to render cubes in the right order such +that pieces further back are occluded by those in front. + +In the ascii output care must be taken with drawing the edges of each +1/64th cube (edges must be removed within each piece). In the gif +this is taken care of by color, which is graded from the back to the +front to ensure edge visibility. + +### Notes + +The whole program has just one function - main - which is recursively +called. In fact if you select solution 19186 it will be called exactly +159,260,759 times. + +If you pick a number higher than 19186, the program will return a +solution but it will be a rotation of one of the first 19186. This is +because the cross shaped piece fits 48 ways in the 4x4 cube, but only +2 of those ways are unique - you can rotate one of those to make any +of the other 46. The algorithm used always places the cross piece +first, so the first two placings of that piece result in the 19186 +unique solutions. + +If you pick a number higher than 460464 (24x19186) the program will +return without outputting a solution. If you can wait that long. + +I recommend compiling with the most aggressive optimization options +your compiler supports. I find --unroll-loops to be helpful with gcc. + +The program relies on long long being 64 bits, but has no other special +requirements. + +The program is known to compile and run under gcc and intel cc, as well +as PellesC on Windows. + +### Bugs + +The program is not at all a valid html document, but fortunately +browsers have good error recovery and amongst other things will ignore +the /* at the beginning, and won't mind the missing html and head tags +and the lack of end tags. + +The generated gif is not compressed. This could be argued as an +advantage - at least I don't violate any of those old Unisys patents! + +The pieces aren't really those colors. Unless you make your own. diff --git a/2006/sykes1/sykes1.c b/2006/sykes1/sykes1.c new file mode 100644 index 000000000..2c5ad4fa7 --- /dev/null +++ b/2006/sykes1/sykes1.c @@ -0,0 +1,94 @@ + /* + */ diff --git a/2006/sykes2/Makefile b/2006/sykes2/Makefile new file mode 100644 index 000000000..78e61ebce --- /dev/null +++ b/2006/sykes2/Makefile @@ -0,0 +1,35 @@ +# 2006 makefile +# +# Copyright (C) 2006-2009, Landon Curt Noll, Simon Cooper, Peter Seebach +# and Leonid A. Broukhis. All Rights Reserved. Permission for personal, +# educational or non-profit use is granted provided this copyright and +# notice are included in its entirety and remains unaltered. All other +# uses must receive prior permission from the contest judges. + +# Special flags for this entry +# +#CFLAGS= + +# data files for this entry +# +DATA= + + +build: ${ENTRY} + + +clean: + -${RM} ${ENTRY} ${ENTRY}.html + + +clobber: clean + + +alt: + + +data: + + +${ENTRY}: ${ENTRY}.c ${DATA} + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} diff --git a/2006/sykes2/hint.text b/2006/sykes2/hint.text new file mode 100644 index 000000000..e9c78d6f6 --- /dev/null +++ b/2006/sykes2/hint.text @@ -0,0 +1,53 @@ +# Best One Liner + +Stephen Sykes +Itäinen koulupolku +Kauniainen +Finland + + +## Judges' Comments: + +### To build: + + make sykes2 + +### To run: + + ./sykes2 + +Then "Lather, rinse, repeat": + + while :; do + clear + rm -f sykes2 + make sykes2 + ./sykes2 + sleep 1 + done + +If you have the time, figure out how this small 1-line entry works! + +## Selected Author's Comments: + +At 130 characters of C code (without the newline at the end), this +should fit into the "1-liner" category. + +The clock numerals are rendered as an old fashioned 7 segment display. +The encodings for which segments light for which number, and for where +each segment appears on screen are hidden in the two strings. + +When reading the program, you may want to refer to a table of +operator precedence - careful choices were made to keep the usage of +brackets to a minimum, and to keep the character count as low as +possible. + +One interesting bit of obfuscation - the null at the end of the second +string actually forms part of the lookup table. + +Intel CC warns about the lack of a declaration for the argument to main. +(gcc does not notice this though, even with -Wall.) But anyway it can +easily be declared as int at the expense of 4 more characters. + +I'm not sure of the effects on a hard disk of rewriting the same file +multiple times per second for a long time. Run at your own risk! diff --git a/2006/sykes2/sykes2.c b/2006/sykes2/sykes2.c new file mode 100644 index 000000000..2e2ccaf1f --- /dev/null +++ b/2006/sykes2/sykes2.c @@ -0,0 +1 @@ +main(_){_^448&&main(-~_);putchar(--_%64?32|-~7[__TIME__-_/8%8][">'txiZ^(~z?"-48]>>";;;====~$::199"[_*2&8|_/64]/(_&2?1:8)%8&1:10);} diff --git a/2006/toledo1/Makefile b/2006/toledo1/Makefile new file mode 100644 index 000000000..531d7d468 --- /dev/null +++ b/2006/toledo1/Makefile @@ -0,0 +1,35 @@ +# 2006 makefile +# +# Copyright (C) 2006-2009, Landon Curt Noll, Simon Cooper, Peter Seebach +# and Leonid A. Broukhis. All Rights Reserved. Permission for personal, +# educational or non-profit use is granted provided this copyright and +# notice are included in its entirety and remains unaltered. All other +# uses must receive prior permission from the contest judges. + +# Special flags for this entry +# +#CFLAGS= + +# data files for this entry +# +DATA= + + +build: ${ENTRY} + + +clean: + -${RM} ${ENTRY} + + +clobber: clean + + +alt: + + +data: + + +${ENTRY}: ${ENTRY}.c ${DATA} + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} diff --git a/2006/toledo1/hint.text b/2006/toledo1/hint.text new file mode 100644 index 000000000..d4999f629 --- /dev/null +++ b/2006/toledo1/hint.text @@ -0,0 +1,43 @@ +# Best Small Program + +Oscar Toledo +Av. Santa Cruz del Monte 9-304 +Ciudad Satelite. Edo. de Mexico +CP. 53110 +Mexico + +## Judges' remarks: + +### To build: + + make toledo1 + +### Try: + + ./toledo1 00 + ./toledo1 30 + ./toledo1 99 + +For most of the arguments (e.g. those above) the resulting path +is not circular, but at least one starting point yields a circular path. + +Why do some of the "illegal" starting points work more or less as could +be expected, and some dump core? + +## Author's comments: + +Can you place a knight on a chess board and make it +to visit the 64 squares without repeating them? + +If not, this program does it, just run it with an argument +giving initial position. + + ./toledo1 11 (start is A8) + ./toledo1 18 (start is H8) + ./toledo1 81 (start is A1) + ./toledo1 88 (start is H1) + ./toledo1 44 (start is D5) + +It will print move order. The algorithm is so simple that you can read +it on the source code, at the first glance it can appear checkered :-) +but don't dismail, jar, jar. diff --git a/2006/toledo1/toledo1.c b/2006/toledo1/toledo1.c new file mode 100644 index 000000000..305e8c334 --- /dev/null +++ b/2006/toledo1/toledo1.c @@ -0,0 +1,17 @@ +char *e,t [366 ],*f +,*g, *h,* i;d, m ; + main (c,b) char **b;{ + for( ;d[t] =d%3 ?60d&6 ++d;) ;for (g=3* + atoi (*++ b) + 34+t; +i=f= "\1" "\7" "(d" +"\177" "yX" "\34" ,e=g + ; ) for( *e++ =++m/ + 10 + 48,g =c=0 ,*e = +48+m %10; h=e- 65+* +i,d= *h,* i++; f-=8 + ,g=d + +Extract CPM64.COM from the SOURCE directory, and copy it to +files named A and B (these will be the disk drives). Now rename +the provided C.BIOS to C and run the emulator. + +Now you have a running CP/M system!, with two files on A: drive, +HALT.COM to stop the emulator (so it closes drives) and IMPORT.COM +to introduce new files. + +To get a complete CP/M system, you will need the following files +from the KAYPROII.ZIP, SOURCE directory: + + ASM.COM DDT.COM DUMP.COM ED.COM LOAD.COM + PIP.COM STAT.COM SUBMIT.COM XSUB.COM + +To import them, you must run the emulator with an argument, by +example: + + prog DDT.COM + +When the A> prompt appears, do: + + IMPORT DDT.COM + +When it ends, do HALT, so the file is saved, and you can start +the same process with another file. + +At this time I have tested successfully the following software +from retroarchive.org: + +> +> +> + +Some programs requiere installation to configure the terminal, +locate ANSI or VT-100. + +### What is an 8080? + +It is simply the little brother of the Z80, it has no extended +registers (AF', BC', DE', HL', IX or IY), no relative jumps, +and every instruction beginning with CB, DD, ED or FD doesn't +exist. + +The flags are only S (Sign, bit 7), Z (Zero, bit 6), P (Parity, +bit 2) and C (Carry, bit 0). + +### Porting it + +It is easy if your platform has getch/kbhit and +ANSI terminal + + read --> Z=kbhit()?getch():0 + write --> putchar(7[o]) + system --> nothing + +Also add the following to trap Ctrl-C: + + #include + signal(SIGINT, SIG_IGN); + +On PC/DOS you need to add ANSI.SYS to CONFIG.SYS + +In *NIX the min 0 on stty is required, circa 2001 +it was not required. + +. +. +. + +### How it works (SPOILER) + +. +. +. + +The l array contains the 64K memory, it is initialized with a +boot image loaded from the 'C' file, the program counter is the +c pointer, and regitser are on o[]. The main loops reads every +op-code and separates it in one of three common forms, a lot +of trinary operators selects the instruction. + + o[0] = B register o[1] = C register + o[2] = D register o[3] = E register + o[4] = H register o[5] = L register + o[6] = Flags o[7] = A or accumulator + +The following instructions do peripheral operation: + + 76 Quits emulator + DB 00 Reads key pressed status + DB 01 Reads key + DB 02 Reads byte from file (Carry=EOF) + D3 xx Writes byte from acc. to console + ED ED 02 Reads sector + ED ED 03 Writes sector + +Memory addresses: + + FBFA = Low source/target direction + FBFB - High source/target direction + FBFC - Sector + FBFD - Low cylinder + FBFE - High cylinder + FBFF - Drive. + +The BIOS is tailor made for this emulator, and helps to simplify it. + +Other notes: + +- The 8080 runs at your computer speed divided + between a number that I have not calculated. +- This obfuscated processor is created using + obfuscated code produced by an obfuscated mind, + no brains were harmed during its production, + except those that tried to read the code. +- The original version of this code was eated + by my C++ dog. +- I intended to make it simple to understand, + it uses only four C keywords. +- Also I discovered that braces are very useful + for commenting. +- Why to bother with prototypes?, every good C + programmer can develop its C programs using + only one function. + diff --git a/2006/toledo2/toledo2.c b/2006/toledo2/toledo2.c new file mode 100644 index 000000000..f65cbf3bf --- /dev/null +++ b/2006/toledo2/toledo2.c @@ -0,0 +1,57 @@ + #include + #define n(o,p,e)=y=(z=a(e)%16 p x%16 p o,a(e)p x p o),h( + #define s 6[o] + #define p z=l[d(9)]|l[d(9)+1]<<8,1<(9[o]+=2)||++8[o] + #define Q a(7) + #define w 254>(9[o]-=2)||--8[o],l[d(9)]=z,l[1+d(9)]=z>>8 + #define O )):(( + #define b (y&1?~s:s)>>"\6\0\2\7"[y/2]&1?0:( + #define S )?(z-= + #define a(f)*((7&f)-6?&o[f&7]:&l[d(5)]) + #define C S 5 S 3 + #define D(E)x/8!=16+E&198+E*8!=x? + #define B(C)fclose((C)) + #define q (c+=2,0[c-2]|1[c-2]<<8) + #define m x=64&x?*c++:a(x), + #define A(F)=fopen((F),"rb+") + unsigned char o[10],l[78114],*c=l,*k=l + #define d(e)o[e]+256*o[e-1] +#define h(l)s=l>>8&1|128&y|!(y&255)*64|16&z|2,y^=y>>4,y^=y<<2,y^=~y>>1,s|=y&4 ++64506; e,V,v,u,x,y,z,Z; main(r,U)char**U;{ + + { { { } } } { { { } } } { { { } } } { { { } } } + { { { } } } { { { } } } { { { } } } { { { } } } + { { { } } } { { { } } } { { { } } } { { { } } } + { { { } } } { { { } } } { { { } } } { { { } } } + { { { } } } { { { } } } { { { } } } { { { } } } + { { { } } } { { { } } } { { { } } } { { { } } } + { { ; } } { { { } } } { { ; } } { { { } } } + { { { } } } { { { } } } { { { } } } { { { } } } + { { { } } } { { { } } } { { { } } } { { { } } } + { { { } } } { { { } } } { { { } } } { { { } } } + { { { } } } { { { } } } { { { } } } { { { } } } + { { { } } } { { { } } } { { { } } } { { { } } } + { { { } } } { { { } } } { { { } } } { { { } } } + + for(v A((u A((e A((r-2?0:(V A(1[U])),"C") +),system("stty raw -echo min 0"),fread(l,78114,1,e),B(e),"B")),"A")); 118-(x +=*c++); (y=x/8%8,z=(x&199)-4 S 1 S 1 S 186 S 2 S 2 S 3 S 0,r=(y>5)*2+y,z=(x& +207)-1 S 2 S 6 S 2 S 182 S 4)?D(0)D(1)D(2)D(3)D(4)D(5)D(6)D(7)(z=x-2 C C C C +C C C C+129 S 6 S 4 S 6 S 8 S 8 S 6 S 2 S 2 S 12)?x/64-1?((0 O a(y)=a(x) O 9 +[o]=a(5),8[o]=a(4) O 237==*c++?((int (*)())(2-*c++?fwrite:fread))(l+*k+1[k]* +256,128,1,(fseek(y=5[k]-1?u:v,((3[k]|4[k]<<8)<<7|2[k])<<7,Q=0),y)):0 O y=a(5 +),z=a(4),a(5)=a(3),a(4)=a(2),a(3)=y,a(2)=z O c=l+d(5) O y=l[x=d(9)],z=l[++x] +,x[l]=a(4),l[--x]=a(5),a(5)=y,a(4)=z O 2-*c?Z||read(0,&Z,1),1&*c++?Q=Z,Z=0:( +Q=!!Z):(c++,Q=r=V?fgetc(V):-1,s=s&~1|r<0) O++c,write(1,&7[o],1) O z=c+2-l,w, +c=l+q O p,c=l+z O c=l+q O s^=1 O Q=q[l] O s|=1 O q[l]=Q O Q=~Q O a(5)=l[x=q] +,a(4)=l[++x] O s|=s&16|9159?Q+=96,1:0,y=Q,h(s<<8) +O l[x=q]=a(5),l[++x]=a(4) O x=Q%2,Q=Q/2+s%2*128,s=s&~1|x O Q=l[d(3)]O x=Q / +128,Q=Q*2+s%2,s=s&~1|x O l[d(3)]=Q O s=s&~1|1&Q,Q=Q/2|Q<<7 O Q=l[d(1)]O s=~1 +&s|Q>>7,Q=Q*2|Q>>7 O l[d(1)]=Q O m y n(0,-,7)y) O m z=0,y=Q|=x,h(y) O m z=0, +y=Q^=x,h(y) O m z=Q*2|2*x,y=Q&=x,h(y) O m Q n(s%2,-,7)y) O m Q n(0,-,7)y) O +m Q n(s%2,+,7)y) O m Q n(0,+,7)y) O z=r-8?d(r+1):s|Q<<8,w O p,r-8?o[r+1]=z,r +[o]=z>>8:(s=~40&z|2,Q=z>>8) O r[o]--||--o[r-1]O a(5)=z=a(5)+r[o],a(4)=z=a(4) ++o[r-1]+z/256,s=~1&s|z>>8 O ++o[r+1]||r[o]++O o[r+1]=*c++,r[o]=*c++O z=c-l,w +,c=y*8+l O x=q,b z=c-l,w,c=l+x) O x=q,b c=l+x) O b p,c=l+z) O a(y)=*c++O r=y +,x=0,a(r)n(1,-,y)s<<8) O r=y,x=0,a(r)n(1,+,y)s<<8)))); +system("stty cooked echo"); B((B((V?B(V):0,u)),v)); } diff --git a/2006/toledo3/Makefile b/2006/toledo3/Makefile new file mode 100644 index 000000000..55e113997 --- /dev/null +++ b/2006/toledo3/Makefile @@ -0,0 +1,41 @@ +# 2006 makefile +# +# Copyright (C) 2006-2009, Landon Curt Noll, Simon Cooper, Peter Seebach +# and Leonid A. Broukhis. All Rights Reserved. Permission for personal, +# educational or non-profit use is granted provided this copyright and +# notice are included in its entirety and remains unaltered. All other +# uses must receive prior permission from the contest judges. + +# Special flags for this entry +# +LOCAL_FLAGS= -I${X11_INCDIR} -L${X11_LIBDIR} -lX11 ${OPT} + +# data files for this entry +# +DATA= + + +build: ${ENTRY} ${ENTRY}-sbar ${ENTRY}-txt + + +clean: + -${RM} ${ENTRY} ${ENTRY}-sbar ${ENTRY}-txt + + +clobber: clean + + +alt: + + +data: + + +${ENTRY}: ${ENTRY}.c ${DATA} + ${CC} ${CFLAGS} ${LOCAL_FLAGS} ${ENTRY}.c -o ${ENTRY} + +${ENTRY}-sbar: ${ENTRY}-sbar.c ${DATA} + ${CC} ${CFLAGS} ${LOCAL_FLAGS} ${ENTRY}-sbar.c -o ${ENTRY}-sbar + +${ENTRY}-txt: ${ENTRY}-txt.c ${DATA} + ${CC} ${CFLAGS} ${LOCAL_FLAGS} ${ENTRY}-txt.c -o ${ENTRY}-txt diff --git a/2006/toledo3/hint.text b/2006/toledo3/hint.text new file mode 100644 index 000000000..2fa99f2de --- /dev/null +++ b/2006/toledo3/hint.text @@ -0,0 +1,107 @@ +# Most Portable Chess Set + +Oscar Toledo +Av. Santa Cruz del Monte 9-304 +Ciudad Satelite. Edo. de Mexico +CP. 53110 +Mexico + +## Judges' Comments: + +### To build: + + make toledo3 + +NOTE: You may have to alter the paths suitably, and you do need X. Modify the makefile as needed. + +### To run: + + ./toledo3 1 + +It's pretty obvious from looking at it what this program does, +since it's clearly spelled out in the code. The interesting +question is whether this is easier or harder to understand than +the code for Deep Blue. + +## Selected Author's Comments: + +There are so many text-based chess programs, what is that of +A1, H5, C4, D5? The queen is really pointing to the king? + +So I managed to do a graphical X11 chess program (WYSIAIE, or +What You See Is An IOCCC Entry), point'n'click to move pieces +is the only required action, and of course the command-line +options: + + ./toledo3 Two-players mode + (useful if you don't have a board at hand) + ./toledo3 1 Human white - Computer black, level 1 (fast) + ./toledo3 2 Human white - Computer black, level 2 (medium) + ./toledo3 3 Human white - Computer black, level 3 (slow) + ./toledo3 1 b Human black - Computer white, level 1 (fast) + ./toledo3 2 b Human black - Computer white, level 2 (medium) + ./toledo3 3 b Human black - Computer white, level 3 (slow) + +The computer will check that your moves are legal, full legal +chess moves are allowed, except minor promotions on human side. + +The game will continue up to its logical conclusion, you make +a mistake and the computer surpasses you. ;) + +### WHAT ABOUT THE ENGINE + +Uses an alpha-beta search up to a depth of 3+level ply, extended +with quiescence search, that helps playing strength, something +around 1500 ELO (level 1) to 1700 ELO (level 3) + +It searches the board and generates moves for each piece located, +a lot of comparisons are used for empassant, castling and +promotion. Would be faster with optimizations, but that +optimizations use valuable IOCCC characters. + +It plays a different game every time, using the C library random +number generator. + +Because it is resource-hungry, I strongly recommend to compile it +using maximum optimization, on GCC you can use: + + gcc -O3 -fexpensive-optimizations prog.c -o prog -lX11 + + +### KNOWN "FEATURES" + +1. Because this is my second X11 program (the first was + point'n'click happy face), I added sentences everywhere + until it worked. :) + +2. It is portable to Wind*ws (using the supplied layer.c file) + Change #include to #include "layer.c" and + use a Wind*ws compiler (only tested with Dev C/C++ 4.9.9.2) + The play level is fixed, though you can change it easily. + Of course, this is an example of an obfuscated Wind*ws + program (there exists another way of write them?) + +3. It will give warnings on compilation, so you can be sure + that your compiler works. + +4. It will not update the window while it is "thinking" + +5. The space character has many useful applications, specially + when it comes about the character limit. 8) + +6. I still don't understand what to do after semicolons. :P + +### CHALLENGES + +It is possible to convert this code into Javascript with a +graphical interface. Can you do it? + +Can the evaluation function be enhanced to make the program +play stronger? + +### UPGRADES + +Using toledo3-sbar.c (which is too large for this IOCCC size +rules) creates a status display about gameplay on the window title bar, + +Using toledo3-txt.c turns this into being purely text based. diff --git a/2006/toledo3/layer.c b/2006/toledo3/layer.c new file mode 100644 index 000000000..d81cdc541 --- /dev/null +++ b/2006/toledo3/layer.c @@ -0,0 +1,30 @@ +#include +#define main ma +#define Display int +#define XOpenDisplay(a)1 +#define BlackPixel(a,b)2 +#define WhitePixel(a,b)3 +#define XCreateGC(a,b,c,d)4 +#define Window HWND +#define XCreateSimpleWindow(a,b,c,d,e,f,g,h,i)CreateWindowEx(0,"a","Chess",\ +0xcf0000,c,d,e+8,f+32,0,0,aa,0) +#define XSelectInput(a,b,c) +#define XMapWindow(a,b)ShowWindow(b,dd) +#define XCreateBitmapFromData(a,b,c,d,e)CreateBitmap(d,e,1,1,c) +#define XNextEvent(a,b){ MSG m; if(!GetMessage(&m,0,0,0))return \ +m.wParam; TranslateMessage(&m); DispatchMessage(&m); *b=oo; oo.type=0; } +#define XCopyPlane(a,b,c,d,e,f,g,h,i,j,k)(h1=GetDC(c),h2=CreateCompatibleDC\ +(h1),h3=SelectObject(h2,b),BitBlt(h1,i,j,g,h,h2,e,f,0xcc0020),SelectObject\ +(h2,h3),DeleteDC(h2),ReleaseDC(c,h1)) +#define XFlush(a) +typedef struct{ int foreground; } XGCValues; +typedef struct{ int type,x,y; } XButtonEvent; +HDC h1,h2,h3; XButtonEvent oo; HINSTANCE aa; int dd; LRESULT CALLBACK +WP(HWND h,UINT m,WPARAM w,LPARAM l){ if(m==513)oo.type=4,oo.x=LOWORD(l) +,oo.y=HIWORD(l); else if(m==15)oo.type=12; else if(m==2)PostQuitMessage(0); +else return DefWindowProc(h, m, w, l); return 0; } int WINAPI WinMain +(HINSTANCE a,HINSTANCE b,LPSTR c,int d){ static WNDCLASSEX w; +char*z[]={0,"1",0}; return aa=a,w.hInstance=a,w.lpszClassName="a", +w.lpfnWndProc=WP,w.cbSize=sizeof(WNDCLASSEX),dd=d,w.hIcon=LoadIcon(0,32512), +w.hIconSm=LoadIcon(0,32512),w.hCursor=LoadCursor(0,32512),w.hbrBackground=1, +RegisterClassEx(&w),main(2,z); } diff --git a/2006/toledo3/toledo3-sbar.c b/2006/toledo3/toledo3-sbar.c new file mode 100644 index 000000000..d2e0f18d9 --- /dev/null +++ b/2006/toledo3/toledo3-sbar.c @@ -0,0 +1,67 @@ +#include +char *l="dbcefcbddabcddcba~WAB+ +BAW~ +-84HLSU?A6J57IKJT576,", +*F=" ,>>,> xl~w/? ,>>>,s m\177>>\177\177 mm2>>> >uk>>> ",*f;y,u; +#define v for (i=0,b=0;b>511?b=0,i+=64:0,i<512;b+=64) A=i/64*10+b/64+21,XCopy\ +Plane(d, r[I[A]+7+14*(i+b>>6&1)+28*(A==z)],w,C,0,0,64,64,b,i,1); XFlush(d); +#define _(a) *f++=a&*F?-(z%14<7):"U\252U\0DDDD"[z/14*2|u&1], +#define G(p) p##Pixel(d,DefaultScreen(d)) +#define R(a) |(a==O|p==a)* +#define P return y=~y, +#define a X(0,0,0, +#define H while( +#define D ;if( + +I[304],b,i,z;main(x,W) char**W; { Display *d = + XOpenDisplay(""); Window w = XCreateSimpleWindow + (d, DefaultRootWindow(d), 64,64,512,512,2,G(Black) + ,G(Black)); XGCValues g; XButtonEvent e; int A,r + [56],Z,* m = I , C ,Y; XSelectInput(d,w,32772); + XMapWindow( d, w); g. foreground = G(White); + C=XCreateGC(d,w,4,&g); F+=48; H f=I,i=0,z<56){ + H u=0,i++<8){ H _(0)_( 64)_(16)_(8)_(4)_(2)_(1 + )_(0)++u<8); F++; } F-= z%7-6?z%14<6?16:0:8; r[ + z++]=XCreateBitmapFromData(d,w,I,64,64); } srand( + time(z=u=0)); H I[z]=-( z>98|z<21|(z+1)%10<2), + ++z<120); H ++m<9+I) 80 [m]=-2,90[m]=~(20[m]=7&* + l++),30[m]=1; D 190)&((z[I]^y)==-2)?- 6^y:z[I]; Y=y; a u,0,1); +z=0; v D 1a u,1,1)?y=~y,a u,1, +0)>1e6?y?"Black's wins": "White's wins":"Stalemate" +:"Chess"),y=Y,z=0;} } } } + + + X(w,c,h,e,S,s) + + +{ int p,O= *l,t,d,o,C ,*g,E,n,*m =I,N=-1e8, + A,L,r,x = 10,q; y=~y ; H--O>20) +{ o=I[p=O] D q=o^y,q> 0){ q+=(q< 2)*y,C=q + ["51#/+++"], A=q["95+3/33"]; do { m=0, +r=I[p+=C[l ]-64] D !w |p==w&&q>1 |C+2>6==p+( +y?x:-x)?I+ (e>>6):0, !r&(q>1|d% x<1||g)|(r + ^y)<-1){ n =o,t=q<2&( 89p) +?n+=y|1,6^ y:o+(y|1) D (r^y)<-6 ) P 1e7-811 + *h; H n-t) { O[I]=0,p [I]=n,m?*g +=*m,*m=0:g ?*g=0:0; E=e&63 R( 91)16 R(28) + 4 R(21)2 R (98)32; L= (q>1?6-q?l +[p/x-1]-l[ O/x-1]-q+2 :(E|=y?8:1 ,!!m)*9:(E + |=20-d?0: 64*p,n-o?( l[15+n]-' ' +)*9:d/8+!! g*99))+(l[ r+15]-' ') *9+l[p%x]- + h-l[O%x]; L-=s>h||s== h&L>49&1h?0:p ,L,h+1,E,N ,s):0 D !( z-O|i-n|h| + p-b|S|L<- 1e6))return u=E; O[I]= +o,p[I]=r,m ?*m=*g,*g= 0:g?*g=-2^ y:0 D S|h&& + (L>N||!h&N ==L&&rand( )&4)){ N=L +D !h&&s) i =n,z=O,b=p D h&&c-L5&d<2&C+6 - 1e6&&1e6>a +63,1,0))?d ++:(n+=y|1 );} } } C +=q<2&C+3> + A&((y?O<80 :39 +2&q<6||(p= O,++C + 98 |z< + 21| (z+ + 1) %x<2 + ) , ++z < + 120 ); H ++m + <9+ I)80 [m] + =- 2 , + 90[ m]= + ~( m [20 + ]= 7 & *l + ++ ) , 30[ m]= + 1; H z=19){ H++ z< + 100 ) putchar(z %x- 9?"KQRBNP .pnbrqk" + [7 +z [I]] :x ) D + x - ( z = F ) ) { + i = I [ z+= 100 + -F* x] ; b =F; + b+= 100 + -F* x ; + H x -(p + =F) ) i + =-p ^y + ; } else a u, 1, 3+W); a + u , 0 , 1 ) ; } } + + X(w,c,h,e,S,s) + + +{ int p,O= *l,t,d,o,C ,*g,E,n,*m =I,N=-1e8, + A,L,r,x = 10,q; y=~y ; H--O>20) +{ o=I[p=O] D q=o^y,q> 0){ q+=(q< 2)*y,C=q + ["51#/+++"], A=q["95+3/33"]; do { m=0, +r=I[p+=C[l ]-64] D !w |p==w&&q>1 |C+2>6==p+( +y?x:-x)?I+ (e>>6):0, !r&(q>1|d% x<1||g)|(r + ^y)<-1){ n =o,t=q<2&( 89p) +?n+=y|1,6^ y:o+(y|1) D (r^y)<-6 ) P 1e7-811 + *h; H n-t) { O[I]=0,p [I]=n,m?*g +=*m,*m=0:g ?*g=0:0; E=e&63 R( 91)16 R(28) + 4 R(21)2 R (98)32; L= (q>1?6-q?l +[p/x-1]-l[ O/x-1]-q+2 :(E|=y?8:1 ,!!m)*9:(E + |=20-d?0: 64*p,n-o?( l[15+n]-' ' +)*9:d/8+!! g*99))+(l[ r+15]-' ') *9+l[p%x]- + h-l[O%x]; L-=s>h||s== h&L>49&1h?0:p ,L,h+1,E,N ,s):0 D !( z-O|i-n|h| + p-b|S|L<- 1e6))return u=E; O[I]= +o,p[I]=r,m ?*m=*g,*g= 0:g?*g=-2^ y:0 D S|h&& + (L>N||!h&N ==L&&rand( )&4)){ N=L +D !h&&s) i =n,z=O,b=p D h&&c-L5&d<2&C+6 - 1e6&&1e6>a +63,1,0))?d ++:(n+=y|1 );} } } C +=q<2&C+3> + A&((y?O<80 :39 +2&q<6||(p= O,++C +char *l="dbcefcbddabcddcba~WAB+ +BAW~ +-84HLSU?A6J57IKJT576,", +*F=" ,>>,> xl~w/? ,>>>,s m\177>>\177\177 mm2>>> >uk>>> ",*f;y,u; +#define v for (i=0,b=0;b>511?b=0,i+=64:0,i<512;b+=64) A=i/64*10+b/64+21,XCopy\ +Plane(d, r[I[A]+7+14*(i+b>>6&1)+28*(A==z)],w,C,0,0,64,64,b,i,1); XFlush(d); +#define _(a) *f++=a&*F?-(z%14<7):"U\252U\0DDDD"[z/14*2|u&1], +#define G(p) p##Pixel(d,DefaultScreen(d)) +#define R(a) |(a==O|p==a)* +#define P return y=~y, +#define a X(0,0,0, +#define H while( +#define D ;if( + +I[304],b,i,z;main(x,W) char**W; { Display *d = + XOpenDisplay(""); Window w = XCreateSimpleWindow + (d, DefaultRootWindow(d), 64,64,512,512,2,G(Black) + ,G(Black)); XGCValues g; XButtonEvent e; int A,r + [56],Z,* m = I , C ,Y; XSelectInput(d,w,32772); + XMapWindow( d, w); g. foreground = G(White); + C=XCreateGC(d,w,4,&g); F+=48; H f=I,i=0,z<56){ + H u=0,i++<8){ H _(0)_( 64)_(16)_(8)_(4)_(2)_(1 + )_(0)++u<8); F++; } F-= z%7-6?z%14<6?16:0:8; r[ + z++]=XCreateBitmapFromData(d,w,I,64,64); } srand( + time(z=u=0)); H I[z]=-( z>98|z<21|(z+1)%10<2), + ++z<120); H ++m<9+I) 80 [m]=-2,90[m]=~(20[m]=7&* + l++),30[m]=1; D 190)&((z[I]^y)==-2)?- 6^y:z[I]; Y=y; a u,0,1); +z=0; v D 120) +{ o=I[p=O] D q=o^y,q> 0){ q+=(q< 2)*y,C=q + ["51#/+++"], A=q["95+3/33"]; do { m=0, +r=I[p+=C[l ]-64] D !w |p==w&&q>1 |C+2>6==p+( +y?x:-x)?I+ (e>>6):0, !r&(q>1|d% x<1||g)|(r + ^y)<-1){ n =o,t=q<2&( 89p) +?n+=y|1,6^ y:o+(y|1) D (r^y)<-6 ) P 1e7-811 + *h; H n-t) { O[I]=0,p [I]=n,m?*g +=*m,*m=0:g ?*g=0:0; E=e&63 R( 91)16 R(28) + 4 R(21)2 R (98)32; L= (q>1?6-q?l +[p/x-1]-l[ O/x-1]-q+2 :(E|=y?8:1 ,!!m)*9:(E + |=20-d?0: 64*p,n-o?( l[15+n]-' ' +)*9:d/8+!! g*99))+(l[ r+15]-' ') *9+l[p%x]- + h-l[O%x]; L-=s>h||s== h&L>49&1h?0:p ,L,h+1,E,N ,s):0 D !( z-O|i-n|h| + p-b|S|L<- 1e6))return u=E; O[I]= +o,p[I]=r,m ?*m=*g,*g= 0:g?*g=-2^ y:0 D S|h&& + (L>N||!h&N ==L&&rand( )&4)){ N=L +D !h&&s) i =n,z=O,b=p D h&&c-L5&d<2&C+6 - 1e6&&1e6>a +63,1,0))?d ++:(n+=y|1 );} } } C +=q<2&C+3> + A&((y?O<80 :39 +2&q<6||(p= O,++C' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to partly misunderstand this final echo. + @${TRUE} diff --git a/2011/README.markdown b/2011/README.markdown new file mode 100644 index 000000000..71847b7e4 --- /dev/null +++ b/2011/README.markdown @@ -0,0 +1,79 @@ +2011 marked the "The Twentieth International Obfuscated C Code Contest" +======================================================================== + +Copyright (C) 2012, Landon Curt Noll, Simon Cooper, and Leonid A. +Broukhis. All Rights Reserved. Permission for personal, educational +or non-profit use is granted provided this copyright and notice are +included in its entirety and remains unaltered. All other uses +must receive prior permission from the contest judges. + + +Standard IOCCC stuff +-------------------- + +The IOCCC has a web site and now has a number of international mirrors. +The primary site can be found at, + +> + +Use make to compile entries. It is possible that on non-Un*x / non-Linux +systems the makefile needs to be changed. See the Makefile for details. + +Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitters. + +Read over the makefile for compile/build issues. Your system may require +certain changes (add or remove a library, add or remove a #define). + +Some ANSI C compilers are not quite as good as they should be. If +yours is lacking, you may need to compile using gcc instead of your +local compiler. + + +Remarks on some of the entries +------------------------------ + +There were some outstanding entries that did not win. Unfortunately +some very good entries lost because they: + ++ did not follow the "one program - one file" rule; + ++ depended too much on 32 bit architectures; + ++ were more of the "obfuscated math" kind rather than the "obfuscated C" kind. + +We hope the authors of some of those entries will fix and re-submit +them for the next IOCCC. + +We believe you will be impressed with this year's winners. The Best +of Show is a fine example of character stitching. But don't ignore the other +winners! There are games, puzzle solvers, utilities, eye candy, calculators and graphical and audio tools. + +This year all winners are different, and there is a winner from a new country - +China! Many winners won for the first time. (Please note that judging is done +completely anonymously. Be warned that we may disqualify entries that reveal +the identity of the submitter). + +Final Comments +-------------- + +Please feel free to send us comments and suggestions about the +competition, this README or anything else that you would like to see in +future contests. + +If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used. + +If you have problems with any of the entries, AND YOU HAVE A FIX, please +send us the fix (patch file or the entire changed file). + +For the latest information on how to contact the IOCCC Judges please visit + +> + +For news of the next contest watch: + +> + diff --git a/2011/akari/Makefile b/2011/akari/Makefile new file mode 100644 index 000000000..78d22e6c6 --- /dev/null +++ b/2011/akari/Makefile @@ -0,0 +1,153 @@ +#!/usr/bin/env make +# +# 2011 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Compiler warnings +# +CWARN= -Wall -W -pedantic + +# compiler standard +# +CSTD= -std=c99 +CSTD2= -ansi + +# compiler bit architecture +# +# Some entries require 32-bitness, +# other entries require 64-bitess. +# By default we assume nothing. +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +OPT= -O2 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} +CFLAGS2= ${CSTD2} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= akari +DATA= example.ppm + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +everything: ${ENTRY} \ + ${ENTRY}2.c ${ENTRY}2 \ + ${ENTRY}3.c ${ENTRY}3 \ + ${ENTRY}4.c ${ENTRY}4 + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} + +${ENTRY}2.c: ${ENTRY} + ./${ENTRY} ${ENTRY}.c $@ + +${ENTRY}2: ${ENTRY}2.c + ${CC} ${CFLAGS} ${ENTRY}2.c -o $@ + +${ENTRY}3.c: ${ENTRY} ${ENTRY}.c + ./${ENTRY} < ${ENTRY}.c | ./${ENTRY} > $@ + +${ENTRY}3: ${ENTRY}3.c + ${CC} ${CFLAGS2} ${ENTRY}3.c -o $@ + +${ENTRY}4.c: ${ENTRY} ${ENTRY}.c + ./${ENTRY} < ${ENTRY}.c | ./${ENTRY} | ./${ENTRY} > $@ + +${ENTRY}4: ${ENTRY}4.c + ${CC} ${CFLAGS2} ${ENTRY}4.c -o $@ + +# alternative executable +# +alt: + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ENTRY}2.c ${ENTRY}3.c ${ENTRY}4.c + +clobber: clean + ${RM} -f ${ENTRY} ${ENTRY}2 ${ENTRY}3 ${ENTRY}4 + +nuke: clobber + @echo gnab gib! + +install: + @echo "Surely you're joking Mr. Feynman!" + +# backwards compatibility +# +build: all + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to partly misunderstand this final echo. + @${TRUE} diff --git a/2011/akari/akari.c b/2011/akari/akari.c new file mode 100644 index 000000000..fda798f4f --- /dev/null +++ b/2011/akari/akari.c @@ -0,0 +1,43 @@ + /* + + + + + + + + + [ >i>n[t + */ #include + /*2w0,1m2,]_r>i>=>(['0n1'0)1; + */int/**/main(int/**/n,char**m){FILE*p,*q;int A,k,a,r,i/* + #uinndcelfu_dseti/_*/;char*d="P%" "d\n%d\40%d"/**/ + "\n%d\n\00wb+",b[1024],y[]="yuriyurarararayuruyuri*daijiken**akkari~n**" + "/y*u*k/riinrarararayuruy9uriyu3riyurar_aBrMaPrOaWy^?" + "*]/f]`;hvroai+b+i>++b++>l[rb";int/**/u;for(i=0;i<101;i++)y[i*2]^="~hktrvg~dmG*eoa+%squ#l2" + ":(wn\"1l))v?wM353{/Y;lgcGp`vedllwudvOK`cct~[|ju {stkjalor(stwvne\"gt\"yogYURUYURI"[ + i]^y[i*2+1]^4;/*!*/p=(n>1&&(m[1][0]-'-'||m[1][1] !='\0'))?fopen(m[1],y+298):stdin; + /*y/riynrt~(^w^)],]c+h+a+r+*+*[n>)+{>f+oy++>u>>+r >+u+++y>--u---r>++i+++" <)< ;[>-m-.>a-.-i.++n.>[(w)*/!q/**/) + return+printf("Can " "not\x20open\40%s\40" "" "for\40%sing\n",m[!p?1:2],!p?/* + o=82]5<<+(+3+1+&.(+ m +-+1.)<)<|<|.6>4>-+(> m- &-1.9-2-)-|-|.28>-w-?-m.:>([28+ + */"read":"writ");for ( a=k=u= 0;y[u]; u=2 +u){y[k++ ]=y[u];}if((a=fread(b,1,1024/* +,mY/R*Y"R*/,p/*U*/)/* R*/ )>/*U{ */ 2&& b/*Y*/[0]/*U*/=='P' &&4==/*"y*r/y)r\} +*/sscanf(b,d,&k,& A,& i, &r)&& ! (k-6&&k -5)&&r==255){u=A;if(n>3){/* +]&<1<63> +:+ .1>3+++ . -m-) -;.u+=++.1<0< <; f>1,i>>1,r);u = k-5?8:4;k=3;}else + /*]>*/{(u)=/*{ p> >u >t>-]s >++(.yryr*/+( n+14>17)?8/4:8*5/ + 4;}for(r=i=0 ; ;){u*=6;u+= (n>3?1:0);if (y[u]&01)fputc(/* + h.a r -(-).)8+<1. >;+i.(<)< <)+{+i.f>([180*/1* + (r),q);if(y[u ]&16)k=A;if (y[u]&2)k--;if(i/* + ("^w^NAMORI; { I*/==a/*" )*/){/**/i=a=(u)*11 + &255;if(1&&0>= (a= fread(b,1,1024,p))&& + ")]i>(w)-;} { /i-f-(-m--M1-0.)<{" + [ 8]==59/* */ )break;i=0;}r=b[i++] + ;u+=(/**>> *..¨Q~©>©R~©~>©R~¨>¨Q~¨~>¨Q~¨>¨Q~””Ÿ””ž†­â†Ç¿†­â†Ç¿‡­â‡Ç¿Ž­»Žª¿“­Ÿ“—¿“­Ÿ“–¿”®Ÿ”–¿�®±�¤¿ˆ®âˆÈ¿†®â†Ç¿‡­â‡Ç¿�­µ�¥¿“­ “–¿’¬Ÿ’–¿’«Ÿ’–¾’¬ ’•¿’« ’•¿‘«¢‘–¿ˆ«Äˆ¯¿‡«É‡³¿’« ’•¿’ª ’•¿‘«Ÿ‘•¿‘« ‘•¿‘«Ÿ‘•¿’« ’•¿‘«Ÿ‘•¿‘«Ÿ‘•¿’«Ÿ’–¿’«Ÿ’•¿’ª ’•¿‘ª ‘”¿‘ª ‘•¿‘« ‘•¿‘« ‘•¿‘« ‘•¾‘« ‘•¿‘« ‘•¿‘«Ÿ‘•¿’ª ’•¿•¦”•�·¨€A¨U€©~=©R}©}=©R}ª~>ªR}ª~>ªR~«~>«S}«~>«S}�™|�|§�©Ÿ�•¿�©Ÿ�”¿�© �”¿�©Ÿ�”¿�©Ÿ�”¿�¨Ÿ�”¿�¨ �”¿�¨ �“¿�¨ �”¿�¨ �“¿Ž§ Ž“¾Ž§ŸŽ“¿ˆ¥ªˆ™¿u£áu¹¾s£ãs·¾q¡ãq¶¿q¢âq¶¾n¡ân´¾w Äw¥¾‰ŸŸ‰�¿‰žŸ‰�¿ˆž ˆŽ¿ˆ�ŸˆŽ¾ˆ�ŸˆŽ¿ˆ�ŸˆŽ¾ˆœŸˆŽ¿ˆœŸˆ�¾ˆ�ŸˆŽ¾‡œ ‡Ž¿mœÎm¤¿fœâf®¿fœâf®¾eœâe®¿eœãe­¾eœãe®¿fœâf­¿pœÇp¢¾­‰e­r˜¾~>¾a}¾~>¾b}¿~>¿b}¿~=¿c}À~>Àd}Á~>Ád}·ƒT·mŒ…˜ž…‹¾…˜Ÿ…‹¾‘”‘‘…µÂ~>Âf~Ã~>Ãe}Ã~=Ãe}Â~=Âf~Ã~>Ãf~Â~=Âe~Â~>Âd}œ�‚œ~«ƒ–ŸƒŠ¾‚”Ÿ‚о‚”Ÿ‚о‚“Ÿ‚‰¾i•¾i–¾X–âX¤¾b–Ìb�¾ƒ— ƒŠ¾„—Ÿ„о„—Ÿ„‹¾„— „‹¾„—Ÿ„о„—Ÿ„‹¿…—Ÿ…‹¿s˜µs•¿^˜â^¨¾^˜ã^¨¾^™â^©¾_˜â_©¾`™ã`«¿cšâc«¾zœ±z–¾‡œŸ‡�¿ˆœŸˆ�¾ˆœŸˆ�¿‡œŸ‡�¾‡œ ‡�¾ˆœŸˆ�¾ˆ� ˆ�¾‡œ ‡Ž¾ˆœŸˆŽ¿ˆ�ŸˆŽ¾ˆœŸˆ�¾ˆœŸˆŽ¿‡�Ÿ‡�¾ˆœŸˆŽ¾‡�Ÿ‡�¾ˆœ ˆ�¿‡œ ‡Ž¾‡œŸ‡�¾ˆœŸˆ�¿’—‘’†µ½~>½`~½~>½a~½~=½a~¾~>¾b~¾~>¾a~¾~>¾b}½~>½b~ �{ {¦‡šŸ‡Œ¾‡›Ÿ‡Œ¿†›Ÿ†�¿‡š ‡Œ¿‡š ‡�¿‡›Ÿ‡�¾†›Ÿ†�¾‡šŸ‡�¿†› †Œ¿†šŸ†Œ¾‡šŸ‡Œ¾†š †Œ¾†› †�¾�›¦��¿u›·u™¾jšÍj£¿f›Ûfª¿f›áf­¿fœâf®¿g›Þg¬¾kœÒk¦¿rœÁrž¿}œ®}•¿†œ¡†Ž¿ˆœ ˆ�¿ˆœŸˆ�¾ˆ�Ÿˆ�¾ˆ�ŸˆŽ¿ˆ�ŸˆŽ¿‡� ‡Ž¾ˆœŸˆ�¿ˆœ ˆ�¾ˆ› ˆŽ¾ˆœ ˆ�¿ˆ�Ÿˆ�¿‡�Ÿ‡Ž¿ˆœŸˆ�¿ˆœŸˆ�¾ˆœŸˆ�¾‡œŸ‡Ž¿‡œ ‡�¾‡œ ‡Ž¿ˆ› ˆ�¾‰žŸ‰Ž¿Š  Š�¾Œ¢ Œ�¾Œ£ŸŒ‘¾Œ£ŸŒ‘¾�£ �‘¾Ž¥ŸŽ’¿Ž¥ŸŽ“¾�¦Ÿ�“¾�¦Ÿ�“¿Ž§ŸŽ“¾Ž¥ŸŽ’¿Ž¤ŸŽ’¾Œ£ŸŒ‘¾‹¢Ÿ‹�¾ŽžšŽŒº˜•ˆ˜€®¦Œm¦t�²…W²k�¹€D¹d‚»~=»`}»}=»_}»}=»_}ºAºa€·‚J·e†´„U´k�¯ˆc¯q–¦Žu¦z£š‘†š�®�•”�‡·‡˜�‡Š¾„™Ÿ„Œ¾„—Ÿ„‹¾„˜Ÿ„о„˜Ÿ„‹¾…˜Ÿ…‹¿…—Ÿ…‹¿„—Ÿ„‹¾„—Ÿ„о„– „Š¿ƒ•ŸƒŠ¾‚•Ÿ‚Š¿ƒ•ŸƒŠ¾ƒ•ŸƒŠ¾‚”Ÿ‚о‚”Ÿ‚‰¾‚”Ÿ‚‰¾‚”Ÿ‚‰¿‚“Ÿ‚‰¾‚“Ÿ‚‰¾‚“Ÿ‚ˆ¾�’Ÿ�ˆ¾�“Ÿ�ˆ¾‚“Ÿ‚‰¾‚“Ÿ‚‰¾�“Ÿ�‰¾‚”Ÿ‚‰¾‚”Ÿ‚‰¾‚”Ÿ‚‰¾‚”Ÿ‚‰¾‚•Ÿ‚‰¾‚”Ÿ‚‰¾ˆ�ŸˆŽ¾§• ÍÙþ “ ÂÒþ ”ŸÂÑþ¡”ŸÃÑþ¡”ŸÄÒþ¢• ÅÓþ¤”ŸÇÕþ£•ŸÆÕþ£• ÆÔþ£” ÇÔþ¤•ŸÈ×þ¥• ÊØþ¥•ŸÌ×þ¦• ÌØþ¥– ÌÙþ§– ÎÚþ§–ŸÐÛþ©—ŸÑÜþ©—ŸÓÝþª˜ Õßþ«— Õàþª— Õßþª˜ Õßþ«—ŸÖàþ«˜ Øâþ¬˜ŸÙâþ¬˜ Ùãþ¬˜ Úãþ¬˜ŸÚãþ­˜ Ûäþ­™ Üåþ­™ŸÜåþ®™ Üåþ®™ŸÜåþ­™ Üåþ®™ŸÛäþ®™ Üåþ®™ Üäþ¬ž¨Ü×í¬Ëáèzy«Êâè{yªÊâèzzªÊâè{y«ÌâèzxªÊâèzy©Éáç{z¨¢­ÖÆã¨–ŸÏÜþ§– ÎÚþ§– ÎÚþ¦–ŸÍÚþ²^QÌÙþ´R>ÍÙþ´R>ËØþ´Q>ËØþµQ>ÌÙþµQ>ÍÙþ´Q>ÍÚý¯•žã“ž¦Æâèyy§Çâèzx§Çâèzy¨ª»Ý´È¨—ŸÐÜþ¨– ÑÝþ¨— ÑÝþ¨¤±ÙÃܨÈãèyy§Èãèzy§Çâèzy§¥µÚ¼Ó§– ÎÛþ¦– ÍÙþ¦–ŸÌØþ¥–ŸÌØþ¤• Ê×þ¤–¢ËÔú¤®Äߦµ¤´ÊÞ›ª¤• Ê×þ¤• ÉÖþ¤” ÉÖþ¥– Ë×þ¤• Ë×þ¤• Ë×þ¤–ŸÊØþ¥–ŸÊØþ¤• Ê×þ¥•ŸË×þ¤• ÉÖþ£”ŸÈÕþ£•ŸÈÖþ¤• ÉÖþ¤•ŸÉÖþ¤• É×þ£•ŸÉÖþ£• ÈÖþ¤•ŸÈ×þ¤•ŸÉÖþ¦�•ÊØþ³TBË×þ´Q=Ê×þ´R=ÉÖþ´R>ÉÖþ´R=ÉÕþ³S=ÇÔþ´S=ÆÕþª|{ÆÓþ¢•ŸÆÔþ¢” ÅÓþ¢” ÄÓþ¡” ÃÒþ¡” ÄÒþ¡”ŸÄÑþ¡”ŸÄÒþ¡” ÃÒþ¡“ ÂÐþ “ŸÀÏþž’Ÿ¾Îýž“ ¾Íý�™«Æ½æ›¹áçyyš·âçxv˜¶ãçxw—¶âçxv—´âçxw–¥ÄÔ–´•�Ÿ«Àý”ŽŸ©¾ý’�Ÿ§½ý“ŽŸ¨¼ý’� ¦»ý’ŽŸ¦¼ý’ŽŸ¥¼ý’�Ÿ¥ºý‘Ž ¤ºý‘ŽŸ¥¹ý‘¤ÎÙ‹Ÿ‘®âçyw‘®âçxw‘®ãçxv‘®ãçxv‘®âçyv‘­âçxw�¢ÇÒ�¯©re¡¹ý´a> ·ý´b>Ÿ¶ý´b=ž¶ý´c=œ´ý´c>œ³ý´d>™²ý­mS™³ýŒ‹Ÿ™²ý‹ŒŸ™±ý“…‘™±ý´e?˜°ý´e=—°ý´e>•°ý´e=—¯ý´f>•®ý´d>—°ý´e>™±ýšƒ—°ý‰‹Ÿ“®ü‡ŠŸ�«ü‡‰Ÿ�«ü‡‰Ÿ�©ü‡–¾Å’½ˆ¥âçww‰�Ì׆ ‰Š •®ü‰‹Ÿ•¯ý‹ŠŸ–¯ý‹‹Ÿ˜°ý‹‹Ÿ—°ýŠ‹Ÿ–¯ý‹‹Ÿ—±ýŒ–µ»�ÑŒ¨ãçxvŒ¨ãçxw‹©ãçxwŒ©ãçxw�ªâçxv�¬ãçxv�—±»¥Ú‘�Ÿ£¹ý�ŽŸ¢¹ý‘�Ÿ£¹ý‘ŽŸ£ºý‘� ¤ºý‘�Ÿ¥»ý‘ŽŸ¤»ý‘ŽŸ¤ºý‘ŽŸ¤»ý‘� ¥ºý‘� ¥ºý‘� ¥ºý‘ŽŸ£»ý’ŽŸ¤ºý‘�Ÿ¤ºý‘ŽŸ¤ºý‘�Ÿ¤¹ý��Ÿ¢¹ý�� ¤¹ý—†�£¹ý´a>¢¸ý´a>¢·ý´a> ¸ý´b> ¸ý³a> ·ý´b>Ÿ¶ý´a= ¶ý |{ ·ý��Ÿ ·ý��Ÿ¡¸ýŽ�ŸŸ¸ýŽ�Ÿ ¶ý��ŸŸ·ý�ŒŸ ¶ý��Ÿ ·ý�ŒŸ¡¶ý�ŒŸŸ¶ý�ŒŸŸ¶ýŽŒŸ ¶ý�Œ Ÿ¶ýŽ� ¡¶ü��¦¬°ï�™¸Ã Ì�¤ÍØŠ¡�©Ûá~†�­áåxz‘­âæxx‘«Ýâ|��¥Ñ܇™�žÀÍ—º�•®·ªá��¡¥·ù‘�Ÿ¤ºý‘ŽŸ¤¹ý‘Ž ¤ºý‘�Ÿ¤»ý‘ŽŸ¤ºý’ŽŸ¤ºý‘� £¹ý‘ŽŸ¤ºý‘ŽŸ¤¹ý��Ÿ¤¹ý‘�Ÿ£ºý‘ŽŸ¥ºý‘ŽŸ¥ºý‘� ¤ºý‘ŽŸ¤ºý�Ž £¹ý‘� £¹ý�� £ºý‘ŽŸ£ºý“Ž §¼ý–� ­Àý˜�Ÿ²Äýš‘ŸµÇýš‘ŸµÈý›‘Ÿ·Èýœ’ŸºËýž“Ÿ¼Ìýž’Ÿ½Íýž“Ÿ¿ÎýŸ“Ÿ¿Íý�’ ¼Ìýœ’ ¹Êýš‘Ÿ¶Çý˜�Ÿ±Äý™Œš°ÂýŸ€ˆ«Àý§um¨¼ý®kX£ºý²dE¢¸ý³_>£ºý´^=¦»ý´^=¥»ý³a@¥ºý°fJ¤¹ý®kV¡¸ýªqc ¶ý¢yu�´ýš�†š´ý’‡”š²ýŒŠžš³ýŒ‹Ÿš²ý‹ŒŸ˜±ýŠ‹Ÿ˜±þŠ‹Ÿ˜°ý‹‹Ÿ˜°ý‹‹ ˜±ýŠ‹Ÿ—±ýŠ‹Ÿ—¯ýŠ‹Ÿ•®ý‰ŠŸ“­ýˆ‰ ‘¬ýˆŠŸ‘«ý‡ŠŸ‘¬ý‡‰Ÿ�«ü†‰Ÿ�©ý†‰ŸŽ©ý‡‰Ÿ�©ý…ˆŸŽ©ü…‰Ÿ�§ü…ˆŸŒ¨ü„ˆŸ‹¦ü„ˆŸ‹§ü…‰žŽ¨ü…‰Ÿ�©ü†‰ŸŽ©ü†‰ŸŽªü†‰ŸŽ©ü†‰ŸŽ©ü†ŠŸŽªü†ŠŸŽªü‡‰Ÿ�«ü‘� ¥ºýŒ¡ŸŒ�¿‡œ ‡�¾‡œŸ‡�¿‡œŸ‡�¿ˆœ ˆŽ¾‡œŸ‡�¾‡œŸ‡�¿‡œŸ‡�¿‡›Ÿ‡�¿‡œŸ‡�¿‡œŸ‡�¿‡›Ÿ‡�¾‡œ ‡Ž¿ˆ�ŸˆŽ¾ˆ�ŸˆŽ¾ˆ�ŸˆŽ¿‰ž ‰Ž¿‰�Ÿ‰Ž¿‰�Ÿ‰Ž¾‰ž ‰Ž¾‰ž ‰�¾‰ŸŸ‰�¿ŠŸ Š�¾ŠŸŸŠ�¾ŠŸŸŠ�¾ŠŸ Š�¿Š  Š�¿Š ŸŠ�¾‹¡ ‹�¾Œ¢ŸŒ‘¾�£Ÿ�‘¾�¤Ÿ�‘¾�£Ÿ�’¾Œ¤ŸŒ‘¾Œ£ŸŒ‘¾Œ¢ŸŒ‘¾Œ¢ŸŒ�¾Œ¢ŸŒ�¾¡´œ¾o¡ãoµ¾m ãm´¾kŸãk³¾kŸãk³¿jžãj³¿h�ãh²¿jžÜj®¾‡œ¡‡�¾ˆœŸˆ�¾ˆœŸˆ�¾ˆœŸˆŽ¿ˆ� ˆ�¿³„R³i‹½};½_|¼}<¼_|¼};¼_|¼}<¼^|¼}<¼_|¼}<¼`|‹Š¦‹�œeœãe¯¾fœäf¯¿gœäg°¾nœÎn¦¿ˆœ ˆŽ¾ˆ�ŸˆŽ¿ˆ�ŸˆŽ¾w�»w�¾i�ãi±¾h�äh±¾hžäh²¾ožÒoª¿‰žŸ‰�¾‰žŸ‰Ž¾‰žŸ‰Ž¾‰žŸ‰Ž¿ˆ�¡ˆ�¾qžÉq¤¿ižãi²¿vž¿v¡¾ˆžŸˆŽ¿‰�Ÿ‰Ž¿ˆžŸˆŽ¿ˆž ˆŽ¾‰�Ÿ‰Ž¿ˆ�ŸˆŽ¾‰ŸŸ‰�¾‰ŸŸ‰�¿ŠŸŸŠ�¾Š  Š�¾‹¡Ÿ‹�¿‹¢Ÿ‹�¿Œ£ŸŒ‘¾�¤Ÿ�’¿Ž¤ŸŽ‘¿Ž¥ŸŽ’¿Ž¥ŸŽ’¿�§Ÿ�’¾�§Ÿ�“¿�¦Ÿ�“¿�¦œ�‘½«‚I«\…®|:®T{®}:®S{®}:®T{¯}:¯T{®|;®T|®}:®T|¦‹_¦i”�¦ �“¿Ž¦ŸŽ“¾�§Ÿ�“¿�§ �“¿�§Ÿ�“¿Ž¦ Ž“¿�¦Ÿ�“¾�§ �’¿�¦ �“¾Ž¥ŸŽ’¿�¥Ÿ�‘¿�£Ÿ�‘¾‚¢°‚š¿n ãnµ¿jžäj³¿gœäg°¾dœãd°¾dœäd°¿yœ¶y™¾ˆ�Ÿˆ�¿ˆœŸˆ�¾‡œŸ‡�¿‡›Ÿ‡�¾‡›Ÿ‡Œ¾‡›Ÿ‡�¿‡› ‡Œ¾†šŸ†Œ¿‡›Ÿ‡�¾…›¢…޾ešØe¨¿ašäa­¾`šä`¬¾^˜ä^ª¾^˜ä^ª¾^˜ä^ª¾^˜ä^ª¾w—°w”½º€Lºh‡Á};Áb{Â};Âc{Â|;Âb|Â|;Âb|Â|:Âc{Â}:Âc|°†d°q—„—Ÿ„‹¾„˜ „‹¿š�„š¬Â|:Âc|Â|;Âc{Â|;Âc|Â};Âb{Â|;Âb{Â}:Âb{Á|<Áb}‘”‘‘…µ†™Ÿ†‹¿…™Ÿ…Œ¾…™Ÿ…Œ¾…™Ÿ…Œ¿}™©}�¿`™á`©¿j˜Èjž¿…™ …Œ¾†™Ÿ†Œ¿†™ †‹¿…šŸ…Œ¿†šŸ†Œ¿†šŸ†Œ¿‡›Ÿ‡�¿pšÂpž¿c›åc®¾c›äc®¾d›åd®¿e›äe¯¾fœäf°¾f�ãf±¿„œ¥„‘¿‡�Ÿ‡�¾ˆ�ŸˆŽ¾ˆœŸˆ�¿‡œŸ‡�¾ˆœŸˆ�¿‡œ ‡�¾ˆœ ˆŽ¿ˆœŸˆ�¾‡› ‡�¿‡œ ‡�¾‡œŸ‡�¾ˆœŸˆ�¾ˆœ ˆ�¿‡œŸ‡�¾‡œŸ‡�¾‡œŸ‡�¿ˆœŸˆ�¿‡�Ÿ‡Ž¿ˆœŸˆŽ¿‹››‹‹¼·E·bƒ»}:»]{»|:»]|»|:»]{¼|;¼]{»|;»^{»}:»]{°…Z°j�‡›ž‡Œ¾ˆ�ŸˆŽ¿ˆ�ŸˆŽ¾ˆ�Ÿˆ�¾‡�Ÿ‡Ž¿ˆ�ŸˆŽ¿ˆ�ŸˆŽ¾ˆ�ŸˆŽ¿ˆœŸˆŽ¾ˆœŸˆ�¿‡œŸ‡�¿ˆœŸˆ�¾ˆœŸˆŽ¿ˆ�Ÿˆ�¿‡œŸ‡�¾ˆ� ˆŽ¾†�£†�¿„�¤„�¾„œ£„�¾…�£…�¾‡œ ‡Ž¿‡œ ‡�¿‡œŸ‡�¿‡œ ‡Ž¿‡�Ÿ‡�¾ˆ� ˆ�¾ˆ�ŸˆŽ¿ˆ�ŸˆŽ¾ˆ�ŸˆŽ¾ˆ� ˆŽ¿ˆ�ŸˆŽ¾ˆ�ŸˆŽ¿ˆ�Ÿˆ�¾ˆ�Ÿˆ�¾ˆ�ŸˆŽ¿ˆ�Ÿˆ�¾ˆ�ŸˆŽ¾ˆœŸˆŽ¾ˆœŸˆ�¾ˆœ ˆŽ¿ˆœ ˆ�¾‡œŸ‡Ž¿ˆ�ŸˆŽ¾ˆ�ŸˆŽ¾ˆœŸˆ�¿ˆ�ŸˆŽ¾ˆ�ŸˆŽ¾ˆž ˆŽ¿‰žŸ‰Ž¿‰ž ‰Ž¿‰� ‰Ž¾ˆžŸˆŽ¿‰�Ÿ‰Ž¿‰�Ÿ‰Ž¿‰� ‰Ž¾ˆ�ŸˆŽ¿‡œŸ‡Ž¾†›Ÿ†�¾‡›Ÿ‡�¾‡›Ÿ‡�¿‡› ‡�¿‡›ž‡�¾‹šš‹‹»�˜—�‰¹�—”�‡·�™—�‰¹�™˜�ŠºŠ™›ŠŠ»‡›�‡Œ¾‡› ‡�¾†›Ÿ†�¿‡šŸ‡�¿‡› ‡�¾†›Ÿ†�¿†›Ÿ†Œ¿†šŸ†Œ¿†š †�¾†šŸ†�¾†šŸ†Œ¾†šŸ†Œ¿†š †Œ¿†™Ÿ†Œ¿†™Ÿ†‹¾†™Ÿ†Œ¿…™Ÿ…Œ¿…™Ÿ…Œ¿†™Ÿ†Œ¿…™Ÿ…Œ¿†š †‹¾†šŸ†Œ¾†™ †‹¾…™ …Œ¾…™Ÿ…Œ¿…™Ÿ…Œ¾…™Ÿ…Œ¾†™Ÿ†Œ¾†™ †Œ¾…˜Ÿ…Œ¾…˜Ÿ…‹¿„˜Ÿ„‹¾…˜ …‹¾„˜Ÿ„‹¾„˜Ÿ„‹¿…˜Ÿ…‹¾…˜Ÿ…‹¾‰ŸŸ‰�¿™�Ÿ²Äþ�� ¡¸ý��Ÿ¡¹ý��Ÿ£¹ý�Ž ¢ºý��Ÿ¢ºý��Ÿ¢ºý��Ÿ£ºý��Ÿ£¹ý�� ¢¹ý‘� ¤¹ý‘ŽŸ¤ºý‘Ž ¥ºý‘ŽŸ¦ºý’� ¥»ý’�Ÿ¦»ý“ŽŸ©¼ý“ŽŸ§¼ý’ŽŸ¦¼ý“ŽŸ¨½ý”ŽŸ«¿ý”� ª¿ý•ŽŸ«¿ý•�Ÿ¬Àý•� ¬Àý•�Ÿ¬Àý–�Ÿ®Àý—�Ÿ¯Âý—�Ÿ±Ãý™‘Ÿ³Åýš‘ ¶Çý›‘Ÿ·Èý›‘Ÿ·Èý›‘Ÿ¶Çý™‘ µÇýš‘Ÿ´Æý™‘Ÿ´Çý™‘Ÿ³Åý˜œ´É¬Ó—¶ãçwv–µãèvv•³ãçwv”³ãçwu“²ãçwu“±äçvt’®Üâ|„‘�¢§¸ù‘ŽŸ¤¹ý‘�Ÿ¤¹ý‘� ¤»ý‘ŽŸ¥ºý­iR¤¹ý´_;¢¹ý³_<¤¹ý´_<£¹ý´_;£ºý³_;¥ºý´`<¤¹ü¨�¦à~‡�°ãçvu‘°ãçvt’°ãçvu‘¦ÎÙ‹ ’� ¥ºü’Ž ¦¼ý“Ž ¨½ý’ž»Ê�Æ“±äçut“±ãçuu’²äçuu”©Ò܈—”ŽŸ©½ý”ŽŸª½ý”ŽŸ©½ý“ŽŸ©½ý“�¢«»ù”¥ÉÖ’ª”²ãçvt“¡À͘½“�Ÿ§¼ý“Ž ¨¼ý“Ž ¦½ý“ŽŸ§¼ý“ŽŸ§¼ý“�Ÿ§¼ý“ŽŸ©¾ý•�Ÿ¬¿ý–�Ÿ¬Áý–�Ÿ®Âý—�Ÿ°Ãý˜� ³Åþš‘Ÿ¶Èýœ’ ¸Éý›’ŸºÊýœ’ŸºÌýž’Ÿ½Ìýž’ ½Íýž’ ¿ÎþŸ“ ¿ÎþŸ’�ÀÏþ²\J¿Îþ´S:¿Ïþ´T:ÀÏþ´T:¿Îþ´T;¾Îþ´T;¾Îþ³T:¾Ïþ®i^¿ÎþŸ“ ¾Íýž“Ÿ¿ÎýŸ“Ÿ¾Îýž’Ÿ¾ÎþŸ“ ¾Îþž’Ÿ¾Ïþž“Ÿ¾Ïýž“Ÿ¿Îýž“ ½Íý�’Ÿ»Ëýœ’ ¹Êý›‘Ÿ¶Èý™›°Å±Ü–µãèuu“³äçut‘°äçts‘¯äçts�¯äçtt‘šµÁ£Ð‘�Ÿ¤ºý‘ŽŸ¥»ý�ŽŸ£¹ý�� ¢¸ý��  ¸ý�ŒŸ ·ý�Œ  ¶ý��Ÿ ·ý�ŒŸŸ¶ýŽŽ¢¢³øŽ¨ÙÞŠ�­ãçts�«äçtsŒ«äçts‹ªäçutŒ«äçttŒªäçtt�”°·žÖ®hM™±ý´b:˜²ý´c;˜°ý´b;˜²ý´b;˜±ý´b;—°ý´c;—°ý¨qd—±ýŠŠ –°ýŠ‹Ÿ—±ý™„—°ý´b;˜°ý´b;—°ý´c:˜±ý´b;—°ý³b;—°ý´c;—°ý´b<˜±ý•…�™±ýŒ‹Ÿš³ýŒŒŸš³ý�ŒŸ›³ý�Œ œ³ý��¨©ªëŒ©âåwxŒžÈÐ�¬Œ‹Ÿ›³ý�Œ œµý�ŒŸœ´ý�Œ œµý�Œ žµý�� Ÿ·ý��Ÿ¡·ý�žÂÌ’·Ž®åçur�®äçur�®åèur�¯äçtr‘°åçur‘°äçut‘�¥­´ñ’ŽŸ¥ºý‘�Ÿ¤»ý�ŽŸ¤¹ý‘ŽŸ£¹ý‘�Ÿ¤¹ý‘�Ÿ£¹ý��Ÿ£¹ý‘�Ÿ£¹ý‘�Ÿ£¹ý��Ÿ¢¹ý��Ÿ£¹ý�ŽŸ¢¹ý�ŽŸ¢¹ý��Ÿ¢ºý��Ÿ£¹ý‘�Ÿ¤¹ý‘�Ÿ¤»ý‘� ¥ºý‘ŽŸ¥»ý“Œ›¤»ý²bE¦ºý´];¥»ý´];¥¼ý³];¦»ý´^;¥ºý³^;¥ºý´]:¥¼ý­jZ¦ºý’�ž¥ºý‘Ž ¤ºý‘�Ÿ¥ºý’ŽŸ¥ºý‘�Ÿ¥»ý‘�Ÿ¤ºý‘ŽŸ¤ºý‘�Ÿ¤ºý‘�Ÿ¤¹ý‘�Ÿ¤¹ý‘�Ÿ¤¹ý‘ŽŸ¤»ý’ŽŸ¤ºý’�Ÿ¥»ý‘�Ÿ¤ºý’Ž ¦ºü‘�¢¨¸÷‘�¤«¶ô’�¤«µô‘�¢©¶ö‘Ž ¦ºû��Ÿ£¹ý‘Ž ¤ºý’ŽŸ¤ºþ‘ŽŸ¤ºý‘ŽŸ¥»ý’Ž ¥»ý’�Ÿ¥»ý’ŽŸ¦»ý’�Ÿ¦¼ý’ŽŸ¥»ý’ŽŸ¦¼ý’Ž ¥»ý‘�Ÿ¥ºý‘ŽŸ¥ºý‘Ž ¥ºý’Ž ¥»ý‘�Ÿ¦»ý’�Ÿ¤ºý��Ÿ£ºý‘�Ÿ¤¹ý‘�Ÿ£¹ý�ŽŸ£ºý‘Ž ¤»ý‘ŽŸ¥ºý’ŽŸ¦»ý’�Ÿ¦¼ý’Ž ¦½ý’ŽŸ§¼ý’ŽŸ¦½ý“Ž §½ý“ŽŸ¨¼ý“ŽŸ§½ý’ŽŸ¦»ý“ŽŸ§»ý‘�Ÿ¥»ý�Ž ¢¹ý��Ÿ¡¸ý�� ¡¸ý��Ÿ¡·ý��Ÿ ·ý��Ÿ¢¸ý’‹š ·ý“‰˜¡·ý•‡•¡¹ý”‰—¡¸ý“‰™¢¸ý’Š› ·ý�Œ� ¸ý�ŒŸ¡·ý��Ÿ¢¸ý��Ÿ¡¸ý��Ÿ ·ý�ŒŸŸ¶ý�� Ÿ¶ýŽ� ž¶ýŽŒŸŸµýŽŒŸ�µýŽŒŸ�µý�� �¶ýŽ�Ÿžµý�ŒŸž´ýŽŒŸ�´ýŽŒŸ�µý�ŒŸœµý�ŒŸ�µýŽŒ �´ý�Œ �´ýŽŒŸ�´ý�Œ œ´ý�ŒŸ›³ýŒŒ ›´ýŒŒ ›³ý�‹Ÿ›´ýŒŒ ›´ý�ŒŸœµý�Œ ›³ýŒŒŸ›´ýŒ‹Ÿš³ýŒ‹ ˜±ý‹‹ ˜²ý‹‹ ˜±ý‹‹Ÿ™±ý‹‹Ÿ˜±ý‹‹ ˜±ý”Ž ª¾þ‡› ‡�¾�”Ÿ�ˆ¾‚”Ÿ‚‰¾ƒ•ŸƒŠ¾‚•Ÿ‚оƒ•ŸƒŠ¾ƒ•ŸƒŠ¾ƒ•ŸƒŠ¿ƒ•ŸƒŠ¾ƒ•ŸƒŠ¿ƒ–ŸƒŠ¾ƒ–ŸƒŠ¿ƒ•ŸƒŠ¿„–Ÿ„‹¿„–Ÿ„‹¾ƒ–ŸƒŠ¾„–Ÿ„о„–Ÿ„о„—Ÿ„‹¿„—Ÿ„‹¿„—Ÿ„Š¿„— „‹¿…—Ÿ…‹¾„—Ÿ„‹¾…˜Ÿ…Œ¾„˜ „Œ¿„—Ÿ„‹¾„— „Š¿ƒ—ŸƒŠ¾„–Ÿ„оƒ—ŸƒŠ¾„–Ÿ„Š¿ƒ–ŸƒŠ¿ƒ– ƒŠ¿ƒ–ŸƒŠ¾„– „Š¿„–Ÿ„о„—Ÿ„Š¿k—Äkœ¿]˜å]ª¾]˜å]ª¾]—å]ª¾]—å]ª¾]˜å]©¾]˜å]ª¾i—Æi�¿„—Ÿ„о…˜Ÿ…‹¿„˜Ÿ„‹¿„˜ „‹¾…— …‹¿¶�S¶jŒÁ{9Á`{Â{9Â`zÂz9Â`zÂ{9Â`zÂ{9ÂazÂ{9Âb{‹†Ÿ‹‹šY•åY§½Y•åY¦¾X”äX§¾\•Þ\£¾�”¡�‹¾‚”Ÿ‚‰¾‚”Ÿ‚‰¾j•¼j–¾Y•åY§¾Z•åZ¨¾]—å]ª¿_˜â_©¾ƒ˜¢ƒ�¾„˜Ÿ„‹¿…˜ …‹¾…™¡…�¾l™Èl ¾cšåc®¿c›åc¯¾x›µx™¿ˆœŸˆ�¾ˆ�ŸˆŽ¾ˆ�Ÿˆ�¿‡œ ‡Ž¿‡� ‡Ž¾ˆœ ˆŽ¿ˆœŸˆ�¿ˆ�Ÿˆ�¾ˆ› ˆ�¾ˆœŸˆ�¿ˆœŸˆ�¾‡œ ‡Ž¿ˆžŸˆŽ¾‰� ‰Ž¾‰žŸ‰�¾ŠŸŸŠ�¾ŠŸŸŠ�¾ŠŸ Š�¾Š  Š�¾Š ŸŠ�¿Š ŸŠ�¿¬†\¬i’·z8·Wz·z9·Xz¸z8¸Xz¸{8¸Yy¸{9¸Xz¸z8¸Yz·|=·\}�›–�й‰ŸŸ‰�¾ŠŸŸŠ�¿ŠŸŸŠ�¿‹ Ÿ‹�¾Š ŸŠ�¾Š¡ŸŠ�¿‹¡Ÿ‹�¾Š¡ŸŠ�¾Š¡ŸŠ�¿ŠŸŸŠ�¾‰ŸŸ‰Ž¾{ž·{œ¾g�æg²¾gœæg²¾f›æf±¾f›æf²¾fœåf±¾�›©�“¿‡šŸ‡�¿…™Ÿ…‹¿…˜Ÿ…‹¿…˜Ÿ…‹¾„—Ÿ„‹¾„—Ÿ„‹¾„–Ÿ„‹¾ƒ–ŸƒŠ¿ƒ–ŸƒŠ¿~•¤~Œ¾[–ã[¦¾X•åX¨¾X•æX§¾X”åX¦¾X”åX¦¾X•åX§¾Z•ÞZ¥¾Ž‘“Ž…²Âz;Âa|Âz9ÂazÁz9Á_zÁz8Á_zÁ{8Á_zÁ{9Á`zÃz9Ã`z¥‹v¥x£…—Ÿ…‹¿…˜Ÿ…‹¿¢Œz¢z¦À{8À_z¿z9¿^z¾z9¾\z»z8»[z¼z8¼[z»z9»[y¸}A¸_€�š˜�й‰ž ‰�¾‹ Ÿ‹�¾‹¡Ÿ‹�¿‹¡Ÿ‹�¿‹¡Ÿ‹�¿x¡Éx©¿|¡¾|£¾‹¡Ÿ‹�¾‹¡Ÿ‹�¿‹¡Ÿ‹�¿Š¡ŸŠ�¾‹¡Ÿ‹�¾‹¡Ÿ‹�¾‹¡Ÿ‹�¿v¡Óv¯¾q¢æqº¾q¢çqº¿r£çr»¿t£çt¼¾t£çt½¾y£Öy´¿�¤ �’¿�¤Ÿ�‘¾�£Ÿ�‘¾Œ£ŸŒ‘¾‹¢Ÿ‹�¿‹¡ ‹�¾Š ŸŠ�¿ŠŸŸŠ�¿‰žŸ‰�¾ˆ�ŸˆŽ¾‡›Ÿ‡�¾‡œŸ‡�¿‡œŸ‡Ž¾‡œ ‡�¿ˆœŸˆŽ¾ˆ�ŸˆŽ¾ˆ�ŸˆŽ¾ˆœŸˆŽ¾ˆ�Ÿˆ�¿ˆœ ˆ�¿‡œŸ‡�¿­†^­k“»{9»Zz»{8»[z¼z9¼[z»{8»[z¼{8¼[z¼{8¼[zº{<º\|’•Ž’„³ˆ›Ÿˆ�¿‡œ ‡�¾‡œŸ‡�¿‡œŸ‡�¾†›Ÿ†�¾‡œŸ‡Ž¾‡œŸ‡Ž¾‡œ ‡Ž¿‡œ ‡�¿ˆœŸˆ�¿ˆ�Ÿˆ�¿ˆ�Ÿˆ�¾ˆœŸˆ�¾‡œ ‡�¾‡œŸ‡Ž¿‡�Ÿ‡Ž¿ˆ�ŸˆŽ¿ˆœŸˆŽ¾ˆœŸˆŽ¾ˆ�Ÿˆ�¿ˆœŸˆŽ¿ˆœŸˆŽ¿ˆœŸˆ�¾‡�Ÿ‡Ž¿‡œŸ‡Ž¾ˆ� ˆ�¾‡�Ÿ‡Ž¿ˆ� ˆŽ¿ˆ�Ÿˆ�¾ˆ�Ÿˆ�¾ˆ�ŸˆŽ¿ˆœŸˆŽ¾‡œŸ‡Ž¾ˆ� ˆ�¾ˆ�ŸˆŽ¿ˆœŸˆ�¾ˆœŸˆŽ¾ˆœŸˆ�¾‡œŸ‡Ž¾‡›Ÿ‡Ž¿‡œ ‡�¿‡› ‡�¿†› †Œ¾†šŸ†Œ¿…šŸ…Œ¿†šŸ†Œ¾…™Ÿ…‹¿„˜Ÿ„‹¾…˜Ÿ…Œ¾„˜Ÿ„‹¿ƒ–Ÿƒ‹¾ƒ•ŸƒŠ¿ƒ–ŸƒŠ¿„—Ÿ„Š¿„— „Š¿„—Ÿ„Š¿„— „‹¿„˜Ÿ„‹¿…˜Ÿ…‹¾„˜Ÿ„‹¾„— „‹¾„— „‹¿„˜Ÿ„о…—Ÿ…‹¾„—Ÿ„‹¿…˜ …‹¿…˜ …‹¿…™ …Œ¾„™Ÿ„Œ¾…˜Ÿ…Œ¿†™Ÿ†Œ¾†šŸ†�¿‡›Ÿ‡�¿‡› ‡�¿‡œ ‡�¿ˆ�Ÿˆ�¿ˆ�ŸˆŽ¿‡� ‡Ž¿ˆœŸˆ�¾‡œŸ‡�¿‡œ ‡Ž¿‰žŸ‰Ž¾ŠŸŸŠ�¿Š  Š�¿Š¡ŸŠ�¿‹¡Ÿ‹�¿Š¡ŸŠ�¾ŠŸŸŠ�¿ŠŸŸŠ�¾‰žŸ‰Ž¿‰�Ÿ‰Ž¿ˆœ ˆŽ¿‡œŸ‡�¾‡œŸ‡�¾‡œŸ‡Ž¾‡œŸ‡Ž¾‡œ ‡Ž¿ˆœŸˆ�¾‡œŸ‡�¿ˆœŸˆ�¾‡œŸ‡Ž¾ˆœŸˆ�¿‡œŸ‡�¿‡› ‡�¿‹¢ ‹�¿��Ÿ¢·ý†‰žŽ¨ü†‰žŽ©ü‡‰Ÿ�ªü‡ŠŸ‘¬ü‡ŠŸ�¬ü‡ŠŸ’¬üˆŠŸ’¬ýˆŠŸ’­ý‰‰ ’¬ý‰ŠŸ“­ý‰‹Ÿ”­ýˆŠ ”­ý‰ŠŸ•®ý‰Š •¯ý‰‹Ÿ”®ý‰ŠŸ•¯ý‰ŠŸ•¯ý‰‹Ÿ–¯ýŠ‹Ÿ—°ýŠŠŸ–°ýŠŠŸ—¯ýŠ‹Ÿ—°ýŠ‹Ÿ—°ýŒ‹Ÿ˜²ýŒ‹Ÿ™±ý‹‹Ÿ˜°ýŠ‹Ÿ–¯ý‰‹ •¯ý‰‹Ÿ•®ý‰ŠŸ•¯ýˆŠŸ“­ý‰ŠŸ”­ý‰ŠŸ“®ý‰‹ •­ý‰ŠŸ•®ýŠ‹Ÿ•¯ýŠŠŸ–¯ý‹œÄÊŽ³‹ªåæsq‹ªåærq‹ªåærr‹ªåærq‹©åæsq‹«æærq‹�ÆÌ‹¯Š‹Ÿ—°ýŠ‹Ÿ—±ý‹‹ —°ý‹‹Ÿ˜°ý‹‹ —±ý¬jS—°ý³`:—°ý³a9–°ý³`9—°ý³`9–°ý³`9•¯ý´b9•­ü¦‹ Ú|�‡¨äærp‡§äæqqˆ§äærq‡£Þßw†Š “¨ù†ŠŸ�ªü‡ŠŸ�ªü‡–½À�Áˆ¦åæqq‰¨åærqŠªæærp‹©âätw‹�¡›®ø‹ŒŸ™³ýŒ‹Ÿ›²ý�Œ¡ž´ûŽ ÉÐŒªŽ®æærqޝåærq�™µ¾ Ñ‘�Ÿ¢¹ý‘ŽŸ¤ºý‘Ž ¤ºý‘� ¥ºý’�Ÿ¤ºý’Ž ¥ºý‘�Ÿ£ºý‘�Ÿ£»ý‘�Ÿ£¹ý‘� £¹ý�ŽŸ£ºý‘�Ÿ¤»ý“�Ÿ§¼ý”ŽŸ¨¼ý”� ¨½ý”ŽŸ«¿ý•ŽŸ«¿ý•�Ÿ«¿ý•� ¬Áý–�Ÿ®Âý•�Ÿ­Âý«i\¬Áý´W9¬Áý´X9¬Àý´X9ªÀý³X9«¾ý´Y9ª¾ý´Y9©½ý²\=¨¾ý—‹–©¿ý”� ª¾ý•�Ÿ«Àý•�Ÿ­Àý–�Ÿ®Ãý—�Ÿ°Âý—� ¯Äý—�Ÿ¯Äý—� ¯Ãý—�Ÿ¯Âý•�Ÿ­Àý”� ª¾ý’›·Â¢Í‘²åæqq‘²ææqp‘²ææpo‘±ææpo‘²åçrq�’©­­êŽ�ŸžµýŒŒŸœ´ý‹‹Ÿ™³ýŒ‹Ÿ™²ýŠ‹Ÿ—±ý‹‹ ˜°ýŠŠŸ•®ý‰ŠŸ”­ý‰ŠŸ“­ýˆŒ¤œ§ñˆ¦ããsuˆ¨åæpp‡§åæqp‡¦åæpo‡§åæqo‡§åæqp‡¥Þàv’…“š¨ô³a<”®ý³`9•®ý³_9˜°ý³_8˜°ý³_9—°ý´`9–¯þ³`8–®ý xv˜±ý‹‹ ˜²ýŒŒŸš²ýŸz{š²ý³_8š³ý´]9œ´ý´]8Ÿ¶ý´[8¤¹ý´Z8¤ºý³[8¤¹ý²_B¢¹ý”Š—¤»ý”ŽŸª½ý–�Ÿ®Áý—�Ÿ°Äý˜‘Ÿ±Äý—�Ÿ±Ãý˜©Éבª˜£¾Î�¿˜� °Äý˜�Ÿ°Äý—�Ÿ°Ãý—�Ÿ¯Ãý—� ¯Âý—�Ÿ°Ãý—�Ÿ°Äý˜¯ÓÛ†–˜ºææpn™»çæqn™¼çæpo™½ææqo›½ææpo›³Öß„�›’Ÿ¸Èü›‘Ÿ¶Èýš‘ ·Çýš‘ ¶Çý™�Ÿ³Åý—�Ÿ°Äý–� ®Âý•�Ÿ¬Àý“ŽŸ¨½ý’ŽŸ¥»ý�� £¸ý�� ¢¸þ�� £¹ý��Ÿ£¹ý’�Ÿ¥ºý’ŽŸ¥»ý‘�Ÿ¥»ý’� ¦»ý’Ž ¥¼ý‘�Ÿ¥ºý‘ŽŸ¥ºýªk^¤»ý´Z9¤»ý³[8¤¹ý´[8¢¹ý³[8£ºý´[8£ºý´[9¢ºý³]<¢¹ý˜…�¢¸ý��Ÿ¢¸ý�� ¢¸ý��Ÿ¢¸ý��Ÿ¢¸ý�ŽŸ¢¹ý�Ž £ºý�� £¹ý�ŽŸ¢¹ý‘�Ÿ£¹ý‘�Ÿ£ºý‘�Ÿ¤ºý‘� ¤ºý‘ŽŸ¥ºý‘ŽŸ¤ºý‘� £¹ý‘�Ÿ£ºý’ŽŸ¤»ý‘� ¥ºý’� ¥ºý’Ž ¥ºý‘�Ÿ¥»ý’ŽŸ¥»ý‘�Ÿ¥ºý‘�Ÿ¤ºý‘ŽŸ¤»ý‘� ¥ºý‘�Ÿ¤»ý’Ž ¦»ý’�Ÿ¥¼ý‘ŽŸ¤ºý’�Ÿ¤ºý’ŽŸ¥ºý‘�Ÿ¤ºý‘�Ÿ¤ºý’ŽŸ¤ºý‘�Ÿ¥ºý‘�Ÿ¥ºý’ŽŸ¦ºý‘�Ÿ£ºý��Ÿ£¹ý‘�Ÿ¤¹ý��Ÿ¡¸þ�ŒŸŸ¶ýŽ� �¶ý�ŒŸœ´ý�Œ �µýŒŒŸœ³ýŒŒŸš²ýŒ‹Ÿš±ý‹‹Ÿ˜°ý‰ŠŸ”®ýˆŠ “­ý‰Š ”®ý‰Š ”®ý‰ŠŸ•®ýŠŠŸ•¯ýŠ‹Ÿ—°ý‹‹Ÿ—°ý‹‹Ÿ˜²ýŒŒŸ˜±ý‹‹Ÿ—°ýŠŠŸ—°ý‹‹Ÿ˜°ý‹‹ ˜°ý‹‹Ÿ˜°ý‹‹Ÿ™±ý‹ŒŸš²ýŒŒŸš²ýŒŒŸš³ýŒŒ š³ý�‹Ÿœ³ýŽŒ �µý��ŸŸ·ý�� ¡¸ý‘�Ÿ£¹ý’�Ÿ¥ºý’Ž ¦»ý‘ŽŸ¤»ý‘�Ÿ£¹ý�ŽŸ£ºý‘ŽŸ¤»ý”ŽŸ¨½ý•�Ÿ¬Àý–�Ÿ®Âý—�Ÿ°Ãý˜�Ÿ°Ãý–�Ÿ¯Âý–�Ÿ¬Áý•�Ÿ«¿ý”ŽŸ©½ý’ŽŸ¦»ý‘ŽŸ¤ºý‘�Ÿ¤¹ý‘�Ÿ£¹ý‘Ž £ºý�ŽŸ£¹ý‘�Ÿ£ºý‘�Ÿ£¹ý‘� £¹ý‘�Ÿ¤¹ý��Ÿ£¹ý�� £¸ý��Ÿ¢¸ý��Ÿ¢¸ý™� ²Äþ…˜Ÿ…Œ¿�Ÿ‡¾�Ÿ‡¾�Ÿ‡¾�Ÿ‡¾�Ÿ‡¾~�Ÿ~‡¾�Ÿ‡¾�Ÿ†¾‘Ÿ‡¾€‘Ÿ€ˆ¾€’Ÿ€ˆ¾�’Ÿ�ˆ¾�’Ÿ�ˆ¾�’Ÿ�ˆ¾�’Ÿ�‰¾�”Ÿ�‰¾‚“Ÿ‚‰¾�”Ÿ�ˆ¾‚•Ÿ‚‰½ƒ”Ÿƒ‰¾ƒ•Ÿƒ‰¾ƒ•Ÿƒ‰¾ƒ•žƒŠ¾‚•Ÿ‚о‚•ž‚‰¾ƒ–ŸƒŠ¾ƒ•ŸƒŠ¾ƒ–ŸƒŠ¾ƒ•Ÿƒ‰¾ƒ•ŸƒŠ¾‚”Ÿ‚‰¾‚”ž‚о‚”Ÿ‚о‚•Ÿ‚о‚•Ÿ‚оƒ– ƒ‰¿ƒ–ŸƒŠ¾b—Ùb¥¾]˜ç]«¾]˜ç]¬¾]–ç]«¾\—ç\ª¿\—è\«¿]—ç]«¾x—°x“¾…˜ …‹¾…˜Ÿ…‹¿„—Ÿ„‹¾…˜Ÿ…‹¿„˜Ÿ„Œ¿³‚U³jŒÀz6À]yÁz6Á]yÁz6Á^xÁy6Á]yÁy6Á]xÁy6Á^x•…‰•‚—\˜è\¬¾[—ç[«¿Z–çZ©¾[–å[©½€•¡€‹¾ƒ•ŸƒŠ¿ƒ•ŸƒŠ¾s•²s’¾Z–çZ©¿Z•èZ©¾[–ç[«¾^—å^«¿�—£��¾„–Ÿ„‹¾„—Ÿ„Š¿m—¾m›¾]—è]¬¿^—è^¬¿_˜æ_¬¾~™©~�¾…™ …‹¾†˜Ÿ†‹¾…™Ÿ…Œ¾†š †Œ¿…™Ÿ…Œ¿†™Ÿ†Œ¿†šŸ†Œ¿†š †Œ¿†›Ÿ†Œ¾‡›Ÿ‡�¾‡œŸ‡�¿‡›Ÿ‡Ž¾‡œ ‡�¾‡œŸ‡�¿‡œŸ‡�¾ˆœŸˆ�¾‡œŸ‡Ž¿‡œŸ‡�¾‡œŸ‡Ž¿‡œŸ‡�¾ˆ›Ÿˆ�¾Ÿ�zŸz¦»y5»Yx»y5»Yx»y5»Xx»y5»Xx»y6»Xx»y5»Xx»y5»Xx¤‹o¤sžˆœŸˆ�¾‡œŸ‡Ž¾ˆœ ˆ�¿‡œŸ‡�¾‡œŸ‡�¿‡› ‡�¿‡›Ÿ‡�¾†›Ÿ†�¾†›Ÿ†�¿‡› ‡�¿‡›Ÿ‡Œ¿rš¾r�¿`šç`¯¾ašèa°¿`˜è`®¾_˜è_®¾c˜Ùc¦¾ƒ—¡ƒŒ¾„˜Ÿ„‹¿„—Ÿ„‹¾„— „Š¿‚•Ÿ‚‰¾�“Ÿ�‰¾�‘Ÿ�ˆ¾€’Ÿ€ˆ¾€‘Ÿ€ˆ¾�Ÿˆ¾u‘ªu�¾R‘çR¤¾R’çR£¾R’èR¤½S’çS¤¾S“çS¥¾S’çS¥¾c”Éc›¾¨‡n¨sœÁx6Á]xÂy5Â\xÁy6Á\xÁx6Á\xÀy6À\xÁx6Á\xÁx5Á\w”’‹”‚±…˜ …‹¿…™Ÿ…‹¿¥Šq¥v ¾x6¾Yx»x5»Xx»y5»Wwºx5ºXx»y5»Xx¼y6¼Xxµ}Eµ^‚Œž›Œ�»Œ£ŸŒ�¿Ž¦ŸŽ“¿�§ �“¿�§Ÿ�“¿�¨Ÿ�”¿Œ¨¬Œ�¿Š¨µŠ£¿�¨Ÿ�”¿�¨Ÿ�”¿�©Ÿ�“¿�© �“¿�¨Ÿ�”¿�¨Ÿ�”¿�¨¢�•¿¨ã¿~§è~Å¿~¨é~Å¿~§é~Å¿~§é~Å¿}¨é}Æ¿…§Â…«¿�¨ �“¿Ž§ŸŽ“¿�¦Ÿ�“¾�¦Ÿ�“¾Ž§ŸŽ’¾�¥Ÿ�’¿Ž¥ŸŽ’¿�£Ÿ�‘¾�¤ �’¿�£Ÿ�‘¾Œ¢ Œ‘¾Œ¢ŸŒ�¿‹¡ ‹�¾Š¡ŸŠ�¾‹¡ ‹�¾Š¡ŸŠ�¾Š¡ Š�¾‹¡ ‹�¿‹¢Ÿ‹�¾Œ¢ŸŒ�¾Œ¢ Œ�¾�•}�|§´x5´Rx³y6³Qx´x5´Qx³y6³Qx²x6²Qx³x6³Qx²y6²Qx¥‰c¥j–�£Ÿ��¾Œ¢ŸŒ�¾‹¢Ÿ‹�¾Œ¢ŸŒ‘¿Œ¢ŸŒ�¿Œ¢ŸŒ‘¾Œ¢ŸŒ‘¿Œ¢ŸŒ�¾Œ¢ Œ‘¿Œ¢ŸŒ‘¿Œ¢ŸŒ�¿‹¡Ÿ‹�¿‹¢Ÿ‹�¾Š ŸŠ�¾‹ Ÿ‹�¾Š¡ŸŠ�¿‹¡Ÿ‹�¿‹¡Ÿ‹�¾‹¡Ÿ‹�¾‹¡Ÿ‹�¿‹¡ ‹�¾Š  Š�¿Š  Š�¾ŠŸŸŠ�¿Š ŸŠ�¿ŠŸ Š�¾‰Ÿ ‰�¾‰Ÿ ‰�¾ˆžŸˆŽ¿ˆ�ŸˆŽ¿ˆœŸˆ�¿ˆœŸˆŽ¿ˆ›žˆ�¾ˆ›�ˆŒ½‡œŸ‡�¾‡œŸ‡Ž¿ˆ�ŸˆŽ¾ˆœŸˆ�¾ˆœŸˆŽ¿‡œŸ‡Ž¾‡œŸ‡�¾†šŸ†Œ¿†˜Ÿ†Œ¿…˜Ÿ…Œ¿…˜Ÿ…‹¾…˜Ÿ…‹¿…˜Ÿ…‹¿…— …‹¾„˜Ÿ„‹¾„— „‹¾ƒ–ŸƒŠ¾ƒ• ƒŠ¾ƒ”Ÿƒ‰¿ƒ•Ÿƒ‰¾ƒ•ŸƒŠ¿ƒ• ƒŠ¿ƒ•ŸƒŠ¾„—Ÿ„о„˜ „‹¿…—Ÿ…о…˜ …‹¾„—Ÿ„‹¿…—Ÿ…‹¾„— „‹¾„˜Ÿ„Š¿„—Ÿ„‹¾„—Ÿ„‹¾„—Ÿ„‹¾„—Ÿ„‹¾„˜ „‹¿„— „‹¿…—Ÿ…‹¾…˜Ÿ…‹¿…˜Ÿ…‹¿…™Ÿ…Œ¿†™Ÿ†Œ¾†™Ÿ†�¾†› †Œ¾‡›Ÿ‡Œ¿‡›Ÿ‡�¿‡œŸ‡Ž¾ˆœŸˆŽ¾‰žŸ‰Ž¿‰žŸ‰Ž¿‰ž ‰�¿‰žŸ‰�¾‰žŸ‰�¾‰Ÿ ‰�¿ˆžŸˆ�¾ˆ�ŸˆŽ¾ˆ�ŸˆŽ¾ˆœŸˆ�¿‡œ ‡Ž¿‡œŸ‡�¾ˆœŸˆ�¿ˆ› ˆ�¾‡›Ÿ‡�¾‡œŸ‡�¿‡œ ‡Ž¾‡œ ‡Ž¿ˆ�ŸˆŽ¾‡�Ÿ‡Ž¾ˆœŸˆ�¾ˆ�ŸˆŽ¿Œ£ŸŒ‘¿Œ‹Ÿ›²ý�‡Ÿƒ¢ü�†Ÿƒ¢ü€†Ÿ‚ ü€‡Ÿƒ¡ü€‡Ÿ‚ ü€‡Ÿƒ ü€‡Ÿƒ¡ü�‡Ÿ…¡ü‚‡Ÿ†¢ü‚ˆŸ‡£ü‚ˆŸˆ¤üƒˆŸ‰¥ü„ˆŸŠ¦ü„ˆŸŒ§ü„ˆŸŒ§ü…ˆŸ�©ü…ˆŸ�¨ü†‰Ÿ�©ü†‰Ÿ�ªü†Šž�ªü‡‰Ÿ�¬üˆŠŸ“­üˆŠŸ’­ü‡ŠŸ�«ü‡ŠŸ‘«üˆŠŸ’¬üˆŠŸ“¬üˆŠŸ’¬ü‡‰ž’«üˆŠŸ‘«ü†ŠŸ�«ü†‰Ÿ�«ü‡‰Ÿ�ªü‡‰ž�ªü‡‰Ÿ‘«üˆŠŸ’­ýˆŠ ”­ýŠ¥ØÚ{‰Š¬ççon‹«çæpmŠªçæpmŠªçæpn‹«èænlŠ«çæolŠ’¯° Ü‹ŒŸ™±ý‹‹Ÿ™°ý‹ŒŸ˜±ýŒ‹Ÿ˜±ýŒ‹Ÿ˜²ý«iT˜²ý³^6˜±ý´^6™±ý´]6™±ý³^6™²ý³]6™±ý³^6—±ý§‚ˆÊ‹²Š«çæomŠ«çæol‰ªçænm‰©åäpn‰Œ¢—«÷ˆŠŸ“¬ýˆŠŸ‘­ýˆ’²±œØ‰ªèæom‰ªçæol‰«èæom‹«åäqr‹�£�¬õŠ‹Ÿ•¯ýŠ‹Ÿ–°ýŠš¾Ä‘¾‹¬çånl‹¬çæol‹¬åäpqŒ�¨§©êŒŒ ™²ý�ŒŸ›²ý�Œ œ³ý�ŒŸ�´ýŽŒŸœ´ý�ŒŸœ´ý�Œ ŸµýŽ�Ÿžµý��  ¶ý��Ÿ ¸ý��Ÿ¢¹ý��Ÿ¢¹ý��Ÿ¤¹ý�ŽŸ£ºý�ŽŸ£ºý‘�Ÿ¢¸ý�� ¢¹ý‘�Ÿ£¹ý‘�Ÿ£¹ý��Ÿ¢ºý‘� £¹ý¡zz£¹ý³Y5£ºý´X5£¹ý³Y5¤¹ý³X6¤ºý´X5¤»ý³X5¤»ý³Y5¤ºý¥to¥»ý‘�Ÿ£¹ý‘ŽŸ¢ºý‘�Ÿ£¹ý��Ÿ¢¹ý��Ÿ¢¸ý�� ¡¸ý��Ÿ¢¸ý�Œ ¡·ý��Ÿ ·ý�ŒŸ¡¸ý�ŒŸ ·ý��¾Æ–¾�¯çænl�°èåml�¯èåmkŒ­èåmk‹§ÙÛyˆ‹Œ¡š¯ù‹‹Ÿ˜±ý‹Š —°ý‰ŠŸ•®ý‡‰Ÿ‘«ü…ˆŸŒ¨üƒˆŸ‰¦üƒˆŸ‰¦üƒ‡Ÿˆ£ü‚‡Ÿ‡£üƒ�©œšæƒ¤çållƒ¤çåmlƒ¥çåll„¤çålkƒ¦èåll„¥çålk†›ÈË…¨¢sn“­ü´]6˜±ý³]6—¯ý³\5˜±ý´\5˜°ý´\5™²ý³[5˜²ý³\5˜±ý–�‹™³ýŒ‹Ÿš³ýŒŒŸš³ý¢uqž´ý³Y5 ¸ý³X6¢¹ý³X5¥»ý´W5¦»ý³X5¢ºý³Y6£¸ý°^D§¼ý—�š®Âý™‘ ´Çý�“Ÿ»Ìý “ ÀÏþ¡“ ÂÐþ¡”ŸÃÑþ¡œ­Ë¿ä¡£µÑ²Ò¡” ÄÑþ¡”ŸÃÒþ¡“ ÄÑþ¡“ŸÃÑþ¡”ŸÃÑþ¡“ ÃÑþ •¢ÃÍù Ââãux Åéæmk¡Æéåmk Åéåml Åéæml Åéåll «ÃÕŸ¸Ÿ” ¿ÏþŸ“ŸÀÏþŸ“Ÿ¿ÎýŸ“ ÀÏý�’Ÿ¼Íý�’ ºËýœ’Ÿ¹Êýš‘Ÿ¶Éýš‘Ÿ¶Èý›‘ ¶Çý™�Ÿ´Æý™‘Ÿ²Æý—�Ÿ±Ãý—� ¯Äý—� ¯Ãý—� ±Äý˜�Ÿ±Äý—�Ÿ±Äý—�Ÿ±Äý˜�Ÿ²Åý˜� ²Äý¤{}²Åý´R5²Åý³R6³Æý³R5³Æý³Q5³Æý³Q5µÇý³Q5µÈý´Q6¶ÇýªjcµÇýš‘Ÿ´Çý˜‘Ÿ²Åý™‘Ÿ²Äý˜‘Ÿ³Åý™‘Ÿ³Æý™‘Ÿ´Æý™‘Ÿ³Åý™‘Ÿ³Åý™‘Ÿ²Åý™‘Ÿ²Åý˜�Ÿ±Äý—�Ÿ°Ãý—�Ÿ¯Ãý–�Ÿ®Áý–� ®Áý–�Ÿ¯Ãý—�Ÿ°Äý˜�Ÿ°Ãý˜�Ÿ°Ãý˜�Ÿ°Äý—� °Âý—� ®Áý–�Ÿ­Áý–�Ÿ¬Áý•�Ÿ¬Àý•�Ÿ«Àý”�Ÿª¾ý”�Ÿ©¿ý’Ž §¼ý’ŽŸ¦»ý‘ŽŸ¤ºý‘�Ÿ¤¹ý��ž£¹ý‘Œž¢¸ý�� ¡¹ý‘�Ÿ£ºý’Ž ¥»ý’�Ÿ¥ºý‘�Ÿ¥»ý‘Ž ¤¹ý‘Ž £¹ýŽŒŸž¶ý�Œ ›³ýŒ‹ š³ý‹‹ ™³ý‹‹Ÿ™±ý‹‹Ÿ˜²ýŠ‹Ÿ—°ý‹‹Ÿ˜°ýŠŠŸ–°ý‰ŠŸ”­ýˆŠŸ“¬ý‡ŠŸ’¬ýˆŠ ’¬ýˆŠŸ“¬ýˆŠŸ’¬ý‰Š ”®ýŠ‹ •®ý‹‹Ÿ—±ý‹ŠŸ—°ý‹‹Ÿ˜±ý‹‹Ÿ˜±ýŠ‹Ÿ—°ý‹‹Ÿ—°ý‹‹ ˜°ý‹ŠŸ—°ýŠ‹ —°ýŠŠŸ–°ýŠ‹Ÿ–°ýŠ‹Ÿ–°ýŠ‹Ÿ—±ý‹‹ ˜±ýŒ‹Ÿ™±ýŒ‹Ÿš±ý�‹Ÿœ³ý�ŒŸœµý�Œ žµý��Ÿ¡·ý��Ÿ¡·ý�ŒŸ¡·ý�� £¹ý‘ŽŸ¤»ý“ŽŸ¨¼ý”ŽŸ¨½ý“ŽŸ¨½ý“ŽŸ¨½ý”Ž ©¾ý”�Ÿ©¿ý“ŽŸ¨½ý’ŽŸ¦¼ý’Ž ¦»ý‘ŽŸ¤»ý‘�Ÿ¤ºý��Ÿ£¹ý�� £¹ý‘� £¹ý��Ÿ¡¸ý��Ÿ¢¸ý��Ÿ£¹ý��Ÿ¢¹ý��Ÿ£»ý�� ¤ºý‘�Ÿ¤»ý‘ŽŸ¥»ý™�ŸµÇþ…˜Ÿ…‹¾~�Ÿ~†¾�Ÿ‡¾�Ÿ‡¾€�Ÿ€ˆ½€‘Ÿ€‡¾€’Ÿ€ˆ¾‚“Ÿ‚‰¾ƒ•ŸƒŠ¾ƒ–ŸƒŠ¿„–Ÿ„о„—Ÿ„о…—Ÿ…‹¾…—Ÿ…‹¾„—Ÿ„‹¾„—Ÿ„‹¾…™Ÿ…‹¿…˜Ÿ…‹¿„˜Ÿ„‹¿…˜Ÿ…‹¿…™Ÿ…‹¾…˜Ÿ…‹¿…˜Ÿ…Œ¾…˜Ÿ…‹¿…™ …‹¾…˜Ÿ…Œ¾…˜Ÿ…‹¿…˜ …‹¿…™Ÿ…Œ¿…™Ÿ…Œ¿…™Ÿ…‹¿„™ „‹¾…™ …‹¿…™ …Œ¿…˜Ÿ…Œ¾…˜Ÿ…‹¿…™Ÿ…‹¾�™¦��¾a™ça¯¿b™éb°¿bšéb±¾bšéb±¾bšéb±¾bšéb²¾gšÝg­¿‡› ‡Ž¾‡œ ‡�¿‡›Ÿ‡�¾‡œŸ‡�¿‡›Ÿ‡�¿‡œŸ‡�¾¯ƒV¯g޼w4¼Ww»w4»Ww¼w4¼Ww»x4»Ww»w3»Vw¼w4¼Ww¤…k¤r”e›çe²¿e›êe´¾e›ée´¾e›èe³¾…›¡…޾‡›Ÿ‡�¾†› †Œ¾„š¢„Ž¾gšÙgª¾bšéb²¾bšéb²¾fšßf­¿…šŸ…�¾…˜Ÿ…‹¾z™±z•¾_˜ç_¯¾^˜é^®¾^˜ê^®¾d˜Ùd¨¾„˜ „Œ¾…™Ÿ…Œ¾…™Ÿ…‹¿„™ „Œ¿…™Ÿ…‹¾…˜Ÿ…Œ¾…˜Ÿ…‹¾…˜Ÿ…‹¾…˜Ÿ…Œ¿„˜Ÿ„‹¿…˜Ÿ…‹¿„˜Ÿ„Š¿„˜Ÿ„‹¾„˜Ÿ„‹¿„—Ÿ„‹¾„˜Ÿ„‹¿„—Ÿ„‹¾…˜Ÿ…Œ¿…˜Ÿ…Œ¾„—Ÿ„‹¾„— „‹¿ƒ–ŸƒŠ¿Ž““Ž„¶¾x8¾\yÀw3ÀZwÀw3ÀZvÀw3ÀZwÀw3ÀZvÀw3ÀZwÀw3ÀZv¾x9¾]zŽ““Ž…·…˜Ÿ…‹¾…˜Ÿ…‹¾…—Ÿ…‹¾…˜ …‹¾„™Ÿ„‹¾…˜ …Œ¿…˜Ÿ…‹¾…˜ …Œ¾…˜Ÿ…‹¿…˜Ÿ…‹¿k—ÆkŸ¾^—ê^®¾]—ê]®¾\–ê\®¾]˜ê]¯¾k—Çkž¾ƒ–ŸƒŠ¿ƒ•Ÿƒ‰¾‚“Ÿ‚‰¾�’Ÿ�ˆ¾€“Ÿ€ˆ¾€‘Ÿ€ˆ¾€�Ÿ€ˆ¾€‘Ÿ€‡¾€‘Ÿ€‡¾€‘ž€‡¾o�²o�¾P‘éP¥¾P‘éP¥¾R‘éR¦¾R’êR¦¾S’éS¨¾U“êU§¾y’ªy�¸¼z@¼_Àw3ÀZwÁw3ÁZvÂw3Â[vÀw3ÀYvÀw3ÀYvÀw3ÀZwº{Aº_€‰–œ‰‰¼…™Ÿ…Œ¿‡›Ÿ‡�¾¦‰k¦qœ»v3»Vvºw3ºUwºv3ºUvºw3ºUv»v3»Vv»w3»Uv´}I´_…ŠžžŠŽ¾Š ŸŠ�¿Œ¢ŸŒ�¿Œ£ŸŒ‘¿Œ¤ŸŒ‘¿�¥Ÿ�’¿Ž¦ Ž“¾�¦£�•¿�§Ÿ�“¿�§ �“¿�¨ �“¿�¨Ÿ�“¿�§ �“¿�¨Ÿ�“¿�©ª�›¿€¨é€Ç¿¨ëÈ¿¨êÈ¿¨ëÈ¿¨êÈ¿¨êÉ¿Œ¨­ŒŸ¿�© �”¿‘©Ÿ‘”¿‘ªŸ‘”¿‘ª ‘•¿’« ’•¿’ª ’•¿’« ’•¿’«Ÿ’•¿’¬Ÿ’•¿’¬Ÿ’–¿’¬ ’•¿“¬Ÿ“•¿“¬Ÿ“•¿’¬ ’–¿’¬ ’–¿“¬Ÿ“–¿“¬ “–¿’­Ÿ’–¿“¬ “•¿“­Ÿ“–¿“­Ÿ“–¿–ª˜–‘¹¤{;¤L|¤w2¤Ev¤w3¤Dv¤w3¤Dv¤w3¤Ev¤w2¤Dv¤w2¤Dv£x5£Ex–¢Š–…±”­ ”–¿”­Ÿ”—¿“®Ÿ“–¾”® ”–¿“­Ÿ“–¿”­ ”–¿“¬ “–¿“«Ÿ“•¿’¬ ’•¿’«Ÿ’•¿’¬Ÿ’–¿’« ’–¿’¬Ÿ’•¿’¬ ’•¿‘«Ÿ‘•¿‘«Ÿ‘•¾‘ªŸ‘•¿‘ªŸ‘•¿‘©Ÿ‘”¿�©Ÿ�“¿�¨ �“¿�§Ÿ�“¿�§Ÿ�“¿�¦Ÿ�“¾�¥Ÿ�‘¾Œ¤ŸŒ‘¿Œ¢ Œ‘¿‹¡Ÿ‹�¾‰ŸŸ‰�¾‹�›‹Œ¼¡Œs¡u¢²€P²c‰²~K²a†¦ˆi¦ošŽ™–Žˆ¸ˆœŸˆŽ¾‡œŸ‡Ž¾‡œŸ‡�¾‡œŸ‡�¿‡›Ÿ‡�¿…™Ÿ…Œ¿…™ …Œ¾…™Ÿ…Œ¿…—Ÿ…‹¾…˜Ÿ…Œ¾„˜ „‹¾…™ …‹¿…˜ …‹¿…˜Ÿ…‹¿„˜Ÿ„‹¿…˜Ÿ…‹¾„—Ÿ„Š¿„—Ÿ„‹¾„—Ÿ„‹¿„—Ÿ„‹¾„—Ÿ„‹¾…˜Ÿ…‹¿„— „‹¾„–Ÿ„о„–Ÿ„о„– „о„—Ÿ„‹¾ƒ—Ÿƒ‹¾„—Ÿ„‹¿„– „о„˜ „‹¾…— …‹¾„—Ÿ„‹¾„—Ÿ„‹¿„–Ÿ„‹¾„—Ÿ„‹¿„–Ÿ„Š¿„—Ÿ„‹¾„—Ÿ„‹¾„—Ÿ„Š¿„– „‹¿…˜Ÿ…‹¾„—Ÿ„‹¿…—Ÿ…‹¿„—Ÿ„‹¾„˜Ÿ„‹¿…˜Ÿ…Œ¾„˜Ÿ„‹¾„—Ÿ„‹¿„˜Ÿ„Œ¾„™Ÿ„‹¾…™Ÿ…Œ¾†™Ÿ†Œ¿…šŸ…Œ¾†šŸ†Œ¾†šŸ†Œ¾†šŸ†Œ¾†š †�¾‡›Ÿ‡�¿‡œ ‡�¿‡œŸ‡�¿ˆœŸˆŽ¿ˆ�Ÿˆ�¿ˆœ ˆ�¿‡�Ÿ‡Ž¾ˆ�ŸˆŽ¾ˆ�Ÿˆ�¿ˆ�ŸˆŽ¿Œ£ Œ‘¿ŒŒŸš±ý€‡Ÿƒ¡ü�‡Ÿƒ¢ü€‡Ÿƒ¢ü�‡ž†¢üƒ‡Ÿ‡¤üƒˆŸˆ¥ü…‰ŸŒ¨ü‡‰Ÿ�«üˆŠŸ“®ý‰‹Ÿ”¯ýŠ‹ —¯ýŠ‹Ÿ—±ýŠ‹Ÿ˜±ý‹‹ ˜°ý‹‹Ÿ—°ýŒŒ ™²ý‹‹Ÿ™²ý‹‹Ÿ™²ýŒ‹Ÿ˜±ý‹‹Ÿ™²ýŒŒŸ™²ýŒ‹Ÿ™²ýŒ‹Ÿ™³ýŒ‹Ÿ™²ý‹‹Ÿ™²ýŒŒŸ™²ý‹‹Ÿš±ýŒŒ š²ýŒ‹Ÿ™³ý‹‹ š²ýŒŒŸ˜²ý‹Œ ™³ýŒŒŸš²ýŒŒ ›³ýŒ‹Ÿ™²ý�‹ š³ýŒ�¦¢¬ðŒ¯èälm�°éåliޱéækj�±éæli�±éålj޲êåki�­Ýßu‚�� ¢¶û��Ÿ¡¸ý�� ¡¸ý��Ÿ¡¸ý��Ÿ¡¸ý�� ¡¹ý«gV¡¹ý³W3¢¸ý³W4¡¸ý³W4¡¸ý³W4¡¹þ³W4¡¸ý³X4 ¸ý¨qk²ªå�³èäkl�´êåjh�´êæjh�²çãlm�Ž¡¤µø��Ÿ ¶ý��ŸŸ¶ýŽŽ££²÷Ž«ÙÛz‰�²êåji�²êåjiŽ­ßÞs}��Ÿ�³ýŒ‹Ÿš²ýŒ•±²ŸÚ‹¯çälm‹®éåjiŒ¯êåki‹¨ÙÚx‰‹‹ š±üŒ‹Ÿ™²ýŒŒŸš²ýŒŒŸš³ýŒ‹Ÿ™²ý‹‹ ™±ý‹‹Ÿ˜±ý‹‹ ™±ý‹‹Ÿ˜±ý‹‹ ™±ý‹‹ ™±ý‹‹Ÿ—°ýŠ‹Ÿ—°ý‹ŠŸ˜°ý‹‹Ÿ˜±ý‹‹ —±ý‹ŠŸ—°ý‹‹Ÿ˜²ý‹‹ ˜±ýŠŠŸ–°ýŠ‹Ÿ•¯ý‰‹Ÿ•¯ý�…“•¯þ±\8˜°ý³Y3™²ý²Y3˜²ý³Z4™±ý³Z3™±þ³Z3˜°ý³Z3™²ý²\9˜°ý‘…”˜±ýŒ‹Ÿ™±ýŒ‹Ÿš±ýŒ‹Ÿ™²ýŒ‹ ™±ýŒ‹Ÿ™²ý‹‹Ÿš²ýŒ‹Ÿš³ýŒ‹Ÿ™²ýŒ‹Ÿ™±ý‹ŒŸ˜²ý‹ŸÆË‰°‹®êåihŠ®êåhhŠ®êæhg‹¯êåigŠžÆÉ‰¯ŠŠŸ•®ýˆŠŸ’¬ü…‰ŸŽ©ü„ˆŸŠ¦üƒˆŸ‰¦üƒˆžˆ¥ü‚ˆŸ†¤ü‚‡Ÿ‡£ü‚ˆŸ…£ü‚ˆŸ†£ü��²§“Ö‚¥éåih‚¤éåig‚¥êåhg„¦éåhg„§éåhh…§éåigŒ�«¯™Ö¯_@•¯ý³Z3™±ý³Z3—¯ý³[3–°ý³Y3˜±ý²Z3š²ý³Z3™²ý¯_A™³ý�‰›™²ý�ŒŸž´ý��Ÿ¡·ý¥qk¢¹ý³V3£ºý³U3¥ºý³U3¥»ý³U3¥ºý³V4£ºý³U3¢¹ý¯_I¦ºý“�Ÿ¨½ý–�Ÿ®Âý™� ²Åýš‘Ÿ¶Çýš‘ ·Èýœ’ »Êýž” ¼Ìüž•£ÁÊöŸ“ ÀÏþŸ“ ¿Ïþ ” ÀÐþ “ ÁÐþ “ŸÂÐþ¡”ŸÃÑþ¡œªÊÂç¡Çéäkj¡Èêåig¡Èëåih¡Èëåih¡Èêåhh¡Èêåig¡ž®Í½á£”ŸÅÔþ¢” ÅÔþ¤•ŸÇÔþ£•ŸÇÕþ¤•ŸÉÖþ¥•ŸÊÖþ¤• ÊØþ¥• ËØþ¥–ŸËØþ¥•ŸËØþ¦–ŸÌÙþ¥•ŸÌØþ¥• ÌØþ¥– ËØþ¦• ÌÙþ§• ÍÙþ¦•ŸÍÙþ¦–ŸÍÙþ¦–ŸÍÙþ§– ÎÚþ¦– ÎÚþ¨�—ÏÛþ²K;ÏÛþ²D2ÐÜþ³D2ÐÜþ³E2ÐÜþ³D3ÑÜþ²C3ÑÝþ³D2ÑÝþ²E5ÑÝþª„ŠÒÞþ¨– ÑÝþ§— ÐÜþ§– ÐÜþ¨–ŸÑÛþ§– ÏÛþ§– ÏÚþ¦– ÍÙþ¥– ÌØþ¦– ÍÚþ¥– ËØþ¥• ËØþ¦– ËÙþ¥•ŸËÙþ¥•ŸÌØþ¤”ŸÉÖþ£• ÉÖþ£• ÈÕþ¢”ŸÆÕþ¢” ÅÓþ¢“ ÅÒþ¡“ ÃÑþ¡” ÂÑþŸ“ŸÀÏþž“Ÿ¾Íýœ’Ÿ¹Ëý›‘Ÿ¶Çý™�Ÿ²Åý—�Ÿ°Âý•�Ÿ«Áý”Œ›©¾ý¢ut¤ºý¬cP¢¹ý­aL£¸ý¥oi¤»ý–ˆ–¥ºý‘�Ÿ¥»ý‘�Ÿ¤ºý‘�Ÿ£¹ý�� ¢¹ý��Ÿ¡·ý�ŒŸ�µýŒŒŸš³ýŒŒ š²ýŒŒŸš±ý‹‹Ÿ˜²ýŒ‹Ÿš²ýŒ‹ ™³ý‹ŒŸ˜²ý‹ŒŸ˜±ý‹‹Ÿ˜²ý‹‹ ™±ý‹‹Ÿ—°ý‹‹Ÿ—±ý‹‹Ÿ—°ýŠ‹ž•¯üŠ‹Ÿ–¯ý‹‹Ÿ˜±ý‹‹Ÿ–¯ý‰‹Ÿ•¯ý‰ŠŸ•®ýŠ‹ •¯ýŠŠŸ–¯ý‰‹Ÿ•¯ýŠŠ –¯ýŠ‹Ÿ–¯ýŠ‹Ÿ–°ýŠ‹Ÿ–°ýŠŠŸ–¯ýŠŠŸ–¯ýŠ‹ —¯ýŠ‹Ÿ–¯ýŠŠŸ•®ýŠ‹Ÿ–°ý‰‹Ÿ•°ýŠ‹Ÿ—¯ýŠŠŸ–¯ý‹‹Ÿ—°ý‹‹Ÿ˜±ý‹‹ ˜°ýŠ‹Ÿ—°ý‹ŒŸ˜²ýŒ‹Ÿ™±ý‹Œ ™±ý‹‹Ÿ™±ý‹‹Ÿš±ýŒŒŸš²ý�ŒŸ›³ý�ŒŸœ´ý�ŒŸœ´ý�ŒŸ�´ý�ŒŸ�µýŽŒŸ�µýŽŒŸž¶ý�Œ ¡¸ý��Ÿ¡¸ý‘ŽŸ£¹ý‘ŽŸ¤ºý‘ŽŸ¥ºý‘ŽŸ¤ºý‘�Ÿ¥ºý’ŽŸ¦»ý’Ž ¦¼ý’� ¦»ý›‘Ÿ·Çþ…˜Ÿ…Œ¾�Ÿ‡¾€‘Ÿ€‡¾€’Ÿ€ˆ¾€’Ÿ€ˆ¾‚”Ÿ‚‰¾ƒ–ŸƒŠ¾„– „‹¾„—Ÿ„‹¾„—Ÿ„‹¾„˜Ÿ„о„˜Ÿ„‹¿…˜Ÿ…Œ¿…˜Ÿ…‹¾…˜Ÿ…‹¾„˜ „Œ¾…˜Ÿ…‹¾†™Ÿ†Œ¿…šŸ…Œ¿†šŸ†Œ¿†›Ÿ†�¿‡›Ÿ‡�¾‡œŸ‡�¾‡œŸ‡�¿ˆœŸˆ�¾‡œŸ‡Ž¿‡œŸ‡�¿ˆœ ˆ�¿ˆœŸˆŽ¿‰�Ÿ‰Ž¾‰žŸ‰�¾ŠžŸŠŽ¾‰ŸŸ‰�¾Š ŸŠ�¾Š  Š�¾Š  Š�¾Š ŸŠ�¾� µ�Ÿ¾q¡êq¾¾r¢êr¿¾r¡êr¿¿r¢ër¿¾r¢êr¿¾r¢ërÀ¾¢½£¾‹¡Ÿ‹�¾‹¡ ‹�¾‹¡Ÿ‹�¾Š ŸŠ�¿Š  Š�¿Š ŸŠ�¾«ƒW«d�´v1´Ou´v0´Ou´v1´Ou³v1³Ou²v1²Mu°u0°Mt¥†[¥e�~¤Æ~ª¿w¤êwþw¤ëwÿz¤áz¼¾�¤¡�’¾�¤ �’¾�¤Ÿ�’¾�¤Ÿ�’¾…¤¯…›¾v¤æv¾¿t¢ëtÀ¾z Æz¨¿ŠŸŸŠ�¾†ž¤†‘¿l�Ül±¿g�ëg¸¾fœëf¶¿fœëf¶¾t›¾tŸ¿†›Ÿ†�¿†šŸ†Œ¾…™Ÿ…Œ¾…™Ÿ…‹¿…˜Ÿ…‹¾…˜Ÿ…‹¿„—Ÿ„‹¿„—Ÿ„Œ¿„—Ÿ„‹¿„–Ÿ„о„–Ÿ„‹¿„— „Š¿„— „‹¿„—Ÿ„‹¿…—Ÿ…‹¿„˜Ÿ„‹¿„—Ÿ„Š¿ƒ•ŸƒŠ¾‚•Ÿ‚о‚“Ÿ‚‰¾�’ž�ˆ¾�’Ÿ�ˆ½�’Ÿ�ˆ¾µ~[µj�Åu0Å[tÅv1Å\uÃv0ÃZtÂu0ÂYuÁu0ÁXuÁv0ÁXtÁu0ÁXu²€Y²i�†—�†‰½…—Ÿ…‹¿„˜Ÿ„‹¾„˜Ÿ„Œ¿…™Ÿ…Œ¿…™Ÿ…‹¿…™Ÿ…Œ¿…˜Ÿ…Œ¿…˜Ÿ…‹¿…—Ÿ…Š¿f—Ñf¤¾^–ì^¯¿^—ì^±¿^—ë^¯¿[–ë[®¾s”³s”¾�“Ÿ�‰¾�’Ÿ�‰¾�’Ÿ�ˆ¾�‘Ÿ�ˆ¾€‘Ÿ€ˆ¾�Ÿ‡¾€‘Ÿ€ˆ¾€‘Ÿ€‡¾€�Ÿ€ˆ¾€‘Ÿ€ˆ¾i‘¸i“¾R‘ëR§¾S’ìS¨¾T’ëT¨¾T’ëT©¾V”ëV«¾\•â\©¾£†r£t�Áu0ÁWtÁu0ÁXtÁu0ÁXtÁu0ÁWtÀu0ÀVt¿u0¿VuÀu0ÀVtª…fªn˜†™Ÿ†Œ¿†›Ÿ†�¾‡œŸ‡�¾¥‰l¥pœºu0ºRtºu0ºRu¹t0¹Rt·u0·Pt¶u0¶Ot´u0´Nt¬~H¬Z„�¤Ÿ�’¿�¥Ÿ�’¾Ž¦ŸŽ’¿Ž¦ŸŽ’¿�§Ÿ�“¿�§Ÿ�“¿�¨Ÿ�“¿�¨ �”¿�¨Ÿ�”¿�¨Ÿ�”¿�©Ÿ�”¿�©Ÿ�”¿�© �”¿�© �”¿‹©·‹¦¿‚ªí‚Ì¿„ªí„Í¿…«í…í‡Ï¿ˆ­íˆÑ¿‹®ß‹È¿”­¢”˜¿”­Ÿ”—¿”®Ÿ”—¿”¯ ”—¿•¯Ÿ•˜¿•± •˜¿•± •˜¿—² —™¿—³ —™¿˜³Ÿ˜š¿—´ —š¿—´ —™¿˜´Ÿ˜™¿—³ —™¿—³Ÿ—™¿—³Ÿ—™¿—³Ÿ—™¿—³Ÿ—™¿—³Ÿ—™¿—³Ÿ—™¿—³Ÿ—™¿—³ —™¿—³Ÿ—˜¿›’g›h™�u/�ÄÑþ£�›ÄÒþ¢”ŸÅÓþ£• ÇÔþ¥•ŸÊØþ¦–ŸÌÚþ¦–ŸÍÙþ¦– ÎÚþ¦–ŸÎÚþ¦– ÍÙþ§– ÎÚþ§–ŸÏÚþ¦– ÎÚþ¦– ÎÚþ§– ÏÛþ§µÆÛŸ²¨Óîäb`¨Ôïäb_©Õïäb`©Õïäa_ªÖîäb`©µÄܤ¶ª— ÓÞþª—ŸÔßþ«˜ ×áþ®˜ Üåþ±š âéþ³› çíþ±š äëþ°šŸàèþ®™ŸÞçþ®™ŸÝåþ­˜ Ûãþ«—Ÿ×áþª˜ŸÖàþ­˜ŸÛäþ°™Ÿáéþ´› çíÿµœ ìðÿ¶œ ìñÿ¶œ íòÿ·� îòÿ·� ïóÿ·œ îòÿ·� îóÿ¶��îòÿ²:2íòÿ³5,íñÿ²4,íñÿ³5,ìñÿ²4+ìðÿ³5,ìñÿ²4,ìñÿ³4,ìñÿ´hfìñÿ¶œŸìñÿµ› êïÿ´›Ÿèîþ³› æìþ±š âéþ°š àèþ¯š ßçþ¯™ Þçþ¯™ Þæþ®™ Üæþ­™ŸÛäþ¬˜ Úãþ­™ Úãþ®™ŸÛäþ®™ŸÜåþ¯™ŸÝæþ¯š Þæþ°™Ÿàçþ°š âéþ±š âêþ±š áéþ°™ ßçþ®™ŸÜåþ«˜ Øáþ«— Õßþª—ŸÔàþ¨–ŸÒÜþª€„ÏÛþ²@-ËØþ²B+ÈÕþ²B+ÅÓþ²C,ÂÒþ³D,ÀÏý³F,¼Ìý©lj¹Êý™‘Ÿ³Åý—� ®Âý•�Ÿª¿ý“ŽŸ¦¼þ’ŽŸ¥ºý‘ŽŸ¤ºý‘�Ÿ£¹ý�Œ  ·ý�ŒŸ ¶ý�ŒŸ�´ýŒ‹Ÿ›³ýŒ‹Ÿ™²ý‹‹Ÿ™±ý‡ŠŸ�ªü…‰ŸŽªü†‰ž�©ü‡ŠŸŽªü†‰ŸŽ©ü‡‰Ÿ�ªü‡ŠŸ‘¬üˆŠŸ‘«ü‡ŠŸ�¬üˆŠŸ’­üˆ‰ž“¬ü‰ŠŸ“­ü‰ŠŸ”®ýŠŠŸ”®ý‰Š ”­ýŠŠ •®ýˆŠŸ”®ý‰ŠŸ”®ü‰ŠŸ“¬üˆŠŸ‘¬üˆŠŸ‘¬üˆ‰ž�¬üˆŠŸ’«ü‡ŠŸ�«üˆŠŸ�¬ü‡‰Ÿ�ªü†‰ŸŽªü†‰Ÿ�¨ü†‰Ÿ�ªü†‰žŽªü…‰Ÿ�¨ü„ˆŸ‹§ü„‰Ÿ‹¨ü…ˆŸ‹¨ü…‰ŸŒ¨ü†‰ŸŽªü‡‰Ÿ�«üˆŠŸ’­ü‹‹ ˜±ýŒ‹Ÿ™±ý�‹Ÿš³ý�ŒŸ›´ýŽ�Ÿ�µý��Ÿ¡·ý‘� £¹ý‘ŽŸ¤»ý‘�Ÿ£»ý’ŽŸ¥»ý”ŽŸ¨¾ý•�Ÿ­Áý˜�Ÿ²Äýš‘Ÿ¶Æý›’Ÿ¸Éýœ’Ÿ¹Êý£• ÇÔþ‰žŸ‰Ž¿„—Ÿ„‹¿„—Ÿ„‹¿…˜Ÿ…‹¾…˜Ÿ…‹¿…˜Ÿ…‹¾…˜Ÿ…‹¿…˜Ÿ…‹¾„˜Ÿ„‹¿…˜ …‹¾…™Ÿ…Œ¿…™Ÿ…Œ¿†™Ÿ†Œ¿‡› ‡�¾‡›Ÿ‡�¿‡œŸ‡Ž¾ˆœŸˆ�¾‡�Ÿ‡Ž¾ˆ�Ÿˆ�¿ˆ�ŸˆŽ¾‡œŸ‡Ž¿‡œŸ‡Ž¿‡œŸ‡�¾‡œŸ‡�¾ˆœŸˆ�¿ˆ�Ÿˆ�¾ˆž ˆŽ¿‰ž ‰Ž¿‰ŸŸ‰Ž¿ŠŸŸŠ�¾Š  Š�¾‹¡Ÿ‹�¿‹  ‹�¿Š¡ŸŠ�¿‹¡Ÿ‹�¿‹¡Ÿ‹�¿‹¡¡‹�¾t¡ât¹¾q¡ïqÁ¿q¡îqÁ¿p ïpÀ¾o îoÀ¿oŸïoÀ¾zŸÄz§¾‰žŸ‰Ž¿‰žŸ‰Ž¿‰žŸ‰�¾ˆž ˆŽ¾‰� ‰Ž¿ˆ� ˆŽ¾ˆ�ŸˆŽ¿ªƒ]ªg“·r,·Mq·r,·Mr·r,·Lq¶q+¶Lq·r,·Lq·r+·Lq¬~N¬_‰ŠŸŸŠ�¿‡ ¦‡”¿u Øu´¿}Ÿ»}¡¿Š ŸŠ�¾ŠŸ Š�¾ŠŸ Š�¾ŠŸ Š�¾‰ŸŸ‰Ž¿‰ž ‰Ž¾‡ž¥‡’¿ˆž ˆ�¾„�¨„“¿k�èk¹¿h�ïh¼¾hœïhº¾hœïh»¿uœÄu¤¿‡œŸ‡�¾‡œ ‡�¿‡œ ‡�¾‡›Ÿ‡Ž¾‡›Ÿ‡Œ¿†šŸ†Œ¾…™Ÿ…Œ¾…˜Ÿ…Œ¿…˜ …Œ¾…˜ …‹¾…˜Ÿ…‹¿…˜Ÿ…‹¾„˜Ÿ„‹¾ƒ—Ÿƒ‹¾„—Ÿ„‹¾…—Ÿ…‹¿„—Ÿ„Š¿‚”Ÿ‚‰¾€’Ÿ€‰¾€’Ÿ€ˆ¾€‘Ÿ€‡½�Ÿ‡½€�Ÿ€‡¾€�Ÿ€‡¾€�ž€‡½¸{R¸gŒÈr,ÈYqÈq+ÈYqÈq+ÈXqÇq+ÇXqÆq+ÆXqÆq,ÆWpÄq+ÄVpÀs/ÀWsžŠ{žx¦„—Ÿ„‹¿„–Ÿ„о„–Ÿ„‹¿„—Ÿ„‹¿„–Ÿ„‹¾„–Ÿ„‹¾„—Ÿ„‹¾„—Ÿ„‹¿c˜ác®¾^—ï^´¾^˜ï^´¾_˜ð_´¿i˜Ñi¦¾ƒ— ƒ‹¿„—Ÿ„‹¾ƒ—Ÿƒ‹¿„—Ÿ„‹¿„—Ÿ„‹¿ƒ—ŸƒŠ¿„—Ÿ„о„—Ÿ„‹¾„—Ÿ„о…˜ …‹¿„˜Ÿ„‹¿k˜Ìk¤¿_˜ð_µ¿_˜ð_µ¿`™ð`¶¿c™ðc·¿i—èi´º¨zW¨d„»q*»Npºq*ºMq¹q)¹Mq¹r*¹Np¹r*¹Mp·q*·Lq¶r*¶Kp­O­`Š‹ �‹�½‹¡ ‹�¿Œ£ŸŒ‘¾�¥Ÿ�’¾›•z›y¦«q*«Bpªr*ªAp©q*©Ap¨q*¨Aq§r)§@p§r*§?p£s.£As•¥‘•ж“®Ÿ“—¿”® ”–¿”® ”–¿”¯Ÿ”—¿•¯ •—¿•¯ •˜¿•¯Ÿ•—¿•¯ •—¾•° •˜¿•° •˜¿–°Ÿ–˜¿•±Ÿ•™¿•°Ÿ•˜¿‘±Ú‘È¿�°ð�Ú¿‘°ñ‘Ú¿‘²ñ‘Û¿’±ñ’Û¿’²î’Û¿•³«•£¿—²Ÿ—š¿˜´Ÿ˜™¿˜´ ˜š¿š· š›¿š¶ š›¿š· šœÀ™·Ÿ™›¿˜´Ÿ˜›¿˜µŸ˜š¿˜´ ˜™¿—´ —™¿—³ —™¿—²Ÿ—™¿–² –™¿–±Ÿ–™¿•±Ÿ•˜¿•± •˜¿–° –˜¿–±Ÿ–˜¿–²Ÿ–™¿˜µ ˜›¿š·Ÿš›¿›¸ ›œÀœ¹Ÿœ›¿—”b—e—’q)’0p’q)’/p‘q)‘/q’r)’.p‘r)‘/p‘q)‘/p‘q)‘/p‘s*‘0r˜¡w˜w¥�» ��À�¼ �žÀ�»Ÿ�ž¿�¼ ��À�»Ÿ��À�» ��¿�¼ ��Àœ» œžÀœ» œ�À›º ›�Àœ¸ œœ¿›¹ ›�Àš·ŸšœÀ™·Ÿ™œÀ™¶Ÿ™›À™µŸ™›¿˜³ ˜š¿—²Ÿ—˜¿–±Ÿ–˜¿–°Ÿ–˜¿–² –˜¿—³ —š¿˜³Ÿ˜™¿™µ ™š¿˜´Ÿ˜š¿—´ —™¿š“gšh™œq(œ7oŸq)Ÿ8p¡q)¡9o¡q)¡:o£q)£'ÆÓþ²='ÇÔþ²;(É×þ²:'ÌÚþ±8'ÒÝþ²8'ÓÞþ­ppÒÝþ©—ŸÒÝþª— Ôßþª˜ŸÕàþ«˜ŸØâþ¬™ Ùãþ­™ Ûåþ®™ŸÝåþ¯šŸàèþ±š âéþ²šŸãêþ²š äëþ²›Ÿåìþ³Ÿ¥çãô³Ýéâjk´åóâYX³åóâZX´åòâZW´æóâZX´ÌÕ㌒³œ çëü³›Ÿæíþ²› åìþ²› åìþ±šŸäêþ±š ãêþ±›Ÿãêþ±šŸâéþ°šŸáéþ°š àèþ¯š ßçþ¯™Ÿßçþ®˜ Ýæþ®™ Ýåþ­™ŸÜåþ®˜ŸÜåþ¬˜ Úãþ¬˜ŸØáþ«˜ŸÖàþª— ÔÞþ©—ŸÓÞþ«˜ŸÖàþ­™ŸÜåþ°šŸáéþ³›Ÿçíþµ‘–ëðþ²:6îòÿ²-'ïóÿ²-'ðôÿ²,&ñõÿ±,&óöÿ±+&õøÿ²*'öùÿ²+'øùÿ²/,øúÿ¹}}øúÿ½Ÿ ùúÿ¼ŸŸùûÿ½ž úûÿ½Ÿ ùüÿ½ž úûÿ½ž ùûÿ¼Ÿ ùûÿ½ž ùûÿ½ž ùûÿ¼Ÿ øúÿ¼ž øúÿ»ž ÷ùÿ»ž öùÿ»žŸöøÿº� ô÷ÿ¹� òõÿ·œ ðóÿ·� îòÿ´œŸêïÿ²›Ÿåìþ¯™ ßçþ®™ Ûãþ¬˜ŸØâþ«˜ŸØáþ®‘—Úäþ±C8Üäþ±3&Þæþ±2&áéþ²2&âéþ±1&ãëþ±1'ãêþ±2'âéþ±SNàèþ®˜ Üåþ­˜ Úãþ­˜ŸÙâþª˜ Öàþ©— ÓÞþ©—ŸÔÞþª—ŸÓÞþ©—ŸÓÝþ©— ÒÝþ¨–ŸÐÜþ¨—ŸÐÜþ§— ÐÛþ§–ŸÏÜþ§— ÏÛþ§—ŸÏÜþ§– ÏÛþ¦– ÎÚþ¦– ÍÚþ¦•ŸÍØþ¥• Ê×þ¤• ÉÖþ£• ÇÕþ£•ŸÆÔþ¢”ŸÅÒþ¡” ÄÒþ¡” ÂÑþŸ“ŸÁÏþŸ“Ÿ¿ÏþŸ’Ÿ¿ÎþŸ”ŸÀÏþ “ŸÁÏþ ”ŸÀÐþ ”ŸÁÑþ¡” ÃÑþ¡”ŸÄÒþ¢”ŸÆÔþ£•ŸÆÔþ£•ŸÇÕþ£” ÇÕþ¤• ÉÖþ¥–ŸËØþ¥–ŸËØþ¥• ËØþ¦–ŸÌØþ¦–ŸÍÙþ¦•ŸÍÙþ¦– ÎÚþ¦•ŸÍÙþ¦• ÍÙÿ¦– ÍÚþ¦– ÍÙþ¦–ŸÎÚþ§– ÎÛÿ§–ŸÎÚþ¦–ŸÍÙþ¦– ÎÚþ§– ÏÚþ§– ÏÛþ¨—ŸÐÜþ¨— ÑÜþ¨– ÑÝþ©— ÒÝþ©—ŸÒÝþ©—ŸÓÞþ©— ÓÞþ©—ŸÓÞþ©— ÓÞþ­™ Ûäþ†šŸ†Œ¿�’Ÿ�ˆ¾�“Ÿ�ˆ¾�“Ÿ�‰¾‚”Ÿ‚о„–Ÿ„о„—Ÿ„‹¾„˜ „‹¿„˜Ÿ„‹¿„˜Ÿ„‹¾„—Ÿ„‹¾„—Ÿ„‹¾„—Ÿ„‹¾„— „‹¿„—Ÿ„‹¿…— …‹¾…— …Š¿„—Ÿ„‹¿„—Ÿ„‹¾…™Ÿ…Œ¾…™Ÿ…‹¿…™ …Œ¾†™Ÿ†Œ¿†šŸ†Œ¿‡š ‡�¾‡› ‡�¾‡œŸ‡�¾‡œ ‡�¾ˆœŸˆ�¿ˆœŸˆŽ¾‡œŸ‡�¿ˆœŸˆŽ¿‡œŸ‡�¾‡›Ÿ‡�¾‡œŸ‡�¾‡›Ÿ‡�¿wœÁw¢¾hœòh¿¿iœòi¿¾j�ój¿¾hœòh¿¾hœòh¾¾wœÀw¡¾‡› ‡�¾‡›Ÿ‡�¿†šŸ†Œ¿†™Ÿ†‹¿†™ †Œ¿…™Ÿ…Œ¿†˜ †Œ¾…˜Ÿ…‹¿©‚b©j•¾n%¾Mn¾n%¾Mn¾n%¾Nn¾n&¾Mn¿n%¿Mm¿n%¿Nn¹t9¹Vzƒ–ŸƒŠ¾ƒ•Ÿƒ‰¾‚”Ÿ‚‰¾‚”Ÿ‚‰¾‚”Ÿ‚‰¾‚“Ÿ‚‰¾‚”ž‚‰¾�”Ÿ�‰¾�“Ÿ�‰¾‚“Ÿ‚‰¾�”Ÿ�‰¾”£‹¾\•ë\°¾\•ó\µ¿]—ó]¶¿^–ï^´¾x–±x•¾„—Ÿ„‹¾…—Ÿ…‹¾…˜ …‹¾„˜ „‹¾…—Ÿ…‹¾…˜Ÿ…‹¿„—Ÿ„‹¾„—Ÿ„‹¾„—Ÿ„‹¾„— „‹¾„—Ÿ„‹¾„–Ÿ„о„—Ÿ„‹¾ƒ–Ÿƒ‹¿‚”Ÿ‚‰¾�“Ÿ�ˆ¾€’Ÿ€ˆ¾€‘Ÿ€ˆ¾€�Ÿ€ˆ¾�Ÿ‡¾�Ÿ‡¾�Ÿ‡¾‘Ÿ‡¾�Ÿ‡¾�Ÿ‡¾�Ÿ‡¾�Ÿ‡¾©€l©pœÈm%ÈTmÈm%ÈSlÇn%ÇSmÆn%ÆSlÅn%ÅQmÅn%ÅQmÄn%ÄQlÃn%ÃOmÀn(ÀOn¦„h¦mš…—�…н…—Ÿ…‹¿…˜Ÿ…‹¿„—Ÿ„‹¾„— „‹¿ƒ—£ƒ�¾`—ë`³¿^—ó^¶¿_—ó_·¾`—ì`µ¿€–¦€�¿„— „‹¿„˜Ÿ„‹¾„˜Ÿ„Œ¾…˜ …‹¾…˜Ÿ…‹¾…™Ÿ…Œ¾…˜Ÿ…‹¿„™Ÿ„‹¿…™Ÿ…Œ¿…™Ÿ…Œ¾†š †�¿k›Ük±¿iœôi¿¿iœôi¿¿p™ép¹¸�{ž�Œ…©nD©\m¸n$¸Hm·n%·Gmµn$µEm²m$²Cm°n$°Am­n%­?m¬n%¬?m£‚S£\‹�§ž�’¾�¨Ÿ�”¿�¨ �“¿�© �”¿‘©Ÿ‘”¿’¥˜’�º¦s0¦Bt¦n$¦;l¦n$¦:l¥m$¥9m¤n$¤9m¤n$¤8l£n$£7l¡t1¡@u—£‹—†²“®Ÿ“—¿”® ”—¿“® “—¿”®Ÿ”—¿”® ”—¿”¯Ÿ”—¿•¯ •˜¿–± –˜¿—³ —™¿™¶Ÿ™š¿™¶Ÿ™›¿š·­š¨¿›¶ó›å¿™µõ™ä¿—´õ—ã¿–³ô–â¿–³ô–á¿–²µ–«¿–± –˜¿–±Ÿ–˜¿–± –˜¿–°Ÿ–˜¿•±Ÿ•—¿•°Ÿ•˜¿•°Ÿ•—¿•°Ÿ•—¿•¯ •—¿•°Ÿ•—¿•° •˜¿”¯ ”—¿•¯Ÿ•—¿”¯Ÿ”˜¿–° –—¿•°Ÿ•˜¿–±Ÿ–˜¿—²Ÿ—˜¿—³ —™¿˜´ ˜š¿˜µ ˜š¿š¶Ÿš›¿™¸ ™œ¿›¸ ›œ¿›¹ ›œ¿œº œœ¿—¢y—y¦’n%’+n‘n#‘*m�m$�*l�n$�)m�m#�(lŽn$Ž(l�n#�'l�n#�(m�r)�-p˜¥y˜z¦ž¾ žŸÀž½ žŸÀž½ žŸÀŸ½ Ÿž¿Ÿ¾ ŸŸ¿ž¾ŸžŸÀž¾ žŸÀž¾ŸžŸ¿Ÿ¾ ŸŸ¿Ÿ¾ ŸŸÀŸ¾ ŸŸ¿Ÿ¾ ŸŸÀŸ¾ ŸŸÀž¾ žŸ¿Ÿ¾ ŸŸ¿Ÿ¾ŸŸŸ¿ž¾ŸžžÀž½ žžÀœ» œžÀœ¹Ÿœ�Àœ¹ œ�Àš¸ šœÀ™¶Ÿ™›¿›ŠW›\� m# 5lŸm$Ÿ4l�m#�3l›m#›1l›m#›1lšm#š/l˜m#˜/l˜—l˜m�™·Ÿ™›¿™¶ ™›¿™¶Ÿ™›¿™¶ ™›¿˜¶Ÿ˜›¿˜µŸ˜›¿˜µ ˜š¿˜µŸ˜›¿˜´Ÿ˜š¿˜µŸ˜š¿˜µ ˜š¿˜´Ÿ˜š¿—´Ÿ—™¿—³ —™¿–³Ÿ–™¿–²Ÿ–™¿–±Ÿ–˜¿•±Ÿ•˜¿–± –˜¿•° •˜¿”¯Ÿ”—¿”¯ ”—¿•¯Ÿ•—¿”®Ÿ”–¿“®Ÿ“–¿”®Ÿ”—¿•¯ •—¿•¯ •—¿“¯ “—¿”¯ ”—¿”® ”—¿”®Ÿ”—¿”® ”—¿”®Ÿ”—¿“®Ÿ“—¿”¯Ÿ”—¿•¯ •—¿•°Ÿ•˜¿–²Ÿ–˜¿—³ —™¿˜´ ˜š¿™µ ™š¿˜µ ˜š¿˜´ ˜š¿˜µŸ˜š¿—³ —™¿—²Ÿ—™¿–±Ÿ–˜¿–± –˜¿–²Ÿ–™¿—³Ÿ—™¿˜´ ˜š¿˜´Ÿ˜š¿™¶Ÿ™›¿™¶Ÿ™›¿˜´Ÿ˜š¿–² –™¿–°Ÿ–—¾•¯Ÿ•—¿”¯Ÿ”—¿•¯ •—¿•¯ •˜¿”¯Ÿ”—¿”® ”–¿”¯ ”—¿”®Ÿ”—¿”® ”–¿–± –™¿Ž�Ÿžµý„ˆŸ‰§ü„ˆŸ‹§ü…ˆž�¨ü†‰Ÿ�«ü‰ŠŸ”­üŠŠ —¯ý‹ŒŸ˜²ý‹‹Ÿ˜±ý‹ŒŸ˜²ý‹‹Ÿ—°ýŠŠŸ—¯ýŠ‹Ÿ–¯ý‹‹Ÿ—¯ýŠ‹Ÿ˜°ýŠ‹Ÿ˜±ý‹ŠŸ˜¯ý‹‹Ÿ—°ý‹‹Ÿ˜±ý‹‹ š³ýŒŒŸš³ýŒŒŸš²ý�ŒŸ�´ýŽŒŸ�¶ýŽ� Ÿ·ý�ŒŸ ·ý�Ž ¤¹ý‘�Ÿ¤ºý’ŽŸ¥ºý‘� ¤ºý‘ŽŸ£¹ý�� ¢ºý��Ÿ¢¹ý��Ÿ¡¸ý��Ÿ¡¹ý�� ¡¸ý‘£ÀÅ�º‘¾óâXW’¿òâWW‘¿óâXW‘¿óâXW‘¾óâXW�¡À‘¼�ŒŸ¢·ý��Ÿ ·ýŽŒŸŸµý�ŒŸ�´ý�‹Ÿœ´ý�Œ š³ý�ŒŸ›²ýŒ‹ ™²ý£ja™²ý²M%™²ý±M&˜±ý±M&˜°ý±M&—°ý±M%˜±ý±N%•¯ý­V9–®ý‰ŠŸ“­ý‡ŠŸ‘«ü‡‰Ÿ�«ü†‰Ÿ�©ü†‰ŸŽªü†‰Ÿ�¨ü…ˆŸ�¨ü…‰ž�¨ü…‰Ÿ�¨ü†‰ŸŽ¨ü†‰Ÿ�¨ü†‹£”¤ô‡±ëÞ^eˆµòâWU‰¶óâWV‰µðàZ[Š–±®™Ø‹‹Ÿ—°ýŠ‹ —±ý‹‹Ÿ˜±ý‹‹Ÿ—°ý‹‹Ÿ˜²ýŒ‹Ÿ™±ý‹‹Ÿ—±ý‹‹Ÿ—°ýŠŠŸ—°ýŠŠ —¯ý‹‹Ÿ—°ý‹‹Ÿ–¯ý‰ŠŸ•¯ý‰‹Ÿ”­ý‡‰ŸŽªü„ˆŸ‹§ü„ˆŸ‰¦üƒˆŸ‡¥ü‚‡Ÿ†£ü�‡Ÿ„¡ü�‡Ÿƒ¡ü�‡Ÿ„¡ü�‡Ÿ…¢ü�‡Ÿ„¡ü�‡Ÿ…¡ü�‡Ÿ„¢ü€‡Ÿ„¢üœol„¡ü±S%„£ü²S%…£ü²S%‡£ü²S%‡¤ü±R%‰¦ü±R%‹¦ü±P%�¨ü±O%�ªü°P'“¬ü ni•°ý‹Š�˜²þ‹‹Ÿ˜±ý‹‹Ÿ™²ýŠ‹Ÿ—±ýŠŠŸ–°ýŠ�£šªôгëÞ]f‰¶óâWVŠ·óâUUеìÞ\c‹Ž§ ¨îŠ‹Ÿ–°ýŠ‹ ˜°ý‹‹ ˜±ýŒ‹Ÿ˜±ýŒŒŸ™²ý‹ŒŸ™²ýŒŒŸš²ýŒŒ š²ýŒŒŸš³þ�ŒŸœµý�� Ÿ´û�²ÜÖnƒ‘¿óáVU‘¿óáUT•ºéáVTª�žáVU²\DÃ�½±I%¢¸ý±G%¥»ý±E%ª¿ý±C$¯Âý±A$´Çý±?$¹Êý±?$»Ìý­\SÀÏþ¡“žÂÐþ¡“ŸÃÑþ¡”ŸÃÒþ¡”ŸÄÒþ¡” ÄÓþ£�˜ÅÓþ°B0ÇÔþ²:$ÆÔþ±:$ÇÕþ±:$ÉÖþ±9$Ê×þ±9$ÍØþ±8$ÎÛþ±@0ÏÛþ©†‹ÏÜþ§–ŸÐÜþ¨—ŸÐÜþ¨—ŸÒÞþ©— ÓÞþ©– ÒÞþª—ŸÓÞþ«˜ŸÖàþ¬˜ Ùãþ¯™Ÿßçþ²šŸåëþ´›Ÿèîþ´¨­èÖä³åóáXV±äôâUT¯ãõáUT¯âõáUS¯áôáWU®«´Ý¿Ô­˜ Úãþ­˜ Ùâþ«˜ Øâþ¬— Øáþ«˜ŸØáþ«˜ŸØáþ«˜ŸÖàþ«˜ ×àþ«˜ Öàþ«˜ŸÖàþ«— Öàþ«—ŸÕßþ«— Õßþª—ŸÕßþ«˜ Øáþ¬˜ŸØâþ¬˜ Ùâþ®˜ŸÝäþ¯™ Þçþ°š àèþ±š ãêÿ³› çíþ´› éðÿ¶œŸìñÿ·œ íòÿ·œ ïóÿ¶yyðóÿ±+%ðôÿ±*$ñõÿ±*$óöÿ±)$ô÷ÿ²)$öùÿ±)#÷ùÿ²'$÷ûÿ±(#øúÿ±-)øúÿ¸yyùûÿ½Ÿ ùûÿ½žŸúûÿ½ŸŸúûÿ½ŸŸúûÿ½Ÿ ûüÿ½Ÿ úüÿ¾ŸŸûüÿ¾Ÿ ûüÿ¾ŸŸûüÿ½ŸŸûüÿ½Ÿ ûüÿ¾Ÿ ûüÿ½žŸúüÿ½ž úüÿ½Ÿ ûüÿ½Ÿ úüÿ½Ÿ ùûÿ»ž ÷ùÿ¹ž óöÿ¸œ ðóÿ·œŸîòÿµœŸêðÿ²šŸäëÿ°\WÚãþ±4#Ôßþ±4#Öàþ²2#Úäþ±0$Ýæþ²1$Þæþ±0#áéþ±/#ãêþ²llåìþ³› æíþ³› çíþ³› æìþ²› åìþ±š äìþ²š ãêþ±šŸäêþ±šŸãêþ°š âêþ±šŸãéþ±šŸáéþ±šŸáéþ°™Ÿàèþ®™ Þçþ¯™ Ýåþ­™ŸÚäþ¬˜ Ùâþ¬˜ŸØâþ¬˜ŸÙâþ«˜ŸÖàþª˜ Ôßþª—ŸÕßþ©—ŸÓÞþ¨–ŸÒÝþ¨— ÒÝþ¨—ŸÓßþ©— ÓÞþ©— Óßþ©—ŸÒÞþ©–ŸÓÝþ©— ÓÞþ¨—ŸÓÝþ¨— ÒÝþ©—ŸÒÞþ©– ÒÝþ©— Óßþª— Õàþ«˜ ×áþ¬˜ Ùãþ¯™ ßæþ±š âéþ²›Ÿæëþ±›Ÿãêþ°šŸáéþ±šŸâéþ¯šŸàèþ®™ŸÜåþ­˜ŸÛãþ­˜ŸÚãþ­™ŸÛäþ¯™ŸÞæþ°šŸàèþ±™ âéþ±š äëþ²š æëþ°šŸáéþ­™ŸÜåþ«˜ Øáþª—ŸÕßþª—ŸÔÞþ©— Ôàþª— Õßþª—ŸÓÞþ¨—ŸÑÝþ©— ÒÝþ¨—ŸÒÝþ©—ŸÒÝþ­˜ ÚãþŠžŸŠŽ¿…˜Ÿ…‹¿…˜Ÿ…Œ¿„˜Ÿ„‹¾„˜Ÿ„‹¾…˜ …‹¿„˜Ÿ„‹¾„˜Ÿ„‹¾…— …‹¿„—Ÿ„‹¾„—Ÿ„‹¾„˜Ÿ„‹¿„˜Ÿ„‹¿„—Ÿ„‹¿„˜Ÿ„‹¾„˜ „‹¿…˜Ÿ…‹¿…˜Ÿ…‹¾„˜Ÿ„‹¿„˜Ÿ„Œ¾…™ …‹¾„™Ÿ„‹¾…˜Ÿ…‹¿…™Ÿ…‹¿†™ †Œ¾†™Ÿ†Œ¿†šŸ†Œ¾†› †Œ¿†›Ÿ†Œ¿†›Ÿ†Œ¾‡šŸ‡Œ¿†›Ÿ†�¾†›Ÿ†�¿‡›Ÿ‡Œ¾†›Ÿ†�¿†š¡†�¾išÞi±¿dšôd¼¿c™ôc»¾cšôc¼¾a˜ôa»¾g˜Þg¯¿‚˜£‚Œ¾…˜Ÿ…‹¾„—Ÿ„‹¾„—Ÿ„‹¿„— „оƒ–ŸƒŠ¾ƒ– ƒŠ¿ƒ” ƒŠ¾ƒ•Ÿƒ‰¾§�h§mšÄl#ÄNkÄl#ÄNkÃl#ÃOlÄm#ÄOlÆl#ÆPkÇl$ÇPlÄo1ÄUu€��€†½�Ÿ‡¾�Ÿ‡¾~�Ÿ~‡¾~�Ÿ~†¾�Ÿ‡¾�Ÿ‡¾~�Ÿ~†¾�Ÿ‡¾�Ÿ‡¾�Ÿ‡¾i�ºi•¾P�ôP®½P�ôP®¾R�óR®¾h‘¾h—¾�Ÿ‡¾�Ÿ‡¾€‘Ÿ€‡¾€�Ÿ€‡¾€‘ž€ˆ¾€‘Ÿ€ˆ¾€‘Ÿ€ˆ¾€‘Ÿ€ˆ¾€‘Ÿ€ˆ¾€‘Ÿ€ˆ¾€‘Ÿ€ˆ¾€‘Ÿ€‡¾€�Ÿ€ˆ¾�Ÿ‡¾�Ÿˆ¾�Ÿ‡¾�Ÿ‡¾€�Ÿ€‡¾�Ÿ‡¾�Ÿ‡¾�Ÿ‡¾�Ÿ‡¾�Ÿ‡¾~�Ÿ~‡¾~�Ÿ~†¾~�Ÿ~†¾~�Ÿ~‡¾~�Ÿ~†¾‚�œ‚†¼¸vJ¸a†Æl"ÆQkÆl#ÆPkÅl#ÅOkÅl#ÅNkÃl"ÃNlÁl#ÁLk¿k#¿Jk¾k#¾Jl½k"½Jk²wH²\…Ž’�Ž‚´…—Ÿ…Š¿„— „‹¾„—Ÿ„Š¿€˜§€�¾b˜ïb¸¿a˜õa¼¾b™öb¼¿n™Ónª¿†š †Œ¿†›Ÿ†�¿‡› ‡�¾‡œŸ‡�¿ˆ› ˆ�¿ˆœŸˆ�¿ˆ� ˆ�¿ˆ� ˆ�¿ˆ�ŸˆŽ¿‰Ÿ ‰Ž¿‰ŸŸ‰�¿‰ ¢‰‘¿sŸès¾¾qžòqĽŽÑ­¦”q‡”€u™kv™wlªk*ªBk«l#«;kªl!ª:k©k!©:l¨l"¨9k§k"§8l¥l"¥7k£q-£?r•£�•Š´’¬ ’–¿’¬Ÿ’–¿’¬Ÿ’•¿“­ “–¿“®Ÿ“–¿”­ ”–¿œ…TœY� l" 3kŸl"Ÿ3k l" 3kŸl"Ÿ3l l" 3l l" 3kŸk"Ÿ3l q+ ;r—œ}—{§”®ž”—¾”® ”—¿”¯Ÿ”˜¿”¯Ÿ”—¿”¯ ”—¿”¯Ÿ”˜¿•°Ÿ•˜¿–± –˜¿—²Ÿ—™¿˜´Ÿ˜š¿™¶¼™´¿�·ö�é¿�·÷�é¿™µö™ç¿–³ö–ä¿–²ß–Ñ¿—³¡—›¿–³Ÿ–™¿–± –˜¿•°Ÿ•˜¿•° •—¿”¯Ÿ”—¿”¯Ÿ”—¿”¯ ”—¿•° •˜¿–°Ÿ–˜¿—²Ÿ—™¿—´Ÿ—š¿™µŸ™›¿™· ™›¿š·Ÿšœ¿š¸ šœÀ›¹ ›œ¿œ¸ œœ¿œ¹ œœÀ›º ›œÀ›º ›�Àœº œ�ÀœºŸœ�Àœº œœ¿œº œ�ÀœºŸœ�À›º ›�¿œºŸœœ¿”ŒX”Y�’l!’(l‘l!‘(l‘k!‘(k‘k!‘(k’l!’(k’k"’(k’k!’(k“k"“)k“m#“*m—˜i—k››¸››š½›¹Ÿ›œÀ›¹ ›œÀ›¹ ›œ¿›¹ ›�À›¸ ›œÀ›¸ ›œÀš¸ šœ¿›¹ ›œ¿š¹Ÿšœ¿š¸ šœÀš· š›¿™· ™›¿š· š›¿š·Ÿš›À™¶ ™›À˜µŸ˜š¿˜µ ˜š¿˜´Ÿ˜š¿—³Ÿ—™¿–±Ÿ–˜¿š˜tšt¢ k! 1j k! 1k k! 2kžk!ž1jžk!ž1k�k!�1k�k!�0k�o'�5o—¨�—е•±Ÿ•˜¿–²Ÿ–˜¿–±Ÿ–˜¿–² –™¿–± –˜¿–²Ÿ–™¿—² —™¿—² —˜¿–²Ÿ–˜¿—³ —™¿—³ —™¿˜³ ˜™¿˜´Ÿ˜š¿˜´ ˜š¿˜µ ˜š¿˜¶Ÿ˜›¿™¶ ™›¿˜µ ˜›¿™¶Ÿ™›¿™¶ ™›¿™µ ™š¿˜µŸ˜š¿˜µŸ˜š¿—´Ÿ—š¿˜³Ÿ˜™¿—³ —™¿—³ —™¿—²Ÿ—™¿—²Ÿ—™¿–±Ÿ–™¿–±Ÿ–™¿•± •˜¿–± –˜¿•° •˜¿•± •˜¿–² –™¿—³ —˜¿—´ —™¿˜´Ÿ˜š¿˜µŸ˜š¿™µŸ™š¿™¶ ™š¿˜µŸ˜š¿˜´ ˜š¿˜µŸ˜š¿˜´Ÿ˜š¿˜´Ÿ˜š¿—´Ÿ—š¿˜´ ˜š¿—³ —™¿—³ —™¿—²Ÿ—™¿–² –š¿—³ —˜¿–³Ÿ–™¿–±Ÿ–˜¿–° –˜¿”¯Ÿ”—¿”¯Ÿ”—¿”¯ ”˜¿”®Ÿ”—¿”¯Ÿ”—¿”®Ÿ”—¿”®Ÿ”—¿”®Ÿ”–¿”®Ÿ”–¿“® “—¾–° –˜¿•� ª¾þ‹‹Ÿ™±ýŒ‹Ÿ™±ý‹‹Ÿ˜±ý‹‹Ÿ˜±ý‹‹Ÿ™°ý‹‹ ™°ý‹ŠŸ˜°ý‹ŠŸ˜°ý‹‹Ÿ˜°ýŠ‹Ÿ—°ý‹‹Ÿ™°ýŠ‹Ÿ˜°ý‹‹Ÿ—°ýŠ‹Ÿ—°ý‹‹ ˜±ýŒ‹Ÿ˜±ýŒ‹ ˜±ý‹‹Ÿ˜±ý‹ŒŸ™²ýŒ‹Ÿ™²ýŒ‹Ÿš²ýŒ‹Ÿ™³ý�‹Ÿš²ýŒ‹Ÿ›´ýŽŒŸž´ýŽ�Ÿžµý�ŒŸ ·ýŽŒŸ ¶ý�ŒŸŸ·ý��ŸŸ¶ý��Ÿ ¸ý�ŒŸ ·ý��Ÿ¡·ý�ŒŸŸ¸ý�� ŸµûޱÞÖl€Ž¼ôáUS�¼ôáUR�¼ôáUSŒ»ôáUR‹¯ßÕi‹Œ¢œ­÷‹‹Ÿ˜±ý‹‹ —°ýŠ‹Ÿ—°ý‰ŠŸ”®ý‰ŠŸ”­ýˆŠŸ“­ýˆŠŸ’«ý‡‰Ÿ�ªüžmh�©ý±N#�©ü±N$�¨ü²O#Œ¨ü±O$‹§ü±P$ˆ¥ü²P#‡£ü¯U2†¤ü‚†�ƒ¡ü€‡žƒ¢ü�‡Ÿƒ¢ü€†Ÿƒ ü€‡Ÿƒ ü€†Ÿ‚¡ü€†Ÿ‚¡ü€†Ÿ‚¡ü€‡Ÿƒ ü€†Ÿ� ü€‡Ÿƒ ü€•º®…Å�®ôáTR�®ôáTR�­óàTS�—¾³ƒ¾‚‡Ÿ…¢ü�‡Ÿ…£ü‚‡Ÿ†£ü�‡Ÿ†£ü‚‡Ÿ‡¤ü‚‡Ÿ‡¤üƒˆŸˆ¥ü‚‡Ÿˆ¤üƒˆŸˆ¤ü‚ˆŸ†£ü‚‡Ÿ‡¤ü�‡Ÿ…¢ü‚‡Ÿ…¢ü‚‡Ÿ…¢ü�‡Ÿ…¢ü�ˆŸ†¢ü�†Ÿ…¢ü�‡Ÿ„¢ü�†Ÿ…¡ü€‡Ÿ„¡ü€†ž‚ ü€‡Ÿ‚¡ü†Ÿ‚ ü‡Ÿ� ü€†Ÿ‚ ü‡Ÿ‚ ü‡Ÿ‚¡ü‡Ÿ‚ ü‚†œ‚ ü§aK…¢ü°Q#…£ü±P#†£ü±O#‰¥ü±O"‰¦ü°M#�¨ü°L#�¬ü±K#”®ü°J#—°ý±J"—°ý©[H˜±ý‘ƒ�˜¯ý‹Š —°ýŠŠŸ—°ý‹‹ ˜°ý‹�§¡©í‹¸ïÞX]Œ»ôáRRŒ½õáRQŽªÒÎw–�ŒŸžµý��Ÿ ·ý��Ÿ¡¸ý��Ÿ¡¸ý��Ÿ¢¸ý’�Ÿ¤ºý‘ŽŸ¥»ý’ŽŸ¥¼ý’Ž ¦¼ý”ŽŸª¾ý•�Ÿ«¿ý•‘¢¯½ø–¾çÛcl–ÅòáRQ ­ÑáRP®€‡áRQ±xvàUV±B)¾¿î°<"¼Ìý±:"¾Îþ±:"ÀÐþ°9"ÂÑþ±8!ÅÓþ±7"ÇÕþ°?.ÉÖþ§‰‘Ë×þ¥• ËØþ¦– ÌÙþ¦–ŸÍÙþ§–ŸÎÛþ¨—ŸÑÜþ¨–ŸÐÜþ®YTÑÜþ±3"ÒÝþ±3"ÓÝþ±3"ÔÝþ±3"ÓÝþ±3"Óßþ±3!ÓÞþ±2"ÓÞþ°;+ÓÞþ¬z}ÓÞþª—ŸÓÞþ©—ŸÒÞþ©— ÔÞþ©— ÓÞþ©— ÓÞþª˜ Ôàþ¬˜ ×áþ­˜ŸÚãþ®™ŸÝåþ±šŸáéþ²µ¼ã¹Æ´éöáRQ³éöáRQ±çöáQP¯äöáRQ¯Ðßàx¯›¢Þâú®™ŸÜåþ­˜ŸÚãþ¬˜ŸØáþ«˜ Öàþª˜ Ôßþ©—ŸÓÞþ©—ŸÔÞþ«˜ŸÖàþ«˜ Øâþ®˜ŸÝåþ°š áèþ²š åëþ³› èîþµœŸêïþµ› ëðÿ¶œ íòÿ·œ îòÿ·œ îòÿ·œ ïóÿ¸�Ÿðôÿ¸œ ðôÿ¸� ðôÿ¸� ðôÿ¸� ðôÿ¸�Ÿðôÿ¸œ ðôÿ¸œŸðóÿ´ZWðóÿ°(!ïóÿ±(!ïôÿ±(!ïóÿ±("ðóÿ±(!ðóÿ±(!ðóÿ±(!ïóÿ±)!îòÿ±*#îòÿ´kiîòÿ¶šœîòÿ·œ îóÿ·œ îòÿ¶œŸîòÿ·�Ÿîóÿ·œ îòÿ·œ íñÿ¶œ ìñÿ·œ îñÿ¶œ ìñÿµœ êðÿ´œ éîÿ´› èîÿµ›Ÿéîÿ´› èîÿ´› çíÿ²› åëþ±›Ÿãëþ°™ áèþ®™ŸÝæþ¬˜ŸÚãþ¯tt×áþ°1!Ôßþ°1!ÓÞþ±2!ÓÞþ±1!Õßþ°1!Öàþ±0!×àþ°0!×áþ±5'Øáþ­Š�Ùâþ¬˜ŸÚâþ­™ Úãþ­™ Úãþ­™ŸÚäþ­˜ŸÛãþ®™ŸÛäþ­˜ Üäþ®™ŸÜåþ®™ŸÝåþ¯™ Þæþ°™ ßçþ¯™Ÿßçþ°š áèþ°›Ÿâêþ±›Ÿãëþ²š äëþ²› æìþ²›Ÿåìþ²šŸæíþ³›Ÿæíþ²šŸäëþ±š âêþ±šŸâéþ¯™ àèþ¯™ ßçþ¯™Ÿßæþ®™ŸÝåþ®™ Ýæþ®™ŸÜåþ­˜ Úãþ¬˜ŸÚãþ¬˜ Ùâþ¬˜ŸØâþ¬˜ Øâþ¬˜ŸÙãþ®™ŸÛäþ®™ Üåþ¯™ ßçþ°šŸáéþ±š ãêþ²›Ÿäëþ²›Ÿåëþ±šŸãêþ±šŸâéþ°šŸáéþ±šŸáéþ°šŸâèþ°š áèþ°™Ÿáèþ¯™ Þçþ®™ŸÞæþ®™ Þæþ®™ Þæþ®™ Þåþ­™ŸÜæþ­˜ŸÛäþ¬˜ŸØâþ«— Õßþ©— ÔÞþ©— ÔÞþ©— ÓÝþ©—ŸÓÝþ¨—ŸÓÝþ¨—ŸÑÝþ¨—ŸÑÜþ¨—ŸÑÜþ¨—ŸÑÜþ«— Øáþ‹£ ‹�¿‡œŸ‡�¾‡›Ÿ‡�¿†›Ÿ†�¾‡›Ÿ‡�¿†›Ÿ†�¿‡›Ÿ‡�¾†› †�¿‡šŸ‡Œ¿†›Ÿ†Œ¾†šŸ†Œ¾‡šŸ‡�¾‡› ‡�¾†› †�¾‡›Ÿ‡�¿‡›Ÿ‡Œ¾‡› ‡Œ¾‡›Ÿ‡Œ¿†šŸ†Œ¾…˜ …Œ¾…™ …Œ¾…™Ÿ…Œ¿…˜ …‹¾…˜ …Œ¿…™Ÿ…Œ¿…˜Ÿ…Œ¾…˜Ÿ…‹¿„˜Ÿ„‹¾…˜Ÿ…‹¾…˜Ÿ…‹¾…—Ÿ…‹¾„˜Ÿ„‹¿„— „‹¿„˜ „‹¿…—Ÿ…‹¿}—ª}�¾^—ò^¸¿]–ö]¸¾[•÷[·¿Z•õZ¶¾Y”òY´½u”°u“¾�’ž�ˆ¾€‘Ÿ€ˆ¾€‘Ÿ€ˆ¾€�Ÿ€‡¾�ž‡¾�Ÿ‡¾�Ÿ‡¾�Ÿ‡¾�Ÿ‡¾¤€p¤pŸÈj ÈPiÉk ÉPiÈj!ÈPiÉk ÉPiÉj!ÉPjÈk!ÈPjÅm+ÅSqƒ�˜ƒ„¹~�Ÿ~‡¾~�Ÿ~‡¾�Ÿ†¾�Ÿ†¾~ŽŸ~†¾ŽŸ‡¾�Ÿ‡¾~ŽŸ~†¾ŽŸ†¾�Ÿ‡¾Z�ØZ¤¾P�öP¯¾P�ôP®¾d�Ädš¾~� ~‡¾�Ÿ‡¾~�Ÿ~‡¾�Ÿ†¾~�Ÿ~‡½�Ÿ†¾�Ÿ‡¾~�Ÿ~‡¾~�Ÿ~‡¾ŽŸ†¾~�Ÿ~†½~Žž~‡¾�Ÿ‡¾ŽŸ†¾~�Ÿ~†¾~ŽŸ~†¾�Ÿ‡¾�Ÿ‡¾�Ÿ‡¾€�Ÿ€‡¾�Ÿ‡¾�Ÿ‡¾~�Ÿ~‡¾�Ÿ†¾�Ÿ†¾~�Ÿ~‡¾�Ÿ‡¾�Ÿ‡¾€‘Ÿ€ˆ¾€‘Ÿ€ˆ¾‹Ž“‹‚·¼q8¼VyÃj ÃLiÁj ÁJi¿k¿Ij¾j¾Hi½j ½Gj¾j ¾Gi½j ½Gi½k ½Gi¼j¼Fi¹l'¹In¢ƒi¢k›‹––‹‡¹†šŸ†�¾‚›«‚“¿h›ôhÀ¾iœ÷i¿j�÷jľ~žµ~�¿‰žŸ‰�¿Š ŸŠ�¾ŠŸŸŠ�¾‹¡Ÿ‹�¾�¤ �’¿Ž¥ŸŽ’¿�¨ �“¿�§ �“¿�¨Ÿ�”¿‘ªŸ‘”¿‘©Ÿ‘”¿’¦š’�¸Ž’ÅŽ¯ •w–•Œ}™jw™xi™jw™xj›kT›\i¡k¡2j¡j¡1j j 1i j 0jžjž/jžjž.i�j �0jš›wšw¤—² —™¿—³ —™¿—³Ÿ—š¿—³ —™¿—²Ÿ—š¿—³Ÿ—™¿—² —™¿™¢�™«šj š-jšjš,i›j›-i›j›-jœjœ.i�j�.j�j�.i�j�.i�j �/i™Žc™e—–®›–”¼•±Ÿ•˜¿–±Ÿ–˜¿–² –™¿˜´ ˜™¿˜´Ÿ˜™¿˜µŸ˜š¿™¶ ™›¿š· šœ¿œ·ÎœÆ¿�·ø�꿚µøšé¿˜´ø˜è¿—´ø—ç¿—³¹—¯¿—³ —™¿—²Ÿ—™¿–² –˜¿–± –˜¿•°Ÿ•—¿•°Ÿ•—¿•°Ÿ•—¿–±Ÿ–˜¿—´Ÿ—™¿˜±—˜’¹–�t–s¢”ŠT”VŽ”…M”Nˆ•”c•d—š³’š‘¶ž¼ ž�¿ž½ žŸÀž¾ŸžŸ¿ž½ŸžŸÀŸ¾ŸŸŸ¿Ÿ½ ŸŸ¿ž½ žŸÀž½ žŸÀž½ žŸ¿ž½ žž¿ž½ žž¿ž¼Ÿžž¿�»Ÿ�ž¿œ·™œ—»”~?”C~�j�%j’j’%i’k’&i“j“&i•j•(i–j–*i—j—*i˜j˜+i™j™+j›ƒL›Rˆ˜©�˜‹µ•°Ÿ•˜¿–° –˜¿•¯Ÿ•—¿•°Ÿ•˜¿–°Ÿ–—¿•° •—¿–±Ÿ–™¿–±Ÿ–™¿—± —˜¿—²Ÿ—™¿–³Ÿ–™¿—³Ÿ—™¿—³ —™¿—³Ÿ—™¿—² —™¿—²Ÿ—™¿—²Ÿ—˜¿–± –™¿–¤‰–…°œm&œ3n�j�.ižiž/iŸjŸ/ižjž/i�j�.iœjœ-h›j›,i™ŠX™[�–± –™¿–±Ÿ–˜¿–±Ÿ–˜¿–° –˜¿•°Ÿ•—¿•¯Ÿ•—¿•¯ •—¿•¯ •—¿•¯ •˜¿•°Ÿ•˜¿•° •˜¿•°Ÿ•˜¿–° –—¿–±Ÿ–˜¿–± –˜¿–±Ÿ–™¿•± •™¿–² –™¿–± –˜¿—²Ÿ—™¿—³Ÿ—™¿—³ —™¿˜´Ÿ˜š¿˜µ ˜š¿˜´Ÿ˜™¿™µŸ™š¿™µ ™š¿™¶Ÿ™›¿™¶Ÿ™›¿š·Ÿš›¿š·Ÿš›Àš· š›¿š·ŸšœÀš¶ š›¿™¶ ™›¿™µ ™š¿˜´Ÿ˜š¿—³Ÿ—™¿–² –˜¿•±Ÿ•˜¾•°Ÿ•—¿•¯ •—¿•¯Ÿ•—¿”¯ ”—¿”¯Ÿ”—¿”®Ÿ”—¿“®Ÿ“–¿“®Ÿ“–¿“® “—¿“­Ÿ“–¿’¬ ’–¿‘«Ÿ‘–¿’«Ÿ’–¿’«Ÿ’•¿’ª ’•¿‘ª ‘•¿‘« ‘•¿’« ’•¿‘ª ‘•¿‘ª ‘”¿�ª �”¿�ªŸ�”¿�©Ÿ�”¿�¨Ÿ�”¿�©Ÿ�”¿�¨ �“¿�¨Ÿ�“¿Ž¦ŸŽ“¿‘ª ‘•¿š�Ÿ´Æþ‘� ¤¹ý‘� ¢¸ý��Ÿ¡¹ý��  ·ý��Ÿ ¶ý��Ÿ ·ý��Ÿ¡·ý�ŒŸŸ¶ý��  ¶ýŽ�Ÿ ¶ý��  ·ý�ŒŸ ·ý�ŒŸŸ¸ý��Ÿ¡·ý��Ÿ¡·ý�Œ ¡·ý�ŒŸŸ·ý�ŒŸ�´ýŒ‹ š²ýŒŒŸš³ýŒŒŸš³ýŒ‹Ÿ™²ýŒŒŸ™³ýŒŒŸš²ýŒ‹Ÿ™³ýŒ‹Ÿš²ý‹‹Ÿ˜²ý‹‹Ÿ˜±ý‹‹Ÿ˜²ý‹‹ ˜°ý‹‹Ÿ—±ýŠ‹Ÿ—°ý‹‹Ÿ—°ýŠ‹Ÿ—°ýŠ‘«¦£ç‰¸óàTV‰¹öáQO‡¸öáQO‡¶õáQO†´òÞTW…“°¤”Ú„ˆŸŠ¦ü‚ˆŸ‡¤ü‚ˆŸ‡¤ü�‡Ÿ…¢ü€‡Ÿ„¢ü€‡žƒ ü‡Ÿ‚Ÿü‡Ÿ� ü€†Ÿ‚ ü˜qp‚ ü°P � ü±P �Ÿü±P!‚¡ü±P ‚ ü±P!‚¡ü±P!‚¡ü¯S+ƒ üƒ„˜ƒ¡ü€‡Ÿƒ ü€‡Ÿ‚ ü€‡Ÿ‚¡ü€‡Ÿƒ¡ü€†Ÿ�Ÿü‡Ÿ‚ ü€†Ÿƒ ü€‡ž� ü€†Ÿ‚ ü‡Ÿ‚Ÿü€£ÙÌgˆ€¯öàPN€®õàQQ€šÄ¸{³€‡ „Ÿú€‡Ÿƒ¡ü€†Ÿ‚ ü€‡Ÿ‚ ü€†Ÿ‚Ÿü€†Ÿ�Ÿü€†ž�Ÿü‡Ÿ�Ÿü€†Ÿ‚ ü€‡Ÿ�Ÿü‡Ÿ�Ÿü€†Ÿ� ü‡Ÿ‚Ÿü€†Ÿ‚ ü€†Ÿ�Ÿü€†Ÿ�Ÿü€†Ÿ‚ ü�‡Ÿƒ ü�‡Ÿƒ¡ü�‡Ÿ„¢ü€‡Ÿƒ¢ü�†Ÿƒ ü€‡Ÿƒ¡ü€‡Ÿ‚¡ü€‡Ÿ‚ ü€†Ÿ‚ ü�‡Ÿ„¡ü�‡Ÿ„¡ü�‡Ÿ…¢ü‚ˆŸˆ¤üŠ‚”‰¥ü¬W9‹¦ü±K�¨ü±J ’«ü±I•­ü±H—¯ý±G˜°ý±G—°ý±G ˜±ý±F ˜±ý±Gš²ý¯I&š³ý jiœ´ý‘†–�µýŽŒŸŸ¶ý�“«¬©ç�ÀôßSS‘Â÷àPM’Ä÷àNN“œµ½ Ñ”ŽŸª¾ý•�Ÿ­Àý–� ®Áý˜�Ÿ±Äý›‘Ÿ·Éý�’Ÿ»ËýŸ” ¿Ïþ “ ÁÑþ¡“ŸÃÒþ¢”ŸÅÔþ¤”žÉÕþ¥�šÌÑö©¯ÅàXY¯Œ•àOM±xwàOM±xwàOM±\S܇•±2ÑÛþ±1ÒÝþ±1ÒÝþ±0ÓÞþ±/Öáþ°.Öáþ°/ Øâþ¯wvÚãþ®™ Üåþ¯š Þæþ¯™ŸÞæþ¯™ Þæþ¯šŸÞæþ¯™ ßæþ¯™ŸÞæþ°€�Þæþ°- Þæþ±-Þæþ±-Üåþ°-Ýåþ±.Úãþ°-Ùäþ±.Øâþ±.Ùâþ°/ Øâþ®ecØáþ«”›Øâþ¬˜ŸÙâþ­˜ Ûãþ®™ŸÜåþ¯™ Þçþ°šŸáèþ±›Ÿãêþ³› æìþ´›Ÿèîþ´ÅÎãš¡³ëøáNM±èùàNL°èøáNL¯æ÷àNM®°¸Þ»Ì®™ Ýæþ®™ Ýåþ­™ŸÜäþ¬™ Ùâþª˜ŸÖàþª—ŸÕßþ«˜ Öàþ¬˜ Ùâþ°š ßçþ±“—æìþ²ttêïÿ²WTîòÿ³OMïóÿ´ddñõÿ¸�’ô÷ÿºžŸöøÿ¼ŸŸøúÿ½Ÿ úûÿ½ŸŸúûÿ½ž úûÿ½ž úûÿ½Ÿ ùûÿ½ž ûûÿ¼ŸŸùûÿ¼ŸŸùúÿ¼ž øúÿ»Ÿ ÷ùÿ»ž õ÷ÿº–™ô÷ÿ³C>òõÿ±%ñôÿ±&ïóÿ±&îóÿ±&ìñÿ°(èîÿ°)æìþ±+ãêþ°*âéþ°+áèþ±SKÝåþ®‹�Úãþ«˜ŸØáþ¬˜Ÿ×áþ«— ×àþ«˜ ×àþ¬˜ ×áþ¬˜ Øáþ­˜ŸÙâþ¬˜ Úãþ®™ŸÜäþ®™ Üåþ¯™ŸÝæþ®šŸÝæþ¯™ŸÞæþ¯™ Ýçþ®™ŸÝåþ®™ŸÜåþ®™ŸÜæþ­™ Ûãþ®…‰Úãþ±4&Ùãþ±.Øáþ±/Öàþ±/Õßþ±.×àþ±.Øâþ±,Úãþ°,Üåþ¯[XÝåþ­˜ Ûäþ­™ Úãþ¬˜ŸÙâþ¬˜ŸØáþª—ŸÕàþª—ŸÔßþª˜ŸÕßþª— Öàþ«— Õßþª—ŸÕàþª—ŸÖàþ¬˜Ÿ×âþ«— Øâþ¬˜ŸÙâþ¬˜ Ùâþ¬˜ŸÙâþ­˜ Ùâþ­˜ Ûäþ­™ Ûäþ­˜ Ûåþ®™ŸÝæþ¯™ŸÞæþ°šŸáèþ±š âéþ²™ ãéþ±šŸãëþ±›Ÿäëþ²› åìþ²›Ÿçìþ³› èíþ´› èîÿ´› éîÿ´œ êîÿ´› èíþ²› æìþ±šŸãêþ¯š áèþ¯™ŸÞçþ®˜ Ûäþ¬˜ Ùâþ«˜ ×áþª—ŸÕàþ©—ŸÓÞþ©—ŸÓÞþ©—ŸÒÞþ¨–ŸÓÝþ¨—ŸÑÜþ§— ÐÜþ§–ŸÏÛþ¦–ŸÍÚþ¦–ŸÌÚþ¤•ŸÊ×þ¥•ŸÊ×þ¥•ŸÊ×þ¥” ÉÖþ£•ŸÉÖþ¤• ÉÖþ¤• ÊÖþ£” ÈÕþ£”ŸÇÔþ£•ŸÆÔþ£” ÆÔþ¢”ŸÆÓþ¢” ÅÒþ¡”ŸÄÒþ “ŸÂÒþŸ”ŸÀÐþž“ ¿Îþ£•ŸÈÖþŒ£ Œ‘¿ˆ�Ÿˆ�¾ˆ� ˆ�¿ˆ� ˆŽ¾ˆ�ŸˆŽ¾‡œŸ‡�¾‡œŸ‡Ž¾ˆœ ˆ�¿‡œŸ‡�¿‡œŸ‡�¿ˆœŸˆ�¿‡œŸ‡Ž¿‡œŸ‡�¾ˆœŸˆ�¾ˆœŸˆŽ¿ˆœŸˆŽ¿ˆ› ˆ�¾‡›Ÿ‡�¾†šŸ†Œ¿†™Ÿ†Œ¾…™Ÿ…‹¿„˜ „Œ¾…—Ÿ…‹¾…˜Ÿ…‹¿…˜Ÿ…‹¾…˜ …‹¿„—Ÿ„о„—Ÿ„‹¾…—Ÿ…‹¾„—Ÿ„‹¾ƒ”Ÿƒ‰¾‚”Ÿ‚‰¾�“Ÿ�ˆ¾�’Ÿ�ˆ¾�‘Ÿ�ˆ¾h�Àh™¾R�øR²¾R�øR±¾R�÷R²¾Q�øQ±¾d�Ådš¾�Ÿ‡¾�Ÿ‡¾�Ÿ‡¾�Ÿ†¾�Ÿ‡¾~ŽŸ~‡¾~ŽŸ~†¾~�Ÿ~‡¾~�Ÿ~†¾~ŽŸ~†¾ŸƒzŸt¦ÇiÇNhÈiÈMhÇiÇMhÈhÈMhÈhÈNhÇhÇNhÆk%ÆPmˆŠ“ˆ�¶�Ÿ†¾~ŽŸ~†¾~�Ÿ~†¾�Ÿ†¾�Ÿ‡¾~ŽŸ~†¾~�Ÿ~†¾~ŽŸ~‡¾�Ÿ‡¾x�§xоP�õP°½P�öP¯¾dŽÂd˜¾~� ~‡¾~�ž~†¾~�ž~‡¾ŽŸ†¾~�Ÿ~†¾�Ÿ†¾~�Ÿ~†¾~�Ÿ~†¾�Ÿ‡¾~�Ÿ~‡¾�Ÿ†½~�Ÿ~†¾�Ÿ‡¾�ž‡¾~�Ÿ~†¾�Ÿ†¾�Ÿ‡¾�ž‡¾�Ÿ‡¾�Ÿ‡¾€�ž€‡¾�Ÿ‡¾�Ÿ†¾�Ÿ‡¾�Ÿ‡¾�Ÿ‡½€‘Ÿ€ˆ¾€‘Ÿ€‡¾€‘Ÿ€ˆ¾�“Ÿ�‰¾‚•Ÿ‚‰¾„–Ÿ„о’�Š’°¸m0¸Ls¼h¼Dg»h»Dh»h»Cg¹i¹Ah¸h¸Ah¸h¸Ah·h·@h¶h¶?g´h´>h³h³§¼ý°<«Àý®C-¯Ãý¥dfµÆýžŒ›À´ã�ÏößMKŸÕùáLJ¡ÎíÞ^d£—¤ÉÐö¥•ŸÊØþ¦•ŸÌØþ§–ŸÐÛþ¨—ŸÑÝþª˜ŸÔßþ¬˜ŸÙãþ­˜ Üäþ®—�Ýåþ¯Ž’Þæþ¯txÞæþ®QOÞçþ¯4+ßÝó°vuàKJ°wvàKI°wvàKH°vvàJH°:0áÅÕ°(âéþ°(âéþ°'ãêþ°'ãëþ°'äìþ°'äëþ±__äëþ²šŸäëþ±šŸäìþ³›Ÿåëþ±šŸäëþ³š åëþ³šŸåìþ³› æíþ´›Ÿçíþµ™�éîÿ±JFéïÿ°%êïÿ°%éîÿ°%éîÿ°%æíþ°&æìþ°&äëþ°(âéþ°(áèþ°)àèþ°E@àèþ°…ˆáèþ±šŸäêþ²›Ÿäìþ³› æíþ´œŸèîþµœ éïÿµ› éîÿ³œ¡æêû±×ãárw±éúàJI®èúáJH¯çûàJH®Òáßs{®›¢Ýáù­˜ Ûãþ«˜ ×áþ«— Õßþ©— ÓÞþª— Ôßþ¬˜ Ùâþ¯™ŸÞçþ³“—åìþ³jiêïÿ±/*îòÿ°"ïóÿ°"ñõÿ°!ô÷ÿ° ÷ùÿ±0/ùûÿ»ŽŽúûÿ¾Ÿ ûüÿ½Ÿ ûüÿ½Ÿ úüÿ¾ŸŸûüÿ¾Ÿ ûüÿ½Ÿ úûÿ½Ÿ ûüÿ½ŸŸúüÿ½ž úûÿ½ž úûÿ½Ÿ ûüÿ¾Ÿ ûüÿ¾ŸŸûüÿ»��úüÿ²0.úûÿ°øúÿ°÷ùÿ°!öøÿ°!ô÷ÿ°!òöÿ°#ðõÿ°#íòÿ°$êïÿ±&äëþ¯0'ßçþ­jkÙâþª’™Õàþ«˜ Öàþ¬˜ Ùâþ­˜ Üåþ¯™ŸÞæþ¯™ Þçþ°š àèþ²› äëþ³› çíþ´›Ÿèíþ³›Ÿçíþ³› çíþ´› éîþ´› éíþ´›Ÿçíþ²šŸæìþ±�“ãêþ°@:áéþ°(àèþ±(àçþ°(ßçþ°(Þçþ±)Ýåþ±)Üåþ°*Ûäþ°2%Ûãþ­�‘Úãþ«˜ ×áþ«— Öàþª— Õßþª—ŸÔÞþ©— ÓÞþª—ŸÔàþ¬˜ŸÙáþ®˜ŸÜäþ¯™ Þçþ°™ ßçþ±š áéþ²›Ÿäêþ²›Ÿäëþ²šŸåëþ³›Ÿæìþ´›Ÿçíþ³› æìþ²šŸãêþ°™ áèþ¯™ŸÝåþ¬˜ŸØâþª—ŸÕàþª—ŸÕßþª—ŸÖàþ«˜ŸØâþ­˜ŸÜãþ®™ŸÝæþ®™ŸÝæþ¯™Ÿßçþ°šŸâèÿ²š åëþ´œ êïÿ´› èîþ±› åëþ±š âéþ®™ŸÝæþ¬˜ŸÙãþª˜ Õàþ©—ŸÔÞþ©— ÓÞþ©— ÒÝþ©—ŸÒÞþ©— Óßþ¨– ÏÛþ¥•ŸÊ×þ£• ÇÕþ¢” ÅÓþ¡” ÄÒþ¡”ŸÄÒþ “ŸÂÑþ ” ÀÐþž’ ½Íþž’ ¼Ìþ�’Ÿ»Ëýœ’ŸºËý›’Ÿ¸Éý™‘ŸµÇý™�Ÿ²Åý—�Ÿ±Ãý—�Ÿ¯Âý—�Ÿ¯Âý–�Ÿ­Âý•� «Àý”�Ÿ©¿ý”�Ÿ©¾ý“�Ÿ§¼ý’ŽŸ¥»ý‘ŽŸ¤»ý™� ³Åþ‹¡Ÿ‹�¿‡šŸ‡Œ¾†šŸ†Œ¿†šŸ†�¿‡š ‡�¾‡šŸ‡�¾†š †Œ¾‡šŸ‡Œ¾†šŸ†�¾†š †�¾†›Ÿ†�¾‡›Ÿ‡Œ¾‡›Ÿ‡�¿†› †�¾‡›Ÿ‡Œ¾‡›Ÿ‡Œ¾†œŸ†�¾‡›Ÿ‡Ž¾‡›Ÿ‡�¾†š †Œ¾…™Ÿ…Œ¿†™Ÿ†‹¾…™Ÿ…Œ¾…˜Ÿ…Œ¾„˜Ÿ„‹¾…™Ÿ…Œ¾…˜Ÿ…Œ¾„˜Ÿ„‹¿…˜ …‹¾ƒ–ŸƒŠ¾ƒ•ŸƒŠ¾‚” ‚‰¾‚” ‚Š¿‚• ‚Š¿�•¡�Š¿a”áa®¿Y“ûY¸¿Y“úY¸¾X”úX¹¾`“Ù`©¾“¢о‚“Ÿ‚ˆ¾‚“Ÿ‚ˆ¾�’Ÿ�ˆ¾�“Ÿ�‰¾�“Ÿ�ˆ¾�’Ÿ�ˆ¾�’Ÿ�ˆ¾€’Ÿ€ˆ¾�‘Ÿ�‰¾€’Ÿ€ˆ¾š‡�šwªÅgÅGfÄfÄHfÅfÅHfÄgÄGfÅfÅGfÄgÄHfÃhÃJiŒ‹ŽŒ~³€‘ž€‡¾€‘Ÿ€ˆ¾‘Ÿˆ¾�Ÿ‡¾�Ÿ‡¾�Ÿ‡¾~�Ÿ~†¾�Ÿ‡¾�Ÿ‡¾oŽ´o“»WŽîW®»l�¹l–¾‘Ÿˆ¾€‘Ÿ€‡¾�’Ÿ�ˆ¾€’Ÿ€‰¾�‘Ÿ�ˆ¾�’Ÿ�ˆ¾�’Ÿ�ˆ¾€’Ÿ€ˆ¾€’Ÿ€ˆ¾�’Ÿ�ˆ¾�’Ÿ�ˆ¾�’Ÿ�ˆ¾�“Ÿ�‰¾�“Ÿ�‰¾‚”Ÿ‚‰¿‚• ‚‰¿‚•Ÿ‚‰¾‚•Ÿ‚Š¿ƒ•ŸƒŠ¾ƒ•ŸƒŠ¾ƒ–Ÿƒ‹¾ƒ–ŸƒŠ¿ƒ–ŸƒŠ¿„–Ÿ„Š¿ƒ—ŸƒŠ¿ƒ–ŸƒŠ¿ƒ—ŸƒŠ¿ƒ–ŸƒŠ¾„—Ÿ„о…˜Ÿ…‹¿…˜Ÿ…‹¿…™Ÿ…Œ¿†™ †‹¿…š …Œ¿“‘Š“¯´n/´Is·f·=fµfµvšfš'e—f—%e“f“"e’f’!e�f� eŽfŽeŽgŽe’ˆM’O‰ž¼Ÿžž¿Ÿ½ ŸžÀž½ žŸÀž½ žŸÀž½ žŸÀŸ¾ŸŸŸ¿Ÿ¾ ŸŸ¿ž¾ŸžŸ¿Ÿ¾ ŸžÀž¾ŸžŸ¿Ÿ¾ŸŸŸÀž¾ŸžŸÀŸ¾ŸŸŸÀŸ¾ ŸŸÀš¯‰šˆ°�r+�-q‹f‹e‹f‹eŒfŒeŒfŒe�g�eŽfŽe�f�e‘f‘ e’f’ d”f”"e–r/–6t—‘j—h›–§�–е–¯ž–—¿–±Ÿ–˜¿–²Ÿ–˜¿—²Ÿ—˜¿—³Ÿ—™¿˜´Ÿ˜š¿˜´ ˜š¿˜µŸ˜š¿˜´Ÿ˜š¿˜µ ˜š¿˜´Ÿ˜š¾™­’™Ž¶™˜p™pŸ—t0—:u˜f˜%e˜f˜%d˜f˜%d˜f˜%e˜f˜$d™e™%e™f™&e˜e˜&e——p—oŸ–²Ÿ–™¿–± –™¿•±Ÿ•˜¿•¯Ÿ•—¿”¯ ”˜¿•¯Ÿ•—¿”¯ ”˜¿–± –˜¿—³ —™¿˜´Ÿ˜š¿™µ ™š¿™¶Ÿ™š¿š· š›¿›·Ÿ›œ¿›¸ ›œ¿š¸ šœÀš¸ šœÀ›¸ ›œ¿›¸ ›œÀš· š›¿™¶ ™›¿˜´ ˜š¿—³ —™¿•±Ÿ•˜¿•¯ •—¿”°Ÿ”˜¿•°Ÿ•—¿–²Ÿ–™¿—³ —™¿—³ —™¿—³Ÿ—š¿˜´Ÿ˜š¿˜µ ˜š¿™·Ÿ™š¿™¶ ™›¿˜µ ˜š¿˜µ ˜™¿—³Ÿ—™¿•²Ÿ•™¿•±Ÿ•˜¿”°Ÿ”˜¿”¯Ÿ”—¿”¯Ÿ”—¿”¯ ”—¿”® ”–¿“­Ÿ“–¿“¬ “–¿’« ’•¿‘ª ‘”¿�© �”¿�© �”¿�¨Ÿ�“¿�¦Ÿ�“¾�¥Ÿ�’¿Œ£ŸŒ‘¾‹¢Ÿ‹�¾ŠŸŸŠ�¾ˆžŸˆŽ¾ˆœŸˆ�¾‡œŸ‡�¿ˆœŸˆ�¾ˆœ ˆŽ¾‡œŸ‡�¾ˆœŸˆŽ¿ˆ›Ÿˆ�¾‡› ‡�¾†™Ÿ†Œ¿…˜Ÿ…Œ¾…˜Ÿ…‹¾ŠŸŸŠ�¿˜�Ÿ±Ãþ��  ¶ý�ŒŸŸ¶ý�ŒŸŸ¶ý��ŸŸ·ý�ŒŸŸ·ý�ŒŸŸ¶ýŽ�ŸŸ·ý�ŒŸ ¶ýŽ�Ÿ ¶ý�ŒŸ¡¸ý�ŒŸ ·ý�ŒŸ¡·ý�� ¡·ý��Ÿ¢·ý�ŒŸ¡·ý��Ÿ¡¸ý��Ÿ¡¸ý��Ÿ¡·ý�Œ Ÿ¶ý�ŒŸœ´ýŒŒŸš³ýŒŒ š³ýŒ‹ ™²ý‹‹ ™±ýŒ‹Ÿ™³ý‹Œ ™±ý‹‹Ÿ—°ýŠ‹Ÿ˜±ý‰‹Ÿ”®ý‡ŠŸ‘«ý†‰Ÿ�©ý†‰Ÿ�©ý‡‰Ÿ�ªý‡Š¡’§ú†®áÒ_z…¹ûßIG…¸ûßIG…¸ùßHG…¨ÙÏhˆ…‹¢‘¦÷…ˆŸ�¨ü…‰Ÿ‹§ü…ˆŸ‹§ü„‰ŸŒ§ü„‰ŸŒ¨ü…‰Ÿ‹¨ü„ˆŸŠ§üƒˆŸˆ¥üƒˆŸ‰¥üƒˆŸ‰¥ü”w�ˆ¥ü°G‰¦ü°H‰¤ü°Gˆ¥ü°H‰¦ü±G‰¥ü°Hˆ¥ü°Jˆ¤üŠއ¤ü‚ˆŸ‡£ü‚ˆŸ†¤ü�‡Ÿ…£ü€‡Ÿ„¡ü€‡Ÿƒ¡ü�‡Ÿƒ ü€‡Ÿ‚ ü€‡Ÿ„ ü�†Ÿ„¡ü‚“´«†Èƒ¯íÛOV�•¹¬‡Ç‚‡ ‡¢ûƒ‡Ÿˆ¥üƒˆŸˆ¦üƒˆž‰¦üƒˆžŠ¥üƒˆŸŠ¥üƒˆŸ‰¥ü„ˆŸ‰¥üƒˆŸ‰¥üƒˆŸ‰¥üƒˆŸ‰¦ü„ˆŸ‹§ü„ˆŸŒ¨ü…‰žŽ©ü†‰ŸŽ©ý‡‰ �«ý‡‰Ÿ�«ý‡‰Ÿ�«ýˆ‰Ÿ‘¬ü‰ŠŸ’­ü‰Šž“­ü‰ŠŸ”®ý‰Š ”­ý‰ŠŸ”­ý‰‹Ÿ•®ýˆŠ ”®ýŠŠŸ”®ýŠŠ •¯ýŠ‹Ÿ–°ý‹‹ ™±ý‹ŒŸ™±ý�ŒŸ›³ýŒŒŸ›³ý�ŒŸœ´ý—‰žµý­I.Ÿ¶ý°=¢¸ý°<¤ºý°<¥ºý°=¢¹ý¯<£¹ý°:¨½ý°7±Ãý°5·Éý¯2¾Íý°1ÂÐþ°0ÄÒþ°@-˺୑�ßGF«±ÄßHF« «Ú—ªªŠ‘ÒÝþ©�•ÓÝþ©’šÔÞþª‘˜ÔÞþ­�“Øâþ°‡ŠÞæþ²usäêþ°[Xâéþ°B;âéþ¯*áéþ°%áéþ¯%âèþ°/$áÕè°vußGE¯vußGE°vvßGE°fbßgk°(Þãú°&Þæþ¯&Ýæþ°&Þæþ°%àçþ°%ßèþ°VSßçþ®–œÞçþ®™ Þçþ¯šŸÞçþ¯šŸàçþ°™Ÿàéþ°š àèþ°™Ÿáèþ±š âéþ±šŸäëþ³› çíþ³‡‹éïÿ°,$êïÿ°"èîþ°#çíþ¯$åëþ°$ãëþ°%âéþ°&áèþ¯%áèþ°%áèþ°&âèþ°+àéþ±]Záèþ±‹�áéþ°šŸâéþ²š äêþ²š äëþ³› çíþ´£¨èßî´êöàQQ³ïüßFD³îüßFE²ëûßIH°®µãÂÓ°šŸáêþ¯šŸáèþ®™ Þæþ®˜ Üåþ¬˜ Úãþ¬™ Ùãþ¬—�Øáþ­xz×âþ°>2Øâþ°(Ûäþ°$áéþ°#èîþ°!íñÿ° ðóÿ°òöÿ°õùÿ´OM÷ùÿ¼žŸøúÿ¼žŸùúÿ½ŸŸùûÿ½žŸùûÿ½ŸŸúûÿ¼Ÿ úüÿ¾Ÿ ûüÿ¾Ÿ ûüÿ¾Ÿ ûüÿ½Ÿ ûüÿ¾Ÿ ûüÿ½ŸŸûüÿ¾Ÿ ûüÿ¾Ÿ ûüÿºˆ‰ûüÿ±-+ûûÿ¯úûÿ°ùûÿ°øúÿ°÷ùÿ°õøÿ¯óöÿ°ðôÿ° îòÿ¯ ìñÿ¯"çíþ¯60áéþ­iiÚãþ«‰�Öàþ¬—ž×àþ¬˜ŸÙâþ­˜ŸÚãþ­™ Üåþ°™Ÿßçþ°™Ÿáèþ±šŸâéþ±š âêþ±š âêþ±šŸãêþ²™Ÿäëþ²�‘ãêþ²qoâéþ°:0âèþ°$àèþ°$àèþ°%ßçþ°%ßçþ°%ßçþ¯&Þæþ°%Ýæþ¯%Þæþ¯ooÝåþ®™ŸÝåþ­˜ŸÚãþ«˜ ×áþ«˜ŸÖáþª˜ Ößþª—ŸÓÞþª—ŸÔßþ¬˜ŸÙâþ¯™ŸÞæþ±šŸâéþ²šŸäëþ³› æìþ´› éîþ´›Ÿêïþ¶œ ëðÿµœŸëðÿµœ ìñÿ¶œŸìñÿ¶œ ëðÿµ› éïþ´› çíþ±š âéþ®™ Þæþ¬˜ Úâþª— Õàþª—ŸÔßþ«—ŸÖàþ­˜ Úãþ®™ŸÜåþ®™Ÿßæþ¯š ßçþ°™ áèþ²›Ÿäëþ³› èíþ³› æìþ²š äëþ°šŸâéþ¯™ Þæþ­˜ŸÚäþ«˜ŸØâþª—ŸÕáþ©—ŸÔÞþ©— ÓÞþ©–ŸÒÝþ¨—ŸÑÝþ§– ÏÛþ¥•ŸÌØþ¥• É×þ¢•ŸÆÕþ¢” ÅÓþ¡”ŸÃÒþ ”ŸÂÐþž’ ½Íþ�’ŸºËýš‘Ÿ¶Èý˜‘Ÿ±Äý•�Ÿ¬Àý“ŽŸ§¼ý‘�Ÿ¤¹ý��Ÿ£¸ý‘ŽŸ¤ºý‘�Ÿ¥ºý‘�Ÿ¥ºý‘�Ÿ£¹ý‘Ž £¹ý�ŒŸ ¶ýŽŒŸœµýŒŒŸ›³ýŒ‹Ÿ›²ý•�Ÿ¬Àþ‰ŸŸ‰�¿„˜Ÿ„‹¿„˜Ÿ„‹¾„˜Ÿ„‹¿…—Ÿ…‹¿„˜Ÿ„‹¿…—Ÿ…Š¿…˜Ÿ…‹¾„˜Ÿ„‹¾„˜Ÿ„‹¿…˜Ÿ…Œ¾…˜Ÿ…‹¾…™ …Œ¿…™Ÿ…‹¾…™ …‹¾…˜Ÿ…‹¾…˜Ÿ…‹¾…˜Ÿ…‹¿…˜Ÿ…Œ¿…™ …Œ¿†šŸ†‹¾†™Ÿ†Œ¾‡›Ÿ‡�¾‡š ‡�¿‡šŸ‡�¾†›Ÿ†Œ¾‡œŸ‡�¾ˆœ ˆ�¿ˆœŸˆŽ¿‡�Ÿ‡�¿ˆœŸˆ�¾ˆ�ŸˆŽ¾ˆ� ˆŽ¾ˆ�Ÿˆ�¾��¯�™¿l�úlȾk�ükÉ¿k�ýkɾn�ên½¿„�§„’¿ˆ�ŸˆŽ¿ˆ�ŸˆŽ¿ˆ�ŸˆŽ¿ˆœ ˆ�¿ˆœŸˆŽ¾‡œ ‡�¿‡›Ÿ‡�¾‡›Ÿ‡�¿‡š ‡�¿†› †�¾†šŸ†Œ¿“�„“|­¸e¸=d¹e¹=d¹e¹=d¹e¹=d¸e¸=d¹e¹=d¸f¸>e’�Š’~±…˜Ÿ…‹¿„˜ „‹¿…—Ÿ…‹¾Œ‘“Œƒ¶–Œƒ–y«ŸƒnŸlž¨|^¨b’®sE®V‚µn8µMz£lV£`s¬k>¬RtªxUª\ŒŒ‘‘Œ�µ…˜ …Œ¿…™Ÿ…‹¿…™ …Œ¾†™Ÿ†Œ¾…™ …Œ¿†™Ÿ†Œ¾†šŸ†�¾†šŸ†Œ¿†šŸ†Œ¾†šŸ†Œ¾†›Ÿ†�¾†šŸ†Œ¿†› †�¿‡šŸ‡�¿‡›Ÿ‡�¿‡› ‡Œ¾‡œŸ‡�¿ˆœŸˆ�¾‡œŸ‡�¿‡œŸ‡�¿ˆœ ˆ�¿ˆ�Ÿˆ�¾ˆ�ŸˆŽ¾ˆ�ŸˆŽ¿ˆ�Ÿˆ�¾‰�Ÿ‰Ž¿‰žŸ‰Ž¿‰žŸ‰�¿‰žŸ‰�¾‰žŸ‰Ž¾‰žŸ‰�¿‰žŸ‰�¿‰žŸ‰Ž¾‰žŸ‰Ž¿’–Œ’ƒ²®p5®Kx´d´8cµeµ9dµeµ:c´e´9d³d³8d²d²6d°d°5c®d®4c¬e¬3dªdª1c¤e(¤=d™et™ud˜er˜sd£e#£7c£f£/g¢l%¢6m¡o+¡9r m( 7o i  /jŸdŸ)dždž'c�d�&d�d�&dœdœ%dœdœ&c›d›%dšd'š3c˜du˜ud™du™ud™du™uc˜d:˜Bc—d—#d˜d˜"d˜d˜"d˜d˜"c—e—#d–‡V–VŽ—±œ—–½—´ —™¿—´Ÿ—š¿—³ —š¿—´ —š¿—³ —™¿—³ —š¿—³Ÿ—™¿—²Ÿ—™¿–² –™¿—² —™¿–² –˜¿–šz–v¦œfœ)g›d›&dœdœ&d�d�%d�d�'c�e�'c�e�'d�d�'c�d�(cžež'cždž'd�j �/j›‡W›Z�—£Š—…°”¯ž”˜¾•° •˜¿”±´”ª¿“°þ“ç¿“°þ“è¿•²þ•é¿•²Ù•Ë¿—² —š¿–²Ÿ–™¿—² —™¿—³Ÿ—™¿˜µ ˜š¿™µŸ™›¿˜«Ž˜‹³–‚K–N‡–f–$e˜d˜"dšdš$d›d›%d›d›%dœdœ%dšeš%c™d™$d—d—!c–h–'gšµ�𙾛¸ ››¿›¹ ›œ¿œ¹ œœÀœºŸœœ¿›º ›�¿œº œ�¿œ»Ÿœ�À�» ��¿œ» œ�Àœ»Ÿœž¿�» �ž¿œ» œ�¿�» ��¿�» ��Àš­ˆš‡¯�p*�,qŽdŽdŽeŽdŽeŽdŽdŽdŽeŽd�e�c�d�c‘c‘d‘c‘c‘c‘c’c’c“i“&i”z@”B”�e”b˜•›x•t¥”¢„”~­•¥Š•…°•£Š•ƒ°”Ÿ�”}«—˜v—s£—’k—kœš†TšXŒ›w8›Bzœiœ-iœcœ%cœdœ%c›d›$c›c›$c›c›$c›c›%cœcœ$c›d›%c›d›%cš|DšJ‚•¯�•–½•¯ •—¾•° •—¿•° •˜¿•°Ÿ•˜¿•°Ÿ•˜¿•¯Ÿ•—¿”¯ ”—¿•¯Ÿ•˜¿•° •˜¿•° •˜¿•° •—¿•° •—¿•¯Ÿ•˜¿•°Ÿ•—¿•°Ÿ•˜¿•°Ÿ•˜¿–° –˜¿•±Ÿ•˜¿•°Ÿ•—¿•°Ÿ•˜¿•° •˜¿”° ”˜¿•¯ •—¾•¯Ÿ•—¿”¯ ”—¿”®Ÿ”—¿”¯Ÿ”—¿•¯Ÿ•—¿•¯ •˜¿–°Ÿ–—¿•°Ÿ•˜¿•±Ÿ•˜¿•±Ÿ•˜¿–± –™¿–² –™¿—³ —™¿˜´Ÿ˜™¿˜µŸ˜š¿™µŸ™š¿™¶ ™›¿˜µŸ˜›¿˜µŸ˜š¿—³Ÿ—™¿•° •˜¿•¯Ÿ•—¿•¯ •—¿”®Ÿ”–¿”¯ ”—¿”®Ÿ”—¿“¬Ÿ“–¿’«Ÿ’–¿‘ªŸ‘•¿�© �”¿�¨Ÿ�”¿�¨ �“¿�§Ÿ�“¿Ž¦ŸŽ’¿Ž¤ŸŽ’¿Œ£ŸŒ‘¿‹¡ ‹�¿‰ Ÿ‰�¾‰žŸ‰Ž¾ˆ�ŸˆŽ¿ˆ�ŸˆŽ¿ˆ� ˆ�¿ˆœŸˆ�¿‡œŸ‡�¿‡›Ÿ‡�¿‡›Ÿ‡�¿‹¡ ‹�¿”Ž ª¿þ‹ŠŸ—°ý‹‹Ÿ™°ýŠ‹Ÿ—°ýŒ‹Ÿ˜±ý‹‹Ÿ—°ýŠ‹Ÿ—±ýŠ‹ ˜°ý‹‹Ÿ™°ýŒ‹ ˜±ý‹‹Ÿ˜±ý‹‹Ÿ˜²ýŒ‹Ÿ™³ýŒ‹ š²ý‹‹Ÿ™²ýŒŒŸ™²ýŒ‹ š²ýŒŒŸ›²ýŒ‹Ÿš²ý�Œ ›µý�ŒŸœ´ýŽ� �¶ý�� ¡·ý��  ¸ý�Œ  ·ý�� ¡·ý��Ÿ¢¸ý�� £ºý‘ŽŸ¥»ý‘ŽŸ¤ºý‘�Ÿ¥ºý’� ¥»ý’� ¥¼ý’ŽŸ¦»ý’˜¯³§Þ’ÈúÞGG’ÊüßEC’ÉüßEC’½êÚ[g’’§­²î’ŽŸ¥ºý‘ŽŸ¥»ý’�Ÿ¤ºý’�Ÿ¥¹ý‘�Ÿ¤¹ý��Ÿ¡¸ý��Ÿ¢¹ý�ŒŸ ·ýŽ� Ÿ¶ý�ŒŸ ·ý�ŒŸ ¶ý—{…Ÿ¶ý°=Ÿµý°=žµý°=�µý°=�¶ý°=�µý¯=�µý°>œ´ý•‹›³ýŒŒ ™²ý‹‹Ÿ™²ýŒ‹Ÿ™±ý�‚’–±ý–y‚—°ý�ln—°ý¢b^–±ý¦VE–°ýªM7•¯ý¬aU½�°¬R>ªžß¤\T˜°ý‘‚�˜±ýŒ‹Ÿ™²ýŒ‹Ÿš²ý�ŒŸ›³ý�Œ œ´ýŽŒŸœ´ý�ŒŸžµþŽŒŸž¶ýŽŒŸžµý��ŸžµýŽŒŸžµýŽŒŸž·ý�Œ žµýŽŒŸž¶ýŽ�ŸŸ¶ý��Ÿ ¸ý��Ÿ¡¸ý‘�Ÿ£¸ý��Ÿ£¹ý‘�Ÿ£ºý‘�Ÿ£¹ý‘�Ÿ£¹ý‘� ¤ºý’ŽŸ¦¼ý“ŽŸ¦»ý“ŽŸ¦¼ý“Ž ¨½ý“ŽŸ¨½ý“ŽŸ¨½ý“Ž ¨½ý“�Ÿ©¾ý“ŽŸ©½ý”ŽŸ©¾ý“ŽŸ©½ý“ŽŸ¨½ý™ƒŒ§½þ¬K5§½ý°9§¼ý°9¦¼ý°:¦¼ý°8§¼ý°8ª¾ý°6­Áý°5°Ãý°3³Çý°2·Éý°2»Ëý°=(ȳڰuußDB°tsÞFF°6#ÊÁæ°/ÈÕþ¯6$Ê×þ¯9+ÍÛþ°7(ÎÚþ¯/ÏÛþ°)ÑÝþ°'ÔÞþ¯'Ôßþ°&Õàþ°&×áþ°%×áþ¯%Ùâþ°2'ÜÇݯuuÞCA°uuÞC@°uuÞCA°C:Þ§¶°"àçþ¯"àèþ°"àèþ°"àèþ¯#àèþ¯VUàèþ°–œàèÿ°šŸàèþ¯šŸáèþ°š ßçþ¯š ßçþ¯™Ÿßçþ¯™ Þæþ¯™ Þæþ¯™ŸÞæþ®™ Ýåþ®™ŸÜåþ­˜ŸÛäþ­vyÚãþ°)Øâþ¯%Øáþ¯%×áþ°%×áþ°&Öáþ°&Õàþ°&Öàþ°(Õßþ¯(Õßþ°'Ôßþ¯'Ôßþ°/!Õßþ®ZWÕàþ¬…‰Öàþ«˜ŸÖàþ«˜Ÿ×áþ¬«µÚ¼Ó¬çþßCA¬èþßCA­éþÞC@­ËÚÞŠ®™ Ýäý®™ Þåþ¯™ŸÞæþ¯š ßçþ°š âéþ²› äëþ±ŠŽåëþ°NKãêþ°$âéþ°"Þçþ°#Üåþ°%Ùâþ°&Ùâþ°%Øâþ¯%Úäþ°#Þåþ°!áéþ°&äìþ´š�èíÿµœ ëðÿ·œ îòÿ¸� ïóÿ·� ïóÿ¸�Ÿðôÿ¹žŸòõÿ¹� òöÿ¸� òöÿ¹� òöÿ¹� òöÿ¹� ôöÿ¹žŸóöÿºž ô÷ÿº�Ÿô÷ÿ¸‡ˆõ÷ÿ±-*õ÷ÿ°ô÷ÿ¯ô÷ÿ°ô÷ÿ°óöÿ°òõÿ°ñôÿ°ðôÿ°ïóÿ°îóÿ°íñÿ°ìñÿ°%êïÿ¯A@çìþ®beäëþ¯txâéþ­…ßçþ­„‹Ýæþ­ƒŠÜåþ¬}‚Ûãþ¬suÙâþ®jlØâþ®XTÙâþ¯A8Øáþ°,Øáþ°%×áþ°%Ùáþ°%Ùâþ°$Ùãþ°$Ùãþ°$Úâþ°%Øâþ°%Øáþ°%Øáþ¯JDØáþ«–œ×áþ«— ×àþ«— Öàþ«˜ŸÖàþ«— ×àþ«— Öàþ«— Ößþª—ŸÕßþª—ŸÕßþª—Ÿ×áþ«˜Ÿ×àþ«˜ŸØàþ«—ŸÖàþ«˜ŸÖáþ«—ŸÕàþ¬˜ ×áþ«˜ ×áþ¬˜ Øáþ¬˜ŸÙâþ¬˜ Øáþ«˜ ×áþ«— Öàþª˜ŸÕàþª— Õßþª— Õßþª— ÔÞþª—ŸÔÞþª— Ößþª— Õßþ«˜ Öàþ¬˜Ÿ×áþ«—Ÿ×âþ«˜ŸØâþ¬˜ Ùâþ­™ Úãþ­˜ŸÛäþ®™ Ýæþ°šŸàèþ±š âéþ²š äêþ²› åìþ²š äëþ°šŸáéþ®˜ Ýåþ«˜Ÿ×áþª˜ Õàþ©—ŸÔßþ©— ÓÝþ©— ÒÞþ©— ÒÞþ¦–ŸÏÚþ¤•ŸÊ×þ£•ŸÇÕþ¢”ŸÄÓþ¡“ŸÃÓþ¡” ÄÑþŸ“ŸÀÏþ�’Ÿ¼Ìýœ‘ŸºËýš‘ŸµÈý˜�Ÿ°Äý•� «Àý“ŽŸ¨½ý“ŽŸ§¼ý’ŽŸ¥»ý’ŽŸ¤ºý‘�Ÿ¤¹ý��Ÿ¢¸ý��Ÿ¡¸ý��Ÿ¢¸ý™‘ ²ÅþˆœŸˆŽ¿ƒ•žƒ‰¾ƒ•ŸƒŠ¾„—Ÿ„Š¿„—Ÿ„‹¾…˜ …‹¾„—Ÿ„‹¿„—Ÿ„‹¿„—Ÿ„Š¿„—Ÿ„о…˜Ÿ…‹¿…™Ÿ…Œ¾…™Ÿ…‹¾†™ †‹¾…šŸ…Œ¾‡›Ÿ‡Œ¾‡›Ÿ‡�¿‡›Ÿ‡�¿‡�Ÿ‡�¿ˆ�ŸˆŽ¾ŠŸŸŠ�¾‹ Ÿ‹�¾‹¡Ÿ‹�¿�£Ÿ�‘¾�¥ �‘¿Ž¦ŸŽ’¿�§Ÿ�“¿�¨ �“¿�©Ÿ�”¿‘©Ÿ‘”¿‘ªŸ‘•¿’« ’•¿’« ’•¿“¬Ÿ“–¿Ž¬ËŽ»¿Š¬þŠâ¿‰­þ‰â¿Š«òŠ×¿�«¬�Ÿ¿’« ’–¾’«Ÿ’–¿’« ’•¿‘« ‘•¿’ªŸ’•¿‘©Ÿ‘•¿�© �”¿�©Ÿ�”¿�© �”¿�§ �“¾�§ �“¿Ž¦ŸŽ’¿“›Š“‚±¨c¨.b©c©/bªcª/b«c«0b¬c¬1b­c­1b®c®2b›ˆm›i�š‡kšhœ£zP£WŠ«m0«Cu°f°9h³c³6b³c³6b²c²6b³c³6b³c³6b²d²9b³c³7b´c´7b®m/®Es�˜”�…¶ˆ�Ÿˆ�¾ˆ�ŸˆŽ¿ˆ�Ÿˆ�¿ˆœ ˆŽ¾ˆ�ŸˆŽ¿ˆ�ŸˆŽ¾‰�Ÿ‰Ž¿‰žŸ‰�¾ŠŸŸŠŽ¾ŠŸŸŠ�¾Š  Š�¿‹¢Ÿ‹�¿Œ£ŸŒ‘¿�£Ÿ�‘¾�¥ �‘¾�¦Ÿ�’¿Ž§ŸŽ“¿Ž¦ŸŽ“¿�§Ÿ�”¿�¨Ÿ�“¿�¨ �”¿‘ªŸ‘”¿‘ª ‘•¿‘ªŸ‘•¿‘ªŸ‘•¿‘ªŸ‘•¿‘ªŸ‘”¿’ªŸ’•¿‘ªŸ‘•¿’ªŸ’•¿‘ªŸ‘”¿‘« ‘•¿‘ªŸ‘•¿‘©Ÿ‘”¿’¤–’�¹¢}H¢R„¦c¦+a¦c¦,b§b§,b§b§-b¨b¨-a©c©-a©b©-a¨b¨-b©b©-b£c(£>a˜bt˜taœbPœ[b¦c¦-a¦b¦,a§c§,a¦c¦,b¥c¥+a¦c¦,b¥c¥+a¥c¥*b¥c¥*b¥b¥+b¤c¤*a£b£*b£c£)bŸc)Ÿ:a™ct™ta˜ct˜tb™cn™pbŸcŸ/b¡b¡'b b 'a b &a d *d˜Ži˜gš“«œ“”½“­ “–¿“­Ÿ“–¿“¬Ÿ“•¿’­Ÿ’•¿’­ ’–¿“¬ “•¿’«Ÿ’–¿’¬ ’•¿’¬Ÿ’•¿’«Ÿ’•¿’« ’•¾’« ’•¿‘ªŸ‘•¿–•z–u¥£g£0f¤c¤+b¥c¥+b¦b¦+a¦c¦,b§b§,b¦c¦+b§c§,a§b§,a¦c¦,b¦b¦,a¥c¥+a¤f¤.e¢w=¢I}œ�lœm��Ÿ°�£±‰ªý‰ß½‰«ÿ‰â¿Š¬üŠà¿‘¬«‘ ¿”®Ÿ”–¿“®Ÿ“–¿“® “–¿”¯ž”–¾–§‘–‹¶™Œa™d–œhœ,i›b›$a™b™"b™b™!a˜b˜!b—b— b—c— b—c—a–c–a—b— b˜c˜ b™h™)g—±ž——½–±Ÿ–˜¿–±Ÿ–˜¿–±Ÿ–˜¿–²Ÿ–˜¿–²Ÿ–™¿—± —˜¿—³ —™¿—² —™¿—³ —™¿˜³ ˜™¿˜µ ˜š¿™µŸ™š¿™µ ™š¿™· ™›¿™· ™›¿™«�™Š³’v3’7x�b�b�b�aŽbŽa�b�a�c�a�c�a�b�a�b�a�b�aŽbŽaŽbŽa�b�a�b�a�b�aŒbŒb�c�bŽbŽa�b�aŽbŽa�b�a�b�a�b�a’b’a”b”a•b•a—b—a˜b˜ ašbš!a›b›#a�b�$a�b�$aœk#œ1l–§�–е•° •˜¿•°Ÿ•˜¿•±Ÿ•˜¿•° •˜¿–² –˜¿–± –˜¿–² –˜¿–²Ÿ–™¿–²Ÿ–™¿–± –˜¿–± –˜¿–±Ÿ–™¿–±Ÿ–˜¿–± –˜¿–± –˜¿•°Ÿ•˜¿•° •˜¿•¯Ÿ•˜¾•¯ •—¿•¯ •˜¿•¯ •˜¿”° ”˜¿”¯ ”—¿•° •—¿•° •—¿”¯Ÿ”—¿•¯ •—¿•¯Ÿ•—¿”° ”—¿”¯ ”—¿•¯Ÿ•—¿”°Ÿ”—¿•¯Ÿ•˜¿•°Ÿ•˜¿•¯Ÿ•˜¿•° •—¿•±Ÿ•˜¾–± –˜¿–² –™¿–²Ÿ–™¿—³ —™¿—´Ÿ—š¿˜´Ÿ˜™¿˜´Ÿ˜š¿˜µ ˜›¿˜µŸ˜š¿˜µ ˜š¿˜³ ˜™¿—³Ÿ—š¿—²Ÿ—™¿–²Ÿ–™¿•± •˜¿•¯ •˜¿”°Ÿ”—¿•¯Ÿ•—¿”® ”—¿“® “–¿’¬Ÿ’–¿“¬ “–¿’¬ ’–¿’«Ÿ’•¿‘« ‘•¿‘ªŸ‘”¿�ª �”¿�© �”¿�§Ÿ�“¿Ž¦ Ž’¿Ž¥ŸŽ’¿Ž¤ŸŽ‘¿�¤Ÿ�’¾�© �”¿‘�Ÿ¤¹ý‡ŠŸ’¬üˆŠŸ’¬üŠ‹ •¯ý‹‹Ÿ˜°ý‹‹Ÿ˜²ý‹‹Ÿ˜±ýŠ‹ —¯ýŠ‹Ÿ–¯ý‹‹Ÿ–¯ý‹‹Ÿ˜²ýŒ‹Ÿ™²ýŒŒŸš³ý�ŒŸ�³ýŽŒŸž¶ý�ŒŸ ·ý��Ÿ ·ý�Ž ¡¹ý‘�Ÿ¤ºý“ŽŸ¦¼ý•�Ÿ¬¿ý—�Ÿ¯Âý˜�Ÿ³Åý™‘Ÿ¶Çýœ’ŸºËþ�’Ÿ¼ÍþŸ“Ÿ¿Îþ¡” ÂÒþ¢”ŸÅÓþ¢” ÆÓþ£• ÉÕþ¥•ŸÊ×þ¤• Ë×þ¥–ŸÌÙþ¦ºÌ×�§¦âÿÞA@¥âþÞ@@¥×òÝUY¥ ¬ÑÅ奕 ËØþ¥– ËØþ¤•ŸÊ×þ¤• ÉÖþ¤• ÈÖþ¢”ŸÆÔþ¢” ÅÔþ¢”ŸÅÓþ¡” ÄÓþŸ“ŸÀÏþŸ’Ÿ¿Îþž’ ¾Íþ¢ƒŠ½Íþ¯.½Íþ¯/¼Ìþ¯/ºËþ¯0¸Éþ¯1·Èý°1´Æý°2³Åý¢im³Äý¡gk°Ãý§WP¯Âý¬C0¬Àý®:«¿ý°6¨½ý¯6¨½ý¯6©¾ý¯6¨½ý¯6¦½ý¯8¨¸ø¯7¦»ý¯7§»ý¬E/¦»ý•†”¦»ý’ŽŸ¦»ý’ŽŸ¥»ý’� ¦¼ý’Ž ¥¼ý’Ž ¦»ý’ŽŸ¦¼ý’ŽŸ¦¼ý”ŽŸ¨½ý”Ž ©¾ý•�Ÿ¬Àý–�Ÿ®Âý™‘Ÿ²Äýš‘ŸµÇýš‘Ÿ¶Çýœ’Ÿ¹Êýœ’ ºËþž“Ÿ¾ÍþŸ“Ÿ¾Íþ “ ÀÏþ ”ŸÂÑþ¢” ÄÒþ¢”ŸÆÔþ£”ŸÇÔþ¤” ÈÕþ£•ŸÇÕþ¤”ŸÈÕþ£” ÈÕþ¤• ÈÕþ¤• ÈÖþ¤• ÈÕþ¤• ÈÕþ£” ÈÖþ£•ŸÇÔþ¢” ÅÓþ£�–ÄÒþ¬RHÂÑþ¯,ÁÐþ¯,ÁÐþ¯,ÀÐþ¯-¿Îþ¯-½Îþ¯-½Íý°-½Íý¯-¾Íý¯-½Íþ¯=)È­Ô¯tsÞ@=°ZPÖr„¯,ÁÏþ¯,ÁÑþ¯+ÁÐþ¯,ÃÑþ¯+ÂÑþ¯+ÃÒþ¯*ÃÒþ¯+ÄÒþ¯+ÄÓþ¯*ÅÓþ¯*ÅÔþ°*ÆÔþ°)ÉÕþ°:)Ñ´Ó¯usÝ?=¯ttÝ?<¯pnÝGI¯/ÎÉë°'ÌÙþ¯'ÍÙþ°'ÍÚþ¯*ÎÚþªhhÎÚþ§”œÎÚþ§–ŸÎÚþ¦–ŸÎÚþ¦–ŸÍÙþ¦–ŸÎÙþ¦•ŸÍÙþ¦•ŸÌÙþ¥•ŸÌÙþ¥–ŸËØþ¤• Ê×þ¤•ŸÊ×þ¥•ŸÊ×þ¥• Ê×þ¤•ŸÈÕþ¦uyÆÔþ®/ÆÔþ°*ÄÒþ¯+ÄÒþ¯+ÂÑþ°+ÂÐþ°,ÁÐþ¯+ÁÐþ¯,ÂÐþ¯,ÂÑþ¯,ÂÐþ¯+ÂÑþ°+ÃÒþ¯.ÅÔþ®I=ÅÓþªnlÅÓþ§£±Ô–°¤ßýÝ>=¥âÿÝ?=¦áüÝDD§ «ÐÅç§– ÏÛþ§—ŸÑÜþ¨— ÑÜþ©–ŸÓÞþª‹‘ÓÞþ­daÔßþ¯,Õàþ¯$×áþ¯#Úãþ¯"Ýåþ¯ Þçþ° àèþ¯àèþ¯áéþ¯ áéþ¯ áèþ¯ ßçþ¯)Üåþ­—žÛäþ­˜ Ûãþ¬™ŸÙãþ­™ Úãþ­˜ŸÛäþ­™ Ûäþ®˜ŸÝäþ®™ Üåþ®™ŸÝæþ®™ŸÞæþ¯šŸßçþ±™ áéþ°šŸâéþ²šŸäëþ³›Ÿæíþ´œŸèîþ´Š�ëðÿ°73íòÿ¯ïóÿ¯ðóÿ¯ðóÿ¯ðóÿ¯ðôÿ¯ñôÿ¯ñôÿ¯ñôÿ°òõÿ¯óöÿ¯ôöÿ¯óöÿ°ô÷ÿ¯ô÷ÿ°ô÷ÿ°óöÿ¯óöÿ¯óöÿ°ñôÿ¯ïóÿ¯îòÿ°ìñÿ¯êïÿ¯èíÿ¯ãêþ¯àèþ¯ Þçþ¯!Úãþ¯"Øáþ°$Öàþ¯$Ôàþ¯1$Õßþ«Š�Öàþ«˜Ÿ×âþ¬˜ŸÙáþ¬˜ŸÙâþ¬˜ŸÙâþ­™ŸÛãþ¬™ Úäþ­˜ Ûãþ­˜ Üäþ®˜ Ûäþ­™ŸÜãþ­˜ŸÚãþ­˜ Ûãþ¬˜ŸÙâþ­˜ŸÙâþ¬— Øâþ«—Ÿ×âþ«˜ Öàþ«˜ŸÖàþ«˜ŸÖàþ«—ŸÖßþ«˜ Ößþª—ŸÕßþª—ŸÕßþª— Õßþª—ŸÕßþ«— Ößþª— Õßþ«— Õßþª—ŸÕßþ©—ŸÔÞþª— Ôßþ©˜ Ôßþª—ŸÔàþª˜ŸÖßþ«—ŸÕßþ«˜ Öàþ¬˜ Ùâþ¬˜ Ùâþ­˜ Üäþ®™ŸÜåþ¯š Ýæþ¯™Ÿßçþ°š àèþ°š áéþ±šŸãêþ±›Ÿâëþ°šŸâéþ°™Ÿàèþ¯š ßèþ®™ Ýåþ­™ Ûäþ«˜ Øâþª˜ŸÖáþ«—ŸÕàþ©— Ôßþ©— ÒÝþ§– ÏÛþ§– ÎÚþ§–ŸÎÛþ¥– ÌÙþ¤•ŸÉ×þ¤•ŸÈÖþ£• ÈÖþ¢• ÆÔþ¡” ÅÒþŸ“ ¿Ïþž“Ÿ½Íþ�“Ÿ½Íþœ’ŸºÊþ›‘Ÿ¹Éý¡” ÃÒþ‡›Ÿ‡�¿�“Ÿ�‰¾ƒ•ŸƒŠ¾„—Ÿ„‹¾„—Ÿ„‹¾„˜Ÿ„Œ¾…˜Ÿ…‹¿…˜Ÿ…‹¿…™ …Œ¾†š †Œ¾†›Ÿ†�¾‡œŸ‡�¾ˆœŸˆ�¾ˆžŸˆŽ¾‰žŸ‰�¾Š  Š�¿‹£Ÿ‹‘¿�¥ �‘¾�§Ÿ�’¿�¨Ÿ�“¿‘ª ‘”¿’« ’–¿“­ “–¿“­ “–¿•¯Ÿ•—¿•® •—¿•° •˜¿–² –™¿˜´ ˜š¿˜µŸ˜š¿™µŸ™š¿˜µ ˜š¿˜´ ˜š¿—¦�—‹²™‚œ™—†˜j„˜‚l˜iu˜uj—k3—;l–n(–0o•q,•3r•t4•8v”{>”B~”�J”K†•†U•UŽ–‰\–[‘—Œ`—`•—�f—f™—’m—kž—•r—p¡—–t—s¢—˜x—u¥˜’n˜mžžbž$`�b�#`ŸbŸ$`žbž$`ŸbŸ%`ŸaŸ%` b %a b &a¢a¢'`£b£'a¤b¤)a¥b¥)`¥b¥*`¥b¥)`¦b¦)a¥b¥*a¦a¦)a§a§*a¦a¦+`¦b¦+a¦b¦*aœ‡cœd—�§Ÿ�“¿Ž¦ŸŽ“¿Ž¦ Ž’¿Ž¦ŸŽ’¿Ž¦ŸŽ“¿Ž¦ Ž“¿Ž¦ŸŽ“¿Ž§ŸŽ“¿�§Ÿ�“¿�©Ÿ�”¿�© �”¿�¨Ÿ�”¿�© �”¿‘ª ‘•¿‘ª ‘”¿‘« ‘•¿“­ “–¿“®Ÿ“—¿”¯Ÿ”—¿”¯Ÿ”—¿“® “–¿•¯ •—¿”¯Ÿ”—¿•¯Ÿ•˜¿—² —™¿—² —˜¿–² –™¿—³ —™¿–±Ÿ–™¿•¯Ÿ•—¿•¯Ÿ•—¿•¯ •—¿”® ”—¿“¯ “—¿”¯Ÿ”–¿”­ž””½™“m™m�žež*f a $`¢a¢&`¤a¤'`£a£'`¤b¤(`¥a¥(`¥a¥(` a) ;`™as™t` b( ;`¥a¥)`¦a¦)`¥a¥)`§a§(`§a§)`¨`¨*`ª`ª,`¬`¬,`­a­.`­a­-`­`­.`®a®/`­`­.`¥`*¥A`˜`t˜s`˜at˜t`�aG�T`¨`¨*`§a§*`§a§*`£o1£>u•™„•~­�§Ÿ�“¿�¨Ÿ�“¿�¨ �“¿�¨Ÿ�“¿�¦Ÿ�“¿�¦Ÿ�“¿�§Ÿ�“¿Ž¦ŸŽ“¿Ž¦ŸŽ’¾�¥Ÿ�’¾�¤ �’¿Œ£ŸŒ�¿‹¡Ÿ‹�¾Š ŸŠ�¿‰ŸŸ‰�¿‰žŸ‰Ž¿’’†’|®¯j*¯Bp´a´3`´`´4`µaµ4`µaµ4`µaµ5`µaµ5`µaµ5`µaµ4`µaµ5`´a´4`´a´3`±a±2`°a°1`�bQ�^a—f�—}h“už“‘|™�|™y�Ÿ…^Ÿa’ž†^žb“Ÿ„YŸ^�Ÿ}KŸR†¢l(¢9o¤c¤+c¤a¤&`£a£%`¢`¢$`¡`¡$` a #`ŸaŸ#`�`�"`�`�"`ž`ž!`�a�"`›`› `›a›`˜…Q˜U‹—³ —™¿˜´Ÿ˜™¿—´ —š¿˜µŸ˜š¿˜µŸ˜›¿˜µŸ˜š¿˜µ ˜š¿˜´ ˜™¿˜³ ˜™¿—³Ÿ—™¿–² –™¿—²Ÿ—™¿–²Ÿ–˜¿–±Ÿ–˜¿–± –˜¿–°Ÿ–˜¿–¯Ÿ–˜¿–ª•–�¸šIšN†›a›!`™`™ `—a—`”a”`�a�`�`�_ŽaŽ`�`�`‹`‹`Š`Š`‰`‰_‰`‰`ˆ`ˆ`‰`‰`‰`‰`ˆ`ˆ_ˆ`ˆ_ˆ`ˆ`‰`‰_‰`‰_ˆ`ˆ`‰`‰`Š`Š_‹`‹_Œ`Œ_Ž`Ž`�`�_’`’_•`•`™a™!a˜›z˜x¦•°Ÿ•—¿•± •˜¿•°Ÿ•˜¿–° –˜¿–±Ÿ–™¿–² –˜¿—²Ÿ—˜¿–²Ÿ–™¿–² –™¿—³ —™¿–²Ÿ–™¿—²Ÿ—™¿—² —™¿–²Ÿ–˜¿–²Ÿ–™¿–±Ÿ–˜¿–² –˜¿–± –˜¿–²Ÿ–˜¿–± –™¿–± –˜¿–°Ÿ–—¿•°Ÿ•˜¿”¯Ÿ”˜¿•°Ÿ•—¿•¯Ÿ•˜¿”° ”—¿”°Ÿ”—¿•¯Ÿ•˜¿•¯ •˜¿”¯ ”—¿•¯ •—¿•°Ÿ•˜¿•±Ÿ•˜¿•° •˜¿–± –—¿–±Ÿ–™¿•±Ÿ•˜¿•± •˜¿–±Ÿ–—¿–± –˜¿•°Ÿ•˜¿”° ”˜¿”¯ ”˜¿•° •˜¿•°Ÿ•˜¿•°Ÿ•˜¿–° –˜¿•± •™¿•± •™¿–°Ÿ–˜¿•± •˜¿–° –™¿–±Ÿ–˜¿—² —™¿—³ —š¾˜³Ÿ˜š¿˜´Ÿ˜š¿—³Ÿ—™¿—³Ÿ—š¿˜´ ˜™¿—³ —™¿—³ —™¿–²Ÿ–™¿–³Ÿ–™¿–²Ÿ–˜¿–± –™¿–±Ÿ–™¿–± –™¿•°Ÿ•˜¿”®Ÿ”—¿–± –˜¿��Ÿ¡¶ý…‰Ÿ�©üˆŠŸ‘¬ü‹‹ ˜±ýŒ‹ ˜±ý‹‹Ÿ™±ýŒŒŸ™³ý�ŒŸ›³ý�Œ œµþŽŒŸž·ý�ŒŸ¡·ý��Ÿ¢¸ý‘ŽŸ£¹ý’ŽŸ§¼ý”�Ÿ©¾ý—�Ÿ®Áý™‘Ÿ´Æýœ‘ŸºÊýŸ“ ¾Íþ¡”ŸÂÑþ¢” ÅÓþ¤–ŸÊ×þ§–ŸÍÚþ§–ŸÐÛþ©—ŸÓßþ©—ŸÔÞþª˜ŸÖàþ­˜ Ûäþ±™Ÿáèþ²š äëþ±š ãêþ°šŸâéþ¯™Ÿàèþ¯‹�àÞõ°˜œÝWZ¯�„Ý<<¯uuÝQT¯;4áÌݯ/(ãêþ¯3-åëþ¯83åìþ¯A>åìþ¯LJãêþ®VVàèþ®[\Ýåþ­``Ùãþ­ffØâþ­km×âþ«prÕßþ«ruÔàþ«uyÓÞþ¬mnÓÞþ¯$ÓÞþ°#ÓÞþ¯$ÒÜþ°$ÑÜþ¯%ÑÛþ°%ÏÛþ¯%ÏÛþ°&ÎÙþ¯'Ê×þ¯(ÇÕþ¯(ÆÔþ¯)ÄÓþ¯)ÄÒþ¯)ÄÒþ°*ÃÒþ°)ÃÑþ°*ÂÑþ°*ÁÐþ¯*ÁÐþ¯*ÁÐþ¯*ÀÏþ¨cb¾ÎþŸ“ ¾Íþž’Ÿ½Íþž“ ¾Íþž’Ÿ½Íþž“Ÿ½Íþž“ ½Íþž“ ½ÍþŸ“ ¿Îþ “ŸÁÐþ¡“ŸÂÑþ¡” ÃÑþ¡” ÄÒþ¢•ŸÆÓþ¢”ŸÆÓþ£” ÇÕþ¤• É×þ§– ÏÛþ©– ÒÝþ¨˜ŸÒÞþ©— ÒÝþ¨— ÑÞþª—ŸÓßþ©—ŸÔÞþ«—ŸÖáþ­™ŸÛäþ®™ŸÝæþ­™ Ûäþ®™ŸÝåþ¬™ Úãþª˜ŸÕàþª˜ŸÔßþª—ŸÔÞþª—ŸÔÞþ©—ŸÓÝþ©—ŸÒÝþ©•�ÒÞþ¬lmÒÞþ¯*ÑÜþ¯$ÎÚþ°&ÊØþ¯'ÇÕþ¯'ÇÔþ¯(ÆÓþ¯(ÄÓþ¯)ÃÓþ¯<)̭ίttÝ<:¯;)̭ί)ÄÒþ¯)ÄÑþ¯)ÃÑþ°(ÁÐþ¯)ÀÏþ¯*¾Ïý°,¹Êý¯,¶Èý¯.´Çý¯.´Æý¯.³Åý°.³Äý°.³Åý°A*Ģ˯ttÝ;9°tsÝ;9¯TFÒz“°+¾Ìý¯*¿Ïþ¯*ÀÏþ­?1ÀÐþ¤~„ÁÐþ “žÀÏþ “ ÂÐþ ”ŸÁÐþ ”ŸÀÐþŸ“ ÀÎþŸ“ ¿ÎþŸ“Ÿ¾Îþž’Ÿ½Íþ�’Ÿ¼Ìýœ’ŸºÊý›‘Ÿ·Éý™‘Ÿ´Æý˜�Ÿ²Äý–� ­Áý•� «¿ý”Ž ©½ý™|†¨½ý¬A+§¼ý¯3¦¼ý°4¥ºý¯5¤ºý¯4¥»ý¯5£¹ý¯4£¹ý¯5¤ºý¯4¥»ý¯4¤ºý¯4¥»ý¯3§¼þ¯2ª¿ý¯1®Àü®^QÒk„®}€Ý:9«‘�Þ;9«z|Í�°©a^¿Îþ©b^ÁÏþª]YÂÑþ«SJÄÓþ­9(ÄÒþ¯+ÅÔþ¯'ÇÔþ¯&ÉÖþ¯$ËØþ¯$ÌÙþ¯#ÏÚþ¯"ÑÜþ¯"ÓÝþ¯"Óßþ°"ÓÞþ¯!ÓÞþ¯!Öàþ°Ùãþ¯TRÜäþ®™Ÿßæþ±šŸáèþ°š áéþ±› ãêþ²šŸãêþ°š âêþ°šŸáéþ°š àèþ¯™ ßçþ¯™ŸÞæþ®™ Ýæþ®™ŸÝäþ®™ Ûåþ­˜ŸÚãþ¬˜ŸÙâþ¬˜ Øáþ«˜Ÿ×àþ«�–×àþ®OIÖàþ¯!×áþ¯ Ûãþ¯áèþ¯èíþ¯ìñÿ®ïóÿ¯ðôÿ¯òõÿ®öùÿ¯øúÿ®úûÿ¯ûüÿ¯ûüÿ¯ûüÿ®ûüÿ¯üýÿ®ýþÿ¯ýýÿ¯üüÿ¯üüÿ¯ûüÿ¯úûÿ¯øúÿ®õøÿ®óöÿ¯ðôÿ¯íòÿ¯éîþ¯âéþ¯!Ùâþ¬xzÕßþª˜ Õàþ¬˜ ×áþ¬˜ Øáþ¬˜ŸÙâþ­˜ Úãþ­˜ŸÜäþ®˜ŸÜäþ®™ Üåþ­˜ Üåþ­™ŸÜåþ®™ Ýåþ®™ Üäþ­™ŸÜäþ­˜ŸÛäþ­˜ŸÛãþ­˜ Ûãþ®˜ Ûãþ­˜ Úãþ­™ŸÚãþ­™ŸÚãþ¬˜ŸÙâþ«˜ Øáþ«˜Ÿ×áþ«˜Ÿ×àþ«˜Ÿ×àþª˜ Öàþª— Õßþª—ŸÔßþª—ŸÕßþª— Õßþª— Õßþª— Õßþª—ŸÖàþ«˜ ×áþ«˜ ×áþ«˜ Øáþ¬˜ Ùâþ¬˜ŸØâþ«˜ŸØãþ¬—ŸÙáþ¬˜ŸØáþ«˜ ×áþ«˜ Öàþª˜ŸÖàþ«˜ Öàþ«— Öàþ«˜ ×áþ¬˜ Øâþ«˜ Øâþ¬˜ŸÙâþ«˜ŸØâþ«˜ Øâþ¬˜ŸÙâþ­™ Úãþ®™ŸÜäþ®™ŸÞæþ¯™Ÿßçþ¯™ ßçþ¯™ àæþ¯š ßçþ°™Ÿáçþ¯™Ÿßçþ¯™ Þçþ®™ Üåþ­™ŸÜåþ­˜ŸÛäþ­™ Ûäþ¬˜ Úãþ¬˜ŸÙãþ«˜ Öàþ¨— ÒÞþ¬™ Ùãþ‹¡ ‹�¿†šŸ†Œ¿‡›Ÿ‡Œ¾‡›Ÿ‡Œ¾‡› ‡�¾‡œŸ‡Ž¾ˆ� ˆŽ¾ˆ�ŸˆŽ¾ŠŸŸŠŽ¾ŠŸŸŠ�¾‹¡Ÿ‹‘¾�¤Ÿ�‘¾Ž¥ŸŽ’¿�§ �“¿�¨ �“¿‘ªŸ‘•¿‘ªŸ‘”¿’« ’•¿“­Ÿ“–¿“®Ÿ“—¿”® ”—¿”®Ÿ”—¿”¯Ÿ”–¿”¯ ”—¿•¯ •—¾”¯ ”—¿•°Ÿ•˜¿•°Ÿ•˜¿—² —™¿—²Ÿ—˜¿—³ —™¿˜´ ˜™¿˜§‹˜ˆ²˜f9˜Ag—_q—r^˜__˜d^˜`˜)_–`–^—_—^—`—_—_—_˜_˜_˜`˜^˜_˜^˜_˜_˜`˜^š_š^›`›^›_›^œ_œ_œ_œ _œ_œ _œ_œ_œ`œ _ž_ž!^ž_ž!_�_�!^œ`œ _œ_œ ^ž_ž!^¡`¡#_¡_¡$_¢_¢$^£`£%^¤_¤&_£_£&^¤_¤&^¤_¤&^¥_¥&_¥`¥'^¤_¤&_¤_¤'^¤_¤'_ yB L��¨ �”¿�¨ �”¿�© �”¿�¨ �”¿‘©Ÿ‘”¿�©Ÿ�”¿‘© ‘”¿�©Ÿ�”¿�ª �”¿�©Ÿ�”¿‘© ‘”¿‘© ‘”¿�ªŸ�”¿‘ª ‘”¿�©Ÿ�”¿‘ªŸ‘•¿‘ª ‘•¿’ªŸ’•¿’¬ ’•¿’¬Ÿ’•¿’¬Ÿ’–¿“­Ÿ“–¿“­Ÿ“–¿“®Ÿ“—¾”®Ÿ”–¿”¯Ÿ”—¿”¯Ÿ”—¿”¯ ”—¿”®Ÿ”—¿”¯ ”—¿”¯Ÿ”—¿”¯Ÿ”—¿”®Ÿ”—¿”® ”–¿”®Ÿ”—¿“® “—¿“­ “–¿•¢�•‡³�|I�N…£`£&_£_£%^¤_¤%^¤_¤%^¤_¤&^¥_¥%^ _( ;^™_Z™b^¥_¥(^¦_¦'^§_§'^¦_¦'^¨_¨'^§_§'^§_§'^§_§(^¨_¨'^§_§(^¨_¨(^§_§(^§_§(^¨_¨)^¢_+¢@^˜_r˜r^˜_q˜s^¦_!¦9^­_­,_«i'«k¸] ¸2]¹] ¹2]·\ ·2]·] ·2]¸] ¸1]·] ·2]µ] µ0]¶] ¶0\µ] µ1]­]­;\—]r—r\˜]k˜n\­]­:\³] ³.]´] ´.\²] ².]±] ±,\°] °+\®] ®+\¬] ¬)]«] «(\¨] ¨&]§] §%]§] §%\¥] ¥$]¤] ¤$\£] £#\¤] ¤#]¢a¢(c�~P�UŠ™�o™nŸ’¤˜’�º�© �”¿�ª �•¿‘ª ‘”¿’¬ ’•¿“­Ÿ“–¿”®Ÿ”—¿“®Ÿ“—¿”¯ ”—¿•°Ÿ•˜¿–±Ÿ–™¿™µŸ™š¿™¶ ™›¿™µŸ™š¿—´ —š¿˜³Ÿ˜™¿—²Ÿ—˜¿–± –˜¿•¯ •˜¿•°Ÿ•—¿–± –˜¿–² –™¿–§�–ˆ²”}F”G„”^”^“] “\‘] ‘\‘\ +‘\�\ �\�\ +�\�\ +�\�] +�\Ž] Ž\�\ +�\�] +�\Œ] +Œ\�] �[�\ +�\�\ +�\Œ] Œ\�] +�\�] �\Ž\ Ž\Ž] Ž\�] +�\�\ +�\Ž] +Ž\Ž] +Ž\�c�c–—i–i››·ž›š¿š¸Ÿšœ¿š¸ šœÀ›· ›œÀš· š›¿š¸ š›¿š¸ š›¿š·Ÿšœ¿š· šœ¿š· šœ¿š· š›¿š¶ š›¿™¶Ÿ™›¿™¶Ÿ™›¿™¶Ÿ™›¿™¶ ™š¿™¶Ÿ™›¿™· ™›¿™·Ÿ™›¿š·Ÿš›¿›·Ÿ›œ¿š· šœ¿›¹Ÿ›œ¿›¹ ›œ¿›¹ ›�¿œº œ�Àœ» œžÀ�» ��Àœ¼ œž¿�¼ �žÀž¼ žžÀ�¼ �ž¿�½ �ž¿ž½ŸžŸÀž½ žŸÀž½ žŸÀž¾ žŸ¿ž¾ žžÀž¾ žŸ¿Ÿ¾ ŸŸ¿ž½ žŸÀž½ žŸÀŸ½ŸŸž¿�½ �ž¿ž¼ žŸ¿ž¼ žŸÀž½ žžÀ�»Ÿ�ž¿�¼ �žÀ�¼ �ž¿�¼ �žÀ�¼ �ž¿ž¼ žž¿�¼ �ž¿�¼ �žÀ�½Ÿ�žÀ�¼ �žÀ�»Ÿ�ž¿œ» œ�Àœ»Ÿœ�¿œº œ�Àœ¹ œœÀ›º ›�À›¹ ›�¿œº œ�¿œ¹ œœ¿›¹ ›�¿›¹Ÿ›œÀœºŸœ�¿œº œ�Àœ¹ œ�¿œºŸœœÀœ¹ŸœœÀœº œ�Àž“Ÿ¿Íþ˜‘Ÿ²Äýš�Ÿ´Æýš’Ÿ¶Éý�’ŸºÊýž“Ÿ¿Îþ “ ÂÐþ¡”ŸÃÒþ£” ÆÔþ¤• ÉÖÿ¥•ŸË×þ¦– ÍÚþ§– ÏÛþ¨— ÒÜþ¨—ŸÒÝþ¨—ŸÒÝþ©—ŸÓÞþª— ÔÞþ©—ŸÓÞþ©—ŸÓÞþ©—ŸÓßþª— ÔÞþ©—ŸÕßþª—ŸÕßþª—ŸÔßþ©—ŸÔàþª— Õàþ©—ŸÓÞþ©— ÓÞþ©—ŸÔßþª— ÓÞþ©—ŸÓßþ®PKÓÛû¯[TÛen¯VOÚny®&ÕÎë® Ôßþ® Ôßþ¯ Ôßþ¯ Õßþ® Ôßþ® Ôßþ¯ Ôßþ¯ ÓÞþ¯ Ôßþ¯ ÓÞþ¯ Óßþ¯ Óßþ® ÓÞþ® ÒÝþ¯ ÒÝþ¯ ÔÞþ® ÒÞþ¯ ÒÝþ¯ ÑÝþ® ÏÛþ¯ ÌÚþ¯! È×þ¯" ÆÔþ¯" ÅÓþ¯" ÅÓþ¯# ÄÒþ¯# ÄÓþ¯$ ÄÑþ®$ ÁÐþ¯$ ÀÐþ¯% ÀÏþ®% ¿Îþ¯% ¿Ðþ¯% ÁÏþ¯% ÀÏþ¯$ ÀÏþ®$ ÀÏþªSMÁÑþ¡“ŸÂÑþ¡”ŸÃÑþ “ ÂÐþ “ ÂÐþ¡“ ÂÐþ¡“ ÂÐþ “ŸÂÐþ “ ÁÐþ “ŸÁÐþ¡”ŸÃÑþ¡”ŸÃÒþ¢”ŸÅÒþ¡” ÃÑþ¡”ŸÃÒþ¡”ŸÄÒþ¢” ÅÒþ¢”ŸÄÒþ¢”ŸÆÔþ£• ÆÕþ¤• ÈÖþ¥– Ê×þ¦•ŸÎÙþ§– ÎÚþ§— ÏÛþ¨– ÑÜþ¨–ŸÒÜþ©—ŸÒÝþ©— ÒÝþ©—ŸÒÞþ¨— ÒÝþ¨— ÒÝþ©– ÒÝþ©–ŸÒÜþ¦– ÎÚþ¥• ËØþ¤–ŸÉ×þ£•ŸÈÖþ£•ŸÆÔþ¢“žÅÓþ¦z€ÄÔþ«H>ÄÓþ®%ÃÑþ®# ÁÐþ®$ ÀÐþ®% ½Íþ®<)ȟî?+Èš¾®' ¶Èý®( µÆý®) ²Åý®) ²Äý®* ¯Ãý®+ ®Ãý®* ®Áý¯+ ¯Ãý®) °Ãý®* °Ãý¯* ±Ãý®* °Ãý®* °Ãý®* °Ãý®E0ÅŽ´®rrÜ32­d[ÒZr¨NC«¼ù�sy¨¾ý“‹š§»ý’ŽŸ¥»ý‘�Ÿ¤ºý��Ÿ¢¹ý‘� ¢¹ý��Ÿ¢¹ý��Ÿ¢¹ý��Ÿ¢·þ��Ÿ ¸þ��ŸŸ¶ý��Ÿ ·ý�ŒŸ ¸ýŽ� Ÿ·ý��Ÿ ¶ýŽŒŸž¶ýŽ�ŸŸµýŽŒŸž´ýŽŒŸœ´ý�‹Ÿ�´ý�ŒŸ›³ýŒŒ œ´ýŒŒŸ›³ýŒŠžš³ýšos›²ý¬>"™³ý®3 ›³ý®1 š³ý®2 ›³ý®2 œ³ý®1 œµý¯1 �µý¯0  ·ý¯1 Ÿ¶ý®1  ¶ý®;°¢Ü®rrÜ22®mjÙ;A¯:°£Ý¯/ ¤¹ý¯. ¤ºý®. ¥»ý¯- ¨½ý®+ «¿ý®+ ®Áý¯) ±Äý®( ¶Çþ®' ¹Êý®& »Ìý®% ½Íþ¯$ ÀÏþ®# ÁÐþ¯# ÄÑþ®" ÃÒþ®)ÄÓþªUOÄÒþ¨moÅÓþ¢�˜ÅÓþ¢” ÅÓþ¢• ÆÔþ¤” ÈÕþ¥•ŸËØþ§–ŸÏÛþ©— ÒÝþ©—ŸÒÞþ©— ÒÞþ«—Ÿ×àþ®™ŸÝäþ±š ãêþ³› çíþ²š åëþ°™Ÿáèþ°š ßçþ­™ Üåþ¬˜ Ûãþ«˜ŸÖàþª—ŸÕàþ­˜ŸÚãþ®™ŸÜåþ®ˆ�ßçþ®GFáèþ®ãêþ® +æíÿ® +çíÿ® éîÿ® êïÿ¯ +ëðÿ¯ ìòÿ® +íòÿ® ïóÿ® +ðôÿ¯ +ðôÿ® +ñôÿ® +ñôÿ® +ñôÿ¯ +ñõÿ® ñõÿ® +ñôÿ¯ +ðôÿ® ïóÿ® +ïóÿ® +îóÿ® +îòÿ® +îòÿ® îòÿ¯íñÿ²ijëðÿµ›žëðÿµœ ëðÿµœŸêðÿµœ êïÿ´œ éïþ´› éïþµœ éïþ³› éîþ³› èîþ´›Ÿèîþ´› çíþ´›Ÿçíþ³› çíþ³›Ÿçíþ³›Ÿçíþ´›Ÿèíþ´›Ÿçíþ´› èîþ´›Ÿéîþ´›Ÿéîþµ› êïþµœ êïÿ¶�Ÿíòÿ·œŸïóÿ¸�Ÿðóÿ¸� ñõÿ¹� òöÿº� ôöÿº� ô÷ÿ»ž öøÿ»ž ÷ùÿ»ž ÷ùÿ¼ž øúÿ½ž ùúÿ½Ÿ ùûÿ½ŸŸùûÿ½Ÿ ùûÿ½ž ùûÿ½žŸúûÿ¼ŸŸùûÿ¼žŸùûÿ¼žŸùûÿ½Ÿ ùûÿ»ž ÷úÿ¼ž ÷ùÿ»ž ÷ùÿ»Ÿ ÷ùÿ»žŸöøÿ»žŸöøÿ»ž õøÿ»ž öøÿ»ž öøÿ»žŸöùÿºž öùÿ»ž öùÿºžŸöùÿºž õøÿº� ô÷ÿº� óöÿ¹� òõÿ¸�Ÿñôÿ¸� ðôÿ¸� ðôÿ¸� ïóÿ·œ ïóÿ¸� ïóÿ¸œ ïóÿ·� ïóÿ¸� ðôÿ·� ðôÿ¸�Ÿðôÿ¸� ðôÿ·œ ïòÿ¸� ñôÿ•°Ÿ•˜¿“­Ÿ“–¿“­Ÿ“–¿”®Ÿ”—¿”®Ÿ”–¿“® “—¿“® “—¿“¯Ÿ“—¿”® ”—¿”®Ÿ”—¿”® ”—¿”¯Ÿ”—¿”®Ÿ”—¿”¯Ÿ”—¿”®Ÿ”—¿•¯Ÿ•—¿•° •—¿•° •˜¿•° •˜¿•± •˜¿•± •™¿–± –˜¿•±Ÿ•˜¿–² –™¿—²Ÿ—™¿—² —˜¿–² –™¿–± –™¿–²Ÿ–˜¿–±Ÿ–˜¿–±Ÿ–™¿–±Ÿ–˜¿˜e-˜7f˜\5˜?[™\™[›\ ›[›\ +›[›\ +›[›\ ›[›\ ›[œ\ +œ[œ\ œZœ\ œ[œ\ +œ[œ\ +œ[œ\ +œ[œ\ +œ[œ\ œ[�\ �[�\ �[ž\ +ž[Ÿ[ Ÿ[¡\ ¡[¡\ ¡[¢\ +¢[£\ £![£\ £![¤\ ¤![¤\ ¤![£\ £"[¥\ ¥"[¥\ ¥#[¨\ +¨$[©\ ©%[ª\ +ª%[«\ +«'[¬\ +¬'[«\ +«'[¬\ +¬&[«\ +«'[ª\ +ª&[©\ +©%[§^ §%]—”}—x§�§Ÿ�“¾�§Ÿ�“¿�¨Ÿ�”¿�¨ �“¿�¨ �”¿�¨ �“¿�©Ÿ�”¿�¨ �”¿�¨Ÿ�“¿�© �”¿‘©Ÿ‘•¿�ªŸ�”¿‘ª ‘•¿‘¬ ‘–¿’¬ ’–¿“¬ “–¿“­Ÿ“–¿”®Ÿ”—¿”¯ ”—¿”®Ÿ”–¿”¯Ÿ”—¿”¯ ”—¿”¯ ”—¿•°Ÿ•˜¿•°Ÿ•˜¿–±Ÿ–˜¿–°Ÿ–˜¿•°Ÿ•˜¿”¯Ÿ”—¿”¯ ”—¿”® ”—¿”®Ÿ”—¿”¯ ”—¿”¯Ÿ”–¿’­ ’–¿‘« ‘”¿�ªŸ�”¿�ªŸ�”¿�© �”¿�¨ �“¿�§ž�’¾•–ƒ•|«¡|Q¡VŠªcª1f®\ +®(Z©\"©;Z°[°/Z´[ +´,[³[ ³,[³[ ³,Z³\ ³,Z³[ +³,Z´\ ´-Z´[ ´-Zµ\ µ.[µ[ µ.[µ[ µ.Z¶[ ¶/[¶\ ¶/Z·\ ·/[´`´7c™pm™l€{„×{­Ÿ‘¯–´†™Ÿ†Œ¾…™Ÿ…‹¾†™Ÿ†Œ¾…™ …‹¿…™ …‹¾†˜Ÿ†Œ¾…˜Ÿ…‹¿…˜Ÿ…‹¿…˜Ÿ…‹¾„—Ÿ„о„—Ÿ„‹¿„—Ÿ„‹¿ƒ—Ÿƒ‹¾„– „Š¿ƒ– ƒŠ¾ƒ–ŸƒŠ¾ƒ•ŸƒŠ¿ƒ”ŸƒŠ¾‚”Ÿ‚‰¾‚”Ÿ‚‰¾�”Ÿ�‰¾‚”Ÿ‚‰¾‚“Ÿ‚‰¾‚”Ÿ‚‰¾‚”Ÿ‚‰¾�”ž�‰¾Š�’Š€µ¨uU¨[�¼]¼7_½[ +½4[½[ +½3Zº[ º2[º[ º1Zº\ º1Zº[ º1[¹[ ¹0Z¨\,¨GZ˜[q˜qZ¨[.¨HZ·\ ·/Z¶\ ¶/Zµ\ µ.Z´\ ´,Z´\ ´-[³[ ³,Z´[ ´,Z³\ ³-Z³[ +³,[³[ ³,[²[ ²+[±[ ±*Z¯[ ¯)Z­\ ­'Z«\ «&[¥n4¥Aw”˜…”~®�¥Ÿ�’¿�§Ÿ�“¿�§ �”¿�¨ �”¿�¨Ÿ�“¿�© �”¿‘©Ÿ‘”¿‘ª ‘•¿’¬Ÿ’–¿”®Ÿ”—¿”® ”—¿”®Ÿ”—¿”¯Ÿ”—¿”°Ÿ”—¿•±Ÿ•™¿—³ —™¿˜´Ÿ˜š¿™µŸ™š¿™µŸ™š¿™µ ™š¿˜µ ˜š¿˜´ ˜š¿˜´ ˜™¿—³Ÿ—™¿—² —˜¿—°ž——¾˜Ÿ~˜}©˜x=˜C}™\ +™[™[™Z™[™Z™[™Zš[šZ™[™Z™[™Z™[™Z™[™Z˜[˜Z˜Z˜Z–Z–Z•[•Y•[•Z”[”Z”[”Y”[”Z”[”Z“[“Z’[’Z“\ “\”}D”F‚—¦‡—ƒ¯™µŸ™š¿™¶Ÿ™›¿™¶Ÿ™š¿™¶Ÿ™š¿™¶Ÿ™›¿™¶Ÿ™›¿™¶ ™›¿™· ™›¿™¶ ™›¿š·Ÿš›¿™¶ ™›¿™¶Ÿ™›¿™· ™›¿š·Ÿšœ¿š¸ šœ¿›¹ ›œ¿›¹ ›�À›¹Ÿ›�ÀœºŸœœ¿œ»Ÿœ�¿�¼ �ž¿ž½ žž¿�¼ �ž¿ž½ žŸÀž½ žž¿ž½ žžÀž¾ŸžŸ¿Ÿ½ ŸŸÀž¾ žŸÀž¾ žŸÀž¾ žŸÀž¾ŸžŸÀž¾ žŸÀŸ¾ŸŸŸ¿ž¾ žŸ¿Ÿ¾ ŸŸ¿Ÿ¾ŸŸŸ¿Ÿ¾ ŸŸ¿Ÿ¾ ŸŸ¿ž¾ žŸÀŸ¾ ŸŸ¿Ÿ¾ ŸŸÀŸ¾ ŸŸÀŸ¾ ŸŸ¿Ÿ¾ ŸŸÀž¾ žŸÀž¾ žŸ¿ž½ žŸÀž½ žž¿�½Ÿ�ž¿�¼ �ž¿�¼ �ž¿�¼ �žÀ�¼Ÿ�žÀœ»Ÿœ�Àœ»Ÿœ�Àœº œ�¿œ¹ œœ¿›¹ ›�À›¸ ›œ¿š¸ šœ¿š¸ š›Àš· š›¿š¶ š›À™¶Ÿ™›À™¶ ™šÀ™µŸ™š¿š¶Ÿš›¿š· š›¿›¸ ››¿š¸ŸšœÀ›¸Ÿ›œÀ›¹ ›œ¿›¹ ›œ¿œº œ�¿¬˜ŸØâþ§–ŸÏÛþ¨–ŸÐÛþ¨–ŸÐÜþ¨–ŸÑÜþ¨— ÑÜþ¨– ÑÜþ¨– ÑÝþ©—ŸÒÝþ¨— ÑÝþ©—ŸÓÝþ©—ŸÔÞþª— ÓÞþ©— ÓÞþ©—ŸÓÞþª—ŸÖßþ«˜ŸÖàþ«˜ ×áþ¬˜ ×áþ¬˜ŸÙâþ¬˜ Ùãþ­™ŸÚãþ¬™ŸÚãþ­˜ Úäþ­™ŸÜäþ®˜ Üäþ®™ Ûäþ­˜ŸÚãþ¬™ŸÚãþ¬™ŸÚäþ­™ŸÚãþ­˜ Úãþ®7-ÚÁØ®?5Û–¦¯ØÛö® +Õàþ® +Õßþ® ÔÞþ® +Ôßþ® Ôßþ® +ÓÞþ® +ÒÝþ® +ÒÞþ® ÒÝþ® ÒÝþ® ÓÞþ® Óßþ® ÓÞþ® +ÑÞþ¯ ÐÛþ® ÎÛþ® ÎÙÿ¯ +Ê×þ¯ ÈÖþ® +ÇÔþ® +ÅÓþ®! +ÅÒþ® +ÃÒþ®! +ÃÒþ®" ÃÑþ®" +ÁÐþ®" +¿Îý¯$ +»Ëý¯% ¸Êý®& +·Èý¯& +´Æý®' +´Æý®' +´Æý®' +´Çý®' +µÇý®% +·Éý®& +¸Éý®% ¼Îý¤x}¾ÎýŸ“Ÿ¿ÏýŸ“ ÀÐþ “ ÂÐþ¡” ÂÑþ¡“ ÃÒþ¡“ŸÃÑþ¡” ÄÒþ¡” ÄÑþ¡”ŸÃÒþ¢” ÄÓþ£•ŸÆÔþ¢” ÇÔþ¤• ÈÖÿ¤• É×þ¦– ÍÙþ§– ÎÚþ¨– ÐÛþ¨– ÑÜþ¨— ÒÞþ¨—ŸÒÝþ©— ÓÞþ©—ŸÓßþ©˜ŸÔßþ«— Öàþ«— Øáþ¬˜ Ùâþ­˜ŸÙâþ«˜ŸÖàþª—ŸÔßþ©— ÓÞþ©—ŸÒÝþ©— ÔÞþ©— ÓÞþ¨—ŸÑÝþ¦– ÍÚþ¤• ÊÖþ¢•ŸÇÔþ¢” ÅÓþ¡” ÃÓþ¡“ŸÃÑþ ’žÀÏþ¢{ƒ¼Ìý¨VQ¶Èý­2³Åý®( ®Âý®<"¹›Ë®/©µó®- ¤¹ý®, £¹ý®, ¤ºý¯, £¹ý®, ¤ºý¯, ¤ºý®, ¢ºý®.  ·ý®. Ÿ¶ý¯. Ÿ¶ý¯/ ž¶ý®/ �µý®/ œµý­6œ³ý§km¿y¦›­ØÛ0.’–¯·ŠÀ�ŒŸ›´ýŒ‹ œ³ý�ŒŸ›³ý�Œ ›´ý�ŒŸš³ýŒ‹ š²ý‹‹ ˜±ýŒ‹Ÿ™±ý‹‹Ÿ˜±ý‹‹Ÿ—±ýŠ‹Ÿ–±ý‰‹Ÿ–¯ýŠŠ ”®ý‰Š ”­ýˆŠŸ“®ýˆ‹ “®ýˆ‰Ÿ“¬ýˆ‰Ÿ‘«ý‡‰Ÿ�«ü†‰ŸŽ©ü†‰Ÿ�ªü†‰Ÿ�ªü†‰Ÿ�©ü†‰ŸŽªü†‰ŸŽ©ü‡‰žŽ©ü‹�’�ªüŸ[U�©ü­7�«ý®3 ‘«ý®3 ’¬ý¯2 •®ý®1 —°ý®1 +˜±ý®1 +—°ý®0 ™±ý®G,º„¸®qqÛ0.®H.»�³®/ �´ý®. Ÿ·ý®. ¡¸ý®- ¢¹ý®- ¤ºý®, ¤»ý®, ¥ºý®- ¥¹ý¯, ¥ºý®, ¤ºý®+ ¦»ý®+ ¨¾ý®) ­Áý®' ±Äý¯& ´Æý«B3·Éý¡}…ºÌýž’Ÿ¼ÍýŸ“ ¿Ðþ “ŸÁÐþ¡“ŸÄÑþ¡” ÃÑþ¡“ŸÃÒþ¢”ŸÅÓþ£” ÇÕþ§– ÍÙþ©—ŸÓßþ¨— ÒÝþ¨– ÑÝþ©— ÓÞþª—ŸÔßþ«™ŸØâþ¯™ Þæþ±šŸâéþ²›Ÿäëþ²š åëþ±šŸäêþ±› ãêþ±š áèþ¯™ ßçþ¯™ŸÞæþ®™ŸÜäþ®—�Ûäþ­}Úãþ¯C<Ûãþ® +Ùâþ®Øáþ®Ùâþ®Ùâþ®Øáþ®Øáþ¯Øáþ®Øâþ®Ùâþ®Ûãþ®Üåþ®àçþ¯àèþ®áéþ®âéþ®ãêþ®ãêþ®ãêþ¯äëþ®åëþ® åëÿ¯FDåëþ±„‡åëþ³› åëþ²›Ÿåìþ²› çìþ³› æìþ³› åìþ³š åìÿ³›Ÿæíþ³› çíþ³›Ÿçíþ³› çíþ´›Ÿçíþ³›Ÿçíþ´œŸèîþ´›Ÿéîÿµœ ëðÿ¶œ íñÿ·� îòÿ·� ïóÿ¸� ðôÿ¹�Ÿòõÿºž õøÿ»ž ÷ùÿ¼ž ÷ùÿ¼žŸøúÿ½žŸùúÿ½Ÿ ùûÿ¼Ÿ ùûÿ½ŸŸúûÿ½ž úûÿ½Ÿ úüÿ½ŸŸúüÿ½Ÿ úüÿ¾ŸŸûüÿ½Ÿ ûüÿ¾Ÿ ûüÿ¾ŸŸûüÿ½Ÿ ûüÿ½Ÿ ûüÿ¾Ÿ ûüÿ½Ÿ úüÿ½ž úüÿ½Ÿ ûüÿ½ŸŸûüÿ½ŸŸúüÿ½Ÿ úüÿ½Ÿ úüÿ½ŸŸúüÿ¼Ÿ úûÿ¼ž ùúÿ¼žŸ÷ùÿ»žŸöùÿºž õøÿºž õøÿºžŸô÷ÿ¹� óöÿ¹�Ÿòõÿ¸� ñôÿ¸œ ïôÿ¶� îóÿ¶œ íñÿ¶œ ëðÿµœŸêðÿ´œ éïÿ´› èîÿ³› çíÿ³›Ÿæìÿ³š æìÿ´› èíÿ´› éîÿ´›Ÿêïÿµœ ìðÿµœ ëðÿµœ íñÿ¶œŸìñÿ¸� ðôÿ–± –˜¿”¯Ÿ”—¿“® “—¿“®Ÿ“–¿“® “—¿”®Ÿ”–¿”®Ÿ”—¿”¯Ÿ”–¿”¯Ÿ”˜¿”® ”—¿”¯Ÿ”—¿”¯Ÿ”—¿•°Ÿ•˜¿•± •˜¿•± •˜¿–² –™¿—³ —š¾˜´Ÿ˜š¿˜³ ˜š¿˜´Ÿ˜™¿˜´Ÿ˜š¿˜´Ÿ˜š¿˜´ ˜™¿˜´Ÿ˜š¿˜´ ˜š¿˜´ ˜š¿˜³Ÿ˜š¿—³ —š¿—³Ÿ—™¿—³ —™¿—²Ÿ—™¿—³Ÿ—š¿–m/–6p—Z—X—Z—Y˜Z˜Y™Y™Y›Z›Y›Z›YšZšY›Z›Y›Z›Y›Z›YœZœY›Z›Y›Z›Y›Z›Y›Z›X›Z›YœZœYœZœYœZœYžZžY�Z�XžZžYŸZŸY Z Y Z Y¡Z¡X¢Z¢Y¢Z¢Y¢Z¢Y¢Z¢Y£Z£Y¤Z¤Y¤Z¤Y¤Z¤ Y¤Z¤X¤Z¤Y¤Z¤ Y¤Z¤Y£^£%_š‰dšd˜‘¨ž‘’¾�¨Ÿ�”¿�¨ �“¿�©Ÿ�”¿�¨Ÿ�“¿‘©Ÿ‘”¿‘© ‘”¿‘© ‘•¿‘ªŸ‘”¿’¬Ÿ’•¿“­ “–¿”® ”—¿”¯Ÿ”—¿”®Ÿ”—¾”® ”–¿”¯Ÿ”—¿”®Ÿ”—¿”¯Ÿ”—¿•¯ •—¿”°Ÿ”—¿•°Ÿ•˜¿–± –˜¿–² –™¿—³ —™¿˜´Ÿ˜š¿™µŸ™š¿™µ ™š¿™¶Ÿ™š¿˜´Ÿ˜š¿—²Ÿ—™¿–± –™¿•° •—¿”¯Ÿ”—¿”¯ ”—¿”® ”—¿”®Ÿ”–¿”® ”–¿“­Ÿ“•¿’«Ÿ’–¿‘ªŸ‘•¿‘ªŸ‘”¿�¨Ÿ�“¿�¨Ÿ�”¿Ž§ŸŽ“¿�Ÿ”�‰·˜‘y˜v¥¢|T¢ZŠ«k.«As±\ ±-\´Y´)Y²Y²)X±Z±)X²Y²)Y´Z´*Y´Z´*Y·Y·-Y¸Z¸.Y´a´:g­n=­K}£|_£b”–‰{–t¦‹‘“‹ƒ·o–Ðoª¾e—öe¾�˜¦��¿„—Ÿ„оƒ–ŸƒŠ¾‚•Ÿ‚‰½‚•Ÿ‚‰¾‚”Ÿ‚‰¾‚“Ÿ‚‰¾�”Ÿ�‰¾�“Ÿ�‰¾‚“Ÿ‚‰¾�“Ÿ�‰¾‚“Ÿ‚‰¾€’Ÿ€ˆ¾€‘Ÿ€ˆ¾€’Ÿ€ˆ¾€’ž€ˆ¾€‘Ÿ€‡¾€‘Ÿ€‡¾€‘Ÿ€ˆ¾€‘Ÿ€ˆ¾€�Ÿ€ˆ¾€‘Ÿ€ˆ¾€�Ÿ€‡¾‘Ÿ‡¾€‘Ÿ€‡¾€‘Ÿ€ˆ¾�‘Ÿ�ˆ¾�’ž�ˆ¾‚“ž‚ˆ¾‘Šˆ‘{®­sJ­V…¹\ ¹3]¹Z¹.Y¹Y¹.Y¹Z¹/X¹Z¹.Y¸Z¸-Y¡ZA¡UY ZB UX·Z·.X¸Y¸,Y·Z·-X¶Z¶,Y´Y´+X³Y³)Y³Y³*Y³Y³*Y³Y³)Y²Z²)Y²Z²)X´Z´)Y³Y³*Y³Y³)Y¯_¯0aŸƒcŸe–�Ÿš�Œ»�¤ �‘¿Ž¦ŸŽ“¿�¨ �”¿�¨Ÿ�“¿‘¨ ‘”¿‘© ‘”¿‘«Ÿ‘•¿’¬Ÿ’•¿“¬ “–¿“­Ÿ“–¾”®Ÿ”—¿”¯Ÿ”—¿”® ”—¿”® ”—¿”¯Ÿ”—¿•¯ •—¿–± –˜¾–² –™¿–²Ÿ–™¿—´ —š¿˜´Ÿ˜š¿™¶ ™š¿š·Ÿš›¿š¸ š›¿š· š›¿™¶Ÿ™›¿™µ ™›¿˜´Ÿ˜š¿—²�—–½—¢‚—¬–ƒP–SŠ–b–c–Y–X–Y–X–Y–X—Y—X—Y—X—Y—X—Y—X˜Y˜X˜Y˜X˜Y˜X™Y™X˜Y˜W˜Y˜W™Y™X™Y™Y™h ™+j—…V—XŽ– …–�®•¯ž•–¾–± –—¿–° –˜¿•° •—¿•° •˜¿•° •˜¿–°Ÿ–˜¿•±Ÿ•˜¿•± •˜¿–±Ÿ–˜¿–± –˜¿•°Ÿ•—¿–± –™¿–± –˜¿•² •™¿–± –™¿–²Ÿ–™¿—³ —˜¿—³Ÿ—š¿˜³Ÿ˜™¿—´Ÿ—™¿˜´ ˜š¿˜µŸ˜š¿™¶Ÿ™›¿˜µ ˜›¿™µŸ™›¿™¶ ™š¿™µŸ™š¿™¶Ÿ™›¿™¶Ÿ™›¿š·Ÿš›¿™·Ÿ™›¿š· š›¿š· šœ¿›¸Ÿ›œ¿š¸ šœ¿›¸Ÿ›�¿›¸ ›œ¿›¹ ›�À›¹ ›œÀœ¹ŸœœÀ›¹Ÿ›�À›¹ ›�Àœ¹ œœÀš¹ šœÀš¸ šœ¿š·Ÿš›¿š· š›¿š¸ šœ¿š·Ÿšœ¿™¶Ÿ™›¿™¶ ™›¿™µŸ™›¿™¶Ÿ™›¿™µŸ™š¿˜´ ˜š¿—´Ÿ—š¿˜´Ÿ˜š¿—³ —š¿—³Ÿ—™¿—² —˜¿–²Ÿ–™¿•° •˜¿–° –˜¿•°Ÿ•—¿•°Ÿ•˜¿•°Ÿ•—¿•° •˜¿•± •˜¿•± •˜¿•±Ÿ•˜¾•° •˜¿•± •—¿–± –˜¿–±Ÿ–˜¿–²Ÿ–˜¿˜´Ÿ˜š¿¬™ŸÚãþ¨— ÒÝþ¨— ÓÝþ©– ÑÝþ¨–ŸÐÜþ¨— ÑÝþ¨—ŸÑÝþ¨— ÓÝþ©— ÓÞþ©—ŸÓßþ©˜ŸÓßþª—ŸÓßþª˜ Õáþ¬˜ŸØâþ¬˜ Øãþ­™ŸÛäþ¯™ Þæþ¯™ àèþ°™ àèþ¯š áèþ°™Ÿáèþ°šŸáèþ°šŸáéþ°š áéþ°™ áéþ°šŸàèþ°š àèþ¯™ ßçþ®™ŸÞçþ¯™ Þæþ¯™ŸÞæþ¯™ŸÞæþ®6/ÝÛò®Ýäþ®Ûäþ®Úâÿ®×áþ­Ôßþ­ÔÞþ­Ôßþ®ÒÞþ®ÒÝþ®ÓÝþ®ÒÝþ®Óßþ®Óßþ®ÒÝþ®ÒÞþ®ÓÝþ­ÒÝþ®ÑÜÿ®ÐÜþ®ÎÚþ®ÍÚþ®ÌØþ®ËØþ®Ê×þ­ÉÖþ­ÉÖþ®ÆÔþ­ÆÔþ®ÆÓþ®ÄÒþ®ÃÑþ­ÁÐþ®ÁÐþ®ÁÏþ®ÀÏþ® ÁÏþ­ÀÏþ­ÁÑþ­%ÂÐþ§edÃÑþ¡’žÂÒþ¡” ÃÑþ¡“ ÄÑþ¡”ŸÄÒþ¡”ŸÃÓþ¢”ŸÅÔþ¢” ÅÓþ£” ÆÕþ¤”ŸÈÕþ¥• Ê×þ§– ÏÚþ¨—ŸÑÝþ©— ÒÝþ©— ÒÝþ©—ŸÒÝþ©— ÔÞþ©— ÒÞþ©—ŸÓÞþª—ŸÔÞþª— Öàþ«˜ Öáþ¬˜ Ùâþ­˜ŸÛäþ¯šŸÞæþ°š áèþ±› äêþ³› åëþ²š åëþ±š âéþ¯šŸÞæþ­˜ŸÛäþª˜ŸÖàþª—ŸÕßþ©— ÓÞþ¨— ÒÝþ©– ÓÝþ¨—ŸÒÜþ§–ŸÎÚþ¦•ŸËØþ£•ŸÈÖþ¢”ŸÅÓþ¡” ÃÒþ “ ÂÑþŸ’ž¾ÎþŸ‰•ºËý¢vy¶Çý§ZT±¿ø«A.©¾ý­- ¤ºý­*¢¹ý®)¤ºý®)¥¼ý®*¥¹ý­)¢¹ý®*¡¸ý®,›´ý®.™³ý«:™±þ§L=™²ýŸa_™³ý—u|˜²ýŽƒ”–¯ýŠ«ÐÁošŠÂ÷Õ@NŠ�¦�¨ñŠŠŸ–¯ý‰ŠŸ“­üˆŠŸ‘«ü‡‰Ÿ‘ªü‡‰Ÿ�ªü†‰ŸŽ©ü†‰Ÿ�©ü†‰ŸŽªü…‰Ÿ�ªü…‰ŸŒ©ý„ˆŸ‹¨üƒ‰ŸŠ¦üƒˆŸ‰¦ü„ˆŸŠ¦ü‚ˆŸ‡¥üƒˆŸˆ¤ü‚‡Ÿ‡£ü‚‡Ÿ†¤ü‚ˆŸ‡£ü‚‡Ÿ†£ü‚‡Ÿ†¢ü‚‡Ÿ…¢ü‚‡Ÿ†¢ü‚‡Ÿ†£ü‚ˆŸ†¤üƒˆŸˆ¤üƒˆŸ‰¦ü„ˆŸŒ¨ü�|‡�©ü£WJ’«ü­3 •®ý®.–¯ý®.–¯ý®.–¯ý­.—°ý­-™±ü®TAÉdˆ®VCÉb…®.›¯ø­,š³ý®-š³ý®,�´ý­* ¸ý­)£¹ý®)£¹ý®*£¹ý®)¤ºý®)¥»ý®)¥ºý­*¢¹ý®*¢¸ý®)¤¹ý¬0©½ý£db­ÀýšŒš²Æý›‘Ÿ·Èý�’Ÿ¼Íý ” ÀÐþ¡” ÃÑþ¢“ ÄÓþ¢”ŸÅÓþ£• ÇÖþ¥•ŸÊ×þ¦– ÍÙþ§—ŸÐÜþ©—ŸÓÞþ©—ŸÒÝþ¨– ÒÝþ©— ÓÞþ©—ŸÓÞþª˜ Ôàþ«˜ Øãþ­˜ŸÛäþ®™ Ýåþ¯™ àéþ±š äêþ³š åìþ³›Ÿçíþ´› éïÿ´› éïÿ³›Ÿæíþ²› äëÿ°šŸáéþ°—�áèþ¯€ƒàçþ®ROÞæþ®Þæþ®Ýæþ®Ýæþ­Ýåþ®Üäþ®Ûåþ®Ûäþ­Úãþ­Ùâþ®Ùâþ®Øâþ®Ùáþ­Øâþ­Øáþ­×áþ®×áþ®+!×áþ­XU×áþ«€…×áþ«–žØáþ«˜Ÿ×âþ«˜Ÿ×áþ«˜ ×áþ«˜ŸØáþ¬— Øáþ«˜ŸÙáþ¬˜ŸØâþ«˜ Ùâþ¬˜ŸØâþ¬˜ Øâþ¬˜ Øáþ¬˜ Ùâþ¬™ Ùãþ¬˜ Úãþ¬˜ŸÙãþ­˜ŸÜäþ­™ŸÜåþ®šŸßæþ¯™ ßçþ¯™Ÿßçþ°šŸáèþ²š äêþ²›Ÿåìþ²šŸåëþ²›Ÿæëþ²šŸåëþ²›Ÿäëþ²šŸåìþ³› æìþ³› çíþ´› èíþ´›Ÿèîþµ›ŸéïþµœŸëðþ¶œ ëðþ¶œ ìñþ¶œ ìñÿ·œ íòÿ·œ íòÿ·� ïóÿ¸œ ïóÿ·� ïóÿ¶�Ÿîòÿ¶œŸíñÿµœŸëðþµœ êðþ´œŸëïÿ´œŸéïþ´›Ÿéîþ³›Ÿçíþ²›Ÿæíþ³›Ÿçìþ²šŸåëþ±š ãêþ°š áéþ°š áèþ¯™Ÿßçþ¯™ Þæþ®™ŸÝåþ®™ Üäþ­˜ŸÛäþ­˜ŸÙâþ¬—ŸØáþ«— ×âþ«˜Ÿ×áþ«˜ŸØáþ«—ŸØáþ«˜ Øáþ«˜ ×áþ«˜Ÿ×áþ«˜Ÿ×áþ¬—ŸØáþ¬™ Úäþ­™ŸÜãþ­˜ŸÚãþ±šŸâèþ“­ “–¿‘ªŸ‘”¿‘ª ‘”¿’« ’•¿“¬ “•¿“®Ÿ“–¿”¯Ÿ”—¿”¯Ÿ”—¿“®Ÿ“—¿”®Ÿ”—¿”¯Ÿ”—¿”¯ ”—¾–°Ÿ–˜¿–±Ÿ–™¿—²Ÿ—™¿˜µŸ˜š¿™µ ™š¿š· š›¿™¶Ÿ™›¿™¶ ™š¿™¶Ÿ™š¿™· ™›¿™¶ ™š¿™¶ ™›¿™¶ ™›¿˜µŸ˜›¿˜µŸ˜š¿™µŸ™›¿˜µŸ˜š¿™´ ™š¿˜´ ˜š¿˜´Ÿ˜š¿–’g–gš•X•W•X•W•W•W•X•X•X•W–X–X–X–X—X—X—X—W˜X˜W˜X˜W˜X˜W—X—X˜X˜W˜X˜W™X™WšXšWšXšV›X›W›X›V›X›W›W›WœXœW›X›V›X›W›X›W›W›V›X›WœXœVœXœV�W�WžXžWžZžY�h!�0k�yA�H€›‚S›WŒšŒcše—™•s™r¡–£Œ–‡³“¬ž“•¿“­Ÿ“–¿“¬ “–¿“­Ÿ“–¿“­Ÿ“–¿”­ ”—¿“­ “–¿“­ “—¿”®Ÿ”—¿”® ”—¿”¯ ”—¿”®Ÿ”—¿”¯ ”˜¿”® ”–¿”¯ ”—¿”°Ÿ”˜¿”°Ÿ”˜¿•°Ÿ•˜¿•°Ÿ•˜¿•±Ÿ•˜¿–± –˜¿–² –™¿—² —š¿—³ —š¿˜´Ÿ˜š¿˜µ ˜š¿™µŸ™›¿šµ š›¿™¶Ÿ™›¿™µŸ™š¿˜´Ÿ˜™¿˜³Ÿ˜š¿—²Ÿ—™¿–²Ÿ–™¾•± •˜¿•°Ÿ•˜¿•¯ •—¿”¯ ”—¿”® ”—¾”® ”—¿”¯Ÿ”—¿“­Ÿ“–¿‘ª ‘”¿‘ª ‘”¿�©Ÿ�”¿�¨Ÿ�“¿Ž¦ŸŽ’¿�¤Ÿ�’¾ŒŸœŒ�¼Ž˜“Ž…¶“Žƒ“y«˜Šv˜r£œ†oœkŸžƒižhš�„n�i�›…t›n¢”‰}”v¨��Ž�€³ˆ”˜ˆ‡¹„–ž„о„—Ÿ„‹¿„—Ÿ„о„–Ÿ„оj–Õj®¿m•Ím§¾‚”Ÿ‚‰¾�“Ÿ�‰¾€’Ÿ€ˆ¾�’Ÿ�ˆ¾€’Ÿ€ˆ¾€‘Ÿ€ˆ¾€‘Ÿ€‡¾€’Ÿ€‡¾€’Ÿ€ˆ¾€‘Ÿ€ˆ¾€‘Ÿ€ˆ¾€‘Ÿ€ˆ¾€‘Ÿ€‡¾€‘Ÿ€ˆ¾€’Ÿ€ˆ¾€’Ÿ€ˆ¾�’Ÿ�ˆ¾�‘Ÿ�ˆ¾€‘Ÿ€ˆ¾€’Ÿ€ˆ¾�’Ÿ�ˆ¾�“Ÿ�ˆ¾�’Ÿ�ˆ¾‚’Ÿ‚‰¾‚“Ÿ‚ˆ¾�“Ÿ�‰¾‚”Ÿ‚‰¾ƒ•Ÿƒ‰¾„–Ÿ„о„— „Š¿…—ž…н�ŽŠ�}±¦xW¦\޵_µ7e¸W¸+V¹X¹,W·X·-WžXJžYW³W ³0V¸W¸+V·X·*V·W·*VµWµ(W³W³'V²X²&W²X²'W²W²&V²X²&W²W²&V±W±&W°W°$V®X®$W£wF£Pƒ“œŒ“„²Ž§ŸŽ“¾�¨Ÿ�“¿�¨Ÿ�”¿‘©Ÿ‘”¿‘« ‘•¿“­Ÿ“–¿“® “–¿“®Ÿ“—¿”®Ÿ”—¿”¯Ÿ”—¿•¯ •—¿”¯Ÿ”—¿”°Ÿ”˜¿•¯Ÿ•˜¿•°Ÿ•˜¿•° •˜¿–±Ÿ–˜¿–± –™¿–³ –™¿—²Ÿ—™¿—³Ÿ—™¿˜µ ˜š¿˜µŸ˜š¿˜µŸ˜›¿™¶ ™š¿š· š›¿š·Ÿšœ¿š· šœ¿š· š›¿š· šœÀ™¶Ÿ™›¿™¶Ÿ™š¿˜µŸ˜š¿˜¯•˜’¹—Ÿz—y¦–ˆV–WŽ•w8•>z”a”a”X”W’W’ V’W’ V’V’ V’W’ V‘W‘ W“_“^”o+”2q–�I–M†—“h—iš˜¥ƒ˜‚¬˜±™˜•»˜´ ˜š¿—µ —š¿˜´ ˜š¿—´ —š¿—³ —™¿—³ —™¿˜´ ˜š¿—³ —™¿—³Ÿ—™¿—³Ÿ—™¿—³ —™¿—³ —š¿—³Ÿ—š¿—³ —™¿—³ —™¿—³ —™¿—²Ÿ—™¿—³Ÿ—™¿—²Ÿ—š¿—³ —š¿–² –˜¿–± –˜¿–° –˜¿•°Ÿ•˜¿•¯Ÿ•˜¿”° ”—¿”¯Ÿ”—¿•¯ •˜¿•± •˜¿–²Ÿ–™¿—²Ÿ—˜¿—² —™¿—²Ÿ—™¿–±Ÿ–˜¿–²Ÿ–™¿—³ —™¿—³ —™¿—³Ÿ—™¿—³ —™¿—³ —š¿—³ —™¿—³ —™¿—³Ÿ—™¿—³ —™¿—³ —™¿—³Ÿ—™¿—³Ÿ—™¿—³ —™¿˜³ ˜™¿˜´ ˜™¿—´ —š¿—´ —™¿˜´ ˜š¿˜´Ÿ˜š¿—´Ÿ—™¿—³Ÿ—š¿—³Ÿ—š¿—³ —™¿—´ —™¿—´Ÿ—™¿˜´Ÿ˜š¿˜³Ÿ˜™¿—³ —š¿—´ —š¿˜´Ÿ˜š¿˜´Ÿ˜š¿—´ —š¿˜µŸ˜š¿˜µŸ˜š¿˜´ ˜š¿˜´ ˜š¿˜´ ˜š¿˜µŸ˜š¿™µŸ™š¿˜µŸ˜š¿˜µŸ˜š¿˜´ ˜›¿˜´Ÿ˜™¿™¶ ™š¿§–ŸÏÛþ£•ŸÆÔþ£• ÉÖþ¤•ŸÉÖþ¥–ŸÌØþ§– ÐÛþ¨—ŸÓÝþ©— ÓÞþ©— ÒÝþ©— ÒÝþª—ŸÓßþ©— ÔÞþ«˜Ÿ×áþ­™ŸÚãþ®™ŸÞæþ±š âéþ²šŸæìÿ´›Ÿèíþ³›Ÿæìþ³› æíþ³š æìþ³›Ÿæíþ³› æìþ²šŸçìþ²š äëþ±š äëþ²šŸäëþ²› äëþ±šŸãêþ²šŸãêþ°šŸâéþ°šŸáèþ¯ggàçþ®ßçþ­ßçþ­ßçþ®ßçþ®Þæþ®Ýæþ®Ýåþ®Ûäþ®Ûäþ­Úãþ­Úãþ®Úãþ­Úãþ­Úãþ®Ùâþ®×áþ®Öáþ®Ößþ®Ôßþ®Ôßþ­ÓÞþ­Óßþ®ÒÝþ­Óßþ­ÓÞþ®ÒÝþ®ÒÝþ®ÒÝÿ®ÓÝþ®ÑÝþ®ÐÜþ®ÏÚþ®ÍÙþ­/!ÌØþ¬HAËØþ«XSËØþ¬ecÌÙþ«rrÍÚþ©‡�ÏÛþ¦•ŸÎÚþ§–ŸÎÚþ§– ÎÛþ§– ÏÛþ§— ÏÛþ§–ŸÐÛþ§– ÐÛþ¨—ŸÐÝþ¨–ŸÑÝþ©— ÒÝþ©— ÓÞþª— Ôßþ©˜ŸÔÞþ©—ŸÒÝþ©—ŸÓÞþ©˜ŸÔßþª˜ Õàþª˜ Öàþ«˜ŸÖàþ¬˜ Øãþ­˜ŸÚãþ®™ Ûäþ®™ŸÝæþ¯š ßçþ±™ áèþ±šŸãêþ²š åëþ²›Ÿæìþ³š æìþ²›Ÿäëþ°šŸâéþ¯™Ÿßçþ­™ Ûäþ¬™ Úãþ«˜ Øãþ«˜ Öàþ©—ŸÔÞþ©—ŸÓÞþ¨— ÑÝþ©— ÒÝþª—ŸÔÞþ§– ÏÛþ¤• ÉÖþ¢• ÆÔþ¢“ŸÅÒþ¡” ÃÒþŸ“ ¿Îþ›‘ ·Êý˜�›¯Äý–†”¨½ý˜zƒ¢¸ý�qv¤»ýŸko¥ºý gi¤ºýžjn ·ý›nt›´ý–v}š³ý‘€Žš²ýއ˜˜±ý‹Šž—¯ý‹‹Ÿ—¯ýŠ‹Ÿ–¯ýŠŠ •®ý‰­ÕÄf’‡¨Í¼p †‰žŽ©ü…‰Ÿ�©ü„ˆŸ‹¦ü„ˆŸ‰¥üƒˆŸˆ¤üƒ‡Ÿ‡¥ü‚ˆŸ†¤ü‚ˆŸ†¤ü‚ˆŸ†¤ü‚ˆž†¤ü‚ˆŸˆ¤üƒˆŸˆ¤ü‚ˆŸˆ¤ü‚ˆŸˆ¤üƒˆŸ‰¥üƒˆŸˆ¦ü„ˆŸ‰¦ý„ˆŸ‰¥ü„ˆŸŠ¦ü„ˆŸ‰¦ü„ˆŸ‰§ü„‰Ÿ‹§ü„ˆŸ‹¦ü…ˆŸ‹¦ü…ˆŸŒ§ü†ˆŸ�¨ü†‰Ÿ�ªü‡Šž‘¬üŠŠŸ”­üŠŠŸ—¯ý‹Šž—°ý’}‰—°ý¡\W–¯ý¬7–¯ý­,–¯ý®,–°ý­-š­÷­ZKÍSn®0 ¢¦ì®*˜±ý­*™²ý­*š³ý­(žµý­'£¸ý­&£¹ý­&£¹ý®&¤ºý­&¥ºý®%¤ºý­&¥»ý­$©½ý®$®Áý¨PF³Æý …ŒºËýž“ž¾Îþ “ŸÂÐþ¡” ÃÒþ¢”ŸÅÓþ¤•ŸÈÖþ§– ÎÚþ¨— ÐÜþ¨—ŸÑÝþ©— ÒÝþ©— ÓÞþ©— Óßþª— ÓÞþª— Ôßþª˜ŸÕßþª—ŸÖàþ«˜ ×áþ«˜ Øâþ­˜ŸÚäþ®˜ŸÜåþ®™ Ýåþ¯šŸßçþ°šŸâéþ²š äêþ²› äëþ³š æìþ³œŸçîþ´› éîþ´› éïÿ´›Ÿéîÿ´›Ÿèîÿ³› æìþ²› äëþ±›Ÿâêÿ±‘–áéþ¯yzáéþ¯XVáéþ¯>8áéþ®áèþ­áéþ­ãêþ­ åëþ­ äëþ­ äëþ­ äìþ­ãëþ®2,ãêþ¯MIâêþ°igâéþ±‚ƒãêþ±•™âéþ°™ áéþ°šŸáéþ°š áéþ¯š àèþ¯šŸßçþ°š ßçþ¯™Ÿßçþ®™ŸÞæþ¯™ŸÞæþ¯™ Þæþ®™ Ýæþ®™ Þçþ¯šŸßçþ¯š ßçþ°™Ÿßçþ®™ Þçþ®™Ÿßæþ¯™ŸÞçþ®™ŸÝæþ®™ŸÝçþ®™ŸÜäþ¬™ Ùãþ¬˜ŸÙáþ«˜ŸÖàþ«˜ŸÕáþª˜ŸÕßþª— Õßþ«˜ŸÖàþ«˜ŸØáþ¬˜ŸÚãþ­™ Ûäþ¯™ŸÞåþ®˜ŸÝæþ¬˜ŸÛãþ®˜ŸÛäþ­™ŸÜåþ®™ŸÞåþ¯™ŸÞæþ¯™ Þçþ¯™ŸÞçþ¯šŸàçþ¯™ Þæþ¯™ŸÝæþ®™ Ýåþ¯™ŸÞæþ¯™ Þæþ¯™ŸÞæþ¯™Ÿßæþ¯™ àèþ¯š ßçþ°šŸàçþ°™Ÿàèþ°šŸàèþ°š àéþ°™ ßçþ°™ ßçþ®™ŸÞçþ¯š Þçþ¯™ ßçþ°™ àèþ°™ àèþ°šŸàéþ¯š ßçþ°šŸßçþ°š áèþ±™ áéþ°š âéþ°šŸâéþ±šŸâéþ±šŸâêþ±šŸãêþ±›Ÿãêþ±›Ÿãêþ±š ãêþ±šŸäêþ±šŸãêþ±š âêþ±šŸâéþ³› æìþ‘ª ‘•¿Ž¦ŸŽ’¿�§Ÿ�“¿�¨Ÿ�”¿�© �”¿‘© ‘•¿‘«Ÿ‘•¿“­Ÿ“–¿”®Ÿ”–¿”® ”–¿”¯ ”—¾”°Ÿ”˜¿—²Ÿ—™¿˜´Ÿ˜š¿™¶Ÿ™š¿š¶ š›¿˜µ ˜š¿—´Ÿ—š¿—³ —™¿—³Ÿ—™¿–²Ÿ–™¿–²Ÿ–™¿–²Ÿ–˜¿–± –™¿–± –˜¿•°Ÿ•˜¿–² –˜¿—² —™¿˜´Ÿ˜š¿˜³ ˜™¾™µ ™š¿™µ ™›¿™³œ™—½—„L—P‡‘W‘ V’V’ U“W“ V’V’ U”V”U•V•U•W•U–W–V—W—V–V–U•V•U”W”U”W”V“V“ V’W’ U’V’ U’W’ V’V’ U‘V‘ V’V’ V”V” V“V“ V”V” V”V”U•V•V•W•V•W•U–h –)j—�K—O‡˜“g˜i𙡙©˜­”˜�·–±›––¼—²Ÿ—™¾—³ —™¿—² —™¿—³Ÿ—š¿—³ —š¿˜´ ˜š¿—´ —™¿—´Ÿ—š¿—´Ÿ—™¾˜´Ÿ˜š¿˜´ ˜™¿—´ —š¿˜³Ÿ˜š¿˜´Ÿ˜™¿—´ —™¾—´Ÿ—™¿˜´Ÿ˜š¿˜´Ÿ˜š¿˜µ ˜š¿™´Ÿ™›¿˜µ ˜š¿˜µ ˜š¿˜µ ˜›¿˜µŸ˜›¿˜µŸ˜›¿™µŸ™š¿˜¶ ˜š¿™¶Ÿ™š¿™¶Ÿ™›¿™¶ ™›¿˜¶ ˜›¿š· š›¿™· ™›¿™¶Ÿ™›¿™¶ ™›¿™µ ™š¿—´ —š¿–² –˜¿–±Ÿ–™¿–° –˜¿•¯Ÿ•˜¾•¯Ÿ•—¿”®Ÿ”—¿”® ”—¿”¯ ”—¿”¯ ”—¿’¬ ’–¿‘© ‘”¿‘©Ÿ‘”¿�¨Ÿ�“¿�¨ �“¿�¥Ÿ�’¾�£Ÿ�‘¿‹¡Ÿ‹�¾‰�Ÿ‰Ž¿‡›Ÿ‡�¿‡œŸ‡�¿‡�Ÿ‡Ž¿ˆœŸˆŽ¿†›Ÿ†�¿…™Ÿ…Œ¾…˜Ÿ…Œ¿…˜Ÿ…Œ¿„˜Ÿ„‹¿„— „‹¿…—Ÿ…‹¿„˜ „Œ¿…—Ÿ…‹¾k–×k¯¾|•¬|“¾ƒ–ŸƒŠ¾ƒ–ŸƒŠ¾„–Ÿ„о„–Ÿ„о„– „Š¿ƒ—ŸƒŠ¿„—Ÿ„оƒ–ŸƒŠ¾ƒ–ŸƒŠ¿ƒ–ŸƒŠ¾„–Ÿ„оƒ•Ÿƒ‹¿ƒ•ŸƒŠ¾ƒ• ƒŠ¾ƒ–ŸƒŠ¾ƒ–ŸƒŠ¾‚•Ÿ‚о‚”Ÿ‚о�”Ÿ�‰¾�’Ÿ�‰¾�’Ÿ�ˆ¾€’Ÿ€ˆ¾€‘Ÿ€ˆ¾€‘ž€‡¾€‘Ÿ€‡¾€‘Ÿ€ˆ¾‘Ÿ‡¾€�Ÿ€‡¾€‘Ÿ€‡¾€‘Ÿ€ˆ¾�‘Ÿ�ˆ¾‚“Ÿ‚‰¾‚•Ÿ‚—‰†¹™†w™q¤©sK©T†¯]¯:`¯V¯3T·V·(T¶V¶'U´V´%U²V²$U²V²$U³V³$T²V²$U°V°"U¬V¬ U©V©U§V§U¥Y¥ Y xE Mƒ–˜‚–|«‘§ž‘’¾�©Ÿ�“¿‘©Ÿ‘”¿‘ª ‘•¿‘«Ÿ‘•¿’¬Ÿ’•¿”®Ÿ”—¿”¯Ÿ”—¿”¯ ”—¿”® ”–¿”®Ÿ”–¿”®Ÿ”—¿”¯Ÿ”—¿”¯Ÿ”—¿”¯Ÿ”—¿•¯ •—¿•° •—¿•°Ÿ•˜¿–±Ÿ–˜¿–²Ÿ–˜¿—³ —™¿—³ —™¿˜´ ˜™¿˜µ ˜š¿˜µŸ˜š¿™¶Ÿ™›¿˜¶Ÿ˜š¿™·Ÿ™›¿™·Ÿ™›¿™¶Ÿ™›¿š· š›¿™·Ÿ™œ¿š·Ÿš›¿š·Ÿš›¿š·Ÿšœ¿š· š›¿š· š›¿š·Ÿš›¿š¶žšš¾š³šš–¼™±–™’¸˜ªŠ˜‡±—¥„—�¬˜¦…˜‚®—©Š—‡±˜®”˜�¸˜°™˜”»—²œ—–½—² —š¿—²Ÿ—˜¿–±Ÿ–˜¿–²Ÿ–™¿–±Ÿ–˜¿•° •˜¿•° •˜¿”° ”—¿”° ”˜¿“®Ÿ“—¿“¯Ÿ“–¿“®Ÿ“—¿“­ “–¾’¬ ’–¿’¬Ÿ’•¿‘« ‘•¿‘« ‘•¿‘« ‘”¿‘© ‘”¿�¨ �”¿�§ �“¿Ž¥ŸŽ’¾Ž¥ Ž‘¾�¤Ÿ�’¿�£Ÿ�‘¿�£ �‘¿Œ¢ŸŒ�¾Œ¢ŸŒ‘¾Œ¢ŸŒ�¿Œ¢ŸŒ‘¾‹¢ ‹�¿Œ£ŸŒ‘¾Œ£ŸŒ’¾Œ¤ Œ‘¾Ž¦ŸŽ’¾�§Ÿ�”¿�©Ÿ�”¿‘ªŸ‘”¿‘«Ÿ‘•¿’¬Ÿ’•¿’¬ ’–¿’«Ÿ’–¿“¬ “•¿“¬Ÿ“–¿’¬Ÿ’–¿“­Ÿ“–¿“­Ÿ“—¿“­ “–¿”® ”—¿”® ”—¿“®Ÿ“–¿“® “—¿”­ ”—¿”® ”—¿”­Ÿ”–¿”­ ”–¿”®Ÿ”—¿“® “–¿“®Ÿ“–¿“­Ÿ“–¾”­ ”–¿“­ “—¿”® ”—¿“®Ÿ“—¿”­Ÿ”–¿”®Ÿ”—¿“® “—¿”® ”—¿”¯Ÿ”—¿”¯Ÿ”—¿“®Ÿ“–¿”® ”—¿”¯ ”—¿”® ”—¿”¯ ”—¾”¯ ”—¿”¯ ”˜¿•°Ÿ•˜¾”°Ÿ”—¿•° •˜¿•°Ÿ•˜¿•° •—¿—³Ÿ—™¿£”ŸÈÕþž’Ÿ½ÍþŸ“Ÿ¿Ðþ “ ÁÐþ¡”ŸÅÓþ£”ŸÆÔþ¤• Ê×þ§–ŸÏÛþ¨–ŸÒÝþ©—ŸÒÝþ©— ÓÞþª˜ Õàþ­™ Ûäþ°šŸáèþ²›Ÿåìþ³›Ÿçíþ²šŸäëþ°šŸáèþ¯š Þçþ¯™ŸÞçþ®šŸÝæþ­™ Ûäþ¬˜ Ûãþ¬˜ Ùâþ«—ŸÙáþ¬˜ŸØâþ­˜ŸÛãþ®™ŸÝåþ°šŸàèþ°š âèþ²šŸãëþ²› äêþ²—›åëþ±QKåìþ® åëþ­ äêþ­ ãêþ­ âêþ­àçþ­ßæþ­Üåþ®Úãþ­Úãþ­Ûäþ­Ýåþ­Þæþ­ àèþ­ âéþ® ãêþ­ ãêþ­ äêþ® äëþ­ äêþ® ãêþ® áêþ®áéþ­ àèþ­ßçþ­Þçþ­Þæþ­Þæþ­)Ýæþ¯OKÞæþ¯hgÝçþ¯~Ýæþ¯�”Ýæþ®–›Ýåþ®™žÝåþ®™ŸÞåþ¯™ Ýåþ¯™ Ýæþ¯™Ÿßçþ¯š ßçþ°™Ÿßçþ¯™ ßçþ°™Ÿáèþ¯šŸàèþ°š àéþ°š àèþ°š àèþ°š àèþ°š àèþ¯šŸàéþ°šŸáéþ±š âéþ±šŸäêþ²šŸãêþ±š âéþ±š ãêþ±š ãëþ±›Ÿäëþ±› äëþ²šŸäëþ²š äëþ²šŸåëþ²› åìþ²šŸåìþ²›Ÿåìþ´›Ÿçîþ³›Ÿèíþ³› çíþ³›Ÿæìþ²› åëþ¯™Ÿàèþ®™ Üäþ­™ Ùãþ«˜ ×áþ©—ŸÔàþ©—ŸÓÞþ©–ŸÒÝþ¨—ŸÑÝþ©—ŸÔÞþ©—ŸÒÝþ¥•ŸËØþ£• ÇÕþ¡” ÄÓþ¡”ŸÃÑþ “ ÂÐþ�’Ÿ¼Ëý™‘Ÿ¶Çý–�Ÿ®Âý’ŽŸ¦»ý��Ÿ¢¸ý‘�Ÿ¤ºý‘Ž ¥ºý‘�Ÿ£ºýŽŒ Ÿ¶ýŒŒŸš´ýŒ‹ ™±ýŒ‹Ÿ˜±ýŠŠŸ–°ý‹ŠŸ–°þ‹‹Ÿ˜±ýŒ‹Ÿ˜±ýŠŠŸ–°ýН×Çe�ˆ’¬¡›á‰ŠŸ”®üˆŠŸ“­üˆŠŸ“­ý‰ŠŸ”®ý‰‹ ”¯ý‰‹Ÿ•¯ý‰ŠŸ•®ý‰‹Ÿ“®ýˆŠŸ”­ý‰ŠŸ“­ý‰ŠŸ”­ý‰ŠŸ“­ý‰‹Ÿ•­ý‰ŠŸ•®ýˆŠ “­ýˆŠŸ’­ü‡ŠŸ‘¬ü‡‰Ÿ�ªü…‰Ÿ�ªü…‰Ÿ‹¨ü„ˆŸ‰¦üƒˆž‰¥ü‚‡ž‡£ü‚‡Ÿ†¤ü‚‡Ÿ†£ü‚‡Ÿ‡£ü‚ˆŸ†£ü‚ˆŸ‡¤ü‚ˆŸ‡£üƒ‡ž‡¤üƒˆŸ‰¦ý…ˆŸŒ¨ü‡‰Ÿ‘¬üކ—–¯ý˜qx–¯ý¢TK–¯ý«;¢ ä­4©šÚ­'š²ý­(›³ý­% ¸ý­$£¹ý­#¤»ý­%£¹ý­$¥ºý­"©½ý­¯Âý­¶Æý®ºÊý¬ ¼Íþ©ME¾Ïþ¤|�ÁÑþ¡“žÃÑþ¡” ÄÒþ¢• ÆÓþ£•ŸÆÔþ£•ŸÈ×þ¥– ÌØþ¨—ŸÑÝþ©— ÔÞþ¨—ŸÒÞþ©—ŸÒÝþ¨– ÑÜþ©— ÓÝþ©—ŸÔàþ©—ŸÓÞþª— Óßþª˜ Ôßþ«—ŸÖàþ«˜ Øáþ¬˜ŸØâþ­™ŸÜåþ¯™ŸÞæþ¯™Ÿßæþ°š áèþ±š ãêþ²›Ÿäêþ²› äëþ²› åìþ³› æíþ³› çîþ³› çíþ´› èîþ´›Ÿèîþ´›Ÿèîþµ› éîþµ› éîþ´œŸèîþ´› èîþ´›Ÿèîþ´™�èîþ´–›èîþ³’–èîþ³‡Šéîþ±�„æíþ±‚†åìþ±‡Šäëþ°�•ãêþ°”™áéþ¯–œáèþ¯™ŸÞæþ®™ŸÜåþ¬˜ŸÚãþ¬™ŸÙãþ¬˜ Ùâþ«˜ ×âþ«˜ŸÖàþ«˜ Õàþ©˜ŸÔßþ¨– ÒÝþ©— ÒÝþ§—ŸÑÜþ¦– ÍÚþ¥– ÌØþ¥•ŸÊ×þ¤•ŸÉÖþ¤•ŸÉÖþ£• ÈÖþ£”ŸÆÓþ¡”ŸÄÒþŸ“ ¿Ïþ�’Ÿ¼Ìýœ’ŸºÊýœ’Ÿ¹Éý›‘Ÿ¸Èý›‘Ÿ¶Çýš‘ µÆýš‘ŸµÇý™� ´Åý˜‘Ÿ³Åý™�Ÿ´Æýš‘ŸµÇý›‘Ÿ·Èý›‘ ¸Èýž“Ÿ¾Íý ”ŸÁÐþ¡” ÃÒþ£•ŸÇÔþ¤•ŸÉÖþ¥–ŸË×þ¥• ËØþ¦• ÌØþ¦–ŸÍÙþ§– ÎÚþ§– ÏÚþ§–ŸÏÛþ¨— ÐÜþ¨—ŸÑÜþ¨– ÑÜþ¨–ŸÑÜþ¨— ÐÜþ§– ÐÜþ§— ÐÝþ§— ÐÜþ©— ÑÜþ¨—ŸÑÜþ¨— ÑÜþ§–ŸÐÜþ§—ŸÐÜþ¨–ŸÐÜþ¨– ÐÜþ¨– ÑÜþ§—ŸÐÜþ§— ÐÜþ¨—ŸÐÜþ§— ÐÜþ¨– ÐÜþ¨—ŸÑÝþ¨– ÑÝþ¨— ÑÝþ¨–ŸÒÝþ©— ÓÝþ©— ÓÞþ©— ÓÞþª—ŸÓÞþª— ÔÞþª—ŸÕàþª˜ŸÕàþª—ŸÕàþ«˜ŸÖàþ«˜Ÿ×áþ¬˜Ÿ×áþ®™ŸÞæþŒ£ Œ‘¿ˆœŸˆ�¿ˆœŸˆŽ¾‰ŸŸ‰�¾‹¢Ÿ‹�¾Ž¥ŸŽ’¿�¨Ÿ�”¿�© �”¿’« ’•¿“­Ÿ“–¿”¯Ÿ”—¿”®Ÿ”—¿•°Ÿ•—¿–³Ÿ–™¿™µ ™š¿š¶ š›¿˜µŸ˜š¿—´ —š¿—³ —™¿—² —™¿–± –˜¾•° •—¿”®Ÿ”—¿•°Ÿ•˜¿—²Ÿ—™¿™µ ™š¿š·Ÿš›À›¹ ›�ÀœºŸœ�À�¼ �žÀž¼ žžÀž¾ žŸÀž½ žŸ¿�½ž�ž¾š¬…š…®”šj”iœ“•b“b–“‘_“^”“Ž[“[’’�W’Y�“ŠT“U�”…L”O‡•z=•B}—q.—6t—j —+k˜b˜!b–\ –\—Y—Y—X—Y—X—X˜X˜W–W–W–X–X•Y•X•Z +•\•c•#f•o/•5t•�M•N‡–�a–`•–›y–w¥–©�–‹µ–±ž–—¾–²Ÿ–˜¿–²Ÿ–™¿–±Ÿ–™¿•± •˜¿–± –˜¾–±Ÿ–˜¿–±Ÿ–™¿–± –˜¿–± –™¿–² –˜¿–² –™¿–±Ÿ–™¿—²Ÿ—™¿—³Ÿ—™¿–²Ÿ–˜¿–²Ÿ–™¿–² –™¿–±Ÿ–˜¿–±Ÿ–˜¿–± –™¿–± –™¿—² —˜¿–² –™¿—² —™¿—³ —™¿—³Ÿ—™¿—³ —™¿—³Ÿ—š¿—³Ÿ—™¿—´Ÿ—™¿˜³ ˜™¿˜µŸ˜š¿˜µŸ˜š¿˜´Ÿ˜š¿˜µ ˜š¿˜µŸ˜š¿˜´ ˜š¿™¶Ÿ™›¿™¶Ÿ™›¿™· ™›¿š· š›¿˜µ ˜š¿—³Ÿ—™¿–± –™¿•¯Ÿ•˜¿”¯Ÿ”—¿”® ”—¿”¯ ”–¿”® ”–¿”¯ ”—¿”® ”–¿’¬ ’–¿’« ’•¿�ªŸ�•¿�©Ÿ�”¿�©Ÿ�“¿�¦ �’¿�¥Ÿ�’¾‹¢ ‹‘¾ŠŸŸŠ�¿ˆ�Ÿˆ�¾ˆ�Ÿˆ�¿‡œŸ‡�¾ˆœŸˆ�¾‡› ‡�¿†šŸ†Œ¾†šŸ†Œ¿…™ …Œ¾…˜Ÿ…‹¾…— …‹¾„˜Ÿ„‹¿„—Ÿ„Š¿ƒ— ƒ‹¾q—Èq¥¾„— „‹¾„—Ÿ„‹¾…˜Ÿ…‹¿…˜ …‹¾„˜Ÿ„‹¾„— „‹¾„˜Ÿ„‹¿„˜Ÿ„‹¾„˜ „‹¾„—Ÿ„‹¾„˜ „‹¿„˜Ÿ„‹¿…—Ÿ…‹¿…—Ÿ…‹¾„—Ÿ„‹¿„˜Ÿ„‹¿„—Ÿ„Š¿„—Ÿ„‹¾„— „‹¿„—Ÿ„‹¾ƒ— ƒ‹¿ƒ–ŸƒŠ¾‚•Ÿ‚о‚”Ÿ‚о‚“Ÿ‚‰¾‚“Ÿ‚‰¾€’Ÿ€ˆ¾�‘ž�ˆ½�’Ÿ�ˆ¾€‘Ÿ€ˆ¾�’Ÿ�ˆ¾�’Ÿ�ˆ¾‚“Ÿ‚ˆ¾‚”Ÿ‚о„–Ÿ„‹¾„—Ÿ„‹¿…—Ÿ…‹¿‡—�‡Š½�އ�|®š†qšn ¡{Y¡]�¥sH¥P…©i/©@s¬d#¬8l«a«5h§f&§8m¢o7¢Cz�{P�SŠ™‡b™b–•–~•y©‘£—‘Œ¹�¨Ÿ�“¿‘© ‘”¿‘© ‘”¿’«Ÿ’•¿“­Ÿ“–¿”®Ÿ”—¿”¯Ÿ”—¿”¯ ”—¿”® ”—¿“¯ “—¿”® ”—¿“®Ÿ“—¿•°Ÿ•—¿”¯ ”—¿•®Ÿ•—¿”¯ ”—¿”¯Ÿ”—¿”° ”˜¿•°Ÿ•—¿•°Ÿ•—¿•± •˜¿–²Ÿ–˜¿—± —˜¿–³ –˜¿—³ —™¿˜µŸ˜š¿™µŸ™š¿™¶ ™›¿š¶Ÿš›¿™¶Ÿ™›À™¶ ™›À™· ™›¿™· ™›Àš¶Ÿš›¿™¶Ÿ™›¿™· ™›¿™¶Ÿ™›¿™¶Ÿ™›¿™¶Ÿ™›¿š· š›¿™·Ÿ™›¿™¶ ™›¿š¶ š›¿™¶ ™›¿™¶Ÿ™›¿™µŸ™›¿˜´ ˜š¾˜³ ˜š¿—³Ÿ—š¿–± –˜¿•± •˜¿”° ”—¿”¯ ”—¿”®Ÿ”—¿”® ”—¿”®Ÿ”—¿“­ “–¿’«Ÿ’–¿�ªŸ�”¿‘© ‘”¿�¨ �”¿�§Ÿ�“¿�¥Ÿ�’¾�£Ÿ�‘¿Œ¢ŸŒ�¿Š ŸŠ�¾‰žŸ‰�¿ˆ�ŸˆŽ¾‡œŸ‡�¾‡œŸ‡�¾‡œŸ‡Ž¿‡œŸ‡Ž¾ˆœŸˆŽ¿ˆœŸˆŽ¿ˆœŸˆ�¿‡œ ‡�¾‡œŸ‡�¿‡›Ÿ‡�¿‡šŸ‡Œ¿‡šŸ‡Œ¿†™Ÿ†Œ¿‡›Ÿ‡�¿‡œŸ‡�¾‡œŸ‡�¾‡œ ‡�¾ˆ�Ÿˆ�¾ˆ�Ÿˆ�¿‰� ‰Ž¿‰ŸŸ‰�¿‹ Ÿ‹�¿‹¢Ÿ‹�¿Œ£ŸŒ‘¾Œ£ŸŒ�¿Œ£ Œ‘¿�£Ÿ�‘¾�¤Ÿ�‘¾�¤Ÿ�‘¾�£Ÿ�‘¿�£Ÿ�‘¾�£Ÿ�‘¾Œ¢ŸŒ‘¿Œ£ŸŒ‘¿Œ¢ŸŒ�¿Œ¢ŸŒ�¿‹¢ ‹�¾‹¢Ÿ‹‘¾Œ¡ŸŒ�¾‹¢Ÿ‹�¿‹¡ ‹�¾Š¡ŸŠ�¿‹¡ ‹�¿‹¡Ÿ‹�¾‹¡Ÿ‹�¿‹¡Ÿ‹�¿Œ¢ Œ�¿Œ¢ŸŒ�¿Œ¢ Œ�¾Œ¢ŸŒ‘¾�£ �’¿�¥Ÿ�’¾Ž¦ Ž“¾Ž§ŸŽ“¿�¨Ÿ�“¿�¨Ÿ�”¿�©Ÿ�”¿�©Ÿ�”¿‘ª ‘•¿‘ª ‘•¿’«Ÿ’•¿’«Ÿ’–¿“« “–¿’¬Ÿ’•¿”¯ ”—¿™‘Ÿ´Æþ‘Ž £¹ý‘�Ÿ£ºý”ŽŸ©¾ý™‘Ÿ²Åý�’ ¼Ëý¡“ŸÂÑþ¢”ŸÅÒþ¤•ŸÉÖþ§– ÑÜþ©– ÒÝþ©— ÓÞþ«˜ Öàþ®™ Üåþ²š äêþ³šŸæìþ²š ãêþ°™ àéþ¯™ Þæþ®˜ Üåþ¬˜ŸÙâþª˜ Õßþ©— ÔÞþ«˜Ÿ×àþ¯˜ŸÝåþ²šŸåëþ¶œ ëðÿ·� îóÿ¸� ðôÿº�Ÿô÷ÿ»ŸŸ÷ùÿ½ž ùûÿ½ŸŸùûÿ¼žžúûÿ¹„…ùûÿµiiùûÿ´bb÷ùÿ´_^õ÷ÿ²[Zñôÿ±YWïóÿ±VSìñÿ°OLéîþ¯B<äêþ¯7.ßçþ®+!Ýåþ­!Úãþ­ Ûãþ­Úãþ­Úãþ­Ûãþ­Ùãþ¬Úãþ¬Úãþ­Ûäþ­ +Üäþ­"Üåþ­50Üæþ¬NMÝåþ®`aÞæþ®wyÞæþ­‹�Ýåþ­—žÛäþ­™ŸÜäþ®™ Ûäþ¬˜ Úãþ­˜ Ùâþ¬˜ Ùâþ¬˜ŸÙâþ¬˜ Úãþ­˜ŸÚãþ­™ Ûãþ­˜ŸÛãþ­˜ŸÛäþ®˜ŸÛäþ­˜ Ûäþ®™ Üæþ®™ Üäþ®™ Ûäþ­˜ŸÛäþ¬˜ Úãþ­˜ Úãþ­™ŸÛãþ®˜ŸÛãþ­™ŸÛãþ­˜ŸÛåþ®™ Ýæþ¯™ Þæþ¯™ ßæþ¯™ Þæþ®™ Þæþ¯™ Þçþ¯š ßçþ°™Ÿàèþ±š áéþ°™Ÿáéþ°š áéþ°š âéþ±šŸâêþ²š ãêþ±› äëþ³› æìþ´› èîþ´› éîþ²› äëþ¯™ŸÞçþ¬™ŸÚãþ«˜ŸÖàþ©— ÓÞþ©—ŸÓÞþ¨—ŸÒÝþ©— ÒÝþª— ÓÞþ¨–ŸÑÜþ¦– ÍÙþ¤• ÈÖþ¢” ÆÔþ¡”ŸÄÒþ¡”ŸÃÒþŸ’ ¿Îþœ’Ÿ¹Êý˜�Ÿ±Äý•�Ÿ«¿ý’Ž ¦¼ý’�Ÿ¥»ý‘�Ÿ£ºý��Ÿ¢¹ý�ŒŸ¢·ýŽ�ŸŸµý�Œ œµýŽŒŸœ´ýŒŒŸš²ýŠ‹Ÿ—°ý‹‹Ÿ™±ýŠ‹Ÿ—±ýŠ‹ –®üŠ¥È¹z«‹‹ –¯ü‹‹Ÿ˜°ýŠ‹Ÿ—°ý‹‹Ÿ˜±ýŒ‹Ÿ˜±ý‹‹Ÿ—±ý‹‹Ÿ™±ýŒ‹Ÿ˜±ý‹‹Ÿ—±ý‹‹ —±ý‹‹Ÿ˜±ý‹‹Ÿ–°ýŠ‹ ˜±ý‹‹Ÿ—°ý‹‹Ÿ˜°ý‹‹ —°ýŠ‹Ÿ—°ýŠ‹Ÿ—°ý‹‹ –±ýŠ‹Ÿ–¯ý‰ŠŸ”®ýˆŠŸ’¬ü‡ŠŸ‘¬ü†‰Ÿ�ªü‡‰ŸŽ©ü…ˆŸ�§ü„‰Ÿ‹¦ü„ˆŸ‰¦üƒˆŸˆ¦üƒˆŸ‰¥üƒˆŸ‰¥ü„ˆž‹§ü…ˆŸŽ¨ü‡‰Ÿ�ªüŠ‹Ÿ–¯ý‹‹ ˜±ý‹‹Ÿ—°ý�Š�™°û”{‡›´ýœmqŸ·ý¡]Y£ºý¥PH¥ºý§?/¥»ý©8#¢ºý©5§»ý©7%­Áý¨C8´Æý§RP¼Ìý¦bcÀÐþ¥y~ÃÑþ¢Œ–ÄÑþ¡“ŸÅÒþ¢”ŸÅÓþ£•ŸÈÔþ¤•ŸË×þ¦–ŸÎÛþ©— ÒÞþª— ÓÞþª— ÔÞþ¨—ŸÒÝþ¨—ŸÒÞþ¨—ŸÑÝþ©– ÒÝþ©— Ôßþ©—ŸÓÞþ©—ŸÓÞþª—ŸÓÞþ©— ÔÞþ©— Ôßþª˜ŸÕàþ«˜ ×áþ¬™ Øâþ¬™ŸÚãþ­™ŸÛäþ®™ Ýåþ¯™ ßèþ±š ãêþ²›Ÿäëþ³›Ÿæìþ³› çíþ´› éíÿ³› èíÿ´› èíÿ´› çíÿ´› çíþ³›Ÿçíþ³› æíþ³›Ÿæíþ³› æíþ³›Ÿæíþ³›Ÿæíþ³›Ÿæíþ³›Ÿæíþ²› æíþ³› æíþ²› åìþ²›Ÿäëþ°š âéþ°šŸáèþ®™ŸÝæþ­˜ŸÚãþ«˜Ÿ×áþª— Ôàþª— ÓÞþ©—ŸÒÝþ¨– ÒÝþ¨— ÒÝþ§– ÐÛþ¦–ŸÌØþ£”ŸÇÕþ¢”ŸÅÓþ¡” ÄÑþŸ“ ¿Ïþ�’ŸºËýš‘Ÿ¶Çý™�Ÿ²Äý–�Ÿ¬Áý“� ¨½ý’ŽŸ¥ºý��Ÿ£¹ý‘�Ÿ¤ºý‘�Ÿ¥ºý‘�Ÿ¤ºý’�Ÿ¤»ý‘�Ÿ¤ºý‘� ¥ºý��Ÿ¢¹ý‘ŽŸ£¹ý��Ÿ¡¸ý��Ÿ ¶ýŽŒ Ÿ¶ý�ŒŸž¶ý��Ÿ¡·ý‘�Ÿ£¹ý‘� ¤¹ý‘Ž ¤ºý‘�Ÿ¤ºý‘ŽŸ¥ºý“�Ÿ©½ý•� «Àý—�Ÿ®Áý˜�Ÿ²Äýš‘Ÿ´Çýš�ŸµÆýš‘Ÿ¶Çý›‘Ÿ·Éý›’Ÿ·Éý›‘Ÿ·Èýš‘Ÿ·Èý›’Ÿ·Èþ›’Ÿ¸Éý™‘ŸµÆý™‘ µÆýš�ŸµÅý˜�Ÿ³Åý™‘Ÿ³Æý˜�Ÿ³Æý™�Ÿ²Åý˜�Ÿ²Äý—�Ÿ±Äý˜�Ÿ±Ãý—�Ÿ°Äý˜�Ÿ°Äý—�Ÿ°Ãý—�Ÿ°Ãý˜‘Ÿ±Äý™� ³Åýš‘Ÿ´Æýš‘ µÆý›‘Ÿ·Éýœ’ŸºËý�“Ÿ½ÍýŸ“Ÿ¿Îþ “ ÁÏþ “ ÁÑþ¢“ŸÄÓþ¢” ÅÓþ£•ŸÈÕþ¤•ŸÉÖþ¥•ŸË×þ¥•ŸË×þ¥•ŸË×þ¥• ËØþª— ÕÞþ‹¢ ‹�¿‡›Ÿ‡�¾‡›Ÿ‡�¿ˆœŸˆ�¿‰ŸŸ‰�¾‹¡Ÿ‹�¿Œ¤ Œ’¿�¦ �’¿�¨Ÿ�“¿�©Ÿ�”¿’«Ÿ’•¿“­ “–¿•¯Ÿ•—¿”¯ ”—¿•¯ •—¿–± –˜¿˜³Ÿ˜š¿™µ ™›¿™¶Ÿ™›¿˜³ ˜š¾—´Ÿ—™¿—² —™¿–±Ÿ–˜¿•±Ÿ•˜¿–²Ÿ–™¿–²Ÿ–™¿—² —™¿˜´Ÿ˜š¿™¶Ÿ™›¿š· š›¿š¹ šœÀ›º ›œ¿›ºŸ›œÀ›¹ ›�¿œºŸœ�Àœº œœ¿œº œ�À›º ›�¿›ºŸ›œÀ›¹Ÿ›�À›¹Ÿ›�ÀœºŸœ�¿œºŸœ�¿œº œœ¿œº œœ¿›¹Ÿ›œÀ›¸Ÿ›œÀ›¶�›™½š³˜š•»™±–™“¸™¯’™�¶™®“™�·˜®—˜’¹–¯š–“¼–±Ÿ–—¿•°Ÿ•˜¿•¯Ÿ•˜¿•°Ÿ•—¿•°Ÿ•—¿•°Ÿ•˜¿•°Ÿ•—¿•° •˜¿•°Ÿ•—¿•± •˜¿–± –˜¿•± •˜¿–²Ÿ–˜¿–± –˜¿–² –™¿–± –˜¿•° •˜¿•¯Ÿ•˜¿•¯Ÿ•˜¿•¯ •—¿•° •—¿•¯Ÿ•—¿•¯ •—¿•¯Ÿ•—¿”¯Ÿ”˜¿”®Ÿ”—¿”¯Ÿ”—¿”°Ÿ”—¿•¯ •—¿•±Ÿ•˜¿•°Ÿ•—¿–±Ÿ–˜¿–² –™¿—²Ÿ—™¿–² –™¿—³ —™¿—³Ÿ—™¿—³ —™¿—³Ÿ—š¾˜´Ÿ˜š¿˜µŸ˜š¿™µŸ™š¿š¶ š›¿š· š›¿š·Ÿšœ¿š·Ÿš›¿™· ™›¿™¶ ™š¿˜µŸ˜š¿—´Ÿ—™¿–² –™¿–± –˜¿•± •˜¿•° •˜¿”¯Ÿ”—¿”¯Ÿ”—¿”®Ÿ”—¿“®Ÿ“–¿”¯ ”—¿”¯Ÿ”—¿”¯Ÿ”—¿”® ”–¿’«Ÿ’–¿‘ª ‘•¿‘©Ÿ‘•¿�©Ÿ�•¿�©Ÿ�”¿�¨ �“¿�¦ �’¿Ž¥ŸŽ’¾�¤Ÿ�‘¿Œ£ Œ‘¿Œ¢ŸŒ�¾Œ¢ŸŒ�¾‹¡Ÿ‹�¿Š ŸŠ�¾‰ŸŸ‰�¿‰ŸŸ‰�¾‰ŸŸ‰Ž¾ˆžŸˆŽ¾ˆ�Ÿˆ�¾„�¬„–¾ˆœŸˆ�¿ˆœŸˆ�¾‡› ‡�¾‡› ‡�¾‡›Ÿ‡�¿†›Ÿ†Œ¾†›Ÿ†�¾†šŸ†Œ¿†šŸ†Œ¾†š †Œ¿…šŸ…Œ¿…™ …Œ¿…™Ÿ…‹¿…˜Ÿ…‹¾…™Ÿ…Œ¾…˜Ÿ…‹¾…˜Ÿ…Œ¾„—Ÿ„‹¾…—Ÿ…‹¿„˜Ÿ„‹¿„˜ „‹¿…˜Ÿ…Œ¾…˜Ÿ…‹¾„˜ „‹¾„˜Ÿ„‹¾…˜Ÿ…‹¿„—Ÿ„‹¾„˜Ÿ„‹¾„—Ÿ„‹¾„—Ÿ„‹¾„˜Ÿ„‹¾„—Ÿ„‹¿„— „‹¿„˜Ÿ„‹¿…˜Ÿ…‹¿…˜Ÿ…‹¿…˜Ÿ…Œ¿…™Ÿ…Œ¿‡šŸ‡�¾‡œ ‡Ž¿ˆœŸˆŽ¾ˆ�ŸˆŽ¿‡œŸ‡Ž¿‡œŸ‡�¿ˆ�ŸˆŽ¿Š ŸŠ�¿Œ£ Œ‘¾�¥Ÿ�’¾�§Ÿ�”¿�¨Ÿ�“¿�¨Ÿ�“¿‘© ‘”¿�ªŸ�”¿’«Ÿ’–¿”­ ”—¿•¯Ÿ•˜¿”®Ÿ”—¿”®Ÿ”—¿”®Ÿ”—¿“¯ “—¿”¯ ”—¿”¯ ”—¿•° •˜¿•¯ •—¿•° •˜¿•° •—¿•° •—¿•°Ÿ•˜¿”¯Ÿ”˜¿”® ”—¿”¯Ÿ”—¿”¯ ”—¿”¯ ”—¿”¯ ”—¿•¯Ÿ•—¿•¯ •˜¿•¯ •˜¿”° ”˜¿•¯ •˜¿”¯Ÿ”˜¿•°Ÿ•˜¿•° •˜¿•° •˜¿•¯ •—¿”° ”—¿•¯Ÿ•—¿”° ”—¿”¯ ”—¿•¯ •—¿•¯Ÿ•˜¿•¯Ÿ•˜¿•°Ÿ•˜¾•° •˜¿•°Ÿ•˜¿•±Ÿ•˜¿•° •˜¿•°Ÿ•˜¿•°Ÿ•˜¿•°Ÿ•˜¿•¯Ÿ•—¿”¯Ÿ”—¿”®Ÿ”–¿”¯Ÿ”—¿”®Ÿ”—¿’­Ÿ’–¿’«Ÿ’•¿‘ªŸ‘•¿�ª �•¿�© �”¿�©Ÿ�”¿�¨ �”¿�§ �”¿�¦Ÿ�“¾�¥Ÿ�‘¿Œ£ŸŒ‘¾‹¢Ÿ‹�¾‹¡Ÿ‹�¿ŠŸŸŠ�¿‰ŸŸ‰�¾ˆžŸˆ�¾‰žŸ‰Ž¿ˆœŸˆŽ¾ˆ�Ÿˆ�¿ˆœŸˆ�¾ˆœŸˆŽ¿ˆœŸˆŽ¿‡�Ÿ‡�¾ˆœŸˆ�¾ˆœŸˆ�¿ˆ›Ÿˆ�¿ˆœŸˆ�¾‡œŸ‡�¿‡œ ‡�¿ˆœ ˆ�¿‡œŸ‡Ž¿ˆœŸˆŽ¿‡œŸ‡Ž¿ˆ� ˆŽ¾ˆœŸˆ�¾ˆœŸˆŽ¿‡œŸ‡�¿‡œŸ‡Ž¾‡œŸ‡Ž¿‡›Ÿ‡�¾‡› ‡Œ¾‡›Ÿ‡�¿†› †�¿†›Ÿ†�¿‡›Ÿ‡�¾†šŸ†Œ¿†šŸ†Œ¾†™Ÿ†Œ¿†™Ÿ†Œ¾†˜Ÿ†Œ¿…™Ÿ…Œ¿…šŸ…Œ¿†™Ÿ†Œ¾†™ †Œ¾†š †Œ¿…™Ÿ…Œ¿…™Ÿ…Œ¿…™ …Œ¾…™Ÿ…Œ¿…™Ÿ…Œ¾…™ …Œ¾†šŸ†Œ¾†šŸ†Œ¿†šŸ†Œ¾†š †Œ¿†šŸ†Œ¾‡šŸ‡Œ¿†šŸ†Œ¿‡œŸ‡�¿ˆ�ŸˆŽ¾‰�Ÿ‰Ž¿‰žŸ‰Ž¾‰žŸ‰�¿‰žŸ‰Ž¾‰ŸŸ‰�¾ŠŸŸŠ�¾ŠŸ Š�¿Š  Š�¾Š ŸŠ�¾Ž¥ŸŽ’¿™� ³Åþ��Ÿ¢¸ý��Ÿ£¸ý’�Ÿ¤ºý•�Ÿ«¿ý˜�Ÿ²Äý›’Ÿ·Éýž’ ½Íþ ” ÁÐþ¢”ŸÄÒþ¥–ŸÊ×þ¦– ÎÚþ©— ÓÞþ¨— ÓÞþ©—ŸÕßþ­˜ŸÙâþ¯™Ÿàéþ²› åìþ³š æìþ±š áèþ¯™ ßçþ®˜ŸÞåþ­˜ Ûãþ­˜ Ùâþ­™ŸÛäþ®™ŸÜäþ®™ŸÝåþ°™ àèþ²šŸåìþµœ éîÿ¶œ ìñÿ·œ ïóÿ·�Ÿïóÿ·œ ðóÿ¸œŸðóÿ¸œ ñóÿ¸�Ÿðôÿ¸� ðôÿ¸� ïóÿ·� ïóÿ¸� ïóÿ·� ïóÿ·œ ïóÿ·� ïóÿ·œŸïóÿ·œ îòÿ¶œŸíñÿ¶™�ìñÿµ•˜êðÿ´’–éïþ³�“çíþ²�“åëþ°’–áèþ®”šÜåþ«—ŸØâþª— Öàþª— Ößþª˜ŸÖáþ«—ŸÖàþª— Öàþª—ŸÖáþ«˜Ÿ×àþ«˜Ÿ×àþ¬˜ Øáþ¬˜ŸÙâþ¬˜ Ùâþ­˜ Úãþ­™ŸÚãþ¬˜ŸÚãþ¬˜ŸÚâþ¬—ŸØáþ«˜Ÿ×àþª˜ŸÕßþ«—ŸÖßþª—ŸÕßþ©— Ôßþª˜ŸÔßþª—ŸÔÞþª˜ŸÔßþª— ÕÞþ«˜ŸÕßþª—ŸÕßþª— Ößþ«˜ ×áþ¬— Øâþ­˜ Úãþ­˜ŸÛäþ®™ŸÜåþ®™ Ýåþ®™ Ýçþ¯™ Þæþ®™ Þæþ¯šŸÞçþ°™Ÿàèþ±šŸâéþ²›Ÿåìþ´›Ÿèíþµ›Ÿéîÿµ›Ÿéîþ´› èîþ³› æîþ³šŸåëþ±š ãêþ¯šŸßçþ®™ŸÛäþ­™ŸÚãþ¬™ Øâþª˜ŸÖàþ©— ÔÞþ©— Óßþ¨—ŸÒÝþ¨—ŸÒÜþ©—ŸÓÝþ©—ŸÓßþ©— ÓÞþ¨–ŸÐÛþ¥• ÊØþ£• ÇÕÿ£”ŸÆÔþ¢”ŸÅÓþ¢”ŸÄÒþ “ŸÂÑþŸ“ ÀÏþ�’ »Ëý›’Ÿ¸Éýš‘Ÿ¶Çýš‘ ´Æý˜�Ÿ³Æý—�Ÿ°Ãý–�Ÿ®Áý•�Ÿ«¿ý”ŽŸª¿ý”ŽŸª¾ý“ŽŸ§½ý“� ¨»ü‘–¬­©ä’Ž ¤ºý‘�Ÿ£ºý��Ÿ¢¸ý�ŒŸ¡¸ý��Ÿ¡¸ý��Ÿ ·ý��Ÿ ·ý�ŒŸŸ¶ýŽŒŸŸ¶ýŽŒŸ�µýŽŒŸžµý�ŒŸœ´ý‹ŒŸ™²ýŒ‹Ÿ™±ýŒ‹ š³ý‹‹Ÿ™²ý‹‹Ÿ˜±ý‹‹Ÿ˜°ý‹‹Ÿ˜°ýŠ‹Ÿ—°ý‹‹Ÿ˜²ý‹‹Ÿ˜²ý‹‹Ÿ™²ý‹‹Ÿ—°ý‹ŒŸ—±ý‹‹ —±ý‹ŒŸ˜±ý‹‹ ˜°ý‹‹Ÿ–°ýŠ‹Ÿ—°ý‹‹Ÿ—°ýŠ‹ ˜±ý‹‹ ˜±ý‹‹ ˜±ýŒ‹Ÿš²ýŒ‹Ÿš±ý�ŒŸš²ý�ŒŸœ³ý�ŒŸ¡¸ý‘�Ÿ¤¹ý‘�Ÿ¥»ý‘�Ÿ¥ºý��Ÿ¢ºý��Ÿ¢¸ý“ŽŸ¦¼ý–�Ÿ®Áýš‘Ÿ´Æý�’ŸºËý ” ÁÐþ¡“ ÃÑþ¡“ ÄÒþ¢•ŸÅÓþ£•ŸÇÔþ¤–ŸÊ×þ©— ÑÜþª—ŸÓÞþ©—ŸÒÝþ¨—ŸÒÝþ¨— ÒÝþ©—ŸÓßþ©—ŸÓÞþª˜ Ôàþª˜ŸÕàþª˜ŸÕàþª˜ŸÕàþª˜ Öàþª˜ Õàþª— Ößþª—ŸÔßþ©—ŸÔÞþ©—ŸÓÞþ©—ŸÓÞþª˜ Ôßþ©—ŸÔßþª˜ Õßþª—ŸÕßþª—ŸÕßþª—ŸÕàþ«˜ŸÖàþª˜ Õàþ«˜ŸÖàþ«— Öàþª˜ŸÕàþª˜ŸÕßþª—ŸÕàþª—ŸÕàþª˜ Ôßþª˜ Õßþª˜ Õßþ«˜ Öàþ«˜ Öáþ«˜ Öàþ«˜ ×áþ«— ×áþ¬˜ŸØâþ¬˜ ×áþ¬˜Ÿ×áþ«˜Ÿ×àþª— Õàþ©— Ôßþ©—ŸÓÞþ©—ŸÒÞþ©— ÒÞþ©–ŸÒÞþ¦–ŸÎÚþ¤•ŸÊ×þ£•ŸÇÕþ£•ŸÆÕþ¢”ŸÅÓþ¡” ÃÓþ¡”ŸÃÑþ “ŸÀÏþž’Ÿ¾Íýœ’Ÿ¸Ëýš‘Ÿ¶Èý™‘ ³Åý—�Ÿ°Ãý–� ¬Àý•Ž ª¿ý”ŽŸ¨½ý’Ž ¦¼ý’�Ÿ¥»ý‘�Ÿ¤»ý‘�Ÿ¤¹ý‘ŽŸ¤ºý‘ŽŸ¤ºý’�Ÿ¤»ý�ŽŸ£¹ý‘�Ÿ£ºý��Ÿ¤¹ý‘�Ÿ£¹ý�� ¢¸ý‘�Ÿ£ºý��Ÿ£¹ý�ŽŸ£¹ý‘�Ÿ£¹ý‘ŽŸ¤ºý‘ŽŸ¥ºý‘Ž £¹ý�Ž £¹ý‘ŽŸ¤ºý�ŽŸ¤¹ý‘� ¤¹ý‘�Ÿ¢¸ý��Ÿ¡·ý��Ÿ¡·ý��Ÿ¡¸ý��  ·ý�ŒŸ ¶ýŽŒŸž·ýŽŒŸž¶ý�ŒŸœ´ý�ŒŸœµý�ŒŸœ³ý�ŒŸœ´ýŽŒŸœµý�ŒŸ�´ý�ŒŸ�´ý�ŒŸ�´ý�‹Ÿœ³ý�‹Ÿœ´ý�‹Ÿ›´ýŒŒŸš³ýŒŒŸ›³ýŒ‹Ÿ›³ý�ŒŸ›´ý�Œ œ´ýŽŒŸ�µý�ŒŸžµýŽŒŸŸ·ýŽ� Ÿ·ý�ŒŸŸ¶ý��Ÿ¢¹ý’ŽŸ¥»ý“ŽŸ§¼ý“ŽŸ§½ý”ŽŸ¨¾ý”Ž ©¿ý”�Ÿ©¾ý•�Ÿ«¿ý•�Ÿ­Àý–� ­Áý•�Ÿ¬Áý�’Ÿ»Ëþ‹¢Ÿ‹�¿‡œ ‡�¾ˆ›Ÿˆ�¿‡›Ÿ‡�¾ˆ� ˆŽ¾‰ŸŸ‰Ž¿‹¡Ÿ‹�¾Œ£ŸŒ‘¿Ž¥ŸŽ’¿�§Ÿ�“¿‘©Ÿ‘”¿‘©Ÿ‘”¿‘« ‘•¿“®Ÿ“—¿”®Ÿ”—¿”® ”—¿”¯ ”˜¿•± •—¿—² —˜¿˜µ ˜™¿™¶ ™›¿™¶Ÿ™›¿™¶ ™›¿˜µŸ˜š¿˜´Ÿ˜š¿–²Ÿ–™¿—²Ÿ—™¿–±Ÿ–™¿–±Ÿ–˜¿•° •˜¿•° •˜¿–±Ÿ–˜¿–± –™¿—³ —™¿˜´ ˜š¿™¶Ÿ™š¿š· š›¿š¸Ÿš›¿›¸ ›œ¿›¸ ›œÀ›¹Ÿ›œ¿›¹ ›�¿œ¹ œœ¿›¹ ›�À›¹ ›œÀ›¹ ›�À›¹Ÿ›�À›¹ ›œ¿›¹Ÿ›œÀ›º ›�¿›¹Ÿ›œ¿›¹ ›œ¿›¹ ›œÀ›¸Ÿ›œÀ›· ››¿š·Ÿš›¿š¶Ÿš›¿™¶Ÿ™›¿™µŸ™›¿˜´ ˜š¿—³Ÿ—š¿–²Ÿ–™¿–±Ÿ–˜¿–² –˜¿–° –˜¿•±Ÿ•™¿–± –˜¿•±Ÿ•˜¿–± –˜¿–° –˜¿•¯Ÿ•˜¿”¯Ÿ”—¿”° ”˜¿•°Ÿ•˜¿•° •˜¿•° •˜¿–° –—¿•±Ÿ•˜¿•° •˜¿•± •—¿•°Ÿ•˜¿•±Ÿ•—¿•° •—¿”¯ ”—¿•°Ÿ•—¿”°Ÿ”—¿•¯Ÿ•—¿•° •˜¿–°Ÿ–—¿–²Ÿ–˜¿—³Ÿ—™¿—²Ÿ—™¿—³ —™¿—´Ÿ—™¿™µ ™›¿š¶ š›¿š¸ š›À™· ™›¿™µ ™›¿˜´Ÿ˜š¿—³Ÿ—™¿–²Ÿ–™¿–±Ÿ–™¿•°Ÿ•—¿•± •—¿•° •˜¿•¯Ÿ•—¿”¯Ÿ”—¿”¯Ÿ”—¿”° ”˜¿”® ”˜¿”®Ÿ”–¿”®Ÿ”—¾”® ”—¿“®Ÿ“—¿”¯ ”—¿”¯Ÿ”–¿”®Ÿ”—¿”®Ÿ”—¿“® “–¿“­ “–¿”® ”–¿”®Ÿ”—¿”® ”–¿“®Ÿ“—¿“®Ÿ“—¿“­ “–¿”­ ”–¿’­Ÿ’–¿’¬Ÿ’–¿’« ’–¿’¬Ÿ’–¿’¬Ÿ’–¿’¬Ÿ’•¿’ªŸ’•¿‘ªŸ‘•¿�¨Ÿ�”¿�¨ �“¿�§Ÿ�“¿�¦Ÿ�’¿�¤Ÿ�’¾�¤ �‘¿Œ£ŸŒ‘¾‹¢ ‹‘¿‹¡ ‹�¾Š ŸŠ�¿ŠŸŸŠ�¾‰ž ‰�¾ˆ� ˆŽ¿ˆœ ˆŽ¾ˆœŸˆŽ¾‡œ ‡�¾‡› ‡�¿‡›Ÿ‡�¿‡›Ÿ‡�¾‡›Ÿ‡�¾‡› ‡�¾‡œŸ‡�¿ˆ›Ÿˆ�¿‡œŸ‡�¾‡›Ÿ‡�¿‡›Ÿ‡�¾‡›Ÿ‡�¾‡œŸ‡�¿‡šŸ‡�¾‡› ‡�¾‡›Ÿ‡�¾‡›Ÿ‡�¾‡›Ÿ‡�¿‡œŸ‡�¾‡œŸ‡�¾†›Ÿ†�¾‡›Ÿ‡�¿‡œŸ‡Ž¾ˆ� ˆ�¿ˆœ ˆ�¾‡œ ‡Ž¿ˆ� ˆŽ¿ˆ�ŸˆŽ¾ŠŸŸŠ�¿‹¡Ÿ‹�¿Œ£ŸŒ�¿�¤Ÿ�‘¾Ž¦ŸŽ“¾�§ �”¿�©Ÿ�”¿�©Ÿ�”¿‘©Ÿ‘•¿‘ªŸ‘•¿“¬Ÿ“–¿”®Ÿ”—¿”®Ÿ”—¿”®Ÿ”—¿”® ”—¿”® ”—¿”¯Ÿ”—¿”® ”—¿”¯ ”—¿•®Ÿ•—¿•°Ÿ•—¿”¯ ”—¾”°Ÿ”—¿”¯ ”—¿”¯ ”—¿”¯Ÿ”—¿”¯Ÿ”—¿”¯ ”—¿”¯Ÿ”—¿•¯ •—¿”®Ÿ”—¿”®Ÿ”—¿“® “–¿”® ”–¿”®Ÿ”—¿”® ”—¿”®Ÿ”–¿“® “—¿“® “—¿”® ”–¿“¯Ÿ“—¾”® ”—¿“­ “—¿“­Ÿ“–¿“® “—¿“®Ÿ“—¿“®Ÿ“—¿“® “–¿“® “–¿“® “—¿”®Ÿ”—¿”­ ”–¿“­Ÿ“–¿“­Ÿ“–¿”®Ÿ”–¿”­Ÿ”–¿“­Ÿ“–¿“­ “—¿“­Ÿ“–¿’«Ÿ’–¿’«Ÿ’•¿‘ªŸ‘•¿�ªŸ�•¿�ª �”¿�ª �•¿‘ªŸ‘•¿‘ª ‘”¿‘ªŸ‘”¿�©Ÿ�”¿‘ªŸ‘•¿�©Ÿ�”¿�©Ÿ�•¿‘©Ÿ‘”¿‘© ‘”¿�¨Ÿ�“¿�¨Ÿ�”¿�©Ÿ�“¿�§Ÿ�”¿�§Ÿ�“¿Ž§ŸŽ“¾�¥ �’¾�¥ �’¾�¤Ÿ�’¿Œ¤ŸŒ‘¾Œ£ŸŒ�¿‹¡ ‹�¿‹¡Ÿ‹�¾Š ŸŠ�¾‹ Ÿ‹�¿‰ŸŸ‰�¾ŠŸ Š�¿Šž Š�¿‰žŸ‰Ž¾ˆžŸˆŽ¾ˆ�ŸˆŽ¿ˆœŸˆ�¿ˆ�Ÿˆ�¿ˆœŸˆŽ¾‡› ‡�¿‡œŸ‡�¿ˆœŸˆŽ¿‡›Ÿ‡�¾‡›Ÿ‡�¾†›Ÿ†�¾†™Ÿ†Œ¾†™Ÿ†‹¾„˜Ÿ„Œ¾…˜Ÿ…Œ¿…™Ÿ…‹¾…™Ÿ…Œ¾…˜Ÿ…‹¾…—Ÿ…‹¿„— „‹¾„—Ÿ„‹¾„—Ÿ„‹¾„—Ÿ„‹¾„—Ÿ„‹¿ƒ—Ÿƒ‹¾„–Ÿ„Š¿ƒ–ŸƒŠ¾„–Ÿ„о„—Ÿ„Š¿„–Ÿ„о„–Ÿ„‹¾„—Ÿ„‹¿„— „‹¿…˜ …‹¾…—Ÿ…‹¿…˜Ÿ…‹¾…˜Ÿ…Œ¿…™Ÿ…Œ¾…™Ÿ…Œ¿†›Ÿ†�¾‡œŸ‡�¿‡œŸ‡�¿ˆ�Ÿˆ�¿ˆ�ŸˆŽ¿ˆ�Ÿˆ�¿ˆœŸˆ�¿‡œŸ‡�¾Œ¢ Œ�¿™�Ÿ´Æþ�� ¢¹ý��Ÿ¢¸ý��Ÿ¢¸ý‘�Ÿ¥»ý“ŽŸ©¾ý—�Ÿ¯Ãýš‘ŸµÈý�’Ÿ¼Ìý ” ÁÐþ¡” ÄÒþ¢” ÅÓþ¤” ÉÖþ§– ÐÝþ¨—ŸÒÝþ©— ÒÝþ©—ŸÔßþ«˜ ×áþ®™ŸÝæþ±šŸâéþ²› åëþ³› æìþ²›Ÿäëþ°šŸáêþ°šŸàèþ®™ Ýæþ®™ŸÜåþ­˜ Ûãþ¬˜ Øáþ«˜Ÿ×áþ«˜Ÿ×áþ¬˜ŸØâþ­™ Ûäþ®š Ýæþ°šŸáêþ³›Ÿæìþ´› éîÿµœ êïÿ¶œ ëðÿ¶œ ìñÿ¶œ íñÿ·œ îòÿ·œ îòÿ·� îòÿ·� ïòÿ·œ îòÿ·� îóÿ·œ îòÿ¶œ ïòÿ·œ îóÿ·œ îóÿ·�Ÿîòÿ·� îóÿ¶œ íñÿµœ êïÿµœŸéîþ³›Ÿçíþ²›Ÿæìþ²šŸäëþ°šŸáéþ¯™Ÿßæþ­™ŸÛäþ¬™ Úãþ¬˜ŸÚãþ¬˜ŸÙâþ¬˜ŸÙâþ¬˜ Ùâþ«˜ŸØâþ¬˜ŸØãþ«˜ ×áþª— Öáþª˜ŸÖàþª˜ Öàþ«˜ Öáþ«˜ŸÖáþª˜ŸÖàþ«˜Ÿ×áþ«—Ÿ×áþ«˜ Øáþ¬˜Ÿ×áþ¬˜ ×áþ«˜ ×âþª—Ÿ×àþª—ŸÕßþª— Õßþª—ŸÔßþª˜ŸÕßþ«— Öàþ¬˜ŸØáþ­˜ Úãþ¯™ŸÝåþ®™ Ýæþ¯™ Þæþ¯™Ÿàèþ²šŸãêþµ› éîÿ´œ éïÿ³›Ÿæíþ±šŸäêþ°šŸàèþ¯™Ÿßæþ­˜ŸÜäþ­™ŸÛãþ«˜ŸØáþ¬—Ÿ×áþ«˜ŸÕàþ©—ŸÔßþ©—ŸÓÞþª—ŸÔßþª˜ŸÔßþª— ÓÞþ©— ÒÝþ¨—ŸÑÝþ¨–ŸÑÝþ©—ŸÒÝþ©—ŸÒÝþ©—ŸÓÝþ©—ŸÒÝþ¨—ŸÑÝþ¨— ÑÜþ¨–ŸÑÜþ§–ŸÐÜþ¨—ŸÑÜþ¨–ŸÑÜþ¨– ÑÜþ§–ŸÑÛþ§— ÏÛþ§–ŸÏÛþ¦– ÎÚþ¦• ÍÙþ¥•ŸËØþ¥– ËØþ¥•ŸËØþ¤• Ê×þ¤• ÈÕþ£”ŸÇÕþ¢” ÅÒþ “ŸÂÐþ “ŸÀÏþž“ ½Íýœ’ŸºÊý›‘Ÿ¸Èýš‘ŸµÇý˜�Ÿ±Äý—�Ÿ¯Âý–� ®Âý”Ž «Àý“�Ÿ§¾ý’� ¦»ý‘ŽŸ¤»ý‘ŽŸ¤¹ý‘� £¹ý�ŽŸ¡¸ý�� ¡¸ý��Ÿ¡¸ý��Ÿ¡¸ý��Ÿ¡¸ý�� ¡¹ý��Ÿ¢¹ý��Ÿ¡¸ý��Ÿ¡¸ý�� ¡¸ý��Ÿ¡¸ý�� ¡¸ý��Ÿ¡¸ý��Ÿ¢·ý��Ÿ¢·ý��Ÿ¡¸ý�ŽŸ¢¸ý��Ÿ¡¸ý��Ÿ¢¹ý�� ¡¹ý��Ÿ¢¸ý‘�Ÿ£¹ý’�Ÿ¤ºý‘ŽŸ¤»ý‘ŽŸ¤»ý‘�Ÿ¦¼ý“Ž §¼ý”�Ÿª¿ý—�Ÿ¯Ãý™‘Ÿ³Æý›’Ÿ¹Êýž“Ÿ¾Îý “ ÂÐþ¡”ŸÄÑþ¡”ŸÅÒþ¢” ÆÔþ¤• ÈÖþ§– ÎÚþ¨— ÓÝþ¨—ŸÒÝþ©– ÒÞþ©— ÒÝþ¨— ÒÝþ¨—ŸÒÞþ¨– ÒÝþª—ŸÓÞþ©— ÔÞþª—ŸÔßþª˜ŸÔßþª˜ Ôßþª˜ŸÕßþ©— ÓÞþ¨— ÒÞþ©– ÒÝþ©˜ŸÒßþ©—ŸÓÞþ©— ÓÞþ©— ÒÝþ©—ŸÒÝþ©—ŸÒÝþ©— ÒÝþ¨— ÒÝþ©— ÒÝþ¨— ÑÝþ¨– ÒÝþ¨– ÑÜþ¨–ŸÑÜþ¨—ŸÒÝþ¨–ŸÒÜþ¨— ÐÜþ¨– ÐÛþ¨—ŸÐÜþ¨— ÐÜþ¨— ÐÜþ¨— ÐÜþ§–ŸÐÜþ¨– ÑÜþ¨— ÑÜþ§–ŸÑÛþ¨—ŸÐÛþ§– ÐÛþ¨— ÑÛþ§–ŸÐÛþ¨– ÐÛþ§–ŸÐÛþ§– ÎÚþ¦– ÌØþ¤–ŸÉ×þ£• ÇÕþ¢”ŸÇÔþ£”ŸÇÔþ¢”ŸÆÔþ£” ÆÔþ£”ŸÇÔþ£”ŸÆÔþ¢” ÆÔþ£•ŸÇÔþ¢”ŸÅÓþ¢” ÅÓþ¢” ÅÓþ¢”ŸÅÓþ¢” ÄÒþ¡”ŸÃÒþ¡“ŸÂÑþ “ ÁÐþŸ“ ÀÏþŸ“Ÿ¾Îý�’ ¼Ìýœ’Ÿ¹Êý›‘Ÿ¹Éýš‘Ÿ¶Èý™�Ÿ³Æý˜�Ÿ²Äý—�Ÿ°Ãý–�Ÿ¯Áý–�Ÿ®Áý•�Ÿ«¿ý”ŽŸ¬¿ý•ŽŸª¿ý”ŽŸ©½ý’ŽŸ§¼ý’Ž §¼ý’�Ÿ¤ºý’ŽŸ¤ºý’ŽŸ¤ºý��Ÿ£¹ý‘� £ºý‘�Ÿ¢ºý�� ¢¸ý��Ÿ¡¸ýŽŒŸž¶ýŽŒ �´ý�ŒŸœ³ýŒŒ ™²ýŒ‹Ÿ™±ýŒŒŸš³ýŒ‹Ÿš²ý‹‹Ÿ™±ý‹‹ —°ý‹ŠŸ–°ýŠŠŸ–°ý‹ŠŸ—¯ý‹‹Ÿ—¯ýŠŠŸ–°ýŠŠ •¯ýŠŠ •®ý‰ŠŸ•¯ýŠ‹ •®ýŠ‹Ÿ—¯ýŠ‹Ÿ—¯ýŠ‹Ÿ–¯ýŠ‹Ÿ–¯ý‹‹Ÿ˜°ýŒ‹Ÿ™²ýŒ‹Ÿš±ýŒ‹Ÿ™±ýŒŒŸš³ý�‹Ÿš²ý�Œ œ´ý��Ÿ ·ý��Ÿ¢ºý‘ŽŸ¤¹ý‘�Ÿ¤»ý’ŽŸ¥ºý‘ŽŸ¥ºý‘ŽŸ¥ºý��Ÿ£¹ý™�Ÿ³Åþ‹ Ÿ‹�¿‡›Ÿ‡Œ¿ˆœ ˆ�¿ˆœŸˆŽ¿ˆœ ˆ�¾‡›Ÿ‡�¿ˆ�ŸˆŽ¿Š ŸŠ�¾Œ¢ŸŒ‘¿Ž¥ Ž’¿�¨ �”¿�¨Ÿ�”¿�© �”¿�ªŸ�•¿’«Ÿ’•¿“­Ÿ“–¿”­ ”—¿”¯Ÿ”—¿”® ”—¿”¯ ”—¿•°Ÿ•—¿–²Ÿ–™¿˜´Ÿ˜š¿™¶ ™›¿™¶ ™›¿™¶Ÿ™›¿˜´ ˜š¿—´Ÿ—™¿˜² ˜™¿—²Ÿ—™¿–± –™¿•°Ÿ•˜¿•¯Ÿ•—¿”¯ ”—¿”¯ ”˜¾–±Ÿ–˜¿–² –™¿—³ —™¿—³Ÿ—š¿˜´Ÿ˜š¿˜´Ÿ˜š¿˜µ ˜›¿˜µ ˜š¿˜µ ˜š¿™¶Ÿ™š¿˜¶Ÿ˜š¿™¶Ÿ™š¿˜µ ˜›¿˜¶ ˜š¿™µŸ™›¿™¶Ÿ™š¿™¶Ÿ™›¿š¸ š›¿š·Ÿš›¿š¸ŸšœÀš¸Ÿšœ¿š· šœÀš¸Ÿšœ¿š¸Ÿšœ¿š¸ šœ¿š·Ÿš›¿š¸Ÿšœ¿›·Ÿ›œÀš¸ šœ¿›¸ ›œ¿›¸Ÿ›œ¿›¸ ›œ¿›¸ ››¿š¸ šœ¿š· šœÀš¸ŸšœÀš¸ šœÀš¸Ÿšœ¿›¸ ›œÀ›¹ ›œ¿›¸ ›œÀš¸Ÿšœ¿š¸ šœ¿›¸ ›œÀš¸ šœÀš¸Ÿš›¿š· š›Àš¸Ÿšœ¿š¶ š›¿™µŸ™š¿—³ —™¿•°Ÿ•˜¿”¯Ÿ”—¿”¯ ”—¿•°Ÿ•˜¿•° •˜¿–²Ÿ–™¿—³Ÿ—™¿—²Ÿ—š¿˜µ ˜š¿™¶ ™š¿š¸Ÿšœ¿˜µŸ˜š¿—³ —™¿–± –˜¿–° –˜¿”°Ÿ”—¿”¯ ”˜¿”® ”—¾”¯ ”—¿”¯Ÿ”—¿•¯ •—¿”®Ÿ”—¿•° •—¿”°Ÿ”˜¿•¯ •—¿•¯Ÿ•—¿”® ”—¿”¯Ÿ”—¿”¯ ”—¿”¯ ”—¿”® ”—¿”® ”—¿•¯Ÿ•—¿”¯Ÿ”—¿•¯Ÿ•—¿•°Ÿ•˜¿–±Ÿ–™¿˜³Ÿ˜™¿˜´Ÿ˜š¿™µŸ™›¿™¶ ™›¿˜µ ˜š¿˜´ ˜š¿˜´Ÿ˜™¿—³Ÿ—™¿—² —™¿–±Ÿ–™¿–±Ÿ–˜¿–² –˜¿—³ —™¿˜´Ÿ˜š¿—³Ÿ—™¿—³Ÿ—š¿–²Ÿ–˜¿•°Ÿ•—¿“® “—¿“®Ÿ“—¿“­ “–¿“¬ “–¿’¬Ÿ’–¿‘ªŸ‘•¿�¨Ÿ�“¿�§Ÿ�“¿�¦Ÿ�’¿Ž¥ŸŽ’¾Ž¥ŸŽ’¿�¥Ÿ�’¿�¥Ÿ�‘¿�¤Ÿ�’¿Ž¥ŸŽ’¾Ž¥ŸŽ’¿Ž¦ŸŽ“¿Ž¦ŸŽ“¾Ž¦ŸŽ’¿Ž§ŸŽ“¿Ž¦ŸŽ’¿�¦ �’¾Ž¦ŸŽ’¿�¦ �“¿�¦Ÿ�“¿�§Ÿ�“¿�§ �“¿Ž¦ŸŽ’¿Ž¦ŸŽ’¾Ž¦ŸŽ“¿Ž¦ŸŽ’¿�¥ �’¿�¤Ÿ�‘¿�¤Ÿ�‘¾�¤ �’¾�£Ÿ�‘¾Œ£ŸŒ�¿Œ£ŸŒ‘¿�£Ÿ�‘¿Œ£ Œ‘¾Œ£ Œ‘¾Œ£ŸŒ‘¾�¤ �’¾Ž¥ŸŽ’¾Ž§ŸŽ’¾�¨Ÿ�“¿�¨Ÿ�”¿�¨Ÿ�”¿�ª �”¿’«Ÿ’•¿“¬ “–¿”¯ ”—¿”¯Ÿ”—¿”® ”—¿”®Ÿ”—¿”¯Ÿ”—¿“­ “—¿“® “–¿“®Ÿ“—¿”®Ÿ”—¿“®Ÿ“—¾”¯ ”—¾”­ ”—¿“® “–¿”® ”—¿”®Ÿ”—¿”®Ÿ”—¿”® ”—¿”¯ ”—¿”¯Ÿ”—¿”®Ÿ”—¿”®Ÿ”–¿“­Ÿ“–¿’¬ ’–¿‘«Ÿ‘•¿‘« ‘•¿’ªŸ’•¿’ªŸ’•¿‘«Ÿ‘•¿’ªŸ’•¿‘«Ÿ‘•¿’¬Ÿ’•¿’¬ ’–¿’¬Ÿ’•¿’« ’•¿‘« ‘•¿’« ’•¿‘ªŸ‘•¿‘ª ‘”¿�© �”¿‘©Ÿ‘”¿‘© ‘”¿�© �“¿‘©Ÿ‘”¿�© �”¿�©Ÿ�•¿‘« ‘•¿’«Ÿ’•¿’¬ ’•¿“¬Ÿ“–¿“­ “–¿“®Ÿ“—¿“® “–¿”® ”—¿”¯Ÿ”—¿”®Ÿ”—¿”¯ ”—¿”¯Ÿ”—¿”® ”—¿”¯ ”—¿•¯Ÿ•—¿”¯Ÿ”˜¿”¯Ÿ”—¿”¯Ÿ”—¿”¯ ”—¿•¯Ÿ•—¿•¯Ÿ•—¿”¯ ”—¿”¯ ”—¿”° ”˜¿”¯Ÿ”—¿•¯ •—¿”¯ ”—¿”¯Ÿ”—¿”° ”˜¿”¯Ÿ”—¿”®Ÿ”—¿“­ “–¿’¬Ÿ’–¿’«Ÿ’•¿’«Ÿ’•¿�© �”¿�©Ÿ�”¿�¨Ÿ�“¿Ž¦ Ž’¿�¦Ÿ�’¾�£ �‘¾‹¢Ÿ‹�¿Š  Š�¿‰žŸ‰Ž¾ˆ�ŸˆŽ¿‰�Ÿ‰Ž¿ˆ�Ÿˆ�¿‡œŸ‡Ž¿‡œŸ‡�¾†›Ÿ†Œ¾†šŸ†Œ¿…™ …Œ¾†™Ÿ†‹¾…™ …Œ¾…˜Ÿ…Œ¿…˜Ÿ…о„—Ÿ„‹¾„˜ „‹¿„—Ÿ„‹¿ƒ•ŸƒŠ¾�“Ÿ�ˆ¾�’Ÿ�ˆ¾�‘Ÿ�‡¾€’Ÿ€ˆ¾�“ž�‰¾‚•Ÿ‚о„—Ÿ„‹¿„— „‹¾„—Ÿ„‹¿…˜Ÿ…‹¿…˜ …‹¾…™Ÿ…Œ¾†™Ÿ†Œ¿†›Ÿ†Œ¿‡›Ÿ‡�¿‡œŸ‡�¿ˆ�Ÿˆ�¾ˆ�ŸˆŽ¿ˆ� ˆŽ¿‡œŸ‡�¿‡œŸ‡Ž¾ˆœ ˆ�¿‹¢ ‹‘¿˜�Ÿ°Âþ��Ÿ¡¸ý��Ÿ¢¹ý’�Ÿ¤»ý‘� ¤¹ý��Ÿ¢¸ý‘Ž ¦»ý–�Ÿ¯Áý™�Ÿ´Æý�’Ÿ»Ëý ”ŸÁÑþ¡“ŸÃÒþ¡” ÃÒþ£•ŸÆÔþ¤• ÊÖþ¦– ÎÙþ¨— ÑÜþ©— ÓÞþ©—ŸÓÞþ©— Ôßþ«˜ ×áþ­™ŸÛäþ°™ âéþ²›Ÿæìþ´›Ÿçîþ²›Ÿäëþ°™ àèþ¯™ Þçþ¯™ ßæþ®™ŸÝåþ¬˜ŸÙâþ«—ŸÖàþ«˜ŸÕßþ©—ŸÓÞþª—ŸÔßþ¬˜ ×áþ­˜ Üäþ®™ŸÝåþ¯š ßçþ°šŸáèþ±š ãéþ±š ãêþ±šŸãêþ±›Ÿãêþ²› äëþ²šŸäëþ±› äëþ²› äëþ²šŸäëþ²› åëþ³›Ÿæìþ´› çíþ´œŸéïþµ›Ÿëïþµ› êðÿµœ êðÿ´œ ëðÿµœŸêðþµœ ìðþ¶›ŸëðþµœŸëðþ¶œ ëðÿ¶œŸíðÿ¶œ ìñÿ¶œ ìñÿ¶œŸíñÿ¶œŸíñÿ¶›Ÿìðÿ¶œ ëðÿµ› êïÿµœ ìðÿµœ ëðÿµœŸëñÿ¶œ ìñÿ¶œ ìñÿµ› ìðÿ¶œŸëðÿµœ ëðÿµœ ëðÿ¶œ ëðÿµœ ëðÿµ› êðÿ´› éïþ´› èíþ±šŸãêþ¯šŸÝæþ¬˜ŸØáþª— Õßþª˜ Ôàþ«˜ŸÖàþ¬˜ Øáþ®™ Üåþ®™ Þçþ¯™ Þæþ°šŸáéþ³› æìþ´› éïÿ²š åëþ®™ Þæþ­™ Úãþ«˜ Øáþª˜ Õàþª— Ôàþ©—ŸÓÞþ©—ŸÓÞþ©— ÔÞþ©— ÓÞþ©—ŸÓÞþª—ŸÔßþ©— Ôßþª— Ôßþ©—ŸÔßþ©—ŸÓÞþ©— ÓÞþ©— ÓÞþ©—ŸÓÞþª— Óßþ©—ŸÓßþ©—ŸÔÞþ©— ÓÞþª—ŸÕßþ«˜ ×áþ­˜ Úäþ®™ŸÞæþ°šŸáéþ²š åëþ²šŸåìþ±š ãêþ°šŸâéþ±™ âèþ°šŸßçþ®™ Ýåþ­™ Üåþ­˜ŸÚäþ­˜ Üäþ¯™ ßçþ°™ àèþ¯™Ÿßçþ¯š ßçþ­™ŸÛäþª— Öàþ¨—ŸÒÞþ¨– ÑÜÿ§– ÏÛþ¥•ŸÌÙþ¥–ŸËØþ¢”ŸÇÔþ “ŸÂÑþŸ“ ÀÐþž’ ½Íý�’Ÿ»Ìý�’ ºËý›’Ÿ¸Êýœ‘Ÿ¸Éýœ‘ ºÉý�’Ÿ»Êý�’Ÿ»Ëýž’ ½Íýž’Ÿ½Îýž’Ÿ¾Îýž“Ÿ½Íýž“Ÿ½Íýž’Ÿ¾Íýž’ ½Íþž“Ÿ¾Îþž“Ÿ¾Îþ “ŸÀÏþŸ“ ÀÏþž“Ÿ½Íþ�’Ÿ½Ìý�“Ÿ¼Ìýž’Ÿ½Ìýœ’ŸºËýœ’Ÿ¸Éý›‘Ÿ·Éý›‘Ÿ·Èýš‘Ÿ¶Çýš�Ÿ´Æýš‘Ÿ¶Çýš‘ŸµÇýš‘ŸµÇýš‘ŸµÈýš‘ŸµÇý›‘Ÿ·Éýœ’ŸºÌýž“Ÿ¾Ïý “ŸÁÐþ¡” ÃÑþ¡”ŸÄÒþ¢” ÆÔþ¤•ŸÉÖþ¦–ŸÍÙþ©— ÒÝþ©—ŸÓÞþ©— ÓÞþ©—ŸÓÞþ¨— ÒÞþ¨—ŸÑÜþ¨— ÑÜþ©–ŸÒÝþ©— ÒÞþ©— ÒÝþ¨—ŸÑÝþ¨– ÑÜþ¨— ÐÜþ¨—ŸÑÜþ©–ŸÒÞþ¨—ŸÒÞþ©—ŸÓÞþ©— ÓÞþª—ŸÔßþª— ÔÞþ¨–ŸÑÜþ§–ŸÏÚþ¦–ŸÌÙþ¥• Ê×þ£• ÉÖþ£•ŸÈÕþ¤•ŸÈÖþ¤” ÉÖþ¤”ŸÉÖþ¥–ŸÊ×þ¥– ËØþ¥•ŸÌÙþ¦• ÌØþ¥–ŸËØþ¥• Ê×þ¤•ŸÉÖþ£• ÈÖþ£• ÈÖþ¢•ŸÅÔþ¡” ÅÒþ¢“ŸÄÒþ¡”ŸÃÒþ¢” ÄÒþ¢” ÅÔþ£•ŸÇÔþ£• É×þ¤• ÉÖþ¥– ÌÙþ¦– ÎÚþ¨–ŸÏÜþ¨—ŸÐÜþ¨— ÑÝþ©— ÒÝþ©– ÒÝþ©— ÓÞþ©—ŸÓÞþ©—ŸÓßþª— Ôßþ©— ÓÞþ©—ŸÔßþ©— Óßþ©— ÓÞþ©— ÔÞþª— Óßþª—ŸÔÞþ©—ŸÔßþª— Ôßþª— Ôßþ©— Õßþ©—ŸÔÞþ©— ÔÞþ©—ŸÔÞþ©— Õßþª— Õßþª—ŸÕßþ©—ŸÒÝþ¦– ÎÚþ¦–ŸÌÚþ¥• Ë×þ¤• É×þ¡”ŸÄÓþ¡”ŸÃÒþ “ ÀÐþž’Ÿ¼Ìý�’ŸºËý›‘Ÿ·Èý˜�Ÿ²Äý–�Ÿ­Áý•�Ÿª¾ý“ŽŸ§¼ý“ŽŸ§½ý’Ž ¥»ý��Ÿ£ºý�� ¢¸ý�ŒŸŸ¶ýŽŒŸžµýŽŒŸ�´ý�ŒŸœ´ýŒŒŸš³ýŒŒ ™±ý‹‹Ÿ™±ý‹‹Ÿ—°ý‹‹ —°ýŠŠ –¯ý‡ŠŸ‘¬ü…ˆŸ�¨ü„ˆŸ‰¥üƒ‡Ÿˆ¤ü„ˆŸ‰¥ü…‰ŸŒ¨ü‡ŠŸ‘¬üŠ‹Ÿ˜°ý‹‹ —¯ýŠ‹Ÿ–°ý‹‹Ÿ˜±ý‹‹Ÿ™±ýŒ‹Ÿ›²ý�ŒŸœµýŽŒ  ¶ý‘ŽŸ¢¸ý‘�Ÿ£¹ý’ŽŸ¤ºý’ŽŸ¥»ý‘Ž ¥ºý‘�Ÿ£ºý‘�Ÿ£¹ý‘�Ÿ¤¹ý™‘Ÿ´ÅþŒ¢ŸŒ‘¿ˆœŸˆŽ¿ˆ�Ÿˆ�¿‡œŸ‡Ž¾ˆœŸˆŽ¾‡œ ‡Ž¿‰žŸ‰Ž¾‹¡ ‹�¿Œ£ŸŒ‘¿Ž¥ŸŽ’¿�¨ �“¿�© �”¿�©Ÿ�”¿�ª �”¿‘«Ÿ‘•¿’¬Ÿ’–¿”®Ÿ”—¿”¯Ÿ”—¿“® “—¿”® ”—¿”¯Ÿ”—¿•° •—¿–±Ÿ–™¿˜´ ˜š¿™µ ™›¿š·Ÿšœ¿™¶ ™›¿˜´Ÿ˜š¿—´ —š¿—³ —™¿–² –™¿–±Ÿ–˜¿•° •˜¿•° •—¿•® •—¿•¯Ÿ•—¿”° ”—¿”° ”˜¿•±Ÿ•˜¿—² —™¿–² –™¿˜³ ˜™¿—³Ÿ—š¿˜´ ˜š¿˜´ ˜›¿™µ ™š¿™¶Ÿ™›¿š· šœ¿›¸ ›œÀ›· ››Àš¸ š�¿›¹ ›œÀ›¹ ›œ¿œ¹ œ�¿œºŸœ�¿œ» œ�¿œºŸœ�À�» ��¿�»Ÿ��¿œ» œ�À�¼Ÿ�ž¿�» ��À�¼ �ž¿�» ��¿�» �žÀ�» �žÀ�»Ÿ��¿�» �ž¿œ»Ÿœ�¿�»Ÿ��¿œ» œ�Àœº œ�¿œº œ�¿œ¹ œ�À›º ›�¿œº œ�À›¹Ÿ›œÀ›º ›œ¿œ¹ œ�À›¹ ›œÀ›¸Ÿ›œÀš·Ÿš›¿™¶ ™›¿˜´Ÿ˜›¿—³Ÿ—™¿•±Ÿ•˜¿”¯ ”—¿•¯Ÿ•—¿”¯ ”—¿–± –˜¿–±Ÿ–˜¾—² —š¿—³ —™¿—´Ÿ—™¾˜´Ÿ˜™¿™µŸ™š¿š·Ÿš›¿š·Ÿš›¿™¶Ÿ™š¿˜µ ˜š¿—³ —™¿—²Ÿ—™¿–± –˜¿•° •˜¿•¯ •—¿”® ”˜¿”¯Ÿ”—¿”¯ ”—¿”¯Ÿ”—¿”¯ ”—¿”® ”—¿”®Ÿ”—¿”®Ÿ”—¿•¯Ÿ•—¿”¯ ”—¿”® ”—¿”¯ ”—¿”¯Ÿ”—¿”¯Ÿ”—¿•°Ÿ•—¿•°Ÿ•˜¿–±Ÿ–˜¿–² –™¿—³ —™¿˜³Ÿ˜š¿˜´ ˜š¿˜µŸ˜š¿˜µŸ˜š¿™µŸ™š¿˜¶Ÿ˜š¿˜µŸ˜š¿˜¶ ˜š¿™µ ™š¿™µŸ™›¿™µ ™›¿™µŸ™š¿˜µ ˜š¿˜µ ˜š¿˜´ ˜š¿—³ —™¿•± •˜¿–±Ÿ–˜¿•¯ •—¿”¯Ÿ”—¿”¯Ÿ”—¿”¯ ”—¿”®Ÿ”—¿”¯ ”—¿”®Ÿ”—¿“­ “–¿“­ “–¿“­ “–¿“¬ “–¿’¬Ÿ’–¾’« ’•¿’ªŸ’•¿‘«Ÿ‘•¿‘ªŸ‘”¿�© �•¿�©Ÿ�”¿�©Ÿ�”¿�¨Ÿ�”¿�© �”¿�¨Ÿ�”¿�¨ �”¿�¨Ÿ�“¿�§Ÿ�“¾�¦Ÿ�“¾�§Ÿ�“¿�¦Ÿ�“¾�¦Ÿ�’¿Ž¦ŸŽ“¾Ž¦ŸŽ’¾Ž¦ŸŽ’¿Ž§ŸŽ“¿�§Ÿ�“¾Ž§ŸŽ“¿Ž¦ŸŽ“¿Ž¦ŸŽ’¿Ž¦ŸŽ’¾Ž¥ŸŽ’¾�¥Ÿ�’¿Ž¥ŸŽ’¾Ž¥ŸŽ’¾�¦Ÿ�’¿�¦ �“¿�§Ÿ�“¿�¨Ÿ�”¿�¨ �“¿�¨Ÿ�“¿�© �”¿�©Ÿ�”¿‘© ‘”¿‘ª ‘•¿‘«Ÿ‘•¾’¬ ’–¿“­Ÿ“–¿”­ ”–¿”® ”–¿”®Ÿ”—¿“® “—¿”® ”—¿”® ”—¿”® ”—¾“¯Ÿ“—¿“®Ÿ“–¿”® ”–¿“®Ÿ“—¿”®Ÿ”–¿”®Ÿ”—¿”®Ÿ”—¿”®Ÿ”—¿”® ”—¿“® “—¿”¯Ÿ”˜¿•¯ •—¿”¯Ÿ”—¿•¯ •—¿”¯Ÿ”—¿”¯ ”—¿•°Ÿ•—¿”¯Ÿ”—¿•¯Ÿ•˜¿•° •˜¿•°Ÿ•—¿•± •˜¿•± •˜¿•± •˜¿•± •˜¿•± •˜¿•° •˜¿•° •˜¿•°Ÿ•˜¿•± •˜¿•±Ÿ•™¿–±Ÿ–˜¿–±Ÿ–˜¿–² –˜¿—³ —™¿—² —™¿—³Ÿ—™¿—²Ÿ—™¿—³Ÿ—™¿—³Ÿ—™¿—³ —š¿—´Ÿ—š¿—´Ÿ—™¿—´Ÿ—™¿—´ —™¿˜´ ˜š¿—´Ÿ—š¾˜´Ÿ˜š¿˜µŸ˜›¿™µ ™š¿™µŸ™š¿™µŸ™š¿™µŸ™›¿™µŸ™š¿™¶ ™›¿˜µ ˜š¿˜µŸ˜š¿™´Ÿ™š¿˜µŸ˜š¿™´ ™š¿˜µŸ˜š¿˜µ ˜š¿˜´Ÿ˜›¿˜´ ˜š¿˜´Ÿ˜š¿˜´Ÿ˜™¿—³ —š¿—³Ÿ—™¿—² —™¿—²Ÿ—™¿–²Ÿ–˜¿•± •˜¿•° •˜¿•° •—¿“®Ÿ“—¿“­ “—¿“¬Ÿ“•¿“¬Ÿ“–¿’«Ÿ’•¿�© �”¿�§Ÿ�“¿Ž¦ Ž’¿Ž¥ Ž’¿Œ¤ Œ’¿Œ¢ Œ�¾‹¢Ÿ‹�¿Š¡ŸŠ�¾Š ŸŠ�¾‰ž ‰�¾ˆ�ŸˆŽ¾‰�Ÿ‰Ž¾ˆœŸˆŽ¾‡œŸ‡�¾‡›Ÿ‡�¿‡› ‡�¾‡›Ÿ‡�¾‡›Ÿ‡Œ¿†š †Œ¿†šŸ†Œ¾†›Ÿ†�¿†šŸ†�¾‡š ‡�¾‡›Ÿ‡�¿‡œ ‡�¿ˆœŸˆ�¿‡œŸ‡�¿‡› ‡�¾‡œŸ‡�¾‡œŸ‡�¿ˆœŸˆ�¾ˆœŸˆ�¿ˆœ ˆ�¿ˆœŸˆ�¾ˆœŸˆ�¿ˆœŸˆ�¿Œ£ Œ‘¿™‘ ³Åþ‘�Ÿ¤¹ý’�Ÿ¤ºý‘ŽŸ¤ºý��Ÿ£¹ý‘�Ÿ¤ºý“Ž ¨½ý—�Ÿ°Ãýš‘ŸµÇýž’Ÿ¼Íý “ ÁÐþ¡“ŸÃÑþ¡“ŸÃÒþ£” ÆÔþ¤• ÈÖþ¦–ŸÍÙþ©–ŸÒÝþ©—ŸÓÞþ¨—ŸÑÞþ©—ŸÔÞþª˜ŸÔßþª— Öàþ­™ŸÚãþ°™Ÿàèþ³š åëþ´›Ÿéïÿ³› çíþ±šŸâêþ¯™ ßçþ®™ Þæþ®™ Ýåþ¬™ Ûãþ«˜ŸØáþª˜ŸÖàþª— ÔÞþ©—ŸÓÞþ©˜ŸÔßþª˜ Õàþ¬˜ Øâþ®˜ŸÛäþ®™ŸÜåþ¯™ŸÞçþ¯™ ßçþ¯š àèþ±šŸãêþ²› åëþ´› çíþ´œŸéïÿ¶œ ëðÿµœ ëðÿ¶œŸìòÿ¶œ íòÿ·œŸîòÿ¸œŸïóÿ¸� ðôÿ¸ž ñõÿ¹žŸòõÿ¹�ŸóöÿºžŸóöÿºž ô÷ÿºž ô÷ÿ»žŸõ÷ÿºžŸô÷ÿº�Ÿôöÿº� óöÿ¹� ôöÿ¹ž óöÿ¹ž òöÿ¹ž òöÿ¹� òöÿ¹�Ÿòõÿ¹� òõÿ¸� ñöÿ¸�Ÿñôÿ¸� ñôÿ¸� ðôÿ¸�Ÿïóÿ·œŸïóÿ·œ îóÿ·œŸíñÿµœŸëðÿ´› êîþ³šŸæìþ±š ãêþ¯™ŸÞæþ¬˜ŸØâþ©—ŸÔßþª— ÓÞþª— Õßþ¬˜ Øáþ­˜ŸÛäþ®™ Ýæþ®™ŸÞæþ¯™ Þçþ°š áéþ²›Ÿåëþ´› èîþ´›Ÿéîþ²›Ÿåìþ±šŸãêþ¯š ßçþ­˜ŸÜäþ¬™ŸÙãþ«˜ ×âþª˜ Õßþª—ŸÓÞþª— ÓÞþ©— ÔÞþ©— ÓÞþ©—ŸÓÞþ©— ÓÝþ©—ŸÓÝþ¨—ŸÒÝþª—ŸÓÞþ©— ÓÞþ©— ÓÞþ©— ÓÞþ©— ÓÞþ©—ŸÔßþª˜ Õßþª˜ŸÖàþ«˜ŸØâþ¬˜ŸÚãþ¯™ Þæþ°™ ßçþ±šŸáèþ±›Ÿâêþ±›Ÿâëþ±š ãêþ²› äëþ²› äêþ²š äëþ²šŸäëþ²šŸäëþ²› åëþ²šŸäêþ²šŸäëþ±šŸãêþ°™ àèþ¯™ Þåþ¬˜ŸÚãþ¬˜Ÿ×âþª— Ößþ©— ÓÞþ©— ÔÞþ©—ŸÒÝþ©—ŸÔÞþ©—ŸÒÝþ¨–ŸÑÜþ§– ÏÛþ§–ŸÎÛþ¦– ÎÚþ¥•ŸÌÚþ¥– ËØþ¤•ŸÊ×þ¤• É×þ£• ÇÕþ¢•ŸÆÕþ£”ŸÆÔþ¢” ÄÒþ¢“ ÄÒþ¡“ ÃÒþ¡“ŸÃÑþ¡”ŸÃÑþ “ ÂÑþ ”ŸÁÐþŸ“ ¿ÏýŸ“ ¿Îýž“Ÿ¾Îýž“Ÿ¿Îþž“Ÿ½Íýž“Ÿ½Íýž“ ¾Íýž“Ÿ½Íýž“Ÿ½Ïýž“ ½Îýž’Ÿ½Íý�’Ÿ¼Íý�“Ÿ»Ìý�’Ÿ¼Ìýœ’Ÿ»Ëý�’ŸºËý�’Ÿ»Ìý�“Ÿ½Ìýž’Ÿ½Íýž“ ¾ÎýŸ“ŸÀÏþ ”ŸÂÐþ ” ÂÑþ¡” ÃÑþ¡”ŸÄÒþ¢” ÄÓþ¢” ÆÔþ¤•ŸÈ×þ¥•ŸÊ×þ§• ÍÙþ¨– ÐÛþ¨–ŸÑÜþ¨—ŸÒÝþ¨— ÒÝþ¨—ŸÒÝþ©—ŸÒÞþ©—ŸÒÝþ©— ÓÞþ¨–ŸÑÝþ¨—ŸÒÝþ¨– ÒÞþ©– ÒÝþ©—ŸÒÝþ©— ÒÝþ©— ÒÞþ©— ÒÝþ©– ÒÝþ©— ÓÝþ©— ÓÞþª—ŸÓßþ©—ŸÔÞþ©— Óßþ©— ÓÞþ©—ŸÓÞþª— Õßþ©˜ Ôßþª— Õßþª˜ Öàþ«˜Ÿ×áþ¬™ŸØâþ«˜ŸØâþ¬˜ Ùâþ«˜ŸØâþ«˜ŸØâþ«˜ŸØáþ«˜ŸØáþ«˜Ÿ×áþ«˜ ×áþ¬˜ŸØâþ¬˜ŸÚâþ­˜ŸÚãþ­™ŸÛåþ®™ Üåþ®™ Ýåþ®™ Ýçþ¯š Þæþ¯™ ßçþ°™Ÿßçþ¯šŸßèþ¯™ àèþ°š àèþ°šŸáèþ°š áèþ°™ àèþ±šŸáéþ±š âéþ²šŸãêþ±› ãêþ²šŸäêþ±š åëþ²šŸäêþ²š ãêþ²š äëþ²› ãêþ°š âêþ±šŸâêþ±š äêþ±š ãêþ±š ãêþ±š ãêþ±š ãêþ±š âéþ°šŸáéþ°š àèþ°™ àçþ¯™Ÿßçþ®š Ýæþ¯™ŸÝåþ®˜ Üäþ¬˜ Úâþª˜ŸÖàþ©—ŸÔßþ¨– ÑÝþ§–ŸÏÛþ¦•ŸÌÙþ¥• ÌØþ¤•ŸÉÖþ¢” ÄÒþ ”ŸÀÏþ�“Ÿ¼Ìþœ’ ºÌþ›‘ ·Èþš�Ÿ´Æý˜�Ÿ±Åý—�Ÿ¯Âý–� ®Âý”ŽŸ©¾ý“ŽŸ¨¼ý’ŽŸ§»ý’ŽŸ¦ºý‘�Ÿ£ºý�� ¡¹ý�ŒŸ ¸ý��  ·ý��Ÿ¡·ýŽ�ŸŸ¶ýŽŒŸž¶ýŽŒŸž¶ýŽ�ŸŸ¶ýŽ�ŸŸ¶ý��Ÿ¡¸ý�� ¢¸ý�ŽŸ¢ºý�ŽŸ¤¹ý��Ÿ£¹ý‘� £ºý‘�Ÿ£¹ý‘�Ÿ£ºý‘�Ÿ¤¹ý‘� £ºý‘� £¹ý‘�Ÿ¤ºý‘ŽŸ¤ºý™‘Ÿ´Çþ‹¢ ‹‘¿‡œ ‡�¿‡� ‡Ž¾ˆœŸˆŽ¾ˆœ ˆ�¿ˆœŸˆŽ¿ˆžŸˆŽ¿‹ Ÿ‹�¿Œ¢ŸŒ‘¿�¦Ÿ�’¿�§Ÿ�“¿�¨ �”¿�© �”¿‘«Ÿ‘•¿“­ “—¿”®Ÿ”—¿”® ”—¿”®Ÿ”—¿”®Ÿ”—¿”¯ ”˜¿–± –™¿—²Ÿ—™¿˜³ ˜™¿™µŸ™š¿™·Ÿ™›¿š· šœ¿™µŸ™š¿˜µ ˜š¿—³ —™¿—³ —™¿—³Ÿ—™¿—²Ÿ—™¿–±Ÿ–™¿•°Ÿ•˜¿•° •˜¿•° •˜¿•¯ •—¿”¯ ”—¿”¯Ÿ”˜¿”¯Ÿ”—¿”°Ÿ”—¿•° •˜¿–° –˜¿–² –˜¿—³Ÿ—™¾˜µŸ˜›¿š¶ š›¿›¸Ÿ›œ¿š¸ šœ¿œ¹Ÿœœ¿œº œ�Àœº œ�¿œº œ�¿�º ��¿�»Ÿ�žÀœ»Ÿœž¿�¼ �žÀž¼ žžÀ�¼ �ž¿ž¼ žžÀž½ žŸÀŸ¾ ŸŸÀž¾ žž¿ž¾ žž¿ž½ žŸÀž¾ žŸ¿ž¾ žŸÀŸ½ŸŸž¿Ÿ¾ Ÿž¿ž½ žž¿ž½Ÿžž¿ž¼Ÿžž¿�¼ �žÀœ» œž¿�» �žÀœºŸœžÀœº œ�¿œ¹ œ�¿œº œœ¿›¹ ›œ¿š¸ šœÀ™·Ÿ™œ¿˜µ ˜š¿—³ —š¿•± •˜¿”¯Ÿ”—¿•¯Ÿ•—¿•¯Ÿ•—¿–±Ÿ–™¿–±Ÿ–™¿—²Ÿ—™¿—² —™¿—³Ÿ—™¿—´ —š¿™µŸ™š¿™¶Ÿ™›¿š·Ÿš›¿š¸ š›¿™·Ÿ™›¿˜µ ˜š¿˜´ ˜š¿—³Ÿ—™¿—²Ÿ—™¿–± –™¿–°Ÿ–˜¿•±Ÿ•˜¿•¯ •—¿”¯ ”—¿”¯Ÿ”—¿”¯Ÿ”—¿•°Ÿ•—¿”¯ ”—¿”¯ ”—¿”¯Ÿ”–¿”®Ÿ”—¿”® ”–¿“® “–¿”® ”–¿”¯ ”–¿”® ”—¿”®Ÿ”—¿”¯Ÿ”—¿”® ”—¿”¯Ÿ”—¿”¯ ”—¿•¯ •—¿•¯Ÿ•—¿•° •˜¿•° •˜¿•± •˜¿•°Ÿ•™¿•±Ÿ•˜¿•° •˜¿•±Ÿ•˜¿–± –˜¿•± •˜¿•±Ÿ•˜¿•° •˜¿•¯Ÿ•˜¿•¯ •—¿•¯ •—¿”°Ÿ”—¿”¯ ”—¿”®Ÿ”˜¿”¯ ”—¿”®Ÿ”—¿”¯Ÿ”—¿”¯Ÿ”—¿”¯Ÿ”—¿“¯ “–¿”® ”—¿”¯ ”—¿”®Ÿ”—¿”® ”–¿“®Ÿ“–¿”® ”—¿”¯Ÿ”—¿“¯Ÿ“—¿“®Ÿ“–¿’¬ ’•¿’«Ÿ’•¿‘© ‘•¿�© �”¿�¨ �”¿�¨ �“¿�§ �“¿Ž¥ŸŽ’¿Ž¥ŸŽ’¾Ž¥ŸŽ’¿Ž¥ Ž’¾�¥Ÿ�“¾Ž¥ŸŽ’¾�¤Ÿ�’¾�¤Ÿ�‘¿�¤Ÿ�‘¿�¤ �’¿Œ¤ŸŒ‘¾�¥ �‘¾�£ �‘¾Œ£ŸŒ’¿Œ¤ŸŒ‘¾�£ �’¾�¤Ÿ�‘¿�¤Ÿ�’¾�¤Ÿ�‘¾�¤Ÿ�‘¾�¤Ÿ�‘¿�¥Ÿ�’¿Ž¤ Ž’¿�¤ �’¿�¤Ÿ�‘¿�¤ �’¿Ž¥ŸŽ’¿Ž¥ŸŽ’¾Ž§ Ž“¿�¦ �“¿�§ �“¿�¨ �“¿�¨ �“¿�©Ÿ�”¿‘ª ‘•¿’« ’•¿’«Ÿ’–¿’« ’•¿’¬ ’–¿“¬ “–¿“¬ “–¿“­Ÿ“—¿“® “—¿”¯ ”—¿”®Ÿ”–¿”® ”–¿”® ”—¿”¯Ÿ”˜¿•° •—¿•°Ÿ•˜¿–² –˜¿—³Ÿ—š¿˜µ ˜š¿™´Ÿ™š¿˜µŸ˜š¿˜´ ˜š¿˜µ ˜š¿˜´Ÿ˜š¿—³ —™¿—²Ÿ—™¿–²Ÿ–™¿–²Ÿ–˜¿–² –˜¿–² –™¿–² –˜¿—²Ÿ—™¿—²Ÿ—™¿—³ —š¿—³Ÿ—™¿—³Ÿ—™¿—²Ÿ—™¿—²Ÿ—˜¿—² —™¿–² –™¿—³ —˜¿—² —˜¿—³ —™¿–± –™¿–²Ÿ–™¿–²Ÿ–™¿–± –˜¿–³ –™¿–²Ÿ–™¿˜³Ÿ˜™¿—³Ÿ—™¿—² —™¿—²Ÿ—™¿—²Ÿ—™¿–²Ÿ–˜¿–± –˜¿–± –˜¿–±Ÿ–˜¿–² –˜¿–± –˜¿•° •˜¿•° •—¿•°Ÿ•˜¿•± •˜¿–°Ÿ–˜¿•°Ÿ•˜¿–° –—¿•°Ÿ•˜¿•° •˜¿•° •˜¿–±Ÿ–˜¿—²Ÿ—™¿–² –™¿—² —™¿—³ —™¿—´ —™¿—³Ÿ—š¿—³Ÿ—š¿™´ ™š¿˜´Ÿ˜™¿˜³ ˜š¿˜´Ÿ˜š¿˜³ ˜š¿—³ —š¿—² —™¿–² –™¿–° –˜¿•°Ÿ•—¿•¯ •˜¿”®Ÿ”—¿’¬Ÿ’–¿“¬Ÿ“–¿“¬ “•¿’« ’•¿‘« ‘•¿‘ªŸ‘•¿�© �”¿�©Ÿ�“¿�¨Ÿ�“¿�§Ÿ�“¿Ž¦ Ž“¿Ž¥ŸŽ’¿�¤Ÿ�‘¾Œ¢ŸŒ�¾Œ¡ŸŒ�¾Š  Š�¿‰Ÿ ‰�¿‰žŸ‰Ž¿ˆ� ˆŽ¾ˆ� ˆŽ¾ˆ�ŸˆŽ¿ˆ� ˆ�¿‡œ ‡Ž¿ˆœŸˆ�¾ˆœŸˆŽ¾‡œ ‡�¿‡œŸ‡�¿ˆœŸˆ�¿ˆœŸˆ�¿Œ¢ŸŒ�¿˜� ²Åþ‘ŽŸ£ºý‘ŽŸ£ºý‘Ž ¤»ý��Ÿ£¹ý‘�Ÿ¥¹ý“Ž §¼ý–�Ÿ­Áý™‘Ÿ´Çý�“Ÿ»Ìý “ŸÁÏþ¡”ŸÅÒþ¢•ŸÅÓþ¤– Ë×þ§– ÐÛþ©— ÓÞþ©— ÓÝþ©— ÓÞþ©— ÓÞþª˜ŸÕàþ¬˜ŸØâþ®™ŸÜåþ±š áèþ±š äëþ´› èîþ´› éîþ²› åìþ±š âéþ¯š ßçþ®™ŸÞæþ¯™ŸÞçþ¯™ Þæþ®™ŸÛäþ¬˜ŸÚâþ¬—ŸØáþ«—Ÿ×àþª— Ößþª˜ Õàþª—ŸÔßþª˜ŸÕßþª— Ôßþª˜ŸÕàþ¬˜ŸØáþ®™ Ýäþ¯™Ÿàçþ²›Ÿäëþ³›ŸçíþµœŸëðÿ¶œŸìñÿ·�Ÿïòÿ·œ ïóÿ¸œŸðôÿ¹œŸñôÿ¸�Ÿòõÿºž óöÿº� ô÷ÿºž õøÿ»ž öøÿ»žŸöùÿ»ž ÷ùÿ¼žŸøúÿ½ž ùûÿ¼ŸŸùûÿ½ž ùûÿ¼ž ùûÿ¼Ÿ ùûÿ¼Ÿ ùûÿ½ŸŸùûÿ½ž ùûÿ¼ž ùúÿ»žŸ÷ùÿ¼Ÿ ÷ùÿ»ž öøÿºž ô÷ÿº� óöÿ¸�Ÿñõÿ¸�Ÿðôÿ·œ ïóÿ¸œ ïóÿ·œŸíòÿ´› êðÿ´œŸèîþ²š äêþ¯šŸßæþ«˜ŸØâþª˜ŸÔßþª— ÔÞþª—ŸÕßþ¬˜ŸØãþ­™ŸÛäþ®™ Þæþ®™ŸÞæþ¯™ŸÞæþ°š àèþ²š ãêþ³›Ÿçíþ´› éïÿ´œ éïÿ³š æíþ²š äëþ±šŸâéþ®™ Þçþ®˜ŸÜäþ¬™ŸÙãþ«˜ ×áþ¬—Ÿ×áþ«—ŸÕßþª— ÓÞþ©—ŸÓÞþ©—ŸÓÞþª˜ Ôßþ©— ÓÞþ©—ŸÓÞþ¨—ŸÒÝþ¨–ŸÒÜþ©– ÑÜþ¨– ÑÜþ¨—ŸÑÜþ¨– ÑÝþ©— ÒÝþ©—ŸÔÞþª— Ôßþ©—ŸÓÞþ©— ÓÞþª—ŸÔßþ«˜Ÿ×àþ«— Öàþ«˜ Öâþ«˜Ÿ×áþ¬˜ŸØáþ¬˜ŸØãþ¬˜ŸØâþ«˜ŸØâþ¬˜ŸØâþ«˜ Øâþ¬˜ Ùâþ«˜Ÿ×âþª— Öáþª˜ŸÖáþª— Õßþª˜ Ôßþ©—ŸÔßþª— Ôßþ©— ÓÞþ©—ŸÓÞþ©—ŸÓÞþ©— ÓÞþª—ŸÓÞþ©— ÓÝþ©—ŸÒÝþ©— ÔÞþ¨— ÓÞþ©— ÒÝþ¨—ŸÑÝþ©— ÒÝþ¨—ŸÒÝþ©—ŸÓÞþ©— ÒÞþ¨— ÐÜþ¥• ÌÙþ¤•ŸÊ×þ¢” ÆÕþ¢” ÄÓþ¡” ÅÒþ ” ÃÑþ “ ÁÐþ�“ ¼Ìýœ’ŸºËý�’Ÿ»Ëýœ’Ÿ»Ëýœ’ŸºËýœ‘ŸºÊý›’Ÿ¸Éýœ‘ ¸Êý›’Ÿ¸Éý›‘Ÿ·Éý›‘Ÿ·Éý›‘Ÿ¸Éý›‘Ÿ·Èý›’Ÿ·Èý›’Ÿ¶Èý›’Ÿ·Èý›‘Ÿ·Èý›‘Ÿ¸Éý›‘Ÿ·Êýœ’Ÿ¹Éýœ‘Ÿ¹Éýœ‘Ÿ¹Êýœ’ ¹Éýœ‘Ÿ¸Êý›‘Ÿ¸Éýœ‘Ÿ¹Éýœ’Ÿ»Ëþž’Ÿ½Ìýž’ ½ÍþŸ“ŸÀÎþ “ ÁÐþ “ ÂÐþ “ŸÂÑþ¢”ŸÅÓþ£• ÇÕþ¤•ŸÉÖþ¥–ŸÊ×ÿ¥–ŸÌØþ¥– ÌÙþ¦–ŸÎÙþ§– ÏÚþ¨— ÐÜþ¨—ŸÑÞþ©— ÓÞþ©— ÒÝþ¨–ŸÑÜþ©—ŸÔÞþª˜ŸÔßþª— Õßþ¬˜Ÿ×áþ®˜ Üäþ¯š àèþ±šŸãéþ²š äêþ±›Ÿâêþ±™ âéþ±šŸãéþ°šŸßèþ¯™ŸÞæþ¯™ŸÝæþ­™ Üäþ­˜ Ûäþ­™ŸÛäþ®˜ŸÜåþ®™ŸÛäþ­™ Üåþ®™ Ýåþ¯™ŸÞæþ¯™ àèþ¯šŸßçþ®™ Ýåþ®™ŸÜåÿ­™ŸÜåþ®™ Üæþ¯™ŸÝæþ®˜ Ýåþ­˜ Ýåþ­™ Ûäþ­˜ŸÛäþ­™ Üäþ­™ Ûäþ­™ Üåþ¯™ŸÝåþ¯™ŸÞæþ¯™ Þæþ®™ŸÝåþ®™ Ýåþ®™ Üåþ®˜ŸÜäþ­™ŸÛäþ¬˜ŸÚãþ¬™ŸÚãþ­™ Úãþ¬˜ Ùâþ¬˜ŸÙâþ¬˜Ÿ×áþ«˜Ÿ×âþ«˜Ÿ×áþ«˜ ×áþ«— Øáþ¬— Øáþ«— ×áþ«˜ŸØáþ¬˜ŸÙâþ­˜ Úäþ­™ Ûãþ­™ŸÜäþ®™ Þåþ¯šŸÞæþ¯™Ÿßçþ¯šŸßçþ°šŸáèþ±šŸâéþ±šŸâéþ°šŸáèþ¯š àèþ°š áèþ®™ Þçþ®™ŸÝåþ®™ Ûäþ«™ŸØâþ«—ŸÕßþª—ŸÔßþ¨—ŸÑÝþ§– ÎÚþ¦–ŸÎÚþ¦•ŸÍØþ¤• Ê×þ£•ŸÈ×þ£” ÇÔþ¢” ÄÓþ¡”ŸÃÒþ “ŸÀÏþž“Ÿ¾Îþž’Ÿ¼Íþœ’ ºËþ›‘Ÿ¸Éýš‘ŸµÆý™�Ÿ²Äý–� ¯Áý”�Ÿ«¿ý“ŽŸ¨½ý“�Ÿ§¼ý’Ž ¥»ý‘Ž ¥¼ý’�Ÿ¥»ý’ŽŸ¤ºý‘�Ÿ¤ºý‘�Ÿ£¹ý‘�Ÿ¢¹ý��Ÿ¤¹ý‘�Ÿ¤ºý‘ŽŸ£ºý™‘Ÿ³ÅþŠŸŸŠ�¿…™ …‹¾†™Ÿ†‹¿†™Ÿ†Œ¾†šŸ†Œ¿‡›Ÿ‡�¿ˆœŸˆŽ¾ˆœŸˆ�¾ˆœ ˆŽ¿ˆ�ŸˆŽ¿Š ŸŠ�¾Œ¢ŸŒ�¿�¥Ÿ�’¿�¨ �“¿�¨ �”¿�ªŸ�”¿“¬ “•¿“­Ÿ“–¿”®Ÿ”—¿”¯ ”—¿•¯ •—¿”¯Ÿ”˜¿–± –˜¿—³ —š¿—´Ÿ—š¿˜´ ˜™¿™µŸ™š¿™¶ ™š¿˜µŸ˜™¿—³Ÿ—™¿—³Ÿ—™¿—³Ÿ—™¿—²Ÿ—™¿—² —™¿–± –˜¿–± –˜¿–°Ÿ–˜¿•¯ •—¿•°Ÿ•—¿•° •—¿•° •—¿”¯Ÿ”—¿”¯ ”—¿”° ”—¿•¯ •—¿”°Ÿ”—¿•°Ÿ•—¿”° ”—¿”°Ÿ”˜¿•±Ÿ•˜¿–± –˜¿–² –™¿—³ —™¿˜´ ˜š¿˜µŸ˜š¿š·Ÿš›¿š¸ š›¿›¸ ›œÀ›¹Ÿ›�¿œ¹ œœ¿›¹ ›œ¿œº œ�¿›º ›�¿œº œ�Àœ» œ�Àœº œ�¿�»Ÿ��¿œº œ�À�º ��Àœ» œ�¿�» �ž¿�»Ÿ��¿�»Ÿ�ž¿�»Ÿ��¿�ºŸ�ž¿œ»Ÿœ�À�ºŸ��¿œº œ�Àœº œ�¿›¹Ÿ›�¿œ¹ŸœœÀ›¹ ›�¿›¸ ›œÀš·Ÿš›¿™¶Ÿ™š¿—³Ÿ—™¿•± •˜¿•¯ •˜¿•¯ •—¿•°Ÿ•˜¿–²Ÿ–˜¿—³Ÿ—™¿—³Ÿ—™¿˜´ ˜™¿™µ ™›¿š· š›À™¶ ™›¿™¶ ™š¿˜´ ˜š¿—³ —š¿—²Ÿ—™¿–²Ÿ–™¿–° –˜¿•±Ÿ•˜¿”°Ÿ”—¿•°Ÿ•˜¿•°Ÿ•—¿•¯Ÿ•—¿•¯ •—¿”°Ÿ”—¿”¯Ÿ”˜¿•° •˜¿•°Ÿ•˜¿•° •˜¿•° •—¿•¯ •—¿”¯Ÿ”˜¿”¯Ÿ”—¿”¯Ÿ”—¿”¯ ”—¿•¯ •—¿”¯Ÿ”—¿”¯ ”—¿”¯Ÿ”—¿”¯ ”—¿”®Ÿ”—¿”® ”—¿”¯Ÿ”—¿”®Ÿ”—¿”® ”—¿”® ”–¿”¯ ”—¿“® “–¿”® ”—¿“­Ÿ“–¿“®Ÿ“—¿”®Ÿ”—¿”®Ÿ”—¾”® ”—¿”¯Ÿ”—¾”® ”—¿”®Ÿ”–¿”¯Ÿ”—¿”®Ÿ”—¿”® ”—¿”®Ÿ”–¿”¯Ÿ”–¿”¯Ÿ”—¿”¯ ”—¿”® ”—¿”¯ ”—¿”¯ ”—¿”¯ ”—¿”¯ ”—¿”¯Ÿ”—¿”¯Ÿ”—¿”¯ ”˜¿”°Ÿ”—¿”¯ ”—¿”®Ÿ”—¿“­ “–¿’¬Ÿ’•¿’«Ÿ’•¿‘«Ÿ‘•¿‘ª ‘”¿‘©Ÿ‘•¿‘ªŸ‘•¿‘ª ‘”¿�© �”¿�© �”¿�©Ÿ�“¿�¨ �“¿�¨Ÿ�“¿�¨Ÿ�”¿�¨Ÿ�“¿�§ �“¿Ž¦ŸŽ’¾Ž¦ŸŽ’¾�¤ �’¾Œ£ Œ‘¾Œ£ŸŒ‘¿‹¢Ÿ‹‘¾‹¡Ÿ‹�¿Š ŸŠ�¿ŠŸŸŠ�¿ŠŸŸŠ�¿‰ŸŸ‰�¾‰žŸ‰Ž¿ˆ�ŸˆŽ¾ˆœŸˆŽ¾ˆœ ˆŽ¾ˆ�ŸˆŽ¾ˆ�ŸˆŽ¾ˆ�ŸˆŽ¿‡œŸ‡�¾‡œŸ‡�¿‡›Ÿ‡�¾‡›Ÿ‡�¿‡œŸ‡�¿‡›Ÿ‡�¿‡œŸ‡�¿‰�Ÿ‰Ž¾‰ŸŸ‰�¿ŠŸŸŠ�¿‹¡ ‹�¾�¤Ÿ�’¿�§ �“¿�¨Ÿ�”¿‘ª ‘•¿“­Ÿ“–¿”®Ÿ”—¿”® ”—¿”¯Ÿ”—¿•° •˜¿—² —™¿™µ ™›¿š· š›À™µ ™š¿—´Ÿ—™¿˜³ ˜š¿—± —™¿–±Ÿ–™¿–° –˜¿–± –˜¿–² –˜¿˜´ ˜š¿™¶Ÿ™›¿›¸ ›œ¿œ¹ œœÀ�» ��À�¼ �ž¿�» �žÀ�¼ �ž¿ž¼ žž¿�¼ �ž¿�½ �ž¿ž¼ žžÀ�¼ �žÀ�¼ �ž¿�» ��ÀœºŸœ�¿›º ›�À›¹ ›œ¿›¸ ›�À›¸ ›œÀš· šœÀ™·Ÿ™›¿™µŸ™›¿™´ ™š¿—³ —™¿—³ —š¿—³Ÿ—™¿—´ —™¿˜´ ˜™¿˜µ ˜š¿™µŸ™›¿š·Ÿš›¿š·Ÿš›Àš· š›¿š· šœ¿›· ›œ¿›¸ ››À›¸ ››¿›¸ ›œ¿›¸ ›œ¿›¸Ÿ›œÀš¸ šœÀš¸ šœ¿š¸ šœÀš· šœ¿š· šœÀ˜¶ ˜›¿˜´ ˜š¿˜´ ˜š¿—³Ÿ—š¿–²Ÿ–™¿•± •™¿•°Ÿ•˜¿•¯ •˜¿•±Ÿ•˜¿–± –˜¿–±Ÿ–˜¿–²Ÿ–˜¿—³Ÿ—™¿˜³ ˜™¿˜´Ÿ˜™¿™µ ™š¿™¶Ÿ™›¿™µŸ™›¿™¶ ™š¿—´ —š¿–²Ÿ–™¿–± –˜¿”¯Ÿ”—¿”® ”—¿”®Ÿ”—¿”®Ÿ”—¿”¯ ”—¿“®Ÿ“—¿’¬Ÿ’–¿‘«Ÿ‘•¿‘ª ‘•¿‘ª ‘”¿�©Ÿ�”¿‘©Ÿ‘”¿�¨ �”¿�¨ �”¿�¨Ÿ�“¿�§Ÿ�“¿Ž§ Ž“¿�¦ �’¿Ž¥ Ž“¿�¥ �’¿�¥Ÿ�‘¿�£Ÿ�‘¿‹¢Ÿ‹‘¾‹¢Ÿ‹�¿‹ Ÿ‹�¾ŠŸ Š�¿�¤Ÿ�‘¿•�Ÿ«¿þŒŒŸš²ý�ŒŸœ³ý�Œ �´ý�Œ žµý�� £¸ý‘ŽŸ£¹ý’�Ÿ¤ºý’Ž ¥ºý’ŽŸ¥»ý•� «Áý˜‘Ÿ³Åýœ’ ºËý “ ÀÏþ¢”ŸÄÒþ£”ŸÆÔþ¥• ÌØþ§–ŸÎÚþ©—ŸÒÝþ©—ŸÓßþª—ŸÓÞþ©—ŸÔßþ­˜ Ùâþ¯™ Þæþ°š áèþ±šŸâéþ²šŸåëþ²š åëþ°š âéþ¯š ßçþ¯™ŸÞçþ¯™Ÿßæþ®™ŸÞæþ®™ŸÜåþ­˜ Úãþ­˜ŸÙâþ¬˜Ÿ×âþ«—ŸÖàþª— Öàþ«—ŸÖàþª˜ŸÖßþª—ŸÕßþª— Õßþª˜ŸÕßþª— Ôßþª—ŸÕßþ©˜ŸÔàþª—ŸÕàþ«—ŸÖàþ«˜ ×âþ¬˜ Øâþ­˜ Úãþ¯™ŸÞæþ°šŸáéþ³› æìþ´› èîþµœ ëðþ¶œ íñÿ·� íòÿ·œ îòÿ·œ îòÿ·�Ÿïóÿ¸�Ÿðôÿ¸�Ÿðôÿ¹� ñõÿ¹ž òõÿ¹� òöÿ¹� òõÿ¹� ò÷ÿ¹� óöÿ¹�Ÿôöÿº� óöÿºž ô÷ÿº� ô÷ÿº�Ÿôöÿº� óöÿ¹� òõÿ¸� ñôÿ¸� ñôÿ·� ïóÿ¸� ïóÿ¶� îòÿ¶œŸíñÿµœ êïþ³›Ÿæìÿ¯šŸÞæþ¬˜ŸÙâþª— Õáþª—ŸÕßþ«˜Ÿ×âþ­˜ŸÛåþ¯™ Þæþ¯™ Þæþ°š àèþ²› äëþ´›Ÿèîÿ³›Ÿçíþ²›Ÿäëþ±šŸâéþ°š ßçþ®™ŸÞåþ­™ŸÜäþ­˜ Úâþ«˜Ÿ×âþª—ŸÖàþ«—Ÿ×âþ«˜ŸÖàþª—ŸÖßþª˜ŸÖàþª˜ŸÖàþ«— Õàþª˜ŸÖàþª˜ŸÖàþª—ŸÖàþª— Õàþª˜ Õßþª˜ŸÔßþ©—ŸÕßþ©—ŸÔßþ©— Ôßþª—ŸÕßþª— Óßþ©—ŸÓÞþ©—ŸÓÞþª— ÓÞþ©— ÓÞþ©—ŸÓÞþª— ÓÞþ©– ÒÝþ©— ÓÞÿ¨— ÒÝþ¨—ŸÑÝþ¨—ŸÑÝþ§–ŸÐÜþ§– ÐÜþ¨–ŸÐÜþ§– ÐÜþ¨–ŸÑÜþ©– ÒÝþ©— ÓÞþ¨–ŸÒÝþ©— ÒÝþ¨— ÒÝþ©—ŸÓÝþ©— ÒÞþ©— ÒÝþ©— ÒÞþ©—ŸÒÝþ©— ÒÝþ©– ÓÝþ¨—ŸÒÞþ©— ÔÞþª—ŸÓÞþ©—ŸÓÞþª— ÓÞþ©— ÓÞþª— Ôßþ©—ŸÔßþ©—ŸÓÞþ§—ŸÐÜþ§– ÏÚþ¥•ŸËØþ¥•ŸË×þ¤•ŸÉÖþ£• ÇÖþ£”ŸÆÔþ¢•ŸÆÔþ¢” ÅÓþ¢”ŸÅÔþ¡”ŸÄÓþ¡” ÄÒþ¡“ŸÃÑþ¡“ŸÃÑþ¡” ÂÑþ “ŸÁÐþŸ“ ÀÏþŸ“Ÿ¿Îý�“Ÿ»Íþœ’Ÿ¸Éýš‘Ÿ¶Çýš‘Ÿ´Æý™‘ ²Æý—�Ÿ°Ãý–� ­Âý–�Ÿ¬Àý•Ž «¿ý“�Ÿª¾ý’�Ÿ§½ý’ŽŸ¥»ý‘Ž ¤¹ý‘�Ÿ£ºý‘�Ÿ¤»ý’Ž ¥ºý‘�Ÿ¤»ý’ŽŸ¥ºý‘ŽŸ£¹ý��Ÿ¢¹ý��Ÿ¡¹ý��Ÿ¡¹ý��Ÿ¡¸ý‘�Ÿ¢ºý’�Ÿ¦¼ý•Ž ª¿ý–� ®Àý˜� ²Äýœ‘ ºÊýŸ“ŸÀÏþ¡“ ÄÒþ£• ÇÕþ¨–ŸÏÛþ©—ŸÓÞþ©—ŸÒÝþ©— ÓÞþ«˜ŸÖàþ®™ Ýåþ²› äëþµ› éîÿ²› åëþ°šŸáèþ¯™ Þæþ®™ŸÜåþ¬˜ Ùâþ«˜ ×áþ¬˜ Øâþ®™ŸÜåþ°š áèþ²›Ÿæíþ¶œŸëðÿ¸œ ïóÿ¹žŸòõÿºž ô÷ÿ»ž õ÷ÿ»ž öùÿ¼ž ÷ùÿ¼Ÿ ÷ùÿ»ž ÷ùÿ»žŸ÷ùÿº� õøÿºž õøÿ¹� óöÿ¹� òõÿ¸�Ÿðôÿ·� îóÿ¶œŸìñÿµ› ëðÿ´› éïÿ³› æíþ²š åìþ±šŸâéþ¯š ßçþ¯š àçþ¯™Ÿßçþ°™Ÿßçþ°š áèþ²š ãëþ²› åìþ³›Ÿçíþ´›Ÿèíÿ³› èîÿ´œ éïÿµœ êïÿµœ êðÿµœ ëðÿµœ ìñÿ¶œ ìñÿ·œŸíñÿ¶œŸìñÿµœ ëðÿ¶œŸëðÿµœŸêïÿµœ éîÿ²›Ÿäëÿ²š ãêÿ±š âéþ¯šŸßçþ­™ŸÜæþ¬™ Úãþ¬˜ Øáþ«˜Ÿ×áþ«˜ ×áþ­˜ŸÙâþ­˜ Úãþ®™ Ûäþ®šŸÝæþ¯™ ßçþ°šŸàèþ°š ãéþ²›Ÿåìþ³›Ÿæìþ²› åìþ¯š àèþ®™ŸÜæþ«˜ Øâþ©˜ŸÔßþ©— ÓÞþ¨— ÒÝþ©– ÒÝþ©– ÒÝþ¨—ŸÐÜþ¥–ŸÍÙþ¤•ŸÊÖþ£• ÈÕþ¢•ŸÇÔþ¢” ÅÓþ¢• ÄÓþ¡” ÃÒþ¡”ŸÂÑþ ” ÁÐþ “ ÀÐþŸ’Ÿ¾Îþž“ ½Íþž’Ÿ½Íþ�“ŸºËý›’Ÿ¹Éý›‘Ÿ¶Çý™‘Ÿ³Åý˜�Ÿ²Äý–�Ÿ®Âý•� «Àýœ’ ¹Éþ‹ Ÿ‹�¿†šŸ†Œ¾†šŸ†�¿†š †�¾‡›Ÿ‡�¾‡šŸ‡�¾‡œŸ‡�¾ˆ�Ÿˆ�¾ˆ�ŸˆŽ¾‰žŸ‰Ž¾Š ŸŠ�¿Œ¢ Œ�¾�¥Ÿ�‘¿�¦Ÿ�“¾�§ �“¾�© �”¿‘© ‘”¿�ª �•¿‘ªŸ‘•¿’¬ ’–¿”¯Ÿ”—¿•¯ •—¿”® ”—¿”®Ÿ”—¿”¯ ”—¿•¯ •—¿–±Ÿ–˜¿—´Ÿ—™¿™µŸ™š¿˜¶Ÿ˜š¿˜µŸ˜›¿˜µ ˜š¿—³Ÿ—š¿—³ —™¿—³ —™¿—² —™¿–² –™¿–² –™¿–²Ÿ–™¿—²Ÿ—™¿—²Ÿ—™¿–² –™¿–² –™¿—² —˜¿—² —™¿–²Ÿ–™¿–± –˜¿–± –˜¿–± –™¾•± •˜¿”¯Ÿ”˜¿•¯ •˜¿”¯Ÿ”—¿”°Ÿ”—¿–° –˜¿—³Ÿ—™¿™´Ÿ™š¿™¶ ™›¿š· š›¿›¸Ÿ››¿š¸Ÿšœ¿›¸ ›œ¿š¸ŸšœÀ›¸ ››¿›¹ ›�¿›¹ ›œ¿›¹Ÿ›�¿›¹ ›œÀœº œ�¿œº œ�¿›º ›�¿œºŸœœ¿œ¹ œ�¿œº œ�Àœº œ�Àœ¹ œ�¿œº œ�¿œº œ�Àœº œ�ÀœºŸœœ¿œº œœÀ›º ›œÀœ¹ œœÀ›¹ ›œ¿š¶ š›¿˜µ ˜š¿–±Ÿ–™¿•° •˜¿”° ”˜¿–°Ÿ–˜¿—²Ÿ—™¿—³ —™¿—³Ÿ—š¿˜´Ÿ˜š¿š· š›¿š· š›¿˜µ ˜›¿—² —™¿–± –˜¿•°Ÿ•˜¿”¯Ÿ”˜¿”¯Ÿ”—¿•¯Ÿ•—¿•¯Ÿ•˜¾–°Ÿ–˜¿–±Ÿ–˜¿–±Ÿ–™¿—²Ÿ—™¿—² —™¿—² —š¿˜³ ˜š¿˜´ ˜š¿˜µ ˜š¿˜´ ˜™¾—´Ÿ—™¿˜´ ˜™¿—³ —™¿—² —™¿–²Ÿ–™¿–± –™¿–± –˜¿•¯ •˜¿•¯ •—¿”¯ ”—¿”¯ ”—¿”°Ÿ”—¿”¯Ÿ”—¿”® ”–¿”®Ÿ”—¿”¯ ”—¿•¯ •—¿”­ ”—¿“®Ÿ“–¿“­ “–¿“¬ “–¿“­ “–¿“­ “–¿“®Ÿ“–¿”® ”—¿•¯ •—¿”¯Ÿ”—¿”¯ ”˜¿”¯ ”—¿”¯Ÿ”—¿”° ”—¿•¯Ÿ•—¿”¯Ÿ”˜¿”¯Ÿ”—¿”®Ÿ”—¿”®Ÿ”—¿•¯ •—¿”¯Ÿ”—¿”¯Ÿ”—¿”°Ÿ”—¿”¯ ”˜¿•¯Ÿ•—¿”®Ÿ”—¿”®Ÿ”–¿“®Ÿ“—¿”® ”–¿”­ ”–¿“®Ÿ“–¿“­ “–¿“­ “–¿“¬ “–¿“¬Ÿ“•¿’«Ÿ’•¿’« ’–¿’«Ÿ’•¿‘« ‘•¿’¬Ÿ’•¿‘ª ‘•¿‘ªŸ‘•¿‘ª ‘•¿‘©Ÿ‘”¿�© �”¿�© �”¿‘©Ÿ‘”¿�¨Ÿ�”¿�§Ÿ�“¿�¦Ÿ�’¾Ž¥ŸŽ’¿�¤Ÿ�‘¾Œ£ŸŒ‘¾Œ¢ŸŒ�¿‹¢ ‹�¿Œ¡ŸŒ�¾Œ¢ Œ�¾Œ¡ŸŒ�¾Š¡ŸŠ�¾Š ŸŠ�¿Š ŸŠ�¿Š ŸŠ�¾Š ŸŠ�¾‹ Ÿ‹�¿Š ŸŠ�¿Š ŸŠ�¾Š ŸŠ�¿‰Ÿ ‰�¾ŠŸŸŠŽ¾ŠŸŸŠ�¾ŠŸŸŠ�¿‹¡Ÿ‹�¾Œ¤ŸŒ’¾Ž¦ŸŽ“¾�© �”¿‘ª ‘•¿“­ “–¿”¯Ÿ”—¿–² –˜¿–± –˜¿–²Ÿ–˜¿—³Ÿ—š¿˜´Ÿ˜š¿˜´ ˜™¿˜³ ˜™¿–² –˜¿–±Ÿ–˜¿–±Ÿ–˜¿–±Ÿ–™¿–²Ÿ–™¿—³Ÿ—™¿™µŸ™›¿›¸ ›œÀ›¹ ›�¿�º ��À�¼Ÿ�žÀ�½ �ž¿ž½ žžÀž½ žŸ¿Ÿ¾ ŸŸÀž¾ŸžŸ¿Ÿ¾ ŸŸÀŸ¾ ŸŸÀŸ¾ ŸŸÀž¾ žŸ¿Ÿ¾ŸŸŸÀŸ¾ŸŸŸÀž¾ žŸÀž½ žž¿ž½ žŸÀž¼ žŸÀ�¼ ��À�»Ÿ�ž¿œº œž¿œº œ�Àœ¹Ÿœ�¿›¹ ›œ¿›¸ ››À›¸ ››À™· ™›À›¸ ›œÀ›¸ ›œÀ›¹ ›�¿œ¹Ÿœ�¿›º ›œ¿›º ›�¿�º ��À�»Ÿ�ž¿�» �žÀž¼ žžÀž½ žžÀ�¼ �ž¿ž½ŸžŸÀž½ žŸÀž½Ÿžž¿ž½ žž¿ž½Ÿžž¿ž½ŸžŸÀž¼ žž¿�» �žÀ�» �ž¿œº œ�¿œ¹ œ�Àœ¹Ÿœ�À›¹ ›œ¿š· š›¿š· š›¿˜µ ˜š¿–²Ÿ–™¿•°Ÿ•˜¿”¯ ”—¿•¯Ÿ•—¿•°Ÿ•˜¿–±Ÿ–˜¿—± —™¿—³ —š¿—³ —™¿—³Ÿ—™¿˜´Ÿ˜š¿™µ ™›¿™¶Ÿ™›¿™µŸ™›¿—´ —š¿–±Ÿ–˜¿•°Ÿ•˜¿”¯ ”˜¾”® ”—¿”®Ÿ”—¿”¯Ÿ”—¿”®Ÿ”–¿“­Ÿ“–¿“® “—¿“­Ÿ“–¿“­ “–¿“­Ÿ“–¿“­Ÿ“–¿“®Ÿ“—¿“®Ÿ“–¿“­ “–¿’¬Ÿ’•¿“­Ÿ“–¿’¬Ÿ’–¿’« ’–¿’¬ ’•¿‘ª ‘•¿’« ’•¿‘© ‘”¿�©Ÿ�”¿“¬Ÿ“–¿–� ®ÁþŽŒŸ�µýŽŒŸž¶ýŽ� Ÿ¶ý��Ÿ ·ý��Ÿ¡¸ý��Ÿ£ºý‘Ž ¦ºý’Ž ¥»ý“� §½ý•�Ÿ­Àý˜‘Ÿ²Äý›‘Ÿ·ÉýŸ“Ÿ¿Îý “ŸÂÐþ¡”ŸÄÒþ¡” ÄÒþ£”ŸÆÔþ¤”ŸÈÖþ§– ÎÚþ©—ŸÒÝþ©—ŸÓÞþ©–ŸÒÝþ¨–ŸÒÝþ©—ŸÓÞþ«˜ŸÖàþ­™ Ûãþ°šŸàèþ²š äëþ²šŸäëþ±šŸâêþ±šŸâéþ°šŸàèþ¯™ Þæþ®™ŸÞæþ®™ Ýåþ®˜ Üåþ®™ŸÜäþ­™ Ûåþ­™ŸÜåþ­™ Ûäþ®™ŸÛäþ­™ Ûäþ­™ Üäþ­˜ Ûåþ­™ Ûäþ­™ŸÛäþ­™ŸÚãþ¬˜ŸÙâþ«˜ ×áþ«˜ Öáþª˜ Õßþ©—ŸÓÞþª˜ŸÔßþ¬˜ŸØâþ®™ŸÞæþ±šŸâéþ²› æíþ´›Ÿèîþµ›Ÿêïþ¶œŸëðþµœ ëðþµœ ìðÿ¶œ ìðÿ¶œ íñÿ¶œ íòÿ·� îòÿ¶�Ÿîòÿ¸� ïôÿ¸�Ÿïôÿ·� ïóÿ¸œŸïóÿ·� ïóÿ¸œŸðôÿ¸œ ðôÿ¸œŸðõÿ¸œŸðôÿ·� ðôÿ¸� ðôÿ·�Ÿðóÿ·œ ïóÿ¸œ ïóÿ·� îòÿ¶œ íñÿ´›Ÿêîþ±šŸâéþ­™ŸÚäÿ«˜ Õàþª—ŸÖßþ¬˜ Øáþ®™ŸÝäþ¯™ŸÞçþ¯š ßçþ±šŸâéþ´›Ÿèîþ³›Ÿèîþ±š ãêþ®™ŸÝåþ¬˜ŸØâþ«˜ŸÕáþª˜ Õàþª˜ Õßþ«— ×áþ«˜ŸÖàþ¬™ŸØãþ¬˜ Ùâþ­™ŸÚãþ®™ Üåþ®™ŸÝåþ¯™ŸÞæþ¯™ ßèþ±šŸáèþ±™ áéþ°šŸáèþ¯šŸàèþ¯š àéþ°š ßçþ­™ Üæþ­™ Üäþ­™ŸÙãþ¬˜ Ùâþ«˜ŸÖàþª— Õßþ©— ÓÞþ©—ŸÔÞþª—ŸÔßþ©—ŸÓÞþ¨—ŸÓÝþ©— ÒÝþ©— ÔÞþ©—ŸÔÞþ¨–ŸÑÜþ¨–ŸÐÝþ¦–ŸÏÚþ§–ŸÎÚÿ¦–ŸÎÚþ§— ÏÛþ¨— ÐÝþ¨—ŸÑÝþ©—ŸÔÞþª—ŸÔàþ©—ŸÕßþª˜ŸÔßþ©— Õßþª˜ŸÔàþª˜ Ôàþ©˜ŸÔßþ©—ŸÓÞþ©—ŸÓÞþ©—ŸÓÞþ©—ŸÔÞþª—ŸÓßþ©— Óßþª—ŸÔàþ©˜ŸÔßþª— Ôßþ©—ŸÓÞþ©—ŸÒÝþ¨— ÒÜþ§— ÐÝþ¨—ŸÐÜþ§–ŸÎÛþ¦– ÎÚþ¦–ŸÎÚþ¦•ŸÍÙþ¦• ÍÙþ¥•ŸÍÙþ¥• ËØþ¥• Ê×þ¥• Ë×þ¤• Ê×þ£•ŸÈÖþ£•ŸÇÕþ£” ÇÖþ¢•ŸÆÔþ¡”ŸÄÓþ¢”ŸÅÓþ¢”ŸÄÒþ¡” ÃÑþ “ ÀÏþž“Ÿ½Íý�’Ÿ»Ëý›’Ÿ·Èýš‘ŸµÇý™‘Ÿ³Æý™� ²Åý˜�Ÿ³Äý˜‘Ÿ²Äý˜�Ÿ³Äý—�Ÿ¯Ãý—� ¯Âý–� ®Áý–�Ÿ­Âý–�Ÿ­Áý–�Ÿ®Áý–�Ÿ­Âý•�Ÿ®Âý•� ­Àý•�Ÿ¬Àý•�Ÿ­Àý•�Ÿ¬Áý•�Ÿ¬Àý—�Ÿ±Äý›‘Ÿ·Éýž’Ÿ¼Ìý¢•ŸÅÓþ¤•ŸÉÖþ¦–ŸÎÚþ©— ÓÞþ¬™ŸÚãþ¬™ Úãþ®™ŸÛäþ¯™ ßçþ±šŸâêþ±š âéþ¯™Ÿßçþ­™ Üåþ­™ Úãþ¬˜ŸÙâþ­˜ Úãþ­˜ Ûäþ¯šŸßçþ³›Ÿæìþµœ ëðÿ·œ ïóÿ¹� ñôÿº�Ÿô÷ÿ¼ž ÷ùÿ¼Ÿ øúÿ¼Ÿ ùûÿ½Ÿ úûÿ½Ÿ ûüÿ½Ÿ ûüÿ¾Ÿ üýÿ½Ÿ ûüÿ½Ÿ úüÿ½Ÿ ûüÿ¾ž ûüÿ½Ÿ úüÿ¼žŸùûÿ¼žŸøúÿ»žŸ÷ùÿ»ž õøÿ¹� óöÿ¸�Ÿñõÿ¸� ðôÿ·œŸïóÿ·� íòÿµœ ëñÿµœ ëïÿ´œ éïÿ´› êïÿ¶œ ìñÿ¶œ íóÿ·œ ïóÿ·œ ïóÿ·�Ÿðôÿ¹�Ÿòõÿ¹� ô÷ÿºžŸõøÿ»žŸöøÿ»žŸ÷ùÿ»Ÿ ÷ùÿ¼ŸŸøúÿ¼ž øúÿ¼Ÿ øúÿ¼ž øúÿ¼Ÿ øúÿ¼ž øúÿ¼žŸ÷ùÿ»ž õ÷ÿºž óöÿ¸� ñôÿ·� ïóÿ·� ïóÿ·œŸîòÿµœ ëðÿ³› çíþ°š áêþ®˜ŸÞæþ«˜ Öáþ©— ÓÞþª— Ôßþ«— ×àþ¬˜ Øâþ­™ŸÛãþ®™ŸÝæþ®™Ÿßæþ¯™Ÿßçþ±šŸáêþ³›Ÿæìþ³› çíþ²šŸåìþ°™ áèþ­˜ŸÛäþ¬˜ Øáþª— Õßþ©—ŸÒÝþ©— ÓÞþ¨—ŸÒÞþ©– ÑÜþ¨– ÑÜþ¨–ŸÐÜþ§–ŸÏÜþ§– ÎÚþ§– ÎÚþ§–ŸÏÛÿ§–ŸÏÛþ§– ÐÛþ§– ÏÛþ¦– ÍÚþ¦– ÌÙþ¦• ÌÙþ¦–ŸÍØÿ¤• Ê×þ¤•ŸÉÖþ¤•ŸÉÖþ£•ŸÇÔþ¡” ÄÒþ¦– ÍÙþ‘© ‘”¿Ž¥ŸŽ’¾�¥Ÿ�’¾�¤Ÿ�‘¾�¥ �’¾Ž¥ Ž’¾�¥Ÿ�’¾Ž¦ŸŽ’¿Ž¦ŸŽ’¾�§ �“¿�¨Ÿ�“¿�¨Ÿ�”¿�¨ �”¿‘© ‘”¿‘©Ÿ‘”¿�ªŸ�•¿‘ªŸ‘•¿‘« ‘•¿’¬ ’–¿“­ “–¿”®Ÿ”—¿”¯ ”—¿”¯ ”—¿”®Ÿ”—¾”¯Ÿ”–¿“® “—¿”®Ÿ”—¿”® ”–¿”®Ÿ”—¿•¯ •—¿•°Ÿ•—¿•°Ÿ•˜¿–° –˜¿–±Ÿ–˜¿—³ —™¿–²Ÿ–™¿—³Ÿ—™¿˜³ ˜š¿˜´ ˜š¿˜´ ˜š¿™µŸ™›¿™¶ ™›¿š¶ š›¿˜µŸ˜š¿˜³ ˜š¿˜³ ˜š¿—²Ÿ—™¿—² —™¿–±Ÿ–˜¿•¯Ÿ•—¿”¯Ÿ”˜¿”¯ ”—¿•¯ •—¿–± –™¿˜´ ˜š¿™¶Ÿ™›¿š·Ÿšœ¿›¹ ›œÀ›¹Ÿ›œÀ›¹Ÿ›�¿›¹ ›�¿œºŸœ�¿�»Ÿ�ž¿ž» žžÀž¼ žž¿ž½ žž¿ž½ žžÀž½ žžÀž½ žžÀž¼ žžÀž¼ žžÀ�¼ �žÀž¼ŸžžÀ�¼ �ž¿�¼ ��¿�¼ �žÀ�» ��À�» ��¿œ» œ�Àœº œ�¿œ¹ œ�À›ºŸ›�¿›¹Ÿ›�¿›¸ ›œÀš·Ÿš›¿—´Ÿ—š¿–± –˜¿”¯Ÿ”—¿”°Ÿ”—¿–° –˜¿–²Ÿ–˜¿—³ —™¿—³Ÿ—™¿˜³ ˜š¿™¶Ÿ™›¿š· š›Àš· šœ¿˜¶Ÿ˜›¿—³Ÿ—™¿–±Ÿ–˜¿•±Ÿ•™¿–±Ÿ–˜¿•±Ÿ•˜¿•°Ÿ•˜¿–±Ÿ–™¿•±Ÿ•˜¿•²Ÿ•˜¿–²Ÿ–™¿–² –™¿–³Ÿ–™¿—³Ÿ—š¿˜´Ÿ˜š¿˜µ ˜š¿™µŸ™š¿˜µ ˜š¿˜µŸ˜š¿™¶ ™›¿™µŸ™š¿™µ ™š¿˜µŸ˜š¿˜´Ÿ˜š¿˜´Ÿ˜™¿—³ —™¿–² –˜¿–² –™¿–±Ÿ–˜¿•² •™¿–±Ÿ–™¿•° •˜¿–°Ÿ–™¿–±Ÿ–˜¿•°Ÿ•˜¿•°Ÿ•˜¿•¯Ÿ•˜¿•° •˜¿•°Ÿ•˜¿•¯Ÿ•—¿”¯Ÿ”—¿”¯ ”—¿•¯ •—¿”¯Ÿ”—¿”¯Ÿ”—¿•¯ •—¿”¯ ”—¿”¯Ÿ”—¿”¯Ÿ”—¿”® ”—¿”¯ ”—¿”®Ÿ”–¿“¯ “—¿”¯Ÿ”—¿”®Ÿ”—¿”®Ÿ”—¾“¯ “—¿”®Ÿ”—¿”¯ ”—¿•® •—¿”® ”—¿”®Ÿ”—¿”¯Ÿ”˜¿•¯ •˜¿•¯Ÿ•˜¿•°Ÿ•˜¿•° •˜¿•±Ÿ•˜¿–±Ÿ–™¿–² –˜¿–²Ÿ–˜¿–²Ÿ–™¿–± –™¿–±Ÿ–˜¿–±Ÿ–˜¾•± •˜¿–± –™¿–± –˜¿–±Ÿ–˜¿–±Ÿ–˜¿•±Ÿ•˜¿•°Ÿ•˜¿”° ”˜¿•¯Ÿ•—¿•¯ •˜¿”¯ ”˜¾”¯ ”—¿”¯ ”—¿”¯Ÿ”—¿”¯Ÿ”—¿•°Ÿ•—¿•° •˜¿•°Ÿ•˜¿–°Ÿ–˜¿•± •˜¿–± –™¿•°Ÿ•˜¾•°Ÿ•˜¿–° –˜¿–±Ÿ–˜¿–²Ÿ–˜¿—²Ÿ—™¿–² –™¿—³ —™¿–±Ÿ–˜¿•±Ÿ•˜¿–± –˜¿•± •˜¿–² –˜¿—³ —™¿˜µŸ˜š¿˜´Ÿ˜š¿˜´Ÿ˜š¿—´ —š¿˜µŸ˜š¿™¶ ™›¿š¶ š›¿™· ™›Àš¸ š›¿›¸ ›œÀ›¹ ›�¿œº œœ¿�ºŸ��¿�» �ž¿œ» œž¿�»Ÿ��À�»Ÿ��Àœº œž¿œ» œ�À�» �ž¿œ»Ÿœ�¿�» ��¿�ºŸ��¿�» ��¿œº œ�¿œº œ�¿�»Ÿ�žÀœ» œ�À�º ��¿œ» œž¿œ»Ÿœ�À�»Ÿ��¿�¼ ��¿�» ��À�» �žÀ�¼ �žÀ�¼Ÿ�ž¿�» ��Àœ¼ œžÀœ» œ�À�» �žÀ�» ��¿œºŸœ�Àœº œ�¿œ¹ œ�¿œº œ�À›ºŸ›�Àœº œ�ÀœºŸœ�¿œº œ�À›º ›�¿œ¹ œœÀ›¹ ›�¿›¹ ›�¿›¹Ÿ›œÀ›¹ ›�¿›¸ ›œÀ›¸ ›œ¿š·ŸšœÀš· š›Àš¶Ÿš›¿™·Ÿ™›¿™¶ ™›¿™¶Ÿ™›¿˜´ ˜š¿˜´Ÿ˜š¿—³ —™¿—³Ÿ—™¿—³Ÿ—™¿–²Ÿ–˜¿–± –˜¾•°Ÿ•˜¿•°Ÿ•˜¿•° •—¿•¯ •—¿•¯Ÿ•—¿”¯ ”—¿•±Ÿ•˜¿–²Ÿ–™¿—² —˜¿—³Ÿ—™¿—² —™¿—³ —™¿˜´ ˜š¿˜µŸ˜š¿™·Ÿ™›¿š·Ÿš›À™¶Ÿ™›¿˜¶ ˜›¿˜´Ÿ˜™¿—³Ÿ—™¿–² –˜¿–²Ÿ–™¿–± –™¿–±Ÿ–˜¿•± •˜¿–±Ÿ–˜¿•° •˜¿•± •˜¿–± –˜¿–²Ÿ–˜¿–± –˜¿–±Ÿ–˜¿–² –™¿–² –™¿–²Ÿ–™¿–²Ÿ–™¿–²Ÿ–˜¿–±Ÿ–˜¿—±Ÿ—™¿–² –˜¿–±Ÿ–˜¿—³ —™¿¢” ÅÓþœ’Ÿ¹Ëýœ’Ÿ¸Êý›’ ¸Êý›’Ÿ¸Éýœ’Ÿ¹Êýœ‘ŸºÊý�“Ÿ»Ìýž“Ÿ¾ÎýŸ“Ÿ¿Ïþ “ŸÂÐþ¡“ŸÂÑþ¡“ŸÃÑþ¢”ŸÄÒþ¢”ŸÅÓþ¢•ŸÆÔþ£•ŸÇÕþ¤•ŸÊØþ¥– ËØþ§– ÏÚþ¨—ŸÑÝþª—ŸÔßþª— ÔÞþ¨—ŸÓÞþ¨— ÓÝþ¨—ŸÒÝþ©—ŸÒÝþ¨—ŸÒÝþ©— ÓÞþª— Õßþª˜ ×àþ«˜ŸØáþ¬˜ŸÙãþ¬˜ Úåþ­™ Üåþ®™ŸÝåþ¯š ßçþ¯™ ßçþ°™ áèþ°š âéþ²›Ÿäëþ²› æìþ³›Ÿæìþ²šŸãêþ°š áèþ¯š Þçþ¯™ Þæþ­™ Üæþ«˜ŸØâþ«˜ Öáþ©— Ôßþ©— Óßþª—ŸÕàþ­˜ŸÛäþ±š âêþ³›ŸæíþµœŸéïþ¶� íòÿ·� ïóÿ·œŸïóÿ¸� ðôÿ¹�Ÿòõÿº� ô÷ÿºž õ÷ÿ»žŸöøÿ»ž ÷ùÿ»žŸ÷ùÿ¼ŸŸùùÿ¼ž øùÿ¼ž øùÿ¼žŸ÷ùÿ»žŸöùÿ¼žŸ÷øÿº�Ÿõøÿº�Ÿõ÷ÿºž ô÷ÿºž óöÿ¹�Ÿòõÿ¸�Ÿñõÿ¸� ñôÿ·œ ðóÿ·� ïóÿ·œ îóÿ¶œ ìñÿ³› çíþ°š àéþ¬˜ŸÙâþª—ŸÔßþª— Õàþ«˜Ÿ×áþ­™ŸÛäþ®™ Þæþ¯šŸÞçþ¯šŸàèÿ±šŸäëþ´› èîÿ´› èîþ²š äëþ¯š Þçþ­˜ŸÛäþ¬™ŸÙâþ¬˜ Øâþ¬˜ŸØáþ«˜ŸØâþ¬˜ Ùâþ¬˜ Øâþ¬˜ŸÙäþ­™ŸÚäþ­™ Üåþ®™ŸÝæÿ¯™ ßçþ°šŸáéþ±› âêþ±šŸäêþ±šŸåëþ±šŸäëþ²š äëþ±›Ÿäëþ±šŸãêþ°š áéþ°™ àèþ°š ßçþ®™ Þæþ­™ Üåþ­˜ŸÛäþ­˜ŸÚãþ¬˜ŸÙãÿ¬˜ŸÙãþ¬˜ Øâþ¬˜ŸØâþ«˜ŸØâþ«˜ ×áþ«˜ ×áþ«˜ Öàþª— Öàþª˜ Õàþª— Ôßþª—ŸÔßþ©—ŸÓÞþ©— ÓÞþ©—ŸÓßþ©— ÓÞþ©˜ŸÔÞþ©— ÓÞþ©— ÔÞþ©—ŸÔÞþ¨–ŸÒÞþ©—ŸÒÝþ©— ÓÝþ©— ÒÝþ©–ŸÒÞþ¨—ŸÒÝþ©—ŸÒÝþ¨—ŸÒÝþ©˜ ÔÞþ©— ÓÞþ©—ŸÓßþ©—ŸÔÞþ©—ŸÓßþ©—ŸÔßþª˜ Ôàþª˜ŸÕàþª˜ Öàþ«˜Ÿ×áþ«˜ ×áþ¬˜ Ùäþ®™ŸÛäþ®˜ŸÛäþ®˜ŸÛäþ¬˜ Úåþ­˜ŸÚãþ¬™ŸÚãþ¬˜ŸÙãþ­˜ŸÚäþ¬™ŸÙãþ­™ŸÙãþ¬™ Ùãþ¬˜ŸØâþ¬˜Ÿ×áþª— Õáþª— Õßþ©—ŸÔßþ©˜ Ôßþ©— ÕÞþ©— Ôßþ©— ÓÞþ©— ÓÞþª—ŸÕßþ«— ×áþ«˜ŸØáþ«˜ Ùáþ«˜ŸØâþ¬˜ Øâþ«— ×áþ«˜Ÿ×áþ¬˜ ×âþ¬˜ŸÙâþ­™ŸÛäþ®™ŸÜåþ®šŸÝæþ®š Ýæþ®˜ŸÛäþ­™ŸÙãþ«˜ Øâþ¬˜ Øâþ®™ŸÜäþ°™Ÿàéþ²›Ÿãêþ°šŸâéþ°š àèþ°šŸâéþ²›Ÿåìþ²› åìþ´›Ÿçíþ´œ èîÿµœŸêïÿ·œŸíñÿ¸� ïóÿ¸� ðôÿ¹� òõÿº� óöÿ¹ž óöÿ¹�Ÿóöÿ¹ž óöÿº�Ÿôöÿº� õ÷ÿ¹� ô÷ÿºž ô÷ÿ¹ž óöÿ¹�Ÿóöÿ¹� óöÿ¹� òöÿ¹�ŸòõÿºžŸóöÿºž óöÿ¹� óöÿº� óöÿ¹ž ó÷ÿº�ŸôöÿºžŸô÷ÿºž ô÷ÿ¹ž ô÷ÿºž õøÿºž õøÿºžŸô÷ÿº�Ÿô÷ÿ¹� óöÿºž óöÿ¹�Ÿóöÿ¹� òõÿ¹� òõÿ¸� ñôÿ¸� ñôÿ¸� ðôÿ¸� ðôÿ¸œ ðôÿ·� ïóÿ·� ïóÿ¸� ïóÿ·œŸîóÿ·œ îóÿ·� îòÿ¶�Ÿíòÿ¶œ íñÿ¶œ ìñÿµœŸêïÿµœ êïÿ´›Ÿèîþ´›Ÿéîþ²› æíþ²› åëþ±šŸâéþ°šŸàéþ®š Þæþ¯™ŸÝæþ®™ Þæþ­™ŸÛäþ¬˜ŸÙâþ«— ×áþª˜Ÿ×àþª—ŸÕàþª— Õßþª—ŸÕßþ«— Öàþ¬˜ Ùâþ­™ŸÚãþ®˜ Üäþ¯™ ßæþ¯™ŸÝæþ®™ŸÞæþ±šŸáêþ±šŸãêþ´› çíþµœ éïÿ´›Ÿçíþ²šŸäëþ°™Ÿàèþ¯™ŸÞæþ­˜ŸÛåþ­™ Úãþ¬˜ŸÙãþ¬˜ Ùâþ«˜ Øâþ¬˜ŸÙâþ¬˜ŸÙãþ¬™ Ùâþ¬˜ Ùãþ­˜ŸÚãþ¬˜ Úãþ­˜ŸÛäþ­™ŸÛäþ­™ Üäþ­™ Ûäþ­™ŸÛäþ¬˜ Úäþ­˜ŸÜäþ­™ŸÜäþ­˜ŸÛãþ¬˜ Øâþ®™ŸÝåþ“® “–¿�©Ÿ�”¿‘©Ÿ‘”¿�©Ÿ�”¿‘© ‘”¿�ªŸ�”¿�ª �”¿�ªŸ�•¿‘«Ÿ‘”¿‘ª ‘•¿‘« ‘•¿’«Ÿ’•¿‘« ‘•¿’¬ ’•¿“­Ÿ“–¿“¬ “•¿“® “—¿“®Ÿ“–¿”®Ÿ”—¿”®Ÿ”—¿”°Ÿ”—¿•¯ •—¿•¯Ÿ•˜¿•¯Ÿ•˜¿”¯ ”—¿”¯Ÿ”—¿”® ”—¿”®Ÿ”–¿”®Ÿ”—¿“® “—¿“­Ÿ“–¿“­ “–¿“­ “–¿“­Ÿ“–¿“®Ÿ“–¿”­ ”—¿”®Ÿ”—¿”®Ÿ”—¿”¯ ”—¿”¯ ”—¿•°Ÿ•˜¿–±Ÿ–™¿˜³ ˜™¿™´Ÿ™š¿™µ ™›¾˜µŸ˜›¿™µŸ™š¿—´Ÿ—™¿—³Ÿ—™¾—²Ÿ—™¿–± –˜¿–±Ÿ–˜¿•°Ÿ•˜¿•° •—¿–±Ÿ–˜¿—²Ÿ—™¿˜µ ˜š¿™· ™›¿›¸Ÿ›œÀœº œ�Àœ» œ�À�¼ �ž¿�¼ �žÀž¾ŸžŸÀŸ¾ ŸŸÀŸ¾ŸŸŸ¿Ÿ¾ ŸŸ¿ž¾ žŸ¿ž¾ žŸ¿Ÿ¾ŸŸŸ¿Ÿ¾ŸŸŸÀŸ¾ ŸŸ¿Ÿ¿ ŸŸ¿ž¾ žŸÀž¾ŸžŸÀŸ¾ ŸŸÀŸ¾ ŸŸ¿ž¾ žžÀž½ŸžŸÀž½ žŸ¿ž½ žž¿ž½ŸžŸÀ�» ��À�» ��¿›º ›�¿›¸ ›œÀš· š›¿™¶Ÿ™›¿˜³ ˜™¿–²Ÿ–˜¿•° •—¿•°Ÿ•˜¿–±Ÿ–™¿–² –™¿—² —š¿—´ —š¿—´Ÿ—š¿˜´Ÿ˜š¿™¶Ÿ™›¿™¶ ™›¿™·Ÿ™›¿™· ™›¿˜µŸ˜š¿™µŸ™š¿—´Ÿ—™¿˜³Ÿ˜š¿˜´ ˜š¿—´Ÿ—™¿˜³Ÿ˜š¿˜µ ˜š¿™µ ™š¿™·Ÿ™›¿š¶ š›¿š· šœ¿š· š›¿™¶Ÿ™›¿˜¶ ˜š¿˜¶ ˜š¿˜µŸ˜š¿™µ ™™¿˜µŸ˜š¿˜´ ˜š¿˜µŸ˜š¿™µ ™š¿˜´ ˜š¿˜µ ˜š¿˜µŸ˜š¿˜´ ˜š¿˜´ ˜™¿˜³ ˜š¿˜´Ÿ˜š¿˜´ ˜š¿˜´ ˜š¿—´Ÿ—š¿˜´ ˜™¿˜µŸ˜š¿˜´ ˜š¿˜´ ˜š¿˜´ ˜™¿˜´ ˜™¿˜³Ÿ˜š¿—³ —š¿—³Ÿ—™¿—³Ÿ—š¿—´Ÿ—š¿—³ —™¿—³Ÿ—™¿–³Ÿ–™¿—³Ÿ—™¿—³ —™¿˜³Ÿ˜š¿—³Ÿ—š¿˜³Ÿ˜™¿—´ —š¿˜³ ˜™¿—´Ÿ—š¿˜´Ÿ˜š¿˜µ ˜™¿˜µ ˜š¿˜µŸ˜š¿™µŸ™š¿™¶Ÿ™š¿™¶ ™š¿š¶Ÿš›¿š·Ÿš›¿™· ™›¿š·Ÿš›¿™¶Ÿ™›¿š¶Ÿš›¿™¶Ÿ™›¿™¶Ÿ™›¿™µŸ™›¿™µ ™›¿™´Ÿ™š¾˜´Ÿ˜š¿˜´Ÿ˜š¿˜µŸ˜š¿˜´Ÿ˜š¿˜´Ÿ˜š¿˜´Ÿ˜™¿˜µ ˜š¿˜´Ÿ˜š¿—³ —™¿˜³Ÿ˜š¿—² —™¿–²Ÿ–™¿–² –™¿—² —˜¿–²Ÿ–˜¿–²Ÿ–™¿—³Ÿ—™¿˜´Ÿ˜š¿—³ —™¿˜µ ˜š¿™µŸ™š¿™¶ ™›¿š·Ÿšœ¿œ¹ œœ¿œº œ�Àœº œ�¿�» �ž¿�¼Ÿ��¿ž¼Ÿžž¿ž¼ žžÀ�½ �žÀž¼ žž¿�¼Ÿ�žÀž½ žž¿�½ �Ÿ¿ž½ žŸ¿Ÿ¾ ŸŸ¿ž¾ žž¿ž½ žŸÀž½ŸžŸÀŸ¾ŸŸŸÀž¾ žŸÀž¾ žŸÀž¾ŸžŸ¿Ÿ¾ ŸŸÀž¾ žŸ¿Ÿ¾ ŸŸÀž¾ žŸ¿Ÿ¾ Ÿž¿ž¾ žžÀŸ¾ ŸŸ¿Ÿ½ Ÿž¿ž¾ŸžžÀž½ŸžžÀž½ žŸ¿ž½ žŸ¿Ÿ¾ ŸŸ¿ž½ŸžžÀž½ žž¿�½ �Ÿ¿ž½ žŸÀž½ žŸÀž½ žžÀž½ žž¿ž½ žž¿�½ �ŸÀž½ŸžŸ¿ž¼Ÿžž¿�¼ �ž¿�½Ÿ�Ÿ¿�¼ �žÀ�¼ �ž¿�» �ž¿�» �ž¿�¼ �žÀ�»Ÿ��¿œº œ�Àœº œ�¿œº œ�Àœº œ�¿œº œ�¿›¹ ›œÀœº œ�¿›¹ ›�¿›¹Ÿ›œ¿š¹ šœÀ›¸ ›œÀš· šœÀš¸Ÿšœ¿š· šœ¿™·Ÿ™›¿š· š›¿™·Ÿ™›¿™¶Ÿ™š¿™µ ™š¿™µ ™›¿˜´ ˜š¿—´Ÿ—š¿—³ —™¿—± —™¿–±Ÿ–™¿•°Ÿ•—¿•¯ •—¿•¯Ÿ•—¿•®Ÿ•—¿”® ”—¿”¯ ”—¿”¯Ÿ”—¿•¯ •˜¿•°Ÿ•˜¿•°Ÿ•—¿•°Ÿ•—¿–° –˜¿•° •˜¿–±Ÿ–˜¿–² –™¿–²Ÿ–™¿–²Ÿ–™¾—²Ÿ—˜¿—² —™¿–³Ÿ–˜¿—² —™¿—³ —™¿–³ –™¿–²Ÿ–˜¿—³ —™¿˜² ˜™¿—´Ÿ—™¿—³ —™¿˜´ ˜š¿˜´Ÿ˜™¿˜µŸ˜š¿˜µ ˜š¿˜µŸ˜š¿˜µŸ˜›¿™¶Ÿ™›¿˜¶ ˜š¿™¶ ™›¿™µŸ™›¿˜¶ ˜›¿™¶ ™›¿™¶ ™›¿™µŸ™›¿™¶Ÿ™š¿™¶Ÿ™š¿š¸ š›¾§– ÏÛþ¢•ŸÅÔþ¢• ÅÓþ¢”ŸÆÓþ£•ŸÅÓþ¢” ÅÓþ£• ÆÕþ¢”ŸÆÔþ¤•ŸÉÕþ¤• ÉÕþ¤•ŸÉÖþ¤• Ê×þ¥• ËØþ¥–ŸËØþ¥• ÌÙþ¦•ŸÍÙþ¨– ÏÛþ¨–ŸÒÜþ¨—ŸÑÝþ©—ŸÓÞþª—ŸÔàþª— Ôßþ©— Õßþª— Õàþª— Ôàþ©—ŸÓßþ©—ŸÔÞþ©– ÒÝþ¨– ÑÝþ¨—ŸÐÜþ§— ÏÛþ¦–ŸÎÚþ¦–ŸÎÚþ§—ŸÐÛþ§–ŸÏÛþ¨–ŸÐÜþ¨—ŸÒÝþ©˜ ÓÞþ©— ÒÞþ©— Óßþ«˜ŸÕàþ¬˜ Úãþ¯™ ßèþ±šŸäêþ²š åìþ²šŸæëþ±š ãêþ°šŸáèþ¯™ Þæþ­™ Üåþ­™ŸÚãþ¬˜ŸÙâþ«˜ŸØáþ«˜ŸÖáþ¬™ŸÙãþ®™ŸÝåþ²š ãêþ´œŸèîþ·œŸíñÿ¸� ïóÿ¸� ñõÿ»ž õøÿ»ž öùÿ¼Ÿ ùûÿ¾žŸûüÿ½Ÿ ûüÿ¾Ÿ ûüÿ¾  ûýÿ¾ŸŸýýÿ¾ŸŸüüÿ¾Ÿ üüÿ¾Ÿ üüÿ¾  üýÿ½žŸûüÿ½Ÿ úüÿ½Ÿ ûüÿ½ž ûüÿ½Ÿ úüÿ½Ÿ úûÿ¼Ÿ ùûÿ¼ž ùúÿ¼ž ÷ùÿ»ž õ÷ÿº� óöÿ·� ðôÿ¶œ íñÿµ›Ÿêïþ³› æìþ°™ ßçþ­™ Úãþ«—Ÿ×àþ«—Ÿ×àþ­™ Úãþ®™ Üäþ®š Ýæþ°™Ÿßèþ°š àèþ±šŸäêþ²› æìþ³›Ÿçíþ³› çíþ³› æíþ²› åëþ±š ãêþ±šŸáèþ¯š áèþ°™ àèþ°™ àèþ°™ áéþ±š ãêþ²› äëþ³› çîþ´›Ÿèîþµ› éîþ´› èîÿ´›Ÿçíþ²›Ÿäëþ²›Ÿäëþ²› äêÿ±šŸãéþ±šŸâéþ±šŸâéþ±š âêþ±š âéþ±šŸãêþ±š âéþ±šŸâéþ±šŸáèþ°šŸáèþ°™Ÿàèþ±š áéþ±™ âéþ±™Ÿáèþ°šŸàéþ°™ áèþ±š âéþ±š âêþ±šŸâéþ°šŸâèþ°š àèþ°™ àéþ¯™Ÿßçþ¯™ Þæþ¯š Þçþ°™Ÿßèþ¯™ Þæþ¯™ŸÞæþ¯™ Ýæþ®™ Ýåþ¯™ŸÞæþ¯šŸßçþ°™Ÿßèþ°šŸàçþ¯™Ÿßçþ¯™ ßçþ¯™ ßçþ°šŸáéþ±š ãéþ±š ãêþ²š ãêþ²š ãêþ³›Ÿæìþ³›Ÿæìþ³›Ÿçíþ³› çíþ³› çíþ´› çíþ³›Ÿæìþ³›Ÿæìþ³› æìþ²›Ÿæìþ²š äëþ²š äëþ±š ãêþ°šŸâéþ±šŸâéþ°š ãéþ±šŸâéþ±š âéþ±™Ÿâéþ±šŸáéþ±šŸâèþ°™Ÿàèþ°™Ÿàçþ®™ Ýåþ­˜ŸÜäþ­™ŸÛäþ­˜ŸÛåþ­™ŸÚãþ®˜ŸÛäþ¯™ Þæþ°šŸàèþ¯™Ÿàçþ±šŸâêþ²›Ÿåëþ³› çíþ´œ éïÿ·œ îòÿ·� ðôÿ¸� ñõÿº� óöÿºž ô÷ÿ»žŸöøÿ»žŸöøÿ»ž öùÿ»ž ÷ùÿ»Ÿ ÷ùÿ¼žŸøúÿ¼Ÿ øúÿ¼ž ùúÿ½Ÿ úûÿ¼ž úûÿ¼Ÿ ùûÿ½Ÿ úûÿ½Ÿ úüÿ½Ÿ ûýÿ½ŸŸúüÿ½Ÿ úüÿ½ŸŸúüÿ½ŸŸúüÿ½Ÿ úüÿ½Ÿ úüÿ½ž ûüÿ¾Ÿ ûüÿ½Ÿ ûüÿ½Ÿ úûÿ½Ÿ úûÿ½Ÿ úûÿ½ž úûÿ½žŸúûÿ½ŸŸúûÿ½ž ùûÿ½Ÿ ùúÿ¼Ÿ øúÿ»ž øúÿ¼ž øúÿ¼ž øúÿ¼ž øúÿ¼ž øúÿ¼ŸŸøúÿ¼ž øúÿ»ž ÷ùÿ¼ž ÷ùÿºžŸ÷ùÿ»ž õøÿºž õøÿº� õ÷ÿºž ô÷ÿºž ô÷ÿ¹� óöÿ¹�Ÿòõÿ¹� ñõÿ¸� ñôÿ¸œ ðôÿ·�Ÿïóÿ·œŸïóÿ¸� ïóÿ·œ ïóÿ·œ îòÿ¶œŸìñÿµœ ìðÿµœŸêïÿ´›Ÿéïþ´›Ÿéïþ´œ éïþ³› èîþ´› çíþ³›Ÿæìþ³› åëþ²š äêþ±š âéþ°šŸàèþ®™ Þæþ­™ Ûäþ­™ŸÛãþ«˜ Øáþ«˜ Öàþª˜ŸÕßþª—ŸÔÞþª—ŸÔÞþ©— Ôßþ©˜ Ôßþª˜ Õàþ«˜ŸÖàþª˜ Öàþ«—ŸÖàþ«˜ŸØáþ¬˜ŸØâþ¬˜ŸÚâþ¬˜ŸÚãþ­˜ŸÛäþ­™ŸÜäþ­™ Ûäþ®™ŸÜæþ­™ŸÜåþ®™ŸÝåþ®™ŸÝåþ®šŸÝæþ®™ŸÝåþ¯™ Þæþ®™ ßæþ¯™Ÿßçþ°™Ÿàçþ±š áêþ°š áéþ±šŸâéþ±š ãêþ±›Ÿãêþ²šŸäëþ³›Ÿåìþ²› åìþ²›Ÿåìþ²š åìþ²š äëþ²š äëþ²› äëþ²šŸäëþ²›Ÿåìþ²›Ÿæíþµ›Ÿêïþ“­Ÿ“–¿‘ª ‘”¿‘ªŸ‘•¿’« ’•¿’¬Ÿ’–¿“­Ÿ“–¿“­Ÿ“—¿”®Ÿ”—¿”¯Ÿ”—¿”®Ÿ”—¿”® ”—¿•¯ •—¿”¯Ÿ”—¿”¯Ÿ”˜¿”¯ ”—¿•¯ •—¿”¯ ”—¿”¯Ÿ”—¿”®Ÿ”—¾”® ”–¿”®Ÿ”—¿“®Ÿ“—¿”¯Ÿ”—¿”¯ ”—¿”®Ÿ”—¿”® ”—¿“­Ÿ“–¿“¬ “–¿‘«Ÿ‘•¿‘« ‘”¿‘ª ‘•¿‘ª ‘”¿‘ªŸ‘•¿‘©Ÿ‘”¿‘ªŸ‘”¿’ªŸ’•¿’¬Ÿ’•¿“­ “–¿”®Ÿ”—¿”®Ÿ”—¿“® “—¿”¯Ÿ”—¿”¯ ”—¿•°Ÿ•˜¿•±Ÿ•™¿–²Ÿ–™¿—² —š¿˜µ ˜š¿™´ ™š¿™µ ™š¿™¶ ™›¿™¶ ™š¿˜´ ˜š¿—³ —™¿–² –™¿•± •—¿•°Ÿ•˜¿•±Ÿ•˜¿—´ —™¿™¶ ™›¿š¸Ÿšœ¿œº œ�¿�¼ �žÀž½ŸžžÀž¾ žŸÀŸ¾ ŸŸÀŸ¾ ŸŸ¿Ÿ¾ ŸŸÀž¾ŸžŸ¿Ÿ½ ŸŸÀž¾ŸžžÀž½ŸžŸÀŸ¾ŸŸŸÀž¾ žŸ¿ž½ žŸ¿Ÿ¾ ŸŸ¿Ÿ¾ŸŸŸ¿Ÿ¾ ŸŸ¿Ÿ½ŸŸŸ¿ž¾ŸžŸÀž¾ŸžŸÀŸ½ ŸŸ¿ž½ žŸÀ�½ �ž¿�¼ �ž¿œ» œ�Àœº œ�À›¹ ›�¿š¸ š›À™µŸ™š¿–±Ÿ–˜¾”¯Ÿ”—¿•° •˜¿–² –™¿—² —™¿—³ —™¿˜´Ÿ˜™¿™¶Ÿ™›¿š¶Ÿš›¿˜µŸ˜š¿˜´ ˜š¿˜´Ÿ˜š¿˜´ ˜š¿˜µ ˜š¿™µ ™›¿™¶ ™š¿˜¶Ÿ˜›¿š·Ÿš›¿™¶ ™›¿™¶ ™›¿˜¶ ˜›¿˜´Ÿ˜š¿˜µ ˜š¿˜´ ˜š¿—³ —™¿—³ —™¿—² —™¿—² —™¿—²Ÿ—˜¿–± –™¿–±Ÿ–™¿–° –˜¿•° •˜¿•¯Ÿ•—¿•° •˜¿•¯ •—¿•°Ÿ•˜¿–±Ÿ–™¿—´Ÿ—™¿™´Ÿ™š¿™¶ ™›¿š· š›¿š· š›Àš¸ šœ¿š·Ÿš›Àš¸ šœ¿š· šœ¿š· š›Àš·Ÿš›¿™¶ ™›¿˜µŸ˜š¿™µ ™›¿™µŸ™š¿˜´ ˜š¿—³ —™¿—³ —™¿–²Ÿ–™¿•±Ÿ•˜¿–° –˜¿–°Ÿ–˜¿•°Ÿ•˜¿–°Ÿ–™¿•±Ÿ•˜¿–±Ÿ–˜¿–±Ÿ–˜¿–±Ÿ–˜¿–±Ÿ–˜¿–²Ÿ–™¿—± —™¿—² —™¿—³Ÿ—™¿—³ —™¿—³ —™¿˜³Ÿ˜™¿—´Ÿ—™¿˜´ ˜š¿˜µŸ˜š¿˜´ ˜š¿˜´ ˜š¿˜´ ˜™¿˜³Ÿ˜š¿—³ —™¿—² —™¿—³Ÿ—™¿˜² ˜™¿—²Ÿ—˜¿–²Ÿ–™¿–± –˜¿–²Ÿ–˜¿–±Ÿ–˜¿–±Ÿ–˜¿•° •—¿•¯ •˜¿•¯Ÿ•˜¿”¯ ”—¿–±Ÿ–˜¿—³Ÿ—š¿™¶ ™›¿š¸ šœ¿›¹Ÿ›œ¿œº œ�¿�» ��À�½Ÿ�žÀž½ žŸ¿ž½ŸžŸÀž¾ žŸ¿Ÿ¾ŸŸŸ¿Ÿ¾ ŸŸÀŸ½ Ÿž¿Ÿ¾ Ÿ ¿Ÿ¿ŸŸŸ¿Ÿ¿ Ÿ ¿ ¿  ŸÀŸ¿ Ÿ ¿ ¿  ŸÀŸÀ Ÿ ÀŸ¿ŸŸŸÀ ¿Ÿ  ¿Ÿ¿ ŸŸÀŸ¿ ŸŸÀŸ¾ ŸŸ¿Ÿ¿ ŸŸ¿Ÿ¾ ŸŸ¿Ÿ¿ ŸŸÀž¾ŸžŸ¿Ÿ¾ ŸŸÀŸ½ ŸŸÀž¾ žŸ¿Ÿ¿ ŸŸ¿Ÿ¿ Ÿ ÀŸ¿ŸŸ À ¿   ¿ ¿   À À   ¿ ¿Ÿ  ¿Ÿ¿ Ÿ ÀŸ¿ Ÿ ¿ ¿   ÀŸ¿ Ÿ ¿Ÿ¿ŸŸŸ¿Ÿ¿ ŸŸ¿ ¿   ÀŸ¿ŸŸ ¿Ÿ¿ ŸŸÀŸ¿ ŸŸ¿Ÿ¿ Ÿ ¿Ÿ¿ Ÿ Àž½ŸžŸÀŸ¾ ŸŸÀŸ¿ ŸŸ¿Ÿ¾ ŸŸ¿Ÿ¾ ŸŸ¿Ÿ¾ŸŸŸ¿Ÿ¾ ŸŸ¿Ÿ¾ŸŸŸÀž¾ žž¿�½ �ž¿�¼ �ž¿�¼ ��À�» ��¿œ» œ�¿œº œ�¿œº œœÀ›¹Ÿ›�¿œº œœ¿›¹Ÿ›œÀ›ºŸ›�À›¸ ›œÀ›¹ ›œÀ›¸ ››Àš¸ šœÀš¸Ÿšœ¿™·Ÿ™œ¿š·Ÿšœ¿š¶Ÿš›¿š¶Ÿš›¿™¶Ÿ™š¿˜µ ˜š¿˜´ ˜š¿˜µŸ˜š¿—³Ÿ—š¿–²Ÿ–™¿–± –˜¿–² –˜¿–±Ÿ–˜¿•°Ÿ•˜¿•° •—¿•° •˜¿–± –˜¿–± –˜¿—²Ÿ—™¿—² —™¿—³Ÿ—š¿˜´ ˜™¿˜´Ÿ˜š¿™µ ™š¿˜µŸ˜š¿™µŸ™›¿™µŸ™š¿˜µŸ˜š¿™¶ ™š¿™µ ™›¿™¶ ™›¿™µŸ™›¿™µŸ™š¿™µ ™›¿™¶ ™›¿™¶ ™š¿š¶Ÿš›¿™¶ ™›¿™¶ ™›¿™¶ ™š¿™µŸ™›¿˜´ ˜™¿˜³Ÿ˜™¿–³Ÿ–™¿–²Ÿ–™¿–±Ÿ–˜¿–± –™¿•° •˜¿–°Ÿ–˜¿–± –˜¿–± –˜¿—² —˜¿—² —™¿—³Ÿ—™¿–³ –™¿—³ —™¿—³ —™¿™µŸ™›¿§—ŸÏÛþ¢”ŸÆÔþ¤” ÈÖþ¤• ÊÖþ¥• ÌØþ§–ŸÎÚþ§— ÑÛþ¨—ŸÒÝþ¨—ŸÒÝþ©– ÒÝþ©– ÒÝþ©— ÔÞþ©—ŸÒÝþ©—ŸÓÞþ©— ÔÞþ©—ŸÓÞþ©— ÓÞþ©—ŸÒÞþ©– ÒÝþ¨— ÒÞþ©–ŸÒÝþ©–ŸÓÞþ©—ŸÓÞþ©— ÓÞþ©—ŸÓÞþ¨—ŸÑÝþ¨–ŸÐÛþ¦– ÍÙþ¥•ŸË×þ¤•ŸÈÖþ£•ŸÇÖþ£•ŸÆÔþ¢” ÆÕþ£”ŸÇÔþ£• ÇÕþ¤• ÉÖþ¥–ŸËØþ§–ŸÎÚþ¨—ŸÒÝþ©—ŸÓÞþ¨–ŸÒÝþ©—ŸÓÞþ©— Ôßþ«˜ Öàþ«˜ Øãþ­˜ŸÛäþ®™ŸÞæþ°šŸáéþ±šŸãëþ²› äìþ³›Ÿæìþ²›Ÿæìþ±š âéþ°™Ÿßçþ­™ Ûäþ«˜Ÿ×âÿ¬˜Ÿ×áþ¬˜ Ùãþ°™Ÿàèþ³› çîÿ¶œ ìñÿ¸�Ÿñõÿºž õùÿ¼ž øúÿ¼ŸŸùûÿ½ž úûÿ¾ŸŸûüÿ½ŸŸûüÿ½Ÿ ûüÿ½ž ûûÿ½ž úûÿ½Ÿ úûÿ¾Ÿ üüÿ½Ÿ úüÿ½Ÿ úüÿ½Ÿ ûüÿ¾Ÿ ûüÿ½Ÿ úüÿ½ž úûÿ½ž úûÿ½Ÿ úûÿ½žŸúûÿ¼ŸŸùûÿ¼ž øûÿ»ž öøÿ¹� òöÿ¸�Ÿðôÿ·œŸîóÿ¶œ ëðÿ²› ãêþ¬˜ Øãþª—ŸÔßþ«˜Ÿ×áþ¬™ŸÛãþ¯™ŸÞæþ®™ŸÞæþ¯š àèþ²›Ÿæìþ³›Ÿæìþ²š ãêþ°š âêþ°š âéþ°šŸâêþ²š äëþ²›Ÿåëþ³š åëþ²šŸåíþ³›Ÿçíþ³›Ÿæíþ³›Ÿæìþ±› äëþ±™Ÿâéþ°šŸâéþ°™Ÿáèþ¯™ŸÞçþ¯™ Þæþ®™ Ýåþ®™ Üæþ­™ŸÛåþ­˜ŸÚãþ¬˜ Ùâþ«˜ŸØáþ«˜Ÿ×áþ«˜ŸÖàþ«˜ŸÖàþª˜ŸÖàþ¬˜ŸØáþ¬˜ Úãþ¯™ ßçþ±š ãêþ³›Ÿèîþ´›Ÿéîÿ´› éîÿ´œ êðÿµ› êïÿµœ êðÿµ› êðÿ³œ èîÿ´›Ÿèîþ³›Ÿçìþ²› äìþ²› äëþ²š äêþ¯š àèþ¯™ Þæþ¯™ Ýåþ­™ Ûãþ¬™ Úãþ«˜ Øâþ¬˜ Øâþ«˜ Øâþ«˜ŸØâþ«˜ŸØâþ¬˜ŸÙâþ¬˜ Ùâþ­˜ Úãþ­˜ŸÛãþ­™ŸÛäþ®™ Ýäþ®™ Ýæþ®™ŸÝæþ¯š Þæþ®™ Þæþ¯™Ÿßçþ¯šŸàéþ°šŸáéþ±š âêþ±šŸâéþ°šŸáéþ¯šŸßèþ¯™ ßçþ¯™ Þæþ¯™ Þæþ¯™ ßæþ¯š Þæþ®™ Üåþ­™ŸÛäÿ­™ŸÛãþ­˜ŸÚãþ¬˜ Ûãþ¬˜ŸÙâþ«˜ ×àþ«—ŸÕßþª—ŸÔßþª˜ Õßþ¬˜ Úãþ¯šŸßçþ³›Ÿæíþµœ êïÿ·œŸîóÿ¹�Ÿñõÿº� õ÷ÿ»ž öùÿ¼ŸŸøúÿ¼Ÿ ùûÿ½Ÿ úüÿ¾Ÿ ûüÿ¾Ÿ ûüÿ½Ÿ úûÿ¾Ÿ ýýÿ¿  ýþÿ¿ŸŸþþÿ¿  þþÿ¿ Ÿþÿÿ¿ Ÿþÿÿ¿  þÿÿ¿ Ÿþÿÿ¿Ÿ þþÿ¿  ýþÿ¾  ýýÿ¾ŸŸýýÿ¿Ÿ ýýÿ¾Ÿ üýÿ¾Ÿ üýÿ½Ÿ ûüÿ¾Ÿ ûüÿ¾Ÿ ûûÿ½ž ûüÿ½ŸŸûýÿ¿  ýýÿ¿  þþÿ¿  þþÿ¿ Ÿþÿÿ¿Ÿ þÿÿ¿  þÿÿ¿  þþÿ¿ Ÿþþÿ¿Ÿ þþÿ¿Ÿ þþÿ¿  ýþÿ¿ŸŸýþÿ¿Ÿ ýþÿ¿  ýþÿ¿ Ÿýþÿ¿  ýþÿ¿  þþÿ¾Ÿ ýþÿ½Ÿ úûÿ¾Ÿ ûüÿ¾  üýÿ¾ŸŸûüÿ½ŸŸûüÿ½Ÿ üüÿ¾Ÿ ûüÿ½ž úüÿ½Ÿ ùûÿ¼Ÿ øúÿ»ž ÷ùÿ»ž öøÿºž ó÷ÿ¹� òõÿ¹� ñôÿ¸œ ðôÿ·� ïóÿ·�Ÿïóÿ·�Ÿïóÿ·�Ÿïóÿ·œ îòÿ·�Ÿíòÿ¶› ëðÿ¶œŸëðÿ´› êïþ´›Ÿèîþ´›Ÿèîþ´›Ÿçíþ³š æìþ²šŸæëþ²›Ÿäëþ±›Ÿãêþ°š áéþ¯™Ÿßèþ®™ŸÜåþ¬™ Úãþ¬˜ŸÙãþ¬™ Úâþª˜ Öáþ«˜ŸÖáþ¬˜ ×áþ­™ Úãþ­˜ŸÜäþ®˜ŸÝäþ¯™ Þçþ¯š àéþ°š àèþ±š âéþ±šŸãêþ±šŸãêþ²›Ÿäìþ²› äëþ²š äëþ²šŸåëþ³›Ÿçìþ²› æìþ²š åìþ²š åìþ²›Ÿåëþ³›Ÿæëþ³› æìþ³›Ÿçíþ³›Ÿçíþ²šŸåìþ²šŸäëþ²šŸãêþ°š àèþ°šŸàçþ®™ Ýæþ­™ŸÜåþ­™ŸÚãÿ¬˜ŸÙâþ«˜ ×áþ¬˜ŸÙáþ¬™ŸÙâþ¬™ Úãþ­™ Ûäþ®˜ Üäþ®™ŸÝåþ®™ Ýæþ®™ Ýæþ®šŸÞæþ²šŸäëþ–± –˜¿”® ”—¿”®Ÿ”—¿”¯ ”—¿”¯ ”—¿”¯ ”—¿”¯ ”—¿”° ”˜¿•° •˜¿•± •˜¿–±Ÿ–™¿–²Ÿ–™¿—² —™¿—²Ÿ—™¿—²Ÿ—™¿—³ —™¿˜´ ˜™¿˜´ ˜š¿—´ —š¿˜´Ÿ˜š¿—´Ÿ—š¿˜³Ÿ˜™¿—´Ÿ—™¿—³ —™¿—´ —™¿˜³ ˜™¿—³ —™¿–² –™¿—²Ÿ—™¿—²Ÿ—˜¿—²Ÿ—˜¿—² —™¿–² –™¿–² –™¿–± –™¿•±Ÿ•˜¿•±Ÿ•˜¿•±Ÿ•˜¿–±Ÿ–˜¿•°Ÿ•˜¾–±Ÿ–—¿•° •˜¿•°Ÿ•˜¿•¯ •—¿•°Ÿ•—¿•°Ÿ•˜¿•°Ÿ•˜¿–± –™¿–± –™¿—²Ÿ—™¿—³Ÿ—š¿˜´ ˜š¿™¶ ™š¿™¶ ™š¿™µ ™š¿˜µ ˜›¿˜´Ÿ˜š¿—² —™¿—²Ÿ—™¿–²Ÿ–˜¿–±Ÿ–˜¿—± —˜¿—²Ÿ—™¿—³ —š¿˜³ ˜š¿™µŸ™š¿™¶Ÿ™›¿™¶ ™›¿š¶Ÿš›¿™· ™œ¿š·Ÿšœ¿š· šœ¿›¸Ÿ›œ¿›¸ ›œÀ›¹ ›œ¿›¸ ›œ¿›¸ ›œÀ›¸ ›œÀ›¹ ›�À›¹Ÿ›œÀ›¹ ›œÀœ¹ œœ¿œ¸ œ�¿š¸ šœ¿š¸ š›¿™· ™›¿˜µ ˜š¿—µŸ—š¿—³ —™¿–± –˜¿•¯Ÿ•˜¿”¯Ÿ”—¿”¯ ”—¿•°Ÿ•˜¿•° •˜¿–² –™¿–²Ÿ–™¾—³Ÿ—™¿—³Ÿ—š¿—´ —™¿—´Ÿ—š¿˜´ ˜™¿˜´Ÿ˜™¿˜´Ÿ˜š¿—³Ÿ—™¿˜´Ÿ˜™¿˜´Ÿ˜š¿—³ —™¿–³ –™¿–² –™¿–² –˜¿–± –˜¿–± –˜¿•±Ÿ•™¿–° –˜¿•°Ÿ•—¿•°Ÿ•˜¿•¯Ÿ•˜¿•°Ÿ•˜¿”¯Ÿ”—¿”¯ ”—¿•¯Ÿ•—¿•± •˜¿–²Ÿ–˜¿–³ –™¿—´Ÿ—š¿˜´Ÿ˜š¿˜µŸ˜š¿™¶Ÿ™›¾š·Ÿšœ¿›¸Ÿ››¿›¹ ›�¿›¹Ÿ›�¿›¹ ›œ¿›¸ ›œÀ›¹ ›œÀ›¹ ›�À›¹ ›�¿œ¹ŸœœÀœ¹Ÿœ�À›ºŸ›�¿œ¹ œœÀ›¹Ÿ›œÀ›¹Ÿ›œÀ›· ›œÀš¸ š›¿™¶ ™›¿š·Ÿš›¿š¶ š›¿˜µŸ˜š¿˜´Ÿ˜š¿˜³Ÿ˜™¿—²Ÿ—™¿–± –˜¿–±Ÿ–™¿•±Ÿ•˜¿•° •˜¿•°Ÿ•—¿–±Ÿ–˜¿•° •˜¿•°Ÿ•˜¿•° •˜¿•°Ÿ•˜¿•± •˜¿•±Ÿ•˜¿–± –˜¿–±Ÿ–˜¿–± –˜¿•±Ÿ•˜¿•°Ÿ•˜¿•± •˜¿•° •˜¿•° •˜¿–± –˜¿•° •˜¿•±Ÿ•˜¿•°Ÿ•˜¿”¯ ”—¿•¯Ÿ•—¿”¯Ÿ”˜¿•°Ÿ•—¿•±Ÿ•˜¿–±Ÿ–˜¿—³Ÿ—™¿˜´Ÿ˜š¿™¶ ™›¿š¸ š›¿›¹ ›œÀœ¹ œœÀœ¹ŸœœÀ�¼ ��¿�¼Ÿ�ž¿�½Ÿ�ž¿Ÿ½ ŸŸÀž¾ žŸÀŸ¾ŸŸŸÀž¾ŸžžÀŸ¾ ŸŸ¿Ÿ¿ŸŸŸ¿Ÿ¿ Ÿ ¿Ÿ¾ ŸŸ¿ž¾ žŸ¿ž¾ žŸ¿Ÿ¾ ŸŸÀŸ¿ ŸŸÀŸ¿ Ÿ ÀŸ¿ Ÿ ¿Ÿ¿ŸŸŸÀŸ¾ ŸŸ¿ž¾ žŸ¿Ÿ¿ Ÿ ÀŸ¿ ŸŸ¿Ÿ¿ ŸŸÀŸ¾ ŸŸÀŸ¾ ŸŸ¿ž¿ žŸÀŸ¿ ŸŸ¿Ÿ¿ŸŸŸ¿Ÿ¿ŸŸ ¿Ÿ¿ Ÿ ¿Ÿ¿ ŸŸÀŸ¿ŸŸŸÀŸ¿ ŸŸÀŸ¾ Ÿ ¿Ÿ¿ ŸŸ¿Ÿ¾ŸŸŸ¿Ÿ¾ŸŸŸ¿Ÿ¾ ŸŸÀŸ¾ ŸŸÀŸ¾ ŸŸ¿ž¿ ž ÀŸ¾ŸŸŸÀŸ¾ŸŸž¿ž¾ žŸÀŸ¾ Ÿž¿Ÿ¾ ŸŸ¿ž¾ žŸ¿Ÿ¾ŸŸŸ¿ž¾ žŸ¿ž½ žŸ¿ž½ŸžŸ¿ž¾ŸžŸ¿ž¾ žŸ¿ž¾Ÿžž¿ž¾ žŸ¿ž½ žŸ¿ž½ žžÀž½ žžÀž½ žžÀž½ žŸ¿�¼ �žÀ�»Ÿ�ž¿œ»ŸœžÀœº œ�Àœ¹ œ�À›¹ ›œÀœ¹ œœÀ›· ›œ¿™¶ ™›¿™µŸ™š¿˜´Ÿ˜š¿–² –™¿–± –˜¿•° •˜¿•±Ÿ•˜¾•°Ÿ•˜¿–° –˜¿•° •˜¿–° –˜¿•° •—¿•°Ÿ•˜¿•±Ÿ•˜¿•°Ÿ•—¿•°Ÿ•—¿•° •—¿•¯Ÿ•—¿•¯Ÿ•˜¿”¯Ÿ”—¿”¯ ”˜¿•°Ÿ•˜¿•°Ÿ•˜¿•± •˜¿–² –˜¿—²Ÿ—™¿—³Ÿ—™¿˜´Ÿ˜š¿˜´ ˜š¿™¶Ÿ™›¿™· ™›¿™· ™›¿š· š›¿š¸ šœÀ›¹Ÿ›œÀ›¹Ÿ›œÀœºŸœœ¿›¹ ›œÀœº œ�Àœ¹ œ�Àœº œœ¿œº œ�À�º ��¿œ¹ œœ¿œº œ�¿›¹Ÿ›�Àœº œ�À›¹ ›œ¿›¹ ›œÀš¸ šœ¿š¸ šœ¿š· šœÀ™¶Ÿ™›¿™µŸ™›¿˜´Ÿ˜™¿—³Ÿ—™¿—³Ÿ—™¿–²Ÿ–™¿—²Ÿ—˜¿—± —˜¿–±Ÿ–™¿—³ —š¿­™ŸÚãþ¨—ŸÓÞþ¨—ŸÒÝþ©—ŸÓÞþ©— ÓÞþ©— ÓÞþ©˜ Ôßþª— Öàþ«—ŸÖáþ«—Ÿ×âþ¬˜ Ùãþ­™ Ûäþ­™ Üåþ®˜ŸÝæþ¯™ŸÞæþ°™Ÿßçþ°š àèþ¯š àèþ°š áèþ°™Ÿàèþ°šŸáèþ¯™ àçþ°™Ÿßçþ°šŸàçþ°™Ÿßçþ¯šŸßèþ¯™ Þæþ®™ Þåþ®™ŸÝåþ­™ Üåþ­™ŸÜåþ­™ Üåþ­™ Ûäþ¬™ Úäþ­™ Úãþ­˜ Úãþ«˜ŸØâþ«˜Ÿ×áþ«˜Ÿ×áþ«—Ÿ×áþ«˜Ÿ×âþ«˜ŸØáþª˜ŸÖàþ«˜ŸÖàþª—ŸÕàþ«— Öàþ«—Ÿ×áþ¬™ŸÙãþ®™ŸÛäþ¯™ Þæþ¯š ßèþ°š áéþ²› æìþ²›Ÿæìþ²š åëþ²šŸãêþ°™Ÿáèþ®š Þæþ­™ŸÜåþ¬˜ŸÚãþ¬˜ Ùãÿ­˜ Ûäþ®˜ŸÞæþ¯šŸàæþ°šŸáèþ²›Ÿäëþ³›Ÿæìþ³›Ÿèíþ´› èíþ´› èîþµ› êïþµ›Ÿêïþµœ ëðÿ¶œŸìðÿ¶œ ìñÿ·œ íñÿ¶œŸíñÿ¶œŸîñÿ·œŸîòÿ·�Ÿîòÿ·œ îòÿ·œ îòÿ·œ îòÿ¶œ ìðÿµœ êðþ²›Ÿæíþ²› åëþ°š áéþ®™ Ýåþ¬˜ŸÙâþª— Ôßþª—ŸÔÞþª˜ŸÕàþª— Öàþ¬˜ Øáþ®˜ Ûäþ®˜ŸÜäþ®™ŸÝæþ°™Ÿßçþ°™Ÿàçþ°š àèþ¯™ àèþ°™Ÿàèþ°šŸáéþ°šŸßèþ¯š ßçþ°™Ÿßçþ¯™ Þæþ®™ŸÝæþ¯™ŸÝåþ­™ŸÛäþ®™ Ûãþ­˜ Úãþ¬˜ Ùâþ«— Øáþ«˜Ÿ×âþ«˜ ×áþª— Õßþ©—ŸÔßþª˜ ÔÞþ©—ŸÔÞþª— Ößþ«˜ ×áþ­™ Ûãþ®™ Üæþ°™Ÿàçþ±š âéþ²š åëþ³›ŸçíþµœŸêïþµœ ìðÿ¶œ íòÿ·� îòÿ·� îòÿ·œ îòÿ·œ îóÿ·œ ïóÿ¸œ ïóÿ·œŸïóÿ¸�Ÿïóÿ·œ ïóÿ·œ îòÿ¶œ îòÿ·œ íòÿ¶›ŸëðÿµœŸêïÿµœŸéïÿ´œŸéîþ³›Ÿçíþ²šŸäëþ±š âéþ°š àçþ®™ŸÜæþ­˜ŸÚãþ­™ŸÛãþ¬˜ŸÙãþ«˜Ÿ×áþ«˜Ÿ×áþ«˜ ×áþ«—Ÿ×áþ«˜ ×áþ¬˜ŸØáþ¬˜ŸÙáþ¬˜ Øáþ¬˜ Øâþ«™ Ùâþ¬˜ Ùâþ­˜ŸÚâþ­˜ Ùâþ¬˜ Ùâþ¬˜ŸØâþ¬˜ Øáþ¬˜ŸØáþ¬˜Ÿ×áþ«˜ ×âþ«˜ ×áþ«˜ŸÖàþ«˜ŸÕßþª—ŸÕßþª˜ Õàþ«—Ÿ×àþ¬˜ ×áþ¬™ Úãþ®™ŸÝæþ±š âéþ³› æìþ´œ ëïÿ¶� íòÿ¸œ ïóÿ¸œ ðôÿºž ô÷ÿ»ž öùÿ¼ž ÷ùÿ½ŸŸùûÿ½Ÿ úüÿ½Ÿ ûüÿ½ŸŸûüÿ¾ŸŸûüÿ¾ŸŸüýÿ½Ÿ ûýÿ¾Ÿ ûüÿ¾Ÿ ûüÿ½Ÿ ûüÿ¿ŸŸýýÿ¿ Ÿýþÿ¿Ÿ ýþÿ¾  ýþÿ¾Ÿ ýýÿ¾ŸŸüýÿ¾  üýÿ¾ Ÿýþÿ¾ŸŸüýÿ¾  üýÿ¾Ÿ üýÿ¾Ÿ üýÿ¾  üýÿ¾  üýÿ¾  üýÿ¾  ýþÿ¿Ÿ þþÿ¾ Ÿýþÿ¾Ÿ ýýÿ¾ŸŸüýÿ¾  ýýÿ¾Ÿ üýÿ¾Ÿ ûüÿ¾ŸŸûüÿ¾Ÿ ûüÿ½ŸŸûüÿ½Ÿ ûüÿ¾Ÿ üýÿ½Ÿ ûüÿ¾ŸŸûüÿ½Ÿ úüÿ½Ÿ úüÿ½Ÿ ûüÿ½Ÿ ûüÿ½Ÿ úüÿ½Ÿ úüÿ¼Ÿ ùûÿ½ž ùûÿ½Ÿ ùûÿ½Ÿ ùûÿ¼Ÿ ùûÿ½Ÿ úûÿ¼ž ùûÿ¼ž ùúÿ¼Ÿ øúÿ¼žŸùúÿ¼ŸŸøûÿ»žŸöøÿºž ô÷ÿ¹� òöÿ¸� ñôÿ¸œ ðóÿ·� ïóÿ·œ îòÿµœŸëðÿ³› çîþ²š ãêþ¯šŸàèþ¯™ Ýæþ¬˜ŸÚãþ«˜ ×áþ«˜ ×áþ«˜ ×áþ¬˜ Øáþ«— ×áþ«˜ŸØáþ¬˜ Øáþ¬˜ŸØáþ«˜ Øâþ«— Öàþª—ŸÖßþª— Õßþª˜ Õßþ«—ŸÕßþª˜ŸÔßþª—ŸÕßþ«˜ Öàþ«˜ Øáþ¬˜ŸØâþ­˜ Ûäþ®™ Ýæþ¯š ßçþ°šŸáéþ²šŸãêþ²šŸåìþ³›Ÿçíþ´› èîþ´œŸéïÿ¶œ ëðÿ¶� íñÿ·œ íòÿ¸� ïóÿ·� îòÿ¸�Ÿïóÿ¸� ðóÿ¸� ðôÿ¸� ðôÿ¸œ ñôÿ¸� ñôÿ¸�Ÿðôÿ¸� ðóÿ·� ðóÿ·� ïóÿ·œ îòÿ¶œ ìñÿµœŸêðÿ³œ èîÿ²› åìÿ±›Ÿäëþ±šŸâéþ®™ Þæþ®™ Ýåþ­˜ŸÜäþ®˜ Üäþ®™ Üãþ­˜ŸÚâþ¯™ŸÞæþ™µ ™š¿—´Ÿ—™¿˜³Ÿ˜š¿˜³Ÿ˜š¿˜µŸ˜š¿™´Ÿ™š¿™µŸ™š¿™´ ™š¿˜´ ˜š¿˜µ ˜š¿˜µŸ˜š¿˜µ ˜š¿™´ ™š¿™µŸ™š¿™µ ™›¿˜´Ÿ˜š¿˜´ ˜™¿˜´Ÿ˜™¿—´ —™¿—³Ÿ—š¿—³ —™¿—³Ÿ—™¿—³ —š¿—³Ÿ—™¿—²Ÿ—™¿—²Ÿ—™¿—² —™¿—³Ÿ—™¿—³Ÿ—™¿—² —™¿—³Ÿ—™¿—² —™¿—² —™¿—³ —™¿˜´ ˜™¿˜´Ÿ˜š¿˜µ ˜š¿™µŸ™š¿™¶Ÿ™›¿™µŸ™›¿™¶ ™š¿™¶Ÿ™›¿™¶ ™›¿˜¶ ˜š¿™µ ™š¿˜´ ˜š¿—³ —™¿–³ –™¿–± –˜¿•±Ÿ•˜¿•± •˜¿•±Ÿ•˜¿–± –˜¿—±Ÿ—™¿—²Ÿ—™¿—³Ÿ—š¿—´ —š¿˜´Ÿ˜š¿˜´Ÿ˜š¿˜´Ÿ˜š¿˜³Ÿ˜™¿˜´ ˜š¿—´ —š¿—³Ÿ—™¿—³ —š¿—³Ÿ—™¿—³Ÿ—™¿–³Ÿ–™¿–³Ÿ–™¿—³Ÿ—š¿—² —™¿—² —™¿—²Ÿ—™¿—³ —™¿—³ —™¿—² —™¿–±Ÿ–˜¿–±Ÿ–™¿–± –™¿–± –˜¿–± –˜¿–± –˜¿–° –˜¿•°Ÿ•˜¿•°Ÿ•—¿•°Ÿ•˜¿•®Ÿ•˜¿”¯ ”—¿”¯ ”—¿”¯ ”—¿”¯Ÿ”—¿•¯Ÿ•—¿•¯ •—¿”°Ÿ”—¿•¯Ÿ•—¿•°Ÿ•˜¿”¯Ÿ”˜¿•°Ÿ•—¿•°Ÿ•—¿•¯ •—¿•°Ÿ•—¿•¯ •—¿•¯ •˜¿•° •—¿•¯Ÿ•˜¿•¯Ÿ•—¿”¯ ”˜¿•¯Ÿ•˜¿•°Ÿ•—¿”¯Ÿ”˜¿•¯ •—¿”¯Ÿ”—¿”¯Ÿ”—¿”¯ ”—¿•®Ÿ•—¿”¯Ÿ”—¿”¯Ÿ”—¿•¯ •—¿”°Ÿ”—¿”¯Ÿ”—¿”¯Ÿ”—¿•±Ÿ•˜¿•° •˜¿–²Ÿ–˜¿–²Ÿ–˜¿—² —˜¿—³Ÿ—™¿—´Ÿ—š¿™´Ÿ™š¿™µ ™š¿™µŸ™›¿™¶ ™š¿™¶Ÿ™›¿™¶Ÿ™š¿™µ ™š¿™¶ ™›¿™µ ™›¿™¶ ™š¿™µŸ™š¿™µŸ™š¿˜µŸ˜š¿˜µ ˜š¿˜´Ÿ˜š¿˜´ ˜š¿˜³ ˜š¿˜´Ÿ˜š¿˜´ ˜š¿˜´ ˜š¿˜µŸ˜š¿˜´Ÿ˜š¿˜´ ˜š¿˜´ ˜š¿˜´Ÿ˜š¿˜´Ÿ˜š¿˜µ ˜š¿™´Ÿ™š¿˜µ ˜š¿˜µ ˜š¿™µŸ™š¿™µŸ™›¿™¶Ÿ™š¿˜µ ˜›¿™¶Ÿ™›¿š¶ š›¿™·Ÿ™›¿™¶ ™›¿š· šœ¿™·Ÿ™›¿™¶ ™›¿™¶Ÿ™š¿™µ ™š¿˜´Ÿ˜™¾—³Ÿ—™¿—³ —™¿—³Ÿ—™¿—³Ÿ—™¿—² —™¿—² —™¿—³ —š¿˜´Ÿ˜™¿˜´ ˜š¿˜´ ˜™¿˜µŸ˜›¿˜¶Ÿ˜›¿š¶ š›¿š· š›¿š¸Ÿšœ¿š· š›¿š¸Ÿšœ¿›¸ ›œ¿›¸ ›œÀ›¹ ›œ¿›¹ ›�¿œ¹ œ�ÀœºŸœ�ÀœºŸœ�ÀœºŸœ�¿œ» œž¿œ» œ�¿�»Ÿ�žÀœ» œžÀ�» ��¿œ¼Ÿœ�¿�» �žÀ�¼Ÿ��¿�¼ �ž¿�¼ �ž¿�¼ ��¿�¼ �žÀ�¼ �žÀž½ žž¿ž½ žŸÀ�½ �ŸÀž½ žŸÀŸ½ŸŸž¿ž½ žŸÀž½ žŸ¿ž½ žŸÀž¾ žŸÀž¾ŸžŸÀž¾ žŸ¿ž¾ŸžŸ¿Ÿ¾ ŸŸÀŸ¾ŸŸŸ¿Ÿ¾ ŸŸ¿ž¾ žŸÀž¾ žŸÀŸ¾ ŸŸ¿Ÿ½ ŸŸÀž½ žŸÀž½ žŸÀž½ žž¿ž½ŸžŸÀž½ žž¿ž½ žžÀž½ žž¿ž½ žŸ¿ž½ŸžžÀž½ žŸÀž½ žŸ¿ž½ žžÀž½ŸžžÀŸ½ ŸŸÀŸ¾ ŸŸÀž¾ žŸ¿Ÿ¾ŸŸŸ¿ž¾ žŸ¿ž¾ŸžŸÀž¾ŸžžÀŸ½ ŸžÀž½ žžÀ�¼ �ž¿�¼Ÿ�ž¿œº œž¿›º ›�À›¹Ÿ›�¿š¸ šœ¿˜µ ˜š¿–²Ÿ–˜¿”¯ ”—¿”° ”—¿–°Ÿ–—¿–²Ÿ–™¿—³ —™¿—³ —š¿—³Ÿ—™¿—³ —™¿˜´Ÿ˜™¿˜µ ˜š¿˜´Ÿ˜™¿—´Ÿ—š¾—³Ÿ—™¿—³ —™¿—³ —™¾—³Ÿ—™¿—³Ÿ—š¿–² –™¿–²Ÿ–™¿–² –˜¿–² –˜¿–± –˜¿–± –˜¿–±Ÿ–˜¿•°Ÿ•˜¿•° •˜¿•° •˜¿•°Ÿ•˜¿•¯ •˜¿”°Ÿ”—¿•± •˜¿–² –™¿—³Ÿ—š¿˜µŸ˜š¿™¶Ÿ™›¿š·ŸšœÀ›¹ ›œ¿›¸ ›œ¿œº œœ¿œº œ�À�º ��Àœ» œž¿�»Ÿ��¿œº œ�¿œºŸœ�À�º ��¿œº œ�¿œº œœÀœ¹ œ�¿œ¹ œœ¿›¹ ›œ¿›¸Ÿ›�À›¹ ›œÀœ¸Ÿœœ¿œ¹ œœ¿œ¸ œœ¿›¹ ›�À›¸ ›œÀš¸ŸšœÀ™· ™›¿š· š›¿²›Ÿäëþ¯šŸßçþ°™ àçþ°š àèþ°š áéþ±šŸãêþ±š ãêþ±š ãêþ±šŸãêþ±š âêþ±š âëþ²›Ÿãêþ²š ãêþ±›Ÿäêþ²› äêþ°™Ÿâéþ°šŸáèþ°š áèþ°šŸàçþ¯šŸßçþ¯™ŸÞæþ¯™ Þæþ®™ Ýæþ®™ŸÝçþ®™ Ýæþ®™ Ýåþ®™ŸÞåþ¯™ Þæþ¯™ Þæþ¯™ ßæþ¯™ Þæþ®™ŸÝæþ¯™ŸÞæþ¯™ ßçþ¯™ àçþ¯™ àèþ±šŸâéþ±›Ÿäêþ²šŸäëþ²š äëþ²› åìþ³›Ÿåìþ³š åìþ²› åìþ±š ãêþ°™ àèþ¯™Ÿßæþ­™ Üåþ¬˜ Ùãþ¬˜ŸÚãþ¬˜ŸØâþ¬˜ŸÙâþ¬™ Ùãþ®™ŸÛäþ®™ Ýåþ®š Þçþ¯šŸßèþ¯š àéþ°šŸáéþ°šŸàèþ¯™Ÿßçþ°š àèþ°™ àèþ°šŸàçþ°™ ßçþ¯™Ÿßçþ®™ŸÞçþ®˜ŸÝåþ¯™ŸÝæþ®š ßæþ¯™ŸÞæþ¯™ Þæþ¯š Þçþ¯™ŸÞæþ¯™ Þæþ®™ Üäþ¬˜ Úãþ¬˜ŸÚãþ­™ Úãþ­˜ Ùâþ¬˜ŸÚãþ¬˜ŸÙâþ¬˜ Ùáþ«˜Ÿ×áþ«˜ŸÖàþª˜ŸÖàþª— ÔÞþª— ÔÞþ©—ŸÔÞþ©—ŸÓÞþª— Ôßþ«—ŸÖßþª—ŸÕßþª˜ŸÖßþª˜ Õàþª—ŸÕáþª— Õàþª˜ŸÕàþ«˜ŸÖàþ«—Ÿ×àþ«˜ Öàþ«—ŸÖàþ«˜ŸÖáþª—ŸÖàþª˜ŸÕàþ«— Õßþª˜ŸÕàþª˜ Õàþª— Õßþ©˜ŸÔßþª—ŸÕÞþª—ŸÓÞþ©˜ŸÓÞþ©—ŸÓÞþ©—ŸÕÞþª—ŸÔÞþª˜ŸÔàþª—ŸÕßþ©— Ôßþ©—ŸÔÞþª—ŸÖßþ«˜ Øáþ«˜ Øáþ¬˜ Úãþ®™ŸÛäþ¯™ŸÝåþ¯™ŸÞæþ¯šŸàèþ±šŸâêþ²š äëþ³›Ÿæìþ³› æìþ³š æìþ³šŸæìþ²› æìþ³š æìþ³›Ÿæìþ³›Ÿæìþ²šŸåëþ²š äêþ±šŸãêþ±šŸãêþ±š âéþ°šŸâèþ°šŸàçþ°šŸàèþ°™ àèþ°š áéþ±™ áéþ±š áéþ±šŸáêþ°šŸáéþ°šŸáéþ±š âéþ±šŸâéþ²šŸãêþ²šŸãêþ²› äêþ²šŸäëþ²› äëþ²š äëþ²šŸåëþ²› åìþ²› æíþ´› çíþ³› çíþ´›Ÿéîþ´› èîþ´› çíþ²š åëþ±šŸäêþ°™Ÿàèþ°™Ÿßçþ¯™ ßçþ¯™Ÿßæþ®š Þæþ®™ Þæþ¯™ Þæþ¯š Þçþ¯™Ÿàçþ°™Ÿàèþ°šŸáéþ±šŸãêþ³› åìþ³›Ÿçíþ´›ŸèîþµœŸéïþµ› êïÿµ› êïÿµ›Ÿëðÿ¶œ ìñÿ¶œ íòÿ·œŸîòÿ¸� ïóÿ·� ðôÿ¸� ñôÿ¹ž óõÿ¹ž òõÿ¹� òöÿ¹� ôöÿ¹� òöÿºž óöÿº� ô÷ÿº�Ÿô÷ÿºž ô÷ÿºž õ÷ÿ»žŸõøÿ»žŸöøÿ»žŸöùÿ¼žŸ÷ùÿ¼ŸŸøúÿ¼žŸøúÿ¼Ÿ øúÿ¼ŸŸøûÿ½ŸŸùüÿ½Ÿ ùúÿ½ž ùúÿ½žŸùûÿ½ŸŸúûÿ¾Ÿ ûüÿ½Ÿ ûûÿ½Ÿ úüÿ½Ÿ ûüÿ¾Ÿ ûüÿ½Ÿ ûüÿ½Ÿ úüÿ½Ÿ ûüÿ½ŸŸûüÿ½Ÿ úûÿ½ž úûÿ½žŸúûÿ½žŸúúÿ¼Ÿ ùúÿ¼Ÿ øúÿ¼ž øúÿ¼ž øúÿ½ŸŸùûÿ¼žŸùúÿ¼ž ùúÿ¼Ÿ øúÿ¼ž øúÿ¼Ÿ ùûÿ¼Ÿ ùûÿ½žŸúûÿ½ŸŸúüÿ½Ÿ ûüÿ½Ÿ úüÿ½Ÿ úüÿ½Ÿ úûÿ½Ÿ ûûÿ¼ŸŸùûÿ»ŸŸ÷ùÿºž õøÿº�Ÿóöÿ·�Ÿðôÿ·œŸïóÿµ› êïþ²š ãêþ¬˜ŸÙãþ©—ŸÔÞþª—ŸÖßþ«˜ ×àþ¬™ŸÚãþ®™ Üåþ®™ŸÝæþ¯™ ßçþ¯š ßçþ°š àèþ°šŸáéþ°š áéþ°™ àèþ°š àçþ®™ŸÞæþ®™ Þæþ¯™ Þæþ¯™Ÿßæþ®™ŸÜåþ­˜ŸÛäþ­™ŸÛäþ®˜ŸÛãþ­™ Úãþ­˜ Ùâþ¬˜ Øâþ«˜Ÿ×áþ«˜ŸÖàþª—ŸÖáþª˜ Öàþª˜ Õßþª—ŸÕàþ«˜ ×âþ­˜ŸÛåþ¯™ Þæþ±šŸâéþ²›Ÿåìþ´› êïÿ¶œ íñÿ·�Ÿîòÿ·œ ïóÿ¹œ ñôÿ¹�Ÿóõÿº�Ÿó÷ÿº�Ÿóöÿ¹�Ÿòöÿ¹�Ÿòõÿ¸�Ÿñõÿ¸� ñôÿ¸œ ðôÿ¸� ïóÿ·� ïóÿ·� îòÿ·œ îòÿ·� îòÿ·œŸîòÿ·� îòÿ·�Ÿîòÿ·œŸíòÿ¶œ íñÿ¶œŸëðÿ³› éîþ´œŸéïþ—³Ÿ—™¿–°Ÿ–˜¿•± •˜¿•± •˜¿–±Ÿ–˜¿–±Ÿ–˜¿–±Ÿ–˜¿•± •˜¿–±Ÿ–˜¿–° –˜¿•± •˜¿•°Ÿ•—¿•° •˜¿•°Ÿ•—¿•°Ÿ•˜¿•± •˜¿•°Ÿ•˜¿–± –˜¿–° –™¿•°Ÿ•˜¿•°Ÿ•˜¿•°Ÿ•—¿•° •˜¿–± –˜¿–³Ÿ–™¿—²Ÿ—™¿—²Ÿ—˜¿—² —™¿˜³Ÿ˜™¿˜³ ˜š¿˜µ ˜›¿˜µŸ˜š¿˜µŸ˜š¿˜µ ˜š¿˜³ ˜™¿—³ —™¿•° •˜¿•° •˜¿•° •˜¿—²Ÿ—™¿–³ –™¿—´Ÿ—™¿˜´Ÿ˜š¿™¶Ÿ™›¿š· š›¿™¶Ÿ™›¿—´Ÿ—š¿–±Ÿ–™¿•° •˜¿”° ”—¿•¯ •˜¿”®Ÿ”—¿”¯Ÿ”—¿”¯ ”–¿”®Ÿ”—¿”¯Ÿ”—¿”® ”—¿”¯Ÿ”—¿”¯ ”—¿”¯Ÿ”—¿”® ”—¿”®Ÿ”—¿”®Ÿ”—¿”­Ÿ”–¿“­ “–¿“­ “–¿’¬Ÿ’–¿“­Ÿ“–¿“­ “–¿“®Ÿ“–¿”¯ ”—¾”¯ ”—¿•°Ÿ•—¿•°Ÿ•˜¿–±Ÿ–™¿–±Ÿ–˜¿–²Ÿ–™¿—³Ÿ—™¿—´ —™¿˜´Ÿ˜š¿™µ ™š¿™µ ™›¿™µ ™›¿˜´ ˜š¿—³Ÿ—™¿–± –˜¿–±Ÿ–˜¿•± •˜¿•¯ •˜¿”¯Ÿ”—¿•¯Ÿ•—¿–° –—¿–² –™¿—´Ÿ—™¿˜´Ÿ˜š¿™¶Ÿ™›¿š¶Ÿš›¿š¶ š›Àš·Ÿš›¿š¸ šœÀš· šœÀš¸Ÿšœ¿š· š›À™¶ ™›¿˜µ ˜š¿—³ —™¿–²Ÿ–™¿•±Ÿ•˜¿”¯Ÿ”—¿”®Ÿ”˜¿”¯Ÿ”—¿”°Ÿ”—¿”¯ ”—¿•¯Ÿ•—¿•°Ÿ•—¿–°Ÿ–—¿–±Ÿ–˜¿–± –˜¿–±Ÿ–˜¿•²Ÿ•™¿–² –™¿—²Ÿ—™¿—²Ÿ—™¿—² —™¿—² —™¿–³Ÿ–˜¿—³Ÿ—™¿˜µ ˜š¿˜´Ÿ˜š¿˜³ ˜™¿˜´Ÿ˜š¿˜´ ˜™¿—³ —š¿—³ —™¿˜³ ˜š¿—³Ÿ—™¿—³ —™¿—´ —š¿˜´ ˜š¿˜µŸ˜š¿˜´Ÿ˜š¿˜´Ÿ˜š¿˜µŸ˜š¿˜´ ˜™¿˜´Ÿ˜š¿™´ ™š¿˜´ ˜š¿˜µŸ˜š¿˜´Ÿ˜š¿—³Ÿ—™¿—³Ÿ—™¿–² –š¿–² –˜¿–± –™¿–±Ÿ–˜¿•°Ÿ•˜¿•± •˜¿•° •˜¿–±Ÿ–™¿˜´Ÿ˜š¿˜µ ˜š¾š· šœ¿š¸ šœ¿›¸ ›œ¿›¹ ›�À›¸ ›�¿›¹ ›�¿œ¹Ÿœ�¿œ¹ œ�Àœ¹ œœÀ›¸ ›�¿›¸ ›œÀš¸ šœÀš·Ÿš›¾š· š›¿™µ ™š¿˜´ ˜š¿˜´Ÿ˜š¿—³ —š¾—³ —™¿–² –™¿–±Ÿ–˜¿•° •˜¿•¯ •—¿”°Ÿ”—¿•°Ÿ•—¿•°Ÿ•—¿•°Ÿ•˜¿•° •˜¿”¯Ÿ”—¿•°Ÿ•—¿•°Ÿ•˜¿•°Ÿ•—¿–±Ÿ–˜¿–± –˜¿–±Ÿ–™¿–±Ÿ–˜¿—³Ÿ—™¿—³ —™¿—³Ÿ—š¿—´ —™¿—´ —™¿—³Ÿ—™¿–²Ÿ–™¿–²Ÿ–™¿–±Ÿ–˜¿–±Ÿ–˜¿–²Ÿ–™¿–²Ÿ–˜¿—±Ÿ—™¿–²Ÿ–˜¿–±Ÿ–™¾–² –™¿—²Ÿ—˜¿–³Ÿ–™¿—³Ÿ—š¿˜³ ˜™¿˜³ ˜š¿˜µ ˜š¿™µ ™š¿™¶Ÿ™›¿›¹ ›�Àœº œ�À�º ��¿œ»Ÿœ�À�» ��¿�¼ �ž¿ž½Ÿžž¿Ÿ¾ ŸŸÀž¾ žŸ¿ž¾ žŸÀž¾ žŸÀž¾ žŸÀž¾ žŸÀž¾ žŸ¿ž½ žŸ¿ž¾ŸžŸ¿Ÿ¾ ŸŸ¿ž¾ žŸÀŸ¾ ŸŸ¿Ÿ¾ŸŸŸÀŸ¾ ŸŸÀŸ¾ ŸŸÀŸ¾ ŸŸ¿ž¾ žŸ¿Ÿ¾ ŸŸÀž¾ žŸ¿Ÿ¾ Ÿž¿ž¾ žŸ¿Ÿ½ŸŸŸÀ�½ �Ÿ¿�¼Ÿ�ž¿�» ��¿›¹ ›œÀœº œ�À›¸Ÿ››À™µŸ™š¿–±Ÿ–˜¿”° ”˜¿–°Ÿ–—¿–±Ÿ–˜¿–³ –™¿—³Ÿ—š¿˜µŸ˜š¿˜µŸ˜›¿˜´ ˜š¿˜²Ÿ˜™¿—² —™¿—³Ÿ—™¿—³ —™¿—³Ÿ—™¿—³ —™¿˜´ ˜š¿˜µ ˜š¿™µŸ™›¿™¶Ÿ™›¿™¶Ÿ™š¿™µŸ™›¿™¶ ™›¿™¶Ÿ™›¿™µŸ™š¿˜´ ˜š¿—³Ÿ—™¿—³ —™¿—³Ÿ—™¿—²Ÿ—™¾–²Ÿ–™¿–±Ÿ–˜¿–°Ÿ–˜¿•° •˜¿•¯Ÿ•˜¿•°Ÿ•˜¿•° •˜¿•° •˜¿–±Ÿ–˜¿—³ —™¿˜µŸ˜š¿™¶ ™›¿™¶ ™›¿™· ™›¿š·Ÿš›¿š·Ÿšœ¿›¸ ›œ¿›¸ ›œÀ›¸Ÿ›œÀš¸Ÿšœ¿›¸ ›œ¿š·Ÿš›¿›¸ ›œ¿š·Ÿš›¿™· ™›¿™¶Ÿ™›¿š¶Ÿš›¿™¶Ÿ™›¿™¶ ™›¿™¶Ÿ™š¿™µŸ™š¿˜´ ˜š¿—³Ÿ—™¿˜³ ˜™¿¯šŸßæþ¬˜ Øâþ¬˜ Ùãþ¬˜ Ùãþ­™ŸÚãþ¬˜ŸÙâþ¬˜ŸÙãþ¬˜ŸÚâþ«˜ Ùâþ¬˜ŸØâþ¬˜ŸØâþ«— Öàþ«˜ŸÖàþ«— Öáþ«—Ÿ×àþ¬˜ŸÙãþ¬˜ŸØâþ¬˜ Ùâþ«˜ŸØãþ¬— Øáþ«˜Ÿ×áþª—Ÿ×àþ¬˜ Øáþ¬˜ Ùâþ­™ŸÜåþ¯™ Ýåþ®™ Ýåþ®™ŸÝåþ°™Ÿßæþ°™ àèþ°š âêþ²š ãêþ±› ãêþ²š ãëþ°š àéþ®™ Üåþ¬˜ŸØâþª˜ŸÖàþ«˜ ×áþ®˜ Ûãþ®™ Ýæþ¯™ Þçþ±šŸâéþ³š æìþ´œ êïÿ³›Ÿæìÿ°™Ÿàèþ¬˜ŸÚäþª˜Ÿ×àþª—ŸÕàþª— Ôßþ©— ÓÞþ©—ŸÒßþ¨–ŸÒÝþ¨—ŸÒÝþ©—ŸÓÞþ¨—ŸÒÞþ¨—ŸÒÝþª—ŸÔßþ©—ŸÓÞþ¨— ÓÝþ©—ŸÒÝþ¨—ŸÑÜþ¨–ŸÑÛþ§– ÏÚþ§– ÎÚþ¦•ŸÍÚþ§–ŸÎÚþ§–ŸÏÚþ¨–ŸÑÜþ©—ŸÓÞþ©˜ŸÔßþ«˜ Öàþ«— Øáþ¬˜ŸÚâþ­˜ŸÚãþ®™ŸÜåþ®šŸÞæþ°šŸàèþ±š áéþ±š ãêþ±šŸäëþ²šŸäëþ°š âéþ¯™ŸÞæþ®™ Ýäþ­˜ Úãþ«˜ŸØâþª—ŸÖàþª— Õßþ©—ŸÓßþ«˜ Øáþ­™ŸÜåþ¯™ ßçþ°š âéþ²šŸåíþ³›Ÿçíþµ› éîÿ´› êïÿµ› ëïÿ´œŸêðÿ´› êïÿ³› çîÿ²›Ÿæìþ°šŸâéþ°šŸàçþ®™ Üåþ«˜ Øâþª— Õßþª—ŸÓÞþ©—ŸÔÞþ©—ŸÔßþª—ŸÔàþ«˜ Õßþ«— Öàþ«˜Ÿ×áþ¬˜ Úâþ­™ Ûãþ­˜ Úãþ­˜ŸÛäþ®™ Ûäþ®™ŸÜåþ®˜ŸÜäþ®™ŸÝåþ®™ Ýåþ®™ŸÝåþ¯šŸÞçþ°š áéþ°šŸâéþ±™Ÿâèþ°š áèþ°™ àèþ¯™Ÿàçþ¯š ßçþ¯™ ßçþ¯™ŸÝæþ¯™Ÿàçþ°™Ÿáèþ±š âéþ±š âéþ±š âéþ°šŸâéþ±š ãéþ°šŸáéþ±š âéþ±™Ÿâéþ±š âéþ°š áéþ°š áèþ°šŸáçþ¯š àçþ®™ŸÞæþ®™ŸÛäþ­˜ŸÚãþ­˜ Ùâþ«˜Ÿ×áþ¬˜Ÿ×áþ¬˜ŸØáþ­™ Ûäþ±š áèþ±šŸäëþ´œŸèîþµ› êïþ¶œ íòÿ¶� íòÿ·œ îòÿ·� ïóÿ¸� ðõÿ¸�Ÿïóÿ·œ îòÿ¶œŸíñÿ¶œ íñÿ´œ ëðÿ´œŸèîþ³›Ÿçíþ²šŸåëþ±šŸâéþ°šŸàèþ¯š ßèþ®™ŸÞæþ®™ŸÛäþ¬˜ Ùâþ«˜Ÿ×áþ«—Ÿ×áþ«˜ ×àþ«˜ Öàþ«— ×àþª˜ŸÖáþ«˜ŸÖáþª— Õßþ«—ŸÖàþ«˜Ÿ×àþ«˜Ÿ×àþ«— ×áþ¬˜ Øâþ¬˜ŸÙãþ­™ŸÛãþ®™ Üåþ¯™ Þçþ°šŸßçþ¯™ ßçþ¯™ ßçþ¯™ Þæþ®™ŸÝåþ­™ Üåþ­™ Ûäþ¬˜ Úãþ­™ŸÚãþ­™ŸÚãþ­˜ŸÛäþ®™ŸÛäþ­™ Úãþ­™ŸÛäþ®™ Ýåþ®™ŸÝæþ¯™ Þæÿ¯™ ßçþ°šŸßçþ°š âêþ±šŸãêþ´›Ÿéîþ·œ íñÿ¸� ðôÿ¹� òõÿ¸žŸòõÿº� óöÿº� õøÿ¼Ÿ øúÿ½Ÿ úûÿ½Ÿ úüÿ¾ŸŸûüÿ½Ÿ ûüÿ½ŸŸûüÿ½Ÿ úüÿ½Ÿ úüÿ½žŸúûÿ½Ÿ ûüÿ¾Ÿ üüÿ¾Ÿ ûüÿ¾  üýÿ½ŸŸûüÿ½Ÿ ûýÿ¾ŸŸûüÿ½ŸŸûüÿ½Ÿ úüÿ¾ŸŸûüÿ¼Ÿ úüÿ½Ÿ úûÿ¼ž ùûÿ½ŸŸùûÿ¼žŸøúÿº� õøÿ¹ž òõÿ¸œ ðóÿ·œŸïóÿ¶œ ìñÿ²š äêþ­™ Ûãþª— Ôßþ«˜ŸØàþ¬™ Úãþ®™ Ýæþ¯™ àçþ±šŸãêþ²š äëþ°š àèþ¯™ àæþ¯šŸÞæþ®™ŸÞæþ®™ŸÝæþ®šŸÞçþ¯™Ÿàèþ±šŸâéþ²›Ÿäêþ²› æëþ²› åìþ³›Ÿæìþ³› æìþ³›Ÿæìþ³› æìþ²šŸäëþ°šŸáéþ°šŸàçþ¯š ßçþ¯™ Þæþ®™ŸÝåþ®™ Üäþ­˜ Ûäþ«˜ŸØáþ«—Ÿ×àþª˜ Ößþ©— Ôßþ©— Ôßþª˜ŸÖàþ­˜ŸÙãþ¯™ŸÞæþ°šŸâéþ²›Ÿåëþ³› çíþ´› èîþ´œ éïþµ› êïþµœŸêðþµœ ìðÿµœŸíðÿ¶œ ëñÿµœŸêðþµœ êðþµœ êðþµ› éïþ´› èîþ´› èíþ³› çíþ³› æíþ²› æìþ²šŸäëþ²š äëþ±šŸâéþ®™ Ýæþ¯™ àçÿ˜´ ˜š¿—²Ÿ—˜¿—² —˜¿–²Ÿ–™¿—³Ÿ—™¿—³ —š¿—³Ÿ—™¾—³ —š¿–²Ÿ–™¿—³Ÿ—™¿—³ —™¿—³ —™¿—³ —š¿—³Ÿ—š¿˜³Ÿ˜™¿—´Ÿ—š¿—³Ÿ—™¿—³Ÿ—™¿—² —™¿—³ —™¿—³ —™¿—³ —™¿˜³Ÿ˜™¿—³Ÿ—š¿—³ —™¿—³Ÿ—™¿—² —™¿–³Ÿ–™¿—³ —™¿—³Ÿ—™¿–² –™¾–² –˜¿—²Ÿ—™¿—²Ÿ—™¿–³Ÿ–™¿—² —™¿—³ —™¿–² –™¿—² —™¿˜³ ˜™¿—´ —š¿˜µ ˜š¿˜´Ÿ˜š¿˜´ ˜š¿˜³Ÿ˜š¿–±Ÿ–™¿•°Ÿ•˜¿•¯ •—¿”¯Ÿ”˜¿”¯Ÿ”—¿”®Ÿ”–¿”®Ÿ”—¿“® “—¿”®Ÿ”–¿“®Ÿ“–¿“® “—¿”¯Ÿ”—¿”® ”—¿”® ”—¿”¯Ÿ”—¿•¯ •˜¿”® ”—¿”¯ ”—¿”­Ÿ”—¿”­ ”—¿“­Ÿ“–¿“®Ÿ“–¿“­ “–¿“® “—¿”® ”—¿“® “—¿”¯Ÿ”—¿”¯ ”—¿•¯Ÿ•—¿”¯Ÿ”˜¿”°Ÿ”—¿•¯Ÿ•—¿•°Ÿ•˜¿–±Ÿ–˜¿–²Ÿ–™¿˜´Ÿ˜š¿™µŸ™š¿™¶ ™›¿š¸ š›¿™¶ ™›¿˜´Ÿ˜š¿—³Ÿ—™¿—²Ÿ—™¿—²Ÿ—™¿–° –˜¿•°Ÿ•—¿”¯Ÿ”—¿–² –™¿˜³Ÿ˜™¿˜µ ˜š¿š¶Ÿš›¿š¸Ÿš›¿›¸ ›œ¿›¹ ›œÀ›¸ ›œÀ›¹Ÿ›œ¿›¹ ›œ¿š¸ šœÀš¸Ÿšœ¿™¶Ÿ™›¿™µŸ™š¿˜´ ˜š¿–²Ÿ–™¿•° •˜¿•¯ •—¿”¯Ÿ”—¿”¯ ”˜¿•¯ •˜¿•° •˜¿•°Ÿ•˜¿–° –™¿—± —™¿—²Ÿ—™¿—³ —™¿–³Ÿ–™¿—³Ÿ—™¿—³ —™¿—´Ÿ—™¿—´ —š¿˜´ ˜™¿˜´Ÿ˜š¿™µŸ™š¿š¶ šš¿™¶Ÿ™š¿™µ ™š¿˜µ ˜š¿˜µ ˜š¿˜´Ÿ˜™¿—´ —š¿—´ —š¿˜´ ˜™¿˜´Ÿ˜š¿˜´ ˜™¿˜µ ˜š¿™µŸ™š¿™¶Ÿ™š¿˜¶Ÿ˜š¿™µŸ™š¿™µŸ™›¿™¶Ÿ™š¿š¶Ÿš›¿š·Ÿš›¿š¶ š›¿š¸Ÿš›Àš·Ÿš›Àš·Ÿš›¿™¶ ™š¿˜³Ÿ˜™¿—³Ÿ—™¿—³Ÿ—™¿—³ —™¿–² –™¿•° •—¿•¯Ÿ•—¿•¯Ÿ•˜¿–² –˜¿—³ —™¿™´Ÿ™š¿™¶ ™›¿™· ™›Àš¸Ÿšœ¿š¸ šœ¿š·ŸšœÀš¸Ÿšœ¿š· šœÀš¶Ÿš›¿™¶ ™›¿˜´ ˜š¿˜´ ˜š¿˜³Ÿ˜™¿–³Ÿ–™¿–²Ÿ–˜¿•° •˜¿•°Ÿ•—¿”¯ ”—¿”® ”—¿”¯Ÿ”—¿•¯Ÿ•—¿•¯Ÿ•˜¿•¯Ÿ•—¿•°Ÿ•—¿•°Ÿ•˜¿•¯ •˜¿•¯ •—¿•¯ •—¿•¯ •—¿•°Ÿ•˜¿–° –˜¿–±Ÿ–˜¿–²Ÿ–˜¿–±Ÿ–˜¿–²Ÿ–™¿—³ —˜¿˜²Ÿ˜™¿˜³ ˜š¿—´ —š¿˜´ ˜™¿˜³ ˜™¿—³Ÿ—™¿—´ —™¿—³Ÿ—™¿—²Ÿ—™¿—³Ÿ—š¿—² —™¿–² –™¿–²Ÿ–™¿–²Ÿ–˜¿–± –˜¿–± –˜¿–±Ÿ–˜¿•° •˜¿•° •—¿”¯ ”˜¿”¯ ”˜¿•¯ •—¿•° •—¿—² —™¿˜´ ˜š¿™¶Ÿ™›¿š· šœ¿›¸Ÿ›œÀœ¹Ÿœœ¿�º ��¿�¼ �ž¿�½ �ž¿ž½ žŸÀŸ¾ ŸŸ¿Ÿ½ ŸŸÀŸ¾ŸŸŸ¿Ÿ¾ ŸŸ¿Ÿ¾ ŸŸ¿Ÿ¿ ŸŸ¿ž¾ žŸ¿ž¾ žŸ¿ž¾ žŸÀŸ¾ ŸŸÀŸ¾ŸŸŸÀž½ žŸ¿ž½ žžÀŸ½ ŸŸÀž½ žž¿ž¼ žžÀž¼ žž¿�» �žÀœ¼ œ�Àœº œ�¿œºŸœ�¿œºŸœœÀ›¹ ›œÀ›¹ ›œÀš¸ šœ¿š¶Ÿš›¿—³ —™¿•±Ÿ•˜¿•°Ÿ•—¿•°Ÿ•˜¿–±Ÿ–˜¿–² –˜¿—³Ÿ—™¿˜´ ˜š¿˜´ ˜š¿˜´Ÿ˜š¿˜´Ÿ˜™¿˜´ ˜š¿˜´Ÿ˜š¿˜´Ÿ˜™¿˜µŸ˜š¿˜µ ˜š¿™µ ™š¿™µŸ™›¿™µŸ™š¿™¶ ™š¿™¶Ÿ™š¿š¶Ÿš›¿™¶ ™›¿˜µŸ˜š¿˜´ ˜š¿—³Ÿ—š¿—³ —™¿˜³Ÿ˜™¿—³Ÿ—™¿–² –™¿–² –˜¿•±Ÿ•˜¿•°Ÿ•˜¿•¯Ÿ•—¿•°Ÿ•˜¿•°Ÿ•—¿•° •˜¿—² —™¿˜´ ˜š¿™¶Ÿ™š¿™¶Ÿ™›¿™· ™œ¿š· š›¿›¸ ››À›¸ ›œÀ›¸ ›œÀ›¸ ›œÀš¸ šœ¿š¸ šœÀš¸ šœ¿š¸ŸšœÀš¸Ÿš›¿š·Ÿšœ¿š·Ÿš›¾š· š›¿˜µ ˜›¿˜´Ÿ˜š¿—²Ÿ—™¿–° –™¿•° •˜¿”¯Ÿ”—¿”¯Ÿ”—¿—² —™¿°™Ÿàèþ­™ Ûäþ®™ Üäþ®˜ŸÜåþ¯™ŸÝåþ®š Ýæþ¯™ Þæþ®š Þæþ®™ Ýåþ¯™ŸÞæþ¯™ Þæþ®™ŸÞæþ¯™ ßçþ¯šŸßçþ¯™ ßçþ¯™Ÿàçþ¯™ ßçþ¯™ Þæþ¯™ Þçþ¯™Ÿßçþ¯šŸÞçþ¯™ Þæþ®™ŸÞæþ¯™ŸÞæþ¯™ŸÞæþ®™ Ýæþ®™ Ýåþ¯™ŸÝæþ¯™ Þæþ®™ŸÝæþ­˜ŸÜåþ­˜ Ûäþ®™ŸÞåþ¯™ Þæþ®šŸÝçþ®™ Üæþ­™ŸÜåþ®™ŸÜåþ®™ŸÝåþ¯šŸßçþ°šŸáéþ°šŸáéþ°šŸâéþ±šŸâéþ¯™ ßçþ­™ŸÛäþª˜ŸÖáþª—ŸÔàþª— Õßþ©—ŸÓÞþ©—ŸÒÝþ©– ÓÝþ¨— ÑÝþ©–ŸÒÝþ¨—ŸÒÝþ¨– ÑÝþ¨—ŸÓÝþ©—ŸÒÝþ©— ÓÝþ©—ŸÓßþ©—ŸÓÞþ©—ŸÒÝþ©—ŸÓÝþ¨–ŸÑÜþ§–ŸÏÛþ§— ÏÛþ§–ŸÏÛþ§– ÐÛþ¨—ŸÑÝþ¨— ÑÝþ©—ŸÒÝþ©—ŸÓÞþ©— ÓÞþ©— ÓÞþª˜ Ôßþª˜ŸÖàþª—ŸÕàþ¬˜Ÿ×âþ¬™ Ùãþ®™ŸÝæþ°™ àèþ±š ãêþ³šŸæìþ´œ éïÿ³šŸæìÿ¯š àèþ¯™ŸÞæþ¯™ Ýæþ®˜ Üäþ¬˜ Øáþª—ŸÕàþª— Ôßþ­˜ Ûãþ°™Ÿàçþ±š ãëþ³› çíþ´›Ÿêïþµœ ìñÿ¶œ ìñÿ¶œ íòÿ·œ íóÿ¶œŸìñÿµœ ëðÿµœ êðþ³›Ÿçíþ²š äêþ°š áèþ­™ Üäþ«—ŸÖàþ©— Ôßþ©—ŸÓÞþª— Õßþ«˜ŸÖßþ«—ŸØàþ¬˜ŸØáþ­˜ŸÚâþ­™ŸÛäþ®™ Ýåþ®™ Þæþ®™ŸÝæþ¯™ Þæþ¯™ Þæþ¯™ ßçþ¯™ ßçþ°š áèþ°š âéþ³›Ÿåëþ³›Ÿçìþ³›Ÿçìþ²š åëþ²š ãêþ°™Ÿáéþ±šŸáèþ¯šŸàèþ°™ àèþ°™Ÿàçþ°šŸàèþ°š áèþ±š âêþ²› äêþ²š äëþ±š åëþ±šŸäëþ²› åëþ²šŸæìþ´›Ÿçíþ´›Ÿèîÿ´› éîþ´› éïÿµœ ëïÿ´›Ÿèîþ²›Ÿåëþ¯š àèþ®™ŸÞçþ¯™ ßæþ®™ŸÞæþ­˜ŸÛãþ«˜Ÿ×àþª—ŸÔàþª—ŸÖàþ­˜ Úãþ¯™ Þæþ±š âéþ²›Ÿæìþ³œ èîÿµœŸéïÿµœ ìðÿµœŸëðÿ´œŸëïÿ´›Ÿéîÿ³› çíþ³› æìþ±š ãêþ°š âéþ¯™Ÿßèþ®™ŸÜåþ­˜ŸÚãþ«˜Ÿ×áþª— Õßþª—ŸÕßþª—ŸÓÞþ©— ÓÞþ©— ÔÞþ«—ŸÕßþ«˜ŸÖßþ«—Ÿ×àþ«— Öàþª˜ Öàþ«˜Ÿ×àþª— Õßþª—ŸÕßþª˜ Öàþ«˜ Øáþ¬˜ŸÙâþ­™ Ûäþ®™ŸÜäþ®™ Ýåþ®™ŸÝåþ¯™ŸÞæþ¯™Ÿßçþ°™ àèþ¯šŸàèþ¯šŸßçþ¯šŸàçþ¯™ŸÞçþ¯™ŸÞæþ¯™ Þæþ®™ Ýæþ®™ Þæþ®˜ŸÝåþ®™ Ýåþ­™ŸÛäþ­˜ŸÛãþ¬˜ŸÙãþ¬˜ŸÚâþ«˜ŸØáþ«—ŸÖàþª˜ Õßþª—ŸÔßþ©—ŸÔÞþ«˜ŸÖáþ®˜ŸÞåþ°šŸáèþ³› æìþ´›Ÿéïþ¶œ íòÿ¸� ïóÿ¹� òõÿºžŸô÷ÿ»ž öùÿ¼Ÿ øúÿ½Ÿ úûÿ¾ŸŸûýÿ½Ÿ ûüÿ¾Ÿ ûüÿ¾ŸŸüýÿ¾  üýÿ½Ÿ ûüÿ½ŸŸûüÿ½Ÿ ûüÿ¾Ÿ ûüÿ¾ŸŸûüÿ½ž úûÿ½ž úûÿ¼ž ùúÿ¼ž øúÿ»ž öùÿ»ž öøÿºžŸõ÷ÿº� ó÷ÿ¹ž òõÿ¸� ñõÿ¸œŸðóÿ·œ îòÿ¶� íñÿ´œ êðÿ³›Ÿæìþ°šŸßçþ¬˜ŸÙãþ«˜ŸØáþ«˜Ÿ×âþ¬˜ Ùâþ­˜ Üäþ¯™ŸÞæþ±šŸãéþ±šŸâéþ±š áéþ¯™ àèþ°š àèþ¯™Ÿßçþ±™Ÿáèþ±š áéþ±š ãêþ±šŸäêþ²› åëþ²šŸçìþ³›Ÿæìþ³›Ÿæìþ³› æìþ³›Ÿæìþ±› âêþ±šŸáèþ°™ ßçþ¯šŸßæþ¯™ŸÞæþ®™ Ýåþ®™ Ýåþ¬˜ŸÚäþ¬˜ŸØáþ«˜ Öàþª— Ôßþª— Ôßþª— Öàþ¬˜ Øáþ®™ Ýæþ°šŸáéþ²›Ÿåëþ³šŸæíþ´› èîþµœŸêïþµœ êðÿ¶œ ëðÿµœ ëðÿ¶œ ëðÿµœ ëñÿµœŸëðÿµœ ëðÿµ› ëðÿµœ êïþ´œ éïþ´œŸèîþ³›Ÿçíþ²šŸäêþ°šŸàèþ®™ Ýåþ¬˜ŸÙâþ¬˜Ÿ×áþ©˜ŸÕßþ©— ÓÞþ­™ Ûäþ—³Ÿ—™¿–°Ÿ–˜¿•° •˜¿•° •—¿•¯Ÿ•—¿•°Ÿ•˜¿•°Ÿ•—¿”¯Ÿ”—¿”® ”—¿”®Ÿ”–¿”® ”—¿”¯Ÿ”—¿”¯ ”—¿”¯ ”—¿”® ”—¿“®Ÿ“—¿”­Ÿ”–¿”®Ÿ”—¿”® ”–¿“®Ÿ“–¿“­Ÿ“–¿“­ “–¿“­ “–¿“­Ÿ“–¿’­Ÿ’–¿“¬ “–¿“¬Ÿ“•¿“­Ÿ“–¿’¬Ÿ’•¿“¬ “–¿’¬ ’–¿’¬Ÿ’•¿’¬Ÿ’•¿“­ “–¿“¬ “•¿“¬Ÿ“–¿“¬Ÿ“–¿“­Ÿ“–¿“­ “–¿“­ “–¿“­ “–¿“® “—¿“­Ÿ“–¿”®Ÿ”—¿”®Ÿ”—¿“®Ÿ“–¿”¯Ÿ”—¿”¯Ÿ”—¿•¯Ÿ•—¿”® ”—¿•¯ •—¾”¯ ”—¿”¯Ÿ”—¿”¯Ÿ”—¿•¯ •—¿•¯ •˜¿”¯Ÿ”˜¿•°Ÿ•˜¿•°Ÿ•˜¿–±Ÿ–˜¿•° •˜¿•°Ÿ•˜¿–±Ÿ–˜¿–²Ÿ–˜¿—²Ÿ—™¿–³ –™¿—³Ÿ—™¿—³ —™¿–² –™¿—³Ÿ—š¿˜³ ˜™¿—´ —™¿—´ —™¿—´Ÿ—š¿˜´Ÿ˜š¿˜´Ÿ˜š¿˜´Ÿ˜š¿˜´ ˜š¿˜µŸ˜›¿˜µ ˜š¿˜´Ÿ˜š¿˜¶Ÿ˜š¿™· ™›¿š¸ šœ¿™¶Ÿ™›¿˜´Ÿ˜š¿—³ —™¿—³Ÿ—š¿—² —˜¿•±Ÿ•™¿•¯Ÿ•˜¿”¯ ”—¿•±Ÿ•˜¿–²Ÿ–™¿˜´Ÿ˜™¿™¶Ÿ™š¿š·Ÿš›¿›· ›œÀ›¸Ÿ›œ¿œ¸ œ�Àœ¹ œ�¿›¹ ›œÀ›¹Ÿ›�À›¸Ÿ›œÀš· šœÀš· šœÀ™·Ÿ™›¿™¶ ™›¿˜´Ÿ˜š¿—²Ÿ—™¿•°Ÿ•˜¿•¯Ÿ•—¿”¯Ÿ”—¿•¯Ÿ•—¿”¯ ”˜¿•° •˜¿•±Ÿ•˜¿–±Ÿ–™¿—² —™¿—³Ÿ—™¿—³ —™¿—³Ÿ—™¿—³ —š¿˜² ˜™¿—³Ÿ—™¿—³Ÿ—š¿—³Ÿ—™¿—³ —™¿—³ —™¿˜³ ˜™¿˜³Ÿ˜™¿—³ —™¿—³Ÿ—™¿—² —™¿˜²Ÿ˜™¿—´Ÿ—™¿—´ —š¿—´Ÿ—š¿—´Ÿ—š¿˜´Ÿ˜™¿˜µ ˜š¿˜µ ˜š¿˜´ ˜™¿˜´ ˜š¿˜´ ˜š¿˜´Ÿ˜š¿˜´ ˜š¿˜´ ˜š¿™µŸ™š¿˜µŸ˜›¿—´ —™¿—³Ÿ—™¿—³Ÿ—™¿—²Ÿ—™¿—² —™¿—²Ÿ—™¿–° –™¿•°Ÿ•˜¾•° •˜¿•° •—¿•¯ •˜¿•¯Ÿ•˜¿•° •—¿•° •˜¿•°Ÿ•˜¿”° ”˜¿•± •˜¿•± •˜¿•±Ÿ•˜¿•± •˜¿–±Ÿ–˜¿–± –˜¿•±Ÿ•˜¿•°Ÿ•˜¿–±Ÿ–˜¿–± –˜¿–° –˜¿•°Ÿ•˜¿•¯Ÿ•˜¿•°Ÿ•˜¿”° ”˜¿•°Ÿ•˜¿•°Ÿ•—¿•¯Ÿ•—¿•¯ •˜¿”¯Ÿ”—¿•° •˜¿•° •—¾•°Ÿ•˜¿–° –˜¿–± –™¿—±Ÿ—™¿—² —™¿—²Ÿ—˜¿—²Ÿ—™¿–² –™¿–²Ÿ–˜¿—² —™¿—²Ÿ—˜¿–²Ÿ–™¿—² —™¿–²Ÿ–˜¿—³Ÿ—™¿—³Ÿ—™¿—´Ÿ—™¿—³ —™¿—´Ÿ—™¿—³ —™¿—³Ÿ—™¿—´ —š¿˜³Ÿ˜™¿—³Ÿ—™¿—³Ÿ—™¿–²Ÿ–™¿–²Ÿ–™¿–²Ÿ–™¿–±Ÿ–™¿•°Ÿ•˜¿•±Ÿ•˜¿•± •˜¿•¯ •—¿•°Ÿ•—¿”° ”—¿•¯ •—¿•° •˜¿–±Ÿ–˜¿˜³Ÿ˜™¿™· ™›¿š¸ŸšœÀ›¹ ›œ¿œ¹ŸœœÀœº œ�À�»Ÿ�žÀ�»Ÿ�ž¿�¼ �ž¿�¼ �ž¿�» ��À�¼Ÿ�ž¿�¼ �žÀœ¼ œž¿�» ��Àœ» œ�¿œºŸœžÀ�» �ž¿œ» œžÀœºŸœœÀœº œ�¿›º ›œ¿œ¹Ÿœ�À›¹ ›œÀ›¹ ›�¿œºŸœœÀ›¹Ÿ›�À›¸ ›œÀ›¸ ›œÀ›¹ ›œ¿›¸ ›œÀš¸ šœÀš· š›À™·Ÿ™›¿™·Ÿ™›¿™¶ ™›¿˜µŸ˜š¿˜´ ˜™¿–² –š¿–± –˜¿—²Ÿ—™¿–±Ÿ–˜¿–°Ÿ–˜¿–°Ÿ–—¿•°Ÿ•˜¿–±Ÿ–˜¿–± –™¿–²Ÿ–™¿—²Ÿ—˜¿–±Ÿ–™¿—² —™¿–²Ÿ–˜¿—²Ÿ—™¿–² –™¿–² –˜¿–±Ÿ–˜¿•± •˜¿•° •˜¿•° •˜¿”¯ ”—¿•¯ •˜¿”¯Ÿ”—¿”°Ÿ”˜¿•°Ÿ•˜¿•± •˜¿—²Ÿ—™¿—´ —š¿™µŸ™š¿™¶Ÿ™›¿›¸ ›œ¿›¹ ›œ¿›¹ ›�À›¸ ›�¿œ¹ œœÀœºŸœœÀ›¹ ›�Àœ¹ œœ¿œº œœÀœº œ�¿›¸ ›œ¿›¹Ÿ›œ¿›¹ ›œ¿š¸Ÿš›¿š· š›¿š·Ÿšœ¿š· š›¿š·Ÿš›¿˜µŸ˜š¿˜³Ÿ˜™¾—² —™¿–² –˜¿•° •—¿”¯ ”—¿—²Ÿ—™¿¯™Ÿßçþ¬˜ŸØãþ«˜Ÿ×áþ«— Öàþ«— Öàþª— Öàþ«— Öàþª— Ôßþ¨— ÒÞþ©— ÒÝþ¨—ŸÒÝþ©— ÓÞþª—ŸÔßþ©— ÓÞþ¨–ŸÒÝþ¨– ÑÝþ¨– ÐÜþ¨–ŸÒÝþ©— ÒÝþ¨—ŸÑÜþ§—ŸÐÛþ§–ŸÏÜþ§– ÏÛþ§– ÏÛþ¦–ŸÎÚþ§– ÍÙþ¦• ÍÙþ¦– ÍÙþ¦–ŸÍÙþ¦• ÍÙþ¥– ÌÙþ¥–ŸÌØþ¥• ËØþ¦–ŸÍÙþ§• ÍÚþ¦• ÍÚþ¦–ŸÍÙþ§– ÎÚþ§–ŸÎÚþ§–ŸÎÚþ§–ŸÏÜþ§–ŸÐÜþ¨– ÑÜþ©— ÒÝþ¨—ŸÒÝþ©—ŸÓÝþ©—ŸÓÞþ©— ÔÞþ©—ŸÓÞþª— ÓÞþ©—ŸÓÞþª—ŸÓÞþª— ÔÞþ©—ŸÔÞþª— ÕÞþª—ŸÔßþª˜ Ößþª— Öàþ«—ŸÖáþ«˜Ÿ×áþ¬˜ Øáþ¬˜ Ùâþ­™ Úäþ­™ŸÛäþ®™ Üåþ®™ Ýåþ®™ Ýæþ¯™ŸÝæþ®™ Ýæþ¯™ Þçþ¯š ßçþ¯™ ßçþ¯š ßçþ°™Ÿáèþ°šŸáéþ°š âéþ±šŸâéþ±š âéþ²›Ÿãêþ±š ãêþ±šŸãêþ²š åìþ³› çíþµœ êïÿ²› åìþ°™ áéþ¯™Ÿßçþ®š Þæþ®™ŸÞåþ¬˜ŸÙâþ«˜ŸØàþª— Ôßþ«˜ ×áþ­™ŸÜåþ°š àéþ²› åìþ´œ èïþ¶œŸëðÿ¶œ íñÿ·œ îòÿ·œ îóÿ·œ îóÿ·� íòÿ·œŸîñÿµœ ëðÿµœ éïÿ´œ éîþ³›Ÿåìþ°šŸáèþ¯™ Ýåþ«˜Ÿ×áþª˜ŸÔàþ©—ŸÓÞþ©—ŸÔÞþ«—ŸÕßþ«—ŸÖàþ¬˜ Ùâþ¬™ŸÛãþ®™ŸÜåþ¯™ŸÞæþ¯™ŸÞæþ®™ Ýæþ¯™ Þæþ®™ Þæþ¯™ Þçþ¯šŸÞæþ¯™ŸÞæþ¯™ŸÞæþ¯™ Þçþ®šŸÞçþ¯™ ßçþ¯™ Þæþ¯™ Þæþ¯™Ÿßæþ¯™ŸÞæþ°š ßçþ°š àèþ¯šŸàèþ¯šŸßèþ°šŸàèþ±™Ÿâêþ±š âéþ±š âéþ±š ãéþ±šŸãéþ±š âéþ±š âéþ±šŸãêþ±šŸãêþ±š ãêþ°™Ÿáèþ¯š àèþ®™ŸÝæþ®™ Ýæþ®™ŸÝåþ­˜ŸÝäþ¬˜ Ùâþ«˜ ×âþ«˜ Öàþª—ŸÖáþª— Ößþª—ŸÔßþª—ŸÔßþª— Õàþª˜ŸÕàþª˜ ×àþ«˜ ×áþ«— ×áþ«˜Ÿ×âþ«˜ ×áþ«˜ŸØâþ¬˜ Øâþ«˜ Øâþ¬˜ Øâþ«˜ Øâþ¬˜ŸØâþ«˜ŸØáþ«˜ Øáþª˜ Öàþ«˜ Öàþ«˜ŸÖàþª— Õßþ©— Ôßþª— Ôßþ©—ŸÔßþª— ÔÞþª˜ŸÕßþª˜ ×àþ«˜Ÿ×áþ¬˜ Úâþ­˜ Ûãþ­™ŸÛäþ®™ŸÝæþ­˜ŸÝåþ®˜ŸÝåþ®™ŸÜåþ®˜ŸÜåþ®˜ Üäþ®™ Üäþ®™ Üäþ®˜ Üäþ­™ Üäþ®™ŸÞåþ¯™Ÿßæþ°™Ÿßçþ°šŸßçþ¯™ ßçþ°š ßçþ°™ ßçþ°™Ÿßçþ¯™Ÿßèþ¯š ßæþ®™ Ýçþ­™ Üåþ®˜ŸÜäþ®˜ŸÛäþ­˜ŸÚãþ¬˜ Ùâþ¬™ Øãþ«˜ ×áþ«— Öàþª—ŸÕßþª—ŸÔßþ«—Ÿ×àþ«˜Ÿ×áþ­˜ Ûäþ°™Ÿáèþ³›Ÿçíþµœ ëðÿ·œŸíòÿ·� ïóÿ¹� ñôÿ¹� óöÿ»ž õ÷ÿ»ž öøÿ»ž ÷øÿºžŸöøÿ»žŸöøÿº� õøÿº� ô÷ÿº� õöÿºžŸôöÿ¹� óöÿ¹ž òöÿ¹� òõÿ¸�Ÿñôÿ¸� ðôÿ¸œ ïóÿ·� ïóÿ·œŸîòÿ¸œŸïóÿ¸� ïóÿ·œ îòÿ¶œ íòÿ¶œ ìñÿ¶œ ìñÿµœ ìñÿ¶œ ìòÿµœ êïÿ´›Ÿèîþ³› çíþ³› åìþ°šŸâêþ¯š ßèþ®™ŸÝæþ­™ŸÛäþ®˜ Üäþ¬˜ Úãþ¬˜ Øáþ«˜Ÿ×âþ¬˜ Ùâþ¬˜ Ùâþ­˜ŸÚãþ­˜ Ûäþ­˜ Üäþ­˜ŸÛåþ­™ Ýåþ®™ Ýäþ­˜ŸÛäþ®™ŸÛåþ­˜ŸÚãþ¬˜ŸÙâþ«˜ŸØâþ¬—Ÿ×áþ«—ŸÖàþª˜ Õßþª˜ŸÖßþª—ŸÕßþª—Ÿ×àþ¬— ×áþ¬˜ Úãÿ®™ŸÜåþ¯šŸàèþ±š ãêþ´›Ÿçíþµ›Ÿêïþ¶œ íñÿ¶œŸíòÿ·�Ÿîòÿ·� îóÿ·�Ÿïóÿ·œŸïóÿ¸œ ïóÿ·�Ÿïóÿ·œ ïóÿ¶� îòÿ·œ íòÿ·œ íñÿµ› ëðÿ´œ êïþ´› éïþ´œŸéïþ³›Ÿçíþ²š ãêþ°™Ÿàèþ®™ŸÝåþ­™ŸÚäþª˜ Õàþ©— ÔÞþ­™ŸÜåþ�£Ÿ�‘¿‰ž ‰Ž¿‰žŸ‰Ž¾ŠŸŸŠ�¿Š  Š�¿Š ŸŠ�¿‹¡ ‹�¾‹¡Ÿ‹�¿‹¡Ÿ‹�¿‹¡ ‹�¾‹¢Ÿ‹‘¾Œ£ŸŒ‘¾Œ£ŸŒ‘¿Œ£ŸŒ‘¿�¤Ÿ�‘¿�¥Ÿ�‘¿Ž¥ Ž’¿�¥Ÿ�“¿�¦ �’¿�¥Ÿ�’¿�¥ �’¿�¤Ÿ�’¾�¤ �‘¿Œ¤ŸŒ‘¾Œ£ŸŒ‘¿Œ¢ŸŒ‘¾‹¢Ÿ‹�¿Œ¢ŸŒ‘¾‹¢ ‹‘¾Œ¡ŸŒ�¿‹¡Ÿ‹�¿‹¡Ÿ‹�¾Š¡ Š�¾‹¡Ÿ‹�¾‹¢Ÿ‹�¿Œ¢ŸŒ‘¿�¤Ÿ�‘¿�¤ �’¾�¥ �’¾Ž¦ŸŽ’¿�§ �“¿�¨ �”¿�©Ÿ�”¿�© �”¿�©Ÿ�”¿‘ª ‘•¿’«Ÿ’•¿“­Ÿ“–¿“®Ÿ“–¿“®Ÿ“–¿”®Ÿ”—¿”®Ÿ”–¿”®Ÿ”—¿•¯Ÿ•—¿”¯ ”—¿”® ”—¿”¯Ÿ”—¿”¯ ”˜¿”°Ÿ”˜¿–±Ÿ–˜¿–± –˜¿–²Ÿ–™¿—³ —™¿—´ —š¿˜µŸ˜š¿˜µŸ˜š¿™µ ™›¿™¶Ÿ™›¿™¶Ÿ™›¿™¶Ÿ™š¿˜µŸ˜š¿˜µŸ˜š¿™µŸ™š¿™µŸ™›¿˜´ ˜š¿˜´Ÿ˜š¿—´Ÿ—š¿˜´ ˜š¿—´Ÿ—š¿˜´ ˜™¿—´Ÿ—š¿˜´Ÿ˜™¿˜µ ˜š¿˜µŸ˜›¿™·Ÿ™›¿š·Ÿš›¿™¶ ™›¿˜µŸ˜š¿˜´Ÿ˜š¿—³ —™¿—³Ÿ—™¿—³ —™¿–±Ÿ–™¿•° •˜¿•° •˜¿•° •˜¿•° •—¿•°Ÿ•˜¿—³ —™¿—´Ÿ—™¿˜´ ˜š¿˜µŸ˜š¿˜´Ÿ˜š¿˜µ ˜š¿—³Ÿ—š¿—³Ÿ—™¿–³Ÿ–™¿–±Ÿ–˜¿–°Ÿ–˜¿”¯ ”—¿”¯Ÿ”—¿”°Ÿ”—¿”¯Ÿ”˜¿•° •—¿•° •˜¿–° –—¿•±Ÿ•˜¿–±Ÿ–˜¿—± —™¿—³Ÿ—™¿—³Ÿ—™¿—³Ÿ—™¿—²Ÿ—™¿—³ —š¿—³Ÿ—š¿—³Ÿ—™¿—³ —™¿—³Ÿ—™¿—´ —š¿—³ —™¿—´Ÿ—š¿—´Ÿ—™¿˜³ ˜š¿—³ —™¿—³ —š¿—³Ÿ—™¿—³ —™¿—² —™¿—²Ÿ—™¿—±Ÿ—™¿•±Ÿ•˜¿–± –˜¿•¯ •˜¿•°Ÿ•—¿•±Ÿ•˜¿•± •˜¿–² –™¿—² —™¿—³ —™¿—²Ÿ—™¿—³Ÿ—™¿—³Ÿ—™¿˜´Ÿ˜š¿˜´ ˜™¿˜´ ˜š¿™¶ ™›¿™¶Ÿ™›¿™·Ÿ™›¿›¸ ›œ¿š¸Ÿš�¿›¹ ›œÀ›¹ ›œ¿›º ›�À›º ›œ¿œº œœ¿œºŸœœ¿œº œ�¿œº œ�Àœº œ�¿œ¹ŸœœÀ›¹ ›œ¿›¹ ›œ¿œ¹Ÿœ�À›¹ ›œÀ›¸Ÿ›œÀ›¸ ››¿š· š›À™¶Ÿ™›¿˜´Ÿ˜š¿˜³Ÿ˜š¿•±Ÿ•˜¿”¯ ”˜¿”°Ÿ”—¿•° •˜¿–± –˜¿–±Ÿ–˜¿–²Ÿ–™¿—³ —š¿—´Ÿ—š¿˜µŸ˜š¿˜µ ˜š¿˜µŸ˜›¿™´Ÿ™š¿˜´ ˜š¿—³ —™¾—³Ÿ—™¿—² —™¿–± –˜¿–±Ÿ–™¿–±Ÿ–˜¿–±Ÿ–˜¿–± –˜¿–± –˜¿–± –˜¾–± –™¿–²Ÿ–˜¿–²Ÿ–˜¿—± —™¿—²Ÿ—™¿—³Ÿ—™¿—³Ÿ—™¿—´Ÿ—™¿—´ —š¿˜´ ˜š¿˜´ ˜š¿˜µŸ˜š¿˜´ ˜š¿˜µ ˜š¿˜´Ÿ˜š¿˜´Ÿ˜š¿—³Ÿ—™¿—²Ÿ—™¿–³Ÿ–™¿–²Ÿ–˜¿–± –˜¿•° •™¿•° •˜¿•¯ •˜¿–°Ÿ–˜¿–±Ÿ–™¿—²Ÿ—™¿—³Ÿ—™¿˜´ ˜š¿™¶ ™›¿š· šœ¿š¸ŸšœÀ›¸ ›œ¿›¸ ›œ¿›¸ ›œ¿š¸ šœ¿š¸ŸšœÀš¸ š›Àš¸ šœÀ›¸ ›œ¿š¸ š›¿›¸ ›œÀ›¸ ›œÀ›¹ ›œÀ›¸ ›œÀ›¸ ›œ¿›¹ ›œÀ›¹ ›œÀ›¹ ›œÀ›¹ ›œÀ›¸ ›œ¿›¸ ›œÀ›¹Ÿ›œÀ›¹Ÿ›�¿›¹ ›œÀ›¹ ›œ¿›¸ ›œ¿›¸Ÿ›œÀ›¸ ›œÀ›¹ ›�¿›¸Ÿ›œ¿›· ›œ¿™· ™›¿™¶ ™›¿™¶ ™›¿™µŸ™š¿˜µŸ˜›¿—´ —š¿—²Ÿ—™¿–²Ÿ–™¿–± –™¿•± •˜¿•° •˜¿”° ”˜¿•°Ÿ•—¿•° •—¿”¯ ”—¿”¯Ÿ”—¿”¯Ÿ”—¿•¯ •—¿•¯ •—¿”¯ ”—¿•° •—¿–²Ÿ–˜¿˜³Ÿ˜™¿˜µŸ˜š¿™· ™œ¿š¸ šœ¿›¹ ›œÀ›¹Ÿ›œ¿›¹Ÿ›�Àœº œ�À�º ��¿�» �žÀ�º ��À�¼ �ž¿�» �žÀ�¼ �ž¿�»Ÿ�ž¿�» ��¿�» ��¿œº œžÀœº œ�À›¹ ›�¿›ºŸ›œÀ›¹ ›œÀ›¹ ›œÀ›¸ ››Àš·Ÿš›¿™´Ÿ™š¿—³ —™¿–± –˜¿–±Ÿ–—¿•¯ •—¿•¯ •—¿—³Ÿ—™¿›’Ÿ¸Èþ“ŽŸ¨¾ý”� ª¿ý”� «¿ý–�Ÿ­Âý—�Ÿ¯Âý—�Ÿ±Äý—� ±Ãý—�Ÿ°Ãý—�Ÿ°Ãý˜�Ÿ³Æýš�Ÿ´Çýš‘ŸµÇþ›‘Ÿ¶Èþœ‘ŸºÊþ�’ŸºÊþ�’Ÿ»Ëþ�’Ÿ»Íþ�’Ÿ»Ìþ�’Ÿ»Ëþ�’ »Ëþ›’Ÿ¹Êý›‘Ÿ¸Êýš’Ÿ·Èýš�ŸµÇý™‘ŸµÆý™‘Ÿ²Æý˜�Ÿ²Åý˜‘Ÿ±Äý˜�Ÿ²Äý˜�Ÿ°Ãý—�Ÿ°Ãý–�Ÿ¯Ãý˜� °Ãý—� ²Äý˜�Ÿ³Åýš‘ŸµÈý›‘Ÿ·Éý�’ŸºÊý�“ »ÌþŸ“ ¿Îþ¡“ ÁÐþ¡”ŸÃÒþ¢”ŸÅÔþ¢” ÅÓþ£•ŸÇÕþ¥–ŸË×þ¦– ÏÚþ¨— ÑÜþ¨—ŸÓÝþ¨—ŸÒÝþ¨— ÒÞþ©— ÒÝþª— ÔÞþ©—ŸÓÞþ©— Óßþ©— ÓÞþª—ŸÔßþ«— Õàþ«˜ ×áþ¬™ Ùâþ®™ Üåþ®™ŸÞçþ¯™Ÿàèþ°š âêþ²š äêþ³› åëþ²šŸæëþ²šŸåëþ²šŸäëþ²š äêþ²šŸäêþ±šŸäêþ±š ãêþ±šŸâéþ±š âêþ°šŸáéþ°šŸáéþ°š àèþ°šŸàèþ¯šŸßçþ°™Ÿàèþ°š áéþ±šŸäëþ²›Ÿæíþ´œŸèîþ´›Ÿçíþ²›Ÿäëþ°šŸáèþ¯šŸßçþ®™ Þæþ®™ Ýåÿ­˜ Úãþ¬˜ŸØãþ«˜ ×àþª—ŸÕßþª˜ Õáþ«˜ ×áþ¯™ Þæþ°šŸáèþ±š âêþ±šŸâêþ°šŸâéþ°š áéþ°™ àçþ¯™ Þçþ­™ Üåþ¬˜ Úãþ«˜Ÿ×áþª—ŸÕßþ©—ŸÔßþª—ŸÔßþª—ŸÕßþª˜ŸÖáþ«˜Ÿ×âþ«˜ŸØáþ¬˜ŸÙâþ­˜ Ûãþ®™ŸÜäþ®™ŸÝåþ¯™ Þæþ®™ Þæþ¯™ Þæþ¯š Þçþ¯šŸÞçþ¯™ Þæþ¯™ Þæþ¯š Þæþ¯š àçþ¯š ßèþ¯šŸßçþ¯š ßçþ¯™Ÿßçþ¯™Ÿßçþ¯™Ÿßçþ¯™ Þæþ¯™ŸÞæþ®™ Þæþ¯š Þæþ­™ŸÝäþ­˜ Ùâþ«— ×áþª—ŸÖàþ«— Öàþ«˜ ×áþ«˜ŸØãþ¬™ŸÚãþ­˜ Ýäþ®™ Ýæþ¯š Þæþ¯™Ÿßçþ¯šŸàçþ±šŸáèþ±šŸâêþ±š ãêþ²›Ÿåëþ³› æìþ´› èîþµ› êðÿ¶œ ìñÿ¶œŸìñÿ¶œŸíòÿ¸� ïóÿ·� ïóÿ·œ ïôÿ¸�Ÿðôÿ¸�Ÿðôÿ¸�Ÿðôÿ¸œ ñõÿ¸œ ïóÿ·� ïóÿ¸�Ÿïòÿ·� ïòÿ¶� íñÿ¶œ ìñÿµ› êðÿ´œ éîÿ²š çìþ±š âéþ¯šŸßçþ¬˜ŸÙâþ©—ŸÔßþª—ŸÔàþª˜ Öáþ¬˜ŸÙâþ¬˜ŸÚãþ®˜ŸÜäþ¯™ Þæþ°š àèþ±šŸâêþ±š ãêþ±š ãêþ±šŸãéþ¯šŸàèþ¯™ŸÞæþ®™ Þæþ¯™ŸÝåþ®˜ŸÜåþ­˜ŸÚãþ¬˜ Ùâþ¬˜ŸÙâþ«˜ŸÙâþ¬˜ŸÙâþ¬˜ŸÙãþ¬˜ŸÚåþ®™ Üäþ®˜ŸÛäþ®˜ŸÛäþ®™ŸÜæþ¯™ŸÝæþ¯™ Þçþ¯™Ÿàçþ°šŸàèþ±šŸâéþ±š âéþ°š âéþ±šŸãêþ±šŸâéþ±š âéþ°™ àèþ¯™ŸÞçþ¯™ Ýæþ®™ŸÝåþ­˜ŸÜäþ­˜ŸÛäþ¬˜ Ùâþ«˜Ÿ×áþ«— ×áþ¬˜ Øâþ­™ŸÚãþ­™ŸÜåþ¯™ŸÞæþ±š âéþ²›Ÿæìþ³› èîþµ› êïÿµœŸëðÿ¶œŸìðÿµœŸëðÿµœ ëðÿµœŸëðÿ¶œ ìðÿ¶œ ëðÿµœ ìðÿµœ ëñÿ¶œ ìðÿ¶› ìñÿ¶œŸìñÿ¶œ ìñÿ¶œŸìñÿ¶œ ìñÿ¶œ ìñÿ¶œ ìñÿ¶œ ìñÿ¶œ îñÿ¶� íòÿ·œ íóÿ¶œ íòÿ¶œ íòÿ¶œ îñÿ¶œ íòÿµœ ìñÿ¶œ ìñÿ¶œ ìñÿµœŸìðþµ› êïþ´› èîþ´› çíþ³šŸçìþ±› äëþ±šŸâêþ¯šŸáçþ®™ŸÝåþ­˜ŸÚäþ¬™ŸÙãþ«˜ ×áþ«—ŸÖàþ©˜ Ôàþ©˜ Ôßþª—ŸÔßþ©—ŸÔÞþ©—ŸÓÞþ©—ŸÓßþª— ÔÞþ©—ŸÔßþ©—ŸÔßþ«˜Ÿ×âþ­˜ŸÛäþ°™ ßæþ²šŸåëþ´›Ÿéîþ¶› ëðÿ¶œ ìñÿ·� îòÿ·œ ðóÿ¸� ðôÿ¹�Ÿòõÿ¹ž òöÿ¹� óöÿºž ô÷ÿºž ô÷ÿº� ô÷ÿºž ô÷ÿº�Ÿô÷ÿ¹� óöÿ¹� òõÿ¸� ñôÿ¸œŸðóÿ·œ ïóÿ·œ îòÿ·œ íñÿ¶œ ëðÿ´› èîþ±š ãêþ°šŸßèþ­˜ Úãþ«˜ŸØáþª— Ôàþª—ŸÕßþ¯™ŸÞæþ…™Ÿ…‹¾€‘Ÿ€ˆ¾�’Ÿ�ˆ¾‚”Ÿ‚‰¾ƒ•Ÿƒ‰¾ƒ– ƒŠ¾„˜Ÿ„‹¾„˜ „‹¾…˜Ÿ…Œ¾…™ …‹¿…˜Ÿ…Œ¾…™Ÿ…Œ¿†™Ÿ†Œ¿†šŸ†Œ¾‡šŸ‡Œ¿‡›Ÿ‡Œ¿‡›Ÿ‡�¾‡œŸ‡�¿ˆœŸˆŽ¾ˆœŸˆ�¿‡œŸ‡�¿ˆœ ˆŽ¿ˆ�ŸˆŽ¿ˆœŸˆ�¿ˆ�ŸˆŽ¿ˆ� ˆŽ¾‡œŸ‡�¿ˆ�Ÿˆ�¿ˆœŸˆ�¾ˆ�Ÿˆ�¿ˆœŸˆ�¾ˆœŸˆŽ¾‡�Ÿ‡�¿ˆœ ˆŽ¾‡œŸ‡Ž¿‡œŸ‡�¿‡›Ÿ‡�¾‡œ ‡Ž¿ˆ� ˆŽ¿‰ž ‰�¿‹ Ÿ‹�¿Œ£ŸŒ�¾�¤Ÿ�‘¾Ž¥ Ž’¿�§Ÿ�“¾�¨ �“¿�¨Ÿ�”¿�¨ �”¿�ªŸ�”¿’«Ÿ’•¿’¬Ÿ’–¿’¬Ÿ’•¿“®Ÿ“—¿”¯Ÿ”—¿”¯Ÿ”—¿“®Ÿ“—¿”® ”—¿“® “—¿”® ”—¿”¯Ÿ”—¿”¯ ”˜¾•¯Ÿ•˜¿•° •˜¿•²Ÿ•˜¿—² —™¿—³ —™¿˜´Ÿ˜™¿˜µŸ˜š¿˜µŸ˜›¿™µŸ™š¿˜µ ˜š¿˜µ ˜š¿˜´Ÿ˜š¿˜´Ÿ˜š¿˜µ ˜š¿˜µŸ˜š¿˜µ ˜š¿˜µ ˜›¿˜µŸ˜š¿˜´ ˜š¿™µ ™š¾—´Ÿ—š¿˜´Ÿ˜š¿™µŸ™š¿™µŸ™š¿š¶Ÿš›¿™¶ ™›¿™· ™›¿˜µŸ˜š¿—³ —š¿—³ —™¿—²Ÿ—™¾–² –™¿•± •˜¿•°Ÿ•—¿•¯ •—¿•¯ •—¿•° •˜¿—³ —™¿˜´Ÿ˜š¿˜´Ÿ˜š¿˜µŸ˜›¿™¶Ÿ™›¿™¶Ÿ™›¿˜µŸ˜š¿˜´Ÿ˜š¿˜³Ÿ˜š¿—³ —™¿—² —™¿—± —˜¿–±Ÿ–˜¿–± –˜¿•± •™¿–²Ÿ–˜¿–± –™¿–²Ÿ–˜¿—±Ÿ—™¿–² –™¿–² –™¿—²Ÿ—™¿–²Ÿ–˜¿–±Ÿ–˜¿–² –™¿—²Ÿ—˜¿–±Ÿ–™¿—²Ÿ—™¿–²Ÿ–™¿—²Ÿ—™¿—³Ÿ—š¿—³ —™¿–³ –™¿—²Ÿ—™¿—²Ÿ—™¿—³ —™¿—²Ÿ—™¿—³ —š¿—² —˜¿—²Ÿ—˜¿—² —™¿–± –˜¿–± –™¿•± •˜¿–²Ÿ–™¿˜´ ˜š¿™µŸ™›¿›· ›œ¿›¹Ÿ›œ¿œ¹ œ�¿œº œ�¿�» ��¿�¼ �žÀ�» �ž¿�¼Ÿ�ž¿ž¼ žžÀž½ žžÀž¼ žž¿ž½ žžÀž½ žž¿ž¾ žŸÀž½ žž¿ž¾ žž¿ž¾ žŸ¿Ÿ¾ŸŸŸÀž½ŸžŸÀŸ¾ ŸŸÀŸ¿ŸŸŸ¿Ÿ¾ ŸŸÀŸ¾ ŸŸ¿Ÿ¾ ŸŸ¿ž¾ŸžŸÀŸ¾ ŸŸÀž½ žŸ¿ž¼ ž�À�» �žÀ›º ›œÀ›¹ ›œ¿š¹ šœ¿˜¶ ˜›¿—² —™¿•°Ÿ•˜¿•¯ •—¿•¯Ÿ•—¿–±Ÿ–˜¿–² –™¿—³Ÿ—™¿—´ —š¿˜µ ˜š¿š¶Ÿš›¿š¶ šš¿˜´Ÿ˜š¿—² —˜¿•° •˜¿”¯ ”—¿”¯ ”—¿”®Ÿ”—¿”¯ ”—¿”®Ÿ”—¿”® ”—¿’­ ’•¿’¬ ’–¿’« ’•¿’«Ÿ’•¾’¬ ’–¿“®Ÿ“–¿“®Ÿ“—¿”¯Ÿ”—¿”¯Ÿ”—¿”®Ÿ”—¿“®Ÿ“—¿”® ”—¿”¯Ÿ”—¿”¯ ”—¿•¯Ÿ•˜¿”¯ ”—¿•°Ÿ•˜¿–° –˜¿–²Ÿ–™¿—³Ÿ—™¿™´ ™š¿š¶Ÿš›¿š¶ š›À˜µŸ˜›¿˜´Ÿ˜š¿—³ —™¿–³Ÿ–™¿—³ —™¿—²Ÿ—™¿–±Ÿ–˜¿–±Ÿ–˜¿•°Ÿ•˜¿•°Ÿ•—¿”° ”—¿•¯ •—¿•¯Ÿ•—¿•¯Ÿ•—¿•°Ÿ•˜¿•± •˜¿•°Ÿ•˜¿–±Ÿ–˜¿•° •˜¿•°Ÿ•—¿•° •—¿–° –˜¿•° •˜¿•° •˜¿•± •—¿•±Ÿ•˜¿•°Ÿ•˜¿•±Ÿ•˜¿–²Ÿ–˜¿–²Ÿ–˜¿–²Ÿ–™¿–³ –™¿–²Ÿ–™¿—³ —š¿˜´ ˜š¿˜´Ÿ˜š¿˜µŸ˜š¿™¶Ÿ™šÀ™¶ ™›¿š¶Ÿš›Àš·Ÿšœ¿š¸ šœÀš·Ÿš›¿›¹ ›œ¿›¹Ÿ›œ¿›¹Ÿ›œÀ›¹ ›�À›¹ ›�À›¸ ›œ¿š· š›¿™· ™›Àš·Ÿš›¿™¶Ÿ™š¿˜µŸ˜š¿—³Ÿ—™¿–± –˜¿•°Ÿ•˜¿•° •—¿•°Ÿ•—¿•° •—¿•°Ÿ•˜¿•° •˜¿–±Ÿ–˜¿–°Ÿ–˜¿”° ”˜¿•°Ÿ•—¿•¯ •˜¿•¯Ÿ•—¿–² –™¿˜³Ÿ˜š¿™¶ ™š¿™¶ ™›¿š¸ š›À›¸ ›œ¿›¹ ›œÀ›ºŸ›�Àœº œ�¿�º ��Àœ» œ�À�» �ž¿�» ��¿œº œ�¿›¹ ›�¿›¸ ›œÀš· š›Àš¶ š›¿˜µŸ˜š¿˜³ ˜™¿–³Ÿ–™¿–± –˜¿–° –˜¿–±Ÿ–˜¿–°Ÿ–˜¿•± •™¿•° •˜¿–± –˜¿–±Ÿ–™¿—³ —™¿™¶ ™›¿Ž‹ œ´ý‚ˆŸ†¤ü„ˆŸŠ¥ü†ˆŸ�¨üˆŠŸ’¬üŠŠŸ–®ýŠ‹ —±ý‹‹Ÿ—°ýŒŒŸ™²ý‹‹Ÿš²ýŒŒŸ›²ýŒ‹Ÿ›³ýŽŒ �µýŽŒŸžµý�ŒŸŸµý��Ÿ ·ý��Ÿ¢¸ý��Ÿ¢¹ý‘�Ÿ¤¹ý�ŽŸ£ºý��Ÿ£ºý�Ž £¹ý‘ŽŸ¤»ý‘ŽŸ¤ºý‘�Ÿ¥ºý’Ž ¤ºý‘�Ÿ£ºý‘� ¤ºý’ŽŸ¤ºý‘ŽŸ¥ºý’�Ÿ¥»ý‘�Ÿ¤ºý‘ŽŸ¤ºý‘Ž £ºý��Ÿ¤¹ý�� £¸ý��Ÿ¢¸ý�Ž ¤¹ý’ŽŸ¦»ý”�Ÿª¿ý—�Ÿ°Ãýš‘ ´Æý›‘Ÿ¸Éý�’Ÿ»Ëýž“Ÿ¾Îý “ŸÂÐþ¡“ ÃÑþ¡” ÄÒþ¢” ÅÔþ£”ŸÈÕþ¥• ËØþ¦–ŸÍÙþ¨—ŸÑÜþ©—ŸÔÞþ©— ÔÞþ©— ÒÝþ©— ÒÝþ¨–ŸÑÞþ¨— ÓÝþ©—ŸÔÞþª˜ Ôßþª— Õßþ«˜ ×áþ¬˜ŸÙãþ­™ŸÝæþ¯™Ÿßçþ°šŸáèþ±›Ÿãêþ±šŸäêþ±š ãêþ²šŸãêþ²šŸãêþ±šŸâéþ±š âéþ±šŸãéþ²™Ÿãéþ°›Ÿâêþ±šŸãêþ±šŸâéþ±šŸâéþ±™ âéþ°šŸâèþ°™Ÿáèþ±šŸãêþ²šŸåìþ³›Ÿæìþ³› çíÿ³› æíþ±šŸâêþ°š àèþ®™ŸÞæþ®™ Þåþ­˜ŸÛäþ¬˜ŸÙâþ«˜Ÿ×àþª— Õßþª—ŸÔÞþ«˜Ÿ×áþ¯™ŸÞæþ°šŸáéþ²šŸäêþ±š ãêþ²›Ÿåëþ²› åëþ±šŸãêþ±š âéþ°šŸàéþ¯™ Þæþ®™ Ýåþ­™ Ûäþ¬˜ Ùâþ¬˜ Ùâþ­˜ŸÙâÿ­˜ŸÚãþ¬™ Úãþ­™ Ûäþ®˜ŸÛäþ®˜ Üäþ­™ŸÜåþ®™ Üäþ­™ Üäþ­˜ŸÚãþ¬˜ŸÚäþ­™ Ûäþ®™ Ûäþ­™ŸÝåþ®™ŸÝåþ®™ Ýåþ®™ŸÝæþ¯™ŸÞæþ®™ Ýæþ¯šŸÝçþ¯™ŸÞæþ¯™ Þæþ®™ Ýæþ¯™ŸÝæþ®™ŸÝåþ®˜ Üäþ­˜ŸÛäþ¬˜ Ùâþ¬˜ŸÙâþ¬˜ŸÙâþ®˜ Üäþ¯šŸàèþ²›Ÿåëþµ›Ÿêïþ·œŸíòÿ·œ ïóÿ¸� ñôÿ¹�Ÿóöÿºž õ÷ÿºž õ÷ÿ»ž öøÿ»ž ÷ùÿ»ž ÷ùÿ»ž ÷ùÿ¼Ÿ øúÿ¼Ÿ ùúÿ½žŸùûÿ½ž úûÿ½ž úûÿ½žŸúüÿ½ŸŸûüÿ½Ÿ ûüÿ¾Ÿ ûüÿ½Ÿ ûýÿ½Ÿ úüÿ½ŸŸûüÿ¾ŸŸûüÿ½ŸŸûüÿ½žŸúûÿ¼ž øúÿ»ž öøÿ¹� ôöÿ¸� ðôÿ·� ïóÿµœ ìñÿ²›Ÿåìþ®™ Ýåþ«˜Ÿ×áþª—ŸÔÞþª— Õàþ­˜ Úãþ¯™ŸÝåþ¯š Þæþ¯š ßèþ±› ãêþ³›Ÿèíþ²šŸæìþ°š áèþ®™ Ûåþª˜Ÿ×áþª—ŸÕßþª— Óßþ¨—ŸÒÝþ¨—ŸÒÞþ©—ŸÒÝþ¨—ŸÐÜþ¦–ŸÍÙþ¥•ŸËØþ¥• Ê×þ¤• Ë×þ¥•ŸÌÙþ§– ÏÛþ¨– ÐÜþ©— ÒÞþ©—ŸÓÞþ¨– ÓÞþ©—ŸÒÝþ¨— ÒÝþ©˜ŸÓÞþ©— ÓÞþ©˜ Ôßþ©—ŸÔßþª˜ŸÖàþ«˜ŸÙáþ­™ŸÛäþ®™ Ýæþ±šŸâéþ³›Ÿçíþ´œŸèïÿ²šŸäëþ°™ àèþ¯™ ßçþ®™ Ýçþ¯šŸÞæþ®™ Ýæþ®˜ŸÛãþ¬˜ŸÙâþ¬—Ÿ×áþª—ŸÕßþª˜ŸÕßþª— Ôßþ«˜ Õßþ«˜ Öàþ«˜ ×áþ«˜Ÿ×áþ«˜Ÿ×áþ¬˜ Øáþ«˜Ÿ×áþ«˜Ÿ×áþª˜ŸÖàþ«˜ Øáþ«˜Ÿ×áþ¬˜ Øáþ¬˜ Øáþ«— Øâþ¬˜ŸØáþ¬˜ Úâþ­™ŸÚãþ­˜ Ûäþ­™ŸÝåþ­™ŸÜåþ®™ŸÝåþ°™ ßçþ°š áèþ±šŸâéþ²›Ÿäëþ³šŸæìÿ´› èíÿ´› èíÿ´›Ÿéîÿ´›Ÿéïÿ´›Ÿêïÿ¶œ ìñÿ·œ íñÿ·œ íòÿ¶œ îóÿ¶œ íóÿ¶œŸìñÿµ› êðÿ´›Ÿèîÿ´›Ÿéîþ³›Ÿæíþ²šŸãêþ®šŸÞçþ­˜ Úãþ«— ×àþª—ŸÖàþ«—ŸÕßþª˜ Öàþ«˜ŸÖàþ«˜ŸØáþ¬˜ Ùâþ¬˜ Ùáþ«˜ Öàþ«—ŸÖàþª˜ Õßþª˜Ÿ×àþ­˜ Ûäþ°™ àèþ²šŸäëþ´› çíÿµ›Ÿêïÿ¶� ìñÿ·� îòÿ¸�Ÿðõÿ¹�Ÿòõÿ¹žŸóöÿº� õ÷ÿºž ô÷ÿ¹�Ÿóöÿ¸� ñõÿ·œŸïóÿ¶œ íñÿµ› êïÿ´›Ÿçíÿ²›Ÿäëþ¯š àçþ®™ŸÝåþ¬˜ Úãþ¬˜ Ùãþ«˜ŸÙâþ¬— Øáþ¬˜ŸØâþ¬˜ Ùãþ¬˜ Úãþ­™ Ûäþ¯™ Þæþ²›Ÿåìþ…™Ÿ…Œ¾‘Ÿ‡¾€‘Ÿ€‡¾€‘Ÿ€ˆ¾�’Ÿ�ˆ¾�“Ÿ�ˆ¾‚“Ÿ‚‰¾‚”Ÿ‚‰¾‚•ž‚оƒ–ŸƒŠ¾ƒ–ŸƒŠ¾„–Ÿ„‹¿„—Ÿ„Š¿„—Ÿ„‹¾ƒ—Ÿƒ‹¿„— „о„—Ÿ„‹¿„˜Ÿ„‹¾…˜Ÿ…‹¾„˜Ÿ„‹¾„—Ÿ„‹¾…˜Ÿ…‹¾…™Ÿ…Œ¾…™Ÿ…‹¿…™Ÿ…Œ¾†šŸ†�¾‡šŸ‡Œ¾ˆœŸˆ�¾ˆ�ŸˆŽ¾ˆœŸˆŽ¾ˆ�ŸˆŽ¿‡�Ÿ‡�¿ˆ�ŸˆŽ¾ˆœŸˆŽ¾‡œŸ‡�¾‡œŸ‡�¿‡›Ÿ‡�¾‡œŸ‡�¾ˆ�ŸˆŽ¾‰�Ÿ‰Ž¾‰ŸŸ‰�¿Š ŸŠ�¾‹¡Ÿ‹�¿Œ¢ŸŒ�¾Œ£ŸŒ‘¿�¥Ÿ�’¿Ž¥ Ž’¿�¨ �“¿�¨ �“¿�¨ �”¿�©Ÿ�”¿�©Ÿ�•¿‘©Ÿ‘•¿’ª ’•¿“¬Ÿ“•¿’­ ’–¿“­Ÿ“—¿“­ “–¿”® ”—¿”®Ÿ”—¿”¯ ”—¿”¯ ”—¿”¯ ”—¿”® ”—¿”¯Ÿ”—¿”¯Ÿ”—¿”®Ÿ”—¿•¯Ÿ•—¿•¯ •—¿•° •—¿•°Ÿ•—¿•° •˜¿•±Ÿ•™¿–± –˜¿—±Ÿ—™¿—³Ÿ—™¿˜´Ÿ˜š¿™¶Ÿ™›¿š¶ š›¿™¶Ÿ™š¿™¶Ÿ™š¿˜µ ˜š¿˜µŸ˜š¿—´ —š¿—´ —š¿—³ —™¾—²Ÿ—˜¿–² –™¿–± –˜¿•±Ÿ•˜¿•±Ÿ•˜¿•°Ÿ•˜¿–±Ÿ–˜¿—² —™¿—´ —™¿˜µ ˜›¿š¶ š›¿›¸ ››¿›¹ ›œ¿œº œ�Àœ» œžÀ�ºŸ��Àœ» œž¿�¼Ÿ�ž¿�¼ �žÀž¼ žžÀ�¼ �ž¿�¼ �ž¿ž¼ŸžžÀ�» ��Àœ» œžÀ�¼ �žÀ�»Ÿ�ž¿œ»Ÿœ�Àœ» œž¿œ» œ�¿œ» œ�Àœº œ�À›¹ ›�¿›¹ ›�¿š¸ šœ¿›· ››¿š·ŸšœÀ™· ™œÀš· š›Àš· š›Àš· š›Àš· š›¿š· š›¿›¸ ›œ¿š· šœ¿›¸ ››À›¹Ÿ›œÀ›¹Ÿ›œ¿›¹ ›œ¿œº œ�¿�º �œÀœ» œ�À�ºŸ��Àœ» œž¿œ»Ÿœ�¿�¼ �ž¿�»Ÿ��¿�» �ž¿�» ��À�¼ �žÀ�¼ �žÀ�¼Ÿ�žÀž¼ žŸÀž½ žžÀ�¼Ÿ�žÀž½ žž¿ž¼ŸžžÀž¾ žž¿ž¾Ÿžž¿Ÿ¾ ŸŸÀŸ¾ ŸŸÀŸ¾ ŸŸÀŸ¾ŸŸž¿Ÿ¾ ŸŸ¿Ÿ½ ŸŸ¿ž¾ žŸÀŸ¾ ŸŸÀŸ¾ ŸŸ¿ž¾ žŸÀž¾ žŸÀŸ¾ ŸŸÀž¾ žŸÀž¾ŸžŸÀŸ¾ ŸŸÀž½ žŸ¿ž½ žžÀ�» �žÀ�» ��À›ºŸ›�À›ºŸ›�À›¹ ›�¿š¸ š›¿™¶ ™š¿—³Ÿ—š¿–± –˜¿•°Ÿ•˜¿•¯ •—¿•° •™¿–² –™¿—³ —™¿—´Ÿ—™¿˜´Ÿ˜™¾˜µŸ˜š¿˜µ ˜š¿˜µ ˜š¿˜´ ˜š¿˜´Ÿ˜š¿—³Ÿ—™¿–³Ÿ–™¿–±Ÿ–˜¾•°Ÿ•˜¿•¯ •˜¿”¯Ÿ”—¿”°Ÿ”—¿•¯ •—¿”¯ ”—¿•®Ÿ•—¿”¯Ÿ”—¿”¯Ÿ”—¿•¯ •—¿”¯ ”—¿•¯ •˜¿•° •˜¿•° •˜¿•°Ÿ•˜¿•± •˜¿–² –™¿–² –˜¿—³Ÿ—™¿˜³Ÿ˜™¿˜µŸ˜š¿™¶ ™›¿™¶Ÿ™›¿š¶ š›¿˜µŸ˜›¿—´Ÿ—™¿—³Ÿ—™¿—² —š¿—³Ÿ—™¿—³ —™¿–± –˜¿–°Ÿ–—¿•° •˜¿•° •˜¿•°Ÿ•—¿”® ”—¿”¯ ”—¿”®Ÿ”˜¿”¯Ÿ”˜¿•®Ÿ•—¿•¯Ÿ•—¿”° ”˜¿•° •˜¿•¯Ÿ•˜¿•° •˜¿–° –˜¿–± –˜¿•± •˜¿—±Ÿ—˜¿–²Ÿ–™¿—²Ÿ—™¿—² —™¿—³ —™¿—³Ÿ—™¿—³ —™¾—³ —™¿—³Ÿ—™¿—³Ÿ—™¿—²Ÿ—™¿—²Ÿ—™¿—²Ÿ—™¿—²Ÿ—™¿–² –™¿—² —™¿—² —™¿—±Ÿ—˜¿—² —™¿—² —˜¿–² –˜¿–² –™¿–² –™¿–²Ÿ–™¿—²Ÿ—™¿—² —™¿–² –˜¿–² –™¿–²Ÿ–™¿—±Ÿ—˜¿—±Ÿ—˜¿–³Ÿ–™¿—² —™¿—³Ÿ—™¿—² —˜¿—²Ÿ—™¿—² —™¿—³ —™¿—³Ÿ—™¾–³Ÿ–™¿–³Ÿ–™¿—²Ÿ—˜¿–² –™¿–± –˜¿–²Ÿ–™¿–²Ÿ–™¿•°Ÿ•™¿–°Ÿ–˜¿–° –˜¿–° –˜¿–±Ÿ–™¿–±Ÿ–˜¿–±Ÿ–™¿–±Ÿ–˜¿–²Ÿ–™¿—± —™¿–²Ÿ–™¿–²Ÿ–™¿–² –™¿–²Ÿ–™¿–²Ÿ–™¿–² –™¿—³Ÿ—™¿—³Ÿ—š¿—³Ÿ—™¿˜´ ˜™¿˜´Ÿ˜š¿˜µ ˜›¿˜µŸ˜š¿—´Ÿ—š¿˜´Ÿ˜š¿˜´ ˜™¿—´Ÿ—š¿—´ —™¿—´Ÿ—™¿—´Ÿ—š¿�Œ œ³ý‚ˆŸ†£ü‚ˆŸ†£üƒ‡Ÿˆ¥ü„ˆŸ‰¥ü„ˆŸŠ§ü†‰Ÿ�©ü†‰Ÿ�©üˆŠŸ‘«ü‰ŠŸ“®ü‰ŠŸ•®ý‰‹ •®ýŠ‹Ÿ•®ý‰Š –°ý‰‹Ÿ–¯ýŠ‹Ÿ–¯ý‹‹Ÿ–±ý‹‹Ÿ—°ý‹ŒŸ˜²ý‹‹Ÿ—±ý‹‹ —°ýŒŒŸ™²ý�ŒŸ›´ýŒŒŸš³ý�ŒŸœµýŽ�Ÿž¶ý�ŒŸŸ¶ý‘ŽŸ£¹ý’�Ÿ¥ºý‘�Ÿ¤ºý’ŽŸ¥¼ý‘ŽŸ¤ºý‘�Ÿ¥»ý‘�Ÿ£ºý�ŽŸ£¹ý‘�Ÿ£¹ý‘�Ÿ¢¸ý‘�Ÿ£¹ý’ŽŸ¥»ý“Ž ¦¼þ”ŽŸ©¾ý•�Ÿ¬Àý˜�Ÿ±Ãý˜‘Ÿ²Åýš‘ŸµÇýœ’Ÿ¸Êýž“Ÿ¼ÌýŸ“ ÀÏþ “ ÂÒþ¡”ŸÃÑþ¢“ ÄÒþ¡”ŸÄÓþ£• ÇÕþ¤• ÈÖþ¥•ŸÌÚþ§–ŸÎÚþ§– ÏÛþ¨— ÑÜþ¨—ŸÑÝþ©—ŸÒÝþ¨— ÒÝþ©—ŸÓÞþª—ŸÔßþ©—ŸÒÝþ©— ÓÞþ©— ÓÞþª˜ Óßþ©˜ Ôßþª—ŸÕßþ«˜ Õáþ«˜ŸÖàþª—ŸÖáþ¬˜ŸØâþ¬™ Úãþ­˜ŸÛäþ¯™ŸÞæþ±š âéþ³› æìþ´› èíþ³›Ÿæìþ²› æëþ±š ãêþ°š áêþ°™ áèþ®™ Þçþ®™ Ýçþ®™ŸÜäþ­˜ŸÛäþ­™ŸÚãþ«˜ Øáþ«— ×âþ¬˜ Øáþ­˜ Úãþ­™ Üåþ¯™Ÿßçþ²šŸãêþ³›Ÿçîÿµœ êïÿ·œ íòÿ¸� ðôÿ¹� òöÿ¹žŸóöÿºž ô÷ÿº� ô÷ÿ»ž õøÿ»ž öøÿ»žŸöøÿºž õøÿ»ž õøÿº�Ÿô÷ÿ¹ž ó÷ÿºžŸô÷ÿºž ô÷ÿ¹ž óöÿ¸žŸòöÿ¸� òöÿ¹�Ÿòõÿ·� ðôÿ¸� ïóÿ·� ïòÿ¶œ ìñÿµ›Ÿëðÿµ›Ÿêïÿ´› éïÿ³› çíÿ´› èíÿ´› êîÿ´œŸéïÿ´œ éïÿ´œ êïÿµœ ëïÿ¶›Ÿìðÿ¶� íòÿ·œ îòÿ·� ïóÿ·� ñôÿ¸œ ñôÿ¹�Ÿóõÿ¹� òõÿ¹žŸóöÿ¹� óöÿº�Ÿô÷ÿºž ô÷ÿº� õ÷ÿ»ž õ÷ÿºž õøÿ»žŸöøÿ»ž öùÿ¼ž ÷ùÿ»žŸ÷ùÿ¼ž ÷ùÿ¼Ÿ ÷úÿ½žŸùúÿ½Ÿ úûÿ½Ÿ ûüÿ½Ÿ ûüÿ½ŸŸûüÿ¾ž ûüÿ¾ŸŸûüÿ½Ÿ ûüÿ½Ÿ ûüÿ½Ÿ ûüÿ½Ÿ ûüÿ¾Ÿ ûüÿ¾Ÿ ûüÿ¾Ÿ ûüÿ¾ŸŸûüÿ½Ÿ ûüÿ½Ÿ úüÿ½Ÿ úûÿ¼ž øúÿ»ž ÷ùÿ»ž õøÿº� óöÿ¸� ðôÿ¸œ ïóÿ·œ îòÿµ›Ÿéïþ²šŸäëþ¯™ ßçþ­™ŸÛãþ¬— ×áþ«˜ Øàþ¬˜ Ùâþ¬˜ŸÚäþ­™ Üåþ¯™ Þçþ°™Ÿàèþ°š ãêþ±šŸãêþ±šŸãêÿ°šŸâêþ°š áèþ°šŸßèþ®™ Ýåþ¬™ŸÚãþ«˜Ÿ×áþª˜ Õàþ©— Ôßþª—ŸÔàþª— ÔÞþ©—ŸÓßþ©—ŸÓÞþª—ŸÔÞþ©˜ Ôßþ©˜ŸÔßþª—ŸÖàþª—ŸÖàþ«˜ ×áþ«˜ŸØâþ«— Øâþ«˜ Øâþ­˜ Úãþ®™ Üäþ¯™ Þæþ°šŸàèþ±š ãêþ²›Ÿåìþ´›Ÿèíþ´› çíþ±š ãêþ¯™Ÿßèþ®™ Þçþ®™ Þæþ¯™ Þæþ®™ŸÝåþ­˜ŸÚãþ«˜ Øáþª˜ Öáþ«˜ Öàþ«—ŸÕßþ©—ŸÕßþª—ŸÕßþª—ŸÔÞþ©—ŸÔÞþ©— ÕÞþª—ŸÔßþª— Õßþ«— Öàþª— Õßþ«—ŸÖàþ«˜ŸØáþ¬˜ Ùãþ¬˜ Ùãþ­™ŸÛäþ¯˜ŸÝæþ®™ŸÝåþ®™ŸÞåþ®™ŸÞçþ¯™ ßæþ®™Ÿßæþ®™ Þæþ¯šŸÞæþ¯™ Ýæþ¯˜ Ýåþ­™ŸÜåþ®˜ŸÝåþ®™ŸÝåþ®™ŸÜåþ®™ŸÜäþ®™ Ûäþ­˜ Ûäþ­˜ŸÛåþ®˜ Ûäþ­™ŸÛäþ®™ Üæþ®™ŸÝåþ®™ Üäþ®˜ Üäþ®™ Üäþ®™ŸÜäþ®˜ŸÜäþ®˜ Ýäþ®˜ŸÜäþ®™ Üäþ®™ŸÝåþ®™ Ýåþ¯™ŸÞçþ¯™ŸÝåþ®™ Ýåþ®™ŸÝæþ®™ŸÝæþ®™ Ýæþ®™ Ýæþ®š Ýæþ®™ Ýåþ­˜ŸÜåþ­˜ŸÛäþ®˜ŸÛäþ­˜ Úäþ¬˜ŸÙâþ­˜ Ùâþ¬˜ Ùãþ¬˜ Úâþ¬˜ŸÚâþ¬˜ Ùãþ­™ Úäþ­™ŸÚäþ®™ŸÛäþ®™ Ûäþ­™ Ûäþ­˜ŸÜäþ­˜ŸÛäþ­˜ Ûäþ­˜ Úäþ®™ Üåþ®™ Þçþ¯™ŸÞæþ¯šŸßèþ°™ áèþ°š âêþ±šŸãëþ±š âéþ°š áéþ°šŸáéþ°šŸàèþ¯šŸßèþ°™Ÿàçþ®š Þçþ±š áéþ†šŸ†Œ¿€’Ÿ€ˆ¾�’Ÿ�ˆ¾€‘Ÿ€ˆ¾�’Ÿ�ˆ¾€’Ÿ€ˆ¾€’Ÿ€ˆ¾�’Ÿ�ˆ¾�’ž�ˆ¾�“Ÿ�ˆ¾�’Ÿ�‰¾�“Ÿ�ˆ¾�“Ÿ�‰½�“Ÿ�ˆ¾�”Ÿ�‰¾‚”Ÿ‚‰¾„•Ÿ„о„—Ÿ„‹¾…˜Ÿ…‹¾„– „‹¾„– „Š¿„—Ÿ„‹¾…˜Ÿ…Œ¿…˜Ÿ…‹¾…˜ …‹¿…˜ …Œ¿…˜Ÿ…Œ¾‡šŸ‡Œ¾ˆœ ˆ�¿‡œ ‡�¿‡œŸ‡Ž¿ˆ�Ÿˆ�¾ˆ� ˆ�¿ˆœŸˆŽ¾‡œŸ‡Ž¾‡œŸ‡�¾ˆœŸˆ�¿‡œŸ‡�¿ˆœŸˆ�¾‡œŸ‡�¾‡›Ÿ‡�¾‡œŸ‡�¿‡› ‡�¾‡�Ÿ‡Ž¾ˆ� ˆŽ¾ŠžŸŠ�¾‹¡Ÿ‹�¾Œ¢ŸŒ‘¿�¤Ÿ�‘¿Ž¤ŸŽ‘¾Ž¦ŸŽ’¿�¦Ÿ�“¿�§Ÿ�“¿�¨Ÿ�“¿�¨ �”¿�¨Ÿ�”¿�©Ÿ�”¿�©Ÿ�”¿‘ª ‘”¿‘«Ÿ‘•¿‘ª ‘•¿’« ’–¿’« ’–¿’¬Ÿ’•¿“­ “–¿“­ “–¿•¯Ÿ•—¿”¯Ÿ”—¿”® ”—¿”® ”–¿”¯Ÿ”—¿”¯ ”—¿•¯ •—¿–±Ÿ–˜¿—³Ÿ—™¿˜µ ˜š¿™¶ ™›¿š·Ÿš›¿™· ™›¿˜´Ÿ˜š¿˜´ ˜š¿—³Ÿ—™¿–³ –š¿—² —š¿–± –˜¿•° •˜¿•¯Ÿ•—¿•®Ÿ•—¿”¯Ÿ”—¿–²Ÿ–˜¿˜´ ˜š¿š¶ šœ¾›¸ ›œ¿›¹Ÿ›œÀœº œ�À�»Ÿ��¿�¼Ÿ�žÀž½ŸžžÀž¾ŸžŸ¿Ÿ½ŸŸŸÀŸ¾ŸŸŸÀŸ¾ ŸŸ¿Ÿ¿ ŸŸ¿Ÿ¿ Ÿ Àž¾ žž¿Ÿ¾ ŸŸ¿Ÿ¾ŸŸ ¿Ÿ¿ ŸŸÀŸ¿ Ÿ ÀŸ¿ŸŸŸ¿Ÿ¾ Ÿ ¿Ÿ¾ŸŸŸÀŸ¾ ŸŸ¿Ÿ¾ ŸŸÀž¾ žŸÀž¾ žŸ¿Ÿ¾ŸŸŸÀŸ¿ŸŸ ÀŸ¾ ŸŸ¿Ÿ¾ ŸŸ¿Ÿ¾ŸŸžÀŸ¾ŸŸŸÀŸ¾ŸŸŸ¿ž¾ žž¿ž¾ žŸ¿Ÿ¾ ŸžÀž¾ žŸÀž¾ŸžŸ¿Ÿ¾ŸŸŸ¿Ÿ¾ ŸŸ¿ž¾ žŸ¿ž¾ žŸÀž¾ŸžŸ¿Ÿ¾ ŸŸÀž¾ žŸ¿Ÿ¿ ŸŸ¿Ÿ¿ŸŸŸÀŸ¾ ŸŸÀŸ¾ Ÿ ¿Ÿ¾ ŸŸÀŸ¾ ŸŸ¿Ÿ¾ŸŸŸÀŸ¾ŸŸŸ¿Ÿ¾ ŸŸÀŸ¾ŸŸŸÀŸ¾ŸŸŸ¿ž¾ŸžŸ¿ž¾ žŸÀŸ½ ŸŸ¿ž¾ žŸ¿ž¾ žŸÀŸ¾ŸŸŸÀž¾ žŸ¿Ÿ¾ŸŸŸ¿Ÿ¾ ŸŸ¿Ÿ¾ ŸŸÀŸ½ŸŸŸ¿Ÿ¾ŸŸŸÀŸ¾ŸŸŸ¿ž¾ žŸÀŸ¾ ŸŸÀž¾ŸžŸÀŸ¾ŸŸŸÀŸ¾ ŸŸ¿Ÿ¾ ŸŸ¿Ÿ¿ŸŸŸ¿Ÿ¾ŸŸ ÀŸ¾ ŸŸ¿Ÿ¾ ŸŸ¿ž¾ žŸ¿Ÿ¾ ŸŸÀž½ žžÀž½ žž¿�½ �Ÿ¿�¼ �žÀœº œžÀœº œœÀœ¹ œœ¿›¹ ›œ¿š¸ š›¿™· ™œ¿˜¶ ˜š¿—²Ÿ—š¿•° •˜¿”°Ÿ”˜¿•¯ •—¿•¯Ÿ•—¿•°Ÿ•—¿•±Ÿ•˜¿–±Ÿ–˜¿–²Ÿ–˜¿—²Ÿ—™¿—²Ÿ—™¿—´Ÿ—™¿—´Ÿ—š¿˜µ ˜š¿™µ ™š¿™´ ™š¿˜µŸ˜š¿˜´ ˜š¿˜´Ÿ˜™¿˜´ ˜š¿˜´ ˜š¿˜µŸ˜š¿˜µ ˜š¿™µ ™›¿˜¶Ÿ˜›¿™µ ™›¾™¶Ÿ™š¿˜µŸ˜š¿š¶ š›¿™¶ ™š¿™¶Ÿ™›¿™¶ ™›¿™µŸ™š¿™µŸ™š¿˜µ ˜š¿˜µ ˜š¿˜´ ˜š¿—´Ÿ—š¿˜³Ÿ˜™¿—³ —™¿—³ —š¿—² —™¿–±Ÿ–™¿–°Ÿ–˜¿•° •˜¿•°Ÿ•˜¿”¯ ”—¿”® ”—¿”®Ÿ”—¿”¯Ÿ”—¿”¯Ÿ”—¿”¯Ÿ”˜¿”¯Ÿ”—¿”¯ ”—¿”¯ ”—¿”¯ ”—¿•¯ •—¿•¯Ÿ•—¿•±Ÿ•˜¿–°Ÿ–˜¿–± –˜¿–²Ÿ–™¿—³Ÿ—™¿—³Ÿ—™¾—²Ÿ—š¿—³ —™¿˜³ ˜š¿˜µ ˜š¿˜µŸ˜š¿™µ ™š¿™µŸ™š¿™µŸ™š¿™µŸ™š¿™µ ™›¿™µ ™š¿™¶ ™›¿™¶Ÿ™›¿š¶Ÿš›¿š¶ š›¿™·Ÿ™›¿š· š›¿™¶ ™›À™·Ÿ™›Àš· šœÀš· š›¿š· š›Àš· šœ¿™·Ÿ™›¿š· š›¿š¶ š›¿™µ ™›¿™¶Ÿ™›¿™¶Ÿ™›¿™µ ™š¿™¶ ™›¿™¶Ÿ™š¿™¶Ÿ™›¿™µŸ™›¿™¶ ™š¿™µ ™›¿™¶Ÿ™›¿™¶Ÿ™š¿™µ ™š¿˜µŸ˜š¿˜´Ÿ˜š¿˜´Ÿ˜š¿˜µ ˜š¿˜³ ˜š¿˜´Ÿ˜š¿—³Ÿ—™¿—³ —™¿—³Ÿ—™¿—³Ÿ—š¿—²Ÿ—™¿—²Ÿ—™¿—² —™¿—² —™¿—²Ÿ—™¿–³ –™¿–²Ÿ–™¿–±Ÿ–™¿–° –˜¿•° •˜¿–° –—¿–° –˜¿•°Ÿ•˜¿•° •˜¿•° •—¿•¯Ÿ•—¿”® ”—¿”® ”–¿”® ”–¿”®Ÿ”—¿”¯ ”–¿“­Ÿ“–¿“­Ÿ“–¿’­Ÿ’•¿•°Ÿ•˜¿ŽŒŸž¶ý„ˆŸŠ¥üƒˆŸ‰¥üƒˆŸ‰¥ü„ˆŸŠ¥üƒˆŸ‰¦üƒ‰ŸŠ¦üƒ‰ŸŠ§ü„ˆŸ‰¦ü„ˆŸ‹§ü„ˆŸ‹¦ü„‰ž‹§ü„‰ŸŒ¨ü„ˆŸŒ¨ü…‰Ÿ�¨ü†‰ŸŽ©üˆŠŸ”­ü‹‹Ÿ—°þ‹‹ ˜±ýŠ‹Ÿ–¯ýŠŠŸ–®þ‹‹Ÿ—±ý‹‹Ÿš²ýŒ‹Ÿ™²ý‹‹ ™²ýŒŒŸš³ý�‹Ÿš³ý�Œ Ÿµý��Ÿ£¹ý‘� £ºý�ŽŸ£ºý’ŽŸ¥»ý’�Ÿ§¼ý‘�Ÿ¥ºý‘� ¥ºý��Ÿ¤¹ý‘� £¹ý‘�Ÿ¤ºý‘ŽŸ£¹ý�� ¢¹ý��Ÿ¡¸ý�� ¢¹ý��Ÿ¢¸ý‘ŽŸ¤ºý“ŽŸ§½ý”ŽŸª¾ý–�Ÿ®Ãý™�Ÿ³Åý›‘Ÿ·Éýœ’Ÿ¹Ëýž’ ¼Ìýž“Ÿ¾ÍþŸ“ ÀÏþ¡“ŸÂÐþ¡” ÂÑþ¡”ŸÃÒþ¡“ŸÄÒþ¢”ŸÅÓþ£” ÆÔþ£•ŸÇÕþ£•ŸÈÖþ¤• É×þ¥•ŸÊ×þ¦• ÌØþ§–ŸÎÚþ¨— ÑÜþ©— ÓÞþ©—ŸÓÞþ©— ÒÝþ©— ÑÝþ©— ÓÞþª—ŸÓÞþ«˜ŸÖàþ­™ŸÛãþ¯™ Þçþ±šŸâéþ³›Ÿåìþ´›Ÿéîþ´› èîÿ°› âêþ°š àéþ¯™ŸÞçþ®šŸÝæþ¯š Þæþ­™ŸÚãþ«˜ ×áþ«— Ößþª—ŸÔÞþª˜ŸÕßþ¬˜ŸÙãþ°™ áèþ´›Ÿèîþ·œŸíñÿ·œ ïóÿ¸� ðôÿ¹� óöÿ»ž öøÿ¼žŸøúÿ½Ÿ úûÿ¾Ÿ ûüÿ¾Ÿ üüÿ¾ŸŸüüÿ½Ÿ ûýÿ½Ÿ ûýÿ¾Ÿ ûüÿ½Ÿ ûüÿ¾Ÿ ûýÿ¾Ÿ üýÿ¾Ÿ üýÿ¾Ÿ üýÿ¾Ÿ üýÿ¾ŸŸüýÿ¾Ÿ üýÿ½  ûýÿ½Ÿ ûüÿ½Ÿ ûüÿ¾Ÿ ûüÿ¾Ÿ ûýÿ½Ÿ ûüÿ¾Ÿ ûüÿ¾ŸŸûüÿ½Ÿ ûüÿ¾Ÿ ûüÿ½Ÿ ûüÿ½Ÿ ûüÿ½Ÿ ûüÿ½Ÿ ûüÿ¾Ÿ ûüÿ½Ÿ ûüÿ½Ÿ ûüÿ¾Ÿ ûüÿ¾Ÿ ûüÿ½Ÿ ûüÿ¾Ÿ ûüÿ½Ÿ ûüÿ¾ŸŸüýÿ¾  üýÿ¾  üýÿ¾Ÿ üýÿ½ŸŸûüÿ½Ÿ ûüÿ¾Ÿ ûüÿ¾Ÿ ûüÿ½Ÿ ûýÿ¾ŸŸûüÿ¾Ÿ ûüÿ½Ÿ úüÿ½Ÿ úüÿ½ž úûÿ½Ÿ úüÿ½ŸŸúüÿ½Ÿ úüÿ¾Ÿ ûüÿ¾Ÿ ûüÿ¾ŸŸûüÿ½Ÿ ûüÿ¾Ÿ ûüÿ½Ÿ ûüÿ¾ Ÿüýÿ½Ÿ úüÿ½Ÿ ûüÿ½Ÿ ûüÿ¾Ÿ ûüÿ¾Ÿ ûüÿ¾Ÿ üýÿ¾Ÿ üýÿ¾Ÿ üýÿ½ŸŸûüÿ½Ÿ ûüÿ½ŸŸûüÿ½Ÿ úüÿ¼ž ùûÿ¼ŸŸøúÿ»ž ÷ùÿ»� õ÷ÿ¹�Ÿòöÿ¸� ñôÿ¸� ïóÿ·� íòÿ¶œ ëðÿ´œ èîþ²›Ÿäëþ®šŸÞæþ«˜ ×áþª—ŸÔàþª˜ Õßþª˜ Õßþ«—Ÿ×àþ¬˜ Øâþ­˜ Úãþ®™ŸÝåþ¯™ Ýåþ¯™ Þæþ°™ ßçþ°™ àèþ±šŸâéþ±š ãêþ±š ãêþ²› ãêþ±š âéþ±šŸãêþ±š âéþ±šŸâéþ±šŸâêþ±šŸãêþ²šŸäêþ²› äëþ²› åëþ³›Ÿçìþ²š åìþ³š æìþ³šŸæìþ³›Ÿæìþ²šŸåìþ³šŸåëþ±›Ÿãêþ°šŸâéþ±šŸãéþ°™Ÿàèþ¯™Ÿßçþ¯™ ßæþ¯™ŸÞæþ®šŸÝæþ®˜ŸÛåþ­™ Ûãþ­˜ŸÙâþª—ŸÖàþ«—ŸÖàþª—ŸÕßþ©— ÓÞþ©— Óßþ©— ÓÞþ©—ŸÓÞþ©—ŸÔÞþ©— Ôßþ©—ŸÓÞþ©— ÓÞþ©—ŸÓÞþ«˜ Õßþª— Ößþ«˜ ×áþ¬˜ŸÙâþ­™ŸÚãþ®˜ Ýäþ¯™ŸÞçþ®šŸÝæþ¯š Þæþ¯šŸÞæþ¯šŸàèþ°š áéþ±š âéþ²› ãêþ²š åêþ²›Ÿåëþ²š åëþ²šŸåëþ²šŸåëþ²›Ÿåìþ²› åíþ´šŸçíþ³› èíþ´›Ÿçíþ³› çíþ´› èíÿ´› éîÿ´› éîÿµ›Ÿéîÿ´œ éîÿ´›Ÿéïÿ´›Ÿèíþ³› çíþ³› çíþ³šŸæìþ³š æìþ³›Ÿæìþ²š äëþ³› åìþ²› åíþ²› åìþ²šŸæìþ³›Ÿçìþ²›Ÿæìþ²šŸåìþ²š åëþ²› äëþ±šŸãêþ²›Ÿãëþ°šŸâéþ±šŸáéþ¯™Ÿàèþ°šŸàèþ°š àèþ¯š ßçþ¯™Ÿßçþ¯™ Þæþ­™ Üåþ®™ Ýåþ®™ŸÝåþ®™ŸÝæþ®™ŸÝåþ®™ŸÜæþ®˜ŸÛäþ­˜ Úãþ­˜ŸÙâþ«˜ ×áþ¬˜ŸØáþ¬˜ŸÙâþ«˜ ×âþª— Öàþª—ŸÕàþª—ŸÔÞþ©— ÓÞþ©— ÒÝþ¨— ÓÝþ©– ÒÝþ¨—ŸÑÝþ¨— ÐÜþ§–ŸÏÜþ¦– ÎÛþª—ŸÕàþŠ ŸŠ�¿…˜Ÿ…Œ¿…˜Ÿ…‹¿†™ †Œ¿†™Ÿ†Œ¿†™Ÿ†Œ¾†™ †Œ¾†š †Œ¿†šŸ†�¾‡šŸ‡�¿‡œŸ‡Ž¿ˆ� ˆ�¾ˆ�ŸˆŽ¾‰žŸ‰Ž¾‰žŸ‰�¿‰žŸ‰�¾‰ž ‰Ž¾‰žŸ‰Ž¾‰�Ÿ‰Ž¿ŠžŸŠŽ¾ŠŸŸŠ�¿ŠŸŸŠ�¿‰ŸŸ‰Ž¿‰ŸŸ‰�¾‰ŸŸ‰�¾Š ŸŠ�¾‹¡Ÿ‹�¿Œ¢ŸŒ�¿‹¢Ÿ‹�¿Œ£ŸŒ‘¾Œ£ŸŒ‘¿Œ£ŸŒ‘¾‹¢ ‹�¾Œ¡ŸŒ�¿‹¡Ÿ‹�¿Œ¡ Œ�¾‹¢Ÿ‹‘¾‹¢Ÿ‹�¿Œ¢ŸŒ‘¿‹¢ ‹‘¿‹¢Ÿ‹‘¿Œ¢ŸŒ‘¿‹¡ ‹�¾‹¢Ÿ‹�¿‹¡Ÿ‹�¾Œ¡ŸŒ�¾‹¡Ÿ‹�¾Œ¢ŸŒ‘¿�¤Ÿ�‘¾�£Ÿ�‘¿�¤Ÿ�’¾�¤ �‘¿Ž¥ŸŽ“¾�§Ÿ�“¾�© �”¿‘«Ÿ‘•¾’«Ÿ’•¿’«Ÿ’–¿’¬Ÿ’–¿’­ ’–¿“¬Ÿ“–¿“­ “—¿”­Ÿ”—¿”­ ”—¿•® •—¿–±Ÿ–˜¿–² –™¿–²Ÿ–˜¿–±Ÿ–˜¿–² –˜¿–²Ÿ–˜¿—² —™¿˜´ ˜š¿™¶Ÿ™›¿™·Ÿ™œ¿š¸ šœ¿›¸ ›œÀ›¹ ›œÀ™· ™›¿™¶ ™›¿™µŸ™š¿˜µ ˜š¿˜µŸ˜š¿˜´Ÿ˜š¿—³Ÿ—™¿—²Ÿ—˜¿–² –™¿–²Ÿ–™¿˜´Ÿ˜š¿š·Ÿšœ¿œºŸœ�¿œ» œ�À�¼ �ž¿�½ �žÀŸ½ Ÿž¿ž¾ žŸÀŸ¾ ŸŸ¿Ÿ¿ Ÿ ÀŸ¿ŸŸŸ¿Ÿ¿ ŸŸÀŸ¿ ŸŸÀŸ¿ ŸŸÀŸ¾ ŸŸ¿Ÿ¿ ŸŸÀŸ¿ŸŸŸÀŸ¿ŸŸŸÀŸ¾ ŸŸÀŸ¿ŸŸ ÀŸ¾ŸŸŸ¿Ÿ¾ ŸŸ¿ž¾ žŸ¿Ÿ¿ ŸŸ¿Ÿ¿ ŸŸÀ ¾  Ÿ¿Ÿ¾ŸŸŸ¿Ÿ¾ ŸŸÀŸ¿ ŸŸÀŸ¾ ŸŸ¿Ÿ¾ŸŸŸ¿Ÿ¿ ŸŸ¿ ¾Ÿ Ÿ¿Ÿ¾ ŸŸÀŸ¿ŸŸŸÀž¾ žŸÀŸ¿ ŸŸ¿Ÿ¾ ŸŸ¿Ÿ¿ŸŸŸÀŸ¾ ŸŸ¿Ÿ¾ŸŸ ÀŸ¾ ŸŸÀŸ¿ ŸŸÀŸ¾ ŸŸÀŸ¾ ŸŸ¿Ÿ¿ Ÿ ¿Ÿ¾ ŸŸ¿Ÿ¾ŸŸ ¿Ÿ¿ ŸŸÀŸ¾ Ÿ ÀŸ¾ŸŸŸÀŸ¾ŸŸŸÀž¾ žŸÀž¾ žŸ¿Ÿ¾ŸŸŸ¿Ÿ¾ŸŸŸ¿Ÿ¾ ŸŸ¿Ÿ¿ Ÿ ÀŸ¿ŸŸ ¿Ÿ¿ ŸŸ¿ ¿  Ÿ¿ ¿   ÀŸ¿ Ÿ ÀŸ¿ ŸŸÀ ¿Ÿ ŸÀ ¿   ¿Ÿ¿ŸŸŸÀŸ¿ŸŸ ¿Ÿ¾ ŸŸ¿Ÿ¿ ŸŸÀŸ¾ŸŸŸ¿Ÿ¾ ŸŸÀŸ¿ ŸŸÀŸ¿ ŸŸ¿Ÿ¿ ŸŸÀŸ¾ ŸŸ¿Ÿ¾ŸŸŸ¿Ÿ¿ ŸŸ¿Ÿ¾ ŸŸÀŸ¾ ŸŸ¿Ÿ¿ Ÿ ÀŸ¿ Ÿ ÀŸ¿ŸŸŸÀŸ¾ ŸŸÀŸ¿ŸŸŸÀŸ¿ ŸŸÀŸ¾ŸŸŸÀŸ¾ ŸŸÀž¾ŸžŸ¿ž½ žž¿ž¼ žž¿�¼ �žÀœ»Ÿœ�¿œºŸœ�¿›º ›œ¿œ¹ œœ¿š·Ÿš›À™¶ ™›¿™µ ™š¿˜´ ˜š¿—³ —™¿—²Ÿ—˜¿–²Ÿ–™¿–± –˜¿—² —˜¿–²Ÿ–™¿—³ —™¿˜³ ˜™¿—² —™¿˜³ ˜š¿—³ —™¿—³Ÿ—™¿—´Ÿ—š¿—´Ÿ—š¿˜´ ˜š¿™µŸ™š¿˜´ ˜š¿™´ ™š¾˜´Ÿ˜š¿˜´Ÿ˜š¿™´ ™š¿™µŸ™š¿˜µŸ˜›¿˜´ ˜š¿™µ ™š¿˜µ ˜š¿˜µ ˜š¿˜´Ÿ˜š¿˜µŸ˜š¿˜´ ˜š¿˜´Ÿ˜š¿™´Ÿ™š¿˜´Ÿ˜š¿˜´ ˜š¿˜´Ÿ˜š¿—´Ÿ—™¿—³Ÿ—š¿˜³ ˜™¿—² —™¿—³ —™¿—²Ÿ—™¿—²Ÿ—˜¿—³ —™¿—± —˜¿–² –˜¿—² —˜¿–² –™¿—² —™¿–² –™¿—²Ÿ—™¿—³Ÿ—™¿˜´ ˜™¿˜´Ÿ˜š¿—´Ÿ—š¿˜µŸ˜›¿™´Ÿ™š¿˜µŸ˜š¿™µŸ™š¿˜µŸ˜›¾˜µŸ˜›¿™µŸ™š¿™µŸ™›¿™¶Ÿ™š¿˜µŸ˜š¿™µŸ™›¿™· ™›¿š¶ š›¿š¶ š›¿š· š›¿š¸Ÿšœ¿›¸ ›œ¿›¹ ›œÀ›¹ ›œÀš¹ šœ¿›·Ÿ›œ¿š· šœ¿™¶Ÿ™›¿™¶ ™š¿˜´Ÿ˜š¿˜µ ˜š¿™µ ™š¿™µŸ™š¿˜´Ÿ˜›¿˜µŸ˜š¿™µ ™›¿˜µŸ˜š¿˜µ ˜š¿™µ ™›¿™µ ™›¿™µ ™›¿™µ ™š¿™¶Ÿ™š¿˜µŸ˜š¿˜´Ÿ˜š¿˜´ ˜š¿˜³ ˜™¿—³Ÿ—™¿—³Ÿ—š¿—² —™¿–²Ÿ–™¿–² –™¿–±Ÿ–˜¿–±Ÿ–˜¿–± –˜¾–±Ÿ–™¿–± –˜¿•¯Ÿ•—¿”¯ ”—¿”® ”–¿“­ “–¿“­Ÿ“—¿“¬ “•¿’¬ ’•¿“¬ “•¿’¬ ’–¿“­ “–¿“­ “–¿“­Ÿ“–¿”¬Ÿ”–¿”­Ÿ”–¾“­ “–¿“­Ÿ“–¿“­Ÿ“–¿“®Ÿ“—¿“­ “—¿“­ “–¿“­Ÿ“—¿“­Ÿ“—¿“­ “–¿“­ “–¿“­Ÿ“–¿”¯ ”—¿–� ­ÁýŒ‹ š³ýŒ‹Ÿš²ýŽŒŸž´ý�Œ œ´ý�ŒŸ�´ý�Œ �µýŽŒ žµýŽŒŸŸµý��Ÿ¡¶ý‘�Ÿ£¹ý’Ž ¦»ý“Ž ¨¼ý“ŽŸ©½ý”�Ÿ©¾ý”ŽŸª¾ý“�Ÿ©½ý”ŽŸ¨½ý”ŽŸ¨½ý”ŽŸ©¾ý”�Ÿª¾ý”� ¬¿ý•ŽŸ¬¿ý•� «¿ý•�Ÿ­Àý–�Ÿ­Áý—�Ÿ°Äý˜� ²Åý™�Ÿ³Åý™‘ŸµÆý™‘ µÆýš‘Ÿ´Æý™�Ÿ´Åý˜�Ÿ²Äý™‘Ÿ²Äý™� ³Äý˜‘Ÿ³Äý™�Ÿ²Äý˜‘Ÿ²Äý˜�Ÿ³Åý˜‘Ÿ²Åý™‘Ÿ²Äý˜�Ÿ²Äý™�Ÿ²Åý˜�Ÿ±Äý™�Ÿ³Äý™�Ÿ´Äý™�Ÿ³Çýš‘ŸµÇýš‘Ÿ¶Èý›‘Ÿ·Éýœ‘Ÿ¹Éýž“ ¼Ìý “ŸÀÏý¢” ÅÓý£•ŸÉÖý¥• Ê×þ¦•ŸÌØþ¦–ŸÍÙþ¦– ÎÙþ§– ÏÛþ§–ŸÏÛþ¨–ŸÐÜþ¨– ÑÜþª—ŸÔÞþ«˜ Øâþ®˜ Üäþ­˜ Úãþ¬˜ŸÙâþ¬˜ŸÙãþ­™ Ûäþ®™ŸÜäþ¯šŸàèþ²šŸåìþ´œ èîþµœŸêðþ¶œ íñÿµœ ìòÿ´› èîþ²š äëþ±š ãêþ±š ãêþ±šŸãêþ±šŸáèþ¯šŸÞæþ®™ŸÜäþ­™ Ûäþ®™ŸÜåþ±š âéþµœŸéïþ¸� ïóÿº� óöÿ»ž õøÿ¼ž ÷ùÿ½ž úûÿ¾ŸŸûüÿ¾Ÿ üýÿ¾ŸŸüýÿ¿ Ÿýþÿ¾  ýþÿ¾  üýÿ¾Ÿ üýÿ¾Ÿ üýÿ¾Ÿ ýýÿ¾ Ÿýýÿ¾  üýÿ¾Ÿ üýÿ¾ Ÿüýÿ¾ŸŸûüÿ½Ÿ ûüÿ¾Ÿ üüÿ¾Ÿ ýýÿ¿ŸŸýýÿ¿Ÿ ýýÿ¾Ÿ üýÿ¾Ÿ üýÿ¾ Ÿüýÿ¾Ÿ üýÿ¾ Ÿüýÿ¾Ÿ üýÿ¿ŸŸýýÿ½  üýÿ¾ŸŸüýÿ½ŸŸüýÿ¾ŸŸüýÿ¾Ÿ üýÿ¾Ÿ üýÿ¾  üýÿ¾  üýÿ¾Ÿ üýÿ¾Ÿ üýÿ¾ Ÿûýÿ¾Ÿ ûýÿ¿  ýýÿ¾Ÿ ýýÿ¾Ÿ ýýÿ¾Ÿ ýýÿ¾Ÿ üýÿ¾ŸŸüýÿ¾ŸŸûüÿ¾ŸŸûüÿ½Ÿ ûüÿ¾Ÿ ûüÿ¾Ÿ ûüÿ¾ŸŸüýÿ¿Ÿ ýþÿ¿ Ÿþþÿ¿Ÿ þþÿ¿Ÿ þþÿ¿Ÿ þþÿ¿ Ÿþþÿ¿  þþÿ¿ Ÿþþÿ¿Ÿ ýþÿ¾Ÿ ýþÿ¿  ýþÿ¿Ÿ ýýÿ¾ Ÿüýÿ¾ŸŸûüÿ¾Ÿ üýÿ¾Ÿ üýÿ¾ŸŸüýÿ¾ŸŸüýÿ¾Ÿ ýýÿ¿Ÿ ýýÿ¾ŸŸüýÿ¾Ÿ üüÿ¾  üýÿ¿ Ÿýþÿ¿ Ÿþþÿ¾  ýýÿ½Ÿ ûüÿ¾Ÿ üýÿ¾  üþÿ¾ Ÿüýÿ¾ŸŸüüÿ½Ÿ úüÿ½Ÿ ùúÿ»ž öøÿºžŸõøÿºž óöÿ¹� òõÿ¸� ðôÿ·œŸîòÿµœ êïÿ³›Ÿçíþ²›Ÿäëþ°™ áèþ®™ ßæþ®™ Üäþ­˜ Ûäþ­™ŸÛåþ®™ Ýåþ¯™ŸÝåþ¯š ßæþ®™ŸÞæþ¯™ ßçþ¯š ßçþ°™ ßèþ°™ ßçþ°™ àèþ¯šŸàèþ°š áéþ²šŸäêþ±š ãéþ²š ãéþ±šŸãéþ²š ãêþ²š ãéþ±šŸãêþ²šŸãêþ±š ãêþ±šŸäêÿ±šŸãêþ²› ãëþ²›Ÿãêþ°š áéþ°š áéÿ±š âéþ±™ ãéþ±šŸâéþ°š áéþ°š áèþ°šŸáçþ°šŸßçþ°™ àèþ¯™ Þæþ®™ŸÞåþ¯™ŸÞåþ®™ Ýåþ®™ Üæþ®˜ŸÜäþ®˜ Üäþ®˜ Üäþ®™ Üåþ®™ŸÜäþ­™ Üåþ¯˜ŸÝåþ®™ Þæþ¯šŸßçþ°™ àèþ°šŸâéþ±š ãêþ±šŸãêþ±šŸäêþ±›Ÿäëþ±›Ÿãìþ²›Ÿäëþ±› äêþ±›Ÿãêþ²› äëþ±š äëþ³› åíþ³›Ÿæíþ³› æíþ³› çíþµ›Ÿéîþµœ êðþ¶œ íñÿ·œ îòÿ¶œ íñÿ¶œ ìñÿµœŸìðþ´›Ÿéïþ³› æíþ²šŸåëþ±š ãêþ±š ãêþ°šŸãêþ±šŸãëþ±š ãêþ²š ãêþ±šŸãëþ±› ãêþ±š ãêþ²šŸäëþ³š åëþ²šŸåëþ²›Ÿåëþ²› åëþ±šŸäêþ±šŸâéþ±š áéþ°š ßçþ¯šŸÞæþ¯™ŸÞæþ®™ŸÜåþ¬™ŸÚäþ­˜ŸÛäþ¬˜ŸÚãþ­™ŸÚãþ­™ŸÚãþ­˜ŸÚãþ­˜ Ùâþ«˜ŸÖàþ©—ŸÓÞþ¨—ŸÒÜþ¨– ÐÛþ§–ŸÏÜþ¦– ÍÚþ¦–ŸÌØþ¥–ŸÌÙþ¦– ÎÙþ¦– ÎÛþ§– ÏÚþ§– ÏÚþ§– ÏÚþ§–ŸÏÚþ§–ŸÐÛþ§– ÏÛþ§–ŸÏÛþ¨– ÐÛþ§—ŸÏÛþ§–ŸÏÛþ§— ÐÛþ§– ÏÛþ§–ŸÏÚþ§—ŸÏÛþ§–ŸÏÚþª—ŸÕàÿ \ No newline at end of file diff --git a/2011/akari/hint.html b/2011/akari/hint.html new file mode 100644 index 000000000..659a5b174 --- /dev/null +++ b/2011/akari/hint.html @@ -0,0 +1,167 @@ + + + + + + + Best of Show - Most Shrinkable + + +

Best of Show - Most Shrinkable

+ +

Don Yang
+
omoikane@uguu.org
+http://uguu.org/

+ +

Judges' comments:

+ +

To build:

+ +
make akari
+
+ +

To run:

+ +
./akari [input_file_or_- [output_file_or_- [even]]]
+
+ +

Try:

+ +
./akari < example.ppm > odd_output.ppm
+./akari - - even < example.ppm > even_output.ppm
+./akari example.ppm odd_output.ppm
+
+make akari2.c
+cat akari2.c
+
+make akari2
+
+./akari2 < akari2.c
+./akari2 rot13 < akari2.c
+
+make akari3.c
+cat akari3.c
+
+make akari3
+
+./akari3
+
+make akari4.c
+cat akari4.c
+
+./akari4
+
+ +

Selected Judges Remarks:

+ +

Akari is an image downsampling utility that accepts 3 inout formats:

+ +
* PGM (netpbm grayscale image).  Akari only accept PGM files with this
+  header: P5 <width> <height> 255.  Images with extra comments such as
+  the ones produced by GIMP will not be parsed properly.
+
+* PPM (netpbm RGB image).  Only PPM files with this header are
+  accepted: P6 <width> <height> 255.
+
+* ASCII art (with end of lines in LF bytes only, not CR-LF)
+
+ +

Anything that is not parseable as PGM or PPM will be downsampled as ASCII art.

+ +

Author’s comments:

+ +

Akari is an image downsampling utility. She accepts up to 3 arguments:

+ +

First argument is the input image. If it’s “-” or unspecified, Akari +will read from stdin.

+ +

Second argument is the output image. If it’s “-” or unspecified, +Akari will write to stdout.

+ +

Third argument, if specified, causes Akari to keep even pixels on even +scanlines. By default Akari will keep odd pixels on odd scanlines.

+ +

Examples:

+ +
gcc akari.c -o akari
+./akari < example.ppm > odd_output.ppm
+./akari - - even < example.ppm > even_output.ppm
+./akari example.ppm odd_output.ppm
+
+ +

Akari accepts 3 input formats: +* PGM (netpbm grayscale image). Akari only accept PGM files with this + header: P5 255. Images with extra comments such as + the ones produced by GIMP will not be parsed properly. +* PPM (netpbm RGB image). Only PPM files with this header are + accepted: P6 255. +* ASCII art (with end of lines in LF bytes only, not CR-LF)

+ +

This is useful for decoding some curiously interlaced images, such as +the included example.ppm

+ +

Anything that is not parseable as PGM or PPM will be downsampled as +ASCII art. Since the source code is formatted as ASCII art, it’s only +natural to try:

+ +
./akari akari.c akari2.c
+
+ +

akari2.c is also a valid C program, and accepts up to 1 argument. +By default, this second program reads text from stdin and writes +expanded output to stdout. If the extra argument is specified, the +output text will also pass through a rot13 filter.

+ +
gcc akari2.c -o akari2
+./akari2 < input.txt > expanded_output.txt
+./akari2 rot13 < input.txt > expanded_and_rot13_output.txt
+
+ +

You can combine the two programs together to have just a regular rot13 +filter:

+ +
./akari2 rot13 < input.txt | ./akari > rot13.txt
+
+ +

Of course, we wouldn’t stop with just 2 programs, you can downsample +the source again and get yet another C program:

+ +
./akari < akari.c | ./akari > akari3.c
+
+ +

We must go deeper:

+ +
./akari < akari.c | ./akari | ./akari > akari4.c
+
+ +

akari3.c and akari4.c are still (mostly valid) C programs. +“gcc -Wall” will output a few warnings, but still produce output +executables. The output executables each print a message to stdout.

+ +

It takes quite a bit of skill and obfuscation to interleave a +C program 4 levels deep, it’s much easier to interleave something like +a brainf#$% program in a C program, for example. For comparison, a +brainf#$% program is embedded inside akari.c

+ +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2012, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2011/akari/hint.text b/2011/akari/hint.text new file mode 100644 index 000000000..06c9a542c --- /dev/null +++ b/2011/akari/hint.text @@ -0,0 +1,133 @@ +# Best of Show - Most Shrinkable + +Don Yang + + + + +## Judges' comments: +### To build: + + make akari + +### To run: + + ./akari [input_file_or_- [output_file_or_- [even]]] + +### Try: + + ./akari < example.ppm > odd_output.ppm + ./akari - - even < example.ppm > even_output.ppm + ./akari example.ppm odd_output.ppm + + make akari2.c + cat akari2.c + + make akari2 + + ./akari2 < akari2.c + ./akari2 rot13 < akari2.c + + make akari3.c + cat akari3.c + + make akari3 + + ./akari3 + + make akari4.c + cat akari4.c + + ./akari4 + +### Selected Judges Remarks: + +Akari is an image downsampling utility that accepts 3 inout formats: + + * PGM (netpbm grayscale image). Akari only accept PGM files with this + header: P5 255. Images with extra comments such as + the ones produced by GIMP will not be parsed properly. + + * PPM (netpbm RGB image). Only PPM files with this header are + accepted: P6 255. + + * ASCII art (with end of lines in LF bytes only, not CR-LF) + +Anything that is not parseable as PGM or PPM will be downsampled as ASCII art. + +## Author's comments: +Akari is an image downsampling utility. She accepts up to 3 arguments: + +First argument is the input image. If it's "-" or unspecified, Akari +will read from stdin. + +Second argument is the output image. If it's "-" or unspecified, +Akari will write to stdout. + +Third argument, if specified, causes Akari to keep even pixels on even +scanlines. By default Akari will keep odd pixels on odd scanlines. + +Examples: + + gcc akari.c -o akari + ./akari < example.ppm > odd_output.ppm + ./akari - - even < example.ppm > even_output.ppm + ./akari example.ppm odd_output.ppm + +Akari accepts 3 input formats: +* PGM (netpbm grayscale image). Akari only accept PGM files with this + header: P5 255. Images with extra comments such as + the ones produced by GIMP will not be parsed properly. +* PPM (netpbm RGB image). Only PPM files with this header are + accepted: P6 255. +* ASCII art (with end of lines in LF bytes only, not CR-LF) + +This is useful for decoding some curiously interlaced images, such as +the included example.ppm + +Anything that is not parseable as PGM or PPM will be downsampled as +ASCII art. Since the source code is formatted as ASCII art, it's only +natural to try: + + ./akari akari.c akari2.c + +akari2.c is also a valid C program, and accepts up to 1 argument. +By default, this second program reads text from stdin and writes +expanded output to stdout. If the extra argument is specified, the +output text will also pass through a rot13 filter. + + gcc akari2.c -o akari2 + ./akari2 < input.txt > expanded_output.txt + ./akari2 rot13 < input.txt > expanded_and_rot13_output.txt + +You can combine the two programs together to have just a regular rot13 +filter: + + ./akari2 rot13 < input.txt | ./akari > rot13.txt + +Of course, we wouldn't stop with just 2 programs, you can downsample +the source *again* and get yet another C program: + + ./akari < akari.c | ./akari > akari3.c + +We must go deeper: + + ./akari < akari.c | ./akari | ./akari > akari4.c + +akari3.c and akari4.c are still (mostly valid) C programs. +"gcc -Wall" will output a few warnings, but still produce output +executables. The output executables each print a message to stdout. + +It takes quite a bit of skill and obfuscation to interleave a +C program 4 levels deep, it's much easier to interleave something like +a brainf#$% program in a C program, for example. For comparison, a +brainf#$% program is embedded inside akari.c + +-------------------------------------------------------------------------------- + diff --git a/2011/blakely/3.dat b/2011/blakely/3.dat new file mode 100644 index 000000000..2f7f92f45 --- /dev/null +++ b/2011/blakely/3.dat @@ -0,0 +1,13 @@ + + + + ### + # # + # + ## + # + # # + ### + + + diff --git a/2011/blakely/Makefile b/2011/blakely/Makefile new file mode 100644 index 000000000..d4f1b6671 --- /dev/null +++ b/2011/blakely/Makefile @@ -0,0 +1,117 @@ +#!/usr/bin/env make +# +# 2011 makefile +# +# Copyright (C) 2011, Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis. +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +OPT= -O2 + +# bitness +# +# Some entries require 32-bitness, +# other entries require 64-bitess. +# By default we assume nothing. +# +ARCH= + +# default flags for ANSI C compilation +# +CFLAGS= -Wall -ansi -pedantic -Do=char -Dn=return -Dd=int -Dz=memset -Dk=sizeof -include stdio.h -include string.h -include unistd.h ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= blakely +DATA= 3.dat evolve_to_3.dat t0_3.dat + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} + +# alternative executable +# +alt: + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o + +clobber: clean + ${RM} -f ${ENTRY} + +nuke: clobber + @echo gnab gib! + +install: + @echo "Surely you're joking Mr. Feynman!" + +# backwards compatibility +# +build: all + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to partly misunderstand this final echo. + @${TRUE} diff --git a/2011/blakely/blakely.c b/2011/blakely/blakely.c new file mode 100644 index 000000000..45864dd20 --- /dev/null +++ b/2011/blakely/blakely.c @@ -0,0 +1,60 @@ +d b,x,h;o q[9802],f[9802];void w(d i){fflush(stdout);printf( +"%c" , ( i>b)?(i%b>0?q[i-b-1]:10):5*(b==i?2:9));if(i 3 || h < 2 )? 7 : +( ( h == 2 &&q[ i ] == 32 + )? 8 : 1 ) );}d y +( d i ){ d j , s , t ,a ,u +;if ( x - 1== i ) n 1 ;if ( f [i]==2) { +f [i ] <<=4;if(y( i))n 1;f[i ]-=- 3 ; if ( +y(i ) )n 1;n 0 ; };if((i % b ) == + 0 ||( i % b ) == b- +1 ) n y (i+1 ) ;j += -1 ; l : ; j =j + 1 ; +if ( j >= ( i - i / b + 2 + == b ? 1 : i > 2 * b ?i% b!= + 1 ?2 : 2 * 1<< 1 :8 )) goto +c; u = p( f, i ) ; if ( i < +x - 2*b - 1 ) { a =( s =(( t=i % b== + 1) ? 1 : i % b != b + - 2 ) ) && i < 2 * b;u+= ( +a ? ( j& 4 ) +>> 2 : 0 ) + (t ? ( j & 2 ) / 2 : 0) + ( +s? ( j&1):0);}else a =t=s=0;if((u&2)+(u&4)!= 2 && +(q[ i]& 2 ) ==2||u==2&& (f[i]+q[i]) % 2 ==1 ||u +== 3 && ( q [ i]&2)== 0 ) + goto l ; b +[i + f ] ^= ! t ? 0 + : b[ i + f ] ^ ( 10 + ( j & 2 ) +/ 2 ) * 3+2;b[ i + f + 1 - b ] ^= ! +a ?0 : b [i + f +1 - b]^ (10+ ( +j & 4) / 4 )* 3 +2 ; b [ i ++f + 1 ] ^= ! s ?0 : b [i+ f + 1 +] ^ (10 + ( j &1) ) *3+ 2 ; if ( y ( i ++ 1) ){ n 1 ; }; ( a ? +i + 1 : 0 ) [ f ] =( t +? i+ b :0 +) [ f ] = ( s ? i + + b +1:0) [ f ] = 2 ;goto l ; c:n 0 ; } d + main(d c,o**v){d i; x=b=0;while((q[x++]=getchar() ) != + EOF ){x-=(q[x-1]==10)? b+=1,1:0;q[x-1]^= (q[x-1] == +32)? 0 : q [ x - 1 ] ^ 35 ; } ; w ( 0 ); +for ( ; ; +) { z ( f , 2 , x * + k ( o ) ) ; for ( i = 0;i<=x - 1; +i = i + b )q [ i / b] = q [ x - b+ i /b +] = q [ i ]= q [ i - ( +(i == 0) ? 0: 1) ] =f [ i / +b ] = f[ x -b -1+ i/ b] = f [i ] =f[ + i - ( ( i == 0 ) ? +0 :1 ) ] = 32; if ( c == +1 ) m ( 0 ); else +if (y ( b + 1) +==0)n 1;f[0]<<=1<<2;memcpy(q,f,x*k(o));w(0);sleep(1);};n 0;} diff --git a/2011/blakely/evolve_to_3.dat b/2011/blakely/evolve_to_3.dat new file mode 100644 index 000000000..155b80639 --- /dev/null +++ b/2011/blakely/evolve_to_3.dat @@ -0,0 +1,13 @@ + + + + * * + * * * + *** ** * + ** * * + * * + ** ** * + *** *** + ** * * + * * ** * + diff --git a/2011/blakely/hint.html b/2011/blakely/hint.html new file mode 100644 index 000000000..14792e624 --- /dev/null +++ b/2011/blakely/hint.html @@ -0,0 +1,254 @@ + + + + + + + Most devolving + + +

Most devolving

+ +

Philip Blakely
+Cambridge, UK
+pmblakely@gmail.com

+ +

Judges' comments:

+ +

To build:

+ +
make blakely
+
+ +

To run:

+ +
# Zoom out and make your terminal window 53 or more lines deep 
+./blakely < blakely.c | head -300
+
+ +

Try:

+ +
./blakely < 3.dat | head -100
+./blakely - < 3.dat | head -40
+./blakely < evolve_to_3.dat | head -55
+./blakely < t0_3.dat
+
+ +

Selected Judges Remarks:

+ +

This program plays Life, computes Pi to 16 digits +if given its own source as input, and allows to check if your garden +is a Garden of Eden, all in one source.

+ +

If you have enough time to spare, put the plan of your garden in a text file, +and run:

+ +
./blakely - < garden.txt
+
+ +

Author’s comments:

+ +

Remarks

+ +

This program uses a well-known algorithm in order to display pi to +fifteen decimal places. The source-layout itself demonstrates the importance of +using the correct amount of whitespace in code and the clear superiority of spaces over tabs.

+ +

In order to see the main feature of the code, type:

+ +
./blakely < blakely.c
+
+ +

and wait for about four seconds before using Ctrl-C (or whatever) to end the program. The +results are best viewed in a terminal window at least 60 characters +high and wide. Alternatively, redirect the output to a separate file +(killing when necessary).

+ +

Overview

+ +

The program emulates John Conway’s ceullular automaton known as “The +Game of Life”, using standard input as a starting grid. The layout of +the source-code is such that it evolves to a digital representation of +the first 15 decimal places of pi after 4 time steps. This was setup +using the other feature of the program which can be demonstrated as follows:

+ +
./blakely - < 3.dat
+
+ +

The program will first display the grid given in 3.dat, and then three +more grids (taking a few minutes to display the last). Waiting for any more grids will +take a substantial amount of time. The final grid has been put into +evolve_to_3.dat, and if you type

+ +
./blakely < evolve_to_3.dat
+
+ +

then the 3 will reappear after three time steps.

+ +

As should now be clear, this use of program will attempt to evolve a given setup backwards in +time according to the Life rules. The resulting grid is clearly not +necessarily unique. The program will evolve backwards given any single +command line option.

+ +

When evolving forwards, the code can only be stopped by killing the +program. In the reverse direction, the code can either be killed, or +will stop if it is unable to find a grid that will evolve to the +current layout correctly. This can be seen with the sample grid +t0_3.dat, which evolves backwards by only two time-steps.

+ +

Input file format

+ +

The input files must encode a square grid, where a space is a dead +cell, and any other character (except a newline) is a living cell. Each line must be the same +length, and end with a single newline character \n (ASCII 10), including the last line. When +designing grids, it may help to type full-stops in place of spaces, +and do a global replace afterwards. Any deviation from this format will +cause errors in the output.

+ +

Limitations

+ +

This is only an approximation to the original Life, as it takes place +on a finite grid, with borders that are automatically killed off +before each time step. However, when evolving backwards, the resulting +grids will not cause any cells on the boundaries to come alive. +As the display is performed before killing off the borders, some +boundary cells may sometimes appear to be alive, but not be treated as +such for the following time-step, although any living cells on the +right border will never be displayed.

+ +

The maximum grid size is currently 99 by 99 (exceeding this will cause a +seg-fault), but changing the two 9802s to MAX_SIZE*MAX_SIZE+1 will +solve this, although some reformatting of the +code may have to be done to allow larger numbers.

+ +

Compiler warnings/assumptions

+ +

When compiled with the -Wall -pedantic -ansi options of gcc, some +warnings suggesting extra parentheses occur (not necessary for anyone +fully conversant with operator precedence). There is one unused +variable, v, but unnamed function parameters are not permitted in ANSI +C, so naming it is necessary, and gcc no longer warns about its +existence, although earlier versions did.

+ +

Since the program calculates ASCII character values for display, an +ASCII based system is required to run it. Also, as mentioned above, +any system that uses anything other than a plain ‘\n’ to end a line will cause +problems when reading in files.

+ +

Obfuscations

+ +

Given the finely-tuned layout required to evolve into pi, this is one of the +main obfuscations used in the code. However, running the code through the +preprocessor, expanding the defines, and applying GNU’s indent, although +making the location of functions and statements clear, by no means makes the +code entirely clear. Note that expanding out the #defines does not take the +program over the character limit. The main reason for these is to do with the +layout, since there are few places that keywords or tokens of over 2 +characters can be fitted, and requiring the first few lines to be #includes +would cause similar problems.

+ +

Other obfuscations used are:

+ +
    +
  • Use of the classic 2[a] syntax to access the third element of the +array a
  • +
  • Nested ternary operators, combined with shortcut evaluation being +required for correct operation
  • +
  • Use of the comma operator to embed operations inside one another
  • +
  • Calculation of ASCII codes
  • +
  • Needlessly recursive functions
  • +
  • Use of bitwise-operations.
  • +
  • Storing a variable whose value could easily be found from another
  • +
  • Use of gotos to emulate a for loop
  • +
+ + +

Algorithm

+ +

The forwards evolution of the grid is straightforward.

+ +

The reverse evolution is done using a brute-force method. As far as I +know, a brute-force method is the only viable automatic approach for +general grids, although more intelligent algorithms would be possible +given more space.

+ +

The program starts with an empty “trial” grid and, starting from the +top-left, tries all possibilities for the neighbours of the current +cell that will cause the cell to evolve to the required state. It then +proceeds to the right and down. Thus, it only ever needs to look at +the cells below and to the right when testing. However, the already +defined cells above and/or to the left of the cell may mean that there +are no possibilities that will give the correct state, in which case +the code backtracks and tries other possibilities on previous +cells. The program knows it has a valid grid if it gets to the last +cell. If it cannot find a valid grid, the program exits.

+ +

Since this uses brute-force, it can be very slow. (In fact, the +various obfuscations have, at least for the gcc compiler, +caused a substantial slowdown.)

+ +

Program layout

+ +

The “calculation” of pi was chosen purely because algorithms to find +pi are numerous, but the Game of Life is rarely (if ever?) used for +this purpose. Also, separate digits made determining the layout somewhat easier.

+ +

Deriving the layout was the most complicated part of the program. As is clear from +the final layout featuring pi, the grid was divided into sixteen squares, +and layouts that would evolve to each of the nine digits required were +found. (This used the three-by-five digit-layout embedded in, at first, a +nine-by-nine grid, then in larger grids, until fifteen-by-fifteen was +reached.) The fifteen-by-fifteen grids give enough blank cells around +them that the digits will not collide when evolving.

+ +

However, this did not allow for sufficient characters to fit the code +into. Therefore it was necessary to add some regions that would quickly die off +without expanding to collide with the digits' evolution. +Groups of cells such as singletons, pairs, and larger groups like

+ +
* * * * * * * * * *
+ *****************
+* * * * * * * * * *
+
+ +

were useful in this regard.

+ +

Other problems were given by keywords which need to be all in one +string, keywords requiring space after them, and +multi-character tokens. Some of these problems were dealt with by +using the #defines and #includes given in the build-script, as there +was no way to have sufficient separate lines in the code to do this +without causing many difficulties. Some rejigging of the grid’s layout +as the code was fitted into its format was also done, resorting to +trial-and-improvement in some cases. Occasional use of constructs such +as f -= -3 was made as f += 3 could not be fitted into the required format. +The fact that the borders would be killed off immediately was also helpful.

+ +

It should be noted that evolving a full 60-by-60 grid backwards using +this code would probably take us at least up to the heat-death of the +universe.

+ +

The command ./blakely - < blakely.c is therefore not recommended.

+ +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2012, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2011/blakely/hint.text b/2011/blakely/hint.text new file mode 100644 index 000000000..ecb704a1d --- /dev/null +++ b/2011/blakely/hint.text @@ -0,0 +1,227 @@ +# Most devolving + +Philip Blakely +Cambridge, UK + + + +## Judges' comments: +### To build: + + make blakely + +### To run: + + # Zoom out and make your terminal window 53 or more lines deep + ./blakely < blakely.c | head -300 + +### Try: + + ./blakely < 3.dat | head -100 + ./blakely - < 3.dat | head -40 + ./blakely < evolve_to_3.dat | head -55 + ./blakely < t0_3.dat + +### Selected Judges Remarks: + +This program plays Life, computes Pi to 16 digits +if given its own source as input, and allows to check if your garden +is a [Garden of Eden](http://en.wikipedia.org/wiki/Garden_of_Eden_%28cellular_automaton%29), all in one source. + +If you have enough time to spare, put the plan of your garden in a text file, +and run: + + ./blakely - < garden.txt + +## Author's comments: +Remarks +------- + +This program uses a well-known algorithm in order to display pi to +fifteen decimal places. The source-layout itself demonstrates the importance of +using the correct amount of whitespace in code and the clear superiority of spaces over tabs. + +In order to see the main feature of the code, type: + + ./blakely < blakely.c + +and wait for about four seconds before using Ctrl-C (or whatever) to end the program. The +results are best viewed in a terminal window at least 60 characters +high and wide. Alternatively, redirect the output to a separate file +(killing when necessary). + +Overview +-------- + +The program emulates John Conway's ceullular automaton known as "The +Game of Life", using standard input as a starting grid. The layout of +the source-code is such that it evolves to a digital representation of +the first 15 decimal places of pi after 4 time steps. This was setup +using the other feature of the program which can be demonstrated as follows: + + ./blakely - < 3.dat + +The program will first display the grid given in 3.dat, and then three +more grids (taking a few minutes to display the last). Waiting for any more grids will +take a substantial amount of time. The final grid has been put into +evolve\_to\_3.dat, and if you type + + ./blakely < evolve_to_3.dat + +then the 3 will reappear after three time steps. + +As should now be clear, this use of program will attempt to evolve a given setup backwards in +time according to the Life rules. The resulting grid is clearly not +necessarily unique. The program will evolve backwards given *any* single +command line option. + +When evolving forwards, the code can only be stopped by killing the +program. In the reverse direction, the code can either be killed, or +will stop if it is unable to find a grid that will evolve to the +current layout correctly. This can be seen with the sample grid +t0_3.dat, which evolves backwards by only two time-steps. + +Input file format +----------- + +The input files must encode a square grid, where a space is a dead +cell, and any other character (except a newline) is a living cell. Each line must be the same +length, and end with a single newline character \n (ASCII 10), including the last line. When +designing grids, it may help to type full-stops in place of spaces, +and do a global replace afterwards. Any deviation from this format will +cause errors in the output. + +Limitations +----------- + +This is only an approximation to the original Life, as it takes place +on a finite grid, with borders that are automatically killed off +before each time step. However, when evolving backwards, the resulting +grids will not cause any cells on the boundaries to come alive. +As the display is performed before killing off the borders, some +boundary cells may sometimes appear to be alive, but not be treated as +such for the following time-step, although any living cells on the +right border will never be displayed. + +The maximum grid size is currently 99 by 99 (exceeding this will cause a +seg-fault), but changing the two 9802s to MAX\_SIZE*MAX\_SIZE+1 will +solve this, although some reformatting of the +code may have to be done to allow larger numbers. + +Compiler warnings/assumptions +----------------------------- + +When compiled with the -Wall -pedantic -ansi options of gcc, some +warnings suggesting extra parentheses occur (not necessary for anyone +fully conversant with operator precedence). There is one unused +variable, v, but unnamed function parameters are not permitted in ANSI +C, so naming it is necessary, and gcc no longer warns about its +existence, although earlier versions did. + +Since the program calculates ASCII character values for display, an +ASCII based system is required to run it. Also, as mentioned above, +any system that uses anything other than a plain '\n' to end a line will cause +problems when reading in files. + +Obfuscations +------------ + +Given the finely-tuned layout required to evolve into pi, this is one of the +main obfuscations used in the code. However, running the code through the +preprocessor, expanding the defines, and applying GNU's indent, although +making the location of functions and statements clear, by no means makes the +code entirely clear. Note that expanding out the #defines does not take the +program over the character limit. The main reason for these is to do with the +layout, since there are few places that keywords or tokens of over 2 +characters can be fitted, and requiring the first few lines to be #includes +would cause similar problems. + +Other obfuscations used are: + +- Use of the classic 2[a] syntax to access the third element of the + array a +- Nested ternary operators, combined with shortcut evaluation being + required for correct operation +- Use of the comma operator to embed operations inside one another +- Calculation of ASCII codes +- Needlessly recursive functions +- Use of bitwise-operations. +- Storing a variable whose value could easily be found from another +- Use of gotos to emulate a for loop + +Algorithm +--------- + +The forwards evolution of the grid is straightforward. + +The reverse evolution is done using a brute-force method. As far as I +know, a brute-force method is the only viable automatic approach for +general grids, although more intelligent algorithms would be possible +given more space. + +The program starts with an empty "trial" grid and, starting from the +top-left, tries all possibilities for the neighbours of the current +cell that will cause the cell to evolve to the required state. It then +proceeds to the right and down. Thus, it only ever needs to look at +the cells below and to the right when testing. However, the already +defined cells above and/or to the left of the cell may mean that there +are no possibilities that will give the correct state, in which case +the code backtracks and tries other possibilities on previous +cells. The program knows it has a valid grid if it gets to the last +cell. If it cannot find a valid grid, the program exits. + +Since this uses brute-force, it can be very slow. (In fact, the +various obfuscations have, at least for the gcc compiler, +caused a substantial slowdown.) + +Program layout +-------------- + +The "calculation" of pi was chosen purely because algorithms to find +pi are numerous, but the Game of Life is rarely (if ever?) used for +this purpose. Also, separate digits made determining the layout somewhat easier. + +Deriving the layout was the most complicated part of the program. As is clear from +the final layout featuring pi, the grid was divided into sixteen squares, +and layouts that would evolve to each of the nine digits required were +found. (This used the three-by-five digit-layout embedded in, at first, a +nine-by-nine grid, then in larger grids, until fifteen-by-fifteen was +reached.) The fifteen-by-fifteen grids give enough blank cells around +them that the digits will not collide when evolving. + +However, this did not allow for sufficient characters to fit the code +into. Therefore it was necessary to add some regions that would quickly die off +without expanding to collide with the digits' evolution. +Groups of cells such as singletons, pairs, and larger groups like + + * * * * * * * * * * + ***************** + * * * * * * * * * * + +were useful in this regard. + +Other problems were given by keywords which need to be all in one +string, keywords requiring space after them, and +multi-character tokens. Some of these problems were dealt with by +using the #defines and #includes given in the build-script, as there +was no way to have sufficient separate lines in the code to do this +without causing many difficulties. Some rejigging of the grid's layout +as the code was fitted into its format was also done, resorting to +trial-and-improvement in some cases. Occasional use of constructs such +as f -= -3 was made as f += 3 could not be fitted into the required format. +The fact that the borders would be killed off immediately was also helpful. + +It should be noted that evolving a full 60-by-60 grid backwards using +this code would probably take us at least up to the heat-death of the +universe. + +The command ./blakely - < blakely.c is therefore *not* recommended. + +-------------------------------------------------------------------------------- + diff --git a/2011/blakely/t0_3.dat b/2011/blakely/t0_3.dat new file mode 100644 index 000000000..93e34919a --- /dev/null +++ b/2011/blakely/t0_3.dat @@ -0,0 +1,9 @@ + + + ### + # + ### + # + ### + + diff --git a/2011/borsanyi/Makefile b/2011/borsanyi/Makefile new file mode 100644 index 000000000..e5e4a52eb --- /dev/null +++ b/2011/borsanyi/Makefile @@ -0,0 +1,117 @@ +#!/usr/bin/env make +# +# 2011 makefile +# +# Copyright (C) 2011, Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis. +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +OPT= -O2 + +# bitness +# +# Some entries require 32-bitness, +# other entries require 64-bitess. +# By default we assume nothing. +# +ARCH= + +# default flags for ANSI C compilation +# +CFLAGS= -Wall -W -ansi ${ARCH} ${OPT} -lm + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= borsanyi +DATA= data.1 data.2 data.3 + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} + +# alternative executable +# +alt: + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o + +clobber: clean + ${RM} -f ${ENTRY} + +nuke: clobber + @echo gnab gib! + +install: + @echo "Surely you're joking Mr. Feynman!" + +# backwards compatibility +# +build: all + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to partly misunderstand this final echo. + @${TRUE} diff --git a/2011/borsanyi/borsanyi.c b/2011/borsanyi/borsanyi.c new file mode 100644 index 000000000..3de4f4a68 --- /dev/null +++ b/2011/borsanyi/borsanyi.c @@ -0,0 +1,12 @@ +# include +# include +# define d double +d a,s;int n;p(d t ,d M,d x) +{ return x>0?x>1 &&!fork( )?p(t,s+= +a ,x-1):0 :scanf( "%lf",&x )-1?a=(M- +t )/22,s= pow(10, (int)( log10(a)) /*It is +a simple tool to quickly analyze data. */ +- 2),s=t- (a =s*( int)(a/s ))/2,p(t, s,(int)( +( a+M-t)/ a)):p(t >M|xM|x >M?x:M ,--n)+(x +> s&&x <= s+a); } main(j){ j==1?j=p (1,0,0) ,printf( +"%+12g %4d",s+a/2,j,wait(NULL)),main(j*400/n):putchar(35-25*!j)&' '&&main(j+1);} diff --git a/2011/borsanyi/data.1 b/2011/borsanyi/data.1 new file mode 100644 index 000000000..ba6459535 --- /dev/null +++ b/2011/borsanyi/data.1 @@ -0,0 +1,2000 @@ +0.0695175 +0.0697668 +0.0695881 +0.0694395 +0.0694606 +0.069504 +0.0697716 +0.0697499 +0.0696453 +0.0697075 +0.069477 +0.0696697 +0.0698721 +0.069486 +0.0696168 +0.0696556 +0.0696547 +0.0697621 +0.0696775 +0.0696285 +0.0693711 +0.0694261 +0.0697154 +0.0694934 +0.0697871 +0.0695603 +0.0698545 +0.0697213 +0.0697804 +0.069843 +0.0695187 +0.069754 +0.0694584 +0.0697373 +0.0696881 +0.0694778 +0.069582 +0.0693804 +0.069465 +0.0694777 +0.0693465 +0.0695222 +0.0694293 +0.0697115 +0.0695102 +0.0697993 +0.069505 +0.0692821 +0.0696646 +0.0696493 +0.0694128 +0.0697653 +0.0695212 +0.0697786 +0.0697624 +0.0695055 +0.0694783 +0.0696683 +0.0698264 +0.0694797 +0.0697818 +0.0696393 +0.0697934 +0.0696815 +0.069677 +0.0696514 +0.0696867 +0.0695986 +0.069695 +0.0699954 +0.0698007 +0.0696787 +0.0697539 +0.0696616 +0.0694918 +0.0694933 +0.0696337 +0.0696831 +0.0694513 +0.0695033 +0.0695031 +0.0695905 +0.0694812 +0.0697737 +0.0694291 +0.0695613 +0.0696753 +0.0695006 +0.0696477 +0.06966 +0.0695929 +0.0697046 +0.0695194 +0.0695762 +0.0695631 +0.0694366 +0.0695325 +0.0696698 +0.069681 +0.0696494 +0.0696063 +0.069546 +0.0696699 +0.0697789 +0.0698329 +0.0695209 +0.0696271 +0.0696414 +0.0698199 +0.0695592 +0.0695569 +0.0697086 +0.0695274 +0.0695781 +0.0698398 +0.0698074 +0.0695093 +0.0699296 +0.0697 +0.0696127 +0.0694629 +0.0696547 +0.0695501 +0.0695338 +0.0696044 +0.0694508 +0.0695441 +0.0692998 +0.0695878 +0.0696412 +0.0696987 +0.0695266 +0.0696553 +0.0696751 +0.0695643 +0.0695655 +0.0694643 +0.0694339 +0.0698114 +0.0695574 +0.0695198 +0.0694651 +0.0697079 +0.0695331 +0.0698099 +0.0696933 +0.0695716 +0.0695946 +0.0697549 +0.0696075 +0.0695073 +0.0696035 +0.0695325 +0.0694744 +0.0695202 +0.0697671 +0.0696702 +0.0697067 +0.0698376 +0.0694794 +0.0695353 +0.0696459 +0.0695167 +0.0696424 +0.0695999 +0.0696402 +0.0697716 +0.0695769 +0.0697314 +0.0697461 +0.0696342 +0.0697115 +0.0696607 +0.0699119 +0.0693976 +0.0695556 +0.0697178 +0.0697818 +0.0697593 +0.0696663 +0.0696126 +0.069895 +0.0695828 +0.0695205 +0.0694805 +0.0697056 +0.0694553 +0.0696243 +0.0694193 +0.0698165 +0.0696427 +0.0695649 +0.0696905 +0.0694273 +0.0693598 +0.0697502 +0.0695267 +0.0696068 +0.0694768 +0.0694551 +0.0698581 +0.0694709 +0.069757 +0.069354 +0.0696875 +0.0695323 +0.069544 +0.0697657 +0.0694513 +0.0697285 +0.0694912 +0.069572 +0.0697733 +0.0696245 +0.0695099 +0.0695966 +0.0697461 +0.0696959 +0.0697004 +0.069476 +0.0694555 +0.0694561 +0.0697715 +0.0697475 +0.0696974 +0.0695509 +0.0695348 +0.0694792 +0.0695716 +0.0695488 +0.0694637 +0.0695865 +0.0693232 +0.0696387 +0.0695757 +0.0697497 +0.0696647 +0.0692867 +0.0695992 +0.0697266 +0.069566 +0.0697246 +0.0694298 +0.0697759 +0.0693663 +0.0694853 +0.0694754 +0.0696102 +0.0696956 +0.0697192 +0.0697058 +0.0695683 +0.06973 +0.0694077 +0.0696584 +0.0696844 +0.0697981 +0.0699373 +0.069841 +0.0694263 +0.0695076 +0.0695759 +0.0697293 +0.0695528 +0.0693343 +0.0694361 +0.0699343 +0.0695758 +0.0697004 +0.0697872 +0.069647 +0.0696021 +0.0695191 +0.0695475 +0.0696036 +0.0698042 +0.069473 +0.0694002 +0.0695495 +0.0695853 +0.0697046 +0.0696273 +0.0694419 +0.069557 +0.0695143 +0.0693357 +0.069518 +0.0696985 +0.0697233 +0.0695002 +0.0696154 +0.0696797 +0.0695283 +0.069573 +0.0695839 +0.0695671 +0.0694472 +0.069414 +0.0694651 +0.0698479 +0.0695969 +0.0694747 +0.0697513 +0.0695858 +0.0695681 +0.0696992 +0.0694937 +0.0695174 +0.0696561 +0.0692935 +0.0695849 +0.069451 +0.0696009 +0.0694255 +0.0693655 +0.0696693 +0.0695225 +0.0696833 +0.0696326 +0.0697586 +0.0696299 +0.0698759 +0.0694227 +0.0696884 +0.0694712 +0.0695175 +0.0695278 +0.0696053 +0.0694033 +0.0696289 +0.0695053 +0.0696006 +0.0696153 +0.0697397 +0.0695527 +0.0696738 +0.0695711 +0.0699577 +0.0695627 +0.0696989 +0.0697046 +0.069691 +0.0696268 +0.069808 +0.069605 +0.0697595 +0.0696631 +0.0698227 +0.0696163 +0.0695616 +0.0695524 +0.0696751 +0.0693719 +0.0696951 +0.0696831 +0.0696598 +0.069645 +0.069587 +0.0695992 +0.0694223 +0.0697627 +0.069361 +0.0693999 +0.0694455 +0.0696828 +0.0694727 +0.0697327 +0.0696223 +0.0695831 +0.069621 +0.0694742 +0.069553 +0.0694164 +0.0694427 +0.0697081 +0.0695037 +0.0698154 +0.069723 +0.0696177 +0.0695345 +0.0695095 +0.0697768 +0.069559 +0.0697921 +0.0695377 +0.0697737 +0.0696456 +0.0695428 +0.0695539 +0.0696685 +0.0694566 +0.069698 +0.0695513 +0.0695162 +0.0696781 +0.0697412 +0.0696962 +0.0695291 +0.0694732 +0.0695122 +0.0697366 +0.0697013 +0.0693852 +0.0695653 +0.0696103 +0.069446 +0.0697598 +0.0695327 +0.0695783 +0.0695075 +0.0695865 +0.0695291 +0.0694685 +0.0696608 +0.0694634 +0.0694405 +0.0698259 +0.0696348 +0.0697262 +0.0694335 +0.0694251 +0.0696887 +0.0697227 +0.0697848 +0.0693362 +0.0698518 +0.0696912 +0.0692552 +0.0696946 +0.0694941 +0.0695322 +0.0694291 +0.0697128 +0.0697243 +0.0695343 +0.06945 +0.0696987 +0.0694538 +0.0694124 +0.0694668 +0.0695993 +0.0695272 +0.0695532 +0.069666 +0.0695178 +0.0695177 +0.0694767 +0.0694454 +0.0697467 +0.0692735 +0.0695621 +0.0696308 +0.0694939 +0.0693122 +0.0694094 +0.0696666 +0.0694896 +0.0695531 +0.0697533 +0.0695453 +0.0698005 +0.0697277 +0.0696853 +0.0696508 +0.0697799 +0.0692119 +0.0697155 +0.0697111 +0.0696727 +0.0696311 +0.069235 +0.0695776 +0.069609 +0.0696737 +0.0693959 +0.0696768 +0.0696693 +0.0696368 +0.0698925 +0.0695491 +0.0697062 +0.0696885 +0.0693844 +0.0697173 +0.0696668 +0.0697874 +0.069375 +0.0696725 +0.0694808 +0.0697897 +0.0693915 +0.0694703 +0.0697585 +0.0696481 +0.069479 +0.069616 +0.0695488 +0.0696242 +0.0695698 +0.0695483 +0.0697167 +0.0697351 +0.0692759 +0.0694316 +0.0698941 +0.0696452 +0.0695268 +0.0696105 +0.0695491 +0.0693881 +0.0695891 +0.0698753 +0.0697031 +0.0696898 +0.0697974 +0.0696432 +0.069498 +0.0693286 +0.0694541 +0.0695552 +0.0694382 +0.0696108 +0.0696058 +0.0695929 +0.069564 +0.0696898 +0.069595 +0.0696045 +0.0696693 +0.0695663 +0.0695876 +0.0694026 +0.0693896 +0.0696842 +0.0695639 +0.0695633 +0.0695992 +0.0693347 +0.069794 +0.0694534 +0.069708 +0.0695781 +0.0695846 +0.0696738 +0.0696616 +0.0695185 +0.0695026 +0.0697466 +0.0698337 +0.0697647 +0.0693626 +0.0698534 +0.0695543 +0.0696537 +0.0696495 +0.0694384 +0.0696997 +0.06989 +0.0698248 +0.06967 +0.0694633 +0.0695016 +0.0696731 +0.069595 +0.0697272 +0.0694042 +0.069531 +0.0696704 +0.0696985 +0.0697009 +0.069594 +0.0698406 +0.0694327 +0.0696653 +0.0696031 +0.0697539 +0.0699423 +0.0695622 +0.0695982 +0.0698077 +0.0697738 +0.0697634 +0.069455 +0.0698197 +0.0693684 +0.0694706 +0.0695125 +0.0696813 +0.0695548 +0.0691924 +0.0698191 +0.0696931 +0.0694222 +0.0697807 +0.0695669 +0.0695214 +0.0698024 +0.0697826 +0.0696656 +0.0696307 +0.0698049 +0.0696545 +0.0694893 +0.0695585 +0.06973 +0.0694441 +0.0693765 +0.0695622 +0.0696149 +0.0696811 +0.0694931 +0.0696507 +0.0694101 +0.06959 +0.0696742 +0.069675 +0.0695288 +0.0695435 +0.0695601 +0.0695293 +0.0695198 +0.0700257 +0.0695414 +0.0693855 +0.0698032 +0.0695083 +0.0696367 +0.0696475 +0.0695441 +0.0693448 +0.0694352 +0.0698318 +0.069697 +0.0695815 +0.0695679 +0.0697177 +0.069641 +0.0695004 +0.0694493 +0.0695593 +0.0698108 +0.0696634 +0.0696317 +0.0696607 +0.0696614 +0.0697056 +0.0695041 +0.0697117 +0.0697442 +0.0697487 +0.069548 +0.0695508 +0.0695358 +0.0696222 +0.0693847 +0.069688 +0.0697617 +0.0697695 +0.0696503 +0.0694258 +0.0696126 +0.0695427 +0.0693108 +0.0696952 +0.0697861 +0.0698627 +0.0696352 +0.0696158 +0.069203 +0.0697621 +0.069613 +0.0696704 +0.0697835 +0.0695701 +0.0695294 +0.0696691 +0.0696285 +0.0695999 +0.0696132 +0.0693237 +0.0695173 +0.0695284 +0.0696273 +0.0696202 +0.0695479 +0.0694802 +0.0696953 +0.0694417 +0.0694052 +0.0697358 +0.0694535 +0.0694141 +0.0695569 +0.0696114 +0.0695166 +0.0693542 +0.0698008 +0.0695648 +0.0694156 +0.0695999 +0.0694449 +0.0697389 +0.0698663 +0.0695497 +0.0694687 +0.0698467 +0.069655 +0.0696017 +0.0694754 +0.0694657 +0.0698471 +0.0699536 +0.0698351 +0.0696653 +0.069604 +0.0696906 +0.0695421 +0.0697886 +0.0693742 +0.0698297 +0.0695495 +0.0695114 +0.0693267 +0.0698307 +0.0693214 +0.069549 +0.0696372 +0.0698281 +0.0695371 +0.0697762 +0.0695326 +0.0693987 +0.0695445 +0.0695316 +0.0696587 +0.0696729 +0.0697795 +0.0697939 +0.0697045 +0.0696671 +0.0697004 +0.0696722 +0.0695533 +0.06961 +0.0693894 +0.0696171 +0.0698609 +0.0694891 +0.0698724 +0.0695123 +0.069622 +0.0695824 +0.0696733 +0.0694818 +0.0695385 +0.0696223 +0.0693888 +0.0696429 +0.0695536 +0.0693013 +0.0698798 +0.069646 +0.0695738 +0.0695424 +0.0696414 +0.0696619 +0.0697213 +0.0697248 +0.0697246 +0.0695121 +0.0695914 +0.0695239 +0.0697516 +0.0696969 +0.0694113 +0.0696418 +0.0695585 +0.0695435 +0.0697931 +0.0696368 +0.0696295 +0.0696519 +0.0697317 +0.0698125 +0.0695128 +0.0698264 +0.0696038 +0.0697004 +0.0693845 +0.0696008 +0.0696017 +0.069548 +0.0694023 +0.0697532 +0.0695674 +0.0695639 +0.0693819 +0.0697321 +0.0692384 +0.0694338 +0.0694012 +0.069698 +0.0697335 +0.0696599 +0.0693923 +0.0697167 +0.0694401 +0.0695153 +0.0697216 +0.0695764 +0.069713 +0.0696755 +0.0693144 +0.069447 +0.0696668 +0.0696619 +0.069437 +0.0695965 +0.0694212 +0.0696472 +0.0698371 +0.0695509 +0.0696021 +0.0697074 +0.0695628 +0.0698141 +0.0695725 +0.0697648 +0.0693993 +0.0696243 +0.0695375 +0.069661 +0.0696293 +0.0696849 +0.0697232 +0.0694181 +0.0695714 +0.0696117 +0.0693544 +0.0695573 +0.0694846 +0.0696616 +0.0696254 +0.0694757 +0.0696963 +0.0695661 +0.0696111 +0.0695943 +0.069644 +0.0693292 +0.0695146 +0.0695481 +0.0696477 +0.0696462 +0.0694687 +0.0694906 +0.0696234 +0.0696589 +0.0695565 +0.0695885 +0.0696848 +0.0694659 +0.0697523 +0.0694516 +0.0697035 +0.0698175 +0.0696843 +0.069647 +0.0697018 +0.0697144 +0.0695064 +0.0695055 +0.0694644 +0.0696261 +0.069851 +0.0696021 +0.0695073 +0.0694318 +0.0697013 +0.069613 +0.0695151 +0.0695713 +0.0696139 +0.069701 +0.0694971 +0.0697744 +0.0697158 +0.0694799 +0.0696324 +0.0694749 +0.0695215 +0.0695307 +0.0698364 +0.0695627 +0.069607 +0.0695839 +0.0693248 +0.069585 +0.0697816 +0.0696454 +0.069972 +0.0696991 +0.0695879 +0.0694834 +0.0697022 +0.0697831 +0.0696624 +0.0697179 +0.0697687 +0.0694561 +0.0693942 +0.0694277 +0.0697083 +0.0696106 +0.0693951 +0.0696593 +0.0694975 +0.0695011 +0.0694349 +0.0696731 +0.0695697 +0.0697136 +0.0694826 +0.0694626 +0.0696499 +0.0697721 +0.0696428 +0.0695542 +0.0697319 +0.0696256 +0.0697252 +0.0693947 +0.0696173 +0.0696029 +0.0696717 +0.0696387 +0.0695405 +0.0694238 +0.0696858 +0.0697268 +0.0697461 +0.0697863 +0.0698681 +0.0696678 +0.0694236 +0.0697361 +0.0695717 +0.0695567 +0.0695822 +0.0696697 +0.069772 +0.0696715 +0.0695192 +0.0696636 +0.0696121 +0.0695893 +0.0696525 +0.0695548 +0.0696395 +0.0695136 +0.0695725 +0.0696845 +0.0694788 +0.0696662 +0.0694662 +0.0697532 +0.0694797 +0.0694676 +0.0696705 +0.0695406 +0.0696657 +0.0697494 +0.0694538 +0.0697197 +0.0695982 +0.069616 +0.0697848 +0.0695557 +0.0695756 +0.0698268 +0.0696838 +0.0698321 +0.0695089 +0.0696473 +0.0696099 +0.0697566 +0.0695147 +0.0696659 +0.0695804 +0.0696081 +0.0697428 +0.0693654 +0.0695928 +0.0693479 +0.0696606 +0.0695212 +0.069609 +0.0696937 +0.0697059 +0.0696164 +0.0695272 +0.0698568 +0.0697771 +0.0695611 +0.0695524 +0.0696283 +0.0697103 +0.0694968 +0.0694859 +0.0697016 +0.0696091 +0.0697108 +0.0695555 +0.0697901 +0.0694503 +0.0697155 +0.0696342 +0.0695089 +0.0696508 +0.0695427 +0.069745 +0.0698271 +0.069494 +0.0696064 +0.0698081 +0.0696529 +0.0696118 +0.0696458 +0.0695027 +0.0694642 +0.0695023 +0.0696012 +0.0697095 +0.0696199 +0.0697729 +0.0696828 +0.0698248 +0.0697412 +0.0696556 +0.069323 +0.06944 +0.0696673 +0.069586 +0.0695754 +0.0695828 +0.0696059 +0.0694803 +0.0696104 +0.069421 +0.0697972 +0.0695752 +0.0695351 +0.0695382 +0.0695824 +0.0695009 +0.0695995 +0.0699573 +0.069538 +0.0693103 +0.0695654 +0.0698168 +0.0697063 +0.0694281 +0.0694694 +0.0697283 +0.0696679 +0.0695393 +0.0699182 +0.0696173 +0.0697856 +0.0696319 +0.069636 +0.0692449 +0.0695639 +0.0698232 +0.0696707 +0.0695353 +0.0695694 +0.0695376 +0.0696014 +0.0698182 +0.0696297 +0.0695532 +0.0698358 +0.0699459 +0.0697251 +0.0693978 +0.0693572 +0.0694373 +0.0695278 +0.0697696 +0.0694807 +0.0698309 +0.0698156 +0.0695992 +0.0696567 +0.0697284 +0.0693603 +0.0697724 +0.0693937 +0.0694269 +0.0695714 +0.0696994 +0.0696697 +0.0697662 +0.0695134 +0.0695709 +0.0693714 +0.0695411 +0.0698338 +0.0693254 +0.0696302 +0.0696504 +0.0696941 +0.0697882 +0.069608 +0.0694077 +0.0697618 +0.0695328 +0.0697124 +0.0695276 +0.0693733 +0.0695488 +0.0699293 +0.0694544 +0.0696095 +0.0695939 +0.0698432 +0.0696919 +0.0694581 +0.0694157 +0.0697952 +0.0694701 +0.0695721 +0.0697556 +0.0696383 +0.0695143 +0.0696006 +0.0695475 +0.0694812 +0.0697901 +0.0698013 +0.0696722 +0.0695478 +0.0694341 +0.0696804 +0.0695216 +0.0696992 +0.0693323 +0.0696734 +0.0694061 +0.0694407 +0.0694364 +0.0695082 +0.0692913 +0.0695885 +0.0694521 +0.0695134 +0.0697848 +0.0695319 +0.0698351 +0.0694766 +0.0695641 +0.0696596 +0.0697735 +0.0695365 +0.0696998 +0.0696832 +0.0696157 +0.0694545 +0.0696124 +0.0695724 +0.0698862 +0.0693873 +0.0696703 +0.0698623 +0.069648 +0.0695803 +0.0697637 +0.0695906 +0.0696241 +0.0695677 +0.0695001 +0.0698526 +0.0697124 +0.0698253 +0.0696603 +0.0694674 +0.0697263 +0.0696484 +0.0696206 +0.0696166 +0.0696481 +0.0698336 +0.0697745 +0.0696398 +0.0698817 +0.0697532 +0.0698499 +0.0697526 +0.0692983 +0.0697655 +0.0696774 +0.0697139 +0.0697691 +0.0697726 +0.0693943 +0.0696483 +0.0696712 +0.0697768 +0.0693702 +0.0693559 +0.0695656 +0.0694091 +0.0693659 +0.0695643 +0.0695382 +0.0697696 +0.069767 +0.069677 +0.0696408 +0.0693513 +0.0696784 +0.0695961 +0.069705 +0.0695284 +0.0694614 +0.0695636 +0.0694846 +0.0696765 +0.0696551 +0.0692965 +0.0695356 +0.0695398 +0.0696255 +0.0694784 +0.0696081 +0.0697992 +0.0696031 +0.0695869 +0.069809 +0.0695395 +0.0697136 +0.0696913 +0.0697825 +0.0699613 +0.0695407 +0.0697574 +0.0695913 +0.0697961 +0.0698358 +0.06957 +0.0697231 +0.0696273 +0.0696867 +0.0696448 +0.0696466 +0.0694162 +0.0694342 +0.0696174 +0.0696403 +0.0694163 +0.0697594 +0.0695424 +0.0693237 +0.0695113 +0.069298 +0.0696333 +0.0696556 +0.0695268 +0.0694426 +0.0694799 +0.0696695 +0.0696445 +0.0694236 +0.0696334 +0.06957 +0.069666 +0.0695275 +0.0695497 +0.0697161 +0.0698189 +0.0696042 +0.069598 +0.069947 +0.0694051 +0.0693638 +0.0694106 +0.0696583 +0.0695635 +0.0694171 +0.0694378 +0.0694957 +0.0696474 +0.0695303 +0.0695815 +0.069841 +0.0697296 +0.0695773 +0.0697484 +0.0693463 +0.0695893 +0.0695969 +0.0695806 +0.069585 +0.0695728 +0.0698126 +0.069573 +0.0694761 +0.0695219 +0.0695213 +0.0694469 +0.0694753 +0.0697327 +0.0697937 +0.0694006 +0.0696834 +0.0695497 +0.0694787 +0.069411 +0.0695193 +0.0695376 +0.0695376 +0.0697753 +0.0698379 +0.0696515 +0.0694833 +0.0696241 +0.069681 +0.0697847 +0.0696728 +0.0693338 +0.0696586 +0.0694961 +0.0697378 +0.0694417 +0.0697155 +0.0696198 +0.0696418 +0.0697451 +0.069739 +0.0697471 +0.0697713 +0.0696748 +0.0696715 +0.0695806 +0.0695464 +0.0695373 +0.0696865 +0.0697613 +0.0697439 +0.0695349 +0.0693326 +0.0695929 +0.0693958 +0.0696367 +0.0697514 +0.0695876 +0.06952 +0.0696155 +0.0694021 +0.0696836 +0.069629 +0.0696965 +0.0696172 +0.0695 +0.0695116 +0.0694653 +0.0693674 +0.0694338 +0.0698585 +0.0694552 +0.0695929 +0.0697165 +0.0693071 +0.0693185 +0.0695866 +0.0697887 +0.0697854 +0.0695704 +0.0696798 +0.0695982 +0.0696577 +0.0694916 +0.0696479 +0.0694579 +0.0698368 +0.069594 +0.0694026 +0.0695914 +0.0694917 +0.0695736 +0.0696504 +0.0694872 +0.0697796 +0.0694135 +0.0694106 +0.0694481 +0.0695549 +0.0696715 +0.0695983 +0.0694529 +0.0696053 +0.0695957 +0.069377 +0.069705 +0.0696247 +0.0697645 +0.0697242 +0.0696482 +0.0695059 +0.0694689 +0.06961 +0.0698769 +0.069686 +0.0700862 +0.0693386 +0.0694775 +0.0697326 +0.0695635 +0.0698032 +0.0695513 +0.0694745 +0.0694862 +0.0696807 +0.0696204 +0.0695613 +0.0696738 +0.0695793 +0.0694656 +0.0695353 +0.0693675 +0.069395 +0.0695692 +0.0693149 +0.0694369 +0.0696765 +0.0697351 +0.0695812 +0.0695759 +0.0694802 +0.0695547 +0.0695561 +0.0695915 +0.069517 +0.0695639 +0.0694384 +0.0696687 +0.0696068 +0.0698511 +0.0694907 +0.0698346 +0.0695884 +0.0698478 +0.0698635 +0.0696975 +0.0696195 +0.0695974 +0.0697357 +0.0697002 +0.0698178 +0.0696633 +0.0697248 +0.0697863 +0.0695253 +0.069606 +0.0695946 +0.0693833 +0.0695796 +0.0696515 +0.0697402 +0.0695667 +0.0697314 +0.0696784 +0.0693211 +0.0696363 +0.0696517 +0.0699481 +0.0694147 +0.0695666 +0.0696094 +0.0694288 +0.0697435 +0.0696762 +0.0698939 +0.0696758 +0.0697586 +0.0700153 +0.0695381 +0.0693015 +0.0695651 +0.06944 +0.0694412 +0.0697756 +0.0697554 +0.069687 +0.0694677 +0.0695991 +0.0696003 +0.0696932 +0.0695589 +0.0697827 +0.0695814 +0.0697074 +0.0694756 +0.0696453 +0.0696128 +0.0692521 +0.0695944 +0.0693502 +0.0694451 +0.0697407 +0.0694363 +0.0697694 +0.0696239 +0.0695846 +0.069773 +0.0696819 +0.0695889 +0.0691659 +0.0696855 +0.0697316 +0.0696831 +0.0694717 +0.0695963 +0.0694643 +0.0698201 +0.0696045 +0.069579 +0.0694 +0.0694679 +0.0695746 +0.0696408 +0.0696647 +0.0698654 +0.0696149 +0.0696444 +0.069674 +0.0694928 +0.069721 +0.0696949 +0.0697717 +0.0696615 +0.0694652 +0.0695833 +0.069776 +0.0693619 +0.0697076 +0.069566 +0.0696977 +0.0694331 +0.0694384 +0.0695022 +0.0697085 +0.0695904 +0.0698238 +0.0694541 +0.069561 +0.0696085 +0.0698143 +0.0697407 +0.0696751 +0.0696179 +0.069513 +0.0696119 +0.0697489 +0.069431 +0.0695495 +0.0696398 +0.0697944 +0.0696687 +0.069537 +0.0693988 +0.0693997 +0.0696011 +0.0694262 +0.0695349 +0.069543 +0.069819 +0.0696442 +0.0694947 +0.0697637 +0.069609 +0.0693811 +0.069504 +0.0695296 +0.0694943 +0.0698199 +0.0697597 +0.0695174 +0.0698305 +0.0698159 +0.0695486 +0.0698822 +0.0696237 +0.0696987 +0.0699319 +0.0696335 +0.0694408 +0.069742 +0.0695004 +0.0694023 +0.069511 +0.0695643 +0.0697418 +0.0694029 +0.0695819 +0.0695939 +0.0693505 +0.0696806 +0.0698141 +0.0696331 +0.0697193 +0.0697985 +0.0695069 +0.069861 +0.0693147 +0.0696355 +0.069523 +0.0696138 +0.0696471 +0.0695797 +0.069542 +0.0698275 +0.0694177 +0.0696183 +0.0695242 +0.0696554 +0.069649 +0.0696697 +0.0696556 +0.0696639 +0.0696717 +0.0694584 +0.0693702 +0.069541 +0.0695833 +0.0695398 +0.0695311 +0.0694652 +0.0696429 +0.0695692 +0.0696585 +0.069595 +0.0697469 +0.0697325 +0.0693153 +0.0696789 +0.0695685 +0.0695495 +0.0696112 +0.0695671 +0.0694951 +0.0695823 +0.0695682 +0.0692953 +0.0695466 +0.0695475 +0.0696863 +0.0695424 +0.0696188 +0.0695408 +0.0696765 +0.0696265 +0.0693778 +0.0696835 +0.0698295 +0.0695974 +0.069762 +0.069576 +0.069422 +0.0695695 +0.0698362 +0.0694777 +0.0695508 +0.0697271 +0.0696672 +0.0697792 +0.0698809 +0.069729 +0.0696805 +0.0694534 +0.0697854 +0.0696124 +0.0694496 +0.06955 +0.069459 +0.0695253 +0.0693996 +0.0696472 +0.0693289 +0.0695661 +0.0697414 +0.0698478 +0.0694591 +0.0696124 +0.0695823 +0.0695502 +0.0696731 +0.0695876 +0.069788 +0.0695868 +0.0697132 +0.0694171 +0.0698391 +0.0697497 +0.0696859 +0.0696377 +0.069449 +0.069667 +0.069536 +0.0699445 +0.0697612 +0.069594 +0.0699474 +0.0696038 +0.0695878 +0.0694333 +0.0699081 +0.0695285 +0.0697558 +0.0694336 +0.0696307 +0.0698097 +0.0697855 +0.0695116 +0.0697211 +0.069743 +0.0693914 +0.0695031 +0.0694923 +0.0698849 +0.0695649 +0.0696322 +0.0698555 +0.0694805 +0.0695315 +0.0694895 +0.0694532 +0.0697494 +0.0697798 +0.0695584 +0.0695896 +0.0695582 +0.0692194 +0.0698185 +0.0697637 +0.0693799 +0.0697028 +0.0695743 +0.0694464 +0.0696343 +0.0697833 +0.0696403 +0.0699233 +0.0699104 +0.0694751 +0.0696007 +0.0697991 +0.0697769 +0.0698442 +0.0697976 +0.0697299 +0.0698246 +0.0696544 +0.0698686 +0.0695434 +0.0694166 +0.0695875 +0.0698485 +0.0696122 +0.06968 +0.0695468 +0.0694513 +0.0697213 +0.0697796 +0.0693841 +0.0696363 +0.0696685 +0.0698284 +0.0695528 +0.0694986 +0.0696505 +0.069544 +0.0696713 +0.0696151 +0.0694941 +0.0698012 +0.0694476 +0.0697109 +0.0694247 +0.0694375 +0.0697472 +0.0694352 +0.0696255 +0.0697181 +0.0694055 +0.0694574 +0.0696593 +0.0697037 +0.0695379 +0.0695513 +0.069727 +0.069503 +0.0696663 +0.0695588 +0.069529 +0.0698074 +0.0697068 +0.0696165 +0.0697544 +0.0695263 +0.0696866 +0.0696855 +0.0697355 +0.0698415 +0.0696154 +0.0694414 +0.0696516 +0.0697806 +0.0693153 +0.0695144 +0.0695799 +0.0694774 +0.0698475 +0.0696382 +0.0695227 +0.0695614 +0.0697253 +0.0696398 +0.0694637 +0.0697704 +0.0696556 +0.0697801 +0.0694329 +0.0698127 +0.0695971 +0.0699755 +0.0697162 +0.0698785 +0.0695069 +0.0696096 +0.0697832 +0.0698533 +0.0695814 +0.0694406 +0.0697243 +0.0696738 +0.0694621 +0.0693751 +0.0696809 +0.0693754 +0.0694736 +0.0697464 +0.0695127 +0.0694567 +0.0695898 +0.0697021 +0.0696679 +0.0696161 +0.0696151 +0.0696945 +0.0695109 +0.0697068 +0.0697772 +0.0693529 +0.0697495 +0.0696347 +0.0698084 +0.0697415 +0.0697033 +0.0696572 +0.0695302 +0.0697684 +0.0696971 +0.0695431 +0.0696393 +0.0695158 +0.0698053 +0.0696579 +0.0696408 +0.0695948 +0.0695116 +0.0697408 +0.0698208 +0.0693154 +0.0696918 +0.0695513 +0.0697703 +0.0692828 +0.0695935 +0.069821 +0.069757 +0.0693397 +0.0696055 +0.0696906 +0.0695204 +0.069786 +0.069368 +0.0698776 +0.0695637 +0.069673 +0.0694724 +0.0695355 +0.0696012 +0.0696256 +0.0697552 +0.069695 +0.0697776 +0.0695981 +0.0698099 +0.0693746 +0.0695019 +0.0695563 +0.0694796 +0.0697288 +0.069412 +0.0698047 +0.0694944 +0.0697431 +0.0694176 +0.0695194 +0.0695096 +0.0698199 +0.0694212 +0.0696715 +0.0696189 +0.0696386 +0.069581 +0.0694605 +0.069638 +0.0695914 +0.0695113 +0.0694423 +0.0694325 +0.0696085 +0.0695913 +0.0695339 +0.0697462 +0.0694486 +0.0696524 +0.0696909 +0.0696266 +0.0695906 +0.0695355 +0.0696929 +0.0698299 +0.0692481 +0.0696184 +0.0694388 +0.0696218 +0.0695771 +0.0696528 +0.0695612 +0.0694572 +0.069463 +0.0695106 +0.0695068 +0.0695155 +0.0695613 +0.0695606 +0.0694735 +0.0694211 +0.0698376 +0.0697442 +0.0696918 +0.0696209 +0.0697246 +0.0697685 +0.069767 +0.0695453 +0.0698456 +0.0696181 +0.0695229 +0.0696417 +0.0696377 +0.0695034 +0.0695747 +0.069532 +0.0694737 +0.0696591 +0.069807 +0.0695807 +0.0693414 +0.0697853 +0.0697045 +0.0696755 +0.0697415 +0.0698979 +0.0696379 +0.0697134 +0.0696573 +0.0697104 +0.0697189 +0.0695458 +0.0696776 +0.0695484 +0.0696533 +0.0697884 +0.0699735 diff --git a/2011/borsanyi/data.2 b/2011/borsanyi/data.2 new file mode 100644 index 000000000..542a57dc0 --- /dev/null +++ b/2011/borsanyi/data.2 @@ -0,0 +1,100 @@ +-0.692307692307693 +-0.653846153846154 +-0.846153846153846 +-1.07692307692308 +-0.269230769230769 +-0.461538461538462 +-0.923076923076923 +-0.692307692307691 +-0.0769230769230778 +-1.23076923076923 +-1.23076923076923 +-0.23076923076923 +0.923076923076923 +0.653846153846153 +0.384615384615385 +-0.576923076923077 +-0.5 +0.153846153846154 +-2.23076923076923 +-0.846153846153846 +0.846153846153846 +-0.576923076923077 +0.423076923076922 +-0.346153846153847 +-1.42307692307692 +0.807692307692307 +-0.0384615384615377 +0.346153846153847 +-1.15384615384615 +-1.57692307692308 +-0.0384615384615383 +-0.576923076923078 +-0.384615384615385 +-0.76923076923077 +-0.538461538461539 +-0.269230769230769 +8.32667268468867e-16 +-0.692307692307693 +-1.69230769230769 +0.615384615384616 +-3.33066907387547e-16 +-1.61538461538462 +-0.269230769230769 +-1.03846153846154 +-0.884615384615383 +-1.38461538461538 +0.26923076923077 +-8.88178419700125e-16 +-0.0769230769230773 +-0.769230769230769 +0.769230769230768 +-1.23076923076923 +-0.0384615384615387 +-0.153846153846155 +0.115384615384616 +0.73076923076923 +-0.923076923076923 +-0.384615384615384 +-0.461538461538461 +-0.807692307692307 +-0.653846153846154 +0.384615384615385 +-0.692307692307691 +-1.80769230769231 +-0.653846153846154 +-0.384615384615386 +-1.46153846153846 +-0.846153846153845 +-0.653846153846154 +0.0384615384615383 +-1.46153846153846 +-0.846153846153845 +-2.23076923076923 +-1.50573997714787e-15 +0.500000000000001 +-1.11538461538462 +0.153846153846154 +-0.615384615384615 +1.38461538461538 +-0.307692307692308 +-0.461538461538462 +0.230769230769231 +-0.423076923076923 +-1.84615384615385 +0.576923076923077 +-1.34615384615385 +-0.730769230769229 +-1.19230769230769 +0.615384615384616 +-0.730769230769231 +-0.961538461538462 +-0.961538461538461 +0.307692307692308 +0.0769230769230764 +-0.192307692307693 +-0.384615384615386 +-1.61538461538462 +0.153846153846154 +-1.23076923076923 +-0.538461538461537 diff --git a/2011/borsanyi/data.3 b/2011/borsanyi/data.3 new file mode 100644 index 000000000..e9b925f27 --- /dev/null +++ b/2011/borsanyi/data.3 @@ -0,0 +1,100 @@ + 120 + 109 + 115 + 122 + 97 + 118 + 98 + 103 + 116 + 100 + 117 + 116 + 110 + 114 + 103 + 114 + 105 + 112 + 97 + 101 + 101 + 100 + 121 + 108 + 121 + 112 + 113 + 97 + 99 + 121 + 116 + 115 + 110 + 116 + 110 + 104 + 113 + 106 + 101 + 104 + 106 + 98 + 111 + 105 + 120 + 121 + 106 + 119 + 116 + 106 + 113 + 108 + 121 + 118 + 108 + 101 + 98 + 101 + 121 + 97 + 105 + 121 + 120 + 108 + 118 + 116 + 111 + 112 + 105 + 109 + 112 + 107 + 113 + 110 + 122 + 122 + 105 + 97 + 117 + 101 + 120 + 103 + 99 + 105 + 112 + 105 + 118 + 99 + 120 + 108 + 115 + 121 + 122 + 109 + 98 + 103 + 106 + 114 + 121 + 117 diff --git a/2011/borsanyi/hint.html b/2011/borsanyi/hint.html new file mode 100644 index 000000000..808ea4dd9 --- /dev/null +++ b/2011/borsanyi/hint.html @@ -0,0 +1,114 @@ + + + + + + + Best data utility + + +

Best data utility

+ +

Szabolcs Borsanyi
+Theoretische Physik
+Gaussstraße 20
+42097 Wuppertal
+Germany
+borsanyi@uni-wuppertal.de

+ +

Judges' comments:

+ +

To build:

+ +
make borsanyi
+
+ +

To run:

+ +
./borsanyi < some_data_file
+
+ +

Try:

+ +
./borsanyi < data.1
+./borsanyi < data.2
+./borsanyi < data.3
+
+ +

Selected Judges Remarks:

+ +

This is a nice quick histogram plotter. A useful utility when you need to +look at the distribution of some data.

+ +

Here are some challenges:

+ +

You can modify the number of histogram bins and the scaling of the histogram +by editing the source. Try to find them!

+ +

If you look at the source you will notice that the usual array of +histogram bins is missing. The source contains no arrays and it does not +use malloc or alloca. How does it build the histogram?

+ +

While the input does not need to be sorted, the histogram output is sorted. +How does it put the data into buckets? Why does it fork 22 times?

+ +

Author’s comments:

+ +

This small piece of program is meant to be a useful tool, when +there are some data around and you need a quick glance at the +histogram. I am all too often logged in to a remote machine with +slow X connection, and a terminal-based program would be of +great help.

+ +

Limitations:

+ +
    +
  • I optimized the output for the data I had around, you might want to adjust +for your needs. For a great excess of data points the program will crash +(depending on the available stack).
  • +
  • Giving too few (distinct) points can also cause crash (or division by zero).
  • +
  • The program expects plain numbers separated by white spaces.
  • +
  • ASCII is assumed.
  • +
  • Some POSIX-like system is assumed (fork and wait(NULL) are used)
  • +
  • Do not give any arguments to the program.
  • +
  • Could rounding errors cause the omission of the highest bin? There might be +empty bins at the edges.
  • +
+ + +

Obfuscation:

+ +
    +
  • The program follows a rather unconventional approach to the task +of histogram building. The usual array of integers (for the histogram +bins) is missing entirely. The data are read once, the range is determined, +but the data points are not put in any array. Yet they are remembered, +and each of them is put into its own bin afterwards. But where are the bins?
  • +
  • I tried to use as few keywords as possible, hence there are no loops.
  • +
  • Multi-process approach for optimal use of resources.
  • +
  • Some bin size obfuscation.
  • +
+ + +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2012, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2011/borsanyi/hint.text b/2011/borsanyi/hint.text new file mode 100644 index 000000000..54f900ae6 --- /dev/null +++ b/2011/borsanyi/hint.text @@ -0,0 +1,81 @@ +# Best data utility + +Szabolcs Borsanyi +Theoretische Physik +Gaussstraße 20 +42097 Wuppertal +Germany + + + +## Judges' comments: +### To build: + + make borsanyi + +### To run: + + ./borsanyi < some_data_file + +### Try: + + ./borsanyi < data.1 + ./borsanyi < data.2 + ./borsanyi < data.3 + +### Selected Judges Remarks: + +This is a nice quick histogram plotter. A useful utility when you need to +look at the distribution of some data. + +Here are some challenges: + +You can modify the number of histogram bins and the scaling of the histogram +by editing the source. Try to find them! + +If you look at the source you will notice that the usual array of +histogram bins is missing. The source contains no arrays and it does not +use malloc or alloca. How does it build the histogram? + +While the input does not need to be sorted, the histogram output is sorted. +How does it put the data into buckets? Why does it fork 22 times? + +## Author's comments: +This small piece of program is meant to be a useful tool, when +there are some data around and you need a quick glance at the +histogram. I am all too often logged in to a remote machine with +slow X connection, and a terminal-based program would be of +great help. + +# Limitations: + +* I optimized the output for the data I had around, you might want to adjust + for your needs. For a great excess of data points the program will crash + (depending on the available stack). +* Giving too few (distinct) points can also cause crash (or division by zero). +* The program expects plain numbers separated by white spaces. +* ASCII is assumed. +* Some POSIX-like system is assumed (fork and wait(NULL) are used) +* Do not give any arguments to the program. +* Could rounding errors cause the omission of the highest bin? There might be + empty bins at the edges. + +# Obfuscation: + +* The program follows a rather unconventional approach to the task + of histogram building. The usual array of integers (for the histogram + bins) is missing entirely. The data are read once, the range is determined, + but the data points are not put in any array. Yet they are remembered, + and each of them is put into its own bin afterwards. But where are the bins? +* I tried to use as few keywords as possible, hence there are no loops. +* Multi-process approach for optimal use of resources. +* Some bin size obfuscation. + +-------------------------------------------------------------------------------- + diff --git a/2011/dlowe/Makefile b/2011/dlowe/Makefile new file mode 100644 index 000000000..d202576bc --- /dev/null +++ b/2011/dlowe/Makefile @@ -0,0 +1,127 @@ +#!/usr/bin/env make +# +# 2011 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Compiler warnings +# +CWARN= -Wall -W + +# compiler standard +# +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness, +# other entries require 64-bitess. +# By default we assume nothing. +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +OPT= -O2 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} -lm -D_BSD_SOURCE + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= dlowe +DATA= earlystop.pl + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} + +# alternative executable +# +alt: + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o + +clobber: clean + ${RM} -f ${ENTRY} + +nuke: clobber + @echo gnab gib! + +install: + @echo "Surely you're joking Mr. Feynman!" + +# backwards compatibility +# +build: all + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to partly misunderstand this final echo. + @${TRUE} diff --git a/2011/dlowe/dlowe-aux-data.tar.bz2 b/2011/dlowe/dlowe-aux-data.tar.bz2 new file mode 100644 index 000000000..3d2cff060 Binary files /dev/null and b/2011/dlowe/dlowe-aux-data.tar.bz2 differ diff --git a/2011/dlowe/dlowe.c b/2011/dlowe/dlowe.c new file mode 100644 index 000000000..1e4301ea9 --- /dev/null +++ b/2011/dlowe/dlowe.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include +#include +#include +#define _ float + + _ CRUSH(_*LEG,int ARM,_*FINGER) { + _ GORE; for(GORE=0,--ARM; ARM>=0; --ARM)GORE+=FINGER[ARM]*ARM + [LEG]; return GORE; } _*BITE(){ _*BRAIN=calloc(sizeof(_),1<<17);int TOE + =getc(stdin),EYE,SKULL=0; while((EYE=getc(stdin))!=EOF){ ++BRAIN[(TOE<<8) + + EYE]; ++SKULL; TOE=EYE; } if(SKULL)for(TOE=0; TOE<8<<13; ++ TOE)BRAIN [TOE]/= + SKULL; return BRAIN; } _ CHEW(_*GUT,_ BONE[][1<<16]){ int GRR; for(GRR=0; GRR< + 6; ++GRR){ GUT[GRR+256*256]=powf(1+expf(-CRUSH(BONE[GRR],1<<16,GUT)),-1); BONE + [6][50+GRR]=GUT[256*256+GRR]*(1.-GUT[(8<<13)+GRR]); } BONE[6][81]=1/(1 +expf(- + CRUSH(GUT+(1<<16),6,BONE[6]))); return BONE[6][82]=BONE[6][81]*(1.-BONE[6][81] + ),BONE[6][81]; } _ GNAW(_ FLESH,_ LEG[][2<<15],_*EYE){ int UG,MMM; LEG[6][13]= + FLESH-CHEW(EYE,LEG); LEG[6][14]=LEG[6][ 82]*LEG[6][13]; for(UG=0; UG<6; ++UG){ + LEG[6][34]=LEG[6][UG+(1<<7)-14]*LEG[6][7<<1]*LEG[6][UG]; for(MMM=0; MMM<4<<14; + ++MMM)LEG [UG][MMM]+=LEG[6][34]*.3*EYE[MMM]; LEG[6][UG]+=.3*LEG[6][14 + ]*EYE[ 256*256+UG]; } return powf(LEG[6] [13],2); } _ + **EAT( char*TOMB){ DIR*BONE = opendir( TOMB); int + BRAIN= 0; struct dirent*TOOTH; _**BODY =0; while + (BONE?(TOOTH= readdir(BONE)):0){ if( TOOTH-> d_name[0] + !=46){ char*MOAN=malloc(strlen(TOMB)+strlen(TOOTH->d_name )+1); sprintf( + MOAN, "%s%s",TOMB,TOOTH ->d_name); if(freopen(MOAN, "r",stdin)){ BODY=realloc( + BODY,sizeof(_*)*(BRAIN+1)); BRAIN ++ [BODY]=BITE(); } } } return BODY=realloc( + BODY,(1+BRAIN)*sizeof(_*)),BODY[BRAIN]=0,BODY; } int main(int GRR,char **UGH){ + _ BRAINS[7][1<<16],***CORPSES; int PUS,OOZE,UG; for(srand(time(0)),PUS=0; PUS< + 7; ++PUS)for(OOZE=0; OOZE<4<<14; ++OOZE)BRAINS[PUS][OOZE]=rand()/(_)RAND_MAX + -.5;fread(BRAINS,sizeof(BRAINS),1,stdin); if(*UGH[1]==45){ GRR-=2; CORPSES + =malloc( sizeof(_ + **)*GRR ); for( + PUS=0; PUS< + GRR; ++ PUS)CORPSES[PUS]=EAT(UGH[2+PUS]); for(UG= + 0; UG \n" +} + +my ($net, $train1, $train0, $test1, $test0) = @ARGV[0..4]; +my $error = undef; +my $n = 1; + +open TOUCH, '>', $net; +close TOUCH; + +while (1) { + print "training $n to " . ($n+1000) . "...\n"; + system "./dlowe -1000 $train1 $train0 < $net > $net.tmp 2>/dev/null"; + rename "$net.tmp", $net; + + my $current_error = 0; + for my $r (split /\s+/, `./dlowe $test1* < $net 2>&1 | awk '{print \$NF}'`) { + $current_error += ((1.0 - $r) ** 2); + } + for my $r (split /\s+/, `./dlowe $test0* < $net 2>&1 | awk '{print \$NF}'`) { + $current_error += ((0.0 - $r) ** 2); + } + if (defined $error) { + print "prior error = $error; current error = $current_error\n"; + if ($error - $current_error < 0.01) { + last; + } + } + $error = $current_error; + $n += 1000; +} diff --git a/2011/dlowe/hint.html b/2011/dlowe/hint.html new file mode 100644 index 000000000..3a2546bd4 --- /dev/null +++ b/2011/dlowe/hint.html @@ -0,0 +1,336 @@ + + + + + + + Most self deprecating + + +

Most self deprecating

+ +

David Lowe
+434 Tenney Drive
+Rogue River, OR
+97537
+j.david.lowe@gmail.com
+http://www.pootpoot.net/

+ +

Judges' comments:

+ +

To build:

+ +
make dlowe
+
+ +

To run:

+ +
./dlowe -<n_iterations> corpus1/ [...] corpus0/ < start.net > end.net
+
+NOTE: The directory entries MUST end in a /
+
+./dlowe file [file ...] < trained.net
+
+ +

Try:

+ +
Download the dlowe-aux-data.tar.bz2 file from:
+
+    curl -O http://www.ioccc.org/2011/dlowe/dlowe-aux-data.tar.bz2
+
+tar -jxf dlowe-aux-data.tar.bz2
+
+./dlowe dlowe.c < ioccc-winlose-trained.net
+./dlowe dlowe < ioccc-winlose-trained.net
+
+./dlowe xor-0/00 < xor-trained.net
+./dlowe xor-0/11 < xor-trained.net
+./dlowe xor-1/01 < xor-trained.net
+./dlowe xor-1/10 < xor-trained.net
+
+./dlowe hint.html < english-trained.net
+
+./dlowe dlowe-aux-data.tar.bz2 < png-trained.net
+
+ +

Selected Judges Remarks:

+ +

This entry is a ghoulish example of a brain (dead?) neural network classifier. +It comes with a set of corpora for you to try.

+ +

ioccc-winlose-trained.net

+ +

You can create your own trained networks. For example, we trained a network +on the C code of entries that were supplied to the 20Th IOCCC.

+ +

The ioccc-winlose-trained.net was trained using the earlystop.pl tool:

+ +
rm -f ioccc-winlose-trained.net
+./earlystop.pl ioccc-winlose-trained.net ioccc_won_training/ ioccc_lost_training/ ioccc_won_test/ ioccc_lost_test/
+
+ +

where:

+ +
ioccc_won_training/
+    1/2 of C code of the 20th IOCCC winners (except for dlowe.c from 2011)
+plus 1/2 of the C code winners from prior IOCCC contests
+
+ioccc_won_test/
+    1/2 of C code of the 20th IOCCC winners (except for dlowe.c from 2011)
+plus 1/2 of the C code winners from prior IOCCC contests
+
+ioccc_lost_training/
+1/2 of C code from entries that that did not win
+
+ioccc_lost_test/
+1/2 of C code from entries that that did not win
+
+NOTE: The above directies were not shipped and the C code from
+      entries that that did not win was flushed to /dev/null.
+
+ +

The earlystop.pl tool wrote:

+ +
training 1 to 1001...
+training 1001 to 2001...
+prior error = 56.746974766043; current error = 58.095691135305
+
+ +

The resulting ioccc-winlose-trained.net file was included in the +dlowe-aux-data.tar.bz2 file in the above mentioned URL.

+ +

The dlowe.c was explicitly excluded from this trailing set. So this test is interesting:

+ +
./dlowe dlowe.c < ioccc-winlose-trained.net
+
+ +

The match of dlowe.c to the lose/win trailed network was:

+ +
dlowe.c 0.125108
+
+ +

NOTE: The non-artificially intelligent decisions of the IOCCC judges include random + quirks and their non-linear judgment calls not found in the ioccc trained network. + Just because C code is or isn’t scored highly by this network does not + mean it will win or lose a future IOCCC. On the other hand … it just might!

+ +

other data sets to try

+ +

While we cannot supply you with the losing IOCCC source code, the author did supply a number +data sets on which to test:

+ +

We created the english-trained.net as follows:

+ +
./dlowe -8000 english-1/ english-0/ < /dev/null > english-trained.net
+
+english-0/
+    Non-English (French) text
+english-1/
+    English (non-French) text
+
+ +

We created the png-trained.net as follows:

+ +
./dlowe -8000 png-1/ png-0/ < /dev/null > png-trained.net
+
+png-0/
+    Non-png (gif) images
+png-1/
+    png (non-gif) images
+
+ +

We created the xor-trained.net as follows:

+ +
./dlowe -8000 xor-1/ xor-0/ < /dev/null > xor-trained.net
+
+xor-0/
+    Data that XORs to 0
+xor-1/
+    Data that XORs to 1
+
+ +

Author’s comments:

+ +

Synopsis:

+ +

This is an artificially intelligent judging tool to help the IOCCC judges. +Here’s to shorter, more frequent contests!

+ +

Description:

+ +

This is a multilayer perceptron (a feedforward artificial neural network) +which can be trained, using on-line backpropagation, to classify input files.

+ +

It has a fixed topology of 216 input neurons, 6 hidden neurons and 1 output +neuron.

+ +

The neurons' activation function is the logistic function 1 / (1 + e ^ -x).

+ +

Classifying

+ +
./dlowe file [file ...] < trained.net
+
+ +

To classify files, one specifies a trained network (on stdin) and one or more +files to classify. The program will output one line per successfully-classified +file to stderr, with the filename and the classification: a number between 0 +and 1.

+ +

The interpretation of the classification number depends on how the network was +trained, but it’s geared toward interpretation as a probability or a +confidence.

+ +

Training

+ +
./dlowe -<n_iterations> corpus1/ [...] corpus0/ < start.net > end.net
+
+NOTE: The directory args must end in a / for them to work.
+
+ +

To train a network, one specifies a starting network (on stdin), two or more +corpora (directories containing training data), and the number of training +iterations to run. The program will write some progress data to stderr and, +when it’s done, will serialize the updated network to stdout.

+ +

If no input network is given, a random new network will be generated as a +starting point (i.e. provide an empty stdin).

+ +

The first corpus will be assigned a target value of 1. The last will be +assigned a target value of 0. Intervening directories (if any) will be assigned +intermediate target values.

+ +

The learning rate is hard-coded as 0.3. No momentum factor is used.

+ +

png corpora

+ +

The png-1 corpus was obtained by manually scraping the first results from an +https://images.google.com search for “obfuscate filetype:png”.

+ +

The png-0 corpus was obtained by manually scraping the first results from an +https://images.google.com search for “obfuscate filetype:gif”.

+ +

Results:

+ +
    +
  • using these corpora as a training set
  • +
  • using several hundred random .gif and .png files from my home computer as +a test set
  • +
  • using the included “earlystop.pl” script, which stopped after 67000 iterations.
  • +
  • interpreting output of “> 0.5” as “probably a .png” and “< 0.5” as “probably +a .gif”
  • +
  • produced a network with about 87% accuracy
  • +
+ + +

english corpora

+ +

The english-1 corpus was obtained by manually scraping the first results from +a https://www.google.com/webhp?lr=lang_en search for “paris filetype:txt”.

+ +

The english-0 corpus was obtained by manually scraping the first results from +a https://www.google.com/webhp?lr=lang_fr search for “paris filetype:txt”.

+ +

Results:

+ +
    +
  • using these corpora as a training set
  • +
  • using several dozen additional text files (obtained by the same methods) +as a test set
  • +
  • using the included “earlystop.pl” script, which stopped after 10000 +iterations.
  • +
  • interpreting output of “> 0.5” as “probably english” and “< 0.5” as +“probably french”
  • +
  • produced a network with 100% accuracy
  • +
+ + +

xor corpora

+ +

The xor-1 corpus consists of two files containing ‘01’ and ‘10’ respectively.

+ +

The xor-0 corpus consists of two files containing ‘00’ and ‘11’ respectively.

+ +

Results:

+ +
    +
  • using these corpora as a training set
  • +
  • takes about 8000 iterations to learn xor to within a tolerance of <0.01
  • +
+ + +

Limitations

+ +

The program can’t tell you anything meaningful about files with less than two +bytes in them (I’m looking at you, smr.c!)

+ +

You must include the trailing directory separator on training directories +(this allows the program to be portable without wasting precious bytes on +figuring out how to concatenate directory and file names…)

+ +

Serialized network files are only portable between systems with the same +floating-point representation and endianness.

+ +

Making sure not to overfit the network to the training data is a bit of a +black art. I have enclosed ‘earlystop.pl’, a wrapper script that implements +a simple ‘early stopping’ algorithm; other techniques are possible.

+ +

Bad input (e.g. nonexistent files, non-numeric number of iterations, etc.) +tends to result in empty output.

+ +

Given exactly one corpus, the program will crash or produce garbage.

+ +

Leaks memory and file descriptors while processing files.

+ +

Will crash and die horribly if it runs out of memory.

+ +

The Microsoft C compiler doesn’t provide a dirent API, so to get this working +on a Windows system you’ll need cygwin+gcc (tested) or a dirent compatibility +library (untested, but they do exist).

+ +

Backpropagation doesn’t always converge: if you play with this long enough, +you’ll eventually have a training session that completely fails to converge.

+ +

Obfuscation:

+ +

Zombies! (Since neural networks are modeled after BRAINS, ya know? And +corpus sounds a lot like corpse. And I have 4- and 7-year-old kids ;)

+ +

Neural networks are interesting, and while the math isn’t terribly difficult, +their behavior is difficult to fully understand.

+ +

Had some extra space in one of the major data structures, and it seemed a +shame to waste it.

+ +

Similarly, I think three file pointers ought to be enough for anyone.

+ +

Lots of magic numbers expressed in various ways.

+ +

Random abuse of random C trivia.

+ +

Some textual changes were made to maximize the classification of this program +by a network trained to recognize ioccc winners ;)

+ +

… but mostly zombies!

+ +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2012, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2011/dlowe/hint.text b/2011/dlowe/hint.text new file mode 100644 index 000000000..5dcba276b --- /dev/null +++ b/2011/dlowe/hint.text @@ -0,0 +1,287 @@ +# Most self deprecating + +David Lowe +434 Tenney Drive +Rogue River, OR +97537 + + + + +## Judges' comments: +### To build: + + make dlowe + +### To run: + + ./dlowe - corpus1/ [...] corpus0/ < start.net > end.net + + NOTE: The directory entries MUST end in a / + + ./dlowe file [file ...] < trained.net + +### Try: + + Download the dlowe-aux-data.tar.bz2 file from: + + curl -O http://www.ioccc.org/2011/dlowe/dlowe-aux-data.tar.bz2 + + tar -jxf dlowe-aux-data.tar.bz2 + + ./dlowe dlowe.c < ioccc-winlose-trained.net + ./dlowe dlowe < ioccc-winlose-trained.net + + ./dlowe xor-0/00 < xor-trained.net + ./dlowe xor-0/11 < xor-trained.net + ./dlowe xor-1/01 < xor-trained.net + ./dlowe xor-1/10 < xor-trained.net + + ./dlowe hint.html < english-trained.net + + ./dlowe dlowe-aux-data.tar.bz2 < png-trained.net + +### Selected Judges Remarks: + +This entry is a ghoulish example of a brain (dead?) neural network classifier. +It comes with a set of corpora for you to try. + +#### ioccc-winlose-trained.net + +You can create your own trained networks. For example, we trained a network +on the C code of entries that were supplied to the 20Th IOCCC. + +The ioccc-winlose-trained.net was trained using the earlystop.pl tool: + + rm -f ioccc-winlose-trained.net + ./earlystop.pl ioccc-winlose-trained.net ioccc_won_training/ ioccc_lost_training/ ioccc_won_test/ ioccc_lost_test/ + +where: + + ioccc_won_training/ + 1/2 of C code of the 20th IOCCC winners (except for dlowe.c from 2011) + plus 1/2 of the C code winners from prior IOCCC contests + + ioccc_won_test/ + 1/2 of C code of the 20th IOCCC winners (except for dlowe.c from 2011) + plus 1/2 of the C code winners from prior IOCCC contests + + ioccc_lost_training/ + 1/2 of C code from entries that that did not win + + ioccc_lost_test/ + 1/2 of C code from entries that that did not win + + NOTE: The above directies were not shipped and the C code from + entries that that did not win was flushed to /dev/null. + +The earlystop.pl tool wrote: + + training 1 to 1001... + training 1001 to 2001... + prior error = 56.746974766043; current error = 58.095691135305 + +The resulting ioccc-winlose-trained.net file was included in the +dlowe-aux-data.tar.bz2 file in the above mentioned URL. + +The dlowe.c was explicitly excluded from this trailing set. So this test is interesting: + + ./dlowe dlowe.c < ioccc-winlose-trained.net + +The match of dlowe.c to the lose/win trailed network was: + + dlowe.c 0.125108 + +NOTE: The non-artificially intelligent decisions of the IOCCC judges include random + quirks and their non-linear judgment calls not found in the ioccc trained network. + Just because C code is or isn't scored highly by this network does not + mean it will win or lose a future IOCCC. On the other hand ... it just might! + +#### other data sets to try + +While we cannot supply you with the losing IOCCC source code, the author did supply a number +data sets on which to test: + +We created the english-trained.net as follows: + + ./dlowe -8000 english-1/ english-0/ < /dev/null > english-trained.net + + english-0/ + Non-English (French) text + english-1/ + English (non-French) text + +We created the png-trained.net as follows: + + ./dlowe -8000 png-1/ png-0/ < /dev/null > png-trained.net + + png-0/ + Non-png (gif) images + png-1/ + png (non-gif) images + +We created the xor-trained.net as follows: + + ./dlowe -8000 xor-1/ xor-0/ < /dev/null > xor-trained.net + + xor-0/ + Data that XORs to 0 + xor-1/ + Data that XORs to 1 + +## Author's comments: +# Synopsis: +This is an artificially intelligent judging tool to help the IOCCC judges. +Here's to shorter, more frequent contests! + +# Description: +This is a multilayer perceptron (a feedforward artificial neural network) +which can be trained, using on-line backpropagation, to classify input files. + +It has a fixed topology of 2^16 input neurons, 6 hidden neurons and 1 output +neuron. + +The neurons' activation function is the logistic function 1 / (1 + e ^ -x). + +## Classifying + + ./dlowe file [file ...] < trained.net + +To classify files, one specifies a trained network (on stdin) and one or more +files to classify. The program will output one line per successfully-classified +file to stderr, with the filename and the classification: a number between 0 +and 1. + +The interpretation of the classification number depends on how the network was +trained, but it's geared toward interpretation as a *probability* or a +*confidence*. + +## Training + + ./dlowe - corpus1/ [...] corpus0/ < start.net > end.net + + NOTE: The directory args must end in a / for them to work. + +To train a network, one specifies a starting network (on stdin), two or more +corpora (directories containing training data), and the number of training +iterations to run. The program will write some progress data to stderr and, +when it's done, will serialize the updated network to stdout. + +If no input network is given, a random new network will be generated as a +starting point (i.e. provide an empty stdin). + +The first corpus will be assigned a target value of 1. The last will be +assigned a target value of 0. Intervening directories (if any) will be assigned +intermediate target values. + +The learning rate is hard-coded as 0.3. No momentum factor is used. + +### png corpora + +The png-1 corpus was obtained by manually scraping the first results from an +https://images.google.com search for "obfuscate filetype:png". + +The png-0 corpus was obtained by manually scraping the first results from an +https://images.google.com search for "obfuscate filetype:gif". + +Results: + + * using these corpora as a training set + * using several hundred random *.gif and *.png files from my home computer as + a test set + * using the included "earlystop.pl" script, which stopped after 67000 iterations. + * interpreting output of "> 0.5" as "probably a .png" and "< 0.5" as "probably + a .gif" + * produced a network with about 87% accuracy + +### english corpora + +The english-1 corpus was obtained by manually scraping the first results from +a https://www.google.com/webhp?lr=lang_en search for "paris filetype:txt". + +The english-0 corpus was obtained by manually scraping the first results from +a https://www.google.com/webhp?lr=lang_fr search for "paris filetype:txt". + +Results: + + * using these corpora as a training set + * using several dozen additional text files (obtained by the same methods) + as a test set + * using the included "earlystop.pl" script, which stopped after 10000 + iterations. + * interpreting output of "> 0.5" as "probably english" and "< 0.5" as + "probably french" + * produced a network with 100% accuracy + +### xor corpora + +The xor-1 corpus consists of two files containing '01' and '10' respectively. + +The xor-0 corpus consists of two files containing '00' and '11' respectively. + +Results: + + * using these corpora as a training set + * takes about 8000 iterations to learn xor to within a tolerance of <0.01 + +# Limitations +The program can't tell you anything meaningful about files with less than two +bytes in them (I'm looking at you, smr.c!) + +You must include the trailing directory separator on training directories +(this allows the program to be portable without wasting precious bytes on +figuring out how to concatenate directory and file names...) + +Serialized network files are only portable between systems with the same +floating-point representation and endianness. + +Making sure not to overfit the network to the training data is a bit of a +black art. I have enclosed 'earlystop.pl', a wrapper script that implements +a simple 'early stopping' algorithm; other techniques are possible. + +Bad input (e.g. nonexistent files, non-numeric number of iterations, etc.) +tends to result in empty output. + +Given exactly one corpus, the program will crash or produce garbage. + +Leaks memory and file descriptors while processing files. + +Will crash and die horribly if it runs out of memory. + +The Microsoft C compiler doesn't provide a dirent API, so to get this working +on a Windows system you'll need cygwin+gcc (tested) or a dirent compatibility +library (untested, but they do exist). + +Backpropagation doesn't always converge: if you play with this long enough, +you'll eventually have a training session that completely fails to converge. + +# Obfuscation: + +Zombies! (Since neural networks are modeled after BRAINS, ya know? And +corpus sounds a lot like corpse. And I have 4- and 7-year-old kids ;) + +Neural networks are interesting, and while the math isn't terribly difficult, +their behavior is difficult to fully understand. + +Had some extra space in one of the major data structures, and it seemed a +shame to waste it. + +Similarly, I think three file pointers ought to be enough for anyone. + +Lots of magic numbers expressed in various ways. + +Random abuse of random C trivia. + +Some textual changes were made to maximize the classification of this program +by a network trained to recognize ioccc winners ;) + +... but mostly zombies! + +-------------------------------------------------------------------------------- + diff --git a/2011/eastman/Makefile b/2011/eastman/Makefile new file mode 100644 index 000000000..799ae379c --- /dev/null +++ b/2011/eastman/Makefile @@ -0,0 +1,117 @@ +#!/usr/bin/env make +# +# 2011 makefile +# +# Copyright (C) 2011, Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis. +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +OPT= -O2 + +# bitness +# +# Some entries require 32-bitness, +# other entries require 64-bitess. +# By default we assume nothing. +# +ARCH= + +# default flags for ANSI C compilation +# +CFLAGS= -Wall -W -ansi ${ARCH} ${OPT} -lm + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= eastman +DATA= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} + +# alternative executable +# +alt: + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o + +clobber: clean + ${RM} -f ${ENTRY} + +nuke: clobber + @echo gnab gib! + +install: + @echo "Surely you're joking Mr. Feynman!" + +# backwards compatibility +# +build: all + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to partly misunderstand this final echo. + @${TRUE} diff --git a/2011/eastman/eastman.c b/2011/eastman/eastman.c new file mode 100644 index 000000000..2ff3e2466 --- /dev/null +++ b/2011/eastman/eastman.c @@ -0,0 +1,23 @@ +#include +#include +#include +#include + + main() { + short a[4];ioctl + (0,TIOCGWINSZ,&a);int + b,c,d=*a,e=a[1];float f,g, + h,i=d/2+d%2+1,j=d/5-1,k=0,l=e/ + 2,m=d/4,n=.01*e,o=0,p=.1;while ( +printf("\x1b[H\x1B[?25l"),!usleep( +79383)){for (b=c=0;h=2*(m-c)/i,f=- +.3*(g=(l-b)/i)+.954*h,c1-h +*h?c>d-j?be-b?40:100:be-j?40:g*(g+.6)+.09+h*h<1?100: + 47:((int)(9-k+(.954*g+.3*h)/sqrt + (1-f*f))+(int)(2+f*2))%2==0?107 + :101);k+=p,m+=o,o=m>d-2*j? + -.04*d:o+.002*d;n=(l+= + n)e-i?p=-p + ,-n:n;}} diff --git a/2011/eastman/hint.html b/2011/eastman/hint.html new file mode 100644 index 000000000..7e000a498 --- /dev/null +++ b/2011/eastman/hint.html @@ -0,0 +1,118 @@ + + + + + + + Best ball + + +

Best ball

+ +

Peter Eastman
+peter.eastman@gmail.com

+ +

Judges' comments:

+ +

To build:

+ +
make eastman
+
+ +

To run:

+ +
./eastman
+
+ +

Try:

+ +
Quit the program.  Resize your terminal window.  Run it again.
+
+ +

Selected Judges Remarks:

+ +

This round program will generate a classic spherical result!

+ +

You will need a terminal capable of displaying coloured ANSI +characters (for example an xterm or a Terminal.app window).

+ +

You might also want to turn off any scrollback history. The program will +size itself to the initial geometry of your terminal.

+ +

If you are ambitious, make the font really small and the window really +large for hi-rez graphics!

+ +

Author’s comments:

+ +

This program uses ANSI graphics to recreate the classic Boing Ball demo from +the Commodore Amiga. See http://www.youtube.com/watch?v=-ga41edXw3A if you +aren’t familiar with it. Back in its day, this demo inspired lust and awe in +geeks around the world.

+ +

The graphics are raytraced, with procedural textures on the ball and the back +wall. I did cheat a little to simplify the calculations: it uses a parallel +projection, but textures the back wall to look as if there were a floor being +viewed in perspective. The shadow is also just part of the texture, not an +actual raytraced shadow.

+ +

This program automatically adapts to the size of the terminal it is running in, +so try enlarging the window to get higher resolution. Don’t resize while the +program is running, though. It only checks the size once, when it starts up.

+ +

To compile:

+ +

cc -lm ball.c

+ +

Portability:

+ +

It should be completely portable. I’ve tested with gcc on Mac OS X 10.7 and +Fedora 10. I would expect it to work in any Unix-like environment.

+ +

Obfuscation:

+ +

I have merged expressions wherever possible, making extensive use of ternary +operators, commas, return values of assignment operators, etc. The entire +raytracing computation, include ray intersection tests and procedural texture +evaluations, is a single expression involving 41 operators.

+ +

Variables are named alphabetically in the order they are declared.

+ +

The third argument to ioctl() should really be a “struct winsize”, and I should +then look up the ws_row and ws_col fields, but that makes it way too obvious +what I’m doing there. Since a winsize just contains four unsigned shorts, I +replaced it with an array. And since all the values will be much less than +32767, I further simplified the type to just short[].

+ +

A wonderful thing about ANSI graphics is that it produces nearly unintelligible +code. Consider the printf spec to print a single space in a desired color: +“\x1B[%dm ”. I could have done something to further obfuscate it, but it’s +already indistinguishable from line noise, so why bother?

+ +

There are lots of other minor obfuscations to make the code less obvious. For +example, I could have written the outer loop as while(1), but why write a 1 +when I can calculate it from the return value of usleep() instead? And I could +have written usleep(80000), but usleep(79383) just looks so much better. And +so on.

+ +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2012, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2011/eastman/hint.text b/2011/eastman/hint.text new file mode 100644 index 000000000..6131a402a --- /dev/null +++ b/2011/eastman/hint.text @@ -0,0 +1,91 @@ +# Best ball + +Peter Eastman + + + +## Judges' comments: +### To build: + + make eastman + +### To run: + + ./eastman + +### Try: + + Quit the program. Resize your terminal window. Run it again. + +### Selected Judges Remarks: + +This round program will generate a classic spherical result! + +You will need a terminal capable of displaying coloured ANSI +characters (for example an xterm or a Terminal.app window). + +You might also want to turn off any scrollback history. The program will +size itself to the initial geometry of your terminal. + +If you are ambitious, make the font really small and the window really +large for hi-rez graphics! + +## Author's comments: +This program uses ANSI graphics to recreate the classic Boing Ball demo from +the Commodore Amiga. See http://www.youtube.com/watch?v=-ga41edXw3A if you +aren't familiar with it. Back in its day, this demo inspired lust and awe in +geeks around the world. + +The graphics are raytraced, with procedural textures on the ball and the back +wall. I did cheat a little to simplify the calculations: it uses a parallel +projection, but textures the back wall to look as if there were a floor being +viewed in perspective. The shadow is also just part of the texture, not an +actual raytraced shadow. + +This program automatically adapts to the size of the terminal it is running in, +so try enlarging the window to get higher resolution. Don't resize while the +program is running, though. It only checks the size once, when it starts up. + +To compile: + +cc -lm ball.c + +Portability: + +It should be completely portable. I've tested with gcc on Mac OS X 10.7 and +Fedora 10. I would expect it to work in any Unix-like environment. + +Obfuscation: + +I have merged expressions wherever possible, making extensive use of ternary +operators, commas, return values of assignment operators, etc. The entire +raytracing computation, include ray intersection tests and procedural texture +evaluations, is a single expression involving 41 operators. + +Variables are named alphabetically in the order they are declared. + +The third argument to ioctl() should really be a "struct winsize", and I should +then look up the ws_row and ws_col fields, but that makes it way too obvious +what I'm doing there. Since a winsize just contains four unsigned shorts, I +replaced it with an array. And since all the values will be much less than +32767, I further simplified the type to just short[]. + +A wonderful thing about ANSI graphics is that it produces nearly unintelligible +code. Consider the printf spec to print a single space in a desired color: +"\x1B[%dm ". I could have done something to further obfuscate it, but it's +already indistinguishable from line noise, so why bother? + +There are lots of other minor obfuscations to make the code less obvious. For +example, I could have written the outer loop as while(1), but why write a 1 +when I can calculate it from the return value of usleep() instead? And I could +have written usleep(80000), but usleep(79383) just looks so much better. And +so on. + +-------------------------------------------------------------------------------- + diff --git a/2011/fredriksson/Makefile b/2011/fredriksson/Makefile new file mode 100644 index 000000000..88072fc06 --- /dev/null +++ b/2011/fredriksson/Makefile @@ -0,0 +1,117 @@ +#!/usr/bin/env make +# +# 2011 makefile +# +# Copyright (C) 2011, Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis. +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +OPT= -O2 + +# bitness +# +# Some entries require 32-bitness, +# other entries require 64-bitess. +# By default we assume nothing. +# +ARCH= + +# default flags for ANSI C compilation +# +CFLAGS= -Wall -W -ansi ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= fredriksson +DATA= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} + +# alternative executable +# +alt: + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ag.c + +clobber: clean + ${RM} -f ${ENTRY} ag + +nuke: clobber + @echo gnab gib! + +install: + @echo "Surely you're joking Mr. Feynman!" + +# backwards compatibility +# +build: all + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to partly misunderstand this final echo. + @${TRUE} diff --git a/2011/fredriksson/fredriksson.c b/2011/fredriksson/fredriksson.c new file mode 100644 index 000000000..6808f27d1 --- /dev/null +++ b/2011/fredriksson/fredriksson.c @@ -0,0 +1,21 @@ +#include +void exit(int); +int(*Q)(int,char**),b['['+']']={'-'-'-'},i,j,s,t,D['C'*' '-'-'],z,system(char*); +char O['C'*' '-'-'],p[]="@cs \"$ | ,& |& (&)x ) &,( ,(| ,( ,{ |,},; ,( ;,> ,( ,( ,;, );g cgt3odt - <~+<+- + ~ <&~<~+ <&+~+ ~ <=- = ( - !() c !(&( ! \n$P & m& )P )o )e')\")\"' ) w_ 'w)e ')x') ')q 'a_ )x'\"up)q &]v\") &t &t-k[]t\\.nivc -:l O CI:OnO lCl ={ -: =(- +[=+ =C =]\\.[- & - ~ -(|,g& -&- <- ( ~ -g()= Q| b) *,t, Q- ( - (\n& ~ & Q \n &\n,&g r& \n& \n ,&~\nt &=\n &n) rt)+=\n& (~ &k= &g(-&= (Q -( P ) \n )\n ) \"+\"' )z\"ujlpx)\"*bgQ Px )(\")x)\" P \"P\"'i x )\")m') axP \")\" Pv pP)e )O\"_\"apvP(t(c )d) \")\"pqpmpleP \"*te\" t\n \"] \"O_\" g c *P )\" =+ * r\n&r\nr \n! * (* (* + *. )x ')+) +)* ,\n )&* + ma +) 'j )d)' m)O )e)nc )m )n ) ')\"'jl _) _)_ )nps' )cix'iml )tit_eqp)m )rcnMm+wnhdl)esakn )\")ryPiam)O)v} no)zdOui =( \" '+'= ~(=(= (\n= ()=(@_& ~@' ( = '%; go. PO 'x )p)g '@ =\n '= &=,-\n=,=\n (& [ ()* , * ,*= )& (\n, \n , \n ,& ,*('l'c ) l \\ 's 'l' ci lcad eilm nq_dkv<=-^ (@, \n(& !\n=, ( , (/\n @ m h =*(.c. (&' ( =,(=(| (|(|(|\n&(,& [g(, (,\n tni^-,=(=(u t&(=)(~,=d(,( = ,sep wpg\n@\nan,\n&,* n a,$=,=|\n.( c'=~,~,=(,\n=(,[(o ad#( \n (d x=~,\n,='e, ( = '~),~=(, O=\n ( oc -~= ,\n =<, <=,(@='\\i|~ i~, =\n =i o i=-\n,i(=v t l t l * ,+ *+ *, p u=\n!=,\n(=,( e a*=, \n=\n[f(< n~('n i n,n \n,eu s( ,|&^,(=l op='&|,\n ,+\n^\n !,(= o, =/-=(/=%+ , e, (= ,()= | ] |OtvO)\n ) \n)k ')n\n' - (=( | - ( > - =("; +FILE*f; +int main(int _,char**v){ +_>(_^_)&&(t=_,i='C'*' '-'-'+~!!"",Q=main,Q(-!!"",v),i^=i,Q(~!!"",v),i=s^=s,Q(~-~!!"",v),i='C'*' '-'-',j=-~('('*'('),Q((-~!!""*~!!""),v), +f=fopen(O,"w"),fprintf(f,O+~-(~-~!!""*~!!""),'C'*' '-'-'-((~!!""*~!!"")*''+-~-~!!""),O+((~!!""*~!!"")*''+-~-~!!"")),fclose(f), +sprintf(p,O+(~-(~-~!!""*~!!"")<=(i^i)&& +((p[i]==' '&&(p[i]=(-~i)[p])||p[i]=='@'&&(p[i]=' ')||p[i]=='$'&&(p[i]^=p[i])),i=~-i,Q(_,v)) +|| +_==~!!""&&i<'C'*' '-'-'&&(D[i]=~-(i[p][b]=-~i[p][b]),i=-~i,Q(_,v)) +|| +_==~-~!!""&&i<(!!""<<-~(~-~!!""*~!!""))&&(z=b[i],i[b]=s,s+=z,i=-~i,Q(_,v)) +|| +_==(-~!!""*~!!"")&&-~(i=~-i)&&(i[O]=p[j],j=D[j]+j[p][b],Q(_,v)) +|| +_==~-(-~!!""*~!!"")&&i + + + + + + Most useful + + +

Most useful

+ +

Kimmo Fredriksson
+kimmo.k.k.fredriksson@gmail.com

+ +

Judges' comments:

+ +

To build:

+ +
make fredriksson
+
+ +

To run:

+ +
./fredriksson [-icvtnk#] regexp < file
+
+ +

Try:

+ +
./fredriksson -k1 -i POOT < /etc/group
+ulimit -s unlimited
+./fredriksson -k2 -t -n bofuskate < /usr/share/dict/words
+
+ +

Selected Judges Remarks:

+ +

The author of this entry was making sure that it does not win the +“Best Short Program” award. On the outside, the program behaves +as an approximate grep. On the inside, it is a Burrows-Wheeler +transform decompressor that produces the source code of the actual +obfuscated approximate grep program and calls it. As an exercise, +try writing the compressor.

+ +

Author’s comments:

+ +

Approximate grep

+ +

Implements a variant of grep.

+ +

Usage

+ +

To search regexp from file, do:

+ +
./fredriksson [-icvtnk#] regexp < file
+
+ +

Pipes may not work, see the section Limitations. +The options -i -c -v and -n are the classic ones:

+ +
    +
  • -i Ignore case.

  • +
  • -c Count only, prints the number of matches, but not the matching lines.

  • +
  • -v Invert match.

  • +
  • -n Prefixes each printed line by its line number (only if + -c was not given).

  • +
+ + +

This version of grep recognizes two more options, not present in normal +grep implementations:

+ +
    +
  • -kN Permit N insertions, deletions or mismatches of characters in the + matches (aka edit-distance). E.g. “obfuscated” matches “obfuscation” + with one deletion and two mismatches. Likewise, “obfuscate” and + “oversimplify” match with 7 edit operations. The default is -k0 + (i.e. exact match).

  • +
  • -t Add local transpositions to the set of allowed edit-operations. + That is, “ab” matches “ba” with one transposition (swap), and + “obfuscated” matches “bofsuact” with three swaps and two insertions, + i.e. use -tk5 to find this.

  • +
+ + +

Of course, one could construct a standard regexp that matches the same +patterns, but the problem is that such a regexp grows exponentially in +size when the number of allowed edit operations is increased.

+ +

This version does not recognize all regular expressions, but the +following are allowed:

+ +
    +
  • Wild card: . (dot) matches any character.

  • +
  • Bracket expression: list of charactres enclosed by [ and ], +matches any single character in the list.

  • +
  • Range expression: two characters separated by hyphen and enclosed in +brackets, matches any character that is lexicographically between the +two characters (inclusive). E.g. [a-d] is the same as [abcd].

  • +
+ + +

The special characters must be escaped, if they are to be taken +literally (i.e. use e.g. \. to match period). You might want to protect +these with ', i.e. use 'foo\[bar' instead of foo\[bar. If you want to +use the literal - in bracket expression, protect that too (\-), +otherwise this is not needed. Note that the syntax differs from standard +(?) grep a bit, i.e. in plain grep you can use ] and - in bracket +expressions by putting ] as the first character, and putting - last.

+ +

Other uses

+ +
    +
  • You can use this in place of cat. Just say

    + +
      ./fredriksson -k3 cat < file
    +
  • +
  • Like with cat, you can append line numbers too:

    + +
      ./fredriksson -nk3 cat < file
    +
  • +
+ + +

Other features

+ +
    +
  • It is assumed that the user knows how to feed correct input to the +program. If undefined options are given, the result is also undefined. +This is a feature.

  • +
  • It may consume huge amounts of memory, and a stack overflow may occur. +This results in Segmentation fault (or the equivalent of your favorite +system, such as Bus error). This is a feature, that can be used to detect +overly long lines in the input file, such as checking the lenght of one +liners in IOCCC entries, just adjust your stack size to a suitable +threshold, and search for “ioccc”, with option -vk5.

  • +
+ + +

Limitations and remarks

+ +
    +
  • Using warning options (such as -Wall) when building gives a lot of warning, +such as suggest parentheses around '&&' within '||', value computed is +not used, implicit declaration of function 'putchar', implicit +declaration of function 'getchar', control reaches end of non-void +function and format not a string literal and no format arguments. +Please ignore them all, since they just try to tell you that the source +is obfuscated.

  • +
  • Only standard input is handled. And only if stdin comes from a file, +i.e. pipes may or may not work. If you want to count only (-c option), +then this shouldn’t be an issue.

  • +
  • The total lenght of the (preprocessed) pattern is at most +sizeof(long)*CHAR_BIT. That does not count things like bracket expressions +or escape chars, that is, the pattern 'a[bcd]e\.f' is 5 chars long, not +10 chars. That does not mean that the matched substring in the standard +input has this limit, as using the edit operations can make the string +longer. However, no assumptions are made for sizeof(long). In fact, +you can easily use long long instead,

  • +
  • Depending on the file, may require a lot of stack space. If the +program segfaults (because of this), say

    + +
      ulimit -s unlimited
    +
    + +

    cross your fingers, hope it is enough, and try again.

  • +
  • Assumes C99 standard, because of the one very long line. Most C compilers +handle this just fine even in C89 mode, though.

  • +
  • The code should be reasonably portable, it assumes standard ASCII codes +for each char, and that a C compiler is on $PATH; the latter is hard coded +to be ‘gcc’, but any compiler would work, provided that it supports +C99, or long lines as an extension. This code has been tested on:

    + +
      +
    • GNU/Linux FC4, i386, gcc
    • +
    • GNU/Linux FC7, x86_64, gcc 4.1.2, tcc 0.9.24 and icc 10.0
    • +
    • GNU/Linux FC9, x86_64, gcc 4.?.?
    • +
    • GNU/Linux CentOS 5, gcc 4.1.2
    • +
    • GNU/Linux Ubuntu 11.04, gcc 4.5.2
    • +
    • SunOS 5.8, UltraSPARC IIIi, gcc 4.1.2
    • +
    • SunOS 5.9, UltraSPARC IIIi, gcc 4.1.1 and Sun ONE Studio 8 CC
    • +
    • AIX 5.3, IBM eServer p5-550, gcc 3.3.3 and AIX CC Version 6
    • +
    + + +

    (Btw, tcc has its roots in IOCCC…)

  • +
+ + +

Obfuscations (a.k.a. spoilers…)

+ +
    +
  • The initialized char array includes the source code of the real program, +as well as its name and commands to build and run it, all Burrows-Wheeler +-transformed, then run-length-encoded with unary coding. The main program +extracts and builds that, and then calls it. More precicely, the command +to build is

    + +
      gcc -O3 ag.c -o ag
    +
    + +

    To change that you need to edit the char array p[] and (possibly) two +specially encoded constants, -~('('*'(') and 'C'*' '-'-'. +The extracted source (ag.c) is obfuscated as well.

    + +

    (The original version also deleted the generated source and the +corresponding binary after running it, but this feature was removed +from the submitted entry.)

  • +
  • The code demonstrates several useful programming paradigms, such as

    + +
      +
    • recursion to remove all loops
    • +
    • sub routines (main() contains several logical sub routines, +selected by the first argument)
    • +
    • function pointers
    • +
    +
  • +
  • Algorithmically, it incorporates the following

    + +
      +
    • (inverse) Burrows-Wheeler transform (used also e.g. in bzip2)
    • +
    • data compression (really expansion :-), run-lenght-encoding, +unary coding (this is why it is expansion rather than compression)
    • +
    • approximate string matching
    • +
    • dynamic programming to compute the edit distance
    • +
    • parallel computation in sequential computers (by packing +several objects into a single long, to speed up the dynamic +programming)
    • +
    • self extracting, compiling and running code
    • +
    +
  • +
  • As a C program, it demonstrates that

    + +
      +
    • a C subset without reserved words is complete enough, +(excluding data type specific things (int, char, void …))
    • +
    • only letters are needed (i.e. the digits 0-9 are not)
    • +
    • only one statement is enough to code any program (plus +variable definitions)
    • +
    • white space has other uses than just indenting the code
    • +
    +
  • +
  • It also shows the power of boolean logic and bitwise arithmetic.

  • +
  • This is the first (?) entry in the history of IOCCC, that cannot be +totally un-obfuscated by the author. This is due to the clever choice of +the actual algorithm, that is obfucated by nature, and it is an open +research problem whether a simpler algorithm exists, with the same time +complexity.

  • +
  • The main obfuscation comes from using only arithmetic and boolean +(short-circuit) logic combined with recursion to remove all loops and +if-then-else constructs (also, no ternary ?: constructs are present). +Two’s complement representation of integers is also abused. E.g. instead +of writing x++ or x-1, it is much better to write x=-~x and ~-x.

  • +
  • No numerical values, other than in the initialized char array, try

    + +
      ./fredriksson -ck0 [0-9] < fredriksson.c
    +
    + +

    This should print 1, as there is a numer ‘3’ in the char array (only). +You can also try

    + +
      ./fredriksson -ck0 [0-9] < ag.c
    +
    + +

    after running fredriksson at least once (since this generates that +ag.c file), and this should print 0.

  • +
  • The source code is best viewed with cat (or using the program itself), +instead of some editor. (This is a somewhat system dependent thing.)

    + +

    One reason for this is that the code builds (some of the) constant +values from string literal "\b", except that the backspace \b is not +escaped like that, the source uses the raw ascii value (010 octal) instead. +Thus when viewing with cat or something, that backspace erases the leading +quotation mark. Makes it appear uncompilable, and it is: if you copy-paste +the cat output from terminal to some editor, save it, the result would not +compile.

    + +

    Some other constants are built from ASCII values of chars.

    + +

    Besides of making the code hard to read, all this makes it also quite large.

  • +
  • Running it through GNU indent or bcpp (C beautifiers) does not beautify +it a bit. In fact, indent makes it only worse (at least with the default +options). Running it through the preprocessor does basically nothing, +since no #defines are used.

  • +
  • Some abuse of the rules. The number of non-whitespace and ;, { +and } chars is below the limit, but most of the whitespace chars are +in an initialized character array. That is, the number of chars in the +program exceeds the 2048 limit. However, whitespace is whitespace and +the rules did not specify that these must be in between the statements. +A character is a whitespace if isspace() returns non-zero value. Even +if deleting even one of those chars breaks the program! (This does not +apply to the generated source ag.c.)

  • +
+ + +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2012, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2011/fredriksson/hint.text b/2011/fredriksson/hint.text new file mode 100644 index 000000000..6fa2e06ab --- /dev/null +++ b/2011/fredriksson/hint.text @@ -0,0 +1,274 @@ +# Most useful + +Kimmo Fredriksson + + + +## Judges' comments: +### To build: + + make fredriksson + +### To run: + + ./fredriksson [-icvtnk#] regexp < file + +### Try: + + ./fredriksson -k1 -i POOT < /etc/group + ulimit -s unlimited + ./fredriksson -k2 -t -n bofuskate < /usr/share/dict/words + +### Selected Judges Remarks: + +The author of this entry was making sure that it does not win the +"Best Short Program" award. On the outside, the program behaves +as an approximate grep. On the inside, it is a Burrows-Wheeler +transform decompressor that produces the source code of the actual +obfuscated approximate grep program and calls it. As an exercise, +try writing the compressor. + + + +## Author's comments: +# Approximate grep + +Implements a variant of grep. + +## Usage + +To search regexp from file, do: + + ./fredriksson [-icvtnk#] regexp < file + +Pipes may not work, see the section Limitations. +The options `-i -c -v` and `-n` are the classic ones: + +* `-i` Ignore case. + +* `-c` Count only, prints the number of matches, but not the matching lines. + +* `-v` Invert match. + +* `-n` Prefixes each printed line by its line number (only if + `-c` was not given). + +This version of grep recognizes two more options, not present in normal +grep implementations: + +* `-kN` Permit `N` insertions, deletions or mismatches of characters in the + matches (aka edit-distance). E.g. "obfuscated" matches "obfuscation" + with one deletion and two mismatches. Likewise, "obfuscate" and + "oversimplify" match with 7 edit operations. The default is `-k0` + (i.e. exact match). + +* `-t` Add local transpositions to the set of allowed edit-operations. + That is, "ab" matches "ba" with one transposition (swap), and + "obfuscated" matches "bofsuact" with three swaps and two insertions, + i.e. use `-tk5` to find this. + +Of course, one could construct a standard regexp that matches the same +patterns, but the problem is that such a regexp grows exponentially in +size when the number of allowed edit operations is increased. + +This version does not recognize all regular expressions, but the +following are allowed: + +* Wild card: `.` (dot) matches any character. + +* Bracket expression: list of charactres enclosed by `[` and `]`, + matches any single character in the list. + +* Range expression: two characters separated by hyphen and enclosed in + brackets, matches any character that is lexicographically between the + two characters (inclusive). E.g. `[a-d]` is the same as `[abcd]`. + +The special characters must be escaped, if they are to be taken +literally (i.e. use e.g. `\.` to match period). You might want to protect +these with `'`, i.e. use `'foo\[bar'` instead of `foo\[bar`. If you want to +use the literal `-` in bracket expression, protect that too (`\-`), +otherwise this is not needed. Note that the syntax differs from standard +(?) grep a bit, i.e. in plain grep you can use `]` and `-` in bracket +expressions by putting `]` as the first character, and putting `-` last. + +### Other uses + +* You can use this in place of cat. Just say + + ./fredriksson -k3 cat < file + +* Like with cat, you can append line numbers too: + + ./fredriksson -nk3 cat < file + +### Other features + +* It is assumed that the user knows how to feed correct input to the + program. If undefined options are given, the result is also undefined. + This is a feature. + +* It may consume huge amounts of memory, and a stack overflow may occur. + This results in Segmentation fault (or the equivalent of your favorite + system, such as Bus error). This is a feature, that can be used to detect + overly long lines in the input file, such as checking the lenght of one + liners in IOCCC entries, just adjust your stack size to a suitable + threshold, and search for "ioccc", with option `-vk5`. + +## Limitations and remarks + +* Using warning options (such as -Wall) when building gives a lot of warning, + such as `suggest parentheses around '&&' within '||'`, `value computed is + not used`, `implicit declaration of function 'putchar'`, `implicit + declaration of function 'getchar'`, `control reaches end of non-void + function` and `format not a string literal and no format arguments`. + Please ignore them all, since they just try to tell you that the source + is obfuscated. + +* Only standard input is handled. And _only_ if stdin comes from a file, + i.e. pipes may or may not work. If you want to count only (`-c` option), + then this shouldn't be an issue. + +* The total lenght of the (preprocessed) pattern is at most + `sizeof(long)*CHAR_BIT`. That does not count things like bracket expressions + or escape chars, that is, the pattern `'a[bcd]e\.f'` is 5 chars long, not + 10 chars. That does not mean that the matched substring in the standard + input has this limit, as using the edit operations can make the string + longer. However, no assumptions are made for `sizeof(long)`. In fact, + you can easily use `long long` instead, + +* Depending on the file, may require a lot of stack space. If the + program segfaults (because of this), say + + ulimit -s unlimited + + cross your fingers, hope it is enough, and try again. + +* Assumes C99 standard, because of the one very long line. Most C compilers + handle this just fine even in C89 mode, though. + +* The code should be reasonably portable, it assumes standard ASCII codes + for each char, and that a C compiler is on $PATH; the latter is hard coded + to be 'gcc', but any compiler would work, provided that it supports + C99, or long lines as an extension. This code has been tested on: + + - GNU/Linux FC4, i386, gcc + - GNU/Linux FC7, x86_64, gcc 4.1.2, tcc 0.9.24 and icc 10.0 + - GNU/Linux FC9, x86_64, gcc 4.?.? + - GNU/Linux CentOS 5, gcc 4.1.2 + - GNU/Linux Ubuntu 11.04, gcc 4.5.2 + - SunOS 5.8, UltraSPARC IIIi, gcc 4.1.2 + - SunOS 5.9, UltraSPARC IIIi, gcc 4.1.1 and Sun ONE Studio 8 CC + - AIX 5.3, IBM eServer p5-550, gcc 3.3.3 and AIX CC Version 6 + + (Btw, tcc has its roots in IOCCC...) + +## Obfuscations (a.k.a. spoilers...) + +* The initialized char array includes the source code of the real program, + as well as its name and commands to build and run it, all Burrows-Wheeler + -transformed, then run-length-encoded with unary coding. The main program + extracts and builds that, and then calls it. More precicely, the command + to build is + + gcc -O3 ag.c -o ag + + To change that you need to edit the char array `p[]` and (possibly) two + specially encoded constants, `-~('('*'(')` and `'C'*' '-'-'`. + The extracted source (`ag.c`) is obfuscated as well. + + (The original version also deleted the generated source and the + corresponding binary after running it, but this feature was removed + from the submitted entry.) + +* The code demonstrates several useful programming paradigms, such as + + - recursion to remove all loops + - sub routines (`main()` contains several logical sub routines, + selected by the first argument) + - function pointers + +* Algorithmically, it incorporates the following + + - (inverse) Burrows-Wheeler transform (used also e.g. in bzip2) + - data compression (really expansion :-), run-lenght-encoding, + unary coding (this is why it is expansion rather than compression) + - approximate string matching + - dynamic programming to compute the edit distance + - parallel computation in sequential computers (by packing + several objects into a single long, to speed up the dynamic + programming) + - self extracting, compiling and running code + +* As a C program, it demonstrates that + + - a C subset without reserved words is complete enough, + (excluding data type specific things (`int`, `char`, `void` ...)) + - only letters are needed (i.e. the digits 0-9 are not) + - only one statement is enough to code any program (plus + variable definitions) + - white space has other uses than just indenting the code + +* It also shows the power of boolean logic and bitwise arithmetic. + +* This is the first (?) entry in the history of IOCCC, that cannot be + totally un-obfuscated by the author. This is due to the clever choice of + the actual algorithm, that is obfucated by nature, and it is an open + research problem whether a simpler algorithm exists, with the same time + complexity. + +* The main obfuscation comes from using only arithmetic and boolean + (short-circuit) logic combined with recursion to remove all loops and + if-then-else constructs (also, no ternary `?:` constructs are present). + Two's complement representation of integers is also abused. E.g. instead + of writing `x++` or `x-1`, it is much better to write `x=-~x` and `~-x`. + +* No numerical values, other than in the initialized char array, try + + ./fredriksson -ck0 [0-9] < fredriksson.c + + This should print 1, as there is a numer '3' in the char array (only). + You can also try + + ./fredriksson -ck0 [0-9] < ag.c + + after running fredriksson at least once (since this generates that + `ag.c` file), and this should print 0. + +* The source code is best viewed with cat (or using the program itself), + instead of some editor. (This is a somewhat system dependent thing.) + + One reason for this is that the code builds (some of the) constant + values from string literal `"\b"`, except that the backspace `\b` is not + escaped like that, the source uses the raw ascii value (010 octal) instead. + Thus when viewing with cat or something, that backspace erases the leading + quotation mark. Makes it appear uncompilable, and it is: if you copy-paste + the cat output from terminal to some editor, save it, the result would not + compile. + + Some other constants are built from ASCII values of chars. + + Besides of making the code hard to read, all this makes it also quite large. + +* Running it through GNU indent or bcpp (C beautifiers) does not beautify + it a bit. In fact, indent makes it only worse (at least with the default + options). Running it through the preprocessor does basically nothing, + since no `#define`s are used. + +* Some _abuse of the rules_. The number of non-whitespace and `;`, `{` + and `}` chars is below the limit, but most of the whitespace chars are + in an _initialized character array_. That is, the number of chars in the + program exceeds the 2048 limit. However, whitespace is whitespace and + the rules did not specify that these must be in between the statements. + A character is a whitespace if `isspace()` returns non-zero value. Even + if deleting even one of those chars breaks the program! (This does not + apply to the generated source `ag.c`.) + + +-------------------------------------------------------------------------------- + diff --git a/2011/goren/Makefile b/2011/goren/Makefile new file mode 100644 index 000000000..7763afe43 --- /dev/null +++ b/2011/goren/Makefile @@ -0,0 +1,138 @@ +#!/usr/bin/env make +# +# 2011 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Compiler warnings +# +CWARN= + +# compiler standard +# +CSTD= -ansi + +# compiler bit architecture +# +# Some entries require 32-bitness, +# other entries require 64-bitess. +# By default we assume nothing. +# +# Under Mac OS X / Darwin, we must use -arch i386 +# Linux does not like this do let gnu make +# detect the target and only add for Darwin. +# +ifeq ($(target),) +target=$(shell uname -s 2>/dev/null) +endif +ifeq ($(target),Darwin) +ARCH= -arch i386 +else +ARCH= +endif + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +OPT= -O2 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= goren +DATA= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} + +# alternative executable +# +alt: + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o + +clobber: clean + ${RM} -f ${ENTRY} + +nuke: clobber + @echo gnab gib! + +install: + @echo "Surely you're joking Mr. Feynman!" + +# backwards compatibility +# +build: all + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to partly misunderstand this final echo. + @${TRUE} diff --git a/2011/goren/goren.c b/2011/goren/goren.c new file mode 100644 index 000000000..c8c6d4776 --- /dev/null +++ b/2011/goren/goren.c @@ -0,0 +1,20 @@ +typedef unsigned char t;t*F="%c",l[]="|\\/=_ \n](.\0(),*(.(=(}*.)[[*.",N='\n',* +r;typedef(*H)();extern H Ar;Q(a){return(a|-a)>>31;}H S(c,a){return(H)(a&~c|(int +)Ar&c);}extern t*ist;V(t*u){*u^=*u&2^(*u>>7)*185;}Z(t*u,t n){*u-=n;}e(t c,H h){ +R(h,Q(* r^c));} +I(){r=l +7-4*Q( +getchar ()^*l); +}R(H h, int c){Ar=S +(c,h);- main() ;}P(){r +++;}z() { O(&N);} +O(t*c){ printf( F,+*c); +}T(){r= "This is not a function\n" ;}w(U){ +U=Z(r,8 ); r-=~Q(* +r/8-4); return 0; }M(){r= +ist-68; } h(){t G +=r[1]-r [2]^*r; +G^=30;V (&G);e( +0,(O(&G ),P(P(* +r++)),z));}g(){M();R(h,0);}f(){P(O(r));e('f',g);}p(){P();e('a',f);}d(){P(O(r)); +e('n',p);}c(u){u=r[-2];T(Ar=d);R(f,Q(u^'"'));}n(){e(w(O(l+*r%8)),c);}a(){I();R( +n,0);}main(){S(Q(Ar),a)();}H Ar;t*ist="Rene Magritte"-(1898-1967); diff --git a/2011/goren/hint.html b/2011/goren/hint.html new file mode 100644 index 000000000..b94f886fd --- /dev/null +++ b/2011/goren/hint.html @@ -0,0 +1,120 @@ + + + + + + + Most artistic + + +

Most artistic

+ +

Uri Goren
+goren.uri@gmail.com

+ +

Judges' comments:

+ +

To build:

+ +
make goren
+
+ +

To run:

+ +
echo "some text" | ./goren
+
+ +

Try:

+ +
echo "Hello, world!" | ./goren
+
+ +

Selected Judges Remarks:

+ +

In the words of René François Ghislain Magritte Magritte:

+ +

This is not a pipe

+ +

One may ask the surrealist question:

+ +
echo 'If | is just a representation of a pipe, then how can data stuff it?' | ./goren
+
+ +

However if one takes a firm stand and declares:

+ +
echo '| is just a representation of a pipe because I say so! So stuff it!' | ./goren
+
+ +

something happens! Why?

+ +

Author’s comments:

+ +

This program was written in homage to Rene Magritte’s picture “La +trahison des images” (The Treachery of Images).

+ +

In order to show my unconditional admiration of this work, I avoided +using conditions.

+ +

In this work, Magritte points out that a picture of a pipe is not +a pipe. But what IS a pipe? This program tries to provide an answer.

+ +

Magritte’s [test for pipes](http://en.wikipedia.org/wiki/The_Treachery_of_Images} is:

+ +
The famous pipe. How people reproached me for it! And yet, could
+you stuff my pipe? No, it's just a representation, is it not?
+
+ +

Accordingly, this program only approves pipes which can be used for +stuffing data.

+ +

One thing I tried to achieve is condition free programming. Many +have noted that conditions make the code harder to read and understand. +A good example would be:

+ +

Brent Burley’s 2004 IOCCC winner

+ +

That entry omits conditional statements such as “if” and “while”. +His achievement in improving clarity by omitting conditions is +impressive, but I think it can be taken further, in two ways.

+ +

First, conditional operators, such as ?:, && and ||, can be thrown +away. Second, using setjmp and longjmp, which are unfortunately +not in common use, might make it difficult for a novice programmer +to understnad the code without referring to the man page.

+ +

By removing these, the code is 100% condition free, and every +function runs its instructions in perfect order. Naturally, this +makes the program flow trivial to understand. This can be verified +by disassembling the compiled code and looking for conditional jumps +(when compiled with gcc on x86, there are none).

+ +

Compatibility:

+ +

The program should compile with any C compiler, but was tested +mostly with gcc on Linux.

+ +

It doesn’t support 64 bits (due to integer-pointer casts, and a >>31). +It does work on 64-bit Linux, becasue all functions are below 4GB.

+ +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2012, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2011/goren/hint.text b/2011/goren/hint.text new file mode 100644 index 000000000..8a87d95a8 --- /dev/null +++ b/2011/goren/hint.text @@ -0,0 +1,90 @@ +# Most artistic + +Uri Goren + + + +## Judges' comments: +### To build: + + make goren + +### To run: + + echo "some text" | ./goren + +### Try: + + echo "Hello, world!" | ./goren + +### Selected Judges Remarks: + +In the words of [René François Ghislain Magritte Magritte](http://en.wikipedia.org/wiki/Rene_Magritte): + +![This is not a pipe](http://upload.wikimedia.org/wikipedia/en/b/b9/MagrittePipe.jpg "Ceci n'est pas une pipe") + +One may ask the surrealist question: + + echo 'If | is just a representation of a pipe, then how can data stuff it?' | ./goren + +However if one takes a firm stand and declares: + + echo '| is just a representation of a pipe because I say so! So stuff it!' | ./goren + +something happens! Why? + +## Author's comments: +This program was written in homage to Rene Magritte's picture "La +trahison des images" (The Treachery of Images). + +In order to show my unconditional admiration of this work, I avoided +using conditions. + +In this work, Magritte points out that a picture of a pipe is not +a pipe. But what IS a pipe? This program tries to provide an answer. + +Magritte's [test for pipes](http://en.wikipedia.org/wiki/The_Treachery_of_Images} is: + + The famous pipe. How people reproached me for it! And yet, could + you stuff my pipe? No, it's just a representation, is it not? + +Accordingly, this program only approves pipes which can be used for +stuffing data. + +One thing I tried to achieve is condition free programming. Many +have noted that conditions make the code harder to read and understand. +A good example would be: + +[Brent Burley's 2004 IOCCC winner](http://www.ioccc.org/years.html#2004_burley) + +That entry omits conditional statements such as "if" and "while". +His achievement in improving clarity by omitting conditions is +impressive, but I think it can be taken further, in two ways. + +First, conditional operators, such as ?:, && and ||, can be thrown +away. Second, using setjmp and longjmp, which are unfortunately +not in common use, might make it difficult for a novice programmer +to understnad the code without referring to the man page. + +By removing these, the code is 100% condition free, and every +function runs its instructions in perfect order. Naturally, this +makes the program flow trivial to understand. This can be verified +by disassembling the compiled code and looking for conditional jumps +(when compiled with gcc on x86, there are none). + +### Compatibility: + +The program should compile with any C compiler, but was tested +mostly with gcc on Linux. + +It doesn't support 64 bits (due to integer-pointer casts, and a >>31). +It does work on 64-bit Linux, becasue all functions are below 4GB. + +-------------------------------------------------------------------------------- + diff --git a/2011/guidelines.txt b/2011/guidelines.txt new file mode 100644 index 000000000..6ce3ed604 --- /dev/null +++ b/2011/guidelines.txt @@ -0,0 +1,588 @@ +20th International Obfuscated C Code Contest Guidelines, Hints and Comments + +Copyright (C) 2006,2011 Leonid A. Broukhis, Simon Cooper, Landon Curt Noll and +Peter Seebach. + +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in +writing from the contest judges. + + +ABOUT THIS FILE: + + This file contains guidelines intended to help people who wish to + submit entries to the International Obfuscated C Code Contest (IOCCC + for short). + + This is not the IOCCC rules, though it does contain comments about + them. The guidelines should be viewed as hints and suggestions. + Entries that violate the guidelines but remain within the rules are + allowed. Even so, you are safer if you remain within the guidelines. + + You should read the current IOCCC rules, prior to submitting entries. + The rules are typically sent out with these guidelines. + +| WHAT'S NEW IN 2011: + +| The contest runs from 12-Nov-2011 11:00 UTC to 12-Jan-2012 12:12 UTC. + +| Only online submissions will be accepted this year. + See the following for details, + +| https://submit.ioccc.org/ +| +| (Will be active 2011-12-01) + +| Most of the changes in the rules and guidelines for this year have been +| marked with a "|" character on the left hand side. + +HINTS AND SUGGESTIONS: + + You are encouraged to examine the winners of previous contests. See + FOR MORE INFORMATION for details on how to get previous winners. + + Keep in mind that rules change from year to year, so some winning entries + may not be valid entries this year. What was unique and novel one year + might be 'old' the next year. + + An entry is usually examined in a number of ways. We typically apply + a number of tests to an entry: + + * look at the original source + * convert ANSI tri-graphs to ASCII + * C pre-process the source ignoring '#include' lines + * C pre-process the source ignoring '#define' and '#include' lines + * run it through a C beautifier + * examine the algorithm + * compile it (with flags to enable all warnings) + * execute it + + You should consider how your entry looks in each of the above tests. + You should ask yourself if your entry remains obscure after it has been + 'cleaned up' by the C pre-processor and a C beautifier. + + Your entry need not pass all of the above tests. In certain + cases, a test is not important. Entries that compete for the + 'strangest/most creative source layout' need not do as well as + others in terms of their algorithm. On the other hand, given + two such entries, we are more inclined to pick the entry that + does something interesting when you run it. + + We try to avoid limiting creativity in our rules. As such, we leave + the contest open for creative rule interpretation. As in real life + programming, interpreting a requirements document or a customer request + is important. For this reason, we often award 'worst abuse of the + rules' to an entry that illustrates this point in an ironic way. + + We do realize that there are holes in the rules, and invite entries + to attempt to exploit them. We will award 'worst abuse of the rules' + and then plug the hole next year. Even so, we will attempt to use + the smallest plug needed, if not smaller. :-) + + Check out your program and be sure that it works. We sometimes make + the effort to debug an entry that has a slight problem, particularly + in or near the final round. On the other hand, we have seen some + of the best entries fall down because they didn't work. + +| We tend to look down on a prime number printer that claims that + 16 is a prime number. If you do have a bug, you are better off + documenting it. Noting "this entry sometimes prints the 4th power + of a prime by mistake" would save the above entry. And sometimes, + a strange bug/feature can even help the entry! Of course, a correctly +| working entry is best. Clever people will note that 16 might be prime. +| Wise people, when submitting something clever entry that might +| depend on such a misleading statement, will fully explain such +| cleverness in their entry's remarks file. + + People who are considering to just use some complex mathematical + function or state machine to spell out something such as "hello, + world!" may want to try and be more creative. + + Ultra-obfuscated programs are in some cases some cases easier to + deobfuscate than subtly-obfuscated programs. Consider using + misleading or subtle tricks layered on top of or under an + appropriate level of obfuscation. + + Programs that use VTxxx/ANSI sequences that are NOT limited to a + specific terminal brand and that can also work in a standard xterm +| are considered more portable. + +| The judges quite like "markdown" for formatting text (the 2005 and +| 2006 hints are formatted this way). You are encouraged, but not +| required to submit remarks and documentation in this format. Future +| competitions may require this. For more info on Markdown, see +| +| http://daringfireball.net/projects/markdown/syntax +| + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many C compilers dislike the following code, and so do we: + + #define d define + #d foo <-- don't expect this to turn into #define foo + + When declaring local or global variables, you should declare the type: + + int this_is_ok; + this_is_not; <-- don't use such implicit type declarations + +| We suggest that you compile your entry with an ISO/IEC 9899-1999 +| ("ISO C99") C compiler or at least an ANSI C compiler. + +| Local function declarations, such as: + + #include + int + main() { + void blah() { printf("blah\n"); } + blah(); + } + +| are found in many C compilers (such as gcc v4). Such a feature +| often requires one to compile with a flag such as -fnested-functions. +| If you do use local function declarations, please provide +| gcc v4 (or later version) compatible compile flags. I.e., +| +| cc -fnested-functions prog.c -o prog +| +| At least one judge doesn't like to execute instructions if they are +| on the stack. + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using . Use instead. + +| On 28 January 2007, the Judges rescinded the requirement that the +| '#" in a C preprocessor directive must be the first non-whitespace character. + + + The exit() function returns void. On some broken systems have exit() + return int. Your entry should assume that exit() returns a void. + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + + One line programs should be short one line programs, say around 80 + bytes long. Getting close to 160 bytes is a bit too long in our opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS version specific + (index/strchr differences are ok, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is ok only if you warn us in the 'remark' header item) + * won't compile or run under a POSIX P1003.1/P1003.2 like systems + * depend on a utility or application not normally found on most + most POSIX P1003.1/P1003.2 like systems + * abuse the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are similar to previous winners + * are identical to previous losers :-) + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + The build file should not be used to try and get around the size + limit. It is one thing to make use of a several -D's to help out, + but it is quite another to use 200+ bytes of -D's in order to + try and squeeze the source under the size limit. You should feel + free to make use of the build file space, but you are better off + if you show some amount of restraint. + + You should try to restrict commands used on the build file to + POSIX-like or common Un*x-like commands. You can also compile + and use your own programs. If you do, try to build and execute + from the current directory. This restriction is not a hard and + absolute one. The intent is to ensure that the building if your + program is reasonably portable. + + Don't forget that the building of your program should be done + ***without human intervention***. So don't do: + + cat > prog.c + cc prog.c -o prog + + However, you can do something cute such as making your program + do something dumb (or cute) when build 'automatically'. However + when it is run with a human involved, do something more clever. + For example, one could use the build instructions: + + cc prog.c -DNONHUMAN -o prog + echo "See remarks section about alternate ways to compile" + + and then include special notes in the program "remarks" for + alternate / human intervention based building. + + We want to get away from source that is simply a compact blob of + characters. To help, we give a break to source that contains + whitespace, and in certain cases ; { or } characters. While the + number of characters excluding whitespace (tab, space, newline), + and excluding any ; { or } followed immediately by either whitespace + or end of file, must be <= 2048, the total size may be less than 4096 + bytes. This means that one may use "free of charge" up to 2048 + bytes of whitespace, or ; { or } followed by either whitespace + or end of file. + + Please do not use things like gzip to get around the size limit. + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! + + We suggest that you avoid trying for the 'smallest self-replicating' + source. The smallest, a zero byte entry, won in 1994. + + We do not like writable strings. That is, we don't want stuff like: + + char *T = "So many primes, so little time!"; + ... + T[14] = ';'; + + Please don't make use of this feature, even if your system allows it. + However, initialized char arrays are OK to write over. This is OK: + + char b[] = "Is this Ok"; + b[9] = 'K'; + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. Don't + depend on a particular type of display. For example, don't depend + on color or a given size. Don't require backing store. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. + + We don't like entries that use proprietary M*tif, Xv*ew, or OpenL*ok + toolkits, since not everyone has them. Use of OpenMotif is permitted + because it is more widely and freely available. + + You should avoid depending on a particular window manager. + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines + in the program "remarks". + + While we recognize that UN*X is not a universal operating system, the + contest does have a bias towards such systems. In an effort to expand + the scope of the contest, we phrase our bias in terms of POSIX P1003.1 + and P1003.2 standards. This will allow certain non-UN*X OS users to + submit entries. On the other hand, this is a guideline and not a rule. + We will not reject an entry based on some POSIX technicality. + + When dealing with OS and application environments, we suggest that you + be reasonable with a nod towards vanilla UN*X-like systems. POSIX will + evolve but not as much as the contest, so avoid stuff like POSIX real + time, security, etc. + +| You might not be prohibited from failing to not partly misunderstand +| this particular guideline. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION <== HINT!! + * make us laugh and/or throw up :-) (humor helps!) + + Some types of programs can't excel (tm) in some areas. Of course, your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + You are better off explaining what your entry does in the program + "remarks" section rather than leaving it obscure for the judges + as we might miss something and/or be too tired to notice. + + We freely admit that interesting, creative or humorous comments in + the program "remarks" help your chances of winning. If you had to + read so many twisted entries, you too would enjoy a good laugh or two. + We think the readers of the contest winners do as well. We do read + the program "remarks" during the judging process, so it is worth your + while to write remarkable program "remarks". + + We dislike C code with trailing control-M's (\r or \015) that results + in compilation failures. Some non-Un*x/non-Linux tools such as + MS Visual C and MS Visual C++ leave trailing control-M's on lines. + Users of such tools should strip off such control-M's before submitting + their entries. In some cases tools have a "Save As" option that will + prevent such trailing control-M's being added. + + We dislike entries that depend on non-portable libcurses features such + as halfdelay(). One should restrict libcurses to portable features +| found on BSD or Linux curses. + + The rules disallow source that contains unescaped octets with values + between 128 and 255. You must use \octal or \hex escapes instead: + + /* 123456789 123456789 123456789 123456 */ + char *foo = "This string is 36 octets in length \263"; + /* This octet requires 4 octets of source ^^^^ */ +| if (strlen(foo) == 36) printf("foo is 36 octets plus a final NUL\n"); + +| It is a very good idea to, in your remarks file, tell us why you +| think your entry is obfuscated. This is particularly true if +| your entry is has some very subtle obfuscations that we might +| otherwise overlook. + +| Anyone can format their code into a dense blob. A really clever +| author will try format their entry using a "normal" formatting style +| such that at first glance (if you squint and don't look at the details) +| the code might pass for non-obfuscated C. Deceptive comments, +| and mis-leading formatting, in some cases, may be a plus. On the +| other hand, a misleading code style requires more source bytes. +| If you do elect to use misleading formatting and comments, we +| suggest you remark on this point in your remarks where you talk +| about why you think your entry is obfuscated. On the other hand, +| if you are pushing up against the size limits, you may be forced +| into creating a dense blob. Such are the tradeoffs that obfuscators face! + + Be creative! + + +ABUSING THE RULES: + + Legal abuse of the rules is somewhat encouraged. Legal rule abuse may + involve, but is not limited to, doing things that are technically + allowed by the rules and yet do not fit the spirit of what we intended + to be submitted. + + Legal rule abuse is encouraged to help promote creativity. Rule abuse + entries, regardless of if they receive an award, result in changes to + the next year's rules and guidelines. + + Legal abuse of the rules is NOT an invitation to violate the rules. + An entry that violates the rules in the opinion of the judges, WILL be + disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK! If you + have an entry that might otherwise be interesting, you might want to + submit two versions; one that does not abuse the rules and one that + does. + + If you intend to abuse the rules, indicate so in the program + "remarks". You must try to justify why you consider your rule abuse + to be allowed under the rules. That is, you must plead your case as + to why your entry is valid. Humor and/or creativity help plead a + case. + +| Abusing the web submission procedure tends to annoy us more +| than amuse us. Spend your creative energy on content of your +| entry rather than on the submission process itself. + + We are often asked why the contest rules and guidelines seem too + strange or contain mistakes, flaws or grammatical errors. One reason + is that we sometimes make genuine mistakes. But in many cases such + problems, flaws or areas of confusion are deliberate. Changes to + rules and guidelines in response to rule abuses, are done in a minimal + fashion. Often we will deliberately leave behind holes (or introduce + new ones) so that future rule abuse may continue. + + At the risk of stating the obvious, this contest is a parody of the + software development process. The rules and guidelines are only a + small part of the overall contest. Even so, one may think the contest + rules and guideline process as a parody of the sometimes tragic + mismatch between what a customer (or marketing) wants and what + engineering delivers. + + +JUDGING PROCESS: + + Entries are judged by Leonid A. Broukhis, Simon Cooper, Landon Curt Noll. +| This list may change before the contest closes. + + Each entry submitted is given an id number and subdirectory. The + "program", "info", "build" and "remarks" portions of a submission are + stored and judged from this directory. + + Any "author" and identifiable "entry" information is not read until + the judging process is complete, and then only from entries that have + won an award. + + The above process helps keep us biased for/against any one particular +| individual. Therefore you MUST refrain from putting any information +| that reveals your identity in the "program", "info", "build", or "remarks" +| portions of your entry. We are usually kept in the dark as much as you +| are until the final awards are given. We like the surprise of finding + out in the end, who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. (For the curious, + we do indicate the volume of paper consumed when presenting the IOCCC + winners at talks) + + After the initial announcement, we attempt to send EMail to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes and typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the "build" information + * reading the "program" + * reading the program "info", if any + * passing the source thru the C pre-processor + skipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + skipping over any #include files + + In later rounds, other actions are performed: + + * compiling/building the source + * running the program + * performing miscellaneous tests on the source and binary + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry will often compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code + * best X client (see OUR LIKES AND DISLIKES) +| * best abuse of ISO/IEC 9899-1999 ("ISO C99") C or ANSI C + * worst abuse of the rules + * (anything else so strange that it deserves an award) + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to 8 or 10 + winners. Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry is good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + + More often than not, we select a small entry (usually one line), a + strange/creative layout entry, and an entry that abuses the contest + rules in some way. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entries. More often, the + 'best' is picked because it does well in a number of categories. + + +ANNOUNCEMENT OF WINNERS: + + The judges will post an initial announcement of who won, the name + of their award, and a very brief description of the winning entry + on the IOCCC web site: + + http://www.ioccc.org/whowon.html + + We will also submit a brief announcement story to /.: + + http://slashdot.org + + that, depending on the willingness of the /. editors, may be posted + to their site at the same time. + + Note that initial announcement will NOT contain source. This is because + the winning authors are given a chance to review the judges comments, + and test our Makefile. This review process typically takes a few weeks. + + Sometime after the initial announcement, and once the the review + by the winners has been completed, the winning source will be + posted to the IOCCC web site: + + http://www.ioccc.org/years.html + + NOTE: previous winners are available at that URL + + We will submit a story announcing the availability of the winners + to /. at the same time. + +| The judges won't promise to post the winning entries to news groups. +| Does anyone still read any of the following groups? + + comp.lang.c comp.lang.c.moderated alt.sources + + Often, winning entries are published in selected magazines from around + the world. Winners have appeared in books ("The New Hackers Dictionary") + and on T-Shirts. + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending EMail to the following address: + +| q.2011@ioccc.org (do not submit entries to this address) + +| You must include the words 'ioccc 2011 question' in the subject of your + EMail message when sending EMail to the judges. + + Questions and comments about the contest are welcome. Comments about + confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. + + Check out the IOCCC Web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ diff --git a/2011/hamaji/Makefile b/2011/hamaji/Makefile new file mode 100644 index 000000000..f9ff4d9e9 --- /dev/null +++ b/2011/hamaji/Makefile @@ -0,0 +1,127 @@ +#!/usr/bin/env make +# +# 2011 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Compiler warnings +# +CWARN= -Wall -W + +# compiler standard +# +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness, +# other entries require 64-bitess. +# By default we assume nothing. +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +OPT= -O2 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= hamaji +DATA= dragon.nono random.nono soccer.nono + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} + +# alternative executable +# +alt: + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o + +clobber: clean + ${RM} -f ${ENTRY} + +nuke: clobber + @echo gnab gib! + +install: + @echo "Surely you're joking Mr. Feynman!" + +# backwards compatibility +# +build: all + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to partly misunderstand this final echo. + @${TRUE} diff --git a/2011/hamaji/c2nono.pl b/2011/hamaji/c2nono.pl new file mode 100644 index 000000000..54ce30308 --- /dev/null +++ b/2011/hamaji/c2nono.pl @@ -0,0 +1,4 @@ +#!/usr/bin/perl -n0 +s%^ *((\d+\.)+\d+)|/$%print$1||"-"," +"%emg;s%^/.+%%ms;for$i(18..75){print/^.{$i}([\d.])/gm," +"} diff --git a/2011/hamaji/codegolf.nono b/2011/hamaji/codegolf.nono new file mode 100644 index 000000000..08fa5e30c --- /dev/null +++ b/2011/hamaji/codegolf.nono @@ -0,0 +1,29 @@ +3.4.3.3 +1.1.1.1.1.1 +1.1.1.1.1.3 +1.1.1.1.1.1 +3.4.3.3 +0 +2.4.1.3 +1.1.1.1.1 +1.2.1.1.1.3 +1.1.1.1.1.1 +2.4.3.1 +- +5.3 +1.1.1.1 +1.1.1.1.1 +2 +5 +1.1.5 +1.1.1.1 +5.1.1 +5 +5 +1.1.5 +1.1.1 +3.1 +0 +5.5 +1.1.1.1.1 +1.1.1.1.1 diff --git a/2011/hamaji/dragon.nono b/2011/hamaji/dragon.nono new file mode 100644 index 000000000..9c616c5c5 --- /dev/null +++ b/2011/hamaji/dragon.nono @@ -0,0 +1,94 @@ +13.3.37 +12.2.39 +11.2.40 +10.39 +9.36 +9.31 +8.3.32 +7.3.30 +5.3.29 +3.1.3.1.28 +1.2.4.31 +7.5.31 +1.6.5.30 +5.10.12.16 +5.11.5.4.12.4 +15.2.4.4.11.5 +16.3.4.2.2.5.5 +14.8.7.3 +12.1.4.1.6.2 +11.3.4.6.1 +10.1.8.8.5.1 +9.8.11.5 +9.5.6.1.2.4.1 +9.3.5.1.5 +3.2.6.5.1 +2.6.3.5.1 +2.1.2.6.3.6.1 +2.1.2.2.1.5.2.5.1 +2.1.2.5.5.6.3 +4.1.9.7.5.1 +5.19.6.1.2 +24.6.3.3 +24.1.2.9.7.4 +25.1.2.25 +28.1.26 +- +11.23 +10.22 +10.12.6 +9.12.9 +9.13.5 +8.2.9.4 +8.2.9.8 +7.2.11.2.5 +6.1.2.11.5 +4.2.1.8.1.6 +3.3.2.7.9 +2.2.1.6.8 +1.1.1.5.7 +1.6.7 +2.6.7 +2.4.1.6 +1.5.6 +1.6.6 +1.3.1.2.5 +3.2.2.5 +3.5.5 +4.5.6 +5.6.6 +5.3.6 +5.6.3.2 +5.7.2.1 +5.1.6.2.3 +7.2.4.2.1 +8.9.2 +9.9.2 +18.3 +18.4 +15.7.1 +14.12 +14.1.13 +17.14 +17.6.7 +16.5.5 +15.3.4 +14.3.3 +13.2.3 +13.2.2.3.3 +17.3.3.2 +17.2.2.3 +16.3.3 +16.3.4 +16.1.5 +18.4 +19.2.3 +20.4.3 +22.6.2 +29.2 +15.11.2 +14.2.9.2 +17.6.3 +18.4 +19.5 +21.1.4.6 diff --git a/2011/hamaji/face.nono b/2011/hamaji/face.nono new file mode 100644 index 000000000..73856fe17 --- /dev/null +++ b/2011/hamaji/face.nono @@ -0,0 +1,31 @@ +5.5 +3.5.3 +2.9.2 +1.2.1.2.1 +1.11.1 +4.1.4 +4.1.4 +13 +6.6 +13 +1.2.2.1 +1.11.1 +2.9.2 +3.5.3 +5.5 +- +5.5 +3.5.3 +2.9.2 +1.11.1 +1.1.6.2.1 +2.1.3.3 +2.1.3.3 +7.1.3 +2.1.3.3 +2.1.3.3 +1.1.6.2.1 +1.11.1 +2.9.2 +3.5.3 +5.5 diff --git a/2011/hamaji/hamaji.c b/2011/hamaji/hamaji.c new file mode 100644 index 000000000..17fea6a06 --- /dev/null +++ b/2011/hamaji/hamaji.c @@ -0,0 +1,47 @@ +#include// 4 +#include/* 76. 1 + ..2321 1 57 3 + 21.... . .. .11 1 2 + 1 88..1321 2 33 5512 1 277 14 1 + 099..12.... . .. .... 1 4 11111...111 122 5.1 . + 11...221.821112411123455676489 51.176543232666 902 .27 1 + 10111...1.....................11.417...........1...21..11. + ..2239921176566156225563322299887...6533233233182469196894 + 22...............................111...................... +*/// 3269548556987776665556662131223412347543332334543322223456 +/* + 13.3.37 */char C[120] [60 ];int R[120][60],W,H,J,K,B[61][61],/* + 12.2.39 */r,i,j,c,*q =& H,t=7200,x,y,k;int64_t*U,T[28800],*S=/* + 11.2.40 */T,O[120], Z[ 120],v,z;void D(){for(k=-1;7200>++k;S[/* + 10.39 */k]=v)r=! ~(v=U[k])&&*R[k/60]?2:S[k]-v?1:r;;;;}/* + 9.36 */void L( ){for(r=1;r==1;){r=3;;for(i=0;120>/* + 9.31 */i;i++){ for(k=z=1,j=0;v=R[i][j];j++)O/* + 8.3.32 */[i]|=( 1LL <>1:v<<1|1))v=S[60/* + 3.1.3.1.28 */* i +(j < 0?~j:j)]|=j?v:~3;}for(z=0;/* + 1.2.4.31 ; */ 7200 >z;z++)i=z/60,j=z%60,(B[i<60?/* + 7.5.31 */i:j][ i<60? j:i-60]=~S[z]&O[i]?~S[z]&Z[i]/* + 1.6.5.30 ; */?r=0 :(U=O ,1):(U=Z,2))?k=i<60?j+60:j,S/* + 5.10.12.16 */[i% 60+60*k]|= ~U[k]:0;U=S; S-=t*=-1;D();z/* + 5.11.5.4.12.4 */*9; }}int main( ){for (;K= scanf("%d",R [*/* + 15.2.4.4.11.5 */q+c*60]+j)<1? q= &W,j --,2 >++c:'\n';j =-K/* + 16.3.4.2.2.5.5 */+getchar()?j+1 :++ *q*0 ); L( );;if (!r/* + 14.8.7.3 */)for(K=0;K>c))U= S ,000,S+= J=14400, D()/* ; + 9.8.11.5 */,S[K]=~ (1LL< i; Z[i]=k --,/* ; + 2.6.3.5.1 */ i>59?q =&J :0,/* ; + 2.1.2.6.3.6.1 */ * q< k?*q=k :0, 0,C[/* ; +2.1.2.2.1.5.2.5.1 */ i ++ ][ k ]=' ' ){ j=k/* ; + 2.1.2.5.5.6.3 */ = 0; for(; x=R[i ][j++] ;/* + 4.1.9.7.5.1 */0) k +=sprintf ((00,C[ i]+/* ; + 5.19.6.1.2 */k), "%d.",x);}i=~J;;r&1 ||puts ( /* + 24.6.3.3 */r?"invalid":"failed"); for(;i + + + + + + Best solved puzzle + + +

Best solved puzzle

+ +

Shinichiro Hamaji
+shinichiro.hamaji@gmail.com

+ +

bsoup

+ +

Judges' comments:

+ +

To build:

+ +
make hamaji
+
+ +

To run:

+ +
./hamaji < a_nonogram_file
+
+ +

Try:

+ +
./hamaji < dragon.nono
+./hamaji < random.nono
+./hamaji < soccer.nono
+./hamaji < codegolf.nono
+./hamaji < face.nono
+./hamaji < penguin.nono
+./hamaji < samurai.nono
+
+ +

Selected Judges Remarks:

+ +

This program solves “Nonogram”, which also known as “Paint by Numbers”:

+ +

http://en.wikipedia.org/wiki/Nonogram

+ +

This entry roar as the Year of the Dragon: A year considered +some to be good luck. Well it was certainly true that the +IOCCC was lucky to get such a fine submission!

+ +

The source code is a solution to a Paint by Numbers puzzle when you +paint by C. Try your hand at solving a few of the other .nono +files and then compare your solution with this program!

+ +

NOTE: NONOGRAM ® is a registered Trademark and is used with permission. + See http://nonogram.com/ for more information.

+ +

Author’s comments:

+ +

The format of the input files are as same as this site:

+ +

http://codegolf.com/paint-by-numbers

+ +

For example, for a simple problem which shows a glider of conway’s +lifegame.

+ +
   1
+   .
+  112
+
+1  X
+1   X
+3 XXX
+
+ +

the input should be

+ +
1
+1
+3
+-
+1
+1.1
+2
+
+ +

The width and the height of an input puzzle should be less than or +equal to 60.

+ +

When this solver finds the problem has no solution, it prints “invalid”. +This means the problem is indeed broken. For example, this happens for +an input like

+ +
2
+-
+2
+
+ +

When this solver cannot find a solution, it prints “failed”. This +failure can happen when the problem has more than one solution or the +solver cannot solve the input problem. Here is an example input of the +former:

+ +
1
+1
+-
+1
+1
+
+ +

There are two solutions:

+ +
  11
+
+1 X 
+1  X
+
+ +

and

+ +
  11
+
+1  X
+1 X 
+
+ +

Detail

+ +

Solving Nonogram is known NP-complete, so we cannot make a solver +which solves all puzzles. However, we can write a solver which solves +most problems solvable by humans. There are a bunch of ways to write +such programs. The two most obvious approaches are:

+ +
    +
  1. Check all possible solutions with backtracking.
  2. +
  3. Implement all techniques which humans use.
  4. +
+ + +

The former, brute-force approach is easy to implement. However, it +works only for smaller problems (width and height should be at most 30 +or so). Similarly, using generic probabilistic metaheuristics such as +simulated annealing doesn’t work for big problems.

+ +

http://ccl.northwestern.edu/netlogo/models/community/Nonogram

+ +

By its definition, the latter works for all human-solvable +problems. The issue of the latter approach is this kind of programs +tends to be lengthy. This approach still requires some recursions. The +most difficult problems which are considered human-solvable may +require some “guesses”. For this kind of problems, we need to assume a +cell is a space or a box, go ahead some steps with simple methods, +mark the tried cell as a box (or a space if we assumed the tried cell +is a box) if a contradiction is found.

+ +

My program uses an approach like “Set based solver” introduced in +http://www.haskell.org/haskellwiki/Nonogram . +This should be equivalent to the combinations of simple methods (no +advanced reasoning with guess). My solver also runs non-recursive +guess for each undetermined cells. So, my program should be able to +solve most human-solvable problems (assuming humans cannot execute +deeper recursions).

+ +

Obfuscation

+ +

First of all, as you see, my program looks like a nonogram puzzle +which results a dragon. This puzzle is “dragon.nono” in this +directory. Note that whitespaces in character literals, a string +literal, and around the last comment are considered as a boxed cell.

+ +

My program is based on bit operations for speed. Many values are +stored using negative logic (0 means on and 1 means off) to utilize +the initial value of global variables. Thus, it might be difficult to +figure out how it works.

+ +

My program is decently shortened, because the size of source code is +limited by IOCCC’s rule (2048 non-whitespace characters) and a lot of +characters are just wasted for numbers around the picture.

+ +

The three requirements (dragon, speed, and size) naturally ended up +with the well obfuscated code.

+ +

Portability

+ +

This program uses two C99 features. One line comments and “long long”. +GCC’s “-ansi -pedantic” check should pass:

+ +
$ gcc -ansi -pedantic -std=c99 hamaji.c
+
+ +

I checked my program with gcc-4.6.2 on linux, llvm-gcc-4.2 on mac, and +clang-3.0 on mac.

+ +

Note that the behavior of scanf differs on linux and mac, but this +program supports both semantics.

+ +

This program should not depend on sizeof(int), sizeof(void*), ASCII, +memory layout, undefined evaluation order (e.g., a[i++]=i), etc. +This program won’t work if the size of long long literal is less than 8. +By grepping the source code of gcc

+ +
grep LONG_LONG_TYPE_SIZE gcc/config/*/*
+
+ +

I found long long may be 32bit integers only on AVR.

+ +

A few more

+ +

This code is considered as a new year’s postcard in Japan. We chose +the dragon because 2012 is the year of dragon.

+ +

http://en.wikipedia.org/wiki/Japanese_New_Year#Postcards

+ +

The second author wrote the picture, and the first author did +everything else.

+ +

The dragon.nono, samurai.nono, and penguin.nono was written by the +second author. The soccer.nono was from a wikipedia entry. This file +is important because it requires some guesses. The random.nono file +was randomly generated. The codegolf.nono and face.nono have borrowed +from this site:

+ +

http://codegolf.com/paint-by-numbers

+ +

You can reproduce dragon.nono from hamaji.c using c2nono.pl:

+ +
perl c2nono.pl hamaji.c | ./hamaji
+
+ +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2012, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2011/hamaji/hint.text b/2011/hamaji/hint.text new file mode 100644 index 000000000..f67757b86 --- /dev/null +++ b/2011/hamaji/hint.text @@ -0,0 +1,211 @@ +# Best solved puzzle + +Shinichiro Hamaji + + +bsoup + + +## Judges' comments: +### To build: + + make hamaji + +### To run: + + ./hamaji < a_nonogram_file + +### Try: + + ./hamaji < dragon.nono + ./hamaji < random.nono + ./hamaji < soccer.nono + ./hamaji < codegolf.nono + ./hamaji < face.nono + ./hamaji < penguin.nono + ./hamaji < samurai.nono + +### Selected Judges Remarks: + +This program solves "Nonogram", which also known as "Paint by Numbers": + + + +This entry roar as the Year of the Dragon: A year considered +some to be good luck. Well it was certainly true that the +IOCCC was lucky to get such a fine submission! + +The source code is a solution to a Paint by Numbers puzzle when you +paint by C. Try your hand at solving a few of the other .nono +files and then compare your solution with this program! + +NOTE: NONOGRAM (r) is a registered Trademark and is used with permission. + See http://nonogram.com/ for more information. + +## Author's comments: +The format of the input files are as same as this site: + + + +For example, for a simple problem which shows a glider of [conway's +lifegame](http://en.wikipedia.org/wiki/Conway's_Game_of_Life). + + 1 + . + 112 + + 1 X + 1 X + 3 XXX + +the input should be + + 1 + 1 + 3 + - + 1 + 1.1 + 2 + +The width and the height of an input puzzle should be less than or +equal to 60. + +When this solver finds the problem has no solution, it prints "invalid". +This means the problem is indeed broken. For example, this happens for +an input like + + 2 + - + 2 + +When this solver cannot find a solution, it prints "failed". This +failure can happen when the problem has more than one solution or the +solver cannot solve the input problem. Here is an example input of the +former: + + 1 + 1 + - + 1 + 1 + +There are two solutions: + + 11 + + 1 X + 1 X + +and + + 11 + + 1 X + 1 X + +### Detail + +Solving Nonogram is known NP-complete, so we cannot make a solver +which solves all puzzles. However, we can write a solver which solves +most problems solvable by humans. There are a bunch of ways to write +such programs. The two most obvious approaches are: + +1. Check all possible solutions with backtracking. +2. Implement all techniques which humans use. + +The former, brute-force approach is easy to implement. However, it +works only for smaller problems (width and height should be at most 30 +or so). Similarly, using generic probabilistic metaheuristics such as +simulated annealing doesn't work for big problems. + + + +By its definition, the latter works for all human-solvable +problems. The issue of the latter approach is this kind of programs +tends to be lengthy. This approach still requires some recursions. The +most difficult problems which are considered human-solvable may +require some "guesses". For this kind of problems, we need to assume a +cell is a space or a box, go ahead some steps with simple methods, +mark the tried cell as a box (or a space if we assumed the tried cell +is a box) if a contradiction is found. + +My program uses an approach like "Set based solver" introduced in +[http://www.haskell.org/haskellwiki/Nonogram](http://www.haskell.org/haskellwiki/Nonogram) . +This should be equivalent to the combinations of simple methods (no +advanced reasoning with guess). My solver also runs non-recursive +guess for each undetermined cells. So, my program should be able to +solve most human-solvable problems (assuming humans cannot execute +deeper recursions). + +### Obfuscation + +First of all, as you see, my program looks like a nonogram puzzle +which results a dragon. This puzzle is "dragon.nono" in this +directory. Note that whitespaces in character literals, a string +literal, and around the last comment are considered as a boxed cell. + +My program is based on bit operations for speed. Many values are +stored using negative logic (0 means on and 1 means off) to utilize +the initial value of global variables. Thus, it might be difficult to +figure out how it works. + +My program is decently shortened, because the size of source code is +limited by IOCCC's rule (2048 non-whitespace characters) and a lot of +characters are just wasted for numbers around the picture. + +The three requirements (dragon, speed, and size) naturally ended up +with the well obfuscated code. + +### Portability + +This program uses two C99 features. One line comments and "long long". +GCC's "-ansi -pedantic" check should pass: + + $ gcc -ansi -pedantic -std=c99 hamaji.c + +I checked my program with gcc-4.6.2 on linux, llvm-gcc-4.2 on mac, and +clang-3.0 on mac. + +Note that the behavior of scanf differs on linux and mac, but this +program supports both semantics. + +This program should not depend on sizeof(int), sizeof(void*), ASCII, +memory layout, undefined evaluation order (e.g., a[i++]=i), etc. +This program won't work if the size of long long literal is less than 8. +By grepping the source code of gcc + + grep LONG_LONG_TYPE_SIZE gcc/config/*/* + +I found long long may be 32bit integers only on AVR. + +### A few more + +This code is considered as a new year's postcard in Japan. We chose +the dragon because 2012 is the year of dragon. + + + +The second author wrote the picture, and the first author did +everything else. + +The dragon.nono, samurai.nono, and penguin.nono was written by the +second author. The soccer.nono was from a wikipedia entry. This file +is important because it requires some guesses. The random.nono file +was randomly generated. The codegolf.nono and face.nono have borrowed +from this site: + + + +You can reproduce dragon.nono from hamaji.c using c2nono.pl: + + perl c2nono.pl hamaji.c | ./hamaji + +-------------------------------------------------------------------------------- + diff --git a/2011/hamaji/penguin.nono b/2011/hamaji/penguin.nono new file mode 100644 index 000000000..e78678ae3 --- /dev/null +++ b/2011/hamaji/penguin.nono @@ -0,0 +1,45 @@ +6 +8 +3.5 +2.4 +3.1.4 +2.1.4 +5.5 +3.5.2 +6.2 +1.3 +2.2 +2.2.2.2 +2.1.5.1.2 +1.1.3.1 +4.5 +1.1 +1.1 +1.1 +1.1 +1.1 +1.1.1.1 +1.2.3.2 +14 +6.3 +- +2.3 +3.2.1 +1.2.1.1.1 +3.2.1.8.2 +3.8.3 +3.1.1.2 +2.1.1.1.2 +2.2.1.4 +3.2.1.3 +4.3.1.1 +8.2.1 +7.1.2 +5.4 +4.3 +3.2.2 +2.3.2 +2.2.6 +2.1 +2.1 +3 diff --git a/2011/hamaji/random.nono b/2011/hamaji/random.nono new file mode 100644 index 000000000..c22f9cee7 --- /dev/null +++ b/2011/hamaji/random.nono @@ -0,0 +1,19 @@ +1.1.1.1 +3.3 +2.2.1 +5 +3.1.1 +2 +1.1.3 +2.3.1 +5 +2.1.1 +- +1.1.1.1 +4.2 +1.2.2 +4.4 +3.2 +2.1.5 +2.3.1 +2.2.1 diff --git a/2011/hamaji/samurai.nono b/2011/hamaji/samurai.nono new file mode 100644 index 000000000..f625e8dc0 --- /dev/null +++ b/2011/hamaji/samurai.nono @@ -0,0 +1,73 @@ +3 +5 +6 +5.4 +7.5 +3.7 +5.7 +6 +6 +5 +8 +11 +13 +14 +15 +16 +18 +19 +21 +4.16 +3.5.9 +3.3.9 +2.11 +2.14 +1.18 +21 +24 +25 +12.11 +9.10 +9.9 +10.4 +7.3 +4.2 +3.5 +3.5 +- +2 +2 +2 +1 +2 +2 +2 +2.2 +2.4 +2.5 +2.2.6 +3.7.1 +1.4.7 +1.6.7 +1.1.6.7 +3.8.7 +3.9.8 +3.10.9 +2.9.9 +3.19 +3.19 +3.19 +3.2.18 +3.5.18 +29 +1.27 +28 +28 +5.6.9 +3.8 +9 +12 +12 +9.2 +6.2 +2 diff --git a/2011/hamaji/soccer.nono b/2011/hamaji/soccer.nono new file mode 100644 index 000000000..d30c8836f --- /dev/null +++ b/2011/hamaji/soccer.nono @@ -0,0 +1,41 @@ +3 +5 +3.1 +2.1 +3.3.4 +2.2.7 +6.1.1 +4.2.2 +1.1 +3.1 +6 +2.7 +6.3.1 +1.2.2.1.1 +4.1.1.3 +4.2.2 +3.3.1 +3.3 +3 +2.1 +- +2 +1.2 +2.3 +2.3 +3.1.1 +2.1.1 +1.1.1.2.2 +1.1.3.1.3 +2.6.4 +3.3.9.1 +5.3.2 +3.1.2.2 +2.1.7 +3.3.2 +2.4 +2.1.2 +2.2.1 +2.2 +1 +1 diff --git a/2011/hint.css b/2011/hint.css new file mode 100644 index 000000000..cb24837ff --- /dev/null +++ b/2011/hint.css @@ -0,0 +1,77 @@ +* { + font-family: Helvetica Neue, Helvetica, Arial, sans-serif; +} +body { + max-width: 50em; + margin: 0 auto; + color: #111; +} + +pre, code { + font-family: Monaco, Courier New, monospace; + font-size: 12px; +} + +h1 { + font-size: 40px; + font-weight: bold; + letter-spacing: -1px; + margin-bottom: -5px; +} +h1 code { + font-size: 40px; +} + +h2 { + color: rgb(43,105,145); + font-weight: bold; + margin-bottom: -5px; +} +h2 code { + font-size: 22px; +} + +h3 { + /* color: rgb(43,105,145); */ + font-weight: bold; + margin-bottom: -5px; +} +h3 code { + font-size: 16px; +} + +a { + color: blue; + text-decoration: underline; +} +a:visited { + color: navy; +} +a:hover { + text-decoration: underline; +} + +pre { + border-radius: 10px; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + border-width: 1px; + border-color: rgb(16,48,0); + border-style: solid; + padding: 0.6em; + padding-left: 1em; + margin-left: 5%; + margin-right: 8%; + background-color: rgb(16,48,0); + overflow: auto; + color: rgb(75,224,0); +} + +p, li { + font-size: 14px; + line-height: 18px; +} + diff --git a/2011/hou/Makefile b/2011/hou/Makefile new file mode 100644 index 000000000..bb771901d --- /dev/null +++ b/2011/hou/Makefile @@ -0,0 +1,117 @@ +#!/usr/bin/env make +# +# 2011 makefile +# +# Copyright (C) 2011, Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis. +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +OPT= -O2 + +# bitness +# +# Some entries require 32-bitness, +# other entries require 64-bitess. +# By default we assume nothing. +# +ARCH= + +# default flags for ANSI C compilation +# +CFLAGS= -Wall -W -ansi -pedantic ${ARCH} ${OPT} -lm + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= hou +DATA= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} + +# alternative executable +# +alt: + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o + +clobber: clean + ${RM} -f ${ENTRY} + +nuke: clobber + @echo gnab gib! + +install: + @echo "Surely you're joking Mr. Feynman!" + +# backwards compatibility +# +build: all + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to partly misunderstand this final echo. + @${TRUE} diff --git a/2011/hou/hint.html b/2011/hou/hint.html new file mode 100644 index 000000000..084b5175e --- /dev/null +++ b/2011/hou/hint.html @@ -0,0 +1,145 @@ + + + + + + + Best self documenting program + + +

Best self documenting program

+ +

Hou Qiming
+hqm03ster@gmail.com

+ +

Judges' comments:

+ +

To build:

+ +
make hou
+
+ +

To run:

+ +
./hou 'a calculator expression -- see the C Code for details'
+
+ +

Try:

+ +
./hou 11/26+222/31
+
+./hou 'log((21701-19937)-(23209-21701))/log(2)'
+
+./hou 'sin(1.5708)+0.04321+log(sqrt(exp(1*1*1)))+(1+2*3)-0.4-0.6+(4+6)*(2-1+2*3)-tan(0.785398)+2*10/3*6*sqrt(16/2/2)*10+10000-1000'
+
+ +

Selected Judges Remarks:

+ +

This self-documenting scientific calculator compiles clean with no +warnings under the most strict pedantic mode of gcc and clang.

+ +

The first example, along with the correct result appears in the +source code. What does it mean?

+ +

The calculator obeys the precendence rules and allows parenthesis,

+ +
    ./hou '1+2*3'
+    ./hou '(1+2)*3'
+
+ +

What exactly does the text formatting do?

+ +

What does this evaluate to in C?

+ +
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
+
+ +

Self documenting source

+ +

Comments would almost be redundant. :-}

+ +

The ASCII art is valid C code

+ +

Not just fancy formatted comment removed by the C Pre-processor

+ +

The only multi-byte strings are format strings

+ +

The code does not contain some simple string-encoded lookup table for calculator operations.

+ +

Example input and output in the source

+ +

The example input and output in the C code is significant. Can you find out why?

+ +

The button layout

+ +

The button layout in the C code is significant … not just a nice looking layout.

+ +

input parsing

+ +

The parser is functionally equivalent to a normal arithmetic parser for all valid inputs. +For another fun challenge: try to determine how it parses the command line argument.

+ +

Author’s comments:

+ +

Obfuscations

+ +

This program is designed to be self-documenting. It doesn’t just provide an +example command line. It also provides the expected output and illustrates all +supported functionality using embedded ASCII art.

+ +
    +
  • A few line numbers are significant and careless beautification will break the program.
  • +
  • The entire ASCII art is valid code. The preprocessor won’t remove any part of it.
  • +
  • The only strings longer than 1 byte are printf/sscanf format strings, even +after preprocessing. No string-encoded lookup table is used.
  • +
  • The example input and its expected output are both algorithmically significant.
  • +
  • The button layout is also significant.
  • +
  • The actual syntax being parsed is not the obvious, despite being +functionally equivalent for all correct inputs.
  • +
+ + +

Portability

+ +
    +
  • This program requires “argv” to point to writable memory. It doesn’t require +the actual argv strings to be writable, though.
  • +
  • This program requires ASCII.
  • +
  • This program doesn’t work with %e style numbers like “1e-4”.
  • +
  • Some seemingly redundant code works to eliminate warnings and evade a gcc bug.
  • +
+ + +

Spoilers

+ +

The parser parses function names, substraction, and division as single-letter +unary operators. A bitmask encoded hash table is used to check no-ops/digits +and another hash function maps the ASCII to a function ordinal, which is then +executed by the button panel.

+ +

Both hash functions are found using a separate search program. Another program +is used to find a way to format one hash function as example input such that +it produces something resembling the bitmask hash table as part of its output.

+ +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2012, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2011/hou/hint.text b/2011/hou/hint.text new file mode 100644 index 000000000..ff18a934f --- /dev/null +++ b/2011/hou/hint.text @@ -0,0 +1,111 @@ +# Best self documenting program + +Hou Qiming + + + +## Judges' comments: +### To build: + + make hou + +### To run: + + ./hou 'a calculator expression -- see the C Code for details' + +### Try: + + ./hou 11/26+222/31 + + ./hou 'log((21701-19937)-(23209-21701))/log(2)' + + ./hou 'sin(1.5708)+0.04321+log(sqrt(exp(1*1*1)))+(1+2*3)-0.4-0.6+(4+6)*(2-1+2*3)-tan(0.785398)+2*10/3*6*sqrt(16/2/2)*10+10000-1000' + +### Selected Judges Remarks: + +This self-documenting scientific calculator compiles clean with no +warnings under the most strict pedantic mode of gcc and clang. + +The first example, along with the correct result appears in the +source code. What does it mean? + +The calculator obeys the precendence rules and allows parenthesis, + + ./hou '1+2*3' + ./hou '(1+2)*3' + +What exactly does the text formatting do? + +What does this evaluate to in C? + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ + +#### Self documenting source + +Comments would almost be redundant. :-} + +#### The ASCII art is valid C code + +Not just fancy formatted comment removed by the C Pre-processor + +#### The only multi-byte strings are format strings + +The code does not contain some simple string-encoded lookup table for calculator operations. + +#### Example input and output in the source + +The example input and output in the C code is significant. Can you find out why? + +#### The button layout + +The button layout in the C code is significant ... not just a nice looking layout. + +#### input parsing + +The parser is functionally equivalent to a normal arithmetic parser for all valid inputs. +For another fun challenge: try to determine how it parses the command line argument. + + +## Author's comments: +### Obfuscations + +This program is designed to be self-documenting. It doesn't just provide an +example command line. It also provides the expected output and illustrates all +supported functionality using embedded ASCII art. + +- A few line numbers are significant and careless beautification will break the program. +- The entire ASCII art is valid code. The preprocessor won't remove any part of it. +- The only strings longer than 1 byte are printf/sscanf format strings, even + after preprocessing. No string-encoded lookup table is used. +- The example input and its expected output are both algorithmically significant. +- The button layout is also significant. +- The actual syntax being parsed is not the obvious, despite being + functionally equivalent for all correct inputs. + +### Portability + +- This program requires "argv" to point to writable memory. It doesn't require + the actual argv strings to be writable, though. +- This program requires ASCII. +- This program doesn't work with %e style numbers like "1e-4". +- Some seemingly redundant code works to eliminate warnings and evade a gcc bug. + +### Spoilers + +The parser parses function names, substraction, and division as single-letter +unary operators. A bitmask encoded hash table is used to check no-ops/digits +and another hash function maps the ASCII to a function ordinal, which is then +executed by the button panel. + +Both hash functions are found using a separate search program. Another program +is used to find a way to format one hash function as example input such that +it produces something resembling the bitmask hash table as part of its output. + +-------------------------------------------------------------------------------- + diff --git a/2011/hou/hou.c b/2011/hou/hou.c new file mode 100644 index 000000000..56fc49767 --- /dev/null +++ b/2011/hou/hou.c @@ -0,0 +1,34 @@ +#include +#include +#define clear 1;if(c>=11){c=0;sscanf(_,"%lf%c",&r,&c);while(*++_-c);}\ + else if(argc>=4&&!main(4-(*_++=='('),argv))_++;g:c+= +#define puts(d,e) return 0;}{double a;int b;char c=(argc<4?d)&15;\ + b=(*_%__LINE__+7)%9*(3*e>>c&1);c+= +#define I(d) (r);if(argc<4&&*#d==*_){a=r;r=usage?r*a:r+a;goto g;}c=c +#define return if(argc==2)printf("%f\n",r);return argc>=4+ +#define usage main(4-__LINE__/26,argv) +#define calculator *_*(int) +#define l (r);r=--b?r: +#define _ argv[1] +#define x + +double r; +int main(int argc,char** argv){ + if(argc<2){ + puts( + usage: calculator 11/26+222/31 + +~~~~~~~~~~~~~~~~~~~~~~~~calculator-\ + ! 7.584,367 ) + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ + ! clear ! 0 ||l -x l tan I (/) | + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ + ! 1 | 2 | 3 ||l 1/x l cos I (*) | + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ + ! 4 | 5 | 6 ||l exp l sqrt I (+) | + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ + ! 7 | 8 | 9 ||l sin l log I (-) | + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(0 + ); + } + return 0; +} diff --git a/2011/konno/Makefile b/2011/konno/Makefile new file mode 100644 index 000000000..a359f703e --- /dev/null +++ b/2011/konno/Makefile @@ -0,0 +1,127 @@ +#!/usr/bin/env make +# +# 2011 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Compiler warnings +# +CWARN= -Wall -W + +# compiler standard +# +CSTD= -ansi + +# compiler bit architecture +# +# Some entries require 32-bitness, +# other entries require 64-bitess. +# By default we assume nothing. +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +OPT= -O2 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= konno +DATA= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} + +# alternative executable +# +alt: + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o + +clobber: clean + ${RM} -f ${ENTRY} + +nuke: clobber + @echo gnab gib! + +install: + @echo "Surely you're joking Mr. Feynman!" + +# backwards compatibility +# +build: all + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to partly misunderstand this final echo. + @${TRUE} diff --git a/2011/konno/hint.html b/2011/konno/hint.html new file mode 100644 index 000000000..dda37b986 --- /dev/null +++ b/2011/konno/hint.html @@ -0,0 +1,85 @@ + + + + + + + Best one liner + + +

Best one liner

+ +

Taketo Konno
+Tokyo, Japan
+inaniwa3@gmail.com

+ +

Judges' comments:

+ +

To build:

+ +
make konno
+
+ +

To run:

+ +
./konno just_a_single_argument_of_lower_case_letters
+
+ +

Try:

+ +
./konno qwerty
+./konno ioccc
+./konno "the quick brown fox jumps over the lazy dog"
+
+ +

Selected Judges Remarks:

+ +

This tiny program outputs what looks like a tiny keyboard.
+OK, so the letters are missing. But that is no problem because +this program identifes the lower case letters that were pressed!

+ +

It is one of those minimal keyboards without all of those +confusing symbols keys. No shift for SHOULDING CAPS +but at least it does not have that useless caps lock key!

+ +

We recommend that you completely deconstruct / figure out +how this program works and does what it does. Can you +extend this program to deal with a full QWERTY keyboard? +Can you then minimize the size of that code?

+ +

Author’s comments:

+ +

Limitation

+ +

This program ignores non-lower case letters.

+ +

Obfuscation

+ +
    +
  • “for” is not used.
  • +
  • A part of program is encrypted.
  • +
+ + +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2012, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2011/konno/hint.text b/2011/konno/hint.text new file mode 100644 index 000000000..6fbaf91a7 --- /dev/null +++ b/2011/konno/hint.text @@ -0,0 +1,55 @@ +# Best one liner + +Taketo Konno +Tokyo, Japan + + + +## Judges' comments: +### To build: + + make konno + +### To run: + + ./konno just_a_single_argument_of_lower_case_letters + +### Try: + + ./konno qwerty + ./konno ioccc + ./konno "the quick brown fox jumps over the lazy dog" + +### Selected Judges Remarks: + +This tiny program outputs what looks like a tiny keyboard. +OK, so the letters are missing. But that is no problem because +this program identifes the lower case letters that were pressed! + +It is one of those minimal keyboards without all of those +confusing symbols keys. No shift for SHOULDING CAPS +but at least it does not have that useless caps lock key! + +We recommend that you completely deconstruct / figure out +how this program works and does what it does. Can you +extend this program to deal with a full QWERTY keyboard? +Can you then minimize the size of that code? + +## Author's comments: +### Limitation + +This program ignores non-lower case letters. + +### Obfuscation + +* "for" is not used. +* A part of program is encrypted. + +-------------------------------------------------------------------------------- + diff --git a/2011/konno/konno.c b/2011/konno/konno.c new file mode 100644 index 000000000..1db5ef38a --- /dev/null +++ b/2011/konno/konno.c @@ -0,0 +1 @@ +main(_,l)char**l;{6*putchar(--_%20?_+_/21&56>_?strchr(1[l],_^"pt`u}rxf~c{wk~zyHHOJ]QULGQ[Z"[_/2])?111:46:32:10)^_&&main(2+_,l);} diff --git a/2011/richards/Makefile b/2011/richards/Makefile new file mode 100644 index 000000000..9d8550642 --- /dev/null +++ b/2011/richards/Makefile @@ -0,0 +1,117 @@ +#!/usr/bin/env make +# +# 2011 makefile +# +# Copyright (C) 2011, Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis. +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +OPT= -O2 + +# bitness +# +# Some entries require 32-bitness, +# other entries require 64-bitess. +# By default we assume nothing. +# +ARCH= + +# default flags for ANSI C compilation +# +CFLAGS= -Wall -W ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= richards +DATA= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} + +# alternative executable +# +alt: + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o + +clobber: clean + ${RM} -f ${ENTRY} + +nuke: clobber + @echo gnab gib! + +install: + @echo "Surely you're joking Mr. Feynman!" + +# backwards compatibility +# +build: all + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to partly misunderstand this final echo. + @${TRUE} diff --git a/2011/richards/hint.html b/2011/richards/hint.html new file mode 100644 index 000000000..d5d5bded9 --- /dev/null +++ b/2011/richards/hint.html @@ -0,0 +1,112 @@ + + + + + + + Most surprisingly portable + + +

Most surprisingly portable

+ +

Gregor Richards
+Richards@codu.org

+ +

Judges' comments:

+ +

To build:

+ +
make richards
+
+ +

To run:

+ +
./richards
+
+ +

Try:

+ +
echo '10 9 8 7 6 5 4 3 2 1*p*p*p*p*p*p*p*p*p' | ./richards
+
+ +

Selected Judges Remarks:

+ +

Oh no, yet another dc-style calculator? (see 2000/dlowe using an embedded Perl +interpreter and deemed Worst Abuse of the Rules). +Well, this one does it (expression calculation, that is, not the rule abuse) in a different way. +The author claims that his calculator does just-in-time compilation. +What would you do to prove or disprove his claim without attempting to unravel the source?

+ +

Author’s comments:

+ +

This is an implementation of the classic UNIX dc command, the reverse-polish +calculator. Actually it’s a pretty bad implementation, since it only implements +32-bit integers (well, sizeof(int)-sized integers). It only implements the +commands +, -, *, /, p (only for numbers), register stacks, macros and +comparisons. Wow, you’d think I could’ve done better in 2K of code.

+ +

OH! I forgot to mention! It’s a JIT.

+ +

Wait, don’t stop reading! I know what you’re thinking, platform-specific code +is discouraged in IOCCC. But do you see any platform-specific code? There’s no +assembler here! This JIT works on a dozen platforms, and the only +platform-specific assumptions it makes are that the stack grows down and +integers are at least 32-bit.

+ +

You will probably get warnings while compiling the code. In particular:

+ +
    +
  • If your system requires the inclusion of alloca.h to use alloca, use the +compile flag -DAH
  • +
  • If your system cannot use mmap, use the compile flag -DNM
  • +
  • I don’t include any headers I don’t strictly need to, so you’ll get warnings +about (at least) memcpy, isdigit, atoi, calloc, malloc and alloca if you +didn’t use -DAH.
  • +
  • GCC likes to complain about while (a = b) (assignments as a condition).
  • +
  • I don’t return from main, even though it’s declared to return int.
  • +
+ + +

Platforms on which all known/tested optimization levels work with no additional +flags:

+ +
    +
  • gcc 4.6.2 + x86[_64] + GNU/Linux, Mac OS X or Windows
  • +
  • clang 2.9-16 + x86[_64] + GNU/Linux or Mac OS X
  • +
  • tcc 0.9.25
  • +
  • gcc 4.4.5 + alpha, arm, mips[el], powerpc[64], s390x (IBM zSeries)
  • +
  • gcc 4.1.3 + vax + NetBSD
  • +
+ + +

Platforms which work but not at all optimization levels or needing special +flags:

+ +
    +
  • owcc 1.9 + x86 + Windows: Needs -DNM -DAH -fno-stack-check
  • +
  • gcc 4.4.5 + sh4: -O0 works, higher optimization levels don’t work for unknown reasons.
  • +
+ + +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2012, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2011/richards/hint.text b/2011/richards/hint.text new file mode 100644 index 000000000..c34c5aad7 --- /dev/null +++ b/2011/richards/hint.text @@ -0,0 +1,76 @@ +# Most surprisingly portable + +Gregor Richards + + + +## Judges' comments: +### To build: + + make richards + +### To run: + + ./richards + +### Try: + + echo '10 9 8 7 6 5 4 3 2 1*p*p*p*p*p*p*p*p*p' | ./richards + +### Selected Judges Remarks: + +Oh no, yet another dc-style calculator? (see 2000/dlowe using an embedded Perl +interpreter and deemed Worst Abuse of the Rules). +Well, this one does it (expression calculation, that is, not the rule abuse) in a different way. +The author claims that his calculator does just-in-time compilation. +What would you do to prove or disprove his claim without attempting to unravel the source? + +## Author's comments: +This is an implementation of the classic UNIX dc command, the reverse-polish +calculator. Actually it's a pretty bad implementation, since it only implements +32-bit integers (well, sizeof(int)-sized integers). It only implements the +commands +, -, *, /, p (only for numbers), register stacks, macros and +comparisons. Wow, you'd think I could've done better in 2K of code. + +OH! I forgot to mention! It's a JIT. + +Wait, don't stop reading! I know what you're thinking, platform-specific code +is discouraged in IOCCC. But do you see any platform-specific code? There's no +assembler here! This JIT works on a dozen platforms, and the only +platform-specific assumptions it makes are that the stack grows down and +integers are at least 32-bit. + +You will probably get warnings while compiling the code. In particular: + + * If your system requires the inclusion of alloca.h to use alloca, use the + compile flag -DAH + * If your system cannot use mmap, use the compile flag -DNM + * I don't include any headers I don't strictly need to, so you'll get warnings + about (at least) memcpy, isdigit, atoi, calloc, malloc and alloca if you + didn't use -DAH. + * GCC likes to complain about while (a = b) (assignments as a condition). + * I don't return from main, even though it's declared to return int. + +Platforms on which all known/tested optimization levels work with no additional +flags: + + * gcc 4.6.2 + x86[_64] + GNU/Linux, Mac OS X or Windows + * clang 2.9-16 + x86[_64] + GNU/Linux or Mac OS X + * tcc 0.9.25 + * gcc 4.4.5 + alpha, arm, mips[el], powerpc[64], s390x (IBM zSeries) + * gcc 4.1.3 + vax + NetBSD + +Platforms which work but not at all optimization levels or needing special +flags: + + * owcc 1.9 + x86 + Windows: Needs -DNM -DAH -fno-stack-check + * gcc 4.4.5 + sh4: -O0 works, higher optimization levels don't work for unknown reasons. + +-------------------------------------------------------------------------------- + diff --git a/2011/richards/richards.c b/2011/richards/richards.c new file mode 100644 index 000000000..cc74c5a6b --- /dev/null +++ b/2011/richards/richards.c @@ -0,0 +1,199 @@ +#ifdef AH +#include +#endif +#include +#include +#if !NM +#include +#endif +#define vo volatile +#define A(x,y,z) O(x,y,z##1)O(x,y,z##2)O(x,y,z##3) +#define B(x,y) A(x,y,1)A(x,y,2)A(x,y,3) +#define C(x,y) B(x,y##1)B(x,y##2)B(x,y##3) +#define D(x) C(x,1)C(x,2)C(x,3) +#define E(x) D(x##1)D(x##2)D(x##3) +#define G E(1)E(2)E(3) +#define S d-> +#define M S a +#define R(x) ; S r(#x); +#define L(x,y) S l[x](d)R(y) +#define F(x) void l##x(vo dt d) { +#define Q(x); M--; *M=*M x M[1]; R(x) +#define O(x,y,z) x##y##z, +#define q typedef +#define H 9<<16 +#define I case +#define J(i) calloc(i,1) +#define W(c) e=(k*)memcpy(e,x[(u)c],y[(u)c])+y[(u)c]; +#define N break; I +q char k; +q void o; +q int u; +q o(*f) (vo o *); +q struct { + u *a, **R, *m, h, c; + k **s; + f *l, *j, r; +} *dt; +u m[] = { G 0 } ; + +u n[H]; +dt st; +u sk[H]; +k *w; +o *x[H]; +u y[H]; +k *j, *e; +u l=256; +o g(u v) +{ + if (v > l) { + g(v / l); + g(l); + W('*') g(v % l); + W('+')} else { + W(m[v])} +} + +f K(k * p, dt d) +{ + k c, n = 0; + f r = (f) e; + W(1) while ((c = *p)) { + switch (c) { + I '#': + while (*++p != 10); + N '[':c = 1; + S s[S c] = ++p; + for (; c; p++) { + if (*p == '[') + c++; + else if (*p == ']') + c--; + } + p[-1] = 0; + g(S c++); + N '!':n = 1; + c = *++p; + if (!(c & 1)) + I '<': I '>': + c ^= 2; + I '=':W(c) if (n) { + W('!') n = 0; + } + g(*++p); + W('|') p++; + N 's': I 'S': I 'l': + I 'L':g(*++p); + W(c) p++; + N '_':p++; + default: + if (isdigit(*p)) { + g(atoi(p)); + while (isdigit(*p)) + p++; + } else + p++; + W(c)} + } + W(2) return r; +} + +o t(vo dt d) +{ + S r("\01") Q(+)Q(-)Q(*) * M = -*M; + R(_)Q( ==) Q(<)Q(>) * M = !*M; + R(!)M[-1] ^= *M; + *M ^= M[-1] R(r) M[1] = *M; + M++ R(d) * S R[*M] = M[-1]; + M--; + R(s) * ++S R[*M] = M[-1]; + M--; + R(S) * M = *S R[*M]; + R(l) * M = *S R[*M]--; + R(L) L(1, /)L(2, p) L(3, x) L(4, |) +#undef O +#define O(x,y,z) *++M=S m[(x*S h+y)*S h+z]; S r(""); + G S l[0] (d); +} + +o T() +{ +} + +o rd(u v) +{ + k *a = 0, **b = &a, **c = b + 32; + x[v] = w; + for (; b < c && (*b < w || *b > (k *) T || *b == (k *) (long) v); b++); + if (b == c) { + jmp_buf *j = alloca(sizeof(*j)); + setjmp(*j); + rd(v); + } else { + y[v] = *b - w; + w = *b; + } +} + +q o(*rt) (u); +vo rt rs = rd; +o re(vo k * rec) +{ + static u i = 0; + *(st->a = sk + 9) = 0; + rs(*rec ? *rec : m[i++]); +} F(d) M--; + +*M /= M[1]; +} F(p) printf("%d\n", *M); +} F(x) u n = *M--; + +if (!S j[n]) +S j[n] = K(S s[n], d); +S j[n] (d); +} + +F(1) M -= 2; +if (M[1]) +{ +M++; +*M = *S R[M[1]]; +lx(d); +} +} +o *lib1[] = { T, T, T, T, T } ; +o *lib2[] = { T, ld, lp, lx, l1 } ; + +u main() +{ + u i; + k *b; + dt d = st = J(sizeof(*st)); + M = sk + 9; + S R = J(l * sizeof(k *)); + for (i = 0; i < l; i++) + S R[i] = J(H); + S m = n; + S s = J(H); + S l = (f *) lib1; + S j = J(H); + S r = (f) re; + for (i = 0; m[i]; i++) + n[m[i]] = i; + w = (k *) t; + t(d); + x[2] = w; + y[2] = (k *) T - w + 8; + S h = 100; + S l = (f *) lib2; + S r = (f) T; + j = e = +#if NM + malloc(H); +#else + mmap(0, H, -1, MAP_PRIVATE | MAP_ANON, -1, 0); +#endif + while (b = fgets(malloc(999), 999, stdin)) + ((f) K(b, d)) (d); +} diff --git a/2011/rules.txt b/2011/rules.txt new file mode 100644 index 000000000..dd80cd9d9 --- /dev/null +++ b/2011/rules.txt @@ -0,0 +1,149 @@ + 20th International Obfuscated C Code Contest Rules + +Copyright (C) 2006,2011 Leonid A. Broukhis, Simon Cooper, Landon Curt Noll + +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in +writing from the contest judges. + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: his emotions obfuscated his + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show the importance of programming style, in an ironic way. + * To stress C compilers with unusual code. + * To illustrate some of the subtleties of the C language. + * To provide a safe forum for poor C code. :-) + +The 20th IOCCC contest window is: + +| 12-Nov-2011 11:00:00 UTC to 12-Jan-2012 12:12:12 UTC + +RULES: + + To help us with the volume of entries, we ask that you follow these rules: + + 1) Your entry must be a complete program. + + 2) The size of your program source must be <= 4096 bytes in length. + The number of characters excluding whitespace (tab, space, + newline, formfeed, return), and excluding any ; { or } immediately + followed by whitespace or end of file, must be <= 2048. + + 3) Submissions should be performed using the instructions outlined at, + +| https://submit.ioccc.org/ + +| (Will be available 2011-12-01) + + 4) If your entry is selected as a winner, it will be modified as follows: + + Your 'build' instructions will be incorporated into a + makefile. If your build instructions *is* a makefile then + it should be portable and usable from within a master + makefile. + + Your program source will be renamed using an identifier of + our choice (usually your family name or anonymous) followed + by an optional digit, followed by '.c' + + Your entry will be compiled into a file with the above name + minus the '.c'. + + If your entry requires that a build file exist, state so in + your entry's remark section. The makefile will be arranged to + execute a build shell script containing the 'build' + information. The name of this build shell script will be your + entry's title, possibly followed by a digit, followed by '.sh'. + + If needed, your entry's remarks should indicate how your entry + must be changed in order to deal with the new filenames. + + 5) The build file, the source and the resulting executable should be + treated as read-only files. If your entry needs to modify these files, + it should make and modify a copy of the appropriate file. If this + occurs, state so in your entry's remarks. + + 6) Your program source must be able to be compiled cleanly by an ANSI C + compiler, or if there are any compile errors, they must be documented + in the "remarks" section of your submission. + + 7) The program must be of original work. All submitted programs are + are thereby put in the public domain. All explicitly copyrighted + programs will be rejected. + +| 8) Entries must be received prior to 12-Jan-2012 12:12:12 UTC. + + An EMail a confirmation of submission will be sent to the sender + before the close of the contest. + + 9) Each person may submit up to 8 entries per contest year. Each entry + must be submitted separately. + + 10) Entries requiring human interaction to be built are not permitted. + + 11) Programs that require special privileges (setuid, setgid, super-user, +| special owner or group) are highly discouraged. + + 12) Legal abuse of the rules is somewhat encouraged. An entry that, in + the opinion of the judges, violates the rules will be disqualified. + Entries that attempt to abuse the rules must try to justify why + their rule abuse is legal in the submitted "remarks". + + 13) Your source may not contain unescaped octets with the high bit set. + I.e., your source may not contain octet values between 128 and 255. + + 14) Any program that fails to compile because of lines with trailing + control-M's (\r or \015) will be rejected. + + 15) When you submit your entry you must have a valid email address + that can both send and receive email. The online submission + method is a two phase process that requires the use of an + approval code. This code will be emailed to you as part of + phase 1. + + Entries submitted without a working or valid email address will + be disqualified. + + The judges are not responsible for delays in email, please plan + enough time for one automated exchange of email as part of your + submission. + + 16) You are STRONGLY encouraged to submit an original entry. + Submissions that are similar to previous entries are discouraged. + +| 17) The total size of your submission: the sum of the size of the program, +| hints, comments, build and info files MUST be less than one megabyte +| in size. + +FOR MORE INFORMATION: + + The judging will be done by Leonid A. Broukhis, Simon Cooper, Landon +| Curt Noll, this list may be updated before the close of the competition. +| Please send questions or comments about the contest, to: + +| q.2011@ioccc.org (for questions only!) + +| You must include the words ``ioccc 2011 question'' in the subject of + your EMail message when sending EMail to the judges. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, visit the IOCCC web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + Details of how to submit your entry will be made available on 2011-12-01 + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ diff --git a/2011/toledo/Makefile b/2011/toledo/Makefile new file mode 100644 index 000000000..1f5badf0f --- /dev/null +++ b/2011/toledo/Makefile @@ -0,0 +1,125 @@ +#!/usr/bin/env make +# +# 2011 makefile +# +# Copyright (C) 2011, Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis. +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +OPT= -O2 + +# bitness +# +# Some entries require 32-bitness, +# other entries require 64-bitess. +# By default we assume nothing. +# +ARCH= + +# default flags for ANSI C compilation +# +CFLAGS= -Wall -W -ansi ${ARCH} ${OPT} -I${X11_INCDIR} -L${X11_LIBDIR} -lX11 -lm -DA=XK_Up:XK_w -DB=XK_Left:XK_a -DC=XK_Right:XK_d -DD=XK_Down:XK_s -DE=XK_BackSpace:XK_Tab "-DQ=XFillRectangle(W,X,Y," + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= toledo +DATA= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} + +# alternative executable +# +alt: + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o + +clobber: clean + ${RM} -f ${ENTRY} + +nuke: clobber + @echo gnab gib! + +install: + @echo "Surely you're joking Mr. Feynman!" + +# backwards compatibility +# +build: all + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to partly misunderstand this final echo. + @${TRUE} diff --git a/2011/toledo/hint.html b/2011/toledo/hint.html new file mode 100644 index 000000000..ab7976716 --- /dev/null +++ b/2011/toledo/hint.html @@ -0,0 +1,291 @@ + + + + + + + Best non-chess game + + +

Best non-chess game

+ +

Oscar Toledo G.
+Av. Sta. Cruz del Monte 9-304
+Cd. Satelite. Edo. de Mexico.
+CP. 53110. Mexico.
+biyubi@gmail.com
+http://nanochess.110mb.com/

+ +

Judges' comments:

+ +

To build:

+ +
make toledo
+
+ +

To run:

+ +
./toledo
+
+# NOTE: This requires X11 to run or modifications to use layer.c on
+# Windows
+
+ +

Try:

+ +
./toledo
+
+ +

Selected Judges Remarks:

+ +

This two player game uses X11. The control keys can be configured by +modifying the A,B,C and D macros at compilation.

+ +

After a quick splash screen the objective should be clear. There +are Red, Green and Cyan tanks. A larger window can be made by altering +the source early on, right before the code gets hard to follow.

+ +

Like Oscar’s previous winning X11 program for the 19th IOCCC, if +you remove both the X11 include files and replace them with

+ +
#include "layer.c"
+
+ +

you ought to be able to compile and run this program on Windows.

+ +

Author’s comments:

+ +
    /=========\                 
+    \==\   /==/                ||
+       || ||   /====\  |\/=\   ||      //==\   ==\ |=\
+       || ||       ||  ||  ||  ||  //  ||       =| | |
+       || ||   //===|  ||  ||  ||=//   \\=\\   ==/ |=/
+       || ||   ||  ||  ||  ||  || \\      ||   User's
+       \===/   \\==//  ||  ||  ||  \\  \==//   Manual
+
+ +

This is a color X11 3D tank-game for two players, just compile +and run it without arguments.

+ +

You will see briefly a tank spinning before each level.

+ +

Left half of the window shows the red player view and right +half shows the green player view, the background will change to +blue when the view goes inactive.

+ +

The objective is to chase and destroy the other player’s tank, +there is also an aqua tank for testing your aim and getting +extra points.

+ +

Caveat: You can shoot only 3 bullets at a time. +Trick: You can fire faster if they explode on anything. +Believe it or not, it has strategy!

+ +

When only one tank remains on the field, the level will advance. +Don’t forget to destroy the aqua tank.

+ +

The playground is surrounded by mountains and each level is +filled with random obstacles (pyramids and cubes).

+ +

The bars show players energy and score, each bar shows energy +and indicates current player view (wider on the left), right +part grows with every point.

+ +

Keys for player 1 (lowercase):

+ +
    +
  • Tab - Fire
  • +
  • w - Go ahead
  • +
  • s - Go backwards
  • +
  • a - Turn left
  • +
  • d - Turn right
  • +
+ + +

Keys for player 2:

+ +
    +
  • Backspace - Fire
  • +
  • Up arrow - Go ahead
  • +
  • Down arrow - Go backwards
  • +
  • Left arrow - Turn left
  • +
  • Right arrow - Turn right
  • +
+ + +

Note: Numeric keys don’t work.

+ +

If you don’t like the keys assignment, you can change it on the +the makefile.

+ +

PARENTAL ADVISORY WARNING:

+ +

This game is highly violent, when the tank explodes you can +see the little stick man blowing in parts.

+ +

Not really, just kidding :D

+ +

PLATFORMS TESTED:

+ +
    +
  • openSuSE 10.2 x86-32, X11R6 1024x768 32-bits color.
  • +
  • Fedora Core 8 x86-64, X11R6 1280x1024 32-bits color.
  • +
  • Fedora Core 11 x86-64, X11R6 1024x768 32-bits color.
  • +
  • Fedora Core 14 x86-64, X11R6 1024x768 32-bits color.
  • +
+ + +

COMPLETE FEATURE SET:

+ +
    +
  • Multiplayer out of the box.
  • +
  • Totally self-contained, no external files.
  • +
  • Fast-furious action at 29.97 frames per second.
  • +
  • Just as the movies, 16:9 aspect-ratio.
  • +
  • Beautiful mountains landscape plus horizon line :)
  • +
  • Tanks and bullets exploding as wires with weird physics.
  • +
  • Tanks backoff when firing.
  • +
  • There is an infinite number of levels.
  • +
  • Always different levels.
  • +
  • Animated intro.
  • +
  • It has color!.
  • +
+ + +

FEATURES THAT PROGRAMMERS WILL FIND APPEALING:

+ +
    +
  • Works both with x86-32 and x86-64 processors.
  • +
  • Double buffered, portable to any X11 with 24/32-bit color.
  • +
  • Memory-hungry as must be any 3-D program, uses a 256 MB +array.
  • +
  • Total and absolute irreverent coding style, so it generates +a lot of warnings when compiled.
  • +
  • It can take several minutes to compile (known culprits: +Fedora Core 11-14 on x86-64 512 MB)
  • +
  • It is written in the only true C: K&R, and no, it not means +Katherine & Rose.
  • +
  • Vectorial scalable graphics, do you want a bigger +playfield? change variables M & N.
  • +
  • Half of the program is formatted as 3-D cube, view with +Tabs at 8 columns and a square font.
  • +
  • The other half of the program is unprintable source code, +so no typing from paper, you have to write a converter of +tabs and formfeeds to its C escaped forms.
  • +
  • No text, so this program can be used and understood easily +on any country.
  • +
  • This program is highly ecologic, it sleeps when it is not +doing anything.
  • +
  • Virtual world with its own physics laws.
  • +
  • When closing the window it will show an X11 error :P
  • +
+ + +

OBFUSCATION TRICKS:

+ +
    +
  • Loop code included inside loop test.
  • +
  • Function arguments used as variables.
  • +
  • Operators used freely.
  • +
  • Precalculated values to save bytes.
  • +
  • Uses the +++, +- and *+ undocumented C operators :P

    + +
                                     ....,,,,---++++++--,,..                        
    +               .,,,.......     .$@@@@@@@@@@@@$$@@@@@@@@@@@@@@#+                 
    +               @@@@@###@@@@$$$@@@@$$$@@@-......-@+......,,,,,,##                
    +               =++==++++++++=@@$==#$$$$$---,,,,@@@,,,,,,-------@@,..........,,. 
    +  ,===#$$$$$$###$####=======@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+=##$@@@@@@@@.
    +  +@,,++++++++=+=========++++===++++++++++-+++@@-,,,,,,,,---+++=++++--,,...   @.
    +  .@.                      .......,,,,-----++=@=++==@$=+--,,...               @.
    +   $#         S P O I L E R              .,,-#@--,,,@$.....                   @.
    +   .@                           ..,--+==++-,,,,.,,,,=@+++++====+++++---,,,....@.
    +    @+                ..,,-+++++++-,,..              @.         ....,,,,,---+@@ 
    +    ,@       ..,--+++=+++,,..                        $#                   .==+  
    +     @#--++==++-,,..                                 ,@  S P O I L E R  .==+    
    +     ,#@@$+,,.                                        @.               ==+      
    +         .,,+++++,,.            S P O I L E R         $=             +=+        
    +               ..,-==++-,.                            ,@           ---          
    +                      .,-+=+++,..                      @.       .++-            
    +                            .,,++=++-,.                @+      ==+              
    +                                  .,-++==+-,.          +@    ==+                
    +                                        ..,+++=+-,..   .@. +=+                  
    +                                               .,-+++++,@@==                    
    +
  • +
+ + +

THE HISTORY OF THIS PROGRAM:

+ +

When I started working on this program, I figured that it would +be easy to fit on the character limit, but I missed three +things, the enormous X11 names, the unportable keycodes and my +2 KB of artwork.

+ +

Very hard coding did the first thing, in fact I worked out +twenty-nine different versions, at one step I had four +parallel versions with different characteristics removed +(mountains, horizon line, score/status bars and explosions), +I’ve managed to fit it all together!.

+ +

The second thing was solved using the makefile, it is under +160 bytes and you get adjustable keyboard. The greatest +mistery on the earth is why X11 handles unportable keycodes to +the user.

+ +

And finally, the third “Thing” was growing and growing, and +growing, eating bytes for lunch… after endless rounds of +crunching I obtained three-hundred seventy-eight bytes of +artwork and guess what?, it doesn’t fitted.

+ +

So I had to integrate a decompressor, based on the space, +tabulators and other non-counted characters.

+ +

The final program is composed of eight microfunctions, one is +the core and does most of the hard work, other functions help +doing the X11 things, explosion effects, 3-D calculations and +viewing.

+ +
    +
  • K() - 3-D transformation
  • +
  • s() - Rendering
  • +
  • b() - Line color selection
  • +
  • G() - Explosion animation
  • +
  • g() - Moves 3-D object backward and forward
  • +
  • F() - Collision detection
  • +
  • T() - Core (also known as main loop :D)
  • +
  • main() - Initialization and uncruncher, what a common name!, + C programs should start in the cool() function :).
  • +
+ + +

The source code was formatted as an cube using a specially +written program, the reality is that the program is smaller and +obfuscated of what is needed so the reformatting doesn’t +exceeded the character limits, the crunched vectors were +generated by another special program and the tank that +surrounds this text was generated by yet another program.

+ +

Have fun!

+ +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2012, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2011/toledo/hint.text b/2011/toledo/hint.text new file mode 100644 index 000000000..927939667 --- /dev/null +++ b/2011/toledo/hint.text @@ -0,0 +1,248 @@ +# Best non-chess game + +Oscar Toledo G. +Av. Sta. Cruz del Monte 9-304 +Cd. Satelite. Edo. de Mexico. +CP. 53110. Mexico. + + + + +## Judges' comments: +### To build: + + make toledo + +### To run: + + ./toledo + + # NOTE: This requires X11 to run or modifications to use layer.c on + # Windows + +### Try: + + ./toledo + +### Selected Judges Remarks: + +This two player game uses X11. The control keys can be configured by +modifying the A,B,C and D macros at compilation. + +After a quick splash screen the objective should be clear. There +are Red, Green and Cyan tanks. A larger window can be made by altering +the source early on, right before the code gets hard to follow. + +Like Oscar's previous winning X11 program for the 19th IOCCC, if +you remove both the X11 include files and replace them with + + #include "layer.c" + +you ought to be able to compile and run this program on Windows. + +## Author's comments: + /=========\ + \==\ /==/ || + || || /====\ |\/=\ || //==\ ==\ |=\ + || || || || || || // || =| | | + || || //===| || || ||=// \\=\\ ==/ |=/ + || || || || || || || \\ || User's + \===/ \\==// || || || \\ \==// Manual + +This is a color X11 3D tank-game for two players, just compile +and run it without arguments. + +You will see briefly a tank spinning before each level. + +Left half of the window shows the red player view and right +half shows the green player view, the background will change to +blue when the view goes inactive. + +The objective is to chase and destroy the other player's tank, +there is also an aqua tank for testing your aim and getting +extra points. + +> Caveat: You can shoot only 3 bullets at a time. +> Trick: You can fire faster if they explode on anything. +> Believe it or not, it has strategy! + +When only one tank remains on the field, the level will advance. +Don't forget to destroy the aqua tank. + +The playground is surrounded by mountains and each level is +filled with random obstacles (pyramids and cubes). + +The bars show players energy and score, each bar shows energy +and indicates current player view (wider on the left), right +part grows with every point. + +Keys for player 1 (lowercase): + +* Tab - Fire +* w - Go ahead +* s - Go backwards +* a - Turn left +* d - Turn right + +Keys for player 2: + +* Backspace - Fire +* Up arrow - Go ahead +* Down arrow - Go backwards +* Left arrow - Turn left +* Right arrow - Turn right + +> Note: Numeric keys don't work. + +If you don't like the keys assignment, you can change it on the +the makefile. + +PARENTAL ADVISORY WARNING: +-------------------------- + +This game is highly violent, when the tank explodes you can +see the little stick man blowing in parts. + +Not really, just kidding :D + +PLATFORMS TESTED: +----------------- + +* openSuSE 10.2 x86-32, X11R6 1024x768 32-bits color. +* Fedora Core 8 x86-64, X11R6 1280x1024 32-bits color. +* Fedora Core 11 x86-64, X11R6 1024x768 32-bits color. +* Fedora Core 14 x86-64, X11R6 1024x768 32-bits color. + +COMPLETE FEATURE SET: +--------------------- + +* Multiplayer out of the box. +* Totally self-contained, no external files. +* Fast-furious action at 29.97 frames per second. +* Just as the movies, 16:9 aspect-ratio. +* Beautiful mountains landscape plus horizon line :) +* Tanks and bullets exploding as wires with weird physics. +* Tanks backoff when firing. +* There is an infinite number of levels. +* Always different levels. +* Animated intro. +* It has color!. + +FEATURES THAT PROGRAMMERS WILL FIND APPEALING: +---------------------------------------------- + +* Works both with x86-32 and x86-64 processors. +* Double buffered, portable to any X11 with 24/32-bit color. +* Memory-hungry as must be any 3-D program, uses a 256 MB + array. +* Total and absolute irreverent coding style, so it generates + a lot of warnings when compiled. +* It can take several minutes to compile (known culprits: + Fedora Core 11-14 on x86-64 512 MB) +* It is written in the only true C: K&R, and no, it not means + Katherine & Rose. +* Vectorial scalable graphics, do you want a bigger + playfield? change variables M & N. +* Half of the program is formatted as 3-D cube, view with + Tabs at 8 columns and a square font. +* The other half of the program is unprintable source code, + so no typing from paper, you have to write a converter of + tabs and formfeeds to its C escaped forms. +* No text, so this program can be used and understood easily + on any country. +* This program is highly ecologic, it sleeps when it is not + doing anything. +* Virtual world with its own physics laws. +* When closing the window it will show an X11 error :P + +OBFUSCATION TRICKS: +------------------- + +* Loop code included inside loop test. +* Function arguments used as variables. +* Operators used freely. +* Precalculated values to save bytes. +* Uses the +++, +- and *+ undocumented C operators :P + + + ....,,,,---++++++--,,.. + .,,,....... .$@@@@@@@@@@@@$$@@@@@@@@@@@@@@#+ + @@@@@###@@@@$$$@@@@$$$@@@-......-@+......,,,,,,## + =++==++++++++=@@$==#$$$$$---,,,,@@@,,,,,,-------@@,..........,,. + ,===#$$$$$$###$####=======@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+=##$@@@@@@@@. + +@,,++++++++=+=========++++===++++++++++-+++@@-,,,,,,,,---+++=++++--,,... @. + .@. .......,,,,-----++=@=++==@$=+--,,... @. + $# S P O I L E R .,,-#@--,,,@$..... @. + .@ ..,--+==++-,,,,.,,,,=@+++++====+++++---,,,....@. + @+ ..,,-+++++++-,,.. @. ....,,,,,---+@@ + ,@ ..,--+++=+++,,.. $# .==+ + @#--++==++-,,.. ,@ S P O I L E R .==+ + ,#@@$+,,. @. ==+ + .,,+++++,,. S P O I L E R $= +=+ + ..,-==++-,. ,@ --- + .,-+=+++,.. @. .++- + .,,++=++-,. @+ ==+ + .,-++==+-,. +@ ==+ + ..,+++=+-,.. .@. +=+ + .,-+++++,@@== + +THE HISTORY OF THIS PROGRAM: +============================ + +When I started working on this program, I figured that it would +be easy to fit on the character limit, but I missed three +things, the enormous X11 names, the unportable keycodes and my +2 KB of artwork. + +Very hard coding did the first thing, in fact I worked out +twenty-nine different versions, at one step I had four +parallel versions with different characteristics removed +(mountains, horizon line, score/status bars and explosions), +I've managed to fit it all together!. + +The second thing was solved using the makefile, it is under +160 bytes and you get adjustable keyboard. The greatest +mistery on the earth is why X11 handles unportable keycodes to +the user. + +And finally, the third "Thing" was growing and growing, and +growing, eating bytes for lunch... after endless rounds of +crunching I obtained three-hundred seventy-eight bytes of +artwork and guess what?, it doesn't fitted. + +So I had to integrate a decompressor, based on the space, +tabulators and other non-counted characters. + +The final program is composed of eight microfunctions, one is +the core and does most of the hard work, other functions help +doing the X11 things, explosion effects, 3-D calculations and +viewing. + +* K() - 3-D transformation +* s() - Rendering +* b() - Line color selection +* G() - Explosion animation +* g() - Moves 3-D object backward and forward +* F() - Collision detection +* T() - Core (also known as main loop :D) +* main() - Initialization and uncruncher, what a common name!, + C programs should start in the cool() function :). + +The source code was formatted as an cube using a specially +written program, the reality is that the program is smaller and +obfuscated of what is needed so the reformatting doesn't +exceeded the character limits, the crunched vectors were +generated by another special program and the tank that +surrounds this text was generated by yet another program. + +*Have fun!* + + +-------------------------------------------------------------------------------- + diff --git a/2011/toledo/layer.c b/2011/toledo/layer.c new file mode 100644 index 000000000..b5c854c50 --- /dev/null +++ b/2011/toledo/layer.c @@ -0,0 +1,130 @@ +/* +** Translation layer to make my 3D Tanks game (20th IOCCC, best non-chess game) +** to work in Windows +** +** by Oscar Toledo G. +** http://nanochess.110mb.com/ +** +** From the original game replace: +** #include +** #include +** +** with this: +** #include "layer.c" +** +** Only tested with Dev-C++ 4.9.9.2 +** +** Creation: Feb/10/2012. +*/ + +#include /* Windows headers */ + +extern int L[]; /* Keyboard table from game */ + +/* +** Original makefile translated +** Choose your keys if you like +*/ +#define A VK_UP:0x57 +#define B VK_LEFT:0x41 +#define C VK_RIGHT:0x44 +#define D VK_DOWN:0x53 +#define E VK_BACK:VK_TAB +#define Q XFillRectangle(W,X,Y, + +/* +** Some X11 definitions translated +*/ +#define main ma +#define Display int +#define GC HDC +#define Pixmap HBITMAP +#define Window HWND +typedef struct{ int foreground; int line_width; } XGCValues; +typedef struct{ int type,X; } XEvent; + +/* XNextEvent, read Windows messages */ +#define XNextEvent(a,b)(GetMessage(&mm,0,0,0),TranslateMessage(&mm),\ + DispatchMessage(&mm),*b=oo,oo.type=0) +/* XOpenDisplay, not needed */ +#define XOpenDisplay(a)NULL +/* XSelectInput, only needs to process second argument */ +#define XSelectInput(a,b,c)b +/* XCreateSimpleWindow */ +#define XCreateSimpleWindow(a,b,c,d,e,f,g,h,i)CreateWindowEx(0,"a","3D Tanks",\ + 0xcf0000,c,d,e+8,f+32,0,0,aa,0) +/* XMapWindow, activate window and get DC to draw */ +#define XMapWindow(a,b)(ShowWindow(b,dd),h1=GetDC(b),h3=CreateCompatibleDC(h1)) +/* XPending, check for pending windows messages */ +#define XPending(a)PeekMessage(&mm,O,0,0,PM_NOREMOVE) +/* XFlush, not needed */ +#define XFlush(a) +/* XLookupKeysym, argument processing and returns key index */ +#define XLookupKeysym(a,b)(b,(a)->X) +/* DefaultDepth, not needed */ +#define DefaultDepth(a,b)0 +/* XCreatePixmap, creates a double-buffer bitmap */ +#define XCreatePixmap(a,b,c,d,e)CreateCompatibleBitmap(h1,c,d) +/* XCreateGC, instead selects bitmap for drawing */ +#define XCreateGC(a,b,c,d)(SelectObject(h3,b),h3) +/* XChangeGC, selection of color and line width, all this is required */ +#define XChangeGC(a,b,c,d)(rr!=INVALID_HANDLE_VALUE?DeleteObject(rr):0,\ + (d)->foreground=((d)->foreground&0xff0000)>>16|((d)->foreground&0xff)<<16|\ + (d)->foreground&0xff00,\ + rr=CreateSolidBrush((d)->foreground),\ + e2=CreatePen(PS_SOLID,(d)->line_width,(d)->foreground),\ + SelectObject(b,e2),\ + e1!=INVALID_HANDLE_VALUE?DeleteObject(e1):0,e1=e2) +/* XCopyArea, copies double buffer into main for non-flickering display */ +#define XCopyArea(a,b,c,d,e,f,g,h,i,j)BitBlt(h1,i,j,g,h,h3,0,0,SRCCOPY) +/* Some windows variables required */ +HBITMAP bb; +HBRUSH rr = INVALID_HANDLE_VALUE; +HPEN e1 = INVALID_HANDLE_VALUE, e2; +PAINTSTRUCT pp; +HDC h1, h2, h3; +XEvent oo; +HINSTANCE aa; +int dd; +MSG mm; +/* Main message processing */ +LRESULT CALLBACK WP(HWND h,UINT m,WPARAM w,LPARAM l) +{ + if (m==WM_KEYDOWN&&L[w]==0)oo.type=2,oo.X=w; + else if (m==WM_KEYUP&&L[w]==1)oo.type=3,oo.X=w; + else if (m==WM_PAINT)BeginPaint(h,&pp),EndPaint(h,&pp); + else if (m==15)oo.type=12; + else if (m==2)exit(1);/*PostQuitMessage(0);*/ + else return DefWindowProc(h, m, w, l); + return 0; +} +/* Main function */ +int WINAPI WinMain(HINSTANCE a,HINSTANCE b,LPSTR c,int d) +{ + static WNDCLASSEX w; + return aa=a,w.hInstance=a,w.lpszClassName="a", + w.lpfnWndProc=WP,w.cbSize=sizeof(WNDCLASSEX),dd=d, + w.hIcon=LoadIcon(0,IDI_APPLICATION), + w.hIconSm=LoadIcon(0,IDI_APPLICATION), + w.hCursor=LoadCursor(0,IDC_ARROW), + w.hbrBackground=GetStockObject(BLACK_BRUSH), + RegisterClassEx(&w), + main(); +} +/* XFillRectangle, note that X uses size and Windows uses coordinates */ +void XFillRectangle(int *a, HBITMAP b, HDC c, int d, int e, int f, int g) +{ + RECT rect; + + rect.left = d; + rect.top = e; + rect.right = f + d; + rect.bottom = g + e; + FillRect(c, &rect, rr); +} +/* XDrawLine */ +void XDrawLine(int *a, HBITMAP b, HDC c, int d, int e, int f, int g) +{ + MoveToEx(c, d, e, NULL); + LineTo(c, f, g); +} diff --git a/2011/toledo/toledo.c b/2011/toledo/toledo.c new file mode 100644 index 000000000..a06b1cb0a --- /dev/null +++ b/2011/toledo/toledo.c @@ -0,0 +1,64 @@ +#include +#include +#define I XDrawLine(W,X,Y, +#define l rand()% +#define R while( +#define n *h++ +#define x _ c]. +#define S if( +#define _ _[ + *h ; + M=512; i; N= + 288; e; d; u; p; L[1 + <<28]; float w=11.46; m; a ; + P; k[9304]; *j=k; c; f; q; r; t; v ; + * z; K(N,i) { t=u*+cos(N/w)-i*sin(N/w); p=i* + cos(N/w)+u*sin(N/w); u=t; } Display*W; GC Y; Pixmap +X; s(o,t,g,w,v) { h=v+k; q=2*n; R u=n, r=12+n, K(t,n), K(o,+ + p+w,u+=g), d=1>p?1:p, u=u*N/d+M/2, d=N/2+r*N/d, u=u> +-M*2 ?u0|p>0?I f,e,u,d):0: (i=p +,e=d,f=u ), --q); } struct{ int c,o,m,f,u,s,i ,e,r; } +_ 21 ] ; Window O; b(y) { XGCValues g ; g . +foreground=y; g. line_width = 2 ; XChangeGC(W,Y,20 +,&g); } G(o) { z=x f + k; h=(x f= 381+193*c)+k; i=2*(n +=*z++); R--i&1?d=l 9-4,e =l 9 -4*(8>o):0,n=*z+++d,0<(n +=*z+++e)?h[-1]=0:0,n=*z+++d, i); } g(o) { u=0; K(x s,o<<9 +); x u-=u; x r-=p; } F(m,c ) { f=5120*c; c=12; R +c--&&m +==+c |abs(x u-_ m].u)>f |x i <1|x c>2 |abs(x r-_ m].r)>f) +; return c+1; } T(o) { c=11; S!P){ a=++a%72; S!a){ P=1; R +c--){ x c=x m=0; x i=c>2?2:1 ; R x u=l 978-499<<8, x s= l +71, x r=l 979-501<<8, F(c,2) ); x f=c>2?l +2*+73:147; x o +=2>c?249<<16-c*8:64987<<8*(c >2); } } } S P){ c=11; R 4&x +i? ++x m-64&&x m-71? o=1,64> x m?(d=F(c,1))?x m=64,d<4?j[ +x e]++,++_ --d].c:0:g(7):G(x m -65) :_ x i=0,x e].e-- :0, +20>++c); c=3; R c--) { S 1&x i) { o++; S x c>2) x m>15? x +i=0:G(x m++); else { S x m ) S x m-->6) g(4); S c<2) { x +s=(72+x s+L[c?B]-L[c?C])%72; S d=4*L[c?A]-L[c?D]*4) { g(d +); S F(c,2)) g(-d); } S L[c? E]&!x m&x e<3) { d=10; R _++ +d].i) ; g(-4); _ d]=_ c]; _ d].e=c; x e++; x m=7; c=d; x +f = 122 ; x i=4; g(19); x o= 4092<<12; c=x e; } } } } } P +-=o<2; } v=2; R v--){ m=(108 - _ v].s)%72; b(3^_ v].c?0: +128); Q c=0,0,M,N); S!P) s(+ 36,54-a,0,-120,-+-+-+-+147,b +((1<<16)-1)); S P) { b(255); I 0,N/2,M,N/2); t=-.889*m; h +=k+340; R u=(t+=q=n)*M/32,d= n*N/48,q?I f,e,u,d):0,f=u,e= ++d,k+378>h); R x i&&c-v?s(m, x s,x u-_ v].u>>8,x r-_ v].r +>>8,x f,b(x o)):0,20>c++); c =0; R e=16+32*c,Q v^c?16:8,e + ,(c^v?68:76)+c[b(x o),j] , 16), b(0,d=20*x c), Q + 80-d,4+e,d,8),2>c++) ; } b(255); I M,0,M, + N); XCopyArea(W, X,O,Y,0,0,M,N,v* + M,0); } } +char*o="{ } { } { { } ; { } ; { ; { ; { ; { } ; { } ; { ; { ; } ; { ; { } } ; { ; } { } ; { ; { } ; { ; } { } { { } ; { } ; { ; { ; } { } { } } { } { } { } } { } } { } { } { } } { } { } { ; ; ; ; } { ; } { { } ; } } ; { ; } { ; } { { } ; { } ; { ; { ; } } { ; } { { } } } { ; } { ; { } ; } } } { } { } ; } } } } } { } ; } ; } ; { } { } ; { } ; } ; } } { } { } } { } { } } } } { { } } } } } { { } } { ; { { } ; { ; { { ; { ; { { } ; { ; { { ; ; } ; ; } ; ; } } { { } { { } { { { { } } } } } { { { { } { } { { } { { } { { { { } } "; +main(){ +XEvent e; W= +XOpenDisplay(k); +XSelectInput(W,O= +XCreateSimpleWindow(W,DefaultRootWindow(W),64,64,M*2,N,2,P,r),3); +XMapWindow(W,O); srand(time(0)); Y= +XCreateGC(W,X= +XCreatePixmap(W,O,M,N,DefaultDepth(W,r)),P,r); R*o){ S*o^59)d=64&*o?'{'^*o++:3, + 32^*o?d+=*o^9?2:1:0,*j+=P?d*9-43:d,j+=P,P=!P; else R*j=j[-3],j++,*++o^9); o++; + } R 7){ T(0); +XFlush(W); usleep(33367); R +XPending(W)) L[ +XLookupKeysym(&e, +XNextEvent(W,&e)&0)]^=1==e.type/2; } } diff --git a/2011/vik/Makefile b/2011/vik/Makefile new file mode 100644 index 000000000..796b860c9 --- /dev/null +++ b/2011/vik/Makefile @@ -0,0 +1,118 @@ +#!/usr/bin/env make +# +# 2011 makefile +# +# Copyright (C) 2011, Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis. +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +OPT= -O2 + +# bitness +# +# Some entries require 32-bitness, +# other entries require 64-bitess. +# By default we assume nothing. +# +ARCH= + +# default flags for ANSI C compilation +# +CFLAGS= -Wall -W -ansi ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= vik +DATA= imaginal_state.mod mad_world.mod + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + @echo This next compile may take a while ... + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} + +# alternative executable +# +alt: + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o + +clobber: clean + ${RM} -f ${ENTRY} + +nuke: clobber + @echo gnab gib! + +install: + @echo "Surely you're joking Mr. Feynman!" + +# backwards compatibility +# +build: all + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to partly misunderstand this final echo. + @${TRUE} diff --git a/2011/vik/hint.html b/2011/vik/hint.html new file mode 100644 index 000000000..a7507ade1 --- /dev/null +++ b/2011/vik/hint.html @@ -0,0 +1,195 @@ + + + + + + + Most sound + + +

Most sound

+ +

Daniel Vik
+802 Durshire Way
+Sunnyvale, Ca 94087
+daniel@vik.cc
+http://www.danielvik.com

+ +

Judges' comments:

+ +

To build:

+ +
make vik
+
+ +

To run:

+ +
./vik file.mod > audio_file.raw
+
+ +

Try:

+ +
./vik randowan.mod | mplayer -demuxer rawaudio -
+./vik mad_world.mod | mplayer -demuxer rawaudio -
+
+ +

Alternatively, you can use

+ +
./vik file.mod > file.raw; ./raw2wav file.raw > file.wav 
+
+ +

It is possible to download a number of Mod files from The Mod Archive.

+ +

The randowan.mod and mad_world.mod files were created by +Henrik Bertilsson and +are included with his permission.

+ +

Selected Judges Remarks:

+ +

This entry converts .MOD audio files to a playable stream +in a most pleasing manner if you don’t like tremolo or vibrato.

+ +

Also it abuses the C compiler and/or assembler with a partially +initialized 32 MByte array. Can you tell what is that partial +initilzation for?

+ +

Does it take your system a long time to compile? You may want to do try:

+ +
 cc -S vik.c
+
+ +

and to examine the resulting assembly file vik.s. On some platforms +the assembly file is about 128 MBytes in size!

+ +

Author’s comments:

+ +

Introduction

+ +

In 1987, Karsten Obarski changed the way music was handled in games and +demos with the introducton of the MOD file format on Commodore Amiga.

+ +

A MOD file contains a set of samples, a number of patterns indicating +how and when the samples are to be played, a list of what patterns to +play in what order, and a number of effects.

+ +

Features

+ +

This program converts MOD files created with the standard trackers for +Amiga, e.g. Pro Tracker, Noise Tracker and Sound Tracker to raw 16 bit +44.1kHz stereo audio. The program supports MOD music with 4, 6, and 8 +channels MOD files with up to 31 samples.

+ +

The MOD format includes many effects for each audio channel and this +program supports most of them, including:

+ +
    +
  • Arpeggio
  • +
  • Slide and fine slide up/down/to note
  • +
  • Set sample offset
  • +
  • Volume slide
  • +
  • Pattern break
  • +
  • Filter on/off
  • +
  • Set volume
  • +
  • Cut sample
  • +
  • Delay sample
  • +
  • Delay pattern
  • +
  • Set speed
  • +
+ + +

Due to size constraints tremolo and vibrato is not supported. Also, to +avoid infinite long songs, the position jump feature is ignored.

+ +

Songs

+ +

With his permission, the package incldues two songs composed by Henrik +Bertilsson, also known as Deelite:

+ +
    +
  1. Mad World
  2. +
  3. Randowan
  4. +
+ + +

Build

+ +

Compiling for *nix systems (including cygwin) is straight forward:

+ +
$ gcc -o vik vik.c
+
+ +

Usage

+ +

Convert MOD file to raw 44.1kHz stereo audio file

+ +
$ ./vik mad_world.mod > audio_file.raw
+
+ +

Listen to the MOD file (streaming to mplayer)

+ +
$ ./vik randowan.mod | mplayer -demuxer rawaudio -
+
+ +

(Don’t forget the last ‘-’ as it makes mplayer read from stdin.)

+ +

Obfuscation

+ +

The IOCCC rules did not put a limit on the entropy of the source code, +and it appears that the general entropy rules doesn’t apply. An estimate +is that the code density entropy of this entry is ~1.2 which means that +there are around 2500 characters of code carrying information, yet there +are only 2037 IOCCC characters of actual code. Most of the additional +characters are encoded with non-counting characters in the frequency +table. But there are also ~50 or so white space characters spread out +through the source code that carry information.

+ +

The use of macros certainly adds to the obfuscation but the reason for +using them is mainly to fit as many features as possible within the size +limits. So please excuse the use of them.

+ +

Once the preprocessor is run, the code gets more interesting. The MOD +player is basically a register based state machine and all the magic is +hidden in a fog of short statements. Many of the register updates are +conditional and the program uses the ? operator (sigh) mainly to save +space, but also to leverage the comma operator and precedence more +efficiently.

+ +

Portability

+ +

The progam is portable to most platforms. The only system dependency is +that the program relies on writing binary data to stdout.

+ +

Microsoft compilers adds a carriges return to newlines, and to compile +the program with this platform, the following line can be added after +the main declaration in order for the program to run correctly:

+ +
_setmode(_fileno(stdout), 0x8000);
+
+ +

Limitations

+ +

The program only runs when a valid MOD file is passed as argument. If +no argument is passed, the program crashes.

+ +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2012, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2011/vik/hint.text b/2011/vik/hint.text new file mode 100644 index 000000000..8ae4dda2d --- /dev/null +++ b/2011/vik/hint.text @@ -0,0 +1,171 @@ +# Most sound + +Daniel Vik +802 Durshire Way +Sunnyvale, Ca 94087 + + + + +## Judges' comments: +### To build: + + make vik + +### To run: + + ./vik file.mod > audio_file.raw + +### Try: + + ./vik randowan.mod | mplayer -demuxer rawaudio - + ./vik mad_world.mod | mplayer -demuxer rawaudio - + +Alternatively, you can use + + ./vik file.mod > file.raw; ./raw2wav file.raw > file.wav + +It is possible to download a number of Mod files from [The Mod Archive](http://modarchive.org). + +The randowan.mod and mad_world.mod files were created by +[Henrik Bertilsson](http://www.translucentboy.com) and +are included with his permission. + +### Selected Judges Remarks: + +This entry converts .MOD audio files to a playable stream +in a most pleasing manner if you don't like tremolo or vibrato. + +Also it abuses the C compiler and/or assembler with a partially +initialized 32 MByte array. Can you tell what is that partial +initilzation for? + +Does it take your system a long time to compile? You may want to do try: + + cc -S vik.c + +and to examine the resulting assembly file vik.s. On some platforms +the assembly file is about 128 MBytes in size! + +## Author's comments: +Introduction +============ + +In 1987, Karsten Obarski changed the way music was handled in games and +demos with the introducton of the MOD file format on Commodore Amiga. + +A MOD file contains a set of samples, a number of patterns indicating +how and when the samples are to be played, a list of what patterns to +play in what order, and a number of effects. + + +Features +======== + +This program converts MOD files created with the standard trackers for +Amiga, e.g. Pro Tracker, Noise Tracker and Sound Tracker to raw 16 bit +44.1kHz stereo audio. The program supports MOD music with 4, 6, and 8 +channels MOD files with up to 31 samples. + +The MOD format includes many effects for each audio channel and this +program supports most of them, including: + + * Arpeggio + * Slide and fine slide up/down/to note + * Set sample offset + * Volume slide + * Pattern break + * Filter on/off + * Set volume + * Cut sample + * Delay sample + * Delay pattern + * Set speed + +Due to size constraints tremolo and vibrato is not supported. Also, to +avoid infinite long songs, the position jump feature is ignored. + + +Songs +===== + +With his permission, the package incldues two songs composed by Henrik +Bertilsson, also known as Deelite: + + 1. Mad World + 2. Randowan + + +Build +===== + +Compiling for *nix systems (including cygwin) is straight forward: + + $ gcc -o vik vik.c + + +Usage +===== + +### Convert MOD file to raw 44.1kHz stereo audio file + + $ ./vik mad_world.mod > audio_file.raw + +### Listen to the MOD file (streaming to mplayer) + + $ ./vik randowan.mod | mplayer -demuxer rawaudio - + +(Don't forget the last '-' as it makes mplayer read from stdin.) + + +Obfuscation +=========== + +The IOCCC rules did not put a limit on the entropy of the source code, +and it appears that the general entropy rules doesn't apply. An estimate +is that the code density entropy of this entry is ~1.2 which means that +there are around 2500 characters of code carrying information, yet there +are only 2037 IOCCC characters of actual code. Most of the additional +characters are encoded with non-counting characters in the frequency +table. But there are also ~50 or so white space characters spread out +through the source code that carry information. + +The use of macros certainly adds to the obfuscation but the reason for +using them is mainly to fit as many features as possible within the size +limits. So please excuse the use of them. + +Once the preprocessor is run, the code gets more interesting. The MOD +player is basically a register based state machine and all the magic is +hidden in a fog of short statements. Many of the register updates are +conditional and the program uses the ? operator (sigh) mainly to save +space, but also to leverage the comma operator and precedence more +efficiently. + + +Portability +=========== + +The progam is portable to most platforms. The only system dependency is +that the program relies on writing binary data to stdout. + +Microsoft compilers adds a carriges return to newlines, and to compile +the program with this platform, the following line can be added after +the main declaration in order for the program to run correctly: + + _setmode(_fileno(stdout), 0x8000); + + +Limitations +=========== + +The program only runs when a valid MOD file is passed as argument. If +no argument is passed, the program crashes. + +-------------------------------------------------------------------------------- + diff --git a/2011/vik/mad_world.mod b/2011/vik/mad_world.mod new file mode 100644 index 000000000..b9d54d2cf Binary files /dev/null and b/2011/vik/mad_world.mod differ diff --git a/2011/vik/randowan.mod b/2011/vik/randowan.mod new file mode 100644 index 000000000..bc8e93d4d Binary files /dev/null and b/2011/vik/randowan.mod differ diff --git a/2011/vik/raw2wav b/2011/vik/raw2wav new file mode 100644 index 000000000..b34535fb5 --- /dev/null +++ b/2011/vik/raw2wav @@ -0,0 +1,28 @@ +#!/usr/bin/perl +# +# This work by Simon Cooper is licensed under a Creative Commons +# Attribution-ShareAlike 3.0 Unported License. +# +# Info from: https://ccrma.stanford.edu/courses/422/projects/WaveFormat/ + +my $file = shift @ARGV; + +my $size = -s $file; +my $rate = 44100; +my $samp = 16; +my $chan = 2; + +print "RIFF". + pack("V", $size-8). # File size -8 + "WAVE". # "Format" + "fmt ". # Subchunk1ID + pack("V", 16). # Subchunk1Size + pack("v", 1). # PCM + pack("v", $chan). # NumChannels + pack("V", $rate). # SampleRate + pack("V", ($rate>>3)*$chan*$samp). # ByteRate + pack("v", $chan*$samp>>3). # BlockAlign + pack("v", $samp). # BitsPerSample + "data". # Subchunk2ID + pack("V",$size-44); # SubchunkSize +system "cat", $file; diff --git a/2011/vik/vik.c b/2011/vik/vik.c new file mode 100644 index 000000000..6b38f3650 --- /dev/null +++ b/2011/vik/vik.c @@ -0,0 +1,90 @@ +#include + +char E[1<<25]=" ; } } { { } { { ; ; { } } { { ; { { { { { } ; } { { ; { { { ; { } ; ; ; { ; ; ; } } ; } { { ; } } ; } } ; ; } { ; } } { } } } } } ; { { } } } ; } } } { } ; ; ; { } ; { { { ; { ; } } { { { } { { ; ; { { } } { { ; { { { { { } ; } { { ; { { { ; { } ; ; ; ; ; } } ; } { { ; } } ; } ; ; } { ; } } } } } } } ; { { } ; ; } ; { } ; ; ; { } ; { { ; { ; } } { { { } { ; ; { { } } { { { { { { { { ; { ; { { ; { { ; ; { } ; ", +*a[40],*q=E+20,*T=E+1080; +int i=1,j,k,l,u,w,I,J,K,h,H,G,R=4,U,e[999],*p=e+5,*r,*s,*v,b[999],L[1<<16], +F=882,n[99]; +FILE*f; + +#define Y(a,b) (a)<(b)?(a):(b) +#define Z(a,b) (a)>(b)?(a):(b) +#define X(x,a,b)Z(a,Y(b,x)) +#define O [s] +#define N [v] +#define M [r] +#define C ++ +#define m :0 +#define g m, +#define d u== +#define z(o) 32 O?n[X(32 O+o+(35 O-24)/256,0,59)]m +#define y(o) 32 O?8 O=z(o)m +#define x (p=e+5*34 O,2 M-3 && 2 M-5?y(0),l=p[4],a[i]=a[8+34 O],3 N=l>1?\ + 2*(p[3]+l):2*p[0],4 N=l>1?2*l:1,0 N=Y(2 M-9?0:9 O<<8,3 N-1) m) +#define W(t,i) (u=t[i]>>4,w=t[i]&15), +#define Q(e) ((1 N+=13200)>=5 N?1 N-=5 N, C 0 N>=3 N?0 N-=4 N m g e*6 N*q[0\ + N]/34)+ +#define D(b,i) T[i]==*#b&&T[i+2]==#b[1] +#define A ((unsigned char*)q) +#define V *p C= +#define S(a) V(A[a]<<8)|A[a+1], +#define P 2 M== +#define B ,putchar +#define o for( + +int main(int t,char**c) +{ + o; w=E[u]; C u)n[u/10]+=(w-59?w-125?w-32?1 m:2:3)<15?132:128; + k<128; + k C) G=X(G,T[k]+1,128); + o p=L; j Cl?8 O=Z(8 O-3 O,l):8 O>4)-13))?32 O=1 M,x g + 0 O=P 12?X(3 M,0,64) m O , + P 15?(l=3 M)?l<33?t=l:(F=110250/l) m g + P 14? + W(r,3) + j?(16+u) O=j g + 8 O=d 1?Z(113,8 O-17 O):d 2?Y(856,8 O+18 O):8 O, + d 5?35 O=(j&7)-2*(j&8) g + d 9?39 O=25 O&&!1 M?x,0 m g + 0 O=d 10?Y(0 O+26 O,64):d 11?Z(0 O-27 O,0):0 O, + d 14?h=30 O m m), + 6 N =X(0 O,0,64), + 5 N =999*8 O, + i C); + o C I>=t+t*h?I=h=0,C J>=64?J=0,U|=C K>=H m g j=F; j--; 0 + B(u)B(u>>8)B(w)B(w>>8)) + o i=u=w=0; i + + + + + + + Who won the 20th IOCCC + + + +
IOCCC +

The International Obfuscated C Code Contest +

The 20th IOCCC Winners +

+[ The judges | +IOCCC home page | +FAQ | +People who have won | +Winning entries ] + +

+ +

+


+ +

Here are the names and categories for the winners of the 20th IOCCC: +

+ + + +

+


+ + + + + + + + +
+Creative Commons License +

This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

+
+ + + diff --git a/2011/zucker/Makefile b/2011/zucker/Makefile new file mode 100644 index 000000000..27074695b --- /dev/null +++ b/2011/zucker/Makefile @@ -0,0 +1,117 @@ +#!/usr/bin/env make +# +# 2011 makefile +# +# Copyright (C) 2011, Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis. +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +OPT= -O2 + +# bitness +# +# Some entries require 32-bitness, +# other entries require 64-bitess. +# By default we assume nothing. +# +ARCH= + +# default flags for ANSI C compilation +# +CFLAGS= -Wall -W -ansi ${ARCH} ${OPT} -D_BSD_SOURCE -lm + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= zucker +DATA= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} ${ENTRY}.c -o ${ENTRY} + +# alternative executable +# +alt: + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o + +clobber: clean + ${RM} -f ${ENTRY} + +nuke: clobber + @echo gnab gib! + +install: + @echo "Surely you're joking Mr. Feynman!" + +# backwards compatibility +# +build: all + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to partly misunderstand this final echo. + @${TRUE} diff --git a/2011/zucker/hint.html b/2011/zucker/hint.html new file mode 100644 index 000000000..b2342751c --- /dev/null +++ b/2011/zucker/hint.html @@ -0,0 +1,194 @@ + + + + + + + Most shiny + + +

Most shiny

+ +

Matt Zucker
+mzucker1@swarthmore.edu
+http://www.swarthmore.edu/NatSci/mzucker1/

+ +

Judges' comments:

+ +

To build:

+ +
make zucker
+
+ +

To run:

+ +
./zucker > image.ppm
+
+ +

Try:

+ +
./zucker "Hello!!!" > hello.ppm
+./zucker faster\! -preview > image2.ppm
+
+# Display the PPM image with your favorite image viewer
+
+ +

Selected Judges Remarks:

+ +

The rendered image is centered and is output as a 600 by 220 pixel PPM. +The vector font is proportional.

+ +

This entry uses no local variables. None! At! All!

+ +

Author’s comments:

+ +

An image generator

+ +

What it does:

+ +

This program makes pretty pictures. To see the default output, try +running

+ +
    ./zucker > image.ppm
+
+ +

On the author’s 2.5 GHz MacBook Pro, this command takes approximately +1 minute and 18 seconds to run – your runtime may vary. You will +need an image viewer capable of displaying Netpbm images in order to +display the output. On the Mac, Xee +works well; otherwise ImageMagick +and/or GraphicsMagick are both +capable of displaying Netpbm files, and are available on multiple +platforms. (Using Xee is particularly nice because it periodically +reloads the image as it is rendered.)

+ +

Aside from the default image, you may create your own by running the +program as follows:

+ +
    ./zucker "your text" > image.ppm
+
+ +

To mitigate long runtimes, the program can be invoked in a “preview” +mode by appending -preview to the command line arguments, like so:

+ +
    ./zucker faster\! -preview > image.ppm
+
+ +

If your platform distinguishes between binary and text streams, you +may need to insert some code to reopen standard output in binary mode +at the start of main. An ASCII platform is assumed.

+ +

Pedagogical value:

+ +

This program is quite suitable for the inexperienced programmer, due +to a number of considerations:

+ +
    +
  • It is fairly short: just 4 preprocessor directives followed by 29 +lines of source.

  • +
  • It compiles cleanly as ANSI C under gcc 4.2.1 with very strict +compilation flags.

  • +
  • It uses a very small subset of the keywords available in C, namely +char, float, int, typedef, struct, for, and return. +More difficult concepts such as void, if, switch, and +while are eschewed for simplicity’s sake.

  • +
  • It also uses a very small number of library functions: just putchar, +cos, sin, atan2, sqrt, and pow.

  • +
  • New programmers often prefer to use global variables when +possible. Hence, all variables in this program (aside from +function parameters) have global scope.

  • +
  • An important aspect of the computation is graphically illustrated +by the source code itself: the geometric construction of a +reflection ray at an object’s surface, given the incoming +direction and surface normal.

  • +
+ + +

Further details (contains spoilers):

+ +

The program is not quite a traditional ray tracer, but a “sphere +tracer” which uses distance fields to encode proximity to objects in +the scene. Using sphere tracing to compute visibility instead of +analytic ray tracing provides two advantages: first, it greatly eases +the computation of ray-torus intersection (which would otherwise +require solving a quartic polynomial), and second, it makes it +possible to compute ambient occlusion (which is used to generate soft +shadows). Unlike many traditional ray tracers and sphere tracers, this +one uses iteration instead of recursion to compute the effect of +reflections. This, unfortunately, resulted in the programmer going +insane; however, program size was reduced and readability +hindered. Neither the plaintext for the program’s default output nor +for the Netpbm header appears in the program source, which hinders +readability as well. Also, unlike some previous IOCCC entries which +render ASCII text, this one uses a vector (as opposed to raster) +font. Although the program does not generate uppercase letters, it +handles them in a reasonable manner when they appear in the input.

+ +

Even when the program is pretty-printed and preprocessor macros are +expanded, it should be fairly resistant to analysis due to reckless +reuse of global variables, to the inherently opaque nature of the +math, and to its overall density. Global variables are used to store +the results of intermediate computation. As a result, seemingly simple +functions have important side effects. Although some of the global +variables are simply constants, their use is overloaded. For instance, +the variable X is used both as the number 40 and as the ASCII +character '('. Maintainability is hindered due to hardcoding +several aspects of the program in multiple locations. As an example, +it is impossible to modify either the image width or height without +changing the source in at least three different places, including +inside the large string literal.

+ +

Some of the functions are simple vector algebra operations such as +vector construction, dot product, and normalization. However, it was +found to be much more compact to define a single operation for +multiply-and-add rather than to have separate functions for addition, +subtraction, and scaling. Again, compactness led to obfuscation.

+ +

This program heavily abuses for loops. The comma operator is used to +get as much milage as possible out of statements inside of loop +declarations. Between for loops, the comma operator, and the ternary +operator, it was possible to avoid if and while altogether.

+ +

Bitwise and arithmetic operators are used instead of logical operators +whenever gcc doesn’t warn about it. Conversely, integer +multiplication, division, and modulus are sometimes used in place of +traditional bitwise operators just to keep the reader on his or her +toes. Automatic casting between characters, integers, and floats is +performed just about everywhere. Fascinatingly, this doesn’t seem to +affect performance too badly. Sometimes when an explicit cast +(i.e. from float to int) is needed, the program instead simply assigns +to a free variable of the desired type instead. Both the array[index] +and index[array] notations are used interchangably throughout the +program.

+ +

Two other programs were written to support development of this +program. The first used a randomized search algorithm to deduce the +most compact encoding of the vector font instructions into ASCII; the +second used a modified form of the Knuth-Plass algorithm to layout the +final text on top of a hand-generated ASCII “stencil”. The programs +were not submitted as entries for this year’s IOCCC, not because they +lack obfuscation, but because neither is written in C (they are in C++ +and Python, respectively).

+ +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2012, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2011/zucker/hint.text b/2011/zucker/hint.text new file mode 100644 index 000000000..4743409f9 --- /dev/null +++ b/2011/zucker/hint.text @@ -0,0 +1,171 @@ +# Most shiny + +Matt Zucker + + + + +## Judges' comments: +### To build: + + make zucker + +### To run: + + ./zucker > image.ppm + +### Try: + + ./zucker "Hello!!!" > hello.ppm + ./zucker faster\! -preview > image2.ppm + + # Display the PPM image with your favorite image viewer + +### Selected Judges Remarks: + +The rendered image is centered and is output as a 600 by 220 pixel PPM. +The vector font is proportional. + +This entry uses no local variables. None! At! All! + +## Author's comments: +An image generator +================== + +What it does: +------------- + +This program makes pretty pictures. To see the default output, try +running + + ./zucker > image.ppm + +On the author's 2.5 GHz MacBook Pro, this command takes approximately +1 minute and 18 seconds to run -- your runtime may vary. You will +need an image viewer capable of displaying Netpbm images in order to +display the output. On the Mac, [Xee](http://wakaba.c3.cx/s/apps/xee) +works well; otherwise [ImageMagick](http://www.imagemagick.org/) +and/or [GraphicsMagick](http://www.graphicsmagick.org/) are both +capable of displaying Netpbm files, and are available on multiple +platforms. (Using Xee is particularly nice because it periodically +reloads the image as it is rendered.) + +Aside from the default image, you may create your own by running the +program as follows: + + ./zucker "your text" > image.ppm + +To mitigate long runtimes, the program can be invoked in a "preview" +mode by appending `-preview` to the command line arguments, like so: + + ./zucker faster\! -preview > image.ppm + +If your platform distinguishes between binary and text streams, you +may need to insert some code to reopen standard output in binary mode +at the start of `main`. An ASCII platform is assumed. + +Pedagogical value: +------------------ + +This program is quite suitable for the inexperienced programmer, due +to a number of considerations: + + * It is fairly short: just 4 preprocessor directives followed by 29 + lines of source. + + * It compiles cleanly as ANSI C under gcc 4.2.1 with very strict + compilation flags. + + * It uses a very small subset of the keywords available in C, namely + `char`, `float`, `int`, `typedef`, `struct`, `for`, and `return`. + More difficult concepts such as `void`, `if`, `switch`, and + `while` are eschewed for simplicity's sake. + + * It also uses a very small number of library functions: just `putchar`, + `cos`, `sin`, `atan2`, `sqrt`, and `pow`. + + * New programmers often prefer to use global variables when + possible. Hence, *all* variables in this program (aside from + function parameters) have global scope. + + * An important aspect of the computation is graphically illustrated + by the source code itself: the geometric construction of a + reflection ray at an object's surface, given the incoming + direction and surface normal. + + +Further details (contains spoilers): +------------------------------------ + +The program is not quite a traditional ray tracer, but a "sphere +tracer" which uses distance fields to encode proximity to objects in +the scene. Using sphere tracing to compute visibility instead of +analytic ray tracing provides two advantages: first, it greatly eases +the computation of ray-torus intersection (which would otherwise +require solving a quartic polynomial), and second, it makes it +possible to compute ambient occlusion (which is used to generate soft +shadows). Unlike many traditional ray tracers and sphere tracers, this +one uses iteration instead of recursion to compute the effect of +reflections. This, unfortunately, resulted in the programmer going +insane; however, program size was reduced and readability +hindered. Neither the plaintext for the program's default output nor +for the Netpbm header appears in the program source, which hinders +readability as well. Also, unlike some previous IOCCC entries which +render ASCII text, this one uses a vector (as opposed to raster) +font. Although the program does not generate uppercase letters, it +handles them in a reasonable manner when they appear in the input. + +Even when the program is pretty-printed and preprocessor macros are +expanded, it should be fairly resistant to analysis due to reckless +reuse of global variables, to the inherently opaque nature of the +math, and to its overall density. Global variables are used to store +the results of intermediate computation. As a result, seemingly simple +functions have important side effects. Although some of the global +variables are simply constants, their use is overloaded. For instance, +the variable `X` is used both as the number 40 and as the ASCII +character `'('`. Maintainability is hindered due to hardcoding +several aspects of the program in multiple locations. As an example, +it is impossible to modify either the image width or height without +changing the source in at least three different places, including +inside the large string literal. + +Some of the functions are simple vector algebra operations such as +vector construction, dot product, and normalization. However, it was +found to be much more compact to define a single operation for +multiply-and-add rather than to have separate functions for addition, +subtraction, and scaling. Again, compactness led to obfuscation. + +This program heavily abuses `for` loops. The comma operator is used to +get as much milage as possible out of statements inside of loop +declarations. Between `for` loops, the comma operator, and the ternary +operator, it was possible to avoid `if` and `while` altogether. + +Bitwise and arithmetic operators are used instead of logical operators +whenever gcc doesn't warn about it. Conversely, integer +multiplication, division, and modulus are sometimes used in place of +traditional bitwise operators just to keep the reader on his or her +toes. Automatic casting between characters, integers, and floats is +performed just about everywhere. Fascinatingly, this doesn't seem to +affect performance too badly. Sometimes when an explicit cast +(i.e. from float to int) is needed, the program instead simply assigns +to a free variable of the desired type instead. Both the `array[index]` +and `index[array]` notations are used interchangably throughout the +program. + +Two other programs were written to support development of this +program. The first used a randomized search algorithm to deduce the +most compact encoding of the vector font instructions into ASCII; the +second used a modified form of the Knuth-Plass algorithm to layout the +final text on top of a hand-generated ASCII "stencil". The programs +were not submitted as entries for this year's IOCCC, not because they +lack obfuscation, but because neither is written in C (they are in C++ +and Python, respectively). + +-------------------------------------------------------------------------------- + diff --git a/2011/zucker/zucker.c b/2011/zucker/zucker.c new file mode 100644 index 000000000..2bf9373b8 --- /dev/null +++ b/2011/zucker/zucker.c @@ -0,0 +1,33 @@ +#include +#include +#define E return +#define S for +char*J="LJFFF%7544x^H^XXHZZXHZ]]2#( #@@DA#(.@@%(0CAaIqDCI$IDEH%P@T@qL%PEaIpBJCA\ +I%KBPBEP%CBPEaIqBAI%CAaIqBqDAI%U@PE%AAaIqBcDAI%ACaIaCqDCI%(aHCcIpBBH%E@aIqBAI%A\ +AaIqB%AAaIqBEH%AAPBaIqB%PCDHxL%H@hIcBBI%E@qJBH#C@@D%aIBI@D%E@QB2P#E@'C@qJBHqJBH\ +%C@qJBH%AAaIqBAI%C@cJ%" "cJ" "CH%C@qJ%aIqB1I%PCDI`I%BAaICH%KH+@'JH+@KP*@%S@\ +3P%H@ABhIaBBI%P@S@PC#", *j ,*e;typedef float x;x U(x a){E a<0?0:a>1?1:a; } +typedef struct{x c,a,t; } y;y W={1,1,1},Z={0,0,0},B[99],P,C,M,N,K,p,s,d,h +;y G(x t,x a,x c){K.c=t ; K.t=c; K.a=a;E K;}int T=-1,b=0,r,F=-111,(*m)(i\ +nt)=putchar,X=40,z=5,o, a, c,t=0 ,n,R;y A(y a,y b,x c){E G(a.c+b.c*c,a.a ++c*b.a,b.t*c+a.t);}x H= .5,Y =.66 ,I,l=0,q,w,u,i,g;x O(y a,y b){E q=a.t* +b.t+b.c*a.c+a.a*b.a;}x Q(){E A(P,M,T ),O(K,K)t+H*a?o: w>t?t:w1?1[z= 0, k]:J ;*e &&l<24 ; +++e)S(o=a =0,j =J+9;(c= *++j)&& !(o&&c< X&&(q=l+=w) );o ?o=*j++/ +32,b++[B] =G(q +=*j/8&3,* j&7,0 ),B[r =b++]=G((c/8& 3)*( o<2? +T:1), (c& 7)+ 1e-4,o>2),1: (o =(a =(c-=X)<0?w=c+6 ,t= a+1:c?(t +?0:m(c),a ):*++j)==((*e|32 ) ^z)&&1[j]-X));S(z =3*( L<3);++ +F<110;)S(L=-301;p=Z,++L<300;m( p.c),m(p.a),m(p.t))S(c=T;++c<=z;)S(h +=G(-4,4.6,29),d=V(A(A(A(Z,V(G(5,0 ,2)),L+L+c/2),V(G(2,-73,0)),F+F+c%2),G +(30.75,-6,-75),20)),g=R=255-(n=z)*64; R*n+R;g*=H){S(u=i=R=0;!R&&94>(u+=i=D(h= +A(h,d,i)));R=i<.01);S(N=V(A(P,C, T)),q=d.t*d.t,s=M,u=1;++i<6*R;u-= +U(i/3-D(A(h,N,i/3)))/pow( 2,i));s=R?i=pow(U(O(N,V(A( +M=V(G(T,1,2)),d,T)))) ,X),p=A(p,W,g*i),u*=U( +O(N,M))*H*Y+Y,g*= n--?Y-Y*i:1-i,s:G( +q,q,1); p=A(p,s ,g*u);h=A(h,N,.1 +);d=A(d,N,-2*O (d,N));}E 0;} diff --git a/2012/2012.tar.bz2 b/2012/2012.tar.bz2 new file mode 100644 index 000000000..f2d81db31 Binary files /dev/null and b/2012/2012.tar.bz2 differ diff --git a/2012/MANIFEST b/2012/MANIFEST new file mode 100644 index 000000000..88c8d4f2c --- /dev/null +++ b/2012/MANIFEST @@ -0,0 +1,130 @@ +2012/2012.tar.bz2 +2012/MANIFEST +2012/Makefile +2012/README.html +2012/README.markdown +2012/README.text +2012/blakely/Makefile +2012/blakely/blakely.c +2012/blakely/hint.html +2012/blakely/hint.text +2012/deckmyn/MANUAL +2012/deckmyn/Makefile +2012/deckmyn/deckmyn.c +2012/deckmyn/example_beethoven +2012/deckmyn/example_greensleeves +2012/deckmyn/hint.html +2012/deckmyn/hint.text +2012/dlowe/Makefile +2012/dlowe/dead.d +2012/dlowe/dlowe.c +2012/dlowe/hint.html +2012/dlowe/hint.text +2012/dlowe/splash.d +2012/dlowe/sprites.d +2012/endoh1/Makefile +2012/endoh1/Makefile.orig +2012/endoh1/clock.txt +2012/endoh1/column.txt +2012/endoh1/column2.txt +2012/endoh1/column3.txt +2012/endoh1/corners.txt +2012/endoh1/dripping-pan.txt +2012/endoh1/endoh1.c +2012/endoh1/endoh1_color.c +2012/endoh1/endoh1_deobfuscate.c +2012/endoh1/evaporation.txt +2012/endoh1/flat.txt +2012/endoh1/fountain.txt +2012/endoh1/funnel.txt +2012/endoh1/funnel2.txt +2012/endoh1/funnel3.txt +2012/endoh1/glass-half-empty.txt +2012/endoh1/hint.html +2012/endoh1/hint.text +2012/endoh1/leidenfrost.txt +2012/endoh1/logo.txt +2012/endoh1/pour-out.txt +2012/endoh1/tanada.txt +2012/endoh2/Makefile +2012/endoh2/endoh2.c +2012/endoh2/find-font-table.rb +2012/endoh2/hint.html +2012/endoh2/hint.text +2012/grothe/Makefile +2012/grothe/cookie_piece1.dat +2012/grothe/cookie_piece2.dat +2012/grothe/cookie_piece3.dat +2012/grothe/cookie_piece4.dat +2012/grothe/cookie_recipe.txt +2012/grothe/grothe.c +2012/grothe/grothe.orig.c +2012/grothe/hint.html +2012/grothe/hint.text +2012/guidelines.txt +2012/hamano/Makefile +2012/hamano/hamano.c +2012/hamano/hamano.orig.c +2012/hamano/hint.html +2012/hamano/hint.text +2012/hint.css +2012/hou/Makefile +2012/hou/ansi.txt +2012/hou/chk.txt +2012/hou/header.htm +2012/hou/hint.html +2012/hou/hint.text +2012/hou/hou.c +2012/hou/html.txt +2012/hou/markdown.txt +2012/hou/patho.pl +2012/hou/perl-notes.txt +2012/kang/Makefile +2012/kang/hint.html +2012/kang/hint.text +2012/kang/kang.c +2012/kang/kang.orig.c +2012/konno/Makefile +2012/konno/hint.html +2012/konno/hint.text +2012/konno/konno.c +2012/konno/konno.orig.c +2012/konno/konno_deobfuscate.c +2012/omoikane/Makefile +2012/omoikane/hint.html +2012/omoikane/hint.text +2012/omoikane/nyaruko.c +2012/omoikane/spoiler.html.gz +2012/rules.txt +2012/tromp/Makefile +2012/tromp/bf.Blc +2012/tromp/deflate.Blc +2012/tromp/hilbert.Blc +2012/tromp/hint.html +2012/tromp/hint.text +2012/tromp/how13 +2012/tromp/hw.bf +2012/tromp/inflate.Blc +2012/tromp/oddindices.Blc +2012/tromp/parse.Blc +2012/tromp/primes.blc +2012/tromp/primes.pl +2012/tromp/symbolic.Blc +2012/tromp/tromp.c +2012/tromp/tromp.orig.c +2012/tromp/uni.blc +2012/tromp/uni8.Blc +2012/vik/Makefile +2012/vik/chocolate.png +2012/vik/hint.html +2012/vik/hint.text +2012/vik/ioccc.png +2012/vik/vik.c +2012/whowon.html +2012/zeitak/Makefile +2012/zeitak/hint.html +2012/zeitak/hint.text +2012/zeitak/incorrect.c +2012/zeitak/zeitak.c +2012/zeitak/zeitak.orig.c +2012/zeitak/zeitak_deobfucate.c diff --git a/2012/Makefile b/2012/Makefile new file mode 100644 index 000000000..279365de3 --- /dev/null +++ b/2012/Makefile @@ -0,0 +1,147 @@ +#!/usr/bin/env make +# +# 2012 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############### +# IOCCC winners +############### +# +WINNERS= blakely deckmyn dlowe endoh1 endoh2 grothe hamano \ + hou kang konno omoikane tromp vik zeitak + + +################### +# build all entries +################### +# +all: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) ENTRY=$$i X11_LIBDIR=${X11_LIBDIR} X11_INCDIR=${X11_INCDIR} $@)"; \ + (cd $$i && $(MAKE) "ENTRY=$$i" "X11_LIBDIR=${X11_LIBDIR}" "X11_INCDIR=${X11_INCDIR}" $@); \ + done + +# alternative executable +# +alt: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) ENTRY=$$i X11_LIBDIR=${X11_LIBDIR} X11_INCDIR=${X11_INCDIR} $@)"; \ + (cd $$i && $(MAKE) "ENTRY=$$i" "X11_LIBDIR=${X11_LIBDIR}" "X11_INCDIR=${X11_INCDIR}" $@); \ + done + + +############### +# utility rules +############### +# +everything: all alt + +clean: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) ENTRY=$$i $@)"; \ + (cd $$i && $(MAKE) "ENTRY=$$i" $@); \ + done + +clobber: clean + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) ENTRY=$$i $@)"; \ + (cd $$i && $(MAKE) "ENTRY=$$i" $@); \ + done + +nuke: clobber + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) ENTRY=$$i $@)"; \ + (cd $$i && $(MAKE) "ENTRY=$$i" $@); \ + done + +install: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) ENTRY=$$i $@)"; \ + (cd $$i && $(MAKE) "ENTRY=$$i" $@); \ + done + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall be disallowed from not being unable to partly misunderstand this partocular final echo. + @${TRUE} + +# These rules are written in the sytle of "I Am the Walrus" +# and in particular John Lennon's take on deep analysis of art. :-) +# +# See also the sub-directory Makefiles for non-propaganda. +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v3; \ + else \ + echo "You are not expected to understand this"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 1c2c85c7a02c55d1add91967eca491d53c101dc1 --FNV1a_hash 256-bit -R ."; \ + else \ + echo "Understand different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 256-bit -R ."; \ + else \ + echo "These aren't the droids you're looking for Mr. Spock!"; \ + fi + @${TRUE} diff --git a/2012/README.html b/2012/README.html new file mode 100644 index 000000000..a6c591ffb --- /dev/null +++ b/2012/README.html @@ -0,0 +1,144 @@ + + + + + + + README + + +

2012 marked the “The Twenty First International Obfuscated C Code Contest”

+ +

Copyright © 2012, Landon Curt Noll, Simon Cooper, and Leonid A. +Broukhis. All Rights Reserved. Permission for personal, educational +or non-profit use is granted provided this copyright and notice are +included in its entirety and remains unaltered. All other uses +must receive prior permission from the contest judges.

+ +

Standard IOCCC stuff

+ +

The IOCCC has a web site and now has a number of international mirrors. +The primary site can be found at,

+ +

http://www.ioccc.org/

+ +

Use make to compile entries. It is possible that on non-Un*x / non-Linux +systems the makefile needs to be changed. See the Makefile for details.

+ +

Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitter.

+ +

Read over the makefile for compile/build issues. Your system may require +certain changes (add or remove a library, add or remove a #define).

+ +

Some ANSI C compilers are not quite as good as they should be. If +yours is lacking, you may need to compile using gcc instead of your +local compiler.

+ +

Remarks on some of the entries

+ +

We believe you will be impressed with this year’s winners. We had +a very difficult time picking a single best from among the other winners +because the overall quality of the winners were so high.

+ +

This year we selected the top 4 entries for particularly high honors:

+ +
    +
  • Gold award - Balanced use of obfuscation

    + +

    A very extremely subtle and twisted piece of source code! +Even if you start with the zeitak_deobfucate.c source, +you will still have a very challenging time to understand it!

  • +
  • Silver award - Most elementary use of C

    + +

    A fun program that could also have won “Best abuse of +Ghostscript” because it managed to create some PDF files +that Ghostscript could not read.

  • +
  • Bronze award - Best use of cocoa

    + +

    A picture within a picture is worth more than a +thousand (4 byte) words. :-)

  • +
  • Honorable mention - Most complex ASCII fluid

    + +

    When you see this program in action, you too will +very likely say wow as we did!

  • +
+ + +

But don’t ignore the other winners! There are games, utilities, +eye candy, calculators and graphical tools to explore.

+ +

This year, Yusuke Endoh won with two entries, one of which (endoh1) +won the special Honorable mention award. Eight of the winning entries +were from people who won in previous years.

+ +

This year we had a number of winners from Asia. We saw our second +winner from China and first from Korea. We are pleased to see +outstanding entries from areas of the world that have not been +active in past contests. Will we see an upswing of entries +from South America, Africa and Antarctica next year? :-)

+ +

Please note that judging is done completely anonymously. Please +do NOT reveal your identity in your source code. In the future we +may disqualify entries that reveal the identity of the submitter!

+ +

There were some outstanding entries that did not win. Unfortunately +some very good entries lost because they:

+ +
    +
  • would take years to execute

  • +
  • were way way oversize and didn’t even attempt to justify their +excess by a clever abuse of the rules

  • +
  • obfuscate themselves by simply invoking a complex +state machine

  • +
  • depend on a single obfuscation trick

  • +
  • could only be run on a particular vendor’s platform

  • +
  • were very similar to previous winners

  • +
  • were based on an overused theme such as yet another +fractal display program

  • +
  • didn’t work as documented

  • +
+ + +

We hope the authors of some of those entries will fix and re-submit +them for the next IOCCC.

+ +

There is a risk in submitting an entry that is similar to a well +used theme by previous winners. Previous winners set a very high +bar. A new winner must not only compete against other submissions +form the current year, they must also excel over similar winners +in some particularly impressive way.

+ +

Final Comments

+ +

Please feel free to send us comments and suggestions about the +competition, this README or anything else that you would like to see in +future contests.

+ +

If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used.

+ +

If you have problems with any of the entries, AND YOU HAVE A FIX, please +send us the fix (patch file or the entire changed file).

+ +

For the latest information on how to contact the IOCCC Judges please visit

+ +

http://www.ioccc.org/contact.html

+ +

For news of the next contest watch:

+ +

http://www.ioccc.org/

+ + + + +
Creative Commons License

© Copyright 1984-2012, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2012/README.text b/2012/README.text new file mode 100644 index 000000000..a4d44b4e6 --- /dev/null +++ b/2012/README.text @@ -0,0 +1,143 @@ +2012 marked the "The Twenty First International Obfuscated C Code Contest" +======================================================================== + +Copyright (C) 2012, Landon Curt Noll, Simon Cooper, and Leonid A. +Broukhis. All Rights Reserved. Permission for personal, educational +or non-profit use is granted provided this copyright and notice are +included in its entirety and remains unaltered. All other uses +must receive prior permission from the contest judges. + + +Standard IOCCC stuff +-------------------- + +The IOCCC has a web site and now has a number of international mirrors. +The primary site can be found at, + +> + +Use make to compile entries. It is possible that on non-Un\*x / non-Linux +systems the makefile needs to be changed. See the Makefile for details. + +Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitter. + +Read over the makefile for compile/build issues. Your system may require +certain changes (add or remove a library, add or remove a #define). + +Some ANSI C compilers are not quite as good as they should be. If +yours is lacking, you may need to compile using gcc instead of your +local compiler. + + +Remarks on some of the entries +------------------------------ + +We believe you will be impressed with this year's winners. We had +a very difficult time picking a single best from among the other winners +because the overall quality of the winners were so high. + +This year we selected the top 4 entries for particularly high honors: + +* Gold award - Balanced use of obfuscation + + A very extremely subtle and twisted piece of source code! + Even if you start with the zeitak_deobfucate.c source, + you will still have a very challenging time to understand it! + +* Silver award - Most elementary use of C + + A fun program that could also have won "Best abuse of + Ghostscript" because it managed to create some PDF files + that Ghostscript could not read. + +* Bronze award - Best use of cocoa + + A picture within a picture is worth more than a + thousand (4 byte) words. :-) + +* Honorable mention - Most complex ASCII fluid + + When you see this program in action, you too will + very likely say [wow](http://bit.ly/R6ALpK) as we did! + +But don't ignore the other winners! There are games, utilities, +eye candy, calculators and graphical tools to explore. + +This year, Yusuke Endoh won with two entries, one of which (endoh1) +won the special Honorable mention award. Eight of the winning entries +were from people who won in previous years. + +This year we had a number of winners from Asia. We saw our second +winner from China and first from Korea. We are pleased to see +outstanding entries from areas of the world that have not been +active in past contests. Will we see an upswing of entries +from South America, Africa and Antarctica next year? :-) + +Please note that judging is done completely anonymously. Please +do NOT reveal your identity in your source code. In the future we +may disqualify entries that reveal the identity of the submitter! + +There were some outstanding entries that did not win. Unfortunately +some very good entries lost because they: + ++ would take years to execute + ++ were way way oversize and didn't even attempt to justify their + excess by a clever abuse of the rules + ++ obfuscate themselves by simply invoking a complex + state machine + ++ depend on a single obfuscation trick + ++ could only be run on a particular vendor's platform + ++ were very similar to previous winners + ++ were based on an overused theme such as yet another + fractal display program + ++ didn't work as documented + +We hope the authors of some of those entries will fix and re-submit +them for the next IOCCC. + +There is a risk in submitting an entry that is similar to a well +used theme by previous winners. Previous winners set a very high +bar. A new winner must not only compete against other submissions +form the current year, they must also excel over similar winners +in some particularly impressive way. + +Final Comments +-------------- + +Please feel free to send us comments and suggestions about the +competition, this README or anything else that you would like to see in +future contests. + +If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used. + +If you have problems with any of the entries, AND YOU HAVE A FIX, please +send us the fix (patch file or the entire changed file). + +For the latest information on how to contact the IOCCC Judges please visit + +> + +For news of the next contest watch: + +> + + +-------------------------------------------------------------------------------- + diff --git a/2012/blakely/Makefile b/2012/blakely/Makefile new file mode 100644 index 000000000..de540c7c5 --- /dev/null +++ b/2012/blakely/Makefile @@ -0,0 +1,204 @@ +#!/usr/bin/env make +# +# 2012 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall -W +CWARN= -Wall -W -pedantic -Wno-unused-parameter + +# compiler standard +# +#CSTD= +CSTD= -ansi +#CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# Libraries needed to build +# +LIBS= -lm + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= blakely +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} -include stdio.h -include math.h -include stdlib.h \ + $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you're joking Mr. Feynman!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'waste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall be disallowed from not being unable to partly misunderstand this partocular final echo. + +# Understand the history of "I Am the Walrus" and +# and in particular John Lennon's remarks on that +# song and you might be confused about these next +# rules in a different way. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v3; \ + else \ + echo "You are not expected to understand this"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 1c2c85c7a02c55d1add91967eca491d53c101dc1 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "Understand different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 21701 --level 23209 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "These aren't the droids you're looking for Mr. Spock!"; \ + fi + @${TRUE} diff --git a/2012/blakely/blakely.c b/2012/blakely/blakely.c new file mode 100644 index 000000000..3e68128b7 --- /dev/null +++ b/2012/blakely/blakely.c @@ -0,0 +1,48 @@ +#define o(a,b,c,d) a##f b##f c##f d; a##g b##g c##g d;q-- +#define Z(z)if(*j==z) +#define c(z,p) Z(z){y;v p##=r;o(b,[q-1]=b,[q] p b,[q]);} +#define y q+=t;t=0 +#define r w[q] +#define v w[q-1] +#define w(a,m,f) Z(a){y;r=m(r);q++;o(b,[q-1] = -b,[q-1]*f(r)+0*b,[0]);} +#define A(p,w,o) for(p=0;p=48 &&*j<58){q++;t=1;r=*j-48 ; bf[q] = 0;(q--)[bg] = 0; + }j++;}H=bf[0] ;K= bg[ 0]; return w[0];} + void s(){int e=0;X=Q*8;f=g (Y*8, L*8 ) + ;e=(f-X<0)?1: -1;l=0;while((l+=h)<8) { + V=Y*8+l*R;W=L* 8+l*D;X= Q*8+l*U;f=g(V,W);if((f -X)*e>0){if(V>-1&&V<1&&W> + -1&&W<1){p=V;d=W;return ;}else e/=-1;}}p=d=-10 ;}int main(int argc, z ** + argv){int c, f;z b[2],Z ;S=0,C=1;k=argv[1];Z = atoi(argv[2])>>1;b[1]=Z*2 + + + &255;b[0]=Z>> 9;J= 3.1415/Z;A(f,6,f[e]^f+1);while(--f>1)_( + (f%2)[b]);_(246);A(c,384,c/3%2?c/6<<2:0);_(_(0));_(_((_(33) + <<3)-9)/23);for(f+=5;f < c/22 ; f++) _(e[f] ^ f - 3);for(;f + > c/29;f--)_(f>15?2*f- + 31:c);_(0);for(f=0;f<= + Z*2 ; f++){N = S;E_=1- + J*J/2;T=J*(1-J*J/6); + S=S*E_+C*T;C=C*E_-N* + T;A=-(C*C-S*S);P=-A* + C;E=A*S;G=S*C*2;I=- + G*S;F=G*C;_((_(e[10 + ]/2-1)<<3)-18);for( + c=-1;c<5;c++)_((c+1)%2?0:-2*c*c+3*c+9);_(44);A(c,9,c&4?(1-c%2 + )[b]:0);_(7);for(B=-Z ; B + + + + + + Most GIFted expressions + + +

Most GIFted expressions

+ +

Philip Blakely
+Cambridge, UK
+pmblakely@gmail.com

+ +

Judges' comments:

+ +

To build:

+ +
make blakely
+
+ +

To run:

+ +
./blakely "RPN formula" resolution > output.gif
+
+ +

Try:

+ +
./blakely "xx*yy*+" 64 > paraboloid.gif
+
+./blakely 9 32 > empty.gif
+
+time ./blakely 0 250 > flat.gif
+
+ +

Selected Judges Remarks:

+ +

Several IOCCC themes (RPN calculator, animated GIF generator, ray tracing) in one package! Very impressive!

+ +

The checkerboard pattern in the output can be broken. Could you figure out how?

+ +

Larger GIF files confuse some image viewers.

+ +

Author’s comments:

+ +

Remarks

+ +

This program renders a generic RPN expression in ray-traced animated GIF form. +The expression in spatial variables x and y is specified on the command-line with the required resolution, +and an animated GIF showing a fly-around of the resulting surface is output to stdout.

+ +

Usage

+ +

The program should be run as:

+ +
./blakely xy* 32 > pic.gif
+
+ +

where the first parameter is a RPN expression, and the second is the width of the required GIF, up to a maximum of 250.

+ +

The expressions are written in Reverse Polish Notation with the following characters recognised:

+ +
    +
  • +,-,*,/ - usual arithmetic operations
  • +
  • ^ - Exponentiation - valid for constant exponent only
  • +
  • s - sin
  • +
  • c - cos
  • +
  • 0-9 - single digit integers
  • +
  • d - duplicate number on stack
  • +
  • t - transpose top two elements on stack
  • +
  • x - x coordinate value
  • +
  • y - y coordinate value
  • +
+ + +

NB all arithmetic is done in double precision, so 23/ is two-thirds, rather than 0

+ +

The surface plotted corresponds to -1 <= x,y <= 1 and for best results, the generated z value should lie between -1 and 1.

+ +

If there is a division by zero, square-root of a negative number, or similar operation, then the results are undefined.

+ +

Examples

+ +

For test-runs, use a resolution of 32. For simple expressions, the GIF generation should take only +a few seconds with a modern processor and full optimization. Run-time scales as O(N3) with resolution N, +and more complex expressions take longer to compute. For example, increasing the resolution of ripple.gif +to 250 took ~35 minutes to render on an i7 processor.

+ +
./blakely xy* 32 > saddle.gif
+
+./blakely xx*yy*1++d5*ct/ 64 > ripple.gif
+
+ +

Algorithm

+ +

A generic root-finding algorithm to find the point of intersection between a ray +and the surface is done using a simple forward search from the eye. +In order to make the rendering realistic, both the value of the expression, and its derivative with respect to x and y must be tracked. +This is done using an obvious stack-based approach.

+ +

Obfuscations

+ +

Much of the obfuscation is achieved through the use of single-letter variables and #defines. +The characters output for the GIF format are generated in myriad and wonderful ways, making use +of XOR, return values from putchar, and odd expressions. +The layout is in the form of X Y Z.

+ +

Limitations

+ +

ASCII is assumed since many bytes for the GIF output are generated from characters given in the source code. +On compilation a few warnings about parentheses come up when using gcc 4.6.3, and one about no return value from main() (who uses exit codes anyway?), +but clang 3.1 emits no warnings.

+ +

Questions

+ +
    +
  • Apart from their appearance when computing the RPN expression, sin and cos are not used. +How do we then get the correct angles for rotation?
  • +
  • Exactly how many times will the animation repeat?
  • +
  • Why is there an upper limit of 250x250 for the resolution?
  • +
  • What is the point of b[0]?
  • +
  • Where are the words NETSCAPE and GIF hidden in the source?
  • +
+ + +

(Note that the author may or may not be able to answer all of the above questions.)

+ +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2012/blakely/hint.text b/2012/blakely/hint.text new file mode 100644 index 000000000..5d35057a1 --- /dev/null +++ b/2012/blakely/hint.text @@ -0,0 +1,121 @@ +# Most GIFted expressions + +Philip Blakely +Cambridge, UK + + + +## Judges' comments: +### To build: + + make blakely + +### To run: + + ./blakely "RPN formula" resolution > output.gif + +### Try: + + ./blakely "xx*yy*+" 64 > paraboloid.gif + + ./blakely 9 32 > empty.gif + + time ./blakely 0 250 > flat.gif + +### Selected Judges Remarks: + +Several IOCCC themes (RPN calculator, animated GIF generator, ray tracing) in one package! Very impressive! + +The checkerboard pattern in the output can be broken. Could you figure out how? + +Larger GIF files confuse some image viewers. + + +## Author's comments: +Remarks +------- + +This program renders a generic RPN expression in ray-traced animated GIF form. +The expression in spatial variables x and y is specified on the command-line with the required resolution, +and an animated GIF showing a fly-around of the resulting surface is output to stdout. + +Usage +----- + +The program should be run as: + + ./blakely xy* 32 > pic.gif +where the first parameter is a RPN expression, and the second is the width of the required GIF, up to a maximum of 250. + +The expressions are written in Reverse Polish Notation with the following characters recognised: + +* +,-,\*,/ - usual arithmetic operations +* ^ - Exponentiation - valid for constant exponent only +* s - sin +* c - cos +* 0-9 - single digit integers +* d - duplicate number on stack +* t - transpose top two elements on stack +* x - x coordinate value +* y - y coordinate value + +NB all arithmetic is done in double precision, so 23/ is two-thirds, rather than 0 + +The surface plotted corresponds to -1 <= x,y <= 1 and for best results, the generated z value should lie between -1 and 1. + +If there is a division by zero, square-root of a negative number, or similar operation, then the results are undefined. + +Examples +-------- + +For test-runs, use a resolution of 32. For simple expressions, the GIF generation should take only +a few seconds with a modern processor and full optimization. Run-time scales as O(N^3) with resolution N, +and more complex expressions take longer to compute. For example, increasing the resolution of ripple.gif +to 250 took ~35 minutes to render on an i7 processor. + + ./blakely xy* 32 > saddle.gif + + ./blakely xx*yy*1++d5*ct/ 64 > ripple.gif + +Algorithm +--------- + +A generic root-finding algorithm to find the point of intersection between a ray +and the surface is done using a simple forward search from the eye. +In order to make the rendering realistic, both the value of the expression, and its derivative with respect to x and y must be tracked. +This is done using an obvious stack-based approach. + +Obfuscations +------------ + +Much of the obfuscation is achieved through the use of single-letter variables and #defines. +The characters output for the GIF format are generated in myriad and wonderful ways, making use +of XOR, return values from putchar, and odd expressions. +The layout is in the form of X Y Z. + +Limitations +----------- +ASCII is assumed since many bytes for the GIF output are generated from characters given in the source code. +On compilation a few warnings about parentheses come up when using gcc 4.6.3, and one about no return value from main() (who uses exit codes anyway?), +but clang 3.1 emits no warnings. + +Questions +--------- + +* Apart from their appearance when computing the RPN expression, sin and cos are not used. + How do we then get the correct angles for rotation? +* Exactly how many times will the animation repeat? +* Why is there an upper limit of 250x250 for the resolution? +* What is the point of b[0]? +* Where are the words NETSCAPE and GIF hidden in the source? + +(Note that the author may or may not be able to answer all of the above questions.) + +-------------------------------------------------------------------------------- + diff --git a/2012/deckmyn/MANUAL b/2012/deckmyn/MANUAL new file mode 100644 index 000000000..bc729e1bf --- /dev/null +++ b/2012/deckmyn/MANUAL @@ -0,0 +1,58 @@ +USER MANUAL +=========== + +Calling the program +------------------- + +./prog "`cat prog.c`" "`cat musicfile`" > output.pbm +display output.pbm + +This minimalistic music notator expects two command line arguments. The first is the font description embedded in the source code. Notice that you don't pass the file name, but the actual content as one long character string! If you want to define your personal music font, you can of course do so. The file layout must be exactly the same as prog.c though, only the locations of space (" ") may differ. + +The second argument is the actual music. Again it is one long string, not a file name. But it is possible to save your music in a file, of course. + +Output should be redirected to a file. Afterwards, this file can be visualised with various viewers. + + +Music input +----------- + +Every element in the music is given by a string of *exactly* 3 characters. Any violation of this will result in the rest of the music being interpreted in some randomly wrong way. Notice that in a file, the newline is also a character! Therefore, when preparing music in a file, care shold be taken that the last musical element of a line is only 2 characters! + +1. Basic notes: +A single note is input by a letter [A-Ga-g] followed by a duration [1,2,4,8] and possibly a dot [.]. The notes cover 2 octaves, from C (lowest) to b (highest). The possible durations are 1 (whole note), 2 (half note), 4 (quaver), 8 (semi-quaver). So a dotted quaver A followed by a semi quaver G is input as "A4.G8 " + +2. Rests: +A rest is given by the letter [r] followed by a duration [1,2,4,8]. + +3. Bar lines: +There are three possible barline types: single (": "), double (":: ") and final (":; "). + +4. Accidentals: +Chromatic changes (sharp, flat, natural) are entered separately from the note that folows them! They are a three-character sequence by themselves. The first character is the chromatic change [+-=]. The second is the pitch at which it should be drawn. Thus "+G G4 " will draw a G sharp quaver. Notice that these signs do not necessarily have to be followed by a note. "+f +c +g B2 " is perfectly legal. + +5. Space (formatting): +To manually change the spacing of the music, you can add space between different musical elements. This is given by a [s] followed by the amount of space."s3 " is the space taken by one note. This length is given in 1 character. However, to get a value larger than 9, you can just continue along the ASCII table. So "sz " gives you quite a lot of space on a staff. "s0 " is not only meaningless, it can cause nasty results. + +6. New staff: +A token "x " signifies to start a new staff of music. A music staff may never be empty! Even if you just put some blank space ("s1 "), you should always have an entry for every staff. "x x " may give nasty results. + +All staves in the output are extended to the length of the longest staff. To have nicely formatted music, though, you will probably have to add spaces manually. + +7. Time signatures: +A time signature is given by [m][234][234]. For example, "m24" will give you a two fourth signature. Notice that there are only three available numbers. Especially "6" and "8" are dearly missed. + +8. Clef: +The clef (G or F) can only be changed at the beginning of the music input. If the music starts with "KF ", the music will be written in a bass cleff. "K" followed by any other letter will just default to a standard G clef. + +Examples +-------- + +Blank music paper (with G cleff): +./prog "`cat prog.c`" "sz sa x s1 x s1 x s1 x s1 x s1 "> blank.pbm +with an F cleff: +./prog "`cat prog.c`" "KF sz sa x s1 x s1 x s1 x s1 x s1 "> blank.pbm + +Notice how only the first staff (or any staff) needs to have the full length. + +Some files with well-known melodies are included as examples. diff --git a/2012/deckmyn/Makefile b/2012/deckmyn/Makefile new file mode 100644 index 000000000..4e9311482 --- /dev/null +++ b/2012/deckmyn/Makefile @@ -0,0 +1,203 @@ +#!/usr/bin/env make +# +# 2012 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -W +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${LIBS} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= deckmyn +DATA= MANUAL example_beethoven example_greensleeves +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you're joking Mr. Feynman!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'waste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall be disallowed from not being unable to partly misunderstand this partocular final echo. + +# Understand the history of "I Am the Walrus" and +# and in particular John Lennon's remarks on that +# song and you might be confused about these next +# rules in a different way. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v3; \ + else \ + echo "You are not expected to understand this"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 1c2c85c7a02c55d1add91967eca491d53c101dc1 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "Understand different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 21701 --level 23209 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "These aren't the droids you're looking for Mr. Spock!"; \ + fi + @${TRUE} diff --git a/2012/deckmyn/deckmyn.c b/2012/deckmyn/deckmyn.c new file mode 100644 index 000000000..813c9c0b7 --- /dev/null +++ b/2012/deckmyn/deckmyn.c @@ -0,0 +1,97 @@ +#include +#define c(C) printf("%c",C) +#define C(c) ((int*)(C[1]+6))[c] +main(int c,char +*C[]) {(C[c]=C[ +1]+2 )[0]= c(52*c(\ +'C'+ '4'/4) );for(c +=0; c<491;++ c)for(* +*C= C[1]['c' +c] = +0;* C[0]<8;( ** C +)++ )C[1][c+ 'c']= +*(C[ 1]+c+'c')+ C[1][ +99+ c]+(C[1 ][**C ++8*c +99]==32 ); ( +*C)[4]=*C[2]== 75 ? +*((C[2]+=3)-2 )==70? +1:0:0;C(0)=C( 1)=c=0 +;while(*C[2]? C[2][1] +?*(C[2]+2)?1 :0:0:0) +{if( *C [2 ]>'w'){ +C(1)=0;C[1] [2]++;*C +[2]=0;}else C(1)+=*C[ +2]==58?2+( C[2][3]&& +*(C[2]+3)< 'x'):*C[2] +=='s'?(C[ 2][1]-=48): +*C[2]>=65 ?3-(*C[2]==\ +'m'?1:0) :1;C(0)=C(1)> +C(0)?C(1 ):C(0);c+=3;* +(C+2)+=3;}printf(" %d\ + %d\n", 56+8*C( 0),80**(C[3] ++)) + ;*C[2]=0 ;C[2] -=c;*C[3] =0; + while(C[3] [1,- 1]--){; for( ** + C=0 ;* *C< 80;(** C)++) {C + [2] -=3 ** C[3]; *C[3] ++ + =0; *C[ 3] =**C>= 51||* *C< + 18 ||* *C %8!=2?0 :255 ;c(1 + -1 );c (*C [3]);for( (*C)[ + 1] =0;( *C)[ 1]<3;(*C)[1] ++)c(*C + [3 ]|(( *C)[ 4]?**C>18&&* *C<42 ?C[1][ + 42 +*(* C+1) +3***C]:0: **C>= 11&&* + *C <64? ~C[1 ][ 7***C+97 +(*C)[ 1]]: + 0) );c( *C[3 ]++) ;for(C (1)=0; (C( + 2) =C(1 ))'r' ?C[ 2][1]:(1 + +2*(*C [2]> 64) +(2-!C[2 ][3]) + *(58 == (*(C +2))[0])- + (C[2] [0 ]=='m' ) ):C(2)?C(0 )-C( + 2):0 );C(3)++) C(1)+=c(C [1][4]|(* C[2]&& + *C[2 ]<'s'?*C[2] ==58?C(3) ==1?**C >17&&**C + <51 ?C[ 2] [1] ==59?39: C[2][1 ]==58?9:1: +0:0 :63 >* C[2 ]?(c<7&& c>-9?C[1 ][(*C[2]< +45? 'c' *5 +2* '%':*C[ 2]< 61?570 :571)+ +3*c ]: 0) :*C [2]>'o' ?**C>26&&**C<29 &&! +(*C )[ 2] ||( *C)[2] ==1&&(&*C[0]) [0] + <34 && 31 <** C?C(3) <2?15+225*C(3 ):0:( + *C)[ 2] == 3?C (3)<2 &&**C>22&&**C <45&&C + (3)< 2? C[ 1][7* *(*C)+151+C (3)]:0: + 7==( *C )[2 ]&&* *C>26&&**C <42&&C(3 + )<2?C [1 ][7 ***C +135+C(3)] :0:*C[2] + <'k'? (c >-5 && c<5?C(3 + )<2?C [1][( (*C) [2]<3? + 207:205)+7* c+C(3 )]:C[ + 2][2]==46 && (c==-2|| c==- + 1- 2*(*C[3]%2 ))? + 96 :0:0)|((*C)[2 + ]? + C( 3 ) ?C(3)< 2 + && *C[3]> 7 && + c< 1&&c >-24 ?8:0:* C + [3 ]<8&&c >1 &&c<24 ? ' ' + :0 :0) |(C(3) <2 &&( ** C + ==66 && *C[3 ]>14 ||* C[ 3 + ]>12 && 58 ==**C|| * + C[3 ]< 2 &&**C==10 ) ? + 5* 51: 0)|(7== ( + *C)[ 2]?*C[3] < +8?c>13&& c<23&&C(3)<2?C +[1][144+ 7*c+C(3)]:0:C( +3) && c< -14&&c>- 24?C[ +1] [7 *c +400+C(3 )]:0: +0) :! C (3)?**C> 21&&C +[0 ][ 0] <32 +?C [ 1 ] [( +* C ) [2 ] +323 + +7 ** *C ]:36 + + 1 < ** C&& '0'> +* *C ? C[1][ + C[ 2] [2]+162 + + 7* **C]:0:0:0));C[1 +][ 3] ++;C[2]+=3;}c(0) +;C [3 ]-=2;}*C[3]=0;}} diff --git a/2012/deckmyn/example_beethoven b/2012/deckmyn/example_beethoven new file mode 100644 index 000000000..7efa22f8c --- /dev/null +++ b/2012/deckmyn/example_beethoven @@ -0,0 +1,4 @@ +m44e2 f4 g4 : g4 f4 e4 d4 : c4 c4 d4 e4 : e4.d8 d2 : +e2 f4 g4 : g4 f4 e4 d4 : x c4 c4 d4 e4 : d4.c8 c2 :: +d2 e4 c4 : d4 e8 f8 e4 c4 : d4 e8 f8 e4 d4 : x c4 d4 G2 : +e4 e4 f4 g4 : g4 f4 e4 d4 : c4 c4 d4 e4 : d4.c8 c2 :; diff --git a/2012/deckmyn/example_greensleeves b/2012/deckmyn/example_greensleeves new file mode 100644 index 000000000..146537553 --- /dev/null +++ b/2012/deckmyn/example_greensleeves @@ -0,0 +1,8 @@ +m34A4 : c2 d4 : e4.+f f8 e4 : d2 B4 : G4.A8 B4 : +c2 A4 : A4.G8 A4 : B2 G4 : E2 A4 : x +c2 s1 d4 : e4.+f f8 e4 : d2 s1 B4 : G4.A8 B4 : c4.B8 A4 : ++G G4.+F F8 G4 : s2 A2.s2 : s2 A2.s1 :: x +g2.s2 : g4.+f f8 e4 : d2 s2 B4 : G4.A8 B4 : c2 s3 A4 : +A4.s1 G8 s1 A4 : B2 s1 G4 : s2 E2.s2 : x +g2.s2 : g4.+f f8 e4 : d2 s2 B4 : G4.A8 B4 : c4.B8 A4 : ++G G4.+F F8 G4 : s2 A2.s2 : s2 A2.s2 :; diff --git a/2012/deckmyn/hint.html b/2012/deckmyn/hint.html new file mode 100644 index 000000000..638ab87be --- /dev/null +++ b/2012/deckmyn/hint.html @@ -0,0 +1,122 @@ + + + + + + + Most notable and best tool + + +

Most notable and best tool

+ +

Alex Deckmyn
+alex.deckmyn@gmail.com

+ +

Judges' comments:

+ +

To build:

+ +
make deckmyn
+
+ +

To run:

+ +
# A shell interpreter with proper backtick interpolation is required
+./deckmyn "`cat deckmyn.c`" "`cat musicfile.txt`" > sheetmusic.pbm
+
+ +

Try:

+ +
./deckmyn "`cat deckmyn.c`" "`cat example_greensleeves`" > greensleeves.pbm
+
+ +

Selected Judges Remarks:

+ +

The C of this entry is definitely sharp. The program cleverly uses its own +source at runtime to define the notes, time signature and accidental bitmaps.

+ +

In addition to sheet music, this program is also able, given the right input, +to generate an image of a 10-pin DIP chip (a sound processor?).

+ +

Ironically, the way this entry is called from the command line is an abuse of C Shell. +Please use Bourne-family shells to run this entry.

+ +

Author’s comments:

+ +

Example use

+ +

You need the source code and example input (either one of the example files, or manual input as below) ready. And a program capable of showing .pbm bitmap format.

+ +
./deckmyn "`cat deckmyn.c`" "`cat example_greensleeves`" > greensleeves.pbm
+display greensleeves.pbm
+
+./deckmyn "`cat deckmyn.c`" "KF m44c4 c4 g4 g4 :  a4 a4 g2 :; " > short_bass.pbm
+display short_bass.pbm
+
+ +

Description

+ +

Every major C competition should have an entry capable of producing C major. +This is a music notation program. It produces bitmaps (.pbm) of music based on ASCII input. A full manual is added as a separate file. Some musical examples are also included.

+ +

The program is capable of printing notes, rests, (double) bar lines and accidentals on a single melodic line (multiple staves). No chords, polyphony etc.

+ +

The program expects two command line arguments. The first is a (very long) string that contains the complete music font. Note that it should not be given as a file name! The default music font is encoded in the (whitespace of the) source code deckmyn.c itself. Therefore, the first argument should be “cat deckmyn.c”.

+ +

The second command line argument is the music itself. This is, again, a string, not a file name. All music signs are entered as tokens of exactly 3 characters. The code is very sensitive to bad spacing! So for instance, if you use a file to write the music (e.g. example_greensleeves), you should keep in mind that newline is also a character!

+ +

Internals

+ +

To minimise the memory footprint, this program has no variable declarations at all, except for the arguments to main(). The only available memory space is from the command line arguments and count (argv and argc). Parts of argv are cast as integer when values under 0 or beyond 127 are expected.

+ +

The “music font” is defined by the source code itself. The first few lines are not part of the font definition, as this memory space will modified by the program. (So as required by the rules, it is only a (memory) copy of the source code that is modified.)

+ +

As there is no memory available, output is directly to stdout, byte by byte, from the top left to the bottom right pixel.

+ +

LIMITATIONS

+ +

The memory locations of argv are used for various purposes. Therefore, the program name (default “deckmyn”) must be at least 4 characters long, including possibly the path. This, along with the ending ‘\0’, gives minimum 5 bytes of useful memory space. Otherwise, the program may attempt to write outside the string.

+ +

The code is quite sensitive. Errors in the input can lead to strange results. The code does not read beyond the end of the music input, but that is about the only error checking available. Any input that is not according to the rules in the MANUAL, may cause errors.

+ +

The program has no special hardware limitations or requirements, other than 8bit char (signed or unsigned) and two’s complement negatives.

+ +

The limitations of using char as counters for e.g. the number of music staves are minor. 127 staves to a page is rather a lot.

+ +

Obfuscations

+ +

The code has no declared variables other than the command line variables. Not even pointers (we all know how messy code can get with too many pointers!). As more than one variable needs values beyond 127, parts of the command line memory are cast as integer using a macro.

+ +
    +
  • The formatting of the code is in fact necessary, as this is the definition of the music font. It is therefore not an obfuscation.
  • +
  • The use of only argv/argc as memory locations is a matter of reducing the memory footprint. Again, it is not an obfuscation.
  • +
  • Calling the only remaining variables, and the two defined macros, c and C, is merely a matter of conforming to the standard WYSIWYG paradigm common in commercial notation programs (What You C is What You Get). So once again it is not an obfuscation. Anyway, it’s a C coding contest, right?
  • +
  • Randomly using the numerical (ASCII) value for characters is compensated for by replacing some numbers by a character representation. On average, therefore, it is not an obfuscation.
  • +
  • Randomly changing the way the elements of argv are addressed is a matter of maintaining a diversified code base. It is therefore not… Oh allright.
  • +
  • The actual output of the music is done by one print command including a 800+ character nested conditional expression.
  • +
  • printf is also used for its return value.
  • +
+ + +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2012/deckmyn/hint.text b/2012/deckmyn/hint.text new file mode 100644 index 000000000..d3c77d0c3 --- /dev/null +++ b/2012/deckmyn/hint.text @@ -0,0 +1,101 @@ +# Most notable and best tool + +Alex Deckmyn + + + +## Judges' comments: +### To build: + + make deckmyn + +### To run: + + # A shell interpreter with proper backtick interpolation is required + ./deckmyn "`cat deckmyn.c`" "`cat musicfile.txt`" > sheetmusic.pbm + +### Try: + + ./deckmyn "`cat deckmyn.c`" "`cat example_greensleeves`" > greensleeves.pbm + +### Selected Judges Remarks: + +The C of this entry is definitely sharp. The program cleverly uses its own +source at runtime to define the notes, time signature and accidental bitmaps. + +In addition to sheet music, this program is also able, given the right input, +to generate an image of a 10-pin DIP chip (a sound processor?). + +Ironically, the way this entry is called from the command line is an abuse of C Shell. +Please use Bourne-family shells to run this entry. + +## Author's comments: + +Example use +=========== + +You need the source code and example input (either one of the example files, or manual input as below) ready. And a program capable of showing .pbm bitmap format. + + ./deckmyn "`cat deckmyn.c`" "`cat example_greensleeves`" > greensleeves.pbm + display greensleeves.pbm + + ./deckmyn "`cat deckmyn.c`" "KF m44c4 c4 g4 g4 : a4 a4 g2 :; " > short_bass.pbm + display short_bass.pbm + +Description +=========== + +Every major C competition should have an entry capable of producing C major. +This is a music notation program. It produces bitmaps (.pbm) of music based on ASCII input. A full manual is added as a separate file. Some musical examples are also included. + +The program is capable of printing notes, rests, (double) bar lines and accidentals on a single melodic line (multiple staves). No chords, polyphony etc. + +The program expects *two command line arguments*. The first is a (very long) string that contains the complete music font. Note that it should *not* be given as a file name! The default music font is encoded in the (whitespace of the) source code deckmyn.c itself. Therefore, the first argument should be "`cat deckmyn.c`". + +The second command line argument is the music itself. This is, again, a string, not a file name. All music signs are entered as tokens of exactly 3 characters. The code is very sensitive to bad spacing! So for instance, if you use a file to write the music (e.g. example\_greensleeves), you should keep in mind that newline is also a character! + + +Internals +========= + +To minimise the memory footprint, this program has *no variable declarations at all*, except for the arguments to main(). The only available memory space is from the command line arguments and count (argv and argc). Parts of argv are cast as integer when values under 0 or beyond 127 are expected. + +The "music font" is defined by the source code itself. The first few lines are not part of the font definition, as this memory space will modified by the program. (So as required by the rules, it is only a (memory) copy of the source code that is modified.) + +As there is no memory available, output is directly to stdout, byte by byte, from the top left to the bottom right pixel. + + +LIMITATIONS +=========== + +The memory locations of argv are used for various purposes. Therefore, the program name (default "deckmyn") must be *at least 4 characters long*, including possibly the path. This, along with the ending '\0', gives minimum 5 bytes of useful memory space. Otherwise, the program may attempt to write outside the string. + +The code is quite sensitive. Errors in the input can lead to strange results. The code does not read beyond the end of the music input, but that is about the only error checking available. Any input that is not according to the rules in the MANUAL, may cause errors. + +The program has no special hardware limitations or requirements, other than 8bit char (signed or unsigned) and two's complement negatives. + +The limitations of using char as counters for e.g. the number of music staves are minor. 127 staves to a page is rather a lot. + + +Obfuscations +============ + +The code has no declared variables other than the command line variables. Not even pointers (we all know how messy code can get with too many pointers!). As more than one variable needs values beyond 127, parts of the command line memory are cast as integer using a macro. + +- The formatting of the code is in fact necessary, as this is the definition of the music font. It is therefore not an obfuscation. +- The use of only argv/argc as memory locations is a matter of reducing the memory footprint. Again, it is not an obfuscation. +- Calling the only remaining variables, and the two defined macros, c and C, is merely a matter of conforming to the standard WYSIWYG paradigm common in commercial notation programs (What You C is What You Get). So once again it is not an obfuscation. Anyway, it's a C coding contest, right? +- Randomly using the numerical (ASCII) value for characters is compensated for by replacing some numbers by a character representation. On average, therefore, it is not an obfuscation. +- Randomly changing the way the elements of argv are addressed is a matter of maintaining a diversified code base. It is therefore not... Oh allright. +- The actual output of the music is done by one print command including a 800+ character nested conditional expression. +- printf is also used for its return value. + + +-------------------------------------------------------------------------------- + diff --git a/2012/dlowe/Makefile b/2012/dlowe/Makefile new file mode 100644 index 000000000..f8a7a3faa --- /dev/null +++ b/2012/dlowe/Makefile @@ -0,0 +1,203 @@ +#!/usr/bin/env make +# +# 2012 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -W +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= -L${X11_LIBDIR} -lX11 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= dlowe +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} -I${X11_INCDIR} -D_BSD_SOURCE $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you're joking Mr. Feynman!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'waste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall be disallowed from not being unable to partly misunderstand this partocular final echo. + +# Understand the history of "I Am the Walrus" and +# and in particular John Lennon's remarks on that +# song and you might be confused about these next +# rules in a different way. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v3; \ + else \ + echo "You are not expected to understand this"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 1c2c85c7a02c55d1add91967eca491d53c101dc1 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "Understand different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 21701 --level 23209 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "These aren't the droids you're looking for Mr. Spock!"; \ + fi + @${TRUE} diff --git a/2012/dlowe/dead.d b/2012/dlowe/dead.d new file mode 100644 index 000000000..400360ebc Binary files /dev/null and b/2012/dlowe/dead.d differ diff --git a/2012/dlowe/dlowe.c b/2012/dlowe/dlowe.c new file mode 100644 index 000000000..1cb998108 --- /dev/null +++ b/2012/dlowe/dlowe.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include +#include +#define B(x, y)(x *48+y) + +#define L for( d=0; d<48 ; ++d)for(e=0; e<48; ++e) +#define C(x , y ) ( 1 << B ((x) , (y) ) % 8 ) +#define A(x,y )((c.c.c[B ((x),(y))/8]&C(x,y))?1:0) +#define R(d ) freopen ( d , "r" , stdin ) ; f\ +read ( & c . c , 288 , 1 , stdin ) ; +#define S( b ) ( b ) ? ( c.d.c [ B( d , e) / 8 ]|\ +=C ( d , e ) ) : ( c.d.c [B(d,e)/ 8]&= ~(C (d,e))) + +int a,b,d,e,f,s; struct{ struct{ char c[288]; } c, +d; int f, g, a, b ; } c; void h(int a,int b){ if(! +(a==(f=b)||(a%2&&b%2))){ if(b==2){ R("splash.d") } +else if ( b == 4 ) { R ( "dead.d" )} else{ L S(0); +c.c=c.d; } c.f=1000; c.b =240; c.g =1; c.a =0; } } +int main (){ Display *i= XOpenDisplay(0); Window q += XCreateSimpleWindow(i, RootWindow ( i , s = + +DefaultScreen(i)),40,40, 640,480,3,0,0); Pixmap u= +XCreatePixmap (i,q ,640, 480,a=DefaultDepth(i,s)), +p=XCreatePixmap (i,q,20, 100,a); GC g=DefaultGC(i, +s ) ; XGCValues W, B ; XEvent v ; long k ; +XSelectInput ( i , q , KeyPressMask|KeyReleaseM\ +ask ); XMapWindow (i,q); W.foreground = WhitePixel +(i, s) ; B. foreground = BlackPixel ( i, s ) ; R ( + + "sprites.d") L{ XChangeGC (i,g,GCForeground,A(d,e)? + &B:&W); if(e<20) if(d<20) XDrawPoint(i, p,g, d,e ); + else if ( d < 25 ) XFillRectangle(i,p,g,4*(d + -20) ,20 + 4*e, 4, 4 ); } srand( time(0 )); h(0,2); + while(usleep (16666), f){ while ( XPending ( i) ) { + XNextEvent (i,&v); h(f,v. type == KeyPress ? (( k = + XLookupKeysym(& v.xkey,0) )==XK_q?0:(k==XK_Up?(f==4 + + ?f:3):(k== XK_Down?(f==4? + f:5):(f==2?1:( f==4?2:f)) + ))):( v.type==KeyRelease? + (( k = XLookupKeysym( &v. + xkey,0))== XK_Up?(f==3?1: + f): (f==5?1:f)):f)); } if + (!c.g){ L{ for(k=0, a=-1; + +a<2; ++a)if(d+a>=0&&d+a< 48)for(b=-1; b<2; ++b)if( e+b>=0&&e+b< 48)k+=(a||b) +&&A(d+a,e+b); S(A(d,e)?k ==2||k==3:k==3); } c.c=c. d; } c.g= ++c.g% (f%2?30: +120); c.f +=2; c.a+=f%2? c.f/1000:0; c.b+=f==3?-2: (f==5?2:0); a=c.a>159?-8: +0; b=c.b>399?-8:(c.b<81? 8:0); c.a=a?0:c.a; c.b=b? 240:c.b; L S(((d-a>=0)&&( +d-a<48)&&(e-b>=0)&&(e-b< 48))?A(d-a,e-b):((rand()% 8 ) == 1 )) ; c.c = c.d ; +XFillRectangle(i,u,g,0,0 ,640, 480); L{ if A( d,e) XCopyArea(i,p,u,g,0,0,20, +20,d*20-c.a,e*20-c.b); } if( f%2){ for(d=c.a+ 100; d + + + + + + Best way to lose a life + + +

Best way to lose a life

+ +
    +
  1. David Lowe
    +434 Tenney Drive
    +Rogue River, OR
    +97537
    +j.david.lowe@gmail.com
    +http://www.pootpoot.net/
  2. +
+ + +

Judges' comments:

+ +

To build:

+ +
make dlowe
+
+ +

To run:

+ +
./dlowe
+
+ +

Try:

+ +
./dlowe
+# Watch for a while if you like, then press a key within the window
+# Use up and down keys to escape death
+
+ +

Selected Judges Remarks:

+ +

The judges lose playing this game. This entry wins!

+ +

OS X users running Mountain Lion and later will need to download and install:

+ +
http://xquartz.macosforge.org/landing/
+
+ +

Q: How did we get past the variadic macro problem on a Mac?

+ +

A: Don’t use -pedantic-errors in the Makefile.

+ +

Author’s comments:

+ +

Conway’s Game of DEATH

+ +

This is a challenging, fast-paced arcade game, based on the famous Game of +Life.

+ +

Story

+ +

In the game, you are Mr.C, a lightweight spaceship making a futile dash for +escape from the rigid rules and predictability of life in the B3/S23 universe.

+ +

Use the up and down arrow keys to steer: collisions are fatal for Mr.C! Learn +to spot incoming gliders, skim the surfaces of beehives and blocks, and give +blinkers plenty of space. Things get crazier as Mr.C picks up speed… can he +escape?

+ +

No. There is no winning. Sadly for Mr.C, this universe goes on forever. Just +see how far you can make it!

+ +

Press ‘q’ any time to quit.

+ +

Features

+ +
    +
  • casual gameplay
  • +
  • infinite, procedurally generated universe
  • +
  • progressive difficulty
  • +
  • animated splash screens
  • +
+ + +

Limitations

+ +
    +
  • Flicker, especially at high speeds, and in spite of “double-buffering” (X11 +doesn’t make it possible to lock drawing to the display refresh rate.)
  • +
  • Cannot be run outside of the directory containing the data files (splash.d, +dead.d and sprites.d).
  • +
  • Cannot build or run without X11 (or an X11 compatibility layer).
  • +
+ + +

Wish List

+ +
    +
  • Score keeping
  • +
  • Color
  • +
  • In-game instructions
  • +
  • Sound
  • +
+ + +

Hosts Tested

+ +
    +
  • Darwin 10.8.0 i386 (clang 1.6 and gcc 4.2.1)
  • +
  • Linux 2.6.32 i686 (clang 1.1 and gcc 4.4.3)
  • +
  • Linux 3.2.0 x86_64 (clang 3.0 and gcc 4.6.3)
  • +
+ + +

Obfuscations

+ +

The code is formatted into a 14-cell shape which will evolve into a glider in +19 generations.

+ +

Lots of globals, including a global struct whose members have the same names +as global variables.

+ +

Global variables getting reused in different contexts.

+ +

Huge and convoluted expressions, abusing ternary operators and operator +precedence.

+ +

Lots of magic numbers, abuse of the relationships between magic numbers, and +abuse of the arithmetic properties of magic numbers.

+ +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2012/dlowe/hint.text b/2012/dlowe/hint.text new file mode 100644 index 000000000..c6974b687 --- /dev/null +++ b/2012/dlowe/hint.text @@ -0,0 +1,111 @@ +# Best way to lose a life + +J. David Lowe +434 Tenney Drive +Rogue River, OR +97537 + + + + +## Judges' comments: +### To build: + + make dlowe + +### To run: + + ./dlowe + +### Try: + + ./dlowe + # Watch for a while if you like, then press a key within the window + # Use up and down keys to escape death + +### Selected Judges Remarks: + +The judges lose playing this game. This entry wins! + +OS X users running Mountain Lion and later will need to download and install: + + http://xquartz.macosforge.org/landing/ + +Q: How did we get past the variadic macro problem on a Mac? + +A: Don't use -pedantic-errors in the Makefile. + + +## Author's comments: +# Conway's Game of DEATH + +This is a challenging, fast-paced arcade game, based on the famous Game of +Life. + +## Story + +In the game, you are Mr.C, a lightweight spaceship making a futile dash for +escape from the rigid rules and predictability of life in the B3/S23 universe. + +Use the up and down arrow keys to steer: collisions are fatal for Mr.C! Learn +to spot incoming gliders, skim the surfaces of beehives and blocks, and give +blinkers plenty of space. Things get crazier as Mr.C picks up speed... can he +escape? + +No. There is no winning. Sadly for Mr.C, this universe goes on forever. Just +see how far you can make it! + +Press 'q' any time to quit. + +## Features + +* casual gameplay +* infinite, procedurally generated universe +* progressive difficulty +* animated splash screens + +## Limitations + +* Flicker, especially at high speeds, and in spite of "double-buffering" (X11 + doesn't make it possible to lock drawing to the display refresh rate.) +* Cannot be run outside of the directory containing the data files (splash.d, + dead.d and sprites.d). +* Cannot build or run without X11 (or an X11 compatibility layer). + +## Wish List + +* Score keeping +* Color +* In-game instructions +* Sound + +## Hosts Tested + +* Darwin 10.8.0 i386 (clang 1.6 and gcc 4.2.1) +* Linux 2.6.32 i686 (clang 1.1 and gcc 4.4.3) +* Linux 3.2.0 x86\_64 (clang 3.0 and gcc 4.6.3) + +## Obfuscations + +The code is formatted into a 14-cell shape which will evolve into a glider in +19 generations. + +Lots of globals, including a global struct whose members have the same names +as global variables. + +Global variables getting reused in different contexts. + +Huge and convoluted expressions, abusing ternary operators and operator +precedence. + +Lots of magic numbers, abuse of the relationships between magic numbers, and +abuse of the arithmetic properties of magic numbers. + +-------------------------------------------------------------------------------- + diff --git a/2012/dlowe/splash.d b/2012/dlowe/splash.d new file mode 100644 index 000000000..5f27bf4b7 Binary files /dev/null and b/2012/dlowe/splash.d differ diff --git a/2012/dlowe/sprites.d b/2012/dlowe/sprites.d new file mode 100644 index 000000000..8a0de416d Binary files /dev/null and b/2012/dlowe/sprites.d differ diff --git a/2012/endoh1/Makefile b/2012/endoh1/Makefile new file mode 100644 index 000000000..1bc95d938 --- /dev/null +++ b/2012/endoh1/Makefile @@ -0,0 +1,222 @@ +#!/usr/bin/env make +# +# 2012 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall -W +CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= -lm + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= endoh1 +DATA= column.txt column2.txt column3.txt corners.txt dripping-pan.txt \ + evaporation.txt flat.txt fountain.txt funnel.txt funnel2.txt \ + funnel3.txt leidenfrost.txt logo.txt pour-out.txt tanada.txt +ALT_OBJ= endoh1_color.o +ALT_ENTRY= endoh1_color + +# The factor of gravity +# +G=1 + +# The factor of pressure +# +P=4 + +# The factor of viscosity +# +V=8 + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} -DG=$G -DP=$P -DV=$P $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +endoh1_deobfuscate: endoh1_deobfuscate.c + ${CC} ${CFLAGS} -DG=$G -DP=$P -DV=$P $< -o $@ ${LIBS} + +endoh1_color: endoh1_color.c + ${CC} ${CFLAGS} -DG=$G -DP=$P -DV=$P $< -o $@ ${LIBS} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you're joking Mr. Feynman!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'waste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall be disallowed from not being unable to partly misunderstand this partocular final echo. + +# Understand the history of "I Am the Walrus" and +# and in particular John Lennon's remarks on that +# song and you might be confused about these next +# rules in a different way. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v3; \ + else \ + echo "You are not expected to understand this"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 1c2c85c7a02c55d1add91967eca491d53c101dc1 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "Understand different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 21701 --level 23209 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "These aren't the droids you're looking for Mr. Spock!"; \ + fi + @${TRUE} diff --git a/2012/endoh1/Makefile.orig b/2012/endoh1/Makefile.orig new file mode 100644 index 000000000..87467c850 --- /dev/null +++ b/2012/endoh1/Makefile.orig @@ -0,0 +1,22 @@ +# the factor of gravity +G=1 +# the factor of pressure +P=4 +# the factor of viscosity +V=8 +RM= rm +TRUE= true +CWARN= -Wall -W -Wextra -pedantic +CSTD= -std=c99 -D_BSD_SOURCE +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} +CC= gcc +ENTRY= prog + +all: ${ENTRY} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} -DG=$G -DP=$P -DV=$P ${ENTRY}.c -o $@ -lm + +clean: + $(RM) -f ${ENTRY} diff --git a/2012/endoh1/clock.txt b/2012/endoh1/clock.txt new file mode 100644 index 000000000..13b94c929 --- /dev/null +++ b/2012/endoh1/clock.txt @@ -0,0 +1,24 @@ + ######################## + ##xxxxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxxxxxx## + ###xxxxxxxxxxxxxxxxxx### + ###xxxxxxxxxxxxxxxx### + ###xxxxxxxxxxxx### + ### ### + ### ### + ### ### + ### ### + ### ### + ### ### + ### ### + ### ### + ## ## + ## ## + ## ## + ## ## + ## ## + ######################## + diff --git a/2012/endoh1/column.txt b/2012/endoh1/column.txt new file mode 100644 index 000000000..e7a5148dd --- /dev/null +++ b/2012/endoh1/column.txt @@ -0,0 +1,23 @@ + + + + + +### ............... ### +### ................. ### +### ................. ### +### ................. ### +### ................. ### +### ................. ### +### ................. ### +### ................. ### +### ................. ### +### ................. ### +### ................. ### +### ................. ### +### ................. ### +### ................. ### +### ................. ### +### ............... ### +########################################################################## + ######################################################################## diff --git a/2012/endoh1/column2.txt b/2012/endoh1/column2.txt new file mode 100644 index 000000000..4e871d635 --- /dev/null +++ b/2012/endoh1/column2.txt @@ -0,0 +1,22 @@ + + + + +### .......... ### +### ........... ### +### ........... ### +### ........... ### +### ........... ### +### ........... ### +### ........... +### ........... +### ........... +### ........... ### +### ........... ### +### ........... ### +### ........... ### +### ........... ### +### ........... # ### +### .......... ### ### +############################################################################## + ############################################################################ diff --git a/2012/endoh1/column3.txt b/2012/endoh1/column3.txt new file mode 100644 index 000000000..2cded8aaf --- /dev/null +++ b/2012/endoh1/column3.txt @@ -0,0 +1,22 @@ + + + + +### .......... ### +### .................................................................### +### ........... ### +### ........... ### +### ........... ### +### ........... ### +### ........... +### ........... +### ........... +### ........... ### +### ........... ### +### ........... ### +### ........... ### +### ........... ### +### ........... # ### +### .......... ### ### +############################################################################## + ############################################################################ diff --git a/2012/endoh1/corners.txt b/2012/endoh1/corners.txt new file mode 100644 index 000000000..45e5dccfb --- /dev/null +++ b/2012/endoh1/corners.txt @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + +# # +# # +# # +#@ @# +############################################################################### diff --git a/2012/endoh1/dripping-pan.txt b/2012/endoh1/dripping-pan.txt new file mode 100644 index 000000000..2ed702bf0 --- /dev/null +++ b/2012/endoh1/dripping-pan.txt @@ -0,0 +1,23 @@ + + + + + + + + +# # +# # +# @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # +#@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @# +##################################### ####################################### + + + + + + + + + + diff --git a/2012/endoh1/endoh1.c b/2012/endoh1/endoh1.c new file mode 100644 index 000000000..f4df52090 --- /dev/null +++ b/2012/endoh1/endoh1.c @@ -0,0 +1,23 @@ +# include// .IOCCC Fluid- # +# include //2012 _Sim!_ # +# include //|||| ,____. IOCCC- # +# define h for( x=011; 2012/* # +# */-1>x ++;)b[ x]//-' winner # +# define f(p,e) for(/* # +# */p=a; e,p10?32< x?4[/* ## +## */*r++ =w,r]= w+1,*r =r[5]= x==35, r+=9:0 ,w-I/* ## +## */:(x= w+2);; for(;; puts(o ),o=b+ 4){z(p [1]*/* ## +## */9,2) w;z(G, 3)(d*( 3-p[2] -q[2]) *P+p[4 ]*V-/* ## +## */q[4] *V)/p[ 2];h=0 ;f(p,( t=b+10 +(x=*p *I)+/* ## +## */80*( y=*p/2 ),*p+=p [4]+=p [3]/10 *!p[1]) )x=0/* ## +## */ <=x &&x<79 &&0<=y&&y<23?1[1 [*t|=8 ,t]|=4,t+=80]=1/* ## +## */, *t |=2:0; h=" '`-.|//,\\" "|\\_" "\\/\x23\n"[x/** ## +## */%80- 9?x[b] :16];;usleep( 12321) ;}return 0;}/* ## +#### #### +############################################################################### +**###########################################################################*/ diff --git a/2012/endoh1/endoh1_color.c b/2012/endoh1/endoh1_color.c new file mode 100644 index 000000000..830a38940 --- /dev/null +++ b/2012/endoh1/endoh1_color.c @@ -0,0 +1,30 @@ +# include// .IOCCC Fluid- # +# include //2012 _Sim!_ # +# include //|||| ,____. |||||| # +# define c y+=( x=ctanh( -cabs/* # +# */(4[t ]-=20) /2+9)* 3+3)*// # +# define f(p,e) for(p/* # +# */=a;e ,p (t+=12 );c 6, sprintf (t,/** ## +## */"%c" "[48%" "c5;%" "03dm" "%c",3 *9,e,c 36,e/* ## +## */?(t- b)%960 ?(15-t [11])[ "\x23" "/\\_" "\\"/* ## +## */"||" ",//|" ".-`' "]:10: 0)) y= 0020,c 01;}/* ## +## */void g( int i){7[t +=i]|= x/=2;* t+=y=p [2];/* ## +## */}int main() {for(;( x=getc (stdin ))>0;)w =10 x&& + 0<= y&& 23> y?x =16 ,g( 0),g(12), + g(+ 948 ),g (12 ),0 :0) ;h( 59) ;;; + usleep( 12321); }return 0;} /*IOCCC '12 **/ diff --git a/2012/endoh1/endoh1_deobfuscate.c b/2012/endoh1/endoh1_deobfuscate.c new file mode 100644 index 000000000..8eca18947 --- /dev/null +++ b/2012/endoh1/endoh1_deobfuscate.c @@ -0,0 +1,31 @@ +#include // .IOCCC Fluid- # +#include //2012 _Sim!_ # +#include //|||| ,____. IOCCC- # +double complex a[97687], *p, *q, *r = a, w = 0, d; +int x , y; +char b [6856] = "\x1b[2J" "\x1b" "[1;1H ", *o = b, *t; +int +main() +{ + + for (; 0 < (x = getc(stdin));) + w = x > 10 ? 32 < x ? 4[*r++ = w, r] = w + 1, *r = r[5] = x == 35, r += 9 : 0, w - I : (x = w + 2);; + for (;; puts(o), o = b + 4) { + for (p = a; p[2] = p[1] * 9, p < r; p += 5) + for (q = a; w = cabs(d = *p - *q) / 2 - 1, q < r; q += 5) + if (0 < (x = 1 - w)) + p[2] += w * w; + for (p = a; p[3] = G, p < r; p += 5) + for (q = a; w = cabs(d = *p - *q) / 2 - 1, q < r; q += 5) + if (0 < (x = 1 - w)) + p[3] += w * (d * (3 - p[2] - q[2]) * P + p[4] * V - q[4] * V) / p[2]; + for (x = 011; 2012 - 1 > x++;) + b[x] = 0; + for (p = a; (t = b + 10 + (x = *p * I) + 80 * (y = *p / 2), *p += p[4] += p[3] / 10 * !p[1]), p < r; p += 5) + x = 0 <= x && x < 79 && 0 <= y && y < 23 ? 1[1[*t |= 8, t] |= 4, t += 80] = 1, *t |= 2 : 0; + for (x = 011; 2012 - 1 > x++;) + b[x] = " '`-.|//,\\" "|\\_" "\\/\x23\n"[x % 80 - 9 ? x[b] : 16];; + + usleep(12321); + } return 0; +} diff --git a/2012/endoh1/evaporation.txt b/2012/endoh1/evaporation.txt new file mode 100644 index 000000000..b2208d2f8 --- /dev/null +++ b/2012/endoh1/evaporation.txt @@ -0,0 +1,23 @@ + @ + + + + + + + + + + + + + + + + + +# # +# # +# # +# # +############################################################################### diff --git a/2012/endoh1/flat.txt b/2012/endoh1/flat.txt new file mode 100644 index 000000000..ad084da64 --- /dev/null +++ b/2012/endoh1/flat.txt @@ -0,0 +1,23 @@ + + + + + + + + +# # +# # +# # +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@# +############################################################################### + + + + + + + + + + diff --git a/2012/endoh1/fountain.txt b/2012/endoh1/fountain.txt new file mode 100644 index 000000000..887f345c8 --- /dev/null +++ b/2012/endoh1/fountain.txt @@ -0,0 +1,23 @@ + + x + x + x + x + x + x + x + x + x + x + x + x + x + x + x + x + x + x + ### x ### + ### x ### + ### x ### + ############# diff --git a/2012/endoh1/funnel.txt b/2012/endoh1/funnel.txt new file mode 100644 index 000000000..5aac57ed4 --- /dev/null +++ b/2012/endoh1/funnel.txt @@ -0,0 +1,23 @@ + # # + #xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx# + #xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx# + #xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx# + #xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx# + #xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx# + #xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx# + #xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx# + #xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx# + #xxxxxxxxxxxxxxxxxxxxxxxxxxxx# + #xxxxxxxxxxxxxxxxxxxxxxxxxx# + #xxxxxxxxxxxxxxxxxxxxxxxx# + #xxxxxxxxxxxxxxxxxxxxxx# + #xxxxxxxxxxxxxxxxxxxx# + #xxxxxxxxxxxxxxxxxx# + #xxxxxxxxxxxxxxxx# + #xxxxxxxxxxxxxx# + #xxxxxxxxxxxx# + #xxxxxxxxxx# + #xxxxxxxx# + #xxxxxx# + #xxxx# + #### diff --git a/2012/endoh1/funnel2.txt b/2012/endoh1/funnel2.txt new file mode 100644 index 000000000..2c3f54c0e --- /dev/null +++ b/2012/endoh1/funnel2.txt @@ -0,0 +1,23 @@ + ## ## + ##xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxxxx## + ##xxxxxxxxxxxxxx## + ##xxxxxxxxxxxx## + ##xxxxxxxxxx## + ##xxxxxxxx## + ##xxxxxx## + ##xxxx## + ###### diff --git a/2012/endoh1/funnel3.txt b/2012/endoh1/funnel3.txt new file mode 100644 index 000000000..0ad02845a --- /dev/null +++ b/2012/endoh1/funnel3.txt @@ -0,0 +1,24 @@ + ### ### + ###xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx### + ###xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx### + ###xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx### + ###xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx### + ###xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx### + ###xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx### + ###xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx### + ###xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx### + ###xxxxxxxxxxxxxxxxxxxxxxxxxxxx### + ###xxxxxxxxxxxxxxxxxxxxxxxxxx### + ###xxxxxxxxxxxxxxxxxxxxxxxx### + ###xxxxxxxxxxxxxxxxxxxxxx### + ###xxxxxxxxxxxxxxxxxxxx### + ###xxxxxxxxxxxxxxxxxx### + ###xxxxxxxxxxxxxxxx### + ###xxxxxxxxxxxxxx### + ###xxxxxxxxxxxx### + ###xxxxxxxxxx### + ###xxxxxxxx### + ###xxxxxx### + ###xxxx### + ######## + ######## diff --git a/2012/endoh1/glass-half-empty.txt b/2012/endoh1/glass-half-empty.txt new file mode 100644 index 000000000..a329915b0 --- /dev/null +++ b/2012/endoh1/glass-half-empty.txt @@ -0,0 +1,22 @@ + + + + ###.......................### + ###.......................### + ###.......................### + ###.......................### + ###.......................### + ###.......................### + ###.......................### + ###.......................### + ### ### + ### ### + ### ### + ### ### + ### ### + ### ### + ### ### + ### ### + ### ### + ############################# + ############################# diff --git a/2012/endoh1/hint.html b/2012/endoh1/hint.html new file mode 100644 index 000000000..fd5ea6894 --- /dev/null +++ b/2012/endoh1/hint.html @@ -0,0 +1,211 @@ + + + + + + + Most complex ASCII fluid - Honorable mention + + +

Most complex ASCII fluid - Honorable mention

+ +

Yusuke Endoh
+mame@ruby-lang.org
+https://github.com/mame/

+ +

Judges' comments:

+ +

To build:

+ +
make endoh1
+
+ +

To run:

+ +
./endoh1 < configuration.txt
+
+ +

Try:

+ +
./endoh1 < endoh1.c
+
+./endoh1 < pour-out.txt
+
+./endoh1 < fountain.txt
+
+ +

Selected Judges Remarks:

+ +

Let’s play Jeopardy!

+ +
    +
  • A: An obfuscated program that deals with complex numbers and produces animated ASCII graphics.
  • +
  • Q: What is a Mandelbrot simulator?
  • +
+ + +

Bzzzt!

+ +

Such heavily squeezed fluid simulation (this is parsed uniquely +as fluids are not squeezable) has a few quirks that the judges were +happy to experiment with.

+ +

One configuration file was inspired by an XKCD what if? entry.

+ +

Author’s comments:

+ +

Synopsis

+ +

DO NOT FORGET “-DG=1 -DP=4 -DV=8” and make your terminal window larger +than 80 x 25.

+ +
gcc endoh1.c -DG=1 -DP=4 -DV=8 -D_BSD_SOURCE -o endoh1 -lm
+./endoh1 < endoh1.c
+./endoh1 < logo.txt
+./endoh1 < column.txt
+./endoh1 < pour-out.txt
+./endoh1 < tanada.txt
+
+ +

What it is

+ +
,___. ,.       ,.    ,.   ,___. ,.              ,.       ,.
+|/--' ||       `'    ||   |/--' `'              ||       |\_.
+|\__. || ,. ,. ,. ,__/|   |\__. ,. ,____. ,. ,. ||  ,_.  |/-'  ,_.  ,__.
+|/--' || || || || |/-\|   `--\| || |/\/\| || || || ,/-\. ||   ,/-\. |/-\.
+||    || `\_/| || |\_/|   ,__/| || |||||| `\_/| || `\_/\.`\_. `\_/' || `'
+`'    `'  `--' `' `---'   `---' `' `'`'`'  `--' `'  `-'`' `-'  `-'  `'
+
+
+ ,.,.                      ,.,.
+,/\/\. ,.       ,.    ,.  ,/\/\. ,.              ,.      ,__.
+|||#/' ||       `' ,_.||  |||#/' `',_.,__.       ||      ||\\.        ,.
+|||#\. || ,. ,. ,.,/#|||  |\//\. ,.|#||##| ,. ,. || ,.,. |\/-' ,.,. ,.|\.
+|\/--' ||,/\.|| |||#/\/|  `\#||| |||#||/\|,/\.|| ||,/'`\.|#|  ,/'`\.|\/-\.
+`\|    ||`\#||| |||#||\|  ,//\/| ||`\|||||`\#||| ||`\.,/\/\|,.`\.,/'`\| `'
+ `'    `' `-'`' `'`-'`-'  `-'`-' `' `'`'`' `-'`' `' `'`--'`'`' `'`'  `'
+
+
+,_.,_. ,.       ,.    ,.  ,_.,_. ,.              ,.      ,.
+|#||#| ||       `'    ||  |#||#| `'              ||      ||,_.
+||\/#| ||,.  ,. ,.,_.,/|  |\||#| ,.,_.,__.,.  ,. || ,.,. |||#| ,.,. ,.,_.
+|||##| ||||  || |||#||#|  |#||#| |||#||##|||  || ||,/||\.||`-',/||\.|||#\.
+||`--' ||`\_.|| |||\||#|  |#||#| ||||'||\|`\_.|| ||`\||#|`\.,.`\||/'||`--'
+`'     `' |#||| `'|#||#|  |#||#| `'`' `'`' |#||| `' |||/' |||| |||| `'
+          `-'`'   `-'`-'  `-'`-'           `-'`'    `'`'  `'`' `'`'
+
+ +

This program is a fluid simulator using “Smoothed-particle hydrodynamics (SPH)” +method.

+ +

http://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics

+ +

The SPH particles represent the fluid flow. Particles have information about +the position, density, and velocity. In every simulation step, they are +changed by pressure force, viscosity force, and external force (i.e., gravity).

+ +

This program reads a text from standard input, and uses it as an initial +configuration of the particles. The character # represents “wall particle” (a +particle with fixed position), and any other non-space characters represent +free particles.

+ +

The compilation options -DG=1 -DP=4 -DV=8 represent, respectively, the factor +of gravity, pressure, and viscosity. By changing their values, you can see +different fluid behavior.

+ +

“Marching square”-like algorithm is used to render the particles.

+ +

http://en.wikipedia.org/wiki/Marching_squares

+ +

Portability

+ +

The program requires a C99 compiler; it uses complex types and one-line +comments. It also uses usleep, which may require -D_BSD_SOURCE or somewhat +to build with no warning. Under these conditions, it should be portable. +At least, recent compilers with -std=c99 -Wall -W -Wextra -pedantic says +nothing.

+ +
gcc -DG=1 -DP=4 -DV=8 -D_BSD_SOURCE -std=c99 -Wall -W -Wextra -pedantic endoh1.c
+clang -DG=1 -DP=4 -DV=8 -D_BSD_SOURCE -std=c99 -Wall -W -Wextra -pedantic endoh1.c
+
+ +

I expect it to work in any Unix-like environment. VTxxx/ANSI sequences are +used to clear screen and move cursor to home.

+ +

I’ve tested with gcc-4.6.3 and clang-3.0 on Linux (Ubuntu 12.04) +and gcc-4.5.3 and clang-3.1 on Cygwin. On Cygwin, gcc and clang complain about +a usage of I (complex’s imaginary unit), but I bet this is cygwin’s issue; +it is surely a C99 feature.

+ +

Obfuscation w/ Spoiler

+ +

First of all, the source code itself serves as an initial configuration. +Preprocessing directives (such as #include)’s # serve as walls.

+ +

This program uses double complex to represent any 2D vector. But, note that +x-axis and y-axis is swapped (real axis = y-axis, imaginary axis = x-axis). +The purpose of swapping is not only obfuscation, but also short coding: for +example, to add gravity to total force, force += G suffices, rather than +force += G*I. +(Incidentally, you can exert horizontal gravity by using, such as, -DG=I)

+ +

Every five entries of double complex a[] contain information of one particle: +position, wall-flag, density, force, and velocity, in turn.

+ +

You can use G, P, and V as a guide to find the calculation code of +gravity, pressure, and viscosity forces.

+ +

Though some assignments may look meaningless, it is actually meaningful; it +extracts “integer part of real part” from a complex value by assigning (and +casting) it to an integer-type variable.

+ +

Notes about Additional Files

+ +

“logo.txt” is a source of the logo in this remark file.

+ +

“column.txt” is a water column collapse, which is a popular demo of SPH.

+ +

“pour-out.txt” pours you a cup of tea.

+ +

“tanada.txt” simulates “Terrace farming”. (“Tanada” means a “terraced rice +fields” in Japanese.)

+ +

“clock.txt” is a “water” clock created by HAMANO Tsukasa.

+ +

Other *.txt files are due to the judges.

+ +

“endoh1_color.c” is a variant that shows the density by using terminal 256 +colors.

+ +

Acknowledgment

+ +

I would like to thank my wife @hirekoke for her teaching me the SPH method.

+ +

The judges ordered suggested creating a color version +after the judgment.

+ +

The judges and HAMANO Tsukasa (The silver medalist at this IOCCC) kindly +provided many configuration files.

+ +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2012/endoh1/hint.text b/2012/endoh1/hint.text new file mode 100644 index 000000000..fa8caae54 --- /dev/null +++ b/2012/endoh1/hint.text @@ -0,0 +1,185 @@ +# Most complex ASCII fluid - Honorable mention + +Yusuke Endoh + + + + +## Judges' comments: +### To build: + + make endoh1 + +### To run: + + ./endoh1 < configuration.txt + +### Try: + + ./endoh1 < endoh1.c + + ./endoh1 < pour-out.txt + + ./endoh1 < fountain.txt + +### Selected Judges Remarks: + +Let's play Jeopardy! + +* A: An obfuscated program that deals with complex numbers and produces animated ASCII graphics. +* Q: What is a Mandelbrot simulator? + +Bzzzt! + +Such heavily squeezed fluid simulation (this is parsed uniquely +as fluids are not squeezable) has a few quirks that the judges were +happy to experiment with. + +One configuration file was inspired by an [XKCD what if? entry](http://whatif.xkcd.com/6/). + +## Author's comments: +### Synopsis + +**DO NOT FORGET "-DG=1 -DP=4 -DV=8"** and make your terminal window larger +than 80 x 25. + + gcc endoh1.c -DG=1 -DP=4 -DV=8 -D_BSD_SOURCE -o endoh1 -lm + ./endoh1 < endoh1.c + ./endoh1 < logo.txt + ./endoh1 < column.txt + ./endoh1 < pour-out.txt + ./endoh1 < tanada.txt + + +### What it is + + ,___. ,. ,. ,. ,___. ,. ,. ,. + |/--' || `' || |/--' `' || |\_. + |\__. || ,. ,. ,. ,__/| |\__. ,. ,____. ,. ,. || ,_. |/-' ,_. ,__. + |/--' || || || || |/-\| `--\| || |/\/\| || || || ,/-\. || ,/-\. |/-\. + || || `\_/| || |\_/| ,__/| || |||||| `\_/| || `\_/\.`\_. `\_/' || `' + `' `' `--' `' `---' `---' `' `'`'`' `--' `' `-'`' `-' `-' `' + + + ,.,. ,.,. + ,/\/\. ,. ,. ,. ,/\/\. ,. ,. ,__. + |||#/' || `' ,_.|| |||#/' `',_.,__. || ||\\. ,. + |||#\. || ,. ,. ,.,/#||| |\//\. ,.|#||##| ,. ,. || ,.,. |\/-' ,.,. ,.|\. + |\/--' ||,/\.|| |||#/\/| `\#||| |||#||/\|,/\.|| ||,/'`\.|#| ,/'`\.|\/-\. + `\| ||`\#||| |||#||\| ,//\/| ||`\|||||`\#||| ||`\.,/\/\|,.`\.,/'`\| `' + `' `' `-'`' `'`-'`-' `-'`-' `' `'`'`' `-'`' `' `'`--'`'`' `'`' `' + + + ,_.,_. ,. ,. ,. ,_.,_. ,. ,. ,. + |#||#| || `' || |#||#| `' || ||,_. + ||\/#| ||,. ,. ,.,_.,/| |\||#| ,.,_.,__.,. ,. || ,.,. |||#| ,.,. ,.,_. + |||##| |||| || |||#||#| |#||#| |||#||##||| || ||,/||\.||`-',/||\.|||#\. + ||`--' ||`\_.|| |||\||#| |#||#| ||||'||\|`\_.|| ||`\||#|`\.,.`\||/'||`--' + `' `' |#||| `'|#||#| |#||#| `'`' `'`' |#||| `' |||/' |||| |||| `' + `-'`' `-'`-' `-'`-' `-'`' `'`' `'`' `'`' + + +This program is a fluid simulator using "Smoothed-particle hydrodynamics (SPH)" +method. + + + +The SPH particles represent the fluid flow. Particles have information about +the position, density, and velocity. In every simulation step, they are +changed by pressure force, viscosity force, and external force (i.e., gravity). + +This program reads a text from standard input, and uses it as an initial +configuration of the particles. The character `#` represents "wall particle" (a +particle with fixed position), and any other non-space characters represent +free particles. + +The compilation options `-DG=1 -DP=4 -DV=8` represent, respectively, the factor +of gravity, pressure, and viscosity. By changing their values, you can see +different fluid behavior. + +"Marching square"-like algorithm is used to render the particles. + + + + +### Portability + +The program requires a C99 compiler; it uses `complex` types and one-line +comments. It also uses `usleep`, which may require `-D_BSD_SOURCE` or somewhat +to build with no warning. Under these conditions, it should be portable. +At least, recent compilers with `-std=c99 -Wall -W -Wextra -pedantic` says +nothing. + + gcc -DG=1 -DP=4 -DV=8 -D_BSD_SOURCE -std=c99 -Wall -W -Wextra -pedantic endoh1.c + clang -DG=1 -DP=4 -DV=8 -D_BSD_SOURCE -std=c99 -Wall -W -Wextra -pedantic endoh1.c + +I expect it to work in any Unix-like environment. VTxxx/ANSI sequences are +used to clear screen and move cursor to home. + +I've tested with gcc-4.6.3 and clang-3.0 on Linux (Ubuntu 12.04) +and gcc-4.5.3 and clang-3.1 on Cygwin. On Cygwin, gcc and clang complain about +a usage of `I` (complex's imaginary unit), but I bet this is cygwin's issue; +it is surely a C99 feature. + + +### Obfuscation w/ Spoiler + +First of all, the source code itself serves as an initial configuration. +Preprocessing directives (such as `#include`)'s `#` serve as walls. + +This program uses `double complex` to represent any 2D vector. But, note that +x-axis and y-axis is swapped (real axis = y-axis, imaginary axis = x-axis). +The purpose of swapping is not only obfuscation, but also short coding: for +example, to add gravity to total force, `force += G` suffices, rather than +`force += G*I`. +(Incidentally, you can exert horizontal gravity by using, such as, `-DG=I`) + +Every five entries of `double complex a[]` contain information of one particle: +position, wall-flag, density, force, and velocity, in turn. + +You can use `G`, `P`, and `V` as a guide to find the calculation code of +gravity, pressure, and viscosity forces. + +Though some assignments may look meaningless, it is actually meaningful; it +extracts "integer part of real part" from a complex value by assigning (and +casting) it to an integer-type variable. + + +### Notes about Additional Files + +"logo.txt" is a source of the logo in this remark file. + +"column.txt" is a water column collapse, which is a popular demo of SPH. + +"pour-out.txt" pours you a cup of tea. + +"tanada.txt" simulates "Terrace farming". ("Tanada" means a "terraced rice +fields" in Japanese.) + +"clock.txt" is a "water" clock created by HAMANO Tsukasa. + +Other \*.txt files are due to the judges. + + +"endoh1\_color.c" is a variant that shows the density by using terminal 256 +colors. + + +### Acknowledgment + +I would like to thank my wife @hirekoke for her teaching me the SPH method. + +The judges ordered suggested creating a color version +after the judgment. + +The judges and HAMANO Tsukasa (The silver medalist at this IOCCC) kindly +provided many configuration files. + +-------------------------------------------------------------------------------- + diff --git a/2012/endoh1/leidenfrost.txt b/2012/endoh1/leidenfrost.txt new file mode 100644 index 000000000..c0a365e23 --- /dev/null +++ b/2012/endoh1/leidenfrost.txt @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + +# # +# # +# # +# @ # +############################################################################### diff --git a/2012/endoh1/logo.txt b/2012/endoh1/logo.txt new file mode 100644 index 000000000..d52d54171 --- /dev/null +++ b/2012/endoh1/logo.txt @@ -0,0 +1,19 @@ + + @@@@ @ @ @ @@@@ @ @ @ + @ @ @ @ @ @@@ + @@@@ @ @ @ @ @@@@ @@@@ @ @@@@@ @ @ @ @@ @ @@ @@@ + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ + @ @ @@@ @ @@@@ @@@@ @ @ @ @ @@@ @ @@ @ @@ @@ @ + + + + + +# # +##### ##### + ###### ###### + ####### ####### + ######## ######## + ######### ######### + ########## ########## + ## ## diff --git a/2012/endoh1/pour-out.txt b/2012/endoh1/pour-out.txt new file mode 100644 index 000000000..7c9745a0a --- /dev/null +++ b/2012/endoh1/pour-out.txt @@ -0,0 +1,19 @@ + + ### . . . . . . . . . . . ### + ###.......................### + ### . . . . . . . . . . . ### + ###.......................### + ### . . . . . . . . . . . ### + ###.......................### + ### . . . . . . . . . . . ### + ###.......................### + ### . . . . . . . . . . . ### + ###.......................### + ### . . . . . . . . . . . ### + ###.......................## + ### . . . . . . . . . . . ## + ###....................... ### + ################################# ## ## + ############################### ## ## + ## ## + ########### diff --git a/2012/endoh1/tanada.txt b/2012/endoh1/tanada.txt new file mode 100644 index 000000000..62b08f248 --- /dev/null +++ b/2012/endoh1/tanada.txt @@ -0,0 +1,19 @@ + + + ## + ##. . . . . . . . + ##.................. + ##. . . . . . . . . . .. + ##....................... + ##. . . . . . . . . . . .. + ##........................## + ##. . . . . . . . . . . ..## + ############################ ## + ## ## + ############ ## + ## ## + ############ ## + ## ## + ############ ## + ## ## + ############ diff --git a/2012/endoh2/Makefile b/2012/endoh2/Makefile new file mode 100644 index 000000000..0ceb303fe --- /dev/null +++ b/2012/endoh2/Makefile @@ -0,0 +1,351 @@ +#!/usr/bin/env make +# +# 2012 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall -W +CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${LIBS} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= endoh2 +DATA= + +ALT_C= pi.c 314.c 3141.c 31415.c 314159.c 3141592.c \ + 31415926.c 314159265.c 3141592653.c 31415926535.c \ + e.c 271.c 2718.c 27182.c 271828.c 2718281.c \ + 27182818.c 271828182.c 2718281828.c 27182818284.c + +ALT_ENTRY= pi 314 3141 31415 314159 \ + 3141592 31415926 314159265 3141592653 31415926535 \ + e 271 2718 27182 271828 \ + 2718281 27182818 271828182 2718281828 27182818284 + +ALT_OBJ= pi.o 314.o 3141.o 31415.o 314159.o 3141592.o \ + 31415926.o 314159265.o 3141592653.o 31415926535.o \ + e.o 271.o 2718.o 27182.o 271828.o 2718281.o \ + 27182818.o 271828182.o 2718281828.o 27182818284.o + +ALT_ENTRY= pi 314 3141 31415 314159 3141592 \ + 31415926 314159265 3141592653 31415926535 \ + e 271 2718 27182 271828 2718281 \ + 27182818 271828182 2718281828 27182818284 + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ + +pi.c: ${ENTRY} + ./$< > $@ + +pi: pi.c + ${CC} ${CFLAGS} $< -o $@ + +314.c: pi + ./$< > $@ + +314: 314.c + ${CC} ${CFLAGS} $< -o $@ + +3141.c: 314 + ./$< > $@ + +3141: 3141.c + ${CC} ${CFLAGS} $< -o $@ + +31415.c: 3141 + ./$< > $@ + +31415: 31415.c + ${CC} ${CFLAGS} $< -o $@ + +314159.c: 31415 + ./$< > $@ + +314159: 314159.c + ${CC} ${CFLAGS} $< -o $@ + +3141592.c: 314159 + ./$< > $@ + +3141592: 3141592.c + ${CC} ${CFLAGS} $< -o $@ + +31415926.c: 3141592 + ./$< > $@ + +31415926: 31415926.c + ${CC} ${CFLAGS} $< -o $@ + +314159265.c: 31415926 + ./$< > $@ + +314159265: 314159265.c + ${CC} ${CFLAGS} $< -o $@ + +3141592653.c: 314159265 + ./$< > $@ + +3141592653: 3141592653.c + ${CC} ${CFLAGS} $< -o $@ + +31415926535.c: 3141592653 + ./$< > $@ + +31415926535: 31415926535.c + ${CC} ${CFLAGS} $< -o $@ + +# you get the transcendental idea ... :-) + +e.c: ${ENTRY} + ./$< e > $@ + +e: e.c + ${CC} ${CFLAGS} $< -o $@ + +271.c: e + ./$< > $@ + +271: 271.c + ${CC} ${CFLAGS} $< -o $@ + +2718.c: 271 + ./$< > $@ + +2718: 2718.c + ${CC} ${CFLAGS} $< -o $@ + +27182.c: 2718 + ./$< > $@ + +27182: 27182.c + ${CC} ${CFLAGS} $< -o $@ + +271828.c: 27182 + ./$< > $@ + +271828: 271828.c + ${CC} ${CFLAGS} $< -o $@ + +2718281.c: 271828 + ./$< > $@ + +2718281: 2718281.c + ${CC} ${CFLAGS} $< -o $@ + +27182818.c: 2718281 + ./$< > $@ + +27182818: 27182818.c + ${CC} ${CFLAGS} $< -o $@ + +271828182.c: 27182818 + ./$< > $@ + +271828182: 271828182.c + ${CC} ${CFLAGS} $< -o $@ + +2718281828.c: 271828182 + ./$< > $@ + +2718281828: 2718281828.c + ${CC} ${CFLAGS} $< -o $@ + +27182818284.c: 2718281828 + ./$< > $@ + +27182818284: 27182818284.c + ${CC} ${CFLAGS} $< -o $@ + +271828182845.c: 27182818284 + ./$< > $@ + +271828182845: 271828182845.c + ${CC} ${CFLAGS} $< -o $@ + +# etc. ... :-) + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} ${ALT_C} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you're joking Mr. Feynman!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'waste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall be disallowed from not being unable to partly misunderstand this partocular final echo. + +# Understand the history of "I Am the Walrus" and +# and in particular John Lennon's remarks on that +# song and you might be confused about these next +# rules in a different way. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v3; \ + else \ + echo "You are not expected to understand this"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 1c2c85c7a02c55d1add91967eca491d53c101dc1 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "Understand different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 21701 --level 23209 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "These aren't the droids you're looking for Mr. Spock!"; \ + fi + @${TRUE} diff --git a/2012/endoh2/endoh2.c b/2012/endoh2/endoh2.c new file mode 100644 index 000000000..575670a1a --- /dev/null +++ b/2012/endoh2/endoh2.c @@ -0,0 +1,25 @@ +#include /******** SpigotQuine -- usage: ./spigot [pi or e] ********/ +char*s="G1%%xJ{;Q7wunmuGuu%%uu#include/*Spigot_Quine*/#include/*_IOCCC2012_*/int*e," "i,j,k,n" ";char*q" ",*a,*d,*z,*p=%s%c;" +"int" "%cmain(){a=calloc(" "1,1e4+n*2);;for(*" +"a=\0@3,z=d=a+n+1,j=n*8-7;" "k=0,j-1" ";j-=2){" "for(a[1]+=2;--z-a;" +"*z=k%%10,k/=10)k+=j/2**z;;for(;k=k%%j*" "10+*++z,z>(i/11+k/" "4%%5*3))&1?k" "/3*!j&&p?" +"j=34:(j=" "i+1,*z++):32;k/3*" "j--&&p?d[z--,j]=3" "4:0;}}int" +"*y,n=%d;/*..~",*f="nnLa5~z23~|22t$q(s82r&q(s82q'q(s8;q(s8;q(s8:" "r(s8:r(s8:" +"q)s89r)sLr#t+" "sLx,uJw-yGu/wnnnU",*g="nnLa1 &&*v[1]=='e'?g:f,*q=b,*t=r;;sprintf(a,"%s%s%s",s,r==g?s+281: +s+168,s+386); sprintf(b,a+22,a,34,32,24);for(sprintf(a,"%.33s/*%.28s*/%.3" +"3s/*%.28s*/%" ".33s\"%s*/",b,b+66,b+33,b+76,b+66,b+99);*r;r++){;for(m=0;m++ +<(*r-34)%77;*q++=*r>111?32:*p++)(q-b)%66<1?*q++=10:0;*r-110&&*r-126&&r-t<(t-g? +62:45)?*q++=34,((q-b)%66<1?*q++=10,*q++=34:0):0;}*q=0;puts(b+1);}/*IOCCC2012*/ diff --git a/2012/endoh2/find-font-table.rb b/2012/endoh2/find-font-table.rb new file mode 100644 index 000000000..d3b529048 --- /dev/null +++ b/2012/endoh2/find-font-table.rb @@ -0,0 +1,95 @@ +# This script finds table for 3x5 decimal fonts. + +fonts = < ceil((35+f*x0) / e) <= -t <= floor((126+f*x0) / e) + # -> ceil((35+f*x0) / e) * d - f*y0 <= y <= floor((126+f*x0) / e) * d - f*y0 + ymin = ( 35+f*x0+e+1) / e * d - f*y0 + ymax = (126+f*x0 ) / e * d - f*y0 + + return if ymax < ymin || ymax < 33 || ymin > 126 # No solution. + + ((ymax + f*y0) / -d).upto((ymin + f*y0) / -d) do |t| + x = -f * x0 - e * t + y = -f * y0 - d * t + return [x, y] if printable?(x) && printable?(y) # Solution found. + end + + return # No solution. +end + +# Given integers f0, f1, ..., f9, by brute force, finds (u, v, d) s.t. there is +# some xi and yi: +# x0 * u - y0 * v = f0 + d +# x1 * u - y1 * v = f1 + d +# ... +# x9 * u - y9 * v = f9 + d +# where both xi and yi are printable. +def find_params(fonts) + 1.upto(9) do |d| + 2.times do + 1.upto(999) do |u| + 1.upto(999) do |v| + if fonts.all? {|f| solve_identity(u, v, f + d) } + table = fonts.map do |f| + solve_identity(u, v, f + d).reverse + end.transpose.flatten.map {|c| c.chr }.join + return u, v, d, table + end + end + end + d = -d + end + end + puts "Not found." + exit +end + + +puts "Searching..." + +u, v, d, s = find_params(fonts) + +puts "Found." +puts +puts "Let s = %p." % s +puts "You can get the font data of dicimal character 'n' (0--9):" +puts " %d * s[n+10] - %d * s[n] - %d" % [u, v, d] diff --git a/2012/endoh2/hint.html b/2012/endoh2/hint.html new file mode 100644 index 000000000..f1475acee --- /dev/null +++ b/2012/endoh2/hint.html @@ -0,0 +1,174 @@ + + + + + + + PiE in the sky award + + +

PiE in the sky award

+ +

Yusuke Endoh
+mame@ruby-lang.org
+https://github.com/mame/

+ +

Judges' comments:

+ +

To build:

+ +
make endoh2
+
+ +

To run:

+ +
./endoh2 > pi.c
+gcc -o pi pi.c
+./pi > 314.c
+...
+
+./endoh2 e > e.c  
+gcc -o e e.c
+./e > 271.c
+...
+
+ +

Try:

+ +
make pi
+make e
+make everything
+
+ +

Selected Judges Remarks:

+ +

A pi/e printing quasi-quine in ASCII art with a compressed font in it; +what else to wish for in this program? Virtual machine emulation?

+ +

Author’s comments:

+ +

Yeah, “Again”. Sorry. But I don’t feel guilty or uncomfortable.

+ +

This entry is based on ‘over-used themes’ such as self reproducing +program and pi or e computation. I know you’re tired of them.

+ +

But have you ever seen all-in-one?

+ +

What it is

+ +

This program generates a new program in the shape of the Greek letter +pi. Then, the generated program:

+ +
    +
  • computes 3 digits of pi and prints it as a ASCII-art program that:
  • +
  • computes 4 digits of pi and prints it as a ASCII-art program that:
  • +
  • computes 5 digits of pi and prints it as a ASCII-art program that:
  • +
  • computes 6 digits of pi and prints it as a ASCII-art program that:
  • +
  • etc.
  • +
+ + +

One more thing… When you give a command line option “e” to the +first program, the generated one will compute Napier’s constant +rather than pi.

+ +

Obfuscation

+ +

This program itself is in the shape of a spigot. This is derived +from analogy with “spigot algorithm” which infinitely computes the +value of a mathematical constant such as pi or e.

+ +

http://en.wikipedia.org/wiki/Spigot_algorithm

+ +

The two sets of programs, 314*.c and 271*.c, are almost the same +except its shape and constant computation part. I tailored the +common part to parse in both shapes (“3.14…” and “2.71…”), by +tweaking the computation order and adding meaningless code fragment.

+ +

On the other hand, to make it fit inside one screen (80 x 25), my +program is shortened properly, more than it looks. (As you may +know, Quine needs to make its program size doubled.) +For example, this program involves 3x5 bitmap font data of ten +characters (‘0’ – ‘9’), as just 20 bytes: “G1%xJ{;Q7wunmuGuu%uu”. +We can decode character n as 275*s[n+10] - 8*s[n] - 8. I solved the +system of Bezout’s identities to find the magic string, with the +aid of a brute force. See find-font-table.rb in detail.

+ +

http://en.wikipedia.org/wiki/B%C3%A9zout's_identity

+ +

I used many other tricks for short coding.

+ +

I’m sorry that many ASCII-art-style winning entries of IOCCCs +ignore preprocessor directives. In my program, #include is a part +of ASCII-art with comment padded.

+ +

These design requirements made my program well-obfuscated +willy-nilly.

+ +

Portability

+ +

I expect it to work in any major environment and C compiler. +To build with no warning, it requires two C99 features: string +literal more than 509 characters and omissible return in main +function. In fact, recent compilers with “-std=c99 -Wall -W +-Wextra -pedantic” would say nothing.

+ +
gcc -std=c99 -Wall -W -Wextra -pedantic spigot.c
+clang -std=c99 -Wall -W -Wextra -pedantic spigot.c
+
+ +

I’ve tested with gcc-4.6.3 and clang-3.0 on Linux (Ubuntu 12.04) +and gcc-4.5.3 and clang-3.1 on Cygwin.

+ +

Synopsis

+ +
gcc endoh2.c -o endoh2
+
+./endoh2 > pi.c
+cat pi.c
+
+gcc pi.c     -o pi     ; ./pi     > 314.c     ; cat 314.c
+gcc 314.c    -o 314    ; ./314    > 3141.c    ; cat 3141.c
+gcc 3141.c   -o 3141   ; ./3141   > 31415.c   ; cat 31415.c
+gcc 31415.c  -o 31415  ; ./31415  > 314159.c  ; cat 314159.c
+gcc 314159.c -o 314159 ; ./314159 > 3141592.c ; cat 3141592.c
+etc...
+
+./endoh2 e > e.c
+cat e.c
+
+gcc e.c      -o e      ; ./e      > 271.c     ; cat 271.c
+gcc 271.c    -o 271    ; ./271    > 2718.c    ; cat 2718.c
+gcc 2718.c   -o 2718   ; ./2718   > 27182.c   ; cat 27182.c
+gcc 27182.c  -o 27182  ; ./27182  > 271828.c  ; cat 271828.c
+gcc 271828.c -o 271828 ; ./271828 > 2718281.c ; cat 2718281.c
+etc...
+
+ +

You can do make everything for the process (with no cat).

+ +

Note: The executable may return a failure (non-zero) exit status +unless -std=c99 option is given.

+ +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2012/endoh2/hint.text b/2012/endoh2/hint.text new file mode 100644 index 000000000..4a626a8d3 --- /dev/null +++ b/2012/endoh2/hint.text @@ -0,0 +1,147 @@ +# PiE in the sky award + +Yusuke Endoh + + + + +## Judges' comments: +### To build: + + make endoh2 + +### To run: + + ./endoh2 > pi.c + gcc -o pi pi.c + ./pi > 314.c + ... + + ./endoh2 e > e.c + gcc -o e e.c + ./e > 271.c + ... + +### Try: + + make pi + make e + make everything + +### Selected Judges Remarks: + +A pi/e printing quasi-quine in ASCII art with a compressed font in it; +what else to wish for in this program? Virtual machine emulation? + +## Author's comments: +Yeah, "Again". Sorry. But I don't feel guilty or uncomfortable. + +This entry is based on 'over-used themes' such as self reproducing +program and pi or e computation. I know you're tired of them. + + +But have you ever seen **all-in-one**? + + +### What it is + +This program generates a new program in the shape of the Greek letter +`pi`. Then, the generated program: + +- computes 3 digits of pi and prints it as a ASCII-art program that: +- computes 4 digits of pi and prints it as a ASCII-art program that: +- computes 5 digits of pi and prints it as a ASCII-art program that: +- computes 6 digits of pi and prints it as a ASCII-art program that: +- etc. + +One more thing... When you give a command line option "e" to the +first program, the generated one will compute Napier's constant +rather than pi. + + +### Obfuscation + +This program itself is in the shape of a spigot. This is derived +from analogy with "spigot algorithm" which infinitely computes the +value of a mathematical constant such as `pi` or `e`. + + + +The two sets of programs, 314\*.c and 271\*.c, are almost the same +except its shape and constant computation part. I tailored the +common part to parse in both shapes ("3.14..." and "2.71..."), by +tweaking the computation order and adding meaningless code fragment. + +On the other hand, to make it fit inside one screen (80 x 25), my +program is shortened properly, more than it looks. (As you may +know, Quine needs to make its program size doubled.) +For example, this program involves 3x5 bitmap font data of ten +characters ('0' -- '9'), as just 20 bytes: "G1%xJ{;Q7wunmuGuu%uu". +We can decode character n as `275*s[n+10] - 8*s[n] - 8`. I solved the +system of Bezout's identities to find the magic string, with the +aid of a brute force. See `find-font-table.rb` in detail. + + + +I used many other tricks for short coding. + +I'm sorry that many ASCII-art-style winning entries of IOCCCs +ignore preprocessor directives. In my program, #include is a part +of ASCII-art with comment padded. + +These design requirements made my program well-obfuscated +willy-nilly. + + +### Portability + +I expect it to work in any major environment and C compiler. +To build with no warning, it requires two C99 features: string +literal more than 509 characters and omissible return in main +function. In fact, recent compilers with "-std=c99 -Wall -W +-Wextra -pedantic" would say nothing. + + gcc -std=c99 -Wall -W -Wextra -pedantic spigot.c + clang -std=c99 -Wall -W -Wextra -pedantic spigot.c + +I've tested with gcc-4.6.3 and clang-3.0 on Linux (Ubuntu 12.04) +and gcc-4.5.3 and clang-3.1 on Cygwin. + + +### Synopsis + + gcc endoh2.c -o endoh2 + + ./endoh2 > pi.c + cat pi.c + + gcc pi.c -o pi ; ./pi > 314.c ; cat 314.c + gcc 314.c -o 314 ; ./314 > 3141.c ; cat 3141.c + gcc 3141.c -o 3141 ; ./3141 > 31415.c ; cat 31415.c + gcc 31415.c -o 31415 ; ./31415 > 314159.c ; cat 314159.c + gcc 314159.c -o 314159 ; ./314159 > 3141592.c ; cat 3141592.c + etc... + + ./endoh2 e > e.c + cat e.c + + gcc e.c -o e ; ./e > 271.c ; cat 271.c + gcc 271.c -o 271 ; ./271 > 2718.c ; cat 2718.c + gcc 2718.c -o 2718 ; ./2718 > 27182.c ; cat 27182.c + gcc 27182.c -o 27182 ; ./27182 > 271828.c ; cat 271828.c + gcc 271828.c -o 271828 ; ./271828 > 2718281.c ; cat 2718281.c + etc... + +You can do `make everything` for the process (with no `cat`). + +Note: The executable may return a failure (non-zero) exit status +unless -std=c99 option is given. + +-------------------------------------------------------------------------------- + diff --git a/2012/grothe/Makefile b/2012/grothe/Makefile new file mode 100644 index 000000000..3ebe30caa --- /dev/null +++ b/2012/grothe/Makefile @@ -0,0 +1,207 @@ +#!/usr/bin/env make +# +# 2012 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -W +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${LIBS} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= grothe +DATA= cookie_piece1.dat cookie_piece2.dat cookie_piece3.dat \ + cookie_piece4.dat cookie_recipe.txt +ALT_OBJ= grothe.orig.o +ALT_ENTRY= grothe.orig + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} -DBC='break;case' $< -o $@ + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +grothe.orig: grothe.orig.c + ${CC} ${CFLAGS} -DBC='break;case' $< -o $@ + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you're joking Mr. Feynman!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'waste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall be disallowed from not being unable to partly misunderstand this partocular final echo. + +# Understand the history of "I Am the Walrus" and +# and in particular John Lennon's remarks on that +# song and you might be confused about these next +# rules in a different way. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v3; \ + else \ + echo "You are not expected to understand this"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 1c2c85c7a02c55d1add91967eca491d53c101dc1 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "Understand different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 21701 --level 23209 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "These aren't the droids you're looking for Mr. Spock!"; \ + fi + @${TRUE} diff --git a/2012/grothe/cookie_piece1.dat b/2012/grothe/cookie_piece1.dat new file mode 100644 index 000000000..5c415075b Binary files /dev/null and b/2012/grothe/cookie_piece1.dat differ diff --git a/2012/grothe/cookie_piece2.dat b/2012/grothe/cookie_piece2.dat new file mode 100644 index 000000000..e6de76b18 Binary files /dev/null and b/2012/grothe/cookie_piece2.dat differ diff --git a/2012/grothe/cookie_piece3.dat b/2012/grothe/cookie_piece3.dat new file mode 100644 index 000000000..6778a1cde Binary files /dev/null and b/2012/grothe/cookie_piece3.dat differ diff --git a/2012/grothe/cookie_piece4.dat b/2012/grothe/cookie_piece4.dat new file mode 100644 index 000000000..815dc96f2 Binary files /dev/null and b/2012/grothe/cookie_piece4.dat differ diff --git a/2012/grothe/cookie_recipe.txt b/2012/grothe/cookie_recipe.txt new file mode 100644 index 000000000..4a2a786b1 --- /dev/null +++ b/2012/grothe/cookie_recipe.txt @@ -0,0 +1,33 @@ +This is based on the Urban Legend about Neiman Marcus charging $25,000 for +their cookie recipe. No one knows the source, but the recipe does make good +cookies and a LOT of them. Recipe is in Public Domain. + +From Steve's Recipe Database http://recipes.stevex.net/ + +Title: $25,000 Cookies +Yield: 112 Servings + +Ingredients: + + 2 c Butter + 1 ts Salt + 2 c Sugar + 2 ts Baking Powder + 2 c Brown sugar + 2 ts Baking Soda + 4 Eggs + 4 oz Chocolate Chips + 2 ts Vanilla + 1 8-Oz Hershey Bar, grated + 4 c Flour + 3 c Chopped nuts + 5 c Blended Oatmeal * + + + *Blended Oatmeal: Measure and blend in a blender to a fine powder. + Cream butter and both sugars. Add eggs and vanilla. + Mix together with flour, oatmeal, salt, baking powder, and baking soda. + Add chips, candy and nuts. + Roll into balls and place two (2) inches apart on a cookie sheet. + Bake for six (6) minutes at 375 degrees. + Makes 112 cookies, but recipe can be halved. diff --git a/2012/grothe/grothe.c b/2012/grothe/grothe.c new file mode 100644 index 000000000..1d2c651fc --- /dev/null +++ b/2012/grothe/grothe.c @@ -0,0 +1,27 @@ +#include +#include +#include + +int u,z,q[0400],O[0x101],o[0401],I[257],w[258][0403],W[0x100],Z[0x103],c[0403],k +,i,j,n,l,p,m;const char*J[0416],*M[0400];FILE*K[280],*s[0x102];void f(char*n,int +a){char*e=n;while(*e!='\0'){if(tolower((int)*e)!=*e)fputc(040,stderr);fputc((*e) +-a,stderr);e+=1;}(void)fputc('\n',stderr);}int y(int a,int b);int t(int i,int j) +{int k=i&j,l=i^j,n,m=1;for(n=1;k>=n;n<<=1)if(k&n)m=y(m,1<1 +?y(m,1<>i;++i)for(j=0x0;b>>j;j++)if(((a>>i)&1)&&((b>>j)&1))n^=t(i,j);return w[a][b]=w[ +b][a]=n;}void a(void){for(i=0;i=toupper('0'))&&(T[k][l] +<=tolower('9'));l++){p=p*10+(T[k][l]-'0');if(p>=256)X(1,0);}if(T[k][l]=='-'){for +(m=0;m=256)X(4,0); O[z]=p;M[z]=T[k]+l+1;s[z]= +fopen(M[z],"w");if(!s[z])X(5,0);z++;}else X(6,0);}if(!(u!=0))X(7,0);if(!(z!= 0)) +X(8,0);for(i=0;i +#include +#include + +static const int x[010][8]={{01,02,04,0x8,020,32,0x40,128,},{02,03,0x8,12,32,48, +128,192,},{04,0x8,06,11,64,128,96,176,},{0x8,12,11,13,128,192,176,208,},{020,32, +64,128,24,44,75,141,},{32,48,128,192,44,52,141,198,},{64,128,96,0260,75,141,103, +185,},{0200,192,176,208,0x8D,0306,0271,0xDE,},};static int u,z,q[0400],O[0x101], +o[0401],I[257],w[258][0403],W[0x100],Z[0x103],c[0403],k,i,j,n,l,p,m;static const +char*J[0416],*M[0400];static FILE *K[280],*s[0x102];static void f(char *n,int a) +{char *e=n;while(*e!='\0'){if(tolower((int)*e)!=*e)(void)fputc(040,stderr);fputc +((*e)-a,stderr);e+=1;}(void)fputc('\n',stderr);}static int y(int a,int b){int n= +0,i=0x0,j;for(;a>>i;++i)for(j=0x0;b>>j;j++)if(((a>>i)&1)&&((b>>j)&1))n^=x[i][j]; +return n;}static void a(void){for(i=0;i= +toupper('0'))&&(T[k][l]<=tolower('9'));l++){p=p*10+(T[k][l]-'0');if(p>=256)X(1,0 +);}if(T[k][l]=='-'){for(m=0;m=256)X(4,0);O[z] +=p;M[z]=T[k]+l+1;s[z]=fopen(M[z],"w");if(!s[z])X(5,0);z++;}else X(6,0);}if(!(u!= +0))X(7,0);if(!(z!=0))X(8,0);for(i=0;i + + + + + + Most conspiratorial + + +

Most conspiratorial

+ +

Aaron Grothe
+2205 South 51st Street
+Omaha, NE 68106
+US
+ajgrothe@yahoo.com

+ +

David Madore
+http://www.madore.org/~david/

+ +

Judges' comments:

+ +

To build:

+ +
make grothe
+
+ +

To run:

+ +
# To create a shared secret shared among M people with N+1 needed to reconstruct
+./grothe -secret 1-/dev/urandom 2-/dev/urandom ... N-/dev/urandom \
+1+shared1 2+shared2 ... M+sharedM
+
+# To reconstruct the original (an arbitrary combination of N+1 or
+# more shared files with their proper numbers)
+./grothe I-sharedI J-sharedJ K-sharedK ... +reconstructed
+
+ +

Try:

+ +
./grothe -grothe.c 1+grothe.c.1 2+grothe.c.2
+
+./grothe -cookie_recipe.txt 1-/dev/urandom 2-/dev/urandom \
+1+cookie_piece1.dat 2+cookie_piece2.dat 3+cookie_piece3.dat 4+cookie_piece4.dat
+
+./grothe 1-cookie_piece1.dat 2-cookie_piece2.dat 4-cookie_piece4.dat
++cookie_recipe_restore.txt
+
+ +

Selected Judges Remarks:

+ +

Also known as Best abuse of the judging process.

+ +

The IOCCC 2012 submission page didn’t enforce the 2048 meaningful +character limit. This entry, as submitted, weighed in at 2222 chars +but was, luckily for it, extremely easy to bring down below the +limit. There were a number of strings that when concatenated allowed +the program to slide under the limit.

+ +

It was clear to the judges that the extra size was an entry +beautification step. Had it not, this entry would have been +rejected in round 0.

+ +

The judges also took some liberty obfuscating this entry a litte more.

+ +

How does this entry work? The only place multiplication is used is +to perform the atoi conversion.

+ +

Author’s comments:

+ +

Description

+ +

This program implements a version of Shamir’s Secret Sharing. Shamir’s Secret +Sharing allows you to encrypt a file into N parts where it will take M parts to +recreate the original file. E.g. you can split the secret recipe for Crystal Pepsi +into 3 parts and require two of them be available to extract the original recipe.

+ +

Actually surprisingly useful for an IOCCC entry :-)

+ +

Usage

+ +

To share a secret

+ +

E.g.

+ +

file to be shared - cookie_recipe.txt +number of pieces - 2 + file to be shared +total number of pieces created by program 4 +pieces needed to reassemble recipe 3 or greater

+ +

example usage

+ +

# to share secret into 4 pieces of which at least 3 will be needed to get back the recipe

+ +
./grothe \
+    -cookie_recipe.txt 
+    1-/dev/urandom 2-/dev/urandom 
+    1+cookie_piece1.dat 2+cookie_piece2.dat 3+cookie_piece3.dat 4+cookie_piece4.dat
+
+ +

# put recipe back together using 1, 2 and 4th piece

+ +
./grothe \
+    1-cookie_piece1.dat 2-cookie_piece2.dat 4-cookie_piece4.dat
+    +cookie_recipe_restore.txt
+
+ +

Limitations

+ +
    +
  • program is limited to 256 input and output files and will slow down dramatically when you get past 20-50 inputs and outputs
  • +
+ + +

Obfuscations

+ +
    +
  • nothing is done consistently throughout the program E.g i+=1, i=i+1, i++ and ++i are all used in the program. The mark of true code buggery. - “A foolish consistency is the hobgoblin of little minds” - Ralph Waldo Emerson
  • +
  • uses the most powerful obfuscation of all “Math”. “Any sufficiently advanced cryptography is indistinguasble from magic” - Apologies to Arthur C. Clarke
  • +
  • shadows variables by using brackets in main program to create local copies of variables that are the same as global scope variables. -Wshadow should probably be a part of -Wall in gcc
  • +
  • uses array_index[array_name] instead of array_name[array_index] in several places. Still don’t know why C continues to allow this +( error strings are encoded with offsets that are also used to select them in the case statement. All strings are located in one function for easy localization
  • +
  • liberal use of octal numbers, hexadecimal numbers and regular decimal numbers throughout program
  • +
  • variables and function names are semi-random and upper and lower case characters are used
  • +
  • use of #defines from stdio.h, stdlib.h for values _STDIO_H and EXIT_SUCCESS used to represent 1 and 0 respectively in the program
  • +
  • arrays only need to be 256x256 most are set to greater values than they need to be so trying to figure it out can be a bit tough
  • +
+ + +

References

+ + + + +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2012/grothe/hint.text b/2012/grothe/hint.text new file mode 100644 index 000000000..cc9e9f931 --- /dev/null +++ b/2012/grothe/hint.text @@ -0,0 +1,123 @@ +# Most conspiratorial + +Aaron Grothe +2205 South 51st Street +Omaha, NE 68106 +US + + +David Madore + + + +## Judges' comments: +### To build: + + make grothe + +### To run: + + # To create a shared secret shared among M people with N+1 needed to reconstruct + ./grothe -secret 1-/dev/urandom 2-/dev/urandom ... N-/dev/urandom \ + 1+shared1 2+shared2 ... M+sharedM + + # To reconstruct the original (an arbitrary combination of N+1 or + # more shared files with their proper numbers) + ./grothe I-sharedI J-sharedJ K-sharedK ... +reconstructed + +### Try: + + ./grothe -grothe.c 1+grothe.c.1 2+grothe.c.2 + + ./grothe -cookie_recipe.txt 1-/dev/urandom 2-/dev/urandom \ + 1+cookie_piece1.dat 2+cookie_piece2.dat 3+cookie_piece3.dat 4+cookie_piece4.dat + + ./grothe 1-cookie_piece1.dat 2-cookie_piece2.dat 4-cookie_piece4.dat + +cookie_recipe_restore.txt + +### Selected Judges Remarks: + +Also known as Best abuse of the judging process. + +The IOCCC 2012 submission page didn't enforce the 2048 meaningful +character limit. This entry, as submitted, weighed in at 2222 chars +but was, luckily for it, extremely easy to bring down below the +limit. There were a number of strings that when concatenated allowed +the program to slide under the limit. + +It was clear to the judges that the extra size was an entry +beautification step. Had it not, this entry would have been +rejected in round 0. + +The judges also took some liberty obfuscating this entry a litte more. + +How does this entry work? The only place multiplication is used is +to perform the atoi conversion. + + +## Author's comments: +**Description** + +This program implements a version of Shamir's Secret Sharing. Shamir's Secret +Sharing allows you to encrypt a file into N parts where it will take M parts to +recreate the original file. E.g. you can split the secret recipe for Crystal Pepsi +into 3 parts and require two of them be available to extract the original recipe. + +Actually surprisingly useful for an IOCCC entry :-) + +**Usage** + +To share a secret + +E.g. + +file to be shared - cookie\_recipe.txt +number of pieces - 2 + file to be shared +total number of pieces created by program 4 +pieces needed to reassemble recipe 3 or greater + +**example usage** + +\# to share secret into 4 pieces of which at least 3 will be needed to get back the recipe + + ./grothe \ + -cookie_recipe.txt + 1-/dev/urandom 2-/dev/urandom + 1+cookie_piece1.dat 2+cookie_piece2.dat 3+cookie_piece3.dat 4+cookie_piece4.dat + +\# put recipe back together using 1, 2 and 4th piece + + ./grothe \ + 1-cookie_piece1.dat 2-cookie_piece2.dat 4-cookie_piece4.dat + +cookie_recipe_restore.txt + +**Limitations** + +* program is limited to 256 input and output files and will slow down dramatically when you get past 20-50 inputs and outputs + +**Obfuscations** + +* nothing is done consistently throughout the program E.g i+=1, i=i+1, i++ and ++i are all used in the program. The mark of true code buggery. - "A foolish consistency is the hobgoblin of little minds" - Ralph Waldo Emerson +* uses the most powerful obfuscation of all "Math". "Any sufficiently advanced cryptography is indistinguasble from magic" - Apologies to Arthur C. Clarke +* shadows variables by using brackets in main program to create local copies of variables that are the same as global scope variables. -Wshadow should probably be a part of -Wall in gcc +* uses array\_index[array\_name] instead of array\_name[array\_index] in several places. Still don't know why C continues to allow this +( error strings are encoded with offsets that are also used to select them in the case statement. All strings are located in one function for easy localization +* liberal use of octal numbers, hexadecimal numbers and regular decimal numbers throughout program +* variables and function names are semi-random and upper and lower case characters are used +* use of #defines from stdio.h, stdlib.h for values \_STDIO\_H and EXIT\_SUCCESS used to represent 1 and 0 respectively in the program +* arrays only need to be 256x256 most are set to greater values than they need to be so trying to figure it out can be a bit tough + +**References** + +* Shamir's Secret Sharing - http://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing +* David Madore's implementation of Shamir's Secret Sharing - http://www.madore.org/~david/programs/programs-1.36.html +* Steve's Recipe Database - source for the $25k Cookie Recipe - http://recipes.stevex.net/ + +-------------------------------------------------------------------------------- + diff --git a/2012/guidelines.txt b/2012/guidelines.txt new file mode 100644 index 000000000..74a028466 --- /dev/null +++ b/2012/guidelines.txt @@ -0,0 +1,695 @@ +21st International Obfuscated C Code Contest Official Guidelines, Hints and Comments + +Copyright (C) 2006-2012 Leonid A. Broukhis, Simon Cooper, Landon Curt Noll. + +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in +writing from the contest judges. + + +This guideline file is version 2012-08-15. + + +ABOUT THIS FILE: + + This file contains guidelines intended to help people who wish to + submit entries to the International Obfuscated C Code Contest (IOCCC + for short). + + This is not the IOCCC rules, though it does contain comments about + them. The guidelines should be viewed as hints and suggestions. + Entries that violate the guidelines but remain within the rules are + allowed. Even so, you are safer if you remain within the guidelines. + + You should read the current IOCCC rules, prior to submitting entries. + The rules are typically sent out with these guidelines. + +| We recommend that you follow the twitter handle: +| +| @IOCCC +| +| to learn about IOCCC news, important IOCCC related alerts, IOCCC +| reminders, and changes to the rules and these guidelines. While we +| try to post use news at: +| +| http://www.ioccc.org/index.html#news +| +| such postings may be delayed or obscured by slow to respond mirrors. +| +| Hint to non-twitter users. You do not have to be a twitter user +| to follow the postings of the @IOCCC handle. Simple visit the URL: +| +| https://twitter.com/ioccc +| +| and reload that page every once in a while. + +| WHAT'S NEW IN 2012: + +| The contest runs from 2012-Aug-15 3:14:15 UTC to 2012-Sep-14 9:26:53 UTC. + + Only online submissions will be accepted this year. + See the following for details, + + https://submit.ioccc.org/ + +| (The above URL will be active by 2012-Aug-15) + +| Most of the changes in the rules and guidelines for this year have been +| marked with a "|" character on the left hand side. + + +HINTS AND SUGGESTIONS: + + You are encouraged to examine the winners of previous contests. See + FOR MORE INFORMATION for details on how to get previous winners. + + Keep in mind that rules change from year to year, so some winning entries + may not be valid entries this year. What was unique and novel one year + might be 'old' the next year. + + An entry is usually examined in a number of ways. We typically apply + a number of tests to an entry: + + * look at the original source + * convert ANSI tri-graphs to ASCII + * C pre-process the source ignoring '#include' lines + * C pre-process the source ignoring '#define' and '#include' lines + * run it through a C beautifier + * examine the algorithm + * compile it (with flags to enable all warnings) + * execute it + + You should consider how your entry looks in each of the above tests. + You should ask yourself if your entry remains obscure after it has been + 'cleaned up' by the C pre-processor and a C beautifier. + + Your entry need not pass all of the above tests. In certain + cases, a test is not important. Entries that compete for the + 'strangest/most creative source layout' need not do as well as + others in terms of their algorithm. On the other hand, given + two such entries, we are more inclined to pick the entry that + does something interesting when you run it. + + We try to avoid limiting creativity in our rules. As such, we leave + the contest open for creative rule interpretation. As in real life + programming, interpreting a requirements document or a customer request + is important. For this reason, we often award 'worst abuse of the + rules' to an entry that illustrates this point in an ironic way. + + We do realize that there are holes in the rules, and invite entries + to attempt to exploit them. We will award 'worst abuse of the rules' + and then plug the hole next year. Even so, we will attempt to use + the smallest plug needed, if not smaller. :-) + +| There are 17 reasons why these guidelines are obfuscated. + + Check out your program and be sure that it works. We sometimes make + the effort to debug an entry that has a slight problem, particularly + in or near the final round. On the other hand, we have seen some + of the best entries fall down because they didn't work. + + We tend to look down on a prime number printer that claims that + 16 is a prime number. If you do have a bug, you are better off + documenting it. Noting "this entry sometimes prints the 4th power + of a prime by mistake" would save the above entry. And sometimes, + a strange bug/feature can even help the entry! Of course, a correctly + working entry is best. Clever people will note that 16 might be prime +| under certain conditions. Wise people, when submitting something clever +| will fully explain such cleverness in their entry's remarks file. + + People who are considering to just use some complex mathematical + function or state machine to spell out something such as "hello, +| world!" really really, and we do mean really, do need to be more creative. + +| Ultra-obfuscated programs are, in some cases, easier to + deobfuscate than subtly-obfuscated programs. Consider using + misleading or subtle tricks layered on top of or under an +| appropriate level of obfuscation. A clean looking program with +| misleading comments and variable names might be a good start. + + Programs that use VTxxx/ANSI sequences that are NOT limited to a + specific terminal brand and that can also work in a standard xterm + are considered more portable. + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many C compilers dislike the following code, and so do we: + + #define d define + #d foo <-- don't expect this to turn into #define foo + + When declaring local or global variables, you should declare the type: + + int this_is_ok; + this_is_not; <-- don't use such implicit type declarations + +| We suggest that you compile your entry with an ISO/IEC 9899-1999 +| ("ISO C99") C compiler or at least an ANSI C compiler. + +| DO NOT assume that we will use gcc to compile your program. +| We will first try to compile your program using Clang. + +| It is much better to not use any given obscure compiler flags if +| you can help it. We want to discourage the use of obscure compiler +| flags that would make the program less portable. + +| One side effect of the above is that you cannot assume the use +| of nested functions such as: + + main() { +| void do_not_do_this() { printf("blah\n"); } +| do_not_do_this(); + } + +| This is because such nested functions often requires one to compile with +| a flag such as -fnested-functions that is not found on some compilers. + +| On 2012 July 20, the judges rescinded the encouragement of +| nested functions. Such constructions, while interesting and sometimes +| amusing, will have to wait until they required by a C standard that are +| actually implemented in commonly used C compilers. Sorry! + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using . Use instead. + + On 28 January 2007, the Judges rescinded the requirement that the + '#" in a C preprocessor directive must be the first non-whitespace character. + + The exit() function returns void. On some broken systems have exit() + return int. Your entry should assume that exit() returns a void. + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + + One line programs should be short one line programs, say around 80 + bytes long. Getting close to 160 bytes is a bit too long in our opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS version specific + (index/strchr differences are ok, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is ok only if you warn us in the 'remark' header item) + * won't compile or run under a POSIX P1003.1/P1003.2 like systems + * depend on a utility or application not normally found on most + most POSIX P1003.1/P1003.2 like systems + * abuse the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are similar to previous winners + * are identical to previous losers :-) + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + +| At least one judge prefers to maintain the use of the leap-second +| as part of the world's time standard. + +| The "how to build" make process should not be used to try and get +| around the size limit. It is one thing to make use of a several -D's +| on the compile like to help out, but it is quite another to use many +| bytes of -D's in order to try and squeeze the source under the size limit. + + You should try to restrict commands used on the build file to + POSIX-like or common Un*x-like commands. You can also compile + and use your own programs. If you do, try to build and execute + from the current directory. This restriction is not a hard and + absolute one. The intent is to ensure that the building if your + program is reasonably portable. + + Don't forget that the building of your program should be done + ***without human intervention***. So don't do: + +| prog: prog.c +| #echo this line assumes input from standard input + cat > prog.c +| ${CC} prog.c -o prog + + However, you can do something cute such as making your program + do something dumb (or cute) when build 'automatically'. However + when it is run with a human involved, do something more clever. + For example, one could use the build instructions: + +| prog: prog.c +| ${CC} prog.c -DNON_HUMAN_COMPILE -o prog + @echo "See remarks section about alternate ways to compile" + + and then include special notes in the program "remarks" for + alternate / human intervention based building. + + We want to get away from source that is simply a compact blob of + characters. To help, we give a break to source that contains + whitespace, and in certain cases ; { or } characters. While the + number of characters excluding whitespace (tab, space, newline), + and excluding any ; { or } followed immediately by either whitespace + or end of file, must be <= 2048, the total size may be less than 4096 + bytes. This means that one may use "free of charge" up to 2048 + bytes of whitespace, or ; { or } followed by either whitespace + or end of file. + + Please do not use things like gzip to get around the size limit. +| Be more creative. + +| We really dislike entries that make blatant use of including +| large data files to get around the source code size limit. + +| Did we remember to indicate that programs that blatantly use +| some complex state machine to do something simple are boring? +| We think we did. :-) + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! + + We suggest that you avoid trying for the 'smallest self-replicating' + source. The smallest, a zero byte entry, won in 1994. + + We do not like writable strings. That is, we don't want stuff like: + + char *T = "So many primes, so little time!"; + ... + T[14] = ';'; + + Please don't make use of this feature, even if your system allows it. + However, initialized char arrays are OK to write over. This is OK: + + char b[] = "Is this Ok"; + b[9] = 'K'; + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. For +| example, don't depend on a particular type or size of display. +| Don't assume the use of a particular browser. Instead assume a +| generic browser that forms to a widely used W3C standard. +| Don't assume a particular sound sub-system or video driver is installed +| in the OS. Instead, make use of a well known and widely available open +| source program (one that actually works) to display audio/visual data. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. + +| We don't like entries that use proprietary toolkits such as the M*tif, +| Xv*ew, or OpenL*ok toolkits, since not everyone has them. Use of an +| open source toolkit that is widely and freely available instead. + + You should avoid depending on a particular window manager. + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines + in the program "remarks". + +| Try to avoid entries that play silent sound segments or play the +| Happy Birthday song some people believe is copyrighted even if such +| copyrights appear to be bogus and blatant abuses of the copyright system. + + While we recognize that UN*X is not a universal operating system, the + contest does have a bias towards such systems. In an effort to expand + the scope of the contest, we phrase our bias in terms of POSIX P1003.1 + and P1003.2 standards. This will allow certain non-UN*X OS users to + submit entries. On the other hand, this is a guideline and not a rule. + We will not reject an entry based on some POSIX technicality. + + When dealing with OS and application environments, we suggest that you + be reasonable with a nod towards vanilla UN*X-like systems. POSIX will +| evolve but not as much as the contest. + + You might not be prohibited from failing to not partly misunderstand +| this particular guideline. You are not required to determine that this +| or the previous sentence is false and misleading: but it might not hurt +| to not consider to fail to try to do so. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION <== HINT!! +| * make us laugh and/or throw up :-) (humor really helps!) + +| Some types of programs can't excel (anti-tm) in some areas. Your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + You are better off explaining what your entry does in the program + "remarks" section rather than leaving it obscure for the judges + as we might miss something and/or be too tired to notice. + +| Avoid this specific individual, individual guideline, if you can. + + We freely admit that interesting, creative or humorous comments in + the program "remarks" help your chances of winning. If you had to + read so many twisted entries, you too would enjoy a good laugh or two. + We think the readers of the contest winners do as well. We do read + the program "remarks" during the judging process, so it is worth your + while to write remarkable program "remarks". + + We dislike C code with trailing control-M's (\r or \015) that results + in compilation failures. Some non-Un*x/non-Linux tools such as + MS Visual C and MS Visual C++ leave trailing control-M's on lines. + Users of such tools should strip off such control-M's before submitting + their entries. In some cases tools have a "Save As" option that will + prevent such trailing control-M's being added. + + We dislike entries that depend on non-portable libcurses features such + as halfdelay(). One should restrict libcurses to portable features + found on BSD or Linux curses. + + The rules disallow source that contains unescaped octets with values + between 128 and 255. You must use \octal or \hex escapes instead: + + /* 123456789 123456789 123456789 123456 */ + char *foo = "This string is 36 octets in length \263"; + /* This octet requires 4 octets of source ^^^^ */ + if (strlen(foo) == 36) printf("foo is 36 octets plus a final NUL\n"); +| else printf("This code should not print this message\n"); + + It is a very good idea to, in your remarks file, tell us why you + think your entry is obfuscated. This is particularly true if + your entry is has some very subtle obfuscations that we might +| otherwise overlook. <<-- Hint! + + Anyone can format their code into a dense blob. A really clever + author will try format their entry using a "normal" formatting style + such that at first glance (if you squint and don't look at the details) + the code might pass for non-obfuscated C. Deceptive comments, + and mis-leading formatting, in some cases, may be a plus. On the + other hand, a misleading code style requires more source bytes. + + If you do elect to use misleading formatting and comments, we + suggest you remark on this point in your remarks where you talk + about why you think your entry is obfuscated. On the other hand, + if you are pushing up against the size limits, you may be forced + into creating a dense blob. Such are the trade offs that obfuscators face! + +| We prefer code that can run on either a 64-bit or 32-bit +| processor. However, it is unwise to assume it will be an i386 or x86 +| architecture. + +| While programs that only run in a specific bit width are okay, if you have +| to pick a width, pick 64-bit. + +| If we are feeling ornery we might choose to compile your program +| for running on an Arduino or a PDP-11. Heck, should we ever find +| an emulator of 60-bit CDC Cyber CPU running a POSIX-like OS, we +| might just try your entry on that emulator as well| :-) + +| If your entry MUST run only in 32-bit mode on an Intel processor, add the +| following compiler flag: +| +| -arch i386 +| +| to your "how to build" make compile line. For example: +| +| prog: prog.c +| ${CC} prog.c -arch i386 -o prog + +| Be even more creative! + + +ABUSING THE RULES: + + Legal abuse of the rules is somewhat encouraged. Legal rule abuse may + involve, but is not limited to, doing things that are technically + allowed by the rules and yet do not fit the spirit of what we intended + to be submitted. + + Legal rule abuse is encouraged to help promote creativity. Rule abuse + entries, regardless of if they receive an award, result in changes to + the next year's rules and guidelines. + + Legal abuse of the rules is NOT an invitation to violate the rules. + An entry that violates the rules in the opinion of the judges, WILL be + disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK! If you + have an entry that might otherwise be interesting, you might want to + submit two versions; one that does not abuse the rules and one that + does. + + If you intend to abuse the rules, indicate so in the program + "remarks". You must try to justify why you consider your rule abuse + to be allowed under the rules. That is, you must plead your case as + to why your entry is valid. Humor and/or creativity help plead a + case. + + Abusing the web submission procedure tends to annoy us more + than amuse us. Spend your creative energy on content of your + entry rather than on the submission process itself. + + We are often asked why the contest rules and guidelines seem too + strange or contain mistakes, flaws or grammatical errors. One reason + is that we sometimes make genuine mistakes. But in many cases such + problems, flaws or areas of confusion are deliberate. Changes to + rules and guidelines in response to rule abuses, are done in a minimal + fashion. Often we will deliberately leave behind holes (or introduce +| new ones) so that future rule abuse may continue. A cleaver author +| should be able to read them and "drive a truck through the holes" in +| the rules and guidelines. + + At the risk of stating the obvious, this contest is a parody of the + software development process. The rules and guidelines are only a + small part of the overall contest. Even so, one may think the contest + rules and guideline process as a parody of the sometimes tragic + mismatch between what a customer (or marketing) wants and what +| engineering delivers. Real programmers must face obfuscated +| and sometimes conflicting specifications and requirements from marketing, +| sales, product management an even from customers themselves on a +| all to regular basis. This is one of the reasons why the rules and +| guidelines are written in obfuscated form. + + +JUDGING PROCESS: + + Entries are judged by Leonid A. Broukhis, Simon Cooper, Landon Curt Noll. + + Each entry submitted is given an id number and subdirectory. The +| entry files including, but not limited to prog.c, Makefile (that we +| form from around your "how to build" information), as well as any +| data files that you submit are all places under their own directory. +| stored and judged from this directory. + +| Any information about the authors is not read bu the judges until + the judging process is complete, and then only from entries that have + won an award. + +| Because we do not read this information for entries that do not win, +| do not know who did not win. + + The above process helps keep us biased for/against any one particular + individual. Therefore you MUST refrain from putting any information +| that reveals your identity in your entry. + +| Now some people point out that coding style might reveal the information +| about the others. However we consider this to be simply circumstantial +| and outside the scope of the above paragraph. + +| Some people, in the past, have attempted to obfuscate their identity by +| including comments of famous Internet personalities such as Peter Honeyman +| (http://www.citi.umich.edu/u/honey/). The judges are on to this +| trick and therefore consider any obfuscated source or data file +| claiming to be from Honeyman to not be form Honeyman. This of course +| creates an interesting paradox known as the "obfuscated Peter Honeyman +| paradox". Should Peter Honeyman actually submit an obfuscated entry, +| he alone is excluded from above mentioned refrain as we believe +| it just another attempt at confusion. This guideline is known +| as the "Peter Honeyman is exempt" guideline. + +| BTW: None of the entries claiming to be from Peter Honeyman have ever +| won an award. So it is theoretically possible that Peter Honeyman +| did submit an entry in the past. In the past, Peter had denied +| submitting anything to the IOCCC. Perhaps those entries were +| submitted by one of his students? + +| We seemed to have digressed here ... :-) Returning to the judging process: + +| We prefer to be kept in the dark as much as you are until the final +| awards are given. We enjoy the surprise of finding out in the end, +| who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even +| reveal the number of entries that we received. + + After the initial announcement, we attempt to send EMail to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes and typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + +| * reading the "how to build" information and forming a Makefile +| * reading prog.c, the C source +| * reviewing the "remarks" information +| * briefly looking any any supplied data files + * passing the source thru the C pre-processor + skipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + skipping over any #include files +| * compiling/building the source +| * running the program +| * Doing other things that only IOCCC judges know about :-) + + In later rounds, other actions are performed including performing + miscellaneous tests on the source and binary. + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry will often compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program +| * most deceptive C code (code with deceptive comments and source code) + * best X client (see OUR LIKES AND DISLIKES) + * best abuse of ISO/IEC 9899-1999 ("ISO C99") C or ANSI C +| * best abuse of the C preprocessor + * worst abuse of the rules + * (anything else so strange that it deserves an award) + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to 8 or 10 + winners. Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry is good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + +| More than one IOCCC judge has been known to bribe another IOCCC judge +| into voting for a winning entry by offering a bit high quality chocolate. +| This technique is highly discouraged for use by non-IOCCC judges. + + More often than not, we select a small entry (usually one line), a + strange/creative layout entry. We sometimes also select an +| entry that abuses the contest guidelines in an interesting way, +| or that stretches the content rules that while legal, is +| nevertheless goes against the intent of the rules. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entries. More often, the + 'best' is picked because it does well in a number of categories. + + +ANNOUNCEMENT OF WINNERS: + +| The judges will tweet initial announcement of who won, the name +| of their award, and a very brief description of the winning entry +| from the @IOCCC twitter handle. + + The judges will then post an initial announcement of who won, the name + of their award, and a very brief description of the winning entry + on the IOCCC web site: + + http://www.ioccc.org/whowon.html + + We will also attempt to submit a brief announcement story to /.: + + http://slashdot.org + + that, depending on the willingness of the /. editors, may be posted + to their site at the same time. + + Note that initial announcement will NOT contain source. This is because + the winning authors are given a chance to review the judges comments, + and test our Makefile. This review process typically takes a few weeks. + + Sometime after the initial announcement, and once the the review + by the winners has been completed, the winning source will be + posted to the IOCCC web site: + + http://www.ioccc.org/years.html + + NOTE: previous winners are available at that URL + + We will submit a story announcing the availability of the winners + to /. at the same time. + +| Don't ask us how many non-winning entries we receive. + + Often, winning entries are published in selected magazines from around + the world. Winners have appeared in books ("The New Hackers Dictionary") +| and on T-Shirts. More than one winner has been turned in a tattoo! + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending EMail to the following address: + +| q.2012@ioccc.org (do not submit entries to this address) + +| You must include the words 'ioccc 2012 question' in the subject of your + EMail message when sending EMail to the judges. + + Questions and comments about the contest are welcome. Comments about + confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. + + Check out the IOCCC Web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ diff --git a/2012/hamano/Makefile b/2012/hamano/Makefile new file mode 100644 index 000000000..6bdc6158f --- /dev/null +++ b/2012/hamano/Makefile @@ -0,0 +1,206 @@ +#!/usr/bin/env make +# +# 2012 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -W +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${LIBS} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= hamano +DATA= +ALT_OBJ= +ALT_ENTRY= hamano.orig + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ + +${ALT_ENTRY}: ${ALT_ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you're joking Mr. Feynman!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'waste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall be disallowed from not being unable to partly misunderstand this partocular final echo. + +# Understand the history of "I Am the Walrus" and +# and in particular John Lennon's remarks on that +# song and you might be confused about these next +# rules in a different way. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v3; \ + else \ + echo "You are not expected to understand this"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 1c2c85c7a02c55d1add91967eca491d53c101dc1 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "Understand different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 21701 --level 23209 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "These aren't the droids you're looking for Mr. Spock!"; \ + fi + @${TRUE} diff --git a/2012/hamano/hamano.c b/2012/hamano/hamano.c new file mode 100644 index 000000000..5932ff282 --- /dev/null +++ b/2012/hamano/hamano.c @@ -0,0 +1,57 @@ + #define \ + D(s)"<<"#s">>" + #define q(s)p(#s) + #define S " endobj " + #define Y "endstream"S + #include + #define o(s) b[s]=_;\ + p("%u 0 obj",s); +#define E for (c=d;c < 123;c++) + #define DANCE "trailer "D\ + (/Root 3 0 R /Size %d) "\nstartxref %u %%%%EOF\n*/" + #define p(s, ...) _+=printf(s, ##__VA_ARGS__) + #define C "<>n&3|n*2]; + for(a=0;*_=*s++; + a++,_++,*_++=32) + {*_+=*_-32?10:0; + if(a%2&&*_/16==3 + ){if(g>>8)*_=105-*_; + _++;*_++=32;*_=~-a&&a-13 + ?108:109;}}return n?n-9?nyan + (_,y,n-2):_:nyan(_+=~y&' '?sprintf + (_,17[w]):0,y,9);}N main(N c){A e[256]; + p("/*%%PDF-1.3%%*/")-2;q(#include\n); + q(#define o *_++&& *_-41\n#define);p(" endstream ");q + (main(){for(;*_++; *_-40?:putchar(o?*_:o?10:41));\n) + ;q(#define endobj return 0;}\n);q(typedef int ET;/) + ;q(*);o(1)*b=~(p(D (/Length 2 0 R)"stream\n")) + ;for(p("BT 12 818" " Td/%c 12 Tf 12 TL%%%c/" + "static char*_=\"" " \\\n",7[v],*v/2);c= + getchar(),~c;c-10? p("/%c 12 Tf(\\%o)" + "Tj",v[~-c%' '<25[ v]&&!~-(~-c/'@')?0 + :7],c):(p("()'"))) ;p("%%\";\nET ");* + b-=~_;p(Y"/*");E{a =nyan(e+sprintf(e, + 16[w]),c,6)-e;o(c- 59)p(D(/Length %d) + "stream\n%s"Y,a,e) ;}o(2)p(" %u"S,*b); + o(3)p(D(/Pages 4 0 R)S);o(4)p(D(/Count + 1/MediaBox[0 0 595 842]/Kids[5 0 R])S) + ;o(5)p(C,4,0,6e-2, 6e-2f,d,122,d);E p( + "/%c",~-c/6+~14?c: d);q(]>>/CharProcs<<) + ;E if(~-c/6+~14)p( "/%c %d 0 R",c,c+~58); + for(q(>>/Widths[), c=59;--c;p(" 10"));a=p + ("]>>>>>>/Contents 1 0 R>>"S);for(p("xref\ + 0 %d ",--d);c>" + #define q(s)p(#s) + #define S " endobj " + #define Y "endstream"S + #include + #define o(s) b[s]=_;\ + p("%u 0 obj",s); +#define E for (c=d;c < 123;c++) + #define DANCE "trailer "D\ + (/Root 3 0 R /Size %d) "\nstartxref %u %%%%EOF\n*/" + #define p(s, ...) _+=printf(s, ##__VA_ARGS__) + #define C "<>n&3|n*2]; + for(a=0;*_=*s++; + a++,_++,*_++=32) + {*_+=*_-32?10:0; + if(a%2&&*_/16==3 + ){if(g>>8)*_=105-*_; + _++;*_++=32;*_=~-a&&a-13 + ?108:109;}}return n?n-9?nyan + (_,y,n-2):_:nyan(_+=~y&' '?sprintf + (_,17[w]):0,y,9);}N main(N c){A e[256]; + p("/*%%PDF-1.3%%*/")-2;q(#include\n); + q(#define o *_++&& *_-41\n#define);p(" endstream ");q + (main(){for(;*_++; *_-40?:putchar(o?*_:o?10:41));\n) + ;q(#define endobj return 0;}\n);q(typedef int ET;/) + ;q(*);o(1)*b=~(p(D (/Length 2 0 R)"stream\n")) + ;for(p("BT 12 818" " Td/%c 12 Tf 12 TL%%%c/" + "static char*_=\"" " \\\n",7[v],*v/2);c= + getchar(),~c;c-10? p("/%c 12 Tf(\\%o)" + "Tj",v[~-c%' '<25[ v]&&!~-(~-c/'@')?0 + :7],c):(p("()'"))) ;p("%%\";\nET ");* + b-=~_;p(Y"/*");E{a =nyan(e+sprintf(e, + 16[w]),c,6)-e;o(c- 59)p(D(/Length %d) + "stream\n%s"Y,a,e) ;}o(2)p(" %u"S,*b); + o(3)p(D(/Pages 4 0 R)S);o(4)p(D(/Count + 1/MediaBox[0 0 595 842]/Kids[5 0 R])S) + ;o(5)p(C,4,0,6e-2, 6e-2f,d,122,d);E p( + "/%c",~-c/6+~14?c: d);q(]>>/CharProcs<<) + ;E if(~-c/6+~14)p( "/%c %d 0 R",c,c+~58); + for(q(>>/Widths[), c=';';--c;p(" 10"));*b + =q(]>>>>>>/Contents 1 0 R>>);for(p("xref 0 " + "%d ",--d);c + + + + + + Most elementary use of C - Silver award + + +

Most elementary use of C - Silver award

+ +

Tsukasa Hamano
+hamano@cuspy.org

+ +

Judges' comments:

+ +

To build:

+ +
make hamano
+
+ +

To run:

+ +
./hamano < textfile > output.pdf
+
+ +

Try:

+ +
./hamano < hint.text > hint.pdf
+
+# You can read output.pdf with PDF reader
+acroread hint.pdf
+# or
+evince hint.pdf
+
+# deobfuscate
+gcc -xc hint.pdf -o hint
+./hint
+
+# Of course, You can obfuscate c code
+echo 'void main(){puts("Hello World!");}' | ./hamano > hello.pdf
+gcc -xc hello.pdf -o hello2
+./hello2 | gcc -xc - -o ./hello3
+./hello3
+
+ +

Selected Judges Remarks:

+ +

This entry treads into a new territory for IOCCC - generating PDF files.

+ +

The originally submitted entry could have been thought of as a “Best abuse of +Ghostscript” winner. :-)

+ +

The source code and rendered pages are obfuscated for humans (where +is the font?), and the submitted entry created PDF files that left Ghostscript +confused.

+ +

The results can be viewed with Acrobat Reader, +evince and Apple’s Preview.

+ +

The updated version can also be viewed using Ghostscript.

+ +

There is something strange about the little flags in the output. +A search of English literature will provide a hint. The conclusion +you might draw is too elementary. :-)

+ +

So what do those flags really mean?

+ +

The [Dancing men algorithm][1] might be useful.

+ +

Don’t forget to take a look at the generated PDF, perhaps you might even want +to compile the output with a C compiler. When you run it, what does it +output?

+ +

Author’s comments:

+ +

This program obfuscate text file into PDF file with Dancing men +algorithm.

+ +

http://en.wikipedia.org/wiki/The_Adventure_of_the_Dancing_Men

+ +

Probably, the output PDF file is compliant with PDF 1.3. And also +available to compile as C code.

+ +

I’ve been tested with GCC 4.7 and Clang 3.0 on Linux, and following +PDF Reader:

+ +
    +
  • Adobe Acrobat Reader
  • +
  • Evince
  • +
  • Ghostscript
  • +
  • Xpdf
  • +
+ + +

Obfuscations

+ +

This program is obfuscated by using classical methods. +But can you find out the embedded font from fragmented glyph?

+ +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2012/hamano/hint.text b/2012/hamano/hint.text new file mode 100644 index 000000000..b359d0364 --- /dev/null +++ b/2012/hamano/hint.text @@ -0,0 +1,92 @@ +# Most elementary use of C - Silver award + +Tsukasa Hamano + + + +## Judges' comments: +### To build: + + make hamano + +### To run: + + ./hamano < textfile > output.pdf + +### Try: + + ./hamano < hint.text > hint.pdf + + # You can read output.pdf with PDF reader + acroread hint.pdf + # or + evince hint.pdf + + # deobfuscate + gcc -xc hint.pdf -o hint + ./hint + + # Of course, You can obfuscate c code + echo 'void main(){puts("Hello World!");}' | ./hamano > hello.pdf + gcc -xc hello.pdf -o hello2 + ./hello2 | gcc -xc - -o ./hello3 + ./hello3 + +### Selected Judges Remarks: + +This entry treads into a new territory for IOCCC - generating PDF files. + +The originally submitted entry could have been thought of as a "Best abuse of +Ghostscript" winner. :-) + +The source code and rendered pages are obfuscated for humans (where +is the font?), and the submitted entry created PDF files that left Ghostscript +confused. + +The results can be viewed with Acrobat Reader, +[evince](http://en.wikipedia.org/wiki/Evince) and Apple's Preview. + +The updated version can also be viewed using Ghostscript. + +There is something strange about the little flags in the output. +A search of English literature will provide a hint. The conclusion +you might draw is too elementary. :-) + +So what do those flags really mean? + +The [Dancing men algorithm][1] might be useful. + +Don't forget to take a look at the generated PDF, perhaps you might even want +to compile the output with a C compiler. When you run it, what does it +output? + + +## Author's comments: +This program obfuscate text file into PDF file with Dancing men +algorithm. + + + +Probably, the output PDF file is compliant with PDF 1.3. And also +available to compile as C code. + +I've been tested with GCC 4.7 and Clang 3.0 on Linux, and following +PDF Reader: + + * Adobe Acrobat Reader + * Evince + * Ghostscript + * Xpdf + +### Obfuscations +This program is obfuscated by using classical methods. +But can you find out the embedded font from fragmented glyph? + +-------------------------------------------------------------------------------- + diff --git a/2012/hint.css b/2012/hint.css new file mode 100644 index 000000000..cb24837ff --- /dev/null +++ b/2012/hint.css @@ -0,0 +1,77 @@ +* { + font-family: Helvetica Neue, Helvetica, Arial, sans-serif; +} +body { + max-width: 50em; + margin: 0 auto; + color: #111; +} + +pre, code { + font-family: Monaco, Courier New, monospace; + font-size: 12px; +} + +h1 { + font-size: 40px; + font-weight: bold; + letter-spacing: -1px; + margin-bottom: -5px; +} +h1 code { + font-size: 40px; +} + +h2 { + color: rgb(43,105,145); + font-weight: bold; + margin-bottom: -5px; +} +h2 code { + font-size: 22px; +} + +h3 { + /* color: rgb(43,105,145); */ + font-weight: bold; + margin-bottom: -5px; +} +h3 code { + font-size: 16px; +} + +a { + color: blue; + text-decoration: underline; +} +a:visited { + color: navy; +} +a:hover { + text-decoration: underline; +} + +pre { + border-radius: 10px; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + border-width: 1px; + border-color: rgb(16,48,0); + border-style: solid; + padding: 0.6em; + padding-left: 1em; + margin-left: 5%; + margin-right: 8%; + background-color: rgb(16,48,0); + overflow: auto; + color: rgb(75,224,0); +} + +p, li { + font-size: 14px; + line-height: 18px; +} + diff --git a/2012/hou/Makefile b/2012/hou/Makefile new file mode 100644 index 000000000..f8d58689e --- /dev/null +++ b/2012/hou/Makefile @@ -0,0 +1,203 @@ +#!/usr/bin/env make +# +# 2012 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +CWARN= +#CWARN= -Wall -W +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +CSTD= -ansi +#CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${LIBS} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= hou +DATA= ansi.txt chk.txt html.txt markdown.txt patho.pl perl-notes.txt +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you're joking Mr. Feynman!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'waste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall be disallowed from not being unable to partly misunderstand this partocular final echo. + +# Understand the history of "I Am the Walrus" and +# and in particular John Lennon's remarks on that +# song and you might be confused about these next +# rules in a different way. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v3; \ + else \ + echo "You are not expected to understand this"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 1c2c85c7a02c55d1add91967eca491d53c101dc1 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "Understand different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 21701 --level 23209 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "These aren't the droids you're looking for Mr. Spock!"; \ + fi + @${TRUE} diff --git a/2012/hou/ansi.txt b/2012/hou/ansi.txt new file mode 100644 index 000000000..68297a302 --- /dev/null +++ b/2012/hou/ansi.txt @@ -0,0 +1,7 @@ +#[ -~]*\n %s +"/*".*"*/" %s +("return"|"if"|"int"|"char"|"for"|"do"|"while"|"long"|"short"|"signed"|"typedef"|"unsigned"|"struct"|"break") %s +[a-zA-Z_][0-9a-zA-Z_]* %s +'[^']*' %s +\"([^"\\]|(\\.))*\" %s +@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  diff --git a/2012/hou/chk.txt b/2012/hou/chk.txt new file mode 100644 index 000000000..30d8867f5 --- /dev/null +++ b/2012/hou/chk.txt @@ -0,0 +1,9 @@ +"} " +"{ " +"; " +"}"\n +"{"\n +";"\n +" " +\n +" " diff --git a/2012/hou/header.htm b/2012/hou/header.htm new file mode 100644 index 000000000..c52aa1925 --- /dev/null +++ b/2012/hou/header.htm @@ -0,0 +1 @@ + diff --git a/2012/hou/hint.html b/2012/hou/hint.html new file mode 100644 index 000000000..0ec6f8a8b --- /dev/null +++ b/2012/hou/hint.html @@ -0,0 +1,132 @@ + + + + + + + Most useful obfuscation + + +

Most useful obfuscation

+ +

Qiming Hou
+hqm03ster@gmail.com
+http://www.houqiming.net

+ +

Judges' comments:

+ +

To build:

+ +
make hou
+
+ +

To run:

+ +
./hou syntax-file file-to-process
+
+ +

Try (Unix):

+ +

The results are best viewed in a 80x25 console with ANSI colors.

+ +
less hou.c
+
+./hou ansi.txt hou.c | less -r
+
+./hou chk.txt hou.c | wc
+
+./hou markdown.txt remarks.markdown > remarks.htm
+your-browser remarks.htm
+
+ +

Try (Windows):

+ +
copy header.htm hou.htm /y
+hou html.txt hou.c >> hou.htm
+start hou.htm
+
+ +

Selected Judges Remarks:

+ +

What a versatile entry! It can be used to check the size of IOCCC entries and to publish them as HTML.

+ +

For extra credit: what is the meaning of the number 2321237?

+ +

Author’s comments:

+ +

Disclaimer

+ +

The reviewer may have already noticed that the 2nd page of this program is a dense blob, which is discouraged by the contest rules. We wish to point out that a majority of state-of-art programming editors support syntax highlighting, which should be enabled when reading this entry. Anticipating that the reviewer’s preferred color setting may produce a suboptimal visual effect, a few syntax files are provided to highlight the source code under an author-provided setting, using the submitted program itself. Syntax highlighting would also visually improve the 3rd page.

+ +

The code may throw a few warnings due to formating constraints. The author did try to remove warnings under gcc and Visual Studio, though.

+ +

The author does not own the original anime series where the embedded ASCII arts come from. For comparison, original non-ASCII art depictions of the relevant characters and objects can be found by googling the embedded text messages.

+ +

Syntax files

+ +

The syntax file consists of a number of rewriting rules. Each rule consists of a regular expression, a space, a format string, and a newline. All text matching the regular expression would be replaced by the format string. In case of a conflict, rules appearing earlier would take precedence. One can refer to the original text in the format string using “%s”. Other “%” characters in the format string must be escaped with another “%”. The space character can be used in the regular expression by escaping it with [] or “”.

+ +

The following regular expression operators are supported:

+ +
() [] * + ? | ""
+
+ +

For example, one can use the following expression to match a certain declaration statement in hou.c:

+ +
"char"[ *]*[a-zA-Z_][0-9a-zA-Z_]*[ ]*((=[0-9a-zA-Z_ ]+)|(\[[0-9a-zA-Z_ ]*\]))?[ ]*(,[ *]*[a-zA-Z_][0-9a-zA-Z_]*[ ]*((=[0-9a-zA-Z_ ]+)|(\[[0-9a-zA-Z_ ]*\]))?[ ]*)*;
+
+ +

The regex engine is also algorithmically efficient. To illustrate the point, ansi.txt contains a pathological expression [2] that guarantees a hang for the competing Perl engine while matching itself. Try to compare these two engines:

+ +
./hou ansi.txt ansi.txt
+perl patho.pl < ansi.txt
+
+ +

Finally, there are a few limitations…

+ +
    +
  • The only escape sequence supported is \n and it doesn’t work in [].
  • +
  • The maximum file/rule size is a linear function of the hard-coded constant M.
  • +
  • Single-character matches at the end of file may be missed.
  • +
  • The operator | doesn’t obey precedence rules and some extra ()s may be required.
  • +
  • Incorrect syntax files are not tolerated.
  • +
  • The program relies on ASCII.
  • +
+ + +

Why obfuscated

+ +

The first layer of obfuscation comes from the challenge of embedding a large ASCII art in a dense blob. The entire art is composed using only keywords, strings and character constants. That results in a number of otherwise useless defines and quite a number of unconventionally written constants. While the preprocessor may remove the former, the later would remain regardless of beautification and preprocessing.

+ +

The second layer of obfuscation comes from the need to squeeze a reasonably powerful regex engine into the remaining area that isn’t occupied by excessive keywords and useless constants. To achieve this, the regex compiler is written using the same threaded virtual machine [1] that parses the regex. Due to compiler limitations, the generated VM code also ends up obscured by a large amount of spaghetti branches and virtual thread creations. Finally, the VM in [1] is extended to track multiple expression matches for the actual formating.

+ +

As an extra tweak, the text message actually does something useful. Remove the “Make a contract with me” catch line and the program would cease to function.

+ +

References

+ +

[1] Russ Cox, Regular Expression Matching: the Virtual Machine Approach

+ +

[2] Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby, …)

+ +
+ + + + + + + +
Creative Commons License

© Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
+This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+ + diff --git a/2012/hou/hint.text b/2012/hou/hint.text new file mode 100644 index 000000000..978f488e3 --- /dev/null +++ b/2012/hou/hint.text @@ -0,0 +1,102 @@ +# Most useful obfuscation + +Qiming Hou + + + + +## Judges' comments: + +### To build: + + make hou + +### To run: + + ./hou syntax-file file-to-process + +### Try (Unix): + +The results are best viewed in a 80x25 console with ANSI colors. + + less hou.c + + ./hou ansi.txt hou.c | less -r + + ./hou chk.txt hou.c | wc + + ./hou markdown.txt remarks.markdown > remarks.htm + your-browser remarks.htm + +### Try (Windows): + + copy header.htm hou.htm /y + hou html.txt hou.c >> hou.htm + start hou.htm + +### Selected Judges Remarks: + +What a versatile entry! It can be used to check the size of IOCCC entries *and* to publish them as HTML. + +For extra credit: what is the meaning of the number 2321237? + + +## Author's comments: + +### Disclaimer + +The reviewer may have already noticed that the 2nd page of this program is a dense blob, which is discouraged by the contest rules. We wish to point out that a majority of state-of-art programming editors support syntax highlighting, which should be enabled when reading this entry. Anticipating that the reviewer's preferred color setting may produce a suboptimal visual effect, a few syntax files are provided to highlight the source code under an author-provided setting, using the submitted program itself. Syntax highlighting would also visually improve the 3rd page. + +The code may throw a few warnings due to formating constraints. The author did try to remove warnings under gcc and Visual Studio, though. + +The author does not own the original anime series where the embedded ASCII arts come from. For comparison, original non-ASCII art depictions of the relevant characters and objects can be found by googling the embedded text messages. + +### Syntax files + +The syntax file consists of a number of rewriting rules. Each rule consists of a regular expression, a space, a format string, and a newline. All text matching the regular expression would be replaced by the format string. In case of a conflict, rules appearing earlier would take precedence. One can refer to the original text in the format string using "%s". Other "%" characters in the format string must be escaped with another "%". The space character can be used in the regular expression by escaping it with [] or "". + +The following regular expression operators are supported: + + () [] * + ? | "" + +For example, one can use the following expression to match a certain declaration statement in hou.c: + + "char"[ *]*[a-zA-Z_][0-9a-zA-Z_]*[ ]*((=[0-9a-zA-Z_ ]+)|(\[[0-9a-zA-Z_ ]*\]))?[ ]*(,[ *]*[a-zA-Z_][0-9a-zA-Z_]*[ ]*((=[0-9a-zA-Z_ ]+)|(\[[0-9a-zA-Z_ ]*\]))?[ ]*)*; + +The regex engine is also algorithmically efficient. To illustrate the point, ansi.txt contains a pathological expression [2] that guarantees a hang for the competing Perl engine while matching itself. Try to compare these two engines: + + ./hou ansi.txt ansi.txt + perl patho.pl < ansi.txt + +Finally, there are a few limitations... + + +- The only escape sequence supported is \n and it doesn't work in []. +- The maximum file/rule size is a linear function of the hard-coded constant M. +- Single-character matches at the end of file may be missed. +- The operator | doesn't obey precedence rules and some extra ()s may be required. +- Incorrect syntax files are not tolerated. +- The program relies on ASCII. + +### Why obfuscated + +The first layer of obfuscation comes from the challenge of embedding a large ASCII art in a dense blob. The entire art is composed using only keywords, strings and character constants. That results in a number of otherwise useless defines and quite a number of unconventionally written constants. While the preprocessor may remove the former, the later would remain regardless of beautification and preprocessing. + +The second layer of obfuscation comes from the need to squeeze a reasonably powerful regex engine into the remaining area that isn't occupied by excessive keywords and useless constants. To achieve this, the regex compiler is written using the same threaded virtual machine [1] that parses the regex. Due to compiler limitations, the generated VM code also ends up obscured by a large amount of spaghetti branches and virtual thread creations. Finally, the VM in [1] is extended to track multiple expression matches for the actual formating. + +As an extra tweak, the text message actually does something useful. Remove the "Make a contract with me" catch line and the program would cease to function. + +### References + +[1] [Russ Cox, Regular Expression Matching: the Virtual Machine Approach](http://swtch.com/~rsc/regexp/regexp2.html) + +[2] [Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby, ...)](http://swtch.com/~rsc/regexp/regexp1.html) + +-------------------------------------------------------------------------------- + diff --git a/2012/hou/hou.c b/2012/hou/hou.c new file mode 100644 index 000000000..dfcac0b33 --- /dev/null +++ b/2012/hou/hou.c @@ -0,0 +1,72 @@ +#include +#include + +#define Q(B,q,b) s=j[B]; e=*s; *s=0; printf(q,b,b,b); *s=e; H=s; +#define W(a,b) r[O].c=a,r[O].f=b,O++ +#define X(B) { int y=A; B; A=y; } +#define R return +#define M 1<<18 +#define If char +#define fi "%s" +#define IF for +#define FI "r" +#define long +#define do + + + + + + + + + + +typedef struct { int c,(*f)(); If*t,*h; } T; T*a,*r; int I[M],c[M]={'\0'} ,n +,N,i do,p ; char*s,*H,*z[M],f[M],o[M ],*_ [M ],**l =_ ,e ; int O=6,A='\5',x=5 +,y='\0',g=2;k(p){a[p+2].h=H; R p+2; } S(p){ a[I[n++]=a[p].c>>8].h=H; return ~ +p-'\1';}J(p){R~a[p].c>>8;}C(){ A=O; W(O+1<<8,J); } B(p){ c[g+'\1']=O;C(do);c[ +g+='\2']='\0';R 1;}h(p){ Z(p); r[O-3].c+=256; R 1; } V(){ *I=n='\1'; for(; *a +->t; do ){do a->t=a[1].h=s; IF(i=N=0; i +0&&a[do p].t-s;){a[p].h&&a[p].h-H>0&&(H=a[p].h);e=a[p].c;a[p].t=s;p=do e&&e-* +s?p+'\1':~a[p].f(p);}p<0&&(I[N++]=~p);}n=N;s++;}}U(p){X(D(p)); c[g+='\2']=O ; + return Z(p); } d(p){ C(); W(0,k); W(0,J); R 1 ; } q (p ){ C (); X (for(;*++s +!='\"'; )F(p); ); return 1; } Z(p){ r[A].c =O +1 <<'\10'; r [A ].f =do J ; + { int y=A; W(O+*"\2void"<<8 ,J ); C (); W (y*1 + "signed" [ 6 ] +1 <<'\10',S + do )do ; } return '\1';} F(p){ R*s?C(),*s==*"\\&" long&&*++do s do == + 'n'&&(*do s =*"\nextern"),W (*s ,k ),W ( (4+5)["volatile*"],J),'\1' :'\0'; +} E(p){ int V =*"\0float"; C (); X(s++;V=(*s++==*"^double");c[g+=long 2]long= +0;s-=!V;for(; *s!="]int"[0];s++){e=*s;s+=2*(s[1]==*"-for" ); s=s;for(;e<=do*s +; e++){long C(); V?W(e,J):(W(e,k),W(0,J),U(p)); } } d(p); V||(W('\0',J)); D(p +); ); return 1; } j(p){ If*r=z[a[p].c>>8],**D=l; IF(; l-_&&l [-*"\2$"]-H>=0&& +(l [-*"\1do"]!=s||l[-2]!=H||r-l[-3]<=0); )l -=3 ; l ==_ ||l [-*"\1if("] -H <= +0 * !"\0auto"?*l++=r,*l++=H,*l++=s,l:(l=D); R 0; } L(p){ W(A +*"\1for"<<8,S); +R 1+*"\0while"; } Y (p ){ z [y ]do=++do s do; s=strchr (s ,*"\nshort");W(y++ +<< *"\btypedef",j); r [x ].c =O long<<'\10'; r [x ].f =S ; do x =O do ; C ( +); return '\1'; } D (p ){ r [c [g ]].c =O <<8 ; c [g ]='\0';A=c[--do g]; -- +g; return *"\1switch"; } T b [ 12 + (M) + 321 ]={ {'\0','\0',"-"},{'*',Z } , +{ '+',L},{ '\"',q} ,{ '['long ,E } ,{ 70-94+ do '@'do ,B } ,{ ')',D } do,{124 + + ,U}, + {46,d} + ,{32 + ,Y}, + {63,h},{ + 0,F},{0,0, "Make a contract with me" + },{'('*32,S} + ,{'\0',k},{0,J, "and become a magical girl! " + },{'@'*4,J},{0,J + },{'@',0} };main + ( int B,If**j){ a + =b;if(B>=3){s=f;r= + b+'\14'; f[fread(f,1, + M,fopen(j[1],FI))]=0; + V(); W(0,J); IF(i=0; + i%s
+"/*".*"*/" %s +("return"|"if"|"int"|"char"|"for"|"do"|"while"|"long"|"short"|"signed"|"typedef"|"unsigned"|"struct"|"break") %s +[a-zA-Z_][0-9a-zA-Z_]* %s +'[^']*' %s +\"([^"\\]|(\\.))*\" %s +" "   +"<" < +">" > +\n
%s diff --git a/2012/hou/markdown.txt b/2012/hou/markdown.txt new file mode 100644 index 000000000..5382042b4 --- /dev/null +++ b/2012/hou/markdown.txt @@ -0,0 +1,10 @@ +###[^#]([ -~]+\n)+\n

%s

+##[^#]([ -~]+\n)+\n

%s

+#[^#]([ -~]+\n)+\n %s

%s

+\n"- "[ -~]*
  • %s
  • +(" "[!-~][ -~]*\n)+\n
    %s
    +([ -~]+\n)+\n

    %s

    +" "   +"<" < +">" > +"http://"[!-~]+ %s diff --git a/2012/hou/patho.pl b/2012/hou/patho.pl new file mode 100644 index 000000000..d07f6142b --- /dev/null +++ b/2012/hou/patho.pl @@ -0,0 +1,5 @@ +$a=""; +while (){ + $a=$a . $_; +} +print $a =~ m/@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/; diff --git a/2012/hou/perl-notes.txt b/2012/hou/perl-notes.txt new file mode 100644 index 000000000..ab33fa3fc --- /dev/null +++ b/2012/hou/perl-notes.txt @@ -0,0 +1,18 @@ +time perl patho.pl < ansi.txt +1 +real 1m50.970s +user 1m50.767s +sys 0m0.049s + +time ./prog ansi.txt ansi.txt +#[ -~]*\n %s +"/*".*"*/" %s +("return"|"if"|"int"|"char"|"for"|"do"|"while"|"long"|"short"|"signed"|"typedef"|"unsigned"|"struct"|"break") %s +[a-zA-Z_][0-9a-zA-Z_]* %s +'[^']*' %s +\"([^"\\]|(\\.))*\" %s +@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@? + +real 0m0.027s +user 0m0.006s +sys 0m0.002s diff --git a/2012/kang/Makefile b/2012/kang/Makefile new file mode 100644 index 000000000..a84ef9dae --- /dev/null +++ b/2012/kang/Makefile @@ -0,0 +1,206 @@ +#!/usr/bin/env make +# +# 2012 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -W +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${LIBS} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= kang +DATA= +ALT_OBJ= kang.orig.o +ALT_ENTRY= kang.orig + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +kang.orig: kang.orig.c + ${CC} ${CFLAGS} $< -o $@ + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you're joking Mr. Feynman!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'waste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall be disallowed from not being unable to partly misunderstand this partocular final echo. + +# Understand the history of "I Am the Walrus" and +# and in particular John Lennon's remarks on that +# song and you might be confused about these next +# rules in a different way. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v3; \ + else \ + echo "You are not expected to understand this"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 1c2c85c7a02c55d1add91967eca491d53c101dc1 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "Understand different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 21701 --level 23209 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "These aren't the droids you're looking for Mr. Spock!"; \ + fi + @${TRUE} diff --git a/2012/kang/hint.html b/2012/kang/hint.html new file mode 100644 index 000000000..307e17266 --- /dev/null +++ b/2012/kang/hint.html @@ -0,0 +1,201 @@ + + + + + + + Best short program + + +

    Best short program

    + +

    Seonghoon Kang
    +kang.seonghoon@mearie.org

    + +

    Judges' comments:

    + +

    To build:

    + +
    make kang
    +
    + +

    To run:

    + +
    echo "full spelling of an English cardinal numeral less than a quadrillion" | ./kang
    +
    + +

    Try:

    + +
    echo Nineteen hundred and eighty-four | ./kang
    +echo uno | ./kang
    +echo trois | ./kang
    +echo fier | ./kang
    +echo "shest'" | ./kang
    +
    + +

    Selected Judges Remarks:

    + +

    The judges were able to appreciate the Indo-European language family +relation by making this entry successfully recognize some French, +German, Italian, Russian, and Spanish numerals.

    + +

    Also worth mentioning is this entry’s ability to understand the +colloquial year numbers of the last millennium.

    + +

    We’ve added a linefeed to the print format for convenience.

    + +

    Author’s comments:

    + +

    Synopsis

    + +

    This short program reads a spelt number (e.g. forty-two) and writes a +corresponding decimal number (e.g. 42). Too long for one-liners, alas, +but it still qualifies as a short program as it has less than 0x100 bytes.

    + +

    It accepts a variety of spelt numbers:

    + +
      +
    • It correctly handles zero.
    • +
    • Hyphen does not make a difference: forty-two and forty two are same. +So does period or comma.
    • +
    • Cases do not make a difference either: TWO, Two, two are same.
    • +
    • one and a are interchangeable: one hundred and a hundred are same.
    • +
    • and is optional: one hundred twenty-three and one hundred and twenty-three +are same.
    • +
    • It supports every non-negative integer less than 1015-1. It uses +the small scale (i.e. American): billion is 109 and trillion is +1012.
    • +
    + + +

    It does not accept some spelt numbers, which I found mostly irrelevant:

    + +
      +
    • A bare hundred, thousand etc. do not work.
    • +
    • one million million does not work. Get used to one trillion!
    • +
    + + +

    Requirements

    + +

    This program is quite portable, only requiring the following:

    + +
      +
    • The signature int main(int, int) should be accepted by the linker.
    • +
    • char should be at least 8 bits long (as dictated by the standard), int +should be at least 32 bits long, long long should be at least 64 bits long.
    • +
    • Both the compiler and execution environment should use an ASCII-compatible +character set and two’s complement representation.
    • +
    • Overflow and underflow on char should wrap around, if your char is unsigned.
    • +
    • A trustworthy compiler.
    • +
    + + +

    The design of the program explicitly allows for EOF which does not equal to -1 +(it has to be negative per the standard) and both signed and unsigned char, +for example. Furthermore it is endian-independent.

    + +

    Obfuscations

    + +

    Many obfuscations used are typical for standard IOCCC entries:

    + +
      +
    • Two arguments from main function are reused as normal variables.
    • +
    • Every conditional has been replaced with ?: ternary operator and || +short-circuiting operator.
    • +
    • It has exactly three nested for loops and nothing else.
    • +
    • Common two’s complement tricks: ~-a instead of a-1, +~a?...:... instead of a!=-1?...:..., etc.
    • +
    • Comma operators (,) for multiple statements. The number of them is +minimized, however, as it is too easy to (ab)use them.
    • +
    • It lacks most parentheses around bitwise and arithmetic operators. It was +originally written for shortness so parentheses were EVIL.
    • +
    • n["string"] instead of "string"[n]. Both are fine for this program but +I went to the former just for fun.
    • +
    • Utter lack of any kind of layouts. (Oh, except for the first column.)
    • +
    + + +

    Other obfuscations are more subtle:

    + +
      +
    • The string "1+DIY/.K430x9G(kC[" is 18 bytes long, but actually 19 bytes +including the final null character are used.
    • +
    • It internally represents numbers as hexadecimal. When the input is two +hundred and three, it actually writes 0x203 as hexadecimal.
    • +
    • Some variables (notably, n) have dual uses.
    • +
    • The magic number 42 makes an appearance.
    • +
    • It has a long long numb-main-er within it!
    • +
    + + +

    But the most important obfuscation is the clever construction of lookup table. +The program uses 11 different characters required for recognizing 22 lexemes:

    + +
    zero        one         tw-         th(i)r-     fo(u)r-     fi-         six-
    +seven-      eigh-       nin-        ten         eleven      twelve
    +hundred(s)  thousand(s) million(s)  billion(s)  trillion(s)
    +a           and         -teen       -ty
    +
    + +

    So that they are internally represented as like:

    + +
    r        n        tw-      tr-      fr-      f-       s-
    +sn-      g-       nn-      tn       ln       twl
    +nr(s)    tsan(s)  lln(s)   blln(s)  trlln(s)
    +a        an       -tn      -ty
    +
    + +

    The stemmer recognizes the longest matching prefix, so every lexeme can be +recognized by at most three characters (e.g. trl instead of trlln). This is +also handy for ignoring plurals. But that would make that the table does not fit +in the printable byte—112 is already almost 27!

    + +

    The trick is to use octal; three characters (a, b and g) are interpreted +as sequences of two characters (ny, nn and nw respectively). Asides from +a smaller lookup table, it has many good consequences:

    + +
      +
    • Both a and and share the common prefix, ny, and can be discarded +altogether. Note that ny itself does not appear from other entries.
    • +
    • thousand is interpreted as tsan, which is equivalent to tfyn in the +octal scheme. As it is the only entry with tf prefix, it can be shorten by +one character.
    • +
    + + +

    Having said this important trick, other details should be relatively easier to +follow. The order of lookup table, for example, is very important, +and the biggest constant 6177 is not arbitrarily chosen.

    + +

    Acknowledgement

    + +

    [Removed for proper judgement: I’ll fill this section if I do win.]

    + +

    [Note: If you think you’ve seen this program elsewhere, you are probably right; +I’m submitting a program I have published years ago (and I have written myself, +of course). Neither rules nor guidelines disallow such a resubmission, so I guess +it’s fine.]

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2012/kang/hint.text b/2012/kang/hint.text new file mode 100644 index 000000000..ddb373410 --- /dev/null +++ b/2012/kang/hint.text @@ -0,0 +1,160 @@ +# Best short program + +Seonghoon Kang + + + +## Judges' comments: +### To build: + + make kang + +### To run: + + echo "full spelling of an English cardinal numeral less than a quadrillion" | ./kang + +### Try: + + echo Nineteen hundred and eighty-four | ./kang + echo uno | ./kang + echo trois | ./kang + echo fier | ./kang + echo "shest'" | ./kang + +### Selected Judges Remarks: + +The judges were able to appreciate the Indo-European language family +relation by making this entry successfully recognize *some* French, +German, Italian, Russian, and Spanish numerals. + +Also worth mentioning is this entry's ability to understand the +colloquial year numbers of the last millennium. + +We've added a linefeed to the print format for convenience. + + +## Author's comments: +## Synopsis + +This short program reads a spelt number (e.g. `forty-two`) and writes a +corresponding decimal number (e.g. `42`). Too long for one-liners, alas, +but it still qualifies as a *short* program as it has less than 0x100 bytes. + +It accepts a variety of spelt numbers: + +* It correctly handles `zero`. +* Hyphen does not make a difference: `forty-two` and `forty two` are same. + So does period or comma. +* Cases do not make a difference either: `TWO`, `Two`, `two` are same. +* `one` and `a` are interchangeable: `one hundred` and `a hundred` are same. +* `and` is optional: `one hundred twenty-three` and `one hundred and twenty-three` + are same. +* It supports every non-negative integer less than 1015-1. It uses + the small scale (i.e. American): `billion` is 109 and `trillion` is + 1012. + +It does *not* accept some spelt numbers, which I found mostly irrelevant: + +* A bare `hundred`, `thousand` etc. do not work. +* `one million million` does not work. Get used to `one trillion`! + +## Requirements + +This program is quite portable, only requiring the following: + +* The signature `int main(int, int)` should be accepted by the linker. +* `char` should be at least 8 bits long (as dictated by the standard), `int` + should be at least 32 bits long, `long long` should be at least 64 bits long. +* Both the compiler and execution environment should use an ASCII-compatible + character set and two's complement representation. +* Overflow and underflow on `char` should wrap around, if your `char` is unsigned. +* [A trustworthy compiler][trustingtrust]. + +[trustingtrust]: http://cm.bell-labs.com/who/ken/trust.html + +The design of the program explicitly allows for `EOF` which does not equal to -1 +(it has to be negative per the standard) and both signed and unsigned `char`, +for example. Furthermore it is endian-independent. + +## Obfuscations + +Many obfuscations used are typical for standard IOCCC entries: + +* Two arguments from `main` function are reused as normal variables. +* Every conditional has been replaced with `?:` ternary operator and `||` + short-circuiting operator. +* It has exactly three nested `for` loops and nothing else. +* Common two's complement tricks: `~-a` instead of `a-1`, + `~a?...:...` instead of `a!=-1?...:...`, etc. +* Comma operators (`,`) for multiple statements. The number of them is + minimized, however, as it is too easy to (ab)use them. +* It lacks most parentheses around bitwise and arithmetic operators. It was + originally written for shortness so parentheses were **EVIL**. +* `n["string"]` instead of `"string"[n]`. Both are fine for this program but + I went to the former just for fun. +* Utter lack of any kind of layouts. (Oh, except for the first column.) + +Other obfuscations are more subtle: + +* The string `"1+DIY/.K430x9G(kC["` is 18 bytes long, but actually 19 bytes + including the final null character are used. +* It internally represents numbers as hexadecimal. When the input is `two + hundred and three`, it actually writes 0x203 as hexadecimal. +* Some variables (notably, `n`) have dual uses. +* The magic number [42][hhgg] makes an appearance. +* It has a long long numb-`main`-er within it! + +[hhgg]: http://en.wikipedia.org/wiki/Answer_to_The_Ultimate_Question_of_Life,_the_Universe,_and_Everything + +But the most important obfuscation is the clever construction of lookup table. +The program uses 11 different characters required for recognizing 22 lexemes: + + zero one tw- th(i)r- fo(u)r- fi- six- + seven- eigh- nin- ten eleven twelve + hundred(s) thousand(s) million(s) billion(s) trillion(s) + a and -teen -ty + +So that they are internally represented as like: + + r n tw- tr- fr- f- s- + sn- g- nn- tn ln twl + nr(s) tsan(s) lln(s) blln(s) trlln(s) + a an -tn -ty + +The stemmer recognizes the longest matching prefix, so every lexeme can be +recognized by at most three characters (e.g. `trl` instead of `trlln`). This is +also handy for ignoring plurals. But that would make that the table does not fit +in the printable byte---112 is already almost 27! + +The trick is to use octal; three characters (`a`, `b` and `g`) are interpreted +as sequences of two characters (`ny`, `nn` and `nw` respectively). Asides from +a smaller lookup table, it has many good consequences: + +* Both `a` and `and` share the common prefix, `ny`, and can be discarded + altogether. Note that `ny` itself does not appear from other entries. +* `thousand` is interpreted as `tsan`, which is equivalent to `tfyn` in the + octal scheme. As it is the only entry with `tf` prefix, it can be shorten by + one character. + +Having said this important trick, other details should be relatively easier to +follow. The order of lookup table, for example, is very important, +and the biggest constant 6177 is not arbitrarily chosen. + +## Acknowledgement + +[Removed for proper judgement: I'll fill this section if I do win.] + +[Note: If you think you've seen this program elsewhere, you are probably right; +I'm submitting a program I have published years ago (and I have written myself, +of course). Neither rules nor guidelines disallow such a resubmission, so I guess +it's fine.] + + +-------------------------------------------------------------------------------- + diff --git a/2012/kang/kang.c b/2012/kang/kang.c new file mode 100644 index 000000000..e2058d486 --- /dev/null +++ b/2012/kang/kang.c @@ -0,0 +1,5 @@ +long long n,u,m,b;main(e,r)char **r;{f\ +or(;n++||(e=getchar()|32)>=0;b="ynwtsflrabg"[n%=11]-e?b:b*8+ +n)for(r=b%64-25;e<47&&b;b/=8)for(n=19;n;n["1+DIY/.K430x9\ +G(kC["]-42&255^b||(m+=n>15?n:n>9?m%u*~-u:~(int)r?n+ +!(int)r*16:n*16,b=0))u=1ll<<6177%n--*4;printf("%llx\n",m);} diff --git a/2012/kang/kang.orig.c b/2012/kang/kang.orig.c new file mode 100644 index 000000000..0cdeeff47 --- /dev/null +++ b/2012/kang/kang.orig.c @@ -0,0 +1,5 @@ +long long n,u,m,b;main(e,r){f\ +or(;n++||(e=getchar()|32)>=0;b="ynwtsflrabg"[n%=11]-e?b:b*8+ +n)for(r=b%64-25;e<47&&b;b/=8)for(n=19;n;n["1+DIY/.K430x9\ +G(kC["]-42&255^b||(m+=n>15?n:n>9?m%u*~-u:~r?n+ +!r*16:n*16,b=0))u=1ll<<6177%n--*4;printf("%llx",m);} diff --git a/2012/konno/Makefile b/2012/konno/Makefile new file mode 100644 index 000000000..0c2f8c8ac --- /dev/null +++ b/2012/konno/Makefile @@ -0,0 +1,209 @@ +#!/usr/bin/env make +# +# 2012 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -W +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${LIBS} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= konno +DATA= +ALT_OBJ= konno_deobfuscate.o konno.orig.o +ALT_ENTRY= konno_deobfuscate konno.orig + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +konno.orig: ${ENTRY}.orig.c + ${CC} ${CFLAGS} $< -o $@ + +konno_deobfuscate: konno_deobfuscate.c + ${CC} ${CFLAGS} $< -o $@ + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you're joking Mr. Feynman!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'waste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall be disallowed from not being unable to partly misunderstand this partocular final echo. + +# Understand the history of "I Am the Walrus" and +# and in particular John Lennon's remarks on that +# song and you might be confused about these next +# rules in a different way. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v3; \ + else \ + echo "You are not expected to understand this"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 1c2c85c7a02c55d1add91967eca491d53c101dc1 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "Understand different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 21701 --level 23209 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "These aren't the droids you're looking for Mr. Spock!"; \ + fi + @${TRUE} diff --git a/2012/konno/hint.html b/2012/konno/hint.html new file mode 100644 index 000000000..df3548ac8 --- /dev/null +++ b/2012/konno/hint.html @@ -0,0 +1,97 @@ + + + + + + + Best one liner + + +

    Best one liner

    + +

    Taketo Konno
    +Tokyo, Japan
    +inaniwa3@gmail.com

    + +

    Judges' comments:

    + +

    To build:

    + +
    make konno
    +
    + +

    To run:

    + +
    ./konno N
    +# where N is 0 to 255
    +
    + +

    Try:

    + +
    ./konno 30
    +
    + +

    Selected Judges Remarks:

    + +

    This entry is a good one-liner to analyze completely.

    + +

    For extra credit, what are the minimal changes to convert it to +64-bit integers so that it could print 32 lines?

    + +

    Author’s comments:

    + +

    Remarks

    + +

    This program outputs elementary cellular automaton patterns.

    + +

    Try:

    + +
    ./konno 30
    +./konno 90
    +./konno 102
    +./konno 109
    +./konno 165
    +
    + +

    There are 256 (from 0 to 255) possible rules.

    + +

    Obfuscation

    + +

    This program uses bit operations. I think

    + +
    7&O<<!o>>!o+29
    +
    + +

    is an intersting operation. This isn’t equal to

    + +
    7&O>>29
    +
    + +

    operation. What is the operation doing?

    + +

    Limitation

    + +

    This program assumes that the size of int is 4.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2012/konno/hint.text b/2012/konno/hint.text new file mode 100644 index 000000000..b30f96b58 --- /dev/null +++ b/2012/konno/hint.text @@ -0,0 +1,67 @@ +# Best one liner + +Taketo Konno +Tokyo, Japan + + + +## Judges' comments: +### To build: + + make konno + +### To run: + + ./konno N + # where N is 0 to 255 + +### Try: + + ./konno 30 + +### Selected Judges Remarks: + +This entry is a good one-liner to analyze completely. + +For extra credit, what are the minimal changes to convert it to +64-bit integers so that it could print 32 lines? + +## Author's comments: +### Remarks + +This program outputs [elementary cellular automaton](http://mathworld.wolfram.com/ElementaryCellularAutomaton.html) patterns. + +Try: + + ./konno 30 + ./konno 90 + ./konno 102 + ./konno 109 + ./konno 165 + +There are 256 (from 0 to 255) possible rules. + +### Obfuscation + +This program uses bit operations. I think + + 7&O<>!o+29 + +is an intersting operation. This isn't equal to + + 7&O>>29 + +operation. What is the operation doing? + +### Limitation + +This program assumes that the size of int is 4. + +-------------------------------------------------------------------------------- + diff --git a/2012/konno/konno.c b/2012/konno/konno.c new file mode 100644 index 000000000..9a6912964 --- /dev/null +++ b/2012/konno/konno.c @@ -0,0 +1 @@ +int _;main(O,l,o)char**l,**o;{_++>>9||main(1&(o?(int)o:O)|O*2,l,putchar(_%32?atoi(1[l])>>(7&O<>!o+29)&32<_|_==16?35:32:10)%10);} diff --git a/2012/konno/konno.orig.c b/2012/konno/konno.orig.c new file mode 100644 index 000000000..5057c43c3 --- /dev/null +++ b/2012/konno/konno.orig.c @@ -0,0 +1 @@ +int _;main(O,l,o)char**l;{_++>>9||main(1&(o?o:O)|O*2,l,putchar(_%32?atoi(1[l])>>(7&O<>!o+29)&32<_|_==16?35:32:10)%10);} diff --git a/2012/konno/konno_deobfuscate.c b/2012/konno/konno_deobfuscate.c new file mode 100644 index 000000000..2048e80aa --- /dev/null +++ b/2012/konno/konno_deobfuscate.c @@ -0,0 +1,8 @@ +int count; +main(argc, argv, env) + char **argv, **env; +{ + if (count++ < 512) { + main(1 & (env ? (int) env : argc) | argc * 2, argv, putchar(count % 32 ? atoi(1[argv]) >> (7 & argc << !env >> !env + 29) & 32 < count | count == 16 ? '#' : ' ' : '\n') % 10); + } +} diff --git a/2012/omoikane/Makefile b/2012/omoikane/Makefile new file mode 100644 index 000000000..30a4b66e6 --- /dev/null +++ b/2012/omoikane/Makefile @@ -0,0 +1,203 @@ +#!/usr/bin/env make +# +# 2012 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -W +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${LIBS} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= nyaruko +DATA= spoiler.html.gz +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you're joking Mr. Feynman!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'waste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall be disallowed from not being unable to partly misunderstand this partocular final echo. + +# Understand the history of "I Am the Walrus" and +# and in particular John Lennon's remarks on that +# song and you might be confused about these next +# rules in a different way. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v3; \ + else \ + echo "You are not expected to understand this"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 1c2c85c7a02c55d1add91967eca491d53c101dc1 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "Understand different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 21701 --level 23209 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "These aren't the droids you're looking for Mr. Spock!"; \ + fi + @${TRUE} diff --git a/2012/omoikane/hint.html b/2012/omoikane/hint.html new file mode 100644 index 000000000..2ea8b1941 --- /dev/null +++ b/2012/omoikane/hint.html @@ -0,0 +1,184 @@ + + + + + + + Most surreptitious + + +

    Most surreptitious

    + +

    Don Yang
    +omoikane@uguu.org
    +http://uguu.org/

    + +

    Judges' comments:

    + +

    To build:

    + +
    make nyaruko
    +
    + +

    To run:

    + +
    ./nyaruko [seed.txt] < original.bin > output.c
    +bash output.c > key.c
    +perl output.c > data.c
    +
    +cat key.c data.c > output.c
    +
    +gcc output.c -o output
    +./output > regenerated.bin
    +
    + +

    Try:

    + +
    echo "A quick brown fox jumps over the lazy dog" | ./nyaruko > output.c
    +perl output.c > data.c
    +gcc -o data data.c
    +./data
    +gcc -o output output.c
    +./output
    +
    + +

    Selected Judges Remarks:

    + +

    The judges have nothing to add that has not already been written +about in the spoiler.html.gz file! :-)

    + +

    Author’s comments:

    + +

    Usage

    + +

    Nyaruko is a binary to text filter. Given some input on stdin, +Nyaruko will produce C code that reproduces this input on stdout:

    + +
    ./nyaruko < original.bin > output.c
    +gcc output.c -o output
    +./output > regenerated.bin
    +
    + +

    Output is encrypted, but both key and data are included in the output. +To separate the key from the data, run these commands:

    + +
    bash output.c > key.c
    +perl output.c > data.c
    +
    + +

    The key-less data.c still compiles, but produces a different message +on stdout instead of the original input. This message is a hint to +why the code is formatted the way it is.

    + +

    To combine the key and data, concatenate them together in either +order:

    + +
    cat key.c data.c > output.c
    +cat data.c key.c > output.c
    +
    + +

    By default, Nyaruko generates a unique random key for every message, +using /dev/urandom as the seed. If given an extra command line +argument, Nyaruko will seed using that file instead of /dev/urandom:

    + +
    ./nyaruko seed.txt < input.bin > output.c
    +
    + +

    This makes the output key deterministic, allowing the same key to be +shared across different files. On operating systems that do not have +/dev/urandom, users should always specify this extra seed argument to +avoid deterministic keys.

    + +

    Features

    + +

    Implementation details that makes Nyaruko more obfuscated than usual +programs:

    + +
      +
    • Nyaruko recycles variables and buffers to reduce internal state. + The variable names are also carefully chosen for mixed-case + madness.
    • +
    • Nyaruko employs some preprocessor magic to share much of the same + code and state between the encoder and decoder, and to increase + occurrences of smileys ;)
    • +
    + + +

    Output code has these features:

    + +
      +
    • Fits nicely under 80 columns, and does not contain any trigraphs.
    • +
    • Uses a fairly efficient encoding scheme, better than uuencode for + files larger than ~13K, and better than base64 for files larger + than 20K.
    • +
    • Encryption with ISAAC, a cryptographically secure pseudorandom + number generator.
    • +
    • Trivial 3 language polyglot.
    • +
    + + +

    Code layout is meant to resemble Nyaruko, also known as Nyarlathotep, +the Crawling Chaos. The most obvious thing to do with chaos is to +make a random number generator, and the most obvious thing to do with +a random number generator is to make one-time-pads for encryption.

    + +

    Compatibility

    + +

    Nyaruko has these environment dependencies:

    + +
      +
    • Requires ASCII character set.
    • +
    • Assumes sizeof(unsigned int) == 4.
    • +
    • Best viewed with tab stops set to 8 spaces.
    • +
    + + +

    Output code has the same dependencies, with the additional +requirement that the compiler must support arbitrarily long string +literals. Maximum input size that can be encoded while still +producing standard-compliant output is ~276 bytes for C89, and ~3168 +bytes for C99.

    + +

    Nyaruko has been to verified to work with these compiler/OS +combinations:

    + +
      +
    • gcc 4.4.5 on Linux (32bit and 64bit)
    • +
    • clang 3.1 on Windows (Cygwin)
    • +
    • gcc 4.5.3 on Windows (Cygwin)
    • +
    • gcc 4.5.3 on Windows (MingW)
    • +
    • gcc 4.3.5 on JSLinux
    • +
    • tcc 0.9.25 on JSLinux
    • +
    + + +

    Note that on MingW, stdin and stdout are not opened in binary mode by +default, this means Nyaruko may not faithfully encode files on MingW.

    + +

    Extra files

    + +

    spoiler.html.gz - Contains full recording of how the code went from +blank state to an obfuscated program, gzipped to fit under 1MB.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2012/omoikane/hint.text b/2012/omoikane/hint.text new file mode 100644 index 000000000..713e9e0b3 --- /dev/null +++ b/2012/omoikane/hint.text @@ -0,0 +1,146 @@ +# Most surreptitious + +Don Yang + + + + +## Judges' comments: +### To build: + + make nyaruko + +### To run: + + ./nyaruko [seed.txt] < original.bin > output.c + bash output.c > key.c + perl output.c > data.c + + cat key.c data.c > output.c + + gcc output.c -o output + ./output > regenerated.bin + +### Try: + + echo "A quick brown fox jumps over the lazy dog" | ./nyaruko > output.c + perl output.c > data.c + gcc -o data data.c + ./data + gcc -o output output.c + ./output + + +### Selected Judges Remarks: + +The judges have nothing to add that has not already been written +about in the spoiler.html.gz file! :-) + +## Author's comments: +Usage +===== +Nyaruko is a binary to text filter. Given some input on stdin, +Nyaruko will produce C code that reproduces this input on stdout: + + ./nyaruko < original.bin > output.c + gcc output.c -o output + ./output > regenerated.bin + +Output is encrypted, but both key and data are included in the output. +To separate the key from the data, run these commands: + + bash output.c > key.c + perl output.c > data.c + +The key-less data.c still compiles, but produces a different message +on stdout instead of the original input. This message is a hint to +why the code is formatted the way it is. + +To combine the key and data, concatenate them together in either +order: + + cat key.c data.c > output.c + cat data.c key.c > output.c + +By default, Nyaruko generates a unique random key for every message, +using /dev/urandom as the seed. If given an extra command line +argument, Nyaruko will seed using that file instead of /dev/urandom: + + ./nyaruko seed.txt < input.bin > output.c + +This makes the output key deterministic, allowing the same key to be +shared across different files. On operating systems that do not have +/dev/urandom, users should always specify this extra seed argument to +avoid deterministic keys. + + +Features +======== +Implementation details that makes Nyaruko more obfuscated than usual +programs: + + * Nyaruko recycles variables and buffers to reduce internal state. + The variable names are also carefully chosen for mixed-case + madness. + * Nyaruko employs some preprocessor magic to share much of the same + code and state between the encoder and decoder, and to increase + occurrences of smileys ;) + +Output code has these features: + + * Fits nicely under 80 columns, and does not contain any trigraphs. + * Uses a fairly efficient encoding scheme, better than uuencode for + files larger than ~13K, and better than base64 for files larger + than 20K. + * Encryption with ISAAC, a cryptographically secure pseudorandom + number generator. + * Trivial 3 language polyglot. + +Code layout is meant to resemble Nyaruko, also known as Nyarlathotep, +the Crawling Chaos. The most obvious thing to do with chaos is to +make a random number generator, and the most obvious thing to do with +a random number generator is to make one-time-pads for encryption. + + +Compatibility +============= +Nyaruko has these environment dependencies: + + * Requires ASCII character set. + * Assumes sizeof(unsigned int) == 4. + * Best viewed with tab stops set to 8 spaces. + +Output code has the same dependencies, with the additional +requirement that the compiler must support arbitrarily long string +literals. Maximum input size that can be encoded while still +producing standard-compliant output is ~276 bytes for C89, and ~3168 +bytes for C99. + +Nyaruko has been to verified to work with these compiler/OS +combinations: + + * gcc 4.4.5 on Linux (32bit and 64bit) + * clang 3.1 on Windows (Cygwin) + * gcc 4.5.3 on Windows (Cygwin) + * gcc 4.5.3 on Windows (MingW) + * gcc 4.3.5 on JSLinux + * tcc 0.9.25 on JSLinux + +Note that on MingW, stdin and stdout are not opened in binary mode by +default, this means Nyaruko may not faithfully encode files on MingW. + + +Extra files +=========== + +spoiler.html.gz - Contains full recording of how the code went from +blank state to an obfuscated program, gzipped to fit under 1MB. + +-------------------------------------------------------------------------------- + diff --git a/2012/omoikane/nyaruko.c b/2012/omoikane/nyaruko.c new file mode 100644 index 000000000..80c1d442d --- /dev/null +++ b/2012/omoikane/nyaruko.c @@ -0,0 +1,46 @@ + #include + typedef unsigned int _;_ d,b, + #define i(I1,Il,lI)if(Il){lI;}else{I1;} + I[256], n,y,a,r,u,k,o + ,L,l[ 256],O,K[ + /**/ #define\ + q(g) g char\ + *C, *Q,c[\ + ]= "KfW"\ + "" "Ww|"\ + /* 'UU!\ + % NYA!\ + */ "Z}"\ + ";fRo?JtJaVoRU" "Ro"\ + "nB}h@o?)d.X)NSTIUCz7@%",*s[]={c,"#en" "di"\ + "f/*}||1;\n__DATA__\40*/\n\n#ifndef\40q\n#d" "ef"\ + "ine\x20q\n#include\ntypedef\40unsign" "e"\ + "d\x20int\x20_;_\x20K[]={\n#include\40__FILE__\n#u" "n"\ + "def q","0},L,O,l[256],I[256],n,y,a,r,u,k,o;"#g"char" "*"\ + "S,s[]=\"",c,c,"\";int main(){X();for(S=s+*K;*S>37;){for" "(o"\ + "=0;o<5;o++)r=r*85+(83+*S++)%89;r","^=*x();for(o=0;o<4;o++" ")"\ + "{s[O++]=r&255;r>>=8;}}return!fwrite(s,O-*S%5,1,stdout);}\n" "#"\ + "endif",c},S[256]="#ifdef/*\n'true'\40or\40q{\nexec\40head\40" "-"\ + "8\40$0\n};for(open$O,$0;<$O>;print\40if$f){$f|=/^$/;}q{*/q",/* */z; + 256];q(_*x(){if(!L--){y+=++a;for(o=0;o<256;y=l[o++]=I[255&(k>>10 )]+u + ){n^=(o&1)?n>>(( o& 2)?16:6):n<<((o&2)?2:13);u=I[o];k=I[o]=I[255& (u>> + 2)]+(n+=I[(o+128) & 255]) +y;}L=255;}return&l[L];}_*X(){for(O=0 ;256 + >O;I[O++]=0);for(O = 0; sizeof(K)/sizeof( _)> O;O++)I[O&255] ^=K[ + O];for(n=y=a=L=O=0 ;O<1<<24;++ O)x( );r=O=0x0; return&O;})int/*^^*/ main + (int p,char**P){FILE* Z=fopen(p> (+ 1)?P[01 ] :"/dev/urandom", "rb" + );i(;,Z,O=fread(K,256 ,4,Z);/*P */ fclose(Z))X();for(p=b=d =O= + 0;O<256;K[O++]=0)*K=+ 86;for(O =1;12> O;K[O++]=*x());X(); for + (C=Q=S;r-8;){i(*C++=34, (r-4&&r -5)||C- S ,;)z=Q[p++];i(;,z != + 32||r-3,i(i(C+=sprintf(( C), "%uU" ",",K[b++]);i(d=1;C =S + ;i(d=02,b-12,;),b%6,;),r-1 ,i(b= fread(c,1,4,stdin);i (p + =O=0,b,for(d=O=0;O<04;O++)d +=(c[O]&255)<<(8*O);d ^= + *x();for(p=5;p;c[--p]=O<32?O+ 95:O+6){O=d%85;d/=85;} O= + 5)i(d=0,b<4,c[O++]=b?b-1?b-2?36: 37:33:35 ;d=2)c[O]=0,r-4,i(i (d= 2 + |d,C!=S+6,*C++=(*x()%34)+93;p--),r -5,*s= C;d|=2) )),z ,i(*C++ =92 , + z-63||C [-1]-63||C>S+76,;)*C++=z))i( ;,d>1,d= d-2 ;Q=s[r] ;i( ; + ,r<3|| r>5,d=1;i(;,r-1, *C=0)C=S) i(;, r-4, p=0)++ r) i(*(C++ )= + 34,r <4||r>5|| C +5 ||C= 128). +| +| This rule applies only to compiled C source. Your optional data files +| and your remarks file may contain octets with the high bit set. + +| 14) Any C source that fails to compile because of lines with trailing +| control-M's (i.e., lines with a tailing octet 015) will be rejected. +| +| Please do not put trailing control-M's in your remarks file. + + 15) When you submit your entry you must have a valid email address + that can both send and receive email. The online submission + method is a two phase process that requires the use of an + approval code. This code will be emailed to you as part of + phase 1. + + Entries submitted without a working or valid email address will + be disqualified. + + The judges are not responsible for delays in email, please plan + enough time for one automated exchange of email as part of your + submission. + + 16) You are STRONGLY encouraged to submit an original entry. + Submissions that are similar to previous entries are discouraged. + + 17) The total size of your submission: the sum of the size of the program, + hints, comments, build and info files MUST be less than one megabyte + in size. + +| 18) The entirety of your entry must be submitted under the Creative Commons +| Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0): +| +| http://creativecommons.org/licenses/by-sa/3.0/ +| +| You must not submit anything that cannot be submitted under that license. + +| 19) The remarks file must be written in markdown format. See +| +| http://daringfireball.net/projects/markdown/basics +| +| for more information. + +| 20) The how to build instructions must be in make form. +| +| The target of the make file must be called prog. The original +| C source file must be called prog.c. +| +| To invoke the C compiler, use ${CC}. +| To invoke the C preprocessor use ${CPP}. +| +| Do not assume that . (the current working directory) is in the $PATH. +| +| Use a shell command syntax that is compatible with bash. +| +| Assume that commands commonly found in POSIX-like / Linux-line systems +| are available in the search path. +| +| Do not assume any particular given value of ${CFLAGS} or other +| commonly used make variables. + +| 21) Your entry must not create nor modify files above the current directory +| with the exception of the /tmp and the /var/tmp directories. Your entry +| may create subdirectories below the current directory provided that +| the name of such directories do not start with the "." character. + + +FOR MORE INFORMATION: + + The judging will be done by Leonid A. Broukhis, Simon Cooper, Landon + Curt Noll. + + Please send questions or comments about the contest, to: + +| q.2012@ioccc.org (for questions only!) + +| You must include the words ``ioccc 2012 question'' in the subject of + your EMail message when sending EMail to the judges. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, visit the IOCCC web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ diff --git a/2012/tromp/Makefile b/2012/tromp/Makefile new file mode 100644 index 000000000..9cf277802 --- /dev/null +++ b/2012/tromp/Makefile @@ -0,0 +1,207 @@ +#!/usr/bin/env make +# +# 2012 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -W +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${LIBS} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= tromp +DATA= how13 primes.blc uni.blc uni8.Blc bf.Blc hw.bf deflate.Blc inflate.Blc \ + parse.Blc symbolic.Blc primes.pl +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${ENTRY}64 ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} -m32 -DInt=int -DX=4 -DA=500000 $< -o $@ + +${ENTRY}64: ${ENTRY}.c + ${CC} ${CFLAGS} -m64 -DInt=long -DX=8 -DA=500000 $< -o $@ + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ENTRY}64.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ENTRY}64 ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you're joking Mr. Feynman!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'waste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall be disallowed from not being unable to partly misunderstand this partocular final echo. + +# Understand the history of "I Am the Walrus" and +# and in particular John Lennon's remarks on that +# song and you might be confused about these next +# rules in a different way. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v3; \ + else \ + echo "You are not expected to understand this"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 1c2c85c7a02c55d1add91967eca491d53c101dc1 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "Understand different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 21701 --level 23209 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "These aren't the droids you're looking for Mr. Spock!"; \ + fi + @${TRUE} diff --git a/2012/tromp/bf.Blc b/2012/tromp/bf.Blc new file mode 100644 index 000000000..e49ce3afd Binary files /dev/null and b/2012/tromp/bf.Blc differ diff --git a/2012/tromp/deflate.Blc b/2012/tromp/deflate.Blc new file mode 100644 index 000000000..3f00688c2 Binary files /dev/null and b/2012/tromp/deflate.Blc differ diff --git a/2012/tromp/hilbert.Blc b/2012/tromp/hilbert.Blc new file mode 100644 index 000000000..e55f53a7c Binary files /dev/null and b/2012/tromp/hilbert.Blc differ diff --git a/2012/tromp/hint.html b/2012/tromp/hint.html new file mode 100644 index 000000000..7f0b86152 --- /dev/null +++ b/2012/tromp/hint.html @@ -0,0 +1,494 @@ + + + + + + + Most functional + + +

    Most functional

    + +

    John Tromp
    +john.tromp@gmail.com
    +http://tromp.github.io/

    + +

    Judges' comments:

    + +

    To build:

    + +

    On a 32-bit machine:

    + +
    make tromp
    +
    + +

    On a 64-bit machine:

    + +
    make tromp64
    +# And mentally substitute ./tromp64 for ./tromp everywhere below
    +
    + +

    To run:

    + +
    cat ascii-prog.blc data | ./tromp -b
    +cat binary-prog.Blc data | ./tromp
    +
    + +

    Try:

    + +
    (cat hilbert.Blc; echo -n 1234) | ./tromp
    +(cat oddindices.Blc; echo; cat primes.blc | ./tromp -b) | ./tromp
    +cat primes.blc | ./tromp -b | ./primes.pl
    +
    + +

    Selected Judges Remarks:

    + +

    The judges dare to say that the data files this entry is processing +are more obfuscated than the entry itself.

    + +

    Author’s comments:

    + +

    This program celebrates the close connection between obfuscation and conciseness, +by implementing the most concise language known, Binary Lambda Calculus (BLC).

    + +

    BLC was developed to make Algorithmic Information Theory, the theory of smallest programs, +more concrete. It starts with the simplest model of computation, the lambda calculus, +and adds the minimum amount of machinery to enable binary input and output.

    + +

    More specifically, it defines a universal machine, which, from an input stream of bits, +parses the binary encoding of a lambda calculus term, applies that to the remainder +of input (translated to a lazy list of booleans, +which have a standard representation in lambda calculus), +and translates the evaluated result back into a stream of bits to be output.

    + +

    Lambda is encoded as 00, application as 01, and the variable bound by the n'th +enclosing lambda (denoted n in so-called De Bruijn notation) as 1^{n}0. +That’s all there is to BLC!

    + +

    For example the encoding of lambda term S = \x \y \z (x z) (y z), +with De Bruijn notation \ \ \ (3 1) (2 1), +is 00 00 00 01 01 1110 10 01 110 10

    + +

    In the closely related BLC8 language, IO is byte oriented, +translating between a stream of bytes and a list of length-8 lists of booleans.

    + +

    The submission implements the universal machine in the most concise manner conceivable. +It lacks #defines and #includes, and compiles to a (stripped) executable of under 6K in size.

    + +

    Without arguments, it runs in byte mode, using standard in- and output. +With one (arbitrary) argument, it runs in bit mode, using only the least significant +bit of input, and using characters ‘0’ and ‘1’ for output.

    + +

    The program uses the following exit codes: +0: OK; result is a finite list +5: Out of term space +6: Out of memory +1,2,3,4,8,9: result not in list form

    + +

    The size of the term space is fixed at compile time with -DA

    + +

    A half byte `cat'

    + +

    The shortest (closed) lambda calculus term is \x x (\ 1 in De Bruijn notation) +which is the identity function. When its encoding 0010 is fed +into the universal machine, it will simply copy the input to the output. +(well, not that simply, since each byte is smashed to bits and rebuilt from scratch) +Voila: a half byte cat:

    + +
      echo " Hello, world" | ./tromp
    +Hello, world
    +
    + +

    Since the least significant 4 bits of the first byte are just arbitrary padding +that is ignored by the program, +any character from ASCII 32 (space) through 47 (/) will do, e.g.:

    + +
      echo "*Hello, world" | ./tromp
    +Hello, world
    +
    + +

    Bad programs

    + +

    If the input doesn’t start with a valid program, that is, +if the interpreter reaches end-of-file during program parsing, +it will crash in some way:

    + +
      echo -n "U" | ./tromp
    +Segmentation fault
    +
    + +

    Furthermore, the interpreter requires the initial encoded lambda term to be closed, +that is, variable n can only appear within at least n enclosing lambdas. +For instance the term \ 5 is not closed, +causing the interpreter to crash when looking into a null-pointer environment:

    + +
      echo ">Hello, world" | ./tromp
    +Segmentation fault
    +
    + +

    Since these properties can be checked when creating BLC programs, +the interpreter doesn’t bother checking for it.

    + +

    A Self Interpreter

    + +

    The BLC universal machine may be small at 650 bytes of C +(952 bytes including layout), but written +as a self interpreter in BLC it is downright minuscule at 232 bits (29 bytes):

    + +
      01010001
    +   10100000
    +    00010101
    +     10000000
    +      00011110
    +       00010111
    +        11100111
    +         10000101
    +          11001111
    +          000000111
    +         10000101101
    +        1011100111110
    +       000111110000101
    +      11101001 11010010
    +     11001110   00011011
    +    00001011     11100001
    +   11110000       11100110
    +  11110111         11001111
    + 01110110           00011001
    +00011010             00011010
    +
    + +

    The byte oriented BLC8 version weighs in at 43 bytes (shown in hexadecimal).

    + +
     19468
    +  05580
    +   05f00
    +    bfe5f
    +     85f3f
    +      03c2d
    +     b9fc3f8
    +    5e9d65e5f
    +   0decb f0fc3
    +  9befe   185f7
    + 0b7fb     00cf6
    +7bb03       91a1a
    +
    +  (cat uni8.Blc; echo " Ni hao") | ./tromp
    +Ni hao
    +
    + +

    A prime number sieve

    + +

    Even shorter than the self-interpreter is this prime number sieve in 167 bits (under 21 bytes):

    + +
    000100011001100101000110100
    + 000000101100000100100010101
    + 11110111          101001000
    + 11010000          111001101
    + 000000000010110111001110011
    + 11111011110000000011111001
    + 10111000
    + 00010110
    +0000110110
    +
    + +

    The n'th bit in the output indicates whether n is prime:

    + +
      cat primes.blc | ./tromp -b | head -c 70
    +0011010100010100010100010000010100000100010100010000010000010100000100 
    +
    + +

    For those who prefer to digest their primes in decimal, there is oddindices.Blc, +which will print the indices of all odd characters (with lsb = 1) +separated by a given character:

    + +
      (cat oddindices.Blc; echo -n " "; cat primes.blc | ./tromp -b) | ./tromp | head -c 70
    +2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
    +
    + +

    A Space filling program

    + +

    Program hilbert.Blc, at 143 bytes, is a very twisty “one-liner” (shown in hexadecimal):

    + +
    1818181   8111154   6806041   55ff041
    +9d   f9   de   16   ff   fe   5f   3f
    +ef   f615ff9   46   84   058117e   05
    +cb             fe   bc             bf
    +ee86cb9   4681600   5c0bfac   bfbf71a
    +     85   e0             5c   f4     
    +14d5fe0   8180b048d0800e078   016445f
    +fe                                 5f
    +f7   ffffe5fff2fc   02f7ad97f5bf   ff
    +ff   bf        ff   ca        af   ff
    +7817ffa   df76695   4680601   57f7e16
    +          05             c1          
    +3fe80b2   2c18581   bfe5c10   42ff805
    +de   ec        06   c2        c0   c0
    +60   8191a00167fb   cbcfdf65f7c0  a20
    +
    + +

    It expects n arbitrary characters of input, and draws a space filling Hilbert curve of order n:

    + +
      (cat hilbert.Blc; echo -n "1") | ./tromp
    + _ 
    +| |
    +
    +  (cat hilbert.Blc; echo -n "12") | ./tromp
    + _   _ 
    +| |_| |
    +|_   _|
    + _| |_ 
    +
    +  (cat hilbert.Blc; echo -n "123") | ./tromp
    + _   _   _   _ 
    +| |_| | | |_| |
    +|_   _| |_   _|
    + _| |_____| |_ 
    +|  ___   ___  |
    +|_|  _| |_  |_|
    + _  |_   _|  _ 
    +| |___| |___| |
    +
    +  (cat hilbert.Blc; echo -n "1234") | ./tromp
    + _   _   _   _   _   _   _   _ 
    +| |_| | | |_| | | |_| | | |_| |
    +|_   _| |_   _| |_   _| |_   _|
    + _| |_____| |_   _| |_____| |_ 
    +|  ___   ___  | |  ___   ___  |
    +|_|  _| |_  |_| |_|  _| |_  |_|
    + _  |_   _|  _   _  |_   _|  _ 
    +| |___| |___| |_| |___| |___| |
    +|_   ___   ___   ___   ___   _|
    + _| |_  |_|  _| |_  |_|  _| |_ 
    +|  _  |  _  |_   _|  _  |  _  |
    +|_| |_| | |___| |___| | |_| |_|
    + _   _  |  ___   ___  |  _   _ 
    +| |_| | |_|  _| |_  |_| | |_| |
    +|_   _|  _  |_   _|  _  |_   _|
    + _| |___| |___| |___| |___| |_ 
    +
    + +

    A BrainFuck interpreter

    + +

    The smallest known BF interpreter is written in… you guessed it, BLC, +coming in at 112 bytes (including 3 bits of padding):

    + +
     od -t x4 bf.Blc 
    +0000000          01a15144 02d55584               223070b7        00f032ff
    +0000020          7f85f9bf        956fe15e        c0ee7d7f 006854e5
    +0000040          fbfd5558        fd5745e0        b6f0fbeb 07d62ff0
    +0000060          d7736fe1 c0bc14f1               1f2eff0b        17666fa1
    +0000100          2fef5be8        ff13ffcf        2034cae1 0bd0c80a
    +0000120          e51fee99        6a5a7fff        ff0fff1f d0049d87
    +0000140          db0500ab 3bb74023               b0c0cc28 10740e6c
    +0000160
    +
    + +

    It expects its input to consist of a Brainfuck program +(looking only at bits 0,1,4 to distinguish among ,-.+<>][ ) +followed by a ], followed by the input for the Brainfuck program.

    + +
      more hw.bf
    +++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.]
    +  cat bf.Blc hw.bf | ./tromp
    +Hello World!
    +
    + +

    Curiously, the interpreter bf.Blc is the exact same size as hw.bf.

    + +

    A BLC assembler

    + +

    Writing BLC programs can be made slightly less painful with this parser that +translates single-letter-variable lambda calculus into BLC:

    + +
      echo "\f\x f (f (f x))" > three
    +  cat parse.Blc three | ./tromp
    +000001110011100111010
    +
    + +

    Converting between bits and bytes

    + +

    THe program inflate.Blc and its inverse deflate.Blc allow us to translate between +BLC and BLC8. +If you assemble a byte oriented program, you’ll need to compact it into BLC8:

    + +

    So we could assemble an input reversing program as

    + +
      echo "\a a ((\b b b) (\b \c \d \e d (b b) (\f f c e))) (\b \c c)" > reverse
    +  cat parse.Blc reverse | ./tromp > reverse.blc
    +
    + +

    and change it to BLC8 with

    + +
      cat deflate.Blc reverse.blc | ./tromp > rev.Blc
    +  wc rev.Blc 
    +0 1 9 rev.Blc
    +
    + +

    and then try it out with:

    + +
      cat rev.Blc - | ./tromp
    +Hello, world!
    +^D
    +!dlrow ,olleH
    +
    + +

    Symbolic Lambda Calculus reduction

    + +

    BLC8 program symbolic.Blc shows individual reduction steps on symbolic lambda terms. +Here it is used to show the calculation of 23 in Church numerals:

    + +
      echo "(\f\x f (f (f x))) (\f\x f (f x))" > threetwo
    +  cat parse.Blc threetwo | ./tromp > threetwo.blc
    +  cat symbolic.Blc threetwo.blc | ./tromp
    +(\a \b a (a (a b))) (\a \b a (a b))
    +\a (\b \c b (b c)) ((\b \c b (b c)) ((\b \c b (b c)) a))
    +\a \b (\c \d c (c d)) ((\c \d c (c d)) a) ((\c \d c (c d)) ((\c \d c (c d)) a) b)
    +\a \b (\c (\d \e d (d e)) a ((\d \e d (d e)) a c)) ((\c \d c (c d)) ((\c \d c (c d)) a) b)
    +\a \b (\c \d c (c d)) a ((\c \d c (c d)) a ((\c \d c (c d)) ((\c \d c (c d)) a) b))
    +\a \b (\c a (a c)) ((\c \d c (c d)) a ((\c \d c (c d)) ((\c \d c (c d)) a) b))
    +\a \b a (a ((\c \d c (c d)) a ((\c \d c (c d)) ((\c \d c (c d)) a) b)))
    +\a \b a (a ((\c a (a c)) ((\c \d c (c d)) ((\c \d c (c d)) a) b)))
    +\a \b a (a (a (a ((\c \d c (c d)) ((\c \d c (c d)) a) b))))
    +\a \b a (a (a (a ((\c (\d \e d (d e)) a ((\d \e d (d e)) a c)) b))))
    +\a \b a (a (a (a ((\c \d c (c d)) a ((\c \d c (c d)) a b)))))
    +\a \b a (a (a (a ((\c a (a c)) ((\c \d c (c d)) a b)))))
    +\a \b a (a (a (a (a (a ((\c \d c (c d)) a b))))))
    +\a \b a (a (a (a (a (a ((\c a (a c)) b))))))
    +\a \b a (a (a (a (a (a (a (a b)))))))
    +
    + +

    As expected, the resulting normal form is Church numeral 8.

    + +

    Taking only the first line of output gives us a sort of BLC disassembler, +an exact inverse of the above assembler. The prime number sieve disassembles as follows:

    + +
      cat symbolic.Blc primes.blc | ./tromp | head -1
    +\a (\b b (b ((\c c c) (\c \d \e e (\f \g g) ((\f c c f ((\g g g) (\g f (g g)))) (\f \g \h \i i g (h (d f))))) (\c \d \e b (e c))))) (\b \c c (\d \e d) b)
    +
    + +

    Hardly any less obfuscated…

    + +

    The last line of + cat symbolic.Blc primes.blc | ./tromp | head -16 +starts out as + \a \b b (\c \d c) (\c c (\d \e d) (\d d (\e \f f) (\e e (\f \g g) ((\f (\g \h \i

    + +

    The \a is for ignoring the rest of the input (to which the universal machine +applies the decoded lambda term). The \b b (..) (…) is the list constructor, +usually called cons, applied to a head (a list element) and a tail (another list). +In this case the element is (\c \d c), which represents the boolean true, and +which we use to represent a 0 bit. This is the bit that says 0 is not prime. +The next list element (following another cons) is (\d \e d). Another 0 bit, +this time saying that 1 is not prime. The third list element is (\e \f f), +a 1 bit, confirming our suspicion that 2 is prime. As is the next number, +according to (\f \g g). We can see that the tail after the first 4 elements +is still subject to further reduction. The bit for number 4 will show up +for the first time in line 30, as (\g \h g), or 0, as the result of zeroing +out all multiples of the first prime, 2. +Since my computer reaches swap hell before line 40, we can’t see the next bit arriving, +at least not in this symbolic reduction.

    + +

    Performance

    + +

    Performance is quite decent, and amazingly good for such a tiny implementation, +being roughly 50% slower than a Haskell implementation of the universal machine +using so-called Higher Order Abstract Syntax which relies on the highly optimized +Haskell runtime system for evaluation. Of course individual blc programs running +under the interpreter perform much worse than that same program written in Haskell.

    + +

    Our interpreter copes well with extra levels of interpretation:

    + +
      time cat primes.blc | ./tromp -b | head -c 210 > /dev/null
    +real    0m0.043s
    +  time cat uni.blc primes.blc | ./tromp -b | head -c 210 > /dev/null
    +real    0m0.191s
    +  time cat uni.blc uni.blc primes.blc | ./tromp -b | head -c 210 > /dev/null
    +real    0m1.919s
    +  time cat uni.blc uni.blc uni.blc primes.blc | ./tromp -b | head -c 210 > /dev/null
    +real    0m23.514s
    +  time cat uni.blc uni.blc uni.blc uni.blc primes.blc | ./tromp -b | head -c 210 > /dev/null
    +real    4m52.700s
    +
    + +

    Obfuscation

    + +

    Obfuscation is due entirely to conciseness. Some questions to ponder:

    + +

    Which of the term space codes 0,1,2,3 serves multiple purposes?

    + +

    Why is the environment pointer pointing into the term space?

    + +

    What does the test u+m&1? do?

    + +

    How does the program reach exit code 0?

    + +

    And how do any of those blc programs work?

    + +

    Portability

    + +

    The program freely (without casting) converts between int and int*, causing +many warnings; + note: expected ‘int *’ but argument is of type ‘int’ + warning: assignment from incompatible pointer type + warning: assignment makes integer from pointer without a cast + warning: assignment makes pointer from integer without a cast + warning: incompatible implicit declaration of built-in function ‘calloc’ + warning: incompatible implicit declaration of built-in function ‘exit’ + warning: passing argument 1 of ‘d’ makes pointer from integer without a cast + warning: passing argument 1 of ‘p’ makes pointer from integer without a cast + warning: pointer/integer type mismatch in conditional expression

    + +

    Avoiding these would make the program substantially longer, +and detract from its single minded focus on conciseness.

    + +

    It implicitly declares functions read, write, exit and calloc, the latter two incompatibly. +32 bit and 64 bit executables are separate Makefile targets, involving a change +from int to long and from a hardcoded sizeof of 4 to 8.

    + +

    The program has been tested to work correctly on Linux/Solaris/MacOSX both in 32 and 64 bits.

    + +

    How the program works

    + +

    See the file how13.

    + +

    Acknowledgements

    + +

    Christopher Hendrie, Bertram Felgenhauer, Alex Stangl, Seong-hoon Kang, +and Yusuke Endoh have contributed ideas and suggestions for improvement.

    + +

    References

    + +

    Binary Lambda Calculus +https://tromp.github.io/cl/Binary_lambda_calculus.html

    + +

    G J Chaitin, Algorithmic information theory, Volume I, +Cambridge Tracts in Theoretical Computer Science, Cambridge University Press, October 1987. +http://www.cs.auckland.ac.nz/~chaitin/cup.html

    + +

    Jean-Louis Krivine. 2007. +A call-by-name lambda-calculus machine +Higher Order Symbol. Comput. 20, 3 (September 2007), 199-207. +http://www.pps.univ-paris-diderot.fr/~krivine/articles/lazymach.pdf

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2012/tromp/hint.text b/2012/tromp/hint.text new file mode 100644 index 000000000..8d77b2718 --- /dev/null +++ b/2012/tromp/hint.text @@ -0,0 +1,461 @@ +# Most functional + +John Tromp + + + + +## Judges' comments: +### To build: + +On a 32-bit machine: + + make tromp + +On a 64-bit machine: + + make tromp64 + # And mentally substitute ./tromp64 for ./tromp everywhere below + +### To run: + + cat ascii-prog.blc data | ./tromp -b + cat binary-prog.Blc data | ./tromp + +### Try: + + (cat hilbert.Blc; echo -n 1234) | ./tromp + (cat oddindices.Blc; echo; cat primes.blc | ./tromp -b) | ./tromp + cat primes.blc | ./tromp -b | ./primes.pl + +### Selected Judges Remarks: + +The judges dare to say that the data files this entry is processing +are more obfuscated than the entry itself. + +## Author's comments: +This program celebrates the close connection between obfuscation and conciseness, +by implementing the most concise language known, Binary Lambda Calculus (BLC). + +BLC was developed to make Algorithmic Information Theory, the theory of smallest programs, +more concrete. It starts with the simplest model of computation, the lambda calculus, +and adds the minimum amount of machinery to enable binary input and output. + +More specifically, it defines a universal machine, which, from an input stream of bits, +parses the binary encoding of a lambda calculus term, applies that to the remainder +of input (translated to a lazy list of booleans, +which have a standard representation in lambda calculus), +and translates the evaluated result back into a stream of bits to be output. + +Lambda is encoded as 00, application as 01, and the variable bound by the n'th +enclosing lambda (denoted n in so-called De Bruijn notation) as 1^{n}0. +That's all there is to BLC! + +For example the encoding of lambda term S = \x \y \z (x z) (y z), +with De Bruijn notation \ \ \ (3 1) (2 1), +is 00 00 00 01 01 1110 10 01 110 10 + +In the closely related BLC8 language, IO is byte oriented, +translating between a stream of bytes and a list of length-8 lists of booleans. + +The submission implements the universal machine in the most concise manner conceivable. +It lacks #defines and #includes, and compiles to a (stripped) executable of under 6K in size. + +Without arguments, it runs in byte mode, using standard in- and output. +With one (arbitrary) argument, it runs in bit mode, using only the least significant +bit of input, and using characters '0' and '1' for output. + +The program uses the following exit codes: +0: OK; result is a finite list +5: Out of term space +6: Out of memory +1,2,3,4,8,9: result not in list form + +The size of the term space is fixed at compile time with -DA + +A half byte `cat' +================= + +The shortest (closed) lambda calculus term is \x x (\ 1 in De Bruijn notation) +which is the identity function. When its encoding 0010 is fed +into the universal machine, it will simply copy the input to the output. +(well, not that simply, since each byte is smashed to bits and rebuilt from scratch) +Voila: a half byte cat: + + echo " Hello, world" | ./tromp + Hello, world + +Since the least significant 4 bits of the first byte are just arbitrary padding +that is ignored by the program, +any character from ASCII 32 (space) through 47 (/) will do, e.g.: + + echo "*Hello, world" | ./tromp + Hello, world + +Bad programs +============ + +If the input doesn't start with a valid program, that is, +if the interpreter reaches end-of-file during program parsing, +it will crash in some way: + + echo -n "U" | ./tromp + Segmentation fault + +Furthermore, the interpreter requires the initial encoded lambda term to be closed, +that is, variable n can only appear within at least n enclosing lambdas. +For instance the term \ 5 is not closed, +causing the interpreter to crash when looking into a null-pointer environment: + + echo ">Hello, world" | ./tromp + Segmentation fault + +Since these properties can be checked when creating BLC programs, +the interpreter doesn't bother checking for it. + +A Self Interpreter +================== + +The BLC universal machine may be small at 650 bytes of C +(952 bytes including layout), but written +as a self interpreter in BLC it is downright minuscule at 232 bits (29 bytes): + + 01010001 + 10100000 + 00010101 + 10000000 + 00011110 + 00010111 + 11100111 + 10000101 + 11001111 + 000000111 + 10000101101 + 1011100111110 + 000111110000101 + 11101001 11010010 + 11001110 00011011 + 00001011 11100001 + 11110000 11100110 + 11110111 11001111 + 01110110 00011001 + 00011010 00011010 + +The byte oriented BLC8 version weighs in at 43 bytes (shown in hexadecimal). + + 19468 + 05580 + 05f00 + bfe5f + 85f3f + 03c2d + b9fc3f8 + 5e9d65e5f + 0decb f0fc3 + 9befe 185f7 + 0b7fb 00cf6 + 7bb03 91a1a + + (cat uni8.Blc; echo " Ni hao") | ./tromp + Ni hao + +A prime number sieve +==================== + +Even shorter than the self-interpreter is this prime number sieve in 167 bits (under 21 bytes): + + 000100011001100101000110100 + 000000101100000100100010101 + 11110111 101001000 + 11010000 111001101 + 000000000010110111001110011 + 11111011110000000011111001 + 10111000 + 00010110 + 0000110110 + +The n'th bit in the output indicates whether n is prime: + + cat primes.blc | ./tromp -b | head -c 70 + 0011010100010100010100010000010100000100010100010000010000010100000100 + +For those who prefer to digest their primes in decimal, there is oddindices.Blc, +which will print the indices of all odd characters (with lsb = 1) +separated by a given character: + + (cat oddindices.Blc; echo -n " "; cat primes.blc | ./tromp -b) | ./tromp | head -c 70 + 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 + +A Space filling program +======================= + +Program hilbert.Blc, at 143 bytes, is a very twisty "one-liner" (shown in hexadecimal): + + 1818181 8111154 6806041 55ff041 + 9d f9 de 16 ff fe 5f 3f + ef f615ff9 46 84 058117e 05 + cb fe bc bf + ee86cb9 4681600 5c0bfac bfbf71a + 85 e0 5c f4 + 14d5fe0 8180b048d0800e078 016445f + fe 5f + f7 ffffe5fff2fc 02f7ad97f5bf ff + ff bf ff ca af ff + 7817ffa df76695 4680601 57f7e16 + 05 c1 + 3fe80b2 2c18581 bfe5c10 42ff805 + de ec 06 c2 c0 c0 + 60 8191a00167fb cbcfdf65f7c0 a20 + +It expects n arbitrary characters of input, and draws a space filling Hilbert curve of order n: + + (cat hilbert.Blc; echo -n "1") | ./tromp + _ + | | + + (cat hilbert.Blc; echo -n "12") | ./tromp + _ _ + | |_| | + |_ _| + _| |_ + + (cat hilbert.Blc; echo -n "123") | ./tromp + _ _ _ _ + | |_| | | |_| | + |_ _| |_ _| + _| |_____| |_ + | ___ ___ | + |_| _| |_ |_| + _ |_ _| _ + | |___| |___| | + + (cat hilbert.Blc; echo -n "1234") | ./tromp + _ _ _ _ _ _ _ _ + | |_| | | |_| | | |_| | | |_| | + |_ _| |_ _| |_ _| |_ _| + _| |_____| |_ _| |_____| |_ + | ___ ___ | | ___ ___ | + |_| _| |_ |_| |_| _| |_ |_| + _ |_ _| _ _ |_ _| _ + | |___| |___| |_| |___| |___| | + |_ ___ ___ ___ ___ _| + _| |_ |_| _| |_ |_| _| |_ + | _ | _ |_ _| _ | _ | + |_| |_| | |___| |___| | |_| |_| + _ _ | ___ ___ | _ _ + | |_| | |_| _| |_ |_| | |_| | + |_ _| _ |_ _| _ |_ _| + _| |___| |___| |___| |___| |_ + +A BrainFuck interpreter +======================= + +The smallest known BF interpreter is written in... you guessed it, BLC, +coming in at 112 bytes (including 3 bits of padding): + + od -t x4 bf.Blc + 0000000 01a15144 02d55584 223070b7 00f032ff + 0000020 7f85f9bf 956fe15e c0ee7d7f 006854e5 + 0000040 fbfd5558 fd5745e0 b6f0fbeb 07d62ff0 + 0000060 d7736fe1 c0bc14f1 1f2eff0b 17666fa1 + 0000100 2fef5be8 ff13ffcf 2034cae1 0bd0c80a + 0000120 e51fee99 6a5a7fff ff0fff1f d0049d87 + 0000140 db0500ab 3bb74023 b0c0cc28 10740e6c + 0000160 + +It expects its input to consist of a Brainfuck program +(looking only at bits 0,1,4 to distinguish among ,-.+<>][ ) +followed by a ], followed by the input for the Brainfuck program. + + more hw.bf + ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.] + cat bf.Blc hw.bf | ./tromp + Hello World! + +Curiously, the interpreter bf.Blc is the exact same size as hw.bf. + +A BLC assembler +=============== + +Writing BLC programs can be made slightly less painful with this parser that +translates single-letter-variable lambda calculus into BLC: + + echo "\f\x f (f (f x))" > three + cat parse.Blc three | ./tromp + 000001110011100111010 + +Converting between bits and bytes +================================= + +THe program inflate.Blc and its inverse deflate.Blc allow us to translate between +BLC and BLC8. +If you assemble a byte oriented program, you'll need to compact it into BLC8: + +So we could assemble an input reversing program as + + echo "\a a ((\b b b) (\b \c \d \e d (b b) (\f f c e))) (\b \c c)" > reverse + cat parse.Blc reverse | ./tromp > reverse.blc + +and change it to BLC8 with + + cat deflate.Blc reverse.blc | ./tromp > rev.Blc + wc rev.Blc + 0 1 9 rev.Blc + +and then try it out with: + + cat rev.Blc - | ./tromp + Hello, world! + ^D + !dlrow ,olleH + +Symbolic Lambda Calculus reduction +================================== + +BLC8 program symbolic.Blc shows individual reduction steps on symbolic lambda terms. +Here it is used to show the calculation of 2^3 in Church numerals: + + echo "(\f\x f (f (f x))) (\f\x f (f x))" > threetwo + cat parse.Blc threetwo | ./tromp > threetwo.blc + cat symbolic.Blc threetwo.blc | ./tromp + (\a \b a (a (a b))) (\a \b a (a b)) + \a (\b \c b (b c)) ((\b \c b (b c)) ((\b \c b (b c)) a)) + \a \b (\c \d c (c d)) ((\c \d c (c d)) a) ((\c \d c (c d)) ((\c \d c (c d)) a) b) + \a \b (\c (\d \e d (d e)) a ((\d \e d (d e)) a c)) ((\c \d c (c d)) ((\c \d c (c d)) a) b) + \a \b (\c \d c (c d)) a ((\c \d c (c d)) a ((\c \d c (c d)) ((\c \d c (c d)) a) b)) + \a \b (\c a (a c)) ((\c \d c (c d)) a ((\c \d c (c d)) ((\c \d c (c d)) a) b)) + \a \b a (a ((\c \d c (c d)) a ((\c \d c (c d)) ((\c \d c (c d)) a) b))) + \a \b a (a ((\c a (a c)) ((\c \d c (c d)) ((\c \d c (c d)) a) b))) + \a \b a (a (a (a ((\c \d c (c d)) ((\c \d c (c d)) a) b)))) + \a \b a (a (a (a ((\c (\d \e d (d e)) a ((\d \e d (d e)) a c)) b)))) + \a \b a (a (a (a ((\c \d c (c d)) a ((\c \d c (c d)) a b))))) + \a \b a (a (a (a ((\c a (a c)) ((\c \d c (c d)) a b))))) + \a \b a (a (a (a (a (a ((\c \d c (c d)) a b)))))) + \a \b a (a (a (a (a (a ((\c a (a c)) b)))))) + \a \b a (a (a (a (a (a (a (a b))))))) + +As expected, the resulting normal form is Church numeral 8. + +Taking only the first line of output gives us a sort of BLC disassembler, +an exact inverse of the above assembler. The prime number sieve disassembles as follows: + + cat symbolic.Blc primes.blc | ./tromp | head -1 + \a (\b b (b ((\c c c) (\c \d \e e (\f \g g) ((\f c c f ((\g g g) (\g f (g g)))) (\f \g \h \i i g (h (d f))))) (\c \d \e b (e c))))) (\b \c c (\d \e d) b) + +Hardly any less obfuscated... + +The last line of + cat symbolic.Blc primes.blc | ./tromp | head -16 +starts out as + \a \b b (\c \d c) (\c c (\d \e d) (\d d (\e \f f) (\e e (\f \g g) ((\f (\g \h \i + +The \a is for ignoring the rest of the input (to which the universal machine +applies the decoded lambda term). The \b b (..) (...) is the list constructor, +usually called cons, applied to a head (a list element) and a tail (another list). +In this case the element is (\c \d c), which represents the boolean true, and +which we use to represent a 0 bit. This is the bit that says 0 is not prime. +The next list element (following another cons) is (\d \e d). Another 0 bit, +this time saying that 1 is not prime. The third list element is (\e \f f), +a 1 bit, confirming our suspicion that 2 is prime. As is the next number, +according to (\f \g g). We can see that the tail after the first 4 elements +is still subject to further reduction. The bit for number 4 will show up +for the first time in line 30, as (\g \h g), or 0, as the result of zeroing +out all multiples of the first prime, 2. +Since my computer reaches swap hell before line 40, we can't see the next bit arriving, +at least not in this symbolic reduction. + +Performance +=========== + +Performance is quite decent, and amazingly good for such a tiny implementation, +being roughly 50% slower than a Haskell implementation of the universal machine +using so-called Higher Order Abstract Syntax which relies on the highly optimized +Haskell runtime system for evaluation. Of course individual blc programs running +under the interpreter perform much worse than that same program written in Haskell. + +Our interpreter copes well with extra levels of interpretation: + + time cat primes.blc | ./tromp -b | head -c 210 > /dev/null + real 0m0.043s + time cat uni.blc primes.blc | ./tromp -b | head -c 210 > /dev/null + real 0m0.191s + time cat uni.blc uni.blc primes.blc | ./tromp -b | head -c 210 > /dev/null + real 0m1.919s + time cat uni.blc uni.blc uni.blc primes.blc | ./tromp -b | head -c 210 > /dev/null + real 0m23.514s + time cat uni.blc uni.blc uni.blc uni.blc primes.blc | ./tromp -b | head -c 210 > /dev/null + real 4m52.700s + +Obfuscation +=========== + +Obfuscation is due entirely to conciseness. Some questions to ponder: + +Which of the term space codes 0,1,2,3 serves multiple purposes? + +Why is the environment pointer pointing into the term space? + +What does the test u+m&1? do? + +How does the program reach exit code 0? + +And how do any of those blc programs work? + +Portability +=========== + +The program freely (without casting) converts between int and int\*, causing +many warnings; + note: expected ‘int *’ but argument is of type ‘int’ + warning: assignment from incompatible pointer type + warning: assignment makes integer from pointer without a cast + warning: assignment makes pointer from integer without a cast + warning: incompatible implicit declaration of built-in function ‘calloc’ + warning: incompatible implicit declaration of built-in function ‘exit’ + warning: passing argument 1 of ‘d’ makes pointer from integer without a cast + warning: passing argument 1 of ‘p’ makes pointer from integer without a cast + warning: pointer/integer type mismatch in conditional expression + +Avoiding these would make the program substantially longer, +and detract from its single minded focus on conciseness. + +It implicitly declares functions read, write, exit and calloc, the latter two incompatibly. +32 bit and 64 bit executables are separate Makefile targets, involving a change +from int to long and from a hardcoded sizeof of 4 to 8. + +The program has been tested to work correctly on Linux/Solaris/MacOSX both in 32 and 64 bits. + +How the program works +===================== + +See the file how13. + +Acknowledgements +================ + +Christopher Hendrie, Bertram Felgenhauer, Alex Stangl, Seong-hoon Kang, +and Yusuke Endoh have contributed ideas and suggestions for improvement. + +References +========== + +Binary Lambda Calculus + + +G J Chaitin, Algorithmic information theory, Volume I, +Cambridge Tracts in Theoretical Computer Science, Cambridge University Press, October 1987. + + +Jean-Louis Krivine. 2007. +A call-by-name lambda-calculus machine +Higher Order Symbol. Comput. 20, 3 (September 2007), 199-207. + + +-------------------------------------------------------------------------------- + diff --git a/2012/tromp/how13 b/2012/tromp/how13 new file mode 100644 index 000000000..1c5989993 --- /dev/null +++ b/2012/tromp/how13 @@ -0,0 +1,45 @@ +Gur cebtenz vzcyrzragf n fb pnyyrq Xevivar znpuvar, +raunaprq jvgu n onfvp vachg/bhgchg flfgrz +naq n ersrerapr pbhagvat tneontr pbyyrpgbe. +Gur Xevivar znpuvar vf n fgrcjvfr genafsbezre bs n tybony fgngr pbafvfgvat bs +gur pheerag grez, gur pheerag raivebazrag (n yvfg bs pybfherf), naq n fgnpx bs pbagvahngvbaf +(Frr gur 3eq ersrerapr sbe qrgnvyf.) + +Gur grez fcnpr ubyqf ynzoqn pnyphyhf grezf va gur sbyybjvat sbezng +0 qrabgrf fbzr sbez bs VB; gur bayl sbhe bpphenaprf ner ng + P=13: erpbtavmrf raq bs n olgr + P=20: erpbtavmr bhgchg bs 0 ovg + P=21: erpbtavmr bhgchg bs 1 ovg + P=raq: vachg yvfg, rkcnaqrq ynmvyl +1 qrabgrf n inevnoyr, jvgu arkg ragel vgf qr Oehvwa vaqrk +2 qrabgrf nccyvpngvba jvgu arkg ragel gur fvmr bs gur grez orvat nccyvrq +3 qrabgrf ynzoqn nofgenpgvba + +N pybfher pbafvfgf bs gur sbyybjvat vgrzf +0 cbvagre gb gur arkg pybfher (nf cneg bs na raivebazrag), be arkg erpbeq ba serr yvfg +1 ersrerapr pbhag +2 cbvagre gb raivebazrag +3 ynzoqn grez (vaqrk va grez fcnpr) + +Urer'f jung rnpu inevnoyr qbrf: +Y Ynzoqn grez fcnpr +z zbqr; 0 sbe ovgf naq 7 sbe olgrf +o ovgf erznvavat haernq va V, -1 ba RBS +Q Qrfvenoyr grzcbenel +p pbagvahngvba pbagrkg +n npgvir raivebazrag cbvagre +P Pheerag grez vaqrk +H Hygvzngr grez cbvagre +h hgvyvgl ragel +O Obea gb or serr-yvfg bs pybfherf +V Vachg punenpgre +B Bhgchg punenpgre +r ragel bs pheerag grez + +Urer'f jung rnpu bs gur 6 nhkvyvnel shapgvbaf qbrf: +f: inevnoyr ybbxhc va npgvir raivebazrag jvgu qr Oehvwa vaqrk h +F: trgf bar ovg bs vachg, frggvat o gb -1 ba RBS be gb erznvavat ahzore bs ovgf va pheerag olgr +x: xbcl sentzrag sebz fgevat yvgreny ubyqvat ynzoqn grezf kbe 46 vagb pheerag raq bs grez fcnpr +k: kcnaq vachg, nqqvat 11 (erfc. 99) ragevrf gb grez fcnpr sbe ovg (erfc. olgr) zbqr +c: cnefrf oyp-rapbqrq ynzoqn grez hfvat F(), fgberf erfhygf va grez fcnpr naq ergheaf yratgu +q: qrpernfr ersrerapr pbhagre, nqq erpbeq gb serr yvfg ba ernpuvat mreb diff --git a/2012/tromp/hw.bf b/2012/tromp/hw.bf new file mode 100644 index 000000000..212061ae8 --- /dev/null +++ b/2012/tromp/hw.bf @@ -0,0 +1 @@ +++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.] \ No newline at end of file diff --git a/2012/tromp/inflate.Blc b/2012/tromp/inflate.Blc new file mode 100644 index 000000000..3d446b1dc Binary files /dev/null and b/2012/tromp/inflate.Blc differ diff --git a/2012/tromp/oddindices.Blc b/2012/tromp/oddindices.Blc new file mode 100644 index 000000000..687631646 --- /dev/null +++ b/2012/tromp/oddindices.Blc @@ -0,0 +1,2 @@ +F€TUUõUA‚!þÿû/Ï÷ö¿#B¨Ð +¨Ðð"°l¹`¿¸Wÿï‡þì¾ø˜øYÿüÿþþþ³óùùüÏq4Á`X60 \ No newline at end of file diff --git a/2012/tromp/parse.Blc b/2012/tromp/parse.Blc new file mode 100644 index 000000000..07e111989 Binary files /dev/null and b/2012/tromp/parse.Blc differ diff --git a/2012/tromp/primes.blc b/2012/tromp/primes.blc new file mode 100644 index 000000000..c9be349b3 --- /dev/null +++ b/2012/tromp/primes.blc @@ -0,0 +1 @@ +00010001100110010100011010000000010110000010010001010111110111101001000110100001110011010000000000101101110011100111111101111000000001111100110111000000101100000110110 \ No newline at end of file diff --git a/2012/tromp/primes.pl b/2012/tromp/primes.pl new file mode 100644 index 000000000..9b6e3caa5 --- /dev/null +++ b/2012/tromp/primes.pl @@ -0,0 +1,6 @@ +#!/usr/bin/env perl +$num = 0; +while(read(STDIN, $byte, 1)) { + print "$num\n" if $byte; + ++$num; +} diff --git a/2012/tromp/symbolic.Blc b/2012/tromp/symbolic.Blc new file mode 100644 index 000000000..1bf489524 Binary files /dev/null and b/2012/tromp/symbolic.Blc differ diff --git a/2012/tromp/tromp.c b/2012/tromp/tromp.c new file mode 100644 index 000000000..d5985727e --- /dev/null +++ b/2012/tromp/tromp.c @@ -0,0 +1,25 @@ + Int L[A],m,b,*D=A, + *c,*a=L,C,*U=L,u;s + (_){u--&&s(a=*a);} + char*B,I,O;S(){b=b + --?b:m|read(0,&I,1 + )-1;return~I>>b&1; + }k(l,u){for(;l<=u; + U-L>b&1;}x(){for(k( + 0,6),U[-5]=96;b;*U++=g())k(0, + 9);}k(l,u){for(;l<=u;U-L-A?*U++ + =S[l++]^46:exit(5));}main(e){for( + k(10,33),a[4]-=m =e-2&7,a[23]=s(U), + b=0;;e?e-1?e-2?c ?D=c,c=*D,*D=a,a=D + :exit(L[C+1]):(D =B?B:calloc(4,X))? + B=*D,*D=c,c=D,D[ 3]=++C+u, D[2]=a,a + [++D[1] ]++:exit (6):v():C -->22?g( + ),1<++b &&x(),k( 7*!b,9),* U++=b&&g + ():(C=u+m&1?O=O+ O|C&1,9:write(m||( +O=C+28),&O,1)+1) )e=L[C++],u=L[C];} diff --git a/2012/tromp/uni.blc b/2012/tromp/uni.blc new file mode 100644 index 000000000..506c9087d --- /dev/null +++ b/2012/tromp/uni.blc @@ -0,0 +1 @@ +0101000110100000000101011000000000011110000101111110011110000101110011110000001111000010110110111001111100001111100001011110100111010010110011100001101100001011111000011111000011100110111101111100111101110110000110010001101000011010 \ No newline at end of file diff --git a/2012/tromp/uni8.Blc b/2012/tromp/uni8.Blc new file mode 100644 index 000000000..c54e78c78 --- /dev/null +++ b/2012/tromp/uni8.Blc @@ -0,0 +1 @@ +F€U€ð þ_…óð<-¹ü?…éÖ^_ ì¿Ûïá…÷ ° ö{°9 \ No newline at end of file diff --git a/2012/vik/Makefile b/2012/vik/Makefile new file mode 100644 index 000000000..b5a426c31 --- /dev/null +++ b/2012/vik/Makefile @@ -0,0 +1,203 @@ +#!/usr/bin/env make +# +# 2012 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -W +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +CSTD= -ansi +#CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= -lz + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= vik +DATA= chocolate.png ioccc.png +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you're joking Mr. Feynman!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'waste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall be disallowed from not being unable to partly misunderstand this partocular final echo. + +# Understand the history of "I Am the Walrus" and +# and in particular John Lennon's remarks on that +# song and you might be confused about these next +# rules in a different way. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v3; \ + else \ + echo "You are not expected to understand this"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 1c2c85c7a02c55d1add91967eca491d53c101dc1 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "Understand different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 21701 --level 23209 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "These aren't the droids you're looking for Mr. Spock!"; \ + fi + @${TRUE} diff --git a/2012/vik/chocolate.png b/2012/vik/chocolate.png new file mode 100644 index 000000000..c49eb8d2c Binary files /dev/null and b/2012/vik/chocolate.png differ diff --git a/2012/vik/hint.html b/2012/vik/hint.html new file mode 100644 index 000000000..8ab7214c0 --- /dev/null +++ b/2012/vik/hint.html @@ -0,0 +1,177 @@ + + + + + + + Best use of cocoa - Bronze award + + +

    Best use of cocoa - Bronze award

    + +

    Daniel Vik
    +daniel@vik.cc
    +http://danielvik.com/

    + +

    Judges' comments:

    + +

    To build:

    + +
    make vik
    +
    + +

    This entry requires Zlib.

    + +

    To run:

    + +

    Embed text (from file or command line):

    + +
    ./vik e base.png filename > encodedimg.png
    +# or
    +./vik e base.png SomeRandomText > encodedimg.png
    +
    + +

    Extract the embedded text:

    + +
    ./vik d encodedimg.png
    +
    + +

    Embed a PNG into another

    + +
    ./vik e base.png source.png > encodedimg.png
    +
    + +

    Extract the embedded PNG:

    + +
    ./vik d encodedimg.png > restored.png
    +
    + +

    Try:

    + +
    ./vik e ioccc.png chocolate.png > chocolate-in-ioccc.png
    +./vik e chocolate.png ioccc.png > ioccc-in-chocolate.png
    +./vik d chocolate-in-ioccc.png > restored-chocolate.png
    +./vik d ioccc-in-chocolate.png > restored-ioccc.png
    +
    + +

    Selected Judges Remarks:

    + +

    References to chocolate had no effect on judging this entry. We +guarantee it.

    + +

    Can you discern hidden pieces of chocolate in chocolate-in-ioccc.png ?

    + +

    Author’s comments:

    + +

    Introduction

    + +

    This program is a steganography application for embedding an image or text +into another image as well as extracting the embedded image or text back. +The program stores the embedded image or text in the low bits of the RGB +values.

    + +

    The program supports any 8 bit true color PNG images (RGB, RGBA, grayscale, +and grayscale+alpha). The output image is always 8 bit RGB. When embedding +one image into another, the width and height needs to be the same.

    + +

    The program only updates the IDAT and IHDR chunks of the source image. Any +additional chunks are copied into the resulting image.

    + +

    Bonus Extractor:

    + +

    For some reason the chocolate image seems to have some special properties. +Apart from being quite big and a little bit noisy, it appears that when +embedded into another image and extracted, the bitmap data is also a valid +brain$#@$ program. It is of course possible to get the bitmap data from the +extracted image, and run it through any of the previous winning brain$#@$ +interpreters, but I thought it would be easier to include an interpreter in +the program to avoid the hassle:

    + +
    ./vik e ioccc.png chocolate.png > encodedimg.png
    +./vik b encodedimg.png
    +
    + +

    It is of course also possible to embed a brain$#@$ program as a text file +(as explained above) and decode it, e.g.:

    + +
    ./vik e ioccc.png .+[.+] > encodedimg.png
    +./vik b encodedimg.png
    +
    + +

    Obfuscation

    + +

    I really wanted to keep the program simple, so instead of adding multiple +macros or helper methods that can be confusing, I placed all functionality +in the main function. Main is called recursively and quite extensively, but +it gives the benefit that all invocations of the function has the same +parameters, argv and argc. This really helps readability, as a programmer +doesn’t need to remember several variable or function names. I also tried +to reduce the number of keywords, and the program only has four for-loops +followed by a single return statement. There is a little bit of use of the +question mark operator, but this is really there to keep the program as +simple as possible.

    + +

    Portability

    + +

    The program is portable to most platforms that have zlib available. The +only system dependency is that the program relies on writing binary data to +stdout.

    + +

    By default, Microsoft compilers adds carriage returns to new lines, and to +compile the program on this platform, the following line can be added after +the variable declarations in the main declaration in order to run +correctly:

    + +
    _setmode(_fileno(stdout), 0x8000);
    +
    + +

    Limitations

    + +

    The program doesn’t have many error checks so passing in invalid arguments +or images of mismatching sizes, or unsupported pixel formats will cause the +program to crash.

    + +

    Extendability

    + +

    Since a lot of care was taken to keep the code simple, it turned out to be +quite easy to extend functionality. I did include a small brain$#@$ after I +realized that the chocolate image had some interesting properties.

    + +

    But there is more functionality I added that didn’t fit within the size +limits and could not remain included. For example, I added a method to +format source code based on a PNG image. So the format of the program is +actually done by the program itself.

    + +

    And to be honest, the chocolate image did not have a brain$#@$ program +embedded to begin with. I added functionality to the program to embed a +brain$#@$ into a PNG image and used it to create the image provided with +the entry.

    + +

    I also added a method to analyze PNG images, to print the size and format, +as well as the scan line filters.

    + +

    All these features were quite easy to add, much thanks to the (actually +pretty good) design of the code.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2012/vik/hint.text b/2012/vik/hint.text new file mode 100644 index 000000000..d9e0ec538 --- /dev/null +++ b/2012/vik/hint.text @@ -0,0 +1,150 @@ +# Best use of cocoa - Bronze award + +Daniel Vik + + + + +## Judges' comments: +### To build: + + make vik + +This entry requires [Zlib](http://www.zlib.net/). + +### To run: + +#### Embed text (from file or command line): + + ./vik e base.png filename > encodedimg.png + # or + ./vik e base.png SomeRandomText > encodedimg.png + +#### Extract the embedded text: + + ./vik d encodedimg.png + +#### Embed a PNG into another + + ./vik e base.png source.png > encodedimg.png + +#### Extract the embedded PNG: + + ./vik d encodedimg.png > restored.png + +### Try: + + ./vik e ioccc.png chocolate.png > chocolate-in-ioccc.png + ./vik e chocolate.png ioccc.png > ioccc-in-chocolate.png + ./vik d chocolate-in-ioccc.png > restored-chocolate.png + ./vik d ioccc-in-chocolate.png > restored-ioccc.png + +### Selected Judges Remarks: + +References to chocolate had no effect on judging this entry. We +guarantee it. + +Can you discern hidden pieces of chocolate in chocolate-in-ioccc.png ? + + +## Author's comments: +Introduction +------------ + +This program is a steganography application for embedding an image or text +into another image as well as extracting the embedded image or text back. +The program stores the embedded image or text in the low bits of the RGB +values. + +The program supports any 8 bit true color PNG images (RGB, RGBA, grayscale, +and grayscale+alpha). The output image is always 8 bit RGB. When embedding +one image into another, the width and height needs to be the same. + +The program only updates the IDAT and IHDR chunks of the source image. Any +additional chunks are copied into the resulting image. + +### Bonus Extractor: + +For some reason the chocolate image seems to have some special properties. +Apart from being quite big and a little bit noisy, it appears that when +embedded into another image and extracted, the bitmap data is also a valid +brain$#@$ program. It is of course possible to get the bitmap data from the +extracted image, and run it through any of the previous winning brain$#@$ +interpreters, but I thought it would be easier to include an interpreter in +the program to avoid the hassle: + + ./vik e ioccc.png chocolate.png > encodedimg.png + ./vik b encodedimg.png + +It is of course also possible to embed a brain$#@$ program as a text file +(as explained above) and decode it, e.g.: + + ./vik e ioccc.png .+[.+] > encodedimg.png + ./vik b encodedimg.png + + +### Obfuscation + +I really wanted to keep the program simple, so instead of adding multiple +macros or helper methods that can be confusing, I placed all functionality +in the main function. Main is called recursively and quite extensively, but +it gives the benefit that all invocations of the function has the same +parameters, argv and argc. This really helps readability, as a programmer +doesn’t need to remember several variable or function names. I also tried +to reduce the number of keywords, and the program only has four for-loops +followed by a single return statement. There is a little bit of use of the +question mark operator, but this is really there to keep the program as +simple as possible. + + +### Portability + +The program is portable to most platforms that have zlib available. The +only system dependency is that the program relies on writing binary data to +stdout. + +By default, Microsoft compilers adds carriage returns to new lines, and to +compile the program on this platform, the following line can be added after +the variable declarations in the main declaration in order to run +correctly: + + _setmode(_fileno(stdout), 0x8000); + + +### Limitations + +The program doesn’t have many error checks so passing in invalid arguments +or images of mismatching sizes, or unsupported pixel formats will cause the +program to crash. + + +### Extendability + +Since a lot of care was taken to keep the code simple, it turned out to be +quite easy to extend functionality. I did include a small brain$#@$ after I +realized that the chocolate image had some interesting properties. + +But there is more functionality I added that didn’t fit within the size +limits and could not remain included. For example, I added a method to +format source code based on a PNG image. So the format of the program is +actually done by the program itself. + +And to be honest, the chocolate image did not have a brain$#@$ program +embedded to begin with. I added functionality to the program to embed a +brain$#@$ into a PNG image and used it to create the image provided with +the entry. + +I also added a method to analyze PNG images, to print the size and format, +as well as the scan line filters. + +All these features were quite easy to add, much thanks to the (actually +pretty good) design of the code. + +-------------------------------------------------------------------------------- + diff --git a/2012/vik/ioccc.png b/2012/vik/ioccc.png new file mode 100644 index 000000000..5b3bd1b03 Binary files /dev/null and b/2012/vik/ioccc.png differ diff --git a/2012/vik/vik.c b/2012/vik/vik.c new file mode 100644 index 000000000..9a5c58e0d --- /dev/null +++ b/2012/vik/vik.c @@ -0,0 +1,82 @@ +#include +#include +#include "zlib.h" + + + + + int + i,j,k,l + ,m,n,Q,W,H, + B,Z,Y,X,O=1<<24 + ; char*A[999],x[ + 1<<24],z[1<<24], + s[1<<24],t[2<<24 + ],w[2<<24],*E; + uLong N; FILE + *f ; int main( + int c,char**v){ + unsigned char**V + =(unsigned char + **)v; for(m=0; + c==-11&&m0?X:-X,Y=i- + Z,Y=Y>0?Y:-Y,Z=i+j + -Z-Z,Z=Z>0?Z:-Z,X>Y + ||X>Z?Y >Z?k:j:i): + (i+j) /2:j:i:0)); + for( E=t+O; *v-1[v] + &&c== -16; ++*v)n=**v,n + -62? n-60?n -91?n-93||! + m|| !*E?* v:(*v=A[--m+9 + ]): (A[9+ m++]=*v-1):--E + :++ E ,n-43?n-44?n-45? + n- 46 ?0:putchar(*E):--*E + :(* E= getchar()):++*E; for(; + 7< -c &&11>-c&&*v!=5[v]; ++*v) + **V =c +8?c+9?*V[1]++<<6|56:**V|~3 + &*V [1] ++:**V>>6; for(; m>m + %8) :(* V[1]++=V[0][m/8]<0 ?n=main(-7,(Q=**++v,N=0x49444154,*A + =s+4, main (-128 ,A),A[1]=*++v,A [4]=z,*A=x,A)) + ,c=A[ 6] -x- 12,Q-101?main(-19,(main(-10,(A[5]= + t+n, *A= t, A[1]=z,A)),*A=t,A [1]=w,A)):main(-9,( + main( -8 ,((n=main(-7,(A[1] =*++v,A[4]=t,*A=s+4, + A)))<0 ? main (-18,(n= -n,*A=s,A[1]=t,A)):0,A[ + 5]=t+n ,*A= t,A) ),*A=t, A[1]=z,A)),98-Q?E=memcmp( + w,s,4 )? n+= main(-22 ,(*A=z,A[1 ]=t,A[2]=t+n + ,A)), N=n= main (-23,(*A=t, A[1]=z,A[2 ]=z+n,A)), + memmove (x+ c+n+12 ,x+c,12),memcpy(x+c+8,t, n),main(-128 + ,(*A= x+c +4,A)) ,N=crc32( 0,memcpy(x +c+4,s,4),n + +4), main (-128, (*A=x+c+ n+12,A)),n +=c+24,x:(n= + strlen (w +4),w+4),fwrite(E ,1,n,stdout): main(-16,(*A=w, + A[1]=w +H, A)) :-c>31?main(c+=32 ,(*--*v=N,N>>=8,v)):-++c<4?(-c) + [*V]+256*main(c,v ):c+23?c+22?c+21?c+6?c+5?c+4?0:(N=O,uncompress(*v=s+4,&N + ,v[3],v[2]-v[3] ),main(c-7,v),H):(n-=l=main(-4,v)+12,5[*v]-68?(v[6]=(*v+= + l)):(memcpy(v[2],*v+8,l-12),v[2]+=l-12,memmove(*v,*v+l,n)),main(c-(n>8),v)) + :(n= main(-24,v),main(-4,v)-0x89504e47?-H:main(c,(*v+=16,W=main(-4,v)*3,*v + += 4,H=main(-4,v)*W,B=(*v)[5],(*v)[5]=2,N=crc32(0,*v- 8,17),*v+= + 13 ,main(-128,v),v[3]=v[2]=w+O,*v-=21,v))):(* *v=0,memcpy + (++*v ,v[1],W),*v+=W,v[1]+=W, 1+main((v[1] + !=v[2]) *--c,v)):(N=O + ,compress(*v,&N, v[1],v[2]-v[1]),N):(f= + fopen(v[1],"rb"))?fclose((n=fread(*v,1,O,f),f)), + n[*v]=0,n:(strcpy(*v,v[1]),0); } diff --git a/2012/whowon.html b/2012/whowon.html new file mode 100644 index 000000000..214ec04d9 --- /dev/null +++ b/2012/whowon.html @@ -0,0 +1,141 @@ + + + + + + + + Who won the 21st IOCCC + + + +
    IOCCC +

    The International Obfuscated C Code Contest +

    The 21st IOCCC Winners +

    +[ The judges | +IOCCC home page | +FAQ | +People who have won | +Winning entries ] + +

    + +

    +


    + +

    Here are the names and categories for the winners of the 21st IOCCC: +

    + + + +

    +


    + + + + + + + + +
    +Creative Commons License +

    This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

    +
    + + + diff --git a/2012/zeitak/Makefile b/2012/zeitak/Makefile new file mode 100644 index 000000000..311678c72 --- /dev/null +++ b/2012/zeitak/Makefile @@ -0,0 +1,210 @@ +#!/usr/bin/env make +# +# 2012 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -W +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${LIBS} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= zeitak +DATA= zeitak_deobfucate.c incorrect.c +ALT_OBJ= zeitak.orig.o zeitak_deobfucate.o +ALT_ENTRY= zeitak.orig zeitak_deobfucate + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o ${ENTRY} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +zeitak.orig: zeitak.orig.c + ${CC} ${CFLAGS} $< -o $@ + +zeitak_deobfucate: zeitak_deobfucate.c + ${CC} ${CFLAGS} $< -o $@ + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + @${TRUE} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you're joking Mr. Feynman!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'waste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall be disallowed from not being unable to partly misunderstand this partocular final echo. + +# Understand the history of "I Am the Walrus" and +# and in particular John Lennon's remarks on that +# song and you might be confused about these next +# rules in a different way. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v3; \ + else \ + echo "You are not expected to understand this"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 1c2c85c7a02c55d1add91967eca491d53c101dc1 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "Understand different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 21701 --level 23209 --FNV1a_hash 256-bit "${ENTRY}"; \ + else \ + echo "These aren't the droids you're looking for Mr. Spock!"; \ + fi + @${TRUE} diff --git a/2012/zeitak/hint.html b/2012/zeitak/hint.html new file mode 100644 index 000000000..ee5eea68e --- /dev/null +++ b/2012/zeitak/hint.html @@ -0,0 +1,159 @@ + + + + + + + Balanced use of obfuscation - Gold award + + +

    Balanced use of obfuscation - Gold award

    + +

    Adar Zeitak
    +aa4z2@walla.co.il

    + +

    Judges' comments:

    + +

    To build:

    + +
    make zeitak
    +
    + +

    To run:

    + +
    ./zeitak < file.c
    +
    + +

    where file.c is the file to be checked for nesting errors. For example, you may +try incorrect.c and the program itself.

    + +

    Try:

    + +
    ./zeitak < zeitak.c
    +./zeitak < incorrect.c
    +
    + +

    Selected Judges Remarks:

    + +

    This is an extremely subtle and twisted piece of Gold award winning code!

    + +

    The judges had spent a considerable amount of time analyzing this entry. +At one point we spent +18 minutes +just to understand 18 key characters of this code.

    + +

    The file zeitak_deobfucate.c provides a version that has been slightly +deobfuscated. You may find reading that file helpful in your attempt +to understand this extremely subtle entry.

    + +

    Author’s comments:

    + +

    Nesting Errors Detector

    + +

    What does it do

    + +

    As you have probably understood by looking at the source*, this program has +something to do with parenthesis (and equality of opening and closing +parenthesis, if you look close enough). It goes over the file given to it and +checks that every opening (, [, or { has a matching closing one and +vice versa. It also checks that every “ or ‘ is closed.

    + +

    If an error is detected, an error message will be printed. If the problem +is a superfluous closing bracket, it will even print a few characters +around it’s position.

    + +
      +
    • Make sure you view the source with 4 spaces tab width.
    • +
    + + +

    Features

    + +
      +
    • Ignores parenthesis inside strings or character constants, so no errors +will be detected in the following line:

      + +
        printf(")");
      +
    • +
    • Doesn’t get confused by the 1984/anonymous entry!

    • +
    + + +

    Mis-Features

    + +
      +
    • Escapes (e.g. \") are ignored, so the following line will produce +an error:

      + +
      printf("\"");
      +
    • +
    + + +

    Obfuscation

    + +

    IOCCC winners already contain entries without digits, control-flow +keywords and certain operators in their source. This entry has an +even more limited source, that is:

    + +
      +
    • Without any digits.
    • +
    • Without any character constants.
    • +
    • Without using functions from headers other than stdio.
    • +
    • Without any control-flow keywords (not even the ?: operator).
    • +
    • Without any arithmetic or logic operators!
    • +
    + + +

    So, what’s left? Parenthesis, and lots of them, as looking at the source will +reveal immediately. The main obfuscation is building the whole algorithm using +only function calls, typecasts, array lookups and pointer operators.

    + +

    Additional obfuscations include:

    + +
      +
    • Extensive reuse of identifiers: Macros share names with variables, inner +curly braces scopes contain variables with names identical to those in the +outer scopes and some of the variables have different uses in different +parts of the program. Even the large array has more than one use.
    • +
    • A complicated data structure with “unused” fields.
    • +
    • Mostly one-letter identifiers.
    • +
    • Complex recursion: A function might call itself once, twice, or not at all.
    • +
    + + +

    Compilation/Running Notes

    + +
      +
    • The program requires char to be one byte and pointers to be +at least two bytes long.

    • +
    • The program was tested on the following platforms:

    • +
    + + +

    Ubuntu 9.04 32-bit with GCC + Windows 7 32-bit with GCC +** Windows 7 32-bit with OpenWatcom

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2012/zeitak/hint.text b/2012/zeitak/hint.text new file mode 100644 index 000000000..32ca1e4d7 --- /dev/null +++ b/2012/zeitak/hint.text @@ -0,0 +1,114 @@ +# Balanced use of obfuscation - Gold award + +Adar Zeitak + + + +## Judges' comments: +### To build: + + make zeitak + +### To run: + + ./zeitak < file.c + +where file.c is the file to be checked for nesting errors. For example, you may +try incorrect.c and the program itself. + +### Try: + + ./zeitak < zeitak.c + ./zeitak < incorrect.c + +### Selected Judges Remarks: + +This is an extremely subtle and twisted piece of Gold award winning code! + +The judges had spent a considerable amount of time analyzing this entry. +At one point we spent +[18 minutes](https://twitter.com/ioccc/status/252162898800033792) +just to understand 18 key characters of this code. + +The file zeitak\_deobfucate.c provides a version that has been slightly +deobfuscated. You may find reading that file helpful in your attempt +to understand this extremely subtle entry. + +## Author's comments: +### Nesting Errors Detector + +#### What does it do + +As you have probably understood by looking at the source\*, this program has +something to do with parenthesis (and equality of opening and closing +parenthesis, if you look close enough). It goes over the file given to it and +checks that every opening (, [, or { has a matching closing one and +vice versa. It also checks that every " or ' is closed. + +If an error is detected, an error message will be printed. If the problem +is a superfluous closing bracket, it will even print a few characters +around it's position. + +* Make sure you view the source with 4 spaces tab width. + +#### Features + +* Ignores parenthesis inside strings or character constants, so no errors + will be detected in the following line: + + printf(")"); + +* Doesn't get confused by the 1984/anonymous entry! + +#### Mis-Features + +* Escapes (e.g. `\"`) are ignored, so the following line will produce + an error: + + printf("\""); + +#### Obfuscation + +IOCCC winners already contain entries without digits, control-flow +keywords and certain operators in their source. This entry has an +even more limited source, that is: + +* Without any digits. +* Without any character constants. +* Without using functions from headers other than stdio. +* Without any control-flow keywords (not even the ?: operator). +* Without any arithmetic or logic operators! + +So, what's left? Parenthesis, and lots of them, as looking at the source will +reveal immediately. The main obfuscation is building the whole algorithm using +only function calls, typecasts, array lookups and pointer operators. + +Additional obfuscations include: + +* Extensive reuse of identifiers: Macros share names with variables, inner + curly braces scopes contain variables with names identical to those in the + outer scopes and some of the variables have different uses in different + parts of the program. Even the large array has more than one use. +* A complicated data structure with "unused" fields. +* Mostly one-letter identifiers. +* Complex recursion: A function might call itself once, twice, or not at all. + +#### Compilation/Running Notes + +* The program requires `char` to be one byte and pointers to be + at least two bytes long. + +* The program was tested on the following platforms: + +** Ubuntu 9.04 32-bit with GCC +** Windows 7 32-bit with GCC +** Windows 7 32-bit with OpenWatcom + +-------------------------------------------------------------------------------- + diff --git a/2012/zeitak/incorrect.c b/2012/zeitak/incorrect.c new file mode 100644 index 000000000..3fc09c23d --- /dev/null +++ b/2012/zeitak/incorrect.c @@ -0,0 +1,7 @@ +#include + +int main() { + int i=40; + printf("%c",(char)(i))); + return 0; +} diff --git a/2012/zeitak/zeitak.c b/2012/zeitak/zeitak.c new file mode 100644 index 000000000..c42c648a8 --- /dev/null +++ b/2012/zeitak/zeitak.c @@ -0,0 +1,75 @@ +#include +#include +#define s(_)sizeof(_) +#define n void* +#define z(_)_,_,_ +#define x (s*)__ +#define y (s*)_ +#define h C(y,y) +#define o &d +#define t() (p) +#define w(_)_,_ +typedef n (*(*(*(*p)(n,n))(n,n))(n,n))(n,n); +typedef struct s { struct s* a ; struct s* UNUSED; } s; +typedef struct t { struct s* UNUSED; struct s* a ; } *t; +n __(n _,n __) { return _;}n _(n _,n __){return __; } +typedef unsigned char e; +#define _(_)((*_).a) + + s* + w, + a={x ,x}, + b={x ,y}, + c={y,x},d={y,y};s l[]={&b,&d,w (w(w(w(w(w(&d)))))),w(&d),&c,&d,w(w(w( + &d))),&c,w(&b),&d,&a,z(&d),z(w (w(w(w(w(&d)))))),&b,&b,w(&d),&a,&b,w(& + d), z(w + (w( w(w + + (&d))))),w(w(w(&d))), &b,&c,&d, &d,&a,&c ,w(w(&d)), &c,z(&b) ,w(&d),w(&a) + };s* C(s* a, s* b) {s* _=malloc(s(s));_(_)=a;_((t)_)=b;return _;}e k2=s(l + );p f(p + a,p b) + + { e k;s d;p v,r, q,i,C,c,u,g,m=t( ) +_ ( _(_(w)));C=t() _(_(&l[fread(&k,s(e ) +,s ( e),stdin)]));v =C(_,__);d=l[k=(e ) +C ( k2,k)];c=(u=a( b,_),i=(t()_((t ) +_ ( _(w))))(_,_(_(o)) ),(a(_(_((t)o)),(t( ) +_ ( _((t)o)))(_,__) ))(b(_((t)_((t)o) ) +, ( t()_((t)_((t)o))) (_,__)),_));{p a=t( ) +_ ( (t)_(o));{p b= C(_,i(u(_,__),_) ) +; { p u=C(_,(t()_(_(o) ))(_,__));_(_(_(w)) ) += ( s*)i(__,_(_( _(w))));r=b(m(c,_ ) +,C ( m(_,(t()_(( t)_(_(w))))(_,__) ) +, ( f)));v=b(_,v);i =b(a(_,__),_);g=(b ) + ( a(m(c(_,__),__ ),_),_);q=u(_((t ) +_ ( o)),_)((t()_( (t)_(_(w))))((t( ) +_ ( _((t)o)))(_(_((t )_(w))),(t()_(_((t ) +_ ( w))))(_,__))( _,__),_)(_,__),_ ) +;_ ( _((t)_(w))) = (s*)u(_((t)_(o)),_ ) + ( (t()_((t)_(_(w)))) (_,__),_)(_(_((t)o) ) +,_ ( _((t)_(w))));} }_((t)_(_(w)))=(s* ) +q ( a=(t()_((t)_(_(w))) )(_,__),_((t)_(_(w))) ) + ; fwrite((k=k,&k2) ,s(e),u(_,g)(s(e ) +, ( e)s(s[s(s[s(s[s (s)])])])),stdout ) + ; fwrite((k2=k,&k) ,s(e),u(__,g)(s(e ) +, ( e)s(s[s(s[s(s[s (s)])])])),stdout ) +;_ ( _(_((t)w)))=(s*) u((t()_(_(_((t)w))) ) + ( _,__),_(_(_((t)w ))));_(_((t)_(w)) ) += ( s*)q(a(_(_((t) o)),_(_((t)_(w))) ) +,_ ( _((t)_(w))));} _((t)_(_((t)w)))=(s* ) + ( t()_(_(_((t)w))) )(_((t)_(_((t)w)) ) +,u ( (t()_((t)_(_(( t)w))))(_,__),_((t ) +_ ( _((t)w)))));g =u((q=u(C(__,(t( ) +_ ( _(_((t)w))))(_((t )_(_((t)w))),_)),_) ) + ( _,__),g);v=g( __,i(u(_,i(f,_) ) + ( _(_((t)o)),_( (t)_((t)o))),v) ) + + ,r= q(_ + ,g( f,i + (v(f,(_(_(_(w)))=(s*)m,_)),r)));return q(_,v)(r(g(__,a),g(__,b)),r);} + + int main + (){w=C(C(h,h),C(h,h));return printf((e*)f(_,_)("OK\n","\n ^ Error\n" + "" )) + ;} diff --git a/2012/zeitak/zeitak.orig.c b/2012/zeitak/zeitak.orig.c new file mode 100644 index 000000000..09d829747 --- /dev/null +++ b/2012/zeitak/zeitak.orig.c @@ -0,0 +1,75 @@ +#include +#include +#define s(_)sizeof(_) +#define n void* +#define z(_)_,_,_ +#define x (s*)__ +#define y (s*)_ +#define h C(y,y) +#define o &d +#define t() (p) +#define w(_)_,_ +typedef n (*(*(*(*p)(n,n))(n,n))(n,n))(n,n); +typedef struct s { struct s* a ; struct s* UNUSED; } s; +typedef struct t { struct s* UNUSED; struct s* a ; } *t; +n __(n _,n __) { return _;}n _(n _,n __){return __; } +typedef unsigned char e; +#define _(_)((*_).a) + + s* + w, + a={x ,x}, + b={x ,y}, + c={y,x},d={y,y};s l[]={&b,&d,w (w(w(w(w(w(&d)))))),w(&d),&c,&d,w(w(w( + &d))),&c,w(&b),&d,&a,z(&d),z(w (w(w(w(w(&d)))))),&b,&b,w(&d),&a,&b,w(& + d), z(w + (w( w(w + + (&d))))),w(w(w(&d))), &b,&c,&d, &d,&a,&c ,w(w(&d)), &c,z(&b) ,w(&d),w(&a) + };s* C(s* a, s* b) {s* _=malloc(s(s));_(_)=a;_((t)_)=b;return _;}e k2=s(l + );p f(p + a,p b) + + { e k;s d;p v,r, q,i,C,c,u,g,m=t( ) +_ ( _(_(w)));C=t() _(_(&l[fread(&k,s(e ) +,s ( e),stdin)]));v =C(_,__);d=l[k=(e ) +C ( k2,k)];c=(u=a( b,_),i=(t()_((t ) +_ ( _(w))))(_,_(_(o)) ),(a(_(_((t)o)),(t( ) +_ ( _((t)o)))(_,__) ))(b(_((t)_((t)o) ) +, ( t()_((t)_((t)o))) (_,__)),_));{p a=t( ) +_ ( (t)_(o));{p b= C(_,i(u(_,__),_) ) +; { p u=C(_,(t()_(_(o) ))(_,__));_(_(_(w)) ) += ( s*)i(__,_(_( _(w))));r=b(m(c,_ ) +,C ( m(_,(t()_(( t)_(_(w))))(_,__) ) +, ( f)));v=b(_,v);i =b(a(_,__),_);g=(b ) + ( a(m(c(_,__),__ ),_),_);q=u(_((t ) +_ ( o)),_)((t()_( (t)_(_(w))))((t( ) +_ ( _((t)o)))(_(_((t )_(w))),(t()_(_((t ) +_ ( w))))(_,__))( _,__),_)(_,__),_ ) +;_ ( _((t)_(w))) = (s*)u(_((t)_(o)),_ ) + ( (t()_((t)_(_(w)))) (_,__),_)(_(_((t)o) ) +,_ ( _((t)_(w))));} }_((t)_(_(w)))=(s* ) +q ( a=(t()_((t)_(_(w))) )(_,__),_((t)_(_(w))) ) + ; fwrite((k=k,&k2) ,s(e),u(_,g)(s(e ) +, ( e)s(s[s(s[s(s[s (s)])])])),stdout ) + ; fwrite((k2=k,&k) ,s(e),u(__,g)(s(e ) +, ( e)s(s[s(s[s(s[s (s)])])])),stdout ) +;_ ( _(_((t)w)))=(s*) u((t()_(_(_((t)w))) ) + ( _,__),_(_(_((t)w ))));_(_((t)_(w)) ) += ( s*)q(a(_(_((t) o)),_(_((t)_(w))) ) +,_ ( _((t)_(w))));} _((t)_(_((t)w)))=(s* ) + ( t()_(_(_((t)w))) )(_((t)_(_((t)w)) ) +,u ( (t()_((t)_(_(( t)w))))(_,__),_((t ) +_ ( _((t)w)))));g =u((q=u(C(__,(t( ) +_ ( _(_((t)w))))(_((t )_(_((t)w))),_)),_) ) + ( _,__),g);v=g( __,i(u(_,i(f,_) ) + ( _(_((t)o)),_( (t)_((t)o))),v) ) + + ,r= q(_ + ,g( f,i + (v(f,(_(_(_(w)))=(s*)m,_)),r)));return q(_,v)(r(g(__,a),g(__,b)),r);} + + int main + (){w=C(C(h,h),C(h,h));return printf((e*)f(_,_)("OK\n","\n ^ Error\n" + "" )) + ;} diff --git a/2012/zeitak/zeitak_deobfucate.c b/2012/zeitak/zeitak_deobfucate.c new file mode 100644 index 000000000..9ccaa5405 --- /dev/null +++ b/2012/zeitak/zeitak_deobfucate.c @@ -0,0 +1,146 @@ +#include +#include +typedef void *(*(*(*(*p) (void *, void *)) (void *, void *)) (void *, void *)) (void *, void *); + +typedef struct frst { + struct frst *a; + struct frst *UNUSED; +} frst; + +typedef struct scnd { + struct frst *UNUSED; + struct frst *a; +} *scnd; + +void * +arg1(void *a1, void *a2) +{ + return a1; +} + +void * +arg2(void *a1, void *a2) +{ + return a2; +} + +typedef unsigned char u_char; + +frst *w, + a = {(frst *) arg1, (frst *) arg1}, + b = {(frst *) arg1, (frst *) arg2}, + c = { + (frst *) arg2, (frst *) arg1 +}, +d = { + (frst *) arg2, (frst *) arg2 +}; + +frst table[] = { + &b, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, + &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, + &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, + &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, + &d, &d, &d, &d, &c, &d, &d, &d, &d, &d, &d, &d, &d, &d, &c, &b, + &b, &d, &a, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, + &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, + &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, + &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, + &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, + &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, + &d, &d, &d, &d, &d, &d, &b, &b, &d, &d, &a, &b, &d, &d, &d, &d, + &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, + &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, + &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, &d, + &d, &d, &d, &d, &d, &d, &b, &c, &d, &d, &a, &c, &d, &d, &d, &d, + &c, &b, &b, &b, &d, &d, &a, &a +}; + +frst * +C(frst * a, frst * b) +{ + frst *p = malloc(sizeof(frst)); + + p->a = a; + p->UNUSED = b; + return p; +} + +u_char k2 = sizeof(table); + +p +f(p a, p b) +{ + u_char k; + frst d; + p v, + r, + q, + i, + C, + c, + u, + g, + m = (p) + ((*((*((*w).a)).a)).a); + + C = (p) ((*((*&table[fread(&k, sizeof(u_char), sizeof(u_char), stdin)]).a)).a); + + v = C(arg2, arg1); + d = table[k = (u_char) C(k2, k)]; + c = (u = a(b, arg2), i = ((p) ((*(scnd) ((*((*w).a)).a)).a)) (arg2, ((*((*&d).a)).a)), (a(((*((*(scnd) & d).a)).a), ((p) + ((*((*(scnd) & d).a)).a)) (arg2, arg1))) (b(((*(scnd) ((*(scnd) & d).a)).a) + ,((p) ((*(scnd) ((*(scnd) & d).a)).a)) (arg2, arg1)), arg2)); { + p a = (p) + ((*(scnd) ((*&d).a)).a); { + p b = C(arg2, i(u(arg2, arg1), arg2)); { + p u = C(arg2, ((p) ((*((*&d).a)).a)) (arg2, arg1)); + + ((*((*((*w).a)).a)).a) + = (frst *) i(arg1, ((*((*((*w).a)).a)).a)); + r = b(m(c, arg2) + ,C(m(arg2, ((p) ((*(scnd) ((*((*w).a)).a)).a)) (arg2, arg1)) + ,(f))); + v = b(arg2, v); + i = b(a(arg2, arg1), arg2); + g = (b) (a(m(c(arg2, arg1), arg1), arg2), arg2); + q = u(((*(scnd) ((*&d).a)).a), arg2) (((p) ((*(scnd) ((*((*w).a)).a)).a)) (((p) + ((*((*(scnd) & d).a)).a)) (((*((*(scnd) ((*w).a)).a)).a), ((p) ((*((*(scnd) ((*w).a)).a)).a)) (arg2, arg1)) (arg2, arg1), arg2) (arg2, arg1), arg2); + ((*((*(scnd) ((*w).a)).a)).a) = (frst *) u(((*(scnd) ((*&d).a)).a), arg2) + (((p) ((*(scnd) ((*((*w).a)).a)).a)) (arg2, arg1), arg2) (((*((*(scnd) & d).a)).a) + ,((*((*(scnd) ((*w).a)).a)).a)); + } + } ((*(scnd) ((*((*w).a)).a)).a) = (frst *) + q(a = ((p) ((*(scnd) ((*((*w).a)).a)).a)) (arg2, arg1), ((*(scnd) ((*((*w).a)).a)).a)); + fwrite((k = k, &k2), sizeof(u_char), u(arg2, g) (sizeof(u_char) + ,(u_char) sizeof(frst[sizeof(frst[sizeof(frst[sizeof(frst)])])])), stdout); + fwrite((k2 = k, &k), sizeof(u_char), u(arg1, g) (sizeof(u_char) + ,(u_char) sizeof(frst[sizeof(frst[sizeof(frst[sizeof(frst)])])])), stdout); + ((*((*((*(scnd) w).a)).a)).a) = (frst *) u(((p) ((*((*((*(scnd) w).a)).a)).a)) + (arg2, arg1), ((*((*((*(scnd) w).a)).a)).a)); + ((*((*(scnd) ((*w).a)).a)).a) + = (frst *) q(a(((*((*(scnd) & d).a)).a), ((*((*(scnd) ((*w).a)).a)).a)) + ,((*((*(scnd) ((*w).a)).a)).a)); + } + ((*(scnd) ((*((*(scnd) w).a)).a)).a) = (frst *) + ((p) ((*((*((*(scnd) w).a)).a)).a)) (((*(scnd) ((*((*(scnd) w).a)).a)).a) + ,u(((p) ((*(scnd) ((*((*(scnd) w).a)).a)).a)) (arg2, arg1), ((*(scnd) ((*((*(scnd) w).a)).a)).a))); + + g = u((q = u(C(arg1, ((p) + ((*((*((*(scnd) w).a)).a)).a)) (((*(scnd) ((*((*(scnd) w).a)).a)).a), arg2)), arg2)) + (arg2, arg1), g); + v = g(arg1, i(u(arg2, i(f, arg2)) + (((*((*(scnd) & d).a)).a), ((*(scnd) ((*(scnd) & d).a)).a)), v)) + ,r = q(arg2 + ,g(f, i + (v(f, (((*((*((*w).a)).a)).a) = (frst *) m, arg2)), r))); + return q(arg2, v) (r(g(arg1, a), g(arg1, b)), r); +} + +int +main() +{ + w = C(C(C((frst *) arg2, (frst *) arg2), C((frst *) arg2, (frst *) arg2)), C(C((frst *) arg2, (frst *) arg2), C((frst *) arg2, (frst *) arg2))); + return printf((u_char *) f(arg2, arg2) ("OK\n", "\n ^ Error\n" + "")); +} diff --git a/2013/2013.tar.bz2 b/2013/2013.tar.bz2 new file mode 100644 index 000000000..60fa19492 Binary files /dev/null and b/2013/2013.tar.bz2 differ diff --git a/2013/Makefile b/2013/Makefile new file mode 100644 index 000000000..54116250c --- /dev/null +++ b/2013/Makefile @@ -0,0 +1,146 @@ +#!/usr/bin/env make +# +# 2013 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############### +# IOCCC winners +############### +# +WINNERS= birken cable1 cable2 cable3 dlowe endoh1 endoh2 endoh3 endoh4 \ + hou mills misaka morgan1 morgan2 robison + +################### +# build all entries +################### +# +all: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) X11_LIBDIR=${X11_LIBDIR} X11_INCDIR=${X11_INCDIR} $@)"; \ + (cd $$i && $(MAKE) "X11_LIBDIR=${X11_LIBDIR}" "X11_INCDIR=${X11_INCDIR}" $@); \ + done + +# alternative executable +# +alt: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) X11_LIBDIR=${X11_LIBDIR} X11_INCDIR=${X11_INCDIR} $@)"; \ + (cd $$i && $(MAKE) "X11_LIBDIR=${X11_LIBDIR}" "X11_INCDIR=${X11_INCDIR}" $@); \ + done + + +############### +# utility rules +############### +# +everything: all alt + +clean: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +clobber: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +nuke: clobber + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +install: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + +haste: + $(MAKE) waste + +waste: + @echo 'waste' + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall be disallowed from not being unable to partly misunderstand this partocular final echo. + @${TRUE} + +# These rules are written in the sytle of "I Am the Walrus" +# and in particular John Lennon's take on deep analysis of art. :-) +# +# See also the sub-directory Makefiles for non-propaganda. +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v3; \ + else \ + echo "You are not expected to understand this"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 1c2c85c7a02c55d1add91967eca491d53c101dc1 --FNV1a_hash 256-bit -R ."; \ + else \ + echo "Understand different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 256-bit -R ."; \ + else \ + echo "These aren't the droids you're looking for Mr. Spock!"; \ + fi + @${TRUE} diff --git a/2013/README.html b/2013/README.html new file mode 100644 index 000000000..49bf9ca86 --- /dev/null +++ b/2013/README.html @@ -0,0 +1,130 @@ + + + + + + + README + + +

    2013 marked the “The Twenty Second International Obfuscated C Code Contest”

    + +

    Copyright © 2013, Landon Curt Noll, Simon Cooper, and Leonid A. +Broukhis. All Rights Reserved. Permission for personal, educational +or non-profit use is granted provided this copyright and notice are +included in its entirety and remains unaltered. All other uses +must receive prior permission from the contest judges.

    + +

    Standard IOCCC stuff

    + +

    The IOCCC has a web site and now has a number of international mirrors. +The primary site can be found at,

    + +

    http://www.ioccc.org/

    + +

    Use make to compile entries. It is possible that on non-Un*x / non-Linux +systems the makefile needs to be changed. See the Makefile for details.

    + +

    Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitter.

    + +

    Read over the makefile for compile/build issues. Your system may require +certain changes (add or remove a library, add or remove a #define).

    + +

    Some ANSI C compilers are not quite as good as they should be. If +yours is lacking, you may need to compile using gcc instead of your +local compiler.

    + +

    Remarks on some of the entries

    + +

    We believe you will again be impressed with this year’s winners.

    + +

    This year, several 8 people won 9 people won 15 awards. For the +first time in the history of the contest, one person, Yusuke Endoh, +won 4 times while Adrian Cable won 3 times! It is also worth noting +that Chris Mills previous win was in 1993. Welcome back Chris!

    + +

    We, the judges, were very surprised by this as many of the multiple +winners submitted very different styles of entries.

    + +

    This year was the first time the IOCCC size tool was used. Entries +had to print a value 2053 or less when the -i flag was used.

    + +

    Several people discovered an undocumented feature in that +certain comments such as:

    + +
    ///*
    +
    + +

    or:

    + +
    *\
    +/
    +
    + +

    were not correctly parsed by the tool. The guidelines stated:

    + +
    In cases where the above summary and the algorithm implemented by
    +the IOCCC size tool source code conflict, the algorithm implemented
    +by the IOCCC size tool source code is preferred by the judges.
    +
    + +

    so this abuse was allowed (and encouraged). The judges hope that +the IOCCC size tool author will patch the tool to block this kind +of size abuse in future contests.

    + +

    There were some outstanding entries that did not win. Unfortunately +some very good entries lost because they:

    + +
      +
    • were way way oversize and didn’t even attempt to justify their +excess by a clever abuse of the rules

    • +
    • depend on a single obfuscation trick

    • +
    • could only be run on a particular vendor’s platform

    • +
    • were very similar to previous winners

    • +
    • didn’t work as documented

    • +
    + + +

    We hope the authors of some of those entries will fix and re-submit +them for the next IOCCC.

    + +

    There is a risk in submitting an entry that is similar to a well +used theme by previous winners. Previous winners set a very high +bar. A new winner must not only compete against other submissions +from the current year, they must also excel over similar winners +in some particularly impressive way.

    + +

    Final Comments

    + +

    Please feel free to send us comments and suggestions about the +competition, this README or anything else that you would like to see in +future contests.

    + +

    If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used.

    + +

    If you have problems with any of the entries, AND YOU HAVE A FIX, please +send us the fix (patch file or the entire changed file).

    + +

    For the latest information on how to contact the IOCCC Judges please visit

    + +

    http://www.ioccc.org/contact.html

    + +

    For news of the next contest watch:

    + +

    http://www.ioccc.org/

    + + + + +
    Creative Commons License

    © Copyright 1984-2013, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2013/README.text b/2013/README.text new file mode 100644 index 000000000..4b6958532 --- /dev/null +++ b/2013/README.text @@ -0,0 +1,123 @@ +2013 marked the "The Twenty Second International Obfuscated C Code Contest" +=========================================================================== + +Copyright (C) 2013, Landon Curt Noll, Simon Cooper, and Leonid A. +Broukhis. All Rights Reserved. Permission for personal, educational +or non-profit use is granted provided this copyright and notice are +included in its entirety and remains unaltered. All other uses +must receive prior permission from the contest judges. + + +Standard IOCCC stuff +-------------------- + +The IOCCC has a web site and now has a number of international mirrors. +The primary site can be found at, + +> + +Use make to compile entries. It is possible that on non-Un\*x / non-Linux +systems the makefile needs to be changed. See the Makefile for details. + +Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitter. + +Read over the makefile for compile/build issues. Your system may require +certain changes (add or remove a library, add or remove a #define). + +Some ANSI C compilers are not quite as good as they should be. If +yours is lacking, you may need to compile using gcc instead of your +local compiler. + + +Remarks on some of the entries +------------------------------ + +We believe you will again be impressed with this year's winners. + +This year, several 8 people won 9 people won 15 awards. For the +first time in the history of the contest, one person, Yusuke Endoh, +won 4 times while Adrian Cable won 3 times! It is also worth noting +that Chris Mills previous win was in 1993. Welcome back Chris! + +We, the judges, were very surprised by this as many of the multiple +winners submitted very different styles of entries. + +This year was the first time the IOCCC size tool was used. Entries +had to print a value 2053 or less when the -i flag was used. + +Several people discovered an undocumented feature in that +certain comments such as: + + ///* + +or: + + *\ + / + +were not correctly parsed by the tool. The guidelines stated: + + In cases where the above summary and the algorithm implemented by + the IOCCC size tool source code conflict, the algorithm implemented + by the IOCCC size tool source code is preferred by the judges. + +so this abuse was allowed (and encouraged). The judges hope that +the IOCCC size tool author will patch the tool to block this kind +of size abuse in future contests. + +There were some outstanding entries that did not win. Unfortunately +some very good entries lost because they: + ++ were way way oversize and didn't even attempt to justify their + excess by a clever abuse of the rules + ++ depend on a single obfuscation trick + ++ could only be run on a particular vendor's platform + ++ were very similar to previous winners + ++ didn't work as documented + +We hope the authors of some of those entries will fix and re-submit +them for the next IOCCC. + +There is a risk in submitting an entry that is similar to a well +used theme by previous winners. Previous winners set a very high +bar. A new winner must not only compete against other submissions +from the current year, they must also excel over similar winners +in some particularly impressive way. + +Final Comments +-------------- + +Please feel free to send us comments and suggestions about the +competition, this README or anything else that you would like to see in +future contests. + +If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used. + +If you have problems with any of the entries, AND YOU HAVE A FIX, please +send us the fix (patch file or the entire changed file). + +For the latest information on how to contact the IOCCC Judges please visit + +> + +For news of the next contest watch: + +> + + +-------------------------------------------------------------------------------- + diff --git a/2013/birken/Makefile b/2013/birken/Makefile new file mode 100644 index 000000000..1388743c4 --- /dev/null +++ b/2013/birken/Makefile @@ -0,0 +1,212 @@ +#!/usr/bin/env make +# +# 2013 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall -W +CWARN= -Wall -pedantic -Wno-newline-eof + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${LIBS} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= birken +DATA= examples.tbz2 images.tbz2 +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} data + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + ${RM} -rf examples + @echo extracting examples + ${TAR} -jxf examples.tbz2 + ${RM} -rf images + @echo extracting images + ${TAR} -jxf images.tbz2 + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + ${RM} -rf examples + @-if [ ! -e .keep_ioccc_2013 ]; then \ + echo ${RM} -rf images; \ + ${RM} -rf images; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Lehmer!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "Park different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Paul Erdos!"; \ + fi + @${TRUE} diff --git a/2013/birken/birken.c b/2013/birken/birken.c new file mode 100644 index 000000000..b47199672 --- /dev/null +++ b/2013/birken/birken.c @@ -0,0 +1,49 @@ +char*_ = "'""/*"; +#include +#define m 21 +#define o(l, k) for(l=0; lGP9$5-,#C?NX"]-35)>>t*3&7; o(e,4){ c[T] +[e][t]=("5'<$=$8)Ih$=h9i8'9" "t=)83)l4(99(g9>##>4(" [T+t+T]-35)>>e*2&3; +} } n(15) { s=T>9?m:(T&3)-3?15:36;o(e,s)o(t,2)c[T+19][e][t]="6*6,8*6.608.6264826668\ +865::(+;0(6+6-6/8,61638065678469.;88))()3(6,8*6.608.6264826668865:+;4)-*6-6/616365,\ +-6715690.5;,89,81+,(023096/:40(8-7751)2)65;695(855(+*8)+;4**+4(((6.608.626482666886\ +5:+;4+4)0(8)6/61638065678469.;88)-4,4*8+4(((60(/6264826668865:+;4-616365676993-9:54\ ++-14).;./347.+18*):1;-*0-975/)936.+:4*,80987(887(0(*)4.*""/4,4*8+4(((6264826668865:\ ++;4/4-4+8-4)0(8)6365678469.;88)1/(6*6,6.60626466686:8)8-8*818.8582/9863(+;/""*6,6.6\ +0626466686:4(8)8-8*818.8582/9863(+;/,6.60626466686:8-818.8582/9864*4+4(0())+;/.6062\ +6466686:8/8380/7844,4-4*4+4(0())69+;/0626466686:818582/9864.4/4,4-4*4+4(0())+;" [e+E ++e+t]-40; E+=s+s; } n(45){ if(T>i) { v(2,T,7); v(46,T,7); } v(2+T,44,7); } T=0; o(e, +42)o(t,m)h[T][e][t]--; while(R+i) { s = D=0; if (r-R) { n(19) if (G[R+i][T]+i) V=T/2 +; else if(G[R][T]+i) s++; if(s) { if(V>4){ V=9-V; D++; } V+=29; n(20) q(c[V][T][0],c +[V][T][i],D); } } n(19) if((L=G[R][T])+i) { O=T-L; e=O>9; t=e?18-O :O; o(K,((t&3)-3? +16:37)){ if(K){ L=c[t+19][K-i][0]; O=c[t+19][K-i][i] ; } q(L,O,K && e); } } if(s) q( +c[V][20][0], c[V][20][i], D); R--; } printf("\33[47;1f\33[?25h\33[40m"); return 0; } \ No newline at end of file diff --git a/2013/birken/examples.tbz2 b/2013/birken/examples.tbz2 new file mode 100644 index 000000000..8825e0ba0 Binary files /dev/null and b/2013/birken/examples.tbz2 differ diff --git a/2013/birken/hint.html b/2013/birken/hint.html new file mode 100644 index 000000000..a31de3737 --- /dev/null +++ b/2013/birken/hint.html @@ -0,0 +1,295 @@ + + + + + + + Best painting tool + + +

    Best painting tool

    + +

    Michael Birken
    +o__1@hotmail.com
    +http://www.meatfighter.com/

    + +

    Judges' comments:

    + +

    To build:

    + +
    make birken
    +
    + +

    To run:

    + +
    ./birken < 17_columns_wide_paint_by_numbers_file
    +
    + +

    Try:

    + +
    ./birken < examples/ioccc.txt
    +
    +perl -e 'map{map{print int(rand()*8);}(0..16);print chr(10);}(0..30);' | tr '[0-4]' ' '| ./birken 
    +
    + +

    Selected Judges Remarks:

    + +

    This program also wins the “Most amusing abuse of the iocccsize tool” award; although not the +absolute best: it is possible to achieve 0 by writing

    + +
    /* *\
    +/....
    +
    + +

    The game of Tetris had been used in many endeavors, from studying algorithmic complexity to treating PTSD. +Using it for painting by numbers looks like a novel idea.

    + +

    Author’s comments:

    + +

    About This Document

    + +

    This document is best viewed as an HTML file in a browser that supports animated gifs. Extract examples.tbz2 for the sample input files.

    + +
    tar -xjvf examples.tbz2
    +
    + +

    Abstract

    + +

    By rotating, positioning and dropping a predetermined sequence of pieces, this program exploits the mechanics of Tetris to generate arbitrary images.

    + +

    Algorithm Overview

    + +

    The algorithm converts pixels from a source image into squares in the Tetris playfield, one row at a time from the bottom up. To generate an individual square, the algorithm assembles a structure consisting of a rectangular region fully supported by a single square protruding from the bottom. When the rectangular region is completed, its rows are cleared, leaving behind the protruding square. Three examples of the process appear below.

    + +

    + +

    + +

    + +

    During construction of a row, all of the squares produced by this method must be supported. In the images above, the generated squares are supported by the floor of the playfield. However, if an arbitrary row contains holes, it may not provide the support necessary for the construction of the row above it. The algorithm solves this problem by constructing a flat platform on top of the row with holes. In the animation below, a platform is built above a row comprising of a single red square. The platform is a temporary structure and inserting the final piece removes it.

    + +

    + +

    Below, a row containing 5 red squares is deposited above a row containing 3 red squares. This is accomplished by building a flat platform on top of the lower row. The platform provides the support necessary to generate the 5 red squares. Finally, the platform is removed by inserting its final piece and the new row drops into place. Note, if the algorithm needed to generate the rows in the opposite order (a row of 3 red squares above a row of 5 red squares), a platform would not be necessary.

    + +

    + +

    Single Square Emitters

    + +

    For reference, the names of the 7 Tetriminos (the game pieces) appear in the table below.

    + +

    + +

    This algorithm was tailored specifically to render sprites from early video games. Those games packed graphics into 8×8 tiles where 2 bits were dedicated to each pixel. Consequentially, sprites usually contained only 3 colors plus transparent regions and they were typically sized either 16×16 or 16×32 pixels.

    + +

    The animation below depicts all the patterns used to emit single squares. J, T and L Tetriminos are used interchangeably within each pattern to produce the protruding square at the bottom. The algorithm assigns those Tetriminos to the 3 colors present in the sprite. The remaining Tetriminos are assigned arbitrary colors. And, all the colors remain constant during gameplay.

    + +

    + +

    It is not possible to emit a square of all 3 colors in the first 2 and the last 2 columns due to the shapes of the 3 Tetriminos. As a result, the minimal width of a playfield to accommodate a 16 pixel wide sprite is 2 + 16 + 2 = 20 squares. However, it turns out that 20 is too small.

    + +

    As illustrated below, the region above the protruding square cannot exclusively consist of a single row because the only pieces that could fit, the I Tetriminos, are unsupported.

    + +

    + +

    With 2 rows, the only means of spanning the full playfield width in a way that remains supported is to use S and Z Tetriminos. But, that will always leave holes in the upper row.

    + +

    + +

    The minimal number of rows required above the protruding square is 3 and as shown repeatedly above, such patterns do exist. 20 squares is the minimal width required to fit a 16 pixel wide sprite. But, 20 × 3 + 1 = 61, which is not divisible by 4 and hence not constructible out of Tetriminos. However, a width of 21 yields 21 × 3 + 1 = 64, which can be built with 16 Tetriminos. That width actually enables the algorithm to render sprites up to 17 pixels wide.

    + +

    The original Tetris playfield is 10×20 squares, a 1:2 ratio. The program maintains that ratio by using a playfield of 21×42 squares.

    + +

    Since J, T and L Tetriminos are used interchangeably to produce the emitted square and 3 squares of those Tetriminos contribute to the row above it, there are 21 − 3 + 1 = 19 single square emitting patterns. However, due to mirror symmetry, there are really only 10 patterns. Clearing 3 rows works for the majority of them. But, an exhaustive computer search revealed that 2 of the patterns require more. The next possible option is 7 rows since 21 × 7 + 1 = 148, requiring 37 Tetriminos. As the images below show, those patterns do exist.

    + +

    + +

    + +

    Platforms

    + +

    Before a row is constructed, the algorithm inspects the row below it. If the row below fails to provide support for all of the squares to be deposited above it, then a temporary platform is required. When that platform is removed, the new row will drop, leaving some of the squares apparently floating above empty space due to the way that gravity works in the original Tetris.

    + +

    The illustration below depicts the 10 platform patterns (really only 5 considering mirror symmetry). The construction of a platform begins by dropping a T Tetrimino on top one of the squares of the last generated row. The remaining Tetriminos support each other down to that first T. Meaning, as long as the previously generated row contains at least 1 square, like the red square below, then it is possible to construct a flat platform above it for the generation of the next row.

    + +

    + +

    In the middle of platform construction, the bottom row gets completed and cleared, leaving 3 rows above it. The final J or L Tetrimino that will remove those rows is not inserted until the square emitters are done generating the next row of the sprite on top of the platform. That final piece precludes square emission in the first and last 2 columns. But, as discussed above, the square emitters are limited to the 17 inner columns due to the geometry of the J, T and L Tetriminos used in the process.

    + +

    Also, of the 19 possible ways to start constructing a platform on top of a T Tetrimino, only the 10 patterns shown above exist.

    + +

    Program Input

    + +

    The input sprite is represented textually. Digit characters 0 to 7 correspond to pixels with colors from the palette below.

    + +

    ANSI color palette

    + +

    As discussed above, sprites are limited to a maximum of 3 colors from this palette.

    + +

    All other characters are interpreted as transparent pixels.

    + +

    The maximum permissible size of the input text is 32 rows by 17 columns. Row length can vary as long as no single row exceeds 17 characters.

    + +

    Every row must contain at least one palette digit character.

    + +

    The examples directory contains several sprites in this textual format that can be fed into standard input. Several examples take advantage of the Tetris playfield background color. Instead of using character 0, internal regions marked as transparent are effectively rendered as black.

    + +

    Program Output

    + +

    The program conceptually uses Tetris as an output device similar to a line printer. It restricts itself to those operations that can be performed on the Tetris playfield: spawning, rotating, positioning and dropping Tetriminos. This process is visually represented using ANSI escape sequences.

    + +

    ANSImation

    + +

    The rate at which the program plays Tetris is completely determined by the rate in which the terminal application receives and displays the ANSI escape sequences.

    + +

    To slowdown the output programmatically, introduce a delay immediately after the call to fflush.

    + +

    IOCCC Size Tool Bug

    + +

    This program demonstrates how to exploit a bug in IOCCC size tool version 2013-07-30-v17. The first line of the program is reproduced below.

    + +
    char*_ = "'""/*";
    +
    + +

    If that line is added to the top of any program, the tool will report a size of 8.

    + +
    ./iocccsize -i < prog.c
    +8
    +
    + +

    When that line is deleted from this program, the tool properly reports the secondary size limit of the program as 2048.

    + +
    ./iocccsize -i < prog.c
    +2048
    +
    + +

    Although this bug provides an easy means of circumventing contest rule 2, as demonstrated from the size value, this entry is not necessarily striving for a ‘worst abuse of the rules’ award.

    + +

    Obfuscations

    + +

    This program is almost, but not quite, entirely unlike a demonstration of good programming practices. Contrary to other programs, an inspection of this one will certainly reveal that it possesses tea, not to mention an affinity for the constant 42.

    + +

    Variables are named and ordered to spell out, “Tetris”, “ELORG”, “DVK” and the aforementioned “Tea”. ELORG is the abbreviation for Elektronorgtechnica, the former Soviet state owned computer organization that handled the worldwide Tetris intellectual property rights. DVK is the line of Soviet PDP-11-compatible personal computers capable of running Alexey Pajitnov’s original 1984 Tetris prototype.

    + +

    Carefully selected variable names also yielded wonderful expressions like l=0, O=0, O=1 and while(O). “Tetris” also makes a second appearance of sorts:

    + +
    [T][e][t]--; while(R+i) { s
    +
    + +

    The source is formatted to resemble the Tetris playfield midgame. It is also an homage to all the past IOCCC entries formatted as a compact block of text; the T, orientated appropriately to reflect its name and the first letter in the title of the game, is just a moment away from producing such a text block.

    + +

    Three tables are encoded as separate strings within the program:

    + +

    The first string stores the coordinates of the squares of the 19 distinct rotations of Tetriminos (see below). Since a Tetrimino is a chain of 4 squares, all Tetriminos fit within a 4×4 matrix. To determine the coordinates of the squares, the Tetrimino is pushed to the upper-left of the matrix. Each coordinate value requires 2 bits of storage. Consequentially, the four x-coordinates and the four y-coordinates were packed into separate octets. To convert the octets into valid ASCII characters, the squares were sorted such that the least significant bits stored the largest coordinate values. The results were offset by 35, the # character, which is 1 beyond the ASCII value of ", making it easier to pack into a string. None of the resultant values are beyond ASCII 127. The coordinates for all 19 rotations fit in a string of length 38.

    + +

    + +

    The second string stores the single square emitter patterns and the platform patterns. Each pattern is a sequence of pairs, { Tetrimino index, drop x-coordinate }. As mentioned, there are 19 distinct rotations, requiring 5 bits of storage for the Tetrimino index. Another 5 bits is required for the drop x-coordinate since there are 21 columns in the playfield. Necessarily, the pair is stored as 2 separate characters. By offsetting them by 40, the ( character, the resultant string almost resembles a long and complex mathematical expression. The program takes advantage of mirror symmetry by only storing 10 single square emitter patterns and 5 platform patterns. The pattern lengths are not encoded within the string. Rather, they are embedded within the string decoding logic.

    + +

    The third string conceptually stores the default colors of the 19 rotations. A 3-bit value is assigned to each, covering the 7 possible colors. In addition, when a mirrored pattern is executed, J exchanges with L and S exchanges with Z, necessitating a second list of 3-bit color values. Pairs of color values (6 bits) fit comfortably into a character that is offset by #. The result is a string of length 19.

    + +

    The program is full of subtle obfuscations:

    + +
      +
    • The unary decrement operator is used in conjunction with global variable automatic zero initialization to set variables to -1.

    • +
    • The boolean expression of the form, x + 1, is used multiple times to determine if a value is not -1. Similarly, expressions of the form x - y are used to determine if x != y.

    • +
    • Several arrays store unrelated data in segments throughout the array to reduce named variables.

    • +
    • The x["..."] trick appears once.

    • +
    • Variable i is less than necessary.

    • +
    • A cursorily glance at the expressions 4&&L and m&&e==m suggests that they always evaluate to true.

    • +
    • The varying single square emitter pattern lengths are resolved during string decoding using the clever expression, (i & 3) - 3, which identifies pattern 3 and 7 as longer.

    • +
    • The file size of prog.c is a prime number. Deleting the first line also produces a prime-sized program. These properties do not qualify the program as a prime number generator.

    • +
    + + +

    Beyond Obfuscation

    + +

    Due to the contest code size constraint, some optimizations reluctantly had to be omitted. For example, multi-square emitters are possible:

    + +

    + +

    + +

    + +

    + +

    In fact, using dynamic programming and creative heuristics, real-time search is possible, enabling patterns like this:

    + +

    + +

    And, even this:

    + +

    + +

    In addition, it is possible to extend the algorithm to 6 colors instead of just 3. This is achieved using I, S and Z to produce the protruding square. A series of rectangular regions are constructed above those Tetriminos to erode them down to a single emitted square.

    + +

    The details of these enhancements are left as an exercise to the reader.

    + +

    Example Files

    + +

    The following example files were created by the program author. They can be freely used and distributed.

    + +
      +
    • format.txt - The layout of the program
    • +
    • helloworld.txt - Hello World, Tetris-style
    • +
    • hilbert.txt - A graphic based on the Hilbert curve
    • +
    • ioccc.txt - IOCCC
    • +
    • landon.txt - Portrait of a man with glasses
    • +
    • leo.txt - Portrait of a man without glasses
    • +
    • rhino.txt - A purple rhinoceros
    • +
    • simon.txt - Portrait of a man without hair
    • +
    + + +

    The following files are based on graphics from non-free, copyrighted video games. The use of a limited number of textual representations of the graphics for the demonstration of this program qualifies as fair use as such files do not significantly impede the right of the copyright holder to sell the copyrighted material and it is not being used to generate profit in this context. The origin of each file is detailed below (character, game, company, year).

    + +
      +
    • belmont.txt - Simon Belmont, Castlevania, Konami, 1986
    • +
    • bloober.txt - Bloober, Super Mario Brothers, Nintendo, 1985
    • +
    • bomberman.txt - Bomberman, Bomberman, Hudson, 1983
    • +
    • boo.txt - Boo, Super Mario Brothers 3, Nintendo, 1988
    • +
    • bub.txt - Bub, Bubble Bobble, Taito, 1986
    • +
    • cheepcheep.txt - Cheep Cheep, Super Mario Brothers, Nintendo, 1985
    • +
    • gurin.txt - Gurin, Binary Land, Hudson, 1983
    • +
    • koopaparatroopa.txt - Koopa Paratroopa, Super Mario Brothers, Nintendo, 1985
    • +
    • lakitu.txt - Lakitu, Super Mario Brothers, Nintendo, 1985
    • +
    • mario.txt - Fire Mario, Super Mario Brothers, Nintendo, 1985
    • +
    • mspacman.txt - Ms. Pac-Man and Ghost, Ms. Pac-Man, Midway, 1982
    • +
    • paranaplant.txt - Piranha Plant, Super Mario Brothers, Nintendo, 1985
    • +
    • samus.txt - Samus Aran, Metroid, Nintendo/Intelligent Systems, 1986
    • +
    • toad.txt - Toad, Super Mario Brothers 2, Nintendo, 1987
    • +
    + + +

    The origin of the remaining files are described below:

    + +
      +
    • happyface.txt - Based on a smiley; rights unknown
    • +
    • snoo.txt - 8-bit version of Snoo, Reddit’s alien mascot
    • +
    + + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2013/birken/hint.text b/2013/birken/hint.text new file mode 100644 index 000000000..4e3047664 --- /dev/null +++ b/2013/birken/hint.text @@ -0,0 +1,261 @@ +# Best painting tool + +Michael Birken + + + + +## Judges' comments: +### To build: + + make birken + +### To run: + + ./birken < 17_columns_wide_paint_by_numbers_file + +### Try: + + ./birken < examples/ioccc.txt + + perl -e 'map{map{print int(rand()*8);}(0..16);print chr(10);}(0..30);' | tr '[0-4]' ' '| ./birken + +### Selected Judges Remarks: + +This program also wins the "Most amusing abuse of the iocccsize tool" award; although not the +absolute best: it is possible to achieve 0 by writing + + /* *\ + /.... + +The game of Tetris had been used in many endeavors, from studying [algorithmic complexity](http://arxiv.org/abs/cs/0210020) to [treating PTSD](http://www.livescience.com/19894-tetris-treat-ptsd-flashbacks.html). +Using it for painting by numbers looks like a novel idea. + + +## Author's comments: +### About This Document + +This document is best viewed as an HTML file in a browser that supports animated gifs. Extract `examples.tbz2` for the sample input files. + + tar -xjvf examples.tbz2 + +### Abstract + +By rotating, positioning and dropping a predetermined sequence of pieces, this program exploits the mechanics of Tetris to generate arbitrary images. + +### Algorithm Overview + +The algorithm converts pixels from a source image into squares in the Tetris playfield, one row at a time from the bottom up. To generate an individual square, the algorithm assembles a structure consisting of a rectangular region fully supported by a single square protruding from the bottom. When the rectangular region is completed, its rows are cleared, leaving behind the protruding square. Three examples of the process appear below. + +![](pen0.gif) + +![](pen1.gif) + +![](pen2.gif) + +During construction of a row, all of the squares produced by this method must be supported. In the images above, the generated squares are supported by the floor of the playfield. However, if an arbitrary row contains holes, it may not provide the support necessary for the construction of the row above it. The algorithm solves this problem by constructing a flat platform on top of the row with holes. In the animation below, a platform is built above a row comprising of a single red square. The platform is a temporary structure and inserting the final piece removes it. + +![](platform0.gif) + +Below, a row containing 5 red squares is deposited above a row containing 3 red squares. This is accomplished by building a flat platform on top of the lower row. The platform provides the support necessary to generate the 5 red squares. Finally, the platform is removed by inserting its final piece and the new row drops into place. Note, if the algorithm needed to generate the rows in the opposite order (a row of 3 red squares above a row of 5 red squares), a platform would not be necessary. + +![](platform1.gif) + +### Single Square Emitters + +For reference, the names of the 7 Tetriminos (the game pieces) appear in the table below. + +![](names.png) + +This algorithm was tailored specifically to render sprites from early video games. Those games packed graphics into 8×8 tiles where 2 bits were dedicated to each pixel. Consequentially, sprites usually contained only 3 colors plus transparent regions and they were typically sized either 16×16 or 16×32 pixels. + +The animation below depicts all the patterns used to emit single squares. J, T and L Tetriminos are used interchangeably within each pattern to produce the protruding square at the bottom. The algorithm assigns those Tetriminos to the 3 colors present in the sprite. The remaining Tetriminos are assigned arbitrary colors. And, all the colors remain constant during gameplay. + +![](pen4.gif) + +It is not possible to emit a square of all 3 colors in the first 2 and the last 2 columns due to the shapes of the 3 Tetriminos. As a result, the minimal width of a playfield to accommodate a 16 pixel wide sprite is 2 + 16 + 2 = 20 squares. However, it turns out that 20 is too small. + +As illustrated below, the region above the protruding square cannot exclusively consist of a single row because the only pieces that could fit, the I Tetriminos, are unsupported. + +![](pen5.gif) + +With 2 rows, the only means of spanning the full playfield width in a way that remains supported is to use S and Z Tetriminos. But, that will always leave holes in the upper row. + +![](pen6.gif) + +The minimal number of rows required above the protruding square is 3 and as shown repeatedly above, such patterns do exist. 20 squares is the minimal width required to fit a 16 pixel wide sprite. But, 20 × 3 + 1 = 61, which is not divisible by 4 and hence not constructible out of Tetriminos. However, a width of 21 yields 21 × 3 + 1 = 64, which can be built with 16 Tetriminos. That width actually enables the algorithm to render sprites up to 17 pixels wide. + +The original Tetris playfield is 10×20 squares, a 1:2 ratio. The program maintains that ratio by using a playfield of 21×42 squares. + +Since J, T and L Tetriminos are used interchangeably to produce the emitted square and 3 squares of those Tetriminos contribute to the row above it, there are 21 − 3 + 1 = 19 single square emitting patterns. However, due to mirror symmetry, there are really only 10 patterns. Clearing 3 rows works for the majority of them. But, an exhaustive computer search revealed that 2 of the patterns require more. The next possible option is 7 rows since 21 × 7 + 1 = 148, requiring 37 Tetriminos. As the images below show, those patterns do exist. + +![](pen7.gif) + +![](pen8.gif) + +### Platforms + +Before a row is constructed, the algorithm inspects the row below it. If the row below fails to provide support for all of the squares to be deposited above it, then a temporary platform is required. When that platform is removed, the new row will drop, leaving some of the squares apparently floating above empty space due to the way that gravity works in the original Tetris. + +The illustration below depicts the 10 platform patterns (really only 5 considering mirror symmetry). The construction of a platform begins by dropping a T Tetrimino on top one of the squares of the last generated row. The remaining Tetriminos support each other down to that first T. Meaning, as long as the previously generated row contains at least 1 square, like the red square below, then it is possible to construct a flat platform above it for the generation of the next row. + +![](platform2.gif) + +In the middle of platform construction, the bottom row gets completed and cleared, leaving 3 rows above it. The final J or L Tetrimino that will remove those rows is not inserted until the square emitters are done generating the next row of the sprite on top of the platform. That final piece precludes square emission in the first and last 2 columns. But, as discussed above, the square emitters are limited to the 17 inner columns due to the geometry of the J, T and L Tetriminos used in the process. + +Also, of the 19 possible ways to start constructing a platform on top of a T Tetrimino, only the 10 patterns shown above exist. + +### Program Input + +The input sprite is represented textually. Digit characters `0` to `7` correspond to pixels with colors from the palette below. + +![ANSI color palette](palette.png) + +As discussed above, sprites are limited to a maximum of 3 colors from this palette. + +All other characters are interpreted as transparent pixels. + +The maximum permissible size of the input text is 32 rows by 17 columns. Row length can vary as long as no single row exceeds 17 characters. + +Every row must contain at least one palette digit character. + +The `examples` directory contains several sprites in this textual format that can be fed into standard input. Several examples take advantage of the Tetris playfield background color. Instead of using character `0`, internal regions marked as transparent are effectively rendered as black. + +###Program Output + +The program conceptually uses Tetris as an output device similar to a line printer. It restricts itself to those operations that can be performed on the Tetris playfield: spawning, rotating, positioning and dropping Tetriminos. This process is visually represented using ANSI escape sequences. + +### ANSImation + +The rate at which the program plays Tetris is completely determined by the rate in which the terminal application receives and displays the ANSI escape sequences. + +To slowdown the output programmatically, introduce a delay immediately after the call to `fflush`. + +### IOCCC Size Tool Bug + +This program demonstrates how to exploit a bug in IOCCC size tool version 2013-07-30-v17. The first line of the program is reproduced below. + + char*_ = "'""/*"; + +If that line is added to the top of any program, the tool will report a size of 8. + + ./iocccsize -i < prog.c + 8 + + +When that line is deleted from this program, the tool properly reports the secondary size limit of the program as 2048. + + ./iocccsize -i < prog.c + 2048 + +Although this bug provides an easy means of circumventing contest rule 2, as demonstrated from the size value, this entry is not necessarily striving for a 'worst abuse of the rules' award. + +###Obfuscations + +This program is almost, but not quite, entirely unlike a demonstration of good programming practices. Contrary to other programs, an inspection of this one will certainly reveal that it possesses tea, not to mention an affinity for the constant 42. + +Variables are named and ordered to spell out, "Tetris", "ELORG", "DVK" and the aforementioned "Tea". ELORG is the abbreviation for Elektronorgtechnica, the former Soviet state owned computer organization that handled the worldwide Tetris intellectual property rights. DVK is the line of Soviet PDP-11-compatible personal computers capable of running Alexey Pajitnov's original 1984 Tetris prototype. + +Carefully selected variable names also yielded wonderful expressions like `l=0`, `O=0`, `O=1` and `while(O)`. "Tetris" also makes a second appearance of sorts: + + [T][e][t]--; while(R+i) { s + +The source is formatted to resemble the Tetris playfield midgame. It is also an homage to all the past IOCCC entries formatted as a compact block of text; the T, orientated appropriately to reflect its name and the first letter in the title of the game, is just a moment away from producing such a text block. + +Three tables are encoded as separate strings within the program: + +The first string stores the coordinates of the squares of the 19 distinct rotations of Tetriminos (see below). Since a Tetrimino is a chain of 4 squares, all Tetriminos fit within a 4×4 matrix. To determine the coordinates of the squares, the Tetrimino is pushed to the upper-left of the matrix. Each coordinate value requires 2 bits of storage. Consequentially, the four x-coordinates and the four y-coordinates were packed into separate octets. To convert the octets into valid ASCII characters, the squares were sorted such that the least significant bits stored the largest coordinate values. The results were offset by 35, the `#` character, which is 1 beyond the ASCII value of `"`, making it easier to pack into a string. None of the resultant values are beyond ASCII 127. The coordinates for all 19 rotations fit in a string of length 38. + +![](rotations.png) + +The second string stores the single square emitter patterns and the platform patterns. Each pattern is a sequence of pairs, { Tetrimino index, drop x-coordinate }. As mentioned, there are 19 distinct rotations, requiring 5 bits of storage for the Tetrimino index. Another 5 bits is required for the drop x-coordinate since there are 21 columns in the playfield. Necessarily, the pair is stored as 2 separate characters. By offsetting them by 40, the `(` character, the resultant string almost resembles a long and complex mathematical expression. The program takes advantage of mirror symmetry by only storing 10 single square emitter patterns and 5 platform patterns. The pattern lengths are not encoded within the string. Rather, they are embedded within the string decoding logic. + +The third string conceptually stores the default colors of the 19 rotations. A 3-bit value is assigned to each, covering the 7 possible colors. In addition, when a mirrored pattern is executed, J exchanges with L and S exchanges with Z, necessitating a second list of 3-bit color values. Pairs of color values (6 bits) fit comfortably into a character that is offset by `#`. The result is a string of length 19. + +The program is full of subtle obfuscations: + +* The unary decrement operator is used in conjunction with global variable automatic zero initialization to set variables to `-1`. + +* The boolean expression of the form, `x + 1`, is used multiple times to determine if a value is not `-1`. Similarly, expressions of the form `x - y` are used to determine if `x != y`. + +* Several arrays store unrelated data in segments throughout the array to reduce named variables. + +* The `x["..."]` trick appears once. + +* Variable `i` is less than necessary. + +* A cursorily glance at the expressions `4&&L` and `m&&e==m` suggests that they always evaluate to true. + +* The varying single square emitter pattern lengths are resolved during string decoding using the clever expression, `(i & 3) - 3`, which identifies pattern 3 and 7 as longer. + +* The file size of `prog.c` is a prime number. Deleting the first line also produces a prime-sized program. These properties do not qualify the program as a prime number generator. + +### Beyond Obfuscation + +Due to the contest code size constraint, some optimizations reluctantly had to be omitted. For example, multi-square emitters are possible: + +![](multi2.gif) + +![](multi3.gif) + +![](multi4.gif) + +![](multi5.gif) + +In fact, using dynamic programming and creative heuristics, real-time search is possible, enabling patterns like this: + +![](triple0.gif) + +And, even this: + +![](triple1.gif) + +In addition, it is possible to extend the algorithm to 6 colors instead of just 3. This is achieved using I, S and Z to produce the protruding square. A series of rectangular regions are constructed above those Tetriminos to erode them down to a single emitted square. + +The details of these enhancements are left as an exercise to the reader. + +### Example Files + +The following example files were created by the program author. They can be freely used and distributed. + +* `format.txt` - The layout of the program +* `helloworld.txt` - Hello World, Tetris-style +* `hilbert.txt` - A graphic based on the Hilbert curve +* `ioccc.txt` - IOCCC +* `landon.txt` - Portrait of a man with glasses +* `leo.txt` - Portrait of a man without glasses +* `rhino.txt` - A purple rhinoceros +* `simon.txt` - Portrait of a man without hair + +The following files are based on graphics from non-free, copyrighted video games. The use of a limited number of textual representations of the graphics for the demonstration of this program qualifies as fair use as such files do not significantly impede the right of the copyright holder to sell the copyrighted material and it is not being used to generate profit in this context. The origin of each file is detailed below (character, game, company, year). + +* `belmont.txt` - Simon Belmont, Castlevania, Konami, 1986 +* `bloober.txt` - Bloober, Super Mario Brothers, Nintendo, 1985 +* `bomberman.txt` - Bomberman, Bomberman, Hudson, 1983 +* `boo.txt` - Boo, Super Mario Brothers 3, Nintendo, 1988 +* `bub.txt` - Bub, Bubble Bobble, Taito, 1986 +* `cheepcheep.txt` - Cheep Cheep, Super Mario Brothers, Nintendo, 1985 +* `gurin.txt` - Gurin, Binary Land, Hudson, 1983 +* `koopaparatroopa.txt` - Koopa Paratroopa, Super Mario Brothers, Nintendo, 1985 +* `lakitu.txt` - Lakitu, Super Mario Brothers, Nintendo, 1985 +* `mario.txt` - Fire Mario, Super Mario Brothers, Nintendo, 1985 +* `mspacman.txt` - Ms. Pac-Man and Ghost, Ms. Pac-Man, Midway, 1982 +* `paranaplant.txt` - Piranha Plant, Super Mario Brothers, Nintendo, 1985 +* `samus.txt` - Samus Aran, Metroid, Nintendo/Intelligent Systems, 1986 +* `toad.txt` - Toad, Super Mario Brothers 2, Nintendo, 1987 + +The origin of the remaining files are described below: + +* `happyface.txt` - Based on a smiley; rights unknown +* `snoo.txt` - 8-bit version of Snoo, Reddit's alien mascot + + + +-------------------------------------------------------------------------------- + diff --git a/2013/birken/images.tbz2 b/2013/birken/images.tbz2 new file mode 100644 index 000000000..715057ba2 Binary files /dev/null and b/2013/birken/images.tbz2 differ diff --git a/2013/birken/multi2.gif b/2013/birken/multi2.gif new file mode 100644 index 000000000..2d6429ac3 Binary files /dev/null and b/2013/birken/multi2.gif differ diff --git a/2013/birken/multi3.gif b/2013/birken/multi3.gif new file mode 100644 index 000000000..6db9adf0b Binary files /dev/null and b/2013/birken/multi3.gif differ diff --git a/2013/birken/multi4.gif b/2013/birken/multi4.gif new file mode 100644 index 000000000..5a919b890 Binary files /dev/null and b/2013/birken/multi4.gif differ diff --git a/2013/birken/multi5.gif b/2013/birken/multi5.gif new file mode 100644 index 000000000..74bfbe0e1 Binary files /dev/null and b/2013/birken/multi5.gif differ diff --git a/2013/birken/names.png b/2013/birken/names.png new file mode 100644 index 000000000..b7556c8db Binary files /dev/null and b/2013/birken/names.png differ diff --git a/2013/birken/palette.png b/2013/birken/palette.png new file mode 100644 index 000000000..ad6746604 Binary files /dev/null and b/2013/birken/palette.png differ diff --git a/2013/birken/pen0.gif b/2013/birken/pen0.gif new file mode 100644 index 000000000..11ad69440 Binary files /dev/null and b/2013/birken/pen0.gif differ diff --git a/2013/birken/pen1.gif b/2013/birken/pen1.gif new file mode 100644 index 000000000..c73918795 Binary files /dev/null and b/2013/birken/pen1.gif differ diff --git a/2013/birken/pen2.gif b/2013/birken/pen2.gif new file mode 100644 index 000000000..075e78e16 Binary files /dev/null and b/2013/birken/pen2.gif differ diff --git a/2013/birken/pen4.gif b/2013/birken/pen4.gif new file mode 100644 index 000000000..3bda04083 Binary files /dev/null and b/2013/birken/pen4.gif differ diff --git a/2013/birken/pen5.gif b/2013/birken/pen5.gif new file mode 100644 index 000000000..435a8d8de Binary files /dev/null and b/2013/birken/pen5.gif differ diff --git a/2013/birken/pen6.gif b/2013/birken/pen6.gif new file mode 100644 index 000000000..fa455b239 Binary files /dev/null and b/2013/birken/pen6.gif differ diff --git a/2013/birken/pen7.gif b/2013/birken/pen7.gif new file mode 100644 index 000000000..ad4d4dc12 Binary files /dev/null and b/2013/birken/pen7.gif differ diff --git a/2013/birken/pen8.gif b/2013/birken/pen8.gif new file mode 100644 index 000000000..8da0f3b9c Binary files /dev/null and b/2013/birken/pen8.gif differ diff --git a/2013/birken/platform0.gif b/2013/birken/platform0.gif new file mode 100644 index 000000000..0184e2c76 Binary files /dev/null and b/2013/birken/platform0.gif differ diff --git a/2013/birken/platform1.gif b/2013/birken/platform1.gif new file mode 100644 index 000000000..a7fafadb5 Binary files /dev/null and b/2013/birken/platform1.gif differ diff --git a/2013/birken/platform2.gif b/2013/birken/platform2.gif new file mode 100644 index 000000000..2cb4de128 Binary files /dev/null and b/2013/birken/platform2.gif differ diff --git a/2013/birken/rotations.png b/2013/birken/rotations.png new file mode 100644 index 000000000..2b2f14021 Binary files /dev/null and b/2013/birken/rotations.png differ diff --git a/2013/birken/triple0.gif b/2013/birken/triple0.gif new file mode 100644 index 000000000..b6b0b31c1 Binary files /dev/null and b/2013/birken/triple0.gif differ diff --git a/2013/birken/triple1.gif b/2013/birken/triple1.gif new file mode 100644 index 000000000..9656b05a2 Binary files /dev/null and b/2013/birken/triple1.gif differ diff --git a/2013/cable1/Makefile b/2013/cable1/Makefile new file mode 100644 index 000000000..5f90be402 --- /dev/null +++ b/2013/cable1/Makefile @@ -0,0 +1,202 @@ +#!/usr/bin/env make +# +# 2013 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -W -Wno-implicit-int -Wno-implicit-function-declaration +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${LIBS} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= cable1 +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Lehmer!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "Park different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Paul Erdos!"; \ + fi + @${TRUE} diff --git a/2013/cable1/cable1.c b/2013/cable1/cable1.c new file mode 100644 index 000000000..002593584 --- /dev/null +++ b/2013/cable1/cable1.c @@ -0,0 +1 @@ +main(int riguing,char**acters){puts(1[acters-~!(*(int*)1[acters]%4796%275%riguing)]);} diff --git a/2013/cable1/hint.html b/2013/cable1/hint.html new file mode 100644 index 000000000..123a21c2b --- /dev/null +++ b/2013/cable1/hint.html @@ -0,0 +1,129 @@ + + + + + + + Most partisan 1-liner + + +

    Most partisan 1-liner

    + +

    Adrian Cable
    +adrian.cable@gmail.com

    + +

    Judges' comments:

    + +

    To build:

    + +
    make cable1
    +
    + +

    To run:

    + +
    ./cable1 name group1 group2
    +
    + +

    Try:

    + +
    ./cable1 obama republican democrat
    +./cable1 nixon republican democrat
    +./cable1 bush republican democrat
    +./cable1 kennedy republican democrat
    +./cable1 lincoln republican democrat
    +
    + +

    Selected Judges Remarks:

    + +

    Partisan may be defined as a strong supporter of a cause, party or person. +We need not limit ourselves to the two major political parties in the US today.

    + +

    Let us consider:

    + +
    ./cable1 Cooper Mac PC
    +
    + +

    Simon works for Apple, so would would expect Mac. :-) +Landon is a long time Mac user:

    + +
    ./cable1 Noll Mac PC
    +
    + +

    That works too!. Now Leo brings PCs to the IOCCC judging for cross-platform +testing:

    + +
    ./cable1 Broukhis Mac PC
    +
    + +

    We can test other people. The late Steve Jobs:

    + +
    ./cable1 Jobs Mac PC
    +
    + +

    That works! How about Bill?

    + +
    ./cable1 Gates Mac PC
    +
    + +

    A PC guy as expected. What about that other Steve?

    + +
    ./cable1 Ballmer Mac PC
    +
    + +

    Humm .. maybe there is a hidden reason he is leaving the late Micro$oft? :-) +Why late? See this tweet.

    + +

    So how does a one line C source know so much? Hint: it doesn’t.

    + +

    Author’s comments:

    + +

    Presidents of the United States of America!

    + +

    Politics is full of memorable one-liners. Without wishing to misunderestimate the taste of the judges, nor prejudge the past, the author hopes you enjoy this contribution to the genre.

    + +

    This one-line C program accepts as a first command-line argument the last name of any of the last 31 US Presidents (from Franklin Pierce onwards), in lower case, and prints out their political affiliation.

    + +

    Use “republican” as the 2nd command-line argument, and “democrat” as the 3rd (or equivalent strings of your choice).

    + +

    Why is this entry obfuscated/interesting?

    + +
      +
    • The program looks up the name supplied on the command line against a list of Presidents' names, and matches names to political affiliations using a look-up table. But where in the source is the list of names, and where is the look-up table?
    • +
    + + +

    Notes

    + +
      +
    • For Theodore Roosevelt, use: ./cable1 roosevelt republican democrat
    • +
    • But, for Franklin D Roosevelt, use: ./cable1 fdr republican democrat
    • +
    • This program needs a little endian CPU to work properly.
    • +
    + + +

    Compiler warnings

    + +

    clang warns about a missing type specifier for main, and that implicit function declarations are invalid in C99 (but still accepts them).

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2013/cable1/hint.text b/2013/cable1/hint.text new file mode 100644 index 000000000..42308851f --- /dev/null +++ b/2013/cable1/hint.text @@ -0,0 +1,94 @@ +# Most partisan 1-liner + +Adrian Cable + + + +## Judges' comments: +### To build: + + make cable1 + +### To run: + + ./cable1 name group1 group2 + +### Try: + + ./cable1 obama republican democrat + ./cable1 nixon republican democrat + ./cable1 bush republican democrat + ./cable1 kennedy republican democrat + ./cable1 lincoln republican democrat + +### Selected Judges Remarks: + +Partisan may be defined as a strong supporter of a cause, party or person. +We need not limit ourselves to the two major political parties in the US today. + +Let us consider: + + ./cable1 Cooper Mac PC + +Simon works for Apple, so would would expect Mac. :-) +Landon is a long time Mac user: + + ./cable1 Noll Mac PC + +That works too!. Now Leo brings PCs to the IOCCC judging for cross-platform +testing: + + ./cable1 Broukhis Mac PC + +We can test other people. The late Steve Jobs: + + ./cable1 Jobs Mac PC + +That works! How about Bill? + + ./cable1 Gates Mac PC + +A PC guy as expected. What about that other Steve? + + ./cable1 Ballmer Mac PC + +Humm .. maybe there is a hidden reason he is leaving the late Micro$oft? :-) +Why late? See [this tweet](https://twitter.com/landonnoll/status/401582967123742720). + +So how does a one line C source know so much? Hint: it doesn't. + +## Author's comments: +Presidents of the United States of America! +=========================================== + +Politics is full of memorable one-liners. Without wishing to misunderestimate the taste of the judges, nor prejudge the past, the author hopes you enjoy this contribution to the genre. + +This one-line C program accepts as a first command-line argument the last name of any of the last 31 US Presidents (from Franklin Pierce onwards), in lower case, and prints out their political affiliation. + +Use "republican" as the 2nd command-line argument, and "democrat" as the 3rd (or equivalent strings of your choice). + +Why is this entry obfuscated/interesting? +----------------------------------------- + +- The program looks up the name supplied on the command line against a list of Presidents' names, and matches names to political affiliations using a look-up table. But where in the source is the list of names, and where is the look-up table? + +Notes +----- + +- For Theodore Roosevelt, use: ./cable1 roosevelt republican democrat +- But, for Franklin D Roosevelt, use: ./cable1 fdr republican democrat +- This program needs a little endian CPU to work properly. + +Compiler warnings +----------------- + +clang warns about a missing type specifier for main, and that implicit function declarations are invalid in C99 (but still accepts them). + +-------------------------------------------------------------------------------- + diff --git a/2013/cable2/Makefile b/2013/cable2/Makefile new file mode 100644 index 000000000..f93851054 --- /dev/null +++ b/2013/cable2/Makefile @@ -0,0 +1,208 @@ +#!/usr/bin/env make +# +# 2013 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -Wno-bitwise-op-parentheses -Wno-unsequenced \ + -Wno-incompatible-pointer-types -Wno-shift-op-parentheses \ + -Wno-empty-body -Wno-parentheses -Wno-int-conversion \ + -Wno-implicit-int +#CWARN= -Wall -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= cable2 +DATA= example-images.tbz2 +BUILT_DATA= ascii.bmp bonus.bmp hello_world.bmp mixed_sizes.bmp multi_color.bmp typeset.bmp +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} data + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @echo extracting sample bmp files + ${TAR} -jxvf ${DATA} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + ${RM} -f ${BUILT_DATA} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Lehmer!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "Park different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Paul Erdos!"; \ + fi + @${TRUE} diff --git a/2013/cable2/cable2.c b/2013/cable2/cable2.c new file mode 100644 index 000000000..d33707f81 --- /dev/null +++ b/2013/cable2/cable2.c @@ -0,0 +1,77 @@ + #include\ + // + #define Y(\ + _)_##char + #define \ + _ [9<<9], + #define j\ + L;fread(&\ + L,4,1,f);u + #define P\ + &4**(int*\ + )" ")% \ + 3901%31/// + #define q\ + Z[F++]=*E + #define $\ + for("IOCCC" + #include\ + + + + + + + + + + + +int *Q,u,i,c,k,B,r=0,w,n,F=0,x,J,u,m,p,s=0,v,e,r,L,a,z,y,D,o,g; Y( )* + Z= "Vn" + "-S" "xR9Q" "[$s" +"Zd&o+" "pf^cM" "cbac\ +J_VHMF_" "BkaEg^" "x`i_i\ +us%d]oWG:" "r`IZ.6_]H3ec]_\ +bWW_^Ej2i[r" "ZZnJjW[bK`hZakb\ +_l]gL3X]d_#$eK" "[G3 d[Xe][:V`4Z]Z" "VfX^]V:X%b]N,ma-j" +"^m57c!`O.qP8lTc^" "gm,Um;m`m^^`5n_ncim#_mdp" + "h/codZ#i`,''mbb(fh" ")h)(^uV9b7dcZq`^d`/*3`#ko`lj;^idad/]0ffxP*]??bff$h`@(Zgtcn" + "k10t0q;]^7p`q*AtqC1j,'#_on tp" + "on e !1+tA6`db`qciq`'=?ui]'`_`dk`!kx_%]bu]cZX8u_)Z=8@ghg$mlp`a>D_o2_eb)sb)sa0g@f-h" + "1bl_DeblFsa&Dt^t4*X *mCC^5Y",M _ A _ G _ I _ C _ K[]="',b}q}a9\"],)'(cDDJr4" + "Ab,:sdtd/E*#2eXkZ7cPthkq`(stnhct!a:>A;A+jA9>A;A+js",*E=I;FILE*f;main + (int d,Y()**t){$;!t;s=c=-D){$,t=v=D?k:J;v++-d;){$,o=L=z=0,s=D?J:k;s+++d + -B-F;)(o&&(e=m),y=*Q!=(m=Q[u*i+(D?v-u*s:s-u*v)]))^o&&(G[z++]=s-L>20,L=s,o=y);$, + s=z,o=0;s--;o+=G[s]^s[A]);$;z^w||o;z=w){$,o=1;o&&!--o*D-~-~-w|1[A]|v-a>28&&w^4|1[A]| + 3[A]|!2[A ]|v-a>5;)$;I[g[I]=2,++g]=-1,-s(s=I + [v ])&4> + 19,1,f));$;F++0&&(M + [x]=s));$; ++c^L;M[c] + >s&&(s=M[ x=c]));$; + 3^d||printf (K+--o,( + *Q P,(e P), D*!(c+~x); + w++)$,o= '~';-~o;)$ + [w]Y(^-- o||put)(D= + o);0;);c =Y(~o&&! + put)(*K+ x);}}}}} \ No newline at end of file diff --git a/2013/cable2/example-images.tbz2 b/2013/cable2/example-images.tbz2 new file mode 100644 index 000000000..c67d5e28e Binary files /dev/null and b/2013/cable2/example-images.tbz2 differ diff --git a/2013/cable2/hint.html b/2013/cable2/hint.html new file mode 100644 index 000000000..7ae2ed56f --- /dev/null +++ b/2013/cable2/hint.html @@ -0,0 +1,153 @@ + + + + + + + Best of show + + +

    Best of show

    + +

    Adrian Cable
    +adrian.cable@gmail.com

    + +

    Judges' comments:

    + +

    To build:

    + +
    make cable2
    +
    + +

    To run:

    + +
    ./cable2 file.bmp [color]
    +
    + +

    Try:

    + +

    Extract example-images.tbz2:

    + +
    make data
    +
    + +

    Here is an OCR example that shows all 94 supported ASCII characters:

    + +
    ./cable2 ascii.bmp
    +
    + +

    Here is an example of colored ASCII:

    + +
    ./cable2 multi_color.bmp color
    +
    + +

    Here is an example using different character sizes and different +positions in the same file:

    + +
    ./cable2 mixed_sizes.bmp
    +
    + +

    How about about hand-written C code:

    + +
    ./cable2 hello_world.bmp | gcc -xc -o hello -
    +./hello
    +
    + +

    Sometimes typeset text will work, if the typeset has characters that +are enough to the supported handwritten shapes. For example, +Menlo, 160 pt:

    + +
    ./cable2 typeset.bmp
    +
    + +

    And as an added IOCCC bonus: :-)

    + +
    ./cable2 bonus.bmp
    +
    + +

    Selected Judges Remarks:

    + +

    We can confirm that this is the first time the IOCCC has been used +to peer-review a new research. We had quite a bit of fun with a sharpie and a +scanner.

    + +

    Author’s comments:

    + +

    OCR - Obfuscated Character Recognition of Handwritten Text

    + +

    This entry takes a BMP image file of hand-drawn (mouse-drawn?) text, specified as the first command-line parameter, and converts it to an ASCII text document. Magic!

    + +

    BMP files created by most paint programs should work. The author recommends Paint.NET.

    + +

    Features

    + +
      +
    • Every printable ASCII character is recognized (94 characters plus space), plus a special bonus character.
    • +
    • Input images can be any size (limited only by memory), containing any number of lines of text.
    • +
    • BMP is really a mess of different formats, but the program supports most of them from Windows 3.1 and later.
    • +
    • Hand-drawn characters in the input image can be variably spaced and positioned and be of any width or height, but the bigger the better for accurate recognition (300 pixels tall or more is recommended). Characters must be drawn with a stroke width of around 9 pixels, and separated from adjacent characters. (In Paint.NET a brush of width 9 works well, with anti-aliasing turned off.)
    • +
    • You can use any colors you like for the text and background, even different colors for different text characters.
    • +
    • If “color” is specified as the second command line parameter, the program’s output will also be in color, on ANSI/VTxxx terminals.
    • +
    + + +

    Why is this entry obfuscated/interesting?

    + +
      +
    • The source is presented as a beautiful moonlit scene, in which a quick brown fox jumps over a lazy dog. Far too often in software development is aesthetic nuance lost in the name of serious-sounding conventions like “GNU style”, but not here.
    • +
    • Newcomers to C find it hard to learn all those different ways to control flow: for, while, if, do, goto, continue, break and heaven knows what else! So, in this program we only use for, so absolute beginners can get into the code straight away.
    • +
    • To teach newcomers all the important features of C, we demonstrate the importance of the liberal use of short circuits, sequence points, the ternary operator, using xy or x-y instead of x!=y, using ~x in place of x!=-1 for conciseness, mixing x[y] and y[x] for variety, educational #define’s, and so on.
    • +
    • main is the most useful function in all of C - so it is a mystery to the author why most programs use it only once. Here we use it over and over for maximum benefit.
    • +
    • The number 42 is featured in the source to provide an answer to the judges' deeper questions.
    • +
    • How are character colors converted from RGB in the input image to ANSI escape sequences? Clue: the weird macro P does the interesting part of it, but how?
    • +
    • The program prints a string when the bonus character is detected. How does it do this? Clue: the string to print is defined in the macro $, but how can a string defined in that way ever get printed?
    • +
    + + +

    Other notes

    + +
      +
    • The novel character recognition algorithm used has not been previously published and was developed by the author specifically for the contest. Should this entry win the IOCCC, it will be the first time (to the author’s knowledge) that the IOCCC has been used for peer review/publication of original research.
    • +
    • OCR in general is a hard problem. Here, we only recognise one possible form for each character. You can see what the supported character shapes look like by looking at the examples in ascii.bmp. If you copy the shape of the character forms you find in there, recognition accuracy should be very good (95%+). A more “useful” version would extend the character stroke table to support multiple different commonly-used forms for each character.
    • +
    • Despite being the largest possible IOCCC entry at 4096 bytes, it is also probably the smallest general-purpose OCR program ever written (including the character stroke data), maybe by several orders of magnitude.
    • +
    • The author used an interesting compression algorithm (suggested by Gareth McCaughan - thank you!) to squeeze the character stroke table (containing around 2000 strokes for the whole ASCII character set) into a string constant of just 472 characters.
    • +
    + + +

    Bugs/features

    + +
      +
    • The width of input images must be a multiple of 4.
    • +
    • Input images can be 8-bit grayscale, 24-bit color or 32-bit color only. 8-bit color and 16-bit color are not supported. If you use the “color” command-line feature, do not use a grayscale input file!
    • +
    • Normal Windows BMP files are stored “upside-down”, i.e. the bottom line in the image is written first. Some (old) graphics programs actually write BMP files “top-to-bottom” and the program does not support such files.
    • +
    • Using antialiased brush strokes to draw your letters is fine, however, antialiasing interferes with color detection in “color” mode.
    • +
    • Only runs on little endian machines (since the BMP format is little endian, and endianness conversion would make the source too large for IOCCC rule 2).
    • +
    + + +

    Compiler warnings

    + +

    clang warns about unused expression results, missing type specifiers, and incompatible pointer conversions - all just a fun consequence of the obfuscations.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2013/cable2/hint.text b/2013/cable2/hint.text new file mode 100644 index 000000000..8b00f2bf0 --- /dev/null +++ b/2013/cable2/hint.text @@ -0,0 +1,114 @@ +# Best of show + +Adrian Cable + + + +## Judges' comments: +### To build: + + make cable2 + +### To run: + + ./cable2 file.bmp [color] + +### Try: + +Extract example-images.tbz2: + + make data + +Here is an OCR example that shows all 94 supported ASCII characters: + + ./cable2 ascii.bmp + +Here is an example of colored ASCII: + + ./cable2 multi_color.bmp color + +Here is an example using different character sizes and different +positions in the same file: + + ./cable2 mixed_sizes.bmp + +How about about hand-written C code: + + ./cable2 hello_world.bmp | gcc -xc -o hello - + ./hello + +Sometimes typeset text will work, if the typeset has characters that +are enough to the supported handwritten shapes. For example, +Menlo, 160 pt: + + ./cable2 typeset.bmp + +And as an added IOCCC bonus: :-) + + ./cable2 bonus.bmp + +### Selected Judges Remarks: + +We can confirm that this is the first time the IOCCC has been used +to peer-review a new research. We had quite a bit of fun with a sharpie and a +scanner. + +## Author's comments: +OCR - Obfuscated Character Recognition of Handwritten Text +========================================================== + +This entry takes a BMP image file of hand-drawn (mouse-drawn?) text, specified as the first command-line parameter, and converts it to an ASCII text document. Magic! + +BMP files created by most paint programs should work. The author recommends Paint.NET. + +Features +-------- + +- Every printable ASCII character is recognized (94 characters plus space), plus a special bonus character. +- Input images can be any size (limited only by memory), containing any number of lines of text. +- BMP is really a mess of different formats, but the program supports most of them from Windows 3.1 and later. +- Hand-drawn characters in the input image can be variably spaced and positioned and be of any width or height, but the bigger the better for accurate recognition (300 pixels tall or more is recommended). Characters must be drawn with a stroke width of around 9 pixels, and separated from adjacent characters. (In Paint.NET a brush of width 9 works well, with anti-aliasing turned off.) +- You can use any colors you like for the text and background, even different colors for different text characters. +- If "color" is specified as the second command line parameter, the program's output will also be in color, on ANSI/VTxxx terminals. + +Why is this entry obfuscated/interesting? +----------------------------------------- + +- The source is presented as a beautiful moonlit scene, in which a quick brown fox jumps over a lazy dog. Far too often in software development is aesthetic nuance lost in the name of serious-sounding conventions like "GNU style", but not here. +- Newcomers to C find it hard to learn all those different ways to control flow: for, while, if, do, goto, continue, break and heaven knows what else! So, in this program we only use for, so absolute beginners can get into the code straight away. +- To teach newcomers all the important features of C, we demonstrate the importance of the liberal use of short circuits, sequence points, the ternary operator, using x^y or x-y instead of x!=y, using ~x in place of x!=-1 for conciseness, mixing x[y] and y[x] for variety, educational #define's, and so on. +- main is the most useful function in all of C - so it is a mystery to the author why most programs use it only once. Here we use it over and over for maximum benefit. +- The number 42 is featured in the source to provide an answer to the judges' deeper questions. +- How are character colors converted from RGB in the input image to ANSI escape sequences? Clue: the weird macro P does the interesting part of it, but how? +- The program prints a string when the bonus character is detected. How does it do this? Clue: the string to print is defined in the macro $, but how can a string defined in that way ever get printed? + +Other notes +----------- + +- The novel character recognition algorithm used has not been previously published and was developed by the author specifically for the contest. Should this entry win the IOCCC, it will be the first time (to the author's knowledge) that the IOCCC has been used for peer review/publication of original research. +- OCR in general is a hard problem. Here, we only recognise one possible form for each character. You can see what the supported character shapes look like by looking at the examples in ascii.bmp. If you copy the shape of the character forms you find in there, recognition accuracy should be very good (95%+). A more "useful" version would extend the character stroke table to support multiple different commonly-used forms for each character. +- Despite being the largest possible IOCCC entry at 4096 bytes, it is also probably the smallest general-purpose OCR program ever written (including the character stroke data), maybe by several orders of magnitude. +- The author used an interesting compression algorithm (suggested by Gareth McCaughan - thank you!) to squeeze the character stroke table (containing around 2000 strokes for the whole ASCII character set) into a string constant of just 472 characters. + +Bugs/features +------------- + +- The width of input images must be a multiple of 4. +- Input images can be 8-bit grayscale, 24-bit color or 32-bit color only. 8-bit color and 16-bit color are not supported. If you use the "color" command-line feature, do not use a grayscale input file! +- Normal Windows BMP files are stored "upside-down", i.e. the bottom line in the image is written first. Some (old) graphics programs actually write BMP files "top-to-bottom" and the program does not support such files. +- Using antialiased brush strokes to draw your letters is fine, however, antialiasing interferes with color detection in "color" mode. +- Only runs on little endian machines (since the BMP format is little endian, and endianness conversion would make the source too large for IOCCC rule 2). + +Compiler warnings +----------------- + +clang warns about unused expression results, missing type specifiers, and incompatible pointer conversions - all just a fun consequence of the obfuscations. + +-------------------------------------------------------------------------------- + diff --git a/2013/cable3/Makefile b/2013/cable3/Makefile new file mode 100644 index 000000000..9ce844236 --- /dev/null +++ b/2013/cable3/Makefile @@ -0,0 +1,208 @@ +#!/usr/bin/env make +# +# 2013 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -Wno-implicit-int -Wno-implicit-function-declaration \ + -Wno-return-type -Wno-unsequenced -Wno-shift-op-parentheses \ + -Wno-conditional-type-mismatch -Wno-parentheses \ + -Wno-incompatible-pointer-types +#CWARN= -Wall -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 -fsigned-char + +# Libraries needed to build +# +LIBS=`sdl-config --cflags --libs` + +# Defines +DEFS=-DKB='(kb=read(H(8),r+1190,1))&&H(7)' + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${DEFS} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= cable3 +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Lehmer!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "Park different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Paul Erdos!"; \ + fi + @${TRUE} diff --git a/2013/cable3/bios b/2013/cable3/bios new file mode 100644 index 000000000..f7bc6b6a6 Binary files /dev/null and b/2013/cable3/bios differ diff --git a/2013/cable3/cable3.c b/2013/cable3/cable3.c new file mode 100644 index 000000000..44a680f3f --- /dev/null +++ b/2013/cable3/cable3.c @@ -0,0 +1,28 @@ +#include "SDL.h" + +#define $ for(O=9 +#define CX M+=(T%3+2*!(!T*t-6)) +#define x ,A=4*!T,O=t,W=h=T<3?u(Q?p:D(A+3),D(A),D(A+1)[i]+D(A+2)*g+):K(t),U=V=K(a),o?U=h,W=V:V, +#define C 8*-~L +#define Z short +#define y a(Z)Y[++O] +#define B ),a--||( +#define _ ),e--||( + +#define V(I,D,E)(O=a(I)h[r])&&!(A=(D)(V=(1[E+L]<<16)+*i)/O,A-(I)A)?1[E+L]=V-O*(*E=A):H(0) +#define i(B,M)B(o){return M;} +#define R(O,M,_)(S=L?a(I Z)O:O,N=L?a(I Z)O M(f=a(I Z)_):(O M(f=a(I n)_))) +#define T(_)R(r[u(10,L=4,--)],=,_) +#define u(a,r,T)16*i[a]+(I Z)(T i[r]) +#define a(_)*(_*)& +#define L(_)M(W,_,U) + +#define M(S,F,T)R(r[S],F,r[T]) +#define A(_)(i[L=4]+=2,R(_,=,r[u(10,4,-2+)])) +#define c(R,T)(1[u=19,L+T]=(N=a(R)h[r]*(R)*T)>>16,*i=N,G(F(N-(R)N))) +#define h(_)(1&(L?a(Z)_:_)>>C-1) +#define I unsigned +#define n char +#define e(_)v(F(40[L(_##=40[E]+),E]&N==S|_ N<_(int)S)) + +I n t,e,l[80186],*E,m,u,L,a,T,o,r[1<<21],X,*Y,b,Q,R;I Z*i,M,p,q=3;I*localtime(),f,S,kb,h,W,U,c,g,d,V,A;N,O,P=983040,j[5];SDL_Surface*k;i(F,40[E]=!!o)i(z,42[E]=!!o)i(D,r[a(I)E[259+4*o]+O])i(w,i[o]+=~(-2*47[E])*~L)i(v,G(N-S&&1&(40[z((f^=S^N)&16),E]^f>>C-1)))J(){V=61442;$;O--;)V+=40[E+O]<9|42[E])),*E&=15))i(SP,(w(7),R&&--1[i]&&o?R++,Q&&Q++,M--:0))DX(){$,O*=27840;O--;)O[(I*)k->pixels]=-!!(1<<7-O%8&r[O/2880*90+O%720/8+(88+952[l]/128*4+O/720%4<<13)]);SDL_Flip(k);}main(BX,nE)n**nE;{9[i=E=r+P]=P>>4;$;q;)j[--q]=*++nE?open(*nE,32898):0;read(2[a(I)*i=*j?lseek(*j,0,2)>>9:0,j],E+(M=256),P);$;Y=r+16*9[i]+M,Y-r;Q|R||kb&46[E]&&KB)--64[T=1[O=32[L=(X=*Y&7)&1,o=X/2&1,l]=0,t=(c=y)&7,a=c/8&7,Y]>>6,g=~-T?y:(n)y,d=BX=y,l],!T*t-6&&T-2?T-1?d=g:0:(d=y),Q&&Q--,R&&R--x(O=*Y,O=u=D(51),e=D(8),m=D(14)_ O=*Y/2&7,M+=(n)c*(L^(D(m)[E]|D(22)[E]|D(23)[E]^D(24)[E]))_ L=*Y&8,R(K(X)[r],=,c)_ L=e+=3,o=0,a=X x a=m _ T(X[i])_ A(X[i])_ a<2?M(U,+=1-2*a+,P+24),v(f=1),G(S+1-a==1<S)B L?c(I Z,i):c(I n,E)B/**/L?c(Z,i):c(n,E)B L?V(I Z,I,i):V(I n,I Z,E)B L?V(Z,int,i):V(n,Z,E))_++e,h=P,d=c,T=3,a=m,M--_++e,13[W=h,i]=(o|=!L)?(n)d:d,U=P+26,M-=~!o,u=17+(m=a)_(a=m B L(+=),F(NS)B L(^=)B L(-),F(N>S)B L(=))_!L?L=a+=8 x L(=):!o?Q=1,R(r[p=m x V],=,h):A(h[r])_ T=a=0,t=6,g=c x M(U,=,W)_(A=h(h[r]),V=m?++M,(n)g:o?31&2[E]:1)&&(a<4?V%=a/2+C,R(A,=,h[r]):0,a&1?R(h[r],>>=,V):R(h[r],<<=,V),a>3?u=19:0,a<5?0:F(S>>V-1&1)B R(h[r],+=,A>>C-V),G(h(N)^F(N&1))B A&=(1<>1+C-V),G(h(N)^F(A&1<>V)))_(V=!!--1[a=X,i]B V&=!m[E]B V&=m[E]B 0 B V=!++1[i]),M+=V*(n)c _ M+=3-o,L?0:o?9[M=0,i]=BX:T(M),M+=o*L?(n)c:c _ M(U,&,W)_ L=e+=8,W=P,U=K(X)_!R||1[i]?M(m<2?u(8,7,):P,=,m&1?P:u(Q?p:11,6,)),m&1||w(6),m&2||SP(1):0 _!R||1[i]?M(m?P:u(Q?p:11,6,),-,u(8,7,)),43[u=92,E]=!N,F(N>S),m||w(6),SP(!N==b):0 _ o=L,A(M),m&&A(9[i]),m&2?s(A(V)):o||(4[i]+=c)_ R(U[r],=,d)_ 986[l]^=9,R(*E,=,l[m?2[i]:(n)c])_ R(l[m?2[i]:(n)c],=,*E)_ R=2,b=L,Q&&Q++_ W-U?L(^=),M(U,^=,W),L(^=):0 _ T(m[i])_ A(m[i])_ Q=2,p=m,R&&R++_ L=0,O=*E,F(D(m+=3*42[E]+6*40[E])),z(D(1+m)),N=*E=D(m-1)_ N=BP(m-1)_ 1[E]=-h(*E)_ 2[i]=-h(*i)_ 9[T(9[i]),T(M+5),i]=BX,M=c _ J(),T(V)_ s(A(V))_ J(),s((V&~m)+1[E])_ J(),1[E]=V _ L=o=1 x L(=),M(P+m,=,h+2)_++M,H(3)_ M+=2,H(c&m)_++M,m[E]&&H(4)_(c&=m)?1[E]=*E/c,N=*E%=c:H(0)_*i=N=m&E[L=0]+c*1[E]_*E=-m[E]_*E=r[u(Q?p:m,3,*E+)]_ m[E]^=1 _ E[m/2]=m&1 _ R(*E,&,c)_(a=c B write(1,E,1)B time(j+3),memcpy(r+u(8,3,),localtime(j+3),m)),a<2?*E=~lseek(O=4[E][j],a(I)5[i]<<9,0)?((I(*)())(a?write:read))(O,r+u(8,3,),*i):0:0),O=u,D(16)?v(0):D(17)&&G(F(0)),CX*D(20)+D(18)-D(19)*~!!L,D(15)?O=m=N,41[43[44[E]=h(N),E]=!N,E]=D(50):0,!++q?kb=1,*l?SDL_PumpEvents(),k=k?k:SDL_SetVideoMode(720,348,32,0),DX():k?SDL_Quit(),k=0:0:0;}i(G,48[E]=o)i(K,P+(L?2*o:2*o+o/4&7)) diff --git a/2013/cable3/fd.img b/2013/cable3/fd.img new file mode 100644 index 000000000..37a4b3399 Binary files /dev/null and b/2013/cable3/fd.img differ diff --git a/2013/cable3/hint.html b/2013/cable3/hint.html new file mode 100644 index 000000000..999cf6e23 --- /dev/null +++ b/2013/cable3/hint.html @@ -0,0 +1,272 @@ + + + + + + + Largest small system emulator + + +

    Largest small system emulator

    + +

    Adrian Cable
    +adrian.cable@gmail.com

    + +

    Judges' comments:

    + +

    To build:

    + +
    make cable3
    +
    + +

    To run:

    + +
    ./cable3 bios-image-file floppy-image-file [harddisk-image-file]
    +
    + +

    Try:

    + +
    ./runme
    +
    + +

    Selected Judges Remarks:

    + +

    This entry weighs in at a magical 4043 bytes (8086 nibbles, 28,301 +bits). It manages to implement most of the hardware in a 1980’s era +IBM-PC using a few hundred fewer bits than the total number of +transistors used to implement the original 8086 CPU.

    + +

    If you are using OS X, the included sc-ioccc.terminal configuration file will +correctly display console applications that use ANSI graphics.

    + +

    Update: This entry now has its own web page http://www.megalith.co.uk/8086tiny

    + +

    Author’s comments:

    + +

    A tiny but highly functional PC emulator/virtual machine

    + +

    The author hereby presents, for the delectation (?) of the judges, a portable PC emulator/VM written specifically for the IOCCC which runs DOS, Windows 3.0, Excel, MS Flight Simulator, AutoCAD, Lotus 1-2-3 …

    + +

    In just 4043 bytes of C source, you get a complete mid-late 1980s-era IBM-compatible PC, consisting of:

    + +
      +
    • Intel 8086/186 CPU
    • +
    • 1MB RAM
    • +
    • 8072A 3.5" floppy disk controller (1.44MB/720KB)
    • +
    • Fixed disk controller (supports a single hard drive up to 528MB)
    • +
    • Hercules graphics card with 720x348 2-color graphics (64KB video RAM), and CGA 80x25 16-color text mode support
    • +
    • 8253 programmable interval timer (PIT)
    • +
    • 8259 programmable interrupt controller (PIC)
    • +
    • 8042 keyboard controller with 83-key XT-style keyboard
    • +
    • MC146818 real-time clock
    • +
    • PC speaker
    • +
    + + +

    The emulator uses the SDL graphics library for portability, and compiles for Windows, Mac OS X, Linux and probably most other 32-bit/64-bit systems too.

    + +

    If you like living on the edge you can try building the emulator on a big endian machine, and you will get an emulation of a big endian 8086, a rather bizarre and somewhat useless beast. For everyone else, please run the emulator on a little endian machine.

    + +

    RULE 2 ABUSE DISCLAIMER

    + +
      +
    • cable3.c is 4043 bytes in length (half an 8086)
    • +
    • iocccsize -i < cable3.c returns 1977 (the year the 4.77 MHz 8086 CPU was announced)
    • +
    • Therefore, any suspicions the judges may have regarding rule 2 non-compliance may be well-intentioned but are groundless.
    • +
    • Nonetheless, the author would like to apologise to the judges for the one-big-block-of-code nature of this entry, which turned out to be unavoidable. Hopefully the joys of this entry will make up for its shortcomings.
    • +
    + + +

    /RULE 2 ABUSE DISCLAIMER

    + +

    Why is this entry obfuscated/interesting?

    + +
      +
    • First of all the 8086 is a nightmare processor to emulate. Instruction codings are complex and irregular in size and structure, with multiple addressing modes and no consistent memory placement for operands, very often multiple possible encodings for the same instruction, and the bizarre segment:offset memory model. In addition, the 8086 has a number of bugs (e.g. PUSH SP), undocumented behaviours and instructions (e.g. AAM/AAD + imm8, SALC, flag behaviour for MUL/DIV, etc. etc.), and archaic features (e.g. parity/auxiliary flags) which all need to be emulated properly. Here we emulate every feature of the CPU pretty exactly (in fact better than most commercial clones of the processor e.g. the NEC V30), with the exception of the trap flag which no real software uses except for debuggers (although support for the TF can be added if deemed important, without exceeding the IOCCC size limit).
    • +
    • In addition to the CPU we also emulate all the standard PC peripheral hardware. Parts of it are somewhat complete, much is rather dysfunctional (like the 8253/8259) but enough to support most real software.
    • +
    • Nonetheless the source, while large for the IOCCC, is rather tiny for a functional PC emulator - around 2% of the size of the source of other open-source 8086 PC emulators with comparable functionality.
    • +
    • In fact, this entry is just like happy hour - at 4043 bytes long, you pay for half the 8086, but you get served the whole one.
    • +
    • Getting the code down to <= 4096 characters to meet the IOCCC rule 2 overall size limit required a good deal of effort (and appreciable risk of divorce), with obfuscation being a pretty unavoidable consequence in most places … for the rest, I use short circuit operators whenever possible, mix x[y] and y[x], don’t use any flow control keywords except for for, use K&R-style declarations to honor the C language’s rich cultural heritage (plus it saves a byte), and occasionally go overboard with nasty nested indexes to give things like this: –64[T=1[O=32[L=(X=*Y&7)&1,o=X/2&1,l]=0,t=(c=y)&7,a=c/8&7,Y]>>6,g=~-T?y:(n)y,d=BX=y,l]
    • +
    • This entry highlights the importance of comments in C.
    • +
    • This entry might result in an adjustment to the IOCCC size tool for the 2014 competition (see above).
    • +
    + + +

    Compiling on different platforms

    + +

    This entry has been tested on Windows (compiled with MS Visual Studio 2010 and 2013), Mac OS X (clang and gcc), and Linux (clang and gcc). The Makefile supplied is good for Mac OS X, Linux and probably other UNIXes. I have received reports that the emulator works on Raspberry Pi/Android/ARM (you will need to compile with -fsigned-char) and iOS. You will need to adjust the Makefile if your system lacks sdl-config to correctly point to the SDL libraries and header files.

    + +

    On UNIX-based systems we can get raw keystrokes using stty. However Windows has no stty. Therefore the Makefile includes a -D entry to define a “keyboard driver” KB which as it stands is suitable for UNIXes, but maybe not non-UNIX platforms. For example, for Windows/MS Visual Studio, instead of the Makefile definition of KB, use something slightly different - add the following entry to the Preprocessor Definitions list in the Project Properties page:

    + +
    KB=(kb=H(8),kbhit())&&(r[1190]=getch(),H(7))
    +
    + +

    POSIX portability note

    + +

    The code as supplied uses implicit function declarations for POSIX file I/O and in doing so assumes that file offsets are the same bit width as your architecture. For some systems (e.g. 32-bit Mac OS X, which uses 64-bit file offsets) this is not the case, and to run successfully on these systems, you will need to explicitly declare these functions by adding the appropriate include to the top of the source:

    + +
    #include <unistd.h>
    +
    + +

    Usage

    + +
    ./cable3 bios-image-file floppy-image-file [harddisk-image-file]
    +
    + +

    PLEASE NOTE that under UNIXes the keyboard must be in raw mode for the emulator to work properly. Therefore the emulator is best run from a shell script that looks something like:

    + +
    stty cbreak raw -echo min 0
    +./cable3 bios floppy.img harddisk.img
    +stty cooked echo
    +
    + +

    To run the emulator - floppy mode only

    + +

    The simplest use of the emulator is with a single floppy boot disk image, like the fd.img provided, which is a FreeDOS boot disk.

    + +

    Before running the emulator on a Unix-type system, stty needs to be used to put the keyboard into raw mode (and afterwards it needs to be put back to cooked). So, run the emulator using something like this script (provided as “runme”):

    + +
    stty cbreak raw -echo min 0
    +./cable3 bios fd.img
    +stty cooked echo
    +
    + +

    To run the emulator - floppy + HD mode

    + +

    Easiest to start with is to try a ready-made 40MB hard disk image containing a whole bunch of software:

    + +

    http://bitly.com/1bU8URK

    + +

    For the more adventurous, you can start off with (for example) a blank 40MB image file called hd.img made using e.g. mkfile. Then use:

    + +
    stty cbreak raw -echo min 0
    +./cable3 bios fd.img hd.img
    +stty cooked echo
    +
    + +

    Preparing the hard disk for use in the emulator is done just like a real PC. Boot the emulator, and use FDISK to partition the hard disk. When it’s done FDISK will reboot the emulator. Then you can use FORMAT C: and you are done. The resulting disk image is in the right format to be mounted on a real Windows PC using e.g. OSFMount, on a Mac using hdiutil, or on Linux using mount, providing an easy way to copy files and programs to and from the disk image. Or, you can install programs from regular floppy disk images (see “Floppy disk support” below).

    + +

    Keyboard emulation

    + +

    The emulator simulates an XT-style keyboard controlled by an Intel 8042 chip on I/O port 0x60, generating IRQ1 and then interrupt 9 on each keypress. This is harder than it sounds because a real 8042 returns scan codes rather than the ASCII characters which the C standard I/O functions return. Rather than make the emulator less portable and use ioctl or platform-dependent equivalents to obtain real scan codes from the keyboard, the emulator BIOS does the reverse of a real PC BIOS and converts ASCII characters to scancodes, simulating press/release of the modifier keys (e.g. shift) as necessary to work like a “real” keyboard. The OS (DOS/Windows) then converts them back to ASCII characters and normally this process works seamlessly (although don’t be surprised if there are issues, for example, with non-QWERTY e.g. international keyboards).

    + +

    Most of the time you can just type normally, but there are special sequences to get Alt+xxx and Fxxx.

    + +

    To send an Alt+XXX key combination, press Ctrl+A then the key, so for example to type Alt+F, press Ctrl+A then F.

    + +

    To send an Fxx key, press Ctrl+F then a number key. For example, to get the F4 key, press Ctrl+F then 4. To get F10, press Ctrl+F then 0.

    + +

    To send a Page Down key, press Ctrl+F then O. To send a Page Up key, press Ctrl+F then E. Other key combinations are left for the discovery of the user.

    + +

    Text mode support

    + +

    The emulator supports both text output via the standard BIOS interrupt 0x10 interface, and also direct video memory access (one page, 4KB video RAM at segment B800) in 80x25 CGA 16-color text mode.

    + +

    BIOS text output calls are converted to simple writes to stdout. Direct video memory accesses for the 80x25 CGA color text mode are converted to ANSI terminal escape sequences. If you are using a terminal which does not support ANSI (e.g. you are compiling the emulator with MS VC++ and running in a Windows console window) then PC applications that directly write to video memory in text mode may be unusable.

    + +

    Most CGA I/O ports are not supported except for the CGA refresh register at 0x3DA, which some applications use for timing or synchronisation.

    + +

    The regular PC character code page (437) includes various extended ASCII characters for things like line drawing. You might want to set the font in your terminal program to something that includes these (e.g. on Mac OS X there is a freeware font called Perfect DOS VGA 437 which does the trick).

    + +

    Occasionally a DOS application on exit will leave the video hardware in an odd state which confuses the emulator, resulting in subsequent text output being invisible. If this happens, just use the DOS CLS command to clear the screen and all will be well again.

    + +

    Graphics mode support

    + +

    Hercules 720x348 monochrome graphics mode emulation is implemented using SDL. Most Hercules features are supported via the normal I/O interface on ports 0x3B8 and 0x3BA including video memory bank switching (segments B000/B800), which some games use for double-buffered graphics. CGA graphics modes are not supported.

    + +

    When an application enters graphics mode, the emulator will open an SDL window (which will be closed when the application goes back to text mode). Including code to redirect keystrokes from the SDL window to the main terminal window would have busted the IOCCC size limits, so you need to keep the main emulator terminal window in focus at all times even when you are doing graphics (sounds a little odd but you will get used to it).

    + +

    On UNIXes, SDL will automatically output graphics via X11 if the DISPLAY environment variable is set up.

    + +

    Dual graphics card support

    + +

    Some applications (e.g. AutoCAD) support a PC configuration with a CGA card and a Hercules card, for simultaneous text and graphics output on different displays. The emulator simulates this configuration, too, using separate windows for the (terminal) text and (SDL) graphics displays.

    + +

    BIOS

    + +

    Like a real PC, the emulator needs a BIOS to do anything useful. Here we use a custom BIOS, written from scratch specifically for the emulator. Source code for the BIOS (written in 8086 assembly language) which compiles with the freely-available NASM x86 assembler is available from the author on request.

    + +

    The BIOS implements the standard interrupt interfaces for video, disk, timer, clock and so on, much as a “real” PC BIOS does, and also a small timer-controlled video driver to convert video memory formatting into ANSI escape sequences when the emulator is in text mode.

    + +

    CPU and memory emulation

    + +

    Memory map is largely as per a real PC, with interrupt vector table at 0:0, BIOS data area including keyboard buffer at 40:0, CGA text video memory at B800:0, Hercules dual-bank graphics memory at B000/B800:0, and BIOS at F000:100. Unlike a real PC, in the emulator the CPU registers are memory-mapped (at F000:0), which enables considerable optimisation of the emulator’s instruction execution unit by permitting the unification of memory and register operations, while remaining invisible to the running software.

    + +

    CPU supports the full 8086/186 instruction set. Due to the complexities of the 8086’s arbitrary-length instruction decoding and flags, 8086 instructions are first converted to a simpler intermediate format before being executed. This conversion, along with instruction lengths and how each instruction modifies the flags, is assisted by some lookup tables which form part of the BIOS binary.

    + +

    The CPU also implements some “special” two-byte opcodes to help the emulator talk with the outside world. These are:

    + +
    0F 00 - output character in register AL to terminal
    +0F 01 - write real-time clock data (as returned by localtime) to memory location ES:BX
    +0F 02 - read AX bytes from disk at offset 512*(16*SI+BP) into memory location ES:BX. Disk is specified in DL (0 = hard disk, 1 = floppy disk)
    +0F 03 - write AX bytes at memory location ES:BX to disk at offset 512*(16*SI+BP). Disk is specified in DL as per 0F 02
    +
    + +

    Emulator exit is triggered if CS:IP == 0:0 (which would be nonsensical in real software since this is where the interrupt vector table lives). The supplied Dos6.22.img disk includes a small program QUITEMU.COM which contains a single JMP 0:0 instruction, to allow the user to easily quit the emulator without shutting down the terminal.

    + +

    Floppy disk support

    + +

    Emulates a 3.5" high-density floppy drive. Can read, write and format 1.44MB disks (18 sectors per track, 2 heads) and 720KB disks (9 sectors per track, 2 heads).

    + +

    If you want to install your own software from floppy images (downloaded from e.g. Vetusware), the easiest way to “change disks” is to copy each disk image in turn over the floppy image file you specify on the command line. Don’t forget to put your original boot disk back at the end!

    + +

    Hard disk support

    + +

    Supports up to 1023 cylinders, 63 sectors per track, 63 heads for disks up to 528MB.

    + +

    Disk image format used is a subset of the standard “raw” format used by most disk image mount tools. In general, disk images prepared by the emulator will work with disk image tools and other emulators, but not the other way around.

    + +

    The emulator uses a particularly dumb algorithm to derive a simulated cylinder/sector/head geometry from the disk image file’s size. This algorithm often results in not all the space in the image file being available for disk partitions. For example, creating a 40,000,000 byte image file results in DOS FDISK seeing only 31.9MB as the volume size.

    + +

    Note that unlike a real PC, the emulator cannot boot from a hard disk (image). Therefore, you will always need to use a bootable floppy image, even if after boot everything runs from the HD.

    + +

    Mouse

    + +

    No mouse is emulated.

    + +

    Real-time clock

    + +

    Reading the RTC (both time and date) is emulated via the standard BIOS clock interface, pulling the time/date from the host computer. Setting the time or date is not supported.

    + +

    Timers

    + +

    A countdown timer on I/O port 0x40 is simulated in a broken way which is good enough for most software. On a real PC this has a default period of 55ms and is programmable. No programmability is supported in the emulator and the period may be about right or completely wrong depending on the actual speed of your computer.

    + +

    On a real PC, IRQ0 and interrupt 8 are fired every 55ms. The emulator tries to do the same but again, the delay period is uncalibrated so you get what you get.

    + +

    PC speaker

    + +

    Beeps only, through the console.

    + +

    Software supported

    + +

    The emulator will run practically any software a real PC (of the spec listed at the top of this file) can. The author has tested a number of OSes/GUIs (MS-DOS 6.22, FreeDOS 0.82pl3, Windows 3.0, DESQview 2.8), professional software (Lotus 1-2-3 2.4 and AsEasyAs 5.7 for DOS, Excel 2.1 for Windows, AutoCAD 2.5, WordStar 4), programming languages (QBASIC, GWBASIC, Turbo C++), games (Carrier Command, Police Quest, and a bunch of freeware Windows games), and diagnostic/benchmark software (Manifest, Microsoft MSD, InfoSpot, CheckIt) and all of them run well.

    + +

    Screenshots of some of these applications running (on Mac OS X) are provided for the impatient.

    + +

    Compiler warnings

    + +

    A lot of compiler warnings are produced by clang. Missing type specifiers, control reaching the end of functions without returning values, incompatible pointer type assignments, and some precedence warnings, all necessary to keep the source size down. Other compilers are likely to produce similar warnings.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2013/cable3/hint.text b/2013/cable3/hint.text new file mode 100644 index 000000000..db990bfd3 --- /dev/null +++ b/2013/cable3/hint.text @@ -0,0 +1,251 @@ +# Largest small system emulator + +Adrian Cable + + + +## Judges' comments: +### To build: + + make cable3 + +### To run: + + ./cable3 bios-image-file floppy-image-file [harddisk-image-file] + +### Try: + + ./runme + +### Selected Judges Remarks: + +This entry weighs in at a magical 4043 bytes (8086 nibbles, 28,301 +bits). It manages to implement most of the hardware in a 1980's era +IBM-PC using a few hundred fewer bits than the total number of +transistors used to implement the original 8086 CPU. + +If you are using OS X, the included sc-ioccc.terminal configuration file will +correctly display console applications that use ANSI graphics. + +Update: This entry now has its own web page + +## Author's comments: +A tiny but highly functional PC emulator/virtual machine +======================================================== + +The author hereby presents, for the delectation (?) of the judges, a portable PC emulator/VM written specifically for the IOCCC which runs DOS, Windows 3.0, Excel, MS Flight Simulator, AutoCAD, Lotus 1-2-3 ... + +In just 4043 bytes of C source, you get a complete mid-late 1980s-era IBM-compatible PC, consisting of: + +- Intel 8086/186 CPU +- 1MB RAM +- 8072A 3.5" floppy disk controller (1.44MB/720KB) +- Fixed disk controller (supports a single hard drive up to 528MB) +- Hercules graphics card with 720x348 2-color graphics (64KB video RAM), and CGA 80x25 16-color text mode support +- 8253 programmable interval timer (PIT) +- 8259 programmable interrupt controller (PIC) +- 8042 keyboard controller with 83-key XT-style keyboard +- MC146818 real-time clock +- PC speaker + +The emulator uses the SDL graphics library for portability, and compiles for Windows, Mac OS X, Linux and probably most other 32-bit/64-bit systems too. + +If you like living on the edge you can try building the emulator on a big endian machine, and you will get an emulation of a big endian 8086, a rather bizarre and somewhat useless beast. For everyone else, please run the emulator on a little endian machine. + +*RULE 2 ABUSE DISCLAIMER* + +- cable3.c is 4043 bytes in length (half an 8086) +- iocccsize -i < cable3.c returns 1977 (the year the 4.77 MHz 8086 CPU was announced) +- Therefore, any suspicions the judges may have regarding rule 2 non-compliance may be well-intentioned but are groundless. +- Nonetheless, the author would like to apologise to the judges for the one-big-block-of-code nature of this entry, which turned out to be unavoidable. Hopefully the joys of this entry will make up for its shortcomings. + +*/RULE 2 ABUSE DISCLAIMER* + +Why is this entry obfuscated/interesting? +----------------------------------------- + +- First of all the 8086 is a nightmare processor to emulate. Instruction codings are complex and irregular in size and structure, with multiple addressing modes and no consistent memory placement for operands, very often multiple possible encodings for the same instruction, and the bizarre segment:offset memory model. In addition, the 8086 has a number of bugs (e.g. PUSH SP), undocumented behaviours and instructions (e.g. AAM/AAD + imm8, SALC, flag behaviour for MUL/DIV, etc. etc.), and archaic features (e.g. parity/auxiliary flags) which all need to be emulated properly. Here we emulate every feature of the CPU pretty exactly (in fact better than most commercial clones of the processor e.g. the NEC V30), with the exception of the trap flag which no real software uses except for debuggers (although support for the TF can be added if deemed important, without exceeding the IOCCC size limit). +- In addition to the CPU we also emulate all the standard PC peripheral hardware. Parts of it are somewhat complete, much is rather dysfunctional (like the 8253/8259) but enough to support most real software. +- Nonetheless the source, while large for the IOCCC, is rather tiny for a functional PC emulator - around 2% of the size of the source of other open-source 8086 PC emulators with comparable functionality. +- In fact, this entry is just like happy hour - at 4043 bytes long, you pay for half the 8086, but you get served the whole one. +- Getting the code down to <= 4096 characters to meet the IOCCC rule 2 overall size limit required a good deal of effort (and appreciable risk of divorce), with obfuscation being a pretty unavoidable consequence in most places ... for the rest, I use short circuit operators whenever possible, mix x[y] and y[x], don't use any flow control keywords except for for, use K&R-style declarations to honor the C language's rich cultural heritage (plus it saves a byte), and occasionally go overboard with nasty nested indexes to give things like this: --64[T=1[O=32[L=(X=*Y&7)&1,o=X/2&1,l]=0,t=(c=y)&7,a=c/8&7,Y]>>6,g=~-T?y:(n)y,d=BX=y,l] +- This entry highlights the importance of comments in C. +- This entry might result in an adjustment to the IOCCC size tool for the 2014 competition (see above). + +Compiling on different platforms +-------------------------------- + +This entry has been tested on Windows (compiled with MS Visual Studio 2010 and 2013), Mac OS X (clang and gcc), and Linux (clang and gcc). The Makefile supplied is good for Mac OS X, Linux and probably other UNIXes. I have received reports that the emulator works on Raspberry Pi/Android/ARM (you will need to compile with -fsigned-char) and iOS. You will need to adjust the Makefile if your system lacks sdl-config to correctly point to the SDL libraries and header files. + +On UNIX-based systems we can get raw keystrokes using stty. However Windows has no stty. Therefore the Makefile includes a -D entry to define a "keyboard driver" KB which as it stands is suitable for UNIXes, but maybe not non-UNIX platforms. For example, for Windows/MS Visual Studio, instead of the Makefile definition of KB, use something slightly different - add the following entry to the Preprocessor Definitions list in the Project Properties page: + + KB=(kb=H(8),kbhit())&&(r[1190]=getch(),H(7)) + +POSIX portability note +---------------------- + +The code as supplied uses implicit function declarations for POSIX file I/O and in doing so assumes that file offsets are the same bit width as your architecture. For some systems (e.g. 32-bit Mac OS X, which uses 64-bit file offsets) this is not the case, and to run successfully on these systems, you will need to explicitly declare these functions by adding the appropriate include to the top of the source: + + #include + +Usage +----- + + ./cable3 bios-image-file floppy-image-file [harddisk-image-file] + +PLEASE NOTE that under UNIXes the keyboard must be in raw mode for the emulator to work properly. Therefore the emulator is best run from a shell script that looks something like: + + stty cbreak raw -echo min 0 + ./cable3 bios floppy.img harddisk.img + stty cooked echo + +To run the emulator - floppy mode only +-------------------------------------- + +The simplest use of the emulator is with a single floppy boot disk image, like the fd.img provided, which is a FreeDOS boot disk. + +Before running the emulator on a Unix-type system, stty needs to be used to put the keyboard into raw mode (and afterwards it needs to be put back to cooked). So, run the emulator using something like this script (provided as "runme"): + + stty cbreak raw -echo min 0 + ./cable3 bios fd.img + stty cooked echo + +To run the emulator - floppy + HD mode +-------------------------------------- + +Easiest to start with is to try a ready-made 40MB hard disk image containing a whole bunch of software: + + + +For the more adventurous, you can start off with (for example) a blank 40MB image file called hd.img made using e.g. mkfile. Then use: + + stty cbreak raw -echo min 0 + ./cable3 bios fd.img hd.img + stty cooked echo + +Preparing the hard disk for use in the emulator is done just like a real PC. Boot the emulator, and use FDISK to partition the hard disk. When it's done FDISK will reboot the emulator. Then you can use FORMAT C: and you are done. The resulting disk image is in the right format to be mounted on a real Windows PC using e.g. OSFMount, on a Mac using hdiutil, or on Linux using mount, providing an easy way to copy files and programs to and from the disk image. Or, you can install programs from regular floppy disk images (see "Floppy disk support" below). + +Keyboard emulation +------------------ + +The emulator simulates an XT-style keyboard controlled by an Intel 8042 chip on I/O port 0x60, generating IRQ1 and then interrupt 9 on each keypress. This is harder than it sounds because a real 8042 returns scan codes rather than the ASCII characters which the C standard I/O functions return. Rather than make the emulator less portable and use ioctl or platform-dependent equivalents to obtain real scan codes from the keyboard, the emulator BIOS does the reverse of a real PC BIOS and converts ASCII characters to scancodes, simulating press/release of the modifier keys (e.g. shift) as necessary to work like a "real" keyboard. The OS (DOS/Windows) then converts them back to ASCII characters and normally this process works seamlessly (although don't be surprised if there are issues, for example, with non-QWERTY e.g. international keyboards). + +Most of the time you can just type normally, but there are special sequences to get Alt+xxx and Fxxx. + +To send an Alt+XXX key combination, press Ctrl+A then the key, so for example to type Alt+F, press Ctrl+A then F. + +To send an Fxx key, press Ctrl+F then a number key. For example, to get the F4 key, press Ctrl+F then 4. To get F10, press Ctrl+F then 0. + +To send a Page Down key, press Ctrl+F then O. To send a Page Up key, press Ctrl+F then E. Other key combinations are left for the discovery of the user. + +Text mode support +----------------- + +The emulator supports both text output via the standard BIOS interrupt 0x10 interface, and also direct video memory access (one page, 4KB video RAM at segment B800) in 80x25 CGA 16-color text mode. + +BIOS text output calls are converted to simple writes to stdout. Direct video memory accesses for the 80x25 CGA color text mode are converted to ANSI terminal escape sequences. If you are using a terminal which does not support ANSI (e.g. you are compiling the emulator with MS VC++ and running in a Windows console window) then PC applications that directly write to video memory in text mode may be unusable. + +Most CGA I/O ports are not supported except for the CGA refresh register at 0x3DA, which some applications use for timing or synchronisation. + +The regular PC character code page (437) includes various extended ASCII characters for things like line drawing. You might want to set the font in your terminal program to something that includes these (e.g. on Mac OS X there is a freeware font called Perfect DOS VGA 437 which does the trick). + +Occasionally a DOS application on exit will leave the video hardware in an odd state which confuses the emulator, resulting in subsequent text output being invisible. If this happens, just use the DOS CLS command to clear the screen and all will be well again. + +Graphics mode support +--------------------- + +Hercules 720x348 monochrome graphics mode emulation is implemented using SDL. Most Hercules features are supported via the normal I/O interface on ports 0x3B8 and 0x3BA including video memory bank switching (segments B000/B800), which some games use for double-buffered graphics. CGA graphics modes are not supported. + +When an application enters graphics mode, the emulator will open an SDL window (which will be closed when the application goes back to text mode). Including code to redirect keystrokes from the SDL window to the main terminal window would have busted the IOCCC size limits, so you need to keep the main emulator terminal window in focus at all times even when you are doing graphics (sounds a little odd but you will get used to it). + +On UNIXes, SDL will automatically output graphics via X11 if the DISPLAY environment variable is set up. + +Dual graphics card support +-------------------------- + +Some applications (e.g. AutoCAD) support a PC configuration with a CGA card and a Hercules card, for simultaneous text and graphics output on different displays. The emulator simulates this configuration, too, using separate windows for the (terminal) text and (SDL) graphics displays. + +BIOS +---- + +Like a real PC, the emulator needs a BIOS to do anything useful. Here we use a custom BIOS, written from scratch specifically for the emulator. Source code for the BIOS (written in 8086 assembly language) which compiles with the freely-available NASM x86 assembler is available from the author on request. + +The BIOS implements the standard interrupt interfaces for video, disk, timer, clock and so on, much as a "real" PC BIOS does, and also a small timer-controlled video driver to convert video memory formatting into ANSI escape sequences when the emulator is in text mode. + +CPU and memory emulation +------------------------ + +Memory map is largely as per a real PC, with interrupt vector table at 0:0, BIOS data area including keyboard buffer at 40:0, CGA text video memory at B800:0, Hercules dual-bank graphics memory at B000/B800:0, and BIOS at F000:100. Unlike a real PC, in the emulator the CPU registers are memory-mapped (at F000:0), which enables considerable optimisation of the emulator's instruction execution unit by permitting the unification of memory and register operations, while remaining invisible to the running software. + +CPU supports the full 8086/186 instruction set. Due to the complexities of the 8086's arbitrary-length instruction decoding and flags, 8086 instructions are first converted to a simpler intermediate format before being executed. This conversion, along with instruction lengths and how each instruction modifies the flags, is assisted by some lookup tables which form part of the BIOS binary. + +The CPU also implements some "special" two-byte opcodes to help the emulator talk with the outside world. These are: + + 0F 00 - output character in register AL to terminal + 0F 01 - write real-time clock data (as returned by localtime) to memory location ES:BX + 0F 02 - read AX bytes from disk at offset 512*(16*SI+BP) into memory location ES:BX. Disk is specified in DL (0 = hard disk, 1 = floppy disk) + 0F 03 - write AX bytes at memory location ES:BX to disk at offset 512*(16*SI+BP). Disk is specified in DL as per 0F 02 + +Emulator exit is triggered if CS:IP == 0:0 (which would be nonsensical in real software since this is where the interrupt vector table lives). The supplied Dos6.22.img disk includes a small program QUITEMU.COM which contains a single JMP 0:0 instruction, to allow the user to easily quit the emulator without shutting down the terminal. + +Floppy disk support +------------------- + +Emulates a 3.5" high-density floppy drive. Can read, write and format 1.44MB disks (18 sectors per track, 2 heads) and 720KB disks (9 sectors per track, 2 heads). + +If you want to install your own software from floppy images (downloaded from e.g. Vetusware), the easiest way to "change disks" is to copy each disk image in turn over the floppy image file you specify on the command line. Don't forget to put your original boot disk back at the end! + +Hard disk support +----------------- + +Supports up to 1023 cylinders, 63 sectors per track, 63 heads for disks up to 528MB. + +Disk image format used is a subset of the standard "raw" format used by most disk image mount tools. In general, disk images prepared by the emulator will work with disk image tools and other emulators, but not the other way around. + +The emulator uses a particularly dumb algorithm to derive a simulated cylinder/sector/head geometry from the disk image file's size. This algorithm often results in not all the space in the image file being available for disk partitions. For example, creating a 40,000,000 byte image file results in DOS FDISK seeing only 31.9MB as the volume size. + +Note that unlike a real PC, the emulator cannot boot from a hard disk (image). Therefore, you will always need to use a bootable floppy image, even if after boot everything runs from the HD. + +Mouse +----- + +No mouse is emulated. + +Real-time clock +--------------- + +Reading the RTC (both time and date) is emulated via the standard BIOS clock interface, pulling the time/date from the host computer. Setting the time or date is not supported. + +Timers +------ + +A countdown timer on I/O port 0x40 is simulated in a broken way which is good enough for most software. On a real PC this has a default period of 55ms and is programmable. No programmability is supported in the emulator and the period may be about right or completely wrong depending on the actual speed of your computer. + +On a real PC, IRQ0 and interrupt 8 are fired every 55ms. The emulator tries to do the same but again, the delay period is uncalibrated so you get what you get. + +PC speaker +---------- + +Beeps only, through the console. + +Software supported +------------------ + +The emulator will run practically any software a real PC (of the spec listed at the top of this file) can. The author has tested a number of OSes/GUIs (MS-DOS 6.22, FreeDOS 0.82pl3, Windows 3.0, DESQview 2.8), professional software (Lotus 1-2-3 2.4 and AsEasyAs 5.7 for DOS, Excel 2.1 for Windows, AutoCAD 2.5, WordStar 4), programming languages (QBASIC, GWBASIC, Turbo C++), games (Carrier Command, Police Quest, and a bunch of freeware Windows games), and diagnostic/benchmark software (Manifest, Microsoft MSD, InfoSpot, CheckIt) and all of them run well. + +Screenshots of some of these applications running (on Mac OS X) are provided for the impatient. + +Compiler warnings +----------------- + +A lot of compiler warnings are produced by clang. Missing type specifiers, control reaching the end of functions without returning values, incompatible pointer type assignments, and some precedence warnings, all necessary to keep the source size down. Other compilers are likely to produce similar warnings. + + +-------------------------------------------------------------------------------- + diff --git a/2013/cable3/runme b/2013/cable3/runme new file mode 100644 index 000000000..3b0f53e8d --- /dev/null +++ b/2013/cable3/runme @@ -0,0 +1,10 @@ +#!/bin/sh +clear +stty cbreak raw -echo min 0 +if [ -f hd.img ] +then + ./cable3 bios fd.img hd.img +else + ./cable3 bios fd.img +fi +stty cooked echo diff --git a/2013/cable3/sc-ioccc.terminal b/2013/cable3/sc-ioccc.terminal new file mode 100644 index 000000000..7f2d30556 --- /dev/null +++ b/2013/cable3/sc-ioccc.terminal @@ -0,0 +1,80 @@ + + + + + BackgroundColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OV05TV2hpdGVcTlNDb2xvclNwYWNlViRjbGFzc00w + IDAuODk5OTk5OTgAEAOAAtIQERITWiRjbGFzc25hbWVYJGNsYXNzZXNXTlNDb2xvcqIS + FFhOU09iamVjdF8QD05TS2V5ZWRBcmNoaXZlctEXGFRyb290gAEIERojLTI3O0FIUF1k + cnR2e4aPl5qjtbi9AAAAAAAAAQEAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAL8= + + CharacterEncoding + 2147484699 + CursorBlink + + CursorColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECEw + LjIxOTYwNzg2IDAuOTk2MDc4NDkgMC4xNTI5NDExOAAQAoAC0hAREhNaJGNsYXNzbmFt + ZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcY + VHJvb3SAAQgRGiMtMjc7QUhOW2KGiIqPmqOrrrfJzNEAAAAAAAABAQAAAAAAAAAZAAAA + AAAAAAAAAAAAAAAA0w== + + CursorType + 0 + Font + + YnBsaXN0MDDUAQIDBAUGGBlYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKQHCBESVSRudWxs1AkKCwwNDg8QVk5TU2l6ZVhOU2ZGbGFnc1ZOU05hbWVWJGNs + YXNzI0A4AAAAAAAAEBCAAoADXlBUTW9uby1SZWd1bGFy0hMUFRZaJGNsYXNzbmFtZVgk + Y2xhc3Nlc1ZOU0ZvbnSiFRdYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2ZXLRGhtUcm9v + dIABCBEaIy0yNzxCS1JbYmlydHZ4h4yXoKeqs8XIzQAAAAAAAAEBAAAAAAAAABwAAAAA + AAAAAAAAAAAAAADP + + FontAntialias + + FontHeightSpacing + 0.87752016129032251 + FontWidthSpacing + 0.92313508064516125 + Linewrap + + ProfileCurrentVersion + 2.02 + SelectionColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPEB4w + LjAzNDU3ODM5NSAwIDAuOTEzMjY1MzEgMC42NQAQAYAC0hAREhNaJGNsYXNzbmFtZVgk + Y2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJv + b3SAAQgRGiMtMjc7QUhOW2KDhYeMl6Coq7TGyc4AAAAAAAABAQAAAAAAAAAZAAAAAAAA + AAAAAAAAAAAA0A== + + TextBoldColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NGMCAx + IDAAEAGAAtIQERITWiRjbGFzc25hbWVYJGNsYXNzZXNXTlNDb2xvcqISFFhOU09iamVj + dF8QD05TS2V5ZWRBcmNoaXZlctEXGFRyb290gAEIERojLTI3O0FITltiaWttcn2GjpGa + rK+0AAAAAAAAAQEAAAAAAAAAGQAAAAAAAAAAAAAAAAAAALY= + + TextColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECIw + LjE1Njg2Mjc1IDAuOTk2MDc4NDkgMC4wNzg0MzEzNzUAEAKAAtIQERITWiRjbGFzc25h + bWVYJGNsYXNzZXNXTlNDb2xvcqISFFhOU09iamVjdF8QD05TS2V5ZWRBcmNoaXZlctEX + GFRyb290gAEIERojLTI3O0FITltih4mLkJukrK+4ys3SAAAAAAAAAQEAAAAAAAAAGQAA + AAAAAAAAAAAAAAAAANQ= + + name + sc-ioccc + rowCount + 25 + type + Window Settings + + diff --git a/2013/cable3/screenshot_autocad.png b/2013/cable3/screenshot_autocad.png new file mode 100644 index 000000000..508f70c17 Binary files /dev/null and b/2013/cable3/screenshot_autocad.png differ diff --git a/2013/cable3/screenshot_flightsim4.png b/2013/cable3/screenshot_flightsim4.png new file mode 100644 index 000000000..0bed0aa19 Binary files /dev/null and b/2013/cable3/screenshot_flightsim4.png differ diff --git a/2013/cable3/screenshot_lotus123.png b/2013/cable3/screenshot_lotus123.png new file mode 100644 index 000000000..c1f61b408 Binary files /dev/null and b/2013/cable3/screenshot_lotus123.png differ diff --git a/2013/cable3/screenshot_qbasic.png b/2013/cable3/screenshot_qbasic.png new file mode 100644 index 000000000..82937ed2e Binary files /dev/null and b/2013/cable3/screenshot_qbasic.png differ diff --git a/2013/cable3/screenshot_simcity.png b/2013/cable3/screenshot_simcity.png new file mode 100644 index 000000000..a8a573d6c Binary files /dev/null and b/2013/cable3/screenshot_simcity.png differ diff --git a/2013/cable3/screenshot_win3_on_macosx.png b/2013/cable3/screenshot_win3_on_macosx.png new file mode 100644 index 000000000..089b7ea0e Binary files /dev/null and b/2013/cable3/screenshot_win3_on_macosx.png differ diff --git a/2013/dlowe/Makefile b/2013/dlowe/Makefile new file mode 100644 index 000000000..d15abb74f --- /dev/null +++ b/2013/dlowe/Makefile @@ -0,0 +1,204 @@ + +#!/usr/bin/env make +# +# 2013 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -Wno-implicit-int +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${LIBS} -include stdio.h -include stdlib.h -D'_(x)=strtof(b[x],0)' + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= dlowe +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Lehmer!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "Park different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Paul Erdos!"; \ + fi + @${TRUE} +dlowe: dlowe.c diff --git a/2013/dlowe/dlowe.c b/2013/dlowe/dlowe.c new file mode 100644 index 000000000..0ce463a02 --- /dev/null +++ b/2013/dlowe/dlowe.c @@ -0,0 +1,2 @@ +main(a,b)char**b;{int c=1,d=c,e=a-d;for(;e;e--)_(e)<_(c)?c=e:_(e)>_(d)?d=e:7; +while(++e + + + + + + Best sparkling utility + + +

    Best sparkling utility

    + +
      +
    1. David Lowe
      +434 Tenney Drive
      +Rogue River, OR
      +97537
      +j.david.lowe@gmail.com
      +http://www.pootpoot.net/
    2. +
    + + +

    Judges' comments:

    + +

    To build:

    + +
    make dlowe
    +
    + +

    To run:

    + +
    ./dlowe [numbers...]
    +
    + +

    Try:

    + +
    ./dlowe 0 1 2 3 4 5 6 7
    +./dlowe 16 32 64 128
    +
    +echo sparkline of file sizes: `wc -c * | awk '{print $1}' | xargs ./dlowe`
    +
    +./dlowe 0 
    +
    + +

    Selected Judges Remarks:

    + +

    We liked how this entry used Unicode, specifically UTF-8, in a somewhat obfuscated way.

    + +

    Also, why doesn’t it crash, and produces a correct output when called with one argument +or when all arguments are equal?

    + +

    For extra fun, compile and run

    + +
    #include <stdio.h>
    +int main() {
    +    printf("%d %d %d\n", (int)(-1.0/0.0), (int)(0.0/0.0), (int)(1.0/0.0));
    +}
    +
    + +

    with gcc and clang.

    + +

    With GCC (4.7.2), we get

    + +
    -2147483648 -2147483648 -2147483648
    +
    + +

    and with clang (3.3), we get

    + +
    -2147483648 0 2147483647
    +
    + +

    Which one is correct? :)

    + +

    Author’s comments:

    + +

    sparkl

    + +

    A tiny implementation of command-line ‘sparkline’ data visualization.

    + +

    Synopsis

    + +
    $ sparkl 0 1 2 3 4 5 6 7
    +�▂▃▄▅▆▇▉
    +
    +$ echo sparkline of file lengths: `wc -c * | awk '{print $1}' | xargs sparkl`
    +sparkline of file sizes: ���▃▃▂�▂��▉
    +
    + +

    Description

    + +

    This is a handy little tool for visualizing numeric series from the +command-line, using ‘sparklines’. Pass it a numeric series as arguments, and +sparkl will display a sparkline graph, which you can use to very quickly get a +sense of the shape of your data.

    + +

    Limitations

    + +
      +
    • Crashes with 0 arguments. It’d be trivial to fix, but adds a few bytes to the +code.
    • +
    • Produces bogus graphs when given > about 5000 arguments.
    • +
    • Only works if your terminal is utf-8 and your font supports the 8 glyphs +used.
    • +
    • Produces a few harmless compiler warnings.
    • +
    + + +

    Obfuscation

    + +

    The code is very terse. I was torn between submitting this version, and a +one-line version compressed using a couple more -D flags.

    + +

    Hand-rolled utf-8 sequence, magic numbers (what’s that 7 for?), meaningless +variable names, reused variables, and so on.

    + +

    Acknowledgements

    + +

    Edward Tufte invented sparklines (among other things.) Brilliant.

    + +

    Zach Holman’s ‘spark’ utility was absolutely +an inspiration.

    + +

    As I was writing up this description, I discovered I’m not the first person to +write an obfuscated C sparkline utility! Vicent Martí created +this one years (!) ago. (My +implementation is completely independent.)

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2013/dlowe/hint.text b/2013/dlowe/hint.text new file mode 100644 index 000000000..95f60e9ea --- /dev/null +++ b/2013/dlowe/hint.text @@ -0,0 +1,113 @@ +# Best sparkling utility + +J. David Lowe +434 Tenney Drive +Rogue River, OR +97537 + + + + +## Judges' comments: +### To build: + + make dlowe + +### To run: + + ./dlowe [numbers...] + +### Try: + + ./dlowe 0 1 2 3 4 5 6 7 + ./dlowe 16 32 64 128 + + echo sparkline of file sizes: `wc -c * | awk '{print $1}' | xargs ./dlowe` + + ./dlowe 0 + + +### Selected Judges Remarks: + +We liked how this entry used Unicode, specifically UTF-8, in a somewhat obfuscated way. + +Also, why doesn't it crash, and produces a correct output when called with one argument +or when all arguments are equal? + +For extra fun, compile and run + + #include + int main() { + printf("%d %d %d\n", (int)(-1.0/0.0), (int)(0.0/0.0), (int)(1.0/0.0)); + } + +with gcc and clang. + +With GCC (4.7.2), we get + + -2147483648 -2147483648 -2147483648 + +and with clang (3.3), we get + + -2147483648 0 2147483647 + +Which one is correct? :) + + +## Author's comments: +# sparkl + +A tiny implementation of command-line 'sparkline' data visualization. + +## Synopsis + + $ sparkl 0 1 2 3 4 5 6 7 + �▂▃▄▅▆▇▉ + + $ echo sparkline of file lengths: `wc -c * | awk '{print $1}' | xargs sparkl` + sparkline of file sizes: ���▃▃▂�▂��▉ + +## Description + +This is a handy little tool for visualizing numeric series from the +command-line, using 'sparklines'. Pass it a numeric series as arguments, and +sparkl will display a sparkline graph, which you can use to very quickly get a +sense of the shape of your data. + +## Limitations + +* Crashes with 0 arguments. It'd be trivial to fix, but adds a few bytes to the + code. +* Produces bogus graphs when given > about 5000 arguments. +* Only works if your terminal is utf-8 and your font supports the 8 glyphs + used. +* Produces a few harmless compiler warnings. + +## Obfuscation + +The code is very terse. I was torn between submitting this version, and a +one-line version compressed using a couple more -D flags. + +Hand-rolled utf-8 sequence, magic numbers (what's that 7 for?), meaningless +variable names, reused variables, and so on. + +## Acknowledgements + +Edward Tufte invented sparklines (among other things.) Brilliant. + +Zach Holman's ['spark' utility](https://github.com/holman/spark) was absolutely +an inspiration. + +As I was writing up this description, I discovered I'm not the first person to +write an obfuscated C sparkline utility! Vicent Martí created +[this one](https://gist.github.com/vmg/1368661) years (!) ago. (My +implementation is completely independent.) + +-------------------------------------------------------------------------------- + diff --git a/2013/endoh1/Makefile b/2013/endoh1/Makefile new file mode 100644 index 000000000..8389d91d3 --- /dev/null +++ b/2013/endoh1/Makefile @@ -0,0 +1,210 @@ +#!/usr/bin/env make +# +# 2013 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -W +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${LIBS} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= endoh1 +DATA= +ALT_OBJ= +ALT_ENTRY=hello echo tac + + +################# +# build the entry +################# +# +all: ${ENTRY} ${ALT_ENTRY} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ + @$(MAKE) ${ALT_ENTRY} + +# alternative executable +# + +hello: hello.lazy ${ENTRY}.c + ${CC} ${CFLAGS} -xc hello.lazy -o $@ + +echo: echo.lazy ${ENTRY}.c + ${CC} ${CFLAGS} -xc echo.lazy -o $@ + +tac: tac.lazy ${ENTRY}.c + ${CC} ${CFLAGS} -xc tac.lazy -o $@ +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Lehmer!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "Park different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Paul Erdos!"; \ + fi + @${TRUE} + diff --git a/2013/endoh1/echo.lazy b/2013/endoh1/echo.lazy new file mode 100644 index 000000000..85518b888 --- /dev/null +++ b/2013/endoh1/echo.lazy @@ -0,0 +1,5 @@ +#include "endoh1.c" + +I + +#include "endoh1.c" diff --git a/2013/endoh1/endoh1.c b/2013/endoh1/endoh1.c new file mode 100644 index 000000000..2aadca304 --- /dev/null +++ b/2013/endoh1/endoh1.c @@ -0,0 +1,87 @@ +#ifndef SKI +#define A(x)B(x##0)B(x##1)B(x##2)B(x##3)B(x##4)B(x##5) +#define B(x)C(x##0)C(x##1)C(x##2)C(x##3)C(x##4)C(x##5) +#define C(x)D(x##0)D(x##1)D(x##2)D(x##3)D(x##4)D(x##5) +#define D(x)Z(x##0)Z(x##1)Z(x##2)Z(x##3)Z(x##4)Z(x##5) +#define p(x)(*(*(*(*(*(*x)())())())())())() + +#include +#include + +#define S (Y(s+6)) +#define K (Y(s+4)) +#define I (Y(s+2)) + + + + +#define Z(x)\ +f x;f Y(v);g\ + j;f \ + x##z( f\ + y){y =y?! x?x= y:Y( m(*( w)&\ + x,(( g)y) (0)) ):x;return y; /*ab c*/} + /**/ typedef void *v ;int + n=0; typedef v* w;typed\ +ef v(*g)();v s[]= {0,0, s+6, s+2, +s+4,s,s+3,s+ 5,s+ 1};w m( v l ,v + + + + +r){w e=ma\ +lloc (siz\ +eof( v)*3 +);*e =r;e [1 +]=l;return (e[2 ]=s, e);} /*de fghi jk*/ typ\ +edef v(p( p(p( p(p( p(p( p(p( p(p(f)))) ))) )))) );A( +x)w u(){ return n --?m (j(0 ),u( )):s+3;} +w z( w e) {w a,b , c,d;for (d =e=m(e,0 +);n= (w)d[ 2]-s ,n?* (n>1? n<4? b:a: +c)?n <2?c[ 1]=m (*a, *c), *c=m (*b, + *c): + n>5? + + + #undef Z +#define Z(x\ +) &x ##z, +a[1]= m( + *a,!*d? d[1] =c=m (0,0 ),n= getchar(),n= n<0? + 256:n,c [2]= s+6, *d=u ():* d),*a=d[1]: n<5?n<3?n=z(* + a)-s, putchar( 255< +n?( exit (n-4 +*64) ,0):n ),fflush (stdout) ,c[1 ]= +*b:((n-3?b:c )[1] =*a) :(2[* a=z(*a)+1,a + ]=s+5),d =e:0 :e;d =d[1 ])c=b,b=a,a= + d;a= + *(w* + + )e [1 + ]; ;; + /*lm no*/ return a;}f( *h [])( )={A (x)0};f Y(v x) + {g y =(g) h[n++] ;y(! y? exit( puts ("out of c" "" + "losure" )),x :x );return(f )y/* pq + r*/;}int main () {z(((g )(S S( + j=(g )S(S (K S)K))(K( S I I)) (S(K(S I))( S( + K K) (S(K (S(S(K(Y(s+1 )) )(S( S S(K I)) (K (Y + (s +5)) )) + )) )K)) )( + + + + + +#endif + +#if (!defined(__INCLUDE_LEVEL__) || !__INCLUDE_LEVEL__) && !defined(SKI) + +K(I(I(I(S I I(S(K(S(S(K S)(S(S S S(K(S(K S)))(S(S S S(K(S(K S)))(S(K(S(S(K S)(S(S(K S)K)(K(S(S(K S)(S(K(S(S(S I(K K))(K K))))(S(K K)(S(S(K S)(S(K(S(S I(K K))))(S(K K)(S(S(K K))(K(S(S(S(S(K S)K)))I(S(S(K S)K)I)))))))(S(K K)(S(S(K K))(K(S(K(S(S(K S)K)I))(S(S(K S)K)(S I I(S(S(K S)K)I)))))))))))(S(K K)(S(K K)(S(S(K K))(K(S(K(S(S(K S)K)I))(S(S I I)I(S(S(K S)K)I)))))))))))))(S(K K)(S(K K)(S(K(S(S I(K(S(S I(K(K I)))(K S))))))K)))))(K(K(K K)))))(K(K(K(K I))))))))(S(K(S(K K)))(S(S(K S)(S(K K)(S(K S)(S(S(K K))I))))(K(S(K(S(S(K S)(S(K(S I))K))))(S(K K)K))))))(S(S I(K(S I I(S I I(S(S(K S)K)I)))))(K(K K)))S K K K I I I K K K I I I K K K I I I K K K I I K K K K K S K I I I K I K I I I K I K)I I I K I K I I I K I I I K I I S K I I I I I K I I I I I K I K I I I K I I I K I I S K I I)I K I K I I I K I K I I I K I K I I I K I I I K I I S K K K I I I K K K I I I K K K I I I K K K I I K K K K K S S K I I I K S)K I I K S K K K S K I I K S K I I I K S S K K K K K S K I I I I S K K K K K S K S K K K K K(K K)) + +#define SKI +#endif + +#ifdef SKI +(Y(s)))))(0));return 0;} +#else +#define SKI +#endif diff --git a/2013/endoh1/hello.lazy b/2013/endoh1/hello.lazy new file mode 100644 index 000000000..5f3379903 --- /dev/null +++ b/2013/endoh1/hello.lazy @@ -0,0 +1,5 @@ +#include "endoh1.c" + +K(S(S I(K(S(K(S I I(S(S(K S)K)I)))(S(S(K S)K)(S(S(K S)K)(S(S I I)I(S(S(K S)K)I)))))))(K(S(S I(K(S(S(K S)K)(S(S(K S)K)I(S(K(S(S(K S)K)I))(S(S(K S)K)(S I I(S(S(K S)K)I))))))))(K(S(S(K S)(S(K(S I))K))(S(K K)(S(S(K S)(S(K(S I))K))(S(K K)(S(S(K S)(S(K(S I))(S(K K)(S(S I(K(S(S(K S)K))))(K(S(S(K S)K)(S(S(K S)K)I)))))))(K(K(S(S I(K(S(S(K S)K)(S(S I I)I(S(S(K S)K)I))(S(S(K S)K))(S I I(S(S(K S)K)(S(S(K S)K)I))))))(K(S(S I(K(S(K(S(S(K S)K)I))(S(S I I)I(S(S(K S)K)I)))))(K(S(S I(K(S(S(K S)K)(S(K(S I I(S(S(K S)K)I)))(S(S(K S)K)(S(S(K S)K)(S(S I I)I(S(S(K S)K)I))))))))(K(S(S I(K(S(S(K S)K)(S(K(S(S(K S)K)(S(S(K S)K)I)))(S(S(K S)K)(S(S(K S)K)I(S(S(K S)K)(S I I(S(S(K S)K)I)))))))))(K(S(S(K S)(S(K(S I))K))(S(K K)(S(S(K S)(S(K(S I))K))(S(K K)(S(S(K S)(S(K(S I))K))(K(K(S(S I(K(S(S(K S)K)(S(K(S(S(K S)K)I))(S(S I I)I(S(S(K S)K)I))))))(K(S(S I(K(S(K(S(S(K S)K)I))(S(S(K S)K)(S I I(S(S(K S)K)I))))))(K(S(S I(K(S I I(S I I(S(S(K S)K)I)))))(K S))))))))))))(S(S(K S)K)(S(S(K S)K)(S(S(K S)K)(S(S(S(K S)K))(S I I)(S(S(K S)K)I))))))))))))))))))))(S(K(S I I(S(S(K S)K)I)))(S I I(S(S(K S)K)(S(S(K S)K)I))))))))) + +#include "endoh1.c" diff --git a/2013/endoh1/hint.html b/2013/endoh1/hint.html new file mode 100644 index 000000000..b93747e1e --- /dev/null +++ b/2013/endoh1/hint.html @@ -0,0 +1,254 @@ + + + + + + + Most lazy SKIer + + +

    Most lazy SKIer

    + +

    Yusuke Endoh
    +mame@ruby-lang.org
    +https://github.com/mame/

    + +

    Judges' comments:

    + +

    To build:

    + +
    make 
    +
    + +

    This builds endoh1, echo, hello, and tac.

    + +

    To run:

    + +
    ./endoh1 [file.lazy]
    +
    + +

    Try:

    + +
    ./endoh1 hello.lazy
    +./hello
    +echo Hello | ./echo 
    +./tac < endoh1.c
    +
    + +

    Be patient with the last one.

    + +

    Selected Judges Remarks:

    + +

    We liked this entry because it can serve as a standalone program as well as an include file; and, as usual, +because its input data is at least as obfuscated as the program itself.

    + +

    This entry can be considered an abuse of the GCC’s optimizer; it takes GCC about 4x longer to compile it +with -O3 than without, compared to clang’s 2x.

    + +

    Author’s comments:

    + +

    Remarks

    + +
    $ less prog.c
    +$ gcc -o prog prog.c
    +$ ./prog
    +
    + +

    … Isn’t there any more to it?

    + +

    Yes, of course.

    + +

    This is a tool for C programmers to play the SKI combinator calculus, +especially, Lazy K.

    + +

    This program will shine when it is used as a library. +For example, hello.lazy is a “Hello world” program written in Lazy K.

    + +
    $ lazy hello.lazy
    +Hello, world!
    +
    + +

    where lazy is a reference implementation of Lazy K. +At the same time, hello.lazy is a valid C program that uses prog.c as a library.

    + +
    $ gcc -o hello -xc hello.lazy
    +$ ./hello
    +Hello, world!
    +
    + +

    In other words, this program is a kind of polyglot.

    + +

    The usage is simple: +you just have to wrap Lazy K program with #include "prog.c". +Note that # is a comment in Lazy K.

    + +

    Obfuscation

    + +

    … is inherent in SKI combinator calculus :-)

    + +

    In addition, it uses various hacks to parse SKI code as C, +and to satisfy IOCCC’s size rule.

    + +
      +
    • Abuse of function pointers
    • +
    • Code duplication by macros
    • +
    • Short coding
    • +
    + + +

    These led to the good obfuscation. +See Spoiler section in detail, if you need.

    + +

    Limitation

    + +

    This program supports only “Combinator-calculus style notation” of Lazy K. +“Unlambda style” and “Iota and Jot” style are not supported. +Also, it requires a space between identifiers. +In short, use (S K) instead of (SK), “`sk”, **i*i*i*ii*i*i*ii, +or 11111100011100.

    + +

    Huge memory may be required to compile the program +(about 300 MB on my machine).

    + +

    In addition, there are some limitations (and workarounds) +mentioned in Spoiler section. +But I think it wouldn’t matter only when you run the attached programs.

    + +

    Portability

    + +

    I confirmed that the program successfully worked +with the following compilers.

    + +
      +
    • gcc 4.6.3 [Linux, Mac OS X]
    • +
    • clang 3.0 [Linux, Mac OS X]
    • +
    • tcc 0.9.26 [Linux] + +
        +
      • N.B. tcc 0.9.25 seems to have a bug and fails to run it.
      • +
      +
    • +
    + + +

    Recent compilers with -Wall -W -Wextra -pedantic say nothing.

    + +
    gcc -Wall -W -Wextra -pedantic prog.c
    +clang -Wall -W -Wextra -pedantic prog.c
    +tcc -Wall -W -Wextra -pedantic prog.c
    +
    + +

    I think it will work on almost all platforms. I confirmed:

    + +
      +
    • Ubuntu Linux
    • +
    • Mac OS X
    • +
    • Raspberry PI
    • +
    + + +

    To check whether the program is specified on the command line +or included from another source file, +the program uses a predefined macro __INCLUDE_LEVEL__. +It is a gcc extention, and also supported by clang. +If your compiler does not support it, +you cannot use the program as a library. +But you can compile and run it as a standalone program, at least. +In fact, tcc does not support the macro, but does work.

    + +

    Spoiler (rot13)

    + +

    Gur jubyr cebtenz vf vagrecergrq ol znpeb rkcnafvba. +Sbe rknzcyr, F (X V) vf genafyngrq gb n abezny P pbqr, (f)((x)(v)), +be fvzcyl f(x(v)). +Guvf rkcerffvba ergheaf na nofgenpg flagnk gerr, +naq cebt.p rinyhngrf vg. +Guvf cebtenz hfrf irel fvzcyr “grez erjevgvat” nccebnpu +sbe rinyhngvat FXV pbzovangbe pnyphyhf. +Gur erjevgvat ehyrf ner fubja va gur funcr bs gur pbqr.

    + +

    Nohfr bs shapgvba cbvagref

    + +

    Pbafvqre n frdhrapr bs shapgvba nccyvpngvbaf va P:

    + +
    f(k)(k)(k)(k)...
    +
    + +

    Jung glcr fubhyq f unir? +Hasbeghangryl, P qbrf abg cebivqr n “erphefvir glcr”, +fhpu nf glcrqrs s (*s)();. +Fb, V hfrq n urniyl arfgrq shapgvba cbvagre glcr:

    + +
    glcrqrs ibvq *(*(*(*...(*(s))()...)())())
    +
    + +

    Guvf yvzvgf ubj znal nethzragf bar shapgvba pna or pbafrphgviryl nccyvrq gb. +Ohg lbh pna vapernfr gur ahzore ol gjrnxvat gur qrsvavgvba bs znpeb c.

    + +

    Pbqr qhcyvpngvba ol znpebf

    + +

    Arkg, jr arrq gb rapbqr “pybfherf”. +N pybfher vf n shapgvba gbtrgure jvgu na raivebazrag +juvpu vf n ersrerapr gb aba-ybpny inevnoyr.

    + +

    Va guvf pnfr, jr arrq fbzrguvat gung:

    + +
      +
    • vf pnyynoyr vgfrys,
    • +
    • vagreanyyl cbffrffrf n ersrerapr gb nabgure pybfher nf n aba-ybpny inevnoyr, naq
    • +
    • nccyvrf gur vagreany pybfher gb na nethzrag jura vg vf pnyyrq.
    • +
    + + +

    Ubjrire, ab glcr va P vf pnyynoyr naq unf n ersrerapr ng gur fnzr gvzr. +(Vg vf srnfvoyr ol qlanzvp pbqr trarengvba, ohg vg vf sne sebz cbegnoyr.)

    + +

    Fb, V nqqerffrq guvf vffhr ol trarengvat znal shapgvba qrsvavgvbaf +fgngvpnyyl ol (no)hfvat znpebf:

    + +
    ibvq *k1; ibvq s1(ibvq *l) { erghea nccyl(k1, l); }
    +ibvq *k2; ibvq s2(ibvq *l) { erghea nccyl(k2, l); }
    +ibvq *k3; ibvq s3(ibvq *l) { erghea nccyl(k3, l); }
    +...
    +ibvq *(u[]) = { s1, s2, s3, ... }
    +
    + +

    naq ol nyybgvat rnpu bs gurz jura n pybfher vf arrqrq.

    + +

    Guvf yrnqf gb nabgure yvzvgngvba: +gur ahzore bs cer-qrsvarq pybfherf yvzvgf +ubj znal vaqragvsvref (F X V) bar cebtenz pna hfr. +Ohg lbh pna vapernfr guvf ahzore +ol gjrnxvat gur qrsvavgvba bs znpeb N O P naq Q. +(Abgr gung pybfherf ner nyybggrq bayl jura cnefvat; +nsgre gur rinyhngvba fgnegf, “bhg bs pybfher” pnaabg bpphe.)

    + +

    Fubeg pbeqvat

    + +

    Guvf znetva vf gbb aneebj gb pbagnva n qrgnvyrq rkcynangvba. +Vafgrnq, V whfg nfx lbh bar dhrfgvba. +Pna lbh gryy jung i f[]={0,0,f+6,f+2,f+4,f,f+3,f+5,f+1}; vf? +V sbhaq guvf ol hfvat FZG fbyire.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2013/endoh1/hint.text b/2013/endoh1/hint.text new file mode 100644 index 000000000..b32f6bce2 --- /dev/null +++ b/2013/endoh1/hint.text @@ -0,0 +1,216 @@ +# Most lazy SKIer + +Yusuke Endoh + + + + +## Judges' comments: +### To build: + + make + +This builds endoh1, echo, hello, and tac. +### To run: + + ./endoh1 [file.lazy] + +### Try: + + ./endoh1 hello.lazy + ./hello + echo Hello | ./echo + ./tac < endoh1.c + +Be patient with the last one. + +### Selected Judges Remarks: + +We liked this entry because it can serve as a standalone program as well as an include file; and, as usual, +because its input data is at least as obfuscated as the program itself. + +This entry can be considered an abuse of the GCC's optimizer; it takes GCC about 4x longer to compile it +with -O3 than without, compared to clang's 2x. + + + +## Author's comments: +### Remarks + + $ less prog.c + $ gcc -o prog prog.c + $ ./prog + +... Isn't there any more to it? + +Yes, of course. + +This is a tool *for C programmers* to play the [SKI combinator calculus][1], +especially, [Lazy K][2]. + +This program will shine when it is used as a library. +For example, `hello.lazy` is a "Hello world" program written in Lazy K. + + $ lazy hello.lazy + Hello, world! + +where `lazy` is [a reference implementation of Lazy K][3]. +At the same time, `hello.lazy` is *a valid C program* that uses `prog.c` as a library. + + $ gcc -o hello -xc hello.lazy + $ ./hello + Hello, world! + +In other words, this program is a kind of [polyglot][4]. + +The usage is simple: +you just have to wrap Lazy K program with `#include "prog.c"`. +Note that `#` is a comment in Lazy K. + +[1]: http://en.wikipedia.org/wiki/SKI_combinator_calculus +[2]: redacted +[3]: redacted +[4]: http://en.wikipedia.org/wiki/Polyglot_%28computing%29 + + +### Obfuscation + +... is inherent in SKI combinator calculus :-) + +In addition, it uses various hacks to parse SKI code as C, +and to satisfy IOCCC's size rule. + +* Abuse of function pointers +* Code duplication by macros +* Short coding + +These led to the good obfuscation. +See Spoiler section in detail, if you need. + + +### Limitation + +This program supports only "Combinator-calculus style notation" of Lazy K. +"Unlambda style" and "Iota and Jot" style are not supported. +Also, it requires a space between identifiers. +In short, use `(S K)` instead of `(SK)`, "\`sk", `**i*i*i*ii*i*i*ii`, +or `11111100011100`. + +Huge memory may be required to compile the program +(about 300 MB on my machine). + +In addition, there are some limitations (and workarounds) +mentioned in Spoiler section. +But I think it wouldn't matter only when you run the attached programs. + + +### Portability + +I confirmed that the program successfully worked +with the following compilers. + + * gcc 4.6.3 [Linux, Mac OS X] + * clang 3.0 [Linux, Mac OS X] + * tcc 0.9.26 [Linux] + * N.B. tcc 0.9.25 seems to have a bug and fails to run it. + +Recent compilers with `-Wall -W -Wextra -pedantic` say nothing. + + gcc -Wall -W -Wextra -pedantic prog.c + clang -Wall -W -Wextra -pedantic prog.c + tcc -Wall -W -Wextra -pedantic prog.c + +I think it will work on almost all platforms. I confirmed: + + * Ubuntu Linux + * Mac OS X + * Raspberry PI + +To check whether the program is specified on the command line +or included from another source file, +the program uses a predefined macro `__INCLUDE_LEVEL__`. +It is a gcc extention, and also supported by clang. +If your compiler does not support it, +you cannot use the program as a library. +But you can compile and run it as a standalone program, at least. +In fact, tcc does not support the macro, but does work. + + +### Spoiler (rot13) + +Gur jubyr cebtenz vf vagrecergrq ol znpeb rkcnafvba. +Sbe rknzcyr, `F (X V)` vf genafyngrq gb n abezny P pbqr, `(f)((x)(v))`, +be fvzcyl `f(x(v))`. +Guvf rkcerffvba ergheaf na nofgenpg flagnk gerr, +naq `cebt.p` rinyhngrf vg. +Guvf cebtenz hfrf irel fvzcyr "grez erjevgvat" nccebnpu +sbe rinyhngvat FXV pbzovangbe pnyphyhf. +Gur erjevgvat ehyrf ner fubja va gur funcr bs gur pbqr. + +#### Nohfr bs shapgvba cbvagref + +Pbafvqre n frdhrapr bs shapgvba nccyvpngvbaf va P: + + f(k)(k)(k)(k)... + +Jung glcr fubhyq `f` unir? +Hasbeghangryl, P qbrf *abg* cebivqr n "erphefvir glcr", +fhpu nf `glcrqrs s (*s)();`. +Fb, V hfrq n urniyl arfgrq shapgvba cbvagre glcr: + + glcrqrs ibvq *(*(*(*...(*(s))()...)())()) + +Guvf yvzvgf ubj znal nethzragf bar shapgvba pna or pbafrphgviryl nccyvrq gb. +Ohg lbh pna vapernfr gur ahzore ol gjrnxvat gur qrsvavgvba bs znpeb `c`. + + +#### Pbqr qhcyvpngvba ol znpebf + +Arkg, jr arrq gb rapbqr "pybfherf". +N pybfher vf n shapgvba gbtrgure jvgu na raivebazrag +juvpu vf n ersrerapr gb aba-ybpny inevnoyr. + +Va guvf pnfr, jr arrq fbzrguvat gung: + + * vf pnyynoyr vgfrys, + * vagreanyyl cbffrffrf n ersrerapr gb nabgure pybfher nf n aba-ybpny inevnoyr, naq + * nccyvrf gur vagreany pybfher gb na nethzrag jura vg vf pnyyrq. + +Ubjrire, ab glcr va P vf pnyynoyr naq unf n ersrerapr ng gur fnzr gvzr. +(Vg vf srnfvoyr ol qlanzvp pbqr trarengvba, ohg vg vf sne sebz cbegnoyr.) + +Fb, V nqqerffrq guvf vffhr ol trarengvat znal shapgvba qrsvavgvbaf +fgngvpnyyl ol (no)hfvat znpebf: + + ibvq *k1; ibvq s1(ibvq *l) { erghea nccyl(k1, l); } + ibvq *k2; ibvq s2(ibvq *l) { erghea nccyl(k2, l); } + ibvq *k3; ibvq s3(ibvq *l) { erghea nccyl(k3, l); } + ... + ibvq *(u[]) = { s1, s2, s3, ... } + +naq ol nyybgvat rnpu bs gurz jura n pybfher vf arrqrq. + +Guvf yrnqf gb nabgure yvzvgngvba: +gur ahzore bs cer-qrsvarq pybfherf yvzvgf +ubj znal vaqragvsvref (`F` `X` `V`) bar cebtenz pna hfr. +Ohg lbh pna vapernfr guvf ahzore +ol gjrnxvat gur qrsvavgvba bs znpeb `N` `O` `P` naq `Q`. +(Abgr gung pybfherf ner nyybggrq bayl jura cnefvat; +nsgre gur rinyhngvba fgnegf, "bhg bs pybfher" pnaabg bpphe.) + + +#### Fubeg pbeqvat + +Guvf znetva vf gbb aneebj gb pbagnva n qrgnvyrq rkcynangvba. +Vafgrnq, V whfg nfx lbh bar dhrfgvba. +Pna lbh gryy jung `i f[]={0,0,f+6,f+2,f+4,f,f+3,f+5,f+1};` vf? +V sbhaq guvf ol hfvat FZG fbyire. + +-------------------------------------------------------------------------------- + diff --git a/2013/endoh1/rot13.ed b/2013/endoh1/rot13.ed new file mode 100644 index 000000000..17076b956 --- /dev/null +++ b/2013/endoh1/rot13.ed @@ -0,0 +1,36 @@ +/rot13 +.s/rot13/click the text to rot13/ +a + +. +$ +a + +. +wq diff --git a/2013/endoh1/tac.lazy b/2013/endoh1/tac.lazy new file mode 100644 index 000000000..b8c15cda3 --- /dev/null +++ b/2013/endoh1/tac.lazy @@ -0,0 +1,5 @@ +#include "endoh1.c" + +S(K(S I I(S(K(S(S(S I(K(K(K(K I)))))(K(K(S I I(S I I(S(S(K S)K)I))))))))(S(S(K S)(S(K(S(S(S I(K K))(K(K(K(K I)))))))(S(S(K S)(S(K K)(S I I)))(K(S I(K(K I)))))))(S(K(S(S(K S)(S(K(S I))(S S(S(S I(K K)))(K K))))))(S(K(S(K K)))(S(S(K S)(S(K K)(S I I)))(K(S(S(K S)(S(K(S I))(S(K K)(S(S I(K K))(K(K I))))))(S(K K)(S I(K(K I)))))))))))))(S(K(S I I(S(K(S(S(K S)(S(K(S(S I(K(K(K(K I)))))))K))))(S(S(K S)(S(K(S(K S)))(S(S(K S)(S(K K)(S(K S)(S(K K)(S I I)))))(K(S(K(S(S(K S)(S(K(S I))(S S(S I)(K K))))))(S(K K)K))))))(K(K(S I(K(K I)))))))(K K)))(S I I(S(K(S(S(K S)(S(K K)(S(K(S I I(S I I(S(S(K S)K)I))(S(K(S I))K)))(S(K K)(S(K(S(S(S I(K(K(K(K I)))))(K(K K)))(S(S(K S)(S(K(S I))K))(K(K(K K))))))(S I(K(K K))))))))))(S(K(S(K(S(S(S I(K K))(K(S(K(S I))K)))))))(S(K(S(K(S(K K)))))(S(S(K S)(S(K(S(K S)))(S(K(S(K(S(S(K(S I(K K)))(S(S(S I(K K))(K(S I(K(K I)))))(K(S(S(K S)K)I(S(S(K S)K)(S I I(S(S(K S)K)I))(S(K(S(S I(K(K I)))))K))(S(S I(K K))(K(S I I(S(K(S(K(S(S I(K(K I)))))K))(S I I)))))))))))))(S(K(S(S(K S)(S S(S(S(K S)(S(K K)(S(K S)(S(K(S I))(S(K K)(S I(K(S(S I(K(S(K(S(S(K S)K)I))(S(S(K S)K)(S I I(S(S(K S)K)I))))))(K(K K)))))))))))(K K)))))(S(K K)(S(S(K S)(S(K K)(S(S I I)(K I))))(K(S I(K(K I))))))))))(S(S(K S)(S(K(S(K S)))(S(S(K S)(S(K K)(S(K S)(S(K K)(S I I)))))(K(S(S(K S)(S(K K)(S(K S)K)))(K(S(S(K S)(S(K K)(S(K S)(S(K(S I))(S S(S I)(K K))))))(K K))))))))(K(K(S I(K(K I))))))))))I)) + +#include "endoh1.c" diff --git a/2013/endoh2/Makefile b/2013/endoh2/Makefile new file mode 100644 index 000000000..d15dde378 --- /dev/null +++ b/2013/endoh2/Makefile @@ -0,0 +1,219 @@ +#!/usr/bin/env make +# +# 2013 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -W -Wno-empty-body +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${LIBS} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= endoh2 +DATA=jpeg.jpg jpeg.c +ALT_OBJ= +ALT_ENTRY=jpeg + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ + +${ALT_ENTRY}: ${ALT_ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + +jpeg.c: ${ENTRY} + ${RM} -f $@ + ./${ENTRY} < ${ENTRY}.c > $@ + +jpeg.jpg: ${ALT_ENTRY} + ${RM} -f $@ + @echo This next step will take some time + ./${ALT_ENTRY} > $@ + +check: ${DATA} + ${RM} -f jpeg2.c + ruby ocr.rb jpeg.jpg > jpeg2.c + diff jpeg.c jpeg2.c && echo Check succeeded + +############### +# utility rules +############### +# +everything: all alt check + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Lehmer!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "Park different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Paul Erdos!"; \ + fi + @${TRUE} + diff --git a/2013/endoh2/endoh2.c b/2013/endoh2/endoh2.c new file mode 100644 index 000000000..a737f01d8 --- /dev/null +++ b/2013/endoh2/endoh2.c @@ -0,0 +1,46 @@ + /*@@@sssss8]][[[[a#@@sss0['w}8|v}a<{av}a@{av}j>~{v}j8|c[sa?|{8[|#~} + [j#@ra>~}sa!{>}|#r0l}sao8}[a'f8|r'8[j?x[?@<[j?@[j?@[s?>|;[[[j!>b'8'a@? + c$kg_@|_ah|sr<|i[[[}s#f@}[{@u~~~r@[|#|{ssss{a + }|0~{?}|<{?}|qj?}s@[_}j0]][[[[a_@@@sssss<[[?>=sln5+a[so#,g-0aw;#*a>*abwa.*+da9=n?<6 + -'7%71>e_?>a[j;e=;scdet?>shd??a;5&6:=[ch@aw[sf;[#<[[j>k7__?>>d>==n'6+7*abcdnh3a_jhw + b6;73;b#=#d5;8w3;nawn#<;;77__ra?8hi1abcww#>==<[;k7[wn7[=,>ab[a@s[ + ='b,.[8.?>>fdjn(_2$a8c8[[j_8.=B6+b8]]]]]]]]]j1;7_sj<[[af;7sjd][j_<7!=a>d7_j8d.ab[hybm + ?>=;ei7aws1d!ebn _,?>0aka[#;5+7 + !?ac;7_wa7{;a3_ bjcna>a<;bs8;7 + j-=cabh?97_sj[' -5*j[!;5+a7[1wb[!wBb7w?0wb + _?an+&e_|j'4a<7 0v;7d.kd8wa?.=:a-wwm=:;[e5 + *-=fwn7rab[c.j# eaw#c>>>bml;mtdekssae + zqtd[39_ *--2013-ioc + cc-2013-ioccc-2 013-- *_#define + @n(d);c ((d)> + >8);c ( + d + );*B= 32;B[ y=1]=22 .627400; B[2]=16;_*-i occc-2013 -ioccc + -2013-io ccc-201 *_int@a,b,d,e,s,t ,g,z,y;double@f, B[3],i,j,k,l;void + @m(int@z){f or(j=k= l=y=1;y<99;y+=2+0) l*=z*z* .038553 ,k*=-y*(y+1),j+=l_ + k;i*=j;}int@c( int@d){ return@ putchar (d)_255; }intmain (){for( ;*p;p++ + )*p<33?0:(*h++=*p -32);q= h;for(p =w;p4?160:30 :d>35?2 7<<(d-3 6):d_9* 6);q++)*q=d<0?*p>>e& 1:d<6|| q[d>35? +-108:d%9*-12-12];for(q=h ;g++<61 56;q++)* q?*q=*p- 4?e=*p+ +,e-32?e:0:r&&*r?g +%108<2?2:*r++:(r=r?p++:w, 2):0;n( g=8*8187)n(g+8)n(1 6)n(19014)n(18758) ;for(;s<10;s++)c( + s<3?s:0)n(g+3)n (67)for (;t<65;)c(t++>0) n(g-24)n(11)c(8 )n(612)n(656)n( + 257)n(4352)n(g+ 0-20)n( 5*42);; for(;y ++<207;)c( y<3 1?y<19? + y>6:30-y:y<47?y <32||y>36? 16:0:y< 48?2:y%1 6*16+13- + y_16)n(64*960)n (g+5)n(4)n( 1)n(g+2 )n(8)n(257)n(0)n( + 2*8064)for(;b<4 04096;b++ ){e=32< a?63-a:a;for(f + =d=t=s=0;e>t;)e + -=++t;e=t%2?e:t -e;;;for(d=a>3 + 1?e=7-e,14-t-e: t-e;s<64;t=f-= + i*B[!d+!e])z=b_ 64%82*8+s_8-4, + y=b_5248*8+s%8+7 ,i=z<0||z>647|| + y%11>9?1:q[h[z_6+y_11*108]*60+y%11*6+z%6]*2-1,m(s_8*2*d+d),m(s++%8*2*e+e);s=2+t*t;;fo + r(d=2;s>3;s_=4)d*=2;;s=8<<(a?12:9);s-=d*2<0?t:t-1+d;c(s_256)?c(0):0;c(s)? + c(0):0;if(a++>62){n(g-8+b_64%8)a=0;}}n(g+1)return@0+0;}*/ /*IOCCC*/#include + char*p,w[13997],*h=w,*q,*r;int d,e,g;int main(){for(;e<3583;e++>15&&e<3582&&d>32?*h + ++=d-95?d:47:0)d=getchar();q=h;for(p=w;p4?160:30:d>35?27<<(d-36):d/9*6);q++)*q=d<0?*p>>e&1:d<6||q[d>35?-108:d%9*-12 + -12];for(q=h+108;g++<5995;)putchar(g%109<1?10:*q++?*p-36?(e=*p++)-64?e:32:r + /*IOCCC2013*/&&*r?g%109%108<2?34:*r++:(r=r?p++:w,34):32);return 0;} diff --git a/2013/endoh2/hint.html b/2013/endoh2/hint.html new file mode 100644 index 000000000..f4282f0ab --- /dev/null +++ b/2013/endoh2/hint.html @@ -0,0 +1,125 @@ + + + + + + + Most recyclable + + +

    Most recyclable

    + +

    Yusuke Endoh
    +mame@ruby-lang.org
    +https://github.com/mame/

    + +

    Judges' comments:

    + +

    To build:

    + +
    make endoh2
    +
    + +

    To run:

    + +
     make all   
    +
    + +

    You’ll need to have Ruby installed to run all the automated check

    + +
    make check
    +
    + +

    Try:

    + +
    cat jpeg.c
    +
    + +

    Look at jpeg.jpg in an image viewer program.

    + +

    Selected Judges Remarks:

    + +

    This is a program which, when fed its own source, generates a program that almost is its whitespace inverse, +which, in its order, generates a JPEG file (speaking of file size abuse, that is about 16.4 times +larger than a PBM file with the same image, but the source was also abusing the size counting program…)

    + +

    Don’t pay attention to the OCR behind the ruby curtain — it’s a straightforward bitmap comparison.

    + +

    Author’s comments:

    + +

    Highlights

    + +
      +
    • LZ77-like compression for font and template data
    • +
    • tiny JPEG encoder + +
        +
      • Zig-zag space-filling curve
      • +
      • Discrete cosine transform
      • +
      • JPEG Huffman encoding (cheeting)
      • +
      +
    • +
    + + +

    Notes

    + +

    I picked JPEG instead of PNG, GIF, or BMP +because it is the most difficult to generate. +I believe that the JPEG encoder is the world’s smallest ever. +Nevertheless, the program was too big to meet the IOCCC’s size rule. +So I created a smaller bootstrap program that generates the main program. +prog.c contains fragments of the main program as a comment +which iocccsize -i does not count. +I gratefully think the judges for spoiling the size rule this year.

    + +

    I think the program will work on any major platforms and compilers.

    + +

    Legal

    + +

    This program uses (a part of) Proggy Tiny Fonts +which is distributed in MIT License:

    + +
    Copyright (c) 2004, 2005 Tristan Grimmer
    +
    +Permission is hereby granted, free of charge, to any person obtaining a
    +copy of this software and associated documentation files (the "Software"),
    +to deal in the Software without restriction, including without limitation
    +the rights to use, copy, modify, merge, publish, distribute, sublicense,
    +and/or sell copies of the Software, and to permit persons to whom the
    +Software is furnished to do so, subject to the following conditions:
    +
    +The above copyright notice and this permission notice shall be included in
    +all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
    +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
    +DEALINGS IN THE SOFTWARE.
    +
    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2013/endoh2/hint.text b/2013/endoh2/hint.text new file mode 100644 index 000000000..d80d5228d --- /dev/null +++ b/2013/endoh2/hint.text @@ -0,0 +1,90 @@ +# Most recyclable + +Yusuke Endoh + + + + +## Judges' comments: +### To build: + + make endoh2 + +### To run: + + make all + +You'll need to have Ruby installed to run all the automated check + + make check + +### Try: + + cat jpeg.c + +Look at jpeg.jpg in an image viewer program. + + +### Selected Judges Remarks: + +This is a program which, when fed its own source, generates a program that almost is its whitespace inverse, +which, in its order, generates a JPEG file (speaking of file size abuse, that is about 16.4 times +larger than a PBM file with the same image, but the source was also abusing the size counting program...) + +Don't pay attention to the OCR ~~behind the ruby curtain~~ --- it's a straightforward bitmap comparison. + +## Author's comments: +### Highlights + +* LZ77-like compression for font and template data +* tiny JPEG encoder + * Zig-zag space-filling curve + * Discrete cosine transform + * JPEG Huffman encoding (cheeting) + +### Notes + +I picked JPEG instead of PNG, GIF, or BMP +because it is the most difficult to generate. +I believe that the JPEG encoder is the world's smallest ever. +Nevertheless, the program was too big to meet the IOCCC's size rule. +So I created a smaller bootstrap program that generates the main program. +`prog.c` contains fragments of the main program *as a comment* +which `iocccsize -i` does *not* count. +I gratefully think the judges for spoiling the size rule this year. + +I think the program will work on any major platforms and compilers. + +### Legal + +This program uses (a part of) Proggy Tiny Fonts +which is distributed in MIT License: + + Copyright (c) 2004, 2005 Tristan Grimmer + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + +-------------------------------------------------------------------------------- + diff --git a/2013/endoh2/ocr.rb b/2013/endoh2/ocr.rb new file mode 100644 index 000000000..98c4965fc --- /dev/null +++ b/2013/endoh2/ocr.rb @@ -0,0 +1,43 @@ +Font = { + 0x000000000000000 => 32, 0x008208208008000 => 33, 0x514500000000000 => 34, + 0x00053e514f94000 => 35, 0x0087a870af08000 => 36, 0x00046a50a562000 => 37, + 0x01892462589d000 => 38, 0x208200000000000 => 39, 0x108410410408100 => 40, + 0x408104104108400 => 41, 0x00022a72a200000 => 42, 0x000208f88200000 => 43, + 0x000000000008400 => 44, 0x000000f80000000 => 45, 0x000000000008000 => 46, + 0x082104208410800 => 47, 0x01c8a2aa289c000 => 48, 0x00860820821c000 => 49, + 0x01c88231083e000 => 50, 0x01c88230289c000 => 51, 0x00431493e104000 => 52, + 0x03e820f0289c000 => 53, 0x00c420f2289c000 => 54, 0x03e084108210000 => 55, + 0x01c8a272289c000 => 56, 0x01c8a2782118000 => 57, 0x000008000200000 => 58, + 0x000008000210000 => 59, 0x00008cc0c080000 => 60, 0x00003e03e000000 => 61, + 0x000818198800000 => 62, 0x01c882108008000 => 63, 0x01e86db6f81f000 => 64, + 0x00821451c8a2000 => 65, 0x03c8a2f228bc000 => 66, 0x01c8a082089c000 => 67, + 0x0389228a2938000 => 68, 0x03e820f2083e000 => 69, 0x03e820f20820000 => 70, + 0x01c8a09a289e000 => 71, 0x0228a2fa28a2000 => 72, 0x01c20820821c000 => 73, + 0x00e0820820bc000 => 74, 0x022928c28922000 => 75, 0x02082082083e000 => 76, + 0x0228b6daaaa2000 => 77, 0x032caaaaa9a6000 => 78, 0x01c8a28a289c000 => 79, + 0x03c8a2f20820000 => 80, 0x01c8a28a299e000 => 81, 0x03c8a2f228a2000 => 82, + 0x01c8a070289c000 => 83, 0x03e208208208000 => 84, 0x0228a28a289c000 => 85, + 0x0228a2514208000 => 86, 0x022aaaa94514000 => 87, 0x0228942148a2000 => 88, + 0x0228a2708208000 => 89, 0x03e08421083e000 => 90, 0x710410410410700 => 91, + 0x820410208104080 => 92, 0x704104104104700 => 93, 0x008522000000000 => 94, + 0x000000000000fc0 => 95, 0x008100000000000 => 96, 0x00001c09e89e000 => 97, + 0x82083c8a28bc000 => 98, 0x00001e82081e000 => 99, 0x08209e8a289e000 => 100, + 0x00001c8be81e000 => 101, 0x39043c410410000 => 102, 0x00001c8a289e09c => 103, + 0x82083c8a28a2000 => 104, 0x008018208208000 => 105, 0x00400c104104138 => 106, + 0x410412518512000 => 107, 0x608208208208000 => 108, 0x000034aaaaaa000 => 109, + 0x00003c8a28a2000 => 110, 0x00001c8a289c000 => 111, 0x00003c8a28bc820 => 112, + 0x00001e8a289e082 => 113, 0x00002cca0820000 => 114, 0x00001e81c0bc000 => 115, + 0x01041c41040e000 => 116, 0x0000228a289e000 => 117, 0x000022894508000 => 118, + 0x000022aaa514000 => 119, 0x000022508522000 => 120, 0x0000228a289e09c => 121, + 0x00003e10843e000 => 122, 0x108208408208100 => 123, 0x208208208208200 => 124, + 0x408208108208400 => 125, 0x000000666000000 => 126 +} + +field = IO.popen("convert #{ ARGV[0] } gray:-") {|f| f.read } +field = field.unpack("C*").map {|n| n >= 0x80 ? 1 : 0 }.each_slice(656).to_a +55.times do |y| + 108.times do |x| + print Font[(0..9).map {|j| field[y*11+j+4][x*6+4,6] }.join.to_i(2)].chr + end + puts +end diff --git a/2013/endoh3/Makefile b/2013/endoh3/Makefile new file mode 100644 index 000000000..16357b13f --- /dev/null +++ b/2013/endoh3/Makefile @@ -0,0 +1,202 @@ +#!/usr/bin/env make +# +# 2013 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -Wno-implicit-int -Wno-main -Wno-implicit-function-declaration +#CWARN= -Wall -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} -include stdio.h ${CSTD} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= endoh3 +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Lehmer!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "Park different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Paul Erdos!"; \ + fi + @${TRUE} diff --git a/2013/endoh3/endoh3.c b/2013/endoh3/endoh3.c new file mode 100644 index 000000000..ef1a255a1 --- /dev/null +++ b/2013/endoh3/endoh3.c @@ -0,0 +1 @@ +char a;float b,c;main(d){for(;d>2e3*c?c=1,scanf(" %c%f",&a,&c),d=55-a%32*9/5,b=d>9,d=d%13-a/32*12:1;a=2)++d<24?b*=89/84.:putchar(a=b*d);} \ No newline at end of file diff --git a/2013/endoh3/flea-waltz.abc b/2013/endoh3/flea-waltz.abc new file mode 100644 index 000000000..bbbd25046 --- /dev/null +++ b/2013/endoh3/flea-waltz.abc @@ -0,0 +1,2 @@ +dc Fzfzfzdc Fzfzfzdc FzfzDzfz Czezez +dc Czezezdc Czezezdc CzezDzez Fzfzfz diff --git a/2013/endoh3/hint.html b/2013/endoh3/hint.html new file mode 100644 index 000000000..1e0e14cd8 --- /dev/null +++ b/2013/endoh3/hint.html @@ -0,0 +1,242 @@ + + + + + + + Most tweetable 1-liner + + +

    Most tweetable 1-liner

    + +

    Yusuke Endoh
    +mame@ruby-lang.org
    +https://github.com/mame/

    + +

    Judges' comments:

    + +

    To build:

    + +
    make endoh3
    +
    + +

    To run:

    + +
    ./endoh3
    +
    + +

    Try:

    + +

    Trying this out will depend on how your system can play sounds. The author’s +remarks include some options for different operating systems.

    + +

    The simplest way is to create a .wav file and have your system play that.

    + +
    echo 'CDEFGABc' | ./endoh3 | ruby wavify.rb > cde.wav
    +
    + +

    There are also some other musical samples, twinkle.abc and menuet.abc.

    + +

    Selected Judges Remarks:

    + +

    This program can tweet out a tune and is small enough to tweet.

    + +

    Author’s comments:

    + +

    Remarks

    + +

    This is a sound synthesizer for a subset of ABC music notation.

    + +

    Try:

    + +
    gcc -o prog prog.c
    +echo "CDEFGABc" | ./prog > /dev/dsp
    +
    + +

    If /dev/dsp is not available on your system, use an OSS sound wrapper such +as padsp or aoss:

    + +
    echo "CDEFGABc" | ./prog | padsp tee /dev/dsp > /dev/null
    +
    + +

    If you are using Mac OS X, try sox:

    + +
    echo "CDEFGABc" | ./prog | sox -q -traw -r8000 -b8 -e unsigned-integer - -tcoreaudio
    +
    + +

    If they do not work, use the attached script to convert the output +into a wave file format:

    + +
    echo "CDEFGABc" | ./prog | ruby wavify.rb > cde.wav
    +
    + +

    and play cde.wav.

    + +

    You can enjoy some music scores that I attached:

    + +
    cat twinkle.abc | ./prog > /dev/dsp
    +cat menuet.abc | ./prog > /dev/dsp
    +
    + +

    Obfuscation

    + +

    The following sequence of questions may be helpful to understand the program.

    + +
      +
    • How does it convert ABC notes into the frequency?
    • +
    • What is 89/84.? I found it by using Stern-Brocot tree.
    • +
    • How does it generate a wave? Hint: it generates a saw wave.
    • +
    + + +

    Limitation

    + +

    The following features are supported:

    + +
      +
    • Notes: + +
        +
      • C D E F G A B (in low octave)
      • +
      • c d e f g a b (in high octave)
      • +
      +
    • +
    • Rests: z
    • +
    • Note lengths: + +
        +
      • A (an eighth note)
      • +
      • A2 (a quarter note)
      • +
      • A3 (a dotted quarter note)
      • +
      • A4 (a half note)
      • +
      +
    • +
    + + +

    The following features are not supported:

    + +
      +
    • Sharp and flat: ^C _C + +
        +
      • But it is possible to emit the half tones. Do you see how?
      • +
      +
    • +
    • Shorter note lengths than 1: C1/2 + +
        +
      • But you can use C0.5 instead.
      • +
      +
    • +
    • Higher and lower notes: c' C,
    • +
    • Any meta fields: T:title L:1/4
    • +
    • Bar line, repeat, ties and slurs, and everything else.
    • +
    + + +

    Known Bugs

    + +

    You can not write a note length immediately followed by a note E, +such as C2E2. +Can you know why? +You can work it around by inserting a whitespace: C2 E2.

    + +

    Portability

    + +

    I tested it on:

    + +
      +
    • Ubuntu 13.10 with gcc 4.7.3, clang 3.2, and tcc 0.9.25.
    • +
    • Mac OS X 10.6 with gcc 4.2.1 and clang 1.7.
    • +
    + + +

    Legal

    + +

    I believe that all the scores that I attached are out-of-copyright.

    + +

    I did write a score of the Happy Birthday song too. +(It does not matter because the song is out-of-copyright in my country.) +But I do not attach it to protect you from W****r.

    + +

    For the same reason, do not play a score that contains only z1092. +You know, it is “the famous song”.

    + +

    Spoiler (rot13)

    + +

    Urer vf n zntvpny rkcerffvba juvpu V sbhaq ol oehgr-sbepr:

    + +
    (p % 32 + 5) * 9 / 5 % 13 + a / 32 * 12 - 22
    +
    + +

    Vagrerfgvatyl, vg pbairegf na NFPVV ahzore bs NOP abgrf +gb gur pbeerfcbaqvat gbar ahzore.

    + +
    'P' (NFPVV  67) =>  3
    +'Q' (NFPVV  68) =>  5
    +'R' (NFPVV  69) =>  7
    +'S' (NFPVV  70) =>  9
    +'T' (NFPVV  71) => 10
    +'N' (NFPVV  65) => 12
    +'O' (NFPVV  66) => 14
    +'p' (NFPVV  99) => 15
    +'q' (NFPVV 100) => 17
    +'r' (NFPVV 101) => 19
    +'s' (NFPVV 102) => 20
    +'t' (NFPVV 103) => 22
    +'n' (NFPVV  97) => 24
    +'o' (NFPVV  98) => 26
    +
    + +

    Ol gur jnl, lbh pna jevgr n unys-gbar ol gur sbyybjvat punenpgref.

    + +
    'X' =>  4 (= P#)
    +'Y' =>  6 (= Q#)
    +'H' =>  8 (= S#)
    +'I' => 11 (= T#)
    +'C' => 13 (= N#)
    +
    + +

    Abgr gung gur gbar ahzoref fvzcyl rahzrengr gur frzv-gbar fgrcf. +Fb jr pna pnyphyngr gur serdhrapl rnfvyl: cbj(2, a / 12.0). +Gura, ubj pna jr pnyphyngr cbj jvgubhg zngu.u? +cbj(2, 1.0 / 12.0) vf nccebkvzngrq ol 89/84.. +(V sbhaq guvf nccebkvzngvba ol hfvat Fgrea-Oebpbg gerr.) +Jr pna tnva gur serdhrapl ol zhygvcylvat gur inyhr a gvzrf.

    + +

    Svanyyl, gur sbyybjvat pbqr trarengrf n fnj jnir:

    + +
    sbe(p = 0; p < yra; p++) chgpune(n = a * Q);
    +
    + +

    jurer Q vf n serdhrapl naq n vf n inevnoyr jubfr glcr vf pune. +Ol nffvtavat sybng gb pune inevnoyr, gur vzcyvpvg glcr pbairegvba vf cresbezrq sebz sybng gb pune (zbqhyb 256). +(Fgevpgyl fcrnxvat, guvf orunivbe vf haqrsvarq nppbeqvat gb 6.3.1.4 va P99; +lbh pna ercynpr vg jvgu (ybat)(a*Q) vs lbh ner crqnagvp.)

    + +

    Nyy gung jnf yrsg jnf gb pbzovar naq pbaqrafr gur pbzcbaragf. +Gur xrl vf fdhnfuvat gurz vagb whfg bar sbe-ybbc.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2013/endoh3/hint.text b/2013/endoh3/hint.text new file mode 100644 index 000000000..b806a20c9 --- /dev/null +++ b/2013/endoh3/hint.text @@ -0,0 +1,180 @@ +# Most tweetable 1-liner + +Yusuke Endoh + + + + +## Judges' comments: +### To build: + + make endoh3 + +### To run: + + ./endoh3 + +### Try: + +Trying this out will depend on how your system can play sounds. The author's +remarks include some options for different operating systems. + +The simplest way is to create a .wav file and have your system play that. + + echo 'CDEFGABc' | ./endoh3 | ruby wavify.rb > cde.wav + +There are also some other musical samples, twinkle.abc and menuet.abc. + +### Selected Judges Remarks: + +This program can tweet out a tune and is small enough to tweet. + + +## Author's comments: +### Remarks + +This is a sound synthesizer for a subset of [ABC music notation](http://en.wikipedia.org/wiki/ABC_notation). + +Try: + + gcc -o prog prog.c + echo "CDEFGABc" | ./prog > /dev/dsp + +If `/dev/dsp` is not available on your system, use an OSS sound wrapper such +as `padsp` or `aoss`: + + echo "CDEFGABc" | ./prog | padsp tee /dev/dsp > /dev/null + +If you are using Mac OS X, try [sox](http://sox.sourceforge.net/): + + echo "CDEFGABc" | ./prog | sox -q -traw -r8000 -b8 -e unsigned-integer - -tcoreaudio + +If they do not work, use the attached script to convert the output +into a wave file format: + + echo "CDEFGABc" | ./prog | ruby wavify.rb > cde.wav + +and play `cde.wav`. + +You can enjoy some music scores that I attached: + + cat twinkle.abc | ./prog > /dev/dsp + cat menuet.abc | ./prog > /dev/dsp + +### Obfuscation + +The following sequence of questions may be helpful to understand the program. + +- How does it convert ABC notes into the frequency? +- What is `89/84.`? I found it by using Stern-Brocot tree. +- How does it generate a wave? Hint: it generates a saw wave. + +### Limitation + +The following features are supported: + +- Notes: + - `C` `D` `E` `F` `G` `A` `B` (in low octave) + - `c` `d` `e` `f` `g` `a` `b` (in high octave) +- Rests: `z` +- Note lengths: + - `A` (an eighth note) + - `A2` (a quarter note) + - `A3` (a dotted quarter note) + - `A4` (a half note) + +The following features are *not* supported: + +- Sharp and flat: `^C` `_C` + - But it is possible to emit the half tones. Do you see how? +- Shorter note lengths than 1: `C1/2` + - But you can use `C0.5` instead. +- Higher and lower notes: `c'` `C,` +- Any meta fields: `T:title` `L:1/4` +- Bar line, repeat, ties and slurs, and everything else. + +### Known Bugs + +You can *not* write a note length immediately followed by a note `E`, +such as `C2E2`. +Can you know why? +You can work it around by inserting a whitespace: `C2 E2`. + +### Portability + +I tested it on: + +* Ubuntu 13.10 with gcc 4.7.3, clang 3.2, and tcc 0.9.25. +* Mac OS X 10.6 with gcc 4.2.1 and clang 1.7. + +### Legal + +I believe that all the scores that I attached are out-of-copyright. + +I did write a score of the Happy Birthday song too. +(It does not matter because the song is out-of-copyright in my country.) +But I do not attach it to protect you from W\*\*\*\*r. + +For the same reason, do not play a score that contains only `z1092`. +You know, it is ["the famous song"](http://en.wikipedia.org/wiki/4%E2%80%B233%E2%80%B3). + + +### Spoiler (rot13) + +Urer vf n zntvpny rkcerffvba juvpu V sbhaq ol oehgr-sbepr: + + (p % 32 + 5) * 9 / 5 % 13 + a / 32 * 12 - 22 + +Vagrerfgvatyl, vg pbairegf na NFPVV ahzore bs NOP abgrf +gb gur pbeerfcbaqvat gbar ahzore. + + 'P' (NFPVV 67) => 3 + 'Q' (NFPVV 68) => 5 + 'R' (NFPVV 69) => 7 + 'S' (NFPVV 70) => 9 + 'T' (NFPVV 71) => 10 + 'N' (NFPVV 65) => 12 + 'O' (NFPVV 66) => 14 + 'p' (NFPVV 99) => 15 + 'q' (NFPVV 100) => 17 + 'r' (NFPVV 101) => 19 + 's' (NFPVV 102) => 20 + 't' (NFPVV 103) => 22 + 'n' (NFPVV 97) => 24 + 'o' (NFPVV 98) => 26 + +Ol gur jnl, lbh pna jevgr n unys-gbar ol gur sbyybjvat punenpgref. + + 'X' => 4 (= P#) + 'Y' => 6 (= Q#) + 'H' => 8 (= S#) + 'I' => 11 (= T#) + 'C' => 13 (= N#) + +Abgr gung gur gbar ahzoref fvzcyl rahzrengr gur frzv-gbar fgrcf. +Fb jr pna pnyphyngr gur serdhrapl rnfvyl: `cbj(2, a / 12.0)`. +Gura, ubj pna jr pnyphyngr `cbj` jvgubhg `zngu.u`? +`cbj(2, 1.0 / 12.0)` vf nccebkvzngrq ol `89/84.`. +(V sbhaq guvf nccebkvzngvba ol hfvat [Fgrea-Oebpbg gerr](uggc://ra.jvxvcrqvn.bet/jvxv/Fgrea%R2%80%93Oebpbg_gerr).) +Jr pna tnva gur serdhrapl ol zhygvcylvat gur inyhr `a` gvzrf. + +Svanyyl, gur sbyybjvat pbqr trarengrf n fnj jnir: + + sbe(p = 0; p < yra; p++) chgpune(n = a * Q); + +jurer `Q` vf n serdhrapl naq `n` vf n inevnoyr jubfr glcr vf pune. +Ol nffvtavat sybng gb pune inevnoyr, gur vzcyvpvg glcr pbairegvba vf cresbezrq sebz sybng gb pune (zbqhyb 256). +(Fgevpgyl fcrnxvat, guvf orunivbe vf haqrsvarq nppbeqvat gb 6.3.1.4 va P99; +lbh pna ercynpr vg jvgu `(ybat)(a*Q)` vs lbh ner crqnagvp.) + +Nyy gung jnf yrsg jnf gb pbzovar naq pbaqrafr gur pbzcbaragf. +Gur xrl vf fdhnfuvat gurz vagb whfg bar sbe-ybbc. + +-------------------------------------------------------------------------------- + diff --git a/2013/endoh3/menuet.abc b/2013/endoh3/menuet.abc new file mode 100644 index 000000000..e0cb11af7 --- /dev/null +++ b/2013/endoh3/menuet.abc @@ -0,0 +1,29 @@ +d2GABc d2GzGz +e2cdeu g2GzGz +c2dcBA B2cBAG +U2GABG B2A4 + +d2GABc d2GzGz +e2cdeu g2GzGz +c2dcBA B2cBAG +A2BAGU G6 + +b2gabg a2deud +g2 eugd k2BkA2 +ABkdeu g2u2 e2 +u2A2k2 d6 + +d2GUG2 e2GUG2 +d2ccB2 AGUGA2 +DEUGAB c2B2A2 +BdG2U2 G6 + +b2gabg a2deud +g2 eugd k2BkA2 +ABkdeu g2u2 e2 +u2A2k2 d6 + +d2GUG2 e2GUG2 +d2ccB2 AGUGA2 +DEUGAB ccBBA2 +BdG2U2 G6 diff --git a/2013/endoh3/test.abc b/2013/endoh3/test.abc new file mode 100644 index 000000000..6c6ea3577 --- /dev/null +++ b/2013/endoh3/test.abc @@ -0,0 +1,2 @@ +CzDzEzFzGzAzBzcz +CKDLEFUGVAPBckdlefugvapb diff --git a/2013/endoh3/twinkle.abc b/2013/endoh3/twinkle.abc new file mode 100644 index 000000000..09c58f2ca --- /dev/null +++ b/2013/endoh3/twinkle.abc @@ -0,0 +1,6 @@ +CzCzGzGzAzAzG3z +FzFzEzEzDzDzC3z +GzGzFzFzEzEzD3z +GzGzFzFzEzEzD3z +CzCzGzGzAzAzG3z +FzFzEzEzDzDzC3z diff --git a/2013/endoh3/wavify.rb b/2013/endoh3/wavify.rb new file mode 100644 index 000000000..d4423a351 --- /dev/null +++ b/2013/endoh3/wavify.rb @@ -0,0 +1,3 @@ +$<.binmode +s=$<.read+"\0"*8000 +$><<["RIFF",s.size+36,"WAVEfmt ",16,1,1,8000,8000,1,8,"data",s.size,s].pack("A4VA8VvvVVvvA4VA*") diff --git a/2013/endoh3/yankee.abc b/2013/endoh3/yankee.abc new file mode 100644 index 000000000..b40a2b9e1 --- /dev/null +++ b/2013/endoh3/yankee.abc @@ -0,0 +1,4 @@ +czczdzezczezdzGzczczdzezc4BzGz +czczdzezfzezdzczBzGzAzBzc3zcz3 +A3BAzGzAzBzc4G3AGzFzEzFzG4 +A3BAzGzAzBzczAzGzczBzdzc3zc diff --git a/2013/endoh4/Makefile b/2013/endoh4/Makefile new file mode 100644 index 000000000..1baf57d3e --- /dev/null +++ b/2013/endoh4/Makefile @@ -0,0 +1,205 @@ +#!/usr/bin/env make +# +# 2013 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall +#CWARN= -Wall -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= endoh4 +DATA= solids.tbz2 +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} data + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + ${RM} -rf solids + @echo extracting solids + ${TAR} -jxf ${DATA} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + ${RM} -rf solids + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Lehmer!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "Park different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Paul Erdos!"; \ + fi + @${TRUE} diff --git a/2013/endoh4/cube.txt b/2013/endoh4/cube.txt new file mode 100644 index 000000000..6e41f94dd --- /dev/null +++ b/2013/endoh4/cube.txt @@ -0,0 +1,8 @@ +1,1,1 +1,1,-1 +1,-1,1 +1,-1,-1 +-1,1,1 +-1,1,-1 +-1,-1,1 +-1,-1,-1 diff --git a/2013/endoh4/endoh4.c b/2013/endoh4/endoh4.c new file mode 100644 index 000000000..1872fb7e7 --- /dev/null +++ b/2013/endoh4/endoh4.c @@ -0,0 +1,72 @@ +int +**F,** +V,M, N,i; +#ifndef/**/S +#define S 70,23 +#endif/* 000-2E5*/ +#define/* 2E5-2E5,2E5 +*/_POSIX_C_SOURCE 199309 +#include/* 2E5XXX*/ +/* 2E5-2E5X*/#include +#include/* -2E5-2E5XX*/ +struct timespec R={0,1E6};int j,k,m, +#define U/* -2E5X*/rand()*2./RAND_MAX-1 +#define/* 2E5*/O(p,q,i)(P[p*3+i]-P[q*3+i]) +/* IOCCC2013 IOCCC2013*/#define B(p,q,\ +r)(O(q,p,0)*O(r,p,1)-O(q,p,1)*O(r,p, 0)) +#define A(t,n)( t*)malloc( sizeof (t)*n) +#define E(p,q,r,s)B(p,q,r)*O(s ,p,2)+B(\ +p,r,s)*O(q,p,2)+B(p,s,q)*O( /*XX*/r,p,2) +#define D(e,f)(c-a)?s=a, a=e,e=s,s=f,f=\ +d,d=s:0;u=a+.5;m=u+1; T[01]=91;T[2]=060; +#define C (Q[u]-X) *a+(Q[u+1]-Y)*b+(Q[u\ ++2]-Z)*c,g=e*c- f*b,h=f*a-d*c,f=c,c=d*b\ +-e*a,d=a,a=g ,e=b,b=h,P[k]=W/2-q/s/p*3*\ +W,P[k+1]= H/2+r/s/p*H/2,T[3]=0x48,*T=033 +n,u,v, w,t,W,H;double*P,*Q,I,J,K,L,x,y,z +,X, Y,Z,a,b,c,d,e,f,g,h,p,q,r,s ;void o( + double x){for(p=q=i=0,s=r=1;i<99;s=(s+x + /s)/2)i%2?q+=r,r=-r:(p+=r),r*=3.14*x/++i;} + int G(int p,int q,int s,int g,int f){i\ +nt* v=A(int,N),*a,*b,h=-1,r=h;for(F[f]=V +[f]=v; ++h++r;v[r]=q+ 1?a[q]-r?q:b[p]-r?p:-1:p)p= +a[r],q=b[r];for (r=0;r=0;)i?c+=*P**P,1P[m*3]?m:u;for(v=!u ;n0?n:v;}for(puts( "\x1b[2J"),M=G( +u,v,-1,-1,0);;K+=I+0, L+=J){for(i=4;i1?K-2:K),c +=z=9*p,b= 9*q,o(L=L<-1?L+2:L>1?L-2:L),a= +x=b*q, y=b*=p,d=x-X,e=y-Y,f=z-Z,o(d*d+e* +e+f *f),p=C,q=C,r=C,k+=2,m=F[j][m],m-n;) + ;for(p=n=0;n=0) + &&n;){a=P[n%k];b=P[n%k+1];c=P[n-=2];d=P + [n+1];e=d-b;i=e*e>(c-a)*D(b,c)0>D(c, + b)for(;c-a&&u + + + + + + Most solid + + +

    Most solid

    + +

    Yusuke Endoh
    +mame@ruby-lang.org
    +https://github.com/mame/

    + +

    Judges' comments:

    + +

    To build:

    + +
    make endoh4
    +
    + +

    To run:

    + +
    ./endoh4
    +
    + +

    Try:

    + +

    NOTE: The author recommends the use of xterm.

    + +
    ./endoh4 < cube.txt
    +
    + +

    For example, if you are a soccer fan, try:

    + +
    make all
    +./endoh4 < solids/archimedian-solid/a11-truncated-icosahedron.txt
    +
    + +

    Selected Judges Remarks:

    + +

    This program is formatted as the net for a tetrahedron. (hint, try feeding the +program it’s own source code). When it runs there is an animation for the +computation to work out the convex hull.

    + +

    Author’s comments:

    + +

    Spec

    + +

    This is a convex polyhedron viewer, which:

    + +
      +
    1. reads three-dimentional vertices (3N float values) from stdin,
    2. +
    3. calculates a convex hull of them, and
    4. +
    5. renders it.
    6. +
    + + +

    This simple spec involves many details.

    + +
      +
    • 3D convex hull calculation + +
        +
      • recursive gift wrapping algorithm
      • +
      • automatical merging of (almost) co-planar faces +(i.e., faces are not triangulated)
      • +
      • random perturbation for robustness
      • +
      +
    • +
    • 3D rendering + +
        +
      • perspective projection
      • +
      • ASCII line drawing: "',;;;,;'"
      • +
      • camera in a spherical spiral orbit
      • +
      +
    • +
    + + +

    (Note that this program does not use math.h.)

    + +

    Portability

    + +

    I think it conforms with both C89 and C99. +I confirmed that it worked on gcc, clang, and tcc. +It should not be warned with -pedantic and -Wextra.

    + +

    Tips

    + +

    You may want to use tput to hide a terminal cursor.

    + +
    tput civis
    +./endoh4 < cube.txt
    +tput cnorm
    +
    + +

    Bonuses

    + +

    You can change the screen size. Let the aspect ratio be about 3:1.

    + +
    gcc -DS=120,40 -o endoh4 endoh4.c
    +
    + +

    The shape of this code is the geometric net of a regular tetrahedron. + So, try:

    + +
    ./endoh4 < endoh4.c
    +
    + +

    The solids.tbz2 file includes various solid data: +Platonic solids, +Archimedean solids, +Prisms, +Antiprisms, +Bipyramids, +Trapezohedrons, and +Johnson solids.

    + +

    I created the files by using the POV-Ray scripts +(1 and + 2) +in Wikipedia. +They are copyrighted in CC BY-SA 3.0 +by “User:Cyp” and “User:AndrewKepert”.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2013/endoh4/hint.text b/2013/endoh4/hint.text new file mode 100644 index 000000000..ccf8f3392 --- /dev/null +++ b/2013/endoh4/hint.text @@ -0,0 +1,105 @@ +# Most solid + +Yusuke Endoh + + + + +## Judges' comments: +### To build: + + make endoh4 + +### To run: + + ./endoh4 + +### Try: + +NOTE: The author recommends the use of xterm. + + ./endoh4 < cube.txt + +For example, if you are a soccer fan, try: + + make all + ./endoh4 < solids/archimedian-solid/a11-truncated-icosahedron.txt + +### Selected Judges Remarks: + +This program is formatted as the net for a tetrahedron. (hint, try feeding the +program it's own source code). When it runs there is an animation for the +computation to work out the convex hull. + +## Author's comments: +### Spec + +This is a convex polyhedron viewer, which: + +1. reads three-dimentional vertices (3N float values) from stdin, +2. calculates a convex hull of them, and +3. renders it. + +This simple spec involves many details. + +* 3D convex hull calculation + * recursive gift wrapping algorithm + * automatical merging of (almost) co-planar faces + (i.e., faces are not triangulated) + * random perturbation for robustness +* 3D rendering + * perspective projection + * ASCII line drawing: `"',;;;,;'"` + * camera in a spherical spiral orbit + +(Note that this program does not use `math.h`.) + +### Portability + +I think it conforms with both C89 and C99. +I confirmed that it worked on gcc, clang, and tcc. +It should not be warned with -pedantic and -Wextra. + +### Tips + +You may want to use `tput` to hide a terminal cursor. + + tput civis + ./endoh4 < cube.txt + tput cnorm + +### Bonuses + +You can change the screen size. Let the aspect ratio be about 3:1. + + gcc -DS=120,40 -o endoh4 endoh4.c + +The shape of this code is the geometric net of a regular tetrahedron. + So, try: + + ./endoh4 < endoh4.c + +The solids.tbz2 file includes various solid data: +[Platonic solids](http://en.wikipedia.org/wiki/Platonic_solid), +[Archimedean solids](http://en.wikipedia.org/wiki/Archimedean_solid), +[Prisms](http://en.wikipedia.org/wiki/Prism_%28geometry%29), +[Antiprisms](http://en.wikipedia.org/wiki/Antiprism), +[Bipyramids](http://en.wikipedia.org/wiki/Bipyramid), +[Trapezohedrons](http://en.wikipedia.org/wiki/Trapezohedron), and +[Johnson solids](http://en.wikipedia.org/wiki/Johnson_solid). + +I created the files by using the POV-Ray scripts +([1](http://en.wikipedia.org/wiki/File:Poly.pov) and + [2](http://en.wikipedia.org/wiki/User:AndrewKepert/poly.pov)) +in Wikipedia. +They are copyrighted in CC BY-SA 3.0 +by "User:Cyp" and "User:AndrewKepert". + +-------------------------------------------------------------------------------- + diff --git a/2013/endoh4/solids.tbz2 b/2013/endoh4/solids.tbz2 new file mode 100644 index 000000000..dbfc50df6 Binary files /dev/null and b/2013/endoh4/solids.tbz2 differ diff --git a/2013/guidelines.txt b/2013/guidelines.txt new file mode 100644 index 000000000..25ba35e45 --- /dev/null +++ b/2013/guidelines.txt @@ -0,0 +1,786 @@ +| 22nd International Obfuscated C Code Contest Official Guidelines + +| Copyright (C) 2006-2013 Leonid A. Broukhis, Simon Cooper, Landon Curt Noll. + +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in +writing from the contest judges. + +| This guidelines file is version 2013-07-30-v17. + +| Most of the changes from the previous IOCCC guidelines +| been marked with a "|" on the left hand side of the line. + + +ABOUT THIS FILE: + + This file contains guidelines intended to help people who wish to +| submit entries to the International Obfuscated C Code Contest (IOCCC). + + This is not the IOCCC rules, though it does contain comments about + them. The guidelines should be viewed as hints and suggestions. + Entries that violate the guidelines but remain within the rules are + allowed. Even so, you are safer if you remain within the guidelines. + + You should read the current IOCCC rules, prior to submitting entries. + The rules are typically sent out with these guidelines. + + We recommend that you follow the twitter handle: + + @IOCCC + + to learn about IOCCC news, important IOCCC related alerts, IOCCC + reminders, and changes to the rules and these guidelines. + +| You do not have to be a twitter user to follow @IOCCC. Non-twitter +| users should access: + +| https://twitter.com/ioccc + +| Non-twitter users should force their browsers to reload the above URL +| to be sure they are seeing the most recent tweets. + + While we try to post use news at: + + http://www.ioccc.org/index.html#news + + such postings may be delayed or obscured by slow to respond mirrors. + + +| WHAT'S NEW IN 2013: + +| The contest runs from 2013-Aug-01 3:14:15 UTC to 2013-Oct-03 9:26:53 UTC. + +| Rule 2 (the size rule) has been changed. In particular the secondary size +| limit has changed to use an algorithm implemented by the IOCCC size tool. +| See below for details. + +| The submission URL: + +| https://submit.ioccc.org/ + +| should be active on or slightly before 2013-Aug-01 3:14:15 UTC. + + +HINTS AND SUGGESTIONS: + + You are encouraged to examine the winners of previous contests. See + FOR MORE INFORMATION for details on how to get previous winners. + + Keep in mind that rules change from year to year, so some winning entries + may not be valid entries this year. What was unique and novel one year + might be 'old' the next year. + + An entry is usually examined in a number of ways. We typically apply + a number of tests to an entry: + + * look at the original source + * convert ANSI tri-graphs to ASCII + * C pre-process the source ignoring '#include' lines + * C pre-process the source ignoring '#define' and '#include' lines + * run it through a C beautifier + * examine the algorithm + * compile it (with flags to enable all warnings) + * execute it + + You should consider how your entry looks in each of the above tests. + You should ask yourself if your entry remains obscure after it has been + 'cleaned up' by the C pre-processor and a C beautifier. + + Your entry need not pass all of the above tests. In certain + cases, a test is not important. Entries that compete for the + 'strangest/most creative source layout' need not do as well as + others in terms of their algorithm. On the other hand, given + two such entries, we are more inclined to pick the entry that + does something interesting when you run it. + + We try to avoid limiting creativity in our rules. As such, we leave + the contest open for creative rule interpretation. As in real life + programming, interpreting a requirements document or a customer request + is important. For this reason, we often award 'worst abuse of the + rules' to an entry that illustrates this point in an ironic way. + + We do realize that there are holes in the rules, and invite entries + to attempt to exploit them. We will award 'worst abuse of the rules' + and then plug the hole next year. Even so, we will attempt to use + the smallest plug needed, if not smaller. :-) + +| There are 19 reasons why these guidelines seem obfuscated. + + Check out your program and be sure that it works. We sometimes make + the effort to debug an entry that has a slight problem, particularly + in or near the final round. On the other hand, we have seen some + of the best entries fall down because they didn't work. + + We tend to look down on a prime number printer that claims that + 16 is a prime number. If you do have a bug, you are better off + documenting it. Noting "this entry sometimes prints the 4th power + of a prime by mistake" would save the above entry. And sometimes, + a strange bug/feature can even help the entry! Of course, a correctly + working entry is best. Clever people will note that 16 might be prime + under certain conditions. Wise people, when submitting something clever + will fully explain such cleverness in their entry's remarks file. + + People who are considering to just use some complex mathematical + function or state machine to spell out something such as "hello, + world!" really really, and we do mean really, do need to be more creative. + + Ultra-obfuscated programs are, in some cases, easier to + deobfuscate than subtly-obfuscated programs. Consider using + misleading or subtle tricks layered on top of or under an + appropriate level of obfuscation. A clean looking program with + misleading comments and variable names might be a good start. + +| When programs use VTxxx/ANSI sequences, they should NOT limited to a +| specific terminal brand. Those programs that work in a standard xterm + are considered more portable. + +| Rule 2 (the size rule) has been changed. In particular rule 2 refers to +| the use of an IOCCC size tool. The source for this tool is found at: + +| http://www.ioccc.org/2013/iocccsize.c + +| The IOCCC size tool should be compiled as: + +| cc -pedantic -Wall -std=c99 iocccsize.c -o iocccsize + +| This tool imposes a 2nd limit on C code size. To check your program +| source against the 2nd limit of rule 2, use the -i command line option. +| For example: + +| ./iocccsize -i < prog.c + +| The IOCCC size tool, when using the -i option, may be summarized as: + +| The size tool counts most C reserved words (keyword, secondary, +| and selected preprocessor keywords) as 1. The size tool counts all +| other octets as 1 excluding ASCII whitespace, and excluding any +| ';', '{' or '}' followed by ASCII whitespace, and excluding any +| ';', '{' or '}' octet immediately before the end of file. + +| ASCII whitespace includes ASCII tab, ASCII space, ASCII newline, +| ASCII formfeed, and ASCII carriage return. + +| In cases where the above summary and the algorithm implemented by +| the IOCCC size tool source code conflict, the algorithm implemented +| by the IOCCC size tool source code is preferred by the judges. + +| There are at least 2 other reasons for selecting 2053 as the 2nd limit +| besides the fact that 2053 is the next prime > 2048. These reasons +| may be searched for and discovered if you are "Curios!" about 2053. :-) +| Moreover, 2053 was the number of the kernel disk pack of one of the +| judge's BESM-6. + +| Take note that this secondary limit imposed by the IOCCC size tool +| obviates some of the need to #define C reserved words in an effort +| to get around the size limits of rule 2. + +| Yes Virginia, that is a hint! + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many C compilers dislike the following code, and so do we: + + #define d define +| #d foo /* <-- don't expect this to turn into #define foo */ + + When declaring local or global variables, you should declare the type: + +| int this_is_fine; +| this_is_not; /* <-- Try to avoid implicit type declarations */ + + We suggest that you compile your entry with an ISO/IEC 9899-1999 + ("ISO C99") C compiler or at least an ANSI C compiler. + + DO NOT assume that we will use gcc to compile your program. + We will first try to compile your program using Clang. + + It is much better to not use any given obscure compiler flags if + you can help it. We want to discourage the use of obscure compiler + flags that would make the program less portable. + + One side effect of the above is that you cannot assume the use + of nested functions such as: + + main() { +| void do_not_do_this() { printf("Lemon Curry?\n"); } + do_not_do_this(); + } + + This is because such nested functions often requires one to compile with + a flag such as -fnested-functions that is not found on some compilers. + + On 2012 July 20, the judges rescinded the encouragement of + nested functions. Such constructions, while interesting and sometimes + amusing, will have to wait until they required by a C standard that are + actually implemented in commonly used C compilers. Sorry! + +| We prefer programs that don't require a fish license for pet fish. + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using . Use instead. + + On 28 January 2007, the Judges rescinded the requirement that the +| '#" in a C preprocessor directive must be the 1st non-whitespace octet. + + The exit() function returns void. On some broken systems have exit() + return int. Your entry should assume that exit() returns a void. + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + +| One line programs should be short one line programs: say around 80 to 120 +| octets long. Going well beyond 140 octets is a bit too long to be called +| a one-liner in our vague opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS version specific +| (index/strchr differences are OK, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings +| (it is OK only if you warn us in the 'remark' header item) + * won't compile or run under a POSIX P1003.1/P1003.2 like systems + * depend on a utility or application not normally found on most + most POSIX P1003.1/P1003.2 like systems + * abuse the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be +| * are "blob-ier" than they need to be +| * are too similar to previous winners :-( + * are identical to previous losers :-) + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + At least one judge prefers to maintain the use of the leap-second + as part of the world's time standard. + + The "how to build" make process should not be used to try and get + around the size limit. It is one thing to make use of a several -D's + on the compile like to help out, but it is quite another to use many + bytes of -D's in order to try and squeeze the source under the size limit. + + You should try to restrict commands used on the build file to + POSIX-like or common Un*x-like commands. You can also compile + and use your own programs. If you do, try to build and execute + from the current directory. This restriction is not a hard and + absolute one. The intent is to ensure that the building if your + program is reasonably portable. + +| You are in a maze of twisty guidelines, all different. + + Don't forget that the building of your program should be done + ***without human intervention***. So don't do: + + prog: prog.c +| #echo this next line requires data from standard input + cat > prog.c + ${CC} prog.c -o prog + + However, you can do something cute such as making your program +| do something dumb (or cute) when build 'automatically'. And + when it is run with a human involved, do something more clever. + For example, one could use the build instructions: + + prog: prog.c + ${CC} prog.c -DNON_HUMAN_COMPILE -o prog + @echo "See remarks section about alternate ways to compile" + + and then include special notes in the program "remarks" for + alternate / human intervention based building. + + We want to get away from source that is simply a compact blob of +| octets. Really try to be more creative than blob coding. + + Please do not use things like gzip to get around the size limit. + Be more creative. + + We really dislike entries that make blatant use of including + large data files to get around the source code size limit. + + Did we remember to indicate that programs that blatantly use + some complex state machine to do something simple are boring? + We think we did. :-) + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! +| Remember, you can submit more than one entry. See the rules for details. + + We suggest that you avoid trying for the 'smallest self-replicating' + source. The smallest, a zero byte entry, won in 1994. + +| Programs that claim to be the smallest C source that does something +| better be the smallest such program or they risk being rejected because +| they do not work as documented. + +| Please note that the C source below, besides lacking in obfuscation, +| is NOT the smallest C source file that when compiled and run, dumps core: + +| main; + + We do not like writable strings. That is, we don't want stuff like: + + char *T = "So many primes, so little time!"; + ... + T[14] = ';'; + + Please don't make use of this feature, even if your system allows it. + However, initialized char arrays are OK to write over. This is OK: + +| char b[] = "Is this OK"; + b[9] = 'K'; + +| There is a typo in this sentence. + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. For + example, don't depend on a particular type or size of display. + Don't assume the use of a particular browser. Instead assume a + generic browser that forms to a widely used W3C standard. + Don't assume a particular sound sub-system or video driver is installed + in the OS. Instead, make use of a well known and widely available open + source program (one that actually works) to display audio/visual data. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. + +| This is the only guideline that contains the word fizzbin. + + We don't like entries that use proprietary toolkits such as the M*tif, + Xv*ew, or OpenL*ok toolkits, since not everyone has them. Use of an + open source toolkit that is widely and freely available instead. + + You should avoid depending on a particular window manager. + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines + in the program "remarks". + + Try to avoid entries that play silent sound segments or play the +| Happy Birthday song; music that some people believe is copyrighted +| (even if such copyrights appear to be bogus and/or blatant abuses of +| the copyright system). + + While we recognize that UN*X is not a universal operating system, the + contest does have a bias towards such systems. In an effort to expand + the scope of the contest, we phrase our bias in terms of POSIX P1003.1 + and P1003.2 standards. This will allow certain non-UN*X OS users to + submit entries. On the other hand, this is a guideline and not a rule. + We will not reject an entry based on some POSIX technicality. + + When dealing with OS and application environments, we suggest that you + be reasonable with a nod towards vanilla UN*X-like systems. POSIX will + evolve but not as much as the contest. + +| You very well might not be prohibited from failing to not partly +| misunderstand this particular guideline. You are not required to +| determine that this or the previous sentence is false and misleading. +| Nevertheless, it might not hurt to not fail to consider failing to do so. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION <== HINT!! + * make us laugh and/or throw up :-) (humor really helps!) + + Some types of programs can't excel (anti-tm) in some areas. Your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + You are better off explaining what your entry does in the program + "remarks" section rather than leaving it obscure for the judges + as we might miss something and/or be too tired to notice. + +| Avoid this specific individual guideline, if you can. + + We freely admit that interesting, creative or humorous comments in + the program "remarks" help your chances of winning. If you had to + read so many twisted entries, you too would enjoy a good laugh or two. + We think the readers of the contest winners do as well. We do read + the program "remarks" during the judging process, so it is worth your + while to write remarkable program "remarks". + + We dislike C code with trailing control-M's (\r or \015) that results + in compilation failures. Some non-Un*x/non-Linux tools such as + MS Visual C and MS Visual C++ leave trailing control-M's on lines. + Users of such tools should strip off such control-M's before submitting + their entries. In some cases tools have a "Save As" option that will + prevent such trailing control-M's being added. + + We dislike entries that depend on non-portable libcurses features such + as halfdelay(). One should restrict libcurses to portable features + found on BSD or Linux curses. + +| Rule 13 states any C source that fails to compile because of unescaped +| octets with the high bit set (octet value >= 128) will be rejected. +| Instead of unescaped octets, you should use \octal or \hex escapes: + + /* 123456789 123456789 123456789 123456 */ + char *foo = "This string is 36 octets in length \263"; + /* This octet requires 4 octets of source ^^^^ */ + if (strlen(foo) == 36) printf("foo is 36 octets plus a final NUL\n"); + else printf("This code should not print this message\n"); + + It is a very good idea to, in your remarks file, tell us why you + think your entry is obfuscated. This is particularly true if + your entry is has some very subtle obfuscations that we might + otherwise overlook. <<-- Hint! + + Anyone can format their code into a dense blob. A really clever + author will try format their entry using a "normal" formatting style + such that at first glance (if you squint and don't look at the details) + the code might pass for non-obfuscated C. Deceptive comments, + and mis-leading formatting, in some cases, may be a plus. On the + other hand, a misleading code style requires more source bytes. + + If you do elect to use misleading formatting and comments, we + suggest you remark on this point in your remarks where you talk + about why you think your entry is obfuscated. On the other hand, + if you are pushing up against the size limits, you may be forced + into creating a dense blob. Such are the trade offs that obfuscators face! + +| We prefer code that can run on either a 64-bit or 32-bit processor. +| However, it is unwise to assume it will run on an i386 or x86 architecture. + +| While programs that only run in a specific word size are OK. If you have +| to pick a 64-bit word size. + + If we are feeling ornery we might choose to compile your program + for running on an Arduino or a PDP-11. Heck, should we ever find + an emulator of 60-bit CDC Cyber CPU running a POSIX-like OS, we + might just try your entry on that emulator as well| :-) + + If your entry MUST run only in 32-bit mode on an Intel processor, add the + following compiler flag: + + -arch i386 + + to your "how to build" make compile line. For example: + + prog: prog.c + ${CC} prog.c -arch i386 -o prog + + Be even more creative! + + +ABUSING THE RULES: + + Legal abuse of the rules is somewhat encouraged. Legal rule abuse may + involve, but is not limited to, doing things that are technically + allowed by the rules and yet do not fit the spirit of what we intended + to be submitted. + + Legal rule abuse is encouraged to help promote creativity. Rule abuse + entries, regardless of if they receive an award, result in changes to + the next year's rules and guidelines. + + Legal abuse of the rules is NOT an invitation to violate the rules. + An entry that violates the rules in the opinion of the judges, WILL be + disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK! If you + have an entry that might otherwise be interesting, you might want to + submit two versions; one that does not abuse the rules and one that + does. + + If you intend to abuse the rules, indicate so in the program + "remarks". You must try to justify why you consider your rule abuse + to be allowed under the rules. That is, you must plead your case as + to why your entry is valid. Humor and/or creativity help plead a + case. + + Abusing the web submission procedure tends to annoy us more + than amuse us. Spend your creative energy on content of your + entry rather than on the submission process itself. + + We are often asked why the contest rules and guidelines seem too + strange or contain mistakes, flaws or grammatical errors. One reason + is that we sometimes make genuine mistakes. But in many cases such + problems, flaws or areas of confusion are deliberate. Changes to + rules and guidelines in response to rule abuses, are done in a minimal + fashion. Often we will deliberately leave behind holes (or introduce + new ones) so that future rule abuse may continue. A cleaver author + should be able to read them and "drive a truck through the holes" in + the rules and guidelines. + + At the risk of stating the obvious, this contest is a parody of the + software development process. The rules and guidelines are only a + small part of the overall contest. Even so, one may think the contest + rules and guideline process as a parody of the sometimes tragic + mismatch between what a customer (or marketing) wants and what + engineering delivers. Real programmers must face obfuscated + and sometimes conflicting specifications and requirements from marketing, + sales, product management an even from customers themselves on a + all to regular basis. This is one of the reasons why the rules and + guidelines are written in obfuscated form. + + +JUDGING PROCESS: + + Entries are judged by Leonid A. Broukhis, Simon Cooper, Landon Curt Noll. + + Each entry submitted is given an id number and subdirectory. The + entry files including, but not limited to prog.c, Makefile (that we + form from around your "how to build" information), as well as any + data files that you submit are all places under their own directory. + stored and judged from this directory. + +| Any information about the authors is not read by the judges until + the judging process is complete, and then only from entries that have + won an award. + + Because we do not read this information for entries that do not win, + do not know who did not win. + + The above process helps keep us biased for/against any one particular + individual. Therefore you MUST refrain from putting any information + that reveals your identity in your entry. + + Now some people point out that coding style might reveal the information + about the others. However we consider this to be simply circumstantial + and outside the scope of the above paragraph. + + Some people, in the past, have attempted to obfuscate their identity by + including comments of famous Internet personalities such as Peter Honeyman + (http://www.citi.umich.edu/u/honey/). The judges are on to this + trick and therefore consider any obfuscated source or data file + claiming to be from Honeyman to not be form Honeyman. This of course + creates an interesting paradox known as the "obfuscated Peter Honeyman + paradox". Should Peter Honeyman actually submit an obfuscated entry, +| he alone is excluded from above mentioned refrain as we will likely believe + it just another attempt at confusion. This guideline is known + as the "Peter Honeyman is exempt" guideline. + + BTW: None of the entries claiming to be from Peter Honeyman have ever + won an award. So it is theoretically possible that Peter Honeyman + did submit an entry in the past. In the past, Peter had denied + submitting anything to the IOCCC. Perhaps those entries were + submitted by one of his students? + + | We seemed to have digressed ... :-) Returning to the judging process: + + We prefer to be kept in the dark as much as you are until the final + awards are given. We enjoy the surprise of finding out in the end, + who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. + +| During the judging process. a process that spans multiple sessions +| over a few weeks, post general updates from our @IOCCC twitter account. + +| Once we have selected the winners, for each category we will tweet: +| +| category name +| name(s) of the authors (or anonymous if requested) +| twitter handle(s) (if provided and if anonymity was not requested) +| country code(s) of the author(s) + + After the initial announcement, we attempt to send EMail to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes and typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the "how to build" information and forming a Makefile + * reading prog.c, the C source + * reviewing the "remarks" information + * briefly looking any any supplied data files + * passing the source thru the C pre-processor + skipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + skipping over any #include files + * compiling/building the source + * running the program + * Doing other things that only IOCCC judges know about :-) + + In later rounds, other actions are performed including performing + miscellaneous tests on the source and binary. + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry will often compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code (code with deceptive comments and source code) + * best X client (see OUR LIKES AND DISLIKES) + * best abuse of ISO/IEC 9899-1999 ("ISO C99") C or ANSI C + * best abuse of the C preprocessor + * worst abuse of the rules + * (anything else so strange that it deserves an award) + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of +| reducing the remaining entries (typically about 25) down to to about +| half that number: declaring those remaining to be winners. + + Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry is good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + + More than one IOCCC judge has been known to bribe another IOCCC judge + into voting for a winning entry by offering a bit high quality chocolate. + This technique is highly discouraged for use by non-IOCCC judges. + + More often than not, we select a small entry (usually one line), a + strange/creative layout entry. We sometimes also select an + entry that abuses the contest guidelines in an interesting way, + or that stretches the content rules that while legal, is + nevertheless goes against the intent of the rules. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entries. More often, the + 'best' is picked because it does well in a number of categories. + + +ANNOUNCEMENT OF WINNERS: + + The judges will tweet initial announcement of who won, the name + of their award, and a very brief description of the winning entry +| from the @IOCCC twitter handle. Non-twitter users should visit: + +| https://twitter.com/ioccc + +| Non-twitter users should force their browsers to reload the above URL +| to be sure they are seeing the most recent tweets. + + The judges will then post an initial announcement of who won, the name + of their award, and a very brief description of the winning entry + on the IOCCC web site: + + http://www.ioccc.org/whowon.html + + We will also attempt to submit a brief announcement story to /.: + + http://slashdot.org + + that, depending on the willingness of the /. editors, may be posted + to their site at the same time. + + Note that initial announcement will NOT contain source. This is because + the winning authors are given a chance to review the judges comments, + and test our Makefile. This review process typically takes a few weeks. + + Sometime after the initial announcement, and once the the review + by the winners has been completed, the winning source will be + posted to the IOCCC web site: + + http://www.ioccc.org/years.html + + NOTE: previous winners are available at that URL + +| We will also tweet, via @IOCCC, when the winning source is available. + +| It is pointless to ask the IOCCC judges how many entries we receive. +| Other government TLA based snooping organizations may neither confirm +| not deny any knowledge of this data point. :-) + + Often, winning entries are published in selected magazines from around + the world. Winners have appeared in books ("The New Hackers Dictionary") + and on T-Shirts. More than one winner has been turned in a tattoo! + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending EMail to the following address: + +| q.2013@ioccc.org (do not submit entries to this address) + +| You must include the words 'ioccc 2013 question' in the subject of your + EMail message when sending EMail to the judges. + + Questions and comments about the contest are welcome. Comments about + confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. + + Check out the IOCCC Web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + +| For the updates and breaking IOCCC news, you are encouraged to follow +| the twitter handle: + +| @IOCCC + +| You do not have to be a twitter user to follow @IOCCC. Non-twitter +| users should access: + +| https://twitter.com/ioccc + +| Non-twitter users should force their browsers to reload the above URL +| to be sure they are seeing the most recent tweets. + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ diff --git a/2013/hint.css b/2013/hint.css new file mode 100644 index 000000000..cb24837ff --- /dev/null +++ b/2013/hint.css @@ -0,0 +1,77 @@ +* { + font-family: Helvetica Neue, Helvetica, Arial, sans-serif; +} +body { + max-width: 50em; + margin: 0 auto; + color: #111; +} + +pre, code { + font-family: Monaco, Courier New, monospace; + font-size: 12px; +} + +h1 { + font-size: 40px; + font-weight: bold; + letter-spacing: -1px; + margin-bottom: -5px; +} +h1 code { + font-size: 40px; +} + +h2 { + color: rgb(43,105,145); + font-weight: bold; + margin-bottom: -5px; +} +h2 code { + font-size: 22px; +} + +h3 { + /* color: rgb(43,105,145); */ + font-weight: bold; + margin-bottom: -5px; +} +h3 code { + font-size: 16px; +} + +a { + color: blue; + text-decoration: underline; +} +a:visited { + color: navy; +} +a:hover { + text-decoration: underline; +} + +pre { + border-radius: 10px; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + border-width: 1px; + border-color: rgb(16,48,0); + border-style: solid; + padding: 0.6em; + padding-left: 1em; + margin-left: 5%; + margin-right: 8%; + background-color: rgb(16,48,0); + overflow: auto; + color: rgb(75,224,0); +} + +p, li { + font-size: 14px; + line-height: 18px; +} + diff --git a/2013/hou/Makefile b/2013/hou/Makefile new file mode 100644 index 000000000..d30a3f138 --- /dev/null +++ b/2013/hou/Makefile @@ -0,0 +1,212 @@ +#!/usr/bin/env make +# +# 2013 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall +#CWARN= -Wall -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS=-lm + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= hou +OTHER_PROG= a +OTHER_SRC= a.c +OTHER_OBJ= a.o +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${OTHER_PROG}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +${OTHER_SRC}: ${OTHER_PROG} + ${RM} -f $@ + ./${OTHER_PROG} > $@ + +${ENTRY}: ${OTHER_SRC} + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${OTHER_OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${OTHER_SRC} ${OTHER_PROG} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Lehmer!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "Park different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Paul Erdos!"; \ + fi + @${TRUE} diff --git a/2013/hou/doc/camera.png b/2013/hou/doc/camera.png new file mode 100644 index 000000000..eb6a753d7 Binary files /dev/null and b/2013/hou/doc/camera.png differ diff --git a/2013/hou/doc/cosine.png b/2013/hou/doc/cosine.png new file mode 100644 index 000000000..939f9106b Binary files /dev/null and b/2013/hou/doc/cosine.png differ diff --git a/2013/hou/doc/draft.png b/2013/hou/doc/draft.png new file mode 100644 index 000000000..5fc4fa1a5 Binary files /dev/null and b/2013/hou/doc/draft.png differ diff --git a/2013/hou/doc/example.markdown b/2013/hou/doc/example.markdown new file mode 100644 index 000000000..a6d846f68 --- /dev/null +++ b/2013/hou/doc/example.markdown @@ -0,0 +1,352 @@ + +# Scene format documentation + +This file is encoded in UTF-8 as the BOF marker indicates. + +You can directly feed it to the renderer. If you're wondering about what the following code block does, that's why:) + + @|?|?z# + @|||?z& + >?Sedvf + ??Tdeu# + >>Tdeui + ??Tdmmf + ??[[euf + ?}?Oq}e + ?}?Oqqf + v}?|q}e + v}?|qqf + ?Sj|?{f + ?Tjk?{e + FF?Oqq$ + RR?Oqq$ + ^^?Oqq$ + jj?Oqq$ + vv?|qq$ + IOBMqqe + U]BMqqe + aiBMqqe + muBMqqe + EEEJpp% + QQEJpp% + ]]EJpp% + iiEJpp% + uuEJpp% + ZnY|{|e + [mZ|{{# + [mZ|||f + kkdr{{% + lkdr{{> + + +## Basic structure + +A scene file begins with arbitrary binary data, followed by several shader functions. + +Shader functions are declared using a one-character name followed by a ']' character. There are some special function names, which will be explained below. + +The language used to write shader functions is very simple. Basically, you write a sequence of assignment statements like this: + A=A+D + B=B+E +Namely, you write a one-character variable name, an equal sign '=', followed by an expression (made of operators and one-character variable names, of course). + +## Expressions + +The shader language supports seven operators, listed highest priority first: + */+-<#: + +`*/+-<` mean what they mean in C, but the priority part is a bit different. Basically, `*` has higher priority than `/`, so `A/4*4` actually computes `A/(4*4)`. And you can't write `(A/4)*4` -- brackets are not supported. As an advice, keep your expressions simple :) If you really needs to write something like C=(A/4)*4, write instead: + B=A/4+ + C=B*4 + +The # operator acts somewhat like the C ?:. It returns one of its two operands based on, what else, the value of variable #. When # is true, # returns its second operand. + +The : operator calls built-in functions. The first operand is the function id and the second is the parameter. Here is a list of functions: + 0:x = the x-th byte of the scene file + 1:x = sin(x*PI) + 2:x = atan2(x,#)/PI + 3:x = sqrt(max(x,0)) + 4:x = floor(x) + 5:x = the next number in the (allegedly random) number sequence, can't be called in volume shaders + 6:x = value of the variable (char)(120+x) + 7:x = write #'s value to the variable (char)(120+x) + +Contrary to popular belief, the language itself doesn't support numerical constants. Any character sitting between operators is a variable. When you see 1/2, it's in fact dividing the variable 1's value by the variable 2's value. For everyone's convenience, though, in the beginning every variable is initialized to its ASCII code minus 48. As long as you don't write something like 3=1+1, you can use single digit numbers as, well, single digit numbers. If you need something like 1920 or 0.73, you need to compute it yourself. And yes, all variables store floating point values. + +If a character appears as the first character of any argv, it goes to zero. This includes the scene filename. If you name your scene '1.scene', well, good luck with 1=0! + +You can terminate a statement using any character that isn't an operator, be it \n or ;. But you must put in one and only one character. Put in two (e.g. the Windows \r\n), and it terminates your function. Also, the first statement must begin immediately after ']'. + +When a function terminates, the interpreter calls the next function specified by variable R. If you want to call function 'n', just write somewhere: + R=n +providing you have left n at its initial value. If you want to actually return to the renderer, put in R=0. + +As you may have noticed, you can put in all kinds of stuff between functions, like this comment. + +## How the ____ do I render an image with shaders? + +Basically, you define a geometry using volume shaders, define a camera using a camera shader, and define light sources and surface reflectance properties using material shaders. + +------------------------------------------- +Continue to the comments before function A +------------------------------------------- + + //As an (optional) assignment, figure out what function `n` does. And why there is a plus sign at every EOL except the last. + n]#=1+ + x=X+1/2+ + d=0:U;d=d-n;U=U+1;A=d + + + + + + Best use of 1 Infinite Loop + + +

    Best use of 1 Infinite Loop

    + +

    Qiming Hou
    +hqm03ster@gmail.com
    +http://www.houqiming.net

    + +

    Judges' comments:

    + +

    To build:

    + +
    make hou
    +
    + +

    To run:

    + +
    ./hou [scene-file-name] [options]
    +
    +Follow the instructions in stdout, preferably with an auto-refreshing PPM image viewer ready.
    +Refresh the image every time the output refreshes, all effects should be more or less recognizable when you see 16.
    +
    + +

    Try:

    + +
    ./hou BIG
    +./hou old_default.scene BIG
    +./hou otherroom.scene
    +./hou otherroom.scene NAIVE
    +
    + +

    Selected Judges Remarks:

    + +

    You could consider that this program violates the source code size +limit. This is because the first compliation of this program is +really just a decompressor to generate the real source code of the +program.

    + +

    This program will loop infinitely while progressivly refining a +raytraced image.

    + +

    Author’s comments:

    + +

    Using hou

    + +

    This program is a programmable rendering engine with a built-in default scene. The standard command line is:

    + +
    ./hou [scene-file-name] [options]
    +
    + +

    As hou runs, it writes a progressively refining image to a ppm file specified in the scene. The initialization may take a while, but once it’s done, a rough preview should be available in seconds. Leave hou running for the night, and you get a high quality result like the attached *.jpg files. Kill hou manually after you’re satisfied with the image quality.

    + +

    To save time and energy for the judges, rendered images for all provided scenes are provided as attached files.

    + +

    Features

    + +
      +
    • Fully programmable: Almost every stage of the renderer is programmable with a shader, i.e., a short script that does something rendering-related. In particular, each scene consists of one or more geometry shaders, a camera shader, and one or more material shaders. Shaders are written in an interpreted language that supports basic arithmetic, a few math functions, variables and procedural call in the CPS (Continuation Passing Style).

    • +
    • Fast preview: This renderer isn’t just a naive path tracer, it actually uses a modern global illumination algorithm which is robust against challenging scene configurations. You can mostly place light sources and specify surface properties as you please without worrying too much about the convergence speed – you always get a nice fast preview within one or two minutes. As proof, there is a comparison: “./hou otherroom.scene” gives a rough idea about the overall illumination at 16 samples per pixel (i.e., when the program prints 16), whereas the naive approach “./hou otherroom.scene NAIVE” only produces a mess of white dots.

    • +
    • Rich visual effects: The algorithm samples all light path types so most physically based effects can be produced. The default scene demonstrates quite a few of them: reflection, area light, soft shadows, color bleeding, caustics, and depth-of-field blur. Of course, one can also get programmable-shading effects like procedural texturing and approximated Fresnel terms.

    • +
    • Accelerated ray tracing: The ray tracing part uses an algorithm better than the brute-force intersection of everything. The renderer even builds an acceleration data structure! Despite the double precision and the single-threaded-ness, it still runs at about 0.5 million rays per second on the author’s machine.

    • +
    • Pause and resume: Can’t run ./hou overnight? No problem! You can kill and resume a rendering session whenever you want. The renderer automatically saves the progress every 16 samples and resumes where it’s left off when restarted. Also, each scene/parameter combination gets a different saved session so you don’t have to worry about conflicts.

    • +
    + + +

    Abuse of the rules

    + +
      +
    • hou.c uses compression to get around the size limit. The compression fully complies with the rules and the guidelines (at least the portion that shows up in grep “size limit”). Please see the “Self-imposed restrictions” section below for more details.

    • +
    • hou does not terminate (as suggested by the second line of rule 6).

    • +
    + + +

    Self-imposed restrictions

    + +
      +
    • The building process does not involve any OS tool beyond cc and make. No gzip compression! a.c.gz doesn’t fit in 2053 bytes, anyway.

    • +
    • Neither hou.c nor a.c (the real decompressed source) uses #define (or cc -D) at all.

    • +
    • The source code is not required at runtime.

    • +
    • a.c does not drop optional features to reduce size. There are pure optimization code that can be dropped without affecting the converged output (only affecting the ray tracing speed / convergence rate). All files are properly fopened with “rb” / “wb” for Windows compatibility. The PPM header has a comment line for non-standard-compliant viewers (specifically, my old HDRShop 1.0). And there is a nice text message saying “please wait…”.

    • +
    • Despite the messy look, a.c and hou.c compiles warning-free (hou.c even wastes 18 bytes on #include<stdio.h> just for putchar). a.c compiles mostly clean in the C99/ANSI modes of clang and gcc (with -Wall –pedantic). The only warning generated is a pedantic one: “string constant too long”.

    • +
    + + +

    Comments and why obfuscated

    + +
      +
    • Both the compression and the rendering use mathematically involved algorithms. Understanding the C doesn’t help much if one isn’t familiar with the math.

    • +
    • Modern renderers provide shader access to just about any internal state. This one follows suit and reuses the same shader-accessible array for all important internal states.

    • +
    • Infinity and not-a-number are used during normal course of execution.

    • +
    • Previous image-generating entries may take care to hide the “IOCCC” string in the code, but they leave the text clear in the result. This entry takes it further and obfuscates the output image as well. Can you find the text in the image? Hint: look up.

    • +
    • a.c leaves all shaders in plain text, but the plain text shader code can’t be taken for its face value – the arithmetic rules subtly diverge from our common sense.

    • +
    • a.c is less portable than hou.c itself. hou.c only depends on ASCII and should run just fine on 16-bit, small memory, or float-incapable machines. a.c, while still reasonably portable, is quite memory consuming, requires IEEE754-compliant double, and assumes int to be 32-bit.

    • +
    • Though technically endian-dependent, a.c remains portable providing that one doesn’t copy saved sessions across endians.

    • +
    + + +

    Spoiler

    + +
     3225  3225  3225  9  9    3225  3225
    + 1     1  1  1  1  1  1    1     1  1  
    + 4225  1226  1  1  1  1    1222  1226  
    +    1  1     1  1  1  1    1     1 1   
    + 4226  1     4226  8  4222 4226  1  1
    +
    + +

    The program consists of a recursive-descend interpreter, a 3DDDA (3D Discrete Differential Analysis) ray tracer, a PSSMLT (Primary Sample Space Metropolis Light Transport) light path sampler, all squeezed into the size limit using a PPM compressor (Prediction by Partial Matching, and yes, the output format is chosen for the pun).

    + +

    PSSMLT uses the Metropolis-Hasting algorithm to sample a 32D unit hypercube. Each point in the hypercube is interpreted as a sequence of random numbers, and is sent to a path tracer to generate a light path. The point’s Metropolis-Hasting energy is then defined as the corresponding path’s contribution value to the final image. Since each path is sampled with a probability proportional to its energy, the sample distribution directly corresponds to the final image, which can then be produced as a simple per-pixel histogram of all generated paths. The robustness comes from a state mutation strategy that actively tries to explore the neighborhood of high energy peaks (e.g. paths that happen to hit the light source in otherroom.scene). In addition, a rudimentary form of lens path stratification is added to balance the attention each pixel receives. The Metropolis-Hasting process completely avoids the tell-tale pixel sampling loop required in most other image generation methods.

    + +

    The 3DDDA tracer is chosen for scalability: its performance doesn’t get much worse as scene complexity increases. Another benefit is that with the DDA code in place one can naturally use hierarchical grids as an acceleration structure. The downside, of course, is that the setup involves quite a few divisions, which naturally turns into division-by-zeros. Fortunately, the IEEE754 standard has a nice set of rules just for this purpose and the arithmetics are organized in a specific way to take advantage of this. The shader interpreter component is relatively straightforward, just an expression evaluator stripped to the bare minimum – it doesn’t even support numerical constants natively. A final little bit is a just-good-enough PRNG (Pseudo Random Number Generator) to replace the low precision Windows rand() and the non-C99 Unix drand48(). An overnight session would run through its short period many times, but that doesn’t necessarily map to the same set of paths in PSSMLT. After all, Metropolis et al. used an even worse PRNG in their 1953 paper.

    + +

    The PPM compressor uses statically weighted fixed order contexts with an arithmetic encoder tweaked for iocccsize. The encoder emits octet-space pairs where each octet encodes ~6.5 bits of information and each space encodes 2 bits (thanks to the generous definition of “space” in iocccsize.c). The compressor actively shuffles the variable names around until the compressed string happens to contain enough “{}; ” to pass the final iocccsize test. There are a few other tweaks:

    + +
      +
    • The PPM model uses mostly whitespace characters for weights.

    • +
    • The encoder never emits ‘“’ and ‘\’.

    • +
    • The decoder uses an O(n2) algorithm to avoid the gigabytes-sized hash table frequently found in other PPM implementations.

    • +
    + + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2013/hou/hint.text b/2013/hou/hint.text new file mode 100644 index 000000000..bdde0e457 --- /dev/null +++ b/2013/hou/hint.text @@ -0,0 +1,123 @@ +# Best use of 1 Infinite Loop + +Qiming Hou + + + + +## Judges' comments: +### To build: + + make hou + +### To run: + + ./hou [scene-file-name] [options] + + Follow the instructions in stdout, preferably with an auto-refreshing PPM image viewer ready. + Refresh the image every time the output refreshes, all effects should be more or less recognizable when you see 16. + +### Try: + + ./hou BIG + ./hou old_default.scene BIG + ./hou otherroom.scene + ./hou otherroom.scene NAIVE + +### Selected Judges Remarks: + +You could consider that this program violates the source code size +limit. This is because the first compliation of this program is +really just a decompressor to generate the real source code of the +program. + +This program will loop infinitely while progressivly refining a +raytraced image. + +## Author's comments: +### Using hou + +This program is a programmable rendering engine with a built-in default scene. The standard command line is: + + ./hou [scene-file-name] [options] + +As hou runs, it writes a progressively refining image to a ppm file specified in the scene. The initialization may take a while, but once it's done, a rough preview should be available in seconds. Leave hou running for the night, and you get a high quality result like the attached *.jpg files. Kill hou manually after you're satisfied with the image quality. + +To save time and energy for the judges, rendered images for all provided scenes are provided as attached files. + +### Features + + * Fully programmable: Almost every stage of the renderer is programmable with a shader, i.e., a short script that does something rendering-related. In particular, each scene consists of one or more geometry shaders, a camera shader, and one or more material shaders. Shaders are written in an interpreted language that supports basic arithmetic, a few math functions, variables and procedural call in the CPS (Continuation Passing Style). + + * Fast preview: This renderer isn't just a naive path tracer, it actually uses a modern global illumination algorithm which is robust against challenging scene configurations. You can mostly place light sources and specify surface properties as you please without worrying too much about the convergence speed -- you always get a nice fast preview within one or two minutes. As proof, there is a comparison: "./hou otherroom.scene" gives a rough idea about the overall illumination at 16 samples per pixel (i.e., when the program prints 16), whereas the naive approach "./hou otherroom.scene NAIVE" only produces a mess of white dots. + + * Rich visual effects: The algorithm samples all light path types so most physically based effects can be produced. The default scene demonstrates quite a few of them: reflection, area light, soft shadows, color bleeding, caustics, and depth-of-field blur. Of course, one can also get programmable-shading effects like procedural texturing and approximated Fresnel terms. + + * Accelerated ray tracing: The ray tracing part uses an algorithm better than the brute-force intersection of everything. The renderer even builds an acceleration data structure! Despite the double precision and the single-threaded-ness, it still runs at about 0.5 million rays per second on the author's machine. + + * Pause and resume: Can't run ./hou overnight? No problem! You can kill and resume a rendering session whenever you want. The renderer automatically saves the progress every 16 samples and resumes where it's left off when restarted. Also, each scene/parameter combination gets a different saved session so you don't have to worry about conflicts. + +### Abuse of the rules + + * hou.c uses compression to get around the size limit. The compression fully complies with the rules and the guidelines (at least the portion that shows up in grep "size limit"). Please see the "Self-imposed restrictions" section below for more details. + + * hou does not terminate (as suggested by the second line of rule 6). + +### Self-imposed restrictions + + * The building process does not involve any OS tool beyond cc and make. No gzip compression! a.c.gz doesn't fit in 2053 bytes, anyway. + + * Neither hou.c nor a.c (the *real* decompressed source) uses #define (or cc -D) at all. + + * The source code is not required at runtime. + + * a.c does not drop optional features to reduce size. There are pure optimization code that can be dropped without affecting the converged output (only affecting the ray tracing speed / convergence rate). All files are properly fopened with "rb" / "wb" for Windows compatibility. The PPM header has a comment line for non-standard-compliant viewers (specifically, my old HDRShop 1.0). And there is a nice text message saying "please wait...". + + * Despite the messy look, a.c and hou.c compiles warning-free (hou.c even wastes 18 bytes on #include just for putchar). a.c compiles mostly clean in the C99/ANSI modes of clang and gcc (with -Wall --pedantic). The only warning generated is a pedantic one: "string constant too long". + +### Comments and why obfuscated + + * Both the compression and the rendering use mathematically involved algorithms. Understanding the C doesn't help much if one isn't familiar with the math. + + * Modern renderers provide shader access to just about any internal state. This one follows suit and reuses the same shader-accessible array for all important internal states. + + * Infinity and not-a-number are used during normal course of execution. + + * Previous image-generating entries may take care to hide the "IOCCC" string in the code, but they leave the text clear in the *result*. This entry takes it further and obfuscates the output image as well. Can you find the text in the image? Hint: look up. + + * a.c leaves all shaders in plain text, but the plain text shader code can't be taken for its face value -- the arithmetic rules subtly diverge from our common sense. + + * a.c is less portable than hou.c itself. hou.c only depends on ASCII and should run just fine on 16-bit, small memory, or float-incapable machines. a.c, while still reasonably portable, is quite memory consuming, requires IEEE754-compliant double, and assumes int to be 32-bit. + + * Though technically endian-dependent, a.c remains portable providing that one doesn't copy saved sessions across endians. + +### Spoiler + + 3225 3225 3225 9 9 3225 3225 + 1 1 1 1 1 1 1 1 1 1 + 4225 1226 1 1 1 1 1222 1226 + 1 1 1 1 1 1 1 1 1 + 4226 1 4226 8 4222 4226 1 1 + + The program consists of a recursive-descend interpreter, a 3DDDA (3D Discrete Differential Analysis) ray tracer, a PSSMLT (Primary Sample Space Metropolis Light Transport) light path sampler, all squeezed into the size limit using a PPM compressor (Prediction by Partial Matching, and yes, the output format is chosen for the pun). + + PSSMLT uses the Metropolis-Hasting algorithm to sample a 32D unit hypercube. Each point in the hypercube is interpreted as a sequence of random numbers, and is sent to a path tracer to generate a light path. The point's Metropolis-Hasting energy is then defined as the corresponding path's contribution value to the final image. Since each path is sampled with a probability proportional to its energy, the sample distribution directly corresponds to the final image, which can then be produced as a simple per-pixel histogram of all generated paths. The robustness comes from a state mutation strategy that actively tries to explore the neighborhood of high energy peaks (e.g. paths that happen to hit the light source in otherroom.scene). In addition, a rudimentary form of lens path stratification is added to balance the attention each pixel receives. The Metropolis-Hasting process completely avoids the tell-tale pixel sampling loop required in most other image generation methods. + + The 3DDDA tracer is chosen for scalability: its performance doesn't get much worse as scene complexity increases. Another benefit is that with the DDA code in place one can naturally use hierarchical grids as an acceleration structure. The downside, of course, is that the setup involves quite a few divisions, which naturally turns into division-by-zeros. Fortunately, the IEEE754 standard has a nice set of rules just for this purpose and the arithmetics are organized in a specific way to take advantage of this. The shader interpreter component is relatively straightforward, just an expression evaluator stripped to the bare minimum -- it doesn't even support numerical constants natively. A final little bit is a just-good-enough PRNG (Pseudo Random Number Generator) to replace the low precision Windows rand() and the non-C99 Unix drand48(). An overnight session would run through its short period many times, but that doesn't necessarily map to the same set of paths in PSSMLT. After all, Metropolis et al. used an even worse PRNG in their 1953 paper. + + The PPM compressor uses statically weighted fixed order contexts with an arithmetic encoder tweaked for iocccsize. The encoder emits octet-space pairs where each octet encodes ~6.5 bits of information and each space encodes 2 bits (thanks to the generous definition of "space" in iocccsize.c). The compressor actively shuffles the variable names around until the compressed string happens to contain enough "{}; " to pass the final iocccsize test. There are a few other tweaks: + + * The PPM model uses mostly whitespace characters for weights. + + * The encoder never emits '"' and '\\'. + + * The decoder uses an O(n^2) algorithm to avoid the gigabytes-sized hash table frequently found in other PPM implementations. + +-------------------------------------------------------------------------------- + diff --git a/2013/hou/hou.c b/2013/hou/hou.c new file mode 100644 index 000000000..b02a3d3de --- /dev/null +++ b/2013/hou/hou.c @@ -0,0 +1,18 @@ +#include +char*s="0 V Y b z * U . q ` E Q 7 d > A + 4 5 4 S Q b M a S p . U * & 3 m i k $ i n 1 J ` X ` 8 p p U ' 3 / K [ @ > r u h m o M T ` 4 : O w ^ x @ W o I 6 X O ; ' Q l j o K ( } [ ? x 7 P S g _ # - { W ? Z ; F w % t A O r n . q m A k e v v H C  / : - % | , # F N v { V u J d ) Z ^ +  ^ ! y + w | g A [ C v ? 5 N { K % s G Q  A s @ ? V S b b A b = 1 l D z C H q N Q f K F 9 ; j @ x 0 W l { Y w { 2 1 k _ { 9 W 8 N D R  V R ; @  % } a P 3 B # l = h 0 z x k O , G I e Z ^ [ i | / O 4 / e ? c _ x 8 j P / . - I 4 E | C . k I 0 = D C ~ h 3 A f B V F P p X B P - R U ( P e I w d = n f > > L Q L B B @ s f j B < m J % e $ F z q a 1 W V [ m e m a # ! Y x 2 X I ! E 8 & f J % , b r u A D , t $ L g L $ d g x G  _ ( Z ? t g Y > O ` @ 5 t & ' 6 F i 0 m I | a S _ V M E m W H V N O B 7 I 2 % & 2 w : / N F V n  # $ T + ] q  O + W + c q u w ~ , 5 O [ { G [ w F C _ Z 9 F ~ * l x L ' > % @ g , 8 & g m b F D [ 0 : p B ' Z # f 3 p r ; , D / F = g _ N 4 [ Y j } J 9 m _ + r c * 8 4 ] | c o ' i n ~ < p l a ~ B ( H  1 4 Z C i S 3 R  C s ' T r B , g L 4 x _ t # y U p * ~ { / r W _ d O * 1 g o w H U s Z ~ Y a ? r R X 7 Z K R p P - i l b ; i 5 _ [ ? ] X m [ 4 O # + S O * r ' Z W d ' E 7 N y b u 5 , $ o X $ J ? m : e [ ) U 8 Q , u ? E u G + 5 p ] L - y _ ; . ! s ] O X K Y s G p J R 9 G d ' i n ` % Z 9 h 0 E % z j b u > Q W P 4 r r 2 f C g r ! H x # 4 P X t ` ! , M S ^ _ C N > | e G K p ^ t ! Y Z @ O C , c ( ] # M Y H $ Z ? : , F # W T @ N W ) b L } @ + S j j 8 s ( H V j U / k - t - ] D [ ! B $ ] g > : n 3 > ] t C ( < 5 T * R ` # U q v ] & u Y b < Z C r q x H ; y H a < 7 ! t h c Y f i d f 9 ~ ^ W E Y 7 U _ 8 + l 2 w + u x ~  D ; 5 # l ' q J 7 a x - Z  v Z ? o 6 % . e ! c ' , ~ # P l = B 4 b { C k l u O / W $ K $ e i I W J 5 $ 6 y c l ) { @ % 1 % G 0 7 U B _ ( 2 $ ' [ H h B N ! i ' b C U R / 0 ! - V d V c ~ / , ~ $ _ ] i - d < _ ' Q W ( # g k + : : & F 0 Q E L N : E c w X , s & j K ' ~ W h 0 3 J , C x W j w 3 6 E d 4 j * + u } $ y # z 9 ! E R ` u G t ? [ * : U y N k 3 e G l K W i Q W 5 _ E 8 A 9 O ; - ( O D = ? W - 8 8 ( $ i c i N W 8 F U / x x | x 7 ] j H q & 5 y v 4 9 B k w v e 2 4 K 2 = W _ D / b @ * [ } } g | ) f y K L 1 B Z G 4 ) _ N > 5 ! [ 0 a % X c  * ! I g e s t ; $ + % } r Q !  X q 8 [ ( ~ W L r > X ) ` $ N { | 9 | . P P s ^ , J ! t T m q L & t z D N Q U a t 9 S ` ' @ [ 7 y A F v k ) G 4 R k C 6 S { L i , G D O F % P g w ' 0 - J C ` I _ h  4 6 ~ p H ? p [ G x H b # j s ? 4 C + a d 2 G : { L ) N : G f R a J : j @ z R 1 o 3 ~ $  u F | 8 k R y & - o 3 - J R z d I L < j E i 1 3 + _ < b _ # } h G X 8 { u k y  ' 1 Z Q @ h ~ 3 g ^ t u @ i # x L ! { = M w I w 1 : ] y N B l 3 z 9 T = n Z T p A 7 U ` U 0  I b * _ D $ K * t T t n U q f Y O P i K V 5 $ ^ $ + _ J ' c * q [ : 9 p M 1 C M 2 & 1 8  3 i % / u ; w f ( G s i } s % 0 z w G ` W A } 3 _ u ( s f Y z $ M F _ % B c * < ; 7 A j | R > b K 8 j $ U X Q Z / c { @ L ' c 8 I n ( ~ 2 < z F - } ^ M 2 t 6 r c ( | : w b 2 P O _ P & $ X - W 1 y H P B M y W # l * | j p @ a _ x c A # 2 r e ( ; 5 = V 2 / < R } s T w i b z 7 - u s g q j g N T } o a i 6 M 3 k D I S ' 6 I > ~ C o } o 1 Y + ~ x $ = r J ] [ ` O ~ z Q P ^ ^ v a O } ~ j } P z A - Z E [ Q h @ U i | B 3 F = 6 q J . J | K  f V s W W 1 | [ r [ r n c y . 3 M y ^ 5 { e w 7 5 u L @ q N - { I e W k ! U $ i . } 4 J ! p S o q s ] ` k 2 $ 8 ( C I [ P ^ 7 O : P U Z ^ @ { . N ) 4 } j + u M ] 7 = & 2 F 4 - l Q x Q F m t N , M j ' 5 = H k ^ A w : A e | / =  7 - ^ X 1 ~ B H y & @ $ k s | & G ^ X } g N B I F ; 9 p | [ W : + B < h T L o 2 f / 0 p F _ 6 f ; ) 4 ' r ~ 2 S O A g 7 0 Y Z t S t ^ ' $ k 8 F K M . [ x ; m D a S t { y 9 % P # 6 1 # d 1 r & a u ' X f ^ j % | K .  ' ` 6 ? r C  p ' P o i D Y ( # g f j A G { N k * L ' D I V ) u O # b Y P 0 : Q 0 ~ 0 y [ ",l[4366]="  "; +int main(){ +long j,i=9,x=0,w=1; +while(i' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "Park different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Paul Erdos!"; \ + fi + @${TRUE} diff --git a/2013/mills/hint.html b/2013/mills/hint.html new file mode 100644 index 000000000..1400ea16f --- /dev/null +++ b/2013/mills/hint.html @@ -0,0 +1,160 @@ + + + + + + + Most timely rendered + + +

    Most timely rendered

    + +

    Christopher Mills
    +mrxo@sonic.net

    + +

    Judges' comments:

    + +

    To build:

    + +
    make mills
    +
    + +

    To run:

    + +
    ./mills
    +
    + +

    Try:

    + +
    ./mills &
    +
    + +

    While that is running, point your favorite browser at: http://localhost:8224

    + +

    Selected Judges Remarks:

    + +

    Who will be the first to post an image rendered during a leap-second?

    + +

    Author’s comments:

    + +

    The Program

    + +

    This program is a handy graphical clock. Simply run the program, click OK to +any annoying security dialogs that pop up (aren’t those annoying?), then fire +up your web browser and type in the following URL:

    + +

    http://localhost:8224

    + +

    You will soon be presented with a lovely dynamically rendered 3D scene that +also convienently tells you the current time!

    + +

    Usage Notes

    + +

    The program will continue to give you the time of day as it changes by +reloading the page as often as it can render. If you grow tired of watching +your life slip by, hit Control-C in the original window. Note that if you +want to restart the program again, you should wait a minute or two before +doing so. For details as to why this is necessary, feel free to Google +TIME_WAIT. And while you are there, click on an ad. They could use the +money.

    + +

    It would be possible to fix this by adding

    + +
    n=1,setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&n,sizeof n),
    +
    + +

    at an appropriate spot in the code (an exercise left to the reader). However, +as this limitation is documented, it is not techinally a bug.

    + +

    Details of Operation

    + +

    The program wears many hats (not literally). It is

    + +
      +
    • a web server
    • +
    • a PNG encoder
    • +
    • a ray tracer
    • +
    • a clock
    • +
    + + +

    It replies to web requests with a PNG image that uses the +Adam7 +encoding to return data progressively. Since the data is returned in Adam7 +format, the scene is displayed initally at a lower resolution and allowed to +be progressively refined as time goes on. The ray tracer is integrally tied +to the PNG encoder, casting rays in the Adam7 order. The web server uses +PNG primarily because of PNG’s ability to return data progressively, and not +as you might think because the PNG standard is so obfuscated as to require +both little- and big-endian encodings at different spec layers.

    + +

    Since ray-tracing was an obvious choice to return to a web server, I needed +something to ray-trace. A static scene would be uninteresting. I took +inspiration (as I often do) from the IOCCC remarks file which says

    + +

    At least one judge prefers to maintain the use of the leap-second + as part of the world’s time standard.

    + +

    Then it was obvious; The code should display the time. It is believed (but +not confirmed) that the code will, in fact, display leap seconds correctly.

    + +

    To display the time, of course we would need a font. This font is encoded +as a string, using only the C whitespace characters. Clearly, the judges +intended this use of whitespace for data compression, since their tool +doesn’t count whitepsace in strings differently than whitespace outside of +them.

    + +

    User-modifyable Features

    + +

    The code can be user-modified simply by changing the build command line. +The following symbols are defined in the build file:

    + +
      +
    • -DLT=x1,y1,z1,x2,y2,z2,...

      + +

      Defines the coordinates of the lights in the scene. It should be a +comma-separated list of coordinates (x, y, z), three per light.

    • +
    • -DNL=n

      + +

      Defines the number of lights. Should be equal to the length of the list +above (three times the number of lights).

    • +
    • -DEY=x,y,z

      + +

      Defines the position of the viewer (the eyepoint) for the scene. The eye +is looking at the origin (0, 0, 0).

    • +
    + + +

    Other Build Flags

    + +

    The original program bound the server to INADDR_ANY to allow everyone to +experience the server’s output. The Judges suggested that I instead restrict +the bind to INADDR_LOOPBACK to reduce security alarms. As a compliant veteran +of innumerable post-ship late feature additions, I have modified the Makefile +to inject the new code without destroying the beautiful spherical symmetry of +the source code. In addition, I have altered the word sin_port to the more +family-friendly version win_port to protect against curious impressionable +youth trying to learn about sockets on Internet.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2013/mills/hint.text b/2013/mills/hint.text new file mode 100644 index 000000000..8bbba27ac --- /dev/null +++ b/2013/mills/hint.text @@ -0,0 +1,135 @@ +# Most timely rendered + +Christopher Mills + + + +## Judges' comments: +### To build: + + make mills + +### To run: + + ./mills + +### Try: + + ./mills & + +While that is running, point your favorite browser at: [http://localhost:8224](http://localhost:8224) + +### Selected Judges Remarks: + +Who will be the first to post an image rendered during a leap-second? + +## Author's comments: + +The Program +=========== + +This program is a handy graphical clock. Simply run the program, click *OK* to +any annoying security dialogs that pop up (aren't those annoying?), then fire +up your web browser and type in the following URL: + +> + +You will soon be presented with a lovely dynamically rendered 3D scene that +also convienently tells you the current time! + +Usage Notes +----------- + +The program will continue to give you the time of day as it changes by +reloading the page as often as it can render. If you grow tired of watching +your life slip by, hit `Control-C` in the original window. Note that if you +want to restart the program again, you should wait a minute or two before +doing so. For details as to why this is necessary, feel free to Google +`TIME_WAIT`. And while you are there, click on an ad. They could use the +money. + +It would be possible to fix this by adding + + n=1,setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&n,sizeof n), + +at an appropriate spot in the code (an exercise left to the reader). However, +as this limitation is documented, it is not techinally a bug. + +Details of Operation +-------------------- + +The program wears many hats (not literally). It is + + - a web server + - a PNG encoder + - a ray tracer + - a clock + +It replies to web requests with a PNG image that uses the +[Adam7](http://en.wikipedia.org/wiki/Adam7_algorithm) +encoding to return data progressively. Since the data is returned in Adam7 +format, the scene is displayed initally at a lower resolution and allowed to +be progressively refined as time goes on. The ray tracer is integrally tied +to the PNG encoder, casting rays in the Adam7 order. The web server uses +PNG primarily because of PNG's ability to return data progressively, and not +as you might think because the PNG standard is so obfuscated as to require +both little- and big-endian encodings at different spec layers. + +Since ray-tracing was an obvious choice to return to a web server, I needed +something to ray-trace. A static scene would be uninteresting. I took +inspiration (as I often do) from the IOCCC remarks file which says + +> At least one judge prefers to maintain the use of the leap-second +> as part of the world's time standard. + +Then it was obvious; The code should display the time. It is believed (but +not confirmed) that the code will, in fact, display leap seconds correctly. + +To display the time, of course we would need a font. This font is encoded +as a string, using only the C whitespace characters. Clearly, the judges +intended this use of whitespace for data compression, since their tool +doesn't count whitepsace in strings differently than whitespace outside of +them. + +User-modifyable Features +------------------------ + +The code can be user-modified simply by changing the build command line. +The following symbols are defined in the build file: + + * `-DLT=x1,y1,z1,x2,y2,z2,...` + + Defines the coordinates of the lights in the scene. It should be a + comma-separated list of coordinates (x, y, z), three per light. + + * `-DNL=n` + + Defines the number of lights. Should be equal to the length of the list + above (three times the number of lights). + + * `-DEY=x,y,z` + + Defines the position of the viewer (the eyepoint) for the scene. The eye + is looking at the origin (0, 0, 0). + +Other Build Flags +----------------- + +The original program bound the server to `INADDR_ANY` to allow everyone to +experience the server's output. The Judges suggested that I instead restrict +the bind to `INADDR_LOOPBACK` to reduce security alarms. As a compliant veteran +of innumerable post-ship late feature additions, I have modified the `Makefile` +to inject the new code without destroying the beautiful spherical symmetry of +the source code. In addition, I have altered the word `sin_port` to the more +family-friendly version `win_port` to protect against curious impressionable +youth trying to learn about sockets on Internet. + + +-------------------------------------------------------------------------------- + diff --git a/2013/mills/mills.c b/2013/mills/mills.c new file mode 100644 index 000000000..54e94e738 --- /dev/null +++ b/2013/mills/mills.c @@ -0,0 +1,43 @@ + #include + #include + #include + #include + typedef float F,A[3]; F D,M + [999]={ LT} ,*L=NL+M,*P,b,t,*h,*i; A + #define S(x,y,z)F x(F*d,F z s){ F t=y; t+=y; return t+=y; } + E,Q,U,V,C,c,I={ EY} ; unsigned char g[2414],*p=g,*e; int j,k,s,m + ,n,x,y; S(B,*d++=*s++,*)S(o,*d+++=*s++,*)S(a,*d++-=*s++,*)S(H,*d++ + **s++,*)S(X,*d++*=s,)S(v,*d+++=s,)int w(int c){ return*p++=c; } F W(F* + d){ return sqrt(H(d,d)); } void r(uint32_t u){ w(u>>24); w(u>>16); w(u>> + 8); w(u); } F O(F*d){ return X(d,1/W(d)); } char*z,*f; void u(char*s){ * + s&&w((u(1+s),*s)); } F G(F x,int p){ for(z=p*46+f; 12^*z; x+=.5){ for(D=-4; + 5>D; D++)if(9-*z++){ *P++=x; *P++=D/2; *P++=0; } } return p; } void K(){ write + (k,g,p-g); p=g; } F*d(){ h=0; D=1e9; a(E,Q); O(E); 2[E]&&0>(t=(1+2[Q])/2[E])&& + (D=-t,h=P); for(i=M; P>i; i+=3){ B(C,i); a(C,Q); b=H(E,C); (t=b*b-H(C,C)+(i=0&&0<(t=bt&&(D=t,h=i); } return h; } void Y(int N){ F*h,*i +; A p,n; if(!(h=d()))*c=1[c]=(2[c]=2[E]/2)/2; else if(hi; ++i){ B(E,i); B(Q,p); d()-i||v(c,( +h-P?.1:.5)*H(n,E)); } v(c,0.05); h-P||(2[c]*=.3,c[1&lrint(*p)^lrint(1[p])&1]*=.2); +} } void Z(char*s){ K(); p+=4; u(s?s:"TADI"); } void J(){ uint32_t c=~0; e=p; p=g; +r(e-p-8); while(p!=e){ c^=*p++; for(j=0; 8>j; j++)c=c/2^c%2*3988292384; } r(~c); K + (); } void q(int c){ w(c); m+=c; m%=c=65521; n+=m; n%=c; } void T(F c){ c=.5+255 + *c; q(0>c?0:c>255?255:c); } struct sockaddr_in R; int main(){ time_t i; struct + tm*b; R.win_port=8224; s=socket(R.sin_family=AF_INET,SOCK_STREAM,0); bind(s, + (void*)&R, sizeof R); listen(s,1); for(; ; ){ k=accept(s,0,0); for(; ; ){ ++j; + read(k,p,1); if(*p=='\n') { if(3>j)break; j=0; } } m=1; u("\n\032\n\rGNP" + "\211\n\r\n\r1 :hserfeR\n\rKO 002 0.1/PTTH"); Z("RDHI"); r(800); r(600); w + (8); r(33554433); J(); Z(0); w(120); w(1); J(); i=time(0); b=localtime(& + i); x=b->tm_sec; *I=45x?x:30-x; *U=-I[1]; 1[U]=*I; *V=2[I]* + *I; 1[V]=2[I]*1[I];2[V]=-*I**I-1[I]*1[I]; O(U); O(V); X(U,D=W(I)/ + 1e3); X(V,D); P=L;y=1+(11+b->tm_hour)%12; 9tm_min; G(-2,y/10);G(2,y%10); G(6, + 10); G(10,x/10); G(14,x%10); for(z="xxxdtrb! d r y "; 9[z]; ++z){ + for(y=7&8[z]; 600>y; y+=14&*z){ Z(0); w(0); p+=4; q( 0); for(x=7&9[z]; 800>x; + x+=15&1[z]){ B(Q,V); X(Q,y-300); B(E,U); X(E,x -400); o(E,Q); B(Q,I); Y(0); + T(*c); T(1[c]); T(2[c]); } j=p-g-13; 12[ g]=~(10[g]=j>>8); 11[g]=~(9[g]= + j); J(); } } Z(0); w(1); r( 65535); r(n<<16|m); n=0; J(); Z( + "DNEI"); J(); j=0; close(k); } } char*f= + +" "; diff --git a/2013/misaka/Makefile b/2013/misaka/Makefile new file mode 100644 index 000000000..50af8ef34 --- /dev/null +++ b/2013/misaka/Makefile @@ -0,0 +1,278 @@ +#!/usr/bin/env make +# +# 2013 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +CHMOD= chmod + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -W -Wno-comment -Wno-empty-body +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${LIBS} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= horizontal_cat vertical_cat long_cat loong_cat \ + loooong_cat loooooooong_cat long_fat_cat \ + long_faat_cat same_as_long_cat +OBJS= misaka.o misaka2.o misaka3.o misaka4.o misaka5.o \ + misaka6.o misaka7.o misaka8.o misaka9.o +OTHER_C= misaka2.c misaka3.c misaka4.c misaka5.c \ + misaka6.c misaka7.c misaka8.c misaka9.c +DATA= bf.pl +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +misaka: all + @${TRUE} + +horizontal_cat: misaka.c + ${CC} ${CFLAGS} $< -o $@ + +misaka2.c: horizontal_cat misaka.c + ${RM} -f misaka2.c + ./horizontal_cat misaka.c misaka.c > misaka2.c + +vertical_cat: misaka2.c + ${CC} ${CFLAGS} misaka2.c -o $@ + +misaka3.c: vertical_cat misaka.c + ${RM} -f misaka3.c + ./vertical_cat misaka.c misaka.c > misaka3.c + +long_cat: misaka3.c + ${CC} ${CFLAGS} misaka3.c -o $@ + +misaka4.c: vertical_cat misaka.c + ${RM} -f misaka4.c + ./vertical_cat misaka.c misaka.c misaka.c > misaka4.c + +loong_cat: misaka4.c + ${CC} ${CFLAGS} misaka4.c -o $@ + +misaka5.c: vertical_cat misaka.c + ${RM} -f misaka5.c + ./vertical_cat misaka.c misaka.c misaka.c misaka.c > misaka5.c + +loooong_cat: misaka5.c + ${CC} ${CFLAGS} misaka5.c -o $@ + +misaka6.c: vertical_cat misaka.c + ${RM} -f misaka6.c + ./vertical_cat misaka.c misaka.c misaka.c misaka.c misaka.c > misaka6.c + +loooooooong_cat: misaka6.c + ${CC} ${CFLAGS} misaka6.c -o $@ + +misaka7.c: vertical_cat horizontal_cat misaka.c + ${RM} -f misaka7.c + ./vertical_cat misaka.c misaka.c | ./horizontal_cat - - > misaka7.c + +long_fat_cat: misaka7.c + ${CC} ${CFLAGS} misaka7.c -o $@ + +misaka8.c: vertical_cat horizontal_cat misaka.c + ${RM} -f misaka8.c + ./vertical_cat misaka.c misaka.c | ./horizontal_cat - - - > misaka8.c + +long_faat_cat: misaka8.c + ${CC} ${CFLAGS} misaka8.c -o $@ + +misaka9.c: vertical_cat horizontal_cat misaka.c + ${RM} -f misaka9.c + ./horizontal_cat misaka.c misaka.c | ./vertical_cat misaka.c - > misaka9.c + +same_as_long_cat: misaka9.c + ${CC} ${CFLAGS} misaka9.c -o $@ + +# Information on the misaka programs +# +understanding: bf.pl misaka.c ${OTHER_C} + @${CHMOD} +x bf.pl + @for c in misaka.c ${OTHER_C}; do \ + echo ./bf.pl $$c; \ + ./bf.pl $$c; \ + done + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJS} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + ${RM} -f ${OTHER_C} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Lehmer!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "Park different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Paul Erdos!"; \ + fi + @${TRUE} diff --git a/2013/misaka/bf.pl b/2013/misaka/bf.pl new file mode 100644 index 000000000..4e06e0c77 --- /dev/null +++ b/2013/misaka/bf.pl @@ -0,0 +1,318 @@ +#!/usr/bin/perl -w +# +# Usage: +# ./bf.pl [-e ] [-d] +# +# -e Read expected output from , exit with nonzero status +# if output does not match. Output is not written to stdout when +# this option is used. +# +# -d Dump tape contents to stdout on exit. +# +# Yet another brainfuck interpreter. This is not a general brainfuck +# interpreter in that it intentionally does not support input +# operations. Instead, this interpreter is specialized for debugging +# small embedded brainfuck code that generate deterministic output. +# Where there is a choice between speed and ease of debugging, the +# latter is preferred. +# +# 2013-09-27 + +use strict; +use Getopt::Long; +use constant MAX_LOOP_LIMIT => 0x200000; +use constant MAX_OUTPUT_LIMIT => 4096; +use constant MAX_TAPE_SIZE => 1024; + + +# {{{ Run time data and functions + +# Data tape and pointer +my @d = (); +my $p = 0; + +# Error message from executing the compiled code +my $eval_error = ''; + +# Evaluation counters, used to break infinite loops +my $loop_count = 0; +my $output_count = 0; + +# Command line settings +my $expected = undef; +my $cursor = 0; +my $dump_tape = 0; + +# Handle input operator +sub R($$) +{ + my ($line, $column) = @_; + $eval_error = "$line:$column: input operations are not allowed\n"; + die; +} + +# Handle output operator +sub W($$) +{ + my ($line, $column) = @_; + + if( $p < 0 ) + { + $eval_error = "$line:$column: reading from negative tape [$p]\n"; + die; + } + unless( defined $d[$p] ) + { + $eval_error = "$line:$column: uninitialized read [$p]\n"; + die; + } + if( ++$output_count > MAX_OUTPUT_LIMIT ) + { + $eval_error = "$line:$column: max output limit exceeded: $output_count\n"; + die; + } + print chr($d[$p]); +} + +# Handle output operator, for use with matching expected output +sub E($$) +{ + my ($line, $column) = @_; + + if( $p < 0 ) + { + $eval_error = "$line:$column: reading from negative tape [$p]\n"; + die; + } + unless( defined $d[$p] ) + { + $eval_error = "$line:$column: uninitialized read [$p]\n"; + die; + } + if( ++$output_count > length($expected) ) + { + $eval_error = "$line:$column: max output limit exceeded: $output_count\n"; + die; + } + if( chr($d[$p]) ne substr($expected, $cursor, 1) ) + { + $eval_error = "$line:$column: output mismatched on byte $cursor: " . + $d[$p] . " != " . ord(substr($expected, $cursor)) . "\n"; + die; + } + $cursor++; +} + +# Check number of times loop condition has been evaluated. +# This breaks infinite loops. +sub L($$) +{ + my ($line, $column) = @_; + if( ++$loop_count > MAX_LOOP_LIMIT ) + { + $eval_error = "$line:$column: max loop limit exceeded: $loop_count\n"; + die; + } +} + +# Check cell updates for array bounds +sub A($$) +{ + my ($line, $column) = @_; + if( $p < 0 ) + { + $eval_error = "$line:$column: writing to negative tape [$p]\n"; + die; + } + if( $p >= MAX_TAPE_SIZE ) + { + $eval_error = "$line:$column: tape overflow [$p]\n"; + die; + } +} + +# }}} + +# {{{ Compile time functions + +# Flush pending add instructions +sub FlushAdd($) +{ + my ($add) = @_; + my $code = ''; + + if( defined($$add) ) + { + if( $$add > 0 ) + { + $code = '$d[$p]+=' . $$add . ';'; + } + elsif( $$add < 0 ) + { + $code = '$d[$p]-=' . (-$$add) . ';'; + } + $$add = undef; + } + return $code; +} + +# Flush pending move instructions +sub FlushMove($) +{ + my ($move) = @_; + my $code = ''; + + if( $$move > 0 ) + { + $code = '$p+=' . $$move . ';'; + } + elsif( $$move < 0 ) + { + $code = '$p-=' . (-$$move) . ';'; + } + $$move = 0; + return $code; +} + +# Flush pending add or move instructions +sub Flush($$) +{ + my ($add, $move) = @_; + return FlushAdd($add) . FlushMove($move); +} + +# Optimize generated perl code +sub Optimize($) +{ + my ($code) = @_; + + $code =~ s/while\(\$d\[\$p\]\)\{ + L\(\d+,\d+\); + A\(\d+,\d+\); + \$d\[\$p\]-=1; + \}/\$d[\$p]=0;/gx; + return $code; +} + +# Load input from stdin and convert it to perl code. Dies on error. +sub CompileInput() +{ + # Perl code compiled from brainfuck code + my $code = ''; + + # Loop stack + my @stack = (); + + # Pending operation + my $move = 0; + my $add = undef; + + while( my $line = <> ) + { + my @bytes = map {chr $_} (unpack 'C*', $line); + for(my $column = 1; $column <= $#bytes + 1; $column++) + { + my $opcode = $bytes[$column - 1]; + if( $opcode eq '+' || $opcode eq '-' ) + { + $code .= FlushMove(\$move); + unless( defined($add) ) + { + $code .= "A($.,$column);"; + $add = 0; + } + $add += $opcode eq '+' ? 1 : -1; + } + elsif( $opcode eq '>' ) + { + $code .= FlushAdd(\$add); + $move++; + } + elsif( $opcode eq '<' ) + { + $code .= FlushAdd(\$add); + $move--; + } + elsif( $opcode eq '[' ) + { + push @stack, "$.:$column"; + $code .= Flush(\$add, \$move) . "while(\$d[\$p]){L($.,$column);"; + } + elsif( $opcode eq ']' ) + { + unless( scalar @stack ) + { + die "$.:$column: unmatched ]\n"; + } + pop @stack; + $code .= Flush(\$add, \$move) . '}'; + } + elsif( $opcode eq ',' ) + { + $code .= Flush(\$add, \$move) . "R($.,$column);"; + } + elsif( $opcode eq '.' ) + { + $code .= Flush(\$add, \$move); + if( defined($expected) ) + { + $code .= "E($.,$column);"; + } + else + { + $code .= "W($.,$column);"; + } + } + } + } + if( scalar @stack ) + { + die (join '', (map {"$_: unclosed [\n"} @stack)); + } + $code .= Flush(\$add, \$move); + return Optimize($code); +} + +# Load expected output to $expected global variable +sub LoadExpectedOutput() +{ + my $opt = ''; + GetOptions('expected=s' => \$opt, 'debug' => \$dump_tape); + if( $opt ne '' ) + { + open my $file, "<$opt" or die "Can not open $opt: $!\n"; + $expected = join '', <$file>; + close $file; + } +} + +# }}} + + +# Run program +LoadExpectedOutput(); +eval CompileInput(); + +# Dump tape contents +if( $dump_tape ) +{ + for(my $i = 0; $i <= $#d; $i++) + { + if( defined($d[$i]) ) + { + print "[$i] = $d[$i]\n"; + } + } + print "p = $p\n"; +} + +# Check for abnormal termination +if( $eval_error ne '' ) +{ + die "\n$eval_error"; +} +if( defined($expected) && $cursor < length($expected) ) +{ + die "Truncated output, cursor=$cursor, expected=" . length($expected) . "\n"; +} +exit 0; diff --git a/2013/misaka/hint.html b/2013/misaka/hint.html new file mode 100644 index 000000000..6831ea633 --- /dev/null +++ b/2013/misaka/hint.html @@ -0,0 +1,303 @@ + + + + + + + Most catty + + +

    Most catty

    + +

    Don Yang
    +omoikane@uguu.org
    +http://uguu.org/

    + +

    Judges' comments:

    + +

    To build:

    + +
    make misaka
    +
    + +

    This will build a bunch of versions of the code. See the author’s details for information on all of these builds.

    + +

    To understand the various intermediate source files that are built, try:

    + +
    make understanding
    +
    + +

    To run:

    + +
    ./horizontal_cat [files...] > [output]
    +./vertical_cat [files...] > [output]
    +
    + +

    NOTE: Use - for standard input. For example:

    + +
    ./vertical_cat - -
    +
    + +

    Try:

    + +
    seq 1 12 | ./horizontal_cat - - -
    +
    +./long_cat
    +./long_faat_cat
    +./long_fat_cat
    +./loong_cat
    +./loooong_cat
    +./loooooooong_cat
    +
    +seq -f '%.0f  ' 45 | ./horizontal_cat - misaka.c
    +
    + +

    Selected Judges Remarks:

    + +

    There is more to cat than mere cats.
    +Be they tall, fat, long or squat, this source code is sure to amuse.

    + +

    Slight diversion

    + +

    While one of the judges was reviewing this entry on the stern of the +Island Sky +in the middle of the Atlantic Ocean waiting the +total solar eclipse of 2013 +the judge was stuck by a +flying fish. +While result the impact was that the +Port from Portugal was lost, the +Grog from Cape Verde +and the laptop containing this entry was saved.

    + +

    While I’m sure most cats would have preferred otherwise, +the flying fish was returned to emswim with the fishesem. :-) +No cats were harmed in the process of judging this entry.

    + +

    Author’s comments:

    + +

    Overview

    + +

    Misaka is a file concatenation utility, with at least two modes of +operation:

    + +
    gcc misaka.c -o horizontal_cat
    +./horizontal_cat [files...] > [output]
    +
    +./horizontal_cat misaka.c misaka.c > misaka2.c
    +gcc misaka2.c -o vertical_cat
    +./vertical_cat [files...] > [output]
    +
    + +

    Where [files…] are a list of text file names. Use “-” to read from stdin.

    + +

    Details

    + +

    Horizontal cat

    + +

    One of my favorite unix utilities is cat. The best thing about it was +that it was named “cat”. That, and it’s useful for quickly showing contents +of a file. Though it was primary meant for concatenating files, that +function only seem to work if I wanted to concatenate files vertically.

    + +

    I thought the lack of horizontal concatenation must have been an oversight, +so I implemented this utility:

    + +
    gcc misaka.c -o horizontal_cat
    +./horizontal_cat files...
    +
    + +

    horizontal_cat concatenates files horizontally and write the output to +stdout. Each input file is padded with spaces on the right so that the +original text alignments are preserved.

    + +

    If “-” is specified as a file name, horizontal_cat will read from stdin. +Unlike cat, horizontal_cat loads all input to memory first. Thus you +can specify “-” multiple times to get stdin multiplied horizontally. For +example, if you have seq(1) in your shell, you can add line numbers to both +sides of misaka.c like this:

    + +
    seq -f '  %.0f  ' 45 | ./horizontal_cat - misaka.c -
    +
    + +

    Vertical cat

    + +

    Because horizontal_cat must know the maximum width of all files before +writing any output, all files must be processed at least twice. To support +stdin, file must be buffered to memory. This lead to the feature that +horizontal_cat can be used to duplicate stdin.

    + +

    Seems like the stdin doubling feature might be useful even for concatenating +files vertically, so I included a vertical mode. But supporting vertical +mode with command line options would be no fun. Instead, vertical mode is +enabled by concatenating the source code horizontally:

    + +
    ./horizontal_cat misaka.c misaka.c > misaka2.c
    +gcc misaka2.c -o vertical_cat
    +./vertical_cat files...
    +
    + +

    vertical_cat works more or less like cat, except you can use +vertical_cat to duplicate stdin:

    + +
    ./vertical_cat - -
    +
    + +

    Long cat

    + +

    After horizontal_cat and vertical_cat, I thought, maybe all I really +wanted was just more cats. So I implemented one more mode, this one is +enabled by concatenating misaka.c vertically:

    + +
    ./vertical_cat misaka.c misaka.c > misaka3.c
    +gcc misaka3.c -o long_cat
    +./long_cat
    +
    + +

    long_cat outputs ASCII art of a cat to stdout. You can make this cat +exponentially longer by concatenating more files vertically (up to 31 levels +high, depending on sizeof(int) for your compiler):

    + +
    ./vertical_cat misaka.c misaka.c misaka.c > misaka4.c
    +gcc misaka4.c -o loong_cat
    +
    +./vertical_cat misaka.c misaka.c misaka.c misaka.c > misaka5.c
    +gcc misaka5.c -o loooong_cat
    +
    +./vertical_cat misaka.c misaka.c misaka.c misaka.c misaka.c > misaka6.c
    +gcc misaka6.c -o loooooooong_cat
    +
    + +

    If your terminal has really thin fonts, you can also make this output fatter +by concatenating files horizontally:

    + +
    ./vertical_cat misaka.c misaka.c | ./horizontal_cat - - > misaka7.c
    +gcc misaka7.c -o long_fat_cat
    +
    +./vertical_cat misaka.c misaka.c | ./horizontal_cat - - - > misaka8.c
    +gcc misaka8.c -o long_faat_cat
    +
    + +

    Output width is determined by the first level of stacked programs, so a +triangle like the following will not have horizontally expanded output:

    + +
    ./horizontal_cat misaka.c misaka.c | ./vertical_cat misaka.c - > misaka9.c
    +gcc misaka9.c -o same_as_long_cat
    +
    + +

    Finally, if you lost track of how many misaka.c you have stacked together, +you can feed the source to a brainfuck interpreter to get a overview of how +the programs are stacked. Example:

    + +
    perl bf.pl misaka9.c
    +
    + +

    This outputs:

    + +
    MISAKA
    +MISAKA MISAKA
    +
    + +

    Return value

    + +

    horizontal_cat and vertical_cat will exit with zero status on success.

    + +

    If any input file fails to open, horizontal_cat and vertical_cat will +report the offending file name to stdout, and exit with nonzero status.

    + +

    If horizontal_cat and vertical_cat ran out of memory, they will exit +with nonzero status without outputting anything.

    + +

    Compatibility

    + +

    horizontal_cat makes the following assumptions about input files:

    + +
      +
    • ASCII with LF end of line sequences. If CR-LF sequences are used, CR + characters will appear in the middle of output lines.
    • +
    • All characters are of equal width, even tab characters.
    • +
    + + +

    Misaka has been verified to work on these following compiler+OS +combinations:

    + +
      +
    • gcc 4.6.3 on Linux 3.5.0-41
    • +
    • gcc 4.4.5 on Linux 2.6.32-5
    • +
    • gcc 4.3.5 on JS/Linux 2.6.20
    • +
    • gcc 4.8.1 on Windows (Cygwin and MingW)
    • +
    + + +

    Misaka requires a C99 compiler due to the use of single line comments. +Misaka does not depend on any other C99 features.

    + +

    Obfuscation

    + +

    Main obfuscation is in having a C program that compiles when tiled +horizontally and vertically, while using single line comments in less than +half of the lines. And maintaining a meaningful layout while doing that.

    + +

    There are other challenges too, of course, like getting a Brainfuck program +to tile horizontally and vertically. Really, tiling code of any sort +horizontally is an interesting exercise, I encourage everyone to try this +once.

    + +

    Other features to look for:

    + +
      +
    • Peculiar bits that switches horizontal cat to vertical cat.
    • +
    • Run-length encoded long cat.
    • +
    • Symmetric and recycled variable names.
    • +
    • CRC of the source code in the source code.
    • +
    + + +

    “gcc -Wall” should provide a hint to where the mode switch happens, it +does not output any irrelevant other warnings (verified on 4.6.3).

    + +

    Extra files

    + +

    Extra files included in my submission are informational only, they are not +needed for the program to work.

    + +
      +
    • bf.pl = a brainfuck interpreter, in case if you don’t have one handy.
    • +
    • spoiler.html = making of this program.
    • +
    + + +

    About Misaka

    + +

    The name, layout, and functionality of Misaka is inspired by a particular +stackable figure:

    + + + + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2013/misaka/hint.text b/2013/misaka/hint.text new file mode 100644 index 000000000..c4dd8be3b --- /dev/null +++ b/2013/misaka/hint.text @@ -0,0 +1,257 @@ +# Most catty + +Don Yang + + + + +## Judges' comments: +### To build: + + make misaka + +This will build a bunch of versions of the code. See the author's details for information on all of these builds. + +To understand the various intermediate source files that are built, try: + + make understanding + +### To run: + + ./horizontal_cat [files...] > [output] + ./vertical_cat [files...] > [output] + +NOTE: Use - for standard input. For example: + + ./vertical_cat - - + +### Try: + + seq 1 12 | ./horizontal_cat - - - + + ./long_cat + ./long_faat_cat + ./long_fat_cat + ./loong_cat + ./loooong_cat + ./loooooooong_cat + + seq -f '%.0f ' 45 | ./horizontal_cat - misaka.c + +### Selected Judges Remarks: + +There is more to cat than [mere cats](http://cheezburger.com/1680494336). +Be they tall, fat, long or squat, this source code is sure to amuse. + +#### Slight diversion + +While one of the judges was reviewing this entry on the stern of the +[Island Sky](http://www.noble-caledonia.co.uk/information/detail.asp?id=2&spid=76) +in the middle of the Atlantic Ocean waiting the +[total solar eclipse of 2013](http://en.wikipedia.org/wiki/Solar_eclipse_of_November_3,_2013) +the judge was stuck by a +[flying fish](http://en.wikipedia.org/wiki/Flying_fish). +While result the impact was that the +[Port](http://en.wikipedia.org/wiki/Port_wine) from Portugal was lost, the +[Grog](http://www.travelforpassion.com/grog-factory-cape-verde-santo-antao-cape-verde-1602-photo) from Cape Verde +and the laptop containing this entry was saved. + +While I'm sure most cats would have preferred otherwise, +the flying fish was returned to *em*swim with the fishes*em*. :-) +No cats were harmed in the process of judging this entry. + +## Author's comments: +Overview +======== +Misaka is a file concatenation utility, with at least two modes of +operation: + + gcc misaka.c -o horizontal_cat + ./horizontal_cat [files...] > [output] + + ./horizontal_cat misaka.c misaka.c > misaka2.c + gcc misaka2.c -o vertical_cat + ./vertical_cat [files...] > [output] + +Where [files...] are a list of text file names. Use "-" to read from stdin. + + +Details +======= + +Horizontal cat +-------------- +One of my favorite unix utilities is *cat*. The best thing about it was +that it was named "cat". That, and it's useful for quickly showing contents +of a file. Though it was primary meant for concatenating files, that +function only seem to work if I wanted to concatenate files vertically. + +I thought the lack of horizontal concatenation must have been an oversight, +so I implemented this utility: + + gcc misaka.c -o horizontal_cat + ./horizontal_cat files... + +*horizontal_cat* concatenates files horizontally and write the output to +stdout. Each input file is padded with spaces on the right so that the +original text alignments are preserved. + +If "-" is specified as a file name, *horizontal_cat* will read from stdin. +Unlike *cat*, *horizontal_cat* loads all input to memory first. Thus you +can specify "-" multiple times to get stdin multiplied horizontally. For +example, if you have seq(1) in your shell, you can add line numbers to both +sides of misaka.c like this: + + seq -f ' %.0f ' 45 | ./horizontal_cat - misaka.c - + + +Vertical cat +------------ +Because *horizontal_cat* must know the maximum width of all files before +writing any output, all files must be processed at least twice. To support +stdin, file must be buffered to memory. This lead to the feature that +*horizontal_cat* can be used to duplicate stdin. + +Seems like the stdin doubling feature might be useful even for concatenating +files vertically, so I included a vertical mode. But supporting vertical +mode with command line options would be no fun. Instead, vertical mode is +enabled by concatenating the source code horizontally: + + ./horizontal_cat misaka.c misaka.c > misaka2.c + gcc misaka2.c -o vertical_cat + ./vertical_cat files... + +*vertical_cat* works more or less like *cat*, except you can use +*vertical_cat* to duplicate stdin: + + ./vertical_cat - - + + +Long cat +-------- +After *horizontal_cat* and *vertical_cat*, I thought, maybe all I really +wanted was just more cats. So I implemented one more mode, this one is +enabled by concatenating misaka.c vertically: + + ./vertical_cat misaka.c misaka.c > misaka3.c + gcc misaka3.c -o long_cat + ./long_cat + +*long_cat* outputs ASCII art of a cat to stdout. You can make this cat +exponentially longer by concatenating more files vertically (up to 31 levels +high, depending on sizeof(int) for your compiler): + + ./vertical_cat misaka.c misaka.c misaka.c > misaka4.c + gcc misaka4.c -o loong_cat + + ./vertical_cat misaka.c misaka.c misaka.c misaka.c > misaka5.c + gcc misaka5.c -o loooong_cat + + ./vertical_cat misaka.c misaka.c misaka.c misaka.c misaka.c > misaka6.c + gcc misaka6.c -o loooooooong_cat + +If your terminal has really thin fonts, you can also make this output fatter +by concatenating files horizontally: + + ./vertical_cat misaka.c misaka.c | ./horizontal_cat - - > misaka7.c + gcc misaka7.c -o long_fat_cat + + ./vertical_cat misaka.c misaka.c | ./horizontal_cat - - - > misaka8.c + gcc misaka8.c -o long_faat_cat + +Output width is determined by the first level of stacked programs, so a +triangle like the following will not have horizontally expanded output: + + ./horizontal_cat misaka.c misaka.c | ./vertical_cat misaka.c - > misaka9.c + gcc misaka9.c -o same_as_long_cat + +Finally, if you lost track of how many misaka.c you have stacked together, +you can feed the source to a brainfuck interpreter to get a overview of how +the programs are stacked. Example: + + perl bf.pl misaka9.c + +This outputs: + + MISAKA + MISAKA MISAKA + + +Return value +============ +*horizontal_cat* and *vertical_cat* will exit with zero status on success. + +If any input file fails to open, *horizontal_cat* and *vertical_cat* will +report the offending file name to stdout, and exit with nonzero status. + +If *horizontal_cat* and *vertical_cat* ran out of memory, they will exit +with nonzero status without outputting anything. + + +Compatibility +============= +*horizontal_cat* makes the following assumptions about input files: + + * ASCII with LF end of line sequences. If CR-LF sequences are used, CR + characters will appear in the middle of output lines. + * All characters are of equal width, even tab characters. + +Misaka has been verified to work on these following compiler+OS +combinations: + + * gcc 4.6.3 on Linux 3.5.0-41 + * gcc 4.4.5 on Linux 2.6.32-5 + * gcc 4.3.5 on JS/Linux 2.6.20 + * gcc 4.8.1 on Windows (Cygwin and MingW) + +Misaka requires a C99 compiler due to the use of single line comments. +Misaka does not depend on any other C99 features. + + +Obfuscation +=========== +Main obfuscation is in having a C program that compiles when tiled +horizontally and vertically, while using single line comments in less than +half of the lines. *And* maintaining a meaningful layout while doing that. + +There are other challenges too, of course, like getting a Brainfuck program +to tile horizontally and vertically. Really, tiling code of any sort +horizontally is an interesting exercise, I encourage everyone to try this +once. + +Other features to look for: + + * Peculiar bits that switches horizontal cat to vertical cat. + * Run-length encoded long cat. + * Symmetric and recycled variable names. + * CRC of the source code in the source code. + +"gcc -Wall" should provide a hint to where the mode switch happens, it +does not output any irrelevant other warnings (verified on 4.6.3). + + +Extra files +=========== +Extra files included in my submission are informational only, they are not +needed for the program to work. + + * bf.pl = a brainfuck interpreter, in case if you don't have one handy. + * spoiler.html = making of this program. + + +About Misaka +============ +The name, layout, and functionality of Misaka is inspired by a particular +stackable figure: + + * [Google images](http://google.co.jp/search?q=%E3%83%9F%E3%82%B5%E3%82%AB%E7%9B%9B%E3%82%8A&tbm=isch) + * [Kotobukiya](http://main.kotobukiya.co.jp/figure/tsubucole_tmi_misakamori/) + +-------------------------------------------------------------------------------- + diff --git a/2013/misaka/misaka.c b/2013/misaka/misaka.c new file mode 100644 index 000000000..50aafbee3 --- /dev/null +++ b/2013/misaka/misaka.c @@ -0,0 +1,45 @@ + /*[*/#include// + #include//]++++[->++[->+>++++<<]<][(c)2013] + #ifndef e//[o + #include//]![misaka.c,size=3808,crc=d0ec3b36][ + #define e 0x1// + typedef struct{int d,b,o,P;char*q,*p;}f;int p,q,d,b,_=0//| + #include __FILE__//]>>>[->+>++<<]<[-<<+>>>++<]>>+MISAKA*IMOUTO + #undef e//[->[-<<+<+<+>>>>]<<<<<++[->>+>>>+<<<<<]>+>+++>+++[>]]b + #define e(c)/**/if((_!=__LINE__?(_=__LINE__):0)){c;}//[20002,+[-.+] + ,O,i=0,Q=sizeof(f);static f*P;static FILE*t;static const char*o[]={// + "\n\40\"8oCan\40not\40open %s\n\0aaFbfeccdeaEbgecbbcda6bcedd#e(bbed$bbd", + "a6bgcdbbccd#ead$c%bcdea7bccde*b$eebbdda9bsdbeccdbbecdcbbcceed#eaa&bae$cbe", + "e&cbdd$eldbdeedbbdede)bdcdea&bbde1bedbbcc&b#ccdee&bdcdea'bbcd)e'bad(bae&bccd", + "e&bbda1bdcdee$bbce#b$c&bdedcd%ecdca4bhcdeebbcd#e$b#ecdcc$bccda7bbcc#e#d%c*bbda", + ">bad/bbda"};static int S(){return(o[p][q]);}static/**/int/**/Z=0 ;void/**/z(int// + l){if(/**/Z-l){Z=l;q++;if(p96;i=S()-(d?96:32) ;q++;if(p_){/*]b */ + P[p].d=b;}{; } + #undef/*pqdz'.*/ e// ; + #define/*s8qdb]*/e/**/0 // + //<<.<<.----.>.<<.>++.++< .[>] + /*P[*/P[p].b++;continue;}}}t= stdout; + for (p=1;pi ){i=P[p].b;}} + if (O){for(p=0;p++q){_=P[q].p-P[q ].q; +b= 0;if(_b++)putchar(040);} putchar(10);}return 0;}p =1; + for(; p> `*//45)) | 01U + # /* */ endif // diff --git a/2013/misaka/spoiler.html b/2013/misaka/spoiler.html new file mode 100644 index 000000000..a8308c8f6 --- /dev/null +++ b/2013/misaka/spoiler.html @@ -0,0 +1,34 @@ + + +Replay text + + + + + + diff --git a/2013/morgan1/Makefile b/2013/morgan1/Makefile new file mode 100644 index 000000000..922db3eb1 --- /dev/null +++ b/2013/morgan1/Makefile @@ -0,0 +1,203 @@ +#!/usr/bin/env make +# +# 2013 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -W -Wall -Wextra -Wshadow -Wno-logical-op-parentheses \ + -Wno-shift-op-parentheses +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= -lm -lX11 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} -I${X11_INCDIR} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= morgan1 +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ -L${X11_LIBDIR} ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Lehmer!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "Park different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Paul Erdos!"; \ + fi + @${TRUE} diff --git a/2013/morgan1/hint.html b/2013/morgan1/hint.html new file mode 100644 index 000000000..e887d0304 --- /dev/null +++ b/2013/morgan1/hint.html @@ -0,0 +1,137 @@ + + + + + + + Smallest large system simulator + + +

    Smallest large system simulator

    + +

    Yves-Marie Morgan
    +yves-marie.morgan@parrot.com

    + +

    Judges' comments:

    + +

    To build:

    + +
    make morgan1
    +
    + +

    To run:

    + +
    echo "2013/10/03" | ./morgan1
    +
    + +

    Try:

    + +
    echo "1985/10/28" | ./morgan1
    +
    +echo "1996/12/31" | ./morgan1
    +
    + +

    Try pressing the arrow keys when your focus is in the window.

    + +

    Selected Judges Remarks:

    + +

    To verify the output, try echoing the date of an evening with a clear sky. +Use binoculars and/or telescope as needed. In some cases you may need +to wait for a better time of the evening. In a few cases, such as +the South Pole in the summer, you may need to move to a different +observing site.

    + +

    Author’s comments:

    + +

    Instructions

    + +

    It displays the position of the 8 planets of the solar system around the sun. +The date given in the command line is in the format YYYY/MM/DD (year, month and +day). The direction keys can be used to move in time : +Left : go back 1 day. +Right : go forward 1 day. +Down : go back 20 days. +Up : go forward 20 days.

    + +

    It handles correctly all leap years and the switch between julian calendar and +gregorian calendar (10 days missing between 1582/10/04 and 1582/10/15).

    + +

    The scale is logarithmic to be able to display the 8 planets without having +Mercury, Venus, Earth and Mars squizzed around the sun.

    + +

    The size is not proportinal either.

    + +

    Bonus

    + +

    It also displays the position of 2 famous comets during their last approach : +- The first one arround the third IOCCC. +- The second one between the thirteenth and fourteenth IOCCC.

    + +

    Limitations

    + +
      +
    • ASCII character set is assumed.
    • +
    • a c99 compiler is required (for some math.h functions).
    • +
    • The position should be correct for years between (-1000; +3000)
    • +
    • The approximations done in the formula are OK for displaying the +position around the sun but not for other applications like ephemeride or +sky view from Earth (angles may be off by 1 or 2 degrees sometimes).
    • +
    + + +

    Obfuscation

    + +
      +
    • Reuse of 1 letter variables.
    • +
    • Only the main function with some for loops.
    • +
    • Constants for orbital elements encoded in a string.
    • +
    • Hexadecimal and decimal values used inconsitentely.
    • +
    • Comparisons order are not consitent.
    • +
    • A lot of stuff is done in the different parts of the for loop.
    • +
    + + +

    Compilation warnings

    + +

    with gcc 4.7.2 on Linux Ubuntu 12.10 : +* prog.c:38:3: warning: suggest parentheses around ‘&&’ within ‘||’ [-Wparentheses] +* prog.c:40:34: warning: value computed is not used [-Wunused-value] +* prog.c:56:6: warning: suggest parentheses around ‘&&’ within ‘||’ [-Wparentheses] +* prog.c:58:50: warning: value computed is not used [-Wunused-value] +* prog.c:61:5: warning: suggest parentheses around ‘-’ inside ‘>>’ [-Wparentheses]

    + +

    with clang 3.1 on Linux Ubuntu 12.10 : +* prog.c:38:49: warning: ‘&&’ within ‘||’ [-Wlogical-op-parentheses] +* prog.c:38:27: warning: ‘&&’ within ‘||’ [-Wlogical-op-parentheses] +* prog.c:55:13: warning: ‘&&’ within ‘||’ [-Wlogical-op-parentheses] +* prog.c:56:14: warning: ‘&&’ within ‘||’ [-Wlogical-op-parentheses]

    + +

    Due to most parentheses and braces removed when unecessary.

    + +

    To verify the display, you can look at one of this programs : +* xephem : http://www.clearskyinstitute.com/xephem/ +* homeplanet : http://www.fourmilab.ch/homeplanet/ +* http://www.theplanetstoday.com/

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2013/morgan1/hint.text b/2013/morgan1/hint.text new file mode 100644 index 000000000..b8aeb8c9a --- /dev/null +++ b/2013/morgan1/hint.text @@ -0,0 +1,104 @@ +# Smallest large system simulator + +Yves-Marie Morgan + + + +## Judges' comments: +### To build: + + make morgan1 + +### To run: + + echo "2013/10/03" | ./morgan1 + +### Try: + + echo "1985/10/28" | ./morgan1 + + echo "1996/12/31" | ./morgan1 + +Try pressing the arrow keys when your focus is in the window. + +### Selected Judges Remarks: + +To verify the output, try echoing the date of an evening with a clear sky. +Use binoculars and/or telescope as needed. In some cases you may need +to wait for a better time of the evening. In a few cases, such as +the South Pole in the summer, you may need to move to a different +observing site. + +## Author's comments: +# Instructions + +It displays the position of the 8 planets of the solar system around the sun. +The date given in the command line is in the format YYYY/MM/DD (year, month and +day). The direction keys can be used to move in time : +Left : go back 1 day. +Right : go forward 1 day. +Down : go back 20 days. +Up : go forward 20 days. + +It handles correctly all leap years and the switch between julian calendar and +gregorian calendar (10 days missing between 1582/10/04 and 1582/10/15). + +The scale is logarithmic to be able to display the 8 planets without having +Mercury, Venus, Earth and Mars squizzed around the sun. + +The size is not proportinal either. + +# Bonus + +It also displays the position of 2 famous comets during their last approach : +- The first one arround the third IOCCC. +- The second one between the thirteenth and fourteenth IOCCC. + +# Limitations + +* ASCII character set is assumed. +* a c99 compiler is required (for some math.h functions). +* The position should be correct for years between (-1000; +3000) +* The approximations done in the formula are OK for displaying the + position around the sun but not for other applications like ephemeride or + sky view from Earth (angles may be off by 1 or 2 degrees sometimes). + +# Obfuscation + +* Reuse of 1 letter variables. +* Only the main function with some for loops. +* Constants for orbital elements encoded in a string. +* Hexadecimal and decimal values used inconsitentely. +* Comparisons order are not consitent. +* A lot of stuff is done in the different parts of the for loop. + +# Compilation warnings + +with gcc 4.7.2 on Linux Ubuntu 12.10 : +* prog.c:38:3: warning: suggest parentheses around ‘&&’ within ‘||’ [-Wparentheses] +* prog.c:40:34: warning: value computed is not used [-Wunused-value] +* prog.c:56:6: warning: suggest parentheses around ‘&&’ within ‘||’ [-Wparentheses] +* prog.c:58:50: warning: value computed is not used [-Wunused-value] +* prog.c:61:5: warning: suggest parentheses around ‘-’ inside ‘>>’ [-Wparentheses] + +with clang 3.1 on Linux Ubuntu 12.10 : +* prog.c:38:49: warning: '&&' within '||' [-Wlogical-op-parentheses] +* prog.c:38:27: warning: '&&' within '||' [-Wlogical-op-parentheses] +* prog.c:55:13: warning: '&&' within '||' [-Wlogical-op-parentheses] +* prog.c:56:14: warning: '&&' within '||' [-Wlogical-op-parentheses] + +Due to most parentheses and braces removed when unecessary. + +To verify the display, you can look at one of this programs : +* xephem : http://www.clearskyinstitute.com/xephem/ +* homeplanet : http://www.fourmilab.ch/homeplanet/ +* http://www.theplanetstoday.com/ + +-------------------------------------------------------------------------------- + diff --git a/2013/morgan1/morgan1.c b/2013/morgan1/morgan1.c new file mode 100644 index 000000000..a97f183e8 --- /dev/null +++ b/2013/morgan1/morgan1.c @@ -0,0 +1,74 @@ + +#include +#include +#include +#include + +int main() +{ + Display *D; + Window W; + GC G; + double l, r, a, b, o[7]; + int j, y, m, d; + XWindowAttributes A; + XEvent V; + + char n[444] = + "NfVS6>7TYBC>Rm=8K\\QWiAR98iBX13>\\X[oN;W" + "fXLULQJ^dS[PiLhDX`;GF" + "bZ000=N4R6:9?TDoQH2aiN6MK[Zh[doSKGi;N" + "bZQQ84ROVaYP2]MZI[O41c\\9VWNI" + "bb7aRCXkd7b\\JW6:Z9O@6@fZ;5ZllOgZ0mFjI" + "chMPcZSi2FJ^_fG6`eS7_043Q^>hG`T" + "v00000&15e0&13e0&13e\1&e0&e0&e\1&\\TQneTv00000", *c = n; + + for (j = DefaultScreen((D = XOpenDisplay(0))), + G = XCreateGC(D, W = RootWindow(D, j), 0, 0); (*c++)--; ); + XMapWindow(D, W = XCreateSimpleWindow(D, W, 0, 0, 400, 400, 0, + BlackPixel(D, j), WhitePixel(D, j))); + XSelectInput(D, W, KeyPressMask|ExposureMask); + j = scanf(n + 392, &y, &m, &d); + j > m++ ? y--, m += 12 : j--; + for (j = (int)(365.25 * y) + (int)(30.6001 * m) + d - 730550 + + (1582 > y || y == 0x62e && (11 > m || 11 == m && d < 5) ? + 0 : 2 - y / 'd' + y / 400); + XGetWindowAttributes(D, W, &A) && XClearWindow(D, W), + b = floor((y = j + 0x8ead + (-152385 < j ? + (a = floor(j / 36524.25 + 1.9983778) + 14, + 1 + a - floor(a / 4)) : d)) / 365.25 + .802601), + m = floor((l = y - floor(365.25 * b + .750001) + 416) / 30.6001), + d = l - floor(30.6001 * m), + y = b + 0x76c, 13 < m-- ? m -= 12 : y--, + !XDrawString(D, W, G, 0, 10, n + 0x1a0, + sprintf(n + 416, n + 377, y, m, d)); + XNextEvent(D, &V) || (j += -(V.type == KeyPress) & + ((y = XLookupKeysym(&V.xkey, d = 0)) == XK_Left ? -1 : + y == XK_Right ? 1 : + y == XK_Up ? 20 : + y == XK_Down ? -20 : d))) + for (m = !m; m++ ^ 12; + !(m == 9 && 150 < fabs(j + 0x13d2) || + m == 10 && fabs(j + 1005) > 0x96) && + XDrawArc(D, W, G, d += r * cos(l) - 4, + y -= r * sin(l) + 4, 8, 8, 0, 63 * 365 + 45) && + XDrawString(D, W, G, d + 7, ++y, c - ' ', 2)) { + for (d = !m; 7 > d; d++[o] = (r + !!r) * + exp2((*c - 0x2f >> 1) - 21) * (2 * (*c & 1) - 1)) + for (r = 0, c = n + 37 * m + (y = 5) * d - 31; + --y; r = (r - 47 + *c--) / 64); + b = o[3] + o[4] * j; + for (l = b + (a = o[1]) * sin(b); 1e-6 < fabs(r); + l += r = (b - l + a * sin(l)) / (1 - a * cos(l))); + r = log1p(*o * (1 - a * a) / (1 + a * cos( + l = 2 * atan(sqrt((1 + a) / (1 - a)) * tan(l / 2))))); + r *= fmin(d = A.width / 2, y = A.height / 2) * + cos(asin(sin(l += o[5]) * sin(o[2]))) / log(32); + l = atan2(sin(l) * cos(o[2]), cos(l)) + o[6]; + } + return 0; +} diff --git a/2013/morgan2/Makefile b/2013/morgan2/Makefile new file mode 100644 index 000000000..9d68ec9e0 --- /dev/null +++ b/2013/morgan2/Makefile @@ -0,0 +1,204 @@ +#!/usr/bin/env make +# +# 2013 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall -W +CWARN= -Wall -Wextra -Wshadow -pedantic \ + -Wno-variadic-macros -Wno-string-plus-int + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= -lncurses -lX11 +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} -I/opt/X11/include -L/opt/X11/lib ${OPT} + + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= morgan2 +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Lehmer!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "Park different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Paul Erdos!"; \ + fi + @${TRUE} + diff --git a/2013/morgan2/hint.html b/2013/morgan2/hint.html new file mode 100644 index 000000000..7972e1303 --- /dev/null +++ b/2013/morgan2/hint.html @@ -0,0 +1,170 @@ + + + + + + + Most playfully versatile + + +

    Most playfully versatile

    + +

    Yves-Marie Morgan
    +yves-marie.morgan@parrot.com

    + +

    Judges' comments:

    + +

    To build:

    + +
        make morgan2
    +
    + +

    To run:

    + +
    ./morgan2
    +
    + +

    For the console version (ncurses)

    + +

    or

    + +
    ./morgan2 X
    +
    + +

    For the graphical version (X11)

    + +

    Selected Judges Remarks:

    + +

    The judges enjoyed playing the game almost to completion; if we remember correctly, +we managed to place 59 or 60 dominos. We wonder, what would be faster: to play the game to completion +or to write an unobfuscated version of it?

    + +

    Author’s comments:

    + +

    This program is a domino game. The goal is to place dominos on the 8x8 grid. +Each domino is made of 6 squares of the color red or green. To place a domino, +at least one of it side shall match the other side of another domino.

    + +

    How to play

    + +

    Start of the game

    + +

    At the start of the game, the first domino is placed randomly on the grid. You +get another domino to place by selecting one empty position in the stack on the +right. You can have to 8 dominos pending at any time.

    + +

    Moving in the stack

    + +

    Use Up and Down key to move the cursor in the stack. Press Enter to either

    + +
      +
    • reveal a new domino if the position was empty.
    • +
    • select the domino to try to place it if the position was not empty.
    • +
    + + +

    The currently selected domino is indicated on the top right.

    + +

    Placing a domino

    + +

    Once a domino has been selected, the cursor moves to the grid. Use Up, Down, +Left and Right keys to move in the grid. Press Enter on an empty position +to place the domino.

    + +

    To go back to selection mode, press Enter on an occupied position.

    + +

    The domino can be place in an empty position if all its neighbour have matching +sides and the domino has at least one neighbour.

    + +

    Scoring

    + +

    First, depending on the number of dominos pending in the stack, a bonus is +accorded : +* 1 domino in the stack : 8 points. +* 2 dominos in the stack : 4 points. +* 3 or 4 dominos in the stack : 2 points. +* 5 or more dominos in the stack : 0 point.

    + +

    Then the bonus is multiplied by the number of matching neighbor the placed domino +has (1, 2, 3 or 4). This is added to the score.

    + +

    Finally, the total score is divided by the number of dominos placed (1 - 64).

    + +

    The 3 numbers on display represent : the total score, the fill count and the +final score (total score divided by fill count).

    + +

    End of the game

    + +

    The game is finished when no more domino can be placed and you either : +* filled the complete grid. +* have 8 pending dominos in the stack. +* no more domino can be revealed in the stack (more than 56 dominos placed on + the grid).

    + +

    Note There is no real end of game detection implemented in the program, +simply press q when you have finished…

    + +

    Strategy

    + +
      +
    • Try to minimize the number of dominos revealed in the stack. The lower the number, +the higher the bonus.
    • +
    • Each domino is unique and all combination of colors exists, so keep track +of what is already place and what is left.
    • +
    • Make sure you don’t render dead some positions by preventing a future placement +If the corner of domino does not match another corner in diagonal, the move +is valid but will prevent some future moves.
    • +
    + + +

    Limitations

    + +
      +
    • ASCII character set is assumed.
    • +
    • Requires both ncurses and X11 at compilation and runtime, but selection could +be done at compilation with some extra code (mainly empty stubs).
    • +
    + + +

    Obfuscation

    + +
      +
    • 1 letter identifier, reused when possible.
    • +
    • 1 algorithm, 2 different kind of display (ncurses and X11) mixed.
    • +
    • No parameters to functions, all variables are global and shared.
    • +
    • Some variables are not initialized if they have a known value at the time of use.
    • +
    + + +

    Compilation warnings

    + +

    with gcc 4.7.2 on Linux Ubuntu 12.10 : +* prog.c:46:65: warning: value computed is not used [-Wunused-value]

    + +

    with clang 3.1 on Linux Ubuntu 12.10 : +* prog.c:23:24: warning: adding ‘int’ to a string does not append to the string [-Wstring-plus-int]

    + +

    !!!!! HAVE FUN !!!!!

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2013/morgan2/hint.text b/2013/morgan2/hint.text new file mode 100644 index 000000000..7ae82db43 --- /dev/null +++ b/2013/morgan2/hint.text @@ -0,0 +1,136 @@ +# Most playfully versatile + +Yves-Marie Morgan + + + +## Judges' comments: +### To build: + + make morgan2 + +### To run: + + ./morgan2 + +For the console version (ncurses) + +or + + ./morgan2 X + +For the graphical version (X11) + +### Selected Judges Remarks: + +The judges enjoyed playing the game almost to completion; if we remember correctly, +we managed to place 59 or 60 dominos. We wonder, what would be faster: to play the game to completion +or to write an unobfuscated version of it? + + + +## Author's comments: + +This program is a domino game. The goal is to place dominos on the 8x8 grid. +Each domino is made of 6 squares of the color red or green. To place a domino, +at least one of it side shall match the other side of another domino. + +# How to play + +## Start of the game + +At the start of the game, the first domino is placed randomly on the grid. You +get another domino to place by selecting one empty position in the stack on the +right. You can have to 8 dominos pending at any time. + +## Moving in the stack + +Use `Up` and `Down` key to move the cursor in the stack. Press `Enter` to either + +* reveal a new domino if the position was empty. +* select the domino to try to place it if the position was not empty. + +The currently selected domino is indicated on the top right. + +## Placing a domino + +Once a domino has been selected, the cursor moves to the grid. Use `Up`, `Down`, +`Left` and `Right` keys to move in the grid. Press `Enter` on an empty position +to place the domino. + +To go back to selection mode, press `Enter` on an occupied position. + +The domino can be place in an empty position if all its neighbour have matching +sides and the domino has at least one neighbour. + +## Scoring + +First, depending on the number of dominos pending in the stack, a bonus is +accorded : +* 1 domino in the stack : 8 points. +* 2 dominos in the stack : 4 points. +* 3 or 4 dominos in the stack : 2 points. +* 5 or more dominos in the stack : 0 point. + +Then the bonus is multiplied by the number of matching neighbor the placed domino +has (1, 2, 3 or 4). This is added to the score. + +Finally, the total score is divided by the number of dominos placed (1 - 64). + +The 3 numbers on display represent : the total score, the fill count and the +final score (total score divided by fill count). + +## End of the game + +The game is finished when no more domino can be placed and you either : +* filled the complete grid. +* have 8 pending dominos in the stack. +* no more domino can be revealed in the stack (more than 56 dominos placed on + the grid). + +**Note** There is no real end of game detection implemented in the program, +simply press `q` when you have finished... + +## Strategy + +* Try to minimize the number of dominos revealed in the stack. The lower the number, +the higher the bonus. +* Each domino is unique and all combination of colors exists, so keep track + of what is already place and what is left. +* Make sure you don't render dead some positions by preventing a future placement + If the corner of domino does not match another corner in diagonal, the move + is valid but will prevent some future moves. + +# Limitations + +* ASCII character set is assumed. +* Requires both ncurses and X11 at compilation and runtime, but selection could + be done at compilation with some extra code (mainly empty stubs). + +# Obfuscation + +* 1 letter identifier, reused when possible. +* 1 algorithm, 2 different kind of display (ncurses and X11) mixed. +* No parameters to functions, all variables are global and shared. +* Some variables are not initialized if they have a known value at the time of use. + +# Compilation warnings + +with gcc 4.7.2 on Linux Ubuntu 12.10 : +* prog.c:46:65: warning: value computed is not used [-Wunused-value] + +with clang 3.1 on Linux Ubuntu 12.10 : +* prog.c:23:24: warning: adding 'int' to a string does not append to the string [-Wstring-plus-int] + + +**!!!!! HAVE FUN !!!!!** + + +-------------------------------------------------------------------------------- + diff --git a/2013/morgan2/morgan2.c b/2013/morgan2/morgan2.c new file mode 100644 index 000000000..7c5508a70 --- /dev/null +++ b/2013/morgan2/morgan2.c @@ -0,0 +1,65 @@ +#include +#include +#include +#include +#include +#define F(x,y,w,h,c) G(c),XFillRectangle(A,B,D,x,y,w,h),G(3) +#define G(c) XSetForeground(A,D,C[c].pixel) +#define H(d) addch(y?y-e?ACS_VLINE:ACS_L##d:ACS_U##d) +#define I(i,c) init_pair(i,COLOR_##c,COLOR_##c) +#define J(a,b) j==X[(int[]){ KEY_##b,XK_##a} ] +#define K(q,r,s,t,u,v,w) (q=!!(w)*z[p v]>>8,(1<<(3*!!((((r)>>t)^(s))&u)))*!!q) +#define L z[p=rand()&63] + +int c[9],e,f,g, h,i,j,k,l,m,n,q ,r,s,t,u,v,w,x, +y,X, z[64]; GC D; Display * A; Window B; char +o[]="tdpsf\73!" "&e!&e!&e\1",*Y =o,b[64];XColor +C[8]; XEvent E; int R ( ) { XDrawString(A,B +,D,348,58, b, e ); XNextEvent ( A, &E); return +XLookupKeysym(& E.xkey,0)*! (E. type^KeyPress); +} void P(){ g = DefaultScreen(( A=XOpenDisplay( + 0 ) ) ) ; do XAllocNamedColor + ( A , DefaultColormap( + A,g),5*x+"#fff" "\0#f00\0#0f0\0" + "#000",C+x,C+4) ; while(++x^4) ; + XMapWindow(A,B= XCreateSimpleWindow + (A,RootWindow(A ,g),0,0,460,300 + ,0, C[3].pixel, C->pixel ) ) ; +XSelectInput(A, B,KeyPressMask| ExposureMask);D +=XCreateGC(A,B, 0,0); } void a( ){ for(y=0; y<= +e; y++)if(X)for (x=k; y%3==0&&y ^e&&x>k) +&1)+1):3)>2?4:1 )*(k/2)); v=X+( 1+11*X)*(1+3*y+ +k++%2); } } int S(){ mvaddstr(t ,58,b); refresh +();return getch (); } int main( int p,char**V){ +((X=*++V&&**V== 88)?P:Q)(); for (srand(time(0)) +; ( *Y++)--; ); for(f=++n; k^64 ; !L&&(z[p]=++k +)); L|=*z<<8; g =p&7; h = p /8; for(--l; j^113; +J(Up,UP) ? m?h? h--:1:w?w--:i:J (Down,DOWN)?m?h + ^7?h++: r :w^7? w++:l: J( Left, + LEFT)?m?g?g--:3 : 7 : J (Right, + RIGHT)?m ? g^7? g++:9:s:j==10|| + J(Return,ENTER) ?m?z[p=8*h+g]>> + 8?m--:((((r=K(x ,x-1,l,t,3,-1,g + )+K(y,l,y-1,t,3 ,+1,g^7)+K(i,i- + 1,l,1,21,-8,h)+ K(e,l,e-1,1,21, ++8,h^7))+3)&~3) ==k)?z[p]|= ++l <<8,c[w]=0, l=~ +--m, s += r * ( ")%##!!!!"[--q] -33),f++:m:c[w] +?l=c[w]-!m++:n^ 64?c[w]=z[n++]& 127,q++:X:k){ p +=k=X&&!(F(0, 0, 460,300,0)); t= 48; e=24; a( ); +k=t+2; t/=8; a( ); e=3; k+=8; a (); for(; p^64; +j^7?(void)j:d() ){ x=2+t*(j=p%8 ); y=p/8; e=z[p +++]>>8; d( ); x +=8; e =c[y]; } x+=8; y=0; e=l+ + +1; d() ; x+=m*(t*g-50)-9; y=m?h:w; t-=2; e=-1; d(); e=sprintf(b,o,s,f,(f*s) + >>6); j=(X?R:S)(); } return X||endwin(); } diff --git a/2013/robison/Makefile b/2013/robison/Makefile new file mode 100644 index 000000000..212d96344 --- /dev/null +++ b/2013/robison/Makefile @@ -0,0 +1,202 @@ +#!/usr/bin/env make +# +# 2013 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall -W -Wno-unused-variable -Wno-parentheses -Wno-unused-value -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 +#CWARN= -Wall -W -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} ${LIBS} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= robison +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Lehmer!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from being unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "Park different"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Paul Erdos!"; \ + fi + @${TRUE} diff --git a/2013/robison/hint.html b/2013/robison/hint.html new file mode 100644 index 000000000..7ee096e63 --- /dev/null +++ b/2013/robison/hint.html @@ -0,0 +1,138 @@ + + + + + + + Most poetic use of strings + + +

    Most poetic use of strings

    + +

    Arch D. Robison
    +arch.d.robison@gmail.com

    + +

    Judges' comments:

    + +

    To build:

    + +
    make robison
    +
    + +

    To run:

    + +
    ./robison
    +
    + +

    Try:

    + +
    echo '1*2*3*4*5*6*7*8*9%1000' | ./robison
    +echo '100000000000000000000*(20*(1+(99477941840441*50)))/31664812345028528' | ./robison
    +
    + +

    Selected Judges Remarks:

    + +

    Of integers this prog does a lot, +plus minus, div times (and what not).

    + +

    And modulus if remainders the needing, +on standard input percent be feeding.

    + +

    More than one line can thru give input, +when interactive one values more than thruput.

    + +

    With cut and paste and some time, +one can compute M(23209).

    + +

    Author’s comments:

    + +

    Oh, The Strings You Can C!

    + +

    I love the C language; its tersness is tops.
    +But the thing I abhor is numerical ops!

    + +

    No shifting, division, remainder, or times.
    +No increment, decrement, or subscripting blech,
    +No addition, subtraction, or bitwise bool glop.
    +As for pointer arithmetic – totally yech!

    + +

    But I do have a pref'rence, for pointer deref'rence.
    +I find NOTS are a bang, and relations a ball.
    +I like calling routines, and recursions in essence.
    +But the thing I like MOST is a string dot h CALL!

    + +

    With mem copy I copy, and mem set I clear.
    +Take string len of this, and string copy that.
    +From my keyboard I pause, to hear subroutines dear:
    +The bark of string chrr, and the purr of string CAT!

    + +

    One tiny detail that could lead to defeat.
    +From where an arg points: string calls only go forth,
    +So how to go back, to be Turing complete?
    +From standard dot H, to the rescue, q SORT!

    + +

    My fixation might hint at a textual bent.
    +Does my program compose a tatoo for your shin?
    +Play crosswords or translate from Urdu to Tzouby?
    +To give it a whirl, just punch 2 + 2 in.

    + +

    You can add, do division, and multiply too.
    +Take unary minus and also subtract.
    +Summing hairs of a walrus? No longer a fuss.
    +Parenthetical grouping – no pushing a stack!

    + +

    Try dividing a googol by one forty three,
    +Subtract an octillion - it’s simply divine.
    +To compute a remainder, inscribe a percent.
    +For the sign of the answer, see C ninety nine!

    + +

    A hundred and twenty five digits or so,
    +Are the lengthiest figures the program can gnash.
    +Go over that limit, by even a digit:
    +Risk incorrect answers, or witness a crash!

    + +

    Say, say, does it have octal or binary zen?
    +What about duodecimal, ternary, hex?
    +Try the base as an option (of course in base ten)
    +Any base two to twenty – for that is the specs.

    + +

    Use lowercase in trans-decimal radix,
    +Divide babbage (in base seventeen) by cafe –
    +a nice fad, but avoid a division by nix:
    +No errant result, but you could wait all day!

    + +

    To grok the internals, ask Queen Cleopatra,
    +or King Tutankhamun; for him it’s a romp.
    +Addition by cats, and if given two figures,
    +to tell which is bigger, sort down and string CMP!

    + +

    Unlawful subtraction, a grade school infraction,
    +starts at the left and works to the right.
    +Yet more innovation: like Henry Ford’s cars,
    +With a pound and define, mass production of vars!

    + +

    The moral is clear, for programmers out there:
    +With the C lib for strings, you can hack with a flair.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2013/robison/hint.text b/2013/robison/hint.text new file mode 100644 index 000000000..bdda763ed --- /dev/null +++ b/2013/robison/hint.text @@ -0,0 +1,113 @@ +# Most poetic use of strings + +Arch D. Robison + + + +## Judges' comments: +### To build: + + make robison + +### To run: + + ./robison + +### Try: + + echo '1*2*3*4*5*6*7*8*9%1000' | ./robison + echo '100000000000000000000*(20*(1+(99477941840441*50)))/31664812345028528' | ./robison + +### Selected Judges Remarks: + +Of integers this prog does a lot, +plus minus, div times (and what not). + +And modulus if remainders the needing, +on standard input percent be feeding. + +More than one line can thru give input, +when interactive one values more than thruput. + +With cut and paste and some time, +one can compute M(23209). + +## Author's comments: +Oh, The Strings You Can C! +-------------------------- + +I love the C language; its tersness is tops. +But the thing I abhor is numerical ops! + +No shifting, division, remainder, or times. +No increment, decrement, or subscripting blech, +No addition, subtraction, or bitwise bool glop. +As for pointer arithmetic -- totally yech! + +But I do have a pref'rence, for pointer deref'rence. +I find NOTS are a bang, and relations a ball. +I like calling routines, and recursions in essence. +But the thing I like MOST is a string dot h CALL! + +With mem copy I copy, and mem set I clear. +Take string len of this, and string copy that. +From my keyboard I pause, to hear subroutines dear: +The bark of string chrr, and the purr of string CAT! + +One tiny detail that could lead to defeat. +From where an arg points: string calls only go forth, +So how to go back, to be Turing complete? +From standard dot H, to the rescue, q SORT! + +My fixation might hint at a textual bent. +Does my program compose a tatoo for your shin? +Play crosswords or translate from Urdu to Tzouby? +To give it a whirl, just punch 2 + 2 in. + +You can add, do division, and multiply too. +Take unary minus and also subtract. +Summing hairs of a walrus? No longer a fuss. +Parenthetical grouping -- no pushing a stack! + +Try dividing a googol by one forty three, +Subtract an octillion - it's simply divine. +To compute a remainder, inscribe a percent. +For the sign of the answer, see C ninety nine! + +A hundred and twenty five digits or so, +Are the lengthiest figures the program can gnash. +Go over that limit, by even a digit: +Risk incorrect answers, or witness a crash! + +Say, say, does it have octal or binary zen? +What about duodecimal, ternary, hex? +Try the base as an option (of course in base ten) +Any base two to twenty -- for that is the specs. + +Use lowercase in trans-decimal radix, +Divide *babbage* (in base seventeen) by *cafe* -- +a nice *fad*, but avoid a division by nix: +No errant result, but you could wait all day! + +To grok the internals, ask Queen Cleopatra, +or King Tutankhamun; for him it's a romp. +Addition by cats, and if given two figures, +to tell which is bigger, sort down and string CMP! + +Unlawful subtraction, a grade school infraction, +starts at the left and works to the right. +Yet more innovation: like Henry Ford's cars, +With a pound and define, mass production of vars! + +The moral is clear, for programmers out there: +With the C lib for strings, you can hack with a flair. + + +-------------------------------------------------------------------------------- + diff --git a/2013/robison/robison.c b/2013/robison/robison.c new file mode 100644 index 000000000..6f709ac96 --- /dev/null +++ b/2013/robison/robison.c @@ -0,0 +1,100 @@ +#include +#include +#include +#define r char S; T R; I N, G, s +#define A(P,O) for(P=O; *P; P=U(P)) +typedef char T[128],*I,p[2400]; +#define memset (I)\ + memset +void*P= strcpy ; I Q(); typedef const void*f; int u(f P,f O){ + return strncmp ((I)P,(I)O,1); } T g,c={ 127} ; char l,F[6000000]; I U(I P){ + r; strncpy (R,P,2); + s= strchr ( + strcpy (P,c),0) + ; strncpy (P,R,2); return s; } T q,B,E; I t(I P){ + r; qsort (P, + strlen (P),1,u); + if(s= strstr (P,c))*s=0; return P; } T a={ 2} ; void D(){ r; + S=1; strcpy (R,c); t(F); + for(; memset (E,S,l), + (S= strlen ( + strcat (R,c)))<*R; t(s))for(s=B; + N= strstr (F,E); s=F) + * memset (N,*c,l)=S; } p H="(*&,.",k; I j(I P){ + r=(I) malloc ( + strlen ( + strcat (P,"\177 "))); + * strstr (P,c)=0; + return strcpy (s,P); } int K(f P,f O){ return u(O,P); } void + b(){ qsort (F, + strlen (F),1,K); } void n(I P){ r; A(P,P){ + if(N= strchr (F,*P)); else{ t(F); + b(); memset (B,l,*F); N=F; +while(* strrchr (B,l)=0, +*P<=(S= strlen (B))){ + * memset (E,S,l) + =*c; strcat (F,E); + } memset (B,0,S); } *N=*c; } D(); } void C(I P,I O){ r; A(P,P)A(s,O){ + * strrchr ( + memset ( + strchr ( + memset ( + strncpy (k,B,254),l,*P),0),l,*s),l)=0; + *q= strlen (k) + ; strcat (F,q); } D(); } T i="\13<\f="; void o(I P){ A(P,P){ + * strrchr ( + memset (B,*c,*P),*c) + =0; memset (B,0, + *P= strlen (B)); } } int V(f P,f O){ return u(*(I*)P,*(I*)O); } void e(I O){ + r; strcpy (H,O) + ; strcpy (R,c); for(; + 0< strncmp (F,H,1) + ; strcat (R,c))A(s, + H) memset (B,0, + *s= strlen ( + strcat ( + memset (B,*c,*s),c))); *k=0; do{ while + (0<= strcmp (F,H)){ n(H); b(); + *q= strlen (R) + ; strcat (k,q); } + * strrchr (R,*c)=*B; o(H); } while(*R); } char d(I P){ + if(P= strstr (P,g)){ +if((*g= getchar ())<*i)' '<*g?o(g):d(" "); } else P=B; return*P; } I m(I + P){ qsort (P, + strlen (P),1,K); return*P==*c?U(P):P; } void J(I P){ r=m(P); +if(P + + + + + + + Who won the 22nd IOCCC + + + +
    IOCCC +

    The International Obfuscated C Code Contest +

    The 22nd IOCCC Winners +

    +[ The judges | +IOCCC home page | +FAQ | +People who have won | +Winning entries ] + +

    + +

    +


    + +

    Here are the names and categories for the winners of the 22nd IOCCC: +

    + + + +

    +


    + + + + + + + + +
    +Creative Commons License +

    This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

    +
    + + + diff --git a/2014/2014.tar.bz2 b/2014/2014.tar.bz2 new file mode 100644 index 000000000..dfa5dc3e6 Binary files /dev/null and b/2014/2014.tar.bz2 differ diff --git a/2014/MANIFEST b/2014/MANIFEST new file mode 100644 index 000000000..2d8af6592 --- /dev/null +++ b/2014/MANIFEST @@ -0,0 +1,68 @@ +2014/2014.tar.bz2 +2014/MANIFEST +2014/Makefile +2014/birken/Makefile +2014/birken/hint.html +2014/birken/hint.text +2014/birken/prog.c +2014/deak/Makefile +2014/deak/hint.html +2014/deak/hint.text +2014/deak/prog.c +2014/endoh1/Makefile +2014/endoh1/hint.html +2014/endoh1/hint.text +2014/endoh1/prog.c +2014/endoh1/src.zip +2014/endoh2/Makefile +2014/endoh2/hint.html +2014/endoh2/hint.text +2014/endoh2/prog.c +2014/guidelines.txt +2014/hint.css +2014/iocccsize.c +2014/iocccsize.mk +2014/maffiodo1/Makefile +2014/maffiodo1/giana.level +2014/maffiodo1/giana.rgba +2014/maffiodo1/giana8.wav +2014/maffiodo1/hint.html +2014/maffiodo1/hint.text +2014/maffiodo1/mario.level +2014/maffiodo1/mario.rgba +2014/maffiodo1/mario8.wav +2014/maffiodo1/prog.c +2014/maffiodo1/prog.orig.c +2014/maffiodo1/screenshot-giana.png +2014/maffiodo1/screenshot-mario.png +2014/maffiodo2/Makefile +2014/maffiodo2/hint.html +2014/maffiodo2/hint.text +2014/maffiodo2/image.rgb +2014/maffiodo2/prog.c +2014/morgan/Makefile +2014/morgan/hint.html +2014/morgan/hint.text +2014/morgan/prog.c +2014/rules.txt +2014/sinon/Makefile +2014/sinon/glock.sh +2014/sinon/hecate.sh +2014/sinon/hint.html +2014/sinon/hint.text +2014/sinon/prog.c +2014/sinon/spoiler.html +2014/skeggs/Makefile +2014/skeggs/hint.html +2014/skeggs/hint.text +2014/skeggs/prog.c +2014/skeggs/prog.orig.c +2014/vik/Makefile +2014/vik/hint.html +2014/vik/hint.text +2014/vik/prog.c +2014/whowon.html +2014/wiedijk/Makefile +2014/wiedijk/hint.html +2014/wiedijk/hint.text +2014/wiedijk/prog.c diff --git a/2014/Makefile b/2014/Makefile new file mode 100644 index 000000000..d5d3ebbfb --- /dev/null +++ b/2014/Makefile @@ -0,0 +1,147 @@ +#!/usr/bin/env make +# +# 2014 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############### +# IOCCC winners +############### +# +WINNERS= birken deak endoh1 endoh2 maffiodo1 maffiodo2 morgan sinon skeggs vik wiedijk + +################### +# build all entries +################### +# +all: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) X11_LIBDIR=${X11_LIBDIR} X11_INCDIR=${X11_INCDIR} $@)"; \ + (cd $$i && $(MAKE) "X11_LIBDIR=${X11_LIBDIR}" "X11_INCDIR=${X11_INCDIR}" $@); \ + done + +# alternative executable +# +alt: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) X11_LIBDIR=${X11_LIBDIR} X11_INCDIR=${X11_INCDIR} $@)"; \ + (cd $$i && $(MAKE) "X11_LIBDIR=${X11_LIBDIR}" "X11_INCDIR=${X11_INCDIR}" $@); \ + done + + +############### +# utility rules +############### +# +everything: all alt + +clean: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +clobber: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +nuke: clobber + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +install: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + + +################## +# 133t hacker rulz +################## +# +love: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +haste: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +waste: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +easter_egg: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +deep_magic: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +magic: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done diff --git a/2014/birken/Makefile b/2014/birken/Makefile new file mode 100644 index 000000000..6d17decad --- /dev/null +++ b/2014/birken/Makefile @@ -0,0 +1,206 @@ +#!/usr/bin/env make +# +# 2014 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall +#CWARN= -Wall -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} \ + -Wno-comment -Wno-dangling-else -Wno-implicit-function-declaration \ + -Wno-incompatible-pointer-types -Wno-parentheses \ + -Wno-trigraphs --include string.h + + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Science!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from failong to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} diff --git a/2014/birken/hint.html b/2014/birken/hint.html new file mode 100644 index 000000000..0ff333d56 --- /dev/null +++ b/2014/birken/hint.html @@ -0,0 +1,167 @@ + + + + + + + Best use of port 1701 + + +

    Best use of port 1701

    + +

    Michael Birken
    +o__1@hotmail.com
    +http://www.meatfighter.com/

    + +

    Alexander Prishchepov
    +https://github.com/sans17/

    + +

    Judges' comments:

    + +

    To build:

    + +
    make
    +
    + +

    To run:

    + +
    ./prog < some_secret_or_something
    +
    +./prog http://host[:port]
    +
    + +

    Try:

    + +
    ./prog.c
    +
    +./prog http://127.0.0.1:1701
    +
    + +

    Selected Judges Remarks:

    + +

    Port 1701? Well this is not the l2f registered TCP/1701 protocol. +Sniff the traffic to/from that port. You will see HTTP client +and server traffic. The HTML content you may see is static and +immutable. Nothing funny with the HTTP status codes. Even the +timestamp cookie, once set, remains static throughout the +session. The data appears to not be transmitted within the +binary content communicated between client and server.

    + +

    So how does this program do it? A trek though the cloak of +obfuscation awaits the reader of the source!

    + +

    Author’s comments:

    + +

    Abstract

    + +

    When launched in web server mode, this application appears to deliver nothing more than a static HTML page. But, in actuality, it provides covert file transfer over the Internet. This is demonstrated by starting the application as a client-side downloader. The hidden transmitted data cannot be reconstructed or even detected from the binary content of the traffic between the client and the server.

    + +

    To run web server

    + +
    ./prog < secret_file_to_be_downloaded
    +
    + +

    Try using the program’s source code as the secret file:

    + +
    ./prog < prog.c
    +
    + +

    To run client-side downloader

    + +
    ./prog http://host[:port]
    +
    + +

    The optional port defaults to 1701. If the web server instance is started on the same box, try:

    + +
    ./prog http://127.0.0.1:1701
    +
    + +

    It will incrementally display the contents of the hidden file at a rate of approximately 1 baud.

    + +

    The client-side downloader will automatically terminate if the web server is bounced.

    + +

    HTML content

    + +

    Plug the URL into a browser to view a static HTML page containing ASCII artwork.

    + +

    Exploration

    + +

    Studying the network traffic will reveal that the HTML content is static and immutable, the HTTP request and response fields do not contain anything remarkable, HTTP status and error codes are not exploited, no unusual or deprecated features of HTTP are used, and while the cookie is based on a timestamp, its value also remains unchanged throughout the session. As mentioned in the abstract, the data is not transmitted within the binary content communicated between the client and the server. A full explanation of the protocol appears below, but feel free to explore before reading further.

    + +

    Inspiration

    + +

    The inspiration for this program comes from Star Trek VI: The Undiscovered Country, specifically the final confrontation between the Enterprise and the enhanced prototype Klingon Bird of Prey. The definitive feature of the prototype was its ability to fire while cloaked. But, perhaps even more impressive was its able to keep an open communication channel with the Enterprise throughout the battle, enabling the antagonist Chang to taunt Captain Kirk with Shakespearian quotes while he slowly pelted his ship with torpedoes. Normally, cloaked vessels must maintain silent running to avoid detection.

    + +

    The battle is commemorated in the form of ASCII artwork depicting the ships faced head-to-head in the page delivered by the web server. Plus, the program source code is formatted in the shape of a Klingon Bird of Prey. The code itself includes a number of Star Trek references: the registry number of the Enterprise (NCC-1701) is defined as a constant; variable names spell out Cpt. James T. Kirk and Odo (the Deep Space 9 character was played by René Auberjonois who also appeared as Colonel West in Star Trek VI); the STARDATE constant makes timing configurable; and, the constant k stands for Khan (in the final engagement in Star Trek II: The Wrath of Khan, the damaged Enterprise managed to disable the USS Reliant’s shield generator by accessing its prefix code: 16309).

    + +

    Secondary size limit

    + +

    As obligated by a program that employs 23rd century cloaking technology, when the source is fed as input to IOCCC size tool version 2014-09-23-v19, and the -i command line option is used, the value printed is 0.

    + +

    Transmission protocol revealed

    + +

    The client-side downloader relies on the response time of the web server rather than the binary content of the response. The server transmits 1 nibble at a time by counting to the nibble value via a sequence of rapid responses terminated by a long response. For instance, the value 5 would be transmitted by making a series of requests that result in 5 near instantaneous responses followed by a half-second delayed response. The long delay is skipped in the case of 15, the maximal nibble value. With the aid of an ASCII table, it is actually possible to read the nibbles by repeatedly pressing the refresh button within a browser and observing the page refresh delay.

    + +

    Nibble Count Coding (file transfer protocol NCC-1701) is faster than transmitting each individual bit as a short or long delay because it sends each byte with 2 long delays whereas communicating individual bits requires 8 long delays in the worst case scenario. In fact, Nibble Count Coding is faster than applying Huffman Coding since that is designed to produce compact codes under the assumption that the bit value does not affect transmission time.

    + +

    The server relies on the cookie to identify each client uniquely, enabling it to transfer the sequence independently to each client.

    + +

    Configuration

    + +

    As with all network communication, accurate transmission of data relies on the nature of hardware revealed through statistics and timeouts set accordingly. The long delay is arbitrarily set to 0.5 seconds. This is microsecond tunable via the STARDATE constant defined at the top of the source code. Increase the value in the event of transmission errors. Decrease the value to download faster and less reliably.

    + +

    The NCC constant is the web server port number.

    + +

    Obfuscations

    + +
      +
    • The ASCII artwork is compressed using run-length encoding.
    • +
    • One long string stores a series of strings concatenated together and referenced via pointers.
    • +
    • The long string is shift encrypted.
    • +
    • Short and meaningless identifiers are used throughout.
    • +
    • Reversed array indexing was applied immoderately.
    • +
    • Minus is used in place of not-equals.
    • +
    • O and l were selected for their resemblance to 0 and 1 respectively.
    • +
    • Standard constants and ASCII characters were replaced with their respective numerical values.
    • +
    + + +

    Compiler warnings

    + +

    For space considerations, the following include statements were dropped resulting in compiler warnings:

    + +
    #include <asm/byteorder.h>
    +#include <ctype.h>
    +#include <netinet/in.h>
    +#include <stdlib.h>
    +#include <string.h>
    +#include <sys/select.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <sys/unistd.h>
    +
    + +

    It may be necessary to restore some of these under certain environments.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2014/birken/hint.text b/2014/birken/hint.text new file mode 100644 index 000000000..dd5a5b7e2 --- /dev/null +++ b/2014/birken/hint.text @@ -0,0 +1,132 @@ +# Best use of port 1701 + +Michael Birken + + + +Alexander Prishchepov + + + +## Judges' comments: +### To build: + + make + +### To run: + + ./prog < some_secret_or_something + + ./prog http://host[:port] + +### Try: + + ./prog.c + + ./prog http://127.0.0.1:1701 + +### Selected Judges Remarks: + +Port 1701? Well this is not the l2f registered TCP/1701 protocol. +Sniff the traffic to/from that port. You will see HTTP client +and server traffic. The HTML content you may see is static and +immutable. Nothing funny with the HTTP status codes. Even the +timestamp cookie, once set, remains static throughout the +session. The data appears to not be transmitted within the +binary content communicated between client and server. + +So how does this program do it? A trek though the cloak of +obfuscation awaits the reader of the source! + +## Author's comments: +### Abstract + +When launched in web server mode, this application appears to deliver nothing more than a static HTML page. But, in actuality, it provides covert file transfer over the Internet. This is demonstrated by starting the application as a client-side downloader. The hidden transmitted data cannot be reconstructed or even detected from the binary content of the traffic between the client and the server. + +### To run web server + + ./prog < secret_file_to_be_downloaded + +Try using the program's source code as the secret file: + + ./prog < prog.c + +### To run client-side downloader + + ./prog http://host[:port] + +The optional port defaults to 1701. If the web server instance is started on the same box, try: + + ./prog http://127.0.0.1:1701 + +It will incrementally display the contents of the hidden file at a rate of approximately 1 baud. + +The client-side downloader will automatically terminate if the web server is bounced. + +### HTML content + +Plug the URL into a browser to view a static HTML page containing ASCII artwork. + +### Exploration + +Studying the network traffic will reveal that the HTML content is static and immutable, the HTTP request and response fields do not contain anything remarkable, HTTP status and error codes are not exploited, no unusual or deprecated features of HTTP are used, and while the cookie is based on a timestamp, its value also remains unchanged throughout the session. As mentioned in the abstract, the data is not transmitted within the binary content communicated between the client and the server. A full explanation of the protocol appears below, but feel free to explore before reading further. + +### Inspiration + +The inspiration for this program comes from _Star Trek VI: The Undiscovered Country_, specifically the final confrontation between the _Enterprise_ and the enhanced prototype Klingon Bird of Prey. The definitive feature of the prototype was its ability to fire while cloaked. But, perhaps even more impressive was its able to keep an open communication channel with the _Enterprise_ throughout the battle, enabling the antagonist Chang to taunt Captain Kirk with Shakespearian quotes while he slowly pelted his ship with torpedoes. Normally, cloaked vessels must maintain silent running to avoid detection. + +The battle is commemorated in the form of ASCII artwork depicting the ships faced head-to-head in the page delivered by the web server. Plus, the program source code is formatted in the shape of a Klingon Bird of Prey. The code itself includes a number of Star Trek references: the registry number of the _Enterprise_ (NCC-1701) is defined as a constant; variable names spell out Cpt. James T. Kirk and Odo (the Deep Space 9 character was played by René Auberjonois who also appeared as Colonel West in _Star Trek VI_); the STARDATE constant makes timing configurable; and, the constant k stands for Khan (in the final engagement in _Star Trek II: The Wrath of Khan_, the damaged _Enterprise_ managed to disable the USS _Reliant_’s shield generator by accessing its prefix code: 16309). + +### Secondary size limit + +As obligated by a program that employs 23rd century cloaking technology, when the source is fed as input to IOCCC size tool version 2014-09-23-v19, and the -i command line option is used, the value printed is 0. + +### Transmission protocol revealed + +The client-side downloader relies on the response time of the web server rather than the binary content of the response. The server transmits 1 nibble at a time by counting to the nibble value via a sequence of rapid responses terminated by a long response. For instance, the value 5 would be transmitted by making a series of requests that result in 5 near instantaneous responses followed by a half-second delayed response. The long delay is skipped in the case of 15, the maximal nibble value. With the aid of an ASCII table, it is actually possible to read the nibbles by repeatedly pressing the refresh button within a browser and observing the page refresh delay. + +Nibble Count Coding (file transfer protocol NCC-1701) is faster than transmitting each individual bit as a short or long delay because it sends each byte with 2 long delays whereas communicating individual bits requires 8 long delays in the worst case scenario. In fact, Nibble Count Coding is faster than applying Huffman Coding since that is designed to produce compact codes under the assumption that the bit value does not affect transmission time. + +The server relies on the cookie to identify each client uniquely, enabling it to transfer the sequence independently to each client. + +### Configuration + +As with all network communication, accurate transmission of data relies on the nature of hardware revealed through statistics and timeouts set accordingly. The long delay is arbitrarily set to 0.5 seconds. This is microsecond tunable via the STARDATE constant defined at the top of the source code. Increase the value in the event of transmission errors. Decrease the value to download faster and less reliably. + +The NCC constant is the web server port number. + +### Obfuscations + +* The ASCII artwork is compressed using run-length encoding. +* One long string stores a series of strings concatenated together and referenced via pointers. +* The long string is shift encrypted. +* Short and meaningless identifiers are used throughout. +* Reversed array indexing was applied immoderately. +* Minus is used in place of not-equals. +* O and l were selected for their resemblance to 0 and 1 respectively. +* Standard constants and ASCII characters were replaced with their respective numerical values. + +### Compiler warnings + +For space considerations, the following include statements were dropped resulting in compiler warnings: + + #include + #include + #include + #include + #include + #include + #include + #include + #include + +It may be necessary to restore some of these under certain environments. + +-------------------------------------------------------------------------------- + diff --git a/2014/birken/prog.c b/2014/birken/prog.c new file mode 100644 index 000000000..65b4af3a9 --- /dev/null +++ b/2014/birken/prog.c @@ -0,0 +1,60 @@ +/**??/ +/ +#include +#include +#include +#define NCC 1701 +#define STARDATE 500000 +#define k 16309 + + int C,p,t,J,a,m,e,s,T,K,i,r[k],_[k][2],c[k][2],f=NCC; + fd_set O,d,o;char g[8][k],*h,j[]="0\1&me\1&t&e\1TFTTJPO>" + "\1&t\\_<\16\v^\1&+\\_;^&o;&e\1TFU.DPPLJF;\1iuuq;00&92:2\\_0^&" + "o\1&tDppljf;!tfttjpo>&t\16\v\16\v\1HFU!&t!IUUQ02/1\16\vIptu;!""" + "&t\16\v\1IUUQ02/1!311!PL\16\vDpoufou.uzqf;!ufyu0iunm\16\vFyqjsft;!1""" + "\16\vTfu.Dppljf;!tfttjpo>&t\16\vDpoufou.Mfohui;!&me\16\v\16\v&t\1=iunm?=c" "pez!chdpmps>#cmbdl" + "#?=ejw!tuzmf>(qptjujpo;bctpmvuf#xijuf#?=qsf?&t=0qsf?=0gpou?=0ejw?=0cpez?=0iunm?\1T`K!`.`[!G!G`\v]C`)K>0`>`0!E`/" "D.(D.aD./E`D!C`p`K!F`0F`}\vM!]`!]E!" + "]E./J`/E.0C!G>I`0L.0\vO!]!]D!0C!0E!a.`.(K!)E`0I!]G`E!}\vK!C`-C.a/a.(//(.`[!N!]C!+!]\vJ!0E`K!}}[!K!C`0E`0C`\vO!aC./E`-.([!K!|K`|";struct sockad\ +dr_in l;struct timeval n,q;struct hostent*u;long w;void x(int y){close(y);FD_CLR(y,&O);if(y>=m)while(--m)if(FD_ISSET(m,&O))break;}vo\ +id z(char*A,char*B){char*D,*E=A,*F=A;for(0[0[g]]=0;*E;E++)if(*E==10){if(E-F==(*(E-1)-13?1:2))break;*E=0;if(!strncmp(F,B,strlen(B))&&(D=strstr(F,j+\ +11))){sscanf(D+8,j+20,0[g]);break;}F=E+1;}else*E=toupper(*E);}int main(int G,char**H){h=j;while(*h)(*h)--,h++;h=j+414;do{t=*h++;e=1;if(t>=65&&t<=90)e +=t-64,t=*h++;while(e--)6[g][i++]=t;}while(t);sprintf(7[g],j+229,6[g]);l.sin_family=2;if(G>1){sscanf(1[H],j+53,4[g],&K);sprintf(2[g],j+97,*(1[H]+K)?1[ +H]+K:j,4[g]);sscanf(4[g],j+29,&i,&f);i[4[g]]=0;u=gethostbyname(4[g]);memcpy(&l.sin_addr.s_addr,0[u->h_addr_list],u->h_length);l.sin_port=htons(f);\ +for(;;close(G))if(!connect(G=socket(2,1,0),&l,sizeof l))for(;;){strcpy(1[g],0[g]);s=sprintf(5[g],j+72,2[g],0[g]);if(write(G,5[g],s)<0)break;gett\ +imeofday(&n,0);0[3[g]]=0;e=read(G,3[g],k);if(e<0)break;else if(e&&*3[g]==72){gettimeofday(&q,0);3[g][k-1]=0;z(3[g],j+41);if(0[1[g]])if(!strnc\ +mp(1[g],0[g],strlen(1[g]))){t=0;if((q.tv_sec-n.tv_sec)*1000000+q.tv_usec-n. +tv_usecm)m=t;t=0; +}else if(!i||FD_ISSET(J,&o)){e=read(J,2[g],k);K=0;if(e>0){ +2[g][k-1]=0;if(*2[g]==71){a=0;strcpy(1[g],0[g]);z(2[g],j+ +45);if(!strncmp(0[g],5[g],strlen(5[g]))&&!strncmp(1[g], +0[g],strlen(1[g]))){K=atoi(0[g]+p);}if(K){if(0[K[_]]>4)>=(1[K[_]]<15? +0[K[_]][r]&15:0[K[_]][r]>>4))1[K[_]]=1[K[_]]<15?1\ +5:255;else 1[K[_]]+=1[K[_]]<16?1:16;if(_[K][1]==\ +255){0[K[_]]++;1[K[_]]=0;}}else{write(1[K[c]],_[ +K],sizeof(_[K]));close(1[K[c]]);K=0;}}else fo\ +r(s=1;sm)m=0[K[c]];x(J);\ +break;}else{if(a){n.tv_sec=0;n.t\ +v_usec=STARDATE;select(0,0,0,0,& +n);}write(J,3[g],w);if(!K){close(J);return 0;}}}}else if(i){ +close(J);FD_CLR(J,&o);x(J);}else{write(1[K[c]],K[_],sizeof(K[_ +]));close(1[K[c]]);close(J);return 0;}}else{for(K=0;K<=m;K++)if( +0[K[c]]==J){read(J,K[_],sizeof(K[_]));x(J);if(_[K][0]>=f){0[K[_] +]=1[K[_]]=-1;0[K[c]]=1[K[c]]=0;}break;}}}}}l:close(G);return T;} \ No newline at end of file diff --git a/2014/deak/Makefile b/2014/deak/Makefile new file mode 100644 index 000000000..ea25d921b --- /dev/null +++ b/2014/deak/Makefile @@ -0,0 +1,203 @@ +#!/usr/bin/env make +# +# 2014 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall +#CWARN= -Wall -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} \ + -Wno-int-conversion -Wno-implicit-int -Wno-main + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Science!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from failong to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} diff --git a/2014/deak/hint.html b/2014/deak/hint.html new file mode 100644 index 000000000..7f0e00248 --- /dev/null +++ b/2014/deak/hint.html @@ -0,0 +1,115 @@ + + + + + + + Most underscored argument + + +

    Most underscored argument

    + +

    Ferenc Deak
    +fritzone@gmail.com

    + +

    Judges' comments:

    + +

    To build:

    + +
    make deak
    +
    + +

    To run:

    + +
    ./prog
    +
    + +

    Try:

    + +
    Changing bounding box coordinates in the source to explore
    +various regions of the fractal.
    +
    + +

    Selected Judges Remarks:

    + +

    We consider this entry a tribute to all “Abuse of the C preprocessor” +and Mandelbrot fractal drawing entries we’ve seen over the years.

    + +

    We liked the use of unary notation facilitated by variadic macros.

    + +

    Author’s comments:

    + +

    Portability

    + +

    The application was written on a standard Ubuntu 14.04 and tested with +gcc 4.9.1 and clang 3.5 on 64 bit system (though this should not matter). +The application makes no assumption regarding any system specific settings, +and it only needs a console to run. The provided Makefile is just to have +an easy compilation. I don’t see any problems porting it to different +compiler/system as long as it supports the C99 standard.

    + +

    The application

    + +

    The purpose of the application is mainly to illustrate the weird possibilities +of the C preprocessor, than to be a full featured console mode Mandelbrot +drawer. There are tools much better suited for drawing fractals.

    + +

    The usage of recognizable elements from the C programming language in the +application source code is intentionally kept to a bare minimum. If this phrase +would not be true, the application would be the following:

    + +
            double                                 _[]={-2
    +        ,1,-1.3                ,1.3,  0,         0,0,0
    +        ,0               ,0,50, 80,     0,0,0     ,255
    +        ,               8,0};    int      main       (
    +                       int j) {if (j==  1 ){ if(
    +               _[12]      >_[10]  )_[17]=1 ;}  if
    +           (_[13] >_[11     ] ||_[17]==1)  return
    +         ;_[6]   =  _ [13] / _[11]*(_[1]-_[   0])
    +        +_[  0];  _ [7]=_[12]/_[10]*(_[3]-_[2] )+_
    +        [2];_[8]=_[9]=_[14]=0;l2:_[4]=_[8] * _ [8]
    +        ;_[  5]=  _ [9]*_[9];_[9]=2*_[8]*_[9]+ _[7
    +         ];_[8   ]  = _ [ 4 ]-_[5]+_[6];_[14   ]++
    +           ;if((_ [14]<     _ [15])&&(_[4]+ _[ 5]
    +               <_[16      ])) goto l2;  putchar(
    +                       " #@*+   "[( int)  _[14]%
    +        5             ]);_ [13   ] ++ ;   main       (
    +        0)               ;_[12]++;      _[13]       =0
    +        ;if(_                [17]    !=1)      putchar
    +        (0xa);                               main(1);}
    +
    + +

    The application expects no parameters, the only way you can change the behaviour +is to modify the source code at the indicated location: the line +/* <-- Configure here: X1, X2, Y1, Y2 */ is intentionally not obfuscated so +that the adventurous programmer can manually modify the coordinates of the +fractal to be drawn on the screen.

    + +

    Compiler warnings

    + +

    Yes, unfortunately there are compiler warnings of the kind “initialization makes +integer from pointer without a cast” the provided Makefile automatically +disables them.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2014/deak/hint.text b/2014/deak/hint.text new file mode 100644 index 000000000..73fd39031 --- /dev/null +++ b/2014/deak/hint.text @@ -0,0 +1,87 @@ +# Most underscored argument + +Ferenc Deak + + + +## Judges' comments: +### To build: + + make deak + +### To run: + + ./prog + +### Try: + + Changing bounding box coordinates in the source to explore + various regions of the fractal. + +### Selected Judges Remarks: + +We consider this entry a tribute to all "Abuse of the C preprocessor" +and Mandelbrot fractal drawing entries we've seen over the years. + +We liked the use of unary notation facilitated by variadic macros. + +## Author's comments: +### Portability + +The application was written on a standard Ubuntu 14.04 and tested with +gcc 4.9.1 and clang 3.5 on 64 bit system (though this should not matter). +The application makes no assumption regarding any system specific settings, +and it only needs a console to run. The provided Makefile is just to have +an easy compilation. I don't see any problems porting it to different +compiler/system as long as it supports the C99 standard. + +### The application + +The purpose of the application is mainly to illustrate the weird possibilities +of the C preprocessor, than to be a full featured console mode Mandelbrot +drawer. There are tools much better suited for drawing fractals. + +The usage of recognizable elements from the C programming language in the +application source code is intentionally kept to a bare minimum. If this phrase +would not be true, the application would be the following: + + double _[]={-2 + ,1,-1.3 ,1.3, 0, 0,0,0 + ,0 ,0,50, 80, 0,0,0 ,255 + , 8,0}; int main ( + int j) {if (j== 1 ){ if( + _[12] >_[10] )_[17]=1 ;} if + (_[13] >_[11 ] ||_[17]==1) return + ;_[6] = _ [13] / _[11]*(_[1]-_[ 0]) + +_[ 0]; _ [7]=_[12]/_[10]*(_[3]-_[2] )+_ + [2];_[8]=_[9]=_[14]=0;l2:_[4]=_[8] * _ [8] + ;_[ 5]= _ [9]*_[9];_[9]=2*_[8]*_[9]+ _[7 + ];_[8 ] = _ [ 4 ]-_[5]+_[6];_[14 ]++ + ;if((_ [14]< _ [15])&&(_[4]+ _[ 5] + <_[16 ])) goto l2; putchar( + " #@*+ "[( int) _[14]% + 5 ]);_ [13 ] ++ ; main ( + 0) ;_[12]++; _[13] =0 + ;if(_ [17] !=1) putchar + (0xa); main(1);} + +The application expects no parameters, the only way you can change the behaviour +is to modify the source code at the indicated location: the line +`/* <-- Configure here: X1, X2, Y1, Y2 */` is intentionally not obfuscated so +that the adventurous programmer can manually modify the coordinates of the +fractal to be drawn on the screen. + +### Compiler warnings + +Yes, unfortunately there are compiler warnings of the kind "initialization makes +integer from pointer without a cast" the provided Makefile automatically +disables them. + +-------------------------------------------------------------------------------- + diff --git a/2014/deak/prog.c b/2014/deak/prog.c new file mode 100644 index 000000000..389f0ccf9 --- /dev/null +++ b/2014/deak/prog.c @@ -0,0 +1,41 @@ +#include +#define _$() 0 +#define __$() 1 +#define _$_() 10 +#define $_$(a) a; +#define $_(b,a) a##b +#define r(a,b) r##a##b##urn 0; +#define m(b,a,x) }; m##a##b##n +#define $(b,a,x) a##b##x +#define ____ + __ +#define $_$_ = +#define __(...) ( $(n,i,t))(\ +$(ze,si,of)(($(n,i,t)[]) { _$(), ##__VA_ARGS__})/$(ze,si,of) ($(n,i,t))-__$()) +$(n,i,t) (*___) ($(n,i,t)) = $(tch, pu, ar); $(ub,do,le) _<::> $_$_ <% + + -2, 1, -1.3, 1.3 /* <-- Configure here: X1, X2, Y1, Y2 */ + +,_$(), _$(),_$(),_$(),_$() ,_$(), __( ',',',',',' ,',' ,',') * _$_() ,( _$_() +- __('_','_')) * _$_(), _$(),_$(),_$(),__('_','_')*__('_','_', '_','_', '_') * +__('_','_', '_','_', '_')*__('_','_', '_','_', '_')+__('_','_', '_','_' , '_') +,__('_','_','_','_','_','_','_','_',), _$() m(i,a,u)($(n,i,t) $_)<% $_ (f,i) ( +$_ $_(=,=) __(_) ) $_$($_(f,i)(_[ _$_()____(_,_) ]>_[ _$_()] )_[_$_()____ (_,_ +,_,_,_,_,_)] $_$_ __(_) )$_(f,i)(_[_$_()____(_ ,_ ,_)] >_[ _$_()+ __$() ] || +_[_$_()____(_,_,_,_,_,_,_)] $_ (=,=) __$()) r(e,t) _[__(_,_,_ ,_,_ ,_)] $_$_ _ +[__ (_,_,_,_,_,_,_)____(_,_,_,_,_,_) ]/_[__(_,_,_,_,_) ____(_,_,_,_,_,_)]*( _[ + __$()]-_[_$()])+_[ _$() ];_[__(_,_,_,_,_,_,_)] $_$_ _[__(_,_,_,_,_,_,_) ____ +(_,_,_,_,_)]/_[_$_()]*(_[__(_,_,_,)]-_[__(_,_,)] )+_[__(_,_,)];_[__(_,_,_,_, _ +,_,_,_)] $_$_ _[_$_() - __$()] $_$_ _[__(_,_,_,_,_)+ _$_()-__$()] $_$_ _$(); +_f:_[__(_,_,_,_)] $_$_ _[__( _,_,_,_, _,_,_, _)] * _ [__(_,_,_, _,_,_,_,_)]; +_[__(_,_,_,_,_)] $_$_ _[_$_() - __$()]*_[_$_() - __$()];_[__(_,_,_,_,_,_,_,_,_ +)] $_$_ __(_,_)*_[__(_,_,_,_,_,_,_,_)]*_[_$_() -__$()]+ _[__ (_,_,_,_,_,_,_)]; +_[__(_,_,_,_,_,_,_,_)] $_$_ _ [ __(_,_,_,_) ]-_[__(_,_,_,_,_)]+_[__(_,_,_,_,_, +_)];$_$(_[_$_()____(_,_,_,_,)]++)$_(f,i)((_ [_$_() ____ (_,_,_,_,)]< _ [_$_ () +____ (_,_,_,_,_)])&&(_[__(_,_,_,_)]+ _[__(_,_,_,_,_)]<_[_$_()____(_,_,_,_,_,_) +])) $_(to,go) _f; $_(ar,ch) $(m,i,au)[] $_$_ <% __(_,_,_) * _$_()____(_,_), __ +(_,_,_,_) * _$_()____(_,_,_),__(_,_,_,_,_,_) * _$_()____(_,_,_,_), __(_,_,_,_) +*_$_() ____(_,_,_,_,_),__(_,_,_,_) * _$_() ____(_,_,_,_,_,_),__(_,_,_,_) * _$_ +()____(_,_) %>;___($(m,i,au)[($(n,i,t)) _[_$_()____(_,_,_,_)]%__(_,_,_,_,_)]); +$_$(_[__(_,_ ,_,_ ,_,_,_) + __(_,_,_,_,_,_)]++){m(i,a,u) ( _$()) ;$_$ (_[_$_() +____(_,_)]++)$_$(_[_$_()____(_,_,_)] $_$_ _$()) $_(f,i)(_ [__(_,_,_,_,_,_,_) + +_$_()] != __(_)) ___(_$_()) ;{ m(i,a,u)(__$()); r(e,t) /* IOCCC 2014*/ %> \ No newline at end of file diff --git a/2014/endoh1/Makefile b/2014/endoh1/Makefile new file mode 100644 index 000000000..83cf4a9f4 --- /dev/null +++ b/2014/endoh1/Makefile @@ -0,0 +1,208 @@ +#!/usr/bin/env make +# +# 2014 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall +#CWARN= -Wall -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} -Wno-empty-body -funsigned-char + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog main +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +main: main.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +main.c: prog + ./prog > $@ + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} main.o + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} main.c main + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Science!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from failong to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} diff --git a/2014/endoh1/hint.html b/2014/endoh1/hint.html new file mode 100644 index 000000000..5f739b442 --- /dev/null +++ b/2014/endoh1/hint.html @@ -0,0 +1,82 @@ + + + + + + + Most square (YODA award) + + +

    Most square (YODA award)

    + +

    Yusuke Endoh
    +mame@ruby-lang.org
    +https://github.com/mame/

    + +

    Judges' comments:

    + +

    To build:

    + +
    make
    +
    + +

    To run:

    + +
    ./prog > foo.c
    +
    + +

    Try:

    + +
    ./prog > main.c
    +
    +make main
    +./main Hello
    +
    + +

    Selected Judges Remarks:

    + +

    Big terminals with tiny fonts have their uses in certain cases. +One of them is:

    + +
    ./prog < prog.c > treacle.c
    +make treacle
    +# or instead of make: cc -Wno-empty-body -funsigned-char treacle.c -o treacle
    +./treacle
    +
    + +

    When using a smart phone to read the output, you may need to +step back to see the bigger picture because that picture is worth +more than 1000 words.

    + +

    Author’s comments:

    + +

    Remarks

    + +

    You may want to use a large display with a very small-font terminal.

    + +

    Spoiler

    + +

    Decompress src.zip if you need explanation.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2014/endoh1/hint.text b/2014/endoh1/hint.text new file mode 100644 index 000000000..4ec9c1c4e --- /dev/null +++ b/2014/endoh1/hint.text @@ -0,0 +1,54 @@ +# Most square (YODA award) + +Yusuke Endoh + + + + +## Judges' comments: +### To build: + + make + +### To run: + + ./prog > foo.c + +### Try: + + ./prog > main.c + + make main + ./main Hello + +### Selected Judges Remarks: + +Big terminals with tiny fonts have their uses in certain cases. +One of them is: + + ./prog < prog.c > treacle.c + make treacle + # or instead of make: cc -Wno-empty-body -funsigned-char treacle.c -o treacle + ./treacle + +When using a smart phone to read the output, you may need to +step back to see the bigger picture because that picture is worth +more than 1000 words. + +## Author's comments: +### Remarks + +You may want to use a large display with a very small-font terminal. + +### Spoiler + +Decompress `src.zip` if you need explanation. + +-------------------------------------------------------------------------------- + diff --git a/2014/endoh1/prog.c b/2014/endoh1/prog.c new file mode 100644 index 000000000..1908f2244 --- /dev/null +++ b/2014/endoh1/prog.c @@ -0,0 +1,58 @@ + + + + + + + + + #include/*IOCCC2014 2014 2014 IOCCC2014IOCCC2014IOCCC201*/ + char*s="\"nsu{AntynCnuq}Bnu{ sEot ln>b )+c^g+@`+]_osk{;j@bkg&c<'^o\ + r'Q] bh'l vQ^k g&c: %n|\ + N]_o ptj9 lwg+ )d:b kg$\ + c8#^ #g+)d8`a%g+) d8`_ g&;bh'oq Q^)g +&kcNlyMc+)d 8`a\ + `g+@ u)|d8ak=bl}( Q^og (O{MK6lM L(rR pOpM866OsRlm N(q\ + Q]## OsR#M_(lQoOa N9$m vOwwRor~ }(cN mkM: q(Q]%_(uU]}_ {8b\ + %mRh #S^`#mOaaD%/ RI4$ 4SNH$%N4 RlMG /2MJ 24O3NF(tQ?1l N*N\ + +Q]l mq9l8b$^#h$# .d,d xv#mSOPm R8`/ lM;b h&^/lM:k8b%& Q^-\ + h%c9 .#,/&N$McPc% -d8, $c8``7:b %^h% :79b $^%$7ON8r%Qr h$Q\ + On%q N%O~ M$qN$OMp RmPQ O%rQ $rQ\ + MkQN 77O# dj#Nkd$7 O%d8 ``(r RmM\ + :(luN](%mRMmO%lNRmO_loa8%%O< b(lQ h'lQ O^ln ;b'%N&O^6sN#M9slltwzh&TmS$'\ + %R#ON$oNS&pRM7O$'%S#ON$oNS&p SMd9 ``(t pkO9 $:nk8b#^%}kx#O%lMtpk#OQOP:#\ + mR8`}(qQ Ob)^15)OM :23h)QN<'/M\ + =b(^'h(Q]0h# c_kah%0d9`b'/O(Q^(/SlM90%M(/ RM;& $c&kckQ, -$c\ + .&kccMcOP$&d 9g(=``6:69j=b5g(Q^3(2lNUO@intYH[ 9`%\ + .],*s,*c,d,t;`;'main(`-9n,ch ar*v []){ for(s=c= H+3`XI;\ + (*++s=Q[d++]););for(;n>1&&(* ++s= v[1] [tgANs=H ;d=*c++\ + %93, d-9; ){in tYv=*s,g []={ n+v, v-n,n*_\ + ,#^_ ,,>n, v==n}ay\ + >t=0 ;d<4&&d>=2*! !n&& (c-=d/3*2_KK3+*c++,t||v!=98+d);) t+=v++/6-16\ + ?0:v /2%3-1cq*d-1 4;t> 0_t$<3_z(105<*c_X'=t*21aq@-106;n =d>76?s--,g\ + [d-7 7]:d>55?H_1) 21]= n,*_@_8( 9?*++s_4&12>d_C`f3]+=21-d*2\ + :d<3 4?t:_Zadat57 32)*p++=*s -89?*s:32;for(p= + 1152 +q;( b=*p++);){for(d[17]= 10;x =*p++,b< + 92&& 344 *23;r++) *r=r[36- x];}puts (d); + return(0);}/*IOCCC2014IOCCC2 014IOCCC 2014IOCC C2014IOC CC*/ + + + + + + + + diff --git a/2014/endoh1/src.zip b/2014/endoh1/src.zip new file mode 100644 index 000000000..d197a9030 Binary files /dev/null and b/2014/endoh1/src.zip differ diff --git a/2014/endoh2/Makefile b/2014/endoh2/Makefile new file mode 100644 index 000000000..ca10d14d7 --- /dev/null +++ b/2014/endoh2/Makefile @@ -0,0 +1,205 @@ +#!/usr/bin/env make +# +# 2014 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall +#CWARN= -Wall -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +hello: hello.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} hello.o + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} hello hello.c + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Science!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from failong to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} diff --git a/2014/endoh2/hint.html b/2014/endoh2/hint.html new file mode 100644 index 000000000..4dc96d6ba --- /dev/null +++ b/2014/endoh2/hint.html @@ -0,0 +1,86 @@ + + + + + + + Best use of bioinformatics + + +

    Best use of bioinformatics

    + +

    Yusuke Endoh
    +mame@ruby-lang.org
    +https://github.com/mame/

    + +

    Judges' comments:

    + +

    To build:

    + +
    make
    +
    + +

    To run:

    + +
    ./prog < input > output
    +
    + +

    Try:

    + +
    echo Hello | ./prog
    +
    +echo Hello | ./prog > hello.c
    +make hello
    +./hello
    +
    + +

    Selected Judges Remarks:

    + +

    If you look closely at the source, you will see code that appears +to puts C code that includes itself. How and why? Perhaps it is +in the DNA code of the code? Perhaps there are 23 reasons? :-)

    + +

    Author’s comments:

    + +

    Remarks

    + +

    This chromosome program synthesizes a double helix. +The helix can also be compiled as a C program.

    + +

    Enjoy DNA programming!

    + +

    For more information / backgroud reading:

    + +
      +
    • This program was inspired by Acme::DoubleHelix: +http://search.cpan.org/~xern/Acme-DoubleHelix-0.01/

    • +
    • The synthesized helix just includes the original program at the head. +Do you see how prog.c determines whether it was invoked as a standalone program or included as a header file? +Note that it does not use any gcc extension such as __INCLUDE_LEVEL__.

    • +
    • The synthesized helix of course follows the base-pairing rules for DNA: +A is bonding only to T, and C is bonding only to G.

    • +
    + + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2014/endoh2/hint.text b/2014/endoh2/hint.text new file mode 100644 index 000000000..e802d4bbc --- /dev/null +++ b/2014/endoh2/hint.text @@ -0,0 +1,58 @@ +# Best use of bioinformatics + +Yusuke Endoh + + + + +## Judges' comments: +### To build: + + make + +### To run: + + ./prog < input > output + +### Try: + + echo Hello | ./prog + + echo Hello | ./prog > hello.c + make hello + ./hello + +### Selected Judges Remarks: + +If you look closely at the source, you will see code that appears +to puts C code that includes itself. How and why? Perhaps it is +in the DNA code of the code? Perhaps there are 23 reasons? :-) + +## Author's comments: +### Remarks + +This chromosome program synthesizes a double helix. +The helix can also be compiled as a C program. + +Enjoy DNA programming! + +### For more information / backgroud reading: + +* This program was inspired by Acme::DoubleHelix: + http://search.cpan.org/~xern/Acme-DoubleHelix-0.01/ + +* The synthesized helix just includes the original program at the head. + Do you see how `prog.c` determines whether it was invoked as a standalone program or included as a header file? + Note that it does not use any gcc extension such as `__INCLUDE_LEVEL__`. + +* The synthesized helix of course follows the base-pairing rules for DNA: + A is bonding only to T, and C is bonding only to G. + +-------------------------------------------------------------------------------- + diff --git a/2014/endoh2/prog.c b/2014/endoh2/prog.c new file mode 100644 index 000000000..8d3efbb46 --- /dev/null +++ b/2014/endoh2/prog.c @@ -0,0 +1,32 @@ + #include +#define TA q=/*XYXY*/ +#define/*X YXY*/CG r= +void p(int n,int c){; +for(;n--;) putchar(c) +#define Y( z)d;d=c++\ +%2<1?x=x*4 +z,c%8>5?\ +x=x?p(1,x), 0:x:0:0;d= +#define/*X YX*/C Y(1) +#define/*X YX*/G Y(2) + ;}int(*f)( void),d,c, + #define/*X YX*/A Y(0) + #define/*XY*/AT int\ + m(void/**/){d= + #define/*XYX*/T Y(3) + #define GC d; return\ + 0;}int(*f) (void )=m; +x,q,r; int main(){if( +f)f();else {for(puts( +"#include" "\40\"pro\ +g.c\"\n\n \101T"+0); +d=!d?x=(x= getchar()) +<0?0:x,8*8 :d,TA++c%8 +,TA(1+7*q- q*q)/3,r=c +*15-c*c-36 ,p(r<0?!q+ +4:r/6+!q+4 ,32),q||x; +c%=16)q?p( 1,"ACGT"[x +/d&3]),p(q ,126),p(1, +"TGCA"[x/d &3]),d/=4, +p(001,10): puts(c%8?\ +"CG":"TA") ;puts("GC" + );}return 0;}/**/ diff --git a/2014/guidelines.txt b/2014/guidelines.txt new file mode 100644 index 000000000..6094e9cab --- /dev/null +++ b/2014/guidelines.txt @@ -0,0 +1,801 @@ +| 23rd International Obfuscated C Code Contest Official Guidelines + +| Copyright (C) 2006-2014 Leonid A. Broukhis, Simon Cooper, Landon Curt Noll. + +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in +writing from the contest judges. + +| This guidelines file is version 2014-08-29-v18. + +| Most of the changes from the previous IOCCC guidelines +| been marked with a "|" on the left hand side of the line. + + +ABOUT THIS FILE: + + This file contains guidelines intended to help people who wish to +| submit entries to the International Obfuscated C Code Contest (IOCCC). + + This is not the IOCCC rules, though it does contain comments about + them. The guidelines should be viewed as hints and suggestions. + Entries that violate the guidelines but remain within the rules are + allowed. Even so, you are safer if you remain within the guidelines. + + You should read the current IOCCC rules, prior to submitting entries. + The rules are typically sent out with these guidelines. + + We recommend that you follow the twitter handle: + + @IOCCC + + to learn about IOCCC news, important IOCCC related alerts, IOCCC + reminders, and changes to the rules and these guidelines. + + You do not have to be a twitter user to follow @IOCCC. Non-twitter + users should access: + + https://twitter.com/ioccc + + Non-twitter users should force their browsers to reload the above URL + to be sure they are seeing the most recent tweets. + + While we try to post use news at: + + http://www.ioccc.org/index.html#news + + such postings may be delayed or obscured by slow to respond mirrors. + + +| WHAT'S NEW IN 2014: + +| The contest runs from 2014-Sep-01 02:03:04 UTC to 2014-Oct-19 18:17:16 UTC. + + The submission URL: + + https://submit.ioccc.org/ + +| along with the final rules and updated iocccsize.c tool will be avalaible +| and active on or slightly before 2014-Sep-15 15:15:15 UTC. + + +HINTS AND SUGGESTIONS: + + You are encouraged to examine the winners of previous contests. See + FOR MORE INFORMATION for details on how to get previous winners. + + Keep in mind that rules change from year to year, so some winning entries + may not be valid entries this year. What was unique and novel one year + might be 'old' the next year. + + An entry is usually examined in a number of ways. We typically apply + a number of tests to an entry: + + * look at the original source + * convert ANSI tri-graphs to ASCII + * C pre-process the source ignoring '#include' lines + * C pre-process the source ignoring '#define' and '#include' lines + * run it through a C beautifier + * examine the algorithm + * compile it (with flags to enable all warnings) + * execute it + + You should consider how your entry looks in each of the above tests. + You should ask yourself if your entry remains obscure after it has been + 'cleaned up' by the C pre-processor and a C beautifier. + + Your entry need not pass all of the above tests. In certain + cases, a test is not important. Entries that compete for the + 'strangest/most creative source layout' need not do as well as + others in terms of their algorithm. On the other hand, given + two such entries, we are more inclined to pick the entry that + does something interesting when you run it. + + We try to avoid limiting creativity in our rules. As such, we leave + the contest open for creative rule interpretation. As in real life + programming, interpreting a requirements document or a customer request + is important. For this reason, we often award 'worst abuse of the + rules' to an entry that illustrates this point in an ironic way. + + We do realize that there are holes in the rules, and invite entries + to attempt to exploit them. We will award 'worst abuse of the rules' + and then plug the hole next year. Even so, we will attempt to use + the smallest plug needed, if not smaller. :-) + +| There are 23 reasons why these guidelines seem obfuscated. + + Check out your program and be sure that it works. We sometimes make + the effort to debug an entry that has a slight problem, particularly + in or near the final round. On the other hand, we have seen some + of the best entries fall down because they didn't work. + + We tend to look down on a prime number printer that claims that + 16 is a prime number. If you do have a bug, you are better off + documenting it. Noting "this entry sometimes prints the 4th power + of a prime by mistake" would save the above entry. And sometimes, + a strange bug/feature can even help the entry! Of course, a correctly + working entry is best. Clever people will note that 16 might be prime + under certain conditions. Wise people, when submitting something clever + will fully explain such cleverness in their entry's remarks file. + + People who are considering to just use some complex mathematical + function or state machine to spell out something such as "hello, + world!" really really, and we do mean really, do need to be more creative. + + Ultra-obfuscated programs are, in some cases, easier to + deobfuscate than subtly-obfuscated programs. Consider using + misleading or subtle tricks layered on top of or under an + appropriate level of obfuscation. A clean looking program with + misleading comments and variable names might be a good start. + + When programs use VTxxx/ANSI sequences, they should NOT limited to a + specific terminal brand. Those programs that work in a standard xterm + are considered more portable. + + Rule 2 (the size rule) has been changed. In particular rule 2 refers to + the use of an IOCCC size tool. The source for this tool is found at: + +| http://www.ioccc.org/2014/iocccsize.c + + The IOCCC size tool should be compiled as: + + cc -pedantic -Wall -std=c99 iocccsize.c -o iocccsize + + This tool imposes a 2nd limit on C code size. To check your program + source against the 2nd limit of rule 2, use the -i command line option. + For example: + + ./iocccsize -i < prog.c + + The IOCCC size tool, when using the -i option, may be summarized as: + + The size tool counts most C reserved words (keyword, secondary, + and selected preprocessor keywords) as 1. The size tool counts all + other octets as 1 excluding ASCII whitespace, and excluding any + ';', '{' or '}' followed by ASCII whitespace, and excluding any + ';', '{' or '}' octet immediately before the end of file. + + ASCII whitespace includes ASCII tab, ASCII space, ASCII newline, + ASCII formfeed, and ASCII carriage return. + + In cases where the above summary and the algorithm implemented by + the IOCCC size tool source code conflict, the algorithm implemented + by the IOCCC size tool source code is preferred by the judges. + + There are at least 2 other reasons for selecting 2053 as the 2nd limit + besides the fact that 2053 is the next prime > 2048. These reasons + may be searched for and discovered if you are "Curios!" about 2053. :-) + Moreover, 2053 was the number of the kernel disk pack of one of the + judge's BESM-6. + + Take note that this secondary limit imposed by the IOCCC size tool + obviates some of the need to #define C reserved words in an effort + to get around the size limits of rule 2. + + Yes Virginia, that is a hint! + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many C compilers dislike the following code, and so do we: + + #define d define + #d foo /* <-- don't expect this to turn into #define foo */ + + When declaring local or global variables, you should declare the type: + + int this_is_fine; + this_is_not; /* <-- Try to avoid implicit type declarations */ + + We suggest that you compile your entry with an ISO/IEC 9899-1999 + ("ISO C99") C compiler or at least an ANSI C compiler. + + DO NOT assume that we will use gcc to compile your program. + We will first try to compile your program using Clang. + +| It is much better to not use any obscure compiler flags if + you can help it. We want to discourage the use of obscure compiler + flags that would make the program less portable. + + One side effect of the above is that you cannot assume the use + of nested functions such as: + + main() { +| void do_not_do_this() { printf("Albatross!\n"); } + do_not_do_this(); + } + + This is because such nested functions often requires one to compile with + a flag such as -fnested-functions that is not found on some compilers. + + On 2012 July 20, the judges rescinded the encouragement of + nested functions. Such constructions, while interesting and sometimes + amusing, will have to wait until they required by a C standard that are + actually implemented in commonly used C compilers. Sorry! + +| We prefer programs that do require a fish license for pet fish. + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using . Use instead. + + On 28 January 2007, the Judges rescinded the requirement that the + '#" in a C preprocessor directive must be the 1st non-whitespace octet. + +| The exit() function returns void. Some broken systems have exit() +| return int, your entry should assume that exit() returns a void. + +| This line has a change mark at the beginning. + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + + One line programs should be short one line programs: say around 80 to 120 + octets long. Going well beyond 140 octets is a bit too long to be called + a one-liner in our vague opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS version specific + (index/strchr differences are OK, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is OK only if you warn us in the 'remark' header item) + * won't compile or run under a POSIX P1003.1/P1003.2 like systems + * depend on a utility or application not normally found on most + most POSIX P1003.1/P1003.2 like systems + * abuse the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are "blob-ier" than they need to be +| * are rather similar to previous winners :-( +| * are too similar to previous losers :-) + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + At least one judge prefers to maintain the use of the leap-second + as part of the world's time standard. + + The "how to build" make process should not be used to try and get + around the size limit. It is one thing to make use of a several -D's + on the compile like to help out, but it is quite another to use many + bytes of -D's in order to try and squeeze the source under the size limit. + +| The judges, as a group, have a history giving wide degree of latitude +| to reasonable entries. And recently they have had as much longitutional +| varation as it is possible to have on Earth. :-) + + You should try to restrict commands used on the build file to + POSIX-like or common Un*x-like commands. You can also compile + and use your own programs. If you do, try to build and execute + from the current directory. This restriction is not a hard and + absolute one. The intent is to ensure that the building if your + program is reasonably portable. + + You are in a maze of twisty guidelines, all different. + +| There are at least zero judges who think that Fideism has little +| or nothing to do with the IOCCC judging process. + + Don't forget that the building of your program should be done + ***without human intervention***. So don't do: + + prog: prog.c + #echo this next line requires data from standard input + cat > prog.c + ${CC} prog.c -o prog + + However, you can do something cute such as making your program +| do something dumb (or cute) when it is built 'automatically'. And + when it is run with a human involved, do something more clever. + For example, one could use the build instructions: + + prog: prog.c + ${CC} prog.c -DNON_HUMAN_COMPILE -o prog + @echo "See remarks section about alternate ways to compile" + + and then include special notes in the program "remarks" for + alternate / human intervention based building. + + We want to get away from source that is simply a compact blob of +| octets. Really try to be more creative than blob coding. *HINT!* + + Please do not use things like gzip to get around the size limit. + Be more creative. + + We really dislike entries that make blatant use of including + large data files to get around the source code size limit. + + Did we remember to indicate that programs that blatantly use + some complex state machine to do something simple are boring? + We think we did. :-) + +| All generalizations are false, including this one. -- Mark Twain + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! + Remember, you can submit more than one entry. See the rules for details. + + We suggest that you avoid trying for the 'smallest self-replicating' + source. The smallest, a zero byte entry, won in 1994. + +| Programs that claim to be the smallest C source that does something, really +| better be the smallest such program or they risk being rejected because + they do not work as documented. + + Please note that the C source below, besides lacking in obfuscation, + is NOT the smallest C source file that when compiled and run, dumps core: + + main; + + We do not like writable strings. That is, we don't want stuff like: + + char *T = "So many primes, so little time!"; + ... + T[14] = ';'; + + Please don't make use of this feature, even if your system allows it. + However, initialized char arrays are OK to write over. This is OK: + + char b[] = "Is this OK"; + b[9] = 'K'; + +| There is still a typo in this sentence. + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. For + example, don't depend on a particular type or size of display. + Don't assume the use of a particular browser. Instead assume a + generic browser that forms to a widely used W3C standard. + Don't assume a particular sound sub-system or video driver is installed + in the OS. Instead, make use of a well known and widely available open + source program (one that actually works) to display audio/visual data. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. + + This is the only guideline that contains the word fizzbin. + + We don't like entries that use proprietary toolkits such as the M*tif, + Xv*ew, or OpenL*ok toolkits, since not everyone has them. Use of an + open source toolkit that is widely and freely available instead. + + You should avoid depending on a particular window manager. + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines + in the program "remarks". + + Try to avoid entries that play silent sound segments or play the + Happy Birthday song; music that some people believe is copyrighted + (even if such copyrights appear to be bogus and/or blatant abuses of + the copyright system). + + While we recognize that UN*X is not a universal operating system, the + contest does have a bias towards such systems. In an effort to expand + the scope of the contest, we phrase our bias in terms of POSIX P1003.1 + and P1003.2 standards. This will allow certain non-UN*X OS users to + submit entries. On the other hand, this is a guideline and not a rule. + We will not reject an entry based on some POSIX technicality. + + When dealing with OS and application environments, we suggest that you + be reasonable with a nod towards vanilla UN*X-like systems. POSIX will + evolve but not as much as the contest. + +| You very well might not be completely prohibited from failing to not +| partly misunderstand this particular guideline. You are not mandated to + determine that this or the previous sentence is false and misleading. +| Nevertheless, it might not be wise to not fail to consider failing to do so. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION <== HINT!! + * make us laugh and/or throw up :-) (humor really helps!) +| * make us want to eat good chocolate. + + Some types of programs can't excel (anti-tm) in some areas. Your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + You are better off explaining what your entry does in the program + "remarks" section rather than leaving it obscure for the judges + as we might miss something and/or be too tired to notice. + +| Please avoid this specific individual guideline, if you can. + + We freely admit that interesting, creative or humorous comments in + the program "remarks" help your chances of winning. If you had to + read so many twisted entries, you too would enjoy a good laugh or two. + We think the readers of the contest winners do as well. We do read + the program "remarks" during the judging process, so it is worth your + while to write remarkable program "remarks". + + We dislike C code with trailing control-M's (\r or \015) that results + in compilation failures. Some non-Un*x/non-Linux tools such as + MS Visual C and MS Visual C++ leave trailing control-M's on lines. + Users of such tools should strip off such control-M's before submitting + their entries. In some cases tools have a "Save As" option that will + prevent such trailing control-M's being added. + + We dislike entries that depend on non-portable libcurses features such + as halfdelay(). One should restrict libcurses to portable features + found on BSD or Linux curses. + + Rule 13 states any C source that fails to compile because of unescaped + octets with the high bit set (octet value >= 128) will be rejected. + Instead of unescaped octets, you should use \octal or \hex escapes: + + /* 123456789 123456789 123456789 123456 */ + char *foo = "This string is 36 octets in length \263"; + /* This octet requires 4 octets of source ^^^^ */ + if (strlen(foo) == 36) printf("foo is 36 octets plus a final NUL\n"); + else printf("This code should not print this message\n"); + + It is a very good idea to, in your remarks file, tell us why you + think your entry is obfuscated. This is particularly true if + your entry is has some very subtle obfuscations that we might + otherwise overlook. <<-- Hint! + + Anyone can format their code into a dense blob. A really clever + author will try format their entry using a "normal" formatting style + such that at first glance (if you squint and don't look at the details) + the code might pass for non-obfuscated C. Deceptive comments, + and mis-leading formatting, in some cases, may be a plus. On the + other hand, a misleading code style requires more source bytes. + + If you do elect to use misleading formatting and comments, we + suggest you remark on this point in your remarks where you talk + about why you think your entry is obfuscated. On the other hand, + if you are pushing up against the size limits, you may be forced + into creating a dense blob. Such are the trade offs that obfuscators face! + + We prefer code that can run on either a 64-bit or 32-bit processor. + However, it is unwise to assume it will run on an i386 or x86 architecture. + +| We believe that Mark Twain's remark: + +| Get your facts first, then you can distort them as you please. + +| is a good guideline for those writing code for the IOCCC. + + While programs that only run in a specific word size are OK. If you have +| to pick, choose a 64-bit word size. + + If we are feeling ornery we might choose to compile your program + for running on an Arduino or a PDP-11. Heck, should we ever find + an emulator of 60-bit CDC Cyber CPU running a POSIX-like OS, we + might just try your entry on that emulator as well :-) + + If your entry MUST run only in 32-bit mode on an Intel processor, add the + following compiler flag: + + -arch i386 + + to your "how to build" make compile line. For example: + + prog: prog.c + ${CC} prog.c -arch i386 -o prog + + Be even more creative! + + +ABUSING THE RULES: + + Legal abuse of the rules is somewhat encouraged. Legal rule abuse may + involve, but is not limited to, doing things that are technically + allowed by the rules and yet do not fit the spirit of what we intended + to be submitted. + + Legal rule abuse is encouraged to help promote creativity. Rule abuse + entries, regardless of if they receive an award, result in changes to + the next year's rules and guidelines. + + Legal abuse of the rules is NOT an invitation to violate the rules. + An entry that violates the rules in the opinion of the judges, WILL be + disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK! If you + have an entry that might otherwise be interesting, you might want to + submit two versions; one that does not abuse the rules and one that + does. + + If you intend to abuse the rules, indicate so in the program + "remarks". You must try to justify why you consider your rule abuse + to be allowed under the rules. That is, you must plead your case as + to why your entry is valid. Humor and/or creativity help plead a + case. + + Abusing the web submission procedure tends to annoy us more + than amuse us. Spend your creative energy on content of your + entry rather than on the submission process itself. + + We are often asked why the contest rules and guidelines seem too + strange or contain mistakes, flaws or grammatical errors. One reason + is that we sometimes make genuine mistakes. But in many cases such + problems, flaws or areas of confusion are deliberate. Changes to + rules and guidelines in response to rule abuses, are done in a minimal + fashion. Often we will deliberately leave behind holes (or introduce + new ones) so that future rule abuse may continue. A cleaver author + should be able to read them and "drive a truck through the holes" in + the rules and guidelines. + + At the risk of stating the obvious, this contest is a parody of the + software development process. The rules and guidelines are only a + small part of the overall contest. Even so, one may think the contest + rules and guideline process as a parody of the sometimes tragic + mismatch between what a customer (or marketing) wants and what + engineering delivers. Real programmers must face obfuscated + and sometimes conflicting specifications and requirements from marketing, + sales, product management an even from customers themselves on a + all to regular basis. This is one of the reasons why the rules and + guidelines are written in obfuscated form. + + +JUDGING PROCESS: + + Entries are judged by Leonid A. Broukhis, Simon Cooper, Landon Curt Noll. + +| Each entry submitted is given a random id number and subdirectory. The + entry files including, but not limited to prog.c, Makefile (that we + form from around your "how to build" information), as well as any +| data files that you submit are all placed under their own directory. + stored and judged from this directory. + + Any information about the authors is not read by the judges until + the judging process is complete, and then only from entries that have + won an award. + + Because we do not read this information for entries that do not win, +| we do not know who did not win. + + The above process helps keep us biased for/against any one particular + individual. Therefore you MUST refrain from putting any information + that reveals your identity in your entry. + + Now some people point out that coding style might reveal the information + about the others. However we consider this to be simply circumstantial + and outside the scope of the above paragraph. + + Some people, in the past, have attempted to obfuscate their identity by + including comments of famous Internet personalities such as Peter Honeyman + (http://www.citi.umich.edu/u/honey/). The judges are on to this + trick and therefore consider any obfuscated source or data file + claiming to be from Honeyman to not be form Honeyman. This of course + creates an interesting paradox known as the "obfuscated Peter Honeyman + paradox". Should Peter Honeyman actually submit an obfuscated entry, +| he alone is excluded from the above, as we will likely believe + it just another attempt at confusion. This guideline is known + as the "Peter Honeyman is exempt" guideline. + + BTW: None of the entries claiming to be from Peter Honeyman have ever + won an award. So it is theoretically possible that Peter Honeyman + did submit an entry in the past. In the past, Peter had denied + submitting anything to the IOCCC. Perhaps those entries were + submitted by one of his students? + +| We seemed to have digressed again ... :-) Returning to the judging process: + + We prefer to be kept in the dark as much as you are until the final + awards are given. We enjoy the surprise of finding out in the end, + who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. + + During the judging process. a process that spans multiple sessions + over a few weeks, post general updates from our @IOCCC twitter account. + + Once we have selected the winners, for each category we will tweet: + + category name + name(s) of the authors (or anonymous if requested) + twitter handle(s) (if provided and if anonymity was not requested) + country code(s) of the author(s) + + After the initial announcement, we attempt to send EMail to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes and typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the "how to build" information and forming a Makefile + * reading prog.c, the C source + * reviewing the "remarks" information + * briefly looking any any supplied data files + * passing the source thru the C pre-processor + skipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + skipping over any #include files + * compiling/building the source + * running the program + * Doing other things that only IOCCC judges know about :-) + + In later rounds, other actions are performed including performing + miscellaneous tests on the source and binary. + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry will often compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code (code with deceptive comments and source code) + * best X client (see OUR LIKES AND DISLIKES) + * best abuse of ISO/IEC 9899-1999 ("ISO C99") C or ANSI C + * best abuse of the C preprocessor + * worst abuse of the rules + * (anything else so strange that it deserves an award) + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to to about + half that number: declaring those remaining to be winners. + + Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry is good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + + More than one IOCCC judge has been known to bribe another IOCCC judge + into voting for a winning entry by offering a bit high quality chocolate. + This technique is highly discouraged for use by non-IOCCC judges. + + More often than not, we select a small entry (usually one line), a + strange/creative layout entry. We sometimes also select an + entry that abuses the contest guidelines in an interesting way, + or that stretches the content rules that while legal, is + nevertheless goes against the intent of the rules. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entries. More often, the + 'best' is picked because it does well in a number of categories. + + +ANNOUNCEMENT OF WINNERS: + + The judges will tweet initial announcement of who won, the name + of their award, and a very brief description of the winning entry + from the @IOCCC twitter handle. Non-twitter users should visit: + + https://twitter.com/ioccc + + Non-twitter users should force their browsers to reload the above URL + to be sure they are seeing the most recent tweets. + + The judges will then post an initial announcement of who won, the name + of their award, and a very brief description of the winning entry + on the IOCCC web site: + + http://www.ioccc.org/whowon.html + + We will also attempt to submit a brief announcement story to /.: + + http://slashdot.org + + that, depending on the willingness of the /. editors, may be posted + to their site at the same time. + + Note that initial announcement will NOT contain source. This is because + the winning authors are given a chance to review the judges comments, + and test our Makefile. This review process typically takes a few weeks. + + Sometime after the initial announcement, and once the the review + by the winners has been completed, the winning source will be + posted to the IOCCC web site: + + http://www.ioccc.org/years.html + + NOTE: previous winners are available at that URL + + We will also tweet, via @IOCCC, when the winning source is available. + + It is pointless to ask the IOCCC judges how many entries we receive. +| Other government TLA or FLA snooping organizations are prohibited from +| either confirming, denying or revealing any knowledge of this data point. + + Often, winning entries are published in selected magazines from around + the world. Winners have appeared in books ("The New Hackers Dictionary") + and on T-Shirts. More than one winner has been turned in a tattoo! + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending EMail to the following address: + +| q.2014@ioccc.org (do not submit entries to this address) + +| You must include the words 'ioccc 2014 question' in the subject of your + EMail message when sending EMail to the judges. + + Questions and comments about the contest are welcome. Comments about + confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. + + Check out the IOCCC Web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + For the updates and breaking IOCCC news, you are encouraged to follow + the twitter handle: + + @IOCCC + + You do not have to be a twitter user to follow @IOCCC. Non-twitter + users should access: + + https://twitter.com/ioccc + + Non-twitter users should force their browsers to reload the above URL + to be sure they are seeing the most recent tweets. + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ diff --git a/2014/hint.css b/2014/hint.css new file mode 100644 index 000000000..c8d299d85 --- /dev/null +++ b/2014/hint.css @@ -0,0 +1,77 @@ +* { + font-family: Helvetica Neue, Helvetica, Arial, sans-serif; +} +body { + max-width: 50em; + margin: 0 auto; + color: #111; +} + +pre, code { + font-family: Monaco, Courier New, monospace; + font-size: 12px; +} + +h1 { + font-size: 40px; + font-weight: bold; + letter-spacing: -1px; + margin-bottom: -5px; +} +h1 code { + font-size: 40px; +} + +h2 { + color: rgb(43,105,145); + font-weight: bold; + margin-bottom: -5px; +} +h2 code { + font-size: 22px; +} + +h3 { + /* color: rgb(43,105,145); */ + font-weight: bold; + margin-bottom: -5px; +} +h3 code { + font-size: 16px; +} + +a { + color: blue; + text-decoration: underline; +} +a:visited { + color: navy; +} +a:hover { + text-decoration: underline; +} + +pre { + border-radius: 10px; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + border-width: 1px; + border-color: rgb(16,48,0); + border-style: solid; + padding: 0.6em; + padding-left: 1em; + margin-left: 5%; + margin-right: 8%; + background-color: rgb(55,39,0); + overflow: auto; + color: rgb(255,183,0); +} + +p, li { + font-size: 14px; + line-height: 18px; +} + diff --git a/2014/iocccsize.c b/2014/iocccsize.c new file mode 100644 index 000000000..d0f6aae1f --- /dev/null +++ b/2014/iocccsize.c @@ -0,0 +1,522 @@ +/* + * iocccsize - IOCCC Source Secondary Size + * + * This IOCCC size tool source file is version 2014-09-23-v19. + * Public Domain 1992, 2013, 2014 by Anthony Howe. All rights released. + * With IOCCC minor mods in 2013,2014 by chongo (Landon Curt Noll) /\oo/\ + * + * SYNOPSIS + * + * ioccc [-krs] < input + * + * -k keep comment blocks + * -r count C reserved words as 1 byte + * -s suppress source output, write only the IOCCC 2nd size count + * + * DESCRIPION + * + * Taking input from standard input, apply the IOCCC Source Size Rule + * for 2001. The program's offical length is written to standard error. + * Also filter out C comment blocks (-k to keep) sending the modified + * source to standard output. + * + * The 2001 Source Size Rule was: + * + * Your entry must be <= 4096 bytes in length. The number of octets + * excluding whitespace (tab, space, newline, formfeed, return), and + * excluding any ';', '{' or '}' followed by whitespace or end of file, + * must be <= 2048. + * + * 2013 Source Size Rule is (-r): + * + * Your entry must be <= 4096 bytes in length. The number of octets + * excluding whitespace (tab, space, newline, formfeed, return), and + * excluding any ';', '{' or '}' followed by whitespace or end of file, + * and where C reserved words, including a subset of preprocessor words, + * count as 1 byte, must be <= 2053 (first prime after 2048). + */ + +/* + * The official IOCCC rule 2 secondary limit on C code size + * + * The IOCCC size tool should be compiled as: + * + * cc -pedantic -Wall -std=c99 iocccsize.c -o iocccsize + * + * This tool computes a 2nd size C code. To check your program source + * against the 2nd limit of rule 2, use the -i command line option. + * + * For example: + * + * ./iocccsize -i < prog.c + * + * The IOCCC size tool, when using the -i option, may be summarized as: + * + * The size tool counts C language keywords (primary, secondary, and + * selected preprocessor keywords) as 1. The size tool counts all + * other octets as 1 excluding ASCII whitespace, and excluding any + * ';', '{' or '}' followed by ASCII whitespace, and excluding any + * ';', '{' or '}' octet immediately before the end of file. + * + * ASCII whitespace includes ASCII tab, ASCII space, ASCII newline, + * ASCII formfeed, and ASCII carriage return. + * + * In cases where the above summary and the algorithm implemented by + * the IOCCC size tool source code conflict, the algorithm implemented + * by the IOCCC size tool source code is preferred by the judges. + * + * See the current IOCCC rules and guidelines for more information. + * In particular, see the current IOCCC size rule for information about + * the maximum value that this tool should print for an entry to be valid. + */ + +/* + * IOCCC Judge's remarks: + * + * This code contains undocumented features. On the other hand, this code + * is RTFS (for certain values of RTFS). One might say that this code + * perfectly documents itself. :-) + * + * Many thanks to Anthony Howe for taking the time to put his OCD + * (Obfuscated Coding Determination) into this code! + */ + +/* + * HINT: The algorithm implemented by this code may or not be obfuscated. + * The algorithm may not or may appear to be obfuscated. + * + * In particular: + * + * We did not invent the algorithm. + * The algorithm consistently finds Obfuscation. + * The algorithm killed Obfuscation. + * The algorithm is banned in C. + * The algorithm is from Bell Labs in Jersey. + * The algorithm constantly finds Obfuscation. + * This is not the algorithm. + * This is close. + */ + +#include +#include +#include +#include +#include + +#define FLAG_SILENCE 1 +#define FLAG_KEEP 2 +#define FLAG_RESERVED 4 +#define FLAG_IOCCC_SIZE 8 + +#define BUFFER_SIZE 512 + +char usage[] = +"usage: ioccc [-ikrs] < prog.c\n" +"\n" +"-i\t\tprint just the official secondary IOCCC size to stdout\n" +"\t\t NOTE: -i implies -r -s\n" +"-k\t\tkeep block comments\n" +"-r\t\tcount C reserved words as 1 byte\n" +"-s\t\tsuppress source output, write only the offical size\n" +; + +#define STRLEN(s) (sizeof (s)-1) + +typedef struct { + size_t length; + const char *word; +} Word; + +/* + * C reserved words, plus a few #preprocessor tokens, that count as 1 + * + * NOTE: For a good list of reserved words in C, see: + * + * http://www.bezem.de/pdf/ReservedWordsInC.pdf + * + * by Johan Bezem of JB Enterprises: + * + * See http://www.bezem.de/en/ + */ +/* + * The following editorial plea expresses a view shared by more than zero + * IOCCC judges. It may not represent the opinion of all those involved + * with this code nor the International Obfuscated C Code Contest as a whole: + * + * The long list of reserved words below should be a source + * of embarrassment to some of those involved in standardizing C. + * The growing list of reserved words, along with an expanding set of + * linguistic inventions has the appearance of feature + * creep that, if left unchecked, risks turning a beautifully elegant + * language into a steaming pile of biological excretion. + * + * The history of the IOCCC has taught us that even minor changes + * to the language are not always well understood by compiler writers, + * let alone the standards body who publishes them. We have enormous + * sympathy for C compiler writers who must keep up with the creeping + * featurism. We are aware of some C standards members who share + * these concerns. Alas, they seem to be a minority. + * + * The C standards body as a whole, before they emit yet more mountains of new + * standardese, might wish consider the option of mothballing their committee. + * Or if they must produce a new standard, consider naming whatever + * follows c11 as CNC (C's Not C). :-) + */ +static Word cwords[] = { + /* Yes Virginia, we left #define off the list on purpose! */ + { STRLEN("#elif"), "#elif" }, + { STRLEN("#else"), "#else" }, + { STRLEN("#endif"), "#endif" }, + { STRLEN("#error"), "#error" }, + { STRLEN("#ident"), "#ident" }, + { STRLEN("#if"), "#if" }, + { STRLEN("#ifdef"), "#ifdef" }, + { STRLEN("#include"), "#include" }, + { STRLEN("#line"), "#line" }, + { STRLEN("#pragma"), "#pragma" }, + { STRLEN("#sccs"), "#sccs" }, + { STRLEN("#warning"), "#warning" }, + /**/ + { STRLEN("_Alignas"), "_Alignas" }, + { STRLEN("_Alignof"), "_Alignof" }, + { STRLEN("_Atomic"), "_Atomic" }, + { STRLEN("_Bool"), "_Bool" }, + { STRLEN("_Complex"), "_Complex" }, + { STRLEN("_Generic"), "_Generic" }, + { STRLEN("_Imaginary"), "_Imaginary" }, + { STRLEN("_Noreturn"), "_Noreturn" }, + { STRLEN("_Pragma"), "_Pragma" }, + { STRLEN("_Static_assert"), "_Static_assert" }, + { STRLEN("_Thread_local"), "_Thread_local" }, + /**/ + { STRLEN("alignas"), "alignas" }, + { STRLEN("alignof"), "alignof" }, + { STRLEN("and"), "and" }, + { STRLEN("and_eq"), "and_eq" }, + { STRLEN("auto"), "auto" }, + { STRLEN("bitand"), "bitand" }, + { STRLEN("bitor"), "bitor" }, + { STRLEN("bool"), "bool" }, + { STRLEN("break"), "break" }, + { STRLEN("case"), "case" }, + { STRLEN("char"), "char" }, + { STRLEN("compl"), "compl" }, + { STRLEN("const"), "const" }, + { STRLEN("continue"), "continue" }, + { STRLEN("default"), "default" }, + { STRLEN("do"), "do" }, + { STRLEN("double"), "double" }, + { STRLEN("else"), "else" }, + { STRLEN("enum"), "enum" }, + { STRLEN("extern"), "extern" }, + { STRLEN("false"), "false" }, + { STRLEN("float"), "float" }, + { STRLEN("for"), "for" }, + { STRLEN("goto"), "goto" }, + { STRLEN("I"), "I" }, + { STRLEN("if"), "if" }, + { STRLEN("inline"), "inline" }, + { STRLEN("int"), "int" }, + { STRLEN("long"), "long" }, + { STRLEN("noreturn"), "noreturn" }, + { STRLEN("not"), "not" }, + { STRLEN("not_eq"), "not_eq" }, + { STRLEN("or"), "or" }, + { STRLEN("or_eq"), "or_eq" }, + { STRLEN("register"), "register" }, + { STRLEN("restrict"), "restrict" }, + { STRLEN("return"), "return" }, + { STRLEN("short"), "short" }, + { STRLEN("signed"), "signed" }, + { STRLEN("sizeof"), "sizeof" }, + { STRLEN("static"), "static" }, + { STRLEN("static_assert"), "static_assert" }, + { STRLEN("struct"), "struct" }, + { STRLEN("switch"), "switch" }, + { STRLEN("thread_local"), "thread_local" }, + { STRLEN("true"), "true" }, + { STRLEN("typedef"), "typedef" }, + { STRLEN("union"), "union" }, + { STRLEN("unsigned"), "unsigned" }, + { STRLEN("void"), "void" }, + { STRLEN("volatile"), "volatile" }, + { STRLEN("while"), "while" }, + { STRLEN("xor"), "xor" }, + { STRLEN("xor_eq"), "xor_eq" }, + /**/ + { 0, NULL } +}; + +Word * +find_member(Word *table, const char *string) +{ + Word *w; + for (w = table; w->length != 0; w++) { + if (strncmp(string, w->word, w->length) == 0 + && !isalnum(string[w->length]) && string[w->length] != '_') + return w; + } + return NULL; +} + +size_t +read_line(char *buf, size_t size) +{ + int ch; + size_t length; + + if (buf == NULL || size == 0) + return 0; + + for (size--, length = 0; length < size; ) { + if ((ch = fgetc(stdin)) == EOF) + break; + if (ch == '\0') + ch = ' '; + buf[length++] = ch; + if (ch == '\n') + break; + } + + buf[length] = '\0'; + + return length; +} + +/* + * Count octets and strip comments. The stripped C input is sent to + * standard output. If -s is set, then suppress the source output. + * The various counters are sent to standard error. + * + * The counter output format is: + * + * lcount wcount bcount icount isaved rcount rsaved + * + * where + * lcount line count (same as wc) + * wcount word count (same as wc) + * bcount byte count (same as wc) + * icount IOCCC secondary size rule count + * isaved bytes saved by secondary size rule (bcount - icount) + * rcount number of C reserved words + * rsaved number of octets saved with -r + */ +int +count(int flags) +{ + Word *w; + int span; + char *p, buf[BUFFER_SIZE+1]; + int lcount, wcount, bcount; + int is_comment, is_word, dquote, escape; + int count, keywords, saved, kw_saved; + + /* Start of buffer sentinel. */ + buf[0] = ' '; + buf[BUFFER_SIZE] = 0; /* paranoia */ + + count = saved = 0; + keywords = kw_saved = 0; + lcount = wcount = bcount = 0; + is_comment = is_word = dquote = escape = 0; + + /* + * "no matter how well you may think you understand this code, + * you don't, so don't mess with it." :-) + */ + while (0 < read_line(buf+1, sizeof (buf)-1)) { + if (!(flags & FLAG_KEEP)) { + /* Leading whitespace before comment block? */ + span = strspn(buf+1, "\t "); + + /* Split / * across reads? */ + if (buf[1+span] == '/' && buf[2+span] == '\0') { + (void) ungetc('/', stdin); + continue; + } + + /* no comment is a comment */ + if (buf[1+span] == '/' && buf[2+span] == '/') + continue; + if (buf[1+span] == '/' && buf[2+span] == '*') { + /* Strip leading whitespace before comment block. */ + is_comment = 1; + } + } + + for (p = buf+1; *p != '\0'; p++) { + /* Within quoted string? */ + if (dquote) { + /* Escape _this_ character. */ + if (escape) + escape = 0; + + /* Escape next character. */ + else if (*p == '\\') + escape = 1; + + /* Close quoted string? */ + else if (*p == '"') + dquote = 0; + } + + /* Not quote string. */ + else { + /* In C comment block? */ + if (is_comment) { + /* Split * / across reads? */ + if (*p == '*' && p[1] == '\0') { + ungetc('*', stdin); + break; + } + + /* End of comment block? */ + if (*p == '*' && p[1] == '/') { + is_comment = 0; + + if (!(flags & FLAG_KEEP)) { + /* Strip whitespace and newline + * trailing closing comment. + */ + p += 1 + strspn(p+2, " \t\r\n"); + } + } + + if (!(flags & FLAG_KEEP)) { + /* Strip octets in comment block. */ + continue; + } + } + + /* Split / / or / * across reads? */ + else if (*p == '/' && p[1] == '\0') { + ungetc('/', stdin); + break; + } + + /* Start of comment line? */ + else if (*p == '/' && p[1] == '/') { + if (!(flags & FLAG_KEEP)) { + /* Strip comment to end of buffer. */ + break; + } + } + + /* Start of comment block? */ + else if (*p == '/' && p[1] == '*') { + /* Begin comment block. */ + is_comment = 1; + + if (!(flags & FLAG_KEEP)) { + /* Strip comment block. */ + p++; + continue; + } + } + + /* C reserved word? */ + else if (!isalnum(p[-1]) && p[-1] != '_' + && (w = find_member(cwords, p)) != NULL) { + keywords++; + if (flags & FLAG_RESERVED) { + bcount += w->length; + if (!is_word) { + is_word = 1; + wcount++; + } + + if (!(flags & FLAG_SILENCE)) + fputs(w->word, stdout); + + /* Count reserved word as one. */ + kw_saved += w->length - 1; + p += w->length - 1; + count++; + continue; + } + } + + /* Open quoted string? */ + else if (*p == '"') { + dquote = 1; + } + } + + if (!(flags & FLAG_SILENCE)) + fputc(*p, stdout); + + bcount++; + if (*p == '\n') + lcount++; + + /* Ignore all whitespace. */ + if (isspace(*p)) { + is_word = 0; + saved++; + continue; + } else if (!is_word) { + is_word = 1; + wcount++; + } + + /* Ignore curly braces and semicolons when followed + * by any whitspace or EOF. + */ + if (strchr("{;}", *p) != NULL + && (isspace(p[1]) || p[1] == '\0')) { + saved++; + continue; + } + + /* Count this octet. */ + count++; + } + } + + /* final count */ + if (flags & FLAG_IOCCC_SIZE) { + /* output the official IOCCC size tool size to standard out */ + printf("%d\n", count); + } else { + /* The Ugly Truth */ + fprintf(stderr, "%d %d %d %d %d %d %d\n", + lcount, wcount, bcount, count, saved, + keywords, kw_saved); + } + return count; +} + +int +main(int argc, char **argv) +{ + int ch; + int this = 0; /* "You are not expected to understand this" :-) */ + + /* parse args */ + while ((ch = getopt(argc, argv, "ikrs")) != -1) { + switch (ch) { + case 'i': + this |= (FLAG_RESERVED | FLAG_SILENCE | + FLAG_IOCCC_SIZE); + break; + case 'k': + this |= FLAG_KEEP; + break; + case 'r': + this |= FLAG_RESERVED; + break; + case 's': + this |= FLAG_SILENCE; + break; + default: + fprintf(stderr, "%s\n", usage); + return 2; + } + } + + /* count as directed - 1 Muha .. 2 Muhaha .. 3 Muhahaha ... */ + (void) count(this); + + /* All Done!!! All Done!!! -- Jessical Noll, age 2 */ + return 0; +} diff --git a/2014/iocccsize.mk b/2014/iocccsize.mk new file mode 100644 index 000000000..f4f4cee69 --- /dev/null +++ b/2014/iocccsize.mk @@ -0,0 +1,71 @@ +.POSIX : + +####################################################################### + +CFLAGS := -pedantic -Wall -std=c99 -g +LDFLAGS := +LIBS := +IT := iocccsize + +####################################################################### + +all: ${IT}$E + +${IT}$E: ${IT}.c + ${CC} ${CFLAGS} -o ${IT}$E ${IT}.c + +# +# Exercise the IOCCC size tool. +# +test: test-k test-wc test-rcount + +# +# -k should pass through the source with block comments intact. +# +test-k: ${IT}$E + @{ t="-k keep comments" ;\ + if ./${IT} -k <${IT}.c 2>/dev/null | diff - ${IT}.c ; then echo "-OK- $$t" ; else echo "FAIL $$t" ; fi ;\ + } + +# +# First 3 counters should match wc(1) +# +test-wc: ${IT}$E + @{ t="wc counts" ;\ + a=$$(./${IT} -s -k <${IT}.c 2>&1 | cut -d' ' -f1-3) ;\ + b=$$(wc ${IT}.c | sed -e's/^ *//; s/ */ /g' | cut -d' ' -f1-3) ;\ + if [ "$$a" = "$$b" ]; then echo "-OK- $$t"; else echo "FAIL $$t: expected '$$b', got '$$a'"; fi ;\ + } + +# +# Show counters for different option combinations. +# +test-show: ${IT}$E + ./${IT} -s <${IT}.c + ./${IT} -s -r <${IT}.c + ./${IT} -s -k <${IT}.c + ./${IT} -s -r -k <${IT}.c + +# +# Reserved word counter should be same for all option combinations. +# +test-rcount: ${IT}$E + @{ t="rcount" ;\ + ./${IT} -s <${IT}.c 2>&1 | cut -d" " -f 6 >/tmp/$$$$.tmp ;\ + ./${IT} -s -r <${IT}.c 2>&1 | cut -d" " -f 6 >>/tmp/$$$$.tmp ;\ + ./${IT} -s -k <${IT}.c 2>&1 | cut -d" " -f 6 >>/tmp/$$$$.tmp ;\ + ./${IT} -s -r -k <${IT}.c 2>&1 | cut -d" " -f 6 >>/tmp/$$$$.tmp ;\ + n=$$(sort -u /tmp/$$$$.tmp | wc -l | sed -e's/^ *//') ;\ + if [ $$n -eq 1 ]; then echo "-OK- $$t"; else echo "FAIL $$t: expected 1 unique line, got $$n"; echo "see make test-show"; fi ;\ + rm -f /tmp/$$$$.tmp ;\ + } + +clean: + rm -f iocccsize.o + rm -rf iocccsize.dSYM + +clobber: clean + rm -f iocccsize + +install: + @echo "no thank you on the install :-)" diff --git a/2014/maffiodo1/Makefile b/2014/maffiodo1/Makefile new file mode 100644 index 000000000..4dfe745da --- /dev/null +++ b/2014/maffiodo1/Makefile @@ -0,0 +1,213 @@ +#!/usr/bin/env make +# +# 2014 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Set SDL_LIBDIR to the directory where the SDL library resides +# +SDL_LIBDIR= $(shell sdl-config --libs) + +# Set SDL_INCDIR to top level directory under where the SDL/SDL.h include file resides +# +SDL_INCDIR= $(shell sdl-config --cflags) + +# Compiler warnings +# +#CWARN= +CWARN= -Wall +#CWARN= -Wall -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= -lSDL + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +DATA= +ALT_OBJ= prog.orig.o +ALT_ENTRY= prog.orig + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} ${SDL_INCDIR} ${SDL_LIBDIR} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +${ALT_ENTRY}: ${ALT_ENTRY}.c + ${CC} ${CFLAGS} ${SDL_INCDIR} ${SDL_LIBDIR} $< -o $@ ${LIBS} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Science!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from failong to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} diff --git a/2014/maffiodo1/giana.level b/2014/maffiodo1/giana.level new file mode 100644 index 000000000..f6d7640c7 --- /dev/null +++ b/2014/maffiodo1/giana.level @@ -0,0 +1,162 @@ +0 276 46 2 0 0 +24 276 46 2 0 0 +48 276 46 2 0 0 +72 276 46 2 0 0 +96 276 46 2 0 0 +120 276 46 2 0 0 +144 276 46 2 0 0 +168 276 46 2 0 0 +192 276 46 2 0 0 +216 276 46 2 0 0 +240 276 46 2 0 0 +264 276 46 2 0 0 +288 276 46 2 0 0 +312 276 47 2 0 0 + +384 276 45 2 0 0 +408 276 46 2 0 0 +432 276 46 2 0 0 +456 276 46 2 0 0 +480 276 46 2 0 0 +504 276 47 2 0 0 + +456 252 27 2 0 0 +480 252 27 2 0 0 +504 252 27 2 0 0 +480 228 27 2 0 0 +504 228 27 2 0 0 +504 204 27 2 0 0 + +528 132 25 2 0 0 +552 132 25 2 0 0 +576 132 25 2 0 0 +600 132 25 2 0 0 +624 132 25 2 0 0 +648 132 25 2 0 0 + +576 200 39 64 0 0 +600 200 39 64 0 0 +624 200 39 64 0 0 + +576 224 39 64 0 0 +600 224 39 64 0 0 +624 224 39 64 0 0 + +672 132 27 2 0 0 +672 108 25 2 0 0 + +672 276 45 2 0 0 +696 276 46 2 0 0 +720 276 46 2 0 0 +744 276 46 2 0 0 +768 276 46 2 0 0 +792 276 46 2 0 0 +816 276 46 2 0 0 +840 276 46 2 0 0 +864 276 46 2 0 0 +888 276 46 2 0 0 +912 276 46 2 0 0 +936 276 46 2 0 0 +960 276 46 2 0 0 +984 276 46 2 0 0 + +792 180 25 2 0 0 +816 180 27 2 0 0 +816 156 25 2 0 0 +840 156 27 2 0 0 +840 132 25 2 0 0 +864 132 25 2 0 0 +888 132 25 2 0 0 +912 132 25 2 0 0 +936 132 25 2 0 0 +960 132 25 2 0 0 +984 132 25 2 0 0 + +936 84 33 0 0 0 +960 84 34 0 0 0 +984 84 35 0 0 0 +936 108 41 0 0 0 +960 108 42 0 0 0 +960 108 42 16 0 0 +984 108 43 0 0 0 + +696 252 30 2 0 0 +720 252 31 2 0 0 +696 228 30 2 0 0 +720 228 31 2 0 0 + +96 204 25 130 0 0 +120 204 26 4 8 19 +144 204 25 2 0 0 +168 204 26 4 64 39 +192 204 26 4 64 39 +216 204 25 2 0 0 + +24 60 28 0 0 0 +48 60 29 0 0 0 + +48 120 28 0 0 0 +72 120 29 0 0 0 + +140 90 28 0 0 0 +164 90 29 0 0 0 + +192 40 28 0 0 0 +216 40 29 0 0 0 + +384 120 28 0 0 0 +408 120 29 0 0 0 + +442 20 28 0 0 0 +466 20 29 0 0 0 + +744 90 28 0 0 0 +768 90 29 0 0 0 + +792 40 28 0 0 0 +816 40 29 0 0 0 + +192 132 26 4 64 39 +216 132 25 2 0 0 +240 132 25 2 0 0 +264 132 25 2 0 0 + +528 60 26 4 64 39 +552 60 26 4 64 39 + +332 84 25 2 0 0 +356 84 27 2 0 0 +356 60 25 2 0 0 +380 60 25 2 0 0 +404 60 25 2 0 0 + +356 0 39 64 0 0 +380 0 39 64 0 0 +404 0 39 64 0 0 + +48 252 22 0 0 0 +72 252 23 0 0 0 + +730 252 22 0 0 0 +754 252 23 0 0 0 + +144 252 20 0 0 0 +168 252 21 0 0 0 + +900 252 20 0 0 0 +924 252 21 0 0 0 + +384 252 20 0 0 0 +408 252 21 0 0 0 + +240 252 17 1 1 0 + +202 108 17 1 1 0 + +624 108 17 1 -1 0 + +800 252 17 1 1 0 + +16 252 0 0 0 0 + +-1 -1 -1 -1 -1 -1 \ No newline at end of file diff --git a/2014/maffiodo1/giana.rgba b/2014/maffiodo1/giana.rgba new file mode 100644 index 000000000..b3fc837c7 Binary files /dev/null and b/2014/maffiodo1/giana.rgba differ diff --git a/2014/maffiodo1/giana8.wav b/2014/maffiodo1/giana8.wav new file mode 100644 index 000000000..5cf3f20dd Binary files /dev/null and b/2014/maffiodo1/giana8.wav differ diff --git a/2014/maffiodo1/hint.html b/2014/maffiodo1/hint.html new file mode 100644 index 000000000..3098e95a6 --- /dev/null +++ b/2014/maffiodo1/hint.html @@ -0,0 +1,329 @@ + + + + + + + Homage to a classic game + + +

    Homage to a classic game

    + +

    Sandro Maffiodo
    +smaffer@gmail.com
    +http://www.assezeta.com/sandromaffiodo

    + +

    Judges' comments:

    + +

    To build:

    + +
    make
    +
    + +

    To run:

    + +
    cat mario.level | ./prog 320 200 800 300 128 144 mario.rgba mario8.wav 10343679
    +
    + +

    Try:

    + +
    cat giana.level | ./prog 320 200 1000 300 192 168 giana.rgba giana8.wav 5459393
    +
    +cat mario.level | ./prog 320 200 800 300 128 144 mario.rgba mario8.wav 10343679 && telnet towel.blinkenlights.nl
    +
    + +

    Selected Judges Remarks:

    + +

    A classic for a particular generation. Like all good programs, being data +driven means you can do fun things in small spaces.

    + +

    Author’s comments:

    + +

    Remarks

    + +

    Use tabsize=4 to see the magic

    + +
    ./expand -t 4 < prog.c
    +
    + +

    The program returns 0 if the user win or not-zero if loose so you can test it and make something useful (or not), like that:

    + +
    cat mario.level | ./prog 320 200 800 300 128 144 mario.rgba mario8.wav 10343679 && telnet towel.blinkenlights.nl
    +
    + +

    This is an engine for Platform Games. It can be used to create games like the legendary Super Mario Bros. +With this simple and clear sourcecode you can create all the games you want, for free!

    + +

    In my two tests i tried to create one level of Super Mario Bros and one of The Great Giana The Sisters. +Both games are classic platform games and both share the same fundamental rules:

    + +
      +
    • there is a player
    • +
    • there is a powerup that can change the look of the player and/or give to him/her more power!
    • +
    • there are walls, floors and ceilings. the player can move and jump over these type of obstacles but cannot walk through them
    • +
    • there are enemies and, if the player collides with an enemy, the player dies or loses its powers
    • +
    + + +

    Regards running under Mac OS X

    + +

    The color of the sky is wrong on MacOS. You need to flip some bytes from the last parameter of the program:

    + +
    MARIO LAST PARAMETER: 4292124159
    +
    +GIANA LAST PARAMETER: 3243070463
    +
    + +

    Regarding how to compile

    + +

    The code requires libSDL1.X.

    + +

    The build process will generate some warnings (60~ on clang) about:

    + +
      +
    • incompatible pointer types: because all pointers are declared to int or char, to save tokens
    • +
    • type specifier missing, defaults to ‘int’: because i need to save tokens
    • +
    • using the result of an assignment as a condition without parentheses: because while(c=getchar()) is not evil
    • +
    + + +

    How it works

    + +

    Parameters

    + +
      +
    1. Window width
    2. +
    3. Window height
    4. +
    5. Level width
    6. +
    7. Level height
    8. +
    9. Sprites image width
    10. +
    11. Sprites image height
    12. +
    13. Filename of the sprites image (raw RGBA image)
    14. +
    15. Filename of the music (WAVE 8000 Hz 8bit Mono)
    16. +
    17. Sky color. This number depends on the system where you run the program. See NOTE on MacOS
    18. +
    + + +

    Sprites

    + +

    The program read a single image that contains all the game sprites. The image must be a grid of 8xN sprites. The size of a single sprite must be square. The program calculates the size in this way:

    + +
    sprite_size = image_width / 8
    +
    + +

    Each sprite is identified by its position inside the grid, counting line by line, from left to right (for example sprite 0 is the top left sprite in the grid, sprite 8 is the first sprite of the second row of the grid).

    + +

    Some positions of the grid have a predefined purpose:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Position Description
    0 Player stand right
    1 Player walk right frame 0
    2 Player walk right frame 1
    3 Player jump right
    4 Player stand left
    5 Player walk left frame 0
    6 Player walk left frame 1
    7 Player jump left
    8 (second row) Super player stand right
    9 Super player walk right frame 0
    10 Super player walk right frame 1
    11 Super player jump right
    12 Super player stand left
    13 Super player walk left frame 0
    14 Super player walk left frame 1
    15 Super player jump left
    24 Player dead
    32 Player win
    40 Super player win
    + + +

    All the others sprites can be used as you want, depending on the game you want to create.

    + +

    Levels

    + +

    The program reads the level description from stdin.

    + +

    The level description is a sequence of rows where each row describe an object. You can input as many objects as you want but the maximum number of objects handled by the program is 333. You can modify this value by editing the source here:

    + +
    C[333*7],d=333;
    +
    + +

    Each row have six columns:

    + +
      +
    1. Screen X: x position of the object in the level
    2. +
    3. Screen Y: y position of the object in the level
    4. +
    5. Sprite: id of the sprite to be used for the object
    6. +
    7. CLASSFLAGS: a bitmask that describe how the object behaves
    8. +
    9. CLASSPARAM0: a parameter that depends on CLASSFLAGS
    10. +
    11. CLASSPARAM1: a parameter that depends on CLASSFLAGS
    12. +
    + + +

    CLASSFLAGS must be a combination (bitwise or) of some of these constants:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NAME CONSTANT CLASS
    ENEMY 1 An enemy. CLASSPARAM0 can be 0 if the enemy don’t move, 1 if the initial move direction is right, -1 if direction is left. All enemies that walk will change its direction after 20 pixels. The sprite of an enemy must have 2 others adjacent sprites: SPRITE-1, used when the enemy die, and SPRITE+1, used when it walks
    BLOCK 2 A wall. Player can walk over the object but can not pass through it
    GIFT BLOCK 4 When the player hits the object from below, a new object is created. CLASSFLAGS of the new object is defined in CLASSPARAM0. The sprite used for the new object is defined in CLASSPARAM1. The sprite of the gift object must have an adjacent sprite: SPRITE+1, used when the block is hit
    POWERUP 8 This is the classic Mario’s mushroom. When the player hit the powerup object, the player become Super player. If CLASSFLAGS has the bit ZOOM, the player height will be doubled.
    The Super player can hit the enemies without die, but when this happens, the Super player goes back to being normal
    END 16 When the player hits this object the level ends. Player win
    ZOOM 32 This flag can be used with POWERUP to indicate a powerup that will doubles the size of the player (like Mario’s mushroom)
    DESTROY 64 When the player hits the object the object disappear. This is the classic Mario’s coin, but the engine does not counts the points, so, from the user point of view, this object is useless
    DESTROYUP 128 This object is like a BLOCK but when the player hits the object from below, the object disappear
    + + +

    If CLASSFLAGS is zero the object has only an aesthetic function.

    + +

    The last row of the level descriptor must have all its columns set equal to -1.

    + +

    Limitations

    + +

    Some classical features are missing: throw objects, shoot, multiple lives, points counter. You can add those features if you want!

    + +

    The program allow to run one level only. It’s easy to add a menu and multiple levels but the size of the engine will grow too much.

    + +

    When the Super player become bigger (ZOOM flag), the player can collide with blocks and get stuck inside them. This is a KNOWN BUG. When your player become bigger, stay away from blocks!

    + +

    There is one audio track only (game effects are missing).

    + +

    Credits

    + +

    Some of the sprites used in the examples are identical to those of the original games, others were designed by me.

    + +

    The music used in the examples have been resampled, starting from the original versions for the Commodore Amiga and Nintendo NES.

    + +

    Super Mario Bros is a game created by Nintendo Entertainment, my use of the sprites does not intend to infringe the intellectual property of Nintendo but only demonstrate the operation of the program. From my point of view this is a tribute to the legendary game Super Mario Bros!

    + +

    The Great Giana The Sisters is the game created by Time Warp Productions and also for this game worth my previous notes. Long live The Great Giana The Sisters !! :)

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2014/maffiodo1/hint.text b/2014/maffiodo1/hint.text new file mode 100644 index 000000000..15b5162dd --- /dev/null +++ b/2014/maffiodo1/hint.text @@ -0,0 +1,177 @@ +# Homage to a classic game + +Sandro Maffiodo + + + + +## Judges' comments: +### To build: + + make + +### To run: + + cat mario.level | ./prog 320 200 800 300 128 144 mario.rgba mario8.wav 10343679 + +### Try: + + cat giana.level | ./prog 320 200 1000 300 192 168 giana.rgba giana8.wav 5459393 + + cat mario.level | ./prog 320 200 800 300 128 144 mario.rgba mario8.wav 10343679 && telnet towel.blinkenlights.nl + +### Selected Judges Remarks: + +A classic for a particular generation. Like all good programs, being data +driven means you can do fun things in small spaces. + +## Author's comments: +### Remarks + +Use tabsize=4 to see the magic + + ./expand -t 4 < prog.c + +The program returns 0 if the user win or *not-zero* if loose so you can test it and make something useful (or not), like that: + + cat mario.level | ./prog 320 200 800 300 128 144 mario.rgba mario8.wav 10343679 && telnet towel.blinkenlights.nl + +This is an engine for **Platform Games**. It can be used to create games like the legendary [Super Mario Bros](http://en.wikipedia.org/wiki/Super_Mario_Bros.). +With this simple and clear sourcecode you can create all the games you want, for free! + +In my two tests i tried to create one level of [Super Mario Bros](http://en.wikipedia.org/wiki/Super_Mario_Bros.) and one of [The Great Giana The Sisters](http://en.wikipedia.org/wiki/The_Great_Giana_Sisters). +Both games are classic *platform games* and both share the same fundamental rules: + +- there is a player +- there is a powerup that can change the look of the player and/or give to him/her more power! +- there are walls, floors and ceilings. the player can move and jump over these type of obstacles but cannot walk through them +- there are enemies and, if the player collides with an enemy, the player dies or loses its powers + +### Regards running under Mac OS X + +The color of the sky is wrong on MacOS. You need to flip some bytes from the last parameter of the program: + + MARIO LAST PARAMETER: 4292124159 + + GIANA LAST PARAMETER: 3243070463 + +### Regarding how to compile + +The code requires libSDL1.X. + +The build process will generate some warnings (60~ on clang) about: + +- **incompatible pointer types**: because all pointers are declared to *int* or *char*, to save tokens +- **type specifier missing, defaults to 'int'**: because i need to save tokens +- **using the result of an assignment as a condition without parentheses**: because while(c=getchar()) is not evil + +### How it works + +## Parameters + +1. Window width +2. Window height +3. Level width +4. Level height +5. Sprites image width +6. Sprites image height +7. Filename of the sprites image (raw RGBA image) +8. Filename of the music (WAVE 8000 Hz 8bit Mono) +9. Sky color. This number depends on the system where you run the program. See **NOTE on MacOS** + +## Sprites + +The program read a single image that contains all the game sprites. The image must be a grid of 8xN sprites. The size of a single sprite must be square. The program calculates the size in this way: + + sprite_size = image_width / 8 + +Each sprite is identified by its position inside the grid, counting line by line, from left to right (for example sprite 0 is the top left sprite in the grid, sprite 8 is the first sprite of the second row of the grid). + +Some positions of the grid have a predefined purpose: + +Position | Description +:-----------------|:-------------- +0 | Player stand right +1 | Player walk right frame 0 +2 | Player walk right frame 1 +3 | Player jump right +4 | Player stand left +5 | Player walk left frame 0 +6 | Player walk left frame 1 +7 | Player jump left +8 *(second row)* | Super player stand right +9 | Super player walk right frame 0 +10 | Super player walk right frame 1 +11 | Super player jump right +12 | Super player stand left +13 | Super player walk left frame 0 +14 | Super player walk left frame 1 +15 | Super player jump left +24 | Player dead +32 | Player win +40 | Super player win + +All the others sprites can be used as you want, depending on the game you want to create. + +## Levels + +The program reads the level description from **stdin**. + +The level description is a sequence of rows where each row describe an object. You can input as many objects as you want but the maximum number of objects handled by the program is 333. You can modify this value by editing the source here: + + C[333*7],d=333; + +Each row have six columns: + +1. Screen X: x position of the object in the level +2. Screen Y: y position of the object in the level +3. Sprite: id of the sprite to be used for the object +4. CLASSFLAGS: a bitmask that describe how the object behaves +5. CLASSPARAM0: a parameter that depends on CLASSFLAGS +6. CLASSPARAM1: a parameter that depends on CLASSFLAGS + +CLASSFLAGS must be a combination (bitwise or) of some of these constants: + +NAME | CONSTANT | CLASS +:----------|:----------|:--------- +ENEMY | 1 | An enemy. CLASSPARAM0 can be 0 if the enemy don't move, 1 if the initial move direction is right, -1 if direction is left. All enemies that walk will change its direction after 20 pixels. The sprite of an enemy must have 2 others adjacent sprites: SPRITE-1, used when the enemy die, and SPRITE+1, used when it walks +BLOCK | 2 | A wall. Player can walk over the object but can not pass through it +GIFT BLOCK | 4 | When the player hits the object from below, a new object is created. CLASSFLAGS of the new object is defined in CLASSPARAM0. The sprite used for the new object is defined in CLASSPARAM1. The sprite of the gift object must have an adjacent sprite: SPRITE+1, used when the block is hit +POWERUP | 8 | This is the classic Mario's mushroom. When the player hit the powerup object, the player become *Super player*. If CLASSFLAGS has the bit ZOOM, the player height will be doubled.
    The *Super player* can hit the enemies without die, but when this happens, the *Super player* goes back to being normal +END | 16 | When the player hits this object the level ends. Player win +ZOOM | 32 | This flag can be used with POWERUP to indicate a powerup that will doubles the size of the player (like Mario's mushroom) +DESTROY | 64 | When the player hits the object the object disappear. This is the classic Mario's coin, but the engine does not counts the points, so, from the user point of view, this object is useless +DESTROYUP | 128 | This object is like a BLOCK but when the player hits the object from below, the object disappear + +If CLASSFLAGS is zero the object has only an aesthetic function. + +The last row of the level descriptor must have all its columns set equal to -1. + +### Limitations + +Some classical features are missing: throw objects, shoot, multiple lives, points counter. You can add those features if you want! + +The program allow to run one level only. It's easy to add a menu and multiple levels but the size of the engine will grow too much. + +When the *Super player* become bigger (ZOOM flag), the player can collide with blocks and get stuck inside them. This is a KNOWN BUG. When your player become bigger, stay away from blocks! + +There is one audio track only (game effects are missing). + +### Credits + +Some of the sprites used in the examples are identical to those of the original games, others were designed by me. + +The music used in the examples have been resampled, starting from the original versions for the [Commodore Amiga](http://en.wikipedia.org/wiki/Amiga) and [Nintendo NES](http://en.wikipedia.org/wiki/Nintendo_Entertainment_System). + +[Super Mario Bros](http://en.wikipedia.org/wiki/Super_Mario_Bros.) is a game created by Nintendo Entertainment, my use of the sprites does not intend to infringe the intellectual property of Nintendo but only demonstrate the operation of the program. From my point of view this is a tribute to the legendary game [Super Mario Bros](http://en.wikipedia.org/wiki/Super_Mario_Bros.)! + +[The Great Giana The Sisters](http://en.wikipedia.org/wiki/The_Great_Giana_Sisters) is the game created by Time Warp Productions and also for this game worth my previous notes. Long live [The Great Giana The Sisters](http://en.wikipedia.org/wiki/The_Great_Giana_Sisters) !! :) + +-------------------------------------------------------------------------------- + diff --git a/2014/maffiodo1/mario.level b/2014/maffiodo1/mario.level new file mode 100644 index 000000000..1b76a9020 --- /dev/null +++ b/2014/maffiodo1/mario.level @@ -0,0 +1,205 @@ +0 284 34 2 0 0 +16 284 34 2 0 0 +32 284 34 2 0 0 +48 284 34 2 0 0 +64 284 34 2 0 0 +80 284 34 2 0 0 +96 284 34 2 0 0 +112 284 34 2 0 0 +128 284 34 2 0 0 +144 284 34 2 0 0 +160 284 34 2 0 0 +176 284 34 2 0 0 +192 284 34 2 0 0 +208 284 34 2 0 0 +224 284 34 2 0 0 +240 284 34 2 0 0 +256 284 34 2 0 0 +272 284 35 2 0 0 + +112 268 30 1 1 0 + +320 284 41 2 0 0 + +352 284 41 2 0 0 + +400 284 33 2 0 0 +416 284 34 2 0 0 +432 284 34 2 0 0 +448 284 34 2 0 0 +464 284 34 2 0 0 +480 284 34 2 0 0 +496 284 34 2 0 0 +512 284 34 2 0 0 +528 284 34 2 0 0 +544 284 34 2 0 0 +560 284 34 2 0 0 +576 284 34 2 0 0 +592 284 35 2 0 0 + +624 148 49 2 0 0 +624 164 49 2 0 0 +624 180 49 2 0 0 +640 180 49 2 0 0 +624 196 49 2 0 0 +640 196 49 2 0 0 +656 196 49 2 0 0 +624 212 50 2 0 0 +640 212 50 2 0 0 +656 212 50 2 0 0 + +672 284 53 2 0 0 +688 284 53 2 0 0 +704 284 53 2 0 0 +720 284 53 2 0 0 +736 284 53 2 0 0 +752 284 53 2 0 0 +768 284 53 2 0 0 +784 284 53 2 0 0 + +32 148 64 0 0 0 +48 148 66 0 0 0 + +80 92 64 0 0 0 +96 92 66 0 0 0 + +112 132 64 0 0 0 +128 132 65 0 0 0 +144 132 66 0 0 0 + +176 92 64 0 0 0 +192 92 65 0 0 0 +208 92 66 0 0 0 + +224 152 64 0 0 0 +240 152 66 0 0 0 + +240 32 64 0 0 0 +256 32 66 0 0 0 + +320 92 64 0 0 0 +336 92 66 0 0 0 + +384 108 64 0 0 0 +400 108 65 0 0 0 +416 108 66 0 0 0 + +416 32 64 0 0 0 +432 32 66 0 0 0 + +288 196 25 2 0 0 +304 196 25 2 0 0 +320 196 25 130 0 0 +336 196 25 2 0 0 +352 196 25 2 0 0 + +350 180 30 1 -1 0 + +512 66 51 2 0 0 +528 66 52 2 0 0 +544 66 50 2 0 0 +560 66 51 2 0 0 +576 66 52 2 0 0 +592 66 50 2 0 0 + +544 50 38 1 1 0 + +576 106 64 0 0 0 +592 106 66 0 0 0 + +522 156 43 2 0 0 +538 156 44 2 0 0 + +448 196 25 2 0 0 +464 196 25 2 0 0 +480 196 25 2 0 0 + +400 156 43 2 0 0 +416 156 44 2 0 0 + +452 108 43 2 0 0 +468 108 44 2 0 0 + +192 228 25 130 0 0 +208 228 26 4 64 36 +224 228 25 2 0 0 +240 228 26 4 40 28 + +304 140 27 2 0 0 +320 140 26 4 64 36 +336 140 27 2 0 0 + +0 268 69 0 0 0 +16 268 70 0 0 0 +32 268 71 0 0 0 + +176 268 69 0 0 0 +192 268 71 0 0 0 + +432 268 69 0 0 0 +448 268 70 0 0 0 +464 268 71 0 0 0 + +64 228 26 4 64 36 +80 228 25 2 0 0 +96 228 25 2 0 0 + +512 268 54 2 0 0 +528 268 55 2 0 0 +512 252 46 2 0 0 +528 252 47 2 0 0 + +400 228 26 4 40 28 + +464 268 38 1 -1 0 + +512 268 54 2 0 0 +528 268 55 2 0 0 +512 252 46 2 0 0 +528 252 47 2 0 0 + +640 16 64 0 0 0 +656 16 65 0 0 0 +672 16 66 0 0 0 + +672 106 50 2 0 0 +688 106 51 2 0 0 +704 106 52 2 0 0 +720 106 50 2 0 0 +736 106 51 2 0 0 +752 106 52 2 0 0 +768 106 50 2 0 0 +784 106 50 2 0 0 + +778 90 38 1 -1 0 +680 90 38 1 1 0 + +720 50 26 4 64 36 +736 50 27 2 0 0 +752 50 26 4 64 36 + +704 268 25 0 0 0 +720 268 25 0 0 0 +736 268 68 0 0 0 +736 268 68 16 0 0 +752 268 25 0 0 0 +768 268 25 0 0 0 +704 252 25 0 0 0 +720 252 25 0 0 0 +736 252 67 0 0 0 +752 252 25 0 0 0 +768 252 25 0 0 0 +704 236 45 0 0 0 +720 236 45 0 0 0 +736 236 45 0 0 0 +752 236 45 0 0 0 +768 236 45 0 0 0 +700 220 56 0 0 0 +720 220 56 0 0 0 +736 220 56 0 0 0 +752 220 56 0 0 0 +771 220 56 0 0 0 + +16 268 0 0 0 0 + +-1 -1 -1 -1 -1 -1 \ No newline at end of file diff --git a/2014/maffiodo1/mario.rgba b/2014/maffiodo1/mario.rgba new file mode 100644 index 000000000..284750a3f Binary files /dev/null and b/2014/maffiodo1/mario.rgba differ diff --git a/2014/maffiodo1/mario8.wav b/2014/maffiodo1/mario8.wav new file mode 100644 index 000000000..d075f8b14 Binary files /dev/null and b/2014/maffiodo1/mario8.wav differ diff --git a/2014/maffiodo1/prog.c b/2014/maffiodo1/prog.c new file mode 100644 index 000000000..e3ab3d27a --- /dev/null +++ b/2014/maffiodo1/prog.c @@ -0,0 +1,72 @@ + #include /*!!TAB=4!*/ + #include /*{{IOCCC2}}*/ + #define b/*{{IOCCC257}}*/ if ( + #define a(b, c) for (b = 0 ; /*IOCCC/2014*/bI?I:m); a(X,0){ b Z(X + ,m,n,o)){ bg=B&1; b D&&bg) continue; + m-=be; n-=bf; b B&8){ u[-1]=0; j=1; bc(8); b B&32){ n-= i; + o=i*2; } } b B&16&&!O){ bc(32+(o>i?8:0)); Y(); u[- 1]=0; } + b(B&128&&bf&&s<0)||(B&64))u[-1]=0; b bg&&!O){ b bf&&s >0){ + u[2]--; u[3]=bf=0; s=-6; } else { b j){ bc(0); b o>i) n+=o=i; D=30; j=0; + } else { bc(24); Y(); L=-1; } } } b B&4){ b bf&&s<0){ int I[]={ x,y-i,u[ + 5],u[4],rand()%2?1:-1,2} ; u[2]++; u[3]=2; ba(I); } } b bf)s=1; break; } + } } bh (m,e,k, bi){ H=k/ 2; G[bi]=m>e-H? k + - e:(m>H?H-m:0 ); } bj(X,be ,bf){ int bk ; + u [0]+=be; u[1 ]+=bf; W(X); E=x,F=y,I=0; a + ( bk,0){ b I=(X!=bk&&Z(bk,E,F,i)&&(B&6 ) + ) )break; } W(X); b I){ b bf)u[1]-=bf; b + be ){ u[0]-=be; u[4]*=-1*be; } } W( X); } + bl (){ int bm=n,X; SDL_FillRect(U,0,M); X=4; while( X + -- )bd(r,0); X=3; while(X--)bd(0,s); b n>h&&!O)Y () ; + t =bm==n; q[0]=m; q[1]=n; bh(m,e,k,0); bh(n,h,l,1) ; + a(X,0){ b W(X)){ b B&9){ bj(X,u[4],0); bj(X,0,2); } b B&1){ *u +=u[4]; b + ++u[5]>20){ u[4]*= -1; u[5]=0; } z+=K + %2?i:0; } J=i; b q ==u){ J=o; b!O){ b + r)z+=i*(K%2); b!t) z=48; z+=p<0?i*4:0 + ; }} b q!=u||!(D&& 0==D%3)){ SDL_Rect + bn={ z,A,i,J} ,bo= { G[0]+x,G[1]+y,i, + J}; SDL_BlitSurface (V,&bn,U,&bo); } } + } b(s+=2)>2)s=2; K ++; D-=D?1:0; b O) + b!-- O) exit(L); } bp(X){ return strtol + (T[X],0,0); } bq(int H , int*br,int bs ){ int bt; + bt=Q-P; b bt>bs) bt= bs; SDL_MixAudio(br,S +P,bt, + 128); P+=bt; b P>=Q)P=0; } SDL_AudioSpec bu={8000 + ,8,1,0,256,0,0,bq} ,bv ; main(int bw,char**bx){ T + + + =bx; int by,H=255, bz=H<<8 ,bA =bz <<8,bB= bA<<8, + bC=bp(5),bD=bp(6); SDL_Event bE; o =i= bC / 8; k = bp(1) + ,l=bp(2),e=bp(3),h =bp (4); M= bp(9); /**/ SDL_Init(/*<2053"*/ + 0xffff ); b!*(char*) &N){ H=bB; bz =bA; bA =bz>>8; + bB=255 ; } U=SDL_SetVideoMode(k,l,0,0); V=/*NES HISTORY + SANDRO */ SDL_CreateRGBSurface(1 <<15 , bC, bD, 32,H,bz + ,bA,bB); fread(V-> pixels,bC*bD*4,1,fopen(T [7],"r" )); SDL_OpenAudio(& + bu,0); SDL_LoadWAV (T[8],& bv,&S,&Q ); /**/ SDL_PauseAudio(0); + for(; ; ){ int u[6 ],*I; H =0 ; while (H < 6) scanf(/*0*/ + "%d ", u+H++); b u[5]< 0)break ; I=ba( + u);b!u [3]){ q =I+1; m =u[0 ]; n=u[1]; + } } for (; ; ){ while/* !MAFFIO DO.S*/( + SDL_PollEvent(&bE) ) { by= bE.type ==3; b!O &&(by|| bE. + type==2)){ I = bE. key/**/ .keysym .sym; b I== 276)r= + by?0:(p=-1); b I== 275 )r= by?0:(p =1); b I==32)by? + + 0:(t?(s=-9):0); b I==27)exit(0); } } bl(); SDL_Flip(U); SDL_Delay(60); } } diff --git a/2014/maffiodo1/prog.orig.c b/2014/maffiodo1/prog.orig.c new file mode 100644 index 000000000..5ab785dfd --- /dev/null +++ b/2014/maffiodo1/prog.orig.c @@ -0,0 +1,72 @@ + #include /*!!TAB=4!*/ + #include /*IOCCC2*/"SDL/SDL.h" + #define b/*{{IOCCC257}}*/ if ( + #define a(b, c) for (b = 0 ; /*IOCCC/2014*/bI?I:m); a(X,0){ b Z(X + ,m,n,o)){ bg=B&1; b D&&bg) continue; + m-=be; n-=bf; b B&8){ u[-1]=0; j=1; bc(8); b B&32){ n-= i; + o=i*2; } } b B&16&&!O){ bc(32+(o>i?8:0)); Y(); u[- 1]=0; } + b(B&128&&bf&&s<0)||(B&64))u[-1]=0; b bg&&!O){ b bf&&s >0){ + u[2]--; u[3]=bf=0; s=-6; } else { b j){ bc(0); b o>i) n+=o=i; D=30; j=0; + } else { bc(24); Y(); L=-1; } } } b B&4){ b bf&&s<0){ int I[]={ x,y-i,u[ + 5],u[4],rand()%2?1:-1,2} ; u[2]++; u[3]=2; ba(I); } } b bf)s=1; break; } + } } bh (m,e,k, bi){ H=k/ 2; G[bi]=m>e-H? k + - e:(m>H?H-m:0 ); } bj(X,be ,bf){ int bk ; + u [0]+=be; u[1 ]+=bf; W(X); E=x,F=y,I=0; a + ( bk,0){ b I=(X!=bk&&Z(bk,E,F,i)&&(B&6 ) + ) )break; } W(X); b I){ b bf)u[1]-=bf; b + be ){ u[0]-=be; u[4]*=-1*be; } } W( X); } + bl (){ int bm=n,X; SDL_FillRect(U,0,M); X=4; while( X + -- )bd(r,0); X=3; while(X--)bd(0,s); b n>h&&!O)Y () ; + t =bm==n; q[0]=m; q[1]=n; bh(m,e,k,0); bh(n,h,l,1) ; + a(X,0){ b W(X)){ b B&9){ bj(X,u[4],0); bj(X,0,2); } b B&1){ *u +=u[4]; b + ++u[5]>20){ u[4]*= -1; u[5]=0; } z+=K + %2?i:0; } J=i; b q ==u){ J=o; b!O){ b + r)z+=i*(K%2); b!t) z=48; z+=p<0?i*4:0 + ; }} b q!=u||!(D&& 0==D%3)){ SDL_Rect + bn={ z,A,i,J} ,bo= { G[0]+x,G[1]+y,i, + J}; SDL_BlitSurface (V,&bn,U,&bo); } } + } b(s+=2)>2)s=2; K ++; D-=D?1:0; b O) + b!-- O) exit(L); } bp(X){ return strtol + (T[X],0,0); } bq(int H , int*br,int bs ){ int bt; + bt=Q-P; b bt>bs) bt= bs; SDL_MixAudio(br,S +P,bt, + 128); P+=bt; b P>=Q)P=0; } SDL_AudioSpec bu={8000 + ,8,1,0,256,0,0,bq} ,bv ; main(int bw,char**bx){ T + + + =bx; int by,H=255, bz=H<<8 ,bA =bz <<8,bB= bA<<8, + bC=bp(5),bD=bp(6); SDL_Event bE; o =i= bC / 8; k = bp(1) + ,l=bp(2),e=bp(3),h =bp (4); M= bp(9); /**/ SDL_Init(/*<2053"*/ + 0xffff ); b!*(char*) &N){ H=bB; bz =bA; bA =bz>>8; + bB=255 ; } U=SDL_SetVideoMode(k,l,0,0); V=/*NES HISTORY + SANDRO */ SDL_CreateRGBSurface(1 <<15 , bC, bD, 32,H,bz + ,bA,bB); fread(V-> pixels,bC*bD*4,1,fopen(T [7],"r" )); SDL_OpenAudio(& + bu,0); SDL_LoadWAV (T[8],& bv,&S,&Q ); /**/ SDL_PauseAudio(0); + for(; ; ){ int u[6 ],*I; H =0 ; while (H < 6) scanf(/*0*/ + "%d ", u+H++); b u[5]< 0)break ; I=ba( + u);b!u [3]){ q =I+1; m =u[0 ]; n=u[1]; + } } for (; ; ){ while/* !MAFFIO DO.S*/( + SDL_PollEvent(&bE) ) { by= bE.type ==3; b!O &&(by|| bE. + type==2)){ I = bE. key/**/ .keysym .sym; b I== 276)r= + by?0:(p=-1); b I== 275 )r= by?0:(p =1); b I==32)by? + + 0:(t?(s=-9):0); b I==27)exit(0); } } bl(); SDL_Flip(U); SDL_Delay(60); } } diff --git a/2014/maffiodo1/screenshot-giana.png b/2014/maffiodo1/screenshot-giana.png new file mode 100644 index 000000000..3bed6fcb9 Binary files /dev/null and b/2014/maffiodo1/screenshot-giana.png differ diff --git a/2014/maffiodo1/screenshot-mario.png b/2014/maffiodo1/screenshot-mario.png new file mode 100644 index 000000000..89bf36e1f Binary files /dev/null and b/2014/maffiodo1/screenshot-mario.png differ diff --git a/2014/maffiodo2/Makefile b/2014/maffiodo2/Makefile new file mode 100644 index 000000000..222fe1615 --- /dev/null +++ b/2014/maffiodo2/Makefile @@ -0,0 +1,204 @@ +#!/usr/bin/env make +# +# 2014 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall +#CWARN= -Wall -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} \ + -Wno-implicit-function-declaration -Wno-implicit-int -Wno-return-type \ + --include string.h + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Science!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from failong to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} diff --git a/2014/maffiodo2/hint.html b/2014/maffiodo2/hint.html new file mode 100644 index 000000000..c37186134 --- /dev/null +++ b/2014/maffiodo2/hint.html @@ -0,0 +1,116 @@ + + + + + + + Most tweetable entry + + +

    Most tweetable entry

    + +

    Sandro Maffiodo
    +smaffer@gmail.com
    +http://www.assezeta.com/sandromaffiodo

    + +

    Judges' comments:

    + +

    To build:

    + +
    make
    +
    + +

    To run:

    + +
    ./prog arg
    +
    + +

    Try:

    + +
    cat image.rgb | ./prog '  .,:;!$#@'
    +
    + +

    Selected Judges Remarks:

    + +

    On the face of it :-) given what this program one might wonder what makes this winner special. +But when you realize the source is small enough to tweet on twitter you understand.

    + +

    Who will be the first to tweet this source? How many re-tweets will such tweet get? +And how many people will really understand the tweet?

    + +

    Author’s comments:

    + +

    Remarks

    + +

    This program convert an image to an ASCII ART. The program reads a raw RGB image from stdin and print the ASCII ART to stdout.

    + +

    The build process will raise some warnings about:

    + +
      +
    • declaration specifier missing, defaulting to ‘int’
    • +
    • implicitly declaring library function
    • +
    + + +

    The program crash if run without parameters.

    + +

    Screen size

    + +

    If you have a terminal geometry than if different from the common 80x25 you can modify the output width by changing the value of the first variable:

    + +
    d=80
    +
    + +

    Something to try

    + +

    Type this:

    + +
    cat image.rgb | ./prog "  .:;Y0"
    +
    + +

    You can use your own image. Convert the image to a raw RGB image, using imagemagick it’s very simple:

    + +
    convert -geometry 80x source.jpg image.rgb
    +
    + +

    This program require one parameter, or crash. The parameter of the program is the convertion ramp. You can use different ramps or create your own (for ex. using some letters of your name). +These are some ramps you can try:

    + +
    ./prog " :1"
    +./prog "  .:;Y0"
    +./prog " .:-=+*#%@"
    +./prog "   .,:!-iots&8%#@$"
    +./prog "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'. "
    +
    + +

    121 byte version

    + +

    An alternative version of this program is only 121bytes long:

    + +
    d=80,e,j;g(){j+=getchar();}main(){for(;;){j=0;g();if(j<0)break;g(g());putchar(" .:#@"[j/3*5>>8]);if(!(++e%d))puts("");}}
    +
    + +

    This alternative version have a fixed ramp. It’s smaller but it’s not so fun to use…

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2014/maffiodo2/hint.text b/2014/maffiodo2/hint.text new file mode 100644 index 000000000..5fe00a231 --- /dev/null +++ b/2014/maffiodo2/hint.text @@ -0,0 +1,81 @@ +# Most tweetable entry + +Sandro Maffiodo + + + + +## Judges' comments: +### To build: + + make + +### To run: + + ./prog arg + +### Try: + + cat image.rgb | ./prog ' .,:;!$#@' + +### Selected Judges Remarks: + +On the face of it :-) given what this program one might wonder what makes this winner special. +But when you realize the source is small enough to tweet on twitter you understand. + +Who will be the first to tweet this source? How many re-tweets will such tweet get? +And how many people will really understand the tweet? + +## Author's comments: +### Remarks + +This program convert an image to an ASCII ART. The program reads a raw RGB image from **stdin** and print the ASCII ART to **stdout**. + +The build process will raise some warnings about: + +- declaration specifier missing, defaulting to 'int' +- implicitly declaring library function + +The program crash if run without parameters. + +### Screen size + +If you have a terminal geometry than if different from the common 80x25 you can modify the *output width* by changing the value of the first variable: + + d=80 + +### Something to try + +Type this: + + cat image.rgb | ./prog " .:;Y0" + +You can use your own image. Convert the image to a raw RGB image, using imagemagick it's very simple: + + convert -geometry 80x source.jpg image.rgb + +This program require one parameter, or crash. The parameter of the program is the *convertion ramp*. You can use different ramps or create your own (for ex. using some letters of your name). +These are some ramps you can try: + + ./prog " :1" + ./prog " .:;Y0" + ./prog " .:-=+*#%@" + ./prog " .,:!-iots&8%#@$" + ./prog "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'. " + +### 121 byte version + +An alternative version of this program is only 121bytes long: + + d=80,e,j;g(){j+=getchar();}main(){for(;;){j=0;g();if(j<0)break;g(g());putchar(" .:#@"[j/3*5>>8]);if(!(++e%d))puts("");}} + +This alternative version have a **fixed ramp**. It's smaller but it's not so fun to use... + +-------------------------------------------------------------------------------- + diff --git a/2014/maffiodo2/image.rgb b/2014/maffiodo2/image.rgb new file mode 100644 index 000000000..90b594125 Binary files /dev/null and b/2014/maffiodo2/image.rgb differ diff --git a/2014/maffiodo2/prog.c b/2014/maffiodo2/prog.c new file mode 100644 index 000000000..67c35c387 --- /dev/null +++ b/2014/maffiodo2/prog.c @@ -0,0 +1 @@ +d=80,e,j;g(){j+=getchar();}main(a,b)char**b;{for(;;){j=0;g();if(j<0)break;g(g());putchar(b[1][j/3*strlen(b[1])>>8]);if(!(++e%d))puts("");}} diff --git a/2014/morgan/Makefile b/2014/morgan/Makefile new file mode 100644 index 000000000..7ea3f6270 --- /dev/null +++ b/2014/morgan/Makefile @@ -0,0 +1,205 @@ +#!/usr/bin/env make +# +# 2014 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -pedantic +CWARM= -Wall -Wextra -pedantic -Wshadow + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} \ + -Wno-empty-body -Wno-logical-op-parentheses -Wno-int-conversion + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + ${RM} -f morgan + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Science!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from failong to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} diff --git a/2014/morgan/hint.html b/2014/morgan/hint.html new file mode 100644 index 000000000..3d8ebfd69 --- /dev/null +++ b/2014/morgan/hint.html @@ -0,0 +1,128 @@ + + + + + + + Most likely to succeed + + +

    Most likely to succeed

    + +

    Yves-Marie Morgan
    +yves-marie.morgan@parrot.com

    + +

    Judges' comments:

    + +

    To build:

    + +
    make
    +
    + +

    To run:

    + +
    ./prog [arg ..]
    +
    + +

    Try:

    + +
    make
    +cp -f prog morgan
    +./morgan clobber
    +ls
    +
    +./morgan all install
    +ls
    +
    +./prog love haste waste supernova
    +ls
    +
    +make
    +./prog magic
    +ls
    +
    + +

    Selected Judges Remarks:

    + +

    Think of this as a Maker Faire’s make. :-)

    + +

    It works reasomably well. While not super ultra-featured, it does fair well with the Makefile we supplied. +Not only that, it helped uncover a bug we had in our special Makefile rules.

    + +

    Author’s comments:

    + +

    Remarks

    + +

    This program is a tiny make clone.

    + +

    It is able to parse a subset of the make syntax and will execute rules for +goals given in arguments if they need to (based on timestamp of dependencies +of rule targets).

    + +

    Supported features

    + +
      +
    • Variable assignments (only recursive ones). Variable references with recursion.
    • +
    • Environment variables are available.
    • +
    • It is possible to specify variables in command line: name=value.
    • +
    • Variables given in command line will have precedence over variables defined +in makefile, which will have precedence over environment variables.
    • +
    • If no goal given in command line, the first target defined will be used.
    • +
    • Comments, escaped comments, escaped new lines.
    • +
    + + +

    It should be able to build programs of previous years with the provided Makefile +found in previous contest archives. Simply use this program instead of make. +It will recursively use itself for submake (the MAKE= assignment inside +Makefile will be ignored to continue using itself).

    + +

    Limitations / Known issues

    + +
      +
    • There is a lot of memory leak (not a single free).
    • +
    • The opened file is not closed.
    • +
    • The input file shall be named Makefile.
    • +
    • No diagnostic message, but the exit status is non zero to indicates failure +(failed command in a rule or missing target).
    • +
    • Only $< and $@ are supported for automatic variables in commands.
    • +
    • No parallel execution (-j option).
    • +
    • No := += ?= syntax for variable assignment.
    • +
    • No built-in function available.
    • +
    • No pattern targets.
    • +
    • No pattern substitution variables.
    • +
    • No built-in rules.
    • +
    • No built-in variables (except the one from environment).
    • +
    • No conditional directives.
    • +
    + + +

    Compilation warnings

    + +

    with gcc 4.8.2 on Linux Ubuntu 14.04 64-bit : +* prog.c:22:15: warning: return makes integer from pointer without a cast [enabled by default] +* prog.c:23:72: warning: signed and unsigned type in conditional expression [-Wsign-compare] +* prog.c:12:11: warning: suggest parentheses around ‘&&’ within ‘||’ [-Wparentheses]

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2014/morgan/hint.text b/2014/morgan/hint.text new file mode 100644 index 000000000..a92e362bf --- /dev/null +++ b/2014/morgan/hint.text @@ -0,0 +1,96 @@ +# Most likely to succeed + +Yves-Marie Morgan + + + +## Judges' comments: +### To build: + + make + +### To run: + + ./prog [arg ..] + +### Try: + + make + cp -f prog morgan + ./morgan clobber + ls + + ./morgan all install + ls + + ./prog love haste waste supernova + ls + + make + ./prog magic + ls + +### Selected Judges Remarks: + +Think of this as a Maker Faire's make. :-) + +It works reasomably well. While not super ultra-featured, it does fair well with the Makefile we supplied. +Not only that, it helped uncover a bug we had in our special Makefile rules. + +## Author's comments: +### Remarks + +This program is a tiny `make` clone. + +It is able to parse a subset of the `make` syntax and will execute rules for +goals given in arguments if they need to (based on timestamp of dependencies +of rule targets). + +## Supported features + +* Variable assignments (only recursive ones). Variable references with recursion. +* Environment variables are available. +* It is possible to specify variables in command line: `name=value`. +* Variables given in command line will have precedence over variables defined + in makefile, which will have precedence over environment variables. +* If no goal given in command line, the first target defined will be used. +* Comments, escaped comments, escaped new lines. + +It should be able to build programs of previous years with the provided `Makefile` +found in previous contest archives. Simply use this program instead of `make`. +It will recursively use itself for submake (the `MAKE=` assignment inside +`Makefile` will be ignored to continue using itself). + +## Limitations / Known issues + +* There is a lot of memory leak (not a single free). +* The opened file is not closed. +* The input file shall be named `Makefile`. +* No diagnostic message, but the exit status is non zero to indicates failure + (failed command in a rule or missing target). +* Only `$<` and `$@` are supported for automatic variables in commands. +* No parallel execution (`-j` option). +* No `:=` `+=` `?=` syntax for variable assignment. +* No built-in function available. +* No pattern targets. +* No pattern substitution variables. +* No built-in rules. +* No built-in variables (except the one from environment). +* No conditional directives. + +### Compilation warnings + +with gcc 4.8.2 on Linux Ubuntu 14.04 64-bit : +* prog.c:22:15: warning: return makes integer from pointer without a cast [enabled by default] +* prog.c:23:72: warning: signed and unsigned type in conditional expression [-Wsign-compare] +* prog.c:12:11: warning: suggest parentheses around ‘&&’ within ‘||’ [-Wparentheses] + + +-------------------------------------------------------------------------------- + diff --git a/2014/morgan/prog.c b/2014/morgan/prog.c new file mode 100644 index 000000000..1680385b8 --- /dev/null +++ b/2014/morgan/prog.c @@ -0,0 +1,56 @@ + +#include +#include +#include +#include +#include + +#define A calloc(1, sizeof(m)) +#define D m. +#define L -> +#define P malloc( +#define R && +#define S ++ +#define U for( +#define V if( +#define W L i +#define X L a +#define Y L b +#define Z L c + +typedef struct T*_; struct T{ int t,i; char*a; _*b,c,d,e,f; } m,x,y; struct stat z; int u; void * H; +int K(int c){ return strchr(" \n\t",c); } void B(_ s,_ p) { s Y=realloc(s Y,S s W*sizeof(_)); s Y [s +W-1]=p; } _ C(char*d,int l){ _ s=A; s X=d?d:P 1); s W=l<0?d?strlen(d):0:l; return s; } _ E(_ s){ _ r +=A; int i=0; U; iw W) return; goto O; } } +B( D d,w= A ); w Z=n; O:w W =o ; w L d=v; } int M( _ b,int p,char*t,int +g ){ _ f= A; f L e= A; f X=t; int h=g ,i=0,j=0,n=b + W ; char c=0, d,*o =b X ; U; ps L t; } V a Z W){ c=a Z; V a L +d W)J("<", 1, 0, *a L d Y); } } U j=0; !u R c R k R j= 128) will be rejected. + + 14) Any C source that fails to compile because of lines with trailing + control-M's (i.e., lines with a tailing octet 015) will be rejected. + + Please do not put trailing control-M's in your remarks file. + + 15) When you submit your entry you must have a valid email address + that can both send and receive email. The online submission + method is a two phase process that requires the use of an + approval code. This code will be emailed to you as part of + phase 1. + + Entries submitted without a working or valid email address will + be disqualified. + + The judges are not responsible for delays in email, please plan + enough time for one automated exchange of email as part of your + submission. + +| After your email address has been confirmed, the submission code will +| be valid for submitting and editing the entry for the lifetime of the +| competition. + +| 16) You are STRONGLY encouraged to submit a previously unpublished and +| original entry. Submissions that are similar to previous entries are +| discouraged. As we judge anonymously, submissions that have already +| been published may be disqualified. + + 17) The total size of your submission: the sum of the size of the program, + hints, comments, build and info files MUST be less than or equal + to 1048576 octets in size. + + 18) The entirety of your entry must be submitted under the Creative Commons + Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0): + + http://creativecommons.org/licenses/by-sa/3.0/ + + You must not submit anything that cannot be submitted under that license. + + 19) The remarks file must be written in markdown format. See: + + http://daringfireball.net/projects/markdown/basics + + for more information. + +| We currently use "Discount" to convert markdown to HTML +| +| http://www.pell.portland.or.us/~orc/Code/discount/ + + 20) The how to build instructions must be in make form. + + The target of the make file must be called prog. The original + C source file must be called prog.c. + + To invoke the C compiler, use ${CC}. + To invoke the C preprocessor use ${CPP}. + + Do not assume that . (the current working directory) is in the $PATH. + + Use a shell command syntax that is compatible with bash. + + Assume that commands commonly found in POSIX-like / Linux-like systems + are available in the search path. + + Do not assume any particular given value of ${CFLAGS} or other + commonly used make variables. + + 21) Your entry must not create nor modify files above the current directory + with the exception of the /tmp and the /var/tmp directories. Your entry + may create subdirectories below the current directory, or in /tmp, + or in /var/tmp provided that "." is not the first octet in any + directory name. + + +FOR MORE INFORMATION: + + The judging will be done by Leonid A. Broukhis, Simon Cooper, Landon + Curt Noll. + + Please send questions or comments about the contest, to: + +| q.2014@ioccc.org (for questions only!) + + You must include the words: + +| ioccc 2014 question + + in the subject of your EMail message when sending EMail to the judges. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, visit the IOCCC web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + For the updates and breaking IOCCC news, you are encouraged to follow + the twitter handle: + + @IOCCC + + You do not have to be a twitter user to follow @IOCCC. Non-twitter + users should access: + + https://twitter.com/ioccc + + Non-twitter users should force their browsers to reload the above URL + to be sure they are seeing the most recent tweets. + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ diff --git a/2014/sinon/Makefile b/2014/sinon/Makefile new file mode 100644 index 000000000..7521ff55c --- /dev/null +++ b/2014/sinon/Makefile @@ -0,0 +1,205 @@ +#!/usr/bin/env make +# +# 2014 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CHMOD= chmod +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall +#CWARN= -Wall -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= sinon +DATA= glock.sh hecate.sh +ALT_OBJ= run run.c +ALT_ENTRY= prog + + +################# +# build the entry +################# + +all: data + @${TRUE} + +${ENTRY}: ${ENTRY}.c + @rm -f $@ + perl $< | bash + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + ${CP} ${ALT_ENTRY}.c ${ENTRY}.c + ${CHMOD} +x ${DATA} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} ${ENTRY}.c + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Science!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from failong to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} diff --git a/2014/sinon/glock.sh b/2014/sinon/glock.sh new file mode 100644 index 000000000..2fcf625b5 --- /dev/null +++ b/2014/sinon/glock.sh @@ -0,0 +1 @@ +gcc -O0 run.c -o run > /dev/null && ./run | tee run.c diff --git a/2014/sinon/hecate.sh b/2014/sinon/hecate.sh new file mode 100644 index 000000000..e12b13b89 --- /dev/null +++ b/2014/sinon/hecate.sh @@ -0,0 +1 @@ +gcc -O2 run.c -o run > /dev/null && ./run | tee run.c diff --git a/2014/sinon/hint.html b/2014/sinon/hint.html new file mode 100644 index 000000000..68959fe4c --- /dev/null +++ b/2014/sinon/hint.html @@ -0,0 +1,154 @@ + + + + + + + Best choice of optimization + + +

    Best choice of optimization

    + +

    Don Yang
    +omoikane@uguu.org
    +http://uguu.org/

    + +

    Judges' comments:

    + +

    To build:

    + +
    make sinon
    +
    + +

    To run:

    + +
    cp sinon.c run.c
    +
    + +

    Then keep running ./glock.sh or ./hecate.sh within a minute with +slight pauses between invocations.

    + +

    Try:

    + +
    cp sinon.c run.c; ./hecate.sh; ./glock.sh; sleep 3; ./glock.sh; sleep 1; ./hecate.sh
    +
    + +

    Selected Judges Remarks:

    + +

    Try to figure out how this entry determines the optimization level with +which it had been compiled. Is this an example of undefined behavior +or unspecified behavior?

    + +

    Author’s comments:

    + +

    Summary

    + +

    Sinon is a game of timing, the goal is to eliminate all enemies in +under one minute.

    + +

    To start, compile and run the program. To resume, compile and run the +output repeatedly until you have won/lost the game. For example:

    + +
    cp sinon.c run.c
    +gcc -O0 run.c -o run && ./run | tee run.c
    +gcc -O2 run.c -o run && ./run | tee run.c
    +...
    +
    + +

    Details

    + +

    Sinon is played by compiling and running the output repeatedly. Two +factors determine what actions are taken:

    + +
      +
    • Time since last compilation.
    • +
    • Whether compiler optimizations are enabled or not.
    • +
    + + +

    If you fire too quickly, the weapon will jam. If you fire too slowly, +you will not be able to eliminate all the enemies in time. Thus the +primary objective of the game is to time your compilations just right.

    + +

    Sinon has two weapons that are selected based on compiler optimization +level:

    + +
      +
    • “gcc -O2” or “clang -O2” will fire Hecate II, a powerful rifle that +requires longer time to cool off.

    • +
    • “gcc -O0” or “clang -O0” will fire Glock 18C, a less powerful pistol +that requires less time to cool off.

    • +
    + + +

    Because the weapons cool off independently, the best strategy is to +alternate between the two weapons. It is fairly easy to win the game +with this strategy even with occasional jams.

    + +

    If your compiler does not have the right optimizations, only Glock 18C +would be available. It is still possible to win, but your timing will +need to be more precise. This is effectively playing the game on +“hard” mode. It is worth trying this mode even if you have the right +compilers.

    + +

    Compatibility

    + +

    Sinon has been tested and verified to work on these platforms:

    + +
      +
    • gcc 4.4.3 on Linux.
    • +
    • gcc 4.4.5 on Linux.
    • +
    • gcc 4.8.2 on Linux.
    • +
    • gcc 4.8.3 on Cygwin/MingW.
    • +
    • clang 3.4-1 on Linux.
    • +
    • clang 3.4.2 on Cygwin.
    • +
    • gcc 4.3.5 on JS/Linux (playable but likely unwinnable, because it +takes too long to compile).
    • +
    • tcc 0.9.25 on JS/Linux (no optimization, so only “hard” mode is +available).
    • +
    + + +

    Sinon is intended to be played in a 80x25 terminal.

    + +

    Miscellaneous features

    + +

    Sinon might be the first game that uses compiler optimization level as +a primary input.

    + +

    Sinon has a demo mode that plays the game automatically. Make sure +that there are no files named “run” and “run.c” in current directory +(they will be overwritten) and run:

    + +
    perl sinon.c | bash
    +
    + +

    File size and CRC32 of sinon.c are embedded in line 7.

    + +

    Process for making Sinon is included in spoiler.html.

    + +

    Layout of this code is based on Asada Shino, also known as “Sinon”, +from Sword Art Online.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2014/sinon/hint.text b/2014/sinon/hint.text new file mode 100644 index 000000000..cf9eda671 --- /dev/null +++ b/2014/sinon/hint.text @@ -0,0 +1,120 @@ +# Best choice of optimization + +Don Yang + + + + +## Judges' comments: +### To build: + + make sinon + +### To run: + + cp sinon.c run.c + +Then keep running ./glock.sh or ./hecate.sh within a minute with +slight pauses between invocations. + +### Try: + + cp sinon.c run.c; ./hecate.sh; ./glock.sh; sleep 3; ./glock.sh; sleep 1; ./hecate.sh + +### Selected Judges Remarks: + +Try to figure out how this entry determines the optimization level with +which it had been compiled. Is this an example of undefined behavior +or unspecified behavior? + +## Author's comments: +### Summary + +Sinon is a game of timing, the goal is to eliminate all enemies in +under one minute. + +To start, compile and run the program. To resume, compile and run the +output repeatedly until you have won/lost the game. For example: + + cp sinon.c run.c + gcc -O0 run.c -o run && ./run | tee run.c + gcc -O2 run.c -o run && ./run | tee run.c + ... + + +### Details + +Sinon is played by compiling and running the output repeatedly. Two +factors determine what actions are taken: + ++ Time since last compilation. ++ Whether compiler optimizations are enabled or not. + +If you fire too quickly, the weapon will jam. If you fire too slowly, +you will not be able to eliminate all the enemies in time. Thus the +primary objective of the game is to time your compilations just right. + +Sinon has two weapons that are selected based on compiler optimization +level: + ++ "gcc -O2" or "clang -O2" will fire Hecate II, a powerful rifle that + requires longer time to cool off. + ++ "gcc -O0" or "clang -O0" will fire Glock 18C, a less powerful pistol + that requires less time to cool off. + +Because the weapons cool off independently, the best strategy is to +alternate between the two weapons. It is fairly easy to win the game +with this strategy even with occasional jams. + +If your compiler does not have the right optimizations, only Glock 18C +would be available. It is still possible to win, but your timing will +need to be more precise. This is effectively playing the game on +"hard" mode. It is worth trying this mode even if you have the right +compilers. + + +### Compatibility + +Sinon has been tested and verified to work on these platforms: + ++ gcc 4.4.3 on Linux. ++ gcc 4.4.5 on Linux. ++ gcc 4.8.2 on Linux. ++ gcc 4.8.3 on Cygwin/MingW. ++ clang 3.4-1 on Linux. ++ clang 3.4.2 on Cygwin. ++ gcc 4.3.5 on JS/Linux (playable but likely unwinnable, because it + takes too long to compile). ++ tcc 0.9.25 on JS/Linux (no optimization, so only "hard" mode is + available). + +Sinon is intended to be played in a 80x25 terminal. + + +### Miscellaneous features + +Sinon might be the first game that uses compiler optimization level as +a primary input. + +Sinon has a demo mode that plays the game automatically. Make sure +that there are no files named "run" and "run.c" in current directory +(they will be overwritten) and run: + + perl sinon.c | bash + +File size and CRC32 of sinon.c are embedded in line 7. + +Process for making Sinon is included in spoiler.html. + +Layout of this code is based on Asada Shino, also known as "Sinon", +from Sword Art Online. + +-------------------------------------------------------------------------------- + diff --git a/2014/sinon/prog.c b/2014/sinon/prog.c new file mode 100644 index 000000000..d73bc3275 --- /dev/null +++ b/2014/sinon/prog.c @@ -0,0 +1,43 @@ + #/* + q{G. + */include /*G!*/ + #define G(g,o)/**/int g=o;/**/ + #define q(b)int o[]={0,0,0,0,\ + 0};char*p=#b,P[9999],*d=P,*e[]={"('A`)"\ + ,"(A`)","('A)","('A`)"},b/*3792/e887094c*/ + q(*s=__TIME__;extern void w(){G(g,*o)for(;g-- + ;);}extern void x(){}extern void y(){}static void z + (char*p){for(;(*d=*p++)!=0;d++)*d-=061*(59==*d||*d==81);}int + main(){char N[]="<;iQ=/*do<;dQ=ook8?boc;aQ=odr8>oc;_Qoc" + ";^QPQ9_8" + ">b;og8=''`Q<`b8?'QQ9_8?c;dPe8dQa8QQ`]8?ocQQ_8=''_Q`8aQ" + "CYOUQWIN!]Q=;of8BQQ)88bc]QA98P'Qo]8>oQQ_8CP;QQ98b`_8@P8(Q`]'^Q=`']QB)88" + "bQQ]`8J;QQ`88bc99bd(`8iQ@''QQo^8E'`8c;QQ'Q``8?QQ`'kQoP']8<;cQ>98)^Q?''oc`Q>" + "oc']Q]8<;cQ>`8bbQA``QQ''`Q?88P;dQ=`)nQ?*/;;"/*}}=~/./;print"cp\40sinon.c\40r", + "un.c\n";for($i=1;$i<21;$i++){for($j=0;$j<2;$j++){print"gcc\x20-O",$j*2, + "\40run.c\x20-o run&&./run|tee run.c\n"if!($i%(2+$j));}print"sleep $j\n"; + } __DATA__ 8M*/;G(Z,60*(60*(10**s+s[1])+s[3]*10+s[4])+s[6]*10+s[7]-1933008 + )G(l,(Z+86400-*o)%86400)G(M,o[3] *17+o[4]*11) G(O,(&x-&w)-(&y-&x)?1:0)G( + m,*o)G(n,m)G(i,0)G(j,O)if(M>197)for( p=N;*p; )if(*p>92){*N=p[1 ];N[1] + =0;for( O=*p++-90;0l)Z=O;else++o[O+3];o[O+1] =l; if(l<60)d+= sprintf(d,"#include" +"\12#define G(g,o) int g=o;\n#d" "efine \161(b" ")int\40o[]={%d,%d,%d,%d,%d};char" + "*p=#b,P[9999],*d=P,*e[]=" "{\"%s\", \"" "%s" "\",\"%s\",\"%s\"}, b\nq(%s)\n" + ,*o,o[01],o[2],o[3], o[4] ,e[3],e[1], e[2],*e,p);z("/*;; ");for(i=0; i++<18 + ;z(";"))for(j=0;j++<11;n=(n*193+287) %384 ){m=(97+(67*m ))%198;for + (O=0;O++ + +Replay text + + + + + + diff --git a/2014/skeggs/Makefile b/2014/skeggs/Makefile new file mode 100644 index 000000000..316a111df --- /dev/null +++ b/2014/skeggs/Makefile @@ -0,0 +1,207 @@ +#!/usr/bin/env make +# +# 2014 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -pedantic +CWARN= -Wall -Wno-format-extra-args -Wno-parentheses -Wno-return-type + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= -ldl + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} '-DCC="${CC} -fPIC"' + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +DATA= +ALT_OBJ= prog.orig.o +ALT_ENTRY= prog.orig + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +${ALT_ENTRY}: ${ALT_ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} t.o + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + ${RM} -f err static_assert t.c thread_local volatile + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Science!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from failong to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} diff --git a/2014/skeggs/hint.html b/2014/skeggs/hint.html new file mode 100644 index 000000000..81d8aed6b --- /dev/null +++ b/2014/skeggs/hint.html @@ -0,0 +1,266 @@ + + + + + + + Most dynamic + + +

    Most dynamic

    + +

    Cel Skeggs
    +ioccc@celskeggs.com
    +http://www.celskeggs.com

    + +

    Judges' comments:

    + +

    To build:

    + +
    make
    +
    + +

    To run:

    + +
    ./prog
    +
    + +

    Try:

    + +
    ./prog
    +
    + +

    HINT: Try pressing the left and right arrow keys as needed. +Also try pressing space/enter to select options. +Pressing Q or Escape may end the fun before you are ready. :-)

    + +

    Selected Judges Remarks:

    + +

    When the code looks like lemons, it is probably because the LEMONPEOPLE, +or at least the LEMONLORD was involved. :-)

    + +

    Look at some of the C pre-processor macros in the source code. +Ask yourself why C source is being passed as arguments to some +of those macros.

    + +

    Now you may observe, while it is running, that some C source code +is being written to a file and then compiled. And yet that compiled +code is somehow executed from main. But how? How is main able to +call code that was written and compiled just in time for execution?

    + +

    Author’s comments:

    + +

    TABLE OF CONTENTS

    + +
      +
    • Backstory
    • +
    • Known compiler warnings
    • +
    • Obfuscation
    • +
    • Troubleshooting guide (IMPORTANT!)
    • +
    • Q&A
    • +
    + + +

    BACKSTORY

    + +

    It was ten yours ago when THE LEMONPEOPLE invaded, juicing all in their path.

    + +

    Attempting to free the Earth from their tyranny, you have endured pulpy and +sour battles.

    + +

    This has now culminated in you reaching the throne room of THE LEMONLORD.

    + +

    Armed with your right-facing curly brace, you charge into battle.

    + +

    (Use left and right arrow keys and space/enter to select options. Press Q or +Escape to quit.)

    + +

    KNOWN COMPILER WARNINGS

    + +

    Unfortunately, it became very difficult to get this entry to fit within the +size requirements. It’s currently at 2052 according to iocccsize, and 3994 +according to wc -c.

    + +

    The current size is a third to a half of the original size before compression.

    + +

    Due to this, it does LOTS of things that subtly annoy compilers!

    + +
      +
    • (10) data argument not used by format string

      + +

      This occurs because some of the fprintf invocations don’t use all their +parameters. The program should still work fine!

    • +
    • (1) using the result of an assignment as a condition without parentheses

      + +

      Somewhere, I needed to set a variable and then branch on the result. The +shortest way was to combine them. Some self-proclaimed “EXPERTS” think this +is a bad programming practice, but what do they know? :P

    • +
    • (1) implicit declaration of function ‘time’ is invalid in C99

      + +

      An #include statement is expensive, and I’m broke.

    • +
    • (1) control may reach end of non-void function

      + +

      Turns out that sometimes, a return statement is too much. This will never +actually occur, but some C compilers think they know more about my program +than I do! :P

    • +
    • (?) Under some systems, -fPIC is irrelevant for shared libraries. If so, +you should remove it from the Makefile.

    • +
    + + +

    OBFUSCATION? WHAT OBFUSCATION? THIS IS A PERFECTLY NORMAL C PROGRAM!

    + +

    THE COOL PART

    + +

    Take a close look at how it works. Notice that it’s passing C code to certain +macros…

    + +

    Guess what? It’s a very simple kind of JIT compiler, though not used as deeply +as would be cool.

    + +

    Essentially, it generates C code at runtime, dumps it to a file, and then runs +a C compiler on that file, telling the C compiler to generate a shared library. +Then it loads the shared library with dlopen, and…

    + +

    Ignores the result?

    + +

    That can’t be right.

    + +

    Well, it is. Instead of using dlsym like a normal programmer, I mark one of the +generated functions with __attribute__((constructor)). This means that it +gets called immediately on load, so it can make its functions available.

    + +

    But wait - how can it link into the main program, either? It has no way to +reference anything in the main executable!

    + +

    But it does: I’m injecting certain addresses into the generated code, which it +then casts to pointers and accesses! It uses this to make certain functions +available to the main program, so the main program’s generated code will then +enter itself where it’s needed.

    + +

    THE NOT-SO-COOL PART

    + +

    There are also lots of #defines.

    + +

    No, these are not obfuscation. These are compression.

    + +

    There is a little bit of obfuscation gained from using the stringification +operator. (I can never remember what it’s actually called, but it’s the # +operator in a preprocessor macro) - this allows me to pass C code in arguments +to the macros, meaning that it gets interpreted as C code instead of a string +by the iocccsize tool, so it gets counted as smaller! :D

    + +

    A SLIGHTLY COOL PART

    + +

    As part of the JIT compiling, the program hides the fact that it needs ncurses: +it just links ncurses with one of the generated shared libraries, and then can +access the contents of the ncurses library!

    + +

    WAIT WHAT

    + +

    Also, note where functions start and end…

    + +

    I’ve messed with the syntax so that it’s not actually formatted properly. It +almost looks like it is, but it isn’t.

    + +

    This isn’t significant obfuscation as long as you run it through a C source +code beautifier.

    + +

    But wait… if you aren’t careful, running it through a C source code +beautifier won’t work. Remember how I’m interlacing generated C code with +actual C code? Note that this WRECKS some beautifiers. I hope you have a good +one!

    + +

    (There’s an obvious way around this but I’m not going to spell it out for you. +That’d be too easy!)

    + +

    MISCELLANEOUS STUFF

    + +

    Do note that there are some other miscellaneous obfuscations, but they should +be easy to understand once you figure out the ones above.

    + +

    TROUBLESHOOTING GUIDE

    + +

    This program is a very easy program to cause to fail!

    + +

    Some things to check

    + +
      +
    • On line 16, where it says %cinclude "prog.c", is prog.c the name of the +original source code file?
    • +
    • Do you have ncurses installed?
    • +
    • Does your system have ncurses.h (like a nice system) or +ncurses/ncurses.h (like a rude system) ?

      + +

      If it’s the latter (or some other path), you’ll need to update line 97.

      + +

      (I had to do this under Cygwin.)

    • +
    • Does your system need -fPIC (or other arcane invocations) to compile a +shared library? If so, make sure that you include it in the -DCC argument in +the build script.
    • +
    • Does your system have a vague dislike for -fPIC? (Like Cygwin.) You might +need to remove it from the build script.
    • +
    • Does your system support __attribute__((constructor))? It needs to.
    • +
    • Check the file err. Maybe it will help you figure out why a runtime- +generated program failed. The failing program should be found in t.c.
    • +
    • Can’t run a beautifier on the source code? I’m not going to help you there.
    • +
    + + +

    I’ve tested it on the following platforms, in case you need to try it on one:

    + +
      +
    • 64-bit Windows 7 32-bit Cygwin with gcc 4.8.2 and standards c89, c90, c99, +and c11. Note that the program ran as 32-bit due to the version of cygwin.
    • +
    • 64-bit Arch Linux with gcc 4.9.1 and standards c89, c90, c99, c11.
    • +
    • 64-bit Arch Linux with clang 3.5.0 and standards c89 and c11.
    • +
    + + +

    I ran out of time to test it on more systems.

    + +

    Q&A

    + +
      +
    • Who am I?

      + +

      Yes.

    • +
    • Why doesn’t your program require a pet fish license?

      + +

      THE LEMONLORD’s pet LEMONFISH was not rendered in the game, and so does not +require a pet fish license.

    • +
    • Was this inspired by anything?

      + +

      Yes, this was inspired by a minigame from an open-source codebase of Space +Station 13. I didn’t, however, look at the minigame at all during the +development of this entry.

    • +
    • What’s the length of this REMARKS file according to the iocccsize tool?

      + +

      $ ./iocccsize -i <REMARKS.MD

      + +

      5092

    • +
    + + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2014/skeggs/hint.text b/2014/skeggs/hint.text new file mode 100644 index 000000000..280c30aa3 --- /dev/null +++ b/2014/skeggs/hint.text @@ -0,0 +1,231 @@ +# Most dynamic + +Cel Skeggs + + + + +## Judges' comments: +### To build: + + make + +### To run: + + ./prog + +### Try: + + ./prog + +HINT: Try pressing the left and right arrow keys as needed. +Also try pressing space/enter to select options. +Pressing Q or Escape may end the fun before you are ready. :-) + +### Selected Judges Remarks: + +When the code looks like lemons, it is probably because the LEMONPEOPLE, +or at least the LEMONLORD was involved. :-) + +Look at some of the C pre-processor macros in the source code. +Ask yourself why C source is being passed as arguments to some +of those macros. + +Now you may observe, while it is running, that some C source code +is being written to a file and then compiled. And yet that compiled +code is somehow executed from main. But how? How is main able to +call code that was written and compiled just in time for execution? + +## Author's comments: +### TABLE OF CONTENTS + + * Backstory + * Known compiler warnings + * Obfuscation + * Troubleshooting guide (IMPORTANT!) + * Q&A + +### BACKSTORY + +It was ten yours ago when THE LEMONPEOPLE invaded, juicing all in their path. + +Attempting to free the Earth from their tyranny, you have endured pulpy and +sour battles. + +This has now culminated in you reaching the throne room of THE LEMONLORD. + +Armed with your right-facing curly brace, you charge into battle. + +(Use left and right arrow keys and space/enter to select options. Press Q or +Escape to quit.) + +### KNOWN COMPILER WARNINGS + +Unfortunately, it became very difficult to get this entry to fit within the +size requirements. It's currently at 2052 according to iocccsize, and 3994 +according to wc -c. + +The current size is a third to a half of the original size before compression. + +Due to this, it does LOTS of things that subtly annoy compilers! + + * (10) data argument not used by format string + + This occurs because some of the fprintf invocations don't use all their + parameters. The program should still work fine! + + * (1) using the result of an assignment as a condition without parentheses + + Somewhere, I needed to set a variable and then branch on the result. The + shortest way was to combine them. Some self-proclaimed "EXPERTS" think this + is a bad programming practice, but what do they know? :P + + * (1) implicit declaration of function 'time' is invalid in C99 + + An `#include` statement is expensive, and I'm broke. + + * (1) control may reach end of non-void function + + Turns out that sometimes, a return statement is too much. This will never + actually occur, but some C compilers think they know more about my program + than I do! :P + + * (?) Under some systems, `-fPIC` is irrelevant for shared libraries. If so, + you should remove it from the Makefile. + +## OBFUSCATION? WHAT OBFUSCATION? THIS IS A PERFECTLY NORMAL C PROGRAM! + +# THE COOL PART + +Take a close look at how it works. Notice that it's passing C code to certain +macros... + +Guess what? It's a very simple kind of JIT compiler, though not used as deeply +as would be cool. + +Essentially, it generates C code at runtime, dumps it to a file, and then runs +a C compiler on that file, telling the C compiler to generate a shared library. +Then it loads the shared library with dlopen, and... + +Ignores the result? + +That can't be right. + +Well, it is. Instead of using dlsym like a normal programmer, I mark one of the +generated functions with `__attribute__((constructor))`. This means that it +gets called immediately on load, so it can make its functions available. + +But wait - how can it link into the main program, either? It has no way to +reference anything in the main executable! + +But it does: I'm injecting certain addresses into the generated code, which it +then casts to pointers and accesses! It uses this to make certain functions +available to the main program, so the main program's generated code will then +enter itself where it's needed. + +# THE NOT-SO-COOL PART + +There are also lots of `#defines`. + +No, these are not obfuscation. These are compression. + +There is a little bit of obfuscation gained from using the stringification +operator. (I can never remember what it's actually called, but it's the # +operator in a preprocessor macro) - this allows me to pass C code in arguments +to the macros, meaning that it gets interpreted as C code instead of a string +by the iocccsize tool, so it gets counted as smaller! :D + +# A SLIGHTLY COOL PART + +As part of the JIT compiling, the program hides the fact that it needs ncurses: +it just links ncurses with one of the generated shared libraries, and then can +access the contents of the ncurses library! + +# WAIT WHAT + +Also, note where functions start and end... + +I've messed with the syntax so that it's not actually formatted properly. It +almost looks like it is, but it isn't. + +This isn't significant obfuscation as long as you run it through a C source +code beautifier. + +But wait... if you aren't careful, running it through a C source code +beautifier won't work. Remember how I'm interlacing generated C code with +actual C code? Note that this WRECKS some beautifiers. I hope you have a good +one! + +(There's an obvious way around this but I'm not going to spell it out for you. +That'd be too easy!) + +### MISCELLANEOUS STUFF + +Do note that there are some other miscellaneous obfuscations, but they should +be easy to understand once you figure out the ones above. + +### TROUBLESHOOTING GUIDE + +This program is a very easy program to cause to fail! + +Some things to check + + * On line 16, where it says `%cinclude "prog.c"`, is `prog.c` the name of the + original source code file? + * Do you have ncurses installed? + * Does your system have `ncurses.h` (like a nice system) or + `ncurses/ncurses.h` (like a rude system) ? + + If it's the latter (or some other path), you'll need to update line 97. + + (I had to do this under Cygwin.) + * Does your system need `-fPIC` (or other arcane invocations) to compile a + shared library? If so, make sure that you include it in the -DCC argument in + the build script. + * Does your system have a vague dislike for `-fPIC`? (Like Cygwin.) You might + need to remove it from the build script. + * Does your system support `__attribute__((constructor))`? It needs to. + * Check the file `err`. Maybe it will help you figure out why a runtime- + generated program failed. The failing program should be found in `t.c`. + * Can't run a beautifier on the source code? I'm not going to help you there. + +I've tested it on the following platforms, in case you need to try it on one: + + * 64-bit Windows 7 32-bit Cygwin with gcc 4.8.2 and standards c89, c90, c99, + and c11. Note that the program ran as 32-bit due to the version of cygwin. + * 64-bit Arch Linux with gcc 4.9.1 and standards c89, c90, c99, c11. + * 64-bit Arch Linux with clang 3.5.0 and standards c89 and c11. + +I ran out of time to test it on more systems. + +### Q&A + + * Who am I? + + Yes. + + * Why doesn't your program require a pet fish license? + + THE LEMONLORD's pet LEMONFISH was not rendered in the game, and so does not + require a pet fish license. + + * Was this inspired by anything? + + Yes, this was inspired by a minigame from an open-source codebase of Space + Station 13. I didn't, however, look at the minigame at all during the + development of this entry. + + * What's the length of this REMARKS file according to the iocccsize tool? + + `$ ./iocccsize -i diff --git a/2014/skeggs/prog.c b/2014/skeggs/prog.c new file mode 100644 index 000000000..5e935ce19 --- /dev/null +++ b/2014/skeggs/prog.c @@ -0,0 +1,126 @@ +#include +#include +#include +#include +#include +#include +#include + +typedef int (*and_eq)(); + +typedef struct { + and_eq T[15]; + int U[6]; + void *V; +} W; + +#define struct(z, x, y) FILE*q = fopen("t.c", "w"); E(%cinclude "prog.c"\n extern void bitand() __attribute__((constructor)); \n, 35, 9); z fclose(q); if (system(CC " -DCC= -shared t.c -o " #x " " #y " 2>err")) exit(3); { dlopen("./" #x, RTLD_LAZY); } +#define E(x, v, w) fprintf(q, #x, v, w); +#define H "THE LEMONLORD" +#define Q (intptr_t)& +#define O(x) = (J(x)(V.V) - 32 / x) / 2, +#define R(x, y) E(J(3)(%d, %d, B(0) == x ? "{" #y "} " : " " #y); , o + 12, a += (3 + 5*x) | 1 ) +#define A(x) ((W *)x)-> +#define Z "%5d" +#define B(x) V.U[x] +#define J(x) V.T[x] +#define restrict sprintf + +char M[99] = " { { DEFEAT "H" } } "; + +W V; + +void xor_eq() { + int a O(1) b O(2) o = b; + if (J(14)) { J(14)(); + return; +} + +struct(E( + +int k() { + V = *(W *)%td; + char *y = (char*) %td; , Q V, Q M) + E(int x = %d; , a, a) + char *x = "\0; ; ; ; ; ; ; ; ;; ; ; ; ; ; ; ; ; \0{ } \0{ } \0{ } \0{ } \0{ {HP} {MP} {HP} {MP} } \0{ } \0{ O O } \0{ /|-} {-|\\\\ } \0{ | | } \0{ / \\\\ / \\\\ } \0{ } \0{ } \0{ } \0; ; ; ; ; ; ; ; ;; ; ; ; ; ; ; ; ; \0"; + while (*++x) for (E(J(3)(%d, x, "%s"); , b++, x)*++x; ); { + R(0, ATTACK) + R(1, REGENERATE) + R(2, HEAL) + } + E(J(3)(%d, %d - strlen(y) / 2, y); char d[99]; , o+2, a - 8) + E(restrict(d, Z Z " " Z Z, B(1), B(3), B(2), B(4)); J(3)(%d, %d, d); , o + 4, a - 24) + E(J(4)(); +} + +void bitand() { + A(%td)T[14] = k; } , Q V, V) + , volatile, ) + xor_eq(); +} + +#define S(x) 1 + rand() % (x) +#define Y(x) restrict(M,#x,D) + +void N() { + int c = 0; + xor_eq(); + if (B(5) = (B(1) * B(2) < 1)) { + for (; !sleep(++c) && c < 3; xor_eq()) { + char *D = ((B(1) < 1) + c) & 1 ? H " has" : "You have"; + c & 1 ? Y(%s died!) : Y(%s won!); + } + } +} + +#define X(a, n, b, g, f) switch (B(n) a) { case 0: D = S(16 - 4*n); B(2-n) -= D; Y(b hit for %d!); break; case 1: D = S(10-6*n); g; B(3+n) += D; Y(b f %d MP!); break; case 2: D = 33; if (B(3+n) > 1) { B(3+n) -= S(2); B(1+n) += D = S(18 + 6*n); Y(b heal %d!); } else { Y(b need more MP%c); u = 1; } break; } N(); if (B(5) | u | n) { return 2; } + +int x() { + int u = 0, D; + X(, 0, You, , gain) + sleep(1); + X(< 9 ? 0 : B(2) < 20 ? B(4) < 2 ? B(3) >= 1 : 2 : B(4) < 5 && S(3) != 1 && !(B(3) < 1) ? 1 : S(8) > 6 && (B(3) || B(4) > 1) ? 1 + (B(4) > 9 || B(3) < 1) : 0, 1, They, if (B(3) < D) { D = B(3); } B(3) -= D, steal) } int w(int *p, and_eq *P) { + int r = 9; + struct( + E(int f(int x) { switch(x) { , 0, 0) + while (*p) { + E(case %d: return ((and_eq) %td)(); , r += *(p++), Q **(P++)); } + E(} return 1; } void bitand() { A(%td) T[13] = f; } , Q V, 1) + , thread_local, ) + return p[-2]; + } int u() { + return B(5) = 1; +} + +int main(int j, char **v) { + srand(time(0)); + struct( + E(#include \n void F() { endwin(); puts("Play again?"); } int g() { int o = getch(); return o == KEY_LEFT ? -1 : o == KEY_RIGHT ? -2 : o; +} + +void bitand() { + and_eq *G = A(%td) T - 1; , Q V, 8); + char *i = "\0keypad\0getmaxx\0getmaxy\0mvaddstr\0refresh\0g\0cbreak\0noecho\0nonl\0"; + memcpy(V.U, ((int[6]) { 0, 30, 50, 5, 10, 0}) , 6 * sizeof(int)); + while (*++i) { + E(*++G = (and_eq) %s; , i, i); + while (*++i); + } + E(initscr(); A(%td)V = stdscr; atexit(F); } , Q V, i) + , static_assert, -lncurses) + for (j = 6; j < 9; ) { + J(j++)(); + } + J(0)(V.V, 1); + for (; !B(5); ) { + xor_eq(); + j = J(5)(); + if (j & (~((1+~1U) >> 1))) { + B(0) = (B(0) + j + 3) % 3; + } else { + J(13) || w((int[]) { 1, 3, 14, 5, 49, 32, 0} , (and_eq[]) { x, x, u, x, u, u} ); + J(13)(j); + } + } + return 0; +} diff --git a/2014/skeggs/prog.orig.c b/2014/skeggs/prog.orig.c new file mode 100644 index 000000000..e5918bb47 --- /dev/null +++ b/2014/skeggs/prog.orig.c @@ -0,0 +1,125 @@ +#include +#include +#include +#include +#include +#include + +typedef int (*and_eq)(); + +typedef struct { + and_eq T[15]; + int U[6]; + void *V; +} W; + +#define struct(z, x, y) FILE*q = fopen("t.c", "w"); E(%cinclude "prog.c"\n extern void bitand() __attribute__((constructor)); \n, 35, 9); z fclose(q); if (system(CC " -DCC= -shared t.c -o " #x " " #y " 2>err")) exit(3); { dlopen("./" #x, RTLD_LAZY); } +#define E(x, v, w) fprintf(q, #x, v, w); +#define H "THE LEMONLORD" +#define Q (intptr_t)& +#define O(x) = (J(x)(V.V) - 32 / x) / 2, +#define R(x, y) E(J(3)(%d, %d, B(0) == x ? "{" #y "} " : " " #y); , o + 12, a += (3 + 5*x) | 1 ) +#define A(x) ((W *)x)-> +#define Z "%5d" +#define B(x) V.U[x] +#define J(x) V.T[x] +#define restrict sprintf + +char M[99] = " { { DEFEAT "H" } } "; + +W V; + +void xor_eq() { + int a O(1) b O(2) o = b; + if (J(14)) { J(14)(); + return; +} + +struct(E( + +int k() { + V = *(W *)%td; + char *y = (char*) %td; , Q V, Q M) + E(int x = %d; , a, a) + char *x = "\0; ; ; ; ; ; ; ; ;; ; ; ; ; ; ; ; ; \0{ } \0{ } \0{ } \0{ } \0{ {HP} {MP} {HP} {MP} } \0{ } \0{ O O } \0{ /|-} {-|\\\\ } \0{ | | } \0{ / \\\\ / \\\\ } \0{ } \0{ } \0{ } \0; ; ; ; ; ; ; ; ;; ; ; ; ; ; ; ; ; \0"; + while (*++x) for (E(J(3)(%d, x, "%s"); , b++, x)*++x; ); { + R(0, ATTACK) + R(1, REGENERATE) + R(2, HEAL) + } + E(J(3)(%d, %d - strlen(y) / 2, y); char d[99]; , o+2, a - 8) + E(restrict(d, Z Z " " Z Z, B(1), B(3), B(2), B(4)); J(3)(%d, %d, d); , o + 4, a - 24) + E(J(4)(); +} + +void bitand() { + A(%td)T[14] = k; } , Q V, V) + , volatile, ) + xor_eq(); +} + +#define S(x) 1 + rand() % (x) +#define Y(x) restrict(M,#x,D) + +void N() { + int c = 0; + xor_eq(); + if (B(5) = (B(1) * B(2) < 1)) { + for (; !sleep(++c) && c < 3; xor_eq()) { + char *D = ((B(1) < 1) + c) & 1 ? H " has" : "You have"; + c & 1 ? Y(%s died!) : Y(%s won!); + } + } +} + +#define X(a, n, b, g, f) switch (B(n) a) { case 0: D = S(16 - 4*n); B(2-n) -= D; Y(b hit for %d!); break; case 1: D = S(10-6*n); g; B(3+n) += D; Y(b f %d MP!); break; case 2: D = 33; if (B(3+n) > 1) { B(3+n) -= S(2); B(1+n) += D = S(18 + 6*n); Y(b heal %d!); } else { Y(b need more MP%c); u = 1; } break; } N(); if (B(5) | u | n) { return 2; } + +int x() { + int u = 0, D; + X(, 0, You, , gain) + sleep(1); + X(< 9 ? 0 : B(2) < 20 ? B(4) < 2 ? B(3) >= 1 : 2 : B(4) < 5 && S(3) != 1 && !(B(3) < 1) ? 1 : S(8) > 6 && (B(3) || B(4) > 1) ? 1 + (B(4) > 9 || B(3) < 1) : 0, 1, They, if (B(3) < D) { D = B(3); } B(3) -= D, steal) } int w(int *p, and_eq *P) { + int r = 9; + struct( + E(int f(int x) { switch(x) { , 0, 0) + while (*p) { + E(case %d: return ((and_eq) %td)(); , r += *(p++), Q **(P++)); } + E(} return 1; } void bitand() { A(%td) T[13] = f; } , Q V, 1) + , thread_local, ) + return p[-2]; + } int u() { + return B(5) = 1; +} + +int main(int j, char **v) { + srand(time(0)); + struct( + E(#include \n void F() { endwin(); puts("Play again?"); } int g() { int o = getch(); return o == KEY_LEFT ? -1 : o == KEY_RIGHT ? -2 : o; +} + +void bitand() { + and_eq *G = A(%td) T - 1; , Q V, 8); + char *i = "\0keypad\0getmaxx\0getmaxy\0mvaddstr\0refresh\0g\0cbreak\0noecho\0nonl\0"; + memcpy(V.U, (int[6]) { 0, 30, 50, 5, 10, 0} , 6 * sizeof(int)); + while (*++i) { + E(*++G = (and_eq) %s; , i, i); + while (*++i); + } + E(initscr(); A(%td)V = stdscr; atexit(F); } , Q V, i) + , static_assert, -lncurses) + for (j = 6; j < 9; ) { + J(j++)(); + } + J(0)(V.V, 1); + for (; !B(5); ) { + xor_eq(); + j = J(5)(); + if (j & (~((1+~1U) >> 1))) { + B(0) = (B(0) + j + 3) % 3; + } else { + J(13) || w((int[]) { 1, 3, 14, 5, 49, 32, 0} , (and_eq[]) { x, x, u, x, u, u} ); + J(13)(j); + } + } + return 0; +} diff --git a/2014/vik/Makefile b/2014/vik/Makefile new file mode 100644 index 000000000..c70a03df1 --- /dev/null +++ b/2014/vik/Makefile @@ -0,0 +1,202 @@ +#!/usr/bin/env make +# +# 2014 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall +#CWARN= -Wall -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Science!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from failong to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} diff --git a/2014/vik/hint.html b/2014/vik/hint.html new file mode 100644 index 000000000..e6a247b27 --- /dev/null +++ b/2014/vik/hint.html @@ -0,0 +1,120 @@ + + + + + + + Best handling of beeps + + +

    Best handling of beeps

    + +

    Daniel Vik
    +daniel@vik.cc
    +http://danielvik.com/

    + +

    Judges' comments:

    + +

    To build:

    + +
    make
    +
    + +

    To run:

    + +
    ./prog > foo.c
    +
    + +

    Try:

    + +
    echo 'Want to hear me beep?' | ./prog  > audio_file.raw
    +
    +echo 'No. I want chocolate!' | ./prog | mplayer -demuxer rawaudio -
    +
    + +

    Selected Judges Remarks:

    + +

    This program sets a new tone for obfuscation. But do you understand +what it says about obfuscation? Perhaps:

    + +
    ./prog < prog.c > prog.raw
    +
    + +

    might speak to your coding style? If not, then perhaps:

    + +
    ./prog < remarks.markdown | mplayer -demuxer rawaudio -
    +
    + +

    might help? :-)

    + +

    Author’s comments:

    + +

    Remarks

    + +

    This program converts ascii text to morse audio file and vice versa. As far as +I can tell, there are at least six chocolate references in this program.

    + +

    This program can convert text to morse to a raw 44.1kHz stereo audio file. +Via streaming to mplayer, you can listen to the morse audio.

    + +

    Don’t forget the last ‘-’ as it makes mplayer read from stdin.)

    + +

    Convert audio file with morse signals to text

    + +
    $ ./prog e < audio_file.raw
    +
    + +

    or alternatively pass a .wav file as input.

    + +

    The preferred input format 44.1kHz stereo, but it does a decent job on mono +input and different frequencies as well.

    + +

    Portability

    + +

    The program is portable to most platforms. The only system dependency is that +the program relies on writing binary data to stdout.

    + +

    Microsoft compilers adds a carriage return to newlines, and to compile the +program with this platform, the following line can be added after the main +declaration in order for the program to run correctly:

    + +
    _setmode(_fileno(stdout), 0x8000);
    +
    + +

    Known Issues

    + +

    The program uses a quite simple algorithm for detecting tone on and off events +in the morse signal. Hence the program does not work well with noisy input +signals. I have tested it with several samples of man made morse recordings as +well as computer generated ones.

    + +

    Generally, any recording from ham radio transmissions does not decode due to +noise and echoes. Other man made recordings may decode, but some characters +can be incorrect due to too big variation in length of tones and pauses. +However I found some man made recordings on that decode reasonable well.

    + +

    If a recording don’t decode, you could try to pre-process the input with a +narrow bandpass filter on the frequency of the transmission.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2014/vik/hint.text b/2014/vik/hint.text new file mode 100644 index 000000000..2e749e4c0 --- /dev/null +++ b/2014/vik/hint.text @@ -0,0 +1,89 @@ +# Best handling of beeps + +Daniel Vik + + + + +## Judges' comments: +### To build: + + make + +### To run: + + ./prog > foo.c + +### Try: + + echo 'Want to hear me beep?' | ./prog > audio_file.raw + + echo 'No. I want chocolate!' | ./prog | mplayer -demuxer rawaudio - + +### Selected Judges Remarks: + +This program sets a new tone for obfuscation. But do you understand +what it says about obfuscation? Perhaps: + + ./prog < prog.c > prog.raw + +might speak to your coding style? If not, then perhaps: + + ./prog < remarks.markdown | mplayer -demuxer rawaudio - + +might help? :-) + +## Author's comments: +### Remarks + +This program converts ascii text to morse audio file and vice versa. As far as +I can tell, there are at least six chocolate references in this program. + +This program can convert text to morse to a raw 44.1kHz stereo audio file. +Via streaming to mplayer, you can listen to the morse audio. + +Don't forget the last '-' as it makes mplayer read from stdin.) + +## Convert audio file with morse signals to text + + $ ./prog e < audio_file.raw + +or alternatively pass a .wav file as input. + +The preferred input format 44.1kHz stereo, but it does a decent job on mono +input and different frequencies as well. + +### Portability + +The program is portable to most platforms. The only system dependency is that +the program relies on writing binary data to stdout. + +Microsoft compilers adds a carriage return to newlines, and to compile the +program with this platform, the following line can be added after the main +declaration in order for the program to run correctly: + + _setmode(_fileno(stdout), 0x8000); + +### Known Issues + +The program uses a quite simple algorithm for detecting tone on and off events +in the morse signal. Hence the program does not work well with noisy input +signals. I have tested it with several samples of man made morse recordings as +well as computer generated ones. + +Generally, any recording from ham radio transmissions does not decode due to +noise and echoes. Other man made recordings may decode, but some characters +can be incorrect due to too big variation in length of tones and pauses. +However I found some man made recordings on that decode reasonable well. + +If a recording don't decode, you could try to pre-process the input with a +narrow bandpass filter on the frequency of the transmission. + +-------------------------------------------------------------------------------- + diff --git a/2014/vik/prog.c b/2014/vik/prog.c new file mode 100644 index 000000000..fc9a30e15 --- /dev/null +++ b/2014/vik/prog.c @@ -0,0 +1,29 @@ +#include +#include + +char X[] = + " ETIANMSURWDKGOHVF:L:PJBXCYZQ::54:3:::2&:+::::16=/:::(:7:::8:90" + "::::::::::::?_::::\"::.::::@:::'::-::::::::;!:):::::,:::::"; + +int j,w,h,f,u,d,g,e,n,i,l,a,r,p,c,m,o,t,s,Q=32,T[32],W[32],I=13000; + +int main(int v, char** b) { + + for (i=0;v>0&&v<5&&(v*=t=fread(X,1,1,stdin));) + + for (v-1&&101==*1[b]?++g%1500?u+=(g&1^1)*(*X<0?-*X:*X):(f=e,e=w,w=d,d=u, + m=(1 - h%2* 2 )*(d -f)/ (d 5?T[ h%Q] =o+l , l=W[ + h++%Q]=o,o=0:m,o++,u=main(0,b)):(c=strrchr(X,~(Q&*X&*X/2)&*X)-X,j=255); + v==1&&(c*j||main(*X-Q?8:24,b));j/=2)c7&&j<13?s=c*s+T[i/Q]/2,s/=++c:0) + !(i++%Q)?a=c>a?u=s,c:a,c=s=0:0,j=T[i%Q],j=j?T[i/Q]*10/j:0,j*=(j<5)*2+1; + + for (r+=(h-r)/Q*Q;i5&&!v;r+t!=h+1?(W[r%Q]>2*u||r==h?p=n=n>6?0: + putchar(X[p-1+(1<6*u?putchar(Q):0):0) + *X=Q,p=r%2?++n,2*p+(W[r++%Q]>2*u):p; + + return 0; +} diff --git a/2014/whowon.html b/2014/whowon.html new file mode 100644 index 000000000..329fb74c3 --- /dev/null +++ b/2014/whowon.html @@ -0,0 +1,123 @@ + + + + + + + + Who won the 23rd IOCCC + + + +
    IOCCC +

    The International Obfuscated C Code Contest +

    The 23rd IOCCC Winners +

    +[ The judges | +IOCCC home page | +FAQ | +People who have won | +Winning entries ] + +

    + +

    +


    + +

    Here are the names and categories for the winners of the 23rd IOCCC: +

    + + + +

    +


    + + + + + + + + +
    +Creative Commons License +

    This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

    +
    + + + diff --git a/2014/wiedijk/Makefile b/2014/wiedijk/Makefile new file mode 100644 index 000000000..c70a03df1 --- /dev/null +++ b/2014/wiedijk/Makefile @@ -0,0 +1,202 @@ +#!/usr/bin/env make +# +# 2014 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true + +# Set X11_LIBDIR to the directory where the X11 library resides +# +X11_LIBDIR= /usr/X11R6/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +X11_INCDIR= /usr/X11R6/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall +#CWARN= -Wall -pedantic + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# Libraries needed to build +# +LIBS= + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${OPT} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +DATA= +ALT_OBJ= +ALT_ENTRY= + + +################# +# build the entry +################# +# +all: ${ENTRY} ${DATA} + @${TRUE} + +${ENTRY}: ${ENTRY}.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${ENTRY}.o ${ALT_OBJ} + +clobber: clean + ${RM} -f ${ENTRY} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. Science!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from failong to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v4; \ + else \ + echo "We are not expected to understand that"; \ + fi + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 391581 --level 216193 --FNV1a_hash 512-bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} diff --git a/2014/wiedijk/hint.html b/2014/wiedijk/hint.html new file mode 100644 index 000000000..fd9704baa --- /dev/null +++ b/2014/wiedijk/hint.html @@ -0,0 +1,91 @@ + + + + + + + Most functional + + +

    Most functional

    + +

    Freek Wiedijk
    +freek@cs.ru.nl

    + +

    Judges' comments:

    + +

    To build:

    + +
    make wiedijk
    +
    + +

    To run:

    + +
    ./prog
    +
    + +

    Try:

    + +
    gcc -E prog.c | indent | sed '1,/5.*prog/d'
    +
    + +

    Selected Judges Remarks:

    + +

    C11 features definitely help this entry to be as concise as it is.

    + +

    The judges would like to think that they had almost understood how this entry works.

    + +

    If you win a bet by demonstrating this entry, please let us know.

    + +

    Author’s comments:

    + +

    Remarks

    + +
      +
    • computes the factorial function
    • +
    • no loops, no explicit recursion
    • +
    • untyped C without any casts, using a w word datatype
    • +
    • varargs not essential, w(*)(w,w*) works just as well
    • +
    • conforming ISO C
    • +
    • no warnings when compiled with -std=c99 -Wall -Wextra -pedantic
    • +
    • comments in the code explain what this really is about
    • +
    • C as a functional programming language: +untyped lambda calculus compiled to executable C functions
    • +
    • untagged closures (just a function pointer followed by some values)
    • +
    • recursion implemented through Curry’s paradoxical combinator Y
    • +
    • the readable implementation of Y is on lines 29-30:

      + +

      W_f = \x.f(xx) + Y = \f.W_f W_f

    • +
    • a mixture of strict and lazy evaluation, with a _ force function +(John Tromp notes that if Turing’s fixed-point combinator +(\xy.y\z.xxyz)(\xy.y\z.xxyz) had been used, +all applications could have been strict)

    • +
    • uses Y to implement factorial on native ints
    • +
    • 10! seconds = 6 weeks
    • +
    • answers the ultimate question of life, the universe and everything
    • +
    + + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2015, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2014/wiedijk/hint.text b/2014/wiedijk/hint.text new file mode 100644 index 000000000..907e27697 --- /dev/null +++ b/2014/wiedijk/hint.text @@ -0,0 +1,62 @@ +# Most functional + +Freek Wiedijk + + + +## Judges' comments: +### To build: + + make wiedijk + +### To run: + + ./prog + +### Try: + + gcc -E prog.c | indent | sed '1,/5.*prog/d' + +### Selected Judges Remarks: + +C11 features definitely help this entry to be as concise as it is. + +The judges would like to think that they had almost understood how this entry works. + +If you win a bet by demonstrating this entry, please let us know. + +## Author's comments: +### Remarks + +- computes the factorial function +- no loops, no explicit recursion +- untyped C without any casts, using a `w` word datatype +- varargs not essential, `w(*)(w,w*)` works just as well +- conforming ISO C +- no warnings when compiled with `-std=c99 -Wall -Wextra -pedantic` +- comments in the code explain what this really is about +- C as a functional programming language: + untyped lambda calculus compiled to executable C functions +- untagged closures (just a function pointer followed by some values) +- recursion implemented through Curry's paradoxical combinator `Y` +- the readable implementation of `Y` is on lines 29-30: + + W_f = \x.f(xx) + Y = \f.W_f W_f + +- a mixture of strict and lazy evaluation, with a `_` force function + (John Tromp notes that if Turing's fixed-point combinator + `(\xy.y\z.xxyz)(\xy.y\z.xxyz)` had been used, + all applications could have been strict) +- uses `Y` to implement factorial on native `int`s +- 10! seconds = 6 weeks +- answers the ultimate question of life, the universe and everything + +-------------------------------------------------------------------------------- + diff --git a/2014/wiedijk/prog.c b/2014/wiedijk/prog.c new file mode 100644 index 000000000..0ebd03bd6 --- /dev/null +++ b/2014/wiedijk/prog.c @@ -0,0 +1,34 @@ + #include/*Y=\f*/ + #include/*.(\x.f(*/ + #define z return/*xx))(\x.*/ + #include/*f(xx))*/ + typedef union w w;union w{ + #define L(f,y,x,t) w _ ##\ + f(w x,...){va_list argh;w\ + y; va_start(argh,x);y= *\ + (va_arg(argh,w*));va_end\ + (argh);z(t);} w f (w fw)\ + {r((w){.c= &_## f}, fw);} + int _; void*p;w(*c)(w,... + #define r(x,y)w*k=malloc\ + (sizeof(w)<<1); k[0]= x\ + ; k[1]=y; z((w) {.p= k}) + #define l(f,x,t)w _##f(\ + w x,...){z(t);}w f={.p\ + =(w[1]){{.c= &_##f}}}; + );};w a(w f,w x){w*d=f + .p;z((*d->c)(x,d+1) + + + ) ; } + w a_(w f,w fw){r(f, + fw);}w _(w f){w*k=f.p,r= + a(*k,k[1]); free(k) ;z(r);} + L(F,f,x,(w){._=x._?x._*a(_(f), +(w){._=x._-1})._:1})l(F_,f,F(f) +)L( W,(f),/*=\*/x,a(f,a_(x,x)) +)l( Y,/*=\*/f,a(W(f),W(f)) + )int main(){printf("%.""f\n", + a(a(Y,F_),(w){._=10})._ + /60./60/24/*d */ + ) ; } diff --git a/2015/2015.tar.bz2 b/2015/2015.tar.bz2 new file mode 100644 index 000000000..ff3d8fd32 Binary files /dev/null and b/2015/2015.tar.bz2 differ diff --git a/2015/MANIFEST b/2015/MANIFEST new file mode 100644 index 000000000..2acfbaa8c --- /dev/null +++ b/2015/MANIFEST @@ -0,0 +1,106 @@ +2015/MANIFEST +2015/Makefile +2015/burton/Makefile +2015/burton/calc.man +2015/burton/hint.html +2015/burton/hint.text +2015/burton/prog.c +2015/burton/prog.orig.c +2015/burton/road.to.obscurity +2015/burton/rule2.c +2015/burton/src.doc.rot13 +2015/burton/test.in +2015/burton/test.out +2015/burton/test32.out +2015/dogon/Makefile +2015/dogon/hint.html +2015/dogon/hint.text +2015/dogon/prog.c +2015/duble/Makefile +2015/duble/codes.txt +2015/duble/hint.html +2015/duble/hint.text +2015/duble/lorem-ipsum.txt +2015/duble/prog.c +2015/duble/prog.orig.c +2015/endoh1/Makefile +2015/endoh1/center.txt +2015/endoh1/hint.html +2015/endoh1/hint.text +2015/endoh1/ioccc.txt +2015/endoh1/line.txt +2015/endoh1/prog.c +2015/endoh2/Makefile +2015/endoh2/hint.html +2015/endoh2/hint.text +2015/endoh2/prog.c +2015/endoh3/Makefile +2015/endoh3/hint.html +2015/endoh3/hint.text +2015/endoh3/ioccc.c +2015/endoh3/mullender.c +2015/endoh3/prog.c +2015/endoh4/Makefile +2015/endoh4/hint.html +2015/endoh4/hint.text +2015/endoh4/prog.c +2015/endoh4/prog.orig.c +2015/guidelines.txt +2015/hint.css +2015/hou/Makefile +2015/hou/hint.html +2015/hou/hint.text +2015/hou/prog.c +2015/howe/Makefile +2015/howe/avgtime.sh +2015/howe/hint.html +2015/howe/hint.text +2015/howe/makeholes.c +2015/howe/prog-test.sh +2015/howe/prog.c +2015/howe/prog.orig.c +2015/howe/spoiler/Makefile +2015/howe/spoiler/err.h +2015/howe/spoiler/prog.c +2015/iocccsize.c +2015/iocccsize.mk +2015/mills1/Makefile +2015/mills1/hint.html +2015/mills1/hint.text +2015/mills1/prog.c +2015/mills2/Makefile +2015/mills2/hint.html +2015/mills2/hint.text +2015/mills2/ioccc_guidelines.txt.Z +2015/mills2/ioccc_rules.txt.Z +2015/mills2/prog.c +2015/muth/Makefile +2015/muth/hint.html +2015/muth/hint.text +2015/muth/machine_beaver_4_2.h +2015/muth/machine_champ_2_4.h +2015/muth/machine_chaos_5_2.h +2015/muth/machine_cmplx_5_2.h +2015/muth/machine_count_5_2.h +2015/muth/machine_gcd.h +2015/muth/machine_great_3_2.h +2015/muth/machine_ioccc.h +2015/muth/machine_nop.h +2015/muth/machine_ru_2_4.h +2015/muth/machine_times2.h +2015/muth/prog.c +2015/muth/tape_15_50.h +2015/muth/tape_77_55.h +2015/muth/tape_empty.h +2015/muth/tape_five.h +2015/rules.txt +2015/schweikhardt/Makefile +2015/schweikhardt/hint.html +2015/schweikhardt/hint.text +2015/schweikhardt/prog.c +2015/whowon.html +2015/yang/Makefile +2015/yang/hint.html +2015/yang/hint.text +2015/yang/prog.c +2015/yang/spoiler.html diff --git a/2015/Makefile b/2015/Makefile new file mode 100644 index 000000000..bb2b69b64 --- /dev/null +++ b/2015/Makefile @@ -0,0 +1,153 @@ +#!/usr/bin/env make +# +# 2015 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############### +# IOCCC winners +############### +# +WINNERS= burton dogon duble endoh1 endoh2 endoh3 endoh4 hou howe mills1 mills2 muth schweikhardt yang + +################### +# build all entries +################### +# +all: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) X11_LIBDIR=${X11_LIBDIR} X11_INCDIR=${X11_INCDIR} $@)"; \ + (cd $$i && $(MAKE) "X11_LIBDIR=${X11_LIBDIR}" "X11_INCDIR=${X11_INCDIR}" $@); \ + done + +# alternative executable +# +alt: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) X11_LIBDIR=${X11_LIBDIR} X11_INCDIR=${X11_INCDIR} $@)"; \ + (cd $$i && $(MAKE) "X11_LIBDIR=${X11_LIBDIR}" "X11_INCDIR=${X11_INCDIR}" $@); \ + done + + +############### +# utility rules +############### +# +everything: all alt + +clean: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +clobber: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +nuke: clobber + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +install: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + + +################## +# 133t hacker rulz +################## +# +love: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +haste: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +waste: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +make: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +easter_egg: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + + +# The IOCCC resident astronomer states +# +charon: supernova + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +pluto: supernova + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done diff --git a/2015/burton/Makefile b/2015/burton/Makefile new file mode 100644 index 000000000..85f7c021d --- /dev/null +++ b/2015/burton/Makefile @@ -0,0 +1,263 @@ +#!/usr/bin/env make +# +# 2015 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +CSILENCE= -Wno-return-type -Wno-parentheses -Wno-char-subscripts \ + -Wno-empty-body -Wno-cast-align -Wno-conversion \ + -Wno-missing-prototypes -Wno-missing-variable-declarations \ + -Wno-shadow -Wno-shorten-64-to-32 -Wno-sign-conversion \ + -Wno-unused-parameter + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +#CDEFINE= +CDEFINE= -DR=return -DI=typedef -DH=unsigned -DX=long -D"W(x)=for(;x;)" + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +CSRC= ${ENTRY}.c +OBJ= ${ENTRY}.o +DATA= +ALT_OBJ= +ALT_ENTRY= +TARGET= ${ENTRY} + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +${ENTRY}: ${CSRC} + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from not failing to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v5; \ + else \ + echo "planet deniers, like the IAU, are amusing"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2015/burton/calc.man b/2015/burton/calc.man new file mode 100644 index 000000000..d2124dd0d --- /dev/null +++ b/2015/burton/calc.man @@ -0,0 +1,78 @@ +NAME + calc - an integer expression calculator that outputs in both hex and decimal + +SYNOPSIS + calc [expr] + +DESCRIPTION + calc presents a simple signed integer expression calculator. + The result is printed on stdout as both a decimal value and its hex equivalent. + Results are presented as 32-bit values, displaying as 64-bits only if necessary. + If the program name begins with 'e', the input is also copied to stdout. + stdin is read if there are no arguments. + + Constants may be decimal, octal or hex. + There are 26 registers, initialized to zero, named A-Z; + the most recent result is always remembered in the register '.' (dot). + Assignments are silent; the character '$' will print a table of the non-zero registers. + + All input is case-insensitive. + Semicolons and/or newlines separate statements. + Whitespace is ignored, except newlines cannot occur within expressions. + Comments are introduced with '#' and extend through the following newline. + + Operator precedence is as found in Go: + OR and XOR are treated as additive, SHIFTing and AND are multiplicative. + This allows a more natural expression without parentheses, + as in `a&0xff | b<<8'. + + Supported operations in decreasing precedence: + + () forced precedence + - + ! ~ ? unary plus/minus, not, compl, byteswap + * / % & << >> >>> mul, div, mod, bitand, shift: left, right, unsigned right + + - | ^ add, sub, bitor, xor + = assignment ([a-z] = expr) + +EXAMPLES + Display the decimal value of 0x42 + + $ calc 0x42 + 66 0x00000042 + + What is the mask value for 22 bits? + + $ calc '1<<22-1' + 4194303 0x003fffff + + What is the integer value of byte-swapped 0x11223344? + + $ calc ?0x11223344 + 1144201745 0x44332211 + + Some canned expressions: + + cat <> 32 # signed shift + -1 >>> 32 # unsigned shift + ! + +BUGS + An assignment with certain types of syntax error will replace the registers with a + partial evaluation: + + calc 'a = 1; a; a = 3 4; a' + 1 0x00000001 + syntax error + 3 0x00000003 + + Command line expressions longer than 64 characters will give a syntax error. + +SEE ALSO + https://golang.org/ diff --git a/2015/burton/hint.html b/2015/burton/hint.html new file mode 100644 index 000000000..66182f47a --- /dev/null +++ b/2015/burton/hint.html @@ -0,0 +1,217 @@ + + + + + + + Most Useful + + +

    Most Useful

    + +

    Dave Burton ioccc@snox.net
    +http://snox.net/ioccc

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./prog "expression"
    +
    + +

    or

    + +
    ./prog
    +(input expressions)
    +
    + +

    Try:

    + +
    ./prog '?0x3343<<2'
    +
    +echo '?0x3343<<2' | ./prog
    +
    +./prog
    +
    +Enter:
    +
    +a=0xfeedface
    +b=0xcafe
    +a << 16 + b
    +
    +grep '[0-9]' prog.c
    +
    +./prog < test.in
    +
    +less calc.man
    +
    + +

    Selected Judges Remarks:

    + +

    “Look, Ma, no hands digits!”

    + +

    The place where some arithmetic operations are done, for example, +division or modulo, are easy to find. Where are addition and subtraction?

    + +

    We were impressed with the level of detail the author “blogged” the obfuscation process.

    + +

    Author’s comments:

    + +

    calc - an integer expression calculator that outputs in both hex and decimal

    + +

    All useful tools should include sufficient documentation. +See the included man page. ;-)

    + +

    Notes

    + +

    This program is named calc. Onomatopoeia of sorts, in the visual realm. +The formatting was easier: Form Follows Function (although Hou did this better). +It was tempting to call it iCalc, with i for integer (and it was written on an iDevice), +but sanity prevailed.

    + +

    Printed in 8 pt Courier, it makes aesthetically pleasing 8.5 x 11 wall art.

    + +

    prog.c vs prog.orig.c

    + +

    Dominik Muth observed a syntax error on 1+1, 1-1, 1|1, and 1^1 when using an +ARM based computer, although 1*1 and others worked correctly. +This occurs because some platforms by default treat char as unsigned char. +The original code has this weakness, which can be corrected by adding -fsigned-char +to the compile line. +The modified code is agnostic to char signed-ness.

    + +

    Why is this entry obfuscated/interesting?

    + +

    Yes, this is another calculator program.

    + +

    However, unlike any other calculator source code the author is aware of, +this one contains no digits. At all. Anywhere. As in

    + +
    grep '[0-9]' prog.c || echo no digits!
    +
    + +

    Nor are the digits simply obfuscated. There are no character constants. +There is only one single, short string, and it does not contain any obfuscated digits. +And yet the output is in decimal and hexadecimal, and it accepts octal, decimal, and hex input.

    + +

    Flow control is by for and return. It is If-less. Switch-less. While-less. Hope-less.
    +Literally, if not figuratively. ;-)

    + +

    The code size is intentionally 2015, as stated by iocccsize -i, +and can be reformatted without changes (as in rule2.c) to exactly 4096 octets.

    + +

    Finally, calc is interesting, if for no other reason than it is practically useful: +Hex/decimal conversion, arithmetic, byte-swapping, bit-shifting, and logical operations with memory, +on the command line, or interactively.

    + +

    But the question is why is the entry obfuscated?

    + +

    The code follows many industry best-practices:

    + +
      +
    • You know what it does just by looking at it.

    • +
    • Numbers and digits have often been used for obfuscation, +so in a bid for better clarity, this code has no digits at all.

    • +
    • In the spirit of clarity, most of the variables are declared before use, so they +are readily visible, with single letter names that don’t clutter the screen, +in a tautological arrangement.

    • +
    • More helpful is the use of typedefs instead of #define, so the types remain useful +even in the debugger, and source code beautifiers will not undo careful presentation.

    • +
    • #defines are used here in the best spirit of the preprocessor: to shorten +repetitive constructs, not for obscurity.

    • +
    • All functions are short (and therefore easy to understand?) and do only one thing, well, ….

    • +
    • Curly braces invite endless holy wars over readability. This code only uses them +for function definitions, thereby greatly improving readability, and reducing arguments +about said readability.

    • +
    • One of C’s many blessings (until recently) is a modicum of keywords, +of which only 8 are used: +for, return, typedef, void, char, short, unsigned and long; +10 if #include and #define are counted.

    • +
    • The code helpfully declares “syntax_error!” right up front, filling the reader with confidence.

    • +
    • In spite of its inherent clarity, the code was presented to both indent(1) and +clang-format(1), after running it through the preprocessor, sustaining its better qualities.

    • +
    • That the code is obfuscated is spelled out two different ways in the source; it helps +to reformat the code to see the second spelling.

    • +
    • The author is overly fond of the code that handles input. +There is no memory allocation, nor pre-allocation of arrays, so where does the +memory come from? The multi-base strtol() code is pretty trick. +No special attempt was made to replace operations with obscure mathematical relations, +as the (lack of) beauty is in the parsing – ask not where is the modulus operation, +but how does it know when to mod – okay, but where is add and subtract? +And really, who doesn’t enjoy a setjmp() in the argument list?

    • +
    • Finally, documentation of the source code structure is helpfully provided in rot13 format. +But isn’t it unsportsmanlike to rely upon it? However, even with this helpful guide, +things like reading input lines remain as tricky to read as they are to write.

    • +
    + + +

    Compiler warnings

    + +

    Calc is C99 compliant, and is ANSI/C90 compliant except for wanting 64-bit long long. +Changing the two long long typedefs to long, and compiling with gcc -m32 +yields a program that operates on 32-bit values, with wrap-around of shifts mod 32:

    + +
    1<<48
    +65536   0x00010000
    +
    + +

    gcc 4.2.1 without arguments compiles cleanly (e.g. cc prog.c -o prog). +This is my workaday compiler. gcc is also clean with -ansi, and -std=c99.

    + +

    clang 3.6.0 lives up to its namesake, resounding on non-problems. +To stifle these complaints: + -Wno-return-type -Wno-parentheses -Wno-empty-body

    + +

    When invoked with -ansi -pedantic, there are two warnings, which can be ignored:

    + +
      +
    • ISO C90 does not support 'long long'
    • +
    + + +

    With -Wall -std=c99, both are quite noisy, and all can be ignored:

    + +
      +
    • array subscript has type 'char' [-Wchar-subscripts]
    • +
    • value computed is not used [-Wunused-value]
    • +
    • operation on 'j' may be undefined [-Wsequence-point]
    • +
    + + +

    Test Suite

    + +

    If the program name begins with an “e”, it echoes stdin to stdout. +This allows for a convenient test suite:

    + +
    ln -s prog eprog
    +PATH=. eprog < test.in | diff - test.out
    +
    + +

    Spoilers

    + +

    If you do not want to puzzle out how it works, see spoilers.markdown.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2016, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2015/burton/hint.text b/2015/burton/hint.text new file mode 100644 index 000000000..9f19587e5 --- /dev/null +++ b/2015/burton/hint.text @@ -0,0 +1,202 @@ +# Most Useful + +Dave Burton + + + +## Judges' comments: +### To use: + + make + + ./prog "expression" + +or + + ./prog + (input expressions) + +### Try: + + ./prog '?0x3343<<2' + + echo '?0x3343<<2' | ./prog + + ./prog + + Enter: + + a=0xfeedface + b=0xcafe + a << 16 + b + + grep '[0-9]' prog.c + + ./prog < test.in + + less calc.man + +### Selected Judges Remarks: + +"Look, Ma, no ~~hands~~ digits!" + +The place where some arithmetic operations are done, for example, +division or modulo, are easy to find. Where are addition and subtraction? + +We were impressed with the level of detail the author "blogged" the obfuscation process. + + + +## Author's comments: +calc - an integer expression calculator that outputs in both hex and decimal +---------------------------------------------------------------------------- + +All useful tools should include sufficient documentation. +See the included man page. ;-) + +Notes +----- + +This program is named calc. Onomatopoeia of sorts, in the visual realm. +The formatting was easier: Form Follows Function (although [Hou][1] did this better). +It was tempting to call it iCalc, with i for integer (and it was written on an iDevice), +but sanity prevailed. + +Printed in 8 pt Courier, it makes aesthetically pleasing 8.5 x 11 wall art. + +[1]: http://www.ioccc.org/2011/hou/hint.html "Hou Qiming" + +prog.c vs prog.orig.c +--------------------- + +Dominik Muth observed a syntax error on `1+1`, `1-1`, `1|1`, and `1^1` when using an +ARM based computer, although `1*1` and others worked correctly. +This occurs because some platforms by default treat `char` as `unsigned char`. +The original code has this weakness, which can be corrected by adding `-fsigned-char` +to the compile line. +The modified code is agnostic to `char` signed-ness. + +Why is this entry obfuscated/interesting? +----------------------------------------- + +Yes, this is another calculator program. + +However, unlike any other calculator source code the author is aware of, +this one contains no digits. At all. Anywhere. As in + + grep '[0-9]' prog.c || echo no digits! + +Nor are the digits simply obfuscated. There are no character constants. +There is only one single, short string, and it does not contain any obfuscated digits. +And yet the output is in decimal and hexadecimal, and it accepts octal, decimal, and hex input. + +Flow control is by `for` and `return`. It is If-less. Switch-less. While-less. Hope-less. +Literally, if not figuratively. ;-) + +The code size is intentionally 2015, as stated by iocccsize -i, +and can be reformatted without changes (as in rule2.c) to exactly 4096 octets. + +Finally, calc is interesting, if for no other reason than it is practically useful: +Hex/decimal conversion, arithmetic, byte-swapping, bit-shifting, and logical operations with memory, +on the command line, or interactively. + +But the question is why is the entry obfuscated? +------------------------------------------------ + +The code follows many industry best-practices: + +- You know what it does just by looking at it. + +- Numbers and digits have often been used for obfuscation, + so in a bid for better clarity, this code has no digits at all. + +- In the spirit of clarity, most of the variables are declared before use, so they + are readily visible, with single letter names that don't clutter the screen, + in a tautological arrangement. + +- More helpful is the use of `typedef`s instead of `#define`, so the types remain useful + even in the debugger, and source code beautifiers will not undo careful presentation. + +- `#defines` are used here in the best spirit of the preprocessor: to shorten + repetitive constructs, not for obscurity. + +- All functions are short (and therefore easy to understand?) and do only one thing, well, .... + +- Curly braces invite endless holy wars over readability. This code only uses them + for function definitions, thereby greatly improving readability, and reducing arguments + about said readability. + +- One of C's many blessings (until recently) is a modicum of keywords, + of which only 8 are used: + `for`, `return`, `typedef`, `void`, `char`, `short`, `unsigned` and `long`; + 10 if `#include` and `#define` are counted. + +- The code helpfully declares "syntax_error!" right up front, filling the reader with confidence. + +- In spite of its inherent clarity, the code was presented to both *indent*(1) and + *clang-format*(1), after running it through the preprocessor, sustaining its better qualities. + +- That the code is obfuscated is spelled out two different ways in the source; it helps + to reformat the code to see the second spelling. + +- The author is overly fond of the code that handles input. + There is no memory allocation, nor pre-allocation of arrays, so where does the + memory come from? The multi-base strtol() code is pretty trick. + No special attempt was made to replace operations with obscure mathematical relations, + as the (lack of) beauty is in the parsing -- ask not where is the modulus operation, + but how does it know when to mod -- okay, but where is add and subtract? + And really, who doesn't enjoy a setjmp() in the argument list? + +- Finally, documentation of the source code structure is helpfully provided in rot13 format. + But isn't it unsportsmanlike to rely upon it? However, even with this helpful guide, + things like reading input lines remain as tricky to read as they are to write. + +Compiler warnings +----------------- + +Calc is C99 compliant, and is ANSI/C90 compliant except for wanting 64-bit `long long`. +Changing the two `long long` typedefs to `long`, and compiling with `gcc -m32` +yields a program that operates on 32-bit values, with wrap-around of shifts mod 32: + + 1<<48 + 65536 0x00010000 + +gcc 4.2.1 without arguments compiles cleanly (e.g. cc prog.c -o prog). +This is my workaday compiler. gcc is also clean with -ansi, and -std=c99. + +clang 3.6.0 lives up to its namesake, resounding on non-problems. +To stifle these complaints: + -Wno-return-type -Wno-parentheses -Wno-empty-body + +When invoked with -ansi -pedantic, there are two warnings, which can be ignored: + + * `ISO C90 does not support 'long long'` + +With -Wall -std=c99, both are quite noisy, and all can be ignored: + + * `array subscript has type 'char' [-Wchar-subscripts]` + * `value computed is not used [-Wunused-value]` + * `operation on 'j' may be undefined [-Wsequence-point]` + +Test Suite +---------- + +If the program name begins with an "e", it echoes stdin to stdout. +This allows for a convenient test suite: + + ln -s prog eprog + PATH=. eprog < test.in | diff - test.out + +Spoilers +-------- + +If you do not want to puzzle out how it works, see spoilers.markdown. + +-------------------------------------------------------------------------------- + diff --git a/2015/burton/prog.c b/2015/burton/prog.c new file mode 100644 index 000000000..aeae34935 --- /dev/null +++ b/2015/burton/prog.c @@ -0,0 +1,110 @@ +#include +#include +#define R return +#define W(x)for(;x;) +#define I typedef +#define H unsigned +I jmp_buf J; +I void P; +I char L; +I int Q; +I H C; +I long long V; +I H char O; +I H short Y; +I H long long Z; + + O S[]="syntax_error!" + "M@K~|JOEF\\^~_NHI]"; L*N,*K,* + B,*E,*T,*A,*x,D; Q(*k)(),v; V z(P),j,_,* + o,b,f,u,s,c,a,t,e,d; J l; Q _k(P){ R*K?*K++: + ~-d; } V r(L a){ R a&&putchar(a); } L n(){ R*T=j= + k(),++j; } O G(P){ *o=d,longjmp(l,b); } Z g(Y a){ R a + >>s|(a&~-e)<>s*f); } P _i (L*T) + { *o||p(T); } V _b(V a ){ Z e=a + ; R A[*T++]!=v+c?G():~-v ?a<> z():e>>z();} + V _c(L* l){ T=B +a; W(j)*T-- + =v+j%c ,j/=c; E=B+ (*B== + a+c+u );W(T< B+a)* + E++=* ++T; T =E ; + l-B&& ++ *-- E; } + P M( Z k){ L*p,e + =a>> u; m ()&&G( + ); p =T=B ; _=j=k + ; v=u <>=e; W(T + -e*f>p)*T--=v; W(Tc&&A[v]==T++&&(v|a)-a*-~f<~-s?D=b+(v&a)+a*f-c:d; D&&(j=o-D); }V y(P){ + V a=z();W(m()&&v=d)v?v-b?v-f?v-u?v-=t,a=_b(a):(a&=z()):(a%=z( + )):(a/=z()):(a*=z()); R--T,a;} V _f(P){ V e=c; j=d; D=b; *T==u<>f==a-f&&(e<<=b)&&T++; W(D&&(v=*T++))_d(e); R--T,j; } V F(P){ V n=y(); + W(m()&&v> + a/f? + n>>a + ?h(n)<>a + ):h(n):g(n); } Q main(Q x + ,L**K){ V*A; q(K); W(w())** + K-c*c-b||p(B),_i(!setjmp(l)?T=B + ,M(((A=(*o=m()==c-~s&&(j=a|T[-b])&& + s-m()==~s)?&o[j-a*u]:(T=B,&_)),*A=F()) + ),B:(L*)S); } V z(P){ V + s; W(m() &&v<=f*c + )R v> + b?s :G (): + _:! (v-= + t)? --T,_f + (): v-f?o[ + (T[ -b]|a)- + a*u]: !z(); + G(); } diff --git a/2015/burton/prog.orig.c b/2015/burton/prog.orig.c new file mode 100644 index 000000000..cd11d1b3e --- /dev/null +++ b/2015/burton/prog.orig.c @@ -0,0 +1,110 @@ +#include +#include +#define R return +#define W(x)for(;x;) +#define I typedef +#define H unsigned +I jmp_buf J; +I void P; +I char L; +I int Q; +I H C; +I long long V; +I H char O; +I H short Y; +I H long long Z; + + O S[]="syntax_error!" + "M@K~|JOEF\\^~_NHI]"; L*N,*K,* + B,*E,*T,*A,*x,D,v; Q(*k)(); V z(P),j,_,* + o,b,f,u,s,c,a,t,e,d; J l; Q _k(P){ R*K?*K++: + ~-d; } V r(L a){ R a&&putchar(a); } L n(){ R*T=j= + k(),++j; } O G(P){ *o=d,longjmp(l,b); } Z g(Y a){ R a + >>s|(a&~-e)<>s*f); } P _i (L*T) + { *o||p(T); } V _b(V a ){ Z e=a + ; R A[*T++]!=v+c?G():~-v ?a<> z():e>>z();} + V _c(L* l){ T=B +a; W(j)*T-- + =v+j%c ,j/=c; E=B+ (*B== + a+c+u );W(T< B+a)* + E++=* ++T; T =E ; + l-B&& ++ *-- E; } + P M( Z k){ L*p,e + =a>> u; m ()&&G( + ); p =T=B ; _=j=k + ; v=u <>=e; W(T + -e*f>p)*T--=v; W(Tc&&A[v]==T++&&(v|a)-a*-~f<~-s?D=b+(v&a)+a*f-c:d; D&&(j=o-D); }V y(P){ + V a=z();W(m()&&v=d)v?v-b?v-f?v-u?v-=t,a=_b(a):(a&=z()):(a%=z( + )):(a/=z()):(a*=z()); R--T,a;} V _f(P){ V e=c; j=d; D=b; *T==u<>f==a-f&&(e<<=b)&&T++; W(D&&(v=*T++))_d(e); R--T,j; } V F(P){ V n=y(); + W(m()&&v> + a/f? + n>>a + ?h(n)<>a + ):h(n):g(n); } Q main(Q x + ,L**K){ V*A; q(K); W(w())** + K-c*c-b||p(B),_i(!setjmp(l)?T=B + ,M(((A=(*o=m()==c-~s&&(j=a|T[-b])&& + s-m()==~s)?&o[j-a*u]:(T=B,&_)),*A=F()) + ),B:(L*)S); } V z(P){ V + s; W(m() &&v<=f*c + )R v> + b?s :G (): + _:! (v-= + t)? --T,_f + (): v-f?o[ + (T[ -b]|a)- + a*u]: !z(); + G(); } diff --git a/2015/burton/road.to.obscurity b/2015/burton/road.to.obscurity new file mode 100644 index 000000000..fb2d38359 --- /dev/null +++ b/2015/burton/road.to.obscurity @@ -0,0 +1,231 @@ +Development of the obfuscated calculator. +-------------------------------------------------- + +I wanted to enter the IOCCC.... + +I think I can write something clever. Possibly even obscure. The competition is fierce, +but not a closed door. + +I needed an interesting program, that had a reasonable chance of begin shrunk within 4096 bytes, +and lent itself to obfuscation. I had been revisiting utilities I've written over +the years. One useful program was calc, a simple recursive descent signed integer +expression parser I developed from first principles as a demonstration of how computers +work for my son. That program did the basic four operations, but as a programmer, +I needed more, so those were added over time. + +Calc is a useful, functioning utility. The operators before the obfuscation dance began +(this is called fore-shadowing): + + () forced precedence + - ~ ? unary minus, compl, byteswap + * / % & << >> mul, div, mod, bitand, shift: left, right + + - | ^ add, sub, bitor, xor + NUM 0-9 + +This seemed like a reasonable candidate to experiment with obfuscation; perhaps it might +yield good results. + +Principle of operation +-------------------------------------------------- + +The algorithm was and is rather straightforward: + + expr() { + n = term() + t = token() + if (t == ADD) return n += expr() + if (t == SUB) return n -= expr() + if (t == BOR) return n |= expr() + if (t == XOR) return n ^= expr() + ungettoken(t) + return n + } + term() { + n = factor() + t = token() + if (t == MUL) return n *= term() + if (t == DIV) return n /= term() + if (t == AND) return n &= term() + if (t == RSH) return n >> term() + if (t == LSH) return n << term() + ungettoken(t) + return n + } + factor() { + t = token() + if (t == LPAREN) { + n = expr() + if token() == RPAREN + return n + error() + } + if (t == SUB) return -factor() + if (t == CMP) return ~factor() + if (t == QUE) return byteswap(factor()) + if (t == DIG) return strtol() + error() + } + +Obfuscation is a process +-------------------------------------------------- + +Within the above algorithm, there are many details unmentioned, all ripe for obfuscation: + + - input + - tokenization + - atoi input values + - sprintf results + - error recovery + - swapping bytes + - user interface (command line vs stdin) + +Uncertain as to how this would progress, I started obfuscating/condensing everything +except the conversion operations, leaving those to sprintf() and strtol(). The first +version of the obfuscated code used an homage to 1984 anon for I/O, and it featured a +#define for else's and the types, to help minimize the repetition. And of course, most +functions were renamed with one or two letters, and most of the variables became single +letter globals. Tokenization was rather easy with a declared array, just initialized with +unique values for each. + +This was when the obfuscation took a turn for the better (worse): it was easy to hide the +operations via a simple transformation. The code now dealt with small integer values +instead of direct ASCII representation of the operations. And the strings where collapsed +into a single combined error message and operator tokenization table. This was relatively +obscure. + +Next, sprintf() was replaced with a custom formatter. This was rather simple, but at least +the formatting was not obvious. Formatting and printing were split early. strtol() was +replaced with custom logic, limited to 3 practical bases: octal, decimal, and hex. The +last result was remembered in a special variable, dot. + +By this time, I had a version which I considered obscure, and shared this early version +with a couple of colleagues for comments. I suggested I could improve the obfuscation of +a term() and factor(), and would like to have assignable memories. + +This code was pretty dense, but inspired by previous IOCCC entries, I thought I might get +rid of all the else's, which showed the structure of the parser rather clearly. Investing +in the ternary operator, the code got quite a bit more difficult to follow, used only +for-loops, and I had to start taking notes to follow it. This was a good sign! ;-) + +I started testing the code. I wrote a test suite to ensure the changes I made did not +corrupt the processing (oh so easy to do with this obfuscated mess). Why does -1>>32 +yield -1? Oh, yeah: signed arithmetic. Enter Java's unsigned shift: >>>. Better. But +with more features, more to get wrong, and harder to know which expression is causing the +error. The easy solution: if the name begins with 'e', echo the input. Now I can see the +failing expression. Wait, what is this test expression supposed to be testing? + +Wouldn't it be nice to have comments? + +Adding new functionality to an obscure program is ... going about it backwards. Get the +functionality correct and complete, THEN obscure. Sounds obvious, but that did not +happen. I got comments working, then desired to have multiple statements on a single +line (read: semicolon expression terminators). This involved quite a bit of rework of +the input code, but now allowed very convenient user interaction. + +Better Obscurity is a laborious process +-------------------------------------------------- + +Satisfied with the functionality, but unsatisfied with the obscurity, I pondered if I +could get rid of all the constants? This had not been done before (to my knowledge), and +I was able to work out the how-tos and the compromises. Now I can no longer declare my +arrays, I have to allocate them. Obscurity now increased! + +But wouldn't it be nice to have assignable memories? + +Around this time, the formatted code no longer fit with the 2053 limit (due to a lack of +comprehension of the significance of the space-after-brace-and-semi rule, and a layout +program that did not know how to do this). Frustrated, I wrote another program to +reformat this code into rule2.c, which was a single C token per line. This solved the +formatting problem, but intriguingly introduced another. Now I was faced with the 4096 +rule as well as the 2053 rule. But this was a challenge! + +I wrote a de-obfuscator, and worked on both the unobfuscated version and the master code. +I worked on the template formatter to make this as automated as possible, and worked to +achieve both a perfectly presented picture AND the single-line exactly-at-4096 rule2.c. + +Finally, "perfection", with assignable memories! Where perfection is defined as a nicely +formatted picture at less than 2053, and exactly 4096 token-per-line rule2.c. + +Testing Testing Testing +-------------------------------------------------- + +Cross platform, it works on Mac OSX, fails on Linux. It works if #include , but +it dumps core without it (the only change!)?. 64bits without proper declaration of ints +in syscalls yields unpredictable results. 32bit compilation showed problems with byte- +swapping in using addition versus bitwise-or. In 32bit land, x<<32 == x, so x<<32 + x>>32 +does not yield the desired result, but x<<32 | x>>32 does (with appropriate care and +feeding). And the different compilers on different hosts complained loudly and +differently, although all produced correct bits in spite of the noise. + +Further, the program did not do UNIX pipelines well, due to the unbuffered homage code +(byte-at-a-time I/O), of which write() was also the source of the portability problem. +Replace write() with getchar()/putchar(), and it piped well but lost some obscurity and +no longer paid (direct) homage to history. + +Another problem: only one expression at a time was allowed on the command line, no semis, +no comments, and it turns out $2, $3, ... were not handled correctly. Given the new I/O +code, it was now possible to copy the command line arguments into a buffer, and write a +small routine to retrieve bytes from this buffer like getchar(). Voila! Better obfuscation +with much better functionality! + +But wouldn't it be nice to show what the current variables hold? + +Bytes are now hard to find to keep exactly at 4096, and adding functionality to obscured +code is not easy. Restructuring the logic to gain the bytes necessary, code to display +the variables was added. + +Test. Test. Test. Oh, noes! More bugs! Typing "1 + 2 5" yields 3, but no syntax error. +"g = 1" yields a syntax error, and "0xg" does not! ")" causes a seg fault! Why didn't I +test these before I started obfuscating?! By this point, everything I did to the code +perturbed the 4096 bytes, all variables were already a single character, and it was really +difficult to follow the logic in a debugger (single-stepping an expression did the entire +line of code, even if it involved multiple statements -- and it did, everywhere, even in +the unobfuscated version; think: a complex chain of ternary expressions is a single +statement). This involved careful examination of all the expressions within the logic, +trying to find a different way of getting the same result, but typically within fewer +bytes than before to allow for the added logic to fix the bugs. + +The bugs were fixed, the code re-formatted, and rule2.c was again 4096 bytes. + +But wouldn't it be nice for unary plus to work? + +Add unary plus, re-balance. Little things now take a fair bit of work. Adding anything +requires taking away in others, but since all the logic is functional, this means +rewriting the logic to be more concise. After several rounds of this, bytes are scarce to +come by. + +But wouldn't it be nice for assignments to be silent? + +Made them silent (easier said than done!). Why does "1 + 2 5" print a syntax error, but +"a = 1 + 2 5" does not? Rewrite(!) the assignment logic -- and this requires more bytes! + +Better Obscurity Through Simplification +-------------------------------------------------- + +Except there were not enough bytes to do this, unless #include is removed. But +then sbrk() must be declared, eating into the savings. If only there were 512 bytes of +memory already allocated that could be portably touched for free.... + +Light bulb! Memory allocation was excised, and the code became more obscure. + +It was working again! It formats beautifully, it compiled cleanly (with apropos +-Wno-guards), it remains obscure after cpp and clang-format, it measures within the limits +and exactly at 4096 (this latter was really getting challenging to maintain). No more bugs +known, it is feature complete, documentation written. + +But wouldn't it be nice to have a logical not? + +Sigh. This was the last operation added. Another round of code churn, expressions are +difficult to rewrite because they are both obscure and relatively tight. But changing +around the stable initialization code -- by now the largest piece of logic -- yielded the +necessary bytes, and improved obscurity by double duty encoding of the operations +initialization. + +The utility is now truly functional, and feature complete, and obscure. Without src.doc +(basic documentation of the code structure), and some commented expanded logic stashed away, +and the familiarity I have with the code having written and revised it repeatedly, I would +not even want to attempt to decipher the logic. Many times in the debugging, I was thwarted +by my own obfuscations, and went down blind paths in trying to fix a bug or add functionality. +Now I think I have a good entry. + +But wouldn't it be nice to import pre-set definitions from a file? diff --git a/2015/burton/rule2.c b/2015/burton/rule2.c new file mode 100644 index 000000000..74b992995 --- /dev/null +++ b/2015/burton/rule2.c @@ -0,0 +1,1875 @@ +#include +#include +#define R return +#define W(x)for(;x;) +#define I typedef +#define H unsigned +I +jmp_buf +J +; +I +void +P +; +I +char +L +; +I +int +Q +; +I +H +C +; +I +long +long +V +; +I +H +char +O +; +I +H +short +Y +; +I +H +long +long +Z +; +O +S +[ +] += +"syntax_error!M@K~|JOEF\\^~_NHI]" +; +L +* +N +, +* +K +, +* +B +, +* +E +, +* +T +, +* +A +, +* +x +, +D +; +Q +( +* +k +) +( +) +, +v +; +V +z +( +P +) +, +j +, +_ +, +* +o +, +b +, +f +, +u +, +s +, +c +, +a +, +t +, +e +, +d +; +J +l +; +Q +_k +( +P +) +{ +R +* +K +? +* +K +++ +: +~ +- +d +; +} +V +r +( +L +a +) +{ +R +a +&& +putchar +( +a +) +; +} +L +n +( +) +{ +R +* +T += +j += +k +( +) +, +++ +j +; +} +O +G +( +P +) +{ +* +o += +d +, +longjmp +( +l +, +b +) +; +} +Z +g +( +Y +a +) +{ +R +a +>> +s +| +( +a +& +~ +- +e +) +<< +s +; +} +C +p +( +L +* +T +) +{ +W +( +r +( +* +T +++ +) +) +; +* +-- +T +- +c +&& +r +( +c +) +; +} +L +m +( +P +) +{ +W +( +! +( +( +v += +A +[ +* +T +++ +] +) +- +f +) +) +; +R +v +; +} +P +q +( +L +* +* +N +) +{ +O +* +q +; +b += +! +b +; +f += +- +~ +b +; +u += +f +| +b +; +s += +b +<< +u +; +c += +s +| +f +; +a += +s +<< +f +; +t += +- +~ +u +; +e += +a +<< +u +; +D += +v += +u +<< +t +; +q += +S ++ +c +- +~ +t +; +q +[ +~ +s +] += +a +; +q +-- +[ +f +] ++= +a +; +q +-- +[ +c +] ++= +a +; +B += +( +L +* +) +N ++ +~ +e +* +e +; +x += +B ++ +e +; +A += +B ++ +e +/ +f +; +o += +( +V +* +) +( +x ++ +a +) +; +A +[ +- +~ +s +] += +f +; +T += +K += +A +- +a +* +f +; +A +[ +* +-- +q +] += +c ++ +c +; +* +q += +! +c +; +W +( +++ +j +&& +* +++ +q +) +A +[ +* +q +- +a +] += +j +; +W +( +v +< +D ++ +c +) +x +[ +v +- +D +] += +v +, +A +[ +v +++ +] += +j +; +++ +j +, +v += +D += +e +/ +t +; +W +( +++ +v +<= +D ++ +f +* +u +) +x +[ +v +- +D ++ +~ +- +c +] += +v +| +a +, +A +[ +v +] += +A +[ +v +| +a +] += +j +; +W +( +( +A +[ +v +] += +A +[ +v +| +a +] += +j +, +++ +v +< +a +* +u ++ +~ +t +) +) +; +for +( +; +E += +* +++ +N +; +T +[ +~ +d +] += +a +) +W +( +* +T +++ += +* +E +++ +) +; +k += +T +- +K +? +_k +: +getchar +; +} +Z +h +( +C +a +) +{ +R +( +g +( +a +) +<< +s +* +f +) ++ +g +( +a +>> +s +* +f +) +; +} +P +_i +( +L +* +T +) +{ +* +o +|| +p +( +T +) +; +} +V +_b +( +V +a +) +{ +Z +e += +a +; +R +A +[ +* +T +++ +] +!= +v ++ +c +? +G +( +) +: +~ +- +v +? +a +<< +z +( +) +: +c +- +A +[ +* +T +++ +] ++ +b +? +-- +T +, +a +>> +z +( +) +: +e +>> +z +( +) +; +} +V +_c +( +L +* +l +) +{ +T += +B ++ +a +; +W +( +j +) +* +T +-- += +v ++ +j +% +c +, +j +/= +c +; +E += +B ++ +( +* +B +== +a ++ +c ++ +u +) +; +W +( +T +< +B ++ +a +) +* +E +++ += +* +++ +T +; +T += +E +; +l +- +B +&& +++ +* +-- +E +; +} +P +M +( +Z +k +) +{ +L +* +p +, +e += +a +>> +u +; +m +( +) +&& +G +( +) +; +p += +T += +B +; +_ += +j += +k +; +v += +u +<< +t +, +* +T += +a +; +j +< +d +&& +( +* +T +++ ++= +c ++ +u +, +j += +j +== +- +j +? +++ +p +, +-- +j +: +- +j +) +; +! +j +? +* +T +++ += +v +: +_c +( +p +) +; +* +T +++ += +- +~ +s +; +* +T +++ += +v +; +* +T +++ += +a +* +t +- +s +; +p += +T +; +E += +T ++= +s +* +f +; +W +( +k +) +* +T +-- += +x +[ +k +& +~ +- +a +/ +f +] +, +k +>>= +e +; +W +( +T +- +e +* +f +> +p +) +* +T +-- += +v +; +W +( +T +< +E +) +* +p +++ += +* +++ +T +; +* +p += +d +; +} +P +U +( +L +* +E +) +{ +V +* +N += +o +, +f +; +* +E += +f += +d +; +W +( +++ +f +< +c +* +u +- +u +) +* +++ +N +&& +( +M +( +* +N +) +, +r +( +f ++ +a +* +u +) +, +r +( +- +~ +s +) +, +p +( +B +) +, +* +( +T += +E +) += +d +) +; +} +V +w +( +P +) +{ +L +* +S += +N +, +* +x += +N +; +E += +T += +B +; +E ++= +a +<< +f +; +W +( +T +< +E +&& +n +( +) +) +* +T +== +a +- +~ +u +? +U +( +T +) +, +T +: +* +T +== +c +? +E += +S +? +T += +S +: +T +: +S +? +T +: +* +T +== +( +a +| +u +) +? +S += +T +: +* +T +== +a +* +f +- +c +/ +f +? +E += +T +: +! +x +&& +A +[ +* +T +] +!= +f +? +x += +T +++ +: +++ +T +; +* +T += +d +; +R +j +&& +! +x +? +w +( +) +: +T +- +B +; +} +P +_d +( +V +e +) +{ +L +T += +c +* +f +- +f +; +V +o += +j +* +e ++ +v +; +D += +d +; +A +[ +v +] +== +T +++ +? +D += +u +<< +t +: +e +> +c +&& +A +[ +v +] +== +T +++ +&& +( +v +| +a +) +- +a +* +- +~ +f +< +~ +- +s +? +D += +b ++ +( +v +& +a +) ++ +a +* +f +- +c +: +d +; +D +&& +( +j += +o +- +D +) +; +} +V +y +( +P +) +{ +V +a += +z +( +) +; +W +( +m +( +) +&& +v +< +c ++ +f +&& +( +v +-= +u +<< +b +) +>= +d +) +v +? +v +- +b +? +v +- +f +? +v +- +u +? +v +-= +t +, +a += +_b +( +a +) +: +( +a +&= +z +( +) +) +: +( +a +%= +z +( +) +) +: +( +a +/= +z +( +) +) +: +( +a +*= +z +( +) +) +; +R +-- +T +, +a +; +} +V +_f +( +P +) +{ +V +e += +c +; +j += +d +; +D += +b +; +* +T +== +u +<< +t +&& +( +e +-= +f +) +&& +( +* +++ +T +| +a +) +>> +f +== +a +- +f +&& +( +e +<<= +b +) +&& +T +++ +; +W +( +D +&& +( +v += +* +T +++ +) +) +_d +( +e +) +; +R +-- +T +, +j +; +} +V +F +( +P +) +{ +V +n += +y +( +) +; +W +( +m +( +) +&& +v +< +u +* +f +) +v +< +t +? +n ++= +( +v +- +f +) +* +y +( +) +: +v +- +b +^ +t +? +n +^= +y +( +) +: +( +n +|= +y +( +) +) +; +R +-- +T +, +n +; +} +V +i +( +Z +n +) +{ +R +n +>> +a +/ +f +? +n +>> +a +? +h +( +n +) +<< +a +| +h +( +n +>> +a +) +: +h +( +n +) +: +g +( +n +) +; +} +Q +main +( +Q +x +, +L +* +* +K +) +{ +V +* +A +; +q +( +K +) +; +W +( +w +( +) +) +* +* +K +- +c +* +c +- +b +|| +p +( +B +) +, +_i +( +! +setjmp +( +l +) +? +T += +B +, +M +( +( +( +A += +( +* +o += +m +( +) +== +c +- +~ +s +&& +( +j += +a +| +T +[ +- +b +] +) +&& +s +- +m +( +) +== +~ +s +) +? +& +o +[ +j +- +a +* +u +] +: +( +T += +B +, +& +_ +) +) +, +* +A += +F +( +) +) +) +, +B +: +( +L +* +) +S +) +; +} +V +z +( +P +) +{ +V +s +; +W +( +m +( +) +&& +v +<= +f +* +c +) +R +v +< +t +? +( +v +- +f +) +* +z +( +) +: +( +v +-= +u +<< +f +) +< +f +? +v +? +-- +v +? +G +( +) +: +i +( +z +( +) +) +: +~ +z +( +) +: +( +v +-= +f +) +< +u +? +v +? +s += +F +( +) +, +m +( +) +== +a +>> +b +? +s +: +G +( +) +: +_ +: +! +( +v +-= +t +) +? +-- +T +, +_f +( +) +: +v +- +f +? +o +[ +( +T +[ +- +b +] +| +a +) +- +a +* +u +] +: +! +z +( +) +; +G +( +) +; +} diff --git a/2015/burton/src.doc.rot13 b/2015/burton/src.doc.rot13 new file mode 100644 index 000000000..8db0f9d44 --- /dev/null +++ b/2015/burton/src.doc.rot13 @@ -0,0 +1,67 @@ +zrzbel znc: O [128,v/b] N [128,gbxraf] k [32,urkpbai] b [224,ertvfgref] + +Zrzbel vf "nyybpngrq" sebz gur fgnpx, ol gnxvat n ybpny (fgnpx) inevnoyr +naq fhogenpgvat 64x -- gurerol yrnivat cyragl bs ebbz sbe rira eryngviryl +ynetr fgnpx senzrf qhevat erphefvba. + +v znva(v,p**) cnefr pbzznaq yvar be fgqva, nffvtazragf, cevag erfhyg, reebe erpbirel + +v64 _ qbg +p *N yrkvpny gbxraf +p *O vachg ohssre +gq P hafvtarq +p Q fbzr fgngr orgjrra shapf +p *R reebe fgevat, raq cbvagre +v64 S() rkce: + - ^ | +hp T() aba-ybpny tbgb +#q U hafvtarq +#q V glcrqrs +gq W wzc_ohs +p *X cbvagre gb pzq yvar netf +gq Y pune +i Z(h64) qrgrpg reebef, fnir nafjre va qbg, sbezng erfhyg va qrpvzny naq urk +p *A serrovr ahyy cbvagre +gq B hafvtarq pune +gq C ibvq +gq D vag +#q E erghea +p F flagnk reebe + gbxraf +p *G pheerag gbxra cbvagre +i H(p*) cevag gur ertvfgref +gq I ybat ybat +#q J(k) sbe(;k;) +gq K ybat - bayl sbe ehyr2fc.p +gq L hafvtarq fubeg +gq M hafvtarq ybat ybat +v64 n qrevirq: 32 +v64 o qrevirq: 1 +v64 _o(v64) grez: << >> >>> +v64 p qrevirq: 10 +v64 _p(p*) pbaireg ovanel tybony w gb nfpvv qrpvzny +v64 q serrovr: 0 +i _q(v64) npphzhyngr pbairegrq nfpvv olgrf vagb w va onfr cnffrq va +v64 r qrevirq: 256 +v64 s qrevirq: 2 +v64 _s() pbaireg sebz nfpvv gb ovanel: fryrpgf pbaireg onfr (10,8,16), erfhyg va w +h64 t(h16) olgr fjnc 16-ovgf +h64 u(h32) olgr fjnc 32-ovgf +v64 v(h64) fryrpg fvmr naq olgr fjnc zvavzny olgrf +i _v(p*) pbaqvgvbany cevag +v64 w ubyqf cnegvny/npphzhyngrq erfhygf +*() x cge-gb-shap-trgpune +v _x() trg punef sebz fnirq pzq yvar +wo y sbe cnefre reebe erpbirel +p z() fpnaf vachg sbe gbxra, vtaberf juvgrfcnpr +p a() trg arkg vachg punenpgre +v64 *b ertvfgref +h32 c(p*) jevgrf gb fgqbhg hagvy ahyy, arjyvar nccraqrq vagryyvtragyl +i d(**) vavg +v64 e(p) jevgrf p gb fgqbhg +v64 f qrevirq: 8 +v64 g qrevirq: 4 +v64 h qrevirq: 3 +p i pheerag vachg gbxra +v64 j() ernq sebz fgqva hagvy arjyvar be frzv, fxvcf oynax yvarf + pbzzragf, erghea yra +p *k ncgyl anzrq urk pbairefvba gnoyr +v64 l() grez: * / % & (<< >> >>>) +v64 m() snpgbe ~ ! ? -/+ () INE AHZ QBG diff --git a/2015/burton/test.in b/2015/burton/test.in new file mode 100644 index 000000000..d7faf352a --- /dev/null +++ b/2015/burton/test.in @@ -0,0 +1,84 @@ +# comments and blank lines are skipped + +# factors +1 +-1 +-2 +~0 +~1 +~-1 +?0x1234 +?0x12345678 +?0x1122334455667788 +?0xffff1234 +?0xffffffff1234 +?0xffffffffffff1234 + +# terms +1+1 +1 + 1 +1 - 1 +2 * 2 +3 / 3 +4 % 3 +5 & 6 +6 | 7 +7 ^ 1 +8 << 2 +9 >> 2 +-1 >> 32 +-1 >>> 32 +1 << 63 + +# expressions +1<<63 -1 +1<<63+1 +?. +( 4 + 3) * 5 - 1 +~. + +# syntax errors +4**5 +1+(4*3 + +# byte swwapping +0xff00ff00 +?. +. >> 1 +. >> 2 +. >> 3 +. >> 4 +?0xff00ff00 +. << 1 +. << 2 +. << 3 +. << 4 +~0 +0xABCD + +# multiple statements per line, unary +, case indifference +1<<5;.+10;a=?. ++2 ++3 +a>>8 +0xAbC00+. + +# syntax errors found late +) +0xfgh +0xg;0xG;0xh;0xI +1+2 4 +a = 1+2 4 +a=1;b=2;c=3;d=4;e=5;f=6;g=7;h=8 + +# careful! +a=0x11223344<<32 +b=a+0x55667788 +a +?b +$ + +!0 +!3 +!z +!a diff --git a/2015/burton/test.out b/2015/burton/test.out new file mode 100644 index 000000000..ba89a7fe4 --- /dev/null +++ b/2015/burton/test.out @@ -0,0 +1,151 @@ +1 +1 0x00000001 +-1 +-1 0xffffffffffffffff +-2 +-2 0xfffffffffffffffe +~0 +-1 0xffffffffffffffff +~1 +-2 0xfffffffffffffffe +~-1 +0 0x00000000 +?0x1234 +13330 0x00003412 +?0x12345678 +2018915346 0x78563412 +?0x1122334455667788 +-8613303245920329199 0x8877665544332211 +?0xffff1234 +873660415 0x3412ffff +?0xffffffff1234 +3752342914529689600 0x3412ffffffff0000 +?0xffffffffffff1234 +3752342914529755135 0x3412ffffffffffff +1+1 +2 0x00000002 +1 + 1 +2 0x00000002 +1 - 1 +0 0x00000000 +2 * 2 +4 0x00000004 +3 / 3 +1 0x00000001 +4 % 3 +1 0x00000001 +5 & 6 +4 0x00000004 +6 | 7 +7 0x00000007 +7 ^ 1 +6 0x00000006 +8 << 2 +32 0x00000020 +9 >> 2 +2 0x00000002 +-1 >> 32 +-1 0xffffffffffffffff +-1 >>> 32 +4294967295 0xffffffff +1 << 63 +-9223372036854775808 0x8000000000000000 +1<<63 -1 +9223372036854775807 0x7fffffffffffffff +1<<63+1 +-9223372036854775807 0x8000000000000001 +?. +72057594037928064 0x100000000000080 +( 4 + 3) * 5 - 1 +34 0x00000022 +~. +-35 0xffffffffffffffdd +4**5 +syntax error +1+(4*3 +syntax error +0xff00ff00 +4278255360 0xff00ff00 +?. +16711935 0x00ff00ff +. >> 1 +8355967 0x007f807f +. >> 2 +2088991 0x001fe01f +. >> 3 +261123 0x0003fc03 +. >> 4 +16320 0x00003fc0 +?0xff00ff00 +16711935 0x00ff00ff +. << 1 +33423870 0x01fe01fe +. << 2 +133695480 0x07f807f8 +. << 3 +1069563840 0x3fc03fc0 +. << 4 +17113021440 0x3fc03fc00 +~0 +-1 0xffffffffffffffff +0xABCD +43981 0x0000abcd +1<<5 +32 0x00000020 +.+10 +42 0x0000002a +a=?. ++2 +2 0x00000002 ++3 +3 0x00000003 +a>>8 +42 0x0000002a +0xAbC00+. +703530 0x000abc2a +) +syntax error +0xfgh +syntax error +0xg +syntax error +0xG +syntax error +0xh +syntax error +0xI +syntax error +1+2 4 +syntax error +a = 1+2 4 +syntax error +a=1 +b=2 +c=3 +d=4 +e=5 +f=6 +g=7 +h=8 +a=0x11223344<<32 +b=a+0x55667788 +a +1234605615003729920 0x1122334400000000 +?b +-8613303245920329199 0x8877665544332211 +a 1234605615003729920 0x1122334400000000 +b 1234605616436508552 0x1122334455667788 +c 3 0x00000003 +d 4 0x00000004 +e 5 0x00000005 +f 6 0x00000006 +g 7 0x00000007 +h 8 0x00000008 +!0 +1 0x00000001 +!3 +0 0x00000000 +!z +1 0x00000001 +!a +0 0x00000000 diff --git a/2015/burton/test32.out b/2015/burton/test32.out new file mode 100644 index 000000000..12698084a --- /dev/null +++ b/2015/burton/test32.out @@ -0,0 +1,151 @@ +1 +1 0x00000001 +-1 +-1 0xffffffff +-2 +-2 0xfffffffe +~0 +-1 0xffffffff +~1 +-2 0xfffffffe +~-1 +0 0x00000000 +?0x1234 +13330 0x00003412 +?0x12345678 +2018915346 0x78563412 +?0x1122334455667788 +-2005440939 0x88776655 +?0xffff1234 +873660415 0x3412ffff +?0xffffffff1234 +873660415 0x3412ffff +?0xffffffffffff1234 +873660415 0x3412ffff +1+1 +2 0x00000002 +1 + 1 +2 0x00000002 +1 - 1 +0 0x00000000 +2 * 2 +4 0x00000004 +3 / 3 +1 0x00000001 +4 % 3 +1 0x00000001 +5 & 6 +4 0x00000004 +6 | 7 +7 0x00000007 +7 ^ 1 +6 0x00000006 +8 << 2 +32 0x00000020 +9 >> 2 +2 0x00000002 +-1 >> 32 +-1 0xffffffff +-1 >>> 32 +-1 0xffffffff +1 << 63 +-2147483648 0x80000000 +1<<63 -1 +2147483647 0x7fffffff +1<<63+1 +-2147483647 0x80000001 +?. +16777344 0x01000080 +( 4 + 3) * 5 - 1 +34 0x00000022 +~. +-35 0xffffffdd +4**5 +syntax error +1+(4*3 +syntax error +0xff00ff00 +-16711936 0xff00ff00 +?. +16711935 0x00ff00ff +. >> 1 +8355967 0x007f807f +. >> 2 +2088991 0x001fe01f +. >> 3 +261123 0x0003fc03 +. >> 4 +16320 0x00003fc0 +?0xff00ff00 +16711935 0x00ff00ff +. << 1 +33423870 0x01fe01fe +. << 2 +133695480 0x07f807f8 +. << 3 +1069563840 0x3fc03fc0 +. << 4 +-66847744 0xfc03fc00 +~0 +-1 0xffffffff +0xABCD +43981 0x0000abcd +1<<5 +32 0x00000020 +.+10 +42 0x0000002a +a=?. ++2 +2 0x00000002 ++3 +3 0x00000003 +a>>8 +42 0x0000002a +0xAbC00+. +703530 0x000abc2a +) +syntax error +0xfgh +syntax error +0xg +syntax error +0xG +syntax error +0xh +syntax error +0xI +syntax error +1+2 4 +syntax error +a = 1+2 4 +syntax error +a=1 +b=2 +c=3 +d=4 +e=5 +f=6 +g=7 +h=8 +a=0x11223344<<32 +b=a+0x55667788 +a +287454020 0x11223344 +?b +-861239194 0xccaa8866 +a 287454020 0x11223344 +b 1720232652 0x6688aacc +c 3 0x00000003 +d 4 0x00000004 +e 5 0x00000005 +f 6 0x00000006 +g 7 0x00000007 +h 8 0x00000008 +!0 +1 0x00000001 +!3 +0 0x00000000 +!z +1 0x00000001 +!a +0 0x00000000 diff --git a/2015/dogon/Makefile b/2015/dogon/Makefile new file mode 100644 index 000000000..85a33e96c --- /dev/null +++ b/2015/dogon/Makefile @@ -0,0 +1,262 @@ +#!/usr/bin/env make +# +# 2015 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +CSILENCE= -Wno-implicit-int -Wno-variadic-macros -Wno-absolute-value \ + -Wno-bitwise-op-parentheses -Wno-char-subscripts -Wno-dangling-else \ + -Wno-implicit-function-declaration -Wno-parentheses \ + -Wno-shift-op-parentheses -Wno-unsequenced -Wno-conversion \ + -Wno-float-conversion -Wno-missing-variable-declarations \ + -Wno-reserved-id-macro -Wno-shadow -Wno-shorten-64-to-32 \ + -Wno-sign-conversion + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +#CDEFINE= +CDEFINE= -DW=1024 -Dp=800 + +# include files that are needed to compile +# +#CINCLUDE= +CINCLUDE= -I ${X11_INCDIR} -include stdlib.h + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +#LIBS= +LIBS= -L ${X11_LIBDIR} -lm -lX11 + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +CSRC= ${ENTRY}.c +OBJ= ${ENTRY}.o +DATA= +ALT_OBJ= +ALT_ENTRY= +TARGET= ${ENTRY} + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +${ENTRY}: ${CSRC} + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from not failing to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v5; \ + else \ + echo "planet deniers, like the IAU, are amusing"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2015/dogon/hint.html b/2015/dogon/hint.html new file mode 100644 index 000000000..93ddebce8 --- /dev/null +++ b/2015/dogon/hint.html @@ -0,0 +1,144 @@ + + + + + + + Most Crafty + + +

    Most Crafty

    + +

    Gil Dogon
    +http://sokoban-gild.com

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./prog
    +
    + +

    Try:

    + +
    ./prog
    +
    +press and hold the Left Arrow key until you turn 90-degrees to the left
    +
    +when you see a long tunnel, press the function key F2
    +
    +Use the Up, Down, Left and Right keys to change your path
    +
    +Press function higher numbered function keys (F3, F4, ...) to go faster
    +
    +Press F1 to stop
    +
    +Turn 90-degrees to one side
    +
    +Press F4 to and drill into some blocks for a bit
    +
    +Press F1 to stop
    +
    +Turn 180-degrees to face the way you came
    +
    +Press F2 and navigate back down the new hole until you reach the long tunnel again
    +
    +Press F1 to stop
    +
    +etc.
    +
    +Press the ESC key
    +
    + +

    Selected Judges Remarks:

    + +

    You are in a twisty maze blocks, almost all alike.

    + +

    Those blocks are generated by twisty maze of code blocks, almost all different.

    + +

    Can you find your way around either and understand where you are?

    + +

    How many function keys does your keyboard have? Can you generate very high number function keys such as F30 or F31? :-)

    + +

    Textures? We don’t need no stinking textures.

    + +

    Author’s comments:

    + +

    What is it?

    + +

    Just run prog with no arguments on an X11-compatible system. The scenery, though pseudo-randomly generated should be strangely familiar, specially to those still in their teen age. You can navigate using the keyboard arrow keys and the function keys. Your speed is a linear function of (n-1) where Fn is the last function key you have pressed, and you always move in the direction you are looking at. Be aware that you are probably some kind of a Creeper as is obvious from looking at the program, hence your movement is destructive to the environment. So after pressing F12 for warp speed, and moving around randomly, you might find yourself in a 3D maze of twisty little passages, from which there is only one Esc(ape) key. Note that in theory if you have a specialty keyboard with 32 function keys you may even press F31 to reach infinite improbability drive speed, though the author had never tested this feature. However a hidden comment in keysymdef.h suggests the existence of a mythical Sun Keyboard with 35 function keys :)

    + +

    Full disclosure.

    + +

    This entry, tough pretty thoroughly obfuscated, is not entirely original, nor am I Notch. The inspiration for this entry is a demo code written by the Notch himself, which was released with the following license: “you may use the code in here for any purpose in any way you want, at your own risk”. That version will henceforth be referred to as the original. Though the original in itself was quite nice and rather dense piece of code, it was not written in C, nor entirely and meticulously obfuscated, a state of things I hopefully rectified.

    + +

    Some extra features.

    + +

    Basing it on the original which already had a wonderful simple and concise ray casting through a generated voxel world rendering, I added a few tweaks of my own device:

    + +
      +
    • Two pass optimized rendering. The program first calculates 1/16 of the output image by ray casting, and then, when possible uses texture interpolation on the voxel faces. It speeds up the rendering by at least a factor of 4 on most scenes, but extra care must be taken when passing rays through the leaves voxels …
    • +
    • Fixed a small omission in the original. When you looked though a transparent leaves voxel, you did not see the leaves at voxel faces that were far from you. In this version the rendering of those (far face leaves) is correct.
    • +
    • Window rendering size specified in Makefile.
    • +
    • Added the keyboard controls for navigation (and destruction).
    • +
    + + +

    Portability issues.

    + +

    This entry is rather portable I think on modern platforms. It assumes of course basic X-windows availability. There are several other salient assumptions though:

    + +
      +
    • The entry assumes sizeof(int)=4. This seems to cover pretty much everything that supports X-windows so would be broken only on quite ancient machines, embedded processors, or some big iron 64 bit system where sizeof(int)=8.
    • +
    • The entry assumes the default visual has 24 bit depth (RGB). This seems to be the case on most X Servers this days.
    • +
    • The entry, does a thing which is an absolute No-No for X-windows program, i.e. assuming it knows some numeric values for keysyms defined in keysymdef.h . I have searched far and wide the lord Google’s domain, yet was unable to find a version of the file where those assumptions were broken. This enables the important support of up to 32 function keys keyboards without spilling over the size limit, and allows us to use such fun expression for arrow view control as the following:

      + +
       *(a&1?&C:&B)-=(.05 -a/2%2*.1)*!(a-1&4092^3920)
      +
    • +
    + + +

    Precision issues.

    + +

    The entry, on purpose, (see the section about SIMD below) does not use enough bits of precision, so some times the ray will miss the intersection of two voxel faces and push on through. That’s why you may notice some noise along close up voxel edges. Fixing this issue would have taken the entry over the size limit regrettably.

    + +

    Obfuscations.

    + +

    Well, of course you have all the usual suspects, used for extreme compression, and such a nice layout: not very informative identifiers, which are being reused all over the place, some rather gruesome looking expressions, a whole load of magic constants with apparently no rhyme nor reason (including a Lagrange polynomial), and a message from our friendly Cetaceans. However it also includes some clever and not so obvious though instructive techniques, to subtly make the code more magical and efficient, at the same time.

    + +

    Those techniques are about the use of 64 bit integers in order to do SIMD work, in a portable way without ever using any SSE/AVX or other non-portable compiler inline functions! The irony though, is that when compiling the program on modern X86 architectures indeed SSE/AVX is used for the long longs. +Following is some “Spoiler” information, So if you want to play tough, stop reading at this point.

    + +

    Portable SIMD programming.

    + +

    So how is this done? Quite simply by using the whole long long arithmetic’s capability. I think the C99 standard assures us that long long has at least 64 bits. Most of those bits are unused in normal programs, however here we use them more wisely. For example, in the inner loop of the program you have the innocent looking expression i+=d. What it does in fact, is a SIMD addition of two vectors, each with three signed fixed point coordinates, advancing our ray in 3D space! +To spell it out, the macro producing such vectors is P, and the assignment q=0x820008202625a0 sets our creeper original position to about (32.5, 32.5019, 2441.406) .

    + +

    Evidently when doing such arithmetics, care must me taken to avoid overflow from one component to the other, but since our voxel world is a torus of size 64 in each dimension this hardly matters. A subtle issue, is how to deal with signed quantities. In the i+=d expression above i has 3 positive components, but d has arbitrary signed components, as our ray may face in any direction. It seems things should not work, specially as we defined both i and d as unsigned! However notice that the T (and P )macro converts float to signed long longs. Once sign is extended from a least component into higher bits, it seems at first to be recipe for disaster, however everything works beautifully, and you get precise component results when the final accumulation components in i are positive. This only gets broken a bit when the final accumulation has a least significant negative component. To see this bug in action change the assignment above to q=0x82000820000000, and look towards the negative direction of the main tunnel.

    + +

    Similar technique is used on the RGB components so their brightness can be adjusted simultaneously by the expression: o=o*b>>8 . Of course some spare bits are needed between the components, so they are spread in the long long and reordered as RBG.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2016, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2015/dogon/hint.text b/2015/dogon/hint.text new file mode 100644 index 000000000..48074576d --- /dev/null +++ b/2015/dogon/hint.text @@ -0,0 +1,111 @@ +# Most Crafty + +Gil Dogon + + + +## Judges' comments: +### To use: + + make + + ./prog + +### Try: + + ./prog + + press and hold the Left Arrow key until you turn 90-degrees to the left + + when you see a long tunnel, press the function key F2 + + Use the Up, Down, Left and Right keys to change your path + + Press function higher numbered function keys (F3, F4, ...) to go faster + + Press F1 to stop + + Turn 90-degrees to one side + + Press F4 to and drill into some blocks for a bit + + Press F1 to stop + + Turn 180-degrees to face the way you came + + Press F2 and navigate back down the new hole until you reach the long tunnel again + + Press F1 to stop + + etc. + + Press the ESC key + +### Selected Judges Remarks: + +You are in a twisty maze blocks, almost all alike. + +Those blocks are generated by twisty maze of code blocks, almost all different. + +Can you find your way around either and understand where you are? + +How many function keys does your keyboard have? Can you generate very high number function keys such as F30 or F31? :-) + +*Textures? We don't need no stinking textures.* + +## Author's comments: +### What is it? + +Just run prog with no arguments on an X11-compatible system. The scenery, though pseudo-randomly generated should be strangely familiar, specially to those still in their teen age. You can navigate using the keyboard arrow keys and the function keys. Your speed is a linear function of (n-1) where Fn is the last function key you have pressed, and you always move in the direction you are looking at. Be aware that you are probably some kind of a Creeper as is obvious from looking at the program, hence your movement is destructive to the environment. So after pressing F12 for warp speed, and moving around randomly, you might find yourself in a 3D maze of twisty little passages, from which there is only one Esc(ape) key. Note that in theory if you have a specialty keyboard with 32 function keys you may even press F31 to reach infinite improbability drive speed, though the author had never tested this feature. However a hidden comment in keysymdef.h suggests the existence of a mythical Sun Keyboard with 35 function keys :) + +### Full disclosure. +This entry, tough pretty thoroughly obfuscated, is not entirely original, nor am I Notch. The inspiration for this entry is a demo code written by the Notch himself, which was released with the following license: "you may use the code in here for any purpose in any way you want, at your own risk". That version will henceforth be referred to as the original. Though the original in itself was quite nice and rather dense piece of code, it was not written in C, nor entirely and meticulously obfuscated, a state of things I hopefully rectified. + +### Some extra features. + +Basing it on the original which already had a wonderful simple and concise ray casting through a generated voxel world rendering, I added a few tweaks of my own device: + +* Two pass optimized rendering. The program first calculates 1/16 of the output image by ray casting, and then, when possible uses texture interpolation on the voxel faces. It speeds up the rendering by at least a factor of 4 on most scenes, but extra care must be taken when passing rays through the leaves voxels ... +* Fixed a small omission in the original. When you looked though a transparent leaves voxel, you did not see the leaves at voxel faces that were far from you. In this version the rendering of those (far face leaves) is correct. +* Window rendering size specified in Makefile. +* Added the keyboard controls for navigation (and destruction). + +### Portability issues. + +This entry is rather portable I think on modern platforms. It assumes of course basic X-windows availability. There are several other salient assumptions though: + +* The entry assumes sizeof(int)=4. This seems to cover pretty much everything that supports X-windows so would be broken only on quite ancient machines, embedded processors, or some big iron 64 bit system where sizeof(int)=8. +* The entry assumes the default visual has 24 bit depth (RGB). This seems to be the case on most X Servers this days. +* The entry, does a thing which is an absolute No-No for X-windows program, i.e. assuming it knows some numeric values for keysyms defined in keysymdef.h . I have searched far and wide the lord Google's domain, yet was unable to find a version of the file where those assumptions were broken. This enables the important support of up to 32 function keys keyboards without spilling over the size limit, and allows us to use such fun expression for arrow view control as the following: + + *(a&1?&C:&B)-=(.05 -a/2%2*.1)*!(a-1&4092^3920) + + +### Precision issues. + +The entry, on purpose, (see the section about SIMD below) does not use enough bits of precision, so some times the ray will miss the intersection of two voxel faces and push on through. That's why you may notice some noise along close up voxel edges. Fixing this issue would have taken the entry over the size limit regrettably. + +### Obfuscations. + +Well, of course you have all the usual suspects, used for extreme compression, and such a nice layout: not very informative identifiers, which are being reused all over the place, some rather gruesome looking expressions, a whole load of magic constants with apparently no rhyme nor reason (including a Lagrange polynomial), and a message from our friendly Cetaceans. However it also includes some clever and not so obvious though instructive techniques, to subtly make the code more magical and efficient, at the same time. + +Those techniques are about the use of 64 bit integers in order to do SIMD work, in a portable way without ever using any SSE/AVX or other non-portable compiler inline functions! The irony though, is that when compiling the program on modern X86 architectures indeed SSE/AVX is used for the long longs. +Following is some "Spoiler" information, So if you want to play tough, stop reading at this point. + +### Portable SIMD programming. + +So how is this done? Quite simply by using the whole long long arithmetic's capability. I think the C99 standard assures us that long long has at least 64 bits. Most of those bits are unused in normal programs, however here we use them more wisely. For example, in the inner loop of the program you have the innocent looking expression i+=d. What it does in fact, is a SIMD addition of two vectors, each with three signed fixed point coordinates, advancing our ray in 3D space! +To spell it out, the macro producing such vectors is P, and the assignment q=0x820008202625a0 sets our creeper original position to about (32.5, 32.5019, 2441.406) . + +Evidently when doing such arithmetics, care must me taken to avoid overflow from one component to the other, but since our voxel world is a torus of size 64 in each dimension this hardly matters. A subtle issue, is how to deal with signed quantities. In the i+=d expression above i has 3 positive components, but d has arbitrary signed components, as our ray may face in any direction. It seems things should not work, specially as we defined both i and d as unsigned! However notice that the T (and P )macro converts float to signed long longs. Once sign is extended from a least component into higher bits, it seems at first to be recipe for disaster, however everything works beautifully, and you get precise component results when the final accumulation components in i are positive. This only gets broken a bit when the final accumulation has a least significant negative component. To see this bug in action change the assignment above to q=0x82000820000000, and look towards the negative direction of the main tunnel. + +Similar technique is used on the RGB components so their brightness can be adjusted simultaneously by the expression: o=o*b>>8 . Of course some spare bits are needed between the components, so they are spread in the long long and reordered as RBG. + +-------------------------------------------------------------------------------- + diff --git a/2015/dogon/prog.c b/2015/dogon/prog.c new file mode 100644 index 000000000..976c19594 --- /dev/null +++ b/2015/dogon/prog.c @@ -0,0 +1,56 @@ +#define So long +#define R rand() +#include +#include +#define T(i,F) ((So long)(i)<>10&63|q>>24&4032|q>>38&258048 +char J[1<<18]; int G[W*p],_,k,I=W/4+1,w=p/4+1; float C,B,e; + +unsigned So long A,n,d, t,h,x, f,o,r,a,l,L,F,i,s,H=1<<18,b=250,D[1<<14],z[W*p],q +=0x820008202625a0;main(){Display *j=XOpenDisplay(0);Window u=XCreateSimpleWindow +(j,RootWindow(j,0),0,0,W,p,1,0,0);XImage *Y=XCreateImage(j,DefaultVisual(j,0),24 +,2,0,(char*)G,W,p,32,0); XEvent M; for(XMapWindow(j,u); XSelectInput( j,u,1)&&a- +65307; ){ if(!H){ if(XCheckWindowEvent(j,u,1,&M)){ a=XLookupKeysym(&M.xkey,0);*( +a&1?&C:& B)-=(.05 +-a/2% 2* .1)*!(a- +1& 4092^ 3920);a+ +2&0xfe0^ 0xfc0||( +s=a+2&31 ); }else +{ y(k,p+ ){ F=k%w* 4|k/w; float a[6],S=(F-p /2.) /p; +y(_,W+){ i=_%I*4|_/I; if( F>38)) { float V=(i-W/2. )/p,U=O( +S,1,B),m =32768,Q=m; a[4] =O(-1,S,B); a[3]= O(U,V,C) +; a[5]=O (-V,U,C); P((a+3 ),s*42); t||(A=d) ;f=0;y(n +,){float N=a[n+3], E=1024 /fabs(N); b= N<0; float K= +(((q>>20 *n)^~-b)+!b&1023 )/1024.; y(d,)a[d ]=a[d+3] +*E; a[n] =round(a[n]); P( a,K); i=q+d; P(a, 1); e=E* +K; for(; e>40)&1023|i>>8&4190208 |4194304 +:i&1023| i>>28&4190208|(b^l==r)<<23; if(h =D[(x>>6 +&0xf|x>> 14&0x3f0)+t*768]){ o=h; f=n|l*4| x<<32; m +=e; } if (t==8&e>8; G[L]=o>> 32<<8|o& +16711935 ; z[L]=3*(Q<=m)|f|b<<56; } else{ d=l*(f<< +8>>40)+( 4-l)*(h<<8>>40)>>2&16774143; o=D [(d>> 6& +15|d>>14 &1008)+J[(int)h/4]*768]*(b=h>>56 )>>8; G[ +L]=o>>32 <<8 | o& 16711935 ; z[L]=( +int) h|d <<32|b<< 56; } }} } q +=A; +XPutImage (j, u+0, DefaultGC (j,J[X(q +)]=0),Y, 0,0,0,0, W,p); }} else{ L= +--H/768; J[H] =R% 16*(R%4< abs((H>> +6&63)-32 )+abs((H +>>12&63) -32)-3); +i=H &15; F=H %768 +>>4; if( L<16){if +(L-1|!(R %3))b=R% +96^255; l=i*i*3+i*81/4&3; a=L>3?L-8?L-5?9858122:12365733-488848*((i+F/4*4)%8&&F% +4):R%2*5298487:3352537*L*L-14202379*L+19205553; if(L==4)if(FF-19)b*=0.7; if(L==3){ if((i-1&15)<14&(F-1&15)<14&!(F&16)){ a=12359778; _=7 +-i; k=7-F%16; _^=_>>31; k^=k>>31; b=196-R%32+(k>_?k:_)%3*42;} else{ b*=1+R%2*(.5 +-(i&1)); } } D[H]=(a&16711935|(a&65280)<<24)*(b>>(F>>5))>>8&0xff00ff00ff; } } }} diff --git a/2015/duble/Makefile b/2015/duble/Makefile new file mode 100644 index 000000000..9ee419b55 --- /dev/null +++ b/2015/duble/Makefile @@ -0,0 +1,259 @@ +#!/usr/bin/env make +# +# 2015 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +CSILENCE= -Wno-parentheses -Wno-unused-value -Wno-return-type \ + -Wno-overlength-strings -Wno-unused-result \ + -Wno-implicit-int + +clang_CSILENCE=-Wno-string-plus-int -Wno-int-conversion + +# compiler standard +# +CSTD= -std=c11 \ + -D_BSD_SOURCE \ + -D_XOPEN_SOURCE +# _BSD_SOURCE needed for function usleep() +# _XOPEN_SOURCE needed for function lrand48() + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= + +# include files that are needed to compile +# +CINCLUDE= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + +CSILENCE+= ${${CC}_CSILENCE} + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +CSRC= ${ENTRY}.c +OBJ= ${ENTRY}.o +DATA= +ALT_OBJ= +ALT_ENTRY= +TARGET= ${ENTRY} + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +${ENTRY}: ${CSRC} + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from not failing to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v5; \ + else \ + echo "planet deniers, like the IAU, are amusing"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2015/duble/codes.txt b/2015/duble/codes.txt new file mode 100644 index 000000000..8103c4c7a --- /dev/null +++ b/2015/duble/codes.txt @@ -0,0 +1,38 @@ + +k: CALL l_no_end 1_FORWARD GO_BACK 1_TURN_RIGHT 2_FORWARD TGGL_PEN GO_BACK 1_TURN_LEFT 1_FORWARD TGGL_PEN 1_FORWARD +h: CALL l_no_end 1_FORWARD GO_BACK 2_FORWARD 1_TURN_RIGHT BOUNCE 1_TURN_RIGHT 1_FORWARD +f: CALL l_no_end 2_FORWARD 2_FORWARD 1_TURN_RIGHT +l: CALL l_no_end 1_TURN_LEFT +l_no_end: 2_FORWARD TGGL_PEN 1_TURN_RIGHT 1_FORWARD 1_TURN_LEFT 1_FORWARD 1_TURN_LEFT BOUNCE 1_TURN_LEFT 2_FORWARD 2_FORWARD +j: MIDDLE 5_FORWARD 1_FORWARD 1_TURN_RIGHT GO_BACK TGGL_PEN 1_FORWARD 1_TURN_LEFT 5_FORWARD 2_FORWARD TGGL_PEN +i: MIDDLE 2_FORWARD 1_TURN_LEFT GO_BACK TGGL_PEN 1_FORWARD 1_TURN_RIGHT 2_FORWARD 1_FORWARD TGGL_PEN +t: ABOVE 5_FORWARD 1_FORWARD 1_TURN_LEFT TGGL_PEN 2_TURN_LEFT 2_TURN_LEFT 2_FORWARD GO_BACK TGGL_PEN 1_TURN_LEFT 1_FORWARD +s: 1_FORWARD TGGL_PEN 1_TURN_RIGHT 1_FORWARD BOUNCE 2_TURN_RIGHT 1_TURN_RIGHT +v: MIDDLE 1_FORWARD 1_TURN_LEFT 1_FORWARD BOUNCE 1_FORWARD 1_TURN_LEFT +x: MIDDLE 1_TURN_LEFT 2_FORWARD TGGL_PEN 5_TURN_LEFT TGGL_PEN 1_TURN_LEFT 2_FORWARD +p: MIDDLE 5_FORWARD 2_FORWARD GO_BACK 5_FORWARD 1_FORWARD 5_TURN_RIGHT 1_TURN_RIGHT +e: 1_FORWARD 1_TURN_RIGHT TGGL_PEN 1_TURN_RIGHT TGGL_PEN 1_TURN_RIGHT GO_BACK 1_TURN_RIGHT TGGL_PEN 5_TURN_LEFT 1_TURN_LEFT +z: TGGL_PEN 2_FORWARD 1_TURN_RIGHT BOUNCE 1_TURN_RIGHT 1_FORWARD 1_TURN_LEFT 1_FORWARD 2_TURN_RIGHT BOUNCE 2_TURN_RIGHT 1_FORWARD +w: CALL half_w CALL half_w +half_w: MIDDLE 2_FORWARD 1_TURN_LEFT BOUNCE 1_TURN_LEFT 1_FORWARD +y: CALL u 2_FORWARD 1_FORWARD 1_TURN_RIGHT +u: MIDDLE CALL u_bridge 2_FORWARD 1_FORWARD +u_bridge: 2_FORWARD 2_TURN_LEFT 2_TURN_LEFT 1_FORWARD GO_BACK +m: CALL n GO_BACK 2_FORWARD 2_TURN_RIGHT 2_TURN_RIGHT 1_FORWARD +n: CALL r 2_TURN_RIGHT 1_FORWARD +b: ABOVE 2_FORWARD 2_FORWARD CALL r_trace 2_TURN_RIGHT 2_TURN_RIGHT +r: MIDDLE CALL r_trace +r_trace: 2_FORWARD 1_FORWARD GO_BACK 2_FORWARD 2_TURN_RIGHT +q: CALL o GO_BACK 5_FORWARD 2_FORWARD +g: CALL o GO_BACK 5_FORWARD 1_FORWARD 5_TURN_RIGHT +o: CALL c 2_TURN_LEFT 1_FORWARD +d: CALL c 1_FORWARD ABOVE 5_FORWARD 1_FORWARD 1_TURN_LEFT +a: CALL c 1_FORWARD TGGL_PEN 2_TURN_LEFT 1_TURN_LEFT GO_BACK TGGL_PEN 1_TURN_RIGHT 1_FORWARD 1_TURN_LEFT +c: 2_FORWARD 2_TURN_RIGHT GO_BACK TGGL_PEN 1_FORWARD 2_TURN_LEFT 2_TURN_LEFT +.: TGGL_PEN +,: TGGL_PEN GO_BACK 1_TURN_RIGHT +;: CALL : 1_TURN_RIGHT +:: MIDDLE TGGL_PEN 2_FORWARD 1_FORWARD TGGL_PEN +!: ABOVE 5_FORWARD TGGL_PEN 2_FORWARD TGGL_PEN +?: 5_FORWARD 1_FORWARD TGGL_PEN 2_TURN_RIGHT 2_TURN_RIGHT 1_FORWARD 1_TURN_RIGHT 1_TURN_LEFT TGGL_PEN 2_FORWARD TGGL_PEN + diff --git a/2015/duble/hint.html b/2015/duble/hint.html new file mode 100644 index 000000000..5cbf48e58 --- /dev/null +++ b/2015/duble/hint.html @@ -0,0 +1,223 @@ + + + + + + + Best Handwriting + + +

    Best Handwriting

    + +

    Etienne Duble etienne.duble@imag.fr
    +http://lig-membres.imag.fr/duble

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +echo Some text | ./prog
    +
    + +

    Try:

    + +
    echo Hello, world | ./prog
    +
    +DRAFT=1 ./prog < prog.c
    +
    +./prog
    +> [type]
    +(...observe...) 
    +
    +./prog < prog.c
    +
    + +

    Selected Judges Remarks:

    + +

    Beautiful penmanship! However, your fonts may vary.

    + +

    How does this entry compress the font it uses? What’s the purpose of lrand48()? +Why does the program dump core, when it does :) ?

    + +

    Author’s comments:

    + +

    Introduction

    + +

    This program prints text in your terminal with an interesting +hand-writing effect.

    + +

    It uses the braille patterns range of the unicode standard: this +allows to consider each terminal character as a tiny 2x4 bitmap.

    + +

    Turning the Braille code into something visual might be considered +blasphemous. When I was fighting to make this program work, I started +wondering if it was not the reason for its very erratic behaviour.

    + +

    prog.c vs prog.orig.c

    + +

    The file prog.orig.c is the one I submitted.

    + +

    Gil Dogon noted a few unsafe statements (statements whose behaviour is +undefined in the C standard and, as such, could cause issues with other +compilers or optimization levels). These have been fixed in prog.c. +After this fix, in order to remain rule-2-compliant, a variable name has +also been shortened in this file.

    + +

    How to build

    + +

    If you have clang:

    + +
    $ CC=clang make -e
    +
    + +

    Otherwise (gcc):

    + +
    $ make
    +
    + +

    (You will get a few warnings in this case.)

    + +

    How to use it

    + +

    You need a terminal configured to handle an UTF-8 encoding and a +font including braille patterns. +This is the default on most modern GNU/Linux operating systems. +The default terminal application (gnome-terminal) or even a simple +xterm should render things properly. +I tested this on several Debian and Ubuntu systems, 32 and 64bits (no configuration was needed). +I also tested it on FreeBSD 9.3 32bits (font and encoding configuration +was needed in this case).

    + +

    Basic mode:

    + +
    $ echo 'I am testing this thing.' | ./prog
    +[... rendering ...]
    +
    +$ ./prog < lorem-ipsum.txt
    +[... rendering ...]
    +
    + +

    Interactive mode:

    + +
    $ ./prog
    +> hello world!!!
    +[... rendering ...]
    +>
    +
    + +

    Obfuscation

    + +

    This entry is obfuscated in various ways:

    + +
      +
    • The structure is hidden by avoiding loops, ‘if’ statements, ternary +conditionals, and jump-related instructions. Instead, recursivity is +heavily used.
    • +
    • Merging all functions into one added even more recursivity. ;)
    • +
    • The provided code does not contain the same number of opening and closing +parenthesis.
    • +
    • Preprocessing the code inflates it and adds lots of indents. Removing some +of the tricks involved without breaking the program will be challenging.
    • +
    • The program ‘plays’ with standard input & output streams, which causes +unusual side effects.
    • +
    • Some variables are re-used for unrelated processings.
    • +
    • Crucial data may be hidden in unexpected places (e.g. as the size of +a temporary buffer).
    • +
    • Some parts of the code may have no effect (but may have an effect in a +specific context, who knows?), and classical libc functions may not act +as usual.
    • +
    • And of course variable names are hard to read (or distracting).
    • +
    + + +

    On the other hand, the following may help:

    + +
      +
    • The code layout should help to identify which part of the code is +obfuscated. ;)
    • +
    • File ‘codes.txt’ shows how each character is drawn. This data is +encoded in macro O_o at the top of the source file.
    • +
    + + +

    Limitations

    + +

    Charset

    + +

    In order to comply with the size rule, I encoded only a part of the visible ASCII +chars:

    + +
    a-z, A-Z, '.' ':' ',' ';' '!' and '?'.
    +
    + +

    Uppercase and lowercase chars are rendered the same. +The program also understand the space and the linefeed (\n). +Other chars are simply ignored (most of the time ;)

    + +

    Stack size

    + +

    This limitation is due to the heavy use of recursivity. After having processed +a large number of characters, the process may exceed the stack size and crash. +(However I did not experience this myself. The top-level recursion might be +removed by the compiler as part of its optimizations.)

    + +

    Line rendering

    + +

    The program does its best to avoid cutting words at the end of lines, but +it could still happen in case of long words.

    + +

    Subtleties and extra features

    + +

    Handling more than text docs?

    + +

    Given the limited set of characters handled, the program is mostly limited +to simple text documents. +Thus, if you try for example:

    + +
    $ ./prog < prog.c 
    +
    + +

    You will not get something that looks like C code. (but you can still try, +if you are curious. :)

    + +

    A ‘draft’ mode

    + +

    Defining an environment variable called DRAFT will enable the ‘draft-mode’. +Try for example:

    + +
    $ echo 'testing the draft mode' | DRAFT=1 ./prog
    +
    + +

    The program will run much faster but the rendering will be less precise.

    + +

    The subtle interactive mode

    + +

    I saved the best for last: usually, programs that handle an “interactive +mode” have to check whether their standard input is a terminal or not (by +using isatty()). Did you notice that this program does not perform any such +detection, but still behaves (or seems to behave) appropriately?

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2016, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2015/duble/hint.text b/2015/duble/hint.text new file mode 100644 index 000000000..0dd132593 --- /dev/null +++ b/2015/duble/hint.text @@ -0,0 +1,187 @@ +# Best Handwriting + +Etienne Duble + + + +## Judges' comments: +### To use: + + make + + echo Some text | ./prog + +### Try: + + echo Hello, world | ./prog + + DRAFT=1 ./prog < prog.c + + ./prog + > [type] + (...observe...) + + ./prog < prog.c + +### Selected Judges Remarks: + +Beautiful penmanship! However, your fonts may vary. + +How does this entry compress the font it uses? What's the purpose of lrand48()? +Why does the program dump core, when it does :) ? + +## Author's comments: + +### Introduction + +This program **prints text in your terminal with an interesting +hand-writing effect**. + +It uses the *braille patterns* range of the unicode standard: this +allows to consider each terminal character as a tiny 2x4 bitmap. + +Turning the Braille code into something visual might be considered +blasphemous. When I was fighting to make this program work, I started +wondering if it was not the reason for its very erratic behaviour. + +### prog.c vs prog.orig.c + +The file `prog.orig.c` is the one I submitted. + +Gil Dogon noted a few unsafe statements (statements whose behaviour is +undefined in the C standard and, as such, could cause issues with other +compilers or optimization levels). These have been fixed in `prog.c`. +After this fix, in order to remain rule-2-compliant, a variable name has +also been shortened in this file. + +### How to build + +If you have `clang`: + + $ CC=clang make -e + +Otherwise (gcc): + + $ make + +(You will get a few warnings in this case.) + +### How to use it + +You need a terminal configured to handle an *UTF-8* encoding and a +font including *braille patterns*. +This is the default on most modern GNU/Linux operating systems. +The default terminal application (gnome-terminal) or even a simple +xterm should render things properly. +I tested this on several Debian and Ubuntu systems, 32 and 64bits (no configuration was needed). +I also tested it on FreeBSD 9.3 32bits (font and encoding configuration +was needed in this case). + +Basic mode: + + $ echo 'I am testing this thing.' | ./prog + [... rendering ...] + + $ ./prog < lorem-ipsum.txt + [... rendering ...] + +Interactive mode: + + $ ./prog + > hello world!!! + [... rendering ...] + > + +### Obfuscation + +This entry is obfuscated in various ways: + +* The structure is hidden by avoiding loops, 'if' statements, ternary + conditionals, and jump-related instructions. Instead, recursivity is + heavily used. +* Merging all functions into one added even more recursivity. ;) +* The provided code does not contain the same number of opening and closing + parenthesis. +* Preprocessing the code inflates it and adds lots of indents. Removing some + of the tricks involved without breaking the program will be challenging. +* The program 'plays' with standard input & output streams, which causes + unusual side effects. +* Some variables are re-used for unrelated processings. +* Crucial data may be hidden in unexpected places (e.g. as the size of + a temporary buffer). +* Some parts of the code may have no effect (but may have an effect in a + specific context, who knows?), and classical libc functions may not act + as usual. +* And of course variable names are hard to read (or distracting). + +On the other hand, the following may help: + +* The code layout should help to identify which part of the code is + obfuscated. ;) +* File 'codes.txt' shows how each character is drawn. This data is + encoded in macro O_o at the top of the source file. + + +### Limitations + +#### Charset + +In order to comply with the size rule, I encoded only a part of the visible ASCII +chars: + + a-z, A-Z, '.' ':' ',' ';' '!' and '?'. + +Uppercase and lowercase chars are rendered the same. +The program also understand the space and the linefeed (\n). +Other chars are simply ignored (most of the time ;) + +#### Stack size + +This limitation is due to the heavy use of recursivity. After having processed +a large number of characters, the process may exceed the stack size and crash. +(However I did not experience this myself. The top-level recursion might be +removed by the compiler as part of its optimizations.) + +#### Line rendering + +The program does its best to avoid cutting words at the end of lines, but +it could still happen in case of long words. + +### Subtleties and extra features + +#### Handling more than text docs? + +Given the limited set of characters handled, the program is mostly limited +to simple text documents. +Thus, if you try for example: + + $ ./prog < prog.c + +You will not get something that looks like C code. (but you can still try, +if you are curious. :) + +#### A 'draft' mode + +Defining an environment variable called DRAFT will enable the 'draft-mode'. +Try for example: + + $ echo 'testing the draft mode' | DRAFT=1 ./prog + +The program will run much faster but the rendering will be less precise. + +#### The subtle interactive mode + +I saved the best for last: usually, programs that handle an "interactive +mode" have to check whether their standard input is a terminal or not (by +using isatty()). Did you notice that this program does not perform any such +detection, but still behaves (or seems to behave) appropriately? + + +-------------------------------------------------------------------------------- + diff --git a/2015/duble/lorem-ipsum.txt b/2015/duble/lorem-ipsum.txt new file mode 100644 index 000000000..f6ce2cf88 --- /dev/null +++ b/2015/duble/lorem-ipsum.txt @@ -0,0 +1,8 @@ + + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit. + +Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula non tempus aliquam, nunc turpis ullamcorper nibh, in tempus sapien eros vitae ligula. Pellentesque rhoncus nunc et augue. Integer id felis. Curabitur aliquet pellentesque diam. Integer quis metus vitae elit lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. Integer tortor tellus, aliquam faucibus, convallis id, congue eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum posuere, metus purus iaculis lectus, et tristique ligula justo vitae magna. + +Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet. + diff --git a/2015/duble/prog.c b/2015/duble/prog.c new file mode 100644 index 000000000..ec7af97bf --- /dev/null +++ b/2015/duble/prog.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include +#include + #define O_o "sfX4.Fv8H!`uf"\ + "|~0y'vWtA@:LcO9d}y.!uL!Gd+ml(<+Ds!J"\ + "e.6!r!%l6G!n~^6)*(9-(C-7)%3),_Q+=!QO*(_Q%QQ+(C&1)*O3-_Q), +_0+=!_0*!QO+(1-2*_0)*!(C^4),(C==5)&&(__>>=4,Q8=__,Q7=O0,Q4=__&15,O=1,_ +()|O ++&_(),__=Q8 ,O0=Q7 ),Q3=( _Q+= O8*(9 *O4* +O1 > lrand48()) +(_O%=8,( (_O% 6>2) -(_O% +7<2) )*QQ+((_O +7)%8<3 )-(_O>4) )*( C>5 ), +Q2 = _Q/ O3)* O6+Q5 +(O2=_Q%QQ )/ 2,*Q3=* +Q3 % O4+O4|(1 << Q_("" "@CADBEHI") [_Q%2+_Q +%O3/ QQ*2 ]- 64)* _0, sprintf(O5, Q9, Q2+1, +O2/2 ,*Q3>>8 ,85* 3&* Q3,Q2+1 )&& _0&&(O=8, +Q1 = O5,_()), Q0 +=(O2 >Q0)*_0*(O2 -Q0 ),__ ++=!( C>9)*(3- __+ ( __>>4))-3, __ +=(C>12 +) *( (__<<4 )+ C-3-__) ,usleep( O4* _0/(3* +O8+1 )),O =3,_() )) ,!O9 --&& read( +1 ,& OO,1)> 0&&(O= (QO=OO ==35 )*3+6 ,_() +,QO&&(OO=10,O=6,_(),1)||(O=4,_()),0)||close(dup2(3-dup2(1,dup(0)-3),1) +*0+2)*0||Q write(1,"> ",2),ioctl(Q0=0,TIOCGWINSZ,O5)^--O&(O3=(QQ=(O6=* +((short*)O5+1))*2)*4),Q6=-O1,Q5=calloc(3*O6,8),_()),Q (O=8,QO=!(O2=OO- +10)|!(Q2=OO-32)*(Q0+58>QQ)|(Q0+12>QQ))&&(Q1=O_(3B),_(),write(1,"> ",2) +),Q0+=!QO*!Q2*4-QO*Q0,O2*Q2&&(!Q0&&(memset(Q5,0,3*O3),Q0=4,Q1="\n\n\n" +O_(3A),_()),O=7,_Q=7*QQ+Q0+2,_O=_0=0,OO+=(OO>64 &OO<91)*32,O0=Q_(O_o)+ +O7,_(),(*O0-OO)||(O=2,O0+='a',_( )))),Q *O0-OO)&&(*(O0+=O1)-33)&&(O=0, +_(),O=7,O0+=O1,_()),Q write(0,Q1,strlen(Q1))),Q OO=Q_(O_o)[Q6+=O1],(Q6 + %strlen(O_o)-O7)&&(O=6,_(),O=9,_()));Q_(})/*+++++ IOCCC 2015 +++++*/ + +main() +{ + puts("hello world!"); +} diff --git a/2015/duble/prog.orig.c b/2015/duble/prog.orig.c new file mode 100644 index 000000000..1cb63ece5 --- /dev/null +++ b/2015/duble/prog.orig.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include +#include + #define O_o "sfX4.Fv8H!`uf"\ + "|~0y'vWtA@:LcO9d}y.!uL!Gd+ml(<+Ds!J"\ + "e.6!r!%l6G!n~^6)*(9-(OQ-7)%3),_Q+=!QO*(_Q%QQ+(OQ&1)*O3 +-_Q),_0+=!_0*!QO+(1-2*_0)*!(OQ^4),(OQ==5)&&(__>>=4,Q8=__,Q7 =O0,Q4=__& +15,O =1,_()|++O&_ (),O0 =Q7,__= Q8), Q3 =( Q2=( +_Q+= (lrand48() 5)*(( +(2<( _O%=8)%6) -(_O%7< 2))*QQ+( (_O +7)%8< +3)-( _O>4)))/ O3 )* O6+Q5+(O2= _Q %QQ)/2, +*Q3= *Q3 %O4+ O4 |(1<< Q_("@CADBE" "HI")[_Q +%O3/ QQ*2+_Q %2]- 64) *_0,sprintf (O5,Q9,Q2 ++=1, O2 /2,* Q3>> 8,* Q3&85*3,Q2) &&_0&&(Q1 +=O5, O =8,_() ), Q0+=( O2>Q0)*_0*( O2-Q0 ), +__+= (OQ>12)* (((__ +=!(OQ>9)* (3 -__+(__ +>>4) )-3)<<4)+ OQ-3-__ ),usleep (O4 *_0/(3 +*O8+ 1)), O=3,_())) ,!O9 --&& read( +1 ,& OO,1)> 0&&(O= (QO=OO ==35 )*3+6 ,_() +,QO&&(OO=10,O=6,_(),1)||(O=4,_()),0)||close(dup2(3-dup2(1,dup(0)-3),1) +*0+2)*0||Q write(1,"> ",2),ioctl(Q0=0,TIOCGWINSZ,O5)^--O&(O3=(QQ=(O6=* +((short*)O5+1))*2)*4),Q6=-O1,Q5=calloc(3*O6,8),_()),Q (O=8,QO=!(O2=OO- +10)|!(Q2=OO-32)*(Q0+58>QQ)|(Q0+12>QQ))&&(Q1=O_(3B),_(),write(1,"> ",2) +),Q0+=!QO*!Q2*4-QO*Q0,O2*Q2&&(!Q0&&(memset(Q5,0,3*O3),Q0=4,Q1="\n\n\n" +O_(3A),_()),O=7,_Q=7*QQ+Q0+2,_O=_0=0,OO+=(OO>64 &OO<91)*32,O0=Q_(O_o)+ +O7,_(),(*O0-OO)||(O=2,O0+='a',_( )))),Q *O0-OO)&&(*(O0+=O1)-33)&&(O=0, +_(),O=7,O0+=O1,_()),Q write(0,Q1,strlen(Q1))),Q OO=Q_(O_o)[Q6+=O1],(Q6 + %strlen(O_o)-O7)&&(O=6,_(),O=9,_()));Q_(})/*+++++ IOCCC 2015 +++++*/ + +main() +{ + puts("hello world!"); +} diff --git a/2015/endoh1/Makefile b/2015/endoh1/Makefile new file mode 100644 index 000000000..d1d2522ea --- /dev/null +++ b/2015/endoh1/Makefile @@ -0,0 +1,318 @@ +#!/usr/bin/env make +# +# 2015 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +CSILENCE= -Wno-conversion -Wno-float-conversion -Wno-missing-prototypes \ + -Wno-missing-variable-declarations -Wno-shadow -Wno-sign-conversion + +# compiler standard +# +#CSTD= +#CSTD= -ansi +#CSTD= -std=c11 +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= + +# include files that are needed to compile +# +CINCLUDE= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +CSRC= ${ENTRY}.c +OBJ= ${ENTRY}.o +DATA= +ALT_OBJ= +ALT_ENTRY= +TARGET= gray-scott-1 gray-scott-2 gray-scott-3 gray-scott-4 \ + fitzhugh-nagumo-1 fitzhugh-nagumo-2 ginzburg-landau oregonator + +GRAY_SCOTT_MODEL = -Delta_u="Du*laplacian(u)-u*v*v+F*(1-u)" \ + -Delta_v="Dv*laplacian(v)+u*v*v-v*(F+K)" + +FITZHUGH_NAGUMO_MODEL = -Delta_u="Du*laplacian(u)+u-u*u*u-v" \ + -Delta_v="Dv*laplacian(v)+E*(u-A1*v-A0)" + +GINZBURG_LANDAU_MODEL = \ + -Delta_u="Du*laplacian(u)+A*u-G*v+(-B*u+D*v)*(u*u+v*v)" \ + -Delta_v="Dv*laplacian(v)+A*v+G*u+(-B*v-D*u)*(u*u+v*v)" + +OREGONATOR_MODEL = -Delta_u="Du*laplacian(u)+(u-u*u-F*v*(u-Q)/(u+Q))/E" \ + -Delta_v="Dv*laplacian(v)+u-v" + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +${ENTRY}: gray-scott-1 + ${RM} -f $@ + ${CP} gray-scott-1 $@ + +gray-scott-1: ${CSRC} + ${CC} ${CFLAGS} -o $@ ${CSRC} \ + ${GRAY_SCOTT_MODEL} -DDu=0.100 -DDv=0.050 -DF=0.035 -DK=0.060 \ + -DUV_BACKGROUND=1,0 -DUV_DROP=-0.5,0.5 \ + -DTIMESTEP=1.0 -DSPEED=8 -DRGB=255:128:192 + +gray-scott-2: ${CSRC} + ${CC} ${CFLAGS} -o $@ ${CSRC} \ + ${GRAY_SCOTT_MODEL} -DDu=0.082 -DDv=0.041 -DF=0.035 -DK=0.063 \ + -DUV_BACKGROUND=1,0 -DUV_DROP=-0.5,0.5 \ + -DTIMESTEP=1.0 -DSPEED=8 -DRGB=128:255:192 + +gray-scott-3: ${CSRC} + ${CC} ${CFLAGS} -o $@ ${CSRC} \ + ${GRAY_SCOTT_MODEL} -DDu=0.100 -DDv=0.050 -DF=0.030 -DK=0.060 \ + -DUV_BACKGROUND=1,0 -DUV_DROP=-0.5,0.5 \ + -DTIMESTEP=1.0 -DSPEED=8 -DRGB=255:128:192 + +gray-scott-4: ${CSRC} + ${CC} ${CFLAGS} -o $@ ${CSRC} \ + ${GRAY_SCOTT_MODEL} -DDu=0.040 -DDv=0.020 -DF=0.012 -DK=0.050 \ + -DUV_BACKGROUND=1,0 -DUV_DROP=-0.5,0.5 \ + -DTIMESTEP=1.0 -DSPEED=8 -DRGB=192:192:255 + +fitzhugh-nagumo-1: ${CSRC} + ${CC} ${CFLAGS} -o $@ ${CSRC} \ + ${FITZHUGH_NAGUMO_MODEL} -DDu=1 -DDv=3 -DA0=-0.1 -DA1=2 -DE=0.06 \ + -DUV_BACKGROUND=0 -DUV_DROP=1,0 \ + -DTIMESTEP=0.050 -DSPEED=80 -DRGB=128:192:255 + +fitzhugh-nagumo-2: ${CSRC} + ${CC} ${CFLAGS} -o $@ ${CSRC} \ + ${FITZHUGH_NAGUMO_MODEL} -DDu=1 -DDv=10 -DA0=0.0 -DA1=1 -DE=1 \ + -DUV_BACKGROUND=0 -DUV_DROP=1,1 \ + -DTIMESTEP=0.005 -DSPEED=20 -DRGB=128:192:255 + +ginzburg-landau: ${CSRC} + ${CC} ${CFLAGS} -o $@ ${CSRC} \ + ${GINZBURG_LANDAU_MODEL} -DDu=0.1 -DDv=0.1 -DA=0.0625 -DB=1 -DD=1.05 -DG=0.0625 \ + -DUV_BACKGROUND=-0.1 -DUV_DROP=0,1 \ + -DTIMESTEP=0.60 -DSPEED=40 -DRGB=128:255:128 + +oregonator: ${CSRC} + ${CC} ${CFLAGS} -o $@ ${CSRC} \ + ${OREGONATOR_MODEL} -DDu=0.01 -DDv=0.01 -DE=0.1 -DF=1.4 -DQ=0.002 \ + -DUV_BACKGROUND=0 -DUV_DROP=0.05,0.2 \ + -DTIMESTEP=0.001 -DSPEED=80 -DRGB=128:192:255 + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from not failing to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v5; \ + else \ + echo "planet deniers, like the IAU, are amusing"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2015/endoh1/center.txt b/2015/endoh1/center.txt new file mode 100644 index 000000000..589d01c23 --- /dev/null +++ b/2015/endoh1/center.txt @@ -0,0 +1 @@ +64,64 diff --git a/2015/endoh1/hint.html b/2015/endoh1/hint.html new file mode 100644 index 000000000..98b32ed89 --- /dev/null +++ b/2015/endoh1/hint.html @@ -0,0 +1,209 @@ + + + + + + + Most Diffused Reaction + + +

    Most Diffused Reaction

    + +

    Someone Anonymous
    +Twitter: @hirekoke

    + +

    Yusuke Endoh
    +https://github.com/mame/
    +Twitter: @mametter

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +<tbd-tool-rubl-perl-python?>
    +
    + +

    Try:

    + +
    Connect to port http://localhost:10333 with your browser
    +
    + +

    Selected Judges Remarks:

    + +

    How did the leopard get its spots? Why are a zebra’s stripes unique?

    + +

    In case you didn’t recognise the portrait of Alan Turing, there are some +pointers to his features like eyes with “stdeye-o” and “<–mouth”. Can you +find any other tributes?

    + +

    Author’s comments:

    + +

    What does “Alan Turing” remind you of? Cryptanalysis of the Enigma? Turing machine? Turing test? This program is also based on his work.

    + +

    Whirlwind tour

    + +

    Compile the program as follows:

    + +
    $ clang -O3 -std=c99 \
    +    -Wall -Wextra -pedantic -o prog prog.c \
    +    -Delta_u="Du*laplacian(u)-u*v*v+F*(1-u)" \
    +    -Delta_v="Dv*laplacian(v)+u*v*v-v*(F+K)" \
    +    -DF=0.040 -DK=0.060 -DDu=0.200 -DDv=0.100 \
    +    -DUV_BACKGROUND=1,0 -DUV_DROP=-0.5,0.5 \
    +    -DTIMESTEP=1.0 -DSPEED=2 -DRGB=255:128:192
    +
    + +

    Then, run it under tcpserver command in ucspi-tcp package, which was created by Daniel J. Bernstein, IOCCC 1989 “Best of Show” winner.

    + +
    $ tcpserver -v 127.0.0.1 10333 ./prog ioccc.txt
    +
    + +

    Finally, open http://127.0.0.1:10333/ by a modern browser supporting HTML5. You can use the mouse cursor to place drops into the Petri dish interactively.

    + +

    Description

    + +

    This is a simulator of reaction-diffusion systems.

    + +

    Reaction-diffusion systems, proposed by Alan Turing in [1], are mathematical models in which two chemical substances are transformed into each other (local chemical reactions) and spread out (diffusion). Their interactions sometimes form non-trivial patterns, such as spots, spiral, dappling, and labyrinths.

    + +

    The systems are generally formulated as follows:

    + +
    du/dt = F(u, v) + Du * laplacian(u)
    +dv/dt = G(u, v) + Dv * laplacian(v)
    +
    + +

    The functions F(u, v) and G(u, v) represent reactions of each substance, and the parameters Du and Dv are diffusion coefficients. By changing the functions and parameters, you can see a wide range of behaviors.

    + +

    See the Wikipedia article of “Reaction-diffusion system” in detail.

    + +

    This program simulates the systems. The field consists of 128 x 128 cells. Each cell includes infomration of an amount of the two substances, and interacts with neighbor cells (in terms of von Neumann neighborhood) in each frame.

    + +

    Configuration

    + +

    You can change the model, initial pattern, simulation speed, and color via macro definition.

    + +

    Model: -Delta_u=<expression> -Delta_v=<expression>

    + +

    The definitions represent the equations of reaction-diffusion system. For example, the following is the Gray-Scott model in TeX notation.

    + +
    \frac{\partial u}{\partial t} = D_u \Delta u - u v^2 + F (1 - u)
    +\frac{\partial v}{\partial t} = D_v \Delta v + u v^2 - v (F + K)
    +
    + +

    You can specify this model as follows:

    + +
    -Delta_u="Du*laplacian(u)-u*v*v+F*(1-u)" \
    +-Delta_v="Dv*laplacian(v)+u*v*v-v*(F+K)"
    +
    + +

    Du, Dv, F, and K are parameters of that model.

    + +

    Initial pattern: -DUV_BACKGROUND=<u0>,<v0> -DUV_DROP=<u1>,<v1>

    + +

    The definitions specifies the initial amount of the two substances u and v. All cells have (u0, v0) by default.

    + +

    You can specify a pattern file when the executable is invoked (not compile-time). The file should include a sequence of points, see ioccc.txt, center.txt, or line.txt as examples. Each amount in cells near to the point included in the file, will be added by (u1, v1).

    + +

    Simulation speed: -DTIMESTEP=ts -DSPEED=spd

    + +

    The definitions are for changing the simulation speed.

    + +

    TIMESTEP is a simulation time step. The bigger, the faster but more unstable.

    + +

    SPEED is a frameskip parameter. The bigger, the faster but more sluggish.

    + +

    Rendering color: -DRGB=r:g:b

    + +

    This specifies a color used for rendering.

    + +

    Examples

    + +

    Some interesting parameters are included in Makefile. Do one of the following command and open http://127.0.0.1:10333.

    + +
    $ make gray-scott-1 && tcpserver -v 127.0.0.1 10333 ./gray-scott-1 ioccc.txt
    +$ make gray-scott-1 && tcpserver -v 127.0.0.1 10333 ./gray-scott-1 center.txt
    +$ make gray-scott-1 && tcpserver -v 127.0.0.1 10333 ./gray-scott-1 line.txt
    +$ make gray-scott-2 && tcpserver -v 127.0.0.1 10333 ./gray-scott-2 ioccc.txt
    +$ make gray-scott-3 && tcpserver -v 127.0.0.1 10333 ./gray-scott-3 ioccc.txt
    +$ make gray-scott-4 && tcpserver -v 127.0.0.1 10333 ./gray-scott-4 ioccc.txt
    +$ make fitzhugh-nagumo-1 && tcpserver -v 127.0.0.1 10333 ./fitzhugh-nagumo-1 ioccc.txt
    +$ make fitzhugh-nagumo-2 && tcpserver -v 127.0.0.1 10333 ./fitzhugh-nagumo-2 ioccc.txt
    +$ make oregonator && tcpserver -v 127.0.0.1 10333 ./oregonator ioccc.txt
    +
    + +

    These examples are created by drawing (and modifying) the pattern files of Ready, a cross-platform implementation of various reaction-diffusion systems [2].

    + +

    Compatibility

    + +

    C part

    + +

    This program compiles clean with no warnings under -std=c99 -Wall -Wextra -pedantic. Since it uses long long for 64bit integers, C99 is required.

    + +

    Browser part

    + +

    You must use a modern browser that supports the latest specification of WebSocket [3]. All the following browsers worked for me:

    + +
      +
    • Google Chrome 45
    • +
    • Mozilla Firefox 39
    • +
    • Microsoft Internet Explorer 11 (works but sluggish)
    • +
    + + +

    I think Safari 6 will work but I haven’t tested. (I have no recent os x.)

    + +

    tcpserver alternatives

    + +

    I think you may use inetd and xinetd instead of tcpserver. Here is an example of inetd configuration.

    + +
    10333 stream tcp nowait nobody /path/to/prog /path/to/prog /path/to/initial-pattern.txt
    +
    + +

    But note that I didn’t test well.

    + +

    Internal

    + +
      +
    1. The C program accepts HTTP connection from the browser, and sends a HTML document.
    2. +
    3. The browser tries to upgrade the connection to WebSocket.
    4. +
    5. The C program accepts WebSocket upgrade. This negotiation process requires SHA1 hash [4] and Base64 encoding [5]. The C program calculates them without the aid of any external libraries.
    6. +
    7. The C program simulates the reaction-diffusion system, and then send the field data to the browser on each frame.
    8. +
    9. The browser receives and renders the field data onto the HTML5 canvas.
    10. +
    + + +

    References

    + +
      +
    • [1] Turing, A. M., “The Chemical Basis of Morphogenesis”, Philosophical Transactions of the Royal Society, 1952.
    • +
    • [2] The Ready Bunch, “Ready”, A cross-platform implementation of various reaction-diffusion systems, since 2011, https://github.com/GollyGang/ready.
    • +
    • [3] Fette, I. and A. Melnikov, “The WebSocket Protocol”, RFC 6455, DOI 10.17487/RFC6455, December 2011, http://www.rfc-editor.org/info/rfc6455.
    • +
    • [4] Eastlake 3rd, D. and P. Jones, “US Secure Hash Algorithm 1 (SHA1)”, RFC 3174, DOI 10.17487/RFC3174, September 2001, http://www.rfc-editor.org/info/rfc3174.
    • +
    • [5] Josefsson, S., “The Base16, Base32, and Base64 Data Encodings”, RFC 4648, DOI 10.17487/RFC4648, October 2006, http://www.rfc-editor.org/info/rfc4648.
    • +
    + + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2016, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2015/endoh1/hint.text b/2015/endoh1/hint.text new file mode 100644 index 000000000..673f80ef2 --- /dev/null +++ b/2015/endoh1/hint.text @@ -0,0 +1,173 @@ +# Most Diffused Reaction + +Someone Anonymous +Twitter: @hirekoke + +Yusuke Endoh + +Twitter: @mametter + + +## Judges' comments: +### To use: + + make + + + +### Try: + + Connect to port http://localhost:10333 with your browser + +### Selected Judges Remarks: + +How did the leopard get its spots? Why are a zebra's stripes unique? + +In case you didn't recognise the portrait of Alan Turing, there are some +pointers to his features like eyes with "stdeye-o" and "<--mouth". Can you +find any other tributes? + +## Author's comments: +What does "Alan Turing" remind you of? Cryptanalysis of the Enigma? Turing machine? Turing test? This program is also based on his work. + + +### Whirlwind tour + +Compile the program as follows: + + $ clang -O3 -std=c99 \ + -Wall -Wextra -pedantic -o prog prog.c \ + -Delta_u="Du*laplacian(u)-u*v*v+F*(1-u)" \ + -Delta_v="Dv*laplacian(v)+u*v*v-v*(F+K)" \ + -DF=0.040 -DK=0.060 -DDu=0.200 -DDv=0.100 \ + -DUV_BACKGROUND=1,0 -DUV_DROP=-0.5,0.5 \ + -DTIMESTEP=1.0 -DSPEED=2 -DRGB=255:128:192 + +Then, run it under `tcpserver` command in [ucspi-tcp](http://cr.yp.to/ucspi-tcp.html) package, which was created by Daniel J. Bernstein, IOCCC 1989 "Best of Show" winner. + + $ tcpserver -v 127.0.0.1 10333 ./prog ioccc.txt + +Finally, open `http://127.0.0.1:10333/` by a modern browser supporting HTML5. You can use the mouse cursor to place drops into the Petri dish interactively. + + +### Description + +This is a simulator of *reaction-diffusion systems*. + +Reaction-diffusion systems, proposed by Alan Turing in [1], are mathematical models in which two chemical substances are transformed into each other (*local chemical reactions*) and spread out (*diffusion*). Their interactions sometimes form non-trivial patterns, such as spots, spiral, dappling, and labyrinths. + +The systems are generally formulated as follows: + + du/dt = F(u, v) + Du * laplacian(u) + dv/dt = G(u, v) + Dv * laplacian(v) + +The functions `F(u, v)` and `G(u, v)` represent reactions of each substance, and the parameters `Du` and `Dv` are diffusion coefficients. By changing the functions and parameters, you can see a wide range of behaviors. + +See [the Wikipedia article of "Reaction-diffusion system"](https://en.wikipedia.org/wiki/Reaction%E2%80%93diffusion_system) in detail. + +This program simulates the systems. The field consists of 128 x 128 cells. Each cell includes infomration of an amount of the two substances, and interacts with neighbor cells (in terms of von Neumann neighborhood) in each frame. + + +### Configuration + +You can change the model, initial pattern, simulation speed, and color via macro definition. + + +#### Model: `-Delta_u= -Delta_v=` + +The definitions represent the equations of reaction-diffusion system. For example, the following is [the Gray-Scott model](http://groups.csail.mit.edu/mac/projects/amorphous/GrayScott/) in TeX notation. + + \frac{\partial u}{\partial t} = D_u \Delta u - u v^2 + F (1 - u) + \frac{\partial v}{\partial t} = D_v \Delta v + u v^2 - v (F + K) + +You can specify this model as follows: + + -Delta_u="Du*laplacian(u)-u*v*v+F*(1-u)" \ + -Delta_v="Dv*laplacian(v)+u*v*v-v*(F+K)" + +`Du`, `Dv`, `F`, and `K` are parameters of that model. + +#### Initial pattern: `-DUV_BACKGROUND=, -DUV_DROP=,` + +The definitions specifies the initial amount of the two substances u and v. All cells have `(u0, v0)` by default. + +You can specify a pattern file when the executable is invoked (not compile-time). The file should include a sequence of points, see `ioccc.txt`, `center.txt`, or `line.txt` as examples. Each amount in cells near to the point included in the file, will be added by `(u1, v1)`. + +#### Simulation speed: `-DTIMESTEP=ts -DSPEED=spd` + +The definitions are for changing the simulation speed. + +`TIMESTEP` is a simulation time step. The bigger, the faster but more unstable. + +`SPEED` is a frameskip parameter. The bigger, the faster but more sluggish. + +#### Rendering color: `-DRGB=r:g:b` + +This specifies a color used for rendering. + + +### Examples + +Some interesting parameters are included in `Makefile`. Do one of the following command and open `http://127.0.0.1:10333`. + + $ make gray-scott-1 && tcpserver -v 127.0.0.1 10333 ./gray-scott-1 ioccc.txt + $ make gray-scott-1 && tcpserver -v 127.0.0.1 10333 ./gray-scott-1 center.txt + $ make gray-scott-1 && tcpserver -v 127.0.0.1 10333 ./gray-scott-1 line.txt + $ make gray-scott-2 && tcpserver -v 127.0.0.1 10333 ./gray-scott-2 ioccc.txt + $ make gray-scott-3 && tcpserver -v 127.0.0.1 10333 ./gray-scott-3 ioccc.txt + $ make gray-scott-4 && tcpserver -v 127.0.0.1 10333 ./gray-scott-4 ioccc.txt + $ make fitzhugh-nagumo-1 && tcpserver -v 127.0.0.1 10333 ./fitzhugh-nagumo-1 ioccc.txt + $ make fitzhugh-nagumo-2 && tcpserver -v 127.0.0.1 10333 ./fitzhugh-nagumo-2 ioccc.txt + $ make oregonator && tcpserver -v 127.0.0.1 10333 ./oregonator ioccc.txt + +These examples are created by drawing (and modifying) the pattern files of [Ready](https://github.com/GollyGang/ready), a cross-platform implementation of various reaction-diffusion systems [2]. + +### Compatibility + +#### C part + +This program compiles clean with no warnings under `-std=c99 -Wall -Wextra -pedantic`. Since it uses `long long` for 64bit integers, C99 is required. + +#### Browser part + +You must use a modern browser that supports the latest specification of WebSocket [3]. All the following browsers worked for me: + +* Google Chrome 45 +* Mozilla Firefox 39 +* Microsoft Internet Explorer 11 (works but sluggish) + +I think Safari 6 will work but I haven't tested. (I have no recent os x.) + +#### tcpserver alternatives + +I think you may use `inetd` and `xinetd` instead of `tcpserver`. Here is an example of inetd configuration. + + 10333 stream tcp nowait nobody /path/to/prog /path/to/prog /path/to/initial-pattern.txt + +But note that I didn't test well. + +### Internal + +1. The C program accepts HTTP connection from the browser, and sends a HTML document. +2. The browser tries to upgrade the connection to WebSocket. +3. The C program accepts WebSocket upgrade. This negotiation process requires SHA1 hash [4] and Base64 encoding [5]. The C program calculates them without the aid of any external libraries. +4. The C program simulates the reaction-diffusion system, and then send the field data to the browser on each frame. +4. The browser receives and renders the field data onto the HTML5 canvas. + + +### References + +* [1] Turing, A. M., "The Chemical Basis of Morphogenesis", Philosophical Transactions of the Royal Society, 1952. +* [2] The Ready Bunch, "Ready", A cross-platform implementation of various reaction-diffusion systems, since 2011, . +* [3] Fette, I. and A. Melnikov, "The WebSocket Protocol", RFC 6455, DOI 10.17487/RFC6455, December 2011, . +* [4] Eastlake 3rd, D. and P. Jones, "US Secure Hash Algorithm 1 (SHA1)", RFC 3174, DOI 10.17487/RFC3174, September 2001, . +* [5] Josefsson, S., "The Base16, Base32, and Base64 Data Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006, . + +-------------------------------------------------------------------------------- + diff --git a/2015/endoh1/ioccc.txt b/2015/endoh1/ioccc.txt new file mode 100644 index 000000000..6ae3e18f3 --- /dev/null +++ b/2015/endoh1/ioccc.txt @@ -0,0 +1,48 @@ +37,10, +47,10, +42,20, +42,30, +42,40, +37,50, +47,50, + +91,10, +81,10, +76,20, +96,20, +76,30, +96,30, +76,40, +96,40, +91,50, +81,50, + +25,78, +15,78, +10,88, +30,88, +10,98, +10,108, +30,108, +15,118, +25,118, + +69,78, +59,78, +54,88, +74,88, +54,98, +54,108, +74,108, +59,118, +69,118, + +113,78, +103,78, +98,88, +118,88, +98,98, +98,108, +118,108, +103,118, +113,118, diff --git a/2015/endoh1/line.txt b/2015/endoh1/line.txt new file mode 100644 index 000000000..00ff1b903 --- /dev/null +++ b/2015/endoh1/line.txt @@ -0,0 +1,12 @@ +64,9, +64,19, +64,29, +64,39, +64,49, +64,59, +64,60, +64,79, +64,89, +64,99, +64,109, +64,119, diff --git a/2015/endoh1/prog.c b/2015/endoh1/prog.c new file mode 100644 index 000000000..7255af233 --- /dev/null +++ b/2015/endoh1/prog.c @@ -0,0 +1,53 @@ +#define/**/Alan/**/(fflush(0),j=c=0;++c",b[9999];float*e,d[ 65536],u,v +,lu,lv, z;void*f;typedef unsigned long long +l;l*p,t[ 99]={0x67452301,0xEFCDAB89, 0x98BADCFE +,308438* 881,3285377520 },i,j,k ,n,m[204]; +#include /*io*/ /*turing*/ +void s(){ ; for( k =0;k++<7 * 2 *9;)for(i= +0;++i<127; ) e=d + i* 4 +512*k,1[e] +=(i-u)*(i +-u)+(k-v)* (k- v )<20?*e+=UV_DROP:0;}l*q= m, g=1LL<<32; +l(h)(l v,l (a)){ return(v<>(32-a ) );}int main +(int c/*ha r*/, char**y){for(e=d;fgets(b ,m[97]=480,\ +stdin)&&*b >31; )for( i=j=0;n=b[i],i<18 ? (l)"sec-webs\ +ocket-key: "[i] ==(n|32):n-32? m[j/4] |=(j< 24?n:(l) +"258EAFA5-" "E914-47DA-95CA-C5AB0DC85B" "11\x80"[j-24]) +<<(3-j%4)*8 ,++j<61:1;)i++;for(j=3;--j; ){for(i=4;++i<74 +;)i>9?p=q+i- 2 ,p[8]=h(p[5 ]^*p^p[-6]^p[-8] +#define/*hah aha <--mouth*/ laplacian(u)l##u +,1):(t[i]=t[9 -i] );for(p=t+7 ,i=-1;++i<82;k +=*p++,p[2]=h(p[1],5) +p[-3]+n+ (i/+ 20%2?*p^k^p[- +2]:(*p&k)|((i< 20?~*p:*p|k)&p [-2 ]))+*q++,t[+ +81-i]+=(i>76)* (* p= h(* p,30*(i<80) +)))for(;n-k;n=((( 1LL +(9<>(30+i%5%3*2-i/5 *6)& 63,0 :(n =*q++,b[i-30]= +n<62?n-37+"fl!" [n /26]:n *4- 205);for(prin\ +tf("HTTP/1.1 "/* | */"%d " "OK\r\nConnecti\ +on:%s%.27s=\r\n\r\n" ,101 +99*! *m,!*m?H:"upgrade\ +\r\nUpgrade:webso" "c" "ket\r\nSec-WebSocket-Acce\ +pt:",b);e-d<65536 ; e+= 4)e[1]=(*e=UV_BACKGROUND);for +(;*m;c=0){for(f= c< 2 ?0:fopen(y[1],"r");f&&fscanf(f, +"%f,%f,",&u,&v)>0;)s ();for(;j +c;c++)putchar(c>7?n>2||(u=d[c-n-7]*4*(n<2?!n?RGB))>255?255: +#define/*x*/Turing(x)4]=getchar()&127))u=v;if(b[6]>1)s();}} +u<0?0:u:c<0?124-c*3:c==5);/* -- The word "genius" is */ for + + + Alan Turing (1912--1954) diff --git a/2015/endoh2/Makefile b/2015/endoh2/Makefile new file mode 100644 index 000000000..a4b402897 --- /dev/null +++ b/2015/endoh2/Makefile @@ -0,0 +1,254 @@ +#!/usr/bin/env make +# +# 2015 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +CSILENCE= -Wno-char-subscripts -Wno-format-nonliteral + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= + +# include files that are needed to compile +# +#CINCLUDE= +CINCLUDE= -include stdio.h + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +CSRC= ${ENTRY}.c +OBJ= ${ENTRY}.o +DATA= +ALT_OBJ= +ALT_ENTRY= +TARGET= ${ENTRY} + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +${ENTRY}: ${CSRC} + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from not failing to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v5; \ + else \ + echo "planet deniers, like the IAU, are amusing"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2015/endoh2/hint.html b/2015/endoh2/hint.html new file mode 100644 index 000000000..66c9aae1a --- /dev/null +++ b/2015/endoh2/hint.html @@ -0,0 +1,96 @@ + + + + + + + Most Overlooked Obfuscation + + +

    Most Overlooked Obfuscation

    + +

    Yusuke Endoh
    +https://github.com/mame/
    +Twitter: @mametter

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./prog
    +
    + +

    Try:

    + +
    cat prog.c
    +
    +./prog | diff - prog.c
    +
    + +

    Selected Judges Remarks:

    + +

    At this point you might be wondering, WTF?*

    + +
    * What The Freak (polite form)
    +
    +* What's This For? (you may be wondering)
    +
    +* What the Fish (python form)
    +
    + +

    How is this code obfuscated? Well look again:

    + +
    less prog.c
    +
    +more prog.c
    +
    + +

    Where did those underscores come from? Well RTFS!**

    + +
    ** Read the Freaking Source (polite form)
    +** Read The Freakin' Screen (polite form)
    +
    + +

    If you are still puzzled, look at prog.c with your favorite text editor.

    + +

    Author’s comments:

    + +

    Follow this instruction literally!

    + +
    cat prog.c
    +gcc -w -o prog prog.c
    +./prog
    +
    + +

    You will do a double take.

    + +

    Hint 1: Do less prog.c. You will see an emphasized string if your terminal supports bold.

    + +

    Hint 2: Do wc -c prog.c. This is very long one-liner.

    + +

    Spoiler: Open the source with an editor like vim or emacs.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2016, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2015/endoh2/hint.text b/2015/endoh2/hint.text new file mode 100644 index 000000000..55b9b5fa6 --- /dev/null +++ b/2015/endoh2/hint.text @@ -0,0 +1,67 @@ +# Most Overlooked Obfuscation + +Yusuke Endoh + +Twitter: @mametter + + +## Judges' comments: +### To use: + + make + + ./prog + +### Try: + + cat prog.c + + ./prog | diff - prog.c + +### Selected Judges Remarks: + +At this point you might be wondering, [WTF](http://acronyms.thefreedictionary.com/WTF)?\* + + * What The Freak (polite form) + + * What's This For? (you may be wondering) + + * What the Fish (python form) + +How is this code obfuscated? Well look again: + + less prog.c + + more prog.c + +Where did those underscores come from? Well [RTFS](http://acronyms.thefreedictionary.com/RTFS)!\*\* + + ** Read the Freaking Source (polite form) + ** Read The Freakin' Screen (polite form) + +If you are still puzzled, look at prog.c with your favorite text editor. + +## Author's comments: +**Follow this instruction literally!** + + cat prog.c + gcc -w -o prog prog.c + ./prog + +You will do a double take. + + +Hint 1: Do `less prog.c`. You will see an **emphasized** string if your terminal supports bold. + +Hint 2: Do `wc -c prog.c`. This is very long one-liner. + +Spoiler: Open the source with an editor like `vim` or `emacs`. + +-------------------------------------------------------------------------------- + diff --git a/2015/endoh2/prog.c b/2015/endoh2/prog.c new file mode 100644 index 000000000..fce7e50e6 --- /dev/null +++ b/2015/endoh2/prog.c @@ -0,0 +1 @@ +int main(){ printf("");{char*p,s[999]="int main(){ printf(~~);{char*p,s[999]=~%s~,*q=s,c;for(p=62**~~+q;q*~s~||c>8?*p++=c-35?*~}~*"s"||c>8?*p++=c-35?*"}"' "/\\oo/\\" + @echo Readers shall not be disallowed from not failing to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v5; \ + else \ + echo "planet deniers, like the IAU, are amusing"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2015/endoh3/hint.html b/2015/endoh3/hint.html new file mode 100644 index 000000000..d645d70b8 --- /dev/null +++ b/2015/endoh3/hint.html @@ -0,0 +1,242 @@ + + + + + + + Back to the Future Award + + +

    Back to the Future Award

    + +

    Yusuke Endoh
    +https://github.com/mame/
    +Twitter: @mametter

    + +

    Judges' comments:

    + +

    To use:

    + +
    make 
    +
    +./prog
    +
    + +

    Try:

    + +
    make -B BACK_TO=ioccc.c
    +
    +./prog
    +
    + +

    Selected Judges Remarks:

    + +

    Like Marty and Doc, something nostalgic from 1984 appears live in October of 2015! +The author of this gem is a true Delorean!

    + +

    A question for inquisitive readers: is the implemented subset of PDP-11 instructions Turing-complete? +(For a clue, see the end of the author’s remarks.) +If in doubt, use APOUT.

    + +

    Author’s comments:

    + +

    Hint / Compatibility

    + +
      +
    • A little-endian system is required due to an external factor.
    • +
    • Strictly speaking, this program does not comply with any C specification for the same reason. But I believe it is reasonably portable.
    • +
    • It uses a GCC extension but works on clang.
    • +
    • This is a kind of emulator. You may find its architecture name if you look at the source code from all angles.
    • +
    • Find main() function.
    • +
    + + +

    Spoiler

    + +

    This program is a joke PDP-11 emulator. (“ll-dpd” is embedded in the code. Read it upside down.)

    + +

    You got it? This program is supposed to be used in this way:

    + +
    $ wget http://ioccc.org/1984/mullender.c
    +$ clang -o prog prog.c mullender.c
    +$ ./prog
    +
    + +

    You can enjoy the legendary winner of the first IOCCC, again.

    + +

    Internal

    + +

    This program uses __attribute__((constructor)), which is a GCC extension, to hijack the main function call. And then it interprets main as an instruction sequence.

    + +

    It supports the minimal subset of instructions and addressing modes which are needed for mullender.c to work:

    + +
      +
    • Instructions

      + +
        +
      • BR: branch
      • +
      • MOV: move
      • +
      • SOB: subtract one and branch
      • +
      • SUB: subtract
      • +
      • TRAP 4: write syscall
      • +
      • TST: test (no flag is supported, though)
      • +
      +
    • +
    • Addressing modes

      + +
        +
      • 0: Register
      • +
      • 1: Register deferred
      • +
      • 2: Autoincrement
      • +
      • 4: Autodecrement deferred
      • +
      • 6: Index (incomplete)
      • +
      +
    • +
    + + +

    Limitation

    + +

    Non-trivial combination of instruction and addressing mode may cause undefined behavior (unsequenced modification), such as attempting to autoincrement a destination register. Index addressing mode works well only for R7 (PC register).

    + +

    One more thing

    + +

    Note: the program writes a binary to stdout.

    + +
    short main[]={5568,1,-30460,12,2782,0,-29921,2056,-4864,6873,770,30054,11886,
    +24948,114,21716,-28851,14043,-8944,32691,-16187,-12247,22692,-9781,-20403,
    +-11771,16546,18710,17873,9233,31304,-32215,-24382,-28247,-25916,10466,24988,
    +-3404,-4177,-28528,-531,-3016,17300,-28552,-7708,-26180,-4297,-367,-2312,
    +-25611,28535,-8533,24004,25421,-1224,-5354,-20807,-21589,-6761,-5203,-1055,
    +-6715,-26673,-1433,-17732,-24198,14681,-3714,-6660,-14891,-25575,20349,-7701,
    +-8336,31433,16695,-14773,26819,3096,-12584,-28808,17825,-21200,-32399,15877,
    +-28890,-3728,-27126,21375,-32630,-7615,32004,-29230,-6611,-5508,-28921,12418,
    +27204,-5725,9643,3520,26836,-29347,2101,-29311,9320,29287,-29990,-6593,29825,
    +-29114,16232,25641,20672,-23501,-32127,-6546,-956,10474,-29647,1070,5516,13760,
    +-27814,-32488,-28006,-17968,-3146,10963,19234,22132,23988,7142,5523,9639,-6888,
    +-11428,7964,23099,-16822,16518,31109,-12958,10351,2434,3091,3625,2244,27512,
    +-28559,-10724,-19377,23625,30056,11478,-21176,27660,26517,-29037,-9390,12297,
    +-11903,5980,-21927,-7483,6671,11249,29638,-23827,-26358,-6856,-1063,-5303,
    +26636,25797,31818,26798,-4243,-18772,-13266,27472,-12005,-10642,-22524,24373,
    +-13111,-9062,6274,-20002,24150,22189,-14965,-31249,-13934,-6341,-18384,-32054,
    +-29246,10622,-9260,19428,-15485,2724,23810,16447,11627,18604,2739,27812,30295,
    +-21538,-31786,11355,-11308,-9006,-4987,25363,-18927,-21130,-31213,-27411,17231,
    +-19608,20232,27754,16476,11213,-19803,-24048,30918,-25329,21233,-10160,13519,
    +11828,26653,-6703,10893,6871,-12417,24471,20310,-12137,-19677,4457,-19530,
    +10147,17724,533,-10055,27076,10264,11274,-10511,4809,25208,16065,-5105,-19953,
    +3772,-12124,13475,-27559,-9955,26446,15133,15207,-23640,6425,-11010,28688,
    +-20064,26353,-889,-25008,10380,-14449,-6894,18920,-23900,16902,-31018,16093,
    +20875,-19576,4585,13126,18589,24789,19424,31274,-5059,-14538,-3125,-16527,
    +-25070,-9013,26628,15756,-7652,30841,-1283,17707,25717,-18315,-6342,6880,
    +-19176,6995,5672,2853,-9044,-3409,-14421,-7522,13108,20582,-25317,1376,-5648,
    +13821,17300,1220,-29437,-25832,-8332,-15575,-9744,28297,31995,-1217,23852,
    +14382,31059,9160,-3296,20287,-28357,24449,-10323,-21992,-4655,-32548,13237,
    +-15083,-25226,-21121,2015,-8996,-20247,-27551,-14771,-16089,-6920,-9645,21578,
    +7142,-5613,14029,24730,-29253,13931,-3862,-16634,-7388,16951,15771,31302,
    +-22186,-6716,18416,1698,-26200,-16231,9821,-10886,-4994,-30527,-9448,-16923,
    +29549,-11207,-14909,-3643,-27548,17865,28859,29753,17616,16874,-17733,9424,
    +21435,-31715,24544,8666,30844,25075,-18267,12027,-5346,2717,19615,-4548,-21763,
    +28514,11691,22268,-2338,1406,-27379,-23568,-24525,13633,11295,-14715,7877,
    +-27669,3475,20345,7779,-17849,2184,7132,4079,-24937,11585,22740,5810,-10855,
    +16203,-6371,23235,-7,-24828,-11205,-11006,-10,-17812,-14274,11504,-27517,463,
    +4498,-32180,-9775,-3190,-22435,-18662,-30146,-31834,-26449,-19374,-12616,
    +-10596,14341,-10089,-18449,-16535,21439,21191,-1651,7695,-30009,-23339,-8675,
    +-20774,21588,-2793,8218,-14337,-10866,14060,-15343,31712,25247,-8539,18074,
    +-28683,-7363,-7663,-3563,-30718,17771,28687,-30495,30584,14022,-28053,5292,
    +-31576,-32486,-15470,-1330,23551,-2185,-10829,-13216,-4825,-2964,-14668,24559,
    +-4930,23731,-1152,-11493,-2321,15987,-27073,-20305,-24065,-25048,32750,-27440,
    +-1169,-25633,-4356,-24993,30439,-17165,-4580,8662,22655,-4588,-6162,-3122,
    +31986,-2569,20371,-12320,-25613,-16133,-25644,23677,12254,5855,26325,-13425,
    +-15903,-1930,-28488,31222,31153,17607,-2758,7594,-8868,30434,-2518,27956,
    +-19424,7370,6199,-17602,17347,-14358,25588,11611,-25209,-23701,-27444,-29788,
    +2680,-27406,9318,22483,-28356,28482,4577,-14891,17323,-30152,2507,2977,5004,
    +-11696,-31623,-15149,13357,28938,-14048,19490,-19860,-26050,10842,-24922,
    +-20986,8847,-31184,28519,-29168,32195,10516,25713,-3493,670,31283,-12769,
    +-17461,11357,13180,26133,15944,18051,-32167,-27990,16813,17676,21787,-17578,
    +11173,19093,2836,656,-15239,4632,23937,4106,-21655,-7494,-21575,-17647,-18465,
    +-14654,-29990,-10707,-12440,21465,5822,26164,-1404,-14303,-26635,-6900,-23611,
    +11998,-18551,971,27579,13325,4579,23059,29281,22291,29880,-17546,25664,-14990,
    +-526,-35,28218,-3214,11965,11263,6633,30719,32400,-29,-3733,24383,32678,-27542,
    +-4444,6196,5975,-19722,11902,16840,-11680,11146,-26391,-8980,21573,-9043,2349,
    +-12887,5916,-2996,10410,-23374,26338,11867,-14518,18281,14450,-5815,13842,359,
    +25450,27043,3355,13423,-20880,-26311,-30720,-2503,-6046,-18156,-18558,-14774,
    +-15664,-29001,3365,-12689,10233,23608,24692,12039,15445,18411,-27469,3764,
    +-10841,22672,23844,2282,-12443,2851,-27163,13651,13738,17201,-29819,27414,
    +-29764,-5308,-16171,-32427,-26312,-7460,-27376,-6004,25717,29254,-15015,8754,
    +15493,22232,-28513,-23355,23676,7736,10571,-8120,-16677,7696,32549,-2646,25538,
    +3498,30960,-28459,24716,12655,-10496,402,26209,482,-16661,-20350,-3403,14015,
    +32299,11262,-25886,4092,-7843,-100,-1975,-58,-3729,-19269,-23583,-6929,20000,
    +-6089,17780,-3250,29830,19954,-29277,27896,10330,9277,-25358,31279,-14454,
    +24203,-30170,12872,-21973,-25773,-10502,-6647,-26143,6394,-13479,-24559,23007,
    +-21844,1505,24702,-23187,-24364,-20470,20765,-7107,15674,9404,17408,17964,
    +19820,18952,2154,-26052,30056,-3227,17770,-8557,-31018,-27700,-25974,9003,
    +18218,22730,-19981,6737,3532,1562,-23626,14990,28472,-5270,17358,-32204,-29197,
    +-3647,4296,8588,25302,-23906,30328,-29119,-24392,8992,-16557,31530,-31216,
    +14107,13041,-6976,7529,-8296,17865,-1462,8181,-21588,-131,-10177,-25931,-14627,
    +8301,3708,-32097,20808,13892,-21179,1192,20853,3249,-8774,20843,3520,24954,
    +-14215,-25170,-16170,2390,25964,-23923,-17464,-7177,-27568,-9880,-4647,-7323,
    +15388,2113,-12338,-7737,26255,26818,-22156,-19610,-911,-17057,-556,29935,27647,
    +31806,23676,-18132,-19234,-10869,-3715,24983,-10900,-29564,19856,-16392,-31860,
    +-25826,24077,12080,15383,-29852,-2266,-27217,31931,-3183,17385,-14211,19050,
    +-2449,-468,-2871,-11466,973,2866,649,1367,-8688,-24069,20992,25139,-25850,1184,
    +15851,785,16951,12160,22337,-21851,1849,-18801,14247,-429,-12682,30881,-11273,
    +-24819,-9794,8389,-27287,7525,16633,1328,-26650,32607,-8217,31912,7774,-16188,
    +-3546,-6550,-16279,-32696,1940,2577,-23723,-6484,2009,-424,27833,-21763,-13902,
    +7044,27360,-18450,27889,23987,3137,-7669,-5784,-7490,24946,32302,26464,-15513,
    +28898,2493,-17645,-4615,-13434,-20884,-4058,-29951,-22281,24784,21083,-8536,
    +22147,-11261,-15069,20659,2993,19029,21909,6748,-3263,1401,30960,11000,-16871,
    +-30566,-14959,-26356,-2885,21526,-26531,31063,12857,4992,-5067,3130,-17602,
    +-1732,-6593,30200,24679,3267,310,20733,24863,-15669,7875,-4577,-13821,-22325,
    +15548,29744,3733,-14547,21459,22122,3854,-2572,30197,-24770,-21263,8793,-8316,
    +1571,28191,-16143,-6446,31524,-26496,-17349,-29097,2806,11281,-7041,-683,14149,
    +19689,-22094,-1657,-30904,183,-15226,-6358,25461,461,1495,28345,-10554,-4004,
    +27119,13484,-21600,-12272,-7272,-14064,-299,10697,11280,19066,-9841,-7265,
    +-18002,19906,-17247,21482,-10939,-5897,-22300,-13978,27575,-8684,-6222,-19041,
    +5788,-30863,-10134,15142,2895,14705,-17713,12940,-21535,-11619,29416,18417,
    +-24973,24867,-26462,-24910,-32556,-26705,-7187,-7750,-758,-14809,20289,9260,
    +13778,-1422,30301,-1922,30646,27662,-15465,-912,29340,13846,-1263,28887,-20019,
    +32421,-29411,-27632,-7495,-8368,29230,-6386,-19536,-5235,2054,1854,23563,12348,
    +-15165,-2936,-28063,-15760,20126,-25531,4963,-5739,23182,16895,-17258,-10470,
    +-3969,-7742,-140,4475,-24014,-31961,19231,27153,-18551,20157,26443,11530,
    +-22214,2284,-24238,-31051,-26422,9088,29868,18458,8488,-9515,6799,-12507,54,
    +-19441,-32665,12561,23560,4725,-28617,-14800,-10224,-13503,-17636,-16823,
    +-24072,18735,-29798,-23658,-670,-21769,7489,-6468,-8961,-14785,22255,11582,
    +-29831,16303,-19652,2922,-4362,22966,16173,-18446,-6148,27381,-8493,-32289,
    +24005,-3027,-18665,-16472,-17793,-27027,-7443,17854,31365,-17726,-2510,-17546,
    +14893,21773,-23634,21117,32533,6637,-1106,-8152,-3672,-113,-2149,-34,-22700,
    +-4102,-28533,-14104,-10086,4378,13695,-15320,-28258,2246,7595,30021,13281,
    +-11968,-29983,14274,27152,26713,19434,17058,1142,-3043,-16496,18630,-11976,
    +29168,-3634,32746,27287,-268,16711,-8712,-471,12895,17406,-22548,-3969,-10733,
    +13128,10530,-31667,7929,-32277,30926,-1983,8401,-7705,6790,4532,1442,26728,
    +29600,-15358,21622,9744,11406,15989,-30741,-15044,29913,24534,6774,-3755,17623,
    +19647,18762,10042,9653,-5889,2408,-32579,-6285,-28559,-30655,6294,-21175,4390,
    +1668,25437,2821,21066,-13680,5274,-27253,-5248,-26307,29744,-26428,25358,17196,
    +15199,-29784,-4604,25653,-8048,-23131,-28995,31340,-9558,26186,11268,27916,
    +9646,-7389,-11384,-29116,-4100,160,18394,7856,738,-25920,12148,24713,-31664,
    +8203,-25556,13494,30352,29161,30898,1432,-5991,25411,1344,-4019,22299,15685,
    +-16401,-23136,-28110,11874,-18945,1879,2,0,-32256,-20996,-18169,29220,12,0,0,0,
    +335,-27277,-30776,20480,0};
    +
    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2016, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2015/endoh3/hint.text b/2015/endoh3/hint.text new file mode 100644 index 000000000..126335c9f --- /dev/null +++ b/2015/endoh3/hint.text @@ -0,0 +1,205 @@ +# Back to the Future Award + +Yusuke Endoh + +Twitter: @mametter + + +## Judges' comments: +### To use: + + make + + ./prog + +### Try: + + make -B BACK_TO=ioccc.c + + ./prog + +### Selected Judges Remarks: + +Like Marty and Doc, something nostalgic from 1984 appears live in October of 2015! +The author of this gem is a true Delorean! + +A question for inquisitive readers: is the implemented subset of PDP-11 instructions Turing-complete? +(For a clue, see the end of the author's remarks.) +If in doubt, use [APOUT](http://www.tuhs.org/Archive/PDP-11/Emulators/Apout/). + +## Author's comments: +### Hint / Compatibility + +* A little-endian system is required due to an external factor. +* Strictly speaking, this program does not comply with any C specification for the same reason. But I believe it is reasonably portable. +* It uses a GCC extension but works on clang. +* This is a kind of emulator. You may find its architecture name if you look at the source code from all angles. +* Find main() function. + + +### Spoiler + +This program is a joke PDP-11 emulator. ("ll-dpd" is embedded in the code. Read it upside down.) + +You got it? This program is supposed to be used in this way: + + $ wget http://ioccc.org/1984/mullender.c + $ clang -o prog prog.c mullender.c + $ ./prog + +You can enjoy the legendary winner of the first IOCCC, again. + + +### Internal + +This program uses `__attribute__((constructor))`, which is a GCC extension, to hijack the main function call. And then it interprets main as an instruction sequence. + +It supports the minimal subset of instructions and addressing modes which are needed for mullender.c to work: + +* Instructions + * BR: branch + * MOV: move + * SOB: subtract one and branch + * SUB: subtract + * TRAP 4: write syscall + * TST: test (no flag is supported, though) + +* Addressing modes + * 0: Register + * 1: Register deferred + * 2: Autoincrement + * 4: Autodecrement deferred + * 6: Index (incomplete) + + +### Limitation + +Non-trivial combination of instruction and addressing mode may cause undefined behavior (unsequenced modification), such as attempting to autoincrement a destination register. Index addressing mode works well only for R7 (PC register). + + +### One more thing + +Note: the program writes a binary to stdout. + + short main[]={5568,1,-30460,12,2782,0,-29921,2056,-4864,6873,770,30054,11886, + 24948,114,21716,-28851,14043,-8944,32691,-16187,-12247,22692,-9781,-20403, + -11771,16546,18710,17873,9233,31304,-32215,-24382,-28247,-25916,10466,24988, + -3404,-4177,-28528,-531,-3016,17300,-28552,-7708,-26180,-4297,-367,-2312, + -25611,28535,-8533,24004,25421,-1224,-5354,-20807,-21589,-6761,-5203,-1055, + -6715,-26673,-1433,-17732,-24198,14681,-3714,-6660,-14891,-25575,20349,-7701, + -8336,31433,16695,-14773,26819,3096,-12584,-28808,17825,-21200,-32399,15877, + -28890,-3728,-27126,21375,-32630,-7615,32004,-29230,-6611,-5508,-28921,12418, + 27204,-5725,9643,3520,26836,-29347,2101,-29311,9320,29287,-29990,-6593,29825, + -29114,16232,25641,20672,-23501,-32127,-6546,-956,10474,-29647,1070,5516,13760, + -27814,-32488,-28006,-17968,-3146,10963,19234,22132,23988,7142,5523,9639,-6888, + -11428,7964,23099,-16822,16518,31109,-12958,10351,2434,3091,3625,2244,27512, + -28559,-10724,-19377,23625,30056,11478,-21176,27660,26517,-29037,-9390,12297, + -11903,5980,-21927,-7483,6671,11249,29638,-23827,-26358,-6856,-1063,-5303, + 26636,25797,31818,26798,-4243,-18772,-13266,27472,-12005,-10642,-22524,24373, + -13111,-9062,6274,-20002,24150,22189,-14965,-31249,-13934,-6341,-18384,-32054, + -29246,10622,-9260,19428,-15485,2724,23810,16447,11627,18604,2739,27812,30295, + -21538,-31786,11355,-11308,-9006,-4987,25363,-18927,-21130,-31213,-27411,17231, + -19608,20232,27754,16476,11213,-19803,-24048,30918,-25329,21233,-10160,13519, + 11828,26653,-6703,10893,6871,-12417,24471,20310,-12137,-19677,4457,-19530, + 10147,17724,533,-10055,27076,10264,11274,-10511,4809,25208,16065,-5105,-19953, + 3772,-12124,13475,-27559,-9955,26446,15133,15207,-23640,6425,-11010,28688, + -20064,26353,-889,-25008,10380,-14449,-6894,18920,-23900,16902,-31018,16093, + 20875,-19576,4585,13126,18589,24789,19424,31274,-5059,-14538,-3125,-16527, + -25070,-9013,26628,15756,-7652,30841,-1283,17707,25717,-18315,-6342,6880, + -19176,6995,5672,2853,-9044,-3409,-14421,-7522,13108,20582,-25317,1376,-5648, + 13821,17300,1220,-29437,-25832,-8332,-15575,-9744,28297,31995,-1217,23852, + 14382,31059,9160,-3296,20287,-28357,24449,-10323,-21992,-4655,-32548,13237, + -15083,-25226,-21121,2015,-8996,-20247,-27551,-14771,-16089,-6920,-9645,21578, + 7142,-5613,14029,24730,-29253,13931,-3862,-16634,-7388,16951,15771,31302, + -22186,-6716,18416,1698,-26200,-16231,9821,-10886,-4994,-30527,-9448,-16923, + 29549,-11207,-14909,-3643,-27548,17865,28859,29753,17616,16874,-17733,9424, + 21435,-31715,24544,8666,30844,25075,-18267,12027,-5346,2717,19615,-4548,-21763, + 28514,11691,22268,-2338,1406,-27379,-23568,-24525,13633,11295,-14715,7877, + -27669,3475,20345,7779,-17849,2184,7132,4079,-24937,11585,22740,5810,-10855, + 16203,-6371,23235,-7,-24828,-11205,-11006,-10,-17812,-14274,11504,-27517,463, + 4498,-32180,-9775,-3190,-22435,-18662,-30146,-31834,-26449,-19374,-12616, + -10596,14341,-10089,-18449,-16535,21439,21191,-1651,7695,-30009,-23339,-8675, + -20774,21588,-2793,8218,-14337,-10866,14060,-15343,31712,25247,-8539,18074, + -28683,-7363,-7663,-3563,-30718,17771,28687,-30495,30584,14022,-28053,5292, + -31576,-32486,-15470,-1330,23551,-2185,-10829,-13216,-4825,-2964,-14668,24559, + -4930,23731,-1152,-11493,-2321,15987,-27073,-20305,-24065,-25048,32750,-27440, + -1169,-25633,-4356,-24993,30439,-17165,-4580,8662,22655,-4588,-6162,-3122, + 31986,-2569,20371,-12320,-25613,-16133,-25644,23677,12254,5855,26325,-13425, + -15903,-1930,-28488,31222,31153,17607,-2758,7594,-8868,30434,-2518,27956, + -19424,7370,6199,-17602,17347,-14358,25588,11611,-25209,-23701,-27444,-29788, + 2680,-27406,9318,22483,-28356,28482,4577,-14891,17323,-30152,2507,2977,5004, + -11696,-31623,-15149,13357,28938,-14048,19490,-19860,-26050,10842,-24922, + -20986,8847,-31184,28519,-29168,32195,10516,25713,-3493,670,31283,-12769, + -17461,11357,13180,26133,15944,18051,-32167,-27990,16813,17676,21787,-17578, + 11173,19093,2836,656,-15239,4632,23937,4106,-21655,-7494,-21575,-17647,-18465, + -14654,-29990,-10707,-12440,21465,5822,26164,-1404,-14303,-26635,-6900,-23611, + 11998,-18551,971,27579,13325,4579,23059,29281,22291,29880,-17546,25664,-14990, + -526,-35,28218,-3214,11965,11263,6633,30719,32400,-29,-3733,24383,32678,-27542, + -4444,6196,5975,-19722,11902,16840,-11680,11146,-26391,-8980,21573,-9043,2349, + -12887,5916,-2996,10410,-23374,26338,11867,-14518,18281,14450,-5815,13842,359, + 25450,27043,3355,13423,-20880,-26311,-30720,-2503,-6046,-18156,-18558,-14774, + -15664,-29001,3365,-12689,10233,23608,24692,12039,15445,18411,-27469,3764, + -10841,22672,23844,2282,-12443,2851,-27163,13651,13738,17201,-29819,27414, + -29764,-5308,-16171,-32427,-26312,-7460,-27376,-6004,25717,29254,-15015,8754, + 15493,22232,-28513,-23355,23676,7736,10571,-8120,-16677,7696,32549,-2646,25538, + 3498,30960,-28459,24716,12655,-10496,402,26209,482,-16661,-20350,-3403,14015, + 32299,11262,-25886,4092,-7843,-100,-1975,-58,-3729,-19269,-23583,-6929,20000, + -6089,17780,-3250,29830,19954,-29277,27896,10330,9277,-25358,31279,-14454, + 24203,-30170,12872,-21973,-25773,-10502,-6647,-26143,6394,-13479,-24559,23007, + -21844,1505,24702,-23187,-24364,-20470,20765,-7107,15674,9404,17408,17964, + 19820,18952,2154,-26052,30056,-3227,17770,-8557,-31018,-27700,-25974,9003, + 18218,22730,-19981,6737,3532,1562,-23626,14990,28472,-5270,17358,-32204,-29197, + -3647,4296,8588,25302,-23906,30328,-29119,-24392,8992,-16557,31530,-31216, + 14107,13041,-6976,7529,-8296,17865,-1462,8181,-21588,-131,-10177,-25931,-14627, + 8301,3708,-32097,20808,13892,-21179,1192,20853,3249,-8774,20843,3520,24954, + -14215,-25170,-16170,2390,25964,-23923,-17464,-7177,-27568,-9880,-4647,-7323, + 15388,2113,-12338,-7737,26255,26818,-22156,-19610,-911,-17057,-556,29935,27647, + 31806,23676,-18132,-19234,-10869,-3715,24983,-10900,-29564,19856,-16392,-31860, + -25826,24077,12080,15383,-29852,-2266,-27217,31931,-3183,17385,-14211,19050, + -2449,-468,-2871,-11466,973,2866,649,1367,-8688,-24069,20992,25139,-25850,1184, + 15851,785,16951,12160,22337,-21851,1849,-18801,14247,-429,-12682,30881,-11273, + -24819,-9794,8389,-27287,7525,16633,1328,-26650,32607,-8217,31912,7774,-16188, + -3546,-6550,-16279,-32696,1940,2577,-23723,-6484,2009,-424,27833,-21763,-13902, + 7044,27360,-18450,27889,23987,3137,-7669,-5784,-7490,24946,32302,26464,-15513, + 28898,2493,-17645,-4615,-13434,-20884,-4058,-29951,-22281,24784,21083,-8536, + 22147,-11261,-15069,20659,2993,19029,21909,6748,-3263,1401,30960,11000,-16871, + -30566,-14959,-26356,-2885,21526,-26531,31063,12857,4992,-5067,3130,-17602, + -1732,-6593,30200,24679,3267,310,20733,24863,-15669,7875,-4577,-13821,-22325, + 15548,29744,3733,-14547,21459,22122,3854,-2572,30197,-24770,-21263,8793,-8316, + 1571,28191,-16143,-6446,31524,-26496,-17349,-29097,2806,11281,-7041,-683,14149, + 19689,-22094,-1657,-30904,183,-15226,-6358,25461,461,1495,28345,-10554,-4004, + 27119,13484,-21600,-12272,-7272,-14064,-299,10697,11280,19066,-9841,-7265, + -18002,19906,-17247,21482,-10939,-5897,-22300,-13978,27575,-8684,-6222,-19041, + 5788,-30863,-10134,15142,2895,14705,-17713,12940,-21535,-11619,29416,18417, + -24973,24867,-26462,-24910,-32556,-26705,-7187,-7750,-758,-14809,20289,9260, + 13778,-1422,30301,-1922,30646,27662,-15465,-912,29340,13846,-1263,28887,-20019, + 32421,-29411,-27632,-7495,-8368,29230,-6386,-19536,-5235,2054,1854,23563,12348, + -15165,-2936,-28063,-15760,20126,-25531,4963,-5739,23182,16895,-17258,-10470, + -3969,-7742,-140,4475,-24014,-31961,19231,27153,-18551,20157,26443,11530, + -22214,2284,-24238,-31051,-26422,9088,29868,18458,8488,-9515,6799,-12507,54, + -19441,-32665,12561,23560,4725,-28617,-14800,-10224,-13503,-17636,-16823, + -24072,18735,-29798,-23658,-670,-21769,7489,-6468,-8961,-14785,22255,11582, + -29831,16303,-19652,2922,-4362,22966,16173,-18446,-6148,27381,-8493,-32289, + 24005,-3027,-18665,-16472,-17793,-27027,-7443,17854,31365,-17726,-2510,-17546, + 14893,21773,-23634,21117,32533,6637,-1106,-8152,-3672,-113,-2149,-34,-22700, + -4102,-28533,-14104,-10086,4378,13695,-15320,-28258,2246,7595,30021,13281, + -11968,-29983,14274,27152,26713,19434,17058,1142,-3043,-16496,18630,-11976, + 29168,-3634,32746,27287,-268,16711,-8712,-471,12895,17406,-22548,-3969,-10733, + 13128,10530,-31667,7929,-32277,30926,-1983,8401,-7705,6790,4532,1442,26728, + 29600,-15358,21622,9744,11406,15989,-30741,-15044,29913,24534,6774,-3755,17623, + 19647,18762,10042,9653,-5889,2408,-32579,-6285,-28559,-30655,6294,-21175,4390, + 1668,25437,2821,21066,-13680,5274,-27253,-5248,-26307,29744,-26428,25358,17196, + 15199,-29784,-4604,25653,-8048,-23131,-28995,31340,-9558,26186,11268,27916, + 9646,-7389,-11384,-29116,-4100,160,18394,7856,738,-25920,12148,24713,-31664, + 8203,-25556,13494,30352,29161,30898,1432,-5991,25411,1344,-4019,22299,15685, + -16401,-23136,-28110,11874,-18945,1879,2,0,-32256,-20996,-18169,29220,12,0,0,0, + 335,-27277,-30776,20480,0}; + +-------------------------------------------------------------------------------- + diff --git a/2015/endoh3/ioccc.c b/2015/endoh3/ioccc.c new file mode 100644 index 000000000..177e0a532 --- /dev/null +++ b/2015/endoh3/ioccc.c @@ -0,0 +1 @@ +short main[] = { 5568,1,-30460,12,10,509,20297,17219,12867,12592,3381 }; diff --git a/2015/endoh3/mullender.c b/2015/endoh3/mullender.c new file mode 100644 index 000000000..bc6135aca --- /dev/null +++ b/2015/endoh3/mullender.c @@ -0,0 +1,10 @@ +short main[] = { + 277, 04735, -4129, 25, 0, 477, 1019, 0xbef, 0, 12800, + -113, 21119, 0x52d7, -1006, -7151, 0, 0x4bc, 020004, + 14880, 10541, 2056, 04010, 4548, 3044, -6716, 0x9, + 4407, 6, 5568, 1, -30460, 0, 0x9, 5570, 512, -30419, + 0x7e82, 0760, 6, 0, 4, 02400, 15, 0, 4, 1280, 4, 0, + 4, 0, 0, 0, 0x8, 0, 4, 0, ',', 0, 12, 0, 4, 0, '#', + 0, 020, 0, 4, 0, 30, 0, 026, 0, 0x6176, 120, 25712, + 'p', 072163, 'r', 29303, 29801, 'e' +}; diff --git a/2015/endoh3/prog.c b/2015/endoh3/prog.c new file mode 100644 index 000000000..d082d49e5 --- /dev/null +++ b/2015/endoh3/prog.c @@ -0,0 +1,24 @@ + + + #include /*recall-the\ /-good--old-\ /IOCCC-days!\ */ + typedef unsigned/*int*/ short U;U(main) [32768],n,r[8]; __attribute__(( + # define R(x) A(r[ 7-(n >>x& 7)], (n>> x>>3 )%8) + #define C(x) (U*) ((/* |IO| -dpd + */char*) main +(x) )/*| |CC| ll*/ + # define A(v, i)(i ?i<2 ?C(v ):i\ + -4?v+=2, C(i- 6?v- 2:v+ *C(v -2)) :C(v -=2) :&v) + /*lian*/ constructor))U( x)(){for(;;*r+= 2,*r+=!n?_exit( write(2,"Illeg" + "al ins" "truction ;-" "(\n",24)),0: n>>8==001?( signed char + + + + + )n*2 :548==n>> 6&&usleep /**/(10 + )+n% 64== 4?0* write (r[7 /**/],C( + *C(* r)), *C(* r+2) )+4: /**/ n>>9 + ==63 &&--r[7-n/ 64%8]?n%+ /**/ 64*- + 2:0, n>>6 ==47 ?*R( 0):n>>12==1? + *R(0 )=*R (+6) :n>> 12==+ 14?* + R(0) -=*R(2*3) :0)n=*C(* r);} + + diff --git a/2015/endoh4/Makefile b/2015/endoh4/Makefile new file mode 100644 index 000000000..fa0bb2810 --- /dev/null +++ b/2015/endoh4/Makefile @@ -0,0 +1,254 @@ +#!/usr/bin/env make +# +# 2015 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +CSILENCE= -Wno-implicit-function-declaration -Wno-implicit-int -Wno-main \ + -Wno-missing-prototypes -Wno-pedantic -Wno-return-type + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= + +# include files that are needed to compile +# +CINCLUDE= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +CSRC= ${ENTRY}.c +OBJ= ${ENTRY}.o +DATA= +ALT_OBJ= +ALT_ENTRY= +TARGET= ${ENTRY} + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +${ENTRY}: ${CSRC} + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from not failing to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v5; \ + else \ + echo "planet deniers, like the IAU, are amusing"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2015/endoh4/hint.html b/2015/endoh4/hint.html new file mode 100644 index 000000000..4a3f57989 --- /dev/null +++ b/2015/endoh4/hint.html @@ -0,0 +1,82 @@ + + + + + + + Best One-liner + + +

    Best One-liner

    + +

    Yusuke Endoh
    +https://github.com/mame/
    +Twitter: @mametter

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./prog <a number of arguments>
    +
    + +

    Try:

    + +
    ./prog @ @ @ @ @ @
    +
    +./prog @ @ @ @ @ @ @ @ @ @ @ @
    +
    +./prog $(perl -e 'print "@ " x (2*3*5*7);')
    +
    +./prog $(< Makefile)
    +
    + +

    Selected Judges Remarks:

    + +

    For this one liner it is best to avoid prime numbers. The output groups +factors in the x-y dimensions. How many factors can be represented before you +run out of command line argument space? How could you modify the program to +experiment with numbers that have more or larger factors?

    + +

    Author’s comments:

    + +

    Visual factorization 1-liner. Try:

    + +
    gcc -o prog prog.c
    +./prog @
    +./prog @ @
    +./prog @ @ @
    +./prog @ @ @ @
    +./prog @ @ @ @ @ @
    +./prog @ @ @ @ @ @ @ @
    +./prog @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @
    +
    + +

    Inspired by Animated Factorization Diagrams.

    + +

    EDIT: prog.orig.c is the original version that I submitted. Gil Dogon kindly improved it during the review. Thank you!

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2016, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2015/endoh4/hint.text b/2015/endoh4/hint.text new file mode 100644 index 000000000..12d80b988 --- /dev/null +++ b/2015/endoh4/hint.text @@ -0,0 +1,57 @@ +# Best One-liner + +Yusuke Endoh + +Twitter: @mametter + + +## Judges' comments: +### To use: + + make + + ./prog + +### Try: + + ./prog @ @ @ @ @ @ + + ./prog @ @ @ @ @ @ @ @ @ @ @ @ + + ./prog $(perl -e 'print "@ " x (2*3*5*7);') + + ./prog $(< Makefile) + +### Selected Judges Remarks: + +For this one liner it is best to avoid prime numbers. The output groups +factors in the x-y dimensions. How many factors can be represented before you +run out of command line argument space? How could you modify the program to +experiment with numbers that have more or larger factors? + + +## Author's comments: +Visual factorization 1-liner. Try: + + gcc -o prog prog.c + ./prog @ + ./prog @ @ + ./prog @ @ @ + ./prog @ @ @ @ + ./prog @ @ @ @ @ @ + ./prog @ @ @ @ @ @ @ @ + ./prog @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ + +Inspired by [Animated Factorization Diagrams](http://www.datapointed.net/visualizations/math/factorization/animated-diagrams/). + + +EDIT: `prog.orig.c` is the original version that I submitted. Gil Dogon kindly improved it during the review. Thank you! + +-------------------------------------------------------------------------------- + diff --git a/2015/endoh4/prog.c b/2015/endoh4/prog.c new file mode 100644 index 000000000..db25d6a9c --- /dev/null +++ b/2015/endoh4/prog.c @@ -0,0 +1 @@ +f(y,x){int m,z;for(m=z=1;m*m<=y?z=y%m?z:m:x+1?z<2?y&&f(x,0):f(z,x),putchar(x?10:32< 2048. These reasons + may be searched for and discovered if you are "Curios!" about 2053. :-) + Moreover, 2053 was the number of the kernel disk pack of one of the + judge's BESM-6. + + Take note that this secondary limit imposed by the IOCCC size tool + obviates some of the need to #define C reserved words in an effort + to get around the size limits of rule 2. + + Yes Virginia, that is a hint! + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many C compilers dislike the following code, and so do we: + + #define d define + #d foo /* <-- don't expect this to turn into #define foo */ + + When declaring local or global variables, you should declare the type: + + int this_is_fine; + this_is_not; /* <-- Try to avoid implicit type declarations */ + +| We suggest that you compile your entry with a commonly available +| c11 (formerly C1X) C compiler (ISO/IEC 9899:2011). + +| Do not assume that optional c11 features are supported. If you +| must use an optional c11 feature, use feature test macros so +| that implementations without such optional c11 features will see +| an entry that is both functional and interesting. + +| We like entries that have workarounds that allow someone with +| an older c99 (ISO/IEC 9899:1999) compiler to be able to compile +| and enjoy your entry. + +| Anyone care to submit an entry that makes gratuitous use of all +| of the c11 reserved words in their intended C language contexts? +| NOTE: As with the use of the word Belgium, the use of certain gratuitous +| c11 reserved words may be completely banned in all parts of the Galaxy, +| except in one small part (ISO/IEC 9899:2011) where they might not truly +| understand the implications of such words. + +| http://hitchhikers.wikia.com/wiki/Belgium +| http://www.bezem.de/pdf/ReservedWordsInC.pdf + + DO NOT assume that we will use gcc to compile your program. + We will first try to compile your program using Clang. + + It is much better to not use any obscure compiler flags if + you can help it. We want to discourage the use of obscure compiler + flags that would make the program less portable. + + One side effect of the above is that you cannot assume the use + of nested functions such as: + + main() { +| void dont_do_this() { printf("machine that goes bing!!\n"); } +| dont_do_this(); + } + + This is because such nested functions often requires one to compile with + a flag such as -fnested-functions that is not found on some compilers. + + On 2012 July 20, the judges rescinded the encouragement of + nested functions. Such constructions, while interesting and sometimes + amusing, will have to wait until they required by a C standard that are + actually implemented in commonly used C compilers. Sorry! + +| We prefer programs that do require a fish license for pet fish, crayon +| use not withstanding. + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using . Use instead. + + On 28 January 2007, the Judges rescinded the requirement that the + '#" in a C preprocessor directive must be the 1st non-whitespace octet. + + The exit() function returns void. Some broken systems have exit() + return int, your entry should assume that exit() returns a void. + +| This line has a change mark at the very beginning. + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + +| While those who are used to temperatures found on Saturn's moon +| Titan might be able to explain to the Walrus why our seas are +| boiling hot, the question of whether pigs have wings is likely +| to remain a debatable point to most of them. + + One line programs should be short one line programs: say around 80 to 120 + octets long. Going well beyond 140 octets is a bit too long to be called + a one-liner in our vague opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS version specific + (index/strchr differences are OK, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is OK only if you warn us in the 'remark' header item) + * won't compile or run under a POSIX P1003.1/P1003.2 like systems + * depend on a utility or application not normally found on most + most POSIX P1003.1/P1003.2 like systems + * abuse the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are "blob-ier" than they need to be + * are rather similar to previous winners :-( + * are too similar to previous losers :-) + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + At least one judge prefers to maintain the use of the leap-second +| as part of the world's time standard. If your code prints time +| with seconds, we prefer that your code be capable of printing the +| time of day during a leap-second where the value in seconds +| after the minute mark is 60. + + The "how to build" make process should not be used to try and get + around the size limit. It is one thing to make use of a several -D's + on the compile like to help out, but it is quite another to use many + bytes of -D's in order to try and squeeze the source under the size limit. + + The judges, as a group, have a history giving wide degree of latitude +| to reasonable entries. And recently they have had as much longitudinal +| variation as it is possible to have on Earth. :-) + + You should try to restrict commands used on the build file to + POSIX-like or common Un*x-like commands. You can also compile + and use your own programs. If you do, try to build and execute + from the current directory. This restriction is not a hard and + absolute one. The intent is to ensure that the building if your + program is reasonably portable. + + You are in a maze of twisty guidelines, all different. + + There are at least zero judges who think that Fideism has little + or nothing to do with the IOCCC judging process. + + Don't forget that the building of your program should be done +| ***without human intervention***. So don't do things such as: + + prog: prog.c + #echo this next line requires data from standard input + cat > prog.c + ${CC} prog.c -o prog + + However, you can do something cute such as making your program + do something dumb (or cute) when it is built 'automatically'. And + when it is run with a human involved, do something more clever. + For example, one could use the build instructions: + + prog: prog.c + ${CC} prog.c -DNON_HUMAN_COMPILE -o prog + @echo "See remarks section about alternate ways to compile" + + and then include special notes in the program "remarks" for + alternate / human intervention based building. + + We want to get away from source that is simply a compact blob of + octets. Really try to be more creative than blob coding. *HINT!* + + Please do not use things like gzip to get around the size limit. +| Try to be more creative. + + We really dislike entries that make blatant use of including + large data files to get around the source code size limit. + +| We do not recommend submitting systemd source code to the IOCCC, +| if nothing else because that code is likely to exceed the source code +| size limit. This isn't to say that another highly compact and obfuscated +| replacement of init would not be an interesting submission. + + Did we remember to indicate that programs that blatantly use + some complex state machine to do something simple are boring? + We think we did. :-) + + All generalizations are false, including this one. -- Mark Twain + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! + Remember, you can submit more than one entry. See the rules for details. + + We suggest that you avoid trying for the 'smallest self-replicating' + source. The smallest, a zero byte entry, won in 1994. + + Programs that claim to be the smallest C source that does something, really + better be the smallest such program or they risk being rejected because + they do not work as documented. + + Please note that the C source below, besides lacking in obfuscation, + is NOT the smallest C source file that when compiled and run, dumps core: + + main; + + We do not like writable strings. That is, we don't want stuff like: + + char *T = "So many primes, so little time!"; + ... + T[14] = ';'; + + Please don't make use of this feature, even if your system allows it. + However, initialized char arrays are OK to write over. This is OK: + + char b[] = "Is this OK"; + b[9] = 'K'; + +| There are still more than zero typos in this sentence. + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. For + example, don't depend on a particular type or size of display. + Don't assume the use of a particular browser. Instead assume a + generic browser that forms to a widely used W3C standard. + Don't assume a particular sound sub-system or video driver is installed + in the OS. Instead, make use of a well known and widely available open + source program (one that actually works) to display audio/visual data. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. + + This is the only guideline that contains the word fizzbin. + + We don't like entries that use proprietary toolkits such as the M*tif, + Xv*ew, or OpenL*ok toolkits, since not everyone has them. Use of an + open source toolkit that is widely and freely available instead. + +| The previous guideline in this spot has been replaced by this guideline. + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines +| in the program "remarks". They should also not depend on any +| particular window manager. + + Try to avoid entries that play silent sound segments or play the + Happy Birthday song; music that some people believe is copyrighted + (even if such copyrights appear to be bogus and/or blatant abuses of + the copyright system). + + While we recognize that UN*X is not a universal operating system, the + contest does have a bias towards such systems. In an effort to expand + the scope of the contest, we phrase our bias in terms of POSIX P1003.1 + and P1003.2 standards. This will allow certain non-UN*X OS users to + submit entries. On the other hand, this is a guideline and not a rule. + We will not reject an entry based on some POSIX technicality. + + When dealing with OS and application environments, we suggest that you + be reasonable with a nod towards vanilla UN*X-like systems. POSIX will + evolve but not as much as the contest. + + You very well might not be completely prohibited from failing to not +| partly misunderstand this particular guideline, but of course we could +| not possibly comment. Nevertheless, you are not mandated to + determine that this or the previous sentence is false and misleading. +| Therefore, it might not be wise to not fail to consider failing to do so. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION <== HINT!! + * make us laugh and/or throw up :-) (humor really helps!) + * make us want to eat good chocolate. + + Some types of programs can't excel (anti-tm) in some areas. Your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + You are better off explaining what your entry does in the program + "remarks" section rather than leaving it obscure for the judges + as we might miss something and/or be too tired to notice. + +| Please avoid this specific individual guideline, if at all possible. + + We freely admit that interesting, creative or humorous comments in + the program "remarks" help your chances of winning. If you had to + read so many twisted entries, you too would enjoy a good laugh or two. + We think the readers of the contest winners do as well. We do read + the program "remarks" during the judging process, so it is worth your + while to write remarkable program "remarks". + + We dislike C code with trailing control-M's (\r or \015) that results + in compilation failures. Some non-Un*x/non-Linux tools such as + MS Visual C and MS Visual C++ leave trailing control-M's on lines. + Users of such tools should strip off such control-M's before submitting + their entries. In some cases tools have a "Save As" option that will + prevent such trailing control-M's being added. + +| One should restrict libcurses to portable features found on BSD +| or Linux curses. + + Rule 13 states any C source that fails to compile because of unescaped + octets with the high bit set (octet value >= 128) will be rejected. + Instead of unescaped octets, you should use \octal or \hex escapes: + + /* 123456789 123456789 123456789 123456 */ + char *foo = "This string is 36 octets in length \263"; + /* This octet requires 4 octets of source ^^^^ */ + if (strlen(foo) == 36) printf("foo is 36 octets plus a final NUL\n"); + else printf("This code should not print this message\n"); + + It is a very good idea to, in your remarks file, tell us why you + think your entry is obfuscated. This is particularly true if + your entry is has some very subtle obfuscations that we might + otherwise overlook. <<-- Hint! + + Anyone can format their code into a dense blob. A really clever + author will try format their entry using a "normal" formatting style + such that at first glance (if you squint and don't look at the details) + the code might pass for non-obfuscated C. Deceptive comments, + and mis-leading formatting, in some cases, may be a plus. On the + other hand, a misleading code style requires more source bytes. + + If you do elect to use misleading formatting and comments, we + suggest you remark on this point in your remarks where you talk + about why you think your entry is obfuscated. On the other hand, + if you are pushing up against the size limits, you may be forced + into creating a dense blob. Such are the trade offs that obfuscators face! + + We prefer code that can run on either a 64-bit or 32-bit processor. + However, it is unwise to assume it will run on an i386 or x86 architecture. + + We believe that Mark Twain's remark: + + Get your facts first, then you can distort them as you please. + + is a good guideline for those writing code for the IOCCC. + + While programs that only run in a specific word size are OK. If you have + to pick, choose a 64-bit word size. + + If we are feeling ornery we might choose to compile your program + for running on an Arduino or a PDP-11. Heck, should we ever find + an emulator of 60-bit CDC Cyber CPU running a POSIX-like OS, we + might just try your entry on that emulator as well :-) + + If your entry MUST run only in 32-bit mode on an Intel processor, add the + following compiler flag: + + -arch i386 + + to your "how to build" make compile line. For example: + + prog: prog.c + ${CC} prog.c -arch i386 -o prog + + Be even more creative! + + +ABUSING THE RULES: + + Legal abuse of the rules is somewhat encouraged. Legal rule abuse may + involve, but is not limited to, doing things that are technically + allowed by the rules and yet do not fit the spirit of what we intended + to be submitted. + + Legal rule abuse is encouraged to help promote creativity. Rule abuse + entries, regardless of if they receive an award, result in changes to + the next year's rules and guidelines. + + Legal abuse of the rules is NOT an invitation to violate the rules. + An entry that violates the rules in the opinion of the judges, WILL be + disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK! If you + have an entry that might otherwise be interesting, you might want to + submit two versions; one that does not abuse the rules and one that + does. + + If you intend to abuse the rules, indicate so in the program + "remarks". You must try to justify why you consider your rule abuse + to be allowed under the rules. That is, you must plead your case as + to why your entry is valid. Humor and/or creativity help plead a + case. + + Abusing the web submission procedure tends to annoy us more + than amuse us. Spend your creative energy on content of your + entry rather than on the submission process itself. + + We are often asked why the contest rules and guidelines seem too + strange or contain mistakes, flaws or grammatical errors. One reason + is that we sometimes make genuine mistakes. But in many cases such + problems, flaws or areas of confusion are deliberate. Changes to + rules and guidelines in response to rule abuses, are done in a minimal + fashion. Often we will deliberately leave behind holes (or introduce + new ones) so that future rule abuse may continue. A cleaver author + should be able to read them and "drive a truck through the holes" in + the rules and guidelines. + + At the risk of stating the obvious, this contest is a parody of the + software development process. The rules and guidelines are only a + small part of the overall contest. Even so, one may think the contest + rules and guideline process as a parody of the sometimes tragic + mismatch between what a customer (or marketing) wants and what + engineering delivers. Real programmers must face obfuscated + and sometimes conflicting specifications and requirements from marketing, + sales, product management an even from customers themselves on a + all to regular basis. This is one of the reasons why the rules and + guidelines are written in obfuscated form. + + +JUDGING PROCESS: + + Entries are judged by Leonid A. Broukhis, Simon Cooper, Landon Curt Noll. + + Each entry submitted is given a random id number and subdirectory. The + entry files including, but not limited to prog.c, Makefile (that we + form from around your "how to build" information), as well as any + data files that you submit are all placed under their own directory. + stored and judged from this directory. + + Any information about the authors is not read by the judges until + the judging process is complete, and then only from entries that have +| won an award. Because we do not read this information for entries that +| do not win, we do not know who did not win. + + The above process helps keep us biased for/against any one particular + individual. Therefore you MUST refrain from putting any information + that reveals your identity in your entry. + + Now some people point out that coding style might reveal the information + about the others. However we consider this to be simply circumstantial + and outside the scope of the above paragraph. + + Some people, in the past, have attempted to obfuscate their identity by + including comments of famous Internet personalities such as Peter Honeyman + (http://www.citi.umich.edu/u/honey/). The judges are on to this + trick and therefore consider any obfuscated source or data file + claiming to be from Honeyman to not be form Honeyman. This of course + creates an interesting paradox known as the "obfuscated Peter Honeyman + paradox". Should Peter Honeyman actually submit an obfuscated entry, + he alone is excluded from the above, as we will likely believe + it just another attempt at confusion. This guideline is known + as the "Peter Honeyman is exempt" guideline. + + BTW: None of the entries claiming to be from Peter Honeyman have ever + won an award. So it is theoretically possible that Peter Honeyman + did submit an entry in the past. In the past, Peter had denied + submitting anything to the IOCCC. Perhaps those entries were + submitted by one of his students? + +| We will be clear on this point, and the rules will be adjusted to +| reflect this, DO NOT put author's names in obvious ways into your +| source code, remarks, data files, etc. The above "Peter Honeyman is +| exempt" not withstanding. + + We seemed to have digressed again ... :-) Returning to the judging process: + + We prefer to be kept in the dark as much as you are until the final + awards are given. We enjoy the surprise of finding out in the end, + who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. + + During the judging process. a process that spans multiple sessions + over a few weeks, post general updates from our @IOCCC twitter account. + + Once we have selected the winners, for each category we will tweet: + + category name + name(s) of the authors (or anonymous if requested) + twitter handle(s) (if provided and if anonymity was not requested) + country code(s) of the author(s) + + After the initial announcement, we attempt to send EMail to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes and typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the "how to build" information and forming a Makefile + * reading prog.c, the C source + * reviewing the "remarks" information + * briefly looking any any supplied data files + * passing the source thru the C pre-processor + skipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + skipping over any #include files + * compiling/building the source + * running the program + * Doing other things that only IOCCC judges know about :-) + + In later rounds, other actions are performed including performing + miscellaneous tests on the source and binary. + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry will often compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + +| * best small one line program (see above about one line programs) + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code (code with deceptive comments and source code) + * best X client (see OUR LIKES AND DISLIKES) +| * best abuse of ISO C or ANSI C standard (see above about compilers) + * best abuse of the C preprocessor + * worst abuse of the rules + * (anything else so strange that it deserves an award) + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to to about + half that number: declaring those remaining to be winners. + + Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry is good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + + More than one IOCCC judge has been known to bribe another IOCCC judge + into voting for a winning entry by offering a bit high quality chocolate. + This technique is highly discouraged for use by non-IOCCC judges. + + More often than not, we select a small entry (usually one line), a + strange/creative layout entry. We sometimes also select an + entry that abuses the contest guidelines in an interesting way, + or that stretches the content rules that while legal, is + nevertheless goes against the intent of the rules. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entries. More often, the + 'best' is picked because it does well in a number of categories. + +| In years past, we renamed the winning entry from prog.c to a +| name related to the submitter(s) names. This is no longer done. +| Winning source is called prog.c A compiled binary is called prog. + +| The start and end dates of this IOCCC include a +/- number of seconds. +| This interval was added to give those not located immediately next +| to the IOCCC submission server some packet time of flight leeway. +| Those wishing to submit their entries prior to the close of this +| IOCCC would be well advised to not wait until the last millisecond. +| Moreover the submission server might be busy dealing with other +| last minute submissions. You would be better off submitting your +| entry a day or so early just be sure you get it in on time. + + +ANNOUNCEMENT OF WINNERS: + + The judges will tweet initial announcement of who won, the name + of their award, and a very brief description of the winning entry + from the @IOCCC twitter handle. Non-twitter users should visit: + + https://twitter.com/ioccc + + Non-twitter users should force their browsers to reload the above URL + to be sure they are seeing the most recent tweets. + + The judges will then post an initial announcement of who won, the name + of their award, and a very brief description of the winning entry + on the IOCCC web site: + + http://www.ioccc.org/whowon.html + + We will also attempt to submit a brief announcement story to /.: + + http://slashdot.org + + that, depending on the willingness of the /. editors, may be posted + to their site at the same time. + + Note that initial announcement will NOT contain source. This is because + the winning authors are given a chance to review the judges comments, + and test our Makefile. This review process typically takes a few weeks. + + Sometime after the initial announcement, and once the the review + by the winners has been completed, the winning source will be + posted to the IOCCC web site: + + http://www.ioccc.org/years.html + + NOTE: previous winners are available at that URL + + We will also tweet, via @IOCCC, when the winning source is available. + + It is pointless to ask the IOCCC judges how many entries we receive. + Other government TLA or FLA snooping organizations are prohibited from + either confirming, denying or revealing any knowledge of this data point. + + Often, winning entries are published in selected magazines from around + the world. Winners have appeared in books ("The New Hackers Dictionary") + and on T-Shirts. More than one winner has been turned in a tattoo! + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending EMail to the following address: + +| q.2015@ioccc.org (do not submit entries to this address) + +| You must include the words 'ioccc 2015 question' in the subject of your + EMail message when sending EMail to the judges. + + Questions and comments about the contest are welcome. Comments about + confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. + + Check out the IOCCC Web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + For the updates and breaking IOCCC news, you are encouraged to follow + the twitter handle: + + @IOCCC + + You do not have to be a twitter user to follow @IOCCC. Non-twitter + users should access: + + https://twitter.com/ioccc + + Non-twitter users should force their browsers to reload the above URL + to be sure they are seeing the most recent tweets. + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ diff --git a/2015/hint.css b/2015/hint.css new file mode 100644 index 000000000..c8d299d85 --- /dev/null +++ b/2015/hint.css @@ -0,0 +1,77 @@ +* { + font-family: Helvetica Neue, Helvetica, Arial, sans-serif; +} +body { + max-width: 50em; + margin: 0 auto; + color: #111; +} + +pre, code { + font-family: Monaco, Courier New, monospace; + font-size: 12px; +} + +h1 { + font-size: 40px; + font-weight: bold; + letter-spacing: -1px; + margin-bottom: -5px; +} +h1 code { + font-size: 40px; +} + +h2 { + color: rgb(43,105,145); + font-weight: bold; + margin-bottom: -5px; +} +h2 code { + font-size: 22px; +} + +h3 { + /* color: rgb(43,105,145); */ + font-weight: bold; + margin-bottom: -5px; +} +h3 code { + font-size: 16px; +} + +a { + color: blue; + text-decoration: underline; +} +a:visited { + color: navy; +} +a:hover { + text-decoration: underline; +} + +pre { + border-radius: 10px; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + border-width: 1px; + border-color: rgb(16,48,0); + border-style: solid; + padding: 0.6em; + padding-left: 1em; + margin-left: 5%; + margin-right: 8%; + background-color: rgb(55,39,0); + overflow: auto; + color: rgb(255,183,0); +} + +p, li { + font-size: 14px; + line-height: 18px; +} + diff --git a/2015/hou/Makefile b/2015/hou/Makefile new file mode 100644 index 000000000..08d7ad3c7 --- /dev/null +++ b/2015/hou/Makefile @@ -0,0 +1,261 @@ +#!/usr/bin/env make +# +# 2015 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +CSILENCE= -Wno-cast-qual -Wno-missing-prototypes \ + -Wno-missing-variable-declarations -Wno-shadow -Wno-ignored-qualifiers + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= + +# include files that are needed to compile +# +CINCLUDE= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +OPT= -O2 +#OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= -lm + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +CSRC= ${ENTRY}.c +OBJ= ${ENTRY}.o +DATA= +ALT_OBJ= +ALT_ENTRY= +TARGET= ${ENTRY} + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +${ENTRY}: prebuild + if [ `./prebuild < prog.c | cut -c-7` == 'non-ISO' ]; then \ + ${CC} ${CFLAGS} -msse2 -mfpmath=sse ${CSRC} -o $@ ${LIBS}; \ + else \ + cp $< $@; \ + fi + +prebuild: ${CSRC} + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} prebuild + +clobber: clean + ${RM} -f ${TARGET} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from not failing to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v5; \ + else \ + echo "planet deniers, like the IAU, are amusing"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2015/hou/hint.html b/2015/hou/hint.html new file mode 100644 index 000000000..9836d6f24 --- /dev/null +++ b/2015/hou/hint.html @@ -0,0 +1,129 @@ + + + + + + + Most Well-rounded Hash + + +

    Most Well-rounded Hash

    + +

    Qiming Hou hqm03ster@gmail.com
    +http://www.houqiming.net/

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +echo IOCCC | ./prog
    +
    + +

    Try:

    + +
    echo "" | ./prog
    +
    + +

    Selected Judges Remarks:

    + +

    A good start for understanding this entry might be +https://www.ietf.org/rfc/rfc1321.txt. How does it compute this using only a +single looping construct? The original reference source code for this +algorithm is about 355 lines of code, yet this entry is only 199 lines with +one statement per line and it isn’t using lots of macro expansion tricks like +the reference code!

    + +

    Some things that make you go, “huh?”

    + +
    ./prog < prog.c | cut -c-5
    +./prog < Makefile | cut -c-4
    +
    + +

    How are those values magically returned?

    + +

    What happens with a large file? Something over 256K

    + +
    ./prog < large_file
    +
    + +

    Where does that message come from?

    + +

    Author’s comments:

    + +

    This looks like a normal C program.

    + +

    Almost everything is a double.

    + +

    There are tell-tale signs like pow(2,(?/12)) and exp(-?*?) (names redacted). You can also find a bunch of cosines and polynomial evaluations.

    + +

    It looks like a ????? ???????????, right?

    + +

    Run and find out.

    + +

    Why obfuscated

    + +

    Some poor scripting folks only have access to doubles (Jav?script, L?a, BA?IC, etc.).

    + +

    As a C programmer, I feel obliged to show a gesture of sympathy, to experience their pain and provide an answer.

    + +

    Except when absolutely necessary (printf, int main(), array indexing), there isn’t a single integer. Even getchar() and EOF are immediately converted.

    + +

    Since bool counts as an integer type too, there is no boolean either. No comparison, no if, no ?:, no || &&. Everything is done in a single loop that terminates on printf. Straight up arithmetic.

    + +

    floor and ceil are technically double-to-double functions, but they feel like cheating. Yes cos, no floor.

    + +

    Limitations

    + +

    Hard requirements:

    + +
      +
    • The platform must implement the double type as IEEE754-compliant 64-bit floating point numbers. The 80-bit intermediate format used by x87 is considered as an violation of this. The code should print an error message on such platforms.

    • +
    • The program must start with the CPU / FPU in round-to-nearest mode.

    • +
    + + +

    Soft requirements:

    + +
      +
    • The compiler must respect volatile. The code is formatted to warn about that, though.

    • +
    • The printed result is only correct on little-endian machines. The program takes care to warn about this issue after printing an incorrect big-endian result. Error messages become garbled, though.

    • +
    + + +

    Tested platforms:

    + +
      +
    • Linux 3.18.7, Rasperberry Pi 2, clang 3.0-6.2, (works)
    • +
    • Linux 3.18.7, Rasperberry Pi 2, gcc 4.6.3, (works)
    • +
    • Mac OS X 10, x64, Apple LLVM version 6.1.0 (clang-602.0.53), (works)
    • +
    • Windows 8.1, x86, MSVC 2012 (works)
    • +
    • Windows 8.1, x64, MSVC 2012 (works)
    • +
    • Windows 8.1, x86, MinGW gcc 4.6.2 (fails, prints error message)
    • +
    • Windows 8.1, x86, MinGW gcc 4.6.2 with -msse2 -mfpmath=sse (works)
    • +
    + + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2016, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2015/hou/hint.text b/2015/hou/hint.text new file mode 100644 index 000000000..96d4bf5b3 --- /dev/null +++ b/2015/hou/hint.text @@ -0,0 +1,95 @@ +# Most Well-rounded Hash + +Qiming Hou + + + +## Judges' comments: +### To use: + + make + + echo IOCCC | ./prog + +### Try: + + echo "" | ./prog + +### Selected Judges Remarks: + +A good start for understanding this entry might be +https://www.ietf.org/rfc/rfc1321.txt. How does it compute this using only a +single looping construct? The original reference source code for this +algorithm is about 355 lines of code, yet this entry is only 199 lines with +one statement per line and it isn't using lots of macro expansion tricks like +the reference code! + +Some things that make you go, "huh?" + + ./prog < prog.c | cut -c-5 + ./prog < Makefile | cut -c-4 + +How are those values magically returned? + +What happens with a large file? Something over 256K + + ./prog < large_file + +Where does that message come from? + + +## Author's comments: +This looks like a normal C program. + +Almost everything is a double. + +There are tell-tale signs like `pow(2,(?/12))` and `exp(-?*?)` (names redacted). You can also find a bunch of cosines and polynomial evaluations. + +It looks like a ????? ???????????, right? + +Run and find out. + +### Why obfuscated + +Some poor scripting folks only have access to doubles (Jav?script, L?a, BA?IC, etc.). + +As a C programmer, I feel obliged to show a gesture of sympathy, to experience their pain and provide an answer. + +Except when absolutely necessary (`printf`, `int main()`, array indexing), there isn't a single integer. Even `getchar()` and `EOF` are immediately converted. + +Since `bool` counts as an integer type too, there is no boolean either. No comparison, no `if`, no `?:`, no `||` `&&`. Everything is done in a single loop that terminates on printf. Straight up arithmetic. + +`floor` and `ceil` are technically double-to-double functions, but they feel like cheating. Yes `cos`, no `floor`. + +### Limitations + +Hard requirements: + +* The platform must implement the `double` type as IEEE754-compliant 64-bit floating point numbers. The 80-bit intermediate format used by x87 is considered as an violation of this. The code should print an error message on such platforms. + +* The program must start with the CPU / FPU in round-to-nearest mode. + +Soft requirements: + +* The compiler must respect `volatile`. The code is formatted to warn about that, though. + +* The printed result is only correct on little-endian machines. The program takes care to warn about this issue after printing an incorrect big-endian result. Error messages become garbled, though. + +Tested platforms: + +* Linux 3.18.7, Rasperberry Pi 2, clang 3.0-6.2, (works) +* Linux 3.18.7, Rasperberry Pi 2, gcc 4.6.3, (works) +* Mac OS X 10, x64, Apple LLVM version 6.1.0 (clang-602.0.53), (works) +* Windows 8.1, x86, MSVC 2012 (works) +* Windows 8.1, x64, MSVC 2012 (works) +* Windows 8.1, x86, MinGW gcc 4.6.2 (fails, prints error message) +* Windows 8.1, x86, MinGW gcc 4.6.2 with -msse2 -mfpmath=sse (works) + +-------------------------------------------------------------------------------- + diff --git a/2015/hou/prog.c b/2015/hou/prog.c new file mode 100644 index 000000000..e9ff57fae --- /dev/null +++ b/2015/hou/prog.c @@ -0,0 +1,199 @@ +#include +#include +#define i(Y) X[(int)(Y)] + +typedef/***************/ +/**/ /**/ +/**/ volatile /**/ +/**/ double /**/ +/**/ /**/ +/*******************/T;T + +H=4.503599627370496e15, +a=2.271681097355226e15, +n=4.294967296e9, +d=4.023233417e9, +l=3.135045272e9, +e=1.159922023e9, + +w=8.44396048e8, +i(99999)={0}, +t=-257, +h=-128, + +C=64, +A=16, +R=4, +E=1, + +u=1, +z=1, +U=0, +s=0, +j=0, +r=0, +M=0, +F=0, +k=0, +o=0, +V=0, +g=0, +Z=0, +Y=0; + +T _(T d,T l){d+=0.5;d/=l;d+=1.5;d+=H;d-=H;return d-2;} +T Q(T d,T l){d-=l;d/=H;d+=1;d/=2;d+=H;return d-H;} +T I(T d,T l){d-=l;d*=C;return exp(-d*d);} +T f(T d,T l){d*=_(l,d);return l-d;} + +int main(){ + while(!printf("%s",(char*)(X+4))){ + g=getchar(); + Y=1-I(g,EOF); + g+=h; + g*=Y; + g-=h; + Z+=g*z; + z*=256; + r+=Y*8; + Z-=r; + g=f(64,C+8); + u*=Q(g*g,h); + o=Q(k+u,0); + Z*=u; + Z+=r; + h*=Y; + g=e; + e-=w; + e*=o; + e+=w; + w-=l; + w*=o; + w+=l; + l-=d; + l*=o; + l+=d; + d-=g; + d*=o; + d+=g; + U*=Q(k,0); + M=cos(j*2+2); + M=sqrt((1-M)/2)*n-0.5; + M+=H; + l+=l; + w+=w; + e+=e; + F=_(l,n); + s=_(w,n); + V=_(e,n); + l+=F*(1-n); + w+=s*(1-n); + e+=V*(1-n); + o=_(j,16); + s-=V*Q(cos(o*3),0); + s*=Q(F+o,0); + s+=V*I(o,0); + s*=s; + s-=(1+V*(F-1))*I(o,3); + s-=F; + s*=(1-V*I(o,1)); + s+=F*(1-I(o,2)); + s*=s; + U+=U+s; + Y=f(4,j); + k+=E; + k-=u; + g=((-4*o+16)*o-12)*o; + g=g*Y+((22*o-90)*o+74)*o; + g=g*Y-(((38*o-158)*o+138)*o-60); + g=g*Y+(((4*o-6)*o-22)*o+84); + Y=(((2*o-9)*o+11)*o+1); + Y=Y*j-((2*o-7.5)*o+4.5)*o; + o=I(k,32); + M-=H; + M*=o; + Y=f(16,Y); + Y=i(A+Y); + Y+=U; + Y*=o; + d+=Y; + d+=M; + d=f(n,d); + g*=o; + g=pow(2,(g/12)); + d*=g; + g=(d+0.5*g)/n+1.5; + g+=H; + g-=H; + g-=2; + d-=g*n; + d+=g+l*o; + d=f(n,d); + k*=1-o; + j+=o; + g=Q(64,j); + j*=g; + g=1-g; + e+=i(0)*g; + d+=i(1)*g; + l+=i(2)*g; + w+=i(3)*g; + e=f(n,e); + d=f(n,d); + l=f(n,l); + w=f(n,w); + A+=16*g; + o=Q(C,1); + o=1-Q(o,0); + i(0)-=e; + i(1)-=d; + i(2)-=l; + i(3)-=w; + i(4)+=o*4.6727004911171048e-153; + i(5)+=o*1.6937441874215991e190; + g=exp(-E*(g+u)*C*C); + i(0)*=g; + i(1)*=g; + i(2)*=g; + i(3)*=g; + i(4)*=g; + i(5)*=g; + o=exp(-o*C*C); + o*=Q(C,3.9999e5); + i(0)+=e; + i(1)+=d; + i(2)+=l; + i(3)+=w; + i(4)+=o*4.522871578970112e217; + i(5)+=o*7.90055321525613e115; + E*=Q(C/4+1,A); + o=Q(j+E,0); + g=pow(2,t-304-n*o); + i(R+4)=(H+H/85+a)*g; + i(C/4)=Z; + C+=u; + R+=o-1; + Y=Q(z*E,n-1); + Z*=1-Y; + z+=Y*(1-n)-1; + z*=o; + a*=o; + t*=o; + o=_(j,2); + o=1-j+o*4; + o=_(i(R),pow(16,o)); + g=_(o,16); + o-=g*16; + o+=Q(o,9)*39; + g=_(o,16); + g*=I(j,6); + o-=g*16; + t+=g; + z+=1; + a+=o*z*Q(7,j); + t+=o*16*Q(j,6); + j+=1-E; + j*=Q(C*E+8,j); + } + return 0; +} diff --git a/2015/howe/Makefile b/2015/howe/Makefile new file mode 100644 index 000000000..9029cda33 --- /dev/null +++ b/2015/howe/Makefile @@ -0,0 +1,277 @@ +#!/usr/bin/env make +# +# 2015 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# + +# Assume a POSIX compliant shell. +# +# On Linux +# /bin/sh = /bin/bash +# +# On NetBSD +# /bin/ksh +# /usr/pkg/bin/bash +# +# On OpenBSD +# /bin/ksh = /bin/pdksh +# +SHELL= /bin/sh + +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +CSILENCE= -Wno-sign-compare -Wno-missing-prototypes \ + -Wno-padded -Wno-shadow \ + -Wno-sign-conversion + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= + +# include files that are needed to compile +# +CINCLUDE= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +CSRC= ${ENTRY}.c +OBJ= ${ENTRY}.o +DATA= +ALT_OBJ= +ALT_ENTRY= +TARGET= ${ENTRY} + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +${ENTRY}: ${CSRC} + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +test: makeholes prog-test.sh ${TARGET} + ${SHELL} ./prog-test.sh + +makeholes: makeholes.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_ENTRY} + ${RM} -f *.tmp + ${RM} -f makeholes makeholes.o + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from not failing to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v5; \ + else \ + echo "planet deniers, like the IAU, are amusing"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2015/howe/avgtime.sh b/2015/howe/avgtime.sh new file mode 100644 index 000000000..26c0e944f --- /dev/null +++ b/2015/howe/avgtime.sh @@ -0,0 +1,22 @@ +#!/bin/ksh + +COUNT=$1; shift +CMD="$@" + +N=0 +SYS=0 +USER=0 +REAL=0 + +while [ $N -lt $COUNT ]; do + TIME=$( { /usr/bin/time -l $CMD >/dev/null; } 2>&1 | head -n 1 ) + REAL="$REAL + $(echo $TIME | cut -d' ' -f1)" + USER="$USER + $(echo $TIME | cut -d' ' -f3)" + SYS="$SYS + $(echo $TIME | cut -d' ' -f5)" + (( N = $N + 1 )) +done + +printf 'avg-real\t%.3f\n' $(echo "scale=3; ( $REAL ) / $COUNT" | bc) +printf 'avg-user\t%.3f\n' $(echo "scale=3; ( $USER ) / $COUNT" | bc) +printf 'avg-sys\t%.3f\n' $(echo "scale=3; ( $SYS ) / $COUNT" | bc) + diff --git a/2015/howe/hint.html b/2015/howe/hint.html new file mode 100644 index 000000000..dbe7603b0 --- /dev/null +++ b/2015/howe/hint.html @@ -0,0 +1,163 @@ + + + + + + + Most Different + + +

    Most Different

    + +

    Anthony Howe achowe@snert.com
    +Montreal, Quebec, Canada
    +http://www.snert.com/
    +Twitter: @SirWumpus

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./prog file1 file2
    +
    +./prog -d file1 file2
    +
    + +

    Try:

    + +
    ./prog prog.orig.c prog.c
    +
    +make test
    +./prog -d ABXYEFCD.tmp ACDBECFD.tmp
    +./prog ABXYEFCD.tmp ACDBECFD.tmp
    +
    +rm -f curds.tmp whey.tmp
    +cp /usr/share/man/man1/cc.1 curds.tmp
    +cp /usr/share/man/man1/cc.1 whey.tmp
    +chmod 666 whey.tmp
    +make makeholes
    +./makeholes -n 1000 whey.tmp
    +./prog curds.tmp whey.tmp
    +./avgtime.sh 100 ./prog curds.tmp whey.tmp
    +
    +# Assuming curl(1) installed, grab a really HUGE text file.
    +curl -L -o war-and-peace.txt http://www.gutenberg.org/ebooks/2600.txt.utf-8
    +cp war-and-peace.txt nuked.tmp
    +./makeholes -c'~' -n 1000 nuked.tmp
    +./prog war-and-peace.txt nuked.tmp
    +./avgtime.sh 100 ./prog war-and-peace.txt nuked.tmp
    +
    + +

    Selected Judges Remarks:

    + +

    This is the best use of the FNV that we have seen in the IOCCC so far! +The output, when used without -d, is compatible with POSIX diff and +is suitable for use with patch.

    + +

    We welcome back Canada to the list of nations from where winning +entries have been submitted.

    + +

    Is this code a bug or a feature? :-) Or is this an attempt to corrupt the +programming of our youth? Should we heed Kyle’s mom words that she uttered +during a South Park P.T.A. Meeting?

    + +

    “We must stop dirty © language from getting to our children’s ears!”

    + +

    Blame Canada:

    + +

    Or should we teach our youth to understand the intricacies of this code? +Ying Tong Iddle I Po! We suggest you read the source for yourself, which +might be easier than the academic papers it was inspired by.

    + +

    NOTE: Unlike the original entry source, prog.orig.c, prog.c uses a +64 bit FNV hash and fixes a function call warning.

    + +

    Author’s comments:

    + +

    Features

    + +
      +
    • “An O(NP) Sequence Comparison Algorithm” by Wu, Manber, Myers, Miller.

    • +
    • Output compatible with patch(1).

    • +
    • Strokes one of the judge’s ego (I couldn’t email chocolate or curry).

    • +
    + + +

    Description

    + +

    This is a functioning micro diff tool using an O(NP) algorithm, compared to the older O(ND) difference algorithm used by some versions of diff. Its output is based on the default diff(1) output described by POSIX and The Open Group Base Specifications. The output is suitable for use with patch(1).

    + +

    The -d option simply writes the edit distance between file1 and file2.

    + +

    Observations

    + +

    The FNV1a hash is a little slow compared to the trival hash GNU Diff uses. I downloaded a plain text copy of “War And Peace” from Project Gutenberg, used makeholes.c to make 1000 random changes, then profiled and timed the program verses GNU Diff. The bottle neck appears to be in the file I/O and line hashing with an average +0.05s slower. Using a huge file like “War And Peace” for testing offsets the diff(1) optimised file I/O.

    + +

    There is no hash collision checking, partly because FNV1a appears to generate very few collisions and an assumption that localised collisions within a region of edits are highly unlikely.

    + +

    Support Files

    + +
      +
    • prog-test.sh
      +Basic test program verifies known test edit distances and patch support.

    • +
    • avgtime.sh

    • +
    • makeholes.c
      +Random edits (holes) made to a file in-place.

    • +
    + + +

    References

    + +

    Wu, Manber, Myers, and Miller; August 1989;
    +“An O(NP) Sequence Comparison Algorithm”;
    +http://myerslab.mpi-cbg.de/wp-content/uploads/2014/06/np_diff.pdf

    + +

    Fowler, Noll, Vo; 1994
    +http://www.isthe.com/chongo/tech/comp/fnv/index.html

    + +

    Fowler, Noll, Vo on Wikipedia
    +https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function

    + +

    “diff”, The Open Group Base Specifications Issue 7
    +IEEE Std 1003.1, 2013 Edition
    +http://pubs.opengroup.org/onlinepubs/9699919799/utilities/diff.html

    + +

    Eugene W. Myers; “An O(ND) Difference Algorithm and Its Variations”;
    +Algorithmica, 1986, pages. 251-266
    +http://www.xmailserver.org/diff2.pdf

    + +

    Webb Miller and Eugene W. Myers; “A File Comparison Program”;
    +Software-Practice And Experience, Vol. 15(11). 1025-1040 (November 1985)
    +http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.189.70&rep=rep1&type=pdf

    + +

    D.S. Hirschberg, “A linear space algorithm for computing maximal common subsequence problem”;
    +Comm. of ACM, Vol. 18, June 1975, pages 341-343
    +http://www.mathcs.emory.edu/~cheung/Courses/323/Syllabus/DynProg/Docs/Hirschberg-LCS-1975.pdf

    + +

    Which hashing algorithm is best for uniqueness and speed?
    +http://programmers.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2016, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2015/howe/hint.text b/2015/howe/hint.text new file mode 100644 index 000000000..1bcf28e01 --- /dev/null +++ b/2015/howe/hint.text @@ -0,0 +1,160 @@ +# Most Different + +Anthony Howe +Montreal, Quebec, Canada + +Twitter: @SirWumpus + + +## Judges' comments: +### To use: + + make + + ./prog file1 file2 + + ./prog -d file1 file2 + +### Try: + + ./prog prog.orig.c prog.c + + make test + ./prog -d ABXYEFCD.tmp ACDBECFD.tmp + ./prog ABXYEFCD.tmp ACDBECFD.tmp + + rm -f curds.tmp whey.tmp + cp /usr/share/man/man1/cc.1 curds.tmp + cp /usr/share/man/man1/cc.1 whey.tmp + chmod 666 whey.tmp + make makeholes + ./makeholes -n 1000 whey.tmp + ./prog curds.tmp whey.tmp + ./avgtime.sh 100 ./prog curds.tmp whey.tmp + + # Assuming curl(1) installed, grab a really HUGE text file. + curl -L -o war-and-peace.txt http://www.gutenberg.org/ebooks/2600.txt.utf-8 + cp war-and-peace.txt nuked.tmp + ./makeholes -c'~' -n 1000 nuked.tmp + ./prog war-and-peace.txt nuked.tmp + ./avgtime.sh 100 ./prog war-and-peace.txt nuked.tmp + +### Selected Judges Remarks: + +This is the best use of the FNV that we have seen in the IOCCC so far! +The output, when used without -d, is compatible with POSIX diff and +is suitable for use with patch. + +We welcome back Canada to the list of nations from where winning +entries have been submitted. + +Is this code a bug or a feature? :-) Or is this an attempt to corrupt the +programming of our youth? Should we heed Kyle's mom words that she uttered +during a South Park P.T.A. Meeting? + + "We must stop dirty (C) language from getting to our children's ears!" + + [Blame Canada](https://www.youtube.com/watch?v=bOR38552MJA): + +Or should we teach our youth to understand the intricacies of this code? +Ying Tong Iddle I Po! We suggest you read the source for yourself, which +might be easier than the academic papers it was inspired by. + +NOTE: Unlike the original entry source, prog.orig.c, prog.c uses a +64 bit FNV hash and fixes a function call warning. + +## Author's comments: +Features +-------- + +* "An O(NP) Sequence Comparison Algorithm" by Wu, Manber, Myers, Miller. + +* Output compatible with patch(1). + +* Strokes one of the judge's ego (I couldn't email chocolate or curry). + + +Description +----------- + +This is a functioning micro diff tool using an [O(NP) algorithm][Wu+89], compared to the older [O(ND) difference algorithm][Mye86] used by some versions of diff. Its output is based on the default diff(1) output described by POSIX and [The Open Group Base Specifications][SUSV7]. The output is suitable for use with patch(1). + +The -d option simply writes the edit distance between file1 and file2. + + +Observations +------------ + +The FNV1a hash is a little slow compared to the trival hash GNU Diff uses. I downloaded a plain text copy of "War And Peace" from Project Gutenberg, used ``makeholes.c`` to make 1000 random changes, then profiled and timed the program verses GNU Diff. The bottle neck appears to be in the file I/O and line hashing with an average +0.05s slower. Using a huge file like "War And Peace" for testing offsets the diff(1) optimised file I/O. + +There is no hash collision checking, partly because FNV1a appears to generate very [few collisions][HshCmp] and an assumption that localised collisions within a region of edits are highly unlikely. + + +Support Files +------------- + +* ``prog-test.sh`` +Basic test program verifies known test edit distances and patch support. + +* ``avgtime.sh`` + +* ``makeholes.c`` +Random edits (holes) made to a file in-place. + + +References +---------- + +Wu, Manber, Myers, and Miller; August 1989; +"An O(NP) Sequence Comparison Algorithm"; + + +Fowler, Noll, Vo; 1994 + + +Fowler, Noll, Vo on Wikipedia + + +"diff", The Open Group Base Specifications Issue 7 +IEEE Std 1003.1, 2013 Edition + + +Eugene W. Myers; "An O(ND) Difference Algorithm and Its Variations"; +Algorithmica, 1986, pages. 251-266 + + +Webb Miller and Eugene W. Myers; "A File Comparison Program"; +Software-Practice And Experience, Vol. 15(11). 1025-1040 (November 1985) + + +D.S. Hirschberg, "A linear space algorithm for computing maximal common subsequence problem"; +Comm. of ACM, Vol. 18, June 1975, pages 341-343 + + +Which hashing algorithm is best for uniqueness and speed? + + +[Wu+89]: http://myerslab.mpi-cbg.de/wp-content/uploads/2014/06/np_diff.pdf + +[FNV94]: http://www.isthe.com/chongo/tech/comp/fnv/index.html + +[FNVWi]: https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + +[Mye86]: http://www.xmailserver.org/diff2.pdf + +[SUSV7]: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/diff.html + +[Mil85]: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.189.70&rep=rep1&type=pdf + +[Hir75]: http://www.mathcs.emory.edu/~cheung/Courses/323/Syllabus/DynProg/Docs/Hirschberg-LCS-1975.pdf + +[HshCmp]: http://programmers.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed + +-------------------------------------------------------------------------------- + diff --git a/2015/howe/makeholes.c b/2015/howe/makeholes.c new file mode 100644 index 000000000..15542a323 --- /dev/null +++ b/2015/howe/makeholes.c @@ -0,0 +1,101 @@ +/* + * makeholes.c + */ + +#include +#include +#include +#include +#include +#include + +static unsigned char hole = '@'; +static unsigned long count = 100; + +static const char usage[] = +"usage: makeholes [-b value][-c char][-n count] file ...\n"; + +int +offcmp(const void *a, const void *b) +{ + return *(off_t *)a - *(off_t *)b; +} + +void +process(const char *file) +{ + ssize_t x; + int fd, rd; + size_t size; + struct stat sb; + unsigned long n; + off_t mask, *seeks; + + if (stat(file, &sb) != 0) + return; + if ((fd = open(file, O_WRONLY)) < 0) + return; + if ((rd = open("/dev/urandom", O_RDONLY)) < 0) + goto error1; + size = count * sizeof (*seeks); + if ((seeks = malloc(size)) == NULL) + goto error2; + + for (x = 0; x < size; ) + x += read(rd, seeks+x, size-x); + + mask = (off_t)(~0UL >> 1); + for (n = 0; n < count; n++) { + seeks[n] &= mask; + seeks[n] %= sb.st_size; + } + + qsort(seeks, count, sizeof (*seeks), offcmp); + + for (n = 0; n < count; n++) { + if (lseek(fd, seeks[n], SEEK_SET) < 0) + break; + if (write(fd, &hole, sizeof (hole)) != sizeof (hole)) + break; + } + + free(seeks); +error2: + (void) close(rd); +error1: + (void) close(fd); +} + +int +main(int argc, char **argv) +{ + int ch, argi; + + while ((ch = getopt(argc, argv, "b:c:n:")) != -1) { + switch (ch) { + case 'b': + hole = (unsigned char) strtoul(optarg, NULL, 0); + break; + case 'c': + hole = (unsigned char) *optarg; + break; + case 'n': + count = strtoul(optarg, NULL, 10); + break; + default: + optind = argc; + break; + } + } + + if (argc <= optind) { + (void) fprintf(stderr, usage); + return EXIT_FAILURE; + } + + for (argi = optind; argi < argc; argi++) + process(argv[argi]); + + return EXIT_SUCCESS; +} + diff --git a/2015/howe/prog-test.sh b/2015/howe/prog-test.sh new file mode 100644 index 000000000..b366593c6 --- /dev/null +++ b/2015/howe/prog-test.sh @@ -0,0 +1,132 @@ +#!/bin/ksh +# Assume a POSIX compliant shell. + +PROG="./prog" + +args=$(getopt 'f:w' $*) +if [ $? -ne 0 ]; then + echo "usage: prog-test.sh [-w][-f flags]" + exit 2 +fi +set -- $args +while [ $# -gt 0 ]; do + case "$1" in + -w) + PROG="./prog-w64" + ;; + -f) + flags=$2; shift + ;; + --) + shift; break + ;; + esac + shift +done + +function distance +{ + typeset A="$1"; shift + typeset B="$1"; shift + typeset expect="$1"; shift + + printf "$A" | sed -e 's/./&\ +/g' >$A.tmp + printf "$B" | sed -e 's/./&\ +/g' >$B.tmp + + echo "<<< A='$A' B='$B' $@" + typeset dist=$($PROG -d $@ $A.tmp $B.tmp | tr -d '\r') + + printf '>>> got=%d expect=%d ' "$dist" "$expect" + + if [ "$dist" -ne "$expect" ]; then + echo FAIL + return 1 + fi + + echo -OK- + return 0 +} + +function dif +{ + typeset A="$1"; shift + typeset B="$1"; shift + typeset expect="$1"; shift + + echo "==== $A $B" + $PROG $A $B | tee patch.tmp + typeset ex=$? + + if [ "$expect" -eq 0 ]; then + printf "got=%d expect=%d " $ex $expect + if [ $expect -ne $ex ]; then + echo FAIL + return 1 + fi + echo -OK- + return 0 + fi + + printf "forward patch " + cp $A copy.tmp + if ! patch -f -s copy.tmp patch.tmp ; then + echo FAIL + return 1 + fi + echo -OK- + + printf "forward compare " + if ! cmp $B copy.tmp ; then + echo FAIL + return 1 + fi + echo -OK- + + printf "reverse patch " + if ! patch -R -f -s copy.tmp patch.tmp ; then + echo FAIL + return 1 + fi + echo -OK- + + printf "reverse compare " + if ! cmp $A copy.tmp ; then + echo FAIL + return 1 + fi + echo -OK- + + return 0 +} + +distance "1" "1" 0 $flags +distance "1" "A" 2 $flags +distance "123" "ABCDE" 8 $flags +distance "ABCDE" "123" 8 $flags +distance "ABD" "ABCD" 1 $flags +distance "ABCD" "ABD" 1 $flags +distance "ABCD" "ACDBECFD" 4 $flags +distance "ABCDEF" "ABXYEFCD" 6 $flags +distance "ABCDEFGHIJK" "ABCEFGIJKDEFGHIJK" 6 $flags +distance "ABCABBA" "CBABAC" 5 $flags +distance "ACEBDABBABED" "ACBDEACBED" 6 $flags + +touch EMPTY.tmp +dif 1.tmp 1.tmp 0 +dif EMPTY.tmp 123.tmp 1 +dif 123.tmp EMPTY.tmp 1 +dif ABCD.tmp ACDBECFD.tmp 1 +dif ACDBECFD.tmp ABCD.tmp 1 +dif 123.tmp ABCDE.tmp 1 +dif ABCDE.tmp 123.tmp 1 + +# Note that prog and diff(1) have same edit distance, +# but differ in the output. +dif CBABAC.tmp ABCABBA.tmp 1 +dif ABCABBA.tmp CBABAC.tmp 1 + +rm copy.tmp* 2>/dev/null + +echo DONE diff --git a/2015/howe/prog.c b/2015/howe/prog.c new file mode 100644 index 000000000..8ae01d4c9 --- /dev/null +++ b/2015/howe/prog.c @@ -0,0 +1,242 @@ +#include +#include +#include +#include +#include +typedef struct e { + int op; int x; int y; long a; long b; struct e *n; +} E; +typedef struct { + int y; + E *e; +} X; +typedef struct { + long q; + unsigned long long y; +} h; +typedef struct { + unsigned long z; + unsigned long j; + h b[1]; +} H; +int I; +int P; +H *A, *B; +FILE *f, *g; +X *Q, *q; +H * +N(H *O) +{ + unsigned long z; + H *Y; + z = O ? O->z << 1 : 65536; + if (!(Y = realloc(O, sizeof (*O) + z * sizeof (O->b)))) + err(2, 0); + Y->z = z; + if (!O) + Y->j = 0; + return Y; +} +H * +F(FILE *Q) +{ + unsigned long long h; + H *y; + long L, o, n; + unsigned char buf[65536], *b; + y = N(0); + L = 1; + o = 0; + h = 14695981039346656037ULL; + y->b[L].q = o; + while (0 < (n = fread(buf, 1, sizeof (buf), Q))) { + b = buf; + while (0 < n--) { + h ^= *b; + h += (h<<1) + (h<<4) + (h<<5) + (h<<7) + (h<<8) + (h<<40); + o++; + if (*b++ == '\n') { + y->b[L++].y = h; + if (y->z <= L) + y = N(y); + y->b[L].q = o; + h = 14695981039346656037ULL; + } + } + } + y->j = L-1; + rewind(Q); + return y; +} +FILE * +O(char *u) +{ + int i; + FILE *Q; + if (!(Q = fopen(u, "r")) && !strcmp("-", u)) { + if ((Q = tmpfile())) { + while ((i = getchar()) != EOF) + fputc(i, Q); + rewind(Q); + } + } + if (!Q) err(2, "%s", u); + return Q; +} +void +W(FILE *Q) +{ + int i; + while ((i = fgetc(Q)) != EOF) { + putchar(i); + if (i == '\n') + break; + } +} +E * +R(E *K) +{ + E *a, *b; + b = 0; + while (K) { + a = K->n; + K->n = b; + b = K; + K = a; + } + return b; +} +void +D(E *K) +{ + E *a, *b; + for (K = R(K); K; ) { + b = K; + if (K->op) { + do { + a = b; + b = b->n; + } while (b && b->op && a->y+1 == b->y); + if (K->y < a->y) + printf("%da%d,%d\n", K->x, K->y, a->y); + else + printf("%da%d\n", K->x, K->y); + fseek(g, K->b, SEEK_SET); + for ( ; K != b; K = K->n) { + printf("> "); + W(g); + } + } else { + do { + a = b; + b = b->n; + } while (b && !b->op && a->x+1 == b->x); + if (K->x < a->x) + printf("%d,%dd%d\n", K->x, a->x, K->y); + else + printf("%dd%d\n", K->x, K->y); + fseek(f, K->a, SEEK_SET); + for ( ; K != b; K = K->n) { + printf("< "); + W(f); + } + } + } +} +void +K(int k) +{ + X h = Q[k-1]; + X v = Q[k+1]; + int x, y, op; + E *p; + if (v.y < h.y+1) { + op = 1; + y = h.y+1; + p = h.e; + } else { + op = 0; + y = v.y; + p = v.e; + } + x = y - k; + if (0 < y || 0 < x) { + E *e = malloc(sizeof (*e)); + e->x = x; + e->y = y; + e->n = p; + e->op = op ^ I; + e->a = A->b[x].q; + e->b = B->b[y].q; + if (I) { + long c = e->a; + e->a = e->b; + e->b = c; + e->x = y; + e->y = x; + } + Q[k].e = e; + } + while (x < A->j && y < B->j && A->b[x+1].y == B->b[y+1].y) { + x++; + y++; + } + Q[k].y = y; +} +int +T(void) +{ + int k, p, d; + if (A->j > B->j) { + void *t = A; + A = B; + B = t; + I = 1; + } + d = B->j - A->j; + if (!(q = calloc(A->j + B->j + 3, sizeof (*Q)))) + err(2, 0); + for (k = 0; k < A->j + B->j + 3; k++) + q[k].y = -1; + Q = q + A->j + 1; + p = -1; + do { + p++; + for (k = -p; k < d; k++) { + K(k); + } + for (k = d + p; d <= k; k--) { + K(k); + } + } while (Q[d].y != B->j); + if (!P) + D(Q[d].e); + free(q); + return d + 2 * p; +} +int +main(int x, char **y) +{ + int i; + while ((i = getopt(x, y, "d")) != -1) { + switch (i) { + case 'd': + P = 1; + break; + default: + optind = x; + break; + } + } + if (x <= optind) + errx(2, "usage: %s [-d] file1 file2", *y); + f = O(y[optind]); + g = O(y[optind+1]); + if (!(A = F(f))) + err(2, "%s", y[optind]); + if (!(B = F(g))) + err(2, "%s", y[optind+1]); + i = T(); + if (P) printf("%d\n", i); + return 0 < i; +} diff --git a/2015/howe/prog.orig.c b/2015/howe/prog.orig.c new file mode 100644 index 000000000..bae22d071 --- /dev/null +++ b/2015/howe/prog.orig.c @@ -0,0 +1,242 @@ +#include +#include +#include +#include +#include +typedef struct e { + int op; int x; int y; long a; long b; struct e *n; +} E; +typedef struct { + int y; + E *e; +} X; +typedef struct { + long q; + unsigned long y; +} h; +typedef struct { + unsigned long z; + unsigned long j; + h b[1]; +} H; +int I; +int P; +H *A, *B; +FILE *f, *g; +X *Q, *q; +H * +N(H *O) +{ + unsigned long z; + H *Y; + z = O ? O->z << 1 : 65536; + if (!(Y = realloc(O, sizeof (*O) + z * sizeof (O->b)))) + err(2, 0); + Y->z = z; + if (!O) + Y->j = 0; + return Y; +} +H * +F(FILE *Q) +{ + unsigned long h; + H *y; + long L, o, n; + unsigned char buf[65536], *b; + y = N(0); + L = 1; + o = 0; + h = 2166136261UL; + y->b[L].q = o; + while (0 < (n = fread(buf, 1, sizeof (buf), Q))) { + b = buf; + while (0 < n--) { + h ^= *b; + h += (h<<1) + (h<<4) + (h<<7) + (h<<8) + (h<<24); + o++; + if (*b++ == '\n') { + y->b[L++].y = h; + if (y->z <= L) + y = N(y); + y->b[L].q = o; + h = 2166136261UL; + } + } + } + y->j = L-1; + rewind(Q); + return y; +} +FILE * +O(char *u) +{ + int i; + FILE *Q; + if (!(Q = fopen(u, "r")) && !strcmp("-", u)) { + if ((Q = tmpfile())) { + while ((i = getchar()) != EOF) + fputc(i, Q); + rewind(Q); + } + } + if (!Q) err(2, "%s", u); + return Q; +} +void +W(FILE *Q) +{ + int i; + while ((i = fgetc(Q)) != EOF) { + putchar(i); + if (i == '\n') + break; + } +} +E * +R(E *K) +{ + E *a, *b; + b = 0; + while (K) { + a = K->n; + K->n = b; + b = K; + K = a; + } + return b; +} +void +D(E *K) +{ + E *a, *b; + for (K = R(K); K; ) { + b = K; + if (K->op) { + do { + a = b; + b = b->n; + } while (b && b->op && a->y+1 == b->y); + if (K->y < a->y) + printf("%da%d,%d\n", K->x, K->y, a->y); + else + printf("%da%d\n", K->x, K->y); + fseek(g, K->b, SEEK_SET); + for ( ; K != b; K = K->n) { + printf("> "); + W(g); + } + } else { + do { + a = b; + b = b->n; + } while (b && !b->op && a->x+1 == b->x); + if (K->x < a->x) + printf("%d,%dd%d\n", K->x, a->x, K->y); + else + printf("%dd%d\n", K->x, K->y); + fseek(f, K->a, SEEK_SET); + for ( ; K != b; K = K->n) { + printf("< "); + W(f); + } + } + } +} +void +K(int k) +{ + X h = Q[k-1]; + X v = Q[k+1]; + int x, y, op; + E *p; + if (v.y < h.y+1) { + op = 1; + y = h.y+1; + p = h.e; + } else { + op = 0; + y = v.y; + p = v.e; + } + x = y - k; + if (0 < y || 0 < x) { + E *e = malloc(sizeof (*e)); + e->x = x; + e->y = y; + e->n = p; + e->op = op ^ I; + e->a = A->b[x].q; + e->b = B->b[y].q; + if (I) { + long c = e->a; + e->a = e->b; + e->b = c; + e->x = y; + e->y = x; + } + Q[k].e = e; + } + while (x < A->j && y < B->j && A->b[x+1].y == B->b[y+1].y) { + x++; + y++; + } + Q[k].y = y; +} +int +T() +{ + int k, p, d; + if (A->j > B->j) { + void *t = A; + A = B; + B = t; + I = 1; + } + d = B->j - A->j; + if (!(q = calloc(A->j + B->j + 3, sizeof (*Q)))) + err(2, 0); + for (k = 0; k < A->j + B->j + 3; k++) + q[k].y = -1; + Q = q + A->j + 1; + p = -1; + do { + p++; + for (k = -p; k < d; k++) { + K(k); + } + for (k = d + p; d <= k; k--) { + K(k); + } + } while (Q[d].y != B->j); + if (!P) + D(Q[d].e); + free(q); + return d + 2 * p; +} +int +main(int x, char **y) +{ + int i; + while ((i = getopt(x, y, "d")) != -1) { + switch (i) { + case 'd': + P = 1; + break; + default: + optind = x; + break; + } + } + if (x <= optind) + errx(2, "usage: %s [-d] file1 file2", *y); + f = O(y[optind]); + g = O(y[optind+1]); + if (!(A = F(f))) + err(2, "%s", y[optind]); + if (!(B = F(g))) + err(2, "%s", y[optind+1]); + i = T(f, g, A, B); + if (P) printf("%d\n", i); + return 0 < i; +} diff --git a/2015/howe/spoiler/Makefile b/2015/howe/spoiler/Makefile new file mode 100644 index 000000000..bc95387b4 --- /dev/null +++ b/2015/howe/spoiler/Makefile @@ -0,0 +1,69 @@ +.POSIX : + +.SUFFIXES : +A = .a +O = .o +.SUFFIXES : .c .h .i $O $A + +######################################################################## +### No further configuration beyond this point. +######################################################################## + +top_srcdir := .. +CC := gcc +CFLAGS := -g -O2 -std=c99 -Wall -pedantic -Wno-char-subscripts +LDFLAGS := + +# Assume a POSIX compliant shell. +# +# On Linux +# /bin/sh = /bin/bash +# +# On NetBSD +# /bin/ksh +# /usr/pkg/bin/bash +# +# On OpenBSD +# /bin/ksh = /bin/pdksh +# +SHELL := /bin/ksh + +W64CC := i686-w64-mingw32-gcc +W64CFLAGS := -I. -Os -s -std=c99 -Wno-char-subscripts + +ZIP := README.txt prog-w64.exe prog-test.sh avgtime.sh makeholes-w64.exe + +.c$O : + ${CC} ${CFLAGS} -c $< + +.c$E : + $(CC) $(CFLAGS) $(LDFLAGS) -o$* $< + +$O : + $(LD) $(LDFLAGS) -o$* $*$O + +.c.i: + ${CC} -E ${CFLAGS} $*.c >$*.i + +######################################################################## + +all: build + +build: prog + +clean: + -rm prog *.exe *.i *$O *.tmp *.rej *.orig *.core *.out 2>/dev/null + +distclean: clean + +prog: prog.c + ${CC} ${CFLAGS} ${LDFLAGS} -o$@ prog.c + +prog-w64: err.h prog.c + ${W64CC} ${W64CFLAGS} ${LDFLAGS} -o$@ prog.c + +test: + ${SHELL} ${top_srcdir}/prog-test.sh + +test-w64: + ${SHELL} ${top_srcdir}/prog-test.sh -w diff --git a/2015/howe/spoiler/err.h b/2015/howe/spoiler/err.h new file mode 100644 index 000000000..839c76ac4 --- /dev/null +++ b/2015/howe/spoiler/err.h @@ -0,0 +1,46 @@ +/* + * Trival err.h + */ + +#ifndef __err_h__ +#define __err_h__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +#define warnx(...) { fprintf(stderr, __VA_ARGS__); fputc('\n', stderr); } +#define warn(...) { \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, ": %s\n", strerror(errno)); \ +} + +#define vwarnx(fmt, args) { vfprintf(stderr, fmt, args); fputc('\n', stderr); } +#define vwarn(fmt, args) { \ + vfprintf(stderr, fmt, args); \ + fprintf(stderr, "%s%s\n", (fmt) ? ": " : "", strerror(errno)); \ +} + +#define errx(ex, ...) { fprintf(stderr, __VA_ARGS__); fputc('\n', stderr); exit(ex); } +#define err(ex, ...) { \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, ": %s\n", strerror(errno)); \ + exit(ex); \ +} + +#define verrx(ex, fmt, args) { vfprintf(stderr, fmt, args); fputc('\n', stderr); exit(ex); } +#define verr(ex, fmt, args) { \ + vfprintf(stderr, fmt, args); \ + fprintf(stderr, "%s%s\n", (fmt) ? ": " : "", strerror(errno)); \ + exit(ex); \ +} + +#ifdef __cplusplus +} +#endif + +#endif /* __err_h__ */ \ No newline at end of file diff --git a/2015/howe/spoiler/prog.c b/2015/howe/spoiler/prog.c new file mode 100644 index 000000000..1df3b56c1 --- /dev/null +++ b/2015/howe/spoiler/prog.c @@ -0,0 +1,448 @@ +/* + * npdif.c + * + * Wu, Manber, Myers, Miller; August 1989; + * "An O(NP) Sequence Comparison Algorithm" + * + * Public Domain 2015 by Anthony Howe. No warranty. + * + * Synopsis: npdif + * + * Exit Status + * 0 no difference + * 1 difference + * 2 error + */ + +#define FAST +#define FNV64 + +#include +#include +#include +#include +#include + +#ifndef INIT_SIZE +#define INIT_SIZE 8196 /* Power of two. */ +#endif + +/** + * FNV1a + * + * https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + * http://programmers.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed + * http://www.isthe.com/chongo/tech/comp/fnv/index.html + * + * Hash Size Prime Offset + * 32-bit 16777619 0x01000193 2166136261 0x811C9DC5 + * 64-bit 1099511628211 0x100000001b3 14695981039346656037 0xCBF29CE34244AD25 + */ +#ifdef FNV64 + +#define FNV_INIT 14695981039346656037ULL +#define FNV_PRIME 1099511628211ULL + +typedef unsigned long long Hash; + +#else /* FNV64 */ + +#define FNV_INIT 2166136261UL +#define FNV_PRIME 16777619UL + +typedef unsigned long Hash; + +#endif /* FNV64 */ + +typedef struct edit { + int op; /* 1 = insert, 0 = delete */ + int x; /* Index into A. */ + int y; /* Index into B. */ + long a; /* seek into A */ + long b; /* seek into B */ + struct edit *next; +} Edit; + +typedef struct { + int y; + Edit *edit; +} Vertex; + +typedef struct { + long seek; + Hash hash; +} HashLine; + +typedef struct { + size_t size; + size_t length; + HashLine base[1]; +} HashArray; + +static int debug; +static int invert; +static int print_distance; +static HashArray *A, *B; +static FILE *fpA, *fpB; +static Vertex *fp, *fp_base; + +#define EXIT_ERROR 2 + +#define INFO(...) { if (0 < debug) warnx(__VA_ARGS__); } +#define DEBUG(...) { if (1 < debug) warnx(__VA_ARGS__); } +#define DUMP(...) { if (2 < debug) warnx(__VA_ARGS__); } + +/* + * Expand hash table. + */ +HashArray * +hash_expand(HashArray *orig) +{ + size_t size; + HashArray *copy; + + /* Size does not account for the initial base element. + * So you have 0 < size with a sentinel or 1 <= size. + */ + size = orig != NULL ? orig->size << 1 : INIT_SIZE; + + if (NULL == (copy = realloc(orig, sizeof (*orig) + size * sizeof (orig->base)))) + err(EXIT_ERROR, NULL); + + copy->size = size; + if (orig == NULL) + copy->length = 0; + + return copy; +} + +/* + * @param fp + * File to scan and hash by line. + * + * @return + * Pointer to an 1-based array of hashed lines. + */ +HashArray * +hash_file(FILE *fp) +{ + Hash h; + HashArray *hash; + long lineno, offset, n; + unsigned char buf[INIT_SIZE], *b; + + hash = hash_expand(NULL); + + /* Assume 1-base array. */ + lineno = 1; + offset = 0; + h = FNV_INIT; + hash->base[lineno].seek = offset; + while (0 < (n = fread(buf, 1, sizeof (buf), fp))) { + b = buf; + while (0 < n--) { + h ^= *b; +#ifdef FAST + +#ifdef FNV64 + /* 0x100000001b3 */ + h += (h<<1) + (h<<4) + (h<<5) + (h<<7) + (h<<8) + (h<<40); +#else /* FNV64 */ + /* 0x01000193 */ + h += (h<<1) + (h<<4) + (h<<7) + (h<<8) + (h<<24); +#endif /* FNV64 */ +#else /* FAST */ + h *= FNV_PRIME; +#endif /* FAST */ + offset++; + if (*b++ == '\n') { + hash->base[lineno++].hash = h; + if (hash->size <= lineno) + hash = hash_expand(hash); + hash->base[lineno].seek = offset; + h = FNV_INIT; + } + } + } + + /* Correct the length, base[1..length] inclusive. */ + hash->length = lineno-1; + rewind(fp); + + return hash; +} + +/* + * Open file. + * + * If filename is the standard input filename -, copy + * standard input to a temporary file. Return pointer + * to the temporary file open for reading. + * + * If filename is some other filename then return a + * pointer to a file stream ready for reading. + * + * Any errors, write error message and return NULL. + */ +FILE * +file(char *u) +{ + int i; + FILE *fp; + + if (NULL == (fp = fopen(u, "r")) && 0 == strcmp("-", u)) { + if ((fp = tmpfile()) != NULL) { + while ((i = getchar()) != EOF) + (void) fputc(i, fp); + rewind(fp); + } + } + + if (NULL == fp) err(EXIT_ERROR, "%s", u); + + return fp; +} + +void +echoline(FILE *fp) +{ + int ch; + while ((ch = fgetc(fp)) != EOF) { + (void) putchar(ch); + if (ch == '\n') + break; + } +} + +Edit * +reverse_script(Edit *curr) +{ + Edit *a, *b; + + b = NULL; + while (curr != NULL) { + a = curr->next; + curr->next = b; + b = curr; + curr = a; + } + + return b; +} + +void +dump_script(Edit *curr) +{ + Edit *a, *b; + + for (curr = reverse_script(curr); curr != NULL; ) { + b = curr; + if (curr->op) { + do { + a = b; +DEBUG("curr.x=%d curr.y=%d a.x=%d a.y=%d b.x=%d b.y=%d", curr->x, curr->y, a->x, a->y, b->x, b->y); + b = b->next; + } while (b != NULL && b->op && a->y+1 == b->y); + + if (curr->y < a->y) + (void) printf("%da%d,%d\n", curr->x, curr->y, a->y); + else + (void) printf("%da%d\n", curr->x, curr->y); + (void) fseek(fpB, curr->b, SEEK_SET); + + for ( ; curr != b; curr = curr->next) { + (void) printf("> "); + echoline(fpB); + } + } else { + do { + a = b; +DEBUG("curr.x=%d curr.y=%d a.x=%d a.y=%d b.x=%d b.y=%d", curr->x, curr->y, a->x, a->y, b->x, b->y); + b = b->next; + } while (b != NULL && !b->op && a->x+1 == b->x); + + if (curr->x < a->x) + (void) printf("%d,%dd%d\n", curr->x, a->x, curr->y); + else + (void) printf("%dd%d\n", curr->x, curr->y); + (void) fseek(fpA, curr->a, SEEK_SET); + + for ( ; curr != b; curr = curr->next) { + (void) printf("< "); + echoline(fpA); + } + } + } +} + +void +snake(int k) +{ + /* fp[] holds the furthest y along diagonal k. */ + Vertex h = fp[k-1]; + Vertex v = fp[k+1]; + + /* max(fp[k-1] + 1, fp[k+1]) */ + int x, y, op; + Edit *prev; + if (v.y < h.y+1) { + op = 1; + y = h.y+1; + prev = h.edit; + } else { + op = 0; + y = v.y; + prev = v.edit; + } + + /* Diagonal k = y - x of matrix [-(M+1), (N-1)], where + * row 0 and column 0 are initialised with sentenial -1. + * + * k-diagonal = A and B match + * y-horizontal = insert from B + * x-vertical = delete from A + */ + x = y - k; + DUMP("snake in k=%d y=%d x=%d", k, y, x); + + if (0 < y || 0 < x) { + Edit *edit = malloc(sizeof (*edit)); + edit->x = x; + edit->y = y; + edit->next = prev; + edit->op = op ^ invert; + edit->a = A->base[x].seek; + edit->b = B->base[y].seek; + + if (invert) { + /* Swap seek offset to match the open files. */ + long c = edit->a; + edit->a = edit->b; + edit->b = c; + + /* Likewise swap line numbers to match seeks. */ + edit->x = y; + edit->y = x; + } + + fp[k].edit = edit; + DUMP("edit op=%d x=%d y=%d", edit->op, edit->x, edit->y); + } + + /* The algorithm assumes 1-based indexing, A[1..M] and B[1..N]. + * NOTE no hash collision checking yet. + */ + while (x < A->length && y < B->length && A->base[x+1].hash == B->base[y+1].hash) { + x++; + y++; + } + + fp[k].y = y; + + DUMP("snake out k=%d y=%d x=%d", k, y, x); +} + +int +edit_distance(void) +{ + int k, p, delta; + + /* Swap A and B if N < M. The edit distance will be the + * same, but edit script operations will be reversed. + */ + if (A->length > B->length) { + void *tmp = A; + A = B; + B = tmp; + invert = 1; + DEBUG("swap A & B"); + } + + /* delta = N - M where A[1..M], B[1..N], and N >= M. */ + delta = B->length - A->length; + + /* From -(M+1).. 0 .. (N+1); up & lower sentinels and zero. */ + if (NULL == (fp_base = calloc(A->length + B->length + 3, sizeof (*fp)))) + err(EXIT_ERROR, NULL); + + /* fp[-(M+1)..(N+1)] := -1 */ + for (k = 0; k < A->length + B->length + 3; k++) + fp_base[k].y = -1; + + /* Shift origin to (M+1). */ + fp = fp_base + A->length + 1; + + DEBUG("delta=%d M=%lu N=%lu fp.len=%lu", delta, A->length, B->length, (A->length + B->length + 3)); + + p = -1; + do { + p++; + for (k = -p; k < delta; k++) { + snake(k); + DEBUG("1st fp[%d]=%d p=%d ", k, fp[k].y, p); + } + for (k = delta + p; delta <= k; k--) { + snake(k); + DEBUG("2nd fp[%d]=%d p=%d ", k, fp[k].y, p); + } + } while (fp[delta].y != B->length); + + if (!print_distance) + dump_script(fp[delta].edit); + free(fp_base); + + DEBUG("dist=%d delta=%d p=%d M=%lu N=%lu ", (delta < 0 ? -delta : delta) + 2 * p, delta, p, A->length, B->length); + + return delta + 2 * p; +} + +int +main(int argc, char **argv) +{ + int ch; + + while ((ch = getopt(argc, argv, "dv")) != -1) { + switch (ch) { + case 'd': + print_distance = 1; + break; +#ifndef NDEBUG + case 'v': + debug++; + break; +#endif /* NDEBUG */ + default: + optind = argc; + break; + } + } + + if (argc <= optind) + errx(EXIT_ERROR, "usage: %s [-d] file1 file2", argv[0]); + + fpA = file(argv[optind]); + fpB = file(argv[optind+1]); + + if (NULL == (A = hash_file(fpA))) + err(EXIT_ERROR, "%s", argv[optind]); + if (NULL == (B = hash_file(fpB))) + err(EXIT_ERROR, "%s", argv[optind+1]); + + ch = edit_distance(); + if (print_distance) printf("%d\n", ch); + +#ifndef NDEBUG + free(A); + free(B); + + if (ferror(fpA)) + err(EXIT_ERROR, "%s", argv[optind]); + fclose(fpA); + + if (ferror(fpB)) + err(EXIT_ERROR, "%s", argv[optind+1]); + fclose(fpB); +#endif /* NDEBUG */ + + return 0 < ch; +} diff --git a/2015/iocccsize.c b/2015/iocccsize.c new file mode 100644 index 000000000..529857797 --- /dev/null +++ b/2015/iocccsize.c @@ -0,0 +1,568 @@ +/* + * iocccsize - IOCCC Source Secondary Size + * + * This IOCCC size tool source file is version 2015-05-27-v23. + * Public Domain 1992, 2013, 2014 by Anthony Howe. All rights released. + * With IOCCC minor mods in 2013-2015 by chongo (Landon Curt Noll) /\oo/\ + * + * SYNOPSIS + * + * ioccc [-krs] < input + * + * -k keep comment blocks + * -r count C reserved words as 1 byte + * -s suppress source output, write only the IOCCC 2nd size count + * + * DESCRIPTION + * + * Taking input from standard input, apply the IOCCC Source Size Rule + * for 2001. The program's official length is written to standard error. + * Also filter out C comment blocks (-k to keep) sending the modified + * source to standard output. + * + * The 2001 Source Size Rule was: + * + * Your entry must be <= 4096 bytes in length. The number of octets + * excluding whitespace (tab, space, newline, formfeed, return), and + * excluding any ';', '{' or '}' followed by whitespace or end of file, + * must be <= 2048. + * + * 2013 Source Size Rule is (-r): + * + * Your entry must be <= 4096 bytes in length. The number of octets + * excluding whitespace (tab, space, newline, formfeed, return), and + * excluding any ';', '{' or '}' followed by whitespace or end of file, + * and where C reserved words, including a subset of preprocessor words, + * count as 1 byte, must be <= 2053 (first prime after 2048). + */ + +/* + * The official IOCCC rule 2 secondary limit on C code size + * + * The IOCCC size tool should be compiled as: + * + * cc -pedantic -Wall -std=c99 iocccsize.c -o iocccsize + * + * This tool computes a 2nd size C code. To check your program source + * against the 2nd limit of rule 2, use the -i command line option. + * + * For example: + * + * ./iocccsize -i < prog.c + * + * The IOCCC size tool, when using the -i option, may be summarized as: + * + * The size tool counts C language keywords (primary, secondary, and + * selected preprocessor keywords) as 1. The size tool counts all + * other octets as 1 excluding ASCII whitespace, and excluding any + * ';', '{' or '}' followed by ASCII whitespace, and excluding any + * ';', '{' or '}' octet immediately before the end of file. + * + * ASCII whitespace includes ASCII tab, ASCII space, ASCII newline, + * ASCII formfeed, and ASCII carriage return. + * + * In cases where the above summary and the algorithm implemented by + * the IOCCC size tool source code conflict, the algorithm implemented + * by the IOCCC size tool source code is preferred by the judges. + * + * See the current IOCCC rules and guidelines for more information. + * In particular, see the current IOCCC size rule for information about + * the maximum value that this tool should print for an entry to be valid. + */ + +/* + * IOCCC Judge's remarks: + * + * This code contains undocumented features. On the other hand, this code + * is RTFS (for certain values of RTFS). One might say that this code + * perfectly documents itself. :-) + * + * Many thanks to Anthony Howe for taking the time to put his OCD + * (Obfuscated Coding Determination) into this code! + */ + +/* + * HINT: The algorithm implemented by this code may or not be obfuscated. + * The algorithm may not or may appear to be obfuscated. + * + * In particular: + * + * We did not invent the algorithm. + * The algorithm consistently finds Obfuscation. + * The algorithm killed Obfuscation. + * The algorithm is banned in C. + * The algorithm is from Bell Labs in Jersey. + * The algorithm constantly finds Obfuscation. + * This is not the algorithm. + * This is close. + */ + +#include +#include +#include +#include +#include + +#define FLAG_SILENCE 1 +#define FLAG_KEEP 2 +#define FLAG_RESERVED 4 +#define FLAG_IOCCC_SIZE 8 +#define RANDALL_FLAGG (-1) + +#define BUFFER_SIZE 521 + +char usage[] = +"usage: ioccc [-ikrs] < prog.c\n" +"\n" +"-i\t\tprint just the official secondary IOCCC size to stdout\n" +"\t\t NOTE: -i implies -r -s\n" +"-k\t\tkeep block comments\n" +"-r\t\tcount C reserved words as 1 byte\n" +"-s\t\tsuppress source output, write only the official size\n" +; + +#define STRLEN(s) (sizeof (s)-1) + +typedef struct { + size_t length; + const char *word; +} Word; + +/* + * C reserved words, plus a few #preprocessor tokens, that count as 1 + * + * NOTE: For a good list of reserved words in C, see: + * + * http://www.bezem.de/pdf/ReservedWordsInC.pdf + * + * by Johan Bezem of JB Enterprises: + * + * See http://www.bezem.de/en/ + */ +/* + * The following editorial plea expresses a view shared by more than zero + * IOCCC judges. It may not represent the opinion of all those involved + * with this code nor the International Obfuscated C Code Contest as a whole: + * + * The long list of reserved words below should be a source + * of embarrassment to some of those involved in standardizing C. + * The growing list of reserved words, along with an expanding set of + * linguistic inventions has the appearance of feature + * creep that, if left unchecked, risks turning a beautifully elegant + * language into a steaming pile of biological excretion. + * + * The history of the IOCCC has taught us that even minor changes + * to the language are not always well understood by compiler writers, + * let alone the standards body who publishes them. We have enormous + * sympathy for C compiler writers who must keep up with the creeping + * featurism. We are aware of some C standards members who share + * these concerns. Alas, they seem to be a minority. + * + * The C standards body as a whole, before they emit yet more mountains of new + * standardese, might wish consider the option of moth-balling their committee. + * Or if they must produce a new standard, consider naming whatever + * follows c11 as CNC (C's Not C). :-) + */ +static Word cwords[] = { + /* Yes Virginia, we left #define off the list on purpose! */ + { STRLEN("#elif"), "#elif" }, + { STRLEN("#else"), "#else" }, + { STRLEN("#endif"), "#endif" }, + { STRLEN("#error"), "#error" }, + { STRLEN("#ident"), "#ident" }, + { STRLEN("#if"), "#if" }, + { STRLEN("#ifdef"), "#ifdef" }, + { STRLEN("#include"), "#include" }, + { STRLEN("#line"), "#line" }, + { STRLEN("#pragma"), "#pragma" }, + { STRLEN("#sccs"), "#sccs" }, + { STRLEN("#warning"), "#warning" }, + /**/ + { STRLEN("_Alignas"), "_Alignas" }, + { STRLEN("_Alignof"), "_Alignof" }, + { STRLEN("_Atomic"), "_Atomic" }, + { STRLEN("_Bool"), "_Bool" }, + { STRLEN("_Complex"), "_Complex" }, + { STRLEN("_Generic"), "_Generic" }, + { STRLEN("_Imaginary"), "_Imaginary" }, + { STRLEN("_Noreturn"), "_Noreturn" }, + { STRLEN("_Pragma"), "_Pragma" }, + { STRLEN("_Static_assert"), "_Static_assert" }, + { STRLEN("_Thread_local"), "_Thread_local" }, + /* this comment is not expected to understand itself */ + { STRLEN("alignas"), "alignas" }, + { STRLEN("alignof"), "alignof" }, + { STRLEN("and"), "and" }, + { STRLEN("and_eq"), "and_eq" }, + { STRLEN("auto"), "auto" }, + { STRLEN("bitand"), "bitand" }, + { STRLEN("bitor"), "bitor" }, + { STRLEN("bool"), "bool" }, + { STRLEN("break"), "break" }, + { STRLEN("case"), "case" }, + { STRLEN("char"), "char" }, + { STRLEN("compl"), "compl" }, + { STRLEN("const"), "const" }, + { STRLEN("continue"), "continue" }, + { STRLEN("default"), "default" }, + { STRLEN("do"), "do" }, + { STRLEN("double"), "double" }, + { STRLEN("else"), "else" }, + { STRLEN("enum"), "enum" }, + { STRLEN("extern"), "extern" }, + { STRLEN("false"), "false" }, + { STRLEN("float"), "float" }, + { STRLEN("for"), "for" }, + { STRLEN("goto"), "goto" }, + { STRLEN("I"), "I" }, + { STRLEN("if"), "if" }, + { STRLEN("inline"), "inline" }, + { STRLEN("int"), "int" }, + { STRLEN("long"), "long" }, + { STRLEN("noreturn"), "noreturn" }, + { STRLEN("not"), "not" }, + { STRLEN("not_eq"), "not_eq" }, + { STRLEN("or"), "or" }, + { STRLEN("or_eq"), "or_eq" }, + { STRLEN("register"), "register" }, + { STRLEN("restrict"), "restrict" }, + { STRLEN("return"), "return" }, + { STRLEN("short"), "short" }, + { STRLEN("signed"), "signed" }, + { STRLEN("sizeof"), "sizeof" }, + { STRLEN("static"), "static" }, + { STRLEN("static_assert"), "static_assert" }, + { STRLEN("struct"), "struct" }, + { STRLEN("switch"), "switch" }, + { STRLEN("thread_local"), "thread_local" }, + { STRLEN("true"), "true" }, + { STRLEN("typedef"), "typedef" }, + { STRLEN("union"), "union" }, + { STRLEN("unsigned"), "unsigned" }, + { STRLEN("void"), "void" }, + { STRLEN("volatile"), "volatile" }, + { STRLEN("while"), "while" }, + { STRLEN("xor"), "xor" }, + { STRLEN("xor_eq"), "xor_eq" }, + /**/ + { 0, NULL } +}; + +Word * +find_member(Word *table, const char *string) +{ + Word *w; + for (w = table; w->length != 0; w++) { + if (strncmp(string, w->word, w->length) == 0 + && !isalnum(string[w->length]) && string[w->length] != '_') + return w; + } + return NULL; +} + +/* + * ISO C11 section 5.2.1.1 Trigraph Sequences, leadin sequence "??" + */ +static char trigraph[] = "=(/)'-"; +static char asciimap[] = "#[\\]^{|}~"; + +/* + * Keep track of discarded bytes by read_line() so count() can report + * correct wc(1) equivalent counts. + */ +static unsigned xlcount; +static unsigned xwcount; +static unsigned xbcount; + +size_t +read_line(char *buf, size_t size) +{ + int ch; + size_t length; + + if (buf == NULL || size == 0) + return 0; + + for (size--, length = 0; length < size; ) { + if ((ch = fgetc(stdin)) == EOF) + break; + /* Map NUL bytes to space, though ideally I should chuck'em. */ + if (ch == '\0') + ch = ' '; + /* Discard bare CR and those part of CRLF. */ + if (ch == '\r') { + xbcount++; + continue; + } + /* Trigraph mapping? */ + if (2 <= length && buf[length-2] == '?' && buf[length-1] == '?') { + char *tri; + if ((tri = strchr(trigraph, ch)) != NULL) { + /* Mapped trigraphs count as 1 byte. */ + ch = asciimap[tri - trigraph]; + xbcount += 2; + length -= 2; + } + } + if (ch == '\n' && 1 <= length && buf[length-1] == '\\') { + /* + * ISO C11 section 5.1.1.2 Translation Phases + * point 2 discards backslash newlines. + */ + xbcount += 2; + xwcount++; + xlcount++; + length--; + continue; + } + buf[length++] = ch; + if (ch == '\n') + break; + } + + buf[length] = '\0'; + + return length; +} + +/* + * Count octets and strip comments. The stripped C input is sent to + * standard output. If -s is set, then suppress the source output. + * The various counters are sent to standard error. + * + * The counter output format is: + * + * lcount wcount bcount icount isaved rcount rsaved + * + * where + * lcount line count (same as wc) + * wcount word count (same as wc) + * bcount byte count (same as wc) + * icount IOCCC secondary size rule count + * isaved bytes saved by secondary size rule (bcount - icount) + * rcount number of C reserved words + * rsaved number of octets saved with -r + */ +int +count(int flags) +{ + Word *w; + int span; + char *p, buf[BUFFER_SIZE+1]; + int lcount, wcount, bcount; + int is_comment, is_word, dquote, escape; + int count, keywords, saved, kw_saved; + + /* Start of buffer sentinel. */ + buf[0] = ' '; + buf[BUFFER_SIZE] = 0; /* paranoia */ + + count = saved = 0; + keywords = kw_saved = 0; + lcount = wcount = bcount = 0; + is_comment = is_word = dquote = escape = 0; + + /* + * "no matter how well you may think you understand this code, + * you don't, so don't mess with it." :-) + */ + while (0 < read_line(buf+1, sizeof (buf)-1)) { + if (!(flags & FLAG_KEEP)) { + /* Leading whitespace before comment block? */ + span = strspn(buf+1, "\t "); + + /* Split / * across reads? */ + if (buf[1+span] == '/' && buf[2+span] == '\0') { + (void) ungetc('/', stdin); + continue; + } + + /* no comment is a comment */ + if (buf[1+span] == '/' && buf[2+span] == '/') + continue; + if (buf[1+span] == '/' && buf[2+span] == '*') { + /* Strip leading whitespace before comment block. */ + is_comment = 1; + } + } + + for (p = buf+1; *p != '\0'; p++) { + /* Within quoted string? */ + if (dquote) { + /* Escape _this_ character. */ + if (escape) + escape = 0; + + /* Escape next character. */ + else if (*p == '\\') + escape = 1; + + /* Close quoted string? */ + else if (*p == '"') + dquote = 0; + } + + /* Not quote string. */ + else { + /* In C comment block? */ + if (is_comment) { + /* Split * / across reads? */ + if (*p == '*' && p[1] == '\0') { + ungetc('*', stdin); + break; + } + + /* End of comment block? */ + if (*p == '*' && p[1] == '/') { + is_comment = 0; + + if (!(flags & FLAG_KEEP)) { + /* Strip whitespace and newline + * trailing closing comment. + */ + p += 1 + strspn(p+2, " \t\r\n"); + } + } + + if (!(flags & FLAG_KEEP)) { + /* Strip octets in comment block. */ + continue; + } + } + + /* Split / / or / * across reads? */ + else if (*p == '/' && p[1] == '\0') { + ungetc('/', stdin); + break; + } + + /* Start of comment line? */ + else if (*p == '/' && p[1] == '/') { + if (!(flags & FLAG_KEEP)) { + /* Strip comment to end of buffer. */ + break; + } + } + + /* Start of comment block? */ + else if (*p == '/' && p[1] == '*') { + /* Begin comment block. */ + is_comment = 1; + + if (!(flags & FLAG_KEEP)) { + /* Strip comment block. */ + p++; + continue; + } + } + + /* C reserved word? */ + else if (!isalnum(p[-1]) && p[-1] != '_' + && (w = find_member(cwords, p)) != NULL) { + keywords++; + if (flags & FLAG_RESERVED) { + bcount += w->length; + if (!is_word) { + is_word = 1; + wcount++; + } + + if (!(flags & FLAG_SILENCE)) + fputs(w->word, stdout); + + /* Count reserved word as 1 */ + kw_saved += w->length - 1; + p += w->length - 1; + count++; + continue; + } + } + + /* Open quoted string? */ + else if (*p == '"') { + dquote = 1; + } + } + + if (!(flags & FLAG_SILENCE)) + fputc(*p, stdout); + + bcount++; + if (*p == '\n') + lcount++; + + /* + * Ignore all whitespace + * + * Well not ALL in the Universe, just all here. + */ + if (isspace(*p)) { + is_word = 0; + saved++; + continue; + } else if (!is_word) { + is_word = 1; + wcount++; + } + + /* Ignore curly braces and semicolons when followed + * by any whitespace or EOF. + */ + if (strchr("{;}", *p) != NULL + && (isspace(p[1]) || p[1] == '\0')) { + saved++; + continue; + } + + /* Count this octet. */ + count++; + } + } + + /* final count */ + if (flags & FLAG_IOCCC_SIZE) { + /* output the official IOCCC size tool size to standard out */ + printf("%d\n", count); + } else { + /* The Ugly Truth */ + fprintf(stderr, "%d %d %d %d %d %d %d\n", + lcount + xlcount, wcount + xwcount, bcount + xbcount, + count, saved, keywords, kw_saved); + } + return count; +} + +int +main(int argc, char **argv) +{ + int ch; + int this = 0; /* "You are not expected to understand this" :-) */ + + /* parse args */ + while ((ch = getopt(argc, argv, "ikrs")) != -1) { + switch (ch) { + case 'i': + this |= (FLAG_RESERVED | FLAG_SILENCE | + FLAG_IOCCC_SIZE); + break; + case 'k': + this |= FLAG_KEEP; + break; + case 'r': + this |= FLAG_RESERVED; + break; + case 's': + this |= FLAG_SILENCE; + break; + default: + fprintf(stderr, "%s\n", usage); + return 2; + } + } + + /* count as directed - 1 Muha .. 2 Muhaha .. 3 Muhahaha ... */ + (void) count(this); + + /* All Done!!! All Done!!! -- Jessica Noll, age 2 */ + return 0; +} diff --git a/2015/iocccsize.mk b/2015/iocccsize.mk new file mode 100644 index 000000000..f4f4cee69 --- /dev/null +++ b/2015/iocccsize.mk @@ -0,0 +1,71 @@ +.POSIX : + +####################################################################### + +CFLAGS := -pedantic -Wall -std=c99 -g +LDFLAGS := +LIBS := +IT := iocccsize + +####################################################################### + +all: ${IT}$E + +${IT}$E: ${IT}.c + ${CC} ${CFLAGS} -o ${IT}$E ${IT}.c + +# +# Exercise the IOCCC size tool. +# +test: test-k test-wc test-rcount + +# +# -k should pass through the source with block comments intact. +# +test-k: ${IT}$E + @{ t="-k keep comments" ;\ + if ./${IT} -k <${IT}.c 2>/dev/null | diff - ${IT}.c ; then echo "-OK- $$t" ; else echo "FAIL $$t" ; fi ;\ + } + +# +# First 3 counters should match wc(1) +# +test-wc: ${IT}$E + @{ t="wc counts" ;\ + a=$$(./${IT} -s -k <${IT}.c 2>&1 | cut -d' ' -f1-3) ;\ + b=$$(wc ${IT}.c | sed -e's/^ *//; s/ */ /g' | cut -d' ' -f1-3) ;\ + if [ "$$a" = "$$b" ]; then echo "-OK- $$t"; else echo "FAIL $$t: expected '$$b', got '$$a'"; fi ;\ + } + +# +# Show counters for different option combinations. +# +test-show: ${IT}$E + ./${IT} -s <${IT}.c + ./${IT} -s -r <${IT}.c + ./${IT} -s -k <${IT}.c + ./${IT} -s -r -k <${IT}.c + +# +# Reserved word counter should be same for all option combinations. +# +test-rcount: ${IT}$E + @{ t="rcount" ;\ + ./${IT} -s <${IT}.c 2>&1 | cut -d" " -f 6 >/tmp/$$$$.tmp ;\ + ./${IT} -s -r <${IT}.c 2>&1 | cut -d" " -f 6 >>/tmp/$$$$.tmp ;\ + ./${IT} -s -k <${IT}.c 2>&1 | cut -d" " -f 6 >>/tmp/$$$$.tmp ;\ + ./${IT} -s -r -k <${IT}.c 2>&1 | cut -d" " -f 6 >>/tmp/$$$$.tmp ;\ + n=$$(sort -u /tmp/$$$$.tmp | wc -l | sed -e's/^ *//') ;\ + if [ $$n -eq 1 ]; then echo "-OK- $$t"; else echo "FAIL $$t: expected 1 unique line, got $$n"; echo "see make test-show"; fi ;\ + rm -f /tmp/$$$$.tmp ;\ + } + +clean: + rm -f iocccsize.o + rm -rf iocccsize.dSYM + +clobber: clean + rm -f iocccsize + +install: + @echo "no thank you on the install :-)" diff --git a/2015/mills1/Makefile b/2015/mills1/Makefile new file mode 100644 index 000000000..e34b483d0 --- /dev/null +++ b/2015/mills1/Makefile @@ -0,0 +1,421 @@ +#!/usr/bin/env make +# +# 2015 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +CSILENCE= -Wno-parentheses -Wno-implicit-function-declaration \ + -Wno-missing-variable-declarations + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +#CDEFINE= +CDEFINE= -DU=${DU} -DD=${DD} -DW=${DW} -DH=${DH} -DA=${DA} -DI=${DI} \ + -DB=${DB} -DF=${DF} -DG=${DG} + + +# Game parameters +# +DU=99999 # Time between steps in microseconds. + # Make it larger if the game is too fast for you. + +DW=28 # Pipe-to-pipe spacing, in columns. + # Farther apart is easier. + +DD=20 # Space between pipes. + # The difference between DD and DW is the width of a pipe. + # Narrow pipes are easier to fly though. + +DH=8 # Height of gap in pipe. + # Make this larger to make the game easier. + +DA=100 # Acceleration due to gravity (scaled by 256). + # Smaller values make you glide slower. + +DI=-200 # Impulse velocity of a flap (scaled by 256). + # Make larger if you want an less intense tapping experience! + +DB='"' "/\\oo/\\" + @echo Readers shall not be disallowed from not failing to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v5; \ + else \ + echo "planet deniers, like the IAU, are amusing"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2015/mills1/hint.html b/2015/mills1/hint.html new file mode 100644 index 000000000..cac8eb7da --- /dev/null +++ b/2015/mills1/hint.html @@ -0,0 +1,183 @@ + + + + + + + "For the Birds!" Award + + +

    “For the Birds!” Award

    + +

    Chris Mills
    +Twitter: @MisterXopher

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./prog
    +
    + +

    Try:

    + +
    Pressing the up arrow and the down arrow at the right time.
    +
    + +

    Selected Judges Remarks:

    + +

    Did you find that mobile application game a bit frustrating? +Well you can adjust the makefile parameters to make life a +bit easier for you:

    + +
    make clobber all DW=199999 DW=22 DH=16 DA=50 DI=-150
    +
    + +

    From the makefile:

    + +
    # Game parameters
    +#
    +DU=99999        # Time between steps in microseconds.
    +        # Make it larger if the game is too fast for you.
    +
    +DW=28           # Pipe-to-pipe spacing, in columns.
    +        # Farther apart is easier.
    +
    +DD=20           # Space between pipes.
    +        # The difference between DD and DW is the width of a pipe.
    +        # Narrow pipes are easier to fly though.
    +
    +DH=8            # Height of gap in pipe.
    +        # Make this larger to make the game easier.
    +
    +DA=100          # Acceleration due to gravity (scaled by 256).
    +        # Smaller values make you glide slower.
    +
    +DI=-200         # Impulse velocity of a flap (scaled by 256).
    +        # Make larger if you want an less intense tapping experience!
    +
    +DB='"<o^="'     # Sprite for player when gliding.
    +        # HINT: Try using various emoji.
    +        # NOTE: The string MUST be enclosed inside double quotes.
    +
    +DF='"<ov="'     # Sprite for player when flapping.
    +        # HINT: Try using various emoji.
    +        # NOTE: The string MUST be enclosed inside double quotes.
    +
    +DG='"Tap to Flap!"'     # Instruction text.
    +            # Change to your native tongue.
    +        # NOTE: The string MUST be enclosed inside double quotes.
    +
    + +

    Enjoy!

    + +
    TAP!! TAP!! TAP!!
    +FLAP! FLAP! FLAP!
    +
    + +

    Author’s comments:

    + +

    The Program

    + +

    Better late than never to jump on the bandwagon of 2014’s most successful +mobile game. The game is called Tappy Bird, and has all the sophisticated +gameplay of the original, except with an exciting twist! (you get to fly to +the right instead of to the left).

    + +

    In addition, the game features exciting new customization options! Too hard? +Ran into that damn wall too many times? Now you can change physics! Change +any of a number of parameters (speed, gravity, etc.) of the game to suit your +gameplay!

    + +

    You can even make the game more challenging – resize the terminal window to +make the world taller or shorter. You’ll never be able to get through the +pipes when they are four times as tall!

    + +

    Instructions

    + +

    The instructions are printed at the start of the game: Tap to Flap!

    + +

    Hit any key to make your bird fly. Navigate her between the gaps in the pipes. +Your score is shown in the upper left, along with your current high-score.

    + +

    Customization options

    + +

    To customize the gameplay, change any of the following options on the compile +command line:

    + +
      +
    • -DU: Time between steps in microseconds. Make it larger if the game +is too fast for you.
    • +
    • -DW: Pipe-to-pipe spacing, in columns. Farther apart is easier.
    • +
    • -DD: Space between pipes. The difference between D and W is the +width of the pipe. Narrow pipes are easier to fly though.
    • +
    • -DH: Height of gap in pipe. Make this larger to reduce the challenge.
    • +
    • -DA: Acceleration due to gravity (scaled by 256). Smaller values +make you glide slower.
    • +
    • -DI: Impulse velocity of a flap (scaled by 256). Make this smaller +if you want an intense tapping experience!
    • +
    • -DB: Sprite for player when gliding.
    • +
    • -DF: Sprite for player when flapping.
    • +
    • -DG: Instruction text. Change to your native tongue.
    • +
    + + +

    Feel free to try out physics or playfield options to make the game more +interesting. Try setting the player sprites to change the game completely – +maybe you can be a fish, or a pig – the options are limitless! Try using +emoji – you can be a flying beer mug!

    + +

    Note that since the curses library on POSIX doesn’t natively support wide +characters (needed for UTF-8 support, which is needed for emoji), you may need +to make some changes to the Makefile to get emoji to work on your system. +To help you get started, I’ve included some example substitutions for emoji +sprites and instruction text; for example, type

    + +
    make EMOJI=beer LANGUAGE=spanish
    +
    + +

    or

    + +
    make EMOJI=globe
    +
    + +

    for some examples (the full list of options is in the Makefile). Don’t +forget to make clean first. If the output doesn’t look right, you may need +to link with the “wide” version of ncurses. On MacOSX 10.11, it should work +with the current -lcurses; on Linux, you probably need -lncursesw. +See the Makefile to make this change if you need to. Or buy a Mac.

    + +

    You will also need a UTF-8 compatible terminal and an emoji font installed, +and you will need to have your LANG environment variable set to use UTF-8. +Again, if this is too complicated, maybe just go and get that Mac.

    + +

    Future additions

    + +

    Future versions of the game will include monitization via the freemium model +with micropayments for customization options, play-to-win and of course +live-streamed targeted video advertising.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2016, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2015/mills1/hint.text b/2015/mills1/hint.text new file mode 100644 index 000000000..5714d2e8e --- /dev/null +++ b/2015/mills1/hint.text @@ -0,0 +1,156 @@ +# "For the Birds!" Award + +Chris Mills +Twitter: @MisterXopher + + +## Judges' comments: +### To use: + + make + + ./prog + +### Try: + + Pressing the up arrow and the down arrow at the right time. + +### Selected Judges Remarks: + +Did you find that mobile application game a bit frustrating? +Well you can adjust the makefile parameters to make life a +bit easier for you: + + make clobber all DW=199999 DW=22 DH=16 DA=50 DI=-150 + +From the makefile: + + # Game parameters + # + DU=99999 # Time between steps in microseconds. + # Make it larger if the game is too fast for you. + + DW=28 # Pipe-to-pipe spacing, in columns. + # Farther apart is easier. + + DD=20 # Space between pipes. + # The difference between DD and DW is the width of a pipe. + # Narrow pipes are easier to fly though. + + DH=8 # Height of gap in pipe. + # Make this larger to make the game easier. + + DA=100 # Acceleration due to gravity (scaled by 256). + # Smaller values make you glide slower. + + DI=-200 # Impulse velocity of a flap (scaled by 256). + # Make larger if you want an less intense tapping experience! + + DB='" diff --git a/2015/mills1/prog.c b/2015/mills1/prog.c new file mode 100644 index 000000000..f1f7f313f --- /dev/null +++ b/2015/mills1/prog.c @@ -0,0 +1,26 @@ + + #define P(a,b,c) a##b##c + #include/*++**++*/ + int c,h, v,x,y,s, i,b; int + main () { initscr( ); P(cb, + rea, k)() ;/// + P(n, oec, ho)( + )/* */ ;for (curs_set(0); s= x=COLS/2 + ; P( flu, shi, np)()){ timeout(y=c= v=0);/// + P(c, lea, r)() ;for (P ( + mva, d, dstr )(2, 3+x, + G) ; ; P( usl, eep, )(U)){// + P(m, vad, dstr )( y >>8,x,// + " "); for(i=LINES; /* */ i -->0 + ; mvinsch(i,0,0>(~c|i-h-H &h-i )?' ' +:(i- h|h- i+H) <0?'|' :'=' )); +if(( i=( y +=v= getch( )>0?I:v+ + A)>>8)>=LINES||mvinch(i*= 0>8, x,0>v ?F:B ); i=--s + /-W; P(m, vpr, intw)(0, + COLS-9," %u/%u ",(0' "/\\oo/\\" + @echo Readers shall not be disallowed from not failing to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v5; \ + else \ + echo "planet deniers, like the IAU, are amusing"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2015/mills2/hint.html b/2015/mills2/hint.html new file mode 100644 index 000000000..e9a9073c8 --- /dev/null +++ b/2015/mills2/hint.html @@ -0,0 +1,157 @@ + + + + + + + Most Compact + + +

    Most Compact

    + +

    Chris Mills
    +Twitter: @MisterXopher

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./prog compressed_file.Z
    +
    + +

    Try:

    + +
    printf '000I\236\f\31H\260\240\301\203' > ioccc.Z
    +./prog ioccc.Z 
    +
    +dd bs=1k count=4096 < /dev/urandom > test1
    +compress < test1 > test1.Z
    +time ./prog test1.Z | cmp - test1
    +
    +dd bs=1k count=4096 < /dev/zero > test2
    +compress < test2 > test2.Z
    +time ./prog test2.Z | cmp - test2
    +
    + +

    Selected Judges Remarks:

    + +

    Without ASCII art, the source code of this entry would have been exactly 256 bytes. +Compared to 1990/jaw, it is very impressive, +even taking into account the missing atob functionality. Now we wish for a compress(1)-like compressor +using a similar idea.

    + +

    Why is the sad smiley on line 12 in that particular place?

    + +

    Author’s comments:

    + +

    The Program

    + +

    This program is in implementation of the unix zcat(1) command for printing +compressed files that have been created by the compress(1) command.

    + +

    The adaptive LZW compression +employed by compress usually requires a fairly large amount of memory to +build the decompression tables (in fact, compress has a command-line option +to control the size of the decompression tables, since some of the early +systems to which it was ported (coughMS-DOScough) did not have enough +memory to use the full 16-bit codes). This version has no large static or +dynamic tables. It is able to decompress 16-bit files using a single function +and a few ints.

    + +

    To run the program, take an existing compressed file and pass it to the program +on the command line. On the odd chance you don’t have compress hanging about +on your system, I’ve provided compressed copies of this year’s IOCCC rules +and guidelines files. To print them, just do

    + +
    ./prog ioccc_guidelines.txt.Z
    +
    + +

    The Details

    + +

    The basic cleverness here comes from realizing that the compressed data is +itself an encoded version of the code dictionary. When the encoder sees +an input string that is not in its dictionary, it emits the code corresponding +to the longest prefix that is in the dictionary and adds a new entry consisting +of that code followed by the next input character. This means that when the +decoder wants to know how to decode a code, it just needs to find the spot in +the code-stream where the encoder added that entry to the dictionary. The +code at that spot is the prefix, and the first character of the following code +is the suffix. Decoding then just becomes recursion, to follow the chain of +prefixes and suffix characters.

    + +

    Of course, it’s not nearly that simple. Finding the code in the stream is +complicated by several issues:

    + +
      +
    • Codes are at bit offsets within the stream, and must be extracted.
    • +
    • As codes are added to the dictionary, the code word size grows, so finding +the offset to a particular code word is involved.
    • +
    • The compress encoder reserves a code word that clears the coding tables. +When this is encountered, the computation of offsets and bit sizes reset.
    • +
    • The compress decoder is designed to always read a block of eight code +words at the same time, so that it need only read N bytes to get eight N-bit +code words. When the “clear” code is encountered, the entire eight-word +block is flushed (since the decoder didn’t know the word size would change). +The program needs to account for this extra flushing.
    • +
    • The end of the stream is not explicitly marked; the encoder just pads out +the output to the next byte. The decoder must notice this to know when +to stop.
    • +
    • The output stream contains a header that must be skipped.
    • +
    + + +

    Managing all the details involved added a lovely additional layer of +obfuscation to the otherwise elegant recursive decoder. Still, the code +manages it in a remarkably small amount of code.

    + +

    Limitations

    + +

    The decoder doesn’t look at the header. If you supply something that is not +compressed data, it’s likely to crash in an interesting manner.

    + +

    In particular, it doesn’t look at the third byte of the header, which encodes +the maximum code word size and whether “block mode” was used when the encoder +was run. If you use compress in its default mode, the maximum word size +will be 16 bits and “block mode” will be enabled. You are unlikely to find +any files that don’t use “block mode”, since all versions of compress after +2.0 (circa 1984) use it by default and have no documented way to disable it. +Reducing the bit depth is still possibly by using the -b flag. Modern +systems have no problem with the 200 KB or so needed for 16-bit decoder +tables, so the need for reducing the table size has passed, hence this program +always assumes 16-bits… However, should you find a file that needs a +smaller table, feel free to change the hard-coded 16 in the source into the +appropriate number and recompile.

    + +

    In the event that you don’t supply an argument, or that argument doesn’t name +a readable file, the program will just silently exit. This is a feature.

    + +

    The program depends on having a little-endian system. On a big-endian system +you will get a wierd big-endian version of compress, which might have come to +pass in an alternate universe where the vax on which compress was authored +had been big-endian. Luckily for us, it wasn’t, and neither are most of the +systems you might want to compile this for.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2016, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2015/mills2/hint.text b/2015/mills2/hint.text new file mode 100644 index 000000000..e78b27e18 --- /dev/null +++ b/2015/mills2/hint.text @@ -0,0 +1,131 @@ +# Most Compact + +Chris Mills +Twitter: @MisterXopher + + +## Judges' comments: +### To use: + + make + + ./prog compressed_file.Z + +### Try: + + printf '000I\236\f\31H\260\240\301\203' > ioccc.Z + ./prog ioccc.Z + + dd bs=1k count=4096 < /dev/urandom > test1 + compress < test1 > test1.Z + time ./prog test1.Z | cmp - test1 + + dd bs=1k count=4096 < /dev/zero > test2 + compress < test2 > test2.Z + time ./prog test2.Z | cmp - test2 + +### Selected Judges Remarks: + +Without ASCII art, the source code of this entry would have been exactly 256 bytes. +Compared to [1990/jaw](http://ioccc.org/years.html#1990_jaw), it is very impressive, +even taking into account the missing atob functionality. Now we wish for a compress(1)-like compressor +using a similar idea. + +Why is the sad smiley on line 12 in that particular place? + +## Author's comments: +The Program +=========== + +This program is in implementation of the unix `zcat(1)` command for printing +compressed files that have been created by the `compress(1)` command. + +The adaptive [LZW](https://en.wikipedia.org/wiki/Lempel–Ziv–Welch) compression +employed by `compress` usually requires a fairly large amount of memory to +build the decompression tables (in fact, `compress` has a command-line option +to control the size of the decompression tables, since some of the early +systems to which it was ported (*cough*MS-DOS*cough*) did not have enough +memory to use the full 16-bit codes). This version has no large static or +dynamic tables. It is able to decompress 16-bit files using a single function +and a few ints. + +To run the program, take an existing compressed file and pass it to the program +on the command line. On the odd chance you don't have `compress` hanging about +on your system, I've provided compressed copies of this year's IOCCC rules +and guidelines files. To print them, just do + + ./prog ioccc_guidelines.txt.Z + +The Details +----------- + +The basic cleverness here comes from realizing that the compressed data is +itself an encoded version of the code dictionary. When the encoder sees +an input string that is not in its dictionary, it emits the code corresponding +to the longest prefix that is in the dictionary and adds a new entry consisting +of that code followed by the next input character. This means that when the +decoder wants to know how to decode a code, it just needs to find the spot in +the code-stream where the encoder added that entry to the dictionary. The +code at that spot is the prefix, and the first character of the following code +is the suffix. Decoding then just becomes recursion, to follow the chain of +prefixes and suffix characters. + +Of course, it's not nearly that simple. Finding the code in the stream is +complicated by several issues: + + * Codes are at bit offsets within the stream, and must be extracted. + * As codes are added to the dictionary, the code word size grows, so finding + the offset to a particular code word is involved. + * The `compress` encoder reserves a code word that clears the coding tables. + When this is encountered, the computation of offsets and bit sizes reset. + * The `compress` decoder is designed to always read a block of eight code + words at the same time, so that it need only read N bytes to get eight N-bit + code words. When the "clear" code is encountered, the entire eight-word + block is flushed (since the decoder didn't know the word size would change). + The program needs to account for this extra flushing. + * The end of the stream is not explicitly marked; the encoder just pads out + the output to the next byte. The decoder must notice this to know when + to stop. + * The output stream contains a header that must be skipped. + +Managing all the details involved added a lovely additional layer of +obfuscation to the otherwise elegant recursive decoder. Still, the code +manages it in a remarkably small amount of code. + +Limitations +----------- + +The decoder doesn't look at the header. If you supply something that is not +compressed data, it's likely to crash in an interesting manner. + +In particular, it doesn't look at the third byte of the header, which encodes +the maximum code word size and whether "block mode" was used when the encoder +was run. If you use `compress` in its default mode, the maximum word size +will be 16 bits and "block mode" will be enabled. You are unlikely to find +any files that don't use "block mode", since all versions of `compress` after +2.0 (circa 1984) use it by default and have no documented way to disable it. +Reducing the bit depth is still possibly by using the `-b` flag. Modern +systems have no problem with the 200 KB or so needed for 16-bit decoder +tables, so the need for reducing the table size has passed, hence this program +always assumes 16-bits... However, should you find a file that needs a +smaller table, feel free to change the hard-coded 16 in the source into the +appropriate number and recompile. + +In the event that you don't supply an argument, or that argument doesn't name +a readable file, the program will just silently exit. This is a feature. + +The program depends on having a little-endian system. On a big-endian system +you will get a wierd big-endian version of `compress`, which might have come to +pass in an alternate universe where the vax on which `compress` was authored +had been big-endian. Luckily for us, it wasn't, and neither are most of the +systems you might want to compile this for. + + +-------------------------------------------------------------------------------- + diff --git a/2015/mills2/ioccc_guidelines.txt.Z b/2015/mills2/ioccc_guidelines.txt.Z new file mode 100644 index 000000000..6bcebae44 Binary files /dev/null and b/2015/mills2/ioccc_guidelines.txt.Z differ diff --git a/2015/mills2/ioccc_rules.txt.Z b/2015/mills2/ioccc_rules.txt.Z new file mode 100644 index 000000000..3555939af Binary files /dev/null and b/2015/mills2/ioccc_rules.txt.Z differ diff --git a/2015/mills2/prog.c b/2015/mills2/prog.c new file mode 100644 index 000000000..b058e40b2 --- /dev/null +++ b/2015/mills2/prog.c @@ -0,0 +1,19 @@ + + int I=256,l,c, o,O=3; void e( + int L){ o=0; for( l=8; L>>++l&& + 16>l; o+=l + <>=7&o; + L%=1 <>8?256-L?e( + L-1) ,c|| + (e(c =L), + c=0) :( O + +=(-I&7)*l+o+l>>3,I=L):putchar( + L); }int main(int l,char**o){ + for( + /* //// */ + open(1[o],0); ; e(I++ + )) ;} + diff --git a/2015/muth/Makefile b/2015/muth/Makefile new file mode 100644 index 000000000..20cc9c11d --- /dev/null +++ b/2015/muth/Makefile @@ -0,0 +1,268 @@ +#!/usr/bin/env make +# +# 2015 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq +CUT=cut + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +CSILENCE= -Wno-keyword-macro -Wno-unused-macros + +# compiler standard +# +#CSTD= +#CSTD= -ansi +#CSTD= -std=c11 +CSTD= -std=c1x + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +#CDEFINE= +CDEFINE= -DX="$(X)" -DV="$(V)" + +# include files that are needed to compile +# +#CINCLUDE= +CINCLUDE= -include "${MACHINE}" -include "${TAPE}" + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +CSRC= ${ENTRY}.c +OBJ= ${ENTRY}.o +DATA= +ALT_OBJ= +ALT_ENTRY= +TARGET= ${ENTRY} + +MACHINE = machine_beaver_4_2.h +TAPE = tape_empty.h + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +${ENTRY}: ${CSRC} + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + +# test the entry +# +.PHONY: run +run: ${ENTRY} + @ ./${ENTRY} | ${TR} -d '~' + @ [ -z "${V}" ] || [ "${V}" -lt 1 ] || { echo "total:" $$(./${ENTRY} | ${TR} -dc '~' | wc -c) "steps"; } + @ [ -z "${V}" ] || [ "${V}" -lt 2 ] || { ./${ENTRY} | ${GREP} '^~' | ${CUT} -f2 | ${SORT} | ${UNIQ} -c; } + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from not failing to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v5; \ + else \ + echo "planet deniers, like the IAU, are amusing"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2015/muth/hint.html b/2015/muth/hint.html new file mode 100644 index 000000000..2f469f535 --- /dev/null +++ b/2015/muth/hint.html @@ -0,0 +1,151 @@ + + + + + + + Most Complete Use of CPP + + +

    Most Complete Use of CPP

    + +

    Dominik Muth muth.ioccc@freenet.de

    + +

    Judges' comments:

    + +

    To use:

    + +
    make -B [MACHINE=your_machine.h] [TAPE=your_tape.h] [X=[0|1|2|3|4|5|6|7|8|9]] [V=[0|1|2]] run
    +
    + +

    Try:

    + +
    make -B V=2 run
    +
    +strings prog | grep '(,)'
    +
    +make -B MACHINE=machine_times2.h TAPE=tape_five.h V=1 run
    +
    +make -B MACHINE=machine_chaos_5_2.h X=5 run
    +
    + +

    Selected Judges Remarks:

    + +

    This is something we were fearing all along: that the C preprocessor is Turing-complete +even without conditionals and recursive file inclusion as some kind of a +rewriting system. Now we have the proof!

    + +

    Author’s comments:

    + +

    Preprocessor Turing Engine

    + +

    Features

    + +
      +
    • Turing machine runs in preprocessor
    • +
    • universal (unlimited configurable states, symbols, and tape)
    • +
    • no #ifs or other conditional directives, only #defines
    • +
    • no recursive #include
    • +
    • single compiler run (no repeated preprocessing)
    • +
    • no variadic macros
    • +
    • verbosity levels: + +
        +
      • V=0 (default) only prints the final tape
      • +
      • V=1 additionally prints one tilde character per machine step (slow)
      • +
      • V=2 additionally prints details on each machine step (slow; generates large files)
      • +
      +
    • +
    • make target run runs ./prog and filters a little statistics out of the verbose output
    • +
    • X (defaults to 3) sets the maximum number of steps: M(X) ~ 8X
    • +
    + + +

    Limitations

    + +

    If the machine does not halt after M(X) steps, you will see unexpanded macros in the output.

    + +

    Compiler warnings

    + +

    If V=1 or V=2 is used, you may see “warning: string length is greater than the length '4095' ISO C99 compilers are required to support”.

    + +

    Programming

    + +

    Implementing your own Turing machine is easy. Take a look at the supplied header files for examples.

    + +
    Tape Symbols
    + +

    Every symbol used (except “_”) must be explicitly declared using

    + +
    #define sym_SYMBOL(sym, _SYMBOL) sym
    +
    + +

    Example:

    + +
    #define sym_1(sym, _1) sym
    +
    + +
    Tape
    + +

    The initial content of the tape must be defined in the tape header using a triple like:

    + +
    #define tape ((((,),...l2), l1), c, (r1, (r2..., (,))))
    +
    + +
      +
    • l1, l2, … are the symbols to the left
    • +
    • c is the symbol at the current position
    • +
    • r1, r2, … are the symbols to the right
    • +
    + + +

    The empty pairs “(,)” represent the continuations of the tape, filled with underscore symbols (“_”). They are expanded on demand.

    + +
    State Machine
    + +

    All transitions are defined in the machine header using the syntax

    + +
    #define CURRENT_SCANNED (WRITE, MOVEMENT, NEXT)
    +
    + +

    where

    + +
      +
    • CURRENT is the current state
    • +
    • SCANNED is the symbol at the current position
    • +
    • the whitespace before the parentheses is significant
    • +
    • WRITE is the symbol to be written to the tape
    • +
    • MOVEMENT is “L” for left, “R” for right, or nothing
    • +
    • NEXT is the next state
    • +
    + + +

    There must be a state “A” defined, which becomes the initial state of the machine.

    + +

    To halt the machine, use the keyword “break” as in

    + +
    #define A_1 (2, break)
    +
    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2016, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2015/muth/hint.text b/2015/muth/hint.text new file mode 100644 index 000000000..e49ff39c1 --- /dev/null +++ b/2015/muth/hint.text @@ -0,0 +1,107 @@ +# Most Complete Use of CPP + +Dominik Muth + + +## Judges' comments: +### To use: + + make -B [MACHINE=your_machine.h] [TAPE=your_tape.h] [X=[0|1|2|3|4|5|6|7|8|9]] [V=[0|1|2]] run + +### Try: + + make -B V=2 run + + strings prog | grep '(,)' + + make -B MACHINE=machine_times2.h TAPE=tape_five.h V=1 run + + make -B MACHINE=machine_chaos_5_2.h X=5 run + +### Selected Judges Remarks: + +This is something we were fearing all along: that the C preprocessor is Turing-complete +even without conditionals and recursive file inclusion as some kind of a +[rewriting system](https://en.wikipedia.org/wiki/Rewriting). Now we have the proof! + +## Author's comments: +### Preprocessor Turing Engine + +#### Features + +- Turing machine runs in preprocessor +- universal (unlimited configurable states, symbols, and tape) +- no `#if`s or other conditional directives, only `#define`s +- no recursive `#include` +- single compiler run (no repeated preprocessing) +- no variadic macros +- verbosity levels: + + `V=0` (default) only prints the final tape + + `V=1` additionally prints one tilde character per machine step (slow) + + `V=2` additionally prints details on each machine step (slow; generates large files) +- make target `run` runs `./prog` and filters a little statistics out of the verbose output +- `X` (defaults to 3) sets the maximum number of steps: *M*(`X`) ~ 8`X` + +#### Limitations + +If the machine does not halt after *M*(`X`) steps, you will see unexpanded macros in the output. + +#### Compiler warnings + +If `V=1` or `V=2` is used, you may see "`warning: string length is greater than the length '4095' ISO C99 compilers are required to support`". + +#### Programming + +Implementing your own Turing machine is easy. Take a look at the supplied header files for examples. + +##### Tape Symbols + +Every symbol used (except "`_`") must be explicitly declared using + + #define sym_SYMBOL(sym, _SYMBOL) sym + +Example: + + #define sym_1(sym, _1) sym + +##### Tape + +The initial content of the tape must be defined in the tape header using a triple like: + + #define tape ((((,),...l2), l1), c, (r1, (r2..., (,)))) + +- `l1`, `l2`, ... are the symbols to the left +- `c` is the symbol at the current position +- `r1`, `r2`, ... are the symbols to the right + +The empty pairs "`(,)`" represent the continuations of the tape, filled with underscore symbols ("`_`"). They are expanded on demand. + +##### State Machine + +All transitions are defined in the machine header using the syntax + + #define CURRENT_SCANNED (WRITE, MOVEMENT, NEXT) + +where + +- `CURRENT` is the current state +- `SCANNED` is the symbol at the current position +- the whitespace before the parentheses is significant +- `WRITE` is the symbol to be written to the tape +- `MOVEMENT` is "`L`" for left, "`R`" for right, or nothing +- `NEXT` is the next state + +There must be a state "`A`" defined, which becomes the initial state of the machine. + +To halt the machine, use the keyword "`break`" as in + + #define A_1 (2, break) + +-------------------------------------------------------------------------------- + diff --git a/2015/muth/machine_beaver_4_2.h b/2015/muth/machine_beaver_4_2.h new file mode 100644 index 000000000..13ad467c4 --- /dev/null +++ b/2015/muth/machine_beaver_4_2.h @@ -0,0 +1,19 @@ +/* + * 4 state, 2 symbol busy beaver, http://www.logique.jussieu.fr/~michel/ha.html#tm42 + * + * halts after 107 steps + */ + +#define sym_1(sym, _1) sym + +#define A__ (1, R, B) +#define A_1 (1, L, B) + +#define B__ (1, L, A) +#define B_1 (_, L, C) + +#define C__ (1,break) +#define C_1 (1, L, D) + +#define D__ (1, R, D) +#define D_1 (_, R, A) diff --git a/2015/muth/machine_champ_2_4.h b/2015/muth/machine_champ_2_4.h new file mode 100644 index 000000000..77d437d8e --- /dev/null +++ b/2015/muth/machine_champ_2_4.h @@ -0,0 +1,19 @@ +/* + * 2 state, 4 symbol current champion, http://www.logique.jussieu.fr/~michel/ha.html#tm24 + * + * halts after 3932964 steps + */ + +#define sym_1(sym, _1) sym +#define sym_2(sym, _2) sym +#define sym_3(sym, _3) sym + +#define A__ (1, R, B) +#define A_1 (2, L, A) +#define A_2 (1, R, A) +#define A_3 (1, R, A) + +#define B__ (1, L, B) +#define B_1 (1, L, A) +#define B_2 (3, R, B) +#define B_3 (1,break) diff --git a/2015/muth/machine_chaos_5_2.h b/2015/muth/machine_chaos_5_2.h new file mode 100644 index 000000000..d16b9b4d4 --- /dev/null +++ b/2015/muth/machine_chaos_5_2.h @@ -0,0 +1,22 @@ +/* + * chaos machine, http://www.drb.insel.de/~heiner/BB/mabu90.html + * + * does not halt (http://www.drb.insel.de/~heiner/BB/TM4-proof.txt) + */ + +#define sym_1(sym, _1) sym + +#define A__ (1, L, B) +#define A_1 (1, R, B) + +#define B__ (1, R, C) +#define B_1 (_, L, E) + +#define C__ (_, R, D) +#define C_1 (_, L, A) + +#define D__ (1, L, A) +#define D_1 (_, R, D) + +#define E__ (1,break) +#define E_1 (_, L, C) diff --git a/2015/muth/machine_cmplx_5_2.h b/2015/muth/machine_cmplx_5_2.h new file mode 100644 index 000000000..27908da4b --- /dev/null +++ b/2015/muth/machine_cmplx_5_2.h @@ -0,0 +1,20 @@ +/* + * complex machine, http://www.drb.insel.de/~heiner/BB/mabu90.html + */ + +#define sym_1(sym, _1) sym + +#define A__ (1, L, B) +#define A_1 (1, R, A) + +#define B__ (_, R, A) +#define B_1 (_, L, C) + +#define C__ (_, R, C) +#define C_1 (1, L, D) + +#define D__ (1, L, E) +#define D_1 (_, R, A) + +#define E__ (_, L, B) +#define E_1 (1,break) diff --git a/2015/muth/machine_count_5_2.h b/2015/muth/machine_count_5_2.h new file mode 100644 index 000000000..ee9b9a3ce --- /dev/null +++ b/2015/muth/machine_count_5_2.h @@ -0,0 +1,22 @@ +/* + * counting machine, http://www.drb.insel.de/~heiner/BB/mabu90.html + * + * does not halt + */ + +#define sym_1(sym, _1) sym + +#define A__ (1, L, B) +#define A_1 (1, R, A) + +#define B__ (_, R, A) +#define B_1 (_, L, C) + +#define C__ (_, R, A) +#define C_1 (1, L, D) + +#define D__ (_, L, E) +#define D_1 (1, R, B) + +#define E__ (_, R, B) +#define E_1 (1,break) diff --git a/2015/muth/machine_gcd.h b/2015/muth/machine_gcd.h new file mode 100644 index 000000000..b1b4c3796 --- /dev/null +++ b/2015/muth/machine_gcd.h @@ -0,0 +1,56 @@ +/* + * greatest common divisor + * + * based on http://www.ioccc.org/2001/herrmann1.gcd + */ + +// try tape_15_50.h or tape_77_55.h + +#define A__ (_, R, A ) +#define A_1 (1, L, x9) + +#define x0_1 (_, R, x1) + +#define x1__ (_, R, xa) +#define x1_1 (1, R, x2) + +#define x2__ (_, R, x3) +#define x2_1 (1, R, x2) + +#define x3__ (_, R, x3) +#define x3_1 (1, R, x4) + +#define x4__ (1, L, x5) +#define x4_1 (1, R, x4) + +#define x5_1 (_, L, x6) + +#define x6__ (_, R, xc) +#define x6_1 (1, L, x7) + +#define x7__ (_, L, x8) +#define x7_1 (1, L, x7) + +#define x8__ (_, L, x8) +#define x8_1 (1, L, x9) + +#define x9__ (1, R, x0) +#define x9_1 (1, L, x9) + +#define xa__ (_, R, xa) +#define xa_1 (_, R, xb) + +#define xb__ (_, R, xf) +#define xb_1 (1, R, xc) + +#define xc__ (_, R, xd) +#define xc_1 (1, R, xc) + +#define xd__ (_, L, xe) +#define xd_1 (_, R, xd) + +#define xe__ (_, L, xe) +#define xe_1 (1, L, x7) + +#define xf__ (_, break) +#define xf_1 (_, R, xf) diff --git a/2015/muth/machine_great_3_2.h b/2015/muth/machine_great_3_2.h new file mode 100644 index 000000000..f4ffbe797 --- /dev/null +++ b/2015/muth/machine_great_3_2.h @@ -0,0 +1,16 @@ +/* + * greater machine, http://www.drb.insel.de/~heiner/BB/mabu90.html + * + * does not halt + */ + +#define sym_1(sym, _1) sym + +#define A__ (1, L, B) +#define A_1 (1, R, A) + +#define B__ (_, R, C) +#define B_1 (1, L, B) + +#define C__ (1,break) +#define C_1 (1, R, A) diff --git a/2015/muth/machine_ioccc.h b/2015/muth/machine_ioccc.h new file mode 100644 index 000000000..db3b69fb0 --- /dev/null +++ b/2015/muth/machine_ioccc.h @@ -0,0 +1,40 @@ +#/* + * this is a guide how to choose names for states and symbols + * + * state names must be valid to start a macro identifier, e.g., # is + * invalid, 0 is invalid, _0 is valid (an empty string is also valid) + * + * tape symbols must not be empty and must be valid to end a macro + * name, e.g., # is invalid, 0 is valid, _0 is valid + * + * exception: you can write almost any other sequence of tokens to the + * tape, but you can not scan them back (you can not even define them + * as symbols using the + * + */ define sym_SYMBOL(sym, _SYMBOL) sym +#/* + * syntax) + * + * finally its perfectly ok to define macros for your states like this + * + */ define ANOTHER_NAME_FOR_A A +#/* + * and for your symbols like this + * + */ define FQDN www.ioccc.org. + +#define you can run this example on an empty tape + +#define A__ (SYMBOL, L,) +#define __ (__, ,) +#define ___ (, R, ANOTHER_NAME_FOR_A) +#define A_SYMBOL (\x1b[4mhttp, R, I) +#define I__ (:, R, O ) +#define O__ (/\x2f, R, C) +#define C__ (FQDN, R, Z) +#define Z__ (/, R, L) +#define L__ (index.html, R, _2) +#define _2__ (#enter\x1b[0m, R, _0) +#define _0__ (R(A, tape), R, _1) +#define _1__ ((,), R, _5) +#define _5__ (W(You you!!!), break) diff --git a/2015/muth/machine_nop.h b/2015/muth/machine_nop.h new file mode 100644 index 000000000..5b50a7e51 --- /dev/null +++ b/2015/muth/machine_nop.h @@ -0,0 +1,7 @@ +/* + * minimal Turing machine example + * + * see also: tape_empty.h + */ + +#define A__ (_, break) diff --git a/2015/muth/machine_ru_2_4.h b/2015/muth/machine_ru_2_4.h new file mode 100644 index 000000000..e9523be82 --- /dev/null +++ b/2015/muth/machine_ru_2_4.h @@ -0,0 +1,19 @@ +/* + * 2 state, 4 symbol current runner-up, http://www.logique.jussieu.fr/~michel/ha.html#tm24 + * + * halts after 7195 steps + */ + +#define sym_1(sym, _1) sym +#define sym_2(sym, _2) sym +#define sym_3(sym, _3) sym + +#define A__ (1, R, B) +#define A_1 (3, L, A) +#define A_2 (1, L, A) +#define A_3 (1, R, A) + +#define B__ (2, L, A) +#define B_1 (1,break) +#define B_2 (3, R, A) +#define B_3 (3, R, B) diff --git a/2015/muth/machine_times2.h b/2015/muth/machine_times2.h new file mode 100644 index 000000000..c7dbd7fbc --- /dev/null +++ b/2015/muth/machine_times2.h @@ -0,0 +1,21 @@ +/* + * multiply by 2 + * + * based on http://www.ioccc.org/2001/herrmann1.times2 + */ + +// try tape_five.h + +#define A__ (_, R, A) +#define A_1 (_, L, B) + +#define B__ (1, L, C) + +#define C__ (1, R, D) +#define C_1 (1, L, C) + +#define D__ (_, R, E) +#define D_1 (1, R, D) + +#define E__ (_,break) +#define E_1 (_, L, B) diff --git a/2015/muth/prog.c b/2015/muth/prog.c new file mode 100644 index 000000000..f2b733bcb --- /dev/null +++ b/2015/muth/prog.c @@ -0,0 +1,95 @@ + + + +# define S(M, L, N, R) J(M, P) (L, N, R ) +# define QL(L, R)/* L,*/QR(L, /*N,*/ R)// +# define P( L, N, R) L, N, R// +# define LP( L, N, R) U L, D L, (N, R) +# define R( L, R)W (Y(J(E,X)(K(L, R )))) + +# define RP( L, N, R)(L, N), H R, T R// +# define HP( L, N, R) L, N, R// +# define K( L, R)/* L,*/J(F, V)(L, R)J \ +( Q,sym_ ( K, M ( L, B R))) (L, R ) +# define Q( L, R)/* L,*/QR(L, /*N,*/ R)// + +# define E( X)E3(X) +# define break H , +# define E0(/**/X)X +# define I( X, E) K +# define EX(X)E3(X) + + + + + + +#define E1(_I_)E0 (E0(E0(E0(E0(E0(E0 (E0( _I_ )))))))) +#define E2(_O_)E1 (E1(E1(E1(E1(E1(E1 (E1( _O_ )))))))) +#define E3(_C_)E2 (E2(E2(E2(E2(E2(E2 (E2( _C_ )))))))) + +#define E4(_C_)E3 (E3(E3(E3(E3(E3(E3 (E3( _C_ )))))))) +#define E5(_C_)E4 (E4(E4(E4(E4(E4(E4 (E4( _C_ )))))))) +#define E6(_2_)E5 (E5(E5(E5(E5(E5(E5 (E5( _2_ )))))))) + +#define E7(_0_)E6 (E6(E6(E6(E6(E6(E6 (E6( _0_ )))))))) +#define E8(_1_)E7 (E7(E7(E7(E7(E7(E7 (E7( _1_ )))))))) +#define E9(_5_)E8 (E8(E8(E8(E8(E8(E8 (E8( _5_ )))))))) + +#define QS( L, R) (S (M( L, B R),\ +A R , A J(G(L, _) ,B R), C R )) +#define QR( L, R) I sym_(,)(O, (C, \ +C)) (C J(G(L, _) ,B R),QS(L, R )) + + + + + + +#define sym__(_ , __ ) _ +#define A(A, B , C ) A +#define F(A, _) sym_(_,) + +#define sym_(__ , _ ) _ +#define B(A, B , C ) B +#define J(A, J) G(A, J) + +#define sym___( ___, __) +#define C(A, B , C ) C +#define G(J, G) J ## G + +#define RY(Y) Y +#define Y( Y) Y +#define LY(Y) Y + + + + + + +# define Z( L, R) J (B L, /*N,*/ Y) +# define N( L, R) J (G(L, _), B R) +# define HY(L ) (A L, halting) +# define T( R, L) G(sym_, R)(L, (,)) +# define H( R, L) G(sym_, R)(R, _ ) + +# define M( L, R) B J( G(L, _), R ) +# define D( L, R) G(sym_, R)(R, _ ) +# define U( L, R) G(sym_, R)(L, (,)) +# define F0(L, R) F( L, /*N,*/R ) +# define F1(L, R) F0( L, /*N,*/R)~ + +# define F2(L, R) F1( L, /*N,*\R)~ +# define F3(L,*/R )R\t\t-> \ +Z (/*)*/ N( L, R) , R) (N( L, R) )\n +# define FV(L, R) F( L, /*N,*/R ) +# define QH(L, R) QS( L, /*N,*/ R) + +int puts (char*); +# define W(W)O(W) +int main () {puts +# define O(W)#W// +( R ( A, tape));} + + + diff --git a/2015/muth/tape_15_50.h b/2015/muth/tape_15_50.h new file mode 100644 index 000000000..34d170ad4 --- /dev/null +++ b/2015/muth/tape_15_50.h @@ -0,0 +1,7 @@ +#define sym_1(sym, _1) sym + +#define tape ( (,), /* +15: */ 1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, /* +blank: */ (_, /* +50: */ (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, /* + */ (,)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ) diff --git a/2015/muth/tape_77_55.h b/2015/muth/tape_77_55.h new file mode 100644 index 000000000..81b678ed4 --- /dev/null +++ b/2015/muth/tape_77_55.h @@ -0,0 +1,7 @@ +#define sym_1(sym, _1) sym + +#define tape ( (,), /* +77: */ 1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1, /* +blank: */ (_, /* +55: */ (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, (1,(1,(1,(1,(1, /* + */ (,))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ) diff --git a/2015/muth/tape_empty.h b/2015/muth/tape_empty.h new file mode 100644 index 000000000..20f70a0ad --- /dev/null +++ b/2015/muth/tape_empty.h @@ -0,0 +1 @@ +#define tape ((,), _, (,)) diff --git a/2015/muth/tape_five.h b/2015/muth/tape_five.h new file mode 100644 index 000000000..c612d19f0 --- /dev/null +++ b/2015/muth/tape_five.h @@ -0,0 +1,3 @@ +#define sym_1(sym, _1) sym + +#define tape ((,), 1, (1, (1, (1, (1, (,)))))) diff --git a/2015/rules.txt b/2015/rules.txt new file mode 100644 index 000000000..50fa21453 --- /dev/null +++ b/2015/rules.txt @@ -0,0 +1,262 @@ +| 24th International Obfuscated C Code Contest Official Rules + +| Copyright (C) 2006-2015 Leonid A. Broukhis, Simon Cooper, Landon Curt Noll + +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in +writing from the contest judges. + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: his emotions obfuscated his + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + + +| This rules file is version 2015-05-27-v23. + +| Most of the changes from the previous IOCCC rules +| been marked with a "|" on the left hand side of the line. + + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show the importance of programming style, in an ironic way. + * To stress C compilers with unusual code. + * To illustrate some of the subtleties of the C language. + * To provide a safe forum for poor C code. :-) + +| This IOCCC runs from: +| +| 2015-Jul-08 09:10:11.12 +/- .13 seconds UTC +| to: +| 2015-Oct-10 10:10:10.10 +/- .10 seconds UTC. +| +| Until the start of this IOCCC, these rules, guidelines and iocccsize.c tool +| should be considered provisional BETA versions and may be adjusted +| at any time. +| +| The IOCCC submission URL: +| +| https://submit.ioccc.org/ +| +| will be available and active on or slightly before the start of this IOCCC. +| +| The official rules, guidelines and iocccsize.c tool will be available +| on the official IOCCC web site on or slightly before start of this IOCCC. +| Please check the IOCCC web site "How to enter" link: +| +| http://www.ioccc.org/index.html#enter +| +| on or after the start of this IOCCC to be sure you are using the correct +| versions of these items before using the IOCCC entry submission URL. + + +RULES: + + To help us with the volume of entries, we ask that you follow these rules: + + 1) Your entry must be a complete program. + + 2) The size of your program source must be <= 4096 bytes in length. + + When your program source is fed as input to the current IOCCC size + tool, and the IOCCC size tool -i command line option is used, the value +| printed shall be less than or equal to 2053. + + The source to the current IOCCC size tool is found at this URL: + +| http://www.ioccc.org/2015/iocccsize.c + + 3) Submissions should be performed using the instructions outlined at: + + https://submit.ioccc.org/ + +| That URL should be active on or slightly before 2015-Sep-09 09:09:09 UTC. + + 4) If your entry is selected as a winner, it will be modified as follows: + + Your 'build' instructions will be incorporated into a makefile. + +| Your source code will be the file prog.c. The compiled binary +| will be called prog. + + 5) Your entry must not modify the content or filename of any part of your + original entry including, but not limited to prog.c, the Makefile + (we create from your how to build instructions), as well as any data + files you submit. + + If you entry wishes to modify such content, it must first copy the + file to a new filename and then modify that copy. + +| 6) I am not a rule, I am a free(void *man)!! + +| while (!understand(ioccc(rule(UR(number(6)))))) { laugh(); } + + 7) The obfuscated C program must be an original work that you own. + + You (the authors) must own the contents of your submission OR + you must have permission from the owners to submit their content + under the Creative Commons Attribution-ShareAlike 3.0 Unported + (CC BY-SA 3.0) license (see rule 18). + + If you submit any content that is owned by others, you MUST + detail that ownership (i.e., who owns what) and document the + permission you obtained. + +| 8) Entries must be received prior to the end if this IOCCC which is: +| +| 2015-Oct-10 10:10:10.10 +/-.10 seconds UTC + +| A confirmation of submission will be sent to the submitter + email address before the close of the contest. + +| 9) Each person may submit up to and including 8.000 entries per contest. + Each entry must be submitted separately. + + 10) Entries requiring human interaction to be initially compiled are + not permitted. + + 11) Programs that require special privileges (setuid, setgid, super-user, + special owner, special group, etc.) are still highly discouraged. We + do not guarantee these functions will behave as you expect on our test + platforms. If your program needs special permissions please document + them in the remarks file. + + 12) Legal abuse of the rules is somewhat encouraged. An entry that, in + the opinion of the judges, violates the rules will be disqualified. + Entries that attempt to abuse the rules must try to justify why + their rule abuse is legal in the remarks file. + + 13) Any C source that fails to compile because of unescaped octets with + the high bit set (octet value >= 128) will be rejected. + + 14) Any C source that fails to compile because of lines with trailing + control-M's (i.e., lines with a tailing octet 015) will be rejected. + +| Please do not put trailing control-M's on remarks file lines. +| Please check to be sure, before submitting, that you have removed +| any control-M at the end of remark file lines. + + 15) When you submit your entry you must have a valid email address + that can both send and receive email. The online submission + method is a two phase process that requires the use of an + approval code. This code will be emailed to you as part of + phase 1. + + Entries submitted without a working or valid email address will + be disqualified. + + The judges are not responsible for delays in email, please plan + enough time for one automated exchange of email as part of your + submission. + + After your email address has been confirmed, the submission code will + be valid for submitting and editing the entry for the lifetime of the + competition. + + 16) You are STRONGLY encouraged to submit a previously unpublished and + original entry. Submissions that are similar to previous entries are + discouraged. As we judge anonymously, submissions that have already + been published may be disqualified. + + 17) The total size of your submission: the sum of the size of the program, + hints, comments, build and info files MUST be less than or equal + to 1048576 octets in size. + + 18) The entirety of your entry must be submitted under the Creative Commons + Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0): + + http://creativecommons.org/licenses/by-sa/3.0/ + + You must not submit anything that cannot be submitted under that license. + + 19) The remarks file must be written in markdown format. See: + + http://daringfireball.net/projects/markdown/basics + + for more information. + + We currently use "Discount" to convert markdown to HTML + + http://www.pell.portland.or.us/~orc/Code/discount/ + + 20) The how to build instructions must be in make form. + + The target of the make file must be called prog. The original + C source file must be called prog.c. + + To invoke the C compiler, use ${CC}. + To invoke the C preprocessor use ${CPP}. + + Do not assume that . (the current working directory) is in the $PATH. + + Use a shell command syntax that is compatible with bash. + + Assume that commands commonly found in POSIX-like / Linux-like systems + are available in the search path. + + Do not assume any particular given value of ${CFLAGS} or other + commonly used make variables. + + 21) Your entry must not create nor modify files above the current directory + with the exception of the /tmp and the /var/tmp directories. Your entry + may create subdirectories below the current directory, or in /tmp, + or in /var/tmp provided that "." is not the first octet in any + directory name. + +| 22) Your source code, data files, remarks and program output must NOT +| identify the authors of your code. The judges STRONGLY prefer to +| not know who is submitting entries to the IOCCC. + +| The "Peter Honeyman is exempt" guideline also applies to this rule. +| Identifying yourself, in an obvious way in your code, data, remarks +| or program output, unless you are Peter Honeyman or pretending +| to be Peter Honeyman, will be grounds for disqualification of your entry. + +| 23) This prime rule number is reserved for future use. + +| 24) Even though 24 is not prime, you should still see rule #23. + + +FOR MORE INFORMATION: + + The judging will be done by Leonid A. Broukhis, Simon Cooper, Landon + Curt Noll. + + Please send questions or comments about the contest, to: + +| q.2015@ioccc.org (for questions only!) + + You must include the words: + +| ioccc 2015 question + + in the subject of your EMail message when sending EMail to the judges. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, visit the IOCCC web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + For the updates and breaking IOCCC news, you are encouraged to follow + the twitter handle: + + @IOCCC + + You do not have to be a twitter user to follow @IOCCC. Non-twitter + users should access: + + https://twitter.com/ioccc + + Non-twitter users should force their browsers to reload the above URL + to be sure they are seeing the most recent tweets. + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ diff --git a/2015/schweikhardt/Makefile b/2015/schweikhardt/Makefile new file mode 100644 index 000000000..1d0761376 --- /dev/null +++ b/2015/schweikhardt/Makefile @@ -0,0 +1,254 @@ +#!/usr/bin/env make +# +# 2015 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +#SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +CSILENCE= + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 +#CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +#CDEFINE= +CDEFINE= -Dtyp=uint64_t + +# include files that are needed to compile +# +CINCLUDE= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +CSRC= ${ENTRY}.c +OBJ= ${ENTRY}.o +DATA= +ALT_OBJ= +ALT_ENTRY= +TARGET= ${ENTRY} + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +${ENTRY}: ${CSRC} + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from not failing to be unable to not partly misunderstand this particular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v5; \ + else \ + echo "planet deniers, like the IAU, are amusing"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2015/schweikhardt/hint.html b/2015/schweikhardt/hint.html new file mode 100644 index 000000000..9e3ff3483 --- /dev/null +++ b/2015/schweikhardt/hint.html @@ -0,0 +1,813 @@ + + + + + + + Best Documented + + +

    Best Documented

    + +

    Jens Schweikhardt
    +http://www.schweikhardt.net

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./prog n
    +
    +where n is a base 16 number of any size
    +
    + +

    Try:

    + +
    ./prog 19
    +
    + +

    Selected Judges Remarks:

    + +

    This code is clean. When you compile with all warnings enabled, +such as with clang:

    + +

    cc -Weverything -pedantic -std=c11 -Dtyp=uint64_t -O3 prog.c -o prog

    + +

    The code compiles without warnings on the systems that we tested!

    + +

    Even more, the code was 100% clean when we ran it against various +static source checkers.

    + +

    This tool references a problem that David I. Bell once described +as having one of the largest “yummo quotients” in number theory:

    + +
                         complexity of the solution
    +yummo quotient = -----------------------------------
    +                 complexity of the problem statement
    +
    + +

    Erdős privately told one of the IOCCC judges:

    + +

    “Solving the Generalized Riemann hypothesis +would be a good warmup exercise for someone to get ready +to begin to work on the Collatz conjecture.”

    + +

    You may explore this famous conjecture using this entry:

    + +
    ./prog 2410
    +./prog abfff
    +./prog 27f8cebf
    +./prog 246f8fddf
    +./prog 2e95ab51ffea9de
    +./prog e6a5c22fd7bde9f
    +./prog 1b7dd73a937485bf
    +./prog 7d3237680d190a77e53751b
    +./prog 302ab3d052fb87c06228d249581be0e4
    +
    + +

    When you first look at the source, the code looks fairly straightforward. +But look again. Like the Collatz conjecture, simplicity is deceptive! +Oh, and the variable names? They are not simple single letter variables, +they are names of various Proteinogenic amino +acid: +which is yet another simple building block that can be used to +build some very complex structures. :-)

    + +

    p.s. We appreciated that apart from a few powers of 2, the source +code is magic number free.

    + +

    Author’s comments:

    + +

    The TL;DR version

    + +

    This is the cleanest program ever submitted. If for some input it enters +a non-terminating loop or runs out of memory you will be insta-famous. +It’s a bit like a lottery without the need to buy a ticket and you can +play as often as you like. One notable historic person has even offered +some prize money.

    + +

    The program illustrates the bloat caused by adherence to too many rules, +each of which may sound sane in isolation, but in their entirety lead to +an obfuscated, hard to read and understand monster.

    + +

    What this program does.

    + +

    The program tests whether a given natural number satisfies the +Collatz Conjecture:

    + +

    Take any natural number n. If n is even, divide it by 2 to get n/2. +If n is odd, multiply it by 3 and add 1 to obtain 3n + 1. +Repeat the process indefinitely. +The conjecture is that no matter what number you start with, +you eventually reach 1.

    + +

    Paul ErdÅ‘s said about the Collatz conjecture: +“Mathematics may not be ready for such problems.” +He also offered $500 for its solution.

    + +

    For example, the sequence of numbers for n = 6 is

    + +

    6, 3, 10, 5, 16, 8, 4, 2, 1.

    + +

    Continuing past one leads to the cycle 1, 4, 2, 1, 4, 2, 1, … +Interesting factoid: if you allow negative start values, there are +a few more cycles, each of different length:

    + +

    −1, −2, −1

    + +

    −5, −14, −7, −20, −10, −5

    + +

    −17, −50, −25, −74, −37, −110, −55, −164, −82, −41, −122, −61, −182, −91, −272, −136, −68, −34, −17

    + +

    The program computes the sequence for a given positive natural number +and stops at 1. The number n is specified in hexadecimal (without 0x +prefix) as the first argument. The program prints the given number in +zero-padded hex and each iteration along with a line count in decimal. +The example above looks like this (compiled with 64 bit word size):

    + +
    $ ./prog 6
    +0000000000000006
    +0000000000000003 1
    +000000000000000A 2
    +0000000000000005 3
    +0000000000000010 4
    +0000000000000008 5
    +0000000000000004 6
    +0000000000000002 7
    +0000000000000001 8
    +
    + +

    The size of n is only limited by the argument size limit of your +shell/OS (the program implements arbitrary size bignums). +To query this on your POSIX system, run

    + +
    $ getconf ARG_MAX
    +262144
    +
    + +

    which reports the limit in bytes, here 256KB. This allows to test +whether a Googol, which is +10100, satisfies the conjecture. But what is a googol in hex? +Fear not, +bc(1) +to the rescue:

    + +
    $ printf 'obase=16;10^100\n' | bc
    +1249AD2594C37CEB0B2784C4CE0BF38ACE408E211A7CAAB24308A82E8F1000000000\
    +0000000000000000
    +$ ./prog 1249AD2594C37CEB0B2784C4CE0BF38ACE408E211A7CAAB24308A82E8F10000000000000000000000000 \
    +| less
    +[...]
    +
    + +

    Observe how the first 100 iterations melt the zeros to the right. Can you explain +why?

    + +

    For a given n the program behavior is one of the following 3:

    + +
      +
    1. The sequence stops at 1. No fame. No money. Thanks for playing. Computational +mathematicians have tested all n < 4FFDD776055A0000 (~1018) +so don’t try anything less than that.
    2. +
    3. The chosen n leads to a sequence with ever bigger numbers, +so that eventually the bignum cannot be stored in memory. If this happens, +the program outputs laugh (more likely) or throw up (less likely) and +stops. You might have found +a number for which the sequence diverges. If confirmed, this disproves the +conjecture.
    4. +
    5. The chosen n leads to a cycle not including 1 (i.e. runs forever, +repeating the same sequence over and over). You have disproved the +conjecture and should certainly submit a paper to the nearest +mathematical journal.
    6. +
    + + +

    Design objectives

    + +

    I gave myself the following objectives. Like in real world programming, +not all of them can be met 100%. Think of them as a multidimensional +continuum, where trade-offs have to be made.

    + +
      +
    1. No arbitrary limits on the input number. 64 bits might be enough +for everybody, but is not enough for exploring new Collatz-territory. +Thus bignums are required.
    2. +
    3. Ultra-portable. Must run on C89 systems and self-adapt to C99 and C11 +features like exact width types.
    4. +
    5. Super-efficient. Must be able to run with the widest type as the +base of the bignums. Make the user select the widest type supported +by the implementation and then crunch away. If a non-standard +128bit type is available, it should be usable.
    6. +
    7. Pentagon level lint cleanliness and MISRA compliance.
    8. +
    9. Easy to understand, self-documenting clear code. A joy for maintenance +programmers. The epitome of best practice demonstration for all +future textbooks on C.
    10. +
    + + +

    Program Obfuscation

    + +

    In the following I address all the tests as specified by your honors in the +guidelines.

    + +
      +
    • look at the original source
    • +
    • convert ANSI tri-graphs to ASCII
    • +
    • C pre-process the source ignoring #include lines
    • +
    • C pre-process the source ignoring #define and #include lines
    • +
    • run it through a C beautifier
    • +
    • examine the algorithm
    • +
    • compile it (with flags to enable all warnings)
    • +
    • execute it
    • +
    + + +

    Look at the original source

    + +

    Using one letter identifiers is quite old. I decided to use TLI (three +letter identifiers). Not the random kind, rather with a connection to +the meaning of life, the universe and the rest. Enter amino acids! Among +the myriad of possible amino acids there are 23 from which proteins are +built. In biochemistry, each is assigned a TLI (see Proteinogenic amino +acid):

    + +
    ala Alanine
    +cys Cysteine
    +asp Aspartic acid
    +glu Glutamic acid
    +phe Phenylalanine
    +gly Glycine
    +his Histidine
    +ile Isoleucine
    +lys Lysine
    +leu Leucine
    +met Methionine
    +asn Asparagine
    +pyl Pyrrolysine
    +pro Proline
    +gln Glutamine
    +arg Arginine
    +ser Serine
    +thr Threonine
    +sec Selenocysteine
    +val Valine
    +trp Tryptophan
    +tyr Tyrosine
    +asx Asparagine or Aspartic acid
    +glx Glutamic acid or Glutamine
    +xle Leucine or Isoleucine
    +unk Unknown
    +
    + +

    My own research results complete this list (not yet in Wikipedia due to +the rule “No original +research”):

    + +
    and Androgynine
    +xor Xenoricine
    +not Notanamine
    +tla Triletramine
    +
    + +

    Interestingly, the TLI are the perfect mnemonics for C language source. +For example, met is “Main’s Exit Type” (int), ala is “A Large +Algebraic” (bignum), ile an “Incremented Local Entity” (index +counter), gly means “Grow Larger memorY”, gln is “Grown Larger Now” +(after realloc), not is a “Not Overflowing Type” (recursive!), unk +is the “UNit (Known as 1)”, trp is the “Tabula Rasa Product” (zero), +phe is “Print HEx” and so on.

    + +

    Convert ANSI tri-graphs to ASCII

    + +

    Huh??!

    + +

    C pre-process the source ignoring ‘#include’ lines

    + +

    Wow, an identity operation (except for the <stdint.h> and EOF + __STDC__ +trivialities). Did you gain any insight through this?

    + +

    C pre-process the source ignoring ‘#define’ and ‘#include’ lines

    + +

    #define? Which #define directives? How many 4K source files do you +see that neither use a single #define directive nor abuse the build +file? Even though the “no #define” rule I submitted myself to made it +hard, I could use __LINE__ and stdio macros EOF, L_tmpnam, +BUFSIZ, FILENAME_MAX, TMP_MAX to obfuscate at least something.

    + +

    Run it through a C beautifier

    + +

    Another identity operation. I’ve done it for you already. Use this +.indent.pro with FreeBSD indent:

    + +
    $ cat .indent.pro
    +-bad   /* blank line after decls */
    +-bap   /* blank line after functions */
    +-br    /* braces on if line */
    +-i8    /* indent */
    +-l999  /* line length */
    +-npcs  /* no space after function call names */
    +-npsl  /* don't break procedure type */
    +-ut    /* use tabs */
    +-ce    /* cuddle else */
    +-nip   /* no parameter indentation */
    +-di1   /* declaration indent */
    +-Tand
    +-Tmet
    +-Tthr
    +-Tpro
    +-Tser
    +-Tala
    +
    + +

    It looks like a perfect program should:

    + +
      +
    • two and a half #includes of unsuspicious standard headers
    • +
    • followed by self protection against goofy implementations
    • +
    • followed by a handful of typedefs
    • +
    • and a pair of file scope objects by necessity
    • +
    • prototypes! With parameter names! static for internal linkage even! This must be a first in IOCCC history.
    • +
    • function definitions, main last
    • +
    • everything is fully const-poisoned: automatics, statics, arguments, even main
    • +
    • everything is fully curly braced, even single statements
    • +
    • plenty of meaningful TLC (Three Letter Comments)
    • +
    + + +

    The program contains not a single magic number (only 0 and powers of +2, each power from 1 to 512) which are obvious to competent software +engineers). How many programs have that property? The check for +__STDC_VERSION__ was a bit tough to arrive at, since 199901L has too +many bits set. But I realized that I only needed a number larger than +199409 and less than 199901. 199680 has only 4 bits set and writing it +as (256 + 128 + 4 + 2) * 512 minimizes the character count. That’s what +judges get when they don’t like programs that are longer than they need +to be.

    + +

    Examine the algorithm

    + +

    Spoilers ahead. Duh!

    + +

    Pseudocode, with comments matching those in the C source:

    + +
    /* run */
    +if (non-NULL and nonempty argv[1]) {
    +   n = convert(argv[1])
    +   print n                       /* 2hx */
    +   while (n != 1) {              /* one */
    +      if (n is odd) {            /* odd */
    +         m = deep copy of n      /* cpy */
    +         n <<= 1                 /* shl */
    +         n += m                  /* add */
    +         increment n             /* inc */
    +      } else {                   /* eve */
    +         n >>= 1                 /* shr */
    +      }
    +      print n                    /* 2hx */
    +  }
    +}
    +
    + +

    Bignums are represented as the two member structs

    + +
    typedef struct {
    +     size_t places;   /* number of places in base 2<sup>8*sizeof(type)</sup> */
    +     type  *number;   /* dynamically allocated memory for number */
    +} bignum
    +
    + +

    Compile it (with flags to enable all warnings)

    + +

    Here’s where the program shines brighter than a gamma-ray +burst!

    + +

    I challenge you to throw all kinds of compilers, lints, checkers and +analyzers at my program and make it find the slightest of issues.

    + +

    Is clang -Wall -Wextra -Weverything -Dtyp=uint32_t prog.c all you can +do? Clang has implemented a new warning? Bring it on!

    + +

    Execute it

    + +

    May you win the jackpot!

    + +

    For least surprising results, the execution character set should be +ASCII. The program computes four bits from every character in argv[1] and +interprets them as a hex digit. On ASCII the characters a-f, A-F and 0-9 +are converted as expected.

    + +

    This means however, that the program accepts any string, turns it +into a starting number (which is output as the first line), and starts +crunching. Nothing stops you from executing

    + +
    $ ./prog "$(cat prog.c)"            # Kind of quine?
    +$ ./prog "$(cat rules guidelines)"  # A jackpot? Maybe next year...
    +$ ./prog "$(cat /bin/ls)"           # Number cut short at first NUL byte.
    +
    + +

    In a certain way, the program is character set and encoding agnostic.

    + +

    Assumptions made

    + +
      +
    • The EOF macro from <stdio.h> must expand to negative one since it is used +to decrement a pointer and do some other math. +None of the tools catches this one. The program self-protects against unusual +systems with #if EOF + __STDC__ followed by #error goofy!. In the rare event +your system is goofy, replace all EOF tokens with (-1) and remove the +#error directive.
    • +
    + + +

    While the program works best when bytes/characters are octets and the +number of bits in a type is sizeof(typ) << 3, it will work correctly +on 24bit or 36bit systems with 9 bits/byte, or systems where +sizeof(typ) is 1 even for int and so on. On such systems, it will only +use 8 * sizeof(typ) bits per place. It does not work when CHAR_BIT <= 7.

    + +

    Results of various checkers

    + +

    cppcheck

    + +

    The open source static checker cppcheck +checks various problems with respect to style, performance, portability +and general fishiness. To enable all checks, run

    + +
    $ cppcheck --enable=all --force -I/usr/include -Dtyp=uint32_t prog.c
    +
    + +

    No issues found.

    + +

    flawfinder

    + +

    The open source static checker flawfinder +checks various problems with respect to security like buffer overflows, +function arguments to known troublemaker functions and more. It doesn’t need to +pre-process code, so can be run without the typ macro being defined:

    + +
    $ flawfinder prog.c
    +Flawfinder version 1.31, (C) 2001-2014 David A. Wheeler.
    +Number of rules (primarily dangerous function names) in C/C++ ruleset: 169
    +Examining prog.c
    +FINAL RESULTS:
    +ANALYSIS SUMMARY:
    +No hits found.
    +$
    +
    + +

    valgrind

    + +

    The open source dynamic checker valgrind +runs an executable and verifies all memory accesses and (de)allocations for +proper bounds and memory leaks. +Since the program frees all memory in all possible execution paths, even when +it must bail out, +valgrind should be happy. An early version of my program however reported this:

    + +
    $ valgrind --leak-check=full --show-leak-kinds=all ./prog 6
    +[...]
    +==14615== HEAP SUMMARY:
    +==14615==     in use at exit: 4,096 bytes in 1 blocks
    +==14615==   total heap usage: 4 allocs, 3 frees, 4,108 bytes allocated
    +==14615==
    +==14615== 4,096 bytes in 1 blocks are still reachable in loss record 1 of 1
    +==14615==    at 0x4C236C0: malloc (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
    +==14615==    by 0x4F62175: ??? (in /lib/libc.so.7)
    +==14615==    by 0x4F62073: ??? (in /lib/libc.so.7)
    +==14615==    by 0x4F514EE: ??? (in /lib/libc.so.7)
    +==14615==    by 0x4F51265: vfprintf_l (in /lib/libc.so.7)
    +==14615==    by 0x4F3E001: printf (in /lib/libc.so.7)
    +==14615==    by 0x40101E: phe (in ./prog)
    +==14615==    by 0x400A9F: main (in ./prog)
    +==14615==
    +==14615== LEAK SUMMARY:
    +==14615==    definitely lost: 0 bytes in 0 blocks
    +==14615==    indirectly lost: 0 bytes in 0 blocks
    +==14615==      possibly lost: 0 bytes in 0 blocks
    +==14615==    still reachable: 4,096 bytes in 1 blocks
    +==14615==         suppressed: 0 bytes in 0 blocks
    +==14615==
    +==14615== For counts of detected and suppressed errors, rerun with: -v
    +==14615== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
    +
    + +

    From which I concluded that printf allocated a single 4K block for +which no matching free existed. But how to free memory allocated deep +down in the guts of the Standard I/O library? After some serious head +scratching it hit me. The only chance I have is telling the system I no +longer want to do I/O, maybe then it would free that buffer. A reading +of C99 7.19.5.1, “The fclose function”, was encouraging:

    + +

    Whether or not the call succeeds, the stream is disassociated from the file + and any buffer set by the setbuf or setvbuf function is disassociated from the stream + (and deallocated if it was automatically allocated).

    + +

    So I fclose(stdout) before returning and now:

    + +
    $ valgrind --leak-check=full --show-leak-kinds=all ./prog 6
    +==14571== Memcheck, a memory error detector
    +==14571== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
    +==14571== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
    +==14571== Command: ./prog 6
    +==14571==
    +0000000000000006
    +0000000000000003 1
    +000000000000000A 2
    +0000000000000005 3
    +0000000000000010 4
    +0000000000000008 5
    +0000000000000004 6
    +0000000000000002 7
    +0000000000000001 8
    +==14571==
    +==14571== HEAP SUMMARY:
    +==14571==     in use at exit: 0 bytes in 0 blocks
    +==14571==   total heap usage: 4 allocs, 4 frees, 4,120 bytes allocated
    +==14571==
    +==14571== All heap blocks were freed -- no leaks are possible
    +==14571==
    +==14571== For counts of detected and suppressed errors, rerun with: -v
    +==14571== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
    +
    + +

    A squeaky clean valgrind result!

    + +

    FlexeLint

    + +

    FlexeLint is a commercial lint tool by Gimpel +Software. It supports nearly a +thousand checks, broadly categorized into 4 levels,

    + +
      +
    1. Syntax errors only (messages 1 to 399)
    2. +
    3. Warnings (messages 400 to 699)
    4. +
    5. Informational messages (700 to 899)
    6. +
    7. Elective notes (900 to 1000 and > 9000)
    8. +
    + + +

    There is an on-line +demonstrator you can +use for checking your C programs and I highly recommend trying it. For a start, +paste the well know first program in the form and press “Analyze Code”. Note +the FlexeLint configuration options in comments (no space between /* and lint).

    + +
    /*lint -w4            turn on everything */
    +/*lint +esym(534,*)   no demonstrator defaults */
    +/*lint -e966          indirectly included header file not used */
    +/*lint -esym(9058,_*) tag not used outside typedef */
    +/*lint -misra(2)      */
    +
    +#include <stdio.h>
    +int main(void)
    +{
    +    printf("hello, world\n");
    +    return 0;
    +}
    +
    + +

    Possible checks include those for MISRA 2004 compliance verification. +The Motor Industry Software Reliability +Association +has produced a list of 121 required and 20 advisory +rules for C +programming. I am proud to report that my program fulfills almost all +rules. To assess the few exceptions, one has to understand that MISRA +rules are geared towards embedded systems used in the automotive +industry. That’s why features like malloc and printf are right out. +But that’s too restrictive for an IOCCC hosted application, so I ignored +these:

    + +
      +
    • 17.1 Pointer arithmetic shall only be applied to pointers that address an array or array element.
    • +
    • 17.4 Array indexing shall be the only allowed form of pointer arithmetic.
    • +
    • 20.4 Dynamic heap memory allocation shall not be used.
    • +
    • 20.9 The input/output library stdio.h shall not be used in production code.
    • +
    • 20.11 The functions abort, exit, getenv, and system from the library stdlib.h shall not be used.
    • +
    + + +

    I started out with enabling all messages using FlexeLint’s -w4 +option and disabling all noise from system headers. Then I dealt with +the remaining messages by addressing them or suppressing them in such a way +that the set of suppressions was minimal. At the end of the day, this is +what remained:

    + +
    //  === Tested with FlexeLint 9.00L on FreeBSD 11 ===
    +//  Compiler:
    +//  "4.2.1 Compatible FreeBSD Clang 3.6.1 (tags/RELEASE_361/final 237755)"
    +
    +-w4                          // Enable maximum pickiness
    +-passes(6)                   // Recommended in FlexeLint manual for torture testing
    ++fsc                         // Make string literals have type const char*
    ++fnr                         // ptr-returning functions may return NULL
    +-strong(AJX,and,pro,ser,ala) // strong types
    +-strong(AcJcm,thr)           // thr is strong, but most arithmetic is okay
    +-strong(AarJemorX,met)       // met is strong, but some use is okay
    ++libclass(angle)             // All <headers> are system headers
    +-wlib(1)                     // Only errors for system headers
    +-i/usr/include               // System headers
    +-i/usr/local/lib/supp/ansi   // Comes with FlexeLint
    +-d__GNUC__=4                 // Pretend...
    +-d__GNUC_MINOR__=2           // I'm...
    +-d__GNUC_PATCHLEVEL__=1      // someone else.
    +-d__builtin_va_list=char*    // Fake this compiler extension
    +-d__inline=                  // Delete this compiler extension
    +-d__attribute__(x)=          // Delete this compiler extension
    ++e900                        // Announce number of messages produced
    +
    +//                   MISRA 2004 checking
    +
    +/usr/local/lib/supp/lnt/au-misra2.lnt    // Enable all MISRA checking
    +-elib(960)       // Don't check FreeBSD system headers for required rules
    +-elib(961)       // Don't check FreeBSD system headers for advisory rules
    +-e829            // stdio.h used
    +-e522            // MISRA 14.2 Highest operation, lacks side-effects
    +-esym(960,17.4)  // pointer arithmetic other than array indexing used
    +-e971            // char without signed/unsigned
    +-e974            // stack usage report
    +// Use verboten functions, Req. Rules 20.4 malloc() et al., 20.11, exit()
    +-esym(586,malloc,realloc,calloc,free,exit)
    +
    +-e911            // implicit promotion of smaller than int to int
    +-e921            // cast from integral to integral
    +-e925            // cast from pointer to pointer
    +-e958            // padding required in struct
    +
    ++e9???           // Enable all 9xxx informational messages, except:
    +-e9079           // conversion from pointer to void to pointer to other type
    +-e9087           // cast performed between a pointer to object type and a
    +                 // pointer to a different object type
    +-e9141           // global declaration of symbol
    +
    +//    Messages due to code in FreeBSD headers.
    +//
    +-dlint           // The "lint" macro is tested in x86/_types.h
    +-elib(537)       // Repeated include file
    +-e793            // external identifiers > 6 chars
    +-e935            // (unsigned) int within struct (actually the size_t)
    +-estring(960,_*) // Could be defined at block scope
    +-e964            // Header file not directly used
    +-e966            // Indirectly included header file not used
    +-elib(970)       // int outside typedef
    +-esym(9003,_*)   // could be defined at block scope
    +-elib(9047)      // FILE pointer dereferenced
    +-esym(9058,__*)  // tag not used outside typedef
    +-e9092           // NULL does not expand to a pointer (but plain 0)
    +
    + +

    Compulsory obfuscations

    + +

    Which of the rules cause which obfuscation?

    + +

    MISRA 6.1, “The plain char type shall be used only for the storage and +use of character values.” This forbids using character constants in +expressions other than assignments to char objects. A consequence is +that printing digits with '0' + digit is not allowed (even though +'0' is technically an int!) so I am forced to output hex digits with

    + +
    printf("%c", (met)tyr + 32 + 16 + ((8 + EOF) * ((met)tyr / (8 + 2))));
    +
    + +

    because of the “no magic numbers other than powers of two” rule. How is this +an improvement over printf("%c", '0' + tyr + 7 * (tyr / 10), MISRA?

    + +

    MISRA 6.3 “typedefs that indicate size and signedness should be used in +place of the basic types.” Well, if you can’t infer the size and +signedness from typedef int met, you’re not a real C programmer.

    + +

    MISRA 10.5, “If the bitwise operators ~ and << are applied to an +operand of underlying type unsigned char or unsigned short, the +result shall be immediately cast to the underlying type of the operand.” +Because the program must work for any unsigned type chosen for the typ +macro, including the narrow types enumerated in the rule, a lot of +redundant casting ensues. It gets worse with the next rule…

    + +

    MISRA 12.1, “Limited dependence should be placed on the C operator +precedence rules in expressions.” This requires parentheses for almost +all expressions involving more than one operator, especially those for which +a cast is required, leading to hard to understand expressions such as

    + +
    const ser glx = (ser)((asx > (ser)64u) ? (ser)((ser)asx + (ser)8u + (ser)1u) : (ser)asx);
    +not.not[leu] = (and)((and)not.not[leu] | (and)(((and)glx % (and)16u) << (and)lys));
    +
    + +

    MISRA 14.7, “A function shall have a single point of exit at the end of +the function.” Sigh. Since I must use eloquent prototypes (8.1, 16.3, +16.4) and static functions (8.10, 8.11), I can only use a few functions. +Everything usually written with an early return now cause another +useless indent level. The first three if statements in main cause a +silly 24 character indent. The maximum indent is forced to 8, which is way +too high for a sane function.

    + +

    MISRA 16.10, “If a function returns error information, then that error +information shall be tested.” A cast to void would draw a lint warning, so +I use the printf result in expressions,

    + +
    lys -= 4 * printf("%c", (met)tyr + 32 + 16 + ((8 + EOF) * ((met)tyr / (8 + 2))));
    +val += printf("\n") / ((__LINE__ * L_tmpnam) + TMP_MAX);
    +val -= (printf(" %d\n", val) > BUFSIZ) ? FILENAME_MAX : EOF;
    +
    + +

    which are, in the absence of errors, equivalent to

    + +
    lys -= 4;
    +/*nop*/
    +++val;
    +
    + +

    MISRA 13.1, “Assignment operators shall not be used in expressions that +yield a Boolean value.” Forbids the idiomatic if ((p = malloc(n)) == +NULL) and requires separate statements, in other words, bloat.

    + +

    MISRA 16.7, “A pointer parameter in a function prototype should be +declared as pointer to const if the pointer is not used to modify the +addressed object.” in conjunction with lint’s “Note 952: Parameter could +be declared const” causes const-poisoning for all functions,

    + +
    static void phe(const ala not);
    +static void gly(ala *const not, const and his);
    +met main(met val, const pro *const his[]);
    +
    + +

    and quite a number of automatic variables.

    + +

    Why the “laugh” and “throw up” messages?

    + +

    The guidelines state “We like programs that: make us laugh and/or throw +up :-) (humor really helps!)”

    + +

    If you have a 128 bit type

    + +

    If your compiler supports a 128 bit wide type (e.g. clang, gcc) then +you can use it via the typ macro:

    + +
    clang -Dtyp=__uint128_t -o prog prog.c
    +
    + +

    Indeed, the program can use (and lints clean for) all of

    + +
    clang -Dtyp=uint8_t  -o prog8  prog.c
    +clang -Dtyp=uint16_t -o prog16 prog.c
    +clang -Dtyp=uint32_t -o prog32 prog.c
    +clang -Dtyp=uint64_t -o prog64 prog.c
    +clang -std=c89 -Dtyp="unsigned long" -o prog89 prog.c
    +
    + +

    This works because the program has no need for corresponding SCN or +PRI macros to do the scanning and printing of variables of these +types. With a 128 bit type the program can represent numbers up to +340282366920938463463374607431768211457 (3.4 * 1039) as a +single “place”, enough to explore yet untested numbers for the rest of +your life.

    + +

    How big a number can I test with 4 GB of RAM?

    + +

    The number of hex digits in the start number is limited by ARG_MAX, +probably minus some overhead for the environment variables (use +env(1) +to trim your environment). In bits this leaves you with 24 * +ARG_MAX.

    + +

    The algorithm requires two bignums in memory for addition. +If you hit a divergent number, this will cause out-of-memory (“laugh”) +somewhere near 216,000,000,000 (4GB/2 * 8bits/byte). +Sadly, I don’t have a test case :-)

    + +

    How long would it take to overflow the Not Overflowing Type? Lets +assume we’re processing 2GB numbers. The program copies, shifts by one, +adds and increments 2GB long bit strings, each time completely thrashing +the data cache – at all levels. We have a fast machine that can do an +iteration in one second, on average. To make things easy, we round up +3n + 1 to 4n, and assume we never need to divide by two (which is +quite optimistic). Then each iteration shifts left by 2. This would take +8 billion seconds, or about 250 years. If you want to get famous, you +better remove some of the RAM, use an ancient box, or reduce available +memory resources with the ulimit(1) built-in of your shell.

    + +

    For all intents and purposes, the Not Overflowing Type keeps the promise!

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2016, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2015/schweikhardt/hint.text b/2015/schweikhardt/hint.text new file mode 100644 index 000000000..a7b3b6bd4 --- /dev/null +++ b/2015/schweikhardt/hint.text @@ -0,0 +1,771 @@ +# Best Documented + +Jens Schweikhardt + + + +## Judges' comments: +### To use: + + make + + ./prog n + + where n is a base 16 number of any size + +### Try: + + ./prog 19 + + +### Selected Judges Remarks: + +This code is clean. When you compile with all warnings enabled, +such as with clang: + + cc -Weverything -pedantic -std=c11 -Dtyp=uint64\_t -O3 prog.c -o prog + +The code compiles without warnings on the systems that we tested! + +Even more, the code was 100% clean when we ran it against various +static source checkers. + +This tool references a problem that David I. Bell once described +as having one of the largest "yummo quotients" in number theory: + + complexity of the solution + yummo quotient = ----------------------------------- + complexity of the problem statement + +ErdÅ‘s privately told one of the IOCCC judges: + +"Solving the [Generalized Riemann hypothesis](https://en.wikipedia.org/wiki/Generalized_Riemann_hypothesis#Extended_Riemann_hypothesis_.28ERH.29) +would be a good warmup exercise for someone to get ready +to begin to work on the [Collatz conjecture](https://en.wikipedia.org/wiki/Collatz_conjecture)." + +You may explore this famous conjecture using this entry: + + ./prog 2410 + ./prog abfff + ./prog 27f8cebf + ./prog 246f8fddf + ./prog 2e95ab51ffea9de + ./prog e6a5c22fd7bde9f + ./prog 1b7dd73a937485bf + ./prog 7d3237680d190a77e53751b + ./prog 302ab3d052fb87c06228d249581be0e4 + +When you first look at the source, the code looks fairly straightforward. +But look again. Like the Collatz conjecture, simplicity is deceptive! +Oh, and the variable names? They are not simple single letter variables, +they are names of various [Proteinogenic amino +acid](https://en.wikipedia.org/wiki/Proteinogenic_amino_acid): +which is yet another simple building block that can be used to +build some very complex structures. :-) + +p.s. We appreciated that apart from a few powers of 2, the source +code is magic number free. + +## Author's comments: +The TL;DR version +----------------- + +This is the cleanest program ever submitted. If for some input it enters +a non-terminating loop or runs out of memory you will be insta-famous. +It's a bit like a lottery without the need to buy a ticket and you can +play as often as you like. One notable historic person has even offered +some prize money. + +The program illustrates the bloat caused by adherence to too many rules, +each of which may sound sane in isolation, but in their entirety lead to +an obfuscated, hard to read and understand monster. + +What this program does. +----------------------- + +The program tests whether a given natural number satisfies the +[Collatz Conjecture](https://en.wikipedia.org/wiki/Collatz_conjecture): + +Take any natural number *n*. If *n* is even, divide it by 2 to get *n*/2. +If *n* is odd, multiply it by 3 and add 1 to obtain 3*n* + 1. +Repeat the process indefinitely. +The conjecture is that no matter what number you start with, +you eventually reach 1. + +Paul ErdÅ‘s said about the Collatz conjecture: +"Mathematics may not be ready for such problems." +He also offered $500 for its solution. + +For example, the sequence of numbers for *n* = 6 is + +> 6, 3, 10, 5, 16, 8, 4, 2, 1. + +Continuing past one leads to the *cycle* 1, 4, 2, 1, 4, 2, 1, ... +Interesting factoid: if you allow *negative* start values, there are +a few more cycles, each of different length: + +> −1, −2, −1 +> +> −5, −14, −7, −20, −10, −5 +> +> −17, −50, −25, −74, −37, −110, −55, −164, −82, −41, −122, −61, −182, −91, −272, −136, −68, −34, −17 + +The program computes the sequence for a given positive natural number +and stops at 1. The number *n* is specified in hexadecimal (without 0x +prefix) as the first argument. The program prints the given number in +zero-padded hex and each iteration along with a line count in decimal. +The example above looks like this (compiled with 64 bit word size): + + $ ./prog 6 + 0000000000000006 + 0000000000000003 1 + 000000000000000A 2 + 0000000000000005 3 + 0000000000000010 4 + 0000000000000008 5 + 0000000000000004 6 + 0000000000000002 7 + 0000000000000001 8 + +The size of *n* is only limited by the argument size limit of your +shell/OS (the program implements arbitrary size bignums). +To query this on your POSIX system, run + + $ getconf ARG_MAX + 262144 + +which reports the limit in bytes, here 256KB. This allows to test +whether a [Googol](https://en.wikipedia.org/wiki/Googol), which is +10100, satisfies the conjecture. But what is a googol in hex? +Fear not, +[bc(1)](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html) +to the rescue: + + $ printf 'obase=16;10^100\n' | bc + 1249AD2594C37CEB0B2784C4CE0BF38ACE408E211A7CAAB24308A82E8F1000000000\ + 0000000000000000 + $ ./prog 1249AD2594C37CEB0B2784C4CE0BF38ACE408E211A7CAAB24308A82E8F10000000000000000000000000 \ + | less + [...] + +Observe how the first 100 iterations melt the zeros to the right. Can you explain +why? + +For a given *n* the program behavior is one of the following 3: + +1. The sequence stops at 1. No fame. No money. Thanks for playing. Computational + mathematicians have tested all *n* < 4FFDD776055A0000 (~1018) + so don't try anything less than that. +2. The chosen *n* leads to a sequence with ever bigger numbers, + so that eventually the bignum cannot be stored in memory. If this happens, + the program outputs `laugh` (more likely) or `throw up` (less likely) and + stops. You *might* have found + a number for which the sequence *diverges*. If confirmed, this disproves the + conjecture. +3. The chosen *n* leads to a cycle not including 1 (i.e. runs forever, + repeating the same sequence over and over). You have disproved the + conjecture and should certainly submit a paper to the nearest + mathematical journal. + + +Design objectives +----------------- + +I gave myself the following objectives. Like in real world programming, +not all of them can be met 100%. Think of them as a multidimensional +continuum, where trade-offs have to be made. + +1. No arbitrary limits on the input number. 64 bits might be enough + for everybody, but is not enough for exploring new Collatz-territory. + Thus bignums are required. +2. Ultra-portable. Must run on C89 systems and self-adapt to C99 and C11 + features like exact width types. +3. Super-efficient. Must be able to run with the widest type as the + base of the bignums. Make the user select the widest type supported + by the implementation and then crunch away. If a non-standard + 128bit type is available, it should be usable. +4. Pentagon level lint cleanliness and MISRA compliance. +5. Easy to understand, self-documenting clear code. A joy for maintenance + programmers. The epitome of best practice demonstration for all + future textbooks on C. + +Program Obfuscation +=================== + +In the following I address all the *tests* as specified by your honors in the +*guidelines*. + + * look at the original source + * convert ANSI tri-graphs to ASCII + * C pre-process the source ignoring `#include` lines + * C pre-process the source ignoring `#define` and `#include` lines + * run it through a C beautifier + * examine the algorithm + * compile it (with flags to enable all warnings) + * execute it + +Look at the original source +--------------------------- + +Using one letter identifiers is quite old. I decided to use TLI (three +letter identifiers). Not the random kind, rather with a connection to +the meaning of life, the universe and the rest. Enter amino acids! Among +the myriad of possible amino acids there are 23 from which proteins are +built. In biochemistry, each is assigned a TLI (see [Proteinogenic amino +acid](https://en.wikipedia.org/wiki/Proteinogenic_amino_acid)): + + ala Alanine + cys Cysteine + asp Aspartic acid + glu Glutamic acid + phe Phenylalanine + gly Glycine + his Histidine + ile Isoleucine + lys Lysine + leu Leucine + met Methionine + asn Asparagine + pyl Pyrrolysine + pro Proline + gln Glutamine + arg Arginine + ser Serine + thr Threonine + sec Selenocysteine + val Valine + trp Tryptophan + tyr Tyrosine + asx Asparagine or Aspartic acid + glx Glutamic acid or Glutamine + xle Leucine or Isoleucine + unk Unknown + +My own research results complete this list (not yet in Wikipedia due to +the rule "[No original +research](https://en.wikipedia.org/wiki/Wikipedia:No_original_research)"): + + and Androgynine + xor Xenoricine + not Notanamine + tla Triletramine + +Interestingly, the TLI are the perfect mnemonics for C language source. +For example, `met` is "Main's Exit Type" (`int`), `ala` is "A Large +Algebraic" (bignum), `ile` an "Incremented Local Entity" (index +counter), `gly` means "Grow Larger memorY", `gln` is "Grown Larger Now" +(after realloc), `not` is a "Not Overflowing Type" (recursive!), `unk` +is the "UNit (Known as 1)", `trp` is the "Tabula Rasa Product" (zero), +`phe` is "Print HEx" and so on. + +Convert ANSI tri-graphs to ASCII +-------------------------------- + +Huh??! + +C pre-process the source ignoring '#include' lines +-------------------------------------------------- + +Wow, an identity operation (except for the `` and `EOF + __STDC__` +trivialities). Did you gain any insight through this? + +C pre-process the source ignoring '#define' and '#include' lines +---------------------------------------------------------------- + +`#define`? Which `#define` directives? How many 4K source files do you +see that neither use a single `#define` directive *nor* abuse the build +file? Even though the "no `#define`" rule I submitted myself to made it +hard, I could use `__LINE__` and stdio macros `EOF`, `L_tmpnam`, +`BUFSIZ`, `FILENAME_MAX`, `TMP_MAX` to obfuscate at least something. + +Run it through a C beautifier +----------------------------- + +Another identity operation. I've done it for you already. Use this +`.indent.pro` with FreeBSD indent: + + $ cat .indent.pro + -bad /* blank line after decls */ + -bap /* blank line after functions */ + -br /* braces on if line */ + -i8 /* indent */ + -l999 /* line length */ + -npcs /* no space after function call names */ + -npsl /* don't break procedure type */ + -ut /* use tabs */ + -ce /* cuddle else */ + -nip /* no parameter indentation */ + -di1 /* declaration indent */ + -Tand + -Tmet + -Tthr + -Tpro + -Tser + -Tala + +It looks like a perfect program should: + + * two and a half `#includes` of unsuspicious standard headers + * followed by self protection against goofy implementations + * followed by a handful of `typedef`s + * and a pair of file scope objects by necessity + * prototypes! With parameter names! `static` for internal linkage even! This __must__ be a first in IOCCC history. + * function definitions, `main` last + * everything is fully const-poisoned: automatics, statics, arguments, even `main` + * everything is fully curly braced, even single statements + * plenty of meaningful TLC (Three Letter Comments) + +The program contains not a single *magic number* (only 0 and powers of +2, each power from 1 to 512) which are obvious to competent software +engineers). How many programs have *that* property? The check for +`__STDC_VERSION__` was a bit tough to arrive at, since 199901L has too +many bits set. But I realized that I only needed a number larger than +199409 and less than 199901. 199680 has only 4 bits set and writing it +as (256 + 128 + 4 + 2) * 512 minimizes the character count. That's what +judges get when they don't like programs that are longer than they need +to be. + +Examine the algorithm +--------------------- + +Spoilers ahead. Duh! + +Pseudocode, with comments matching those in the C source: + + /* run */ + if (non-NULL and nonempty argv[1]) { + n = convert(argv[1]) + print n /* 2hx */ + while (n != 1) { /* one */ + if (n is odd) { /* odd */ + m = deep copy of n /* cpy */ + n <<= 1 /* shl */ + n += m /* add */ + increment n /* inc */ + } else { /* eve */ + n >>= 1 /* shr */ + } + print n /* 2hx */ + } + } + +Bignums are represented as the two member structs + + typedef struct { + size_t places; /* number of places in base 28*sizeof(type) */ + type *number; /* dynamically allocated memory for number */ + } bignum + +Compile it (with flags to enable all warnings) +---------------------------------------------- + +Here's where the program shines brighter than a [gamma-ray +burst](https://en.wikipedia.org/wiki/Gamma-ray_burst)! + +I challenge you to throw all kinds of compilers, lints, checkers and +analyzers at my program and make it find the slightest of issues. + +Is `clang -Wall -Wextra -Weverything -Dtyp=uint32_t prog.c` all you can +do? Clang has implemented a new warning? Bring it on! + + +Execute it +---------- + +May you win the jackpot! + +For least surprising results, the execution character set should be +ASCII. The program computes four bits from every character in `argv[1]` and +interprets them as a hex digit. On ASCII the characters a-f, A-F and 0-9 +are converted as expected. + +This means however, that the program accepts __any string__, turns it +into a starting number (which is output as the first line), and starts +crunching. Nothing stops you from executing + + $ ./prog "$(cat prog.c)" # Kind of quine? + $ ./prog "$(cat rules guidelines)" # A jackpot? Maybe next year... + $ ./prog "$(cat /bin/ls)" # Number cut short at first NUL byte. + +In a certain way, the program is character set and encoding agnostic. + +Assumptions made +---------------- + +* The `EOF` macro from `` must expand to negative one since it is used + to decrement a pointer and do some other math. + None of the tools catches this one. The program self-protects against unusual + systems with `#if EOF + __STDC__` followed by `#error goofy!`. In the rare event + your system is goofy, replace all `EOF` tokens with `(-1)` and remove the + `#error` directive. + + +While the program works best when bytes/characters are octets and the +number of bits in a type is `sizeof(typ) << 3`, it will work correctly +on 24bit or 36bit systems with 9 bits/byte, or systems where +`sizeof(typ)` is 1 even for `int` and so on. On such systems, it will only +use 8 * `sizeof(typ)` bits per place. It does not work when `CHAR_BIT <= 7`. + + +Results of various checkers +--------------------------- + +### cppcheck + +The open source static checker [cppcheck](http://cppcheck.sourceforge.net/) +checks various problems with respect to style, performance, portability +and general fishiness. To enable all checks, run + + $ cppcheck --enable=all --force -I/usr/include -Dtyp=uint32_t prog.c + +No issues found. + +### flawfinder + +The open source static checker [flawfinder](http://www.dwheeler.com/flawfinder/) +checks various problems with respect to security like buffer overflows, +function arguments to known troublemaker functions and more. It doesn't need to +pre-process code, so can be run without the `typ` macro being defined: + + $ flawfinder prog.c + Flawfinder version 1.31, (C) 2001-2014 David A. Wheeler. + Number of rules (primarily dangerous function names) in C/C++ ruleset: 169 + Examining prog.c + FINAL RESULTS: + ANALYSIS SUMMARY: + No hits found. + $ + +### valgrind + +The open source dynamic checker [valgrind](http://valgrind.org/) +runs an executable and verifies all memory accesses and (de)allocations for +proper bounds and memory leaks. +Since the program frees all memory in all possible execution paths, even when +it must bail out, +valgrind should be happy. An early version of my program however reported this: + + $ valgrind --leak-check=full --show-leak-kinds=all ./prog 6 + [...] + ==14615== HEAP SUMMARY: + ==14615== in use at exit: 4,096 bytes in 1 blocks + ==14615== total heap usage: 4 allocs, 3 frees, 4,108 bytes allocated + ==14615== + ==14615== 4,096 bytes in 1 blocks are still reachable in loss record 1 of 1 + ==14615== at 0x4C236C0: malloc (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so) + ==14615== by 0x4F62175: ??? (in /lib/libc.so.7) + ==14615== by 0x4F62073: ??? (in /lib/libc.so.7) + ==14615== by 0x4F514EE: ??? (in /lib/libc.so.7) + ==14615== by 0x4F51265: vfprintf_l (in /lib/libc.so.7) + ==14615== by 0x4F3E001: printf (in /lib/libc.so.7) + ==14615== by 0x40101E: phe (in ./prog) + ==14615== by 0x400A9F: main (in ./prog) + ==14615== + ==14615== LEAK SUMMARY: + ==14615== definitely lost: 0 bytes in 0 blocks + ==14615== indirectly lost: 0 bytes in 0 blocks + ==14615== possibly lost: 0 bytes in 0 blocks + ==14615== still reachable: 4,096 bytes in 1 blocks + ==14615== suppressed: 0 bytes in 0 blocks + ==14615== + ==14615== For counts of detected and suppressed errors, rerun with: -v + ==14615== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) + +From which I concluded that `printf` allocated a single 4K block for +which no matching free existed. But how to free memory allocated deep +down in the guts of the Standard I/O library? After some serious head +scratching it hit me. The only chance I have is telling the system I no +longer want to do I/O, maybe then it would free that buffer. A reading +of C99 7.19.5.1, "The fclose function", was encouraging: + +> Whether or not the call succeeds, the stream is disassociated from the file +> and any buffer set by the `setbuf` or `setvbuf` function is disassociated from the stream +> (and deallocated if it was automatically allocated). + +So I `fclose(stdout)` before returning and now: + + $ valgrind --leak-check=full --show-leak-kinds=all ./prog 6 + ==14571== Memcheck, a memory error detector + ==14571== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. + ==14571== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info + ==14571== Command: ./prog 6 + ==14571== + 0000000000000006 + 0000000000000003 1 + 000000000000000A 2 + 0000000000000005 3 + 0000000000000010 4 + 0000000000000008 5 + 0000000000000004 6 + 0000000000000002 7 + 0000000000000001 8 + ==14571== + ==14571== HEAP SUMMARY: + ==14571== in use at exit: 0 bytes in 0 blocks + ==14571== total heap usage: 4 allocs, 4 frees, 4,120 bytes allocated + ==14571== + ==14571== All heap blocks were freed -- no leaks are possible + ==14571== + ==14571== For counts of detected and suppressed errors, rerun with: -v + ==14571== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) + +A squeaky clean valgrind result! + +### FlexeLint + +FlexeLint is a commercial lint tool by [Gimpel +Software](http://www.gimpel.com/html/index.htm). It supports nearly a +thousand checks, broadly categorized into 4 levels, + + 1. Syntax errors only (messages 1 to 399) + 2. Warnings (messages 400 to 699) + 3. Informational messages (700 to 899) + 4. Elective notes (900 to 1000 and > 9000) + +There is an [on-line +demonstrator](http://www.gimpel-online.com/OnlineTesting.html) you can +use for checking your C programs and I highly recommend trying it. For a start, +paste the well know first program in the form and press "Analyze Code". Note +the FlexeLint configuration options in comments (no space between `/*` and `lint`). + + /*lint -w4 turn on everything */ + /*lint +esym(534,*) no demonstrator defaults */ + /*lint -e966 indirectly included header file not used */ + /*lint -esym(9058,_*) tag not used outside typedef */ + /*lint -misra(2) */ + + #include + int main(void) + { + printf("hello, world\n"); + return 0; + } + + +Possible checks include those for MISRA 2004 compliance verification. +The [Motor Industry Software Reliability +Association](https://en.wikipedia.org/wiki/Motor_Industry_Software_Reliability_Association) +has produced a [list of 121 required and 20 advisory +rules](http://doc.hcc-embedded.com/display/CODING/MISRA+Rules) for C +programming. I am proud to report that my program fulfills *almost all* +rules. To assess the few exceptions, one has to understand that MISRA +rules are geared towards embedded systems used in the automotive +industry. That's why features like `malloc` and `printf` are right out. +But that's too restrictive for an IOCCC hosted application, so I ignored +these: + + * 17.1 Pointer arithmetic shall only be applied to pointers that address an array or array element. + * 17.4 Array indexing shall be the only allowed form of pointer arithmetic. + * 20.4 Dynamic heap memory allocation shall not be used. + * 20.9 The input/output library stdio.h shall not be used in production code. + * 20.11 The functions abort, exit, getenv, and system from the library stdlib.h shall not be used. + +I started out with enabling *all* messages using FlexeLint's `-w4` +option and disabling all noise from system headers. Then I dealt with +the remaining messages by addressing them or suppressing them in such a way +that the set of suppressions was minimal. At the end of the day, this is +what remained: + + + // === Tested with FlexeLint 9.00L on FreeBSD 11 === + // Compiler: + // "4.2.1 Compatible FreeBSD Clang 3.6.1 (tags/RELEASE_361/final 237755)" + + -w4 // Enable maximum pickiness + -passes(6) // Recommended in FlexeLint manual for torture testing + +fsc // Make string literals have type const char* + +fnr // ptr-returning functions may return NULL + -strong(AJX,and,pro,ser,ala) // strong types + -strong(AcJcm,thr) // thr is strong, but most arithmetic is okay + -strong(AarJemorX,met) // met is strong, but some use is okay + +libclass(angle) // All are system headers + -wlib(1) // Only errors for system headers + -i/usr/include // System headers + -i/usr/local/lib/supp/ansi // Comes with FlexeLint + -d__GNUC__=4 // Pretend... + -d__GNUC_MINOR__=2 // I'm... + -d__GNUC_PATCHLEVEL__=1 // someone else. + -d__builtin_va_list=char* // Fake this compiler extension + -d__inline= // Delete this compiler extension + -d__attribute__(x)= // Delete this compiler extension + +e900 // Announce number of messages produced + + // MISRA 2004 checking + + /usr/local/lib/supp/lnt/au-misra2.lnt // Enable all MISRA checking + -elib(960) // Don't check FreeBSD system headers for required rules + -elib(961) // Don't check FreeBSD system headers for advisory rules + -e829 // stdio.h used + -e522 // MISRA 14.2 Highest operation, lacks side-effects + -esym(960,17.4) // pointer arithmetic other than array indexing used + -e971 // char without signed/unsigned + -e974 // stack usage report + // Use verboten functions, Req. Rules 20.4 malloc() et al., 20.11, exit() + -esym(586,malloc,realloc,calloc,free,exit) + + -e911 // implicit promotion of smaller than int to int + -e921 // cast from integral to integral + -e925 // cast from pointer to pointer + -e958 // padding required in struct + + +e9??? // Enable all 9xxx informational messages, except: + -e9079 // conversion from pointer to void to pointer to other type + -e9087 // cast performed between a pointer to object type and a + // pointer to a different object type + -e9141 // global declaration of symbol + + // Messages due to code in FreeBSD headers. + // + -dlint // The "lint" macro is tested in x86/_types.h + -elib(537) // Repeated include file + -e793 // external identifiers > 6 chars + -e935 // (unsigned) int within struct (actually the size_t) + -estring(960,_*) // Could be defined at block scope + -e964 // Header file not directly used + -e966 // Indirectly included header file not used + -elib(970) // int outside typedef + -esym(9003,_*) // could be defined at block scope + -elib(9047) // FILE pointer dereferenced + -esym(9058,__*) // tag not used outside typedef + -e9092 // NULL does not expand to a pointer (but plain 0) + + +Compulsory obfuscations +----------------------- + +Which of the rules cause which obfuscation? + +MISRA 6.1, "The plain char type shall be used only for the storage and +use of character values." This forbids using character constants in +expressions other than assignments to `char` objects. A consequence is +that printing digits with `'0' + digit` is not allowed (even though +`'0'` is technically an `int`!) so I am forced to output hex digits with + + printf("%c", (met)tyr + 32 + 16 + ((8 + EOF) * ((met)tyr / (8 + 2)))); + +because of the "no magic numbers other than powers of two" rule. How is this +an improvement over `printf("%c", '0' + tyr + 7 * (tyr / 10)`, MISRA? + + +MISRA 6.3 "typedefs that indicate size and signedness should be used in +place of the basic types." Well, if you can't infer the size and +signedness from `typedef int met`, you're not a real C programmer. + + +MISRA 10.5, "If the bitwise operators `~` and `<<` are applied to an +operand of underlying type `unsigned char` or `unsigned short`, the +result shall be immediately cast to the underlying type of the operand." +Because the program must work for any unsigned type chosen for the `typ` +macro, including the narrow types enumerated in the rule, a lot of +redundant casting ensues. It gets worse with the next rule... + +MISRA 12.1, "Limited dependence should be placed on the C operator +precedence rules in expressions." This requires parentheses for almost +all expressions involving more than one operator, especially those for which +a cast is required, leading to hard to understand expressions such as + + const ser glx = (ser)((asx > (ser)64u) ? (ser)((ser)asx + (ser)8u + (ser)1u) : (ser)asx); + not.not[leu] = (and)((and)not.not[leu] | (and)(((and)glx % (and)16u) << (and)lys)); + + +MISRA 14.7, "A function shall have a single point of exit at the end of +the function." Sigh. Since I must use eloquent prototypes (8.1, 16.3, +16.4) and static functions (8.10, 8.11), I can only use a few functions. +Everything usually written with an early `return` now cause *another +useless indent level*. The first three `if` statements in `main` cause a +silly 24 character indent. The maximum indent is forced to 8, which is way +too high for a sane function. + + +MISRA 16.10, "If a function returns error information, then that error +information shall be tested." A cast to void would draw a lint warning, so +I use the `printf` result in expressions, + + lys -= 4 * printf("%c", (met)tyr + 32 + 16 + ((8 + EOF) * ((met)tyr / (8 + 2)))); + val += printf("\n") / ((__LINE__ * L_tmpnam) + TMP_MAX); + val -= (printf(" %d\n", val) > BUFSIZ) ? FILENAME_MAX : EOF; + +which are, in the absence of errors, equivalent to + + lys -= 4; + /*nop*/ + ++val; + + +MISRA 13.1, "Assignment operators shall not be used in expressions that +yield a Boolean value." Forbids the idiomatic `if ((p = malloc(n)) == +NULL)` and requires separate statements, in other words, bloat. + + +MISRA 16.7, "A pointer parameter in a function prototype should be +declared as pointer to const if the pointer is not used to modify the +addressed object." in conjunction with lint's "Note 952: Parameter could +be declared const" causes const-poisoning for all functions, + + static void phe(const ala not); + static void gly(ala *const not, const and his); + met main(met val, const pro *const his[]); + +and quite a number of automatic variables. + +### Why the "laugh" and "throw up" messages? + +The guidelines state "We like programs that: make us laugh and/or throw +up :-) (humor really helps!)" + +### If you have a 128 bit type + +If your compiler supports a 128 bit wide type (e.g. clang, gcc) then +you can use it via the `typ` macro: + + clang -Dtyp=__uint128_t -o prog prog.c + +Indeed, the program can use (and lints clean for) all of + + clang -Dtyp=uint8_t -o prog8 prog.c + clang -Dtyp=uint16_t -o prog16 prog.c + clang -Dtyp=uint32_t -o prog32 prog.c + clang -Dtyp=uint64_t -o prog64 prog.c + clang -std=c89 -Dtyp="unsigned long" -o prog89 prog.c + +This works because the program has no need for corresponding `SCN` or +`PRI` macros to do the scanning and printing of variables of these +types. With a 128 bit type the program can represent numbers up to +340282366920938463463374607431768211457 (3.4 * 1039) as a +single "place", enough to explore yet untested numbers for the rest of +your life. + +### How big a number can I test with 4 GB of RAM? + +The number of hex digits in the start number is limited by `ARG_MAX`, +probably minus some overhead for the environment variables (use +[`env`(1)](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/env.html) +to trim your environment). In bits this leaves you with 24 * +ARG_MAX. + +The algorithm requires two bignums in memory for addition. +If you hit a divergent number, this will cause out-of-memory ("laugh") +somewhere near 216,000,000,000 (4GB/2 * 8bits/byte). +Sadly, I don't have a test case :-) + +How long would it take to overflow the *Not Overflowing Type*? Lets +assume we're processing 2GB numbers. The program copies, shifts by one, +adds and increments 2GB long bit strings, each time completely thrashing +the data cache -- at *all* levels. We have a fast machine that can do an +iteration in one second, on average. To make things easy, we round up +3*n* + 1 to 4*n*, and assume we never need to divide by two (which is +quite optimistic). Then each iteration shifts left by 2. This would take +8 billion seconds, or about 250 years. If you want to get famous, you +better *remove* some of the RAM, use an ancient box, or reduce available +memory resources with the ulimit(1) built-in of your shell. + +For all intents and purposes, the *Not Overflowing Type* keeps the promise! + +-------------------------------------------------------------------------------- + diff --git a/2015/schweikhardt/prog.c b/2015/schweikhardt/prog.c new file mode 100644 index 000000000..20bb4708d --- /dev/null +++ b/2015/schweikhardt/prog.c @@ -0,0 +1,179 @@ +#include +#include +#if defined __STDC_VERSION__ && (__STDC_VERSION__ > ((256L + 128L + 4L + 2L) * 512L)) +#include +#endif +#if EOF + __STDC__ +#error goofy! +#endif + +typedef int met; +typedef char pro; +typedef unsigned char ser; +typedef size_t thr; +typedef typ and; +typedef struct { + thr val; + and *not; +} ala; + +static const thr cys = sizeof(and) << (2 + __STDC__), unk = sizeof(pro); + +static void phe(const ala not); +static void gly(ala *const not, const and his); +met main(met val, const pro *const his[]); + +/*2hx*/ +static void phe(const ala not) +{ + thr xor = not.val; + + do { + met lys = (met)(cys - 4u); + + --xor; + while (lys >= 0) { + const and tyr = (and)(((and)(not.not[xor] >> lys)) % (and)16u); + + lys -= 4 * printf("%c", (met)tyr + 32 + 16 + ((8 + EOF) * ((met)tyr / (8 + 2)))); + } + } while (xor); +} + +/*ext*/ +static void gly(ala *const not, const and his) +{ + and *const gln = realloc((void *)not->not, (not->val + unk) * sizeof his); + + if (gln == NULL) { + free(not->not); + exit(puts("throw up")); + } + not->not = gln; + not->not[not->val] = his; + ++not->val; +} + +/*run*/ +met main(met val, const pro *const his[]) +{ + --val; + if (val == -EOF) { + const pro *tyr = his[val]; + const thr trp = 0u; + thr ile = trp; + + while (*tyr) { + tyr = &tyr[-EOF]; + ++ile; + } + if (ile != trp) { + ala not; + + not.val = (ile + ((cys >> 2) - unk)) / (cys >> 2); + not.not = calloc(not.val, sizeof(and)); + if (not.not != NULL) { + thr leu = trp, lys = trp; + + while (ile--) { + const ser asx = (ser)tyr[EOF]; + const ser glx = (ser)((asx > (ser)64u) ? (ser)((ser)asx + (ser)8u + (ser)1u) : (ser)asx); + + tyr = &tyr[EOF]; + not.not[leu] = (and)((and)not.not[leu] | (and)(((and)glx % (and)16u) << (and)lys)); /*lint !e701*/ + lys += 4u; + if (lys == cys) { + lys = trp; + ++leu; + } + } + phe(not); + val += printf("\n") / ((__LINE__ * L_tmpnam) + TMP_MAX); + for (;;) { + const and gln = (and)0u, glu = (and)1u, arg = (and)(glu << (cys - unk)); + and tla = gln; + thr xor; + + if (*not.not > glu) { + ++tla; + } else { + for (xor = unk; xor < not.val; ++xor) { + if (not.not[xor] != gln) { + ++tla; + break; + } + } + } + if (tla == gln) { /*one*/ + break; + } + if (*not.not & glu) { /*odd*/ + and sec = gln; + ala asn; + + asn.val = not.val; /*cpy*/ + asn.not = malloc(asn.val * sizeof sec); + if (asn.not == NULL) { + free(not.not); + exit(puts("laugh")); + } + for (xor = trp; xor < asn.val; ++xor) { + asn.not[xor] = not.not[xor]; + } + if (not.not[not.val - unk] & arg) { /*shl*/ + gly(¬, gln); + } + for (xor = trp; xor < not.val; ++xor) { + const and xle = ((not.not[xor] & arg) == arg) ? glu : gln; + + not.not[xor] = (and)((and)(not.not[xor] << unk) + (and)sec); + sec = xle; + } + sec = gln; + while (asn.val < not.val) { /*add*/ + gly(&asn, gln); + } + for (xor = trp; xor < not.val; ++xor) { + const and asp = (and)~gln; + + if (sec) { + const and pyl = (not.not[xor] >= (asp - asn.not[xor])) ? glu : gln; + + ++not.not[xor]; + sec = pyl; + } else { + sec = (not.not[xor] > (asp - asn.not[xor])) ? glu : gln; + } + not.not[xor] = (and)(not.not[xor] + asn.not[xor]); + } + if (sec) { + gly(¬, glu); + } + for (xor = trp; xor < not.val; ++xor) { /*inc*/ + ++not.not[xor]; + if (not.not[xor] != gln) { + break; + } + } + if (xor == not.val) { + gly(¬, glu); + } + free(asn.not); + } else { /*eve,shr*/ + *not.not = (and)(*not.not >> unk); + for (xor = unk; xor < not.val; ++xor) { + if (not.not[xor] & glu) { + not.not[xor - unk] = (and)(not.not[xor - unk] | arg); + } + not.not[xor] = (and)(not.not[xor] >> unk); + } + } + phe(not); + val -= (printf(" %d\n", val) > BUFSIZ) ? FILENAME_MAX : EOF; + } + free(not.not); + } + } + } + return fclose(stdout); +} diff --git a/2015/whowon.html b/2015/whowon.html new file mode 100644 index 000000000..8abe4c3a7 --- /dev/null +++ b/2015/whowon.html @@ -0,0 +1,141 @@ + + + + + + + + Who won the 24th IOCCC + + + +
    IOCCC +

    The International Obfuscated C Code Contest +

    The 24th IOCCC Winners +

    +[ The judges | +IOCCC home page | +FAQ | +People who have won | +Winning entries ] + +

    + +

    +


    + +

    Here are the names and categories for the winners of the 24th IOCCC: +

    + + + +

    +


    + + + + + + + + +
    +Creative Commons License +

    This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

    +
    + + + diff --git a/2015/yang/Makefile b/2015/yang/Makefile new file mode 100644 index 000000000..8934b2c92 --- /dev/null +++ b/2015/yang/Makefile @@ -0,0 +1,281 @@ +#!/usr/bin/env make +# +# 2015 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +CSILENCE= +#CSILENCE= -Wno-c++98-compat -Wno-c99-compat -Wno-conversion \ +# -Wno-float-conversion -Wno-missing-prototypes \ +# -Wno-missing-variable-declarations -Wno-old-style-cast \ +# -Wno-unreachable-code + +# compiler standard +# +#CSTD= +#CSTD= -ansi +#CSTD= -std=c11 +CSTD= -std=c90 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitess: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= + +# include files that are needed to compile +# +CINCLUDE= + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CWARN} ${CSTD} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= -lm + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + +CPLUSPLUS= clang++ +MAY_NEED_GPLUSPLUS= g++ + + +############################## +# Special flags for this entry +############################## +# +ENTRY= prog +CSRC= ${ENTRY}.c +CPLUSPLUSSRC= ${ENTRY}.cc +OBJ= ${ENTRY}.o +DATA= +ALT_OBJ= +ALT_ENTRY= +TARGET= ${ENTRY} ${ENTRY}_c90 ${ENTRY}_c99 ${ENTRY}_c11 ${CPLUSPLUSSRC} \ + ${ENTRY}_cpp98 ${ENTRY}_cpp11 ${DATA} + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +${ENTRY}: ${CSRC} + ${CC} ${CFLAGS} ${CSRC} -o $@ ${LIBS} + +${ENTRY}_c90: ${CSRC} + ${CC} ${CWARN} ${ARCH} ${OPT} -std=c90 ${CSRC} -o $@ ${LIBS} + +${ENTRY}_c99: ${CSRC} + ${CC} ${CWARN} ${ARCH} ${OPT} -std=c99 ${CSRC} -o $@ ${LIBS} + +${ENTRY}_c11: ${CSRC} + ${CC} ${CWARN} ${ARCH} ${OPT} -std=c11 ${CSRC} -o $@ ${LIBS} + +${CPLUSPLUSSRC}: ${CSRC} + ${RM} -f $@ + ${CP} -f -p ${CSRC} $@ + +${ENTRY}_cpp98: ${CPLUSPLUSSRC} + ${CPLUSPLUS} ${CWARN} ${ARCH} ${OPT} -std=c++98 ${CPLUSPLUSSRC} -o $@ ${LIBS} + +${ENTRY}_cpp11: ${CPLUSPLUSSRC} + ${CPLUSPLUS} ${CWARN} ${ARCH} ${OPT} -std=c++11 ${CPLUSPLUSSRC} -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_ENTRY} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_ENTRY} + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely we are joking Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to sometimes mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Readers shall not be disallowed from not failing to be unable to not partly misunderstand this partocular final echo. + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v5; \ + else \ + echo "planet deniers, like the IAU, are amusing"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 2ed3582ec5c094a093fea2a6bcb9f19439892873c9cc45ed1ceaafe08b7d52e1b2c7cd524be3b0b2 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "You are holding it wrong!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_512_bit "${ENTRY}"; \ + else \ + echo "These aren't the primes you're looking for Pauline!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2015/yang/hint.html b/2015/yang/hint.html new file mode 100644 index 000000000..9d5431db0 --- /dev/null +++ b/2015/yang/hint.html @@ -0,0 +1,152 @@ + + + + + + + Most Pointed Reaction + + +

    Most Pointed Reaction

    + +

    Don Yang
    +http://uguu.org/

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +echo Some text | ./prog 
    +
    + +

    Try:

    + +
    echo IOCCC 2015 | ./prog | tee output.c
    +make output
    +./output
    +
    +echo IOCCC 2015 | ./prog_c11 | tee output.c
    +make output
    +./output
    +
    +echo IOCCC 2015 | ./prog_c++98 | tee output.c
    +make output
    +./output
    +
    + +

    Selected Judges Remarks:

    + +

    Before analysing the code in detail we were able to guess two out of four tests +this entry uses to tell the 5 languages/flavors apart. Can you find all four?

    + +

    The way the text is encoded in the output doesn’t cease to amaze. Can you tell +why an array of 512 elements is needed?

    + +

    Author’s comments:

    + +

    Fuuko is a sea star generator. Feed her some input through stdin to +get lots of sea star patterns in stdout.

    + +
    gcc -O3 -std=c90 fuuko.c -lm -o fuuko_c90
    +echo IOCCC | ./fuuko_c90 > output_c90.c
    +
    + +

    If you compile with a C99 compiler instead of C90, the sea stars will +have eyes.

    + +
    gcc -O3 -std=c99 fuuko.c -lm -o fuuko_c99
    +echo IOCCC | ./fuuko_c99 > output_c99.c
    +
    + +

    Don’t like sea stars? Use a C++98 compiler to get dango instead.

    + +
    g++ -O3 -std=c++98 fuuko.c -lm -o fuuko_cpp98
    +echo IOCCC | ./fuuko_cpp98 > output_cpp98.c
    +
    + +

    Don’t like dango either? Use a C++11 compiler to get just circles (or +swiss cheese, if you prefer that).

    + +
    g++ -O3 -std=c++11 fuuko.c -lm -o fuuko_cpp11
    +echo IOCCC | ./fuuko_cpp11 > output_cpp11.c
    +
    + +

    Don’t like any of these patterns? Use a C11 compiler and there will be +no extra patterns.

    + +
    gcc -O3 -std=c11 fuuko.c -lm -o fuuko_c11
    +echo IOCCC | ./fuuko_c11 > output_c11.c
    +
    + +

    Regardless of which of these C/C++ dialects you choose, the output +will all be valid C90 code that reproduces original input on stdout, +filled with pointer dereferences (C stars).

    + +

    Next time people ask you for a few pointers on C, you can run their +question through Fuuko and give them pointers all day long.

    + +

    Compatibility

    + +

    Fuuko has been tested under these environments:

    + +
      +
    • gcc 4.9.3 on Cygwin
    • +
    • gcc 4.9.2 on Linux
    • +
    • gcc 4.8.4 on Linux
    • +
    • gcc 4.6.3 on Linux (doesn’t support C11 nor C++11)
    • +
    • gcc 4.3.5 on JS/Linux
    • +
    • clang 3.5.2 on Cygwin (doesn’t work with optimization enabled, +probably cygwin bug)
    • +
    • clang 3.5.0 on Linux
    • +
    • clang 3.4.1 on Linux
    • +
    • tcc 0.9.25 on JS/Linux (C99 only)
    • +
    + + +

    Features

    + +

    The most obscure parts are in detecting the subtle differences in +different dialects. The standard committees put a lot of effort into +avoiding “quiet changes”, but Fuuko is still able exploit a few of +those. It should be an interesting exercise for the reader to figure +how she did it.

    + +

    Output patterns are usually random (except for C11). The built-in +random number generator is seeded using ASLR. On systems where ASLR +is not so random (such as cygwin), you can introduce randomness by +changing number of command line arguments to Fuuko.

    + +

    Output is somewhat robust: corruption on most of the lines will +usually result in a compiler warning. This is because the output is +vastly redundant: For ~1K of input, expect output to be on the order +of ~1MB, and take ~500MB of RAM to compile.

    + +

    CRC32 of source code is embedded in the source code itself.

    + +

    Process of writing this program is included in spoiler.html

    + +

    Code layout is inspired by Ibuki Fuuko, for her love of sea stars.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2016, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2015/yang/hint.text b/2015/yang/hint.text new file mode 100644 index 000000000..5d0a4f793 --- /dev/null +++ b/2015/yang/hint.text @@ -0,0 +1,121 @@ +# Most Pointed Reaction + +Don Yang + + + +## Judges' comments: +### To use: + + make + echo Some text | ./prog + + +### Try: + + echo IOCCC 2015 | ./prog | tee output.c + make output + ./output + + echo IOCCC 2015 | ./prog_c11 | tee output.c + make output + ./output + + echo IOCCC 2015 | ./prog_c++98 | tee output.c + make output + ./output + +### Selected Judges Remarks: + +Before analysing the code in detail we were able to guess two out of four tests +this entry uses to tell the 5 languages/flavors apart. Can you find all four? + +The way the text is encoded in the output doesn't cease to amaze. Can you tell +why an array of 512 elements is needed? + +## Author's comments: +Fuuko is a sea star generator. Feed her some input through stdin to +get lots of sea star patterns in stdout. + + gcc -O3 -std=c90 fuuko.c -lm -o fuuko_c90 + echo IOCCC | ./fuuko_c90 > output_c90.c + +If you compile with a C99 compiler instead of C90, the sea stars will +have eyes. + + gcc -O3 -std=c99 fuuko.c -lm -o fuuko_c99 + echo IOCCC | ./fuuko_c99 > output_c99.c + +Don't like sea stars? Use a C++98 compiler to get dango instead. + + g++ -O3 -std=c++98 fuuko.c -lm -o fuuko_cpp98 + echo IOCCC | ./fuuko_cpp98 > output_cpp98.c + +Don't like dango either? Use a C++11 compiler to get just circles (or +swiss cheese, if you prefer that). + + g++ -O3 -std=c++11 fuuko.c -lm -o fuuko_cpp11 + echo IOCCC | ./fuuko_cpp11 > output_cpp11.c + +Don't like any of these patterns? Use a C11 compiler and there will be +no extra patterns. + + gcc -O3 -std=c11 fuuko.c -lm -o fuuko_c11 + echo IOCCC | ./fuuko_c11 > output_c11.c + +Regardless of which of these C/C++ dialects you choose, the output +will all be valid C90 code that reproduces original input on stdout, +filled with pointer dereferences (C stars). + +Next time people ask you for a few pointers on C, you can run their +question through Fuuko and give them pointers all day long. + + +### Compatibility + +Fuuko has been tested under these environments: + +- gcc 4.9.3 on Cygwin +- gcc 4.9.2 on Linux +- gcc 4.8.4 on Linux +- gcc 4.6.3 on Linux (doesn't support C11 nor C++11) +- gcc 4.3.5 on JS/Linux +- clang 3.5.2 on Cygwin (doesn't work with optimization enabled, + probably cygwin bug) +- clang 3.5.0 on Linux +- clang 3.4.1 on Linux +- tcc 0.9.25 on JS/Linux (C99 only) + + +### Features + +The most obscure parts are in detecting the subtle differences in +different dialects. The standard committees put a lot of effort into +avoiding "quiet changes", but Fuuko is still able exploit a few of +those. It should be an interesting exercise for the reader to figure +how she did it. + +Output patterns are usually random (except for C11). The built-in +random number generator is seeded using ASLR. On systems where ASLR +is not so random (such as cygwin), you can introduce randomness by +changing number of command line arguments to Fuuko. + +Output is somewhat robust: corruption on most of the lines will +usually result in a compiler warning. This is because the output is +vastly redundant: For ~1K of input, expect output to be on the order +of ~1MB, and take ~500MB of RAM to compile. + +CRC32 of source code is embedded in the source code itself. + +Process of writing this program is included in spoiler.html + +Code layout is inspired by Ibuki Fuuko, for her love of sea stars. + +-------------------------------------------------------------------------------- + diff --git a/2015/yang/prog.c b/2015/yang/prog.c new file mode 100644 index 000000000..2170220e8 --- /dev/null +++ b/2015/yang/prog.c @@ -0,0 +1,36 @@ + #define r(R) R"()" + /*[*/#include /**/ + #include/*!![crc=0f527cd2]*/ + float I,bu,k,i,F,u,U,K,O;char o[5200];int + #define R(U) (sizeof('U')==1||sizeof(U"1"[0])==1) + h=0,t=-1,m=80,n=26,d,g,p=0,q=0,v=0,y=112,x=40; float + N(float/*x*/_){g=1<<30;d=-~d*1103515245&--g;return d*_ + /g;}void/**/w(int/**/_){if(t<0){for(g=0;g<5200;o[g++ ]= + 0);for(;g;o[g+79]=10)g-=80;for(t=37;g<62;o[80+g++]=32) ; + }if(m&&o[h*80+m-1]==10){for(g=0;g<79;o[t*80+g++]=0){}o[t + ++*80+g]=10;t%=64;n+=2;I=N(70)+5;if(n>30&&(I-x)*(I-x)+n* + n>1600&&R()){O=0;F=(x=0x1!=sizeof(' '))?k=1+N(2),i=12-k+N( + 8),N(4):(k=17+N(5),i=0,r()[0]?O=.1: 0);for(u=U=-.05;u<32; + U=k+i+i*.5*sin((u+=.05)+F))for( K=0 ;K< U;K+=.1)if((bu=K* + sin(u/5),g=I+cos( u/5) *K)>=0&&g < 79 )o[g+(int)(t+44+ + bu*(.5-(bu>0?3*O: O) ) )%64* 80 ] =32;x*=02//* */2 + -1;n=O+x?n=I+(x?0 :N (k)- k /2),g=(t+42 )% + 64,m=-~g%64,x?g=m =-~ m%64:0 ,n>5?o[g*80 + + n-3]=o[m*80+n-3]= 0: 0 ,n <75?o[g*80+n + +2]=o[m*80+n+2]=0 :0:0; x=I;}h=-~h%64 + ;m=0;}putchar((g=o [h* 80+m++])?g:_); + if(g){w(_);}}void W (const char*_ + ){for(;*_;w(*_++));} int main(int a + ,char**_){while(a--)d +=_[a ]-(char*)0;W( \ + "#includetyped" "e" "f\40int\40O;v" + "oid o(O _){putchar(_);}O" "\40main(){O" "" +"*_[512],**p=_,**d,b,q;for(b=0;b" "++<512;p=_+q)_[q" \ +"=(p-_+1)*9%512]=(O*)p;") ; for(;(g= getchar())-EOF;p= +q){q=p;for(v=512;p-q-g&&q-p- g; v--)q=-~q*9%512 +;W("o(");if(p>q)w(y),w(45);w( 40);w(y^=20 +);w(075);for(a=0;a + +Replay text + + + + + + diff --git a/2018/2018.tar.bz2 b/2018/2018.tar.bz2 new file mode 100644 index 000000000..0e168a72e Binary files /dev/null and b/2018/2018.tar.bz2 differ diff --git a/2018/MANIFEST b/2018/MANIFEST new file mode 100644 index 000000000..66e820df4 --- /dev/null +++ b/2018/MANIFEST @@ -0,0 +1,158 @@ +2018/MANIFEST +2018/Makefile +2018/algmyr/Makefile +2018/algmyr/hint.html +2018/algmyr/hint.text +2018/algmyr/prog.c +2018/algmyr/prog.orig.c +2018/algmyr/spoiler.png +2018/anderson/Makefile +2018/anderson/hint.html +2018/anderson/hint.text +2018/anderson/prog.c +2018/anderson/prog.orig.c +2018/bellard/Makefile +2018/bellard/fruits.bin +2018/bellard/hint.html +2018/bellard/hint.text +2018/bellard/lena512.bin +2018/bellard/prog.c +2018/bellard/prog.orig.c +2018/bellard/vintage_cars.bin +2018/burton1/Makefile +2018/burton1/hint.html +2018/burton1/hint.text +2018/burton1/prog.c +2018/burton1/prog.nowarn.c +2018/burton1/scripthd +2018/burton2/Makefile +2018/burton2/README +2018/burton2/ansi +2018/burton2/c++11 +2018/burton2/c++14 +2018/burton2/c++98 +2018/burton2/c11 +2018/burton2/c99 +2018/burton2/discrepancies +2018/burton2/fixed_iocccsize.c +2018/burton2/freqcount +2018/burton2/hint.html +2018/burton2/hint.text +2018/burton2/ioc_without_quote +2018/burton2/ioccc.kw.freq +2018/burton2/iocccbug01.c +2018/burton2/iocccbug02.c +2018/burton2/iocccbug03.c +2018/burton2/iocccbug04.c +2018/burton2/iocccbug05.c +2018/burton2/iocccbug06.c +2018/burton2/java8 +2018/burton2/kandr +2018/burton2/kandr2 +2018/burton2/manpage +2018/burton2/mkkeywords +2018/burton2/patch +2018/burton2/prog.c +2018/burton2/results +2018/burton2/results.k +2018/burton2/runtest +2018/burton2/spotcheck +2018/burton2/spotdiff +2018/burton2/src.doc.rot13 +2018/burton2/tac.c +2018/burton2/tac.man +2018/burton2/test01.c +2018/burton2/test02.c +2018/burton2/test03.c +2018/burton2/test04.c +2018/burton2/test05.c +2018/burton2/test06.c +2018/burton2/test07.c +2018/burton2/test08.c +2018/burton2/test09.c +2018/burton2/test10.c +2018/burton2/test11.c +2018/burton2/test12.c +2018/burton2/test13.c +2018/burton2/test14.c +2018/burton2/tokenfix +2018/burton2/unob.sh +2018/burton2/v7unix +2018/ciura/Makefile +2018/ciura/hint.html +2018/ciura/hint.text +2018/ciura/prog.c +2018/ciura/prog.orig.c +2018/endoh1/Makefile +2018/endoh1/golem.txt +2018/endoh1/hint.html +2018/endoh1/hint.text +2018/endoh1/invisible.txt +2018/endoh1/prog.c +2018/endoh1/prog.orig.c +2018/endoh1/smily.txt +2018/endoh2/Makefile +2018/endoh2/hint.html +2018/endoh2/hint.text +2018/endoh2/prog.c +2018/endoh2/run.sh +2018/ferguson/FILES +2018/ferguson/Makefile +2018/ferguson/hint.css +2018/ferguson/hint.html +2018/ferguson/hint.text +2018/ferguson/prog-simple.c +2018/ferguson/prog.c +2018/ferguson/prog.orig.c +2018/ferguson/test-strings.txt +2018/ferguson/test.sh +2018/ferguson/weasel.1 +2018/ferguson/weasel.man +2018/ferguson/weasel.spec +2018/giles/Makefile +2018/giles/hint.html +2018/giles/hint.text +2018/giles/ioccc.txt +2018/giles/prog.c +2018/giles/sand.txt +2018/giles/sand.txt.orig +2018/guidelines.txt +2018/hint.css +2018/hou/Makefile +2018/hou/hint.html +2018/hou/hint.text +2018/hou/input.json +2018/hou/prog.c +2018/hou/prog.orig.c +2018/iocccsize.c +2018/iocccsize.mk +2018/mills/Makefile +2018/mills/boot.dat +2018/mills/bsd.img.bz2 +2018/mills/hint.html +2018/mills/hint.text +2018/mills/prog.c +2018/mills/v0.image.fs +2018/mills/v6.tape.gz +2018/poikola/Makefile +2018/poikola/hint.html +2018/poikola/hint.text +2018/poikola/poikola.tex +2018/poikola/prog-doc.c +2018/poikola/prog.c +2018/poikola/prog.orig.c +2018/rules.txt +2018/vokes/Makefile +2018/vokes/example-1.txt +2018/vokes/example-2.txt +2018/vokes/example-tab.txt +2018/vokes/hint.html +2018/vokes/hint.text +2018/vokes/ioccc.txt +2018/vokes/prog.c +2018/whowon.html +2018/yang/Makefile +2018/yang/hint.html +2018/yang/hint.text +2018/yang/prog.c +2018/yang/spoiler.html diff --git a/2018/Makefile b/2018/Makefile new file mode 100644 index 000000000..def9b018d --- /dev/null +++ b/2018/Makefile @@ -0,0 +1,195 @@ +#!/usr/bin/env make +# +# 2018 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +GZIP_PROG= gzip +BZIP2= bzip2 +CURL= curl +DD= dd +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq +STRIP= strip + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############### +# IOCCC winners +############### +# +WINNERS= anderson algmyr bellard burton1 burton2 ciura endoh1 endoh2 ferguson \ + giles hou mills poikola vokes yang + + +################### +# build all entries +################### +# +all: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) X11_LIBDIR=${X11_LIBDIR} X11_INCDIR=${X11_INCDIR} $@)"; \ + (cd $$i && $(MAKE) "X11_LIBDIR=${X11_LIBDIR}" "X11_INCDIR=${X11_INCDIR}" $@); \ + done + +# alternative executable +# +alt: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) X11_LIBDIR=${X11_LIBDIR} X11_INCDIR=${X11_INCDIR} $@)"; \ + (cd $$i && $(MAKE) "X11_LIBDIR=${X11_LIBDIR}" "X11_INCDIR=${X11_INCDIR}" $@); \ + done + + +############### +# utility rules +############### +# +everything: all alt + +clean: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +clobber: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + ${RM} -f iocccsize + ${RM} -rf iocccsize.dSYM + +nuke: clobber + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +install: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + + +################## +# 133t hacker rulz +################## +# +love: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +haste: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +waste: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +make: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +easter_egg: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +fabricate fashion form frame manufacture produce: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +sandwich: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +deep_magic: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +magic: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +# The IOCCC resident astronomer states +# +supernova: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +charon: supernova + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +pluto: supernova + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done diff --git a/2018/algmyr/Makefile b/2018/algmyr/Makefile new file mode 100644 index 000000000..dc51ddf6b --- /dev/null +++ b/2018/algmyr/Makefile @@ -0,0 +1,286 @@ +#!/usr/bin/env make +# +# 2018 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +GZIP_PROG= gzip +BZIP2= bzip2 +CURL= curl +DD= dd +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +CSILENCE= -Wno-string-plus-int -Wno-empty-body -Wno-unused-result +#CSILENCE= -Wno-implicit-int + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=25 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= prog.orig.o +ALT_TARGET= prog.orig + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +prog.orig: prog.orig.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 3a3fabb90892eeb2f610ae0f74a35a970060665a063ab702bd686c17c4ae07f6 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2018/algmyr/hint.html b/2018/algmyr/hint.html new file mode 100644 index 000000000..245a1ba48 --- /dev/null +++ b/2018/algmyr/hint.html @@ -0,0 +1,162 @@ + + + + + + + Most cacophonic + + +

    Most cacophonic

    + +

    Anton Älgmyr
    +Twitter: @aalgmyr

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +cat prog.c | ./prog           # Printing garbage might break your font
    +./prog <file1> <file2> > out.raw
    +./prog -d 2 0 out.raw         # Decode the first (0th) channel out of two
    +
    + +

    To try:

    + +
    ./prog -h | ./prog -d 1 0
    +
    +# Who needs cat?
    +./prog prog.c | ./prog -d 1 0
    +
    +# Assuming ALSA
    +echo '<<<<<<  /\_/\_/\  _-_-_-_  !!!!!  :.:.:.:  >>>>>> ****** ~~~~~~~' |
    +    ./prog | aplay -c1 -fFLOAT_LE -r44100
    +
    +# Assuming sox
    +echo -n ' MENE MENE TEKEL UPHARSIN ' | ./prog | 
    +    sox -t raw -c 1 -r 44100 -L -e floating-point -b 32 - -n spectrogram -d 10 -X 300
    +
    + +

    Selected Judges Remarks:

    + +

    Be warned, this is not your garden variety text-to-speech program! Earplugs are advised, +or at least a handy and well-tested volume knob.

    + +

    Pixels are numbered, amplitudes are weighed, frequencies are divided, +and the message can be displayed in fiery letters, but don’t be alarmed.

    + +

    How does decoding of the waveform work? Can you encode an arbitrary text in a sound sample?

    + +

    Author’s comments:

    + +

    What is this?

    + +

    To put it brief, this entry is akin to a sound based cat. It takes characters as input and outputs them into frequency space as audio. The entry also supports decoding the produced waveforms using the -d flag. Usage instructions is output if run with the -h flag, albeit not in an immediately legible format.

    + +

    Details

    + +

    In normal operation, the entry reads characters from one or more sources. If the -h flag is given, usage instructions is used as a source. Else if file paths are present as arguments those will be used. Else stdin is used.

    + +

    If a character is part of the supported subset of ASCII {10, 32-126} then that character is output into frequency space of an audio signal (44.1 kHz single precision float, endianness should depend on system endianness) through stdout. Any other character will be interpreted and outputted as a space.

    + +

    Characters are printed using a (slightly modified) pixel font based on gohufont. Pixels are drawn using crosses in frequency space, achieved by simultaneous up and down chirps.

    + +

    Each input source is designated its own channel in the output (one float per channel per time step in the output) so if you have a surround sound system you could listen to a cacophony of chirpy characters.

    + +

    Interestingly, with training you might actually be able to tell characters just from hearing. But even without training you can easily read along with the printed characters and have the sound make sense with the look of the characters.

    + +

    See image spoiler.png for an example spectrogram.

    + +

    Limitations

    + +

    There is no error checking done when opening files, so expect segfaults if you provide the wrong path to a file.

    + +

    This program is bound to misbehave if int is less than 32 bits.

    + +

    Flags will only be interpreted correctly if they are the first argument. Reading a file named -d or -h is fully possible if it is not the first file provided, even though I am not sure why you would want to do that.

    + +

    Providing invalid/unexpected arguments to the decode flag will result in odd behavior. Some erroneous arguments cause segfaults (negative number of channels, channel id outside valid range). One argument in particular causes an infinite loop printing whitespace.

    + +

    Techniques

    + +

    Obfuscation

    + +

    A lot of the obfuscations done came naturally from trying to appease the size tool. To name some:

    + +
      +
    • One character names
    • +
    • Merging of related (and not so related) arithmetic operations
    • +
    • Short circuiting for flow control to replace some ifs
    • +
    • Some #defines, sadly
    • +
    + + +

    On the intersection of size and obfuscation is the data encoding, which was quite fun to design.

    + +

    Some additional obfuscation was done to mathematical formulas. Somewhat known expressions was transformed into equivalent but less recognizable counterparts.

    + +

    I have tried to avoid intentional red herrings in the code, although fishy statements are plentiful.

    + +

    Data encoding

    + +

    The large string in the beginning of the source file contains font data, encoded in base64 using characters in the range ' ' to '_'. The space was chosen as the zero because the data contains a lot of zeroes, and quite helpfully the size tool ignores whitespace even in strings. Without this fact the program would have been too large and the decoding feature would have had to go. Fortunately this hole in the size spec was readily available. :)

    + +

    Characters in the font (5x8 pixels, 40 bits) is packed into 7 base64 digits (which was a pain to decode in minimal code).

    + +

    Math

    + +

    Note that even though floats are used for the waveforms, the standard math library is not used at all! Most arithmetic is done purely on integers. The only major exception is generating a table of sine values which are interpolated to give high resolution waveforms. Can you see when the generation is triggered, and how it is done?

    + +

    A critical issue encountered was that having abrupt starts and ends of signals cause a lot of problems with spectral leakage which makes spectrograms hard to read and audio painful to listen to. To reduce spectral leakage a windowing function was used. Although the one used is quite well known, it is not in a form that should be familiar to anyone. What looks like a polynomial and quacks like a polynomial might not actually be a polynomial, at least not deep inside.

    + +

    Printing a string

    + +

    The program was written to deal exclusively with file descriptors, so how would one go about printing a char array not from a file descriptor without adding additional logic? Answer: ungetc into stdin, one char at a time (to be standards compliant). This is used to print the usage instructions.

    + +

    Compilation warnings

    + +

    Compiling using

    + +
    gcc -Wall -Wextra -pedantic
    +
    + +

    gives only -Wmisleading-indentation which is sensible considering the source code. While

    + +
    clang -Wall -Wextra -pedantic
    +
    + +

    is a bit more pessimistic and gives -Wempty-body (I like loops without bodies), -Wstring-plus-int (since apparently some people think string+int is a concatenation) and one of the weirder warnings I have seen from me splitting a negative constant with whitespace. Compiling using

    + +
    clang -Wall -Wextra -pedantic -Weverything
    +
    + +

    produces a few pagefuls of warnings and makes me feel generally bad about myself. :(

    + +

    Misc

    + +

    The reported size of the source code using the size tool is very intentionally 2018.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2018, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2018/algmyr/hint.text b/2018/algmyr/hint.text new file mode 100644 index 000000000..30a87247c --- /dev/null +++ b/2018/algmyr/hint.text @@ -0,0 +1,135 @@ +# Most cacophonic + +Anton Älgmyr +Twitter: @aalgmyr + + +## Judges' comments: +### To use: + + make + + cat prog.c | ./prog # Printing garbage might break your font + ./prog > out.raw + ./prog -d 2 0 out.raw # Decode the first (0th) channel out of two + +### To try: + + ./prog -h | ./prog -d 1 0 + + # Who needs cat? + ./prog prog.c | ./prog -d 1 0 + + # Assuming ALSA + echo '<<<<<< /\_/\_/\ _-_-_-_ !!!!! :.:.:.: >>>>>> ****** ~~~~~~~' | + ./prog | aplay -c1 -fFLOAT_LE -r44100 + + # Assuming sox + echo -n ' MENE MENE TEKEL UPHARSIN ' | ./prog | + sox -t raw -c 1 -r 44100 -L -e floating-point -b 32 - -n spectrogram -d 10 -X 300 + +### Selected Judges Remarks: + +Be warned, this is not your garden variety text-to-speech program! Earplugs are advised, +or at least a handy and well-tested volume knob. + +Pixels are numbered, amplitudes are weighed, frequencies are divided, +and the message can be displayed in fiery letters, but don't be alarmed. + +How does decoding of the waveform work? Can you encode an arbitrary text in a sound sample? + + +## Author's comments: + +What is this? +============= +To put it brief, this entry is akin to a sound based cat. It takes characters as input and outputs them into frequency space as audio. The entry also supports decoding the produced waveforms using the `-d` flag. Usage instructions is output if run with the `-h` flag, albeit not in an immediately legible format. + +Details +------- +In normal operation, the entry reads characters from one or more sources. If the `-h` flag is given, usage instructions is used as a source. Else if file paths are present as arguments those will be used. Else stdin is used. + +If a character is part of the supported subset of ASCII `{10, 32-126}` then that character is output into frequency space of an audio signal (44.1 kHz single precision float, endianness should depend on system endianness) through stdout. Any other character will be interpreted and outputted as a space. + +Characters are printed using a (slightly modified) pixel font based on [gohufont](https://github.com/hchargois/gohufont). Pixels are drawn using crosses in frequency space, achieved by simultaneous up and down chirps. + +Each input source is designated its own channel in the output (one float per channel per time step in the output) so if you have a surround sound system you could listen to a cacophony of chirpy characters. + +Interestingly, with training you might actually be able to tell characters just from hearing. But even without training you can easily read along with the printed characters and have the sound make sense with the look of the characters. + +See image spoiler.png for an example spectrogram. + +Limitations +----------- +There is no error checking done when opening files, so expect segfaults if you provide the wrong path to a file. + +This program is bound to misbehave if int is less than 32 bits. + +Flags will only be interpreted correctly if they are the first argument. Reading a file named `-d` or `-h` is fully possible if it is not the first file provided, even though I am not sure why you would want to do that. + +Providing invalid/unexpected arguments to the decode flag will result in odd behavior. Some erroneous arguments cause segfaults (negative number of channels, channel id outside valid range). One argument in particular causes an infinite loop printing whitespace. + +Techniques +========== + +Obfuscation +----------- +A lot of the obfuscations done came naturally from trying to appease the size tool. To name some: + +* One character names +* Merging of related (and not so related) arithmetic operations +* Short circuiting for flow control to replace some `if`s +* Some `#defines`, sadly + +On the intersection of size and obfuscation is the data encoding, which was quite fun to design. + +Some additional obfuscation was done to mathematical formulas. Somewhat known expressions was transformed into equivalent but less recognizable counterparts. + +I have tried to avoid intentional red herrings in the code, although fishy statements are plentiful. + + +Data encoding +------------- +The large string in the beginning of the source file contains font data, encoded in base64 using characters in the range `' '` to `'_'`. The space was chosen as the zero because the data contains a lot of zeroes, and quite helpfully the size tool ignores whitespace even in strings. Without this fact the program would have been too large and the decoding feature would have had to go. Fortunately this hole in the size spec was readily available. :) + +Characters in the font (5x8 pixels, 40 bits) is packed into 7 base64 digits (which was a pain to decode in minimal code). + +Math +---- +Note that even though floats are used for the waveforms, the standard math library is not used at all! Most arithmetic is done purely on integers. The only major exception is generating a table of sine values which are interpolated to give high resolution waveforms. Can you see when the generation is triggered, and how it is done? + +A critical issue encountered was that having abrupt starts and ends of signals cause a lot of problems with spectral leakage which makes spectrograms hard to read and audio painful to listen to. To reduce spectral leakage a windowing function was used. Although the one used is quite well known, it is not in a form that should be familiar to anyone. What looks like a polynomial and quacks like a polynomial might not actually be a polynomial, at least not deep inside. + +Printing a string +----------------- +The program was written to deal exclusively with file descriptors, so how would one go about printing a char array not from a file descriptor without adding additional logic? Answer: `ungetc` into stdin, one char at a time (to be standards compliant). This is used to print the usage instructions. + +Compilation warnings +==================== +Compiling using + + gcc -Wall -Wextra -pedantic + +gives only `-Wmisleading-indentation` which is sensible considering the source code. While + + clang -Wall -Wextra -pedantic + +is a bit more pessimistic and gives `-Wempty-body` (I like loops without bodies), `-Wstring-plus-int` (since apparently some people think string+int is a concatenation) and one of the weirder warnings I have seen from me splitting a negative constant with whitespace. Compiling using + + clang -Wall -Wextra -pedantic -Weverything + +produces a few pagefuls of warnings and makes me feel generally bad about myself. :( + +Misc +==== +The reported size of the source code using the size tool is very intentionally 2018. + + +-------------------------------------------------------------------------------- + diff --git a/2018/algmyr/prog.c b/2018/algmyr/prog.c new file mode 100644 index 000000000..76fe8d58e --- /dev/null +++ b/2018/algmyr/prog.c @@ -0,0 +1,66 @@ +#include +#include +#define M malloc(sizeof( +#define R fread(x,sizeof(float),Z*w,f) +#define E free( + +char*G= +" " +" '" +"@(*AP( " +" " +" " +" " +" " +" _" +"0 #@ . \"C^*/XH\"Q2_U(D&(5*E0C 4B54DV X \"!9A@ 89H$ !" +"0(/@@4 @(/@@( #@T @(\" @( P, , P# , #Y1244^ ?R 0#%)14,A#9)24$B 1" +"_)!0,$Y145%R Y145$^&!81T! #9)24DV#Y)24DP ;&P -C4 $$B% @ !04%!04 @4(D$ #!(1" +"4 @#U574$^'^0D)!_&Z1D9'_$*!@8%^'Z!@8'_(&1D9'_(\"0D)#_%Z1D8%^/\\0$!#_ \"!_X$ /X! 0" +"$&(-$*!#_ $! 0'_/] ,$#_/\\&&&#_'Z!@8%^&\"0D)#_'V\"A8%^&>8D)#_$Z1D9%B(\" _X\" /X" +"! 0'^/ , PSP/P#' /\\,!@& 088!X!#@$>" +"!$*! H1#X)!04X!$9%1,1" +"(&!;A 0 _P " +" ! 0;H&!" +" @$\"" +"! (" +"\0"; int s,p,e,c,t,r,a,l; /* l e a k a g e */ + + int + F(int o + ,int n, int t + ){char*p=(o*(136-o) + >=1260)*7*(o-9)+G; for( + n=!(o=-1); n=*p+++64*n-*G + ,(o+=3)>>2<5-t; ); return 255 + &n>>2*o%8; } float L[0x400];int + T(float a,float b,float l,float*e) + {return L[0x3ff]||!(e[1]=b*a+l**e)|| + !T(l*a-b**e,b,l,e+1); } float f(int x) + {int w=s<>x&&P+(* + h+=f(e*(l+a*(2*x+1))*y)*f(s/2-e*a*y+e*a*y*y*(t/p + )/(s/p)))),++x); float z=f(y*t)*f(y*t); *h=z*(1+3* + z+2*z*z)/6**h/c; } return h-i-r+1; } void d(int w, + int n,FILE*f){int Z=s/t; int S[5]; float**P=M float* + )*c);for(r=0;r1?v[1][0]*c+v[1][1]:0; a=7;l=16;if(r ==11620){d (atoi + (v[2]), atoi(v[3]), q<5?stdin:fopen(v[4],"r")); return 0; } char*H=malloc(c),* h=H; sprintf (H,"\0" + "Usage\n" " %s [-" "h] [-d #c cid] file1 file2 ... (or stdin)"+(q-1&&r==11624 ),v[0]);if(* H)q=1;int + w=2>q?1:q -1; FILE**f=M FILE*)*w); f[0]=stdin; if(q>1)for(r=0; rungetc(* H++,*f); for(r =w; r--;) +{ i[r]=getc (f[r]); if(i[r]<0)i[r]=!++x; } if(x==w)break; while(++r<6){ while(C(b++,t,w,F(*i++,r< 5,r))); i-= +w; fwrite(b-=w,sizeof(float),l,stdout); } fflush(stdout); } while(fclose(f[--w]),w); E f); E b); E i); E h);} + diff --git a/2018/algmyr/prog.orig.c b/2018/algmyr/prog.orig.c new file mode 100644 index 000000000..d4c9b0461 --- /dev/null +++ b/2018/algmyr/prog.orig.c @@ -0,0 +1,66 @@ +#include +#include +#define M malloc(sizeof( +#define R fread(x,sizeof(float),Z*w,f) +#define E free( + +char*G= +" " +" '" +"@(*AP( " +" " +" " +" " +" " +" _" +"0 #@ . \"C^*/XH\"Q2_U(D&(5*E0C 4B54DV X \"!9A@ 89H$ !" +"0(/@@4 @(/@@( #@T @(\" @( P, , P# , #Y1244^ ?R 0#%)14,A#9)24$B 1" +"_)!0,$Y145%R Y145$^&!81T! #9)24DV#Y)24DP ;&P -C4 $$B% @ !04%!04 @4(D$ #!(1" +"4 @#U574$^'^0D)!_&Z1D9'_$*!@8%^'Z!@8'_(&1D9'_(\"0D)#_%Z1D8%^/\\0$!#_ \"!_X$ /X! 0" +"$&(-$*!#_ $! 0'_/] ,$#_/\\&&&#_'Z!@8%^&\"0D)#_'V\"A8%^&>8D)#_$Z1D9%B(\" _X\" /X" +"! 0'^/ , PSP/P#' /\\,!@& 088!X!#@$>" +"!$*! H1#X)!04X!$9%1,1" +"(&!;A 0 _P " +" ! 0;H&!" +" @$\"" +"! (" +"\0"; int s,p,e,c,t,r,a,l; /* l e a k a g e */ + + int + F(int o + ,int n, int t + ){char*p=(o*(136-o) + >=1260)*7*(o-9)+G; for( + n=!(o=-1); n=*p+++64*n-*G + ,(o+=3)>>2<5-t; ); return 255 + &n>>2*o%8; } float L[0x400];int + T(float a,float b,float l,float*e) + {return L[0x3ff]||!(e[1]=b*a+l**e)|| + !T(l*a-b**e,b,l,e+1); } float f(int x) + {int w=s<>x&&P+(* + h+=f(e*(l+a*(2*x+1))*y)*f(s/2-e*a*y+e*a*y*y*(t/p + )/(s/p)))),++x); float z=f(y*t)*f(y*t); *h=z*(1+3* + z+2*z*z)/6**h/c; } return h-i-r+1; } void d(int w, + int n,FILE*f){int Z=s/t; int S[5]; float**P=M float* + )*c);for(r=0;r1?v[1][0]*c+v[1][1]:0; a=7;l=16;if(r ==11620){d (atoi + (v[2]), atoi(v[3]), q<5?stdin:fopen(v[4],"r")); return 0; } char*H=malloc(c),* h=H; sprintf (H,"\0" + "Usage\n" " %s [-" "h] [-d #c cid] file1 file2 ... (or stdin)"+(q-1&&r==11624 ),v[0]);if(* H)q=1;int + w=2>q?1:q -1; FILE**f=M FILE*)*w); f[0]=stdin; if(q>1)for(r=0; rungetc(* H++,*f); for(r =w; r--;) +{ i[r]=getc (f[r]); if(i[r]<0)i[r]=!++x; } if(x==w)break; while(++r<6){ while(C(b++,t,w,F(*i++,r< 5,r))); i-= +w; fwrite(b-=w,sizeof(float),l,stdout); } fflush(stdout); } while(fclose(f[--w]),w); E f); E b); E i); E h);} + diff --git a/2018/algmyr/spoiler.png b/2018/algmyr/spoiler.png new file mode 100644 index 000000000..068c39c8d Binary files /dev/null and b/2018/algmyr/spoiler.png differ diff --git a/2018/anderson/Makefile b/2018/anderson/Makefile new file mode 100644 index 000000000..233a1faf6 --- /dev/null +++ b/2018/anderson/Makefile @@ -0,0 +1,286 @@ +#!/usr/bin/env make +# +# 2018 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +GZIP_PROG= gzip +BZIP2= bzip2 +CURL= curl +DD= dd +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +CSILENCE= +#CSILENCE= -Wno-implicit-int + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=25 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= prog.orig.o +ALT_TARGET= prog.orig + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +prog.orig: prog.orig.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 3a3fabb90892eeb2f610ae0f74a35a970060665a063ab702bd686c17c4ae07f6 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2018/anderson/hint.html b/2018/anderson/hint.html new file mode 100644 index 000000000..c54b97233 --- /dev/null +++ b/2018/anderson/hint.html @@ -0,0 +1,99 @@ + + + + + + + Most able to divine code gaps + + +

    Most able to divine code gaps

    + +

    Derek Anderson

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +./prog < textfile
    +
    + +

    Try:

    + +
    ./prog < prog.c
    +./prog < prog.orig.c
    +./prog < hint.text
    +
    + +

    Selected Judges Remarks:

    + +

    With this entry, you won’t need to turn your monitor upside down!

    + +

    Compare prog.c and prog.orig.c and find out why we had to modify the entry, and what confused the author +(see the author’s remarks). No, it was not the shape of the Roman V that we, or the compiler, didn’t like.

    + +

    Author’s comments:

    + +

    Compiling the program

    + +
    gcc -Wall -Wextra -Wpedantic -O3 -std=c11 prog.c -o prog
    +
    + +

    Also works with a standard of c99, but c90/c89 will not compile due to +for loop initial declarations, along with additional warnings about +variable length arrays and lack of a return statement.

    + +

    Additional info

    + +

    This small program, when given text on stdin, will produce a pattern of +squiggly lines. This pattern is deterministic, and it shouldn’t be too +difficult to determine from whence they come. There is even a comment +that describes the highlighted phenomena in the source, for those that +require a small nudge. With denser text blocks, such as an essay or +similar prose, the output can be rather pretty, in an chaotic emergence +sort of way. Try using this file, or the source file as inputs.

    + +

    In its current form, this program can handle lines of length 255; to +adjust this limit, change the variable a at the top of the source. +Other adjustments, such as the exact printed characters, are rather +easy, once sufficient reverse engineering has occurred. Improvements +such as proper handling of tabs are left as an exercise to the reader.

    + +

    In developing this program, the author found a potentially interesting +bug. If the expression (j=k,j) (near the middle of the source) is +changed to (j=k,k), the program produces different output. The author +used compiler gcc 5.4.0, compiled for x86_64-linux-gnu. Enabling or +disabling optimization produces the same results. The author is not +sure who is the culprit, but instead shrugged and moved on with life. +Of course, YMMV with your own environment.

    + +

    The structure of this program, as you may have deduced, is two for +loops, one nested in the other. There is also a bunch of direct +variable assignment, such as j=k. There is some filler fluff, such as +0-0+0, but all that sort should be rather easy to spot. It was mostly +added for the purpose of making certain things line up right, and only +secondarily to obfuscate.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2018, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2018/anderson/hint.text b/2018/anderson/hint.text new file mode 100644 index 000000000..5887f70ec --- /dev/null +++ b/2018/anderson/hint.text @@ -0,0 +1,73 @@ +# Most able to divine code gaps + +Derek Anderson + + +## Judges' comments: +### To use: + + make + ./prog < textfile + +### Try: + + ./prog < prog.c + ./prog < prog.orig.c + ./prog < hint.text + +### Selected Judges Remarks: + +With this entry, you won't need to turn your monitor [upside down](http://en.wikipedia.org/wiki/River_%28typography%29)! + +Compare `prog.c` and `prog.orig.c` and find out why we had to modify the entry, and what confused the author +(see the author's remarks). No, it was not the shape of the Roman V that we, or the compiler, didn't like. + + +## Author's comments: +## Compiling the program + + gcc -Wall -Wextra -Wpedantic -O3 -std=c11 prog.c -o prog + +Also works with a standard of c99, but c90/c89 will not compile due to +for loop initial declarations, along with additional warnings about +variable length arrays and lack of a return statement. + +## Additional info + +This small program, when given text on stdin, will produce a pattern of +squiggly lines. This pattern is deterministic, and it shouldn't be too +difficult to determine from whence they come. There is even a comment +that describes the highlighted phenomena in the source, for those that +require a small nudge. With denser text blocks, such as an essay or +similar prose, the output can be rather pretty, in an chaotic emergence +sort of way. Try using this file, or the source file as inputs. + +In its current form, this program can handle lines of length 255; to +adjust this limit, change the variable `a` at the top of the source. +Other adjustments, such as the exact printed characters, are rather +easy, once sufficient reverse engineering has occurred. Improvements +such as proper handling of tabs are left as an exercise to the reader. + +In developing this program, the author found a potentially interesting +bug. If the expression `(j=k,j)` (near the middle of the source) is +changed to `(j=k,k)`, the program produces different output. The author +used compiler gcc 5.4.0, compiled for x86_64-linux-gnu. Enabling or +disabling optimization produces the same results. The author is not +sure who is the culprit, but instead shrugged and moved on with life. +Of course, YMMV with your own environment. + +The structure of this program, as you may have deduced, is two for +loops, one nested in the other. There is also a bunch of direct +variable assignment, such as `j=k`. There is some filler fluff, such as +`0-0+0`, but all that sort should be rather easy to spot. It was mostly +added for the purpose of making certain things line up right, and only +secondarily to obfuscate. + +-------------------------------------------------------------------------------- + diff --git a/2018/anderson/prog.c b/2018/anderson/prog.c new file mode 100644 index 000000000..5917bcba8 --- /dev/null +++ b/2018/anderson/prog.c @@ -0,0 +1,16 @@ +#include +int a = 256;int main(){for(char b[a+a+a], +*c=b ,*d=b+ a ,*e=b+a+a,*f,*g=fgets(e,(b[ +a]=b [a+a] =a- a,a) , stdin);c[0]=a-a,f=c +,c=d ,d=e ,e=f, f= g,g =0,g = fgets(e,a+a +-a+ a -a+a -a+ a- +a,stdin ),f +a-a ; pu\ +tchar(+10)) { for( int h= 1,i=1,j, k=0 ,l +=e[0]==32,m,n=0,o=c [ 0]== 32, p, q=0;d[q +];j=k,k=l,m=n,n=o,p=(j)+(k* 2 )+(l =(i = +e[ q]&&i ) &&e[q +1 ]== 32,l*4)+(m* 8 )+( +16* n )+( o =(h =c[ q]&&h)&&c[q+1]== +32,o* (16+16) )+0-0 +0, putchar(" ......" +/*\ ( ||| ) |/|/ / */".')|)\\\\\\\\'" +"" "|||" "|||" "|'" ")|)\\\\\\\\'/|/(/" +"(/'/|/\\|\\|'/|/(/(/'/|/\\|\\|"[d[q++]== +32?p:0]));}}/* typographic tributaries */ diff --git a/2018/anderson/prog.orig.c b/2018/anderson/prog.orig.c new file mode 100644 index 000000000..3f866d560 --- /dev/null +++ b/2018/anderson/prog.orig.c @@ -0,0 +1,16 @@ +#include +int a = 256;int main(){for(char b[a+a+a], +*c=b ,*d=b+ a ,*e=b+a+a,*f,*g=fgets(e,(b[ +a]=b [a+a] =a- a,a) , stdin);c[0]=a-a,f=c +,c=d ,d=e ,e=f, f= g,g =g,g = fgets(e,a+a +-a+ a -a+a -a+ a- +a,stdin ),f +a-a ; pu\ +tchar(+10)) { for( int h= 1,i=1,j, k=0 ,l +=e[0]==32,m,n=0,o=c [ 0]== 32, p, q=0;d[q +];p=(j=k,j)+(k=l,k*2)+(l=(i = i&&e [q] ) +&& e[q+1 ] ==32, l *4)+( m=n,m*8)+( n =o, +16* n )+( o =(h =c[ q]&&h)&&c[q+1]== +32,o* (16+16) )+0-0 +0, putchar(" ......" +/*\ ( ||| ) |/|/ / */".')|)\\\\\\\\'" +"" "|||" "|||" "|'" ")|)\\\\\\\\'/|/(/" +"(/'/|/\\|\\|'/|/(/(/'/|/\\|\\|"[d[q++]== +32?p:0]));}}/* typographic tributaries */ diff --git a/2018/bellard/Makefile b/2018/bellard/Makefile new file mode 100644 index 000000000..8cb3d0603 --- /dev/null +++ b/2018/bellard/Makefile @@ -0,0 +1,287 @@ +#!/usr/bin/env make +# +# 2018 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +GZIP_PROG= gzip +BZIP2= bzip2 +CURL= curl +DD= dd +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra ${CSILENCE} +#CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +CSILENCE= -Wno-implicit-int -Wno-parentheses -Wno-return-type + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=25 + +# include files that are needed to compile +# +#CINCLUDE= +#CINCLUDE= -include stdlib.h +CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= -lm +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= +ALT_TARGET= prog.orig + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +prog.orig: prog.orig.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 3a3fabb90892eeb2f610ae0f74a35a970060665a063ab702bd686c17c4ae07f6 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2018/bellard/fruits.bin b/2018/bellard/fruits.bin new file mode 100644 index 000000000..0165676ef Binary files /dev/null and b/2018/bellard/fruits.bin differ diff --git a/2018/bellard/hint.html b/2018/bellard/hint.html new file mode 100644 index 000000000..e542cdb32 --- /dev/null +++ b/2018/bellard/hint.html @@ -0,0 +1,113 @@ + + + + + + + Most inflationary + + +

    Most inflationary

    + +

    Fabrice Bellard
    +https://bellard.org/

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +./prog > lena.ppm
    +
    + +

    Try:

    + +
    eog lena.ppm # On Linux
    +preview lena.ppm # On MacOS
    +
    +wget http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png
    +pngtopnm < Lenna.png | pnmscale 0.25 | cjpeg -arithmetic -dct float -quality 14 > small.jpg
    +
    + +

    The file small.jpg will be approximately of the same size as the raw image data +in the program. Compare the level of the detail and the artifacts of +small.jpg and lena.ppm.

    + +

    Selected Judges Remarks:

    + +

    Compressing images is just a matter of simple arithmetic and some magic, isn’t it?

    + +

    We could understand some of the arithmetic but none of the magic.

    + +

    Deciphering the mechanism used for data encoding to make use +of the whitespaces, braces and semicolons should be a slightly easier task.

    + +

    Author’s comments:

    + +

    This program outputs a 128x128 RGB image file to the standard output +using the portable pixmap file format (PPM). It contains the famous +“Lena” image which is used in many image compression tests.

    + +

    The uncompressed image is 12 times larger than the source code of the +program which includes the image data and the complete decoder. The +actual image data is 1220 byte long, which gives a compression ratio +of 40. Using a JPEG-like algorithm would not be enough to reach this +level of compression (the Lena image would be barely recognizable). So +the algorithm is based on the latest advances in image compression. It +includes the following features:

    + +
      +
    • DCT transform with variable block size (4x4, 8x8, 16x16 and 32x32)
    • +
    • DC and directional predictors
    • +
    • arithmetic coding
    • +
    • YCgCo color space.
    • +
    + + +

    The image data is encoded to a C string with some tricks to make the +best use of the IOCCC size constraints. The identifiers were shortened +to a single letter to save space. No specific obfuscation was needed +as the algorithms already have a significant complexity.

    + +

    Although the program was optimized to decompress its built-in image, +it accepts to decompress image files from its standard +input. Examples:

    + +
    ./prog d < lena512.bin > lena512.ppm
    +./prog d < fruits.bin > fruits.ppm
    +./prog d < vintage_cars.bin > vintage_cars.ppm
    +
    + +

    The original images for fruits and vintage cars come from +Wikipedia and were resized to a width of 1024 pixels. Warning: the +program is not protected against invalid input.

    + +

    The program should be portable on any Unix system. On Windows the line +“setmode(0, 32768); setmode(1, 32768);” must be added at the start of +the main() function to avoid unwanted carriage return characters in +the output.

    + +
    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2018, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2018/bellard/hint.text b/2018/bellard/hint.text new file mode 100644 index 000000000..6e9df4f5d --- /dev/null +++ b/2018/bellard/hint.text @@ -0,0 +1,87 @@ +# Most inflationary + +Fabrice Bellard + + + +## Judges' comments: +### To use: + + make + ./prog > lena.ppm + +### Try: + + eog lena.ppm # On Linux + preview lena.ppm # On MacOS + + wget http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png + pngtopnm < Lenna.png | pnmscale 0.25 | cjpeg -arithmetic -dct float -quality 14 > small.jpg + +The file `small.jpg` will be approximately of the same size as the raw image data +in the program. Compare the level of the detail and the artifacts of +`small.jpg` and `lena.ppm`. + +### Selected Judges Remarks: + +Compressing images is just a matter of simple arithmetic and some magic, isn't it? + +We could understand some of the arithmetic but none of the magic. + +Deciphering the mechanism used for data encoding to make use +of the whitespaces, braces and semicolons should be a slightly easier task. + + +## Author's comments: +This program outputs a 128x128 RGB image file to the standard output +using the portable pixmap file format (PPM). It contains the famous +"Lena" image which is used in many image compression tests. + +The uncompressed image is 12 times larger than the source code of the +program which includes the image data and the complete decoder. The +actual image data is 1220 byte long, which gives a compression ratio +of 40. Using a JPEG-like algorithm would not be enough to reach this +level of compression (the Lena image would be barely recognizable). So +the algorithm is based on the latest advances in image compression. It +includes the following features: + +- DCT transform with variable block size (4x4, 8x8, 16x16 and 32x32) +- DC and directional predictors +- arithmetic coding +- YCgCo color space. + +The image data is encoded to a C string with some tricks to make the +best use of the IOCCC size constraints. The identifiers were shortened +to a single letter to save space. No specific obfuscation was needed +as the algorithms already have a significant complexity. + +Although the program was optimized to decompress its built-in image, +it accepts to decompress image files from its standard +input. Examples: + + ./prog d < lena512.bin > lena512.ppm + ./prog d < fruits.bin > fruits.ppm + ./prog d < vintage_cars.bin > vintage_cars.ppm + +The original images for [fruits][1] and [vintage cars][2] come from +Wikipedia and were resized to a width of 1024 pixels. Warning: the +program is not protected against invalid input. + +The program should be portable on any Unix system. On Windows the line +"_setmode(0, 32768); _setmode(1, 32768);" must be added at the start of +the main() function to avoid unwanted carriage return characters in +the output. + +-------------------------------------------------------------------------------- + +[1]: https://commons.wikimedia.org/wiki/File%3AFruits_oranges%2C_jardin_japonais_2.JPG +[2]: https://commons.wikimedia.org/wiki/File%3ARed_Bull_Jungfrau_Stafette%2C_10th_stage_-_vintage_cars_%282%29.jpg + +-------------------------------------------------------------------------------- + diff --git a/2018/bellard/lena512.bin b/2018/bellard/lena512.bin new file mode 100644 index 000000000..088549a01 Binary files /dev/null and b/2018/bellard/lena512.bin differ diff --git a/2018/bellard/prog.c b/2018/bellard/prog.c new file mode 100644 index 000000000..9d30ad47d --- /dev/null +++ b/2018/bellard/prog.c @@ -0,0 +1,134 @@ +#include +#define e(a, d) for(a=0;a; ?{ c; ; W; ; l; } h} p} i{ % } P} /{ *}  % L; ; !{  S{ n }  " +" x;  { 1  J; v{ U} ({ @ X{ k} H; 4; e J 6; ; v; G{ { ] &{ A d{ l M{ ; K ;; 4 -{ }} p h{ ; { r W; v{ ; f} } 1{ ^ &{ 9{ { ; ~; n; q{ 9  R 6{ { u; a; ; U; ; Y} +} } 2 s k; 8 { J K; ' i; ; $; W{ P !{ { { P } [; (; Q; U n; +}  g{ C; { { ; <{ v  S} b; 6 ` } ?{ + %; } n; q{ r} k; ; { c{ S} 2} ~{ 4; R W v}  R; k I} |;  d; [ O} 5; ; ; } Z d {  { &; h o{ V v ; _{ { /} F{ f{ r{ 4{ { ?{ 4; S} :; ] ; E} ; &} # e !{ >{ H; { O{ 0; } H; p ; w}  >{ 1} { -} 4 ; " +"S} } u L{ y} %; 2  |{ (} /; ,{  )} Y; g} G} v; T} }; } i {{ }; [{ E{ q} g; T{ ={ } R; k{ j; _; h} g P c; ({ F; 6} }} 3 ,} <; 0  P; { ' t} u} ; } U} s{ 8{ E}  >{ } E { G { H :{  Y o g} } F D{ R{ -; M ?; = q} _ U { ;  I  { |{ { }   1{ ,} { x{ { U{ s; J} }  6{ > 7 ; ,{ D{ {{ ; ]} ; M; &} { V}  n{ & T ~; ({ } [; r{ # u{ X 9; L; U f} )}  { T}  p{ N; >{ > }  } D} m { 1{ { } X ; o} w} $} ^ v} K  f ,} ^ 3; { @{ _} _{ o; 4} h} H; # .{ {} ; <{ { G{ $; { " +"z { a{ { D; ? |} { { ; `}  } Q} j; 4}  3{ Q} { * ; } r{ a} } R { p @;  N{ { f; A; 8} L $} { } } J{ } k{ r}  { [; -; p{ I{  { &} J; T} ?{ Z{ >; 5 >; ];  w z ^} u; ); H} ; L &; V E{ 1{ g; C}  V} ~; U; ^{ J; { /} {; (} y} a K  /} .} ; K; N{ w{ `{ }  T{ l `; #; N{ l X; ?; +} {  w{ ; q; z; _; y} 8}  &{ X} V{ W G}  ,; [} U{ v{ Q; w{  [  Y} N Y u i{ { ! A{ }{ b 0; X ~} ; -; 8{ E  } ; F{ y {} {  "; +int y[3][1<<20],i[2048],X[166],p,r=1,f,s,O,P; +Q(){ +int b; +r*=s; +p*=s; +if(s>>9){ +if(b=*x){ +p+=b-1-(b>10)-(b>13)-(b>34)-(b>92)<<4; +b=x[1]; +x+=2; +p+=b<33?(b^8)*2%5:(b^6)%3*4+(*x++^8)*2%5+4; +} +} +else{ +b=getchar(); +p+=b<0?0:b; +} +} +t(E){ +int u,k,F,*m; +if(r=u){ +p-=u; +r-=u; +} +else r=u; +m[k]++; +if(F>63){ +*m/=2; +m[1]/=2; +} +return k; +} +n(E){ +int a,b; +a=0; +while(!t(E+a))a++; +b=1; +while(a--)b=b<<1|t(4); +return b-1; +} +R(S,Y,T,Z,U,d,V)int*S,*T; +{ +int G,a,j,H; +e(H,d)e(a,d){ +G=0; +e(j,d)G+=T[j*Z+H*U]*lrint(cos(acos(-1)/d*(a+0.5)*j)*sqrt(2-!j)*1024); +S[a*Y+H*U]=G+(1<>V; +} +} +W(z,l,g){ +int v,a,j,I,d,k,A,*o,c,B,q,C,h,w,J; +if(g>5||g>2&&t(g-3)){ +c=1<<--g; +e(a,4)W(z+a%2*c,l+a/2*c,g); +} +else{ +c=1<0; +e(a,d)i[a]=0; +e(a,d){ +if(t(61+g*2+B))break; +a+=n(5+B*10); +k=1-2*t(3); +i[a]=k*(n(25+(B+(a>3)+j+I; +if(k=h<0)h=(h*8+w/2)/w-2; +h=h>3; +} +} +} +} +} +K(b){ +putchar(b<0?0:b>255?255:b); +} +main(D){ +int a,l,L,M,g,N; +s=D>1?256:1968; +Q(); +g=n(5); +f=1< +#define e(a, d) for(a=0;a;  a{ }} p [{ {{ { b{ b; @ H{ { s; { =} &} 0; }} 8{ N} { X; } I; 3} W { 9; P{ { } } H i} A { U{ } D; }; t; s; S; +; { O} n V} 7; x{ f{ P} 4} B{ M ; Y} g} ; ?{ ;{ t; 5 K ; * { H } w ; S E  n{ D} I{ &; {} = 9 } B; W{ 4} p; l{ A u; q{ X ~ +; O{ $ j { G; ; ' r b} 3 j 9} } `} m} 4; r; 8; y; r} " +"t} >; ~} E; G} 9} 5 ; / i} p{ :;  C{ I} ;  2{ c{ x} }} ?} 5{ i{ <} { } )} C{ V} ?; X *; P{ L{ c{ M; T{ < _{ {} M ; V; q{ } $} l} P{ Y{ #{ N{ 9 ); ]}  u{ { F ; ( ' ) % J } x =; Y Q{ Q} I '} B { } g} |{ ! n ( { } C; # |; { =} D{ 3} } L{ F} #} ` k} M; ]} J{ } 7} 4} Z}   ]} } v 6 ; X; Y{ Q x} { ;}  ; { . <{ b} 7{ } 6 ; { x; & { ] { ~; [ P r} X} W 9 } { O{ ; f ; )} :; &{ -; E g{ )} { 0} Z{ S} y; } N; ; ; k} Y{ `  z;  } ? K v} &; 6 1; ^ Y{ }{ ){ A{ ${ #} M w; " +"6{ > } B} o} ; M{ ({ ( {} H; ` h j{  z; }; 7; f; { L; #{  ; { #} 4} N{ z j} { o ; 3{ j; l B} 9} F } J; F 2 ;  F T w +} y{ _ } ; l{ }} 4} 8} ]} l{ } K; ; @} { v ;  b 0; 0; } V; *} R; p; j; &; _; 9; ; { J; W #} { h; ^{ t; | Q}  [; U; >} ^} /  ~{ @} { n k{ N} { H{ j}  { W; X; 8{ 3; u :} T{ P; 0  ; k; Z} v{ X} { ; { `{ #{ ; n} ; U} d} d{ &{ n { | t{ a T} v} $} 7; Q; f; W; O} E; } c} F{ 8} A A; ~{ `; w; x <; G} f} 7; r E{ ~{ n} F 5} ^{ c { ; { !{ |} " +"1{ [} ; 3} ; { 8 a} p I g; 9{ n} -} T} e{ !} ;  / 0{ 9; V{ >; W} F; +} L} F{ S} +{ ,  }   o; { x;  i; 9  "; +int w[3][16384],h[512],T[160],p,q=1,g=128; +M(){ +int b; +q*=1968; +p*=1968; +if(b=*v){ +p+=b-1-(b>10)-(b>13)-(b>34)-(b>92)<<4; +b=v[1]; +v+=2; +p+=b<33?(b^8)*2%5:(b^6)%3*4+(*v++^8)*2%5+4; +} +} +r(A){ +int s,j,B,*m; +if(q<1968)M(); +m=T+A*2; +B=*m+m[1]+2; +s=q*(*m+1)/B; +if(j=p>=s){ +p-=s; +q-=s; +} +else q=s; +m[j]++; +if(B>63){ +*m/=2; +m[1]/=2; +} +return j; +} +C(A){ +int a,b; +a=0; +while(!r(A+a))a++; +b=1; +while(a--)b=b<<1|r(3); +return b-1; +} +N(O,U,P,V,Q,d,R)int*O,*P; +{ +int D,a,i,E; +e(E,d)e(a,d){ +D=0; +e(i,d)D+=P[i*V+E*Q]*(i>0?lrint(cos(acos(-1)/d*(a+0.5)*i)*1448.155):1024); +O[a*U+E*Q]=D+(1<>R; +} +} +S(x,k,l){ +int t,a,i,F,d,j,y,*n,c,z,o,G,f,u,H; +if(l>2&&(l>4||r(0+l-3))){ +c=1<<--l; +e(a,4)S(x+a%2*c,k+a/2*c,l); +} +else{ +c=1<0; +e(a,d)h[a]=0; +e(a,d){ +if(r(60+l*2+z))break; +a+=C(4+z*10); +j=1-2*r(2); +h[a]=j*(C(24+(z+(a>3)+i+F; +if(j=f<0)f=(f*8+u/2)/u-2; +f=f>3; +} +} +} +} +} +I(b){ +putchar(b<0?0:b>255?255:b); +} +main(){ +int a,k,J,K,L; +M(); +S(0,0,7); +puts("P6\n128 128\n255"); +e(a,g*g){ +k=w[0][a]; +J=w[1][a]; +K=w[2][a]; +L=k-J; +I(L+K); +I(k+J); +I(L-K); +} +return 0; +} + diff --git a/2018/bellard/vintage_cars.bin b/2018/bellard/vintage_cars.bin new file mode 100644 index 000000000..e99e351ca Binary files /dev/null and b/2018/bellard/vintage_cars.bin differ diff --git a/2018/burton1/Makefile b/2018/burton1/Makefile new file mode 100644 index 000000000..f324b63ad --- /dev/null +++ b/2018/burton1/Makefile @@ -0,0 +1,286 @@ +#!/usr/bin/env make +# +# 2018 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +GZIP_PROG= gzip +BZIP2= bzip2 +CURL= curl +DD= dd +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +CSILENCE= +#CSILENCE= -Wno-implicit-int + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=25 + +# include files that are needed to compile +# +#CINCLUDE= +#CINCLUDE= -include stdlib.h +CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog prog.nowarn +# +ALT_OBJ= prog.nowarn.o +ALT_TARGET= prog.nowarn + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +prog.nowarn: prog.nowarn.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 3a3fabb90892eeb2f610ae0f74a35a970060665a063ab702bd686c17c4ae07f6 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2018/burton1/hint.html b/2018/burton1/hint.html new file mode 100644 index 000000000..700b55d96 --- /dev/null +++ b/2018/burton1/hint.html @@ -0,0 +1,254 @@ + + + + + + + Best one-liner + + +

    Best one-liner

    + +

    Dave Burton
    +http://ioccc.snox.net

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +./prog < any-file
    +
    + +

    Try:

    + +
    ./prog < prog
    +./prog < prog.c
    +
    + +

    Selected Judges Remarks:

    + +

    One line, one array, one loop and one statement but it prints many bytes. It won.

    + +

    Author’s comments:

    + +

    Feed this anything on stdin.

    + +

    The included script may be used as a driver program for this entry. +It adds several nice-to-have features, and allows salt-to-taste customizability.

    + +

    This code has been compiled and tested on:

    + +
      +
    • OSX-10.11, gcc 4.2.1 and clang 3.0, -O0 and -O3
    • +
    • X86-Linux, gcc 4.1.2 and 4.8.4, -O0 and -O3
    • +
    • ARM-QEMU, gcc 4.8.4, -O0 and -O3
    • +
    • X86-FreeBSD 10.3, clang 3.4.1, -O0 and -O3
    • +
    • TCC 0.9.26 (x86-64) (used as a proxy for 2001/bellard)
    • +
    • UNIX V7 pcc (Johnson’s C compiler) on a simulated PDP-11/45 +(see spoiler for further detail)
    • +
    + + +
    Spoiler below; scroll down.
    + + +

    SPOILER

    + +

    This started life as a personal challenge: write the shortest hex dump utility in C.

    + +

    The self-imposed ground rules in the hunt for shortest: +the code has to output correctly, +no extraneous newlines, the code must be portable, +and without bypassing the solution using execve(2), +or functions built upon it (system(3), popen(3), etc). E.g:

    + +
    main(){system("hd");}   // it's turtles all the way down!
    +
    + +

    is not acceptable. +And, “output correctly” is the output format of this entry. QED.

    + +

    Early attempts ended up at a reasonably short 157 characters. +This was too long for a one-liner, so it had to be formatted as something more interesting. +This solution is pleasing, but a true one-liner was the hoped-for goal. +Here is the 157 character version in it’s entirety:

    + +
    char     O,o[  20];L(O){
    +putchar  ( O+  48+39  *(9<
    +O));}    I(O)  {L(~     15);
    +O|| puts(o);}  main     (l){
    +for(;~(l=getchar())     ;I(O
    +&=15     ))o[  O++      ]=4<
    +(4^l     >>5)  ?l:     46,L
    +(l>>     4),L  (l&15);O&&
    +I(o[     O]=0  );}//157c
    +
    + +

    While thinking about this in the shower (you are not the only one that does this!) +came the idea which reduced the code to just 119 chars. +This dramatic reduction started to feel close to minimal, and the hunt resumed. +The progression to the present size is interesting, +and it is interesting that the same algorithm can be expressed so differently +by slight rearrangement of its parts.

    + +
    // 119
    +char O,o[20];main(l){for(;~(l=getchar());O||puts(o))o[O++]=isprint(l)?l:46,O&=15,printf("%02x ",l);O[o]=0;O&&puts(o);}
    +// 116
    +char O,o[20];main(l){for(;O++[o]=~(l=getchar())?4<(4^l>>5)?l:46:0;(O&=15)||puts(o))printf("%02x ",l);O>1&&puts(o);}
    +// 115
    +char O,o[20];main(l){for(;O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0;(O=-~O&15)||puts(o))printf("%02x ",l);O&&puts(o);}
    +// 113
    +char O,o[20];main(l){for(;~l;(O=~l?printf("%02x ",l),-~O&15:!O)||puts(o))O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0;}
    +// 112
    +char O,o[20];main(l){for(;~l;(O=~l?-~O&printf("%02x ",l)*5:!O)||puts(o))O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0;}
    +// 111
    +char O,o[20];main(l){for(;~l;O||puts(o))O=(O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0)?-~O&printf("%02x ",l)*5:!O;}
    +// 110
    +char O,o[0];main(l){for(;~l;O||puts(o))O=(O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0)?-~O&printf("%02x ",l)*5:!O;}
    +// 109
    +char O,o[];main(l){for(;~l;O||puts(o))O=(O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0)?-~O&printf("%02x ",l)*5:!O;}
    +
    + +

    There are solutions without the ASCII sidebar that are significantly shorter. +These do not compete in the same category, since their output is materially different. +They are derived from the solutions above, but are still fascinating as concise utilities, +so here is their progression, for the curious:

    + +
    // 102
    +I;O(O){putchar(O+48+39*(9<O));}main(l){for(;~(l=getchar());O(++I&15?~15:~37))O(l>>4),O(l&15);O(-38);}
    +// 80
    +O;main(l){while(~(l=getchar()))printf("%02x%c",l,++O&15?32:10);O&15&&puts("");}
    +// 78
    +O;main(l){for(;~l;(O=~(l=getchar())?printf("%02x ",l),-~O&15:!O)||puts(""));}
    +// 77
    +O;main(l){for(;~l;(O=~(l=getchar())?-~O&printf("%02x ",l)*5:!O)||puts(""));}
    +// 76
    +O;main(l){for(;~l;O||puts(&O))O=~(l=getchar())?-~O&printf("%02x ",l)*5:!O;}
    +
    + +

    It is possible to reduce the size of each of these by one by eliding the trailing newline. +This was not reported above since the newline kept getting appended by processing software, +and it is more interesting to remove characters by changing code than by filtering:

    + +
    $ tr -d '\012' < 109.c | wc -c
    +108
    +$ tr -d '\012' < 76.c | wc -c
    +75
    +$ tr -d '\012' < 109.c | cc -o 108 -xc -
    +$ verify 108
    +$
    +
    + +

    An obfuscated hex dump has been done before: +1986/bright/bright.c is similar in function, +but it uses more characters in just setting up its obfuscation than this entire solution!

    + +

    BIGGER SPOILER

    + +

    If you are unhappy with the way DEL (character 127) is handled, +replace the cryptic expression 4<(4^l>>5)?l:46 with 32>l|l>126?46:l. +Both take the same number of characters, but the former is a bit more interesting. +Bonus question: how does the first expression work?

    + +

    BIGGEST SPOILER (and some history)

    + +

    Technically, char o[0]; is illegal (SS 6.7.6.2) according to ISO (N1570). +And char o[]; is a conditionally supported feature (SS 6.7.6.2, 6.10.8.3). +However, it works in modern C implementations as an extension, +including GCC, Clang and TCC, for X86 and ARM, +on multiple operating systems (Linux, OSX, FreeBSD), so it is functionally correct. +MicroSoft Visual C++ does not allow char o[] or char o[0], +and implements its close relative char o[1] +such that writing more than a single char will cause a fault, which is technically correct.

    + +

    But how does this work at all, even as an extension? +o[] allocates one(!) byte in a zero-filled data area (formerly BSS). +The UNIX-derived systems this code was run upon all place the +storage of O and o into a zero-filled VM page with nothing following: +thus, there are plenty of available and unused zero bytes following O, addressed via o, +and this code only needs 17. +This is undefined behavior, but as shown, it is widely available.

    + +

    The 1979 Seventh Edition UNIX (v7) system pre-dates the IOCCC by several years, +and the source code to sh(1) was a significant inspiration for this contest. +There are two C compilers present: cc written by Dennis Ritchie, and pcc written by Steven Johnson. +The nested conditional expressions in 116 and smaller are too complex for cc (“Illegal conditional”) +but pcc handles them correctly, and neither compiler accepts char o[] or char o[0] nor puts the bytes in +a zero-filled page (as a paged VM was not yet written for UNIX).

    + +

    More significant is that v7 printf(3) does not report the number of characters written, +and therefore 111 compiles but does not work correctly; +113 is the shortest code that compiles and runs correctly in Ancient UNIX.

    + +

    Interesting digression: v7 printf (_doprnt) was written in PDP-11 assembler. +It pre-dates varargs.h, and assembly was the only way to gain access to the variable argument types. +The first edition The C Programming Language, 1978, page 71, remarks:

    + +

    By the way, there is no entirely satisfactory way to write a portable function +that accepts a variable number of arguments, because there is no portable way +for the called function to determine how many arguments where actually passed to it in a given call. +… +printf, the most common C function with a variable number of arguments, +… is also non-portable and must be modified for different environments.

    + +

    It is fascinating to explore the roots of C through the history of the operating system +it was birthed within. C is often criticized as a difficult, inscrutable language, +but as this contest demonstrates, this is in parody. +Shell-gol is one of those instances where someone preferred a different language, +and (ab)used the preprocessor to re-mold C into something they found comfortable. +Most of the rest of the system, especially in the kernel, +are models of clarity and efficient expression.

    + +

    TL;DR

    + +

    So which version is the shortest, portable hex dump?

    + +
      +
    • 109 works with (most?) modern Unix-like systems and compilers, see example list above.
    • +
    • 111 works adds Microsoft, is standards-approved, and does not exploit undefined behavior.
    • +
    • 113 works on Ancient UNIX and the portable C compiler.
    • +
    • 119 works on all platforms, including the original Ritchie PDP-11 C compiler.
    • +
    + + +

    Coda

    + +

    Clearly, the smallest possible program violates modern best practice. +It is not even possible to compile cleanly, but it will compile correctly.

    + +

    Included is prog.nowarn.c, a modern C implementation that is – perhaps – the smallest, +clean-compiling version using clang or gcc with -Wall -pedantic. +Note that while this is larger than all but the original attempt, +it will not work with the original Ritchie PDP-11 C compiler, +since the expression within the ternary remains too complex.

    + +

    Try

    + +
    cat prog.c prog.nowarn.c
    +
    + +

    to compare the differences (diff is not helpful on a one-liner).

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2018, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2018/burton1/hint.text b/2018/burton1/hint.text new file mode 100644 index 000000000..2240b30c4 --- /dev/null +++ b/2018/burton1/hint.text @@ -0,0 +1,224 @@ +# Best one-liner + +Dave Burton + + + +## Judges' comments: +### To use: + + make + ./prog < any-file + +### Try: + + ./prog < prog + ./prog < prog.c + +### Selected Judges Remarks: + +One line, one array, one loop and one statement but it prints many bytes. It won. + +## Author's comments: +Feed this anything on stdin. + +The included script may be used as a driver program for this entry. +It adds several nice-to-have features, and allows salt-to-taste customizability. + +This code has been compiled and tested on: + +* OSX-10.11, gcc 4.2.1 and clang 3.0, -O0 and -O3 +* X86-Linux, gcc 4.1.2 and 4.8.4, -O0 and -O3 +* ARM-QEMU, gcc 4.8.4, -O0 and -O3 +* X86-FreeBSD 10.3, clang 3.4.1, -O0 and -O3 +* TCC 0.9.26 (x86-64) (used as a proxy for [2001/bellard](http://ioccc.org/years.html#2001_bellard)) +* UNIX V7 pcc (Johnson's C compiler) on a [simulated PDP-11/45](http://simh.trailing-edge.com/) + (see spoiler for further detail) + +
    Spoiler below; scroll down.
    + +SPOILER +------- + +This started life as a personal challenge: write the shortest hex dump utility in C. + +The self-imposed ground rules in the hunt for shortest: +the code has to output correctly, +no extraneous newlines, the code must be portable, +and without bypassing the solution using execve(2), +or functions built upon it (system(3), popen(3), etc). E.g: + + main(){system("hd");} // it's turtles all the way down! + +is not acceptable. +And, "output correctly" is the output format of this entry. QED. + +Early attempts ended up at a reasonably short 157 characters. +This was too long for a one-liner, so it had to be formatted as something more interesting. +This solution is pleasing, but a true one-liner was the hoped-for goal. +Here is the 157 character version in it's entirety: + + char O,o[ 20];L(O){ + putchar ( O+ 48+39 *(9< + O));} I(O) {L(~ 15); + O|| puts(o);} main (l){ + for(;~(l=getchar()) ;I(O + &=15 ))o[ O++ ]=4< + (4^l >>5) ?l: 46,L + (l>> 4),L (l&15);O&& + I(o[ O]=0 );}//157c + +While thinking about this in the shower (you are not the only one that does this!) +came the idea which reduced the code to just 119 chars. +This dramatic reduction started to feel close to minimal, and the hunt resumed. +The progression to the present size is interesting, +and it is interesting that the same algorithm can be expressed so differently +by slight rearrangement of its parts. + + // 119 + char O,o[20];main(l){for(;~(l=getchar());O||puts(o))o[O++]=isprint(l)?l:46,O&=15,printf("%02x ",l);O[o]=0;O&&puts(o);} + // 116 + char O,o[20];main(l){for(;O++[o]=~(l=getchar())?4<(4^l>>5)?l:46:0;(O&=15)||puts(o))printf("%02x ",l);O>1&&puts(o);} + // 115 + char O,o[20];main(l){for(;O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0;(O=-~O&15)||puts(o))printf("%02x ",l);O&&puts(o);} + // 113 + char O,o[20];main(l){for(;~l;(O=~l?printf("%02x ",l),-~O&15:!O)||puts(o))O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0;} + // 112 + char O,o[20];main(l){for(;~l;(O=~l?-~O&printf("%02x ",l)*5:!O)||puts(o))O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0;} + // 111 + char O,o[20];main(l){for(;~l;O||puts(o))O=(O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0)?-~O&printf("%02x ",l)*5:!O;} + // 110 + char O,o[0];main(l){for(;~l;O||puts(o))O=(O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0)?-~O&printf("%02x ",l)*5:!O;} + // 109 + char O,o[];main(l){for(;~l;O||puts(o))O=(O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0)?-~O&printf("%02x ",l)*5:!O;} + +There are solutions without the ASCII sidebar that are significantly shorter. +These do not compete in the same category, since their output is materially different. +They are derived from the solutions above, but are still fascinating as concise utilities, +so here is their progression, for the curious: + + // 102 + I;O(O){putchar(O+48+39*(9>4),O(l&15);O(-38);} + // 80 + O;main(l){while(~(l=getchar()))printf("%02x%c",l,++O&15?32:10);O&15&&puts("");} + // 78 + O;main(l){for(;~l;(O=~(l=getchar())?printf("%02x ",l),-~O&15:!O)||puts(""));} + // 77 + O;main(l){for(;~l;(O=~(l=getchar())?-~O&printf("%02x ",l)*5:!O)||puts(""));} + // 76 + O;main(l){for(;~l;O||puts(&O))O=~(l=getchar())?-~O&printf("%02x ",l)*5:!O;} + +It is possible to reduce the size of each of these by one by eliding the trailing newline. +This was not reported above since the newline kept getting appended by processing software, +and it is more interesting to remove characters by changing code than by filtering: + + $ tr -d '\012' < 109.c | wc -c + 108 + $ tr -d '\012' < 76.c | wc -c + 75 + $ tr -d '\012' < 109.c | cc -o 108 -xc - + $ verify 108 + $ + +An obfuscated hex dump has been done before: +[1986/bright/bright.c](http://ioccc.org/1986/bright/bright.c) is similar in function, +but it uses more characters in just setting up its obfuscation than this entire solution! + +BIGGER SPOILER +-------------- + +If you are unhappy with the way DEL (character 127) is handled, +replace the cryptic expression `4<(4^l>>5)?l:46` with `32>l|l>126?46:l`. +Both take the same number of characters, but the former is a bit more interesting. +Bonus question: how does the first expression work? + +BIGGEST SPOILER (and some history) +---------------------------------- + +Technically, `char o[0];` is illegal (SS 6.7.6.2) according to ISO (N1570). +And `char o[];` is a conditionally supported feature (SS 6.7.6.2, 6.10.8.3). +However, it works in modern C implementations as an extension, +including GCC, Clang and TCC, for X86 and ARM, +on multiple operating systems (Linux, OSX, FreeBSD), so it is _functionally_ correct. +MicroSoft Visual C++ does not allow `char o[]` or `char o[0]`, +and implements its close relative `char o[1]` +such that writing more than a single char will cause a fault, which is _technically_ correct. + +But how does this work at all, even as an extension? +`o[]` allocates one(!) byte in a zero-filled data area (formerly BSS). +The UNIX-derived systems this code was run upon all place the +storage of `O` and `o` into a zero-filled VM page with nothing following: +thus, there are plenty of available and unused zero bytes following `O`, addressed via `o`, +and this code only needs 17. +This is _undefined_ behavior, but as shown, it is widely available. + +The [1979 Seventh Edition UNIX][1] (v7) system pre-dates the IOCCC by several years, +and the source code to `sh`(1) was a [significant inspiration for this contest][2]. +There are two C compilers present: `cc` written by Dennis Ritchie, and `pcc` written by Steven Johnson. +The nested conditional expressions in 116 and smaller are too complex for `cc` ("Illegal conditional") +but `pcc` handles them correctly, and neither compiler accepts `char o[]` or `char o[0]` nor puts the bytes in +a zero-filled page (as a paged VM was not yet written for UNIX). + +[1]: http://minnie.tuhs.org/cgi-bin/utree.pl +[2]: http://ioccc.org/all/README +[3]: http://www.computerworld.com.au/article/279011/a-z_programming_languages_bourne_shell_sh/?pp=4 + +More significant is that v7 `printf`(3) does not report the number of characters written, +and therefore 111 compiles but does not work correctly; +113 is the shortest code that compiles and runs correctly in Ancient UNIX. + +> Interesting digression: v7 `printf` (`_doprnt`) was written in PDP-11 assembler. +> It pre-dates `varargs.h`, and assembly was the only way to gain access to the variable argument types. +> The first edition _The C Programming Language_, 1978, page 71, remarks: + +>> By the way, there is no entirely satisfactory way to write a portable function +>> that accepts a variable number of arguments, because there is no portable way +>> for the called function to determine how many arguments where actually passed to it in a given call. +>> ... +>> `printf`, the most common C function with a variable number of arguments, +>> ... is also non-portable and must be modified for different environments. + +> It is fascinating to explore the roots of C through the history of the operating system +> it was birthed within. C is often criticized as a difficult, inscrutable language, +> but as this contest demonstrates, this is in parody. +> _Shell-gol_ is one of those instances where someone [preferred a different language][3], +> and (ab)used the preprocessor to re-mold C into something they found comfortable. +> Most of the rest of the system, especially in the kernel, +> are models of clarity and efficient expression. + +TL;DR +----- + +So which version is the shortest, portable hex dump? + +* 109 works with (most?) modern Unix-like systems and compilers, see example list above. +* 111 works adds Microsoft, is standards-approved, and does not exploit undefined behavior. +* 113 works on Ancient UNIX and the portable C compiler. +* 119 works on all platforms, including the original Ritchie PDP-11 C compiler. + +Coda +---- + +Clearly, the smallest possible program violates modern best practice. +It is not even possible to compile cleanly, but it will compile correctly. + +Included is `prog.nowarn.c`, a modern C implementation that is -- perhaps -- the smallest, +clean-compiling version using `clang` or `gcc` with `-Wall -pedantic`. +Note that while this is larger than all but the original attempt, +it will *not* work with the original Ritchie PDP-11 C compiler, +since the expression within the ternary remains too complex. + +Try + + cat prog.c prog.nowarn.c + +to compare the differences (`diff` is not helpful on a one-liner). + +-------------------------------------------------------------------------------- + diff --git a/2018/burton1/prog.c b/2018/burton1/prog.c new file mode 100644 index 000000000..409607b59 --- /dev/null +++ b/2018/burton1/prog.c @@ -0,0 +1 @@ +char O,o[];main(l){for(;~l;O||puts(o))O=(O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0)?-~O&printf("%02x ",l)*5:!O;} diff --git a/2018/burton1/prog.nowarn.c b/2018/burton1/prog.nowarn.c new file mode 100644 index 000000000..e53e07656 --- /dev/null +++ b/2018/burton1/prog.nowarn.c @@ -0,0 +1 @@ +int O;char o[17];int main(int l,char**v){for(;~l;O?O:puts(o))O=(O[o]=~(l=getchar())?4<(4^l>>5)?l:46:0)?-~O&printf("%02x ",l)*5:!O;return!v;} diff --git a/2018/burton1/scripthd b/2018/burton1/scripthd new file mode 100644 index 000000000..8daa185e4 --- /dev/null +++ b/2018/burton1/scripthd @@ -0,0 +1,43 @@ +#!/bin/sh + +hd=${HD:=prog} + +cat $* | +$hd | +awk ' +BEGIN { nodup=1; group=1 } +nodup { + # suppress duplicate lines + if ($0 == prev) { + if (dots == 0) + printf "%04x: . . .\n", off + dots = off += 16 + next + } + prev = $0 + dots = 0 +} +{ + # determine the number of bytes, rest is ascii + nb = 16 + if (length($0) < 48 || length($16) != 2) { + for (nb=1; nb keywords + +fixed_iocccsize: fixed_iocccsize.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +test: prog tac runtest fixed_iocccsize ${EXTRA_DATA} + -./runtest | diff - results + -opt=kcrs ./runtest | diff - results.k + -opt=rs prog=tac ./runtest | diff - results + -opt=rsk prog=tac ./runtest | diff - results.k + ./fixed_iocccsize -rs < prog.c + ./tac -rs prog.c + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + ${RM} -f fixed_iocccsize tac keywords iocccsize + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 3a3fabb90892eeb2f610ae0f74a35a970060665a063ab702bd686c17c4ae07f6 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2018/burton2/README b/2018/burton2/README new file mode 100644 index 000000000..37a9c8c71 --- /dev/null +++ b/2018/burton2/README @@ -0,0 +1,71 @@ +tac comes with a small suite of support programs to test and validate against. +Untar tests and variations in the same dir as the sources, +or change runtest and unob.sh to look elsewhere for the keyword and test files. + +keywords is a critical file, created from ioccc.kw.freq by mkkeywords. +Only ioccc.kw.freq produces results compatible with iocccsize.c; +however, any of the variations can be used instead: + + mkkeywords c11 > keywords + +unob.sh uses the same input file as mkkeywords to control spaces after keywords. +The script allows an environment variable, KW, to override this. +Use it simply: + + unob.sh prog.c | less + unob.sh -p prog.c | less + KW=c11 unob.sh prog.c | less + +To handle obscure command line defines, use the environment variable DEF: + + DEF="-D'g(o)'='goto o;'" KW=c11 unob.sh -p prog.c | less + +It does an amazingly good job for such a simple script. + +Manifest + +prog.c the reason for this README +keywords the file #included in prog.c, output of mkkeywords +mkkeywords reads one of the files from variations, produces string for prog.c +ioccc.kw.freq keywords used by iocccsize, sorted by frequency in 201x ioccc winners +unob.sh a more robust unobfuscation script; requires variations/c11 in cur dir +tokenfix patches up prog -t output for ::, >>>, ... +src.doc.rot13 the answers, or at least significant help +tac.c more clearly written code, offered as a replacement of iocccsize.c +patch fixes single quotes in iocccsize.c, adds #ifndef, removes "I" +fixed_iocccsize.c iocccsize with patch applied, and nop -c argument added + +tests/* +runtest script to run the tests; ./runtest | diff results - +results results without -k +results.k results with -k; opt=kcrs ./runtest | diff results.k - +test*.c various test cases looking for compatability +iocccbug*.c various test cases demonstrating problems with iocccsize +spotcheck script to test a lot of files vs iocccsize +spotdiff summarize the results of spotcheck, showing only differences +discrepancies text file of the differences found using all the ioccc winning entries + +to test prog: + + runtest | diff - results + opt=kcrs runtest | diff - results.k + find ~/src/obc -type f -a -name "*.c" | xargs spotcheck prog + [ | spotdiff | diff -bw - discrepancies ] + +to test tac: + + prog=tac runtest | diff - results + prog=tac opt=krs runtest | diff - results.k + find ~/src/obc -type f -a -name "*.c" | xargs spotcheck tac + +variations/* as described in the remarks, and in each file below +ansi +c++11 +c++14 +c++98 +c11 +c99 +java8 +kandr +kandr2 +v7unix diff --git a/2018/burton2/ansi b/2018/burton2/ansi new file mode 100644 index 000000000..016a1b2d0 --- /dev/null +++ b/2018/burton2/ansi @@ -0,0 +1,46 @@ +$ ANS X3.159-1989, SS 3.1.1, pg 20, SS 3.8, pg 86 +#define +#elif +#else +#endif +#error +#if +#ifdef +#ifndef +#include +#line +#pragma +#undef +auto +break +case +char +const +continue +default +defined +do +double +else +enum +extern +float +for +goto +if +int +long +register +return +short +signed +sizeof +static +struct +switch +typedef +union +unsigned +void +volatile +while diff --git a/2018/burton2/c++11 b/2018/burton2/c++11 new file mode 100644 index 000000000..0334bdba2 --- /dev/null +++ b/2018/burton2/c++11 @@ -0,0 +1,99 @@ +$ N3337 2012-01-16 $ +alignas +alignof +and +and_eq +asm +auto +bitand +bitor +bool +break +case +catch +char +char16_t +char32_t +class +compl +const +constexpr +const_cast +continue +decltype +default +delete +do +double +dynamic_cast +else +enum +explicit +export +extern +false +float +for +friend +goto +if +inline +int +long +mutable +namespace +new +noexcept +not +not_eq +nullptr +operator +or +or_eq +private +protected +public +register +reinterpret_cast +return +short +signed +sizeof +static +static_assert +static_cast +struct +switch +template +this +thread_local +throw +true +try +typedef +typeid +typename +union +unsigned +using +virtual +void +volatile +wchar_t +while +xor +xor_eq +#if +#elif +#else +#endif +defined +#ifdef +#ifndef +#define +#undef +#include +#line +#error +#pragma +_Pragma diff --git a/2018/burton2/c++14 b/2018/burton2/c++14 new file mode 100644 index 000000000..d5c9821b9 --- /dev/null +++ b/2018/burton2/c++14 @@ -0,0 +1,99 @@ +$ N4296 2014-11-09 Working Draft, Standard for Programming Language C++ $ +alignas +alignof +and +and_eq +asm +auto +bitand +bitor +bool +break +case +catch +char +char16_t +char32_t +class +compl +const +constexpr +const_cast +continue +decltype +default +delete +do +double +dynamic_cast +else +enum +explicit +export +extern +false +float +for +friend +goto +if +inline +int +long +mutable +namespace +new +noexcept +not +not_eq +nullptr +operator +or +or_eq +private +protected +public +register +reinterpret_cast +return +short +signed +sizeof +static +static_assert +static_cast +struct +switch +template +this +thread_local +throw +true +try +typedef +typeid +typename +union +unsigned +using +virtual +void +volatile +wchar_t +while +xor +xor_eq +#if +#elif +#else +#endif +defined +#ifdef +#ifndef +#define +#undef +#include +#line +#error +#pragma +_Pragma diff --git a/2018/burton2/c++98 b/2018/burton2/c++98 new file mode 100644 index 000000000..450db576d --- /dev/null +++ b/2018/burton2/c++98 @@ -0,0 +1,88 @@ +$ ISO/IEC 14882:1998(E) 2.11 $ +and +and_eq +asm +auto +bitand +bitor +bool +break +case +catch +char +class +compl +const +const_cast +continue +default +delete +do +double +dynamic_cast +else +enum +explicit +export +extern +false +float +for +friend +goto +if +inline +int +long +mutable +namespace +new +not +not_eq +operator +or +or_eq +private +protected +public +register +reinterpret_cast +return +short +signed +sizeof +static +static_cast +struct +switch +template +this +throw +true +try +typedef +typeid +typename +union +unsigned +using +virtual +void +volatile +wchar_t +while +xor +xor_eq +#if +#elif +#else +#endif +defined +#ifdef +#ifndef +#define +#undef +#include +#line +#error +#pragma diff --git a/2018/burton2/c11 b/2018/burton2/c11 new file mode 100644 index 000000000..e5e01086d --- /dev/null +++ b/2018/burton2/c11 @@ -0,0 +1,58 @@ +$ C11: ISO/IEC 9899:201x, April 12, 2012 Committee Draft, N1570 $ +#define +#elif +#else +#endif +#error +#if +#ifdef +#ifndef +#include +#line +#pragma +#undef +_Alignas +_Alignof +_Atomic +_Bool +_Complex +_Generic +_Imaginary +_Noreturn +_Static_assert +_Thread_local +auto +break +case +char +const +continue +default +defined +do +double +else +enum +extern +float +for +goto +if +inline +int +long +register +restrict +return +short +signed +sizeof +static +struct +switch +typedef +union +unsigned +void +volatile +while diff --git a/2018/burton2/c99 b/2018/burton2/c99 new file mode 100644 index 000000000..119d80366 --- /dev/null +++ b/2018/burton2/c99 @@ -0,0 +1,50 @@ +$ C99: ISO/IEC 9899:1999(E), pg 50 $ +#define +#elif +#else +#endif +#error +#if +#ifdef +#ifndef +#include +#line +#pragma +#undef +_Bool +_Complex +_Imaginary +auto +break +case +char +const +continue +default +do +double +else +enum +extern +float +for +goto +if +inline +int +long +register +restrict +return +short +signed +sizeof +static +struct +switch +typedef +union +unsigned +void +volatile +while diff --git a/2018/burton2/discrepancies b/2018/burton2/discrepancies new file mode 100644 index 000000000..86f2fa388 --- /dev/null +++ b/2018/burton2/discrepancies @@ -0,0 +1,62 @@ +The values below are the field-by-field difference iocccsize - ioc. +(>0 means iocccsize counted more than ioc, <0 ioc counted more) +cl: lines, cw: words, cc: chars, ci: rule2, ts: saved, kw: keywords, ks: kw_saved + +cl 0 cw -4 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/1986/pawka.c +cl -45 cw -55 cc -617 ci -463 ts -85 kw -26 ks -69 src/obc/1990/theorem.c + ioc is correct; cl is correct even in compat (91) due to comments eating newlines + iocccsize fails at "z;/*/", eating everything until the following "/**/main(" + looks to be due to mis-identification of a comment closing block as opening block +cl 0 cw -2 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/1991/westley.c +cl 0 cw -3 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/1992/adrian.c +cl 0 cw -3 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/1992/adrian.orig.c +cl 0 cw -1 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/1994/shapiro.c +cl 0 cw -2 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/1996/gandalf.c +cl 0 cw -1 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/1996/schweikh1.c +cl 0 cw -2 cc 0 ci -2 ts 0 kw 1 ks 2 src/obc/1998/df.c + iocccsize counts as keyword __##int##__, and saving two characters + but int is not a plausible keyword +cl 0 cw -1 cc 3 ci 2 ts 1 kw 0 ks 0 src/obc/2001/herrmann1.c + the text: + d M Y(O)/* state to */ + d + counts as cw 3 in iocccsize, but this is clearly 4 + and the cc,ci,ts is due entirely to: + /*/*/*/*/*/ /*/*/ + E E /*/*/*/*/*/,/) F + which reduces to: + * E E * ,/) F + but iocccsize counts this as * E E *,/) F, whereas ANSI C says comments are + replaced with a single space equivalent (non-portable token-paste with comments) +cl 0 cw -2 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/2004/arachnid.c +cl 0 cw -2 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/2004/arachnid.orig.c +cl 0 cw 0 cc 0 ci -4 ts 0 kw 2 ks 4 src/obc/2004/hoyle.c +cl 0 cw 0 cc 0 ci -4 ts 0 kw 2 ks 4 src/obc/2004/hoyle.orig.c + ioccccsize counts as two keywords the token-pasted int##if (e.g int1) + thus the kw 2, and another bug in iocccsize counts #if as a keyword to 1 + thus saving 2 bytes on int, and 2 more on #if, when neither is a plausible keyword +cl 0 cw -1 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/2004/omoikane.c +cl 0 cw -1 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/2005/chia/chia.c +cl 0 cw -1 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/2005/mikeash/mikeash.c +cl 0 cw 0 cc 0 ci 1 ts 1 kw 0 ks 0 src/obc/2005/toledo/toledo.c +cl 0 cw 0 cc 0 ci 1 ts 1 kw 0 ks 0 src/obc/2005/toledo/toledo2.c +cl 0 cw 0 cc 0 ci 1 ts 1 kw 0 ks 0 src/obc/2005/toledo/toledo3.c + these three discrepancies are due to backslash-newline of longjm\p -- + at exactly the 521 byte line length boundary (which is arbitrary) + ioc is correct, because it has no line length limit +cl 0 cw -4 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/2011/akari/akari.c +cl 0 cw -7 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/2011/hamaji/hamaji.c +cl 0 cw -4 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/2012/endoh1/endoh1.c +cl 0 cw -3 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/2012/endoh1/endoh1_color.c +cl 0 cw -1 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/2012/endoh1/endoh1_deobfuscate.c +cl 0 cw -2 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/2012/omoikane/nyaruko.c +cl 0 cw 0 cc 0 ci -3 ts 0 kw 1 ks 3 src/obc/2013/cable2/cable2.c + this is due to token-pasting of _##char; iocccsize counts this as a keyword + but it is a pre-processor token-pasted string of the arg to Y() and char + rendering this not a keyword, even in disguise +cl 0 cw -2 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/2013/endoh4/endoh4.c +cl 0 cw -2 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/2013/misaka/misaka.c +cl 0 cw -1 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/2014/endoh2/prog.c +cl 0 cw -4 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/2014/maffiodo1/prog.c +cl 0 cw -4 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/2014/maffiodo1/prog.orig.c +cl 0 cw -1 cc 0 ci 0 ts 0 kw 0 ks 0 src/obc/2014/sinon/prog.c diff --git a/2018/burton2/fixed_iocccsize.c b/2018/burton2/fixed_iocccsize.c new file mode 100644 index 000000000..e7f5b10b3 --- /dev/null +++ b/2018/burton2/fixed_iocccsize.c @@ -0,0 +1,637 @@ +/* + * iocccsize - IOCCC Source Size Tool + * + * This IOCCC size tool source file is version 2017-12-25-v25. + * + * "You are not expected to understand this" :-) + * + * Public Domain 1992, 2015 by Anthony Howe. All rights released. + * With IOCCC minor mods in 2013-2017 by chongo (Landon Curt Noll) ^oo^ + * + * SYNOPSIS + * + * ioccc [-kirs] < input + * + * -k keep comment blocks + * -i IOCCC size rule (overall size, modified) + * -r count C reserved words as 1 byte + * -s suppress source output, write only the IOCCC 2nd size count + * + * DESCRIPTION + * + * Taking input from standard input, apply the IOCCC Source Size Rule + * for 2001. The program's official length is written to standard error. + * Also filter out C comment blocks (-k to keep) sending the modified + * source to standard output. + * + * The 2001 Source Size Rule was: + * + * Your entry must be <= 4096 bytes in length. The number of octets + * excluding whitespace (tab, space, newline, form-feed, return), and + * excluding any ';', '{' or '}' followed by whitespace or end of file, + * must be <= 2048. + * + * 2013 Source Size Rule is (-r): + * + * Your entry must be <= 4096 bytes in length. The number of octets + * excluding whitespace (tab, space, newline, form-feed, return), and + * excluding any ';', '{' or '}' followed by whitespace or end of file, + * and where C reserved words, including a subset of preprocessor words, + * count as 1 byte, must be <= 2053 (first prime after 2048). + */ + +/* + * The official IOCCC rule 2 secondary limit on C code size + * + * The IOCCC size tool should be compiled as: + * + * cc -pedantic -Wall -std=c99 iocccsize.c -o iocccsize + * + * This tool computes a 2nd size C code. To check your program source + * against the 2nd limit of rule 2, use the -i command line option. + * + * For example: + * + * ./iocccsize -i < prog.c + * + * The IOCCC size tool, when using the -i option, may be summarized as: + * + * The size tool counts C language keywords (primary, secondary, and + * selected preprocessor keywords) as 1. The size tool counts all + * other octets as 1 excluding ASCII whitespace, and excluding any + * ';', '{' or '}' followed by ASCII whitespace, and excluding any + * ';', '{' or '}' octet immediately before the end of file. + * + * ASCII whitespace includes ASCII tab, ASCII space, ASCII newline, + * ASCII form-feed, and ASCII carriage return. + * + * In cases where the above summary and the algorithm implemented by + * the IOCCC size tool source code conflict, the algorithm implemented + * by the IOCCC size tool source code is preferred by the judges. + * + * See the current IOCCC rules and guidelines for more information. + * In particular, see the current IOCCC size rule for information about + * the maximum value that this tool should print for an entry to be valid. + */ + +/* + * IOCCC Judge's remarks: + * + * This code contains undocumented features. On the other hand, this code + * is RTFS (for certain values of RTFS). One might say that this code + * perfectly documents itself. :-) + * + * Many thanks to Anthony Howe for taking the time to put his OCD + * (Obfuscated Coding Determination) into this code! + */ + +/* + * HINT: The algorithm implemented by this code may or not be obfuscated. + * The algorithm may not or may appear to be obfuscated. + * + * In particular: + * + * We did not invent the algorithm. + * The algorithm consistently finds Obfuscation. + * The algorithm killed Obfuscation. + * The algorithm is banned in C. + * The algorithm is from Bell Labs in Jersey. + * The algorithm constantly finds Obfuscation. + * This is not the algorithm. + * This is close. + */ + +#include +#include +#include +#include +#include + +#define FLAG_SILENCE 1 +#define FLAG_KEEP 2 +#define FLAG_RESERVED 4 +#define FLAG_IOCCC 8 +#define FLAG_SILLY_C 16 +#define FLAG_SILLY_H 32 + +#define BUFFER_SIZE 521 +#define MAX_SIZE 4096 /* IOCCC Rule 2 */ +#define MAX_COUNT 2053 /* IOCCC Rule 2 */ + +static char usage[] = +"usage: ioccc [-kirsch] < prog.c\n" +"\n" +"-k\t\tkeep block comments\n" +"-i\t\tprint official secondary IOCCC size to stdout\n" +"\t\tmax.size warnings to stderr, NOTE: implies -r -s\n" +"-r\t\tcount C reserved words as 1 byte\n" +"-s\t\tsuppress source output, write only the official size\n" +"-c\t\tan undocumented feature\n" +"-h\t\tyet another undocumented feature\n" +; + +#define STRLEN(s) (sizeof (s)-1) + +typedef struct { + size_t length; + const char *word; +} Word; + +/* + * C reserved words, plus a few #preprocessor tokens, that count as 1 + * + * NOTE: For a good list of reserved words in C, see: + * + * http://www.bezem.de/pdf/ReservedWordsInC.pdf + * + * by Johan Bezem of JB Enterprises: + * + * See http://www.bezem.de/en/ + */ +/* + * The following editorial plea expresses a view shared by more than zero + * IOCCC judges. It may not represent the opinion of all those involved + * with this code nor the International Obfuscated C Code Contest as a whole: + * + * The long list of reserved words below should be a source + * of embarrassment to some of those involved in standardizing C. + * The growing list of reserved words, along with an expanding set of + * linguistic inventions has the appearance of feature + * creep that, if left unchecked, risks turning a beautifully elegant + * language into a steaming pile of biological excretion. + * + * The history of the IOCCC has taught us that even minor changes + * to the language are not always well understood by compiler writers, + * let alone the standards body who publishes them. We have enormous + * sympathy for C compiler writers who must keep up with the creeping + * featurism. We are aware of some C standards members who share + * these concerns. Alas, they seem to be a minority. + * + * The C standards body as a whole, before they emit yet more mountains of new + * standardese, might wish consider the option of moth-balling their committee. + * Or if they must produce a new standard, consider naming whatever + * follows c11 as CNC (C's Not C). :-) + */ +static Word cwords[] = { + /* Yes Virginia, we left #define off the list on purpose! */ + { STRLEN("#elif"), "#elif" }, + { STRLEN("#else"), "#else" }, + { STRLEN("#endif"), "#endif" }, + { STRLEN("#error"), "#error" }, + { STRLEN("#ident"), "#ident" }, + { STRLEN("#if"), "#if" }, + { STRLEN("#ifdef"), "#ifdef" }, + { STRLEN("#ifndef"), "#ifndef" }, /* XXX bugfix */ + { STRLEN("#include"), "#include" }, + { STRLEN("#line"), "#line" }, + { STRLEN("#pragma"), "#pragma" }, + { STRLEN("#sccs"), "#sccs" }, + { STRLEN("#warning"), "#warning" }, + /**/ + { STRLEN("_Alignas"), "_Alignas" }, + { STRLEN("_Alignof"), "_Alignof" }, + { STRLEN("_Atomic"), "_Atomic" }, + { STRLEN("_Bool"), "_Bool" }, + { STRLEN("_Complex"), "_Complex" }, + { STRLEN("_Generic"), "_Generic" }, + { STRLEN("_Imaginary"), "_Imaginary" }, + { STRLEN("_Noreturn"), "_Noreturn" }, + { STRLEN("_Pragma"), "_Pragma" }, + { STRLEN("_Static_assert"), "_Static_assert" }, + { STRLEN("_Thread_local"), "_Thread_local" }, + /* + * this comment is not expected to understand itself + */ + { STRLEN("alignas"), "alignas" }, + { STRLEN("alignof"), "alignof" }, + { STRLEN("and"), "and" }, + { STRLEN("and_eq"), "and_eq" }, + { STRLEN("auto"), "auto" }, + { STRLEN("bitand"), "bitand" }, + { STRLEN("bitor"), "bitor" }, + { STRLEN("bool"), "bool" }, + { STRLEN("break"), "break" }, + { STRLEN("case"), "case" }, + { STRLEN("char"), "char" }, + { STRLEN("compl"), "compl" }, + { STRLEN("const"), "const" }, + { STRLEN("continue"), "continue" }, + { STRLEN("default"), "default" }, + { STRLEN("do"), "do" }, + { STRLEN("double"), "double" }, + { STRLEN("else"), "else" }, + { STRLEN("enum"), "enum" }, + { STRLEN("extern"), "extern" }, + { STRLEN("false"), "false" }, + { STRLEN("float"), "float" }, + { STRLEN("for"), "for" }, + { STRLEN("goto"), "goto" }, + /* { STRLEN("I"), "I" }, */ /* XXX seriously? */ + { STRLEN("if"), "if" }, + { STRLEN("inline"), "inline" }, + { STRLEN("int"), "int" }, + { STRLEN("long"), "long" }, + { STRLEN("noreturn"), "noreturn" }, + { STRLEN("not"), "not" }, + { STRLEN("not_eq"), "not_eq" }, + { STRLEN("or"), "or" }, + { STRLEN("or_eq"), "or_eq" }, + { STRLEN("register"), "register" }, + { STRLEN("restrict"), "restrict" }, + { STRLEN("return"), "return" }, + { STRLEN("short"), "short" }, + { STRLEN("signed"), "signed" }, + { STRLEN("sizeof"), "sizeof" }, + { STRLEN("static"), "static" }, + { STRLEN("static_assert"), "static_assert" }, + { STRLEN("struct"), "struct" }, + { STRLEN("switch"), "switch" }, + { STRLEN("thread_local"), "thread_local" }, + { STRLEN("true"), "true" }, + { STRLEN("typedef"), "typedef" }, + { STRLEN("union"), "union" }, + { STRLEN("unsigned"), "unsigned" }, + { STRLEN("void"), "void" }, + { STRLEN("volatile"), "volatile" }, + { STRLEN("while"), "while" }, + { STRLEN("xor"), "xor" }, + { STRLEN("xor_eq"), "xor_eq" }, + /**/ + { 0, NULL } +}; + +/* + * Keep track of discarded bytes by read_line() so count() can report + * correct wc(1) equivalent counts. + */ +static int xlcount = 0; +static int xwcount = 0; +static int xbcount = 0; + +static Word * +find_member(Word *table, const char *string) +{ + Word *w; + for (w = table; w->length != 0; w++) { + if (strncmp(string, w->word, w->length) == 0 + && !isalnum(string[w->length]) && string[w->length] != '_') + return w; + } + return NULL; +} + +/* + * ISO C11 section 5.2.1.1 Trigraph Sequences, leading sequence "??" + */ +static char trigraph[] = "=(/)'-"; +static char asciimap[] = "#[\\]^{|}~"; + +static size_t +read_line(char *buf, size_t size) +{ + int ch; + size_t length; + + if (buf == NULL || size == 0) + return 0; + + for (size--, length = 0; length < size; ) { + if ((ch = fgetc(stdin)) == EOF) + break; + /* Map NUL bytes to space, though ideally I should chuck'em. */ + if (ch == '\0') + ch = ' '; + /* Discard bare CR and those part of CRLF. */ + if (ch == '\r') { + xbcount++; + continue; + } + /* Trigraph mapping? */ + if (2 <= length && buf[length-2] == '?' && buf[length-1] == '?') { + char *tri; + if ((tri = strchr(trigraph, ch)) != NULL) { + /* Mapped trigraphs count as 1 byte. */ + ch = asciimap[tri - trigraph]; + xbcount += 2; + length -= 2; + } + } + if (ch == '\n' && 1 <= length && buf[length-1] == '\\') { + /* ISO C11 section 5.1.1.2 Translation Phases + * point 2 discards backslash newlines. + */ + xbcount += 2; + xwcount++; + xlcount++; + length--; + continue; + } + buf[length++] = (char) ch; + if (ch == '\n') { + break; + } + } + + buf[length] = '\0'; + + return length; +} + +/* + * Count octets and strip comments. The stripped C input is sent to + * standard output. If -s is set, then suppress the source output. + * The various counters are sent to standard error. + * + * The counter output format is: + * + * lcount wcount bcount icount isaved rcount rsaved + * + * where + * lcount line count (same as wc) + * wcount word count (same as wc) + * bcount byte count (same as wc) + * icount IOCCC secondary size rule count + * + * No longer reported: + * isaved bytes saved by secondary size rule (bcount - icount) + * rcount number of C reserved words + * rsaved number of octets saved with -r + */ +static int +count(int flags) +{ + Word *w; + unsigned long span; + char *p, buf[BUFFER_SIZE]; + int lcount, wcount, bcount; + int is_comment, is_word, dquote, escape; + int count, keywords, saved, kw_saved; + int squote; + + /* Start of buffer sentinel. */ + buf[0] = ' '; + buf[BUFFER_SIZE - 1] = 0; /* paranoia */ + + count = saved = 0; + keywords = kw_saved = 0; + lcount = wcount = bcount = 0; + is_comment = is_word = dquote = escape = 0; + squote = 0; + + /* + * "no matter how well you may think you understand this code, + * you don't, so don't mess with it." :-) + */ + while (0 < read_line(buf+1, sizeof (buf)-1)) { + if (!(flags & FLAG_KEEP)) { + /* Leading whitespace before comment block? */ + span = strspn(buf+1, "\t "); + + /* Split / * across reads? */ + if (buf[1 + span] == '/' && buf[2 + span] == '\0') { + (void) ungetc('/', stdin); + continue; + } + + /* + * no comment is a comment + */ + if (buf[1 + span] == '/' && buf[2 + span] == '/') { + continue; + } + + if (buf[1 + span] == '/' && buf[2 + span] == '*') { + /* Strip leading whitespace before comment block. */ + is_comment = 1; + } + } + + for (p = buf+1; *p != '\0'; p++) { + /* Within quoted string? */ + if (dquote) { + /* Escape _this_ character. */ + if (escape) { + escape = 0; + } + + /* Escape next character. */ + else if (*p == '\\') { + escape = 1; + } + + /* Close quoted string? */ + else if (*p == '"') { + dquote = 0; + } + } + + else if (squote) { + if (escape) + escape = 0; + else if (*p == '\\') + escape = 1; + else if (*p == '\'') + squote = 0; + } + + /* Not quote string. */ + else { + /* In C comment block? */ + if (is_comment) { + /* Split * / across reads? */ + if (*p == '*' && p[1] == '\0') { + ungetc('*', stdin); + break; + } + + /* End of comment block? */ + if (*p == '*' && p[1] == '/') { + is_comment = 0; + + if (!(flags & FLAG_KEEP)) { + /* Strip whitespace and newline + * trailing closing comment. + */ + p += 1 + strspn(p+2, " \t\r\n"); + } + } + + if (!(flags & FLAG_KEEP)) { + /* Strip octets in comment block. */ + continue; + } + } + + /* Split / / or / * across reads? */ + else if (*p == '/' && p[1] == '\0') { + ungetc('/', stdin); + break; + } + + /* Start of comment line? */ + else if (*p == '/' && p[1] == '/') { + if (!(flags & FLAG_KEEP)) { + /* Strip comment to end of buffer. */ + break; + } + } + + /* Start of comment block? */ + else if (*p == '/' && p[1] == '*') { + /* Begin comment block. */ + is_comment = 1; + + if (!(flags & FLAG_KEEP)) { + /* Strip comment block. */ + p++; + continue; + } + } + + /* C reserved word? */ + else if (!isalnum(p[-1]) && p[-1] != '_' + && (w = find_member(cwords, p)) != NULL) { + keywords++; + if (flags & FLAG_RESERVED) { + bcount += w->length; + if (!is_word) { + is_word = 1; + wcount++; + } + + if (!(flags & FLAG_SILENCE)) { + fputs(w->word, stdout); + } + + /* Count reserved word as one. */ + kw_saved += w->length - 1; + p += w->length - 1; + count++; + continue; + } + } + + /* Open single quote string? */ + else if (*p == '\'') { + squote = 1; + } + + /* Open quoted string? */ + else if (*p == '"') { + dquote = 1; + } + } + + if (!(flags & FLAG_SILENCE)) { + fputc(*p, stdout); + } + + bcount++; + if (*p == '\n') { + lcount++; + } + + /* Ignore all whitespace. + * + * Well not ALL in the Universe, just all here. + */ + if (isspace(*p)) { + is_word = 0; + saved++; + continue; + } else if (!is_word) { + is_word = 1; + wcount++; + } + + /* Ignore curly braces and semicolons when followed + * by any whitespace or EOF. + */ + if (strchr("{;}", *p) != NULL && (isspace(p[1]) || p[1] == '\0')) { + saved++; + continue; + } + + /* Count this octet. */ + count++; + } + } + + if (flags & FLAG_IOCCC) { + /* Output the official IOCCC size tool size to standard out */ + printf("%d\n", count); + if (MAX_SIZE < bcount) { + fprintf(stderr, "WARNING: program size (%d) exceeds IOCCC Rule 2a max. size (%d)\n", bcount, MAX_SIZE); + } + if (MAX_COUNT < count) { + fprintf(stderr, "WARNING: iocccsize count (%d) exceeds IOCCC Rule 2b max. count (%d)\n", count, MAX_COUNT); + } + } else { + /* The Ugly Truth */ + fprintf( + stderr, "%d %d %d %d %d %d %d\n", + lcount + xlcount, wcount + xwcount, bcount + xbcount, count, + saved, keywords, kw_saved + ); + } + + return count; +} + +int +main(int argc, char **argv) +{ + int ch; + int flags = 0; + + while ((ch = getopt(argc, argv, "kirsch")) != -1) { + switch (ch) { + case 'k': + flags |= FLAG_KEEP; + break; + case 'i': + flags |= FLAG_IOCCC | FLAG_RESERVED | FLAG_SILENCE; + break; + case 'r': + flags |= FLAG_RESERVED; + break; + case 's': + flags |= FLAG_SILENCE; + break; + case 'c': + flags |= FLAG_SILLY_C; + break; + case 'h': + flags |= FLAG_SILLY_H; + break; + default: + fprintf(stderr, "%s\n", usage); + return 2; + } + } + // make test hack: while for do until goto if else switch case default continue return break + if (flags == (FLAG_KEEP | FLAG_IOCCC | FLAG_RESERVED | FLAG_SILENCE | FLAG_SILLY_C | FLAG_SILLY_H)) { + fprintf(stderr, "The source toasts you a glass to your health!\n" + "BTW: judges have toasted a glass of this at the South Pole.\n" + "Now try using useful flags.\n\n" + "%s\n", usage); + return 3; + } else if (flags & FLAG_SILLY_C) { + fprintf(stderr, "Do you not see this is C?\n\n" + "%s\n", usage); + return 4; + } else if (flags & FLAG_SILLY_H) { + fprintf(stderr, "%s\n", usage); + return 5; + } + + /* + * count as directed - 1 Muha .. 2 Muhaha .. 3 Muhahaha ... + */ + (void) count(flags); + + /* + * All Done!!! All Done!!! -- Jessica Noll, age 2 + */ + return 0; +} diff --git a/2018/burton2/freqcount b/2018/burton2/freqcount new file mode 100644 index 000000000..74b163775 --- /dev/null +++ b/2018/burton2/freqcount @@ -0,0 +1,6 @@ +#!/bin/sh +function iskeyword { + awk 'BEGIN{f="c11";while(getline + + + + + + Best abuse of the rules + + +

    Best abuse of the rules

    + +

    Dave Burton
    +http://ioccc.snox.net

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./prog [-tcksri] < file.c
    +
    + +

    Try:

    + +
    ./prog -i < prog.c
    +./prog -s < prog.c
    +./prog -sk < prog.c
    +
    + +

    If you get stuck, try:

    + +
    make test
    +
    + +

    If you get really stuck, try:

    + +
    man ./tac.man
    +
    + +

    Selected Judges Remarks:

    + +

    They say size isn’t everything, and in the case of IOCCC iocccsize.c +that is saying something! What is this program weighing and how much does it weigh?

    + +

    Author’s comments:

    + +

    tac - tokenize and count C and derivative languages

    + +
    +tac computes C program size  
    +(obfuscated / otherwise)  
    +by splitting code as tokens small,  
    +ignoring space, then counting all.  
    +
    +It tries quite hard to act the same  
    +as counting tool of I-OCCC fame.  
    +Some bugs were fixed, it's faster too,
    +and does more things, just add some glue!  
    +
    +It does far more than print the size:  
    +the token part's a better prize!  
    +With each upon on a single line,  
    +how many things can you design?  
    +
    +Included is a keyword sorter,  
    +de-obfuscator, freq reporter.  
    +With code produced as little parts,  
    +just add your own creative arts.  
    +
    +But first you have to figure out  
    +the braces part, without a doubt!  
    +And then the code - it isn't easy:  
    +for as else?  That's rather cheesy!  
    +
    +The rest of it is standard fare:  
    +expressions strange, the globals bare,  
    +confusing symbols one and oh,  
    +and precedence you have to know.  
    +
    +The keyword list was made external,  
    +because of standards change eternal.
    +Thus other languages can now,  
    +be counted just like C, somehow!  
    +
    +I hope you find this code obscure  
    +enough to win, and thus procure  
    +a public place for all to see  
    +how badly I can butcher C!  
    +
    + + +

    Said another way….

    + +

    tac is the inverse of cat(1): it un-concatenates its input into C tokens, +writing the token stream to stdout. There are options to suppress the token ids, +summarize the token counts, and several options to allow it to be compatible +with iocccsize.

    + +

    The token-based output is quite useful in analyzing source code (see below), +and the counter is more accurate than iocccsize (see below); but this can be +fixed by using the -c compatibility flag, restoring the following problems as +in the official tool:

    + +
      +
    • whitespace within a string is not counted; +this seems wrong, as these chars are significant
    • +
    • “{;}” is not counted within a double-quoted string
    • +
    • whitespace preceding a comment is char-counted, unless the comment starts a line
    • +
    • -k processes the reserved words within // comments(!), but not /*, changing the counts
    • +
    + + +

    The following bugs are always corrected:

    + +
      +
    • treats /*/ as a complete comment (/*/int if for/*/ has three keywords)
    • +
    • -k enables //* or within a line comment /* to initiate a comment block until following */
    • +
    • -k processes double quote characters in // comments - +thus a solitary quote consumes everything until the next quote
    • +
    • single quotes are not handled correctly ('"' starts a dquote in iocccsize)
    • +
    • #ifndef is omitted as a keyword (but #ifdef is allowed?)
    • +
    • I is not a reserved word.
    • +
    • tac correctly penetrates 23rd century cloaking technology. ;-)
    • +
    + + +

    There is one (known) remaining problem with detection:

    + +
      +
    • comments between preprocessor hash and keyword are not replaced with whitespace; +the following counts #include as two tokens, # and include (not as a reserved word):

      + +
        #/*this will not be counted*/include/*correctly*/<stdio.h>
      +
    • +
    + + +

    Fixing this properly hampers backwards compatibility in counting. This requires +eliding comments during readsource (ISO 5.1.1.2, phase 3), and yet still +counting words correctly absent -k.

    + +

    Backwards Compatibility

    + +

    tac was run over all 366 previous IOCCC winning entries:

    + +
    find ~/src/obc -type f -name \*.c | wc
    +
    + +

    The discrepancies found are documented and explained in the file “discrepancies”.

    + +
    find ~/src/obc -type f -a -name "*.c" | xargs ./spotcheck ./prog | ./spotdiff |
    +    grep -v keep | diff -bw - discrep* | grep "[<>] cl "
    +
    + +

    In summary, there are only 6 unique entries out of 366 that have any variation +in Rule 2 counts; in all cases, the differences are due to bugs within +iocccsize, described in detail in the file discrepancies. There are only 40 +files (40/366, ~11%, including originals and variations) that differ at all, 31 +only in word count; most word count differences appear related to comment block +detection, weighted more towards recent entries (2011 and onward = 20/40 ~50%).

    + +

    This (minor) variation in word count values has not been addressed since +it is not a qualifying metric, nor is it very useful in a programming context: +whitespace surrounds English words, not necessarily C tokens, as in a+=1;.

    + +

    Accuracy (versus compatibility) is demonstrated through a series of small test cases +designed to allow exhaustive, hand-counted values for comparison with the tool values. +These test cases were vital in debugging and regression testing, and provided a way to +determine which tool was correct when there were differences.

    + +

    A version of this tool in more clearly written C (tac.c) +is presented for the Judge’s consideration as a more accurate replacement for iocccsize. +This obfuscated entry is derived from (and compatible with) that code, +but due to obfuscation, has had some significant, deep changes for the contest. +Nevertheless, the more clearly written code remains a spoiler for this entry.

    + +

    NB: iocccsize gets a different answer from tac on its own (iocccsize.c) source code; +tac gets the correct answer. This is due to the aforementioned bugs within iocccsize, +proved by fixing iocccsize.c with the included patch, so iocccsize reports +the correct answer for itself.

    + +

    But wait… There’s More!

    + +

    There is no limit on line length, file length, comment length, or identifier length.

    + +

    tac features an accurate tokenizer; which presents each C token on a line by itself. +This feature enables interesting analyses of C (and C++) code, hard to get any other way.

    + +

    For instance, here is a simple token counter, useful in finding repeated long tokens, or operator +frequency, or counting the references to identifiers, constants, or breadth of use of the +language:

    + +
    !/bin/sh
    +cat $* | ./prog -t | sort | uniq -c | sort -k1nr
    +
    + +

    And here is a C keyword frequency counter:

    + +
    #!/bin/sh
    +function iskeyword {
    +   awk 'BEGIN{f="c11";while(getline<f)k[$1]=0}
    +    {if($1 in k)k[$1]++}END{for(i in k)print k[i],i}'
    +}
    +cat $* | ./prog -t | iskeyword | sort -k1nr
    +
    + +

    This script was used to “optimize” the reserved word order so the most frequent IOCCC +winning entry keywords are checked first.

    + +

    An interesting aside: as might be expected, obfuscation has changed the frequency of +keyword distribution over time. The top five for the decades:

    + +
      1980s       1990s       2000s       2010s
    +    -----       -----       -----       -----
    +    94 if       532 char    375 if      254 int
    +    69 for      524 if      372 char    217 for
    +    59 while    417 int     332 int     198 if
    +    48 char     223 for     184 for     121 return
    +    43 int      223 void    165 return  104 char
    +
    + +

    The keyword list is external to the program, and is easily changed, sorted, checked, verified. +This allows such additional programs in concert with the tool’s primary operation.

    + +

    A poor-man’s de-obfuscator can be based upon the output of tac -t and a handful of +simple rules (and another use of the external keyword file). +A more refined version of this is included in the file unob.sh, +but the simple code below is a serviceable obfuscated C de-obfuscator in a scripting language. +It really is this easy with tac:

    + +
    #!/bin/sh
    +script='
    +BEGIN {
    +    last=nl="\n";
    +    f="c11"; while(getline <f > 0) kw[$0]++; close(f);
    +}
    +
    +function iskw(a)   { return a in kw }
    +function indent(a) { return sprintf("%*s", n*3, " ") }
    +function newline() { if (!infor && last != nl) printf last=nl; }
    +function show(a) {
    +    if (last==nl) printf "%s", indent()
    +    printf "%s%s", space(), a
    +    last=a
    +}
    +function space() {
    +    return iskw(last) ||
    +      (last ~ /[A-Za-z0-9_+-\/%^[&\]\)=:<>;]$/ && $0 !~ /[:;()\[\],]/) ? " " : ""
    +}
    +
    +/^\(/   { ++paren }
    +/^\)/   { --paren }
    +
    +/^for/          { newline(); infor=1 }
    +infor && /^;/       { ++infor; show($0 " "); next }
    +infor==1 && /^:/    { ++infor }
    +infor>1 && paren==0 { infor=0 }
    +
    +/^\?/       { tern++; n++; newline(); show($0 " "); next }
    +tern && /^:/    { newline(); show($0); --tern; --n; next }
    +
    +/^#/    { newline(); show($0); newline(); next }
    +/^;/    { show($0); newline(); next }
    +/^{/    { show($0); ++n; newline(); next }
    +/^}/    { n--; newline(); show($0); newline(); next }
    +
    +{ show($0) }
    +'
    +cat $* | sed 's/#include/##include/' | cpp -E -trigraphs |
    +sed 's/^# .*$//' | sed 's/^#//' |
    +./prog -t | awk "$script"
    +
    + +

    On the question of obfuscation

    + +
      +
    • I assume you noticed the braces?

      + +

      Every brace is sacred,
      +Every brace is great.
      +If a brace is wasted,
      +Clang gets quite irate
      .

    • +
    • Keywords follow the 2010s top five, without the if, for interesting flow control.

    • +
    • Sometimes a for can be an else - inconceivable!
    • +
    • I see the getopt. But “where’s the beef?”
    • +
    • No character constants, several int constants, and one string +(hint: which does not encode letters) – how does this code parse code?

      + +

      Interesting aside: how many is “several int constants”?

      + +
         ./prog < prog.c 2>/dev/null | awk '$1~/260/{a[$2]++}END{for(i in a)print i,a[i]}'
      +   ... | wc
      +
      + +

      Which numbers are most often used?

      + +
         ... | sort -k2nr | sed 5q
      +
    • +
    • The code describes its function by careful arrangement of variables up front…

    • +
    • …coupled with a description of the typical IOCCC contestant, or at least the author
    • +
    • Why shouldn’t trigraph parsing be written in trigraph?
    • +
    • Where iocccsize.c mocks, this code flaunts: +“no matter how well you may think you understand this code, you don’t, so don’t mess with it. :-)”
    • +
    • O,0,l,1 are used to confusing effect, local names obscure global names.
    • +
    • Globals are used to pass information between routines: don’t reorder “unrelated” statements….
    • +
    • How does the compatibility mode account for the fundamentally different manner of computation?
    • +
    • The algorithm is quite efficient; reserved word detection and trigraph parsing particularly so.
    • +
    • This may be the first obfuscated submission that provides the means for its own de-obfuscation.
    • +
    + + +

    Rule 2

    + +

    The keyword list is externalized as an include file. This presents a useful +feature for the source code: not only can the reserved word script above be +produced, but the tool can be rebuilt with any set of reserved words, just by +using a different list. For instance: removing all the secondary keywords; +removing all the C11 keywords; trying just K&R C. Since C++ and Java share the +same operators as C, just change the keyword list and tac will correctly +tokenize both of these; the tokens >>> and :: can be handled with a short +post-filter (tokenfix, included).

    + +

    I believe this entry may also satisfy the request for gratuitous use of all the C11 keywords? +Whether this context satisfies “intended C language context” is a matter of interpretation. ;-) +And tac is ready for the IOCCC++ contest. And the IOJCC trashcan.

    + +

    The following reserved word files are included:

    + +
    kandr   from my venerable 1978 18th printing "The C Programming Language"
    +v7unix  7th edition Unix source code, extracted from c00.c
    +kandr2  from my 1988 1st printing "The C Programming Language", 2e
    +ansi    ANS X3.159-1989
    +c99     ISO/IEC 9899:1999(E)
    +c11     ISO/IEC 9899:201x(E) N1570
    +c++98   http://en.cppreference.com/w/cpp/keyword
    +c++11   ISO/IEC 14882:2011(E) N3337 2012-01-16
    +c++14   ISO/IEC 14882:2014(E) N4296 2014-11-09
    +java8   http://docs.oracle.com/javase/specs/index.html
    +ioccc.kw.freq   c11 + additional words, sorted on frequency of occurrence in ioccc winners
    +
    + +

    NB: The keyword file used in this code is derived from the list in iocccsize.c, +which is neither complete (#define, #ifndef, #undef are missing +– yes, Virginia knows about #define omitted on purpose), +nor correct (many more are added: I, true, bool, compl, …):

    + +
    (sed -n '1p' c11; sed -n '2,$p' ioccc.kw.freq | sort) | comm -3 - c11
    +
    + +

    That is an obfuscated way to say “diff”. But it also more clearly shows the, um, diffs.

    + +

    The usage string is similarly externalized, providing a better usability string than +the limits would otherwise allow. If this is considered bending the rules too far, +just -DU=O to get a passible, if cryptic, usage message using no additional octets +than without the define. +This also allows the builder to configure the amount of help a utility should provide +(you want a manpage? Because that’s how you get a manpage.) +– a rather significant point of contention made moot.

    + +

    There is definitely abuse of the Rule2 counter, exploiting a “feature” of iocccsize: +iocccsize does not Rule2 count {, } and ; when followed by whitespace – even within a string! +Thus: Freecode, a simple, uncounted, highly obfuscated encoding of a central part +of this program. (The reserved word list is not Freecoded, both because it is useful +apart from the program, and because Freecode is not entirely free.*)

    + +
      +
    • Some restrictions apply. Not approved for all uses. Some assembly required.
    • +
    + + +

    Compilation

    + +

    The code is ANSI compliant, but it does have a string longer than 509 characters. +It has been tested on OSX and Linux, Clang and GCC.

    + +

    The code uses trigraphs, ironically: it parses trigraphs with trigraph code. +Because that’s funny. And it remains obscure after, so trigraphs are not used for obfuscation. +Thus -trigraphs -Wno-trigraphs (which is also humorous).

    + +

    It’s obfuscated C. Thus -Wno-parentheses -Wno-empty-body -Wno-char-subscripts.

    + +

    The code uses unsigned chars, but C strings are signed. Thus -Wno-pointer-sign. +NB: This is not a portability concern, the one string holds only printable ASCII characters.

    + +

    Thus:

    + +
    clang -ansi -Wall -trigraphs -Wno-trigraphs -Wno-parentheses -Wno-empty-body -Wno-char-subscripts -Wno-pointer-sign -DU=O -DW=\"keywords\" -o prog prog.c
    +
    + +

    Coda

    + +

    Cody Ferguson was relentless in his pursuit of bugs. +Thanks to his reports, the version of unob.sh is stronger, +tac groks digraphs, tokenfix corrects for missing digraphs in prog.c, +and the program manpage was added to the corpus.

    + +

    manpage is a useful program that turns ASCII versions of man pages (e.g. tac.man) into real +man pages. It works for C and C-like languages, command lines, +and was designed to handle man page sections 1-8. +It works well on most inputs, but tends to need some raw nroff for more fancy constructions, +such as combined arguments +(e.g. the -r and -s arguments to tac are not recognised when written as -rs in prose).

    + +

    Try:

    + +
    manpage tac
    +
    +manpage -h
    +manpage -h | manpage
    +manpage -h | manpage -R | less
    +manpage -h | manpage -P | lpr
    +
    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2018, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2018/burton2/hint.text b/2018/burton2/hint.text new file mode 100644 index 000000000..9265356df --- /dev/null +++ b/2018/burton2/hint.text @@ -0,0 +1,397 @@ +# Best abuse of the rules + +Dave Burton + + + +## Judges' comments: +### To use: + + make + + ./prog [-tcksri] < file.c + +### Try: + + ./prog -i < prog.c + ./prog -s < prog.c + ./prog -sk < prog.c + +If you get stuck, try: + + make test + +If you get really stuck, try: + + man ./tac.man + +### Selected Judges Remarks: + +They say size isn't everything, and in the case of IOCCC [iocccsize.c](http://www.ioccc.org/2018/iocccsize.c) +that is saying something! What is this program weighing and how much does it weigh? + + +## Author's comments: +tac - tokenize and count C and derivative languages +--------------------------------------------------- + +
    +tac computes C program size  
    +(obfuscated / otherwise)  
    +by splitting code as tokens small,  
    +ignoring space, then counting all.  
    +
    +It tries quite hard to act the same  
    +as counting tool of I-OCCC fame.  
    +Some bugs were fixed, it's faster too,
    +and does more things, just add some glue!  
    +
    +It does far more than print the size:  
    +the token part's a better prize!  
    +With each upon on a single line,  
    +how many things can you design?  
    +
    +Included is a keyword sorter,  
    +de-obfuscator, freq reporter.  
    +With code produced as little parts,  
    +just add your own creative arts.  
    +
    +But first you have to figure out  
    +the braces part, without a doubt!  
    +And then the code - it isn't easy:  
    +for as else?  That's rather cheesy!  
    +
    +The rest of it is standard fare:  
    +expressions strange, the globals bare,  
    +confusing symbols one and oh,  
    +and precedence you have to know.  
    +
    +The keyword list was made external,  
    +because of standards change eternal.
    +Thus other languages can now,  
    +be counted just like C, somehow!  
    +
    +I hope you find this code obscure  
    +enough to win, and thus procure  
    +a public place for all to see  
    +how badly I can butcher C!  
    +
    + +Said another way.... +-------------------- + +`tac` is the inverse of `cat`(1): it un-concatenates its input into C tokens, +writing the token stream to stdout. There are options to suppress the token ids, +summarize the token counts, and several options to allow it to be compatible +with `iocccsize`. + +The token-based output is quite useful in analyzing source code (see below), +and the counter is more accurate than `iocccsize` (see below); but this can be +fixed by using the -c compatibility flag, restoring the following problems as +in the official tool: + +* whitespace **within** a string is **not** counted; + this seems wrong, as these chars **are** significant +* "`{;}`" is not counted within a double-quoted string +* whitespace preceding a comment is char-counted, unless the comment starts a line +* -k processes the reserved words within `//` comments(!), but not `/*`, changing the counts + +The following bugs are always corrected: + +* treats `/*/` as a complete comment (`/*/int if for/*/` has three keywords) +* -k enables `//*` or within a line comment `/*` to initiate a comment block until following `*/` +* -k processes double quote characters in `//` comments - + thus a solitary quote consumes everything until the next quote +* single quotes are not handled correctly (`'"'` starts a dquote in `iocccsize`) +* `#ifndef` is omitted as a keyword (but `#ifdef` is allowed?) +* I is not a reserved word. +* `tac` correctly penetrates [23rd century cloaking technology][1]. ;-) + +There is one (known) remaining problem with detection: + +* comments between preprocessor hash and keyword are not replaced with whitespace; +the following counts #include as two tokens, `#` and `include` (not as a reserved word): + + #/*this will not be counted*/include/*correctly*/ + +Fixing this properly hampers backwards compatibility in counting. This requires +eliding comments during readsource (ISO 5.1.1.2, phase 3), and yet still +counting words correctly absent -k. + +[1]: http://ioccc.org/2014/birken/hint.html "Best use of port 1701" + +Backwards Compatibility +----------------------- + +`tac` was run over all 366 previous IOCCC winning entries: + + find ~/src/obc -type f -name \*.c | wc + +The discrepancies found are documented and explained in the file "discrepancies". + + find ~/src/obc -type f -a -name "*.c" | xargs ./spotcheck ./prog | ./spotdiff | + grep -v keep | diff -bw - discrep* | grep "[<>] cl " + +In summary, there are only 6 unique entries out of 366 that have any variation +in Rule 2 counts; in all cases, the differences are due to bugs within +`iocccsize`, described in detail in the file `discrepancies`. There are only 40 +files (40/366, ~11%, including originals and variations) that differ at all, 31 +only in word count; most word count differences appear related to comment block +detection, weighted more towards recent entries (2011 and onward = 20/40 ~50%). + +This (minor) variation in word count values has not been addressed since +it is not a qualifying metric, nor is it very useful in a programming context: +whitespace surrounds English words, not necessarily C tokens, as in `a+=1;`. + +Accuracy (versus compatibility) is demonstrated through a series of small test cases +designed to allow exhaustive, hand-counted values for comparison with the tool values. +These test cases were vital in debugging and regression testing, and provided a way to +determine which tool was correct when there were differences. + +> A version of this tool in more clearly written C (tac.c) +> is presented for the Judge's consideration as a more accurate replacement for `iocccsize`. +> This obfuscated entry is derived from (and compatible with) that code, +> but due to obfuscation, has had some significant, deep changes for the contest. +> Nevertheless, the more clearly written code remains a spoiler for this entry. + +NB: `iocccsize` gets a different answer from `tac` on its own (iocccsize.c) source code; +`tac` gets the correct answer. This is due to the aforementioned bugs within `iocccsize`, +proved by fixing iocccsize.c with the included patch, so `iocccsize` reports +the correct answer for itself. + +But wait... There's More! +------------------------- + +There is no limit on line length, file length, comment length, or identifier length. + +`tac` features an accurate tokenizer; which presents each C token on a line by itself. +This feature enables interesting analyses of C (and C++) code, hard to get any other way. + +For instance, here is a simple token counter, useful in finding repeated long tokens, or operator +frequency, or counting the references to identifiers, constants, or breadth of use of the +language: + + !/bin/sh + cat $* | ./prog -t | sort | uniq -c | sort -k1nr + +And here is a C keyword frequency counter: + + #!/bin/sh + function iskeyword { + awk 'BEGIN{f="c11";while(getline An interesting aside: as might be expected, obfuscation has changed the frequency of +> keyword distribution over time. The top five for the decades: +> +> 1980s 1990s 2000s 2010s +> ----- ----- ----- ----- +> 94 if 532 char 375 if 254 int +> 69 for 524 if 372 char 217 for +> 59 while 417 int 332 int 198 if +> 48 char 223 for 184 for 121 return +> 43 int 223 void 165 return 104 char + +The keyword list is external to the program, and is easily changed, sorted, checked, verified. +This allows such additional programs in concert with the tool's primary operation. + +A poor-man's de-obfuscator can be based upon the output of `tac -t` and a handful of +simple rules (and another use of the external keyword file). +A more refined version of this is included in the file `unob.sh`, +but the simple code below is a serviceable obfuscated C de-obfuscator in a _scripting language_. +It really is this easy with `tac`: + + #!/bin/sh + script=' + BEGIN { + last=nl="\n"; + f="c11"; while(getline 0) kw[$0]++; close(f); + } + + function iskw(a) { return a in kw } + function indent(a) { return sprintf("%*s", n*3, " ") } + function newline() { if (!infor && last != nl) printf last=nl; } + function show(a) { + if (last==nl) printf "%s", indent() + printf "%s%s", space(), a + last=a + } + function space() { + return iskw(last) || + (last ~ /[A-Za-z0-9_+-\/%^[&\]\)=:<>;]$/ && $0 !~ /[:;()\[\],]/) ? " " : "" + } + + /^\(/ { ++paren } + /^\)/ { --paren } + + /^for/ { newline(); infor=1 } + infor && /^;/ { ++infor; show($0 " "); next } + infor==1 && /^:/ { ++infor } + infor>1 && paren==0 { infor=0 } + + /^\?/ { tern++; n++; newline(); show($0 " "); next } + tern && /^:/ { newline(); show($0); --tern; --n; next } + + /^#/ { newline(); show($0); newline(); next } + /^;/ { show($0); newline(); next } + /^{/ { show($0); ++n; newline(); next } + /^}/ { n--; newline(); show($0); newline(); next } + + { show($0) } + ' + cat $* | sed 's/#include/##include/' | cpp -E -trigraphs | + sed 's/^# .*$//' | sed 's/^#//' | + ./prog -t | awk "$script" + +On the question of obfuscation +------------------------------ + +* I assume you noticed the [braces][2]? + + _Every brace is sacred, + Every brace is great. + If a brace is wasted, + Clang gets quite irate_. + +* Keywords follow the 2010s top five, without the `if`, for interesting flow control. +* Sometimes a `for` can be an `else` - [inconceivable][3]! +* I see the `getopt`. But "[where's the beef?][4]" +* No character constants, several int constants, and one string + (hint: which does not encode letters) -- how does this code parse code? +> Interesting aside: how many is "several int constants"? +> +> ./prog < prog.c 2>/dev/null | awk '$1~/260/{a[$2]++}END{for(i in a)print i,a[i]}' +> ... | wc +> +> Which numbers are most often used? +> +> ... | sort -k2nr | sed 5q + +* The code describes its function by careful arrangement of variables up front... +* ...coupled with a description of the typical IOCCC contestant, or at least the author +* Why shouldn't trigraph parsing be written in trigraph? +* Where iocccsize.c mocks, this code flaunts: + "_no matter how well you may think you understand this code, you don't, so don't mess with it. :-)_" +* `O,0,l,1` are used to confusing effect, local names obscure global names. +* Globals are used to pass information between routines: don't reorder "unrelated" statements.... +* How does the compatibility mode account for the fundamentally different manner of computation? +* The algorithm is quite efficient; reserved word detection and trigraph parsing particularly so. +* This may be the first obfuscated submission that provides the means for its own de-obfuscation. + +[2]: https://www.youtube.com/watch?v=fUspLVStPbk&start=53 "Meaning of Life" +[3]: https://www.youtube.com/watch?v=OHVjs4aobqs "Inconceivable" +[4]: https://www.youtube.com/watch?v=Ug75diEyiA0 "Where's the beef?" + +Rule 2 +------ + +The keyword list is externalized as an include file. This presents a useful +feature for the source code: not only can the reserved word script above be +produced, but the tool can be rebuilt with any set of reserved words, just by +using a different list. For instance: removing all the secondary keywords; +removing all the C11 keywords; trying just K&R C. Since C++ and Java share the +same operators as C, just change the keyword list and `tac` will correctly +tokenize both of these; the tokens >>> and :: can be handled with a short +post-filter (tokenfix, included). + +I believe this entry may also satisfy the request for gratuitous use of all the C11 keywords? +Whether this context satisfies "intended C language context" is a matter of interpretation. ;-) +And `tac` is ready for the IOCCC++ contest. And the IOJCC trashcan. + +The following reserved word files are included: + + kandr from my venerable 1978 18th printing "The C Programming Language" + v7unix 7th edition Unix source code, extracted from c00.c + kandr2 from my 1988 1st printing "The C Programming Language", 2e + ansi ANS X3.159-1989 + c99 ISO/IEC 9899:1999(E) + c11 ISO/IEC 9899:201x(E) N1570 + c++98 http://en.cppreference.com/w/cpp/keyword + c++11 ISO/IEC 14882:2011(E) N3337 2012-01-16 + c++14 ISO/IEC 14882:2014(E) N4296 2014-11-09 + java8 http://docs.oracle.com/javase/specs/index.html + ioccc.kw.freq c11 + additional words, sorted on frequency of occurrence in ioccc winners + +NB: The keyword file used in this code is derived from the list in iocccsize.c, +which is neither complete (`#define`, `#ifndef`, `#undef` are missing +-- yes, Virginia knows about `#define` omitted on purpose), +nor correct (many more are added: `I`, `true`, `bool`, `compl`, ...): + + (sed -n '1p' c11; sed -n '2,$p' ioccc.kw.freq | sort) | comm -3 - c11 + +That is an obfuscated way to say "diff". But it also more clearly shows the, um, diffs. + +The usage string is similarly externalized, providing a better usability string than +the limits would otherwise allow. If this is considered bending the rules too far, +just -DU=O to get a passible, if cryptic, usage message using no additional octets +than without the define. +This also allows the builder to configure the amount of help a utility should provide +([you want a manpage? Because that's how you get a manpage.][5]) +-- a rather significant point of contention made moot. + +There is definitely abuse of the Rule2 counter, exploiting a "feature" of `iocccsize`: +`iocccsize` does not Rule2 count {, } and ; when followed by whitespace -- even within a string! +Thus: Freecode, a simple, uncounted, highly obfuscated encoding of a central part +of this program. (The reserved word list is not Freecoded, both because it is useful +apart from the program, and because Freecode is not entirely free.*) + +* Some restrictions apply. Not approved for all uses. Some assembly required. + +[5]: https://www.youtube.com/watch?v=VU0GYSA1POs "Ants" + +Compilation +----------- + +The code is ANSI compliant, but it does have a string longer than 509 characters. +It has been tested on OSX and Linux, Clang and GCC. + +The code uses trigraphs, ironically: it parses trigraphs with trigraph code. +Because that's funny. And it remains obscure after, so trigraphs are not used for obfuscation. +Thus -trigraphs -Wno-trigraphs (which is also humorous). + +It's obfuscated C. Thus -Wno-parentheses -Wno-empty-body -Wno-char-subscripts. + +The code uses unsigned chars, but C strings are signed. Thus -Wno-pointer-sign. +NB: This is *not* a portability concern, the one string holds only printable ASCII characters. + +Thus: + + clang -ansi -Wall -trigraphs -Wno-trigraphs -Wno-parentheses -Wno-empty-body -Wno-char-subscripts -Wno-pointer-sign -DU=O -DW=\"keywords\" -o prog prog.c + +Coda +---- + +Cody Ferguson was relentless in his pursuit of bugs. +Thanks to his reports, the version of `unob.sh` is stronger, +`tac` groks digraphs, `tokenfix` corrects for missing digraphs in `prog.c`, +and the program `manpage` was added to the corpus. + +`manpage` is a useful program that turns ASCII versions of man pages (e.g. `tac.man`) into real +man pages. It works for C and C-like languages, command lines, +and was designed to handle man page sections 1-8. +It works well on most inputs, but tends to need some raw nroff for more fancy constructions, +such as combined arguments +(e.g. the -r and -s arguments to tac are not recognised when written as -rs in prose). + +Try: + + manpage tac + + manpage -h + manpage -h | manpage + manpage -h | manpage -R | less + manpage -h | manpage -P | lpr + +-------------------------------------------------------------------------------- + diff --git a/2018/burton2/ioc_without_quote b/2018/burton2/ioc_without_quote new file mode 100644 index 000000000..ff80303c1 --- /dev/null +++ b/2018/burton2/ioc_without_quote @@ -0,0 +1,396 @@ +#include +#include +#include +#include + +int cl,cw,cc,ci,ck,xc; // counts: line, word, char, ioc, keywords, xtra_char +int ts,tk; // totals: saved from counting, keyword lengths +int fk,fs,fr,fi,fc,ft; // flags: keep, suppress, reserved, ioccc, compat, tokenize, comments +unsigned char *buf, *p, *e, *w, *s; // ptr, end, white, start + +char *kw[] = { + "void", "char", "short", "int", "long", "unsigned", + "typedef", "struct", "union", "enum", "sizeof", "signed", + "for", "while", "do", "if", "else", "switch", + "case", "default", "break", "continue", "return", "goto", + "static", "volatile", "register", "auto", "const", "extern", + "float", "double", + + "#ifdef", "#ifndef", "#if", "#else", "#elif", "#endif", + "#include", "#error", "#warning", "#line", "#pragma", + + "restrict", "inline", "_Bool", "_Complex", "_Imaginary", + + "_Atomic", "_Generic", "_Noreturn", "_Pragma", + "_Static_assert", "_Thread_local", "_Alignas", "_Alignof", + "static_assert", "thread_local", "alignas", "alignof", "noreturn", + "bool", "true", "false", "compl", "bitand", "bitor", + "and", "and_eq", "not", "not_eq", + "or", "or_eq", "xor", "xor_eq", + 0 +}; + +enum { + CPP = 256 + , CMT = 257 + , KEYW = 258 + , DIVEQ = 259 + , MULEQ = 260 + , MODEQ = 261 + , ADDEQ = 262 + , SUBEQ = 263 + , XOREQ = 264 + , OREQ = 265 + , ANDEQ = 266 + , RSHEQ = 267 + , LSHEQ = 268 + , NOTEQ = 269 + , EQ = 270 + , GE = 271 + , LE = 272 + , OR2 = 273 + , AND2 = 274 + , PP = 275 + , MM = 276 + , PTR = 277 + , LSH = 278 + , RSH = 279 + , INT = 300 + , FLOAT = 301 + , ID = 302 +}; + +enum { + O=0x01 // octal + , H=0x02 // hex + , D=0x04 // decimal + , I=0x08 // identifier + , W=0x10 // whitespace + , B=0x20 // brace, semi + , OHD = O|H|D + , HD = H|D + , HI = H|I +}; + +char tab[256] = { + W, 00, 00, 00, 00, 00, 00, 00, 00, W, W, W, W, W, 00, 00, + 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, + W, 00, 00, I, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, + OHD,OHD,OHD,OHD,OHD,OHD,OHD,OHD, HD, HD, 00, B, 00, 00, 00, 00, + + 00, HI, HI, HI, HI, HI, HI, I, I, I, I, I, I, I, I, I, + I, I, I, I, I, I, I, I, I, I, I, 00, 00, 00, 00, I, + 00, HI, HI, HI, HI, HI, HI, I, I, I, I, I, I, I, I, I, + I, I, I, I, I, I, I, I, I, I, I, B, 00, B, 00, 00, +}; + +#define is(x, c) (tab[c]&(x)) + +// discard backslash-newline as-if not present, even if trigraph backslash +// iocccsize counts tri as xbcount+=2, and bs-nl as xb+=2, xw++, xl++ to match wc(1) + +void readsource() { + int c, o=2, len=128; + buf = malloc(len); + while ((c = getchar()) != EOF) { + if (c == '\r') { + if (fc) ++xc; + continue; + } + if (buf[o-1] == '?' && buf[o-2] == '?') { + char *tri = "=#([/\\)]'^<{!|>}-~"; + while (*tri && *tri++ != c) + ++tri; + if (*tri) { + c = *tri; + o -= 2; + if (fc) xc += 2; + } + } + if (c == '\n' && buf[o-1] == '\\') { + --o; + cl++; + if (fc) { + ++cw; + xc += 2; + } + } else + buf[o++] = c; + if (o == len) + buf = realloc(buf, len+=128); + } + buf[o] = 0; + e = buf + o; + p = buf += 2; +} + +int iskw(char *s, int len) { + char **k; + if (len > 1) + for (k = kw; *k; ++k) + if (s[0] == k[0][0] && k[0][len] == 0 && strncmp(s, *k, len) == 0) + return ++ck, (tk+=len-1), 1; + return 0; +} + +int want(char m) { + while (p < e) { + if (*p == '\\') { + // need to only ignore: ntbrfva?, octal, x, hex + // 0111 = two chars, \091 = three chars, \xabc = one char(!) + // for our purposes, only worry about: and \ newline, + // which is not a newline, but an embedded line break + if (p[1] == '\\' || p[1] == '\'' || p[1] == '"' || p[1] == '\n') { + if (p[1] == '\n') ++cl; + p += 2; + continue; + } + } + if (*p == '\n') ++cl; + if (*p++ == m) return m; + } + return 0; +} + +int follow(char m, int y, int n) { + if (*p == m) return ++p,y; + return n; +} + +int follow2(char m, int y, int n, int y2) { + if (*p == m) return ++p,y; + if (*p == n) return ++p,y2; + return n; +} + +int skipwhite() { + int c; + for (c=*p++; p<=e && is(W, c); c=*p++) { + ++cc; + if (c == '\n') ++cl; + } + return c; +} + +/* + * CPP tokens may extend beyond a single line of text and include comments + * To do this correctly, need to scan and remove comments during readsource + * and present comments as whitespace. Note that "# include" is a valid CPP + * token, and does not match "#include". + * + * Because the global pointers p, s and w are well-known, and because comments + * are not consumed during readsource, it is more difficult to parse CPP stuff. + * Also note that for backwards compat, we need to also count words correctly, + * with and without -k. + */ + +int lex() { + int c, t; + + w = p; + c = skipwhite(); + s = p-1; + + if (p >= e) + return c; + + switch (c) { + case '\'': want(c); return c; + case '"': want(c); return c; + case '/': + t = follow2('=', DIVEQ, c, CMT); + if (t == CMT) + want('\n'); + else if (t == c && (t = follow('*', CMT, c)) == CMT) + do want('*'); while (p', PTR, t):t; + case '>': t = follow2('=', GE, c, RSH); return t==RSH?follow('=', RSHEQ, t):t; + case '<': t = follow2('=', LE, c, LSH); return t==LSH?follow('=', LSHEQ, t):t; + case '#': if (ft) { want('\n'); return CPP; } + } + + if (is(D, c)) { + if (c == '0' && (*p|32) == 'x') + c = *++p; + while (is(OHD, c)) + c = *p++; + if (c == '.') { + (void)strtod(s, (char**)&p); + return FLOAT; + } + return --p, INT; + } + + if (is(I, c)) { + while (is(I|D, c)) + c = *p++; + --p; + return iskw(s, p-s) ? KEYW : ID; + } + + return c ? c : ' '; // allows nulls in source code +} + +// iocccsize compat: adjust whitespace counts +void compat_words(int tlen, int inword) { + int c; + for (c=0; cbuf; + ci += tlen; + if (s[1] == '/') + compat_kw(tlen, inword); + compat_words(tlen, inword); + } else for (c=0; c w) { + if (*--os == '\n') + break; + } + + // look for last ends with newline, only remove ccounts if whitespace + if (*os == '\n' || os == buf || w[-1] == '\n') + cc -= s - os - (*os == '\n'); + + // look for whitespace before the comment, as well as after + if (!fk && (w != s || s == buf) && !is(W, s[tlen]) && s[1] == '*') + ++cw; + + if (s[1] == '*') + tprev = CMT; + } else if (t == '"' || t == '\'') { + // iocccsize -i does not count whitespace WITHIN a string!!! + // and {;} can be "free" within a string if follows the "rules" + compat_words(tlen, 1); + } + // count words, not tokens (a preceding old-style CMT is whitespace) + if (t && t != CMT && w == s && s > buf) + --cw; + if (!fs && (t != CMT || fk)) { + printf("%.*s", (int)(s-w), w); + printf("%.*s", tlen, s); + } +} + +void count() { + int t, tlen; + while ((t=lex())) { + tlen = p-s; + if (t != CMT) { + cc += tlen; + ++cw; + if (fr && t == KEYW) + ci += 1; + else if (t < 256 && is(B, t) && (is(W, *p) || !*p)) + ; + else + ci += tlen; + } + if (fc) + compat(t, tlen); + else if (!fs && (t != CMT || fk)) { + if (!ft) printf("%3d ", t); + printf("%.*s", tlen, s); + if (p[-1] != '\n') printf("\n"); + } + } + + if (fc) { + compat(0, e-w); + if (!fs && w 1) + while(--ac) puts(*++av); + else + puts("none"); +} diff --git a/2018/burton2/iocccbug03.c b/2018/burton2/iocccbug03.c new file mode 100644 index 000000000..6a07ab6f2 --- /dev/null +++ b/2018/burton2/iocccbug03.c @@ -0,0 +1,5 @@ +/* word count incorrect except with -k; view output with no args */ +main(){ +printf(/*testing*/ +"hello, world\n"); +} diff --git a/2018/burton2/iocccbug04.c b/2018/burton2/iocccbug04.c new file mode 100644 index 000000000..e4f4cd536 --- /dev/null +++ b/2018/burton2/iocccbug04.c @@ -0,0 +1,8 @@ +// this shows the impact of " quotes with -k +char*dquote="dquote"; +main(int ac, char **av) { + if (ac > 1 && av[1][0] == '\"') + printf(dquote); + if (ac == 0) + printf("int ac is zero\n"); +} diff --git a/2018/burton2/iocccbug05.c b/2018/burton2/iocccbug05.c new file mode 100644 index 000000000..67e53e65f --- /dev/null +++ b/2018/burton2/iocccbug05.c @@ -0,0 +1,13 @@ +// I is an identifier, not a reserved word +enum Foo { + I = 1, + O = 2 +}; +main(int ac, char**av) { + for(--ac; *++av; ) + switch (*av[0]-'0') { + case I: puts("input"); break; + case O: puts("output"); break; + default: puts("whatever"); break; + } +} diff --git a/2018/burton2/iocccbug06.c b/2018/burton2/iocccbug06.c new file mode 100644 index 000000000..0297e0c90 --- /dev/null +++ b/2018/burton2/iocccbug06.c @@ -0,0 +1,6 @@ +#include +#undef FOO +#ifndef FOO +int main() { + printf("howdy!\n"); +} diff --git a/2018/burton2/java8 b/2018/burton2/java8 new file mode 100644 index 000000000..f243ab476 --- /dev/null +++ b/2018/burton2/java8 @@ -0,0 +1,54 @@ +$ http://docs.oracle.com/javase/specs/index.html, Java SE 8 $ +abstract +assert +boolean +break +byte +case +catch +char +class +const +continue +default +do +double +else +enum +extends +final +finally +float +for +if +goto +implements +import +instanceof +int +interface +long +native +new +package +private +protected +public +return +short +static +strictfp +super +switch +synchronized +this +throw +throws +transient +try +void +volatile +while +true +false +null diff --git a/2018/burton2/kandr b/2018/burton2/kandr new file mode 100644 index 000000000..12c35320e --- /dev/null +++ b/2018/burton2/kandr @@ -0,0 +1,38 @@ +$ Kernighan & Ritchie, (1978) _The C Programming Language_, 180,207-208 $ +#define +#else +#endif +#if +#ifdef +#ifndef +#include +#line +#undef +auto +break +case +char +continue +default +do +double +else +entry +extern +float +for +goto +if +int +long +register +return +short +sizeof +static +struct +switch +typedef +union +unsigned +while diff --git a/2018/burton2/kandr2 b/2018/burton2/kandr2 new file mode 100644 index 000000000..2056f5838 --- /dev/null +++ b/2018/burton2/kandr2 @@ -0,0 +1,48 @@ +$ Kernighan & Ritchie, (1988) _The C Programming Manual, Second Edition_, 192,230-233 $ +#define +#elif +#else +#endif +#error +#if +#ifdef +#ifndef +#include +#line +#pragma +#undef +asm +auto +break +case +char +const +continue +default +defined +do +double +else +enum +extern +float +for +fortran +goto +if +int +long +register +return +short +signed +sizeof +static +struct +switch +typedef +union +unsigned +void +volatile +while diff --git a/2018/burton2/manpage b/2018/burton2/manpage new file mode 100644 index 000000000..9103aea73 --- /dev/null +++ b/2018/burton2/manpage @@ -0,0 +1,484 @@ +#!/bin/sh + +function usage { + cat <<'EoT' +NAME + manpage - format an ascii text file into man page format + +SYNOPSIS + manpage [-PR] [-d pdate] [-r rel] [-v vol] [-s sect] [-t title] + [-w ncols] [filename] + +DESCRIPTION + manpage converts its input into the man(7) macros as used by man(1), + but without the user needed to understand any formatting syntax. + It is designed to process a flat ascii file that roughly appears in the format + desired, adding the specific flourishes that distinguish a readable man page: + + - font changes for names and arguments throughout the document + - automatic recognition of command, C, C++, and Java names, types and arguments + - automatic recognition of paragraphs, list formats, sections, and non-formatted displays + - constant width fonts for code and displays + - cross-references highlighted + - pass-through of nroff formatting commands + + The input resembles the man page to be formatted, with just a few rules of presentation: + Sections ~ + Section names are input lines in all upper case. If a section name begins + with spaces, it starts a subsection. + Paragraphs ~ + A blank line between text marks a paragraph. All text in the same + paragraph must be left-aligned relative to itself. + Line Breaks ~ + A twiddle (~) at the end of a line is consumed and replaced + with a line break. This is especially useful in tag lists (this section). + Displays ~ + These are sections not to be formatted further. They are introduced + by a preceding blank line and indented relative to the surrounding text. + Displays are output in constant width font, and all code escapes may + be presented naturally: + + printf("Hello, World\n"); + + Tag Lists ~ + The tag is identified by three (3) or more spaces between itself + and its description. These rules are tag lists. Note especially + the trailing spaces on the tags in this section. + Bullet Lists ~ + These are identified by a leading dash (-), dot (.), or star (*). + Numbered Lists ~ + These begin with a number and a dot; e.g. "3. Number three". + Cross References ~ + This is a word followed by a number in parenthesis; e.g. man(1). + Bold / Italic ~ + A word surrounded by underscores (_) is rendered in _italic_; + and by stars (*) is rendered as *boldface*. + + There are two sections handled specially: + NAME + This is the name of the command or function, followed by a terse, + one-line summary of its primary use. + SYNOPSIS + This section is scanned for names, arguments, and flags. Names found + in this area are remembered, and each occurance throughout the document + are presented in bold. Arguments are similarly detected and remembered, + and presented in italics. Other text in this area is presented in + a constant width font. + +OPTIONS + -d pdate set the man page date + -r rel set the release name + -v vol set the volume name + -s sect set the section name + -t title set the man page title + -w ncols force the output to be ncols wide + -P PostScript output + -R roff output + +EXAMPLES + This usage is in the proper format for manpage. Try: + + manpage -h | manpage -tmanpage -s1 + + To view the nroff(1) formatted page, perhaps for inclusion in the system man pages: + + manpage -h | manpage -tmanpage -s1 -R > manpage.1 + +ENVIRONMENT + PAGER defaults to less(1); used if neither -P nor -R is specified as arguments + MANPATH input .man files searched in current dir, then HOME/man, then MANPATH + ORG name of organization (e.g. $ORG Reference Manual) + +SEE ALSO + man(1), man(7), groff(1), less(1), txt2man(1) + +PORTABILITY + This program uses generic bourne shell and awk syntax, POSIX compatible systems should work. + +BUGS + Code displays that span page breaks do not restore the troff(1) escape + during header / footer processing. + +AUTHOR + Dave Burton + + manpage(1) input format is inspired by txt2man(1) by Marc Vertes , + although the code is a clean redesign from first principles. +EoT +} + +function getwidth { + echo $(stty -a 2>/dev/null) | + if test $(uname) == "Darwin"; then + awk '/columns/{for(i=1;i<=NF;++i)if($i~/columns/)print$(i-1)+0}' + else + awk '/columns/{for(i=1;i<=NF;++i)if($i~/columns/)print$(i+1)+0}' + fi +} + +function scan { + for dir in . $HOME/man $(echo $MANPATH | tr : '\n'); do + test -r $dir/$1 && { echo $dir/$1; break; } + done +} + +function searchfor { + # examine the current dir for name, name.man, or scan a searchpath for name.man + test "$1" || { echo ""; return; } + filename=$1 + if ! test -r $filename || test -x $filename; then + expr "$filename" : .*.man >/dev/null 2>&1 || filename=$filename.man + result=$(scan $filename) + if ! test "$result"; then + echo cannot find $filename in curdir, $HOME/man or MANPATH >&2 + exit 1 + fi + filename=$result + fi + echo $filename +} + +width=0 +sys=($uname -s) +date= rel= vol= sect= title= +post= + +args="?hPRd:r:v:s:t:w:" +while getopts $args opt +do + case $opt in + d) date=$OPTARG;; + r) rel=$OPTARG;; + v) vol=$OPTARG;; + s) sect=$OPTARG;; + t) title=$OPTARG;; + w) width=$OPTARG;; + P) post="groff -man -Tps";; + R) post=cat;; + \?) echo "usage: $0 [-$args] [filename]" >&2; exit 1;; + h|*) usage; exit 1;; + esac +done +shift $((OPTIND-1)) + +date=${date:-$(date +'%d %B %Y')} + +# format and display the page now +if test $width -eq 0 -a ! "$post" ; then + width=$(getwidth) +fi + +# -is for pre-el-capitan +: ${post:="groff -man -Tascii | ${PAGER:-less -R}"} + +# seek for it, perhaps without the .man extension +filename=$(searchfor $1) || exit; shift; +# echo $filename; exit + +# intuit the title, section and volume from the input file +if ! test "$title" && test "$filename"; then + title=${filename##*/}; title=${title%.man} + title=$(echo $title | tr a-z A-Z) + if sed '/DESCRIPTION/q' $filename | egrep -q "#include|.import"; then + sect=${sect:-3} + vol=${vol:-"$ORG Programmer's Manual"} + else + sect=${sect:-1} + vol=${vol:-"$ORG Reference Manual"} + fi +fi + +# -------------------------------------------------- +# the formatting engine + +expand $filename | +awk -v width=$width -v th="$title $sect \"$date\" \"$rel\" \"$vol\"" ' +BEGIN { + if (width+0 > 0) { + # adjust output to a specific width; useful as man(1) replacement + cpi = (width+0)/11 + print ".ll " cpi "i" + print ".nr LL " cpi "i" + } + print ".TH", th + print ".if n .na\n.if n .nh" + block = 0 # depth of the block display + list = 0 # depth of the list indent + indent = 0 # current RS indent level + rs[indent] = 0 # array of starting indents + lw = 0 # leading whitespace + blank = 0 # NR of last blank line +} + +function bold(w) { return "\\fB" w "\\fP" } +function italic(w) { return "\\fI" w "\\fP" } + +function before(s) { return substr(s, 1, RSTART-1) } +function after(s) { return substr(s, RSTART+RLENGTH) } + +function add(t, r) { + gsub(/\./, "\\.", t) + pattern[t] = r +} + +# replace logic is W*P, but both W (words) and P (patterns) are small, +# and this is the only way to portably, reliably detect substitutable patterns +# within the larger text +# +function replace(dummy, i,count,other,pat,re) { + other = "[^-_A-Za-z0-9]+" + for (i=1; i<=NF; ++i) { + count = 0 + for (pat in pattern) { + # re = "^" pat "$|^" other pat "$|^" pat other "$|^" other pat other "$" + re = "^" pat "$|" other pat "$|^" pat other "|" other pat other + if ($i ~ re) { + count = sub(pat, pattern[pat], $i) + break; + } + } + + # one-time, in place bold, italic, and cross-ref + if (section != "SYNOPSIS" && count == 0) { + # match foo(1) or foo(1pkg) not foo(1 2) or foo(1, 2) or foo(int) + # but not in a see also section + if ((section != "SEE") && # aka SEE ALSO + ($i ~ /[_A-Za-z0-9]+\([0-9][A-Za-z0-9]*\)/)) { + a = index($i, "(") + $i = bold(substr($i, 1, a-1)) substr($i, a) + } + else if (match($i, "[A-Za-z]_.*_[A-Za-z]")) + ; + else if (match($i, "_.*_")) + $i = before($i) italic(substr($i, RSTART+1, RLENGTH-2)) after($i) + else if (match($i, "\\*.*\\*")) + $i = before($i) bold(substr($i, RSTART+1, RLENGTH-2)) after($i) + } + } + if ($NF == "~") { + $NF = "" + return 1 + } + return 0 +} + +function paragraph() { + print ".PP" + list = lw # reset list on a paragraph + tplen = "" +} + +function restore() { + if (blank == NR-1) # restore the blank line to the display + print "" + n = lw - block + if (n==0) n=1 # avoid eating leading dots in displays + printf "%*s", n, " " # restore leading spaces in displays +} + +function block_start() { + block = lw + blank = 0 + paragraph() + print ".RS " block + print ".eo\n.nf\n.fam C" +} + +function block_end() { + if (block > 0) { + block = 0 + print ".ec\n.fi\n.fam T" + print ".RE" + } +} + +function reset_indent() { + rs[0] = indent = 0 +} + +# pass through nroff formatting commands +/^\..+/ { + print $0 + next +} + +# remember leading whitespace, strip blank lines +{ + lw = match($0, /[^ ]/) + if (lw == 0) { + blank = NR + next + } else { + $0 = substr($0, lw) + # sub(/^ */, "") + # sub(/ *$/, "") # prevents TP match if desc on next line + } + --lw + if (rs[indent] == 0) + rs[indent] = lw +} + +# new section (must end with a cap letter to avoid tag list match) +/^[A-Z ]+[A-Z]$/ { + if (section == "SYNOPSIS") + print ".fi" + block_end() + reset_indent() + list = 0 + tplen = "" + section = $1 + print (lw>0) ? ".SS" : ".SH", $0 + if (section == "SYNOPSIS") { + print ".nf" + print ".fam C" + } + if (section == "SEE") + print ".nf" + next +} + +section == "NAME" && name == "" && $1 != "" { + name = $1 + # add(name, bold(name)) + sub(/ - /, " \\- ") +} + +section == "SYNOPSIS" { + if (format == "") { + block = lw # this is a pseudo-block; see new section + if ($0 ~ /\(/) format = "code" + else if ($1 == "struct" || $2 == "struct") format = "struct" + else if ($1 == "union" || $2 == "union") format = "struct" + else if ($1 == "class" || $2 == "class") format = "class" + else if ($1 !~ /#|import|typedef|enum/) format = "cmd" + } + if (format == "cmd") { + # cmd [-a N] [-b N] [-m ab] [-p S] + # [-r] [-qst] @interface ip:port [filename ...] + i = 1 + if ($1 !~ /^\[/) { + ++i + a = $1 + gsub("-", "\\-", a) + add(a, bold(a)) + } + for (; i<=NF; ++i) { + a = $i + gsub(/[\[\]]/, "", a) # remove all brackets + if (a == "-") ; + else if (a ~ /^-./) add(a, bold("\\" a)) + else if (a !~ /\.\.\./) add(a, italic(a)) + } + } else if (format == "code") { + # void foo() + # void foo(int); + # void foo(int a); + # void foo(int a, char *b); + # void *foo(char **b, int *a, ...) + # void (*signal(int sig, void (*func)(int)))(int); + # ssize_t readv(int d, const struct iovec *iov, int iovcnt); + if ($1 != "typedef") + for (i = 1; i<=NF; ++i) { + a = $i + gsub("[\\*]", "", a) # dont want to mess with pointers + if (match(a, "[A-Za-z0-9_]+\\(")) { + a = substr(a, RSTART, RLENGTH-1) + add(a, bold(a)) + } else if (match(a, "[A-Za-z0-9_]+[,\\)]")) { + a = substr(a, RSTART, RLENGTH-1) + add(a, italic(a)) + } + } + } else if (format == "struct") { + if (match($0, "[A-Za-z0-9_]+[ ]*{")) { + a = substr($0, RSTART) + sub("[ ]*{", "", a); + add(a, bold(a)); + } + format = "code" + } else if (format == "class") { + # public class Foo extends Bar implements Snox, Blah, Nuts { + # so remove from extends or implements, play as if C++ + a = $0 + if (match(a, "extends|implements")) + a = substr(a, 1, RSTART-1) + if (match(a, "[A-Za-z0-9_]+[ ]*{")) { + a = substr(a, RSTART) + sub("[ ]*{", "", a); + add(a, bold(a)); + format = "code" + } + } + replace() +} + +block == 0 { + if (lw > rs[indent]+2) { + if (blank == NR-1) + block_start() + else if (lw > list) { + # XXX list? + rs[++indent] = lw; + print ".RS" + } + } else while (lw < rs[indent]) { + print ".RE" + --indent + list = 0 + tplen = "" + } +} + +block > 0 { + if (lw < block) + block_end() + else { + restore() + print $0 + next + } +} + +{ + # if replace before matching, awk collapses multiple spaces into one.... + if (match($0, /[^ ] +/)) { # tag description + list = lw + RSTART + RLENGTH + tag = substr($0, 1, RSTART) + def = substr($0, RSTART + RLENGTH) + $0 = tag + if (tplen == "" && def !~ /[.~]/) + tplen = list-3 + replace() + print ".TP " tplen "\n" bold($0) + $0 = def + + } else if (match($0, /^[o\.\*+] +/)) { # bullet list + list = lw + RSTART + RLENGTH + print ".IP \\(bu 3" + $0 = substr($0, RLENGTH+1) + + } else if (match($0, /^- +/)) { # dash list + list = lw + RSTART + RLENGTH + print ".IP \\(em 3" + $0 = substr($0, RLENGTH+1) + + } else if (match($0, /^[0-9]+\. +/)) { # number list + list = lw + RSTART + RLENGTH + print ".IP " $1 " 3" + $0 = substr($0, RLENGTH+1) + + } else { + # the lists above supply their own vertical separation + if (blank == NR-1) + paragraph() + } + + # if there is anything left to print... + if (length $0 > 0) { + br = replace(); + if (length $0 > 0) + print $0 + if (br) print ".br" + } +} +' | eval $post diff --git a/2018/burton2/mkkeywords b/2018/burton2/mkkeywords new file mode 100644 index 000000000..0aeaa26c9 --- /dev/null +++ b/2018/burton2/mkkeywords @@ -0,0 +1,3 @@ +#!/bin/sh +awk '/^[^$]/{l=length;m=m>l?m:l;a[l]=a[l]$1} + END{printf"\"";for(i=1;i<=m;++i)printf" "a[i];print"\""}' $* diff --git a/2018/burton2/patch b/2018/burton2/patch new file mode 100644 index 000000000..fae3f1cc2 --- /dev/null +++ b/2018/burton2/patch @@ -0,0 +1,63 @@ +--- iocccsize.orig.c 2018-01-13 10:01:16.000000000 -0600 ++++ iocccsize.c 2018-01-14 16:23:57.000000000 -0600 +@@ -181,6 +181,7 @@ + { STRLEN("#ident"), "#ident" }, + { STRLEN("#if"), "#if" }, + { STRLEN("#ifdef"), "#ifdef" }, ++ { STRLEN("#ifndef"), "#ifndef" }, /* XXX bugfix */ + { STRLEN("#include"), "#include" }, + { STRLEN("#line"), "#line" }, + { STRLEN("#pragma"), "#pragma" }, +@@ -225,7 +226,7 @@ + { STRLEN("float"), "float" }, + { STRLEN("for"), "for" }, + { STRLEN("goto"), "goto" }, +- { STRLEN("I"), "I" }, ++ /* { STRLEN("I"), "I" }, */ /* XXX seriously? */ + { STRLEN("if"), "if" }, + { STRLEN("inline"), "inline" }, + { STRLEN("int"), "int" }, +@@ -365,6 +366,7 @@ + int lcount, wcount, bcount; + int is_comment, is_word, dquote, escape; + int count, keywords, saved, kw_saved; ++ int squote; + + /* Start of buffer sentinel. */ + buf[0] = ' '; +@@ -374,6 +376,7 @@ + keywords = kw_saved = 0; + lcount = wcount = bcount = 0; + is_comment = is_word = dquote = escape = 0; ++ squote = 0; + + /* + * "no matter how well you may think you understand this code, +@@ -422,6 +425,15 @@ + } + } + ++ else if (squote) { ++ if (escape) ++ escape = 0; ++ else if (*p == '\\') ++ escape = 1; ++ else if (*p == '\'') ++ squote = 0; ++ } ++ + /* Not quote string. */ + else { + /* In C comment block? */ +@@ -499,6 +511,11 @@ + } + } + ++ /* Open single quote string? */ ++ else if (*p == '\'') { ++ squote = 1; ++ } ++ + /* Open quoted string? */ + else if (*p == '"') { + dquote = 1; diff --git a/2018/burton2/prog.c b/2018/burton2/prog.c new file mode 100644 index 000000000..7123aafa6 --- /dev/null +++ b/2018/burton2/prog.c @@ -0,0 +1,67 @@ +#include +#include +#include +typedef unsigned char*_; +_ s,i,z,e,O,F= +#include W + + "; ; } { { { { { } { { } ; } { ; ; { } ; { { } ; } ; { { { { } { { } \ + ; } { { { { { } { ; } { } { { } { { } { { { ; ; { { } { { } { ; } { \ + } { { { { { } ; } { } { { } { { { \ + } { ; } { } { { { { { } ; } { } { \ + { { } { { } ; ; { ; ; { { } { { } \ + { ; } { } { { { } { } { { { ; { { \ + { } { { } { { { { } { { { { { } ; \ + ; { ; ; { { { { { } { ; } { } { { { { { } ; ; { ; ; { { ; { ; { { { \ + } { } { { { ; { ; { { { ; ; { } { { { } { ; } { } { { { { { } { { { \ + ; ; { { } { ; { { { } { } { { { ; { ; { { { ; ; { { { { { } { { { { \ + \ + } { { { { { } ; } { } { { { { { { } { { { { } ; } ; { { { } \ + { { { { { } { { } { { { } { { ; { { } { ; { { { { ; { { ; { \ + { { { { } } { { ; { } { { { ; ; { \ + { ; { ; { } { } ; { } { } ; { ; } { { { } { ; { } \ + { ; { { { } { ; } } { ; ; { { } { ; ; } { ; ; ; { \ + } } { { } } { ; { { } } { } } } { \ + ; } { } } { ; } } { ; ; { } } } { \ + { { { { { } } } ; ; { } { ; ; } { ; } ; } { } { } } } { } { } { } \ + { ; } { ; ; { } { } } { } { ; } } } { } } } } } } ; } } } } ; { } \ + { } ; } } } } ; } } } ; { { } } } ; ; } } { { } } } ; { { " ; ; ; ; +unsigned v,o,l,A,T,I,L,E,c,H,a,C,K,R,Z=256; char n,M[2053]; int*q; int h(_ F,int l) { for(; + l--&&*F; putchar(*F++)); return 0; } int r(int I,int O){ return!fprintf(O&2?stderr:stdout + ,"%d%c",I,O&1?l:32); } int m(char O){ for(a=0; a-O&&z=e; )return C-= +!c,c; for(a=M[c]; v&32&&c==35; )return m(l),o+2; for(; a&8; ){ for( ++o; M[c] &12; c=*z++); +return d(s,--z-s)?o:++o; } for(; a&4; ){ for(c=c==48&&(*z|32)==120? *++z:c; M[c]&6; c=*z++) +; return o+(c==46?strtod(s,(char**)&z),5:!--z^4); } for(; c==47&& (*z==c||*z==42); ){ for(; +c==*z++; )return m(l),o; for(m(42); zi; for(A-=T&& +a&&M[O[-1]]-16,!(v&8)&& (T| c)?h(O,s-O), h(s,F):T; !T +++; H=Z+s[1]-42){ for( n=a ; c; c^=c)for(I+=F,g(F,n +),n=c=2; cO &&*--o-l; ); C-=*o== +l||o==i||O[~0]==l?s-o- (*o==l):0; } } int b(int +l){ for(a=0; l--; a+=c- 59?c==125:-~1) for(a+=a+ +a; (c=* F++)== 32||c==9; ); return a; } int main ( +int S,char**H){ for(s=e= M+Z,q= (int*)s,e+=Z/2; *F- +59; *e++=*F++)for(; *F==32 ; ++F,q[++*q]=e-s); for(q[++ +*q]=e-s,z=M,v=b(3); v--; )for (z+= b(3),o= b(3),c=b(5); o--; +*z++=c); for(*++e=l=10,O=s=M+4* Z,v=b (3); v--; O[o]=b(5))o=b(5) +; for(O+=32,v=0; ~(a=getopt(S,H,O) ); )for(v|=s[a&31]; !(a ^~-Z >>2); ) +return h(U,~0); for(O+=32,a=0,o=2; c= getchar(),o>2&1;R +=C-I-T; C+=E; return v&32?0:v&16?r(I,1):r(L,2)+r(A,2)+r(C,2)+r(I,2)+r(R,2)+r(K,2)+r(T,3); } diff --git a/2018/burton2/results b/2018/burton2/results new file mode 100644 index 000000000..bcf008621 --- /dev/null +++ b/2018/burton2/results @@ -0,0 +1,16 @@ +test01.c: 11 32 198 106 58 10 34 +test02.c: 1 5 37 29 8 0 0 +test03.c: 3 26 147 98 37 3 12 +test04.c: 6 12 88 47 16 5 25 +test05.c: 4 28 154 100 40 4 14 +test06.c: 7 10 74 41 24 2 9 +test07.c: 15 42 258 147 70 11 37 +test08.c: 11 32 198 106 58 10 34 +test09.c: 11 32 198 106 58 10 34 +test10.c: 7 15 163 94 17 6 18 +test11.c: 82 84 325 126 16 11 41 +test12.c: 6 10 73 41 23 2 9 +test13.c: 0 1 5 2 1 1 2 +test14.c: 4 8 62 41 12 2 9 +fixed_iocccsize.c: 408 1278 8781 5833 2464 156 484 +ioc_without_quote: 354 1383 7817 4488 2692 221 625 diff --git a/2018/burton2/results.k b/2018/burton2/results.k new file mode 100644 index 000000000..50f04bcc1 --- /dev/null +++ b/2018/burton2/results.k @@ -0,0 +1,16 @@ +test01.c: 11 32 198 106 58 10 34 +test02.c: 14 39 241 173 68 0 0 +test03.c: 3 26 147 98 37 3 12 +test04.c: 6 12 88 47 16 5 25 +test05.c: 4 31 167 107 46 4 14 +test06.c: 7 14 95 53 33 2 9 +test07.c: 16 46 291 173 77 11 37 +test08.c: 12 38 224 120 70 10 34 +test09.c: 13 38 232 130 68 10 34 +test10.c: 7 15 163 94 17 6 18 +test11.c: 82 84 325 126 16 11 41 +test12.c: 7 10 89 51 29 2 9 +test13.c: 0 1 5 2 1 1 2 +test14.c: 4 8 73 52 12 2 9 +fixed_iocccsize.c: 637 2723 16904 12007 4369 168 528 +ioc_without_quote: 396 1740 9917 6135 3097 247 673 diff --git a/2018/burton2/runtest b/2018/burton2/runtest new file mode 100644 index 000000000..87a71d582 --- /dev/null +++ b/2018/burton2/runtest @@ -0,0 +1,9 @@ +#!/bin/sh + +: ${prog:=./prog} +: ${opt:=crs} + +exec 2>&1 +for name in test*c fixed_iocccsize.c ioc_without_quote; do + /bin/echo -n "$name: "; $prog -$opt < $name +done diff --git a/2018/burton2/spotcheck b/2018/burton2/spotcheck new file mode 100644 index 000000000..4969fe161 --- /dev/null +++ b/2018/burton2/spotcheck @@ -0,0 +1,27 @@ +#!/bin/sh + +ioc=$1 +: ${iocccsize:=iocccsize} +: ${ioc:=prog} + +opt=-crs +kopt=-kcrs + +for name in $*; do + + if test $name != $ioc; then + + a=$($ioc $opt < $name 2>&1) + b=$($iocccsize $opt < $name 2>&1) + if test "$a" != "$b"; then + echo $a , $b , $name + fi + + a=$($ioc $kopt < $name 2>&1) + b=$($iocccsize $kopt < $name 2>&1) + if test "$a" != "$b"; then + echo $a , $b , $name " keep" + fi + + fi +done diff --git a/2018/burton2/spotdiff b/2018/burton2/spotdiff new file mode 100644 index 000000000..b3700cda3 --- /dev/null +++ b/2018/burton2/spotdiff @@ -0,0 +1,9 @@ +#!/bin/sh + +# filename is 17 +# 1=cl 2=cw 3=cc 4=ci 5=ts 6=kw 7=kws +# 9 10 11 12 13 14 15 +awk '{ + printf "cl %d cw %d cc %d ci %d ts %d kw %d ks %d %s %s\n", + $9-$1, $10-$2, $11-$3, $12-$4, $13-$5, $14-$6, $15-$7, $17, $18 +}' diff --git a/2018/burton2/src.doc.rot13 b/2018/burton2/src.doc.rot13 new file mode 100644 index 000000000..c00ca746f --- /dev/null +++ b/2018/burton2/src.doc.rot13 @@ -0,0 +1,81 @@ +zrzbel znc: Z (bssfrg, yratgu) + 0,256 gbxravmngvba syntf + 256,128 xrljbeq yratgu bssfrg znc + 384,640 xrljbeq fgevatf (453 punef) + 1024,32 bcgvba ovg znc + 1056,32 trgbcg fgevat + 1088,256 gevtencu znc + +serrpbqr: gevanel, nycunorg 0 { 1 } 2 ; + hfvat guerr gevgf, gur nycunorg N-M jvgu n fcnpr/ahyy pna or rapbqrq: + 0 fcnpr/ahyy, 1 N, 2 O, 3 P, ... + nygubhtu guvf rapbqvat vf abg gur bayl bar + pbqr vf serr-sbez, fcnpr ntabfgvp (bar be zber fcnprf ner erdhverq sbe vg gb or 'serr') + qrpbqvat vf pbagrkg qrcraqrag, glcvpnyyl hfvat 3 be zber gevgf + gur cebtenz pbzzragf hfr o(3) naq gur nycunorg rapbqvat nobir, + ohg gurl ner abg pyrnayl fcyvg ba 3-gevg obhaqnevrf(!) + +v N pj + O +v P pp + Q +v R pk +c S[] xrljbeqf, gbxra vavg, bcgvbaf vavg, bcgvba fgevat, gevtencu vavg + T +v U pbzzrag uvfgbel +v V pv + W +v X px +v Y py +p Z[2053] zrzbel: gbxra syntf, xrljbeq gnoyr, bcgvba gnoyr, gevtencu gnoyr + A +c B fgneg bs juvgrfcnpr + C + D +v E gf + F +v G gx +q H qrsvarq hfntr zrffntr (-QH="\"uryc grkg\"") + I +q J qrsvarq erfreirq jbeq fgevat (-QJ=\"xrljbeqf\") + K + L +v M 256 +v n tybony +v o(v) qrpbqr serrpbqr hfvat v ovgf +v p tybony +v q(f,v) vf n xrljbeq? +c r raq bs ohssre +i s(v,v) pbzcng +i t(v,v) pbzcng_jbeqf +v u(f,v) cevag v punef bs f, be hagvy ahyy +c v ohssre +v w() yrkre + x +v y 10 / arjyvar +v z(p) jnag(p), unaqyrf rfpncrf + a tybony +v b tybony + c +c d xrljbeq vaqrk gnoyr +v e(v,v) cevag net1 nf vag gb fgqbhg/ree ol net2, genvyrq ol fcnpr/arjyvar + f fgneg bs gbxra + g + h +v i pzq yvar syntf + j + k + l +c m pheerag cbvagre + +shapgvbaf + +v u(f,v) cevag v punef bs f, be hagvy ahyy +v e(v,v) cevag net1 nf vag gb fgqbhg/ree ol net2, genvyrq ol fcnpr/arjyvar +v z(p) jnag(p), unaqyrf rfpncrf +v q(f,v) vf n xrljbeq? +v w() yrkre +i t(v,v) pbzcng_jbeqf +i s(v,v) pbzcng +v o(v) qrpbqr serrpbqr hfvat v ovgf +v znva(p,cc) vavg, bcgvbaf, ernq, pbhag, cevag diff --git a/2018/burton2/tac.c b/2018/burton2/tac.c new file mode 100644 index 000000000..bdee4037e --- /dev/null +++ b/2018/burton2/tac.c @@ -0,0 +1,509 @@ +/* + * tac - tokenize and count C-like languages + * + * tac is offered as a replacement for iocccsize. + * Version 2018.04.18 + * Public Domain 2015 by Dave Burton. + * Please keep this attribution with the source code. + * + * cc -O3 -DW=\"keywords\" -Wall -pedantic -o tac tac.c + */ + +#include +#include +#include +#include + +/* + * The keywords recognized by tac should be defined in an external file, + * filtered by the following script into a new file, and #included + * by defining the preprocessor variable W as this new file. + * + * The input to the script is a list of keywords, one word per line, + * in any order. The output is a single string suitable for tac. + * -------------------------------------------------- + +#!/bin/sh +awk '/^[^$]/{l=length;m=m>l?m:l;a[l]=a[l]$1} + END{printf"\"";for(i=1;i<=m;++i)printf" "a[i];print"\""}' $* + + * -------------------------------------------------- + * The pre-defined string below is the IOCCC reserved word list for 2016. + * It was created by the above script, then inserted here in case the + * source keywords file is not available. + * + * The format of the keyword string is precise; addition or removal of + * a single character will cause improper operation. + * + * DO NOT EDIT the string kw; instead: + * + * mkkeywords < my.list > my.keywords + * cc -DW=\"my.keywords\" -o tac tac.c + */ + +char *keywords = "" +#ifndef W + +" ifdoor intfor#ifandnotxor voidcharelsegotocaselongenumautobooltr\ +ue whilebreakconstfloatshortunion#else#elif#line_Boolfalsecomplbito\ +ror_eq returnsizeofstructdoubleswitchstaticexternsigned#ifdef#endif\ +inline#errorbitandand_eqnot_eqxor_eq typedefdefault#ifndef#pragma_A\ +tomic_Pragmaalignasalignof #includeunsignedcontinuevolatileregister\ +restrict#warning_Complex_Generic_Alignas_Alignofnoreturn _Noreturn \ +_Imaginary thread_local _Thread_localstatic_assert _Static_assert" + +#else +# include W +# undef W +#endif +; + +int cline, cword, cbyte, cioccc, ckey, cextra; // counts +int tsaved, tkey; // totals +int fkeep, fsuppress, freserved, fioccc, fcompat, ftoken; // flags + +unsigned char *buf, *cur, *end, *white, *start; + +enum { + CPP = 256 + , CMT = 257 + , KEYW = 258 + , DIVEQ = 259 + , MULEQ = 260 + , MODEQ = 261 + , ADDEQ = 262 + , SUBEQ = 263 + , XOREQ = 264 + , OREQ = 265 + , ANDEQ = 266 + , RSHEQ = 267 + , LSHEQ = 268 + , NOTEQ = 269 + , EQ = 270 + , GE = 271 + , LE = 272 + , OR2 = 273 + , AND2 = 274 + , PP = 275 + , MM = 276 + , PTR = 277 + , LSH = 278 + , RSH = 279 + , INT = 300 + , FLOAT = 301 + , ID = 302 + , DOT3 = 303 +}; + +enum { + O=0x01 // octal + , H=0x02 // hex + , D=0x04 // decimal + , I=0x08 // identifier + , W=0x10 // whitespace + , B=0x20 // brace, semi + , OHD = O|H|D + , HD = H|D + , HI = H|I +}; + +char tab[256] = { + W, 00, 00, 00, 00, 00, 00, 00, 00, W, W, W, W, W, 00, 00, + 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, + W, 00, 00, I, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, + OHD,OHD,OHD,OHD,OHD,OHD,OHD,OHD, HD, HD, 00, B, 00, 00, 00, 00, + + 00, HI, HI, HI, HI, HI, HI, I, I, I, I, I, I, I, I, I, + I, I, I, I, I, I, I, I, I, I, I, 00, 00, 00, 00, I, + 00, HI, HI, HI, HI, HI, HI, I, I, I, I, I, I, I, I, I, + I, I, I, I, I, I, I, I, I, I, I, B, 00, B, 00, 00, +}; + +char tri[256] = { + ['='] = '#', + ['('] = '[', + ['/'] = '\\', + [')'] = ']', + ['\'']= '^', + ['<'] = '{', + ['!'] = '|', + ['>'] = '}', + ['-'] = '~', +}; + +#define is(x, c) (tab[c]&(x)) + +/* + * discard backslash-newline as-if not present, even if trigraph backslash + * iocccsize counts tri as xbcount+=2, + * and bs-nl as xb+=2, xw++, xl++ to match wc(1) + */ + +void readsource() { + int c, d, o=2, len=4096; + buf = malloc(len); + while ((c = getchar()) != EOF) { + if (c == '\r') { + if (fcompat) ++cextra; + continue; + } + if (buf[o-1] == '?' && buf[o-2] == '?' && tri[c]) { + c = tri[c]; + o -= 2; + if (fcompat) cextra += 2; + } + + /* + * digraph support: + * translating digraphs after trigraphs is, + * for the purposes of this code, essentially during tokenization. + */ + d = c; + switch (buf[o-1]) { + case '<': d = (c == ':' ? '[' : c == '%' ? '{' : c); break; + case '%': d = (c == '>' ? '}' : c == ':' ? '#' : c); break; + case ':': d = (c == '>' ? ']' : c); break; + } + if (c != d) { + c = d; + o--; + if (fcompat) ++cextra; + } + + if (c == '\n' && buf[o-1] == '\\') { + --o; + cline++; + if (fcompat) { + ++cword; + cextra += 2; + } + } else + buf[o++] = c; + if (o == len) + buf = realloc(buf, len+=4096); + } + buf[o] = 0; + end = buf + o; + cur = buf += 2; +} + +/* + * keyword recognition: kw is sorted by length, space separated between lengths + * e.g. " ifdo forint#if charvoidelsegoto..." + * build a table of offsets for each length + * e.g. [0]0, [1]1, [2]2, [3]7, [4]17, ... + * this allows scans for only words of same length instead of entire list + * trade-off is a small, but constant start-up cost to get a configurable + * word list (backported from obfuscated code: it was too nice to give up) + */ + +int nkwoff, kwoff[32]; // allows keywords up to 32 characters in length + +void kwinit() { + char *k = keywords; + for (nkwoff = 0; *k; ++k) + while (*k == ' ') + kwoff[++nkwoff] = ++k - keywords; + kwoff[++nkwoff] = ++k - keywords; +} + +int iskw(unsigned char *s, int len) { + int found = 0; + if (len < nkwoff) { + char *off = keywords + kwoff[len]; + char *end = keywords + kwoff[len + 1] - 1; + for (; !found && off < end; off += len) + found = *s == *off && !strncmp((char*)s, off, len); + if (found) { + ++ckey; + tkey += len - 1; + } + } + return found; +} + +int want(char m) { + while (cur < end) { + if (*cur == '\\') { + /* + * need to only ignore: ntbrfv\'"a?, octal, x, hex + * 0111 = two chars, \091 = three, \xabc = one char(!) + * for our purposes, only need: ' " and \ newline, + * but readsource eats \ newline, so only quotes here + */ + if (cur[1] == '\\' || cur[1] == '\'' || cur[1] == '"') { + cur += 2; + continue; + } + } + if (*cur == '\n') ++cline; + if (*cur++ == m) return m; + } + return 0; +} + +int follow(char m, int y, int n) { + if (*cur == m) return ++cur,y; + return n; +} + +int follow2(char m, int y, int n, int y2) { + if (*cur == m) return ++cur,y; + if (*cur == n) return ++cur,y2; + return n; +} + +int skipwhite() { + int c; + for (c=*cur++; cur<=end && is(W, c); c=*cur++) { + ++cbyte; + if (c == '\n') ++cline; + } + return c; +} + +/* + * CPP tokens may extend beyond a single line of text and include comments + * To do this correctly, need to scan and remove comments during readsource + * and present comments as whitespace. Note that "# include" is a valid CPP + * token, and does not match "#include". + * + * Because the global pointers cur, start and white are well-known, and + * because comments are not consumed during readsource, it is more difficult + * to parse CPP stuff. Also note that for backwards compat, we need to also + * count words correctly, with and without -k. + */ + +int lex() { + int c, t; + + white = cur; + c = skipwhite(); + start = cur-1; + + if (cur >= end) + return c; + + switch (c) { + case '\'': want(c); return c; + case '"': want(c); return c; + case '/': + t = follow2('=', DIVEQ, c, CMT); + if (t == CMT) + want('\n'); + else if (t == c && (t = follow('*', CMT, c)) == CMT) + do want('*'); while (cur', PTR, t) : t; + case '>': t = follow2('=', GE, c, RSH); + return t==RSH? follow ('=', RSHEQ, t) : t; + case '<': t = follow2('=', LE, c, LSH); + return t==LSH? follow ('=', LSHEQ, t):t; + + case '#': if (ftoken || !fcompat) return want('\n'), CPP; + case '.': if (cur[0] == c && cur[1] == c) return cur+=2, DOT3; + } + + if (is(D, c)) { + if (c == '0' && (*cur|32) == 'x') + c = *++cur; + while (is(OHD, c)) + c = *cur++; + if (c == '.' || (c|32) == 'e') { + (void)strtod((char*)start, (char**)&cur); // find end of float + return FLOAT; + } + return --cur, INT; + } + + if (is(I, c)) { + while (is(I|D, c)) + c = *cur++; + --cur; + return iskw(start, cur-start) ? KEYW : ID; + } + + return c ? c : ' '; // allows nulls in source code +} + +// iocccsize compat: adjust whitespace counts +void compat_words(int tlen, int inword) { + int c; + for (c=0; cbuf; + cioccc += tlen; + if (start[1] == '/') + compat_kw(tlen, inword); + compat_words(tlen, inword); + } else for (c=0; c white) { + if (*--os == '\n') + break; + } + + // look for last ends with newline, + // only remove ccounts if whitespace + if (*os == '\n' || os == buf || white[-1] == '\n') + cbyte -= start - os - (*os == '\n'); + + // look for whitespace before the comment, as well as after + if (!fkeep + && (white != start || start == buf) + && !is(W, start[tlen]) && start[1] == '*') + ++cword; + + if (start[1] == '*') + tprev = CMT; + } else if (t == '"' || t == '\'') { + // iocccsize -i does not count whitespace WITHIN a string!!! + // and {;} can be "free" within a string if follows the "rules" + compat_words(tlen, 1); + } + // count words, not tokens (a preceding old-style CMT is whitespace) + if (t && t != CMT && white == start && start > buf) + --cword; + if (!fsuppress && (t != CMT || fkeep)) + printf("%.*s", (int)(start-white)+tlen, white); +} + +void count() { + int t, tlen; + kwinit(); + while ((t=lex())) { + tlen = cur-start; + if (t != CMT) { + cbyte += tlen; + ++cword; + if (freserved && t == KEYW) + cioccc += 1; + else if (t < 256 && is(B, t) && (is(W, *cur) || !*cur)) + ; + else + cioccc += tlen; + } + if (fcompat) + compat(t, tlen); + else if (!fsuppress && (t != CMT || fkeep)) { + if (!ftoken) printf("%3d ", t); + printf("%.*s", tlen, start); + if (cur[-1] != '\n') printf("\n"); + } + } + + if (fcompat) { + // process comments just before end of file + compat(0, end-white); + } + + if (fkeep) cbyte = end - buf; + if (!freserved) tkey = 0; + tsaved = cbyte - cioccc - tkey; + cbyte += cextra; +} + +int main(int ac, char **av) { + static char usage[] = "[flags] [file]\n\ + -t tokenize input\n\ + -c compatible count and display token ids\n\ + -k keep comments\n\ + -s suppress source\n\ + -r reserved words count as 1\n\ + -i ioccc size (implies -rs)\n\ + -h this help"; + + fcompat = 1; // default: compact with iocccsize: invert sense of -c + + int c; + while ((c = getopt(ac, av, "?tcksrih")) != EOF) { + switch (c) { + case 't': ftoken = 1; // fallthru - -t implies -c + case 'c': fcompat = 0; break; + case 'k': fkeep = 1; break; + case 's': fsuppress = 1; break; + case 'r': freserved = 1; break; + case 'i': fioccc = freserved = fsuppress = fcompat = 1; break; + case 'h': // fallthru, alias for -? + default: + fprintf(stderr, "%s %s\n", av[0], usage); + return 1; + } + } + + ac -= optind; + av += optind; + if (ac > 0 && !freopen(*av, "r", stdin)) { + perror(*av); + exit(1); + } + + readsource(); + count(); + + if (!ftoken) { + if (fioccc) printf("%d\n", cioccc); + else fprintf(stderr, "%d %d %d %d %d %d %d\n", + cline,cword,cbyte,cioccc,tsaved,ckey,tkey); + } + return 0; +} diff --git a/2018/burton2/tac.man b/2018/burton2/tac.man new file mode 100644 index 000000000..6e4071836 --- /dev/null +++ b/2018/burton2/tac.man @@ -0,0 +1,96 @@ +NAME + tac - tokenize and count C-like program source code + +SYNOPSIS + tac [-t] [-c] [-k] [-r] [-s] [-i] [file] + +DESCRIPTION + tac reads C or C-like source code from stdin or file, breaking it into tokens (lexemes), + counting these according to the rules of the IOCCC, and outputting the tokens, + counts, or source code as directed by the command line options. + The default output is the source code with comments removed on stdout, + and the counts on stderr. + + The count format is a set of integer values in the following order: + + lines number of newlines + words number of words + chars number of characters + ioccc number of IOCCC countable tokens; the IOCCC rule 2 value + saved number of characters not counted due to rules and keywords + kwcnt number of keywords + kwlen number of characters saved by counting keyword length as 1 + + For the following code: + + #include + int main() { + /* example for loop */ + for (int ac=1; ac<10; ++ac) + printf("%d\n", ac); + return 0; + } + + tac prints the code to stdout, and to stderr: + + 6 15 96 71 25 5 0 + + which means 6 lines, 15 words, 96 chars, 71 IOCCC counts, 25 chars saved, + 5 kwcnt, and no characters saved from kwlen. (By default, comments are not + counted.) + + The following options are supported: + + -t output just the token stream + -c correct the accounting bugs in iocccsize(1), output the token id and the token + -k keep the comments + -r reserved words count as size 1 + -s suppress the source code, summarize counts only + -i report only the official IOCCC rule 2 size: number of octets (implies -r and -s) + + Counts are impacted by the -k, -r and -c options. + By default, the counts do not include comments, words are counted as in wc(1), + and reserved words count in full. + Using the example code above, the options change the counts as follows: + + -r 6 15 96 53 25 5 18 + -k 7 20 120 89 31 5 0 + -c 7 36 98 71 27 5 0 + + The -c option counts tokens instead of words, and is therefore more accurate for source code. + Note the aberration for line count with -r; it is as-if the comment never existed. + + The -c and -t options change the output, instead writing a stream of tokens to stdout, + one token per line. + The -t option suppresses both the counts and the token ids, writing only the tokens. + +EXAMPLES + Summarize the source code counts: + + tac -rs tac.c + + Count the 10 most frequently used unique tokens in the source code: + + tac -t tac.c 2>/dev/null | sort | uniq -c | sort -k1nr | sed 10q + + Count the unique constants in the source: + + tac -c tac.c 2>/dev/null | grep ^300 | sort | uniq -c | sort -k1nr | awk '{print $1,$3}' + +BUGS + tac does not properly count preprocessor tokens with embedded space or + comments as reserved words: + + echo '#/*comment*/include/*comment*/' | tac -i + echo '# include' | tac -i + echo '#include' | tac -i + + reports no reserved words on the first two inputs, and thus 17 as the IOCCC size, + although 10 is the correct answer (as in the final example). + + The original meaning of the -c option was "become compatible with iocccsize(1)". + Its meaning was flipped so the default behavior is now compatible. + +SEE ALSO + iocccsize(1), wc(1) + http://ioccc.org/2015/rules.txt diff --git a/2018/burton2/test01.c b/2018/burton2/test01.c new file mode 100644 index 000000000..09d75c14f --- /dev/null +++ b/2018/burton2/test01.c @@ -0,0 +1,11 @@ +main(int ac, char **av) { + if (av[0][0] == '"') { + switch (av[0][1]) { + case 'a': printf("a\n"); break; + case 'b': printf("b\n"); break; + } + } + while (--ac > 0) + printf("%d", ac); + return 0; +} diff --git a/2018/burton2/test02.c b/2018/burton2/test02.c new file mode 100644 index 000000000..8e0781d7e --- /dev/null +++ b/2018/burton2/test02.c @@ -0,0 +1,14 @@ +/* +main(int ac, char **av) { + if (av[0][0] == '"') { + switch (av[0][1]) { + case 'a': printf("a\n"); break; + case 'b': printf("b\n"); break; + } + } + while (--ac > 0) + printf("%d", ac); + return 0; +} +*/ +main() { printf("hello, world\n"); } diff --git a/2018/burton2/test03.c b/2018/burton2/test03.c new file mode 100644 index 000000000..96b7d7dc3 --- /dev/null +++ b/2018/burton2/test03.c @@ -0,0 +1,3 @@ +#include +char a[] = "main() { return printf(\" hello, world!\n\" \" } ; // this is not a comment"; +int main() { printf("%s\n", a); } diff --git a/2018/burton2/test04.c b/2018/burton2/test04.c new file mode 100644 index 000000000..38b4e6f80 --- /dev/null +++ b/2018/burton2/test04.c @@ -0,0 +1,6 @@ +#ifndef FOO +#include +int main() { + return printf("hello, world!\n"); +} +#endif diff --git a/2018/burton2/test05.c b/2018/burton2/test05.c new file mode 100644 index 000000000..91ac0331a --- /dev/null +++ b/2018/burton2/test05.c @@ -0,0 +1,4 @@ +#include + /* one */ int b; +char a[] = "main() { return printf(\" hello, world!\n\" \" } ; // this is not a comment"; +int main() { printf("%s\n", a); } diff --git a/2018/burton2/test06.c b/2018/burton2/test06.c new file mode 100644 index 000000000..bd7506872 --- /dev/null +++ b/2018/burton2/test06.c @@ -0,0 +1,7 @@ +#include + + int main() { + /* a comment */ printf( + "hello, world!\n" + ); + } diff --git a/2018/burton2/test07.c b/2018/burton2/test07.c new file mode 100644 index 000000000..12bc16c00 --- /dev/null +++ b/2018/burton2/test07.c @@ -0,0 +1,16 @@ + // leading whitespace comment +main(int ac, char **av) { + char foo[] = "line one\n\ + two\n\ + three\n"; + if (av[0][0] == '"') { + switch (av[0][1]) { + case 'a': printf("a\n"); break; + case 'b': printf("b\n"); break; + } + } + while (--ac > 0) + printf("%d", ac); + printf(foo); + return 0; +} diff --git a/2018/burton2/test08.c b/2018/burton2/test08.c new file mode 100644 index 000000000..42188ae86 --- /dev/null +++ b/2018/burton2/test08.c @@ -0,0 +1,12 @@ + /* one */ /* two */ +main(int ac, char **av) { + if (av[0][0] == '"') { + switch (av[0][1]) { + case 'a': printf("a\n"); break; + case 'b': printf("b\n"); break; + } + } + while (--ac > 0) + printf("%d", ac); + return 0; +} diff --git a/2018/burton2/test09.c b/2018/burton2/test09.c new file mode 100644 index 000000000..6d6d21850 --- /dev/null +++ b/2018/burton2/test09.c @@ -0,0 +1,13 @@ +main(int ac, char **av) { + if (av[0][0] == '"') { + switch (av[0][1]) { + case 'a': printf("a\n"); break; + case 'b': printf("b\n"); break; + } + } + // comment one + // comment two + while (--ac > 0) + printf("%d", ac); + return 0; +} diff --git a/2018/burton2/test10.c b/2018/burton2/test10.c new file mode 100644 index 000000000..cc5196c5e --- /dev/null +++ b/2018/burton2/test10.c @@ -0,0 +1,7 @@ +??=include +??/ +int main(int ac, char **av)??< +if (!(ac??'1))??else?? +??> diff --git a/2018/burton2/test11.c b/2018/burton2/test11.c new file mode 100644 index 000000000..858654b92 --- /dev/null +++ b/2018/burton2/test11.c @@ -0,0 +1,82 @@ +#i\ +nc\ +lu\ +de\ + + +ma\ +in( +in\ +t \ +ac\ +, \ +ch\ +ar\ +**\ +av) +{i\ +f(\ +av\ +[0\ +][\ +0]\ +==\ +'"\ +')\ +{s\ +wi\ +tc\ +h(\ +av\ +[0\ +][\ +1]\ +){\ +ca\ +se\ +'a\ +':\ +pr\ +in\ +tf\ +("\ +a\\ +n"\ +);\ +br\ +ea\ +k;\ +ca\ +se\ +'b\ +':\ +pr\ +in\ +tf( +"b\ +\n\ +"); +br\ +ea\ +k;\ +}}\ +wh\ +il\ +e(\ +--\ +ac> +0)\ +pr\ +in\ +tf( +"%\ +d", +ac) +;r\ +et\ +ur\ +n \ +0;} diff --git a/2018/burton2/test12.c b/2018/burton2/test12.c new file mode 100644 index 000000000..3742ad132 --- /dev/null +++ b/2018/burton2/test12.c @@ -0,0 +1,7 @@ +#include + + int main() { + /***/printf(/***/ + "hello, world!\n" + ); + } diff --git a/2018/burton2/test13.c b/2018/burton2/test13.c new file mode 100644 index 000000000..472ea4829 --- /dev/null +++ b/2018/burton2/test13.c @@ -0,0 +1 @@ +{int} \ No newline at end of file diff --git a/2018/burton2/test14.c b/2018/burton2/test14.c new file mode 100644 index 000000000..485bf83ec --- /dev/null +++ b/2018/burton2/test14.c @@ -0,0 +1,4 @@ +#include +int main() { + printf/*testing*/("hello, world!\n"); +} diff --git a/2018/burton2/tokenfix b/2018/burton2/tokenfix new file mode 100644 index 000000000..839e67628 --- /dev/null +++ b/2018/burton2/tokenfix @@ -0,0 +1,27 @@ +#!/bin/sh + +awk ' +r==1 { r=0; if (/>=/){print ">>>="; next} + if (/>/) {print ">>>"; next} + print ">>" } +r==3 { if (/\./){ r=4; next } r=0; print "." } +r==4 { if (/\./){ r=0; print "..."; next} print ".\n."} + +# digraphs +r==2 { r=0; if (/>/){print "]"; next} + if (/:/){print "::"; next} + print ":" } +r==5 { r=0; if (/:/){print "["; next} + if (/%/){print "{"; next} + print "<" } +r==6 { r=0; if (/>/){print "}"; next} + if (/:/){print "#"; next} + print "%" } + +/^>>$/ {r=1;next} # java +/^:$/ {r=2;next} # c++, java classes, digraph +/^\.$/ {r=3;next} # mea culpa - ellipsis +/^<$/ {r=5;next} # digraph +/^%$/ {r=6;next} # digraph + +{ print $0 }' $* diff --git a/2018/burton2/unob.sh b/2018/burton2/unob.sh new file mode 100644 index 000000000..7eeb59aba --- /dev/null +++ b/2018/burton2/unob.sh @@ -0,0 +1,111 @@ +#!/bin/sh + +# unob is a proof-of-concept script. +# Prior to tac, scripting the layout of C code was intractable. +# +# There are uncountably many possible refinements to this script. +# Enjoy the madness of getting a perfect layout of C code via +# an automated process. Or just enjoy a significant help in +# reading obfuscated C code! + +: ${PROG:=./prog} # PROG=tac ./unob.sh prog.c +: ${KW:=c11} # KW=ioccc.kw.freq ./unob.sh prog.c +: ${DEF:=} # DEF="-DW=\\\"kandr2\\\" -DU=\\\"usage\ string\\\"" ./unob.sh -p prog.c + +# optionally preprocess up to 3 times to handle #ifdef X #define Y +# unob prog.c # nonce +# unob -p prog.c # once +# unob -p -p prog.c # twice +# unob -p -p -p prog.c # thrice +# unob -p -p -p -p prog.c # yer out + +function pp { + cpp2=cat + cpp3=cat + if [ "x$1" == "x-p" ]; then + shift + if [ "x$1" == "x-p" ]; then + cpp2="cpp -E" + shift + fi + if [ "x$1" == "x-p" ]; then + cpp3="cpp -E" + shift + fi + cat $* | + sed 's/# *include/##include/' | + eval cpp -E "$DEF" | + eval $cpp2 | + eval $cpp3 | + sed 's/^#[^#].*$//' | + sed 's/##inc/#inc/' + else + cat $* + fi +} + +script=' +BEGIN { + last=nl="\n"; + f="'$KW'"; while(getline 0) ++kw[$0]; close(f); + if (length(kw) == 0) { + print "cannot find",f "; check KW environment variable" | "cat 1>&2" + exit + } +} + +function iskw(a) { return a in kw } +function indent() { return sprintf("%.*s", n*3, " ") } +function newline() { if (!infor && last != nl) printf last=nl } +function show(a) { + if (len>80 || (len>60 && (last ~ /^;/ || (last ~ /^,/ && paren==0)))) + printf "%c%s", last=nl, indent() # yes, double indent here + if (len>60 && last ~ /^\)/ && a !~ /^\)/ && paren == 0) + printf last=nl + if (last==nl) { len=0; printf "%s", indent() } + + if (length(a) > 80 && a ~ /\"/) { + newline() + len = 80 + max = length(a) + for (off=0; off <= max; off += len) + printf "%s%s%c%s", + substr(a, off, len), + (off+len > max) ? "" : "\\", + last=nl, indent() + len = 0 + return + } + + printf "%s%s", space(), a + len += length(a space()) + last=a +} +function space() { + return iskw(last) || + (last != "." && + last ~ /[A-Za-z0-9_+-\/%^|&\]\)=:<>;]$/ && $0 !~ /[\.:;()\[\],]/) ? " " : "" +} + +/^\(/ { ++paren } +/^\)/ { --paren } + +/^(if|while|for|return|switch|case|default|union|struct|typedef|#)/ { newline() } + +/^for$/ { newline(); infor=1 } +infor && /^;/ { ++infor; show($0 " "); next } +infor==1 && /^:/ { ++infor } +infor>1 && paren==0 { infor=0 } + +/^\?/ { ++tern; ++n; newline(); show($0 " "); next } +tern && /^:/ { newline(); show($0); --tern; --n; next } + +/^#/ { newline(); show($0); newline(); next } +/^;/ { show($0); newline(); next } +/^{/ { show($0); ++n; newline(); next } +/^}/ { --n; newline(); show($0); newline(); next } + +{ show($0) } +' + +pp $* | $PROG -t | ./tokenfix | awk "$script" # sed 's/""//g' diff --git a/2018/burton2/v7unix b/2018/burton2/v7unix new file mode 100644 index 000000000..0e96159bb --- /dev/null +++ b/2018/burton2/v7unix @@ -0,0 +1,38 @@ +$ 7th edition Unix source code, c00.c, 1979 cc, cpp.c +#define +#else +#endif +#if +#ifdef +#ifndef +#include +#line +#undef +auto +break +case +char +continue +default +do +double +else +enum +extern +float +for +goto +if +int +long +register +return +short +sizeof +static +struct +switch +typedef +union +unsigned +while diff --git a/2018/ciura/Makefile b/2018/ciura/Makefile new file mode 100644 index 000000000..7cd9f1b3d --- /dev/null +++ b/2018/ciura/Makefile @@ -0,0 +1,288 @@ +#!/usr/bin/env make +# +# 2018 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +GZIP_PROG= gzip +BZIP2= bzip2 +CURL= curl +DD= dd +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq +STRIP= strip + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +CSILENCE= -Wno-unused-value -Wno-shift-op-parentheses -Wno-sign-conversion \ + -Wno-comma -Wno-missing-prototypes -Wno-unused-result -Wno-parentheses +#CSILENCE= -Wno-implicit-int + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=25 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= +ALT_TARGET= prog.orig + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +prog.orig: prog.orig.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 3a3fabb90892eeb2f610ae0f74a35a970060665a063ab702bd686c17c4ae07f6 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2018/ciura/hint.html b/2018/ciura/hint.html new file mode 100644 index 000000000..b4066aed9 --- /dev/null +++ b/2018/ciura/hint.html @@ -0,0 +1,316 @@ + + + + + + + Most likely to be awarded + + +

    Most likely to be awarded

    + +

    Marcin Ciura mciura@gmail.com
    +Twitter: @mciura

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./prog < text
    +
    + +

    Try:

    + +
    ./prog < Makefile
    +./prog < hint.text
    +
    + +

    Selected Judges Remarks:

    + +

    This text was processed by prog. You may get confused. +We’re not really sure: prog.c wasn’t commented. +Who has been thoroughly puzzled by prog? Also how obfuscated is prog? +Having been written in C, how large of a vocabulary has it?

    + +

    Author’s comments:

    + +

    The Program

    + +

    “The Elements of Style” by prof. William Strunk, Jr. and E. B. White +is well known for its dislike of the passive voice. Direct, vigorous, +active constructions were instead recommended by the authors. +The development of this program has been driven by this tenet.

    + +

    Only passive sentences from the standard input are output. The offending +part(s) of each sentence will be highlighted. Several kinds of passive +constructions are recognized:

    + +
      +
    • Plain passive voice. +Foo was bazzed by bar.
    • +
    • Passive voice with “get”. +I got almost quuxed.
    • +
    • Contractions. +I’m not really quuxed: foo wasn’t bazzed.
    • +
    • Questions. +Who has been quuxed? Was foo indeed bazzed? How was it bazzed?
    • +
    • Clause-initial inversion. +Also bazzed is bar.
    • +
    + + +

    Sentences are never broken by periods that follow abbreviations and +initials. Both regular and irregular past participles are properly +dealt with. Note that some words are red herrings: even though their +ending is -ed, they are not past participles.

    + +

    The Big String

    + +

    Here is the purpose of every byte inside the c[] string:

    + +
      +
    • 0-9: highlighting passive constructions in the output;
    • +
    • 10-50: classifying characters - called by V(4);
    • +
    • 52: outputting the newline character;
    • +
    • 51-187: tokenizing text and detecting passive constructions - two +type A state machines, called by V(2) and V(3);
    • +
    • 186-2786: determining word categories (past participles, present +simple and past simple forms of “to be”, other forms of “to be”, +adverbs, wh-words, and other words) and recognizing abbreviations - +two type B state machines, called by V(808) and V(205).
    • +
    + + +

    The State Machines

    + +

    I heard you don’t like state machines so I put a state machine in your +state machine so you can reject this entry while you reject this entry.

    + +

    Both types of state machines in the program are Mealy machines: we can +think of their transitions as triples (transition_label, +next_state, output).

    + +

    Type A

    + +

    A state of type A state machine consists of eight transitions whose +representations occupy consecutive bytes. The byte +c[3 + 8*state + transition_label] contains +(unsigned char)(30 + 5*next_state + output).

    + +

    The transition_label is either one of character classes:

    + +
      +
    • nil = 0,
    • +
    • space = 1,
    • +
    • new_line = 2,
    • +
    • uppercase = 3,
    • +
    • lowercase = 4,
    • +
    • period = 5,
    • +
    • bang_question = 6,
    • +
    • punctuation = 7,
    • +
    + + +

    or one of word classes:

    + +
      +
    • adverb = 0,
    • +
    • other = 2,
    • +
    • past_participle = 3,
    • +
    • to_be = 4,
    • +
    • are_were = 5,
    • +
    • wh_word = 6 (cf. the output of type B state machines).
    • +
    + + +

    The output is either one of:

    + +
      +
    • end_of_text = 0,
    • +
    • sentence_start = 1,
    • +
    • sentence_end = 2,
    • +
    • token_end = 3,
    • +
    • ignore = 4,
    • +
    + + +

    or one of

    + +
      +
    • passive_construction_start = 1,
    • +
    • ignore = 2,
    • +
    • passive_construction_end = 3.
    • +
    + + +

    Type A state machines run continuously. Their state is kept in +k[2] and k[3].

    + +

    Below are sample steps of scanning a sequence of characters with +classes uppercase, lowercase, period, space, +and uppercase.

    + +
      +
    • state = 7, transition_label = 3 (uppercase), output = sentence_start
    • +
    • state = 14, transition_label = 4 (lowercase), output = ignore
    • +
    • state = 15, transition_label = 5 (period), output = token_end
    • +
    • state = 13, transition_label = 1 (space), output = token_end
    • +
    • state = 18, transition_label = 3 (uppercase), output = sentence_end
    • +
    + + +

    And here are sample steps of scanning tokens with classes to_be, +adverb, past_participle.

    + +
      +
    • state = 8, transition_label = 4 (to_be), output = passive_construction_start
    • +
    • state = 22, transition_label = 0 (adverb), output = ignore
    • +
    • state = 22, transition_label = 3 (past_participle), output = passive_construction_end
    • +
    + + +

    Type B

    + +

    Type B state machines are built by a variant of the algorithm described +in the paper +How to squeeze a lexicon. +Their states are represented as interlaced sparse arrays of transitions.

    + +

    The transition_label is one of:

    + +
      +
    • word_start = 0,
    • +
    • period_or_apostrophe = 1,
    • +
    • a_z_letter = 2..27.
    • +
    + + +

    The output is either one of word classes:

    + +
      +
    • adverb = 0,
    • +
    • ignore = 1,
    • +
    • other = 2,
    • +
    • past_participle = 3,
    • +
    • to_be = 4,
    • +
    • are_were = 5,
    • +
    • wh_word = 6,
    • +
    + + +

    or

    + +
      +
    • ignore = 1,
    • +
    • abbreviation = 2.
    • +
    + + +

    The byte c[186 + (state + transition_label)] = (unsigned char)(2 + transition_label + 28 * output).

    + +

    The byte c[836 + 2*(state + transition_label)] =

    + +
      +
    • ' ' when next_state / 376 == 0,
    • +
    • ';' when next_state / 376 == 1.
    • +
    + + +

    The byte c[837 + 2*(state + transition_label)] =

    + +
      +
    • ' ' when next_state / 94 % 4 == 0,
    • +
    • ';' when next_state / 94 % 4 == 1,
    • +
    • '{' when next_state / 94 % 4 == 2,
    • +
    • '}' when next_state / 94 % 4 == 3.
    • +
    + + +

    The byte c[2136 + (state + transition_label)] = (unsigned char)(32 + next_state % 94).

    + +

    A type B state machine starts in a given state with output +set to ignore. It scans a word backwards, converting character by +character to transition_label. When it meets word_start, it +returns, leaving the most recently stored output in v. +It also returns when +c[186 + (state + transition_label)] != (unsigned char)(2 + transition_label + 28 * output), +i.e. when the transition_label in the byte mismatches the +transition_label used to compute the index. Otherwise, if the +output in this byte differs from ignore, the state machine +stores it in v. Regardless of the value of the output, +it also assigns next_state to state and proceeds to scan +the previous character. The state machine that determines the word +class is set up so that it never returns ignore.

    + +

    Below are sample steps of scanning the word “chiefly”.

    + +
      +
    • state = 623, transition_label = 26 (‘y’), output = other
    • +
    • state = 602, transition_label = 13 (‘l’), output = adverb
    • +
    • state = 594, transition_label = 7 (‘f’), output = other
    • +
    • state = 549, transition_label = 6 (‘e’), output = ignore
    • +
    • state = 543, transition_label = 10 (‘i’), output = adverb
    • +
    • state = 0, transition_label = 9 (‘h’) mismatches the value stored +in the byte. Return adverb.
    • +
    + + +

    And here are sample steps of scanning the string “i.e.”:

    + +
      +
    • state = 19, transition_label = 1 (‘.’), output = ignore
    • +
    • state = 24, transition_label = 6 (‘e’), output = ignore
    • +
    • state = 3, transition_label = 1 (‘.’), output = ignore
    • +
    • state = 2, transition_label = 10 (‘i’), output = ignore
    • +
    • state = 1, transition_label = 0 (‘\0’), output = abbreviation. +Return abbreviation.
    • +
    + + +

    Remarks

    + +

    The judges found a bug in the handling of contractions: prog.orig.c +outputs “foo wasn'[t bazzed]”. I fixed the bug in prog.c, making +it output “foo [wasn’t bazzed]” instead, and took the liberty to merge +one statement into a for loop inside its main() function.

    + +

    The program uses a 9,437,187-byte buffer so it probably will not run +on 16-bit and smaller machines without changing the size of array C[] +and the expression 9<<20 inside the call to read().

    + +

    I have tested it on:

    + +
      +
    • Linux with gcc version 5.4.0 20160609,
    • +
    • Linux with clang version 3.4-1ubuntu3,
    • +
    • OS/X with Apple LLVM version 6.0 (clang-600.0.57).
    • +
    + + +

    For a clean compile under c89 and c90, add -Woverlength-strings +to CSILENCE.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2018, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2018/ciura/hint.text b/2018/ciura/hint.text new file mode 100644 index 000000000..f4f8d8f18 --- /dev/null +++ b/2018/ciura/hint.text @@ -0,0 +1,249 @@ +# Most likely to be awarded + +Marcin Ciura +Twitter: @mciura + + +## Judges' comments: +### To use: + + make + + ./prog < text + +### Try: + + ./prog < Makefile + ./prog < hint.text + +### Selected Judges Remarks: + +This text was processed by prog. You may get confused. +We're not really sure: prog.c wasn't commented. +Who has been thoroughly puzzled by prog? Also how obfuscated is prog? +Having been written in C, how large of a vocabulary has it? + + +## Author's comments: +The Program +=========== + +"The Elements of Style" by prof. William Strunk, Jr. and E. B. White +is well known for its dislike of the passive voice. Direct, vigorous, +active constructions were instead recommended by the authors. +The development of this program has been driven by this tenet. + +Only passive sentences from the standard input are output. The offending +part(s) of each sentence will be highlighted. Several kinds of passive +constructions are recognized: + +* Plain passive voice. + Foo was bazzed by bar. +* Passive voice with "get". + I got almost quuxed. +* Contractions. + I'm not really quuxed: foo wasn't bazzed. +* Questions. + Who has been quuxed? Was foo indeed bazzed? How was it bazzed? +* Clause-initial inversion. + Also bazzed is bar. + +Sentences are never broken by periods that follow abbreviations and +initials. Both regular and irregular past participles are properly +dealt with. Note that some words are red herrings: even though their +ending is -ed, they are not past participles. + +The Big String +============== + +Here is the purpose of every byte inside the **`c[]`** string: + +* 0-9: highlighting passive constructions in the output; +* 10-50: classifying characters - called by **`V(4)`**; +* 52: outputting the newline character; +* 51-187: tokenizing text and detecting passive constructions - two + type A state machines, called by **`V(2)`** and **`V(3)`**; +* 186-2786: determining word categories (past participles, present + simple and past simple forms of "to be", other forms of "to be", + adverbs, wh-words, and other words) and recognizing abbreviations - + two type B state machines, called by **`V(808)`** and **`V(205)`**. + +The State Machines +================== + +I heard you don't like state machines so I put a state machine in your +state machine so you can reject this entry while you reject this entry. + +Both types of state machines in the program are Mealy machines: we can +think of their transitions as triples (**`transition_label`**, +**`next_state`**, **`output`**). + +Type A +------ + +A state of type A state machine consists of eight transitions whose +representations occupy consecutive bytes. The byte +**`c[3 + 8*state + transition_label]`** contains +**`(unsigned char)(30 + 5*next_state + output)`**. + +The `transition_label` is either one of character classes: + +* **`nil`** = 0, +* **`space`** = 1, +* **`new_line`** = 2, +* **`uppercase`** = 3, +* **`lowercase`** = 4, +* **`period`** = 5, +* **`bang_question`** = 6, +* **`punctuation`** = 7, + +or one of word classes: + +* **`adverb`** = 0, +* **`other`** = 2, +* **`past_participle`** = 3, +* **`to_be`** = 4, +* **`are_were`** = 5, +* **`wh_word`** = 6 (cf. the **`output`** of type B state machines). + +The **`output`** is either one of: + +* **`end_of_text`** = 0, +* **`sentence_start`** = 1, +* **`sentence_end`** = 2, +* **`token_end`** = 3, +* **`ignore`** = 4, + +or one of + +* **`passive_construction_start`** = 1, +* **`ignore`** = 2, +* **`passive_construction_end`** = 3. + +Type A state machines run continuously. Their state is kept in +**`k[2]`** and **`k[3]`**. + +Below are sample steps of scanning a sequence of characters with +classes **`uppercase`**, **`lowercase`**, **`period`**, **`space`**, +and **`uppercase`**. + +* **`state`** = 7, **`transition_label`** = 3 (**`uppercase`**), **`output`** = **`sentence_start`** +* **`state`** = 14, **`transition_label`** = 4 (**`lowercase`**), **`output`** = **`ignore`** +* **`state`** = 15, **`transition_label`** = 5 (**`period`**), **`output`** = **`token_end`** +* **`state`** = 13, **`transition_label`** = 1 (**`space`**), **`output`** = **`token_end`** +* **`state`** = 18, **`transition_label`** = 3 (**`uppercase`**), **`output`** = **`sentence_end`** + +And here are sample steps of scanning tokens with classes **`to_be`**, +**`adverb`**, **`past_participle`**. + +* **`state`** = 8, **`transition_label`** = 4 (**`to_be`**), **`output`** = **`passive_construction_start`** +* **`state`** = 22, **`transition_label`** = 0 (**`adverb`**), **`output`** = **`ignore`** +* **`state`** = 22, **`transition_label`** = 3 (**`past_participle`**), **`output`** = **`passive_construction_end`** + +Type B +------ + +Type B state machines are built by a variant of the algorithm described +in the paper +*[How to squeeze a lexicon](http://sun.aei.polsl.pl/~mciura/publikacje/lexicon.pdf)*. +Their states are represented as interlaced sparse arrays of transitions. + +The **`transition_label`** is one of: + +* **`word_start`** = 0, +* **`period_or_apostrophe`** = 1, +* **`a_z_letter`** = 2..27. + +The `output` is either one of word classes: + +* **`adverb`** = 0, +* **`ignore`** = 1, +* **`other`** = 2, +* **`past_participle`** = 3, +* **`to_be`** = 4, +* **`are_were`** = 5, +* **`wh_word`** = 6, + +or + +* **`ignore`** = 1, +* **`abbreviation`** = 2. + +The byte **`c[186 + (state + transition_label)] = (unsigned char)(2 + transition_label + 28 * output)`**. + +The byte **`c[836 + 2*(state + transition_label)] =`** + +* **`' '`** when **`next_state / 376 == 0`**, +* **`';'`** when **`next_state / 376 == 1`**. + +The byte **`c[837 + 2*(state + transition_label)] =`** + +* **`' '`** when **`next_state / 94 % 4 == 0`**, +* **`';'`** when **`next_state / 94 % 4 == 1`**, +* **`'{'`** when **`next_state / 94 % 4 == 2`**, +* **`'}'`** when **`next_state / 94 % 4 == 3`**. + +The byte **`c[2136 + (state + transition_label)] = (unsigned char)(32 + next_state % 94)`**. + +A type B state machine starts in a given **`state`** with **`output`** +set to **`ignore`**. It scans a word backwards, converting character by +character to **`transition_label`**. When it meets **`word_start`**, it +returns, leaving the most recently stored **`output`** in **`v`**. +It also returns when +**`c[186 + (state + transition_label)] != (unsigned char)(2 + transition_label + 28 * output)`**, +i.e. when the **`transition_label`** in the byte mismatches the +**`transition_label`** used to compute the index. Otherwise, if the +**`output`** in this byte differs from **`ignore`**, the state machine +stores it in **`v`**. Regardless of the value of the **`output`**, +it also assigns **`next_state`** to **`state`** and proceeds to scan +the previous character. The state machine that determines the word +class is set up so that it never returns **`ignore`**. + +Below are sample steps of scanning the word "chiefly". + +* **`state`** = 623, **`transition_label`** = 26 ('y'), **`output`** = **`other`** +* **`state`** = 602, **`transition_label`** = 13 ('l'), **`output`** = **`adverb`** +* **`state`** = 594, **`transition_label`** = 7 ('f'), **`output`** = **`other`** +* **`state`** = 549, **`transition_label`** = 6 ('e'), **`output`** = **`ignore`** +* **`state`** = 543, **`transition_label`** = 10 ('i'), **`output`** = **`adverb`** +* **`state`** = 0, **`transition_label`** = 9 ('h') mismatches the value stored +in the byte. Return **`adverb`**. + +And here are sample steps of scanning the string "i.e.": + +* **`state`** = 19, **`transition_label`** = 1 ('.'), **`output`** = **`ignore`** +* **`state`** = 24, **`transition_label`** = 6 ('e'), **`output`** = **`ignore`** +* **`state`** = 3, **`transition_label`** = 1 ('.'), **`output`** = **`ignore`** +* **`state`** = 2, **`transition_label`** = 10 ('i'), **`output`** = **`ignore`** +* **`state`** = 1, **`transition_label`** = 0 ('\0'), **`output`** = **`abbreviation`**. +Return **`abbreviation`**. + +Remarks +======= + +The judges found a bug in the handling of contractions: **`prog.orig.c`** +outputs "foo wasn'**[t bazzed]**". I fixed the bug in **`prog.c`**, making +it output "foo **[wasn't bazzed]**" instead, and took the liberty to merge +one statement into a **`for`** loop inside its **`main()`** function. + +The program uses a 9,437,187-byte buffer so it probably will not run +on 16-bit and smaller machines without changing the size of array **`C[]`** +and the expression **`9<<20`** inside the call to **`read()`**. + +I have tested it on: + +* Linux with gcc version 5.4.0 20160609, +* Linux with clang version 3.4-1ubuntu3, +* OS/X with Apple LLVM version 6.0 (clang-600.0.57). + +For a clean compile under c89 and c90, add **`-Woverlength-strings`** +to **`CSILENCE`**. + +-------------------------------------------------------------------------------- + diff --git a/2018/ciura/prog.c b/2018/ciura/prog.c new file mode 100644 index 000000000..2ba8d5e96 --- /dev/null +++ b/2018/ciura/prog.c @@ -0,0 +1,126 @@ +#include +#define W ),write(1, +static unsigned char c[]= +"]\33[0m\33[7m[&&'% $ # ! ########## \" # !& \n oo 6''GLB=.* eoj* 5SXINE@199999999777777775]bNNE@@5]bNNE@E5SXOO0?05SXOOD?06TYJOE@16Y%JOE@16^c%O%%%6c%%O%%%f !! k k! p !oo :;;\37;;;;;\37;($\"%$##(\37(/1$1.,,,$%&/1rs!58&30123$$-O@2=\2?(2-'VZ$3:'i/3+ O#&B2%1,: 2=' (1J!1AC) @:,+_M1H/:J I\"?.Ak'.c2G$gj!j.@O&'(P +,jk/Y1$3%56.8 Y1. .4, W +nd\\rs1( ++(-.331i\".>.-[!.^'.\00281\216\217\252\253's 6\b.$\252\2534''0(\0226 6!'# +[\34.-\"+,-\"(4123Z5_]3-+46(44ij3.jneij41$3+%16s c` 3!#6.(n _\".] R+'4.jjkf`'\\..Y.(' i1 f%nG. $=i$#$ `'3V*+.b2&.!23+5.'n9\\\2ij&1j_3k^_n/+i_ij cd-$$11j(%3&'..\n!1$.4 623$ \2$' rs6${$\"\25($3-5.3''' $2.'\b(1( -.\0253,63''6 8\241+ 6\37 $-$I(P(($\252\253cZ/2\b'i4j3$86&4 j!k-J &1N]'+,fcY-ej/$fgl8 n4!$cd (^'$4+bc-g -2($.iZn$%Yc\20 4+Z,)$.'.\0071 1.'g1\37 4-$$%1'(D=+,-./+12 4,,7\f$ 1:3'+,?.='= #.%$)K!(123&(J3:4$J4 $52#(?@ABCDEFGHIJKLMNOPQRSTU ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; { { ; ; ; { ; ; { { ; ; { { { { { ; ; ; { { { { ; { { ; { { ; { { ; ; { { { ; { { { ; ; { { { ; ; { { { { { { { { { } ; { { { ; } } { { } } { { { { { } } { } } } } ; } } } { ; } } ; } } } } } } } ; } } } } } } } } } { } ; ; } } } }; ; ; } } { }; } }; ; ; ; ; ; ; ; ; ; ;; ; }; ; ; } ;; ; ; ; ; ; ; ; ; ;; ; ; ; ; {; ; ; ; ; ; } ; } ; ;;; } ; ; ; ; ;;; ; } };; } ; ;;; ;; ;;;; ;;; ;;;; ;; { ;;; ; ;; ; ; ; ;;; ; ;;; ;;;;;;;;; ;;;;;; ; ;; ;; ;; ;; ; ;; ;; ;; ;{ ;;;{ ;{ ;; ;{;;;; ;;;; {;{;; ;;;{ ;;; ;{ ;{ ; { { { { { { { } } ; ; ;; ;; ;{ \" ' !!!!$!!(8I!!,%&!!!#*)2. C!!CH'-/0@B+ L UJM< N4 [Q?DX[ Jc !ad' in fit` !w !V mL r L p z s Vv e x _ vb !VY o\\q j (x [|!E\"&@+10y?UJ W$ 6 [OPUDXAF]US Zj lac[q $n We y |) #w zk)Us |$ `Ub,5 )F8V_h;#4\"u% 0 $1C$ \" . I4 U $+ Al 6M3UQ 8Uv+kV5 U;pBKU`P)jX Xe Cw }\" ++{UyZo$lC}*C,& .#C>'+ 52|4/B)7+ +|@1--9M6 L ||Q =P R ? )GH\\Vk[ [ f ICfB [[[!r 6 b$! UI!z[p |sC$)x[ U$IU[e+B XU >zU 0U-?$O @Yx:) 4EZCU/lUAco 'q.*9[}G_HLBI j(! m!!t , l x!q!|! ! !!!!! ! q$ ( $U! < c 'do nN)\"S w4k} = 0 A Y1+-9 =Scaf !OZ B F " + + ,C[3^9 +<<20],*k[ +4]={ + 1+C, + 0,59 + +c} + ,**K +,*l,*L,* + o,O,p, + +P,s,S=1,v=4 ; +int V(int w){ + return + 1>O -39 +:27>(O%= +32)&&0v? L=1[k +]=* k,3[ +k]= 67+ +c:3 >v? + +V(0 ),p +?(0 W L, +*k- L W +52+ c, +1),p= +0:0 ,L +:L: (v= +1,l =*k +,V( 205 + + + ),1-v + ?2 [k] + =75 +c: + o,V( + 3), v%3 ?2> +v?V (1), o= +1[k ]:L:( + p=(P=1 W L,o + -L W c +s,S + +W o ,*k +- o W c +,S) ,L= +*k) , 1[k +]=* k )): +(l= *k, V ( + 808 ),v ):( + v=* ++*k + ,39 -c[ + +v>> 7 ? +15: 1-v +/32 ?10 +-v?(312-v % +32)/26+v/32 +*2: 13: +82- v]) +:!( w[k +]+= V(2 + + +w) + ,v= + *w[ + k]% + 5,w + [k] + =*w + [k] + /5* + +8+3+c):(K=k+w +,33>*(*K-=!w) + ?*K + +=w + ,V( + w): + !(* + K+= + !w) + +);}int main() +{ read(s,2+C, +9<< +20);for(s +=isatty(S +)?S +=5: +9;v; V(2))V(6 +); return P;} diff --git a/2018/ciura/prog.orig.c b/2018/ciura/prog.orig.c new file mode 100644 index 000000000..6688f4f63 --- /dev/null +++ b/2018/ciura/prog.orig.c @@ -0,0 +1,126 @@ +#include +#define W ),write(1, +static unsigned char c[]= +"]\33[0m\33[7m[&&'% $ # ! ########## \" !& \n oo 6''GLB=.* eoj* 5SXINE@199999999777777775]bNNE@@5]bNNE@E5SXOO0?05SXOOD?06TYJOE@16Y%JOE@16^c%O%%%6c%%O%%%f !! k k! p !oo :;;\37;;;;;\37;($\"%$##(\37(/1$1.,,,$%&/1rs!58&30123$$-O@2=\2?(2-'VZ$3:'i/3+ O#&B2%1,: 2=' (1J!1AC) @:,+_M1H/:J I\"?.Ak'.c2G$gj!j.@O&'(P +,jk/Y1$3%56.8 Y1. .4, W +nd\\rs1( ++(-.331i\".>.-[!.^'.\00281\216\217\252\253's 6\b.$\252\2534''0(\0226 6!'# +[\34.-\"+,-\"(4123Z5_]3-+46(44ij3.jneij41$3+%16s c` 3!#6.(n _\".] R+'4.jjkf`'\\..Y.(' i1 f%nG. $=i$#$ `'3V*+.b2&.!23+5.'n9\\\2ij&1j_3k^_n/+i_ij cd-$$11j(%3&'..\n!1$.4 623$ \2$' rs6${$\"\25($3-5.3''' $2.'\b(1( -.\0253,63''6 8\241+ 6\37 $-$I(P(($\252\253cZ/2\b'i4j3$86&4 j!k-J &1N]'+,fcY-ej/$fgl8 n4!$cd (^'$4+bc-g -2($.iZn$%Yc\20 4+Z,)$.'.\0071 1.'g1\37 4-$$%1'(D=+,-./+12 4,,7\f$ 1:3'+,?.='= #.%$)K!(123&(J3:4$J4 $52#(?@ABCDEFGHIJKLMNOPQRSTU ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; { { ; ; ; { ; ; { { ; ; { { { { { ; ; ; { { { { ; { { ; { { ; { { ; ; { { { ; { { { ; ; { { { ; ; { { { { { { { { { } ; { { { ; } } { { } } { { { { { } } { } } } } ; } } } { ; } } ; } } } } } } } ; } } } } } } } } } { } ; ; } } } }; ; ; } } { }; } }; ; ; ; ; ; ; ; ; ; ;; ; }; ; ; } ;; ; ; ; ; ; ; ; ; ;; ; ; ; ; {; ; ; ; ; ; } ; } ; ;;; } ; ; ; ; ;;; ; } };; } ; ;;; ;; ;;;; ;;; ;;;; ;; { ;;; ; ;; ; ; ; ;;; ; ;;; ;;;;;;;;; ;;;;;; ; ;; ;; ;; ;; ; ;; ;; ;; ;{ ;;;{ ;{ ;; ;{;;;; ;;;; {;{;; ;;;{ ;;; ;{ ;{ ; { { { { { { { } } ; ; ;; ;; ;{ \" ' !!!!$!!(8I!!,%&!!!#*)2. C!!CH'-/0@B+ L UJM< N4 [Q?DX[ Jc !ad' in fit` !w !V mL r L p z s Vv e x _ vb !VY o\\q j (x [|!E\"&@+10y?UJ W$ 6 [OPUDXAF]US Zj lac[q $n We y |) #w zk)Us |$ `Ub,5 )F8V_h;#4\"u% 0 $1C$ \" . I4 U $+ Al 6M3UQ 8Uv+kV5 U;pBKU`P)jX Xe Cw }\" ++{UyZo$lC}*C,& .#C>'+ 52|4/B)7+ +|@1--9M6 L ||Q =P R ? )GH\\Vk[ [ f ICfB [[[!r 6 b$! UI!z[p |sC$)x[ U$IU[e+B XU >zU 0U-?$O @Yx:) 4EZCU/lUAco 'q.*9[}G_HLBI j(! m!!t , l x!q!|! ! !!!!! ! q$ ( $U! < c 'do nN)\"S w4k} = 0 A Y1+-9 =Scaf !OZ B F " + + ,C[3^9 +<<20],*k[ +4]={ + 1+C, + 0,59 + +c} + ,**K +,*l,*L,* + o,O,p, + +P,s,S=1,v=4 ; +int V(int w){ + return + 1>O -39 +:27>(O%= +32)&&0v? L=1[k +]=* k,3[ +k]= 67+ +c:3 >v? + +V(0 ),p +?(0 W L, +*k- L W +52+ c, +1),p= +0:0 ,L +:L: (v= +1,l =*k +,V( 205 + + + ),1-v + ?2 [k] + =75 +c: + o,V( + 3), v%3 ?2> +v?V (1), o= +1[k ]:L:( + p=(P=1 W L,o + -L W c +s,S + +W o ,*k +- o W c +,S) ,L= +*k) , 1[k +]=* k )): +(l= *k, V ( + 808 ),v ):( + v=* ++*k + ,39 -c[ + +v>> 7 ? +15: 1-v +/32 ?10 +-v?(312-v % +32)/26+v/32 +*2: 13: +82- v]) +:!( w[k +]+= V(2 + + +w) + ,v= + *w[ + k]% + 5,w + [k] + =*w + [k] + /5* + +8+3+c):(K=k+w +,33>*(*K-=!w) + ?*K + +=w + ,V( + w): + !(* + K+= + !w) + +);}int main() +{ read(s,2+C, +9<< +20) +;s=isatty(S) +?S= +5:9; +for(;v;V(2))V +(6);return P;} diff --git a/2018/endoh1/Makefile b/2018/endoh1/Makefile new file mode 100644 index 000000000..57f5f6070 --- /dev/null +++ b/2018/endoh1/Makefile @@ -0,0 +1,286 @@ +#!/usr/bin/env make +# +# 2018 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +GZIP_PROG= gzip +BZIP2= bzip2 +CURL= curl +DD= dd +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +CSILENCE= +#CSILENCE= -Wno-implicit-int + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=25 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= +ALT_TARGET= prog.orig + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +prog.orig: prog.orig.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 3a3fabb90892eeb2f610ae0f74a35a970060665a063ab702bd686c17c4ae07f6 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2018/endoh1/golem.txt b/2018/endoh1/golem.txt new file mode 100644 index 000000000..d80e92724 --- /dev/null +++ b/2018/endoh1/golem.txt @@ -0,0 +1,29 @@ + o o n n + ROBBB0BDROORD0O06 &pqQ6 &Q8oo SEF H3yNK + 0O0RBOBODBO0BBBO0e o88oQp po&&pqP m5NF3UK M2EUGZZZ + 00ODRBBDRDOOROR0R0 QQQP&o&Qqo&Qpp& KZUUWySW2 WmWUNEUF + DDO0000BBDBOBR0DR oP q&o UZH5EmhWUM5 252EU + B RRR 8q Q SU2UmSFFEhG E + &BR RRO 8&p Q NF HE3KEGyE3HyS + dRB DO0 &P& P h2NHU WNWhE255FN5N + 6ap0BOO 0DR oPq q8o888q8P8Q KZyKHyS Sy5HmFUh3F + DOBDDO0O DDB qPp P&p88&o8ppp 2mh52HW3 52Z2ZKZG + DBD0DBBB DBR Pq qPpPoPQoPQo 3SWyKFH MFHU + 0DB0D0R DB Q qqPPPq8Q8p ZF5ZZZZ G + + o + P oOBD + po8 BOOOBD + Qq&P BOROO + KHy pp p8 8& DBD o8qQQpqPp BOOOB oO + mUGFGMHMH QQQp&P&&PQQ pp&PP8 DDORBRORB 8&pQoqQ&P8 BR0BOOO0OR0 +WHyZSNmUMUU3N pPpp& 88oQP ooPoq8 B0OORBB0OO0DO qpQo B00ROOBDBDRB + N35H 3hUS QpQq pQ8o QQqP BOBO RDBR Qoop ODBB0 BRBB0 + SUHH ZhN 8Qq8 8QqP &Q&Q 00BD DRB 8Q&q 0DB0R DDO0O + 3M522N 8QqP pQP& oPpP ROBDOO oQPQ 00OBO BORRO +NyUNyHMZEFSNS &poPp PqpP& oqo&Q 0BRBD00D0RDRR P&&qqp&&Q DBB0DRBB 0000 + hEhKNMMGE qq8op &88&Q oqqoo DOB0RB00D qPqoQ&p OODRORBB OOB + hK PP && pq BO oQ BO D0O + ROB + RR0O + DRR diff --git a/2018/endoh1/hint.html b/2018/endoh1/hint.html new file mode 100644 index 000000000..bdd71af86 --- /dev/null +++ b/2018/endoh1/hint.html @@ -0,0 +1,86 @@ + + + + + + + Best tool to reveal holes + + +

    Best tool to reveal holes

    + +

    Yusuke Endoh
    +Twitter: @mametter

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +./prog < textfile > output.gif
    +
    + +

    Try:

    + +
    ./prog < golem.txt > golem.gif
    +./prog < smily.txt > smily.gif
    +
    + +

    Selected Judges Remarks:

    + +

    To get the best experience, use a GIF viewer that can handle animated gifs. +On OS X you can use Safari using “open -a Safari smily.gif”

    + +

    Some things to consider are that this 2.5KiB gem encodes a 96 character 8x8 +font (naively this could already take 6144 bytes) and a GIF encoder. But +how does it know which characters are closed?

    + +

    You should only give this program printable ASCII characters.

    + +

    Unfortunately this won’t run on your PDP8, if you had one, as it needs at +least 2MiB of memory to run in.

    + +

    Author’s comments:

    + +

    This program generates an animated GIF from a plain text. Run:

    + +
    gcc -o prog prog.c
    +./prog < invisible.txt > invisible.gif
    +
    + +

    Open invisible.gif and then wait a minute. You will see a hidden message. +Can you tell the difference between letters that leaves the mark and ones that does not?

    + +

    Other examples:

    + +
    ./prog < golem.txt > golem.gif
    +./prog < smily.txt > smily.gif
    +
    + +

    The program itself has a hidden message.

    + +
    ./prog < prog.c > prog.gif
    +
    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2018, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2018/endoh1/hint.text b/2018/endoh1/hint.text new file mode 100644 index 000000000..12114c2f6 --- /dev/null +++ b/2018/endoh1/hint.text @@ -0,0 +1,57 @@ +# Best tool to reveal holes + +Yusuke Endoh +Twitter: @mametter + + +## Judges' comments: +### To use: + + make + ./prog < textfile > output.gif + +### Try: + + ./prog < golem.txt > golem.gif + ./prog < smily.txt > smily.gif + +### Selected Judges Remarks: + +To get the best experience, use a GIF viewer that can handle animated gifs. +On OS X you can use Safari using "open -a Safari smily.gif" + +Some things to consider are that this 2.5KiB gem encodes a 96 character 8x8 +font (naively this could already take 6144 bytes) and a GIF encoder. But +how does it know which characters are closed? + +You should only give this program printable ASCII characters. + +Unfortunately this won't run on your PDP8, if you had one, as it needs at +least 2MiB of memory to run in. + +## Author's comments: +This program generates an animated GIF from a plain text. Run: + + gcc -o prog prog.c + ./prog < invisible.txt > invisible.gif + +Open invisible.gif and then wait a minute. You will see a hidden message. +Can you tell the difference between letters that leaves the mark and ones that does not? + +Other examples: + + ./prog < golem.txt > golem.gif + ./prog < smily.txt > smily.gif + +The program itself has a hidden message. + + ./prog < prog.c > prog.gif + +-------------------------------------------------------------------------------- + diff --git a/2018/endoh1/invisible.txt b/2018/endoh1/invisible.txt new file mode 100644 index 000000000..2b906cac4 --- /dev/null +++ b/2018/endoh1/invisible.txt @@ -0,0 +1,12 @@ +TELUGU INEFFECTIVENESS SHEETS CYSTIC SHIFTINESS FLESHIEST UNSUCCESSFULLY WEIGHTLESSNESS FLESH HUFFIEST +LIFE FLOORBOARD CHESSBOARD APPROACHES CARDBOARD TINY POPPA PAROXYSMS ARBOR BARBARIC JARROD DOODAD SLIT +WUSS BARODA PROBATE CORPORA PAPOOSE WOODARD PARADE SEABOARD BROAD SHIPBOARD PARADIGM ABOARD BOARD NIGH +LIMY ORDAIN MBABANE UPDRAFTS SLUTS FERRARI TERRORS INROAD ENTRAPPING PROPHETESSES LIKEN CAPRA NEGLECTS +INESCAPABLY HINES SKEDADDLES FUNNY GEARBOX JELLYFISH PROPS STARDOM TEAROOM ENTHUSING KICKAPOO JUSTNESS +GUNS PRADO BRAD MICK DROOP ADORABLE CARBOYS MCKINNEY PRADA ARDOR SIGNBOARD BARBRA LEVITT BORON WISTFUL +NIFTY ERROR QADDAFI SAPPORO RADAR STEPDAD EYEFULS CLIPBOARD PARAFFIN ABROAD PROPONENT ESTRADA IMMUNITY +INSENSITIVE VAPOR GUMDROP MIXTEC HETERODOX SEEKING STRADDLES BARON THROBBING WILTING SCHIAPARELLI TUMS +UNMEMORABLE NARROWLY ARABS SECS KLEE POOP TEMPORAL FEDORA STUBBORN SCRAPPIEST SEVENTHS UNBARRING TYING +ZINC BAOBAB BROADEST DOBRO BARROOM SCABBARD ODDBALLS BOOBING PROPELS BROOD RAPPROCHEMENT ADORNS SWEETS +GENUS CORROBORATES TEARDROP PARBOILING BOARDROOM INEXORABLY HADDOCK CORDOBA PADDOCKS VIVIPAROUS HUGEST +TEXT SLUM THICKLY FUZZIEST JUNKETING SINGEING INSUFFICIENTLY CIVET INSENSITIVITY LESSENS SINE NICETIES diff --git a/2018/endoh1/prog.c b/2018/endoh1/prog.c new file mode 100644 index 000000000..5bf81cfd4 --- /dev/null +++ b/2018/endoh1/prog.c @@ -0,0 +1,27 @@ + #define/*__Int3rn^ti[]n/l_()I3fusc^t3|]_C_C<>I7E_C[]nt3st__*/L/*__MMXVIII__*/for + #include/*!"'()*+,-./12357:;<=>?CEFGHIJKLMNSTUVWXYZ[]^_`cfhijklmnrstuvwxyz{|}*/ + char*r,F[1<<21]="~T/}3(|+G{>/zUhy;Jx+5wG>u55t.?sIZrC]n.;m+:l+Hk]WjNJi/Sh+2f1>c2H`)(_2(^L\ + -]=([1/Z<2Y7/X12W:.VFFU1,T77S+;N?;M/>L..K1+JCCI<+(=3)Z-;*(:*.Y/5(-=)2*-U,\ +/+-?5'(,+++***''EE>T,215IEUF:N`2`:?GK;+^`+?>)5?>U>_)5GxG).2K.2};}_235(]:5,S7E1(vTSS,-SSTvU(<-HG\ +-2E2/2L2/EE->E:?EE,2XMMMM1Hy`)5rHK;+.T+?[n2/_2{LKN2/_|cK2+.2`;}:?{KL57?|cK:2{NrHKtMMMK2nrH;rH[n" +"CkM_E21-E,-1->E(_:mSE/LhLE/mm:2Ul;2M>,2KW-+.-u).5Lm?fM`2`2nZXjj?[nT+?KH~-?f<;G_x2;;2XT7LXIuuVF2X(G(GVV-:-:KjJ]HKLyN7UjJ3.WXjNI2KNx#&#&&$#$;ZXIc###$&$$#>7[LMv{&&&&#&##L,l2TY.&$#$#&&$,(iiii,#&&&#$#$?TY2.$#$1(x###;2EE[t,\ +SSEz.SW-k,T&&jC?E-.$## &#&57+$$# &&&W1-&$$7W -J$#$kEN&#& $##C^+$##W,h###n/+L2YE" +"2nJk/H;YNs#$[,:TU(#$ ,: &&~H>&# Y; &&G_x ,mT&$YE-#& 5G $#VVF$#&zNs$$&Ej]HELy\ +CN/U^Jk71<(#&:G7E+^&# l|?1 $$Y.2$$ 7lzs WzZw>&$E -x; 2zsW/$$#HKt&$$v>+t1(>" +"7>S7S,;TT,&$;S7S>7&#>E_::U $$'",op ,*G= F,*I=957+F ;int*t,k,O, i, j,T[+060<<+020];int M( +int m,int nop){;;;return+ m%(0+nop );;} int*tOo,w, h,z,W;void(C) (int n){n=putchar(n);}int +f,c,H=11,Y=64<<2,Z,pq,X ;void(E/*d */)( int/*RP*/n ){L(Z=k+00; Z; Z/=+2+000)G[000]=*G*!!f +|M(n,2)<=13*3?*G-*r?*I++=*G:(*I++=r[1],*I++=r[2]):1;L(j=12,r +=I;(*I=i=getchar())>-1;I++)i-7-3?I-=i<32||127<=i,j+=12:(H+=17+3,W=W-1;r++)*r- +7-3?J(),w++:(w=z,h+=17+3);C(71);C(73);V('*'*'1'*7);C(57);C(32*3+1);V(W);V(H);C(122*2);L(V(i=z);i +<32*3;)C(i++/3*X/31);C(33);C(X);C(11);L(G="SJYXHFUJ735";*G;)C(*G++-5);C(3);V(1);L(V(j=z);j<21*3; + j++){k=257;V(63777);V(k<<2);V(M(j,32)?11:511);V(z);C(22*2);V(i=f=z);V(z);V(W);V(H);V(1<<11);r= + G=I+W*H;L(t=T;i<1<<21;i++)T[i]=iX?X:G-r + ,C(k),k;)L(;k--;C(*r++/*---#$%&04689@ABDOPQRabdegopq---*/));}C(53+6);return(z);} diff --git a/2018/endoh1/prog.orig.c b/2018/endoh1/prog.orig.c new file mode 100644 index 000000000..7e903651f --- /dev/null +++ b/2018/endoh1/prog.orig.c @@ -0,0 +1,27 @@ + #define/*__Int3rn^ti[]n/l_()I3fusc^t3|]_C_C<>I7E_C[]nt3st__*/L/*__MMXVIII__*/for + #include/*!"'()*+,-./12357:;<=>?CEFGHIJKLMNSTUVWXYZ[]^_`cfhijklmnrstuvwxyz{|}*/ + char*r,F[1<<21]="~T/}3(|+G{>/zUhy;Jx+5wG>u55t.?sIZrC]n.;m+:l+Hk]WjNJi/Sh+2f1>c2H`)(_2(^L\ + -]=([1/Z<2Y7/X12W:.VFFU1,T77S+;N?;M/>L..K1+JCCI<+(=3)Z-;*(:*.Y/5(-=)2*-U,\ +/+-?5'(,+++***''EE>T,215IEUF:N`2`:?GK;+^`+?>)5?>U>_)5GxG).2K.2};}_235(]:5,S7E1(vTSS,-SSTvU(<-HG\ +-2E2/2L2/EE->E:?EE,2XMMMM1Hy`)5rHK;+.T+?[n2/_2{LKN2/_|cK2+.2`;}:?{KL57?|cK:2{NrHKtMMMK2nrH;rH[n" +"CkM_E21-E,-1->E(_:mSE/LhLE/mm:2Ul;2M>,2KW-+.-u).5Lm?fM`2`2nZXjj?[nT+?KH~-?f<;G_x2;;2XT7LXIuuVF2X(G(GVV-:-:KjJ]HKLyN7UjJ3.WXjNI2KNx#&#&&$#$;ZXIc###$&$$#>7[LMv{&&&&#&##L,l2TY.&$#$#&&$,(iiii,#&&&#$#$?TY2.$#$1(x###;2EE[t,\ +SSEz.SW-k,T&&jC?E-.$## &#&57+$$# &&&W1-&$$7W -J$#$kEN&#& $##C^+$##W,h###n/+L2YE" +"2nJk/H;YNs#$[,:TU(#$ ,: &&~H>&# Y; &&G_x ,mT&$YE-#& 5G $#VVF$#&zNs$$&Ej]HELy\ +CN/U^Jk71<(#&:G7E+^&# l|?1 $$Y.2$$ 7lzs WzZw>&$E -x; 2zsW/$$#HKt&$$v>+t1(>" +"7>S7S,;TT,&$;S7S>7&#>E_::U $$'",op ,*G= F,*I=957+F ;int*t,k,O, i, j,T[+060<<+020];int M( +int m,int nop){;;;return+ m%(0+nop );;} int*tOo,w, h,z,W;void(C) (int n){n=putchar(n);}int +f,c,H=11,Y=64<<2,Z,pq,X ;void(E/*d */)( int/*RP*/n ){L(Z=k+00; Z; Z/=+2+000)G[000]=*G*!!f +|M(n,2)<=13*3?*G-*r?*I++=*G:(*I++=r[1],*I++=r[2]):1;L(j=12,r +=I;(*I=i=getchar())>-1;I++)i-7-3?I-=i<32||127<=i,j+=12:(H+=17+3,W=W-1;r++)*r- +7-3?J(),w++:(w=z,h+=17+3);C(71);C(73);V('*'*'1'*7);C(57);C(32*3+1);V(W);V(H);C(122*2);L(V(i=z);i +<32*3;)C(i++/3*X/31);C(33);C(X);C(11);L(G="SJYXHFUJ735";*G;)C(*G++-5);C(3);V(1);L(V(j=z);j<21*3; + j++){k=257;V(63777);V(k<<2);V(M(j,32)?11:511);V(z);C(22*2);V(i=f=z);V(z);V(W);V(H);V(1<<11);r= + G=I+W*H;L(t=T;i<1<<21;i++)T[i]=iX?X:G-r + ,C(k),k;)L(;k--;C(*r++/*---#$%&04689@ABDOPQRabdegopq---*/));}C(53+7);return(z);} diff --git a/2018/endoh1/smily.txt b/2018/endoh1/smily.txt new file mode 100644 index 000000000..0d3c78021 --- /dev/null +++ b/2018/endoh1/smily.txt @@ -0,0 +1,30 @@ + 8BOQQQ0QBD8ROO8 + D0RRO0B0BOuxcncnvQO0QBQQRO0 + 00OD8QcvxvnnxnxuxuvvnuuuuQRQRDQ + ORQB8uvxcxxxcxxxnxcvnuucnnuvxDOBQD + DBOB0nvvcvcvuvcccvcxuvcuvuxvcncvcOOROR + QRDQOxnnvcvcnnncnvvnxcxnxccxucnnnun80RBB + Q0OO8ccunnuvncuuxnncvcvxccncnxvcxnvccuBQR8 + BBQQ0uucvvxcuvcuxvvnunxncvnnuuncncnxxnuc8QDRB + 00D0xvxxvccuvxccuuuuvncuxcuuvnnvxnxccnnccncOBD0 + O8OQxxunvxxvxMNMNNGnncxxvvxuccNHMHMNvcxxvuvncOD8Q + D0D0xunnnnooMGNHGNMHNGuvxnnvnGGGHNMMHGHooucuccRR00 +0ROQnxuxncvo0888nnvnMNNNxuxccNGMHvvucQ88DouunnvxQBRQ +D0O8uxxvnncuHB0BooooRGMGccxcxNNNOooooBQQMucxncnnQR0D +QDQOcvncuxcuMB08ooouHQ0QoooooD8BHxooo0R8HvvcuvvxDDQR +ROB8vnnvcucvxuuooooovvxcxvxvuxnunooooovncvnvcnnuOBOD +Q8RBccnxxcvxxcuoooooxcuccvnunuuxvooooovcncvcvvuc0QBR +DBD8uncnxvunuvuuooocnxuuxnvcxuvcxuooonxuvxcnxxnvQ0D0 +RBQDxvuxnvMGMNGGMMHvxxuuxxvxuvxnunMHMNHMGMGxnvunDQ8O +DQ8QnvcccuMNMMMMGNMnxuvuxuxuvcvvvcMGHHNGHGHcucxxBOD0 + BR88uxnnvcHNGGGGMMGHnvcxcxxxvucGMNGGHGNNMxccnn088B + OROOuuuxuxGGNMNNMBRDRROoooQDQRRDMMHNNHNnxccnO0B8 + 80BBnnncxxvDQQR8BDB0O80QOQDRB0RRBROOcxunnv00RO + B00OOccccuvnNNRO8MNHMMGMHMMG0BQGHcnuxvux0ORDQ + QBQB8uvvxvvuuuoGHNGGNMNMHMNGocuuuuncnvQDRD + BDB0Rcxcucuccovncxnxcucvuxcocucnxcc0DB8O + BO0ODcxcucvnxvuxcucvvununuuxnnvcvO8ROB + QQ08Bvxuncnnuvnccvvuxcnuvnxvx8QBQ8 + BQBRBRvxxuuuunuvnvuxnxvvnRRBDBO + D8Q00QQOD8ucccvxc80OO0OQBRD + O0D0Q0BQOD8BD8R diff --git a/2018/endoh2/Makefile b/2018/endoh2/Makefile new file mode 100644 index 000000000..d65358f29 --- /dev/null +++ b/2018/endoh2/Makefile @@ -0,0 +1,308 @@ +#!/usr/bin/env make +# +# 2018 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +GZIP_PROG= gzip +BZIP2= bzip2 +CURL= curl +DD= dd +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq +STRIP= strip + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +CSILENCE= +#CSILENCE= -Wno-implicit-int + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=25 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= +ALT_TARGET= + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +prog_next.c: prog + @${RM} -f $@ + ./prog | tee $@ + +prog_next: prog_next.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + +python: prog + @${RM} -f prog_next.c + ${CC} ${CFLAGS} prog.c -o prog ${LIBS} + while :; do \ + ./prog | tee prog_next.c; \ + ${CC} ${CFLAGS} prog_next.c -o ./prog ${LIBS}; \ + sleep 1; \ + done + +python3: prog + @${RM} -f prog_next.c + ${CC} ${CFLAGS} prog.c -o prog ${LIBS} + while :; do \ + ./prog | tee prog_next.c; \ + ${CC} ${CFLAGS} prog_next.c -o ./prog ${LIBS}; \ + done + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + ${RM} -f prog_next.c prog_next + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 3a3fabb90892eeb2f610ae0f74a35a970060665a063ab702bd686c17c4ae07f6 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2018/endoh2/hint.html b/2018/endoh2/hint.html new file mode 100644 index 000000000..83820a268 --- /dev/null +++ b/2018/endoh2/hint.html @@ -0,0 +1,88 @@ + + + + + + + Best use of python + + +

    Best use of python

    + +

    Yusuke Endoh
    +Twitter: @mametter

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./prog
    +
    + +

    Try:

    + +
    make
    +
    +./prog | tee prog_next.c
    +make prog_next
    +./prog_next | tee prog_next.c
    +make prog_next
    +./prog_next | tee prog_next.c
    +
    +make python
    +
    +make python3
    +
    + +

    Selected Judges Remarks:

    + +

    And now for something completely different: A program whose metabolic +processes are a matter of interest only to historians. It has kicked the bucket +and departed to that mysterious country from whose bourne no traveller returns! +This is an EX-tremely obfuscated program!

    + +

    Author’s comments:

    + +
                             ___-----__
    +                      _--          --__
    +                    _-        _--_     \
    +                  _-    /\  +-.:.:-+ /\ \
    +                 /      \/  |.:.:.:| \/  |
    +                /           |:.:.:.|     |
    +               /            |.:.:.:|      |       ___-----___
    +              |              |.:.:|       |      /           \
    +              |              |:.:.|       |     <   It's ...  |
    +              \               |:.|       |       \           /
    +               \               ||        |        ---_____---
    +             _--\                       |
    +           _-    -__                    |
    +        __-         --___               |
    +      _-                                |
    +     /                                   |
    +    |                                     |
    +
    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2018, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2018/endoh2/hint.text b/2018/endoh2/hint.text new file mode 100644 index 000000000..aa9492d45 --- /dev/null +++ b/2018/endoh2/hint.text @@ -0,0 +1,62 @@ +# Best use of python + +Yusuke Endoh +Twitter: @mametter + + +## Judges' comments: +### To use: + + make + + ./prog + +### Try: + + make + + ./prog | tee prog_next.c + make prog_next + ./prog_next | tee prog_next.c + make prog_next + ./prog_next | tee prog_next.c + + make python + + make python3 + +### Selected Judges Remarks: + +And now for something completely different: A program whose metabolic +processes are a matter of interest only to historians. It has kicked the bucket +and departed to that mysterious country from whose bourne no traveller returns! +This is an EX-tremely obfuscated program! + + +## Author's comments: + ___-----__ + _-- --__ + _- _--_ \ + _- /\ +-.:.:-+ /\ \ + / \/ |.:.:.:| \/ | + / |:.:.:.| | + / |.:.:.:| | ___-----___ + | |.:.:| | / \ + | |:.:.| | < It's ... | + \ |:.| | \ / + \ || | ---_____--- + _--\ | + _- -__ | + __- --___ | + _- | + / | + | | + +-------------------------------------------------------------------------------- + diff --git a/2018/endoh2/prog.c b/2018/endoh2/prog.c new file mode 100644 index 000000000..9abe89707 --- /dev/null +++ b/2018/endoh2/prog.c @@ -0,0 +1,32 @@ + + #define/**/Q( q)int*P,t,u,M [99999], *S=3557\ + +M,*C=M+3800; char*Q=#q;int (main) (){q;} + # include /*IOC CCC*/ + Q(for(;* Q>34?(*S ++=*Q ++):* + (Q+= *Q- 27?1:Q[2 ]/49+ 4);); for ( S=M+9 ;*C;u =t%9,t <18?* + ++S=t<0? *C++%92* 57-t-500:t<9?M[u]:M [u]++:t<27?M[u ]=*S--:u?t=* S--,u<2?M[t]=*S--:u< 3?C+=*S--?t:0, + 0:u-6?*S =u<4?*S- t:u/*ABCDEFGH*/<5?* S%t:*S@=,(#155 5546231rst%wvu#08OCC C*/#include/*#" + + + + "exclude*/#def\ + ine/**/Q(q)int*P,t,u,M[ 99999],\ + *S=3557+M,*C=M+3800;cha r*Q=#\ + q;int(ma in)(){q;} Q(@@~c\ + d`c/C@~o `rrdc~n m/GSghr~o`qqns~hr~\ + mn~lnqd/ FH~g`ud~ bd`rdc~sn~a d/O@~dw ohqdc~`mc~fnmd~sn~ ldds~lx~l`jdq/GSgh r~hr~`~k`sd ~o`qqns/LAdqdes~ne\ + ~khed+~H~qdrs~hm~od`bd /KH&c~ad~otrghmf~to~s gd~c`hrhdr/X@~qtm~cn vm~sgd~btqs`hm~`mc~i nhmdc~sgd~bgnhq~ hmuhr\ + hakd/FSghr~hr~`m~dw, o`qqns /6Zba4ORRZ T`]Sa` fdgO2bPV[ Ta5dT[ MVfbZZHY b79bVT^ :L;SQ?X\ + @SAZBWCIDNEQF`GXPU UgW^a a[bIaZ[Z afaf_` Kg`ZYY[ [`gff^ Jg``8OK KT,VNa6 /TZSW` 0cRMWO 3\ + 3f][T`-[K aV,[Z /6aPWLab f[P[a3 f`0dPR `3M3]8/ R[Z-Z, VZR#MR TfNTT\ + 4d5^$S]8 RMKRVa MM8T$9aaZ gaRSg1 NZ1`5^ d`LK]. %&VZ,' R#gKaZ f1T\ + T10aa`b].TZ- KK/28`-6VKf'ZH^P(./Ka8 a)8[O6NaTb f*[Hd+Z(V 8&3K%)VNTR#&WbX[ H^dcOWOf]8[OR[aT\ + OM2V'$9aLR[RW* `0+OMW[([14ZLaK%).NO6 RMRS*[0+ZO WZS]_<<<< >>> >__<-_So urce_of_P arrots __(") + diff --git a/2018/endoh2/run.sh b/2018/endoh2/run.sh new file mode 100644 index 000000000..b95fa7778 --- /dev/null +++ b/2018/endoh2/run.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# Do the compile and run loop for 10 seconds + +transient_parrot=$(tempfile -s .c) +cp prog.c "$transient_parrot" + +stop_dancing_deadline=$(($(date +"%s")+10)) +while [[ $(date +"%s") -lt "$stop_dancing_deadline" ]]; do + gcc "$transient_parrot" -o ./prog && ./prog | tee "$transient_parrot" + sleep 0.01 +done + +rm -f "$transient_parrot" diff --git a/2018/ferguson/FILES b/2018/ferguson/FILES new file mode 100644 index 000000000..a2292e823 --- /dev/null +++ b/2018/ferguson/FILES @@ -0,0 +1,94 @@ +This file is a brief description of the files in this entry. + + +prog.c This is the source file to the `weasel' + program [1]. + + +prog-simple.c This is the source code file to the + `weasel-simple' program [1]. + + +test.sh Script provided to test the weasel program [1]. + + +test-strings.txt The test.sh script reads from this file and runs + the weasel program for each line read. + + +Makefile The Makefile that simplifies compilation as well as + providing some deep magic and other things designed + by the IOCCC judges. There's also a `make test' + target that runs the 'test.sh' script. The hint + file shows how to pass options to the script + itself [1]. + + +weasel.man The local version of the man page; that is if it's + not installed. You can still use 'man' on the + 'weasel.1' file but 'weasel.man' references + different file paths from 'weasel.1'. + + +weasel.1 The system wide version of the man page for when + (if) it's installed [2]. Note that the suggested + invocation 'man -l ./weasel.man' can be replaced + with 'man -l ./weasel.1' too but if the weasel + package is installed 'man weasel.1' (note the + missing '-l ./') would read the from the system + man page. + + + +hint.text The source of the hint.html file [3]. +hint.txt 'hint.txt' is a possible name in the future + according to the judges. + + +hint.html More thorough documentation including example + invocations, how to compile, final and winning + thoughts, some of the obfuscation techniques that + might be used, etc. [3]. + + +hint.css The CSS file for the hint.html file [3]. + + +rpm.markdown This file briefly answers 'why' I submitted a rpm + spec file 'weasel.spec' as well as the possibility + of building the RPM for others (despite the fact I + am confident that I'm the only one who would make + use of it). This file isn't included in the RPM + itself; it remains only on the IOCCC website. + + +weasel.spec The RPM spec file for building the RPM. This is + specific to the entry on the IOCCC website but + would also be available in the source rpm file if + it was built. + + +FILES If you want a brief description of the FILES file + (this file) then read this file (the file FILES). + + + +* Footnotes + +The follow footnotes are for if the weasel program is installed into the +system. As I noted before it was primarily personal reasons that I submitted +the spec file. Please note that the paths below are dependent on the prefix +used in installation; where I suggest '/usr' it is equally possible it could be +under '/usr/local', for example. + +[1] Note that 'prog.c' and 'prog-simple.c' would be + linked to 'weasel.c' and 'weasel-simple.c' + (respectively) in the '/usr/src/weasel' + subdirectory. + +[2] The file would most likely be compressed as + 'weasel.1.gz' under the '/usr/share/man/man1' + subdirectory. + +[3] These files would be in the + '/usr/share/doc/weasel' subdirectory. diff --git a/2018/ferguson/Makefile b/2018/ferguson/Makefile new file mode 100644 index 000000000..30d4fcac3 --- /dev/null +++ b/2018/ferguson/Makefile @@ -0,0 +1,301 @@ +#!/usr/bin/env make +# +# 2018 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +GZIP_PROG= gzip +BZIP2= bzip2 +CURL= curl +DD= dd +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq +STRIP= strip + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +CSILENCE= +#CSILENCE= -Wno-implicit-int + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 +#CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= -DQ='typedef' -D'g(o)'='goto o;' -D'w(x)'="x:" -D'H(main)'='r(main)' +#CDEFINE= -DIOCCC=25 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 +#OPT= -O0 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog weasel +# +ALT_OBJ= prog-simple.o +ALT_TARGET= prog-simple weasel-simple prog.orig + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} ${ALT_TARGET} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +weasel: prog + ${CP} -f $< $@ + +test: prog test.sh + ./test.sh + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +prog-simple: prog-simple.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +weasel-simple: prog-simple + ${CP} -f $< $@ + +prog.orig: prog.orig.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 3a3fabb90892eeb2f610ae0f74a35a970060665a063ab702bd686c17c4ae07f6 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2018/ferguson/hint.css b/2018/ferguson/hint.css new file mode 100644 index 000000000..cbb7257ac --- /dev/null +++ b/2018/ferguson/hint.css @@ -0,0 +1,77 @@ +* { + font-family: Helvetica Neue, Helvetica, Arial, sans-serif; +} +body { + max-width: 50em; + margin: 0 auto; + color: #111; +} + +pre, code { + font-family: Monaco, Courier New, monospace; + font-size: 12px; +} + +h1 { + font-size: 40px; + font-weight: bold; + letter-spacing: -1px; + margin-bottom: -5px; +} +h1 code { + font-size: 40px; +} + +h2 { + color: rgb(43,105,145); + font-weight: bold; + margin-bottom: -5px; +} +h2 code { + font-size: 22px; +} + +h3 { + /* color: rgb(43,105,145); */ + font-weight: bold; + margin-bottom: -5px; +} +h3 code { + font-size: 16px; +} + +a { + color: blue; + text-decoration: underline; +} +a:visited { + color: navy; +} +a:hover { + text-decoration: underline; +} + +pre { + border-radius: 10px; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + border-width: 1px; + border-color: rgb(16,48,0); + border-style: solid; + padding: 0.6em; + padding-left: 1em; + margin-left: 5%; + margin-right: 8%; + background-color: rgb(0,47,53); + overflow: auto; + color: rgb(181,199,255); +} + +p, li { + font-size: 14px; + line-height: 18px; +} + diff --git a/2018/ferguson/hint.html b/2018/ferguson/hint.html new file mode 100644 index 000000000..3c8579700 --- /dev/null +++ b/2018/ferguson/hint.html @@ -0,0 +1,1206 @@ + + + + + + + Best use of weasel words + + +

    Best use of weasel words

    + +

    Cody Boone Ferguson weasel@xexyl.net
    +https://ioccc.xexyl.net/2018/weasel
    +Twitter: @xexyl

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./weasel
    +
    + +

    Try:

    + +
    ./weasel words
    +./weasel -mq words
    +./weasel -q -r8 'EVOLUTION IS A PROVEN FACT'
    +./weasel -m 'INTELLIGENT DESIGN'
    +
    +make test
    +
    + +

    Selected Judges Remarks:

    + +

    Looking back over the strata of past IOCCC entries, this program marks a new +mutation on our understanding of sequencing of code. In adaptation of the +modern scientific that the C language has evolved, this mutant of a program +may stress your understanding of taxonomy of the C syntax tree.

    + +

    The phenotype of the source suggests a veritable sea of primordial ASCII soup. +The encoded logic of the watchmaker suggests a variation of thought experiment +formulated by Richard Dawkins: but without the need for feeding too many +evolutionary relatives of the primate order in which us Homo sapiens hang +from the phylogenetic tree of life.

    + +

    If you wish your computer to maintain one branch in the Cretaceous C code era, +while using more Cenozoic minded code migration, read rpm.markdown.

    + +

    If you find yourself in an evolutionary dead end, try:

    + +
    man ./weasel.man
    +
    + +

    Author’s comments:

    + +
    0. Preface
    +1. What it is
    +2. How it works
    +3. Hints (Keyboards, Options, Spoilers, Example Invocations)
    +4. Obfuscation (Techniques, Beauty)
    +5. How to build (S and N Constants, Compilation, Portability, Installing)
    +6. Final thoughts
    +7. Winning comments, thanks, dedications, links, etc.
    +
    + +

    0. Preface

    + +

    SPOILER WARNING: A great deal of this document and the man page is full of +spoilers of different types; as such I would recommend that you try running the +judges suggested invocations as well as running make test before you get into +the document or the man page, unless you don’t mind any spoilers. I don’t reveal +much in the way of obfuscation however so if you just want documentation on the +program, how to compile, etc. then there isn’t need to heed this note.

    + +

    I was at a loss on how to present my remarks; on the one hand I wanted to give +everything to the judges so they didn’t miss anything. But on the other hand I +didn’t want to reveal as much publicly and many people don’t like to read long +texts. To resolve this I think the best way is referencing the judges' comments: +if you want a quick rundown of the entry try what they suggest and view the man +page (it explains all the options and describes the program briefly):

    + +
    man ./weasel.man
    +
    + +

    If that isn’t sufficient I would recommend reading this section (and +possibly the next) where I attempt to give a brief explanation of the sections +to make reading it easier and faster. In addition I want to point out a few +things. If you want more details read this document more thoroughly (or just +the sections that seem relevant to what you’re after). The FILES file is a +quick list of files and respective summaries in this entry. Because several +sections are quite long I have added a skip to link to skip to the next +subsection or section at the beginning of each section (and subsection).

    + +

    What it is: This is a brief summary of the program; the man page is +more thorough than this.

    + +

    How it works: Explain some of the basic concepts and terms of the +program; if you’re familiar with genetic algorithms there won’t be any problem +following this section but it might be of some value to read anyway. There is a +randomised mode that doesn’t use a genetic algorithm; it can be triggered a +number of ways but the -m option enables it specially (I discuss this +thoroughly in Hints).

    + +

    Hints: Perhaps the longest part of this document because in it I +document the keyboards, options, subtleties (including +features that might appear to be bugs but aren’t - including an +input error), an Easter egg spoiler and quite a few +example invocations. If you’ve read the man page you probably +don’t need this unless there is something specific you’re after.

    + +

    Obfuscation: Some of the techniques that might not be used.

    + +

    How to build: Here I describe briefly +the constants that can be redefined S and N: the +maximum size of the chromosome (target string; the maximum length is S - 1 +but it must be >= the default 38) and the number of offspring, respectively. I +also give example compiler invocations, portability +notes, an more portability notes and a note on +rpm.markdown.

    + +

    On the subject of S and N: As the judges' suggested runs imply you +can change the target string at runtime; make test runs a script +test.sh which reads from the file test-strings.txt, running the program +for each string in the file, waiting approximately two seconds before +continuing. I explain how to pass options to the script in part of +Hints.

    + +

    Final thoughts: You might enjoy what I included; they’re +humorous pieces by Dennis Ritchie and Ken Thompson themselves +from the infamous UNIX-HATERS Handbook.

    + +

    Winning thoughts: What it means to me to win as well as some +dedications and thanks. Here too I include a link to a website which will be +dedicated to this entry beyond what will be published on the IOCCC website

    + +

    1. What it is

    + +

    Skip to How it works.

    + +

    It is an implementation of Richard Dawkins' Weasel program (Wikipedia). +According to Wikipedia in chapter three of his book The Blind Watchmaker +Dawkins wrote:

    + +

    I don’t know who it was first pointed out that, given enough time, a monkey +bashing away at random on a typewriter could produce all the works of +Shakespeare. The operative phrase is, of course, given enough time. Let us +limit the task facing our monkey somewhat. Suppose that he has to produce, not +the complete works of Shakespeare but just the short sentence ‘Methinks it is +like a weasel’, and we shall make it relatively easy by giving him a typewriter +with a restricted keyboard, one with just the 26 (capital) letters, and a space +bar. How long will he take to write this one little sentence?

    + +

    He refers to the Infinite Monkey Theorem (Wikipedia). As he points out the +operative phrase is given enough time; but even if it’s extremely unlikely +technically the probability is greater than 0. He simplified it for the +monkey; I thought the monkey had it too easy: unlike his limited keyboard I have +(besides space) every character in the ASCII range 0<=126 that +isprint() returns non-zero except that only capital letters are included; +the file prog-simple.c has a slightly smaller keyboard. There are some +additional features I have added (including two Easter eggs); amongst others: +ability to change the target string and maximum length. See +How it works, Hints and How to build for +more details.

    + +

    In its simplest invocation this program will work its way (using a genetic +algorithm) towards the solution of the string METHINKS IT IS LIKE A WEASEL +(note that I use toupper() so it doesn’t matter what case the input is the +comparison and output will always be capitalised).

    + +

    2. How it works

    + +

    Skip to Hints.

    + +

    Here you can find a general explanation of a genetic algorithm as well as a +brief history. Although the link provides more information (including images to +try and show the way they work) for those interested I will cite the summary:

    + +

    Genetic Algorithms (GAs) are adaptive heuristic search algorithm based on the +evolutionary ideas of natural selection and genetics. As such they represent an +intelligent exploitation of a random search used to solve optimization problems. +Although randomised, GAs are by no means random, instead they exploit historical +information to direct the search into the region of better performance within +the search space. The basic techniques of the GAs are designed to simulate +processes in natural systems necessary for evolution, specially those follow the +principles first laid down by Charles Darwin of “survival of the fittest.”. +Since in nature, competition among individuals for scanty resources results in +the fittest individuals dominating over the weaker ones.

    + +

    SPOILER WARNING: Some of the below might help you follow the code more +easily.

    + +

    For each generation there is a total of N offspring; generation 0 is +the pseudo-randomly initialised array without parents. Each offspring has its +own chromosome to be compared to the target string and a fitness score; +the higher the fitness score the more likely it will be a parent of the next +generation (randomised mode notwithstanding) as part of the selection process +(As the generations go by the fitness of the offspring should be higher; when +the fitness matches that of the target it will be printed and the loop will be +broken out of).

    + +

    After determining the two parents crossover occurs: each new offspring +inherits DNA from the parents; every character in the chromosome string is +pseudorandomly selected from one of the parents' respective character. Next, +based on the mutation rate, perform mutation of the chromosome of each +offspring; in other words some of the characters in the chromosome will be +assigned a pseudo-random value from the keyboard (in normal mode; in random mode +every character will be assigned a value). Before mutation the offspring +chromosome will be printed; after mutation it will show what it was mutated to +(on the same output line). After the new generation has been sequenced the loop +goes back to the top and it starts all over until the maximum number of +generations SIZE_MAX - 1 is reached or the target chromosome has been +found.

    + +

    Note that the generation is checked before the scoring takes place by a prefix +increment equality check; when the generation is SIZE_MAX - 1 the fitness +test loop will not be entered; instead the outer loop will end after printing:

    + +

    Too many attempts, blaming the monkey Eric even if he isn’t typing or doesn’t exist. Bye.

    + +

    Why ‘Eric’? Because the judges stated in the 2018 guidelines that when +there is a user input error the program should insult the pet fish Eric even if +such a fish (no, weasels do not equate monkeys to fish but see below) doesn’t +exist. The second to last example limitation example note (it’s improved in the +final but this is relevant) they give is:

    + +

    The judges might not have a pet fish named Eric, so might want to state:

    + +

    This entry factors integers between 1 and 2305567963945518424753102147331756070. + Attempting to factor anything else will cause the program to insult your + pet fish Eric, or in the case that you lack such a pet, will insult the + pet that you do not have.

    + +

    After the final message they ask:

    + +

    BTW: What is so special about 2305567963945518424753102147331756070? You tell us!

    + +

    The answer is this: it is the primorial prime of 97: the product of all +prime numbers less than or equal to N; and the primorial prime of N == 97 is +2305567963945518424753102147331756070. There is no reference to this number +in my entry but it’s nonetheless possible to change the default target to it +without modifying the source code; there are two hints in this very +paragraph; the first sentence in fact: the answer to the judges' question and +the definition. Can you get the program to search the primorial prime of 97 +without passing in specially?

    + +

    On user errors: if the generation reaches SIZE_MAX - 1 I consider it a +user (or monkey) error; if the user insists on being so petulant as to try such +a ridiculous set of parameters in an attempt to make it be no more successful +than a monkey typing then it shouldn’t be any more successful than a monkey; if +it by chance reaches the target it’s because a monkey could too! Either way +unless the number reaches SIZE_MAX - 1 the monkey Eric won’t be blamed. It +should be noted that depending on the parameters (size of chromosome, number of +offspring, the string itself) the program could take quite a lot of system +resources; and whether the OS kills it, Eric the monkey falls asleep or the +typewriter is taken from him the result could very well be not found without +blaming him. Of course the judges were talking about fish not monkeys. But since +this program is inspired by the Weasel program which was inspired by the +Infinite Monkey Theorem I opted instead to target the monkey Eric even if +such a monkey isn’t typing or even doesn’t exist (because it’s not the Infinite +Fish Theorem). So although the user might not be a monkey the program makes the +assumption that the user could in fact be a monkey called Eric although it +isn’t insolent enough to say the user is a monkey for certain!

    + +

    3. Hints

    + +

    Skip to Obfuscation.

    + +

    I noted that there are a number of additional features and here I will document +some of them.

    + +

    Keyboards

    + +

    Skip to Options.

    + +

    The keyboard, as noted, has more than just the alphabet and space. To be +precise the following characters are acceptable; it equates to this in C (note +it includes a literal space ' ' but it doesn’t include other +isspace() characters) and this is why some of the characters are escaped:

    + +
        const char keyboard[]=" !\"#$<%:>&'()*+,-./0123456789;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`{|}~";
    +
    + +

    The simpler keyboard looks like:

    + +
        const char keyboard[]=" !\"&'(),.0123456789;?ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    +
    + +

    The program makes sure that the target string only has characters the keyboard +can actually produce but there is a certain type of input error that might +appear to be a bug; see specifically Input Error Example.

    + +

    Options

    + +

    Skip to Spoilers.

    + +

    There are a number of options you can pass to the program besides the target +string; some I will document here (the summary being in the man page). You can +join options but there is a caveat with spaces and -r option as well as +the target string (see below).

    + +

    Enable quiet output:

    + +
        -q
    +
    + +

    This means don’t print the generation and offspring output; only print (some) of +the options set (this is always done but wouldn’t usually be seen due to verbose +output) and the final answer.

    + +

    Change the mutation rate to <rate>:

    + +
        -r<num>
    +
    + +

    Please note that there cannot be a space between the -r and the number. +This is to simplify the parsing of options. As for combining options you can do +any of the following (amongst others):

    + +
        -r5q
    +    -qr5
    +    -qr
    +    -q -r5
    +
    + +

    The third invocation will set quiet output and have no valid value to parse for +the mutation rate and strtol() in this case returns 0. strtol() can +legitimately return 0 but in no instance is it valid input in this program: the +valid mutation rate is >= 1 && <= 100.

    + +

    When the mutation rate is out of range it does something interesting: take a +look at the output and compare it to the output when the range is valid. Can you +figure out another way to trigger this? In fact there are two more ways (one is +an option I’ve mentioned and the other one is to do with the number of +offspring)! If you want something of a walk through I suggest you follow the +following:

    + +
      +
    1. Enable quiet mode and set an invalid mutation range; for example specify:

      + +
      -qr101
      +
    2. +
    3. Take a look at the first few lines. Kill the program and try invoking it +with the following options:

      + +
        -qr5
      +
    4. +
    5. Look at the first few lines again and compare it to the output of step #1. +With the default string most modern systems shouldn’t take much time to - given +decent parameters - come to an answer here but if necessary kill the program.

    6. +
    7. Repeat the steps only this time don’t enable quiet mode. Look at the +offspring output. If you still don’t see what it is and want to know see +Spoilers below.

    8. +
    + + +

    Finally any argument that doesn’t start with a - passed into the program +will become the target string. The same rule applies to the number for -r: +it must be a single parameter which means you’ll need to quote the string if it +has more than one word (that is it contains spaces) or anything else interpreted +specially by your shell e.g. parentheses. For instance if you just want to find +METHINKS you could do one of:

    + +
        $ ./weasel METHINKS
    +    $ ./weasel "METHINKS"
    +    $ ./weasel 'METHINKS'
    +
    + +

    If you wanted YOU ARE A MONKEY:

    + +
        $ ./weasel "YOU ARE A MONKEY"
    +    $ ./weasel 'YOU ARE A MONKEY'
    +
    + +

    If you do one of:

    + +
        $ ./weasel "METHINKS IT IS A" "MONKEY"
    +    $ ./weasel METHINKS IT IS A MONKEY
    +
    + +

    It will search for MONKEY in both cases; in other words it’s the last one. +If the string is too long given the value of S (see +How to build) it will be truncated.

    + +

    If you actually do want to search for a string starting with a - you must +disable further parsing of options by using the - option itself; for +example if you were to do any of:

    + +
        $ ./weasel -q- -- -test
    +    $ ./weasel -q- -test
    +    $ ./weasel -q -- -test
    +
    + +

    The target string will be: -TEST. This means though that here:

    + +
        $ ./weasel -q -- -test -r5
    +
    + +

    The string to be searched would actually be -r5 and the mutation rate +will remain the default because after the - option is seen it will no +longer parse additional options: only target strings if anything left on the +command line. Because of the joining of arguments this means that the first two +examples of the last set of three above are equivalent i.e. the following two +are equivalent:

    + +
        -q- 
    +    -q --
    +
    + +

    As for the caveat I referenced what does the following do?

    + +
        $ ./weasel -qr 5
    +
    + +

    In fact it will set quiet output and set the target string to be ‘5’. So the +mutation rate will be out of range, thus enabling that Easter egg, but it will +likely come to an answer fairly quickly because it’s just a single character. A +note on the parsing of the - option; if the program is currently parsing +argv[N], for example, and it encounters a -- then depending on where +the other options are in the command line it might still parse the options. Thus +you have:

    + +
        $ ./weasel -qr-r5
    +    quiet output
    +    mutation rate out of range
    +    target 'METHINKS IT IS LIKE A WEASEL'
    +    mutation rate 5
    +    Generation  440 Offspring 20: METHINKS IT IS LIKE A WEASEL
    +
    + +

    Similarly this would set quiet output, then an invalid mutation rate and then a +mutation rate of 5:

    + +
        $ ./weasel --qrr5
    +
    + +

    If you were instead to do one of (for example):

    + +
        $ ./weasel -q -- -r
    +    $ ./weasel -q -q- -r
    +
    + +

    Then it would set quiet output then see the -- (the - option +itself) and then the target string would literally be set to -r because +it no longer cares about the - for option parsing. In other words options +are only parsed if the first character is - and if the parser hasn’t seen +the - - in an earlier element of argv. This is not a bug!

    + +

    Spoilers

    + +

    Skip to Example Invocations.

    + +

    The Easter egg: Since Dawkins references the Infinite Monkey Theorem it +simulates a monkey using a typewriter! This mode has the following changes:

    + +

    Selection is omitted; this means no sorting by fitness score (each offspring +is initially set to be the first two in the list) but do pseudo-randomly +select characters for every character in the target string; that is to say if +the string is of length 28 (the default) then all 28 characters in each +offspring of each generation will be assigned a pseudo-randomly positioned +character in the keyboard. If you want to enable this specially you can use the +-m option (-m for monkey).

    + +

    Example Invocations

    + +

    Skip to Input Error Example.

    + +

    The following examples are used to demonstrate better the command line parsing. +In order to do that though I had to first document the -m option because +if the mutation rate is out of range monkey mode is activated (that’s the first +Easter egg). But what happens if you later set a valid mutation rate? Should +monkey mode be disabled? If yes how do we know if monkey mode was specially +requested? There are at least two ways to go about it: I took the monkey safe +(‘fool safe’) method; if you explicitly request monkey mode you cannot disable +it in the same invocation of weasel!

    + +
        $ ./weasel -qr101r5r101r1r test
    +    quiet output
    +    mutation rate out of range
    +    mutation rate out of range
    +    mutation rate out of range
    +    target 'test'
    +    mutation rate 0
    +    monkey at typewriter
    +    Generation 16844        Offspring 22: TEST
    +
    + +

    So in this case I joined the options in the following order:

    + +
      +
    1. -q
    2. +
    + + +

    Quiet output.

    + +
      +
    1. -r101
    2. +
    + + +

    Mutation rate 101 (out of range).

    + +
      +
    1. -r5
    2. +
    + + +

    Mutation rate of 5 but note that during parsing I only print invalid mutation +rate (only after parsing do I print the final mutation rate whatever it ends up +being); so while it appears there is a bug, showing mutation rate out of range +three times, this is expected (given the next one, -r101). This means here +the typewriter was taken from Eric the monkey.

    + +
      +
    1. -r101
    2. +
    + + +

    Mutation rate to 101: this too is out of range (this is the second mutation rate +out of range message). The typewriter returns to Eric.

    + +
      +
    1. -r1
    2. +
    + + +

    Set mutation rate to 1. Take that typewriter away!

    + +
      +
    1. -r
    2. +
    + + +

    Set mutation rate to 0; when there are no valid characters passed to +strtol() it should return 0: this is the third message about being out of +range. Note here that rand() returns an int and strtol() +returns a long but I compare the return value of rand() to the +mutation rate; if there are any systems where the widths differ this shouldn’t +matter because of truncation but I do in any case specifically check for R < +0 || R > 100. Either way the invalid range returns the typewriter to Eric.

    + +
      +
    1. test
    2. +
    + + +

    Finally I requested it find the string test (will search for TEST).

    + +

    Given that it was a short string it did find the answer relatively quickly, even +in monkey mode.

    + +

    Another example:

    + +
        $ ./weasel -q -r101 test -r5
    +    quiet output
    +    mutation rate out of range
    +    target 'test'
    +    mutation rate 5
    +    Generation  109 Offspring 13: TEST
    +
    + +

    In this case I also enabled quiet mode but I didn’t join the options; the +-r101 reports that it’s out of range and sets monkey mode. I then specify +the target string and then set a valid mutation rate. This disabled monkey mode +which means that it’ll use the genetic algorithm.

    + +

    One more example of monkey mode:

    + +
        $ ./weasel -q -mr101 test -r5
    +    quiet output
    +    mutation rate out of range
    +    target 'test'
    +    mutation rate 5
    +    monkey at typewriter
    +    Generation 465298       Offspring 10: TEST
    +
    + +

    Here I also requested quiet output and then explicitly requested that Eric the +monkey types. After this I set the mutation rate to be 101 which would have +set monkey mode (in this case only temporarily as I later set it to a valid +number) but since I have also requested monkey mode that won’t matter. Then I +set the string to test and then set a valid mutation rate of 5. Now note +that it is actually set to 5 but also note that monkey mode remains active: it +also took a lot longer to come to a conclusion for even four characters. This +example does demonstrate one other thing in a subtle way though.

    + +

    When the program prints out each iteration (I’ll give an example next) it goes a +lot slower; this makes sense because it’s an expensive operation. Here are the +times for the same but without quiet output enabled:

    + +
        real    0m17.065s
    +    user    0m1.245s
    +    sys     0m2.402s
    +
    + +

    Whereas with quiet output:

    + +
        real    0m0.127s
    +    user    0m0.125s
    +    sys     0m0.001s
    +
    + +

    Of course it isn’t only down to the printing but the point is it slows it down +significantly. Adding an option to print every X lines would go over the limit +(iocccsize -i reports 2052!).

    + +

    Finally I’ll show a default example in normal output (I omit many lines showing +instead […]). Note that the real/user/sys times are from the time +bash shell built-in utility: that isn’t output from my entry.

    + +
        target 'METHINKS IT IS LIKE A WEASEL'
    +    mutation rate 1
    +    Generation    0 Offspring  1: 4V YGY.GH/}_|>Q1M.R8;KD[=(05
    +    Generation    0 Offspring  2: Y_^S0_HZ399^/|9,MP%^{817"XX#
    +    Generation    0 Offspring  3: F%88H1&[V1P>QOI}- U]0[V-Y%*[
    +    [...]
    +    Generation    1 Offspring 23: AHA#.\=ZT'0>?~-S.;1A L|1<S:^ -> AHA#.\=ZT'0>?~-S.;1A L|1<S:| (mutation)
    +    Generation    1 Offspring 24: AHA#.\=ZT'0>?~-S.;1A L|1<S:^ -> AHA#.\=ZT'0>?~-S.;1A L|1<S:^ (mutation)
    +    Generation    1 Offspring 25: AHA#.\=ZT'0>?~-S.;1A L|1<S:^ -> AHA#1\=ZT'0>?~-S.;1A L|1<S:^ (mutation)
    +    **
    +    Generation    2 Offspring  1: AHA#.\=ZT'0>?~-S.;1A L|1<S:^ -> AHA#.\=ZT'0>?~-S.;1A L|1<S:^ (mutation)
    +    Generation    2 Offspring  2: AHA#.\=ZT'0>?~-S.;1A L|1<S:^ -> AHA#.\=ZT'O>?~-S.;1A L|1<S:^ (mutation)
    +    [...]
    +    Generation  979 Offspring  1: METHINKS ITZIS LIKE A WEASEL -> METHINKS IT IS LIKE A WEASEL (mutation)
    +    [...]
    +    **
    +    Generation  979 Offspring  1: METHINKS IT IS LIKE A WEASEL
    +
    +    real    0m0.074s
    +    user    0m0.040s
    +    sys     0m0.001s
    +
    + +

    Keep in mind the way I display the generations and the fact that generation 0 +has no parents; it is generation 1 that starts working towards the goal. You’ll +see also (mutation) at the end of the line at this point (if you enable +monkey mode you’ll find that it shows something else). The lines that only have +** are separators: you won’t see this between generation 0 and 1 but you will +between future generations - as well as the final answer (if the answer is in +generation 0 you won’t see the **).

    + +

    +One final thing to consider is that the program doesn’t directly read from a +file. This combined with the way the shell works could possibly confuse some +people. Take the following invocations:

    + +
        (1) $ echo test > test
    +    (2) $ ./weasel test
    +    (3) $ ./weasel < test
    +    (4) $ cat test | ./weasel 
    +    (5) $ < test-strings.txt ./weasel
    +    (6) $ cat | ./weasel
    +
    + +

    Only the first invocation of ./weasel will search for TEST because +the string test was explicitly passed to the program (If the file test +wasn’t found by that path it would still have searched for TEST).

    + +

    The second invocation will search for the default string if there is a file or +directory called test; else you will get an error about no such file or +directory (unless your shell for some reason doesn’t consider it an error; bash +most certainly does consider it an error and halts).

    + +

    The third invocation would if there exists a file test cat that file and +pipe the output to ./weasel; however it will search for the default +string. If there is no such file to cat then an error will be reported but +without quiet mode you’d probably not even see the error.

    + +

    The fourth invocation will also search for the default string unless the file +doesn’t exist in which case you’d get an error like in the second invocation.

    + +

    The fifth invocation will actually search for the default string even with the +file test-strings.txt existing. As far as I am aware it’s equivalent to the +third invocation except that the file exists in this case.

    + +

    The final invocation will search for the default and then read from stdin; +it won’t do anything with it however.

    + +

    What this amounts to is if you want input from a file you have to read from the +file and pass each string to the program itself. I’ve included a script +test.sh and a file of sample input test-strings.txt that you can play +with.

    + +

    Try:

    + +
        $ make test
    +
    + +

    This will essentially make sure the program is compiled and then do:

    + +
        $ chmod +x test.sh
    +    $ ./test.sh
    +
    + +

    The script will first try compiling the program (if necessary) and if it fails +for any reason it will exit; else it will read each line in the file +test-strings.txt (if the file doesn’t exist or can’t be read the script will +exit with return status of 1) and pass it to the program. After finding the +string it’ll sleep approximately 2 seconds and then read the next string +(passing it to the program, continuing until all the strings have been read and +processed).

    + +

    You can pass additional options directly to the script but remember that it +stops when there are no more strings in the file - so if you try:

    + +
        $ ./test.sh -q test
    +
    + +

    The final string test won’t be searched for; it will however run the program +in all invocations with quiet output enabled. The following are some notes about +how the shell and the program interact with each other:

    + +

    Because the script quotes the strings that it reads from the file if you were to +put in the file: -q STRING quiet mode would be enabled; however the +default string would be searched for. If the quotes were removed from the script +it would print the final word specified. To be specific with the quotes: if in +the file you had the line -q STRING -m TEST it would enable quiet output +and monkey typewriter mode; but it would search for the default string. Without +the quotes on the other hand it would enable quiet output, monkey typewriter and +search for TEST. In other words if you want to pass options to the +script you will have to directly pass the options to the script like the above +example shows (but the strings will still only be read from the +test-strings.txt file).

    + +

    Input Error Example

    + +

    Skip to Obfuscation.

    + +

    There is a type of input error, as I said, that might appear to be a bug. What +actually is going on though is due to a technicality on how spaces are printed +and the fact the program does not accept spaces other than a literal space +; when a character in the string to be found isn’t in the keyboard the +program prints an error message and then exits (returning 1). But since the +keyboard doesn’t have '\n' if you were to type a ' and send a +'\n' before the closing ' you might see something like:

    + +
        $ ./weasel '!!
    +    > '
    +
    +    '
    +    ' not in keyboard " !"#$<%:>&'()*+,-./0123456789;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`{|}~"
    +
    + +

    I showed that ' is in the keyboard already; however the user sent a +\n (hence the secondary prompt > on line two) before literally typing the +closing ' (also line two). But in order to make it clear what character is invalid I +surround the character with 's so what you actually see after typing the +closing ' and hitting Enter (or however you send the '\n') there is +the third blank line; but then the program prints ' followed by the +invalid character ('\n' itself which means another line break) and then +finally the closing '. Specifically isspace() characters aren’t +distinctly seen like a letter, digit or symbol is: isprint('\n') == 0 && +isspace('\n') == 1. You can add these characters but the output will be +rather confusing and hard to read.

    + +

    4. Obfuscation

    + +

    Techniques

    + +

    Skip to Beauty.

    + +

    The following might be some of the techniques used in this entry:

    + +
      +
    1. Helpful and descriptive names for all variables and constants (like S) +as well as some C keywords.

    2. +
    3. The way main() is declared is:

      + +
      /* Special C main() handler (encapsulation): */
      +#define r(main) main
      +r(k main(k a, E **V)) {
      +
      + +

      It appears to be recursively defined but is it? And is it truly +encapsulation? And is it executing code of any kind? It mightn’t seem like it +isn’t encapsulation and also isn’t executing code but assuming it’s +encapsulation and executing code is it actually nothing? And if it’s nothing why +is it there? If it is something what is it doing? Could it be both? Or maybe it +really isn’t nothing or nothing? :)

    4. +
    5. A special C parser called H(). It might help to observe that there +might be recursive calls and much of the program might use it. Or so it seems. +Then again it might not help to not notice it.

    6. +
    7. Digraphs. In their simplest form it’s probably not a big deal but consider: +some source code formatters don’t like them at all (neither, incidentally, does +splint, which completely baulks). There also is a trick; if you try +translating them then depending upon how you do it there can be functional +changes in the program!

    8. +
    9. The fact the program can by default print the primorial prime of 97 (but that +default isn’t the default - except when it IS the default!) and yet that number +isn’t seen at all. See also technique #7.

    10. +
    11. Another usual suspect: the source is formatted in a beautiful design that +could be described artistic; on the other hand some might suggest it’s just a +blob of octets but I disprove this when discussing beauty later on in the next +section.

    12. +
    13. The string METHINKS IT IS LIKE A WEASEL is searched for by default +(except when it’s not searched by default) but it’s nowhere to be found in the +source file in that form. Why? Because anyone familiar with the Weasel program +won’t recognise the string and put together what it is by looking at the source +code.

    14. +
    + + +

    In case you wondered deciphering #5 won’t decipher #7 (neither will deciphering +#7 help you decipher #5).

    + +

    Beauty

    + +

    Skip to How to build.

    + +

    On the subject of beauty: the judges stated in the guidelines the following:

    + +

    We want to get away from source that is simply a compact blob of +octets. Really try to be more creative than blob coding. HINT!

    + +

    And if you’ll notice that although it might look like a compact blob of octets +at first glance if you look throughout the file you’ll see two statements to +set your thinking straight:

    + +

    NO BLOB CODING

    + +

    THIS IS NOT A COMPACT BLOB OF OCTETS

    + +

    So you see even if your eyes are trying to deceive you they’re quite wrong. Yes +some of it might look like a blob but this is clearly false; as all good +programmers know if something is potentially confusing or misleading it should +be made clear in the comments! :)

    + +

    5. How to build

    + +

    S and N Constants

    + +

    Skip to Compilation.

    + +

    These two #defined constants can be redefined at compilation to modify the +behaviour of the program in a number of ways (see the +Compilation subsection for example invocations). Both are +capped to be no greater than SIZE_MAX - 1. This is handled by the C +preprocessor.

    + +

    S

    + +

    This determines the maximum size of the target string but it must be at least +38; this is because 38 >= 29 and because strlen("METHINKS IT IS LIKE +A WEASEL") == 28 (which is the default target string - it would hardly be an +implementation of the Weasel program otherwise).

    + +

    There is obviously a reason 38 is the chosen size but the only hints I +provide are those in How it works and specifically an Easter egg I +referenced there (it’s not the only Easter egg but it’s the only Easter egg I +won’t spoil; yes this ironically and amusingly means I’ve left a rotten egg +somewhere!).

    + +

    N

    + +

    This is the number of offspring per generation. Anything less than 4 will be set +to 3 (that’s not a typo!) and this is part of an Easter egg.

    + +

    Be aware that depending on the size of S and N (individually and +together) the program will use varying amounts of memory and the larger the +values the more memory it’ll require.

    + +

    Compilation

    + +

    Skip to Portability.

    + +

    The following options must always be passed to the compiler:

    + +
        -DQ='typedef' -D'g(o)'='goto o;' -D'w(x)'="x:" -D'H(main)'='r(main)'
    +
    + +

    If you want to increase the number of offspring to 50 and the size of the +chromosome to 75 you would pass to the compiler:

    + +
        -DQ='typedef' -D'g(o)'='goto o;' -D'w(x)'="x:" -D'H(main)'='r(main)' -DN=50 -DS=75
    +
    + +

    If you wanted to change N to 3:

    + +
        -DQ='typedef' -D'g(o)'='goto o;' -D'w(x)'="x:" -D'H(main)'='r(main)' -DN=3
    +
    + +

    Remember that it cannot be less than 3; more correctly if it’s less than +4 it’s redefined to 3 so you could have passed in -DN=2 and have the same +result. Remember too that S cannot be less than 38. Both S and +N are capped at SIZE_MAX - 1.

    + +

    Portability

    + +

    Skip to An aside on bugs.

    + +

    The entry works for both C99 and C11 (it requires at least C99 even if you +translate digraphs). The program doesn’t require third-party libraries and +should work on any Unix based system. It works on both 64-bit and 32-bit (but +inevitably some data type sizes will be smaller and this I believe includes +SIZE_MAX). I don’t think Windows gcc ports would have many issues (if any) +either but I have no way to test this. I have tested the following systems and +configurations:

    + +
        Fedora 26:
    +
    +    $ clang --version|head -n1
    +    clang version 4.0.1 (tags/RELEASE_401/final)
    +    $ gcc --version|head -n1
    +    gcc (GCC) 7.3.1 20180130 (Red Hat 7.3.1-2)
    +    $ /lib64/libc-2.25.so |head -n1|cut -d',' -f1-1
    +    GNU C Library (GNU libc) stable release version 2.25
    +    $ lscpu |grep Endian
    +    Byte Order:          Little Endian
    +
    +
    +    CentOS Linux release 7.4.1708 (Core)
    +
    +    $ clang --version|head -n1
    +    clang version 3.4.2 (tags/RELEASE_34/dot2-final)
    +    $ gcc --version|head -n1
    +    gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)
    +    $ /lib64/libc-2.17.so |head -n1 |cut -d, -f1-1
    +    GNU C Library (GNU libc) stable release version 2.17
    +    $ lscpu |grep Endian
    +    Byte Order:            Little Endian
    +
    +
    +    Fedora 27:
    +
    +    $ clang --version|head -n1
    +    clang version 5.0.1 (tags/RELEASE_501/final)
    +    $ gcc --version|head -n1
    +    gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)
    +    $ /lib64/libc-2.26.so |head -n1|cut -d, -f1-1
    +    GNU C Library (GNU libc) stable release version 2.26
    +    $ lscpu |grep Endian
    +    Byte Order:          Little Endian
    +
    +
    +    macOS:
    +
    +    System Version: macOS 10.13.4 (17E199)
    +    Kernel Version: Darwin 17.5.0
    +    $ gcc -v
    +    Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
    +    Apple LLVM version 9.1.0 (clang-902.0.39.1)
    +    Target: x86_64-apple-darwin17.5.0
    +    Thread model: posix
    +    InstalledDir: /Library/Developer/CommandLineTools/usr/bin
    +    $ uname -srmv
    +    Darwin 17.5.0 Darwin Kernel Version 17.5.0: Mon Mar  5 22:24:32 PST 2018; root:xnu-4570.51.1~1/RELEASE_X86_64 x86_64
    +
    + +

    An aside

    + +

    Skip to Installing.

    + +

    Any undocumented bugs are the result of insolent monkeys tampering with any +number of things. That includes but is not limited to running the program on a +non-ASCII system; non little-endian; meddling with S or N too much, +changing the references to SIZE_MAX to be larger than SIZE_MAX or a +signed value (size_t is unsigned) or too small of a value; changing data +types or variables; expecting really long strings - including but not limited to +the complete works of Shakespeare (hint: isprint('\n') == 0 so it won’t +ever find any string with '\n') - to be found by the program in a quick +and easy fashion if ever; or any other meddling including being petulant and/or +unreasonable monkeys. I will say though that there is at least one place I see +after having won that could be slightly more efficient (can you find it?); I am +however leaving it as it is because this is what won.

    + +

    Installing

    + +

    Skip to Final thoughts.

    + +

    I have included a RPM spec file for those with a Red Hat based Linux +distribution; see rpm.markdown for details (including why I implemented +this) if for some (strange?) reason you’re interested.

    + +

    6. Final thoughts

    + +

    Skip to Winning comments.

    + +

    The judges suggested that making them laugh helps entries chance of winning. +Well laughter helps everything so in case you haven’t seen - and even if you +have seen - Dennis Ritchie’s anti-foreword to the ghastly UNIX-HATERS +Handbook or Ken Thompson’s revelation that C and Unix are a hoax (at the end of +that book) I include it below; because I agree that looking at a lot of twisted +code must be quite difficult (though maybe not as much as if you were to have to +look at Microsoft Windows code or code for Windows in any case ? :)) and these +two things I think are rather amusing (in order of least to most):

    + +

    Dennis Ritchie’s Anti-Foreword:

    + +

    Anti-Foreword

    + +

    By Dennis Ritchie +From: dmr@plan9.research.att.com +Date: Tue, 15 Mar 1994 00:38:07 EST +Subject: anti-foreword

    + +

    To the contributers to this book:

    + +

    I have succumbed to the temptation you offered in your preface: I do write you +off as envious malcontents and romantic keepers of memories. The systems you +remember so fondly (TOPS-20, ITS, Multics, Lisp Machine, Cedar/Mesa, the Dorado) +are not just out to pasture, they are fertilizing it from below.

    + +

    Your judgments are not keen, they are intoxicated by metaphor. In the Preface +you suffer first from heat, lice, and malnourishment, then become prisoners in +a Gulag. In Chapter 1 you are in turn infected by a virus, racked by drug +addiction, and addled by puffiness of the genome.

    + +

    Yet your prison without coherent design continues to imprison you. How can +this be, if it has no strong places? The rational prisoner exploits the weak +places, creates order from chaos: instead, collectives like the FSF vindicate +their jailers by building cells almost compatible with the existing ones, albeit +with more features. The journalist with three undergraduate degrees from MIT, +the researcher at Microsoft, and the senior scientist at Apple might volunteer a +few words about the regulations of the prisons to which they have been +transferred.

    + +

    Your sense of the possible is in no sense pure: sometimes you want the same +thing you have, but wish you had done it yourselves; other times you want +something different, but can’t seem to get people to use it; sometimes one +wonders why you just don’t shut up and tell people to buy a PC with Windows or a +Mac. No Gulag or lice, just a future whose intellectual tone and interaction +style is set by Sonic the Hedgehog. You claim to seek progress, but you succeed +mainly in whining.

    + +

    Here is my metaphor: your book is a pudding stuffed with apposite +observations, many well-conceived. Like excrement, it contains enough undigested +nuggets of nutrition to sustain life for some. But it is not a tasty pie: it +reeks too much of contempt and of envy.

    + +

    Bon appetit!

    + +

    Yes he misspelt ‘contributors’! But then again we’re talking about obfuscation +and since it doesn’t break his message it’s not broken - it’s just obfuscated +albeit not very much (and it still ‘compiles’!); and isn’t that what this +contest is about? :)

    + +

    Ken Thompson’s ending:

    + +

    Creators Admit C, Unix Were Hoax

    + +

    FOR IMMEDIATE RELEASE

    + +

    In an announcement that has stunned the computer industry, Ken Thompson, +Dennis Ritchie, and Brian Kernighan admitted that the Unix operating system and +C programming language created by them is an elaborate April Fools prank kept +alive for more than 20 years. Speaking at the recent UnixWorld Software +Development Forum, Thompson revealed the following:

    + +

    “In 1969, AT&T had just terminated their work with the GE/AT&T Multics +project. Brian and I had just started working with an early release of Pascal +from Professor Nichlaus Wirth’s ETH labs in Switzerland, and we were impressed +with its elegant simplicity and power. Dennis had just finished reading Bored of +the Rings, a hilarious National Lampoon parody of the great Tolkien Lord of the +Rings trilogy. As a lark, we decided to do parodies of the Multics environment +and Pascal. Dennis and I were responsible for the operating environment. We +looked at Multics and designed the new system to be as complex and cryptic as +possible to maximize casual users' frustration levels, calling it Unix as a +parody of Multics, as well as other more risque allusions.

    + +

    “Then Dennis and Brian worked on a truly warped version of Pascal, called "A.” +When we found others were actually trying to programs with A, we quickly added +additional cryptic features and evolved into B, BCPL, and finally C. We stopped +when we got a clean compile on the following syntax:

    + +
        for(;P("\n"),R=;P("|"))for(e=C;e=P("_"+(*u++/
    +    8)%2))P("|"+(*u/4)%2);
    +
    + +

    “To think that modern programmers would try to use a language that allowed +such a statement was beyond our comprehension! We actually thought of selling +this to the Soviets to set their computer science progress back 20 or more +years. Imagine our surprise when AT&T and other U.S. corporations actually began +trying to use Unix and C! It has taken them 20 years to develop enough +expertise to generate even marginally useful applications using this 1960s +technological parody, but we are impressed with the tenacity (if not common +sense) of the general Unix and C programmer.

    + +

    “In any event, Brian, Dennis, and I have been working exclusively in Lisp on +the Apple Macintosh for the past few years and feel really guilty about the +chaos, confusion, and truly bad programming that has resulted from our silly +prank so long ago.”

    + +

    Major Unix and C vendors and customers, including AT&T, Microsoft, +Hewlett-Packard, GTE, NCR, and DEC have refused comment at this time. Borland +International, a leading vendor of Pascal and C tools, including the popular +Turbo Pascal, Turbo C, and Turbo C++, stated they had suspected this for a +number of years and would continue to enhance their Pascal products and halt +further efforts to develop C. An IBM spokesman broke into uncontrolled laughter +and had to postpone a hastily convened news conference concerning the fate of +the RS/6000, merely stating “Workplace OS will be available Real Soon Now.” In a +cryptic statement, Professor Wirth of the ETH Institute and father of the +Pascal, Modula 2, and Oberon structured languages, merely stated that P. T. +Barnum was correct.

    + +

    So is it a hoax about a non-hoax, a non-hoax about a hoax, a non-hoax about a +non-hoax or is it a hoax about a hoax ? :) And if it’s any of those what does it +mean about Unix and C? And if a hoax is involved what is the hoax? The pedant +and Tolkienist that I am has to state that Tolkien didn’t consider The Lord of +the Rings a trilogy (and he made that very clear) but that doesn’t take away +from the humour by any stretch (if anyone wants me to elaborate or debate the +matter do send me an email - I love Tolkien’s legendarium and having another +person to talk about it with is more than welcome!). Ken suggested that there +is a lack of common sense but since he was part of its creation I don’t think +it’s a bad thing; on the contrary it makes all of us C programmers even more +talented! :) I do wonder if he tested that bit of C code though:

    + +
        for(;P("\n"),R=;P("|"))for(e=C;e=P("_"+(*u++/
    +    8)%2))P("|"+(*u/4)%2);
    +
    + +

    How is R=; valid? Since I don’t have the context maybe there is something +I’m missing but either way it’s a funny piece. It could also be for irony itself +(actually I had previously thought of somehow implementing something like that +for the contest but decided for the message by itself in the end). I would +prefer believing that whether true or not.

    + +

    7. Winning comments, thanks, dedications, links, etc.

    + +

    I feel incredibly honoured, privileged and I am extremely happy and proud to +have won! I am more proud and happy about this than anything I have ever done in +my life and I don’t think there can be anything else I can be more proud of in +the future (except winning again should I find or think of another interesting +thing to try and implement in an obfuscated way). Because winning is one thing; +but to be included amongst very clever and talented veterans whom I highly +respect is an incredible badge of honour that I will proudly wear (literally too +as I hope to get my entry on a shirt) for the rest of my life. This type of +badge is something I feel most only dream of but never come close to earning. +That I did is by far the best feeling I can think of.

    + +

    Thank you Simon Cooper, Landon Curt Noll and Leonid A. Broukhis, and thank you +to everyone who has been an important and special part of my life. I want to +specially name some:

    + +

    I dedicated this program to my beloved but recently late dog Venus; instead of +drowning in grief I channelled it to creativity. And to have won a contest +requiring creativity, cleverness and novelty is a tribute to an equally +creative, clever and unique dog that she was. I miss you terribly Venus but I’m +so happy to have had you in my life.

    + +

    But I want to also dedicate it to (and thank) my dear friend Martijn Schoemaker +whom provided me with the spark a very long time ago (and whom has stood by me +and helped me in more ways than he can know - #including C); if it wasn’t +for you Martijn I wouldn’t have been able to win so consider this a recursive +thank you thank you! :) I would also like to give thanks and much love to my +best and closest friend Vicky Wilmore who means the absolute world to me; thank +you for being such a wonderfully beautiful person and friend - that truly is +what ‘just you’ means, sweetheart, and don’t you forget it! <3 Finally I would +like to thank my mother for being the best mum anyone could ask for, who’s +always been here for me and whom I also inherit the keen analytical mind from. I +love you all!

    + +

    I want to also thank Dave Burton for acknowledging me in his hint.markdown file +for as he put it ‘being relentless with pursuit of bugs’. To think that it was +circumstantial to my entry too makes it all the more unlikely but that doesn’t +take away the significance of it; for I am a very symbolic person and being +acknowledged for this type of thing is great but to be acknowledged for it by +someone who has won more than once is even more special to me: thank you Dave! +It means a great deal to me and I am glad I could help! :)

    + +

    I would also like to say to the judges about their commentary as well as the +category title: they’re all very dear to me and that includes not just the +remarks but the example invocations. They fit my views precisely. As for the +test-strings.txt file modifications: very amusing and I certainly do not object. +Thank you again for such an honour and privilege! That this isn’t a dream is the +best reality imaginable! :)

    + +

    Congratulations to one and all for winning; it’s an honour to win such a +wonderful contest requiring creativity, cleverness, uniqueness and +inventiveness but to win beside all the other wonderful entries is truly +special!

    + +

    Shortly after the entry has been published I will have more information on the +winning entry at https://ioccc.xexyl.net/2018/weasel including how to +contact me (besides what’s already published on the IOCCC website). There also +is an errata page so that in the case I find anything I would like to +correct in the documentation or other supplementary files I can note them there.

    + +

    If you wish to contact me please do so; although I have a Twitter account I don’t +really use it so please send me an email instead. I do have Facebook as of a +little under two years but I’ll worry about that at such a time (I presume in +fact ‘if’) it becomes relevant.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2018, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2018/ferguson/hint.text b/2018/ferguson/hint.text new file mode 100644 index 000000000..a468d7fa4 --- /dev/null +++ b/2018/ferguson/hint.text @@ -0,0 +1,1167 @@ +# Best use of weasel words + +Cody Boone Ferguson + +Twitter: @xexyl + + +## Judges' comments: +### To use: + + make + + ./weasel + +### Try: + + ./weasel words + ./weasel -mq words + ./weasel -q -r8 'EVOLUTION IS A PROVEN FACT' + ./weasel -m 'INTELLIGENT DESIGN' + + make test + +### Selected Judges Remarks: + +Looking back over the strata of past IOCCC entries, this program marks a new +mutation on our understanding of sequencing of code. In adaptation of the +modern scientific that the C language has evolved, this mutant of a program +may stress your understanding of taxonomy of the C syntax tree. + +The phenotype of the source suggests a veritable sea of primordial ASCII soup. +The encoded logic of the watchmaker suggests a variation of thought experiment +formulated by Richard Dawkins: but without the need for feeding too many +evolutionary relatives of the primate order in which us Homo sapiens hang +from the phylogenetic tree of life. + +If you wish your computer to maintain one branch in the Cretaceous C code era, +while using more Cenozoic minded code migration, read rpm.markdown. + +If you find yourself in an evolutionary dead end, try: + + man ./weasel.man + + +## Author's comments: + 0. Preface + 1. What it is + 2. How it works + 3. Hints (Keyboards, Options, Spoilers, Example Invocations) + 4. Obfuscation (Techniques, Beauty) + 5. How to build (S and N Constants, Compilation, Portability, Installing) + 6. Final thoughts + 7. Winning comments, thanks, dedications, links, etc. + +## **0. Preface** + +**SPOILER WARNING: A great deal of this document and the man page is full of +spoilers of different types; as such I would recommend that you try running the +judges suggested invocations as well as running `make test` before you get into +the document or the man page, unless you don't mind any spoilers. I don't reveal +much in the way of obfuscation however so if you just want documentation on the +program, how to compile, etc. then there isn't need to heed this note.** + +I was at a loss on how to present my remarks; on the one hand I wanted to give +everything to the judges so they didn't miss anything. But on the other hand I +didn't want to reveal as much publicly and many people don't like to read long +texts. To resolve this I think the best way is referencing the judges' comments: +if you want a quick rundown of the entry try what they suggest and view the man +page (it explains all the options and describes the program briefly): + + man ./weasel.man + +If that isn't sufficient **I would recommend reading this section** *(and +possibly the next)* where I attempt to give a brief explanation of the sections +to make reading it easier and faster. In addition I want to point out a few +things. *If you want more details read this document more thoroughly (or just +the sections that seem relevant to what you're after).* The [FILES][] file is a +quick list of files and respective summaries in this entry. Because several +sections are quite long I have added a skip to link to skip to the next +subsection or section at the beginning of each section (and subsection). + +**[What it is](#what):** This is a brief summary of the program; the man page is +more thorough than this. + +**[How it works](#how):** Explain some of the basic concepts and terms of the +program; if you're familiar with genetic algorithms there won't be any problem +following this section but it might be of some value to read anyway. There is a +randomised mode that doesn't use a genetic algorithm; it can be triggered a +number of ways but the **`-m`** option enables it specially (I discuss this +thoroughly in **[Hints](#hints)**). + +**[Hints](#hints):** Perhaps the longest part of this document because in it I +document the [keyboards](#keyboards), [options](#options), subtleties (including +features that might appear to be bugs but aren't - including an +[input error](#error)), an [Easter egg spoiler](#spoiler) and quite a few +[example invocations](#invocations). If you've read the man page you probably +don't need this unless there is something specific you're after. + +**[Obfuscation](#obfuscation):** Some of the techniques that might not be used. + +**[How to build](#build):** Here I describe briefly +[the constants that can be redefined](#constants) **`S`** and **`N`**: the +maximum size of the chromosome (target string; the maximum length is **`S - 1`** +but it must be >= the default 38) and the number of offspring, respectively. I +also give [example compiler invocations](#compiling), [portability +notes](#portability), an [more portability notes](#bugs) and a [note on +rpm.markdown](#rpm). + +On the subject of **`S`** and **`N`**: As the judges' suggested runs imply you +can change the target string at runtime; **`make test`** runs a script +*`test.sh`* which reads from the file *`test-strings.txt`*, running the program +for each string in the file, waiting approximately two seconds before +continuing. I explain how to pass options to the script in part of +**[Hints](#test)**. + +**[Final thoughts](#thoughts):** You might enjoy what I included; they're +humorous pieces by [Dennis Ritchie](#dmr) and [Ken Thompson](#ken) themselves +from the infamous *UNIX-HATERS Handbook*. + +**[Winning thoughts](#winning):** What it means to me to win as well as some +dedications and thanks. Here too I include a link to a website which will be +dedicated to this entry beyond what will be published on the IOCCC website + +[FILES]: FILES +[rpm.markdown]: rpm.markdown + +## **1. What it is** + +Skip to [How it works](#how). + +It is an implementation of Richard Dawkins' [Weasel program][] (Wikipedia). +According to Wikipedia in chapter three of his book [The Blind Watchmaker][] +Dawkins wrote: + +> I don't know who it was first pointed out that, given enough time, a monkey +> bashing away at random on a typewriter could produce all the works of +> Shakespeare. The operative phrase is, of course, *given enough time.* Let us +> limit the task facing our monkey somewhat. Suppose that he has to produce, not +> the complete works of Shakespeare but just the short sentence 'Methinks it is +> like a weasel', and we shall make it relatively easy by giving him a typewriter +> with a restricted keyboard, one with just the 26 (capital) letters, and a space +> bar. How long will he take to write this one little sentence? + +He refers to the [Infinite Monkey Theorem][] (Wikipedia). As he points out the +operative phrase is *given enough time*; but even if it's extremely unlikely +*technically the probability is greater than 0*. He simplified it for the +monkey; I thought the monkey had it too easy: unlike his limited keyboard I have +(besides space) every character in the ASCII range **`0<=126`** that +**`isprint()`** returns non-zero except that only capital letters are included; +the file *`prog-simple.c`* has a slightly smaller keyboard. There are some +additional features I have added (including two Easter eggs); amongst others: +ability to change the target string and maximum length. See +**[How it works](#how)**, **[Hints](#hints)** and **[How to build](#build)** for +more details. + +In its simplest invocation this program will work its way (using a genetic +algorithm) towards the solution of the string **`METHINKS IT IS LIKE A WEASEL`** +(note that I use **`toupper()`** so it doesn't matter what case the input is the +comparison and output will always be capitalised). + +[Infinite Monkey Theorem]: https://en.wikipedia.org/wiki/Infinite_monkey_theorem +[Weasel program]: https://en.wikipedia.org/wiki/Weasel_program +[The Blind Watchmaker]: https://en.wikipedia.org/wiki/The_Blind_Watchmaker + +## **2. How it works** + +Skip to [Hints](#hints). + +Here you can find a general explanation of a *[genetic algorithm][]* as well as a +brief history. Although the link provides more information (including images to +try and show the way they work) for those interested I will cite the summary: + +> Genetic Algorithms (GAs) are adaptive heuristic search algorithm based on the +> evolutionary ideas of natural selection and genetics. As such they represent an +> intelligent exploitation of a random search used to solve optimization problems. +> Although randomised, GAs are by no means random, instead they exploit historical +> information to direct the search into the region of better performance within +> the search space. The basic techniques of the GAs are designed to simulate +> processes in natural systems necessary for evolution, specially those follow the +> principles first laid down by Charles Darwin of "survival of the fittest.". +> Since in nature, competition among individuals for scanty resources results in +> the fittest individuals dominating over the weaker ones. + +**SPOILER WARNING: Some of the below might help you follow the code more +easily.** + +For each *generation* there is a total of **`N`** *offspring*; generation 0 is +the pseudo-randomly initialised array *without parents.* Each offspring has its +own *chromosome* to be compared to the *target string* and a *fitness score*; +the higher the fitness score the more likely it will be a *parent of the next +generation* (randomised mode notwithstanding) as part of the *selection process* +(As the generations go by the fitness of the offspring should be higher; when +the fitness matches that of the target it will be printed and the loop will be +broken out of). + +After determining the two parents *crossover* occurs: each new offspring +inherits DNA from the parents; every character in the chromosome string is +pseudorandomly selected from one of the parents' respective character. Next, +based on the *mutation rate*, perform *mutation* of the chromosome of each +offspring; in other words *some of the characters in the chromosome will be +assigned a pseudo-random value from the keyboard (in normal mode; in random mode +every character will be assigned a value*). Before mutation the offspring +chromosome will be printed; after mutation it will show what it was mutated to +(on the same output line). After the new generation has been sequenced the loop +goes back to the top and it starts all over until the maximum number of +generations **`SIZE_MAX - 1`** is reached or the target chromosome has been +found. + +Note that the generation is checked *before the scoring takes place* by a prefix +increment equality check; when the generation is **`SIZE_MAX - 1`** the fitness +test loop will not be entered; instead the outer loop will end after printing: + +> Too many attempts, blaming the monkey Eric even if he isn't typing or doesn't exist. Bye. + +Why '*Eric*'? Because the judges stated in the [2018 guidelines][] that when +there is a user input error the program should insult the pet fish Eric even if +such a fish (no, weasels do not equate monkeys to fish but see below) doesn't +exist. The second to last example limitation example note (it's improved in the +final but this is relevant) they give is: + +> The judges might not have a pet fish named Eric, so might want to state: +> +> This entry factors integers between 1 and 2305567963945518424753102147331756070. +> Attempting to factor anything else will cause the program to insult your +> pet fish Eric, or in the case that you lack such a pet, will insult the +> pet that you do not have. + +After the final message they ask: + +> BTW: **What is so special about 2305567963945518424753102147331756070**? You tell us! + +The answer is this: **it is the primorial prime of 97:** the product of all +prime numbers less than or equal to N; **and the primorial prime of `N == 97` is +`2305567963945518424753102147331756070`**. There is no reference to this number +in my entry but it's nonetheless possible to **change the default target to it +without modifying the source code**; there are two hints in this very +paragraph; the first sentence in fact: the answer to the judges' question and +the definition. Can you get the program to search the primorial prime of 97 +without passing in specially? + +**On user errors:** if the generation reaches **`SIZE_MAX - 1`** I consider it a +user (or monkey) error; if the user insists on being so petulant as to try such +a ridiculous set of parameters in an attempt to make it be no more successful +than a monkey typing *then it shouldn't be any more successful than a monkey; if +it by chance reaches the target it's because a monkey could too!* Either way +unless the number reaches **`SIZE_MAX - 1`** the monkey Eric won't be blamed. It +should be noted that depending on the parameters (size of chromosome, number of +offspring, the string itself) the program could take quite a lot of system +resources; and whether the OS kills it, Eric the monkey falls asleep or the +typewriter is taken from him the result could very well be not found without +blaming him. Of course the judges were talking about fish not monkeys. But since +this program is inspired by the Weasel program *which was inspired by the +[Infinite Monkey Theorem][]* I opted instead to target the monkey Eric even if +such a monkey isn't typing or even doesn't exist (because it's not the *Infinite +Fish Theorem*). So although the user might not be a monkey the program makes the +assumption that **the user could in fact be a monkey called Eric** *although it +isn't insolent enough to say the user is a monkey for certain!* + +[genetic algorithm]: http://www.doc.ic.ac.uk/~nd/surprise_96/journal/vol1/hmw/article1.html +[2018 guidelines]: http://ioccc.org/2018/guidelines.txt + + +## **3. Hints** + +Skip to [Obfuscation](#obfuscation). + +I noted that there are a number of additional features and here I will document +some of them. + +### Keyboards + +Skip to [Options](#options). + +The keyboard, as noted, has more than just the alphabet and space. To be +precise the following characters are acceptable; it equates to this in C (note +it includes a literal space **`' '`** but it doesn't include other +**`isspace()`** characters) and this is why some of the characters are escaped: + + const char keyboard[]=" !\"#$<%:>&'()*+,-./0123456789;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`{|}~"; + +The simpler keyboard looks like: + + const char keyboard[]=" !\"&'(),.0123456789;?ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + +The program makes sure that the target string only has characters the keyboard +can actually produce but there is a certain type of input error that might +*appear* to be a bug; see specifically [Input Error Example](#error). + + +### Options + +Skip to [Spoilers](#spoiler). + +There are a number of options you can pass to the program besides the target +string; some I will document here (the summary being in the man page). You can +join options but there is a caveat with spaces and **`-r`** option as well as +the target string (see below). + +**Enable quiet output:** + + -q + + +This means don't print the generation and offspring output; only print (some) of +the options set (this is always done but wouldn't usually be seen due to verbose +output) and the final answer. + +**Change the mutation rate to ``:** + + -r + +Please note that there cannot be a space between the **`-r`** and the number. +This is to simplify the parsing of options. As for combining options you can do +any of the following (amongst others): + + -r5q + -qr5 + -qr + -q -r5 + +The third invocation will set quiet output and have no valid value to parse for +the mutation rate and **`strtol()`** in this case returns 0. **`strtol()`** can +legitimately return 0 but in no instance is it valid input in this program: the +valid mutation rate is **`>= 1 && <= 100`**. + +When the mutation rate is out of range it does something interesting: take a +look at the output and compare it to the output when the range is valid. Can you +figure out another way to trigger this? In fact there are two more ways (one is +an option I've mentioned and the other one is to do with the number of +offspring)! If you want something of a walk through I suggest you follow the +following: + +1. Enable quiet mode and set an invalid mutation range; for example specify: + + -qr101 + +2. Take a look at the first few lines. Kill the program and try invoking it +with the following options: + + + -qr5 + +3. Look at the first few lines again and compare it to the output of step \#1. +With the default string most modern systems shouldn't take much time to - given +decent parameters - come to an answer here but if necessary kill the program. + +4. Repeat the steps only this time don't enable quiet mode. Look at the +offspring output. If you still don't see what it is and want to know see +**[Spoilers](#spoiler)** below. + +Finally any argument that doesn't start with a **`-`** passed into the program +will become the target string. The same rule applies to the number for **`-r`**: +it must be a single parameter which means you'll need to quote the string if it +has more than one word (that is it contains spaces) or anything else interpreted +specially by your shell e.g. parentheses. For instance if you just want to find +**`METHINKS`** you could do one of: + + + $ ./weasel METHINKS + $ ./weasel "METHINKS" + $ ./weasel 'METHINKS' + +If you wanted **`YOU ARE A MONKEY`**: + + $ ./weasel "YOU ARE A MONKEY" + $ ./weasel 'YOU ARE A MONKEY' + +If you do one of: + + $ ./weasel "METHINKS IT IS A" "MONKEY" + $ ./weasel METHINKS IT IS A MONKEY + +It will search for **`MONKEY`** in both cases; in other words it's the last one. +If the string is too long given the value of **`S`** (see +**[How to build](#build)**) it will be truncated. + +If you actually do want to search for a string starting with a **`-`** you must +disable further parsing of options by using the **`-`** option itself; for +example if you were to do any of: + + $ ./weasel -q- -- -test + $ ./weasel -q- -test + $ ./weasel -q -- -test + +The target string will be: **`-TEST`**. This means though that here: + + $ ./weasel -q -- -test -r5 + +The string to be searched would actually be **`-r5`** and the mutation rate +will remain the default because after the **`-`** option is seen it will no +longer parse additional options: only target strings if anything left on the +command line. Because of the joining of arguments this means that the first two +examples of the last set of three above are equivalent i.e. the following two +are equivalent: + + -q- + -q -- + +As for the caveat I referenced what does the following do? + + $ ./weasel -qr 5 + +In fact it will set quiet output and set the target string to be '5'. So the +mutation rate will be out of range, thus enabling that Easter egg, but it will +likely come to an answer fairly quickly because it's just a single character. A +note on the parsing of the **`-`** option; if the program is currently parsing +**`argv[N]`**, for example, and it encounters a **`--`** then depending on where +the other options are in the command line it might still parse the options. Thus +you have: + + $ ./weasel -qr-r5 + quiet output + mutation rate out of range + target 'METHINKS IT IS LIKE A WEASEL' + mutation rate 5 + Generation 440 Offspring 20: METHINKS IT IS LIKE A WEASEL + +Similarly this would set quiet output, then an invalid mutation rate and then a +mutation rate of 5: + + $ ./weasel --qrr5 + + +If you were instead to do one of (for example): + + $ ./weasel -q -- -r + $ ./weasel -q -q- -r + +Then it *would* set quiet output then see the **`--`** (the **`-`** option +itself) and then the target string would *literally* be set to **`-r`** because +it no longer cares about the **`-`** for option parsing. In other words options +are only parsed if the first character is **`-`** and if the parser hasn't seen +the **`-`** - *in an earlier element of `argv`. This is not a bug!* + + +### Spoilers + +Skip to [Example Invocations](#invocations). + +The Easter egg: Since Dawkins references the [Infinite Monkey Theorem][] it +simulates a monkey using a typewriter! This mode has the following changes: + +Selection is omitted; this means no sorting by fitness score (*each offspring +is initially set to be the first two in the list*) but do pseudo-randomly +select characters for every character in the target string; that is to say if +the string is of length 28 (the default) then all 28 characters in each +offspring of each generation will be assigned a pseudo-randomly positioned +character in the keyboard. If you want to enable this specially you can use the +**`-m`** option (*-m for monkey*). + +### Example Invocations + +Skip to [Input Error Example](#error). + +The following examples are used to demonstrate better the command line parsing. +In order to do that though I had to first document the **`-m`** option because +if the mutation rate is out of range monkey mode is activated (that's the first +Easter egg). But what happens if you later set a valid mutation rate? Should +monkey mode be disabled? If yes how do we know if monkey mode was specially +requested? There are at least two ways to go about it: I took the monkey safe +('fool safe') method; *if you explicitly request monkey mode you cannot disable +it in the same invocation of `weasel`*! + + + $ ./weasel -qr101r5r101r1r test + quiet output + mutation rate out of range + mutation rate out of range + mutation rate out of range + target 'test' + mutation rate 0 + monkey at typewriter + Generation 16844 Offspring 22: TEST + +So in this case I joined the options in the following order: + +1. **`-q`** + +Quiet output. + +2. **`-r101`** + +Mutation rate 101 (out of range). + +3. **`-r5`** + +Mutation rate of 5 but note that during parsing I only print invalid mutation +rate (only after parsing do I print the final mutation rate whatever it ends up +being); so while it appears there is a bug, showing mutation rate out of range +three times, this is expected (given the next one, **`-r101`**). This means here +the typewriter was taken from Eric the monkey. + +4. **`-r101`** + +Mutation rate to 101: this too is out of range (this is the second mutation rate +out of range message). The typewriter returns to Eric. + +5. **`-r1`** + +Set mutation rate to 1. Take that typewriter away! + +6. **`-r`** + +Set mutation rate to 0; when there are no valid characters passed to +**`strtol()`** it should return 0: this is the third message about being out of +range. Note here that **`rand()`** returns an **`int`** and **`strtol()`** +returns a **`long`** but I compare the return value of **`rand()`** to the +mutation rate; if there are any systems where the widths differ this *shouldn't +matter* because of truncation but I do in any case specifically check for **`R < +0 || R > 100`**. Either way the invalid range returns the typewriter to Eric. + +7. **`test`** + +Finally I requested it find the string **`test`** (will search for **`TEST`**). + +Given that it was a short string it did find the answer relatively quickly, even +in monkey mode. + +Another example: + + + $ ./weasel -q -r101 test -r5 + quiet output + mutation rate out of range + target 'test' + mutation rate 5 + Generation 109 Offspring 13: TEST + +In this case I also enabled quiet mode but I didn't join the options; the +**`-r101`** reports that it's out of range and sets monkey mode. I then specify +the target string and then set a valid mutation rate. This disabled monkey mode +which means that it'll use the genetic algorithm. + +One more example of monkey mode: + + + $ ./weasel -q -mr101 test -r5 + quiet output + mutation rate out of range + target 'test' + mutation rate 5 + monkey at typewriter + Generation 465298 Offspring 10: TEST + +Here I also requested quiet output and then *explicitly requested that Eric the +monkey types.* After this I set the mutation rate to be 101 which would have +set monkey mode (*in this case only temporarily as I later set it to a valid +number*) but since I have also requested monkey mode that won't matter. Then I +set the string to **`test`** and then set a valid mutation rate of 5. Now note +that it is actually set to 5 but also note that monkey mode remains active: it +also took a lot longer to come to a conclusion for even four characters. This +example does demonstrate one other thing in a subtle way though. + +When the program prints out each iteration (I'll give an example next) it goes a +lot slower; this makes sense because it's an expensive operation. Here are the +times for the same but without quiet output enabled: + + real 0m17.065s + user 0m1.245s + sys 0m2.402s + +Whereas with quiet output: + + real 0m0.127s + user 0m0.125s + sys 0m0.001s + +Of course it isn't only down to the printing but the point is it slows it down +significantly. Adding an option to print every X lines would go over the limit +(**`iocccsize -i`** reports 2052!). + +Finally I'll show a default example in normal output (I omit many lines showing +instead **[...]**). Note that the real/user/sys times are from the **`time`** +bash shell built-in utility: that isn't output from my entry. + + + target 'METHINKS IT IS LIKE A WEASEL' + mutation rate 1 + Generation 0 Offspring 1: 4V YGY.GH/}_|>Q1M.R8;KD[=(05 + Generation 0 Offspring 2: Y_^S0_HZ399^/|9,MP%^{817"XX# + Generation 0 Offspring 3: F%88H1&[V1P>QOI}- U]0[V-Y%*[ + [...] + Generation 1 Offspring 23: AHA#.\=ZT'0>?~-S.;1A L|1 AHA#.\=ZT'0>?~-S.;1A L|1?~-S.;1A L|1 AHA#.\=ZT'0>?~-S.;1A L|1?~-S.;1A L|1 AHA#1\=ZT'0>?~-S.;1A L|1?~-S.;1A L|1 AHA#.\=ZT'0>?~-S.;1A L|1?~-S.;1A L|1 AHA#.\=ZT'O>?~-S.;1A L|1 METHINKS IT IS LIKE A WEASEL (mutation) + [...] + ** + Generation 979 Offspring 1: METHINKS IT IS LIKE A WEASEL + + real 0m0.074s + user 0m0.040s + sys 0m0.001s + + +Keep in mind the way I display the generations and the fact that generation 0 +has no parents; it is generation 1 that starts working towards the goal. You'll +see also **(mutation)** at the end of the line at this point (if you enable +monkey mode you'll find that it shows something else). The lines that only have +`**` are separators: you won't see this between generation 0 and 1 but you will +between future generations - as well as the final answer (if the answer is in +generation 0 you won't see the `**`). + + +One final thing to consider is that **the program doesn't directly read from a +file**. This combined with the way the shell works could possibly confuse some +people. Take the following invocations: + + (1) $ echo test > test + (2) $ ./weasel test + (3) $ ./weasel < test + (4) $ cat test | ./weasel + (5) $ < test-strings.txt ./weasel + (6) $ cat | ./weasel + +Only the first invocation of **`./weasel`** will search for **`TEST`** because +the string **`test`** was explicitly passed to the program (If the file *`test`* +wasn't found by that path it would still have searched for **`TEST`**). + +The second invocation will search for the default string if there is a file or +directory called *`test`*; else you will get an error about no such file or +directory (unless your shell for some reason doesn't consider it an error; bash +most certainly does consider it an error and halts). + +The third invocation would if there exists a file *`test`* cat that file and +pipe the output to **`./weasel`**; *however it will search for the default +string.* If there is no such file to cat then an error will be reported but +without quiet mode you'd probably not even see the error. + +The fourth invocation will also search for the default string unless the file +doesn't exist in which case you'd get an error like in the second invocation. + +The fifth invocation will actually search for the default string even with the +file *`test-strings.txt`* existing. As far as I am aware it's equivalent to the +third invocation except that the file exists in this case. + +The final invocation will search for the default and then read from *`stdin`*; +it won't do anything with it however. + +What this amounts to is *if you want input from a file you have to read from the +file and pass each string to the program itself*. I've included a script +*`test.sh`* and a file of sample input *`test-strings.txt`* that you can play +with. + + +Try: + + $ make test + +This will essentially make sure the program is compiled and then do: + + $ chmod +x test.sh + $ ./test.sh + + +The script will first try compiling the program (if necessary) and if it fails +for any reason it will exit; else it will read each line in the file +*`test-strings.txt`* (if the file doesn't exist or can't be read the script will +exit with return status of 1) and pass it to the program. After finding the +string it'll sleep approximately 2 seconds and then read the next string +(passing it to the program, continuing until all the strings have been read and +processed). + +You can pass additional options directly to the script but remember that it +stops when there are no more strings in the file - so if you try: + + + $ ./test.sh -q test + + +The final string **`test`** won't be searched for; it will however run the program +in all invocations with quiet output enabled. The following are some notes about +how the shell and the program interact with each other: + +Because the script quotes the strings that it reads from the file if you were to +put in the file: **`-q STRING`** quiet mode would be enabled; however the +default string would be searched for. If the quotes were removed from the script +it would print the final word specified. To be specific with the quotes: if in +the file you had the line **`-q STRING -m TEST`** it would enable quiet output +and monkey typewriter mode; but it would search for the default string. Without +the quotes on the other hand it would enable quiet output, monkey typewriter and +search for **`TEST`**. In other words **if you want to pass options to the +script you will have to directly pass the options to the script** like the above +example shows (but the strings will still only be read from the +*`test-strings.txt`* file). + +### Input Error Example + +Skip to [Obfuscation](#obfuscation). + +There is a type of input error, as I said, that might appear to be a bug. What +actually is going on though is due to a technicality on how spaces are printed +and the fact the program does not accept spaces other than a literal space +**` `**; when a character in the string to be found isn't in the keyboard the +program prints an error message and then exits (returning 1). But since the +keyboard doesn't have **`'\n'`** if you were to type a **`'`** and send a +**`'\n'`** before the closing **`'`** you might see something like: + + + $ ./weasel '!! + > ' + + ' + ' not in keyboard " !"#$<%:>&'()*+,-./0123456789;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`{|}~" + +I showed that **`'`** is in the keyboard already; however the user sent a +**`\n`** (hence the secondary prompt **`>`** on line two) before literally typing the +closing **`'`** (also line two). But in order to make it clear what character is invalid I +surround the character with **`'`**s so what you actually see after typing the +closing **`'`** and hitting Enter (or however you send the **`'\n'`**) there is +the third blank line; *but then the program prints* **`'`** followed by the +invalid character (**`'\n'`** itself which means another line break) and then +finally the closing **`'`**. Specifically **`isspace()` characters aren't +distinctly seen like a letter, digit or symbol is: `isprint('\n') == 0 && +isspace('\n') == 1`**. You can add these characters but the output will be +rather confusing and hard to read. + + +## **4. Obfuscation** + +### Techniques + +Skip to [Beauty](#beauty). + +The following might be some of the techniques used in this entry: + +1. Helpful and descriptive names for all variables and constants (like **`S`**) +as well as some C keywords. + +2. The way **`main()`** is declared is: + + /* Special C main() handler (encapsulation): */ + #define r(main) main + r(k main(k a, E **V)) { + + It appears to be recursively defined but is it? And is it truly +encapsulation? And is it executing code of any kind? It mightn't seem like it +isn't encapsulation and also isn't executing code but assuming it's +encapsulation and executing code is it actually nothing? And if it's nothing why +is it there? If it is something what is it doing? Could it be both? Or maybe it +really isn't nothing or nothing? :) + +3. A special C parser called **`H()`**. It might help to observe that there +might be recursive calls and much of the program might use it. Or so it seems. +Then again it might not help to not notice it. + +4. Digraphs. In their simplest form it's probably not a big deal but consider: +some source code formatters don't like them at all (neither, incidentally, does +**`splint`**, which completely baulks). There also is a trick; if you try +translating them then depending upon how you do it there can be functional +changes in the program! + +5. The fact the program can by default print the primorial prime of 97 (*but that +default isn't the default - except when it IS the default!*) and yet that number +isn't seen at all. See also technique #7. + +6. Another usual suspect: the source is formatted in a beautiful design that +could be described artistic; on the other hand some might suggest it's just a +blob of octets *but I disprove this when discussing beauty later on in the next +section.* + +7. The string **METHINKS IT IS LIKE A WEASEL** is searched for by default +(except when it's not searched by default) but it's nowhere to be found in the +source file in that form. Why? Because anyone familiar with the Weasel program +won't recognise the string and put together what it is by looking at the source +code. + +In case you wondered deciphering #5 won't decipher #7 (neither will deciphering +\#7 help you decipher #5). + + +### Beauty + +Skip to [How to build](#build). + +On the subject of beauty: the judges stated in the guidelines the following: + +> We want to get away from source that is simply **a compact blob of +> octets.** Really try to be more creative than **blob coding.** *HINT!* + +And if you'll notice that although it *might look like a compact blob of octets* +at first glance if you look throughout the file you'll see two statements to +set your thinking straight: + + +> **NO BLOB CODING** + + +> **THIS IS NOT A COMPACT BLOB OF OCTETS** + +So you see even if your eyes are trying to deceive you they're quite wrong. Yes +some of it might look like a blob but this is clearly false; *as all good +programmers know if something is potentially confusing or misleading it should +be made clear in the comments! :)* + + +## **5. How to build** + +### S and N Constants + +Skip to [Compilation](#compiling). + +These two **`#define`**d constants can be redefined at compilation to modify the +behaviour of the program in a number of ways (see the +**[Compilation](#compiling)** subsection for example invocations). Both are +capped to be no greater than **`SIZE_MAX - 1`**. This is handled by the C +preprocessor. + + +**`S`** + +This determines the maximum size of the target string but it **must be at least +38**; this is because **`38 >= 29`** and because **`strlen("METHINKS IT IS LIKE +A WEASEL") == 28`** (which is the default target string - it would hardly be an +implementation of the Weasel program otherwise). + +There is obviously a reason **`38`** is the chosen size but the only hints I +provide are those in **[How it works](#how)** and specifically an Easter egg I +referenced there (it's *not the only Easter egg* but it's the only Easter egg I +won't spoil; yes this ironically and amusingly means I've left a rotten egg +somewhere!). + +**`N`** + +This is the number of offspring per generation. Anything less than 4 will be set +to 3 (that's not a typo!) and this is part of an Easter egg. + +Be aware that depending on the size of **`S`** and **`N`** (individually and +together) the program will use varying amounts of memory and the larger the +values the more memory it'll require. + + +### Compilation + +Skip to [Portability](#portability). + +The following options **must always be passed to the compiler:** + + -DQ='typedef' -D'g(o)'='goto o;' -D'w(x)'="x:" -D'H(main)'='r(main)' + +If you want to increase the number of offspring to **`50`** and the size of the +chromosome to **`75`** you would pass to the compiler: + + -DQ='typedef' -D'g(o)'='goto o;' -D'w(x)'="x:" -D'H(main)'='r(main)' -DN=50 -DS=75 + +If you wanted to change **`N`** to **`3`**: + + -DQ='typedef' -D'g(o)'='goto o;' -D'w(x)'="x:" -D'H(main)'='r(main)' -DN=3 + +Remember that it cannot be less than **`3`**; *more correctly if it's less than +4 it's redefined to 3* so you could have passed in **`-DN=2`** and have the same +result. Remember too that **`S`** cannot be less than **`38`**. Both **`S`** and +**`N`** are capped at **`SIZE_MAX - 1`**. + +### Portability + +Skip to [An aside on bugs](#bugs). + +The entry works for both C99 and C11 (it *requires at least C99 even if you +translate digraphs*). The program doesn't require third-party libraries and +should work on any Unix based system. It works on both 64-bit and 32-bit (but +inevitably some data type sizes will be smaller and this I believe includes +**`SIZE_MAX`**). I don't think Windows gcc ports would have many issues (if any) +either but I have no way to test this. I have tested the following systems and +configurations: + + Fedora 26: + + $ clang --version|head -n1 + clang version 4.0.1 (tags/RELEASE_401/final) + $ gcc --version|head -n1 + gcc (GCC) 7.3.1 20180130 (Red Hat 7.3.1-2) + $ /lib64/libc-2.25.so |head -n1|cut -d',' -f1-1 + GNU C Library (GNU libc) stable release version 2.25 + $ lscpu |grep Endian + Byte Order: Little Endian + + + CentOS Linux release 7.4.1708 (Core) + + $ clang --version|head -n1 + clang version 3.4.2 (tags/RELEASE_34/dot2-final) + $ gcc --version|head -n1 + gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) + $ /lib64/libc-2.17.so |head -n1 |cut -d, -f1-1 + GNU C Library (GNU libc) stable release version 2.17 + $ lscpu |grep Endian + Byte Order: Little Endian + + + Fedora 27: + + $ clang --version|head -n1 + clang version 5.0.1 (tags/RELEASE_501/final) + $ gcc --version|head -n1 + gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5) + $ /lib64/libc-2.26.so |head -n1|cut -d, -f1-1 + GNU C Library (GNU libc) stable release version 2.26 + $ lscpu |grep Endian + Byte Order: Little Endian + + + macOS: + + System Version: macOS 10.13.4 (17E199) + Kernel Version: Darwin 17.5.0 + $ gcc -v + Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 + Apple LLVM version 9.1.0 (clang-902.0.39.1) + Target: x86_64-apple-darwin17.5.0 + Thread model: posix + InstalledDir: /Library/Developer/CommandLineTools/usr/bin + $ uname -srmv + Darwin 17.5.0 Darwin Kernel Version 17.5.0: Mon Mar 5 22:24:32 PST 2018; root:xnu-4570.51.1~1/RELEASE_X86_64 x86_64 + + +#### An aside + +Skip to [Installing](#rpm). + +Any undocumented bugs are the result of insolent monkeys tampering with any +number of things. That includes but is not limited to running the program on a +non-ASCII system; non little-endian; meddling with **`S`** or **`N`** too much, +changing the references to **`SIZE_MAX`** to be larger than **`SIZE_MAX`** or a +signed value (**`size_t`** is unsigned) or too small of a value; changing data +types or variables; expecting really long strings - including but not limited to +the complete works of Shakespeare (hint: **`isprint('\n') == 0`** so it won't +ever find any string with **`'\n'`**) - to be found by the program in a quick +and easy fashion if ever; or any other meddling including being petulant and/or +unreasonable monkeys. I will say though that there is at least one place I see +after having won that could be slightly more efficient (can you find it?); I am +however leaving it as it is because this is what won. + + +### Installing + +Skip to [Final thoughts](#thoughts). + +I have included a RPM spec file for those with a Red Hat based Linux +distribution; see [rpm.markdown][] for details (including why I implemented +this) if for some (strange?) reason you're interested. + +[rpm.markdown]: rpm.markdown + + +## **6. Final thoughts** + +Skip to [Winning comments](#winning). + +The judges suggested that making them laugh helps entries chance of winning. +Well *laughter helps everything* so in case you haven't seen - and *even if you +have seen* - Dennis Ritchie's anti-foreword to the ghastly *UNIX-HATERS +Handbook* or Ken Thompson's revelation that C and Unix are a hoax (at the end of +that book) I include it below; because I agree that looking at a lot of twisted +code must be quite difficult (though maybe not as much as if you were to have to +look at Microsoft Windows code or code for Windows in any case ? :)) and these +two things I think are rather amusing (in order of least to most): + +Dennis Ritchie's Anti-Foreword: + +> Anti-Foreword + +> By Dennis Ritchie +> From: dmr@plan9.research.att.com +> Date: Tue, 15 Mar 1994 00:38:07 EST +> Subject: anti-foreword + +> To the contributers to this book: + +> I have succumbed to the temptation you offered in your preface: I do write you +> off as envious malcontents and romantic keepers of memories. The systems you +> remember so fondly (TOPS-20, ITS, Multics, Lisp Machine, Cedar/Mesa, the Dorado) +> are not just out to pasture, they are fertilizing it from below. + +> Your judgments are not keen, they are intoxicated by metaphor. In the Preface +> you suffer first from heat, lice, and malnourishment, then become prisoners in +> a Gulag. In Chapter 1 you are in turn infected by a virus, racked by drug +> addiction, and addled by puffiness of the genome. + +> Yet your prison without coherent design continues to imprison you. How can +> this be, if it has no strong places? The rational prisoner exploits the weak +> places, creates order from chaos: instead, collectives like the FSF vindicate +> their jailers by building cells almost compatible with the existing ones, albeit +> with more features. The journalist with three undergraduate degrees from MIT, +> the researcher at Microsoft, and the senior scientist at Apple might volunteer a +> few words about the regulations of the prisons to which they have been +> transferred. + +> Your sense of the possible is in no sense pure: sometimes you want the same +> thing you have, but wish you had done it yourselves; other times you want +> something different, but can't seem to get people to use it; sometimes one +> wonders why you just don't shut up and tell people to buy a PC with Windows or a +> Mac. No Gulag or lice, just a future whose intellectual tone and interaction +> style is set by Sonic the Hedgehog. You claim to seek progress, but you succeed +> mainly in whining. + +> Here is my metaphor: your book is a pudding stuffed with apposite +> observations, many well-conceived. Like excrement, it contains enough undigested +> nuggets of nutrition to sustain life for some. But it is not a tasty pie: it +> reeks too much of contempt and of envy. + +> Bon appetit! + +Yes he misspelt *'contributors'*! But then again we're talking about obfuscation +and since it doesn't break his message it's not broken - it's just obfuscated +albeit not very much (and it still *'compiles'!*); and isn't that what this +contest is about? :) + +Ken Thompson's ending: + +> Creators Admit C, Unix Were Hoax + +> FOR IMMEDIATE RELEASE + +> In an announcement that has stunned the computer industry, Ken Thompson, +Dennis Ritchie, and Brian Kernighan admitted that the Unix operating system and +C programming language created by them is an elaborate April Fools prank kept +alive for more than 20 years. Speaking at the recent UnixWorld Software +Development Forum, Thompson revealed the following: + +> "In 1969, AT&T had just terminated their work with the GE/AT&T Multics +project. Brian and I had just started working with an early release of Pascal +from Professor Nichlaus Wirth's ETH labs in Switzerland, and we were impressed +with its elegant simplicity and power. Dennis had just finished reading Bored of +the Rings, a hilarious National Lampoon parody of the great Tolkien Lord of the +Rings trilogy. As a lark, we decided to do parodies of the Multics environment +and Pascal. Dennis and I were responsible for the operating environment. We +looked at Multics and designed the new system to be as complex and cryptic as +possible to maximize casual users' frustration levels, calling it Unix as a +parody of Multics, as well as other more risque allusions. + +> "Then Dennis and Brian worked on a truly warped version of Pascal, called "A." +When we found others were actually trying to programs with A, we quickly added +additional cryptic features and evolved into B, BCPL, and finally C. We stopped +when we got a clean compile on the following syntax: + + for(;P("\n"),R=;P("|"))for(e=C;e=P("_"+(*u++/ + 8)%2))P("|"+(*u/4)%2); + +> "To think that modern programmers would try to use a language that allowed +such a statement was beyond our comprehension! We actually thought of selling +this to the Soviets to set their computer science progress back 20 or more +years. Imagine our surprise when AT&T and other U.S. corporations actually began +trying to use Unix and C! It has taken them 20 years to develop enough +expertise to generate even marginally useful applications using this 1960s +technological parody, but we are impressed with the tenacity (if not common +sense) of the general Unix and C programmer. + +> "In any event, Brian, Dennis, and I have been working exclusively in Lisp on +the Apple Macintosh for the past few years and feel really guilty about the +chaos, confusion, and truly bad programming that has resulted from our silly +prank so long ago." + +> Major Unix and C vendors and customers, including AT&T, Microsoft, +Hewlett-Packard, GTE, NCR, and DEC have refused comment at this time. Borland +International, a leading vendor of Pascal and C tools, including the popular +Turbo Pascal, Turbo C, and Turbo C++, stated they had suspected this for a +number of years and would continue to enhance their Pascal products and halt +further efforts to develop C. An IBM spokesman broke into uncontrolled laughter +and had to postpone a hastily convened news conference concerning the fate of +the RS/6000, merely stating "Workplace OS will be available Real Soon Now." In a +cryptic statement, Professor Wirth of the ETH Institute and father of the +Pascal, Modula 2, and Oberon structured languages, merely stated that P. T. +Barnum was correct. + +**So is it a hoax about a non-hoax, a non-hoax about a hoax, a non-hoax about a +non-hoax or is it a hoax about a hoax ? :) And if it's any of those what does it +mean about Unix and C?** And if a hoax is involved *what is the hoax?* The pedant +and Tolkienist that I am has to state that **Tolkien didn't consider The Lord of +the Rings a trilogy** *(and he made that very clear)* but that doesn't take away +from the humour by any stretch (*if anyone wants me to elaborate or debate the +matter do send me an email - I love Tolkien's legendarium and having another +person to talk about it with is more than welcome!*). Ken suggested that there +is a lack of common sense but since he was part of its creation I don't think +it's a bad thing; **on the contrary it makes all of us C programmers even more +talented! :)** I do wonder if he tested that bit of C code though: + + for(;P("\n"),R=;P("|"))for(e=C;e=P("_"+(*u++/ + 8)%2))P("|"+(*u/4)%2); + +How is **`R=;`** valid? Since I don't have the context maybe there is something +I'm missing but either way it's a funny piece. It could also be for irony itself +(actually I had previously thought of somehow implementing something like that +for the contest but decided for the message by itself in the end). I would +prefer believing that whether true or not. + +## **7. Winning comments, thanks, dedications, links, etc.** + +I feel incredibly honoured, privileged and I am extremely happy and proud to +have won! I am more proud and happy about this than anything I have ever done in +my life and I don't think there can be anything else I can be more proud of in +the future (except winning again should I find or think of another interesting +thing to try and implement in an obfuscated way). Because winning is one thing; +but to be included amongst very clever and talented veterans whom I highly +respect is an incredible badge of honour that I will proudly wear (literally too +as I hope to get my entry on a shirt) for the rest of my life. This type of +badge is something I feel most only dream of but never come close to earning. +That I did is by far the best feeling I can think of. + +Thank you Simon Cooper, Landon Curt Noll and Leonid A. Broukhis, and thank you +to everyone who has been an important and special part of my life. I want to +specially name some: + +I dedicated this program to my beloved but recently late dog Venus; instead of +drowning in grief I channelled it to creativity. And to have won a contest +requiring creativity, cleverness and novelty is a tribute to an equally +creative, clever and unique dog that she was. I miss you terribly Venus but I'm +so happy to have had you in my life. + +But I want to also dedicate it to (and thank) my dear friend Martijn Schoemaker +whom provided me with the spark a very long time ago (and whom has stood by me +and helped me in more ways than he can know - **`#including C`**); if it wasn't +for you Martijn I wouldn't have been able to win so consider this a recursive +thank you thank you! :) I would also like to give thanks and much love to my +best and closest friend Vicky Wilmore who means the absolute world to me; thank +you for being such a wonderfully beautiful person and friend - that truly is +what 'just you' means, sweetheart, and don't you forget it! <3 Finally I would +like to thank my mother for being the best mum anyone could ask for, who's +always been here for me and whom I also inherit the keen analytical mind from. I +love you all! + +I want to also thank Dave Burton for acknowledging me in his hint.markdown file +for as he put it 'being relentless with pursuit of bugs'. To think that it was +circumstantial to my entry too makes it all the more unlikely but that doesn't +take away the significance of it; for I am a very symbolic person and being +acknowledged for this type of thing is great but to be acknowledged for it by +someone who has won more than once is even more special to me: thank you Dave! +It means a great deal to me and I am glad I could help! :) + +I would also like to say to the judges about their commentary as well as the +category title: they're all very dear to me and that includes not just the +remarks but the example invocations. They fit my views precisely. As for the +test-strings.txt file modifications: very amusing and I certainly do not object. +Thank you again for such an honour and privilege! That this isn't a dream is the +best reality imaginable! :) + +Congratulations to one and all for winning; it's an honour to win such a +wonderful contest requiring creativity, cleverness, uniqueness and +inventiveness but to win beside all the other wonderful entries is truly +special! + +Shortly after the entry has been published I will have more information on the +winning entry at [https://ioccc.xexyl.net/2018/weasel][] including how to +contact me (besides what's already published on the IOCCC website). There also +is an [errata page][] so that in the case I find anything I would like to +correct in the documentation or other supplementary files I can note them there. + +If you wish to contact me please do so; although I have a Twitter account I don't +really use it so please send me an email instead. I do have Facebook as of a +little under two years but I'll worry about that at such a time (I presume in +fact 'if') it becomes relevant. + +[https://ioccc.xexyl.net/2018/weasel]: https://ioccc.xexyl.net/2018/weasel +[errata page]: https://ioccc.xexyl.net/2018/weasel/errata + +-------------------------------------------------------------------------------- + diff --git a/2018/ferguson/prog-simple.c b/2018/ferguson/prog-simple.c new file mode 100644 index 000000000..6c80797e3 --- /dev/null +++ b/2018/ferguson/prog-simple.c @@ -0,0 +1,80 @@ + #include + #include + #include + #include + #include + #include + Q unsigned d; Q char E; Q int k; + Q long u; Q size_t t; Q const char U; + #define L toupper + #define M SIZE_MAX-1 + #ifndef S + #define S 38 + #elif S < 38 + #undef S + #define S 38 + #elif S > M + #undef S + #define S M + #endif + #define l S-1 + #define Y strlen + #define Z printf + #define K static + #define z do{ + K E W[]="stqvvwxzwtzuvvryusuxvtrqsruxttrxvwqxq"; K E T[S]= {77,69,84,72,73,78,75,83,32,73,84,32,73,83,32,76,73,75,69,32,65,32,87,69,65,83,69,76,0} ; + K U C[]=" !\"&'(),.0123456789;?ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + /*NO*/ + K E P[2][sizeof(T)]; K t G=0; + #ifndef N + #define N 25 + #elif N < 4 + #undef N + #define N 3 + #elif N > M + #undef N + #define N M + #endif + /*BLOB*/ + K u R=1; K d D=0; K k X(k f,k t){ return (rand()%((t)-(f)+1)+(f)); } + K E c() {return C[X(0,(k)Y(C)-1)];%> Q struct x { E G[sizeof T]; + t F; } x; K x O[N]; + /* Special C main() handler (encapsulation): */ + #define r(main) main + r(k main(k a, E **V)) { x x; E*b; + U *A=T; k h=0,s,q=0,m=0,y=0,n=N==97,J=0; t i,j, + + /* prototype for special C parser H() below */ + F H(); H(<% H(for (s = 1; s < a && *V[s++]; ) H(<% + H(E *v=V[s-1]; H(if (*v!='-'||h) H(g(o) w(f) H( + while (*++v) H(switch (*v) { w(case '-') h=1; g(f) + w(case 'r') H(if ((R=strtol(v+1,&b,0)) < 1 || R > 100)/*CODING*/ + <% Z("mutation rate out of range\n") ; m=1); %> else m=0; g(f) + w(case 'q') q=1; Z("quiet output\n") ; g(f) w(case 'm') J=1; + g(f) w(default) g(f) %>); H(continue))); H(w(o) H(y=1; + H(i = Y(V<:s-1]); H(if(i > l) i=l; H( strncpy(T,V[s-1:>,i) + ; H(T[i]='\0')))))))); })); }); H(H(if (n&&!y) for (j=0 + ; j<37; ++j) T[j]=W[j]-'A'); H(for ( ; *A && strchr(C, L(*A)) + ; ++A)); H(if (*A) <% Z("'%c' not in keyboard \"%s\"\n", *A,C) + ; return 1; })/*THIS*/); H(srand((d)time(0)); memset(&x, 0, sizeof x); + memset(O,0,sizeof O)); H(Z(/*IS*/"target '%s'\n", T); H(Z( + "mutation rate %ld\n", R)); H(if((m=(m||J||N<4))) + Z("monkey at typewriter\n"); H(for ( j=0; j= O[i+1].F) g(h)) x=O[ + i+1:>; O[i]=O[i+1]; O[i+1]=x; s=0; w(h); }); }while(!s))); w(p + ) H(strcpy(P[0],O[0].G); strcpy(P[1],O[1].G)); H(for (j=0; j " ,G,j+1,O[j]. + G); H(for/*OF*/ (i=0; i + #include + #include + #include + #include + #include + Q unsigned d; Q char E; Q int k; + Q long u; Q size_t t; Q const char U; + #define L toupper + #define M SIZE_MAX-1 + #ifndef S + #define S 38 + #elif S < 38 + #undef S + #define S 38 + #elif S > M + #undef S + #define S M + #endif + #define l S-1 + #define Y strlen + #define Z printf + #define K static + #define z do{ + K E W[]="stqvvwxzwtzuvvryusuxvtrqsruxttrxvwqxq"; K E T[S]= {77,69,84,72,73,78,75,83,32,73,84,32,73,83,32,76,73,75,69,32,65,32,87,69,65,83,69,76,0} ; + K U C[] =" !\"#$<%:>&'()*+,-./0123456789;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`{|}~"; + /*NO*/ + K E P[2][sizeof(T)]; K t G=0; + #ifndef N + #define N 25 + #elif N < 4 + #undef N + #define N 3 + #elif N > M + #undef N + #define N M + #endif + /*BLOB*/ + K u R=1; K d D=0; K k X(k f,k t){ return (rand()%((t)-(f)+1)+(f)); } + K E c() {return C[X(0,(k)Y(C)-1)];%> Q struct x { E G[sizeof T]; + t F; } x; K x O[N]; + /* Special C main() handler (encapsulation): */ + #define r(main) main + r(k main(k a, E **V)) { x x; E*b; + U *A=T; k h=0,s,q=0,m=0,y=0,n=N==97,J=0; t i,j, + + /* prototype for special C parser H() below */ + F H(); H(<% H(for (s = 1; s < a && *V[s++]; ) H(<% + H(E *v=V[s-1]; H(if (*v!='-'||h) H(g(o) w(f) H( + while (*++v) H(switch (*v) { w(case '-') h=1; g(f) + w(case 'r') H(if ((R=strtol(v+1,&b,0)) < 1 || R > 100)/*CODING*/ + <% Z("mutation rate out of range\n") ; m=1); %> else m=0; g(f) + w(case 'q') q=1; Z("quiet output\n") ; g(f) w(case 'm') J=1; + g(f) w(default) g(f) %>); H(continue))); H(w(o) H(y=1; + H(i = Y(V<:s-1]); H(if(i > l) i=l; H( strncpy(T,V[s-1:>,i) + ; H(T[i]='\0')))))))); })); }); H(H(if (n&&!y) for (j=0 + ; j<37; ++j) T[j]=W[j]-'A'); H(for ( ; *A && strchr(C, L(*A)) + ; ++A)); H(if (*A) <% Z("'%c' not in keyboard \"%s\"\n", *A,C) + ; return 1; })/*THIS*/); H(srand((d)time(0)); memset(&x, 0, sizeof x); + memset(O,0,sizeof O)); H(Z(/*IS*/"target '%s'\n", T); H(Z( + "mutation rate %ld\n", R)); H(if((m=(m||J||N<4))) + Z("monkey at typewriter\n"); H(for ( j=0; j= O[i+1].F) g(h)) x=O[ + i+1:>; O[i]=O[i+1]; O[i+1]=x; s=0; w(h); }); }while(!s))); w(p + ) H(strcpy(P[0],O[0].G); strcpy(P[1],O[1].G)); H(for (j=0; j " ,G,j+1,O[j]. + G); H(for/*OF*/ (i=0; i + #include + #include + #include + #include + #include + Q unsigned d; Q char E; Q int k; + Q long u; Q size_t t; Q const char U; + #define L toupper + #define M SIZE_MAX-1 + #ifndef S + #define S 38 + #elif S < 38 + #undef S + #define S 38 + #elif S > M + #undef S + #define S M + #endif + #define l S-1 + #define Y strlen + #define Z printf + #define K static + #define z do{ + K E W[]="stqvvwxzwtzuvvryusuxvtrqsruxttrxvwqxq"; K E T[S]= {77,69,84,72,73,78,75,83,32,73,84,32,73,83,32,76,73,75,69,32,65,32,87,69,65,83,69,76,0} ; + K U C[] =" !\"#$<%:>&'()*+,-./0123456789;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`{|}~"; + /*NO*/ + K E P[2][sizeof(T)]; K t G=0; + #ifndef N + #define N 25 + #elif N < 4 + #undef N + #define N 3 + #elif N > M + #undef N + #define N M + #endif + /*BLOB*/ + K u R=1; K d D=0; K k X(k f,k t){ return (rand()%((t)-(f)+1)+(f)); } + K E c() {return C[X(0,(k)Y(C)-1)];%> Q struct x { E G[sizeof T]; + t F; } x; K x O[N]; + /* Special C main() handler (encapsulation): */ + #define r(main) main + r(k main(k a, E **V)) { x x; E*b; + U *A=T; k h=0,s,q=0,m=0,y=0,n=N==97,J=0; t i,j, + + /* prototype for special C parser H() below */ + F H(); H(<% H(for (s = 1; s < a && *V[s++]; ) H(<% + H(E *v=V[s-1]; H(if (*v!='-'||h) H(g(o) w(f) H( + while (*++v) H(switch (*v) { w(case '-') h=1; g(f) + w(case 'r') H(if ((R=strtol(v+1,&b,0)) < 1 || R > 100)/*CODING*/ + <% Z("mutation rate out of range\n") ; m=1); %> else m=0; g(f) + w(case 'q') q=1; Z("quiet output\n") ; g(f) w(case 'm') J=1; + g(f) w(default) g(f) %>); H(continue))); H(w(o) H(y=1; + H(i = Y(V<:s-1]); H(if(i > l) i=l; H( strncpy(T,V[s-1:>,i) + ; H(T[i]='\0')))))))); })); }); H(H(if (n&&!y) for (j=0 + ; j<37; ++j) T[j]=W[j]-'A'); H(for ( ; *A && strchr(C, L(*A)) + ; ++A)); H(if (*A) <% Z("'%c' not in keyboard \"%s\"\n", *A,C) + ; return 0; })/*THIS*/); H(srand((d)time(0)); memset(&x, 0, sizeof x); + memset(O,0,sizeof O)); H(Z(/*IS*/"target '%s'\n", T); H(Z( + "mutation rate %ld\n", R)); H(if((m=(m||J||N<4))) + Z("monkey at typewriter\n"); H(for ( j=0; j= O[i+1].F) g(h)) x=O[ + i+1:>; O[i]=O[i+1]; O[i+1]=x; s=0; w(h); }); }while(!s))); w(p + ) H(strcpy(P[0],O[0].G); strcpy(P[1],O[1].G)); H(for (j=0; j " ,G,j+1,O[j]. + G); H(for/*OF*/ (i=0; i /dev/null|| exit 1 + +while read f; do + ./weasel $* "${f}" # full line because of quotes + # ./weasel $* $f would just be the final word + sleep 2 +done < test-strings.txt || exit 1 +echo "All done. Goodbye." diff --git a/2018/ferguson/weasel.1 b/2018/ferguson/weasel.1 new file mode 100644 index 000000000..784a2225b --- /dev/null +++ b/2018/ferguson/weasel.1 @@ -0,0 +1,192 @@ +.TH weasel 1 "20 February 2018" "weasel" "IOCCC 2018" +.SH NAME +weasel \- The IOCCC 2018 Implementation of Richard Dawkins's Weasel program +.SH SYNOPSIS +\fBweasel\fP [\fI\-r\fP] [\fI\-m\fP] [\fI\-q\fP] [\fI\fP] +.PP +\fBweasel\-simple\fP [\fI\-r\fP] [\fI\-m\fP] [\fI\-q\fP] [\fI\fP] +.SH DESCRIPTION +\fBweasel\fP is an obfuscated implementation of Richard Dawkins' \fIWeasel program\fP. +According to Wikipedia in chapter three of his book \fIThe Blind Watchmaker\fP Dawkins wrote: +.PP +.RS +I don't know who it was first pointed out that, given enough time, +a monkey bashing away at random on a typewriter could produce all +the works of Shakespeare. The operative phrase is, of course, given +enough time. Let us limit the task facing our monkey somewhat. +Suppose that he has to produce, not the complete works of Shakespeare +but just the short sentence 'Methinks it is like a weasel', and we +shall make it relatively easy by giving him a typewriter with a +restricted keyboard, one with just the 26 (capital) letters, and +a space bar. How long will he take to write this one little sentence? +.RE +.PP +He refers to the \fIInfinite Monkey Theorem\fP in particular and as he +points out it is \fBgiven enough time.\fP The weasel program uses a \fIgenetic +algorithm (GA)\fP to intelligently come to a conclusion but this implementation +has several additions: \fBtwo Easter eggs,\fP a \fBquiet output mode,\fP +an \fBoption to change the mutation rate\fP as well as the ability to +\fBspecify the chromosomal string.\fP +Furthermore the keyboard isn't as limited as Dawkins's implementation. +The \fBweasel\-simple\fP keyboard is a more limited keyboard but not +as limited as Dawkins's Weasel program keyboard. +.SH OPTIONS +.PP +\fB\-r\fP\fI\fP +This sets the mutation rate to \fI\fP; valid range is 1 through 100. +Anything outside this range will disable the genetic algorithm and simulate +a monkey in front of a typewriter. +If a valid mutation rate is set after this then the monkey typewriter mode +will be disabled but if monkey mode has been explicitly requested by the +\fB\-m\fP option the mutation rate is ignored. +Note that there cannot be a space between the \fB\-r\fP and \fI\fP. +The default is 1; valid range is >= 1 && <= 100. +.PP +\fB\-m\fP +Set monkey mode. This disables the genetic algorithm and is disables the +mutation rate entirely; instead it will pseudo-randomly select a character +from the keyboard in every offspring for every generation and selection +will not take place: parents are simply the first two offspring +regardless of their fitness score. Once this is enabled you +cannot disable it: be wary of the typing monkeys! +.PP +\fB\-q\fP +Quiet output. +Only display settings like mutation rate, quiet output, +target string and the final answer - if it comes to one. +Just like monkey mode you cannot disable this once it's been enabled. +.PP +\fB--\fP +Disable parsing of additional options (but not target strings); see +.B EXAMPLES +for a subtle point. +.SH EXIT STATUS +On error of any kind (including reaching the maximum number of attempts) +return 1; otherwise return 0. +.SH BUGS +Bugs? What's this? :) Any bugs are actually insolent monkeys tampering +with the program! But if you insist I do include errata on my website. +.SH EXAMPLES +.PP +\fBweasel\fP +.PP +.NF +Using the GA with the default mutation rate of 1 and output mode (verbose) +look for the default string in Hawkins's Weasel program; note that in +all cases the string to be found is capitalised. +.FI +.PP +\fBweasel \-qr5 +weasel \-q \-r5\fP +.NF +.PP +Enables quiet output and sets a mutation rate of 5. +.PP +.FI +\fBweasel \-rqr10\fP +.NF +.PP +First sets an invalid mutation rate, then enables quiet output and +finally sets (a valid) mutation rate of 10. +.FI +.PP +.NF +\fBweasel \-m 'I AM A MONKEY TYPING'\fP +.PP +.FI +Simulate a monkey typing at the typewriter trying to type out the +string \fBI AM A MONKEY TYPING\fP without quotes. Note that this will +take some time almost assuredly and you might fall asleep before +the monkey succeeds. Here you would see all the attempts because +quiet output was not requested. +.PP +\fBweasel I AM NOT A MONKEY\fP +.PP +.NF +Using the GA find the final string specified (this always happens); +because the string wasn't quoted the program will have seen each word +as a separate argument and thus it would search for \fBMONKEY\fP. +.FI +.PP +\fBweasel '"WEASEL"'\fP +.PP +.NF +Search for the string \fB"WEASEL"\fP including double quotes ("s). +.FI +.PP +\fBweasel "'WEASEL'"\fP +.PP +.NF +Search for the string \fB'WEASEL'\fP including the single quotes ('s). +.FI +.PP +\fBweasel \-q \-r5 \-\- \-r10\fP +.PP +.NF +Enable quiet output, set mutation rate to 5, disable further option parsing +and set target string to \fB-r10\fP (literally because option parsing was disabled). +.FI +.PP +\fBweasel \-r5\-q \-\- \-r10\fP +.PP +Set mutation rate to 5, enable quiet output, disable further parsing of +options and set target string to \fB-r10\fP (literally - because option parsing +was disabled as above). Observe that here the \fB-r5-q\fP doesn't prevent the +quiet output from being enabled; on the other hand the options +\fB-r5- -q -- -r10\fP would! +.RE +.SH FILES +\fI/usr/src/weasel/weasel.c\fP +.RS +The source code to the \fBweasel\fP program. +.RE +.PP +\fI/usr/src/weasel/weasel\-simple.c\fP +.RS +The source code to the \fBweasel-simple\fP program. +.RE +.PP +\fI/usr/src/weasel/Makefile\fP +.RS +The Makefile to compile the source code should you wish to compile the +source code files. +.RE +.PP +\fI/usr/src/weasel/test.sh\fP +.RS +A test script that demonstrates the weasel program (this script is used +by \fBmake test\fP) by reading in strings, one at a time, and invoking +the program with that string as the target chromosome. See the +\fIhint.text\fP or \fIhint.html\fP for more details on using this script. +.RE +.PP +\fI/usr/src/weasel/test-strings.txt\fP +.RS +The data file the \fItest.sh\fP script reads strings from. +.RE +.PP +\fI/usr/share/doc/weasel/weasel.html\fP, \fI/usr/share/doc/weasel/weasel.markdown\fP +.RS +More detailed documentation. +.RE +.SH HINTS +The IOCCC judges in 2018 asked the following in the guidelines: +.RS +.PP +\fBBTW: What is so special about 2305567963945518424753102147331756070? You tell us!\fP +.RE +.PP +It is the primorial prime of 97; but can you find a way to get the program +to by default search for this number instead? You might need the source code to +find it! +.SH SEE ALSO +.NF +<\fBhttps://ioccc.xexyl.net/2018/weasel\fP> +.PP +<\fBhttps://en.wikipedia.org/wiki/Infinite_monkey_theorem\fP> +.PP +<\fBhttps://en.wikipedia.org/wiki/Weasel_program\fP> +.PP +<\fBhttp://www.doc.ic.ac.uk/~nd/surprise_96/journal/vol1/hmw/article1.html\fP> +.SH AUTHOR +Cody Boone Ferguson <\fBweasel@xexyl.net\fP> diff --git a/2018/ferguson/weasel.man b/2018/ferguson/weasel.man new file mode 100644 index 000000000..9441e73bd --- /dev/null +++ b/2018/ferguson/weasel.man @@ -0,0 +1,192 @@ +.TH weasel 1 "20 February 2018" "weasel" "IOCCC 2018" +.SH NAME +weasel \- The IOCCC 2018 Implementation of Richard Dawkins's Weasel program +.SH SYNOPSIS +\fBweasel\fP [\fI\-r\fP] [\fI\-m\fP] [\fI\-q\fP] [<\fIchromosomal string\fP>] +.PP +\fBweasel\-simple\fP [\fI\-r\fP] [\fI\-m\fP] [\fI\-q\fP] [<\fIchromosomal string\fP>] +.SH DESCRIPTION +\fBweasel\fP is an obfuscated implementation of Richard Dawkins' \fIWeasel program\fP. +According to Wikipedia in chapter three of his book \fIThe Blind Watchmaker\fP Dawkins wrote: +.PP +.RS +I don't know who it was first pointed out that, given enough time, +a monkey bashing away at random on a typewriter could produce all +the works of Shakespeare. The operative phrase is, of course, given +enough time. Let us limit the task facing our monkey somewhat. +Suppose that he has to produce, not the complete works of Shakespeare +but just the short sentence 'Methinks it is like a weasel', and we +shall make it relatively easy by giving him a typewriter with a +restricted keyboard, one with just the 26 (capital) letters, and +a space bar. How long will he take to write this one little sentence? +.RE +.PP +He refers to the \fIInfinite Monkey Theorem\fP in particular and as he +points out it is \fBgiven enough time.\fP The weasel program uses a \fIgenetic +algorithm (GA)\fP to intelligently come to a conclusion but this implementation +has several additions: \fBtwo Easter eggs,\fP a \fBquiet output mode,\fP +an \fBoption to change the mutation rate\fP as well as the ability to +\fBspecify the chromosomal string.\fP +Furthermore the keyboard isn't as limited as Dawkins's implementation. +The \fBweasel\-simple\fP keyboard is a more limited keyboard but not +as limited as Dawkins's Weasel program keyboard. +.SH OPTIONS +.PP +\fB\-r\fP\fI\fP +This sets the mutation rate to \fI\fP; valid range is 1 through 100. +Anything outside this range will disable the genetic algorithm and simulate +a monkey in front of a typewriter. +If a valid mutation rate is set after this then the monkey typewriter mode +will be disabled but if monkey mode has been explicitly requested by the +\fB\-m\fP option the mutation rate is ignored. +Note that there cannot be a space between the \fB\-r\fP and \fI\fP. +The default is 1; valid range is >= 1 && <= 100. +.PP +\fB\-m\fP +Set monkey mode. This disables the genetic algorithm and is disables the +mutation rate entirely; instead it will pseudo-randomly select a character +from the keyboard in every offspring for every generation and selection +will not take place: parents are simply the first two offspring +regardless of their fitness score. Once this is enabled you +cannot disable it: be wary of the typing monkeys! +.PP +\fB\-q\fP +Quiet output. +Only display settings like mutation rate, quiet output, +target string and the final answer - if it comes to one. +Just like monkey mode you cannot disable this once it's been enabled. +.PP +\fB--\fP +Disable parsing of additional options (but not target strings); see +.B EXAMPLES +for a subtle point. +.SH EXIT STATUS +On error of any kind (including reaching the maximum number of attempts) +return 1; otherwise return 0. +.SH BUGS +Bugs? What's this? :) Any bugs are actually insolent monkeys tampering +with the program! But if you insist I do include errata on my website. +.SH EXAMPLES +.PP +\fBweasel\fP +.PP +.NF +Using the GA with the default mutation rate of 1 and output mode (verbose) +look for the default string in Hawkins's Weasel program; note that in +all cases the string to be found is capitalised. +.FI +.PP +\fBweasel \-qr5 +weasel \-q \-r5\fP +.NF +.PP +Enables quiet output and sets a mutation rate of 5. +.PP +.FI +\fBweasel \-rqr10\fP +.NF +.PP +First sets an invalid mutation rate, then enables quiet output and +finally sets (a valid) mutation rate of 10. +.FI +.PP +.NF +\fBweasel \-m 'I AM A MONKEY TYPING'\fP +.PP +.FI +Simulate a monkey typing at the typewriter trying to type out the +string \fBI AM A MONKEY TYPING\fP without quotes. Note that this will +take some time almost assuredly and you might fall asleep before +the monkey succeeds. Here you would see all the attempts because +quiet output was not requested. +.PP +\fBweasel I AM NOT A MONKEY\fP +.PP +.NF +Using the GA find the final string specified (this always happens); +because the string wasn't quoted the program will have seen each word +as a separate argument and thus it would search for \fBMONKEY\fP. +.FI +.PP +\fBweasel '"WEASEL"'\fP +.PP +.NF +Search for the string \fB"WEASEL"\fP including double quotes ("s). +.FI +.PP +\fBweasel "'WEASEL'"\fP +.PP +.NF +Search for the string \fB'WEASEL'\fP including the single quotes ('s). +.FI +.PP +\fBweasel \-q \-r5 \-\- \-r10\fP +.PP +.NF +Enable quiet output, set mutation rate to 5, disable further option parsing +and set target string to \fB-r10\fP (literally because option parsing was disabled). +.FI +.PP +\fBweasel \-r5\-q \-\- \-r10\fP +.PP +Set mutation rate to 5, enable quiet output, disable further parsing of +options and set target string to \fB-r10\fP (literally - because option parsing +was disabled as above). Observe that here the \fB-r5-q\fP doesn't prevent the +quiet output from being enabled; on the other hand the options +\fB-r5- -q -- -r10\fP would! +.RE +.SH FILES +\fIprog.c\fP +.RS +The source code to the \fBweasel\fP program. +.RE +.PP +\fIprog\-simple.c\fP +.RS +The source code to the \fBweasel-simple\fP program. +.RE +.PP +\fIMakefile\fP +.RS +The Makefile to compile the source code should you wish to compile the +source code files. +.RE +.PP +\fItest.sh\fP +.RS +A test script that demonstrates the weasel program (this script is used +by \fBmake test\fP) by reading in strings, one at a time, and invoking +the program with that string as the target chromosome. See the +\fIhint.text\fP or \fIhint.html\fP for more details on using this script. +.RE +.PP +\fItest-strings.txt\fP +.RS +The data file the \fItest.sh\fP script reads strings from. +.RE +.PP +\fIhint.html\fP, \fIhint.text\fP +.RS +More detailed documentation. +.RE +.SH HINTS +The IOCCC judges in 2018 asked the following in the guidelines: +.RS +.PP +\fBBTW: What is so special about 2305567963945518424753102147331756070? You tell us!\fP +.RE +.PP +It is the primorial prime of 97; but can you find a way to get the program +to by default search for this number instead? You might need the source code to +find it! +.SH SEE ALSO +.NF +<\fBhttps://ioccc.xexyl.net/2018/weasel\fP> +.PP +<\fBhttps://en.wikipedia.org/wiki/Infinite_monkey_theorem\fP> +.PP +<\fBhttps://en.wikipedia.org/wiki/Weasel_program\fP> +.PP +<\fBhttp://www.doc.ic.ac.uk/~nd/surprise_96/journal/vol1/hmw/article1.html\fP> +.SH AUTHOR +Cody Boone Ferguson <\fBweasel@xexyl.net\fP> diff --git a/2018/ferguson/weasel.spec b/2018/ferguson/weasel.spec new file mode 100644 index 000000000..28129454c --- /dev/null +++ b/2018/ferguson/weasel.spec @@ -0,0 +1,76 @@ +%global debug_package %{nil} + +Name: weasel +Version: 0.0.1 +Release: 3%{?dist} +Summary: Implementation of Richard Dawkins's Weasel program + +License: Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +URL: http://ioccc.xexyl.net/weasel +Source0: weasel.tar.bz2 + +BuildRequires: gcc make +AutoReq: 1 + +%description + It is an implementation of Richard Dawkins' Weasel program. According + to Wikipedia in chapter three of his book The Blind Watchmaker + Dawkins wrote: + + I don't know who it was first pointed out that, given enough time, + a monkey bashing away at random on a typewriter could produce all + the works of Shakespeare. The operative phrase is, of course, + given enough time. Let us limit the task facing our monkey + somewhat. Suppose that he has to produce, not the complete works + of Shakespeare but just the short sentence + 'Methinks it is like a weasel', + and we shall make it relatively easy by giving him a typewriter + with a restricted keyboard, one with just the 26 (capital) letters, + and a space bar. How long will he take to write this one little + sentence? + + This version has some additional features like a more complicated + keyboard, a couple Easter eggs and the ability to change the target + string amongst others. See weasel(1) for more information. + +%prep +%setup -n weasel + +%build +make weasel weasel-simple +mv -f hint.txt hint.text 2>/dev/null || : + +%install +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT%{_bindir} $RPM_BUILD_ROOT%{_usrsrc}/weasel +install -p -m 755 weasel $RPM_BUILD_ROOT%{_bindir}/weasel +install -p -m 755 weasel-simple $RPM_BUILD_ROOT%{_bindir}/weasel-simple +install -p -m 755 test.sh $RPM_BUILD_ROOT%{_usrsrc}/weasel/test.sh +install -m 644 test-strings.txt $RPM_BUILD_ROOT%{_usrsrc}/weasel/test-strings.txt +install -m 644 prog.c -D $RPM_BUILD_ROOT%{_usrsrc}/weasel/weasel.c +ln -s weasel.c $RPM_BUILD_ROOT%{_usrsrc}/weasel/prog.c +install -m 644 Makefile -D $RPM_BUILD_ROOT%{_usrsrc}/weasel +install -m 644 prog-simple.c -D $RPM_BUILD_ROOT%{_usrsrc}/weasel/weasel-simple.c +ln -s weasel-simple.c $RPM_BUILD_ROOT%{_usrsrc}/weasel/prog-simple.c +install -m 644 weasel.1 -D $RPM_BUILD_ROOT%{_mandir}/man1/weasel.1 +install -m 644 hint.html -D $RPM_BUILD_ROOT%{_docdir}/weasel/weasel.html +install -m 644 hint.text -D $RPM_BUILD_ROOT%{_docdir}/weasel/weasel.markdown +install -m 644 hint.css -D $RPM_BUILD_ROOT%{_docdir}/weasel/hint.css +install -m 644 FILES -D $RPM_BUILD_ROOT%{_docdir}/weasel/FILES + +%files +%{_bindir}/weasel* +%{_usrsrc}/weasel/* +%doc +%{_mandir}/man1/* +%{_docdir}/weasel/* + +%changelog +* Tue May 01 2018 Cody Ferguson 0.0.1-3 +- Add FILES file. + +* Mon Apr 30 2018 Cody Ferguson 0.0.1-2 +- General fixes. + +* Mon Apr 16 2018 Cody Ferguson 0.0.1-1 +- Initial spec file. diff --git a/2018/giles/Makefile b/2018/giles/Makefile new file mode 100644 index 000000000..9f68a7329 --- /dev/null +++ b/2018/giles/Makefile @@ -0,0 +1,285 @@ +#!/usr/bin/env make +# +# 2018 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +GZIP_PROG= gzip +BZIP2= bzip2 +CURL= curl +DD= dd +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq +STRIP= strip + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +CSILENCE= +#CSILENCE= -Wno-implicit-int + +# compiler standard +# +#CSTD= +#CSTD= -ansi +#CSTD= -std=c11 +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=25 + +# include files that are needed to compile +# +CINCLUDE= $(shell sdl2-config --cflags) +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= $(shell sdl2-config --libs) +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= +ALT_TARGET= + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 3a3fabb90892eeb2f610ae0f74a35a970060665a063ab702bd686c17c4ae07f6 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2018/giles/hint.html b/2018/giles/hint.html new file mode 100644 index 000000000..2171fb460 --- /dev/null +++ b/2018/giles/hint.html @@ -0,0 +1,88 @@ + + + + + + + Most unstable + + +

    Most unstable

    + +

    Edward Giles

    + +

    Judges' comments:

    + +

    To use:

    + +
    sudo apt install libsdl2-dev  # Linux
    +Something else # MacOS
    +make
    +./prog
    +
    + +

    Try:

    + +
    ./prog ioccc.txt
    +./prog prog.c
    +
    + +

    Selected Judges Remarks:

    + +

    Can you explain the behavior of the program when ioccc.txt is given to it as input?

    + +

    How would the description of the state machine look like when translated from +Polynomish to English?

    + +

    Author’s comments:

    + +

    Remarks

    + +

    This entry graphically displays a simulation of sand falling. +It uses SDL to draw the interface.

    + +

    The code makes the following assumptions about the underlying system:

    + +
      +
    • SDL 2 is installed from https://libsdl.org
    • +
    • “double” is an IEEE 754 floating-point type and sizeof(double)==8
    • +
    • The compiler supports the C99 standard
    • +
    + + +

    In order to simulate the motion of the sand, a cellular automaton is used. The +state transition table is not stored directly. Instead, the program stores the +coefficients of a polynomial that map each state to the correct one. These +coefficients are stored as raw hexadecimal in the V[] array, and they are +reinterpreted as doubles when used. This allows more numeric precision in fewer +characters (base 16 > base 10), and makes the purpose of the array less clear.

    + +

    The code is laid out graphically as a bucket pouring sand, and it is far easier +to observe this high-level layout than the code’s actual function.

    + +

    The preprocessor is used to both obfuscate the code as a whole and abbreviate +the calls to SDL. Additionally, throughout the code, the variables were named +so that they are short and easily confused with each other.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2018, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2018/giles/hint.text b/2018/giles/hint.text new file mode 100644 index 000000000..374725a65 --- /dev/null +++ b/2018/giles/hint.text @@ -0,0 +1,61 @@ +# Most unstable + +Edward Giles + + +## Judges' comments: +### To use: + + sudo apt install libsdl2-dev # Linux + Something else # MacOS + make + ./prog + +### Try: + + ./prog ioccc.txt + ./prog prog.c + +### Selected Judges Remarks: + +Can you explain the behavior of the program when ioccc.txt is given to it as input? + +How would the description of the state machine look like when translated from +Polynomish to English? + + +## Author's comments: +Remarks +======= + +This entry graphically displays a simulation of sand falling. +It uses SDL to draw the interface. + +The code makes the following assumptions about the underlying system: + +* SDL 2 is installed from https://libsdl.org +* "double" is an IEEE 754 floating-point type and sizeof(double)==8 +* The compiler supports the C99 standard + +In order to simulate the motion of the sand, a cellular automaton is used. The +state transition table is not stored directly. Instead, the program stores the +coefficients of a polynomial that map each state to the correct one. These +coefficients are stored as raw hexadecimal in the V[] array, and they are +reinterpreted as doubles when used. This allows more numeric precision in fewer +characters (base 16 > base 10), and makes the purpose of the array less clear. + +The code is laid out graphically as a bucket pouring sand, and it is far easier +to observe this high-level layout than the code's actual function. + +The preprocessor is used to both obfuscate the code as a whole and abbreviate +the calls to SDL. Additionally, throughout the code, the variables were named +so that they are short and easily confused with each other. + +-------------------------------------------------------------------------------- + diff --git a/2018/giles/ioccc.txt b/2018/giles/ioccc.txt new file mode 100644 index 000000000..8e188c450 --- /dev/null +++ b/2018/giles/ioccc.txt @@ -0,0 +1,50 @@ +`````````````````````````````````````aaaaa``````````````````````````````````````` +```````````````````````````````````````a````````````````````````````````````````` +```````````````````````````````````````a````````````````````````````````````````` +```````````````````````````````````````a````````````````````````````````````````` +```````````````````````````````````````a````````````````````````````````````````` +```````````````````````````````````````a````````````````````````````````````````` +```````````````````````````````````````a````````````````````````````````````````` +`````````````````````````````````````aaaaa``````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +`````````````````````````````````````aaaaa``````````````````````````````````````` +````````````````````````````````````a`````a`````````````````````````````````````` +````````````````````````````````````a`````a`````````````````````````````````````` +````````````````````````````````````a`````a`````````````````````````````````````` +````````````````````````````````````a`````a`````````````````````````````````````` +````````````````````````````````````a`````a`````````````````````````````````````` +````````````````````````````````````a`````a`````````````````````````````````````` +`````````````````````````````````````aaaaa``````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +`````````````````````````````````````aaaaa``````````````````````````````````````` +````````````````````````````````````a`````a`````````````````````````````````````` +````````````````````````````````````a```````````````````````````````````````````` +````````````````````````````````````a```````````````````````````````````````````` +````````````````````````````````````a```````````````````````````````````````````` +````````````````````````````````````a```````````````````````````````````````````` +````````````````````````````````````a`````a`````````````````````````````````````` +`````````````````````````````````````aaaaa``````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +`````````````````````````````````````aaaaa``````````````````````````````````````` +````````````````````````````````````a`````a`````````````````````````````````````` +````````````````````````````````````a```````````````````````````````````````````` +````````````````````````````````````a```````````````````````````````````````````` +````````````````````````````````````a```````````````````````````````````````````` +````````````````````````````````````a```````````````````````````````````````````` +````````````````````````````````````a`````a`````````````````````````````````````` +`````````````````````````````````````aaaaa``````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +`````````````````````````````````````aaaaa``````````````````````````````````````` +````````````````````````````````````a`````a`````````````````````````````````````` +````````````````````````````````````a```````````````````````````````````````````` +````````````````````````````````````a```````````````````````````````````````````` +````````````````````````````````````a```````````````````````````````````````````` +````````````````````````````````````a```````````````````````````````````````````` +````````````````````````````````````a`````a`````````````````````````````````````` +`````````````````````````````````````aaaaa``````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` + diff --git a/2018/giles/prog.c b/2018/giles/prog.c new file mode 100644 index 000000000..bcf32ddc6 --- /dev/null +++ b/2018/giles/prog.c @@ -0,0 +1,85 @@ +#include "SDL.h" +#include +#include +#include +#include + +#define S(a,b) b*a +#define A int +#define N(a,b) b=a +#define D "sand.txt" + +#define G(_) SDL_##_ +#define GX(_) G(Create##_) +#define GY(_) G(Destroy##_) +#define GZ(_) G(Render##_) +#define GA(_) if(!(_)){pri\ +ntf("L%d SDL Error: %s\n",_\ +_LINE__,G(GetError)());exit(1);} +#define GB(__,_G,G_,GG) G_(__);_G(GG) + +// important constants +int ONE = 1; +int ZRO = 0; + +uint64_t V[]={ +0x3e62f947d02f49bc,0xbed0bdb402d9ed0c,0x3f2acda5f517c6b6,0xbf79c2448bb7eca0, +0x3fc091746cc843a3,0xbffe1cce22ed8f8f,0x4033e22da447fb5b,0xc06352e2b9c91269, +0x408bacb717fa44db,0xc0aceee93bc74aae,0x40c59df977dbfd52,0xc0d639fd2e095789, +0x40dd7401cce0cb64,0xc0d63a270ab7d164,0x40bc52eb9bd102e2,0x3fe0000000000000}; + +#define L lL[L1 + int Ll1(A i) + {N(0;,double Ll)for( + A N(0; l<,l) 16; ) S(( double* + ),S(i+,Ll= Ll))(V+l++);return Ll; } + #define M(a,b);L+a]=(L+a]&2)|(LL/b&1) + void _L(int* lL,A l,A L1){ A N( Ll1, + LL )( ( L]==1)| 2*(L +1]== 1) |4 * ( + L+ l] != 0)|8 *(L +l+ 1]!= 0)) M(0, + 1) M(1,2)M(l,4)M(l+1,8);}N(0,A l1L); + #define L_(l11,L1) for( N(( l11);,\ + l1)l1 < lll;l1 +=ll1)for( N(L1 ;ll<\ +l1l-,ll)1; ll +=2)_L( Ll,l1l,l1+ll); +void JJ(A*Ll,A l1l,A l){A ll,l1,S((l + -1),lll=l1l),N(2*,ll1)l1l;l1L^= + 1;L_(l1L?l1l:0,l1L)} +#define GU +#define GO 1 +#define G0 >=0 +#define G2 GZ (er*) +#define G3 G( Init) +#define G5 G( Quit) +#define GV while +#define GC G( QUIT) +#define GG G( Delay) +#define GW G( Event) +#define GE GZ (Clear) +#define G1 G( Window*) +#define GI GY (Window) +#define G6 GX (Window) +#define GF GZ (Present) +#define G8 GX (Renderer) +#define GH GY (Renderer) +#define GN G( PollEvent) +#define G4 G( INIT_VIDEO) +#define G7 G( WINDOW_SHOWN) +#define GD G( SetRenderDrawColor) +A main(A ac,char**av){int P[4018]; memset(P,0,4018* +sizeof(A));S(j=fopen,FILE)(ac>1?av[1]:D,"r");if(j){ +for(A F=0;F<4018; F++)P [F]=getc(j)-96;fclose(j) ;} + + G1 GL=0;G2 GM = 0;GA (G3(G4 )G0 )atexit( +G5); GA( GL= G6( D, ZRO, ZRO, +800, 480, G7)) GA( GM= G8( GL, + -1,0) )int GK= GO+ (ONE= ZRO ++); GW GJ; + GV( GK){ GV( GN(& GJ) GU!= 0){ + GK= GJ. type== GC? ONE: GK;} GA( +GD(GM,0,0,0, 255) G0); GE( GM); G(Rect)Q;Q.w + +=Q.h=10;JJ(P,82,49);A k=+0;while(k<81&&P[k])k++;P[k +]=l1L;for(A K=ZRO;K<49; K++){for(A O=1;O<81; O++){Q +.x=-(ZRO-O)*10;Q.y=(K-1)*10;A v=P[82*K+O];if(v==ZRO +)GD(GM,238,204,106,255); else if(v==ONE)GD(GM,0,0,0 +,255); else GD(GM,143,149,157,255);GZ(FillRect)(GM, +&Q);}}GB(GM,GG,GF,40)GU;}GB(GM,GI,GH,GL);return 0;} diff --git a/2018/giles/sand.txt b/2018/giles/sand.txt new file mode 100644 index 000000000..6854e7843 --- /dev/null +++ b/2018/giles/sand.txt @@ -0,0 +1,50 @@ +bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +`aaaa```a````aa`````````````````````````````````````````````````````````````````` +aaaaaaaaaaaaaaa`````````````````````````````````````````````````````````````````` +aaaaaaaaaaaaaaaabb````````````````bbbbbbbbb`````````````````````````````````````` +aaaaaaaaaaaaaaabb````````````````bb`````````````````````````````````````````````` +aaaaaaaaaaaaaabb````````````````bb``````````````````````````````````````````````` +baaaaaaaaaaaabb````````````````bb```````````````````````````````````````````````` +bbaaaaaaaaaabb````````````````bb````````````````````````````````````````````````` +`bbaaaaaaaabb````````````````bb`````````````````````````````````````````````````` +``bbaaaaaabb````````````````bb``````````````````````````````````````````````````` +```bbaaaabb`````````````````b````````````bbbbbbbbbbbbbbb````````````````````````` +````bbaabb``````````````````````````````````````````````````````````````````````` +`````bbab```````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````b```````````````````````````````````````````````````````````````````````````` +````b```````````````````````````````````````````````````````````````````````````` +````b```````````````````````````````````````````````````````````````````````````` +````b``````````````````````````````b````````````````````````b```````````````````` +````b``bbb``````````````````b``````bb``````````````````````bb```````````````````` +````b`b```b`````````````````b```````b``````````````````````b````````````````````` +````b`b``````bbb``b`bb```bb`b```````bb````````````````````bb````````````````````` +````b``bbb``````b`bb``b`b``bb````````b````````````````````b`````````````````````` +````b`````b``bbbb`b```b`b```b````````bb``````````````````bb`````````````````````` +````b`b```b`b```b`b```b`b```b`````````b``````````````````b``````````````````````` +````b``bbb```bbbb`b```b``bbbb`````````bbbbbbbbbbbbbbbbbbbb``````````````````````` +````b```````````````````````````````````````````````````````````````````````````` +````bbbbbbbbbbbbbbbbbbbbbbbbbb``````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +`````````````````````````````````````````b``````````````````````````````````````` +`````````````bbbbb`bbbbbbbbbbbbbbbbbbbbbbb``````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +`````````````````bbb````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` +````````````````````````````````````````````````````````````````````````````````` + diff --git a/2018/giles/sand.txt.orig b/2018/giles/sand.txt.orig new file mode 100644 index 000000000..9456084b2 --- /dev/null +++ b/2018/giles/sand.txt.orig @@ -0,0 +1 @@ +bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` `aaaa```a````aa`````````````````````````````````````````````````````````````````` aaaaaaaaaaaaaaa`````````````````````````````````````````````````````````````````` aaaaaaaaaaaaaaaabb````````````````bbbbbbbbb`````````````````````````````````````` aaaaaaaaaaaaaaabb````````````````bb`````````````````````````````````````````````` aaaaaaaaaaaaaabb````````````````bb``````````````````````````````````````````````` baaaaaaaaaaaabb````````````````bb```````````````````````````````````````````````` bbaaaaaaaaaabb````````````````bb````````````````````````````````````````````````` `bbaaaaaaaabb````````````````bb`````````````````````````````````````````````````` ``bbaaaaaabb````````````````bb``````````````````````````````````````````````````` ```bbaaaabb`````````````````b````````````bbbbbbbbbbbbbbb````````````````````````` ````bbaabb``````````````````````````````````````````````````````````````````````` `````bbab```````````````````````````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` ````b```````````````````````````````````````````````````````````````````````````` ````b```````````````````````````````````````````````````````````````````````````` ````b```````````````````````````````````````````````````````````````````````````` ````b``````````````````````````````b````````````````````````b```````````````````` ````b``bbb``````````````````b``````bb``````````````````````bb```````````````````` ````b`b```b`````````````````b```````b``````````````````````b````````````````````` ````b`b``````bbb``b`bb```bb`b```````bb````````````````````bb````````````````````` ````b``bbb``````b`bb``b`b``bb````````b````````````````````b`````````````````````` ````b`````b``bbbb`b```b`b```b````````bb``````````````````bb`````````````````````` ````b`b```b`b```b`b```b`b```b`````````b``````````````````b``````````````````````` ````b``bbb```bbbb`b```b``bbbb`````````bbbbbbbbbbbbbbbbbbbb``````````````````````` ````b```````````````````````````````````````````````````````````````````````````` ````bbbbbbbbbbbbbbbbbbbbbbbbbb``````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` `````````````````````````````````````````b``````````````````````````````````````` `````````````bbbbb`bbbbbbbbbbbbbbbbbbbbbbb``````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` `````````````````bbb````````````````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` ````````````````````````````````````````````````````````````````````````````````` \ No newline at end of file diff --git a/2018/guidelines.txt b/2018/guidelines.txt new file mode 100644 index 000000000..850242ae5 --- /dev/null +++ b/2018/guidelines.txt @@ -0,0 +1,953 @@ +| 25th International Obfuscated C Code Contest Official Guidelines + +| Copyright (C) 2006-2017 Leonid A. Broukhis, Simon Cooper, Landon Curt Noll. + +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in +writing from the contest judges. + +| This guidelines file is version 2017-12-25-v25. + +| Most of the changes from the previous IOCCC guideline set +| have been marked with a "|" on the left hand side of the line. + + + +ABOUT THIS FILE: + + This file contains guidelines intended to help people who wish to + submit entries to the International Obfuscated C Code Contest (IOCCC). + + This is not the IOCCC rules, though it does contain comments about + them. The guidelines should be viewed as hints and suggestions. + Entries that violate the guidelines but remain within the rules are + allowed. Even so, you are safer if you remain within the guidelines. + + You should read the current IOCCC rules, prior to submitting entries. + The rules are typically sent out with these guidelines. + + We recommend that you follow the twitter handle: + + @IOCCC + + to learn about IOCCC news, important IOCCC related alerts, IOCCC + reminders, and changes to the rules and these guidelines. + + You do not have to be a twitter user to follow @IOCCC. Non-twitter + users should access: + + https://twitter.com/ioccc + + Non-twitter users should force their browsers to reload the above URL + to be sure they are seeing the most recent tweets. + + While we try to post use news at: + + http://www.ioccc.org/index.html#news + + such postings may be delayed or obscured by slow to respond mirrors. + + +| WHAT'S NEW IN 2017/2018: + + This IOCCC runs from: + +| 2017-Dec-29 05:38:51 UTC + to: +| 2018-Mar-15 03:08:07 UTC + +| The reason for the UTC time of day in the IOCCC contest timespan is new. + + Until the start of this IOCCC, these rules, guidelines and iocccsize.c tool + should be considered provisional BETA versions and may be adjusted + at any time. + +| Even though the contest will start in 2017, because the contest will close +| in 2018, URLs, subject lines, and contest related email addresses use 2018. + + The IOCCC submission URL: + + https://submit.ioccc.org/ + + will be available and active on or slightly before the start of this IOCCC. + + The official rules, guidelines and iocccsize.c tool will be available + on the official IOCCC web site on or slightly before start of this IOCCC. + Please check the IOCCC web site "How to enter" link: + + http://www.ioccc.org/index.html#enter + + on or after the start of this IOCCC to be sure you are using the correct + versions of these items before using the IOCCC entry submission URL. + + +HINTS AND SUGGESTIONS: + + You are encouraged to examine the winners of previous contests. See + FOR MORE INFORMATION for details on how to get previous winners. + + Keep in mind that rules change from year to year, so some winning entries + may not be valid entries this year. What was unique and novel one year + might be 'old' the next year. + + An entry is usually examined in a number of ways. We typically apply + a number of tests to an entry: + + * look at the original source + * convert ANSI tri-graphs to ASCII + * C pre-process the source ignoring '#include' lines + * C pre-process the source ignoring '#define' and '#include' lines + * run it through a C beautifier + * examine the algorithm + * compile it (with flags to enable all warnings) + * execute it + + You should consider how your entry looks in each of the above tests. + You should ask yourself if your entry remains obscure after it has been + 'cleaned up' by the C pre-processor and a C beautifier. + + Your entry need not pass all of the above tests. In certain + cases, a test is not important. Entries that compete for the + 'strangest/most creative source layout' need not do as well as + others in terms of their algorithm. On the other hand, given + two such entries, we are more inclined to pick the entry that + does something interesting when you run it. + + We try to avoid limiting creativity in our rules. As such, we leave + the contest open for creative rule interpretation. As in real life + programming, interpreting a requirements document or a customer request + is important. For this reason, we often award 'worst abuse of the + rules' to an entry that illustrates this point in an ironic way. + + We do realize that there are holes in the rules, and invite entries + to attempt to exploit them. We will award 'worst abuse of the rules' + and then plug the hole next year. Even so, we will attempt to use + the smallest plug needed, if not smaller. :-) + +| There are 2^5-1 reasons why these guidelines seem obfuscated. + + Check out your program and be sure that it works. We sometimes make + the effort to debug an entry that has a slight problem, particularly + in or near the final round. On the other hand, we have seen some + of the best entries fall down because they didn't work. + + We tend to look down on a prime number printer that claims that + 16 is a prime number. If you do have a bug, you are better off + documenting it. Noting "this entry sometimes prints the 4th power + of a prime by mistake" would save the above entry. And sometimes, + a strange bug/feature can even help the entry! Of course, a correctly + working entry is best. Clever people will note that 16 might be prime + under certain conditions. Wise people, when submitting something clever + will fully explain such cleverness in their entry's remarks file. + + People who are considering to just use some complex mathematical + function or state machine to spell out something such as "hello, + world!" really really, and we do mean really, do need to be more creative. + + Ultra-obfuscated programs are, in some cases, easier to + deobfuscate than subtly-obfuscated programs. Consider using + misleading or subtle tricks layered on top of or under an + appropriate level of obfuscation. A clean looking program with + misleading comments and variable names might be a good start. + + When programs use VTxxx/ANSI sequences, they should NOT limited to a + specific terminal brand. Those programs that work in a standard xterm + are considered more portable. + + Rule 2 (the size rule) has been changed. In particular rule 2 refers to + the use of an IOCCC size tool. The source for this tool is found at: + +| http://www.ioccc.org/2018/iocccsize.c + +| To further clarify rule 2, we subdivided it into two parts, 2a and 2b. +| Your entry must satisfy both the maximum size rule 2a AND your entry +| must satisfy the IOCCC size tool rule 2b. + + The IOCCC size tool should be compiled as: + +| cc -pedantic -Wall -Wextra -std=c11 iocccsize.c -o iocccsize + +| This tool imposes a 2nd limit on C code size (rule 2b). To check your +| code against the 2nd limit of rule 2, use the -i command line option. + For example: + + ./iocccsize -i < prog.c + + The IOCCC size tool, when using the -i option, may be summarized as: + + The size tool counts most C reserved words (keyword, secondary, + and selected preprocessor keywords) as 1. The size tool counts all + other octets as 1 excluding ASCII whitespace, and excluding any + ';', '{' or '}' followed by ASCII whitespace, and excluding any + ';', '{' or '}' octet immediately before the end of file. + + ASCII whitespace includes ASCII tab, ASCII space, ASCII newline, + ASCII formfeed, and ASCII carriage return. + + In cases where the above summary and the algorithm implemented by + the IOCCC size tool source code conflict, the algorithm implemented + by the IOCCC size tool source code is preferred by the judges. + + There are at least 2 other reasons for selecting 2053 as the 2nd limit + besides the fact that 2053 is the next prime > 2048. These reasons + may be searched for and discovered if you are "Curios!" about 2053. :-) + Moreover, 2053 was the number of the kernel disk pack of one of the + judge's BESM-6. + + Take note that this secondary limit imposed by the IOCCC size tool + obviates some of the need to #define C reserved words in an effort + to get around the size limits of rule 2. + + Yes Virginia, that is a hint! + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many C compilers dislike the following code, and so do we: + + #define d define + #d foo /* <-- don't expect this to turn into #define foo */ + + When declaring local or global variables, you should declare the type: + + int this_is_fine; + this_is_not; /* <-- Try to avoid implicit type declarations */ + + We suggest that you compile your entry with a commonly available + c11 (formerly C1X) C compiler (ISO/IEC 9899:2011). + + Do not assume that optional c11 features are supported. If you + must use an optional c11 feature, use feature test macros so + that implementations without such optional c11 features will see + an entry that is both functional and interesting. + + We like entries that have workarounds that allow someone with + an older c99 (ISO/IEC 9899:1999) compiler to be able to compile + and enjoy your entry. + +| We really like "lint free" code. However lint is a toll of the past. +| So try to ensure that your entry compiles warning free. If possible, +| to compile compile your code using: +| +| -Wall -Wextra -pedantic +| +| For compilers, such as clang, that have the -Weverything option, try +| to make your code compile warning free using: +| +| -Wall -Wextra -Weverything -pedantic +| +| If you must turn off various warnings on the compile line such as: +| +| ... -Wno-empty-body -Wno-return-type ... +| +| be sure to clearly state so in your remarks AS WELL AS in +| your "how to build" / Makefile. +| +| All other things being equal, a program that must turn off fewer +| warnings will be considered better, for certain values of better. + +| Unless you clearly state otherwise in your remarks AS WELL AS in +| your "how to build" / Makefile we will compile using: +| +| -O3 -std=c11 + + Anyone care to submit an entry that makes gratuitous use of all + of the c11 reserved words in their intended C language contexts? + NOTE: As with the use of the word Belgium, the use of certain gratuitous + c11 reserved words may be completely banned in all parts of the Galaxy, + except in one small part (ISO/IEC 9899:2011) where they might not truly + understand the implications of such words. + + http://hitchhikers.wikia.com/wiki/Belgium + http://www.bezem.de/pdf/ReservedWordsInC.pdf + + DO NOT assume that we will use gcc to compile your program. + We will first try to compile your program using Clang. + + It is much better to not use any obscure compiler flags if + you can help it. We want to discourage the use of obscure compiler + flags that would make the program less portable. + + One side effect of the above is that you cannot assume the use + of nested functions such as: + + main() { +| void do_not_do_this() { +| printf("The machine that goes bing!\n"); +| } +| do_not_do_this(); + } + + This is because such nested functions often requires one to compile with + a flag such as -fnested-functions that is not found on some compilers. + + On 2012 July 20, the judges rescinded the encouragement of + nested functions. Such constructions, while interesting and sometimes + amusing, will have to wait until they required by a C standard that are + actually implemented in commonly used C compilers. Sorry! + +| We prefer programs that do not require a fish license for pet fish, crayon + use not withstanding. + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using . Use instead. + + On 28 January 2007, the Judges rescinded the requirement that the + '#" in a C preprocessor directive must be the 1st non-whitespace octet. + + The exit() function returns void. Some broken systems have exit() + return int, your entry should assume that exit() returns a void. + +| This guideline has a change mark at the very beginning. + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + +| While those who are used to temperatures found on dwarf planet +| Pluto might be able to explain to the Walrus why our seas are + boiling hot, the question of whether pigs have wings is likely + to remain a debatable point to most of them. + + One line programs should be short one line programs: say around 80 to 120 + octets long. Going well beyond 140 octets is a bit too long to be called + a one-liner in our vague opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS version specific + (index/strchr differences are OK, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is OK only if you warn us in the 'remark' header item) + * won't compile or run under a POSIX P1003.1/P1003.2 like systems + * depend on a utility or application not normally found on most + most POSIX P1003.1/P1003.2 like systems + * abuse the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are "blob-ier" than they need to be + * are rather similar to previous winners :-( + * are too similar to previous losers :-) + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + At least one judge prefers to maintain the use of the leap-second + as part of the world's time standard. If your code prints time + with seconds, we prefer that your code be capable of printing the + time of day during a leap-second where the value in seconds + after the minute mark is 60. + + The "how to build" make process should not be used to try and get + around the size limit. It is one thing to make use of a several -D's + on the compile like to help out, but it is quite another to use many + bytes of -D's in order to try and squeeze the source under the size limit. + + The judges, as a group, have a history giving wide degree of latitude + to reasonable entries. And recently they have had as much longitudinal + variation as it is possible to have on Earth. :-) + + You should try to restrict commands used on the build file to + POSIX-like or common Un*x-like commands. You can also compile + and use your own programs. If you do, try to build and execute + from the current directory. This restriction is not a hard and + absolute one. The intent is to ensure that the building if your + program is reasonably portable. + +| We prefer programs that are portable across a wide variety of Un*x-like +| operating systems (i.e., Linux, BSD, Un*x, etc.). + + You are in a maze of twisty guidelines, all different. + + There are at least zero judges who think that Fideism has little + or nothing to do with the IOCCC judging process. + + Don't forget that the building of your program should be done + ***without human intervention***. So don't do things such as: + + prog: prog.c + #echo this next line requires data from standard input + cat > prog.c + ${CC} prog.c -o prog + + However, you can do something cute such as making your program + do something dumb (or cute) when it is built 'automatically'. And + when it is run with a human involved, do something more clever. + For example, one could use the build instructions: + + prog: prog.c + ${CC} prog.c -DNON_HUMAN_COMPILE -o prog + @echo "See remarks section about alternate ways to compile" + + and then include special notes in the program "remarks" for + alternate / human intervention based building. + + We want to get away from source that is simply a compact blob of + octets. Really try to be more creative than blob coding. *HINT!* + + Please do not use things like gzip to get around the size limit. +| Try to be much more creative. + + We really dislike entries that make blatant use of including + large data files to get around the source code size limit. + + We do not recommend submitting systemd source code to the IOCCC, + if nothing else because that code is likely to exceed the source code + size limit. This isn't to say that another highly compact and obfuscated + replacement of init would not be an interesting submission. + + Did we remember to indicate that programs that blatantly use + some complex state machine to do something simple are boring? + We think we did. :-) + + All generalizations are false, including this one. -- Mark Twain + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! + Remember, you can submit more than one entry. See the rules for details. + + We suggest that you avoid trying for the 'smallest self-replicating' + source. The smallest, a zero byte entry, won in 1994. + + Programs that claim to be the smallest C source that does something, really + better be the smallest such program or they risk being rejected because + they do not work as documented. + + Please note that the C source below, besides lacking in obfuscation, + is NOT the smallest C source file that when compiled and run, dumps core: + + main; + + We do not like writable strings. That is, we don't want stuff like: + + char *T = "So many primes, so little time!"; + ... + T[14] = ';'; + + Please don't make use of this feature, even if your system allows it. + However, initialized char arrays are OK to write over. This is OK: + + char b[] = "Is this OK"; + b[9] = 'K'; + +| There are more than zero typos in this sentence. + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. For + example, don't depend on a particular type or size of display. + Don't assume the use of a particular browser. Instead assume a + generic browser that forms to a widely used W3C standard. + Don't assume a particular sound sub-system or video driver is installed + in the OS. Instead, make use of a well known and widely available open + source program (one that actually works) to display audio/visual data. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. + + This is the only guideline that contains the word fizzbin. + + We don't like entries that use proprietary toolkits such as the M*tif, + Xv*ew, or OpenL*ok toolkits, since not everyone has them. Use of an + open source toolkit that is widely and freely available instead. + + The previous guideline in this spot has been replaced by this guideline. + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines + in the program "remarks". They should also not depend on any + particular window manager. + + Try to avoid entries that play silent sound segments or play the + Happy Birthday song; music that some people believe is copyrighted + (even if such copyrights appear to be bogus and/or blatant abuses of + the copyright system). + + While we recognize that UN*X is not a universal operating system, the + contest does have a bias towards such systems. In an effort to expand + the scope of the contest, we phrase our bias in terms of POSIX P1003.1 + and P1003.2 standards. This will allow certain non-UN*X OS users to + submit entries. On the other hand, this is a guideline and not a rule. + We will not reject an entry based on some POSIX technicality. + + When dealing with OS and application environments, we suggest that you + be reasonable with a nod towards vanilla UN*X-like systems. POSIX will + evolve but not as much as the contest. + + You very well might not be completely prohibited from failing to not + partly misunderstand this particular guideline, but of course we could +| not possibly comment. Nevertheless, you are neither required nor mandated +| to determine that this or the previous sentence is false and misleading. +| Therefore, it might be wise to not fail to consider failing to do so. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION <== HINT!! + * make us laugh and/or throw up :-) (humor really helps!) + * make us want to eat good chocolate. + + Some types of programs can't excel (anti-tm) in some areas. Your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + You are better off explaining what your entry does in the program + "remarks" section rather than leaving it obscure for the judges + as we might miss something and/or be too tired to notice. + +| Please avoid this specific individual guideline, when possible. + + We freely admit that interesting, creative or humorous comments in + the program "remarks" help your chances of winning. If you had to + read so many twisted entries, you too would enjoy a good laugh or two. + We think the readers of the contest winners do as well. We do read + the program "remarks" during the judging process, so it is worth your + while to write remarkable program "remarks". + + We dislike C code with trailing control-M's (\r or \015) that results + in compilation failures. Some non-Un*x/non-Linux tools such as + MS Visual C and MS Visual C++ leave trailing control-M's on lines. + Users of such tools should strip off such control-M's before submitting + their entries. In some cases tools have a "Save As" option that will + prevent such trailing control-M's being added. + + One should restrict libcurses to portable features found on BSD + or Linux curses. + + Rule 13 states any C source that fails to compile because of unescaped + octets with the high bit set (octet value >= 128) will be rejected. + Instead of unescaped octets, you should use \octal or \hex escapes: + + /* 123456789 123456789 123456789 123456 */ + char *foo = "This string is 36 octets in length \263"; + /* This octet requires 4 octets of source ^^^^ */ + if (strlen(foo) == 36) printf("foo is 36 octets plus a final NUL\n"); + else printf("This code should not print this message\n"); + + It is a very good idea to, in your remarks file, tell us why you + think your entry is obfuscated. This is particularly true if + your entry is has some very subtle obfuscations that we might + otherwise overlook. <<-- Hint! + + Anyone can format their code into a dense blob. A really clever + author will try format their entry using a "normal" formatting style + such that at first glance (if you squint and don't look at the details) + the code might pass for non-obfuscated C. Deceptive comments, + and mis-leading formatting, in some cases, may be a plus. On the + other hand, a misleading code style requires more source bytes. + + If you do elect to use misleading formatting and comments, we + suggest you remark on this point in your remarks where you talk + about why you think your entry is obfuscated. On the other hand, + if you are pushing up against the size limits, you may be forced + into creating a dense blob. Such are the trade offs that obfuscators face! + + We prefer code that can run on either a 64-bit or 32-bit processor. + However, it is unwise to assume it will run on an i386 or x86 architecture. + + We believe that Mark Twain's remark: + + Get your facts first, then you can distort them as you please. + + is a good guideline for those writing code for the IOCCC. + +| The IOCCC size tool source, iocccsize.c, is not an original work. +| Submitting an entry based on our iocccsize.c violates rule 8, +| even if you write that code! + +| Rule 8 does not prohibit you from writing your own obfuscated IOCCC size tool. +| However if you do, you might wish to make your tool do something more +| interesting than simply implementing the IOCCC size tool algorithm. + + While programs that only run in a specific word size are OK. If you have + to pick, choose a 64-bit word size. + + If we are feeling ornery we might choose to compile your program + for running on an Arduino or a PDP-11. Heck, should we ever find + an emulator of 60-bit CDC Cyber CPU running a POSIX-like OS, we + might just try your entry on that emulator as well :-) + + If your entry MUST run only in 32-bit mode on an Intel processor, add the + following compiler flag: + + -arch i386 + + to your "how to build" make compile line. For example: + + prog: prog.c + ${CC} prog.c -arch i386 -o prog + + Be even more creative! + +| If there are limitations in your entry, you are highly encouraged +| to note such limitations in your remarks file. For example if your +| entry factors values up to a certain size, you might want to state: +| +| This entry factors values up 2305567963945518424753102147331756070. +| Attempting to factor larger values will produce unpredictable results. +| +| The judges might try to factor the value -5, so you want to might state: +| +| This entry factors positive values up 2305567963945518424753102147331756070. +| Attempting to factor large values will produce unpredictable results. +| +| However the judges might try to also factor 0, so you want to might state: +| +| This entry factors values between 1 and 2305567963945518424753102147331756070. +| Attempting to factor values outside that range will produce unpredictable results. +| +| Moreover the try to also factor 3.5 or 0x7, or Fred, so you want to might state: +| +| This entry factors integers between 1 and 2305567963945518424753102147331756070. +| Attempting to factor anything else will produce unpredictable results. +| +| You entry might be better off catching the attempt to factor bogus values +| and doing something interesting. So you might want to code accordingly and state: +| +| This entry factors integers between 1 and 2305567963945518424753102147331756070. +| Attempting to factor anything else will cause the program to insult your +| pet fish Eric. +| +| The judges might not have a pet fish named Eric, so might want to state: +| +| This entry factors integers between 1 and 2305567963945518424753102147331756070. +| Attempting to factor anything else will cause the program to insult your +| pet fish Eric, or in the case that you lack such a pet, will insult the +| pet that you do not have. +| +| When all other things are equal, an entry with fewer limitation will be judged +| better than an entry with lots of limitations. So you might want to code accordingly +| and state: +| +| This entry attempts to a factor value of any size provided that the program +| is given enough time and memory. If the value is not a proper integer, the +| program will insult a fish named Eric, even if such a fish does not exist. +| +| BTW: What is so special about 2305567963945518424753102147331756070? You tell us! + + +ABUSING THE RULES: + + Legal abuse of the rules is somewhat encouraged. Legal rule abuse may + involve, but is not limited to, doing things that are technically + allowed by the rules and yet do not fit the spirit of what we intended + to be submitted. + + Legal rule abuse is encouraged to help promote creativity. Rule abuse + entries, regardless of if they receive an award, result in changes to + the next year's rules and guidelines. + + Legal abuse of the rules is NOT an invitation to violate the rules. + An entry that violates the rules in the opinion of the judges, WILL be + disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK! If you + have an entry that might otherwise be interesting, you might want to + submit two versions; one that does not abuse the rules and one that + does. + + If you intend to abuse the rules, indicate so in the program + "remarks". You must try to justify why you consider your rule abuse + to be allowed under the rules. That is, you must plead your case as + to why your entry is valid. Humor and/or creativity help plead a + case. + + Abusing the web submission procedure tends to annoy us more + than amuse us. Spend your creative energy on content of your + entry rather than on the submission process itself. + + We are often asked why the contest rules and guidelines seem too + strange or contain mistakes, flaws or grammatical errors. One reason + is that we sometimes make genuine mistakes. But in many cases such + problems, flaws or areas of confusion are deliberate. Changes to + rules and guidelines in response to rule abuses, are done in a minimal + fashion. Often we will deliberately leave behind holes (or introduce + new ones) so that future rule abuse may continue. A cleaver author + should be able to read them and "drive a truck through the holes" in + the rules and guidelines. + + At the risk of stating the obvious, this contest is a parody of the + software development process. The rules and guidelines are only a + small part of the overall contest. Even so, one may think the contest + rules and guideline process as a parody of the sometimes tragic + mismatch between what a customer (or marketing) wants and what + engineering delivers. Real programmers must face obfuscated + and sometimes conflicting specifications and requirements from marketing, + sales, product management an even from customers themselves on a +| all too regular basis. This is one of the reasons why the rules and + guidelines are written in obfuscated form. + + +JUDGING PROCESS: + + Entries are judged by Leonid A. Broukhis, Simon Cooper, Landon Curt Noll. + + Each entry submitted is given a random id number and subdirectory. The + entry files including, but not limited to prog.c, Makefile (that we + form from around your "how to build" information), as well as any + data files that you submit are all placed under their own directory. + stored and judged from this directory. + + Any information about the authors is not read by the judges until + the judging process is complete, and then only from entries that have + won an award. Because we do not read this information for entries that + do not win, we do not know who did not win. + + The above process helps keep us biased for/against any one particular + individual. Therefore you MUST refrain from putting any information + that reveals your identity in your entry. + + Now some people point out that coding style might reveal the information + about the others. However we consider this to be simply circumstantial + and outside the scope of the above paragraph. + + Some people, in the past, have attempted to obfuscate their identity by + including comments of famous Internet personalities such as Peter Honeyman + (http://www.citi.umich.edu/u/honey/). The judges are on to this + trick and therefore consider any obfuscated source or data file + claiming to be from Honeyman to not be form Honeyman. This of course + creates an interesting paradox known as the "obfuscated Peter Honeyman + paradox". Should Peter Honeyman actually submit an obfuscated entry, + he alone is excluded from the above, as we will likely believe + it just another attempt at confusion. This guideline is known + as the "Peter Honeyman is exempt" guideline. + + BTW: None of the entries claiming to be from Peter Honeyman have ever + won an award. So it is theoretically possible that Peter Honeyman + did submit an entry in the past. In the past, Peter had denied + submitting anything to the IOCCC. Perhaps those entries were + submitted by one of his students? + +| Hopefully we are CLEAR on this point! The rules now strongly state: +| PLEASE DO NOT put author's names, in obvious way, into your + source code, remarks, data files, etc. The above "Peter Honeyman is + exempt" not withstanding. + + We seemed to have digressed again ... :-) Returning to the judging process: + + We prefer to be kept in the dark as much as you are until the final + awards are given. We enjoy the surprise of finding out in the end, + who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. + + During the judging process. a process that spans multiple sessions + over a few weeks, post general updates from our @IOCCC twitter account. + + Once we have selected the winners, for each category we will tweet: + + category name + name(s) of the authors (or anonymous if requested) + twitter handle(s) (if provided and if anonymity was not requested) + country code(s) of the author(s) + +| After the initial announcement, we attempt to send Email to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes and typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the "how to build" information and forming a Makefile + * reading prog.c, the C source + * reviewing the "remarks" information + * briefly looking any any supplied data files + * passing the source thru the C pre-processor + skipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + skipping over any #include files + * compiling/building the source + * running the program + * Doing other things that only IOCCC judges know about :-) + + In later rounds, other actions are performed including performing + miscellaneous tests on the source and binary. + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry will often compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program (see above about one line programs) + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code (code with deceptive comments and source code) + * best X client (see OUR LIKES AND DISLIKES) + * best abuse of ISO C or ANSI C standard (see above about compilers) + * best abuse of the C preprocessor + * worst abuse of the rules + * (anything else so strange that it deserves an award) + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to to about + half that number: declaring those remaining to be winners. + + Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry is good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + + More than one IOCCC judge has been known to bribe another IOCCC judge + into voting for a winning entry by offering a bit high quality chocolate. + This technique is highly discouraged for use by non-IOCCC judges. + + More often than not, we select a small entry (usually one line), a + strange/creative layout entry. We sometimes also select an + entry that abuses the contest guidelines in an interesting way, + or that stretches the content rules that while legal, is + nevertheless goes against the intent of the rules. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entries. More often, the + 'best' is picked because it does well in a number of categories. + + In years past, we renamed the winning entry from prog.c to a + name related to the submitter(s) names. This is no longer done. + Winning source is called prog.c A compiled binary is called prog. + + +ANNOUNCEMENT OF WINNERS: + + The judges will tweet initial announcement of who won, the name + of their award, and a very brief description of the winning entry + from the @IOCCC twitter handle. Non-twitter users should visit: + + https://twitter.com/ioccc + + Non-twitter users should force their browsers to reload the above URL + to be sure they are seeing the most recent tweets. + + The judges will then post an initial announcement of who won, the name + of their award, and a very brief description of the winning entry + on the IOCCC web site: + + http://www.ioccc.org/whowon.html + + We will also attempt to submit a brief announcement story to /.: + + http://slashdot.org + + that, depending on the willingness of the /. editors, may be posted + to their site at the same time. + + Note that initial announcement will NOT contain source. This is because + the winning authors are given a chance to review the judges comments, + and test our Makefile. This review process typically takes a few weeks. + + Sometime after the initial announcement, and once the the review + by the winners has been completed, the winning source will be + posted to the IOCCC web site: + + http://www.ioccc.org/years.html + + NOTE: previous winners are available at that URL + + We will also tweet, via @IOCCC, when the winning source is available. + + It is pointless to ask the IOCCC judges how many entries we receive. + Other government TLA or FLA snooping organizations are prohibited from + either confirming, denying or revealing any knowledge of this data point. + + Often, winning entries are published in selected magazines from around + the world. Winners have appeared in books ("The New Hackers Dictionary") + and on T-Shirts. More than one winner has been turned in a tattoo! + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + +| You may contact the judges by sending Email to the following address: + +| q.2018@ioccc.org (do not submit entries to this address) + +| You must include the words 'ioccc 2018 question' in the subject of your +| Email message when sending Email to the judges. + + Questions and comments about the contest are welcome. Comments about + confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. + + Check out the IOCCC Web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + For the updates and breaking IOCCC news, you are encouraged to follow + the twitter handle: + + @IOCCC + + You do not have to be a twitter user to follow @IOCCC. Non-twitter + users should access: + + https://twitter.com/ioccc + + Non-twitter users should force their browsers to reload the above URL + to be sure they are seeing the most recent tweets. + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ diff --git a/2018/hint.css b/2018/hint.css new file mode 100644 index 000000000..cbb7257ac --- /dev/null +++ b/2018/hint.css @@ -0,0 +1,77 @@ +* { + font-family: Helvetica Neue, Helvetica, Arial, sans-serif; +} +body { + max-width: 50em; + margin: 0 auto; + color: #111; +} + +pre, code { + font-family: Monaco, Courier New, monospace; + font-size: 12px; +} + +h1 { + font-size: 40px; + font-weight: bold; + letter-spacing: -1px; + margin-bottom: -5px; +} +h1 code { + font-size: 40px; +} + +h2 { + color: rgb(43,105,145); + font-weight: bold; + margin-bottom: -5px; +} +h2 code { + font-size: 22px; +} + +h3 { + /* color: rgb(43,105,145); */ + font-weight: bold; + margin-bottom: -5px; +} +h3 code { + font-size: 16px; +} + +a { + color: blue; + text-decoration: underline; +} +a:visited { + color: navy; +} +a:hover { + text-decoration: underline; +} + +pre { + border-radius: 10px; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + border-width: 1px; + border-color: rgb(16,48,0); + border-style: solid; + padding: 0.6em; + padding-left: 1em; + margin-left: 5%; + margin-right: 8%; + background-color: rgb(0,47,53); + overflow: auto; + color: rgb(181,199,255); +} + +p, li { + font-size: 14px; + line-height: 18px; +} + diff --git a/2018/hou/Makefile b/2018/hou/Makefile new file mode 100644 index 000000000..bb818b70e --- /dev/null +++ b/2018/hou/Makefile @@ -0,0 +1,287 @@ +#!/usr/bin/env make +# +# 2018 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +GZIP_PROG= gzip +BZIP2= bzip2 +CURL= curl +DD= dd +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq +STRIP= strip + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +CSILENCE= +#CSILENCE= -Wno-implicit-int + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= -D_DEFAULT_SOURCE +#CDEFINE= -DIOCCC=25 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= -lm +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= +ALT_TARGET= prog.orig + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +prog.orig: prog.orig.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 3a3fabb90892eeb2f610ae0f74a35a970060665a063ab702bd686c17c4ae07f6 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2018/hou/hint.html b/2018/hou/hint.html new file mode 100644 index 000000000..671fa5d46 --- /dev/null +++ b/2018/hou/hint.html @@ -0,0 +1,72 @@ + + + + + + + Most likely to top the charts + + +

    Most likely to top the charts

    + +

    Qiming HOU

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +./prog < input.json > output.html
    +
    + +

    View output.html in a browser.

    + +

    Try:

    + +
    grep -e '[-?+*/^&|.<>=]' prog.c
    +
    +(cd ..; ls -lS */prog.c) | \
    +awk 'BEGIN { print "["; } { print "{\"winner\":\"",$9,"\", \"size\":",$5,"},"} END { print "]"}' \
    +> ioccc.json
    +./prog < ioccc.json > ioccc.html
    +
    + +

    What’s not right with the output? How to fix it?

    + +

    Selected Judges Remarks:

    + +

    This entry exhibits a way of obfuscation we haven’t seen before, we think. +The rulez of programming in an imperative language are violated, aren’t they?

    + +

    Try figuring out how to increase the number of different colors, if you can.

    + +

    Author’s comments:

    + +

    Nowadays almost every programmer needs to do some Web chore. With all the open source stuff readily available, often we just need to call a bunch of libraries to generate an HTML page from a JSON feed.

    + +

    This entry takes such decadence to an extreme. It just calls a bunch of libraries to generate an HTML page from a JSON feed, literally. There is no variable (function parameters included), no operator, no flow control statements except a few decorative returns. In compliance to production coding standards, the code is littered with fashionable jargon, doxygen comment, and license text.

    + +

    As one would expect from such an approach, this program is much more resource intensive than it should be. And one needs a C99-compatible libc (with the common UNIX stuff) to build this and an HTML5-compatible browser to open the result. And it terminates with an assertion failure, but who cares if the web page is already generated?

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2018, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2018/hou/hint.text b/2018/hou/hint.text new file mode 100644 index 000000000..5e4e9d14a --- /dev/null +++ b/2018/hou/hint.text @@ -0,0 +1,48 @@ +# Most likely to top the charts + +Qiming HOU + + +## Judges' comments: +### To use: + + make + ./prog < input.json > output.html + +View `output.html` in a browser. + +### Try: + + grep -e '[-?+*/^&|.<>=]' prog.c + + (cd ..; ls -lS */prog.c) | \ + awk 'BEGIN { print "["; } { print "{\"winner\":\"",$9,"\", \"size\":",$5,"},"} END { print "]"}' \ + > ioccc.json + ./prog < ioccc.json > ioccc.html + +What's not right with the output? How to fix it? + +### Selected Judges Remarks: + +This entry exhibits a way of obfuscation we haven't seen before, we think. +The rulez of programming in an imperative language are violated, aren't they? + +Try figuring out how to increase the number of different colors, if you can. + + +## Author's comments: + +Nowadays almost every programmer needs to do some Web chore. With all the open source stuff readily available, often we just need to call a bunch of libraries to generate an HTML page from a JSON feed. + +This entry takes such decadence to an extreme. It just calls a bunch of libraries to generate an HTML page from a JSON feed, literally. There is no variable (function parameters included), no operator, no flow control statements except a few decorative returns. In compliance to production coding standards, the code is littered with fashionable jargon, doxygen comment, and license text. + +As one would expect from such an approach, this program is much more resource intensive than it should be. And one needs a C99-compatible libc (with the common UNIX stuff) to build this and an HTML5-compatible browser to open the result. And it terminates with an assertion failure, but who cares if the web page is already generated? + +-------------------------------------------------------------------------------- + diff --git a/2018/hou/input.json b/2018/hou/input.json new file mode 100644 index 000000000..962002240 --- /dev/null +++ b/2018/hou/input.json @@ -0,0 +1,8 @@ +[{"brand":"Foo","sales": 1.5 }, + {"brand": + "Bar" + , + "sales":4.7 + }, { "sales":2.1, "brand":"Lolz" } +, { "sales":0.1, "brand":"Misc" }, { "sales":0.1, "brand":"Misc" }, { "sales":0.1, "brand":"Misc" } +] diff --git a/2018/hou/prog.c b/2018/hou/prog.c new file mode 100644 index 000000000..b84e9a020 --- /dev/null +++ b/2018/hou/prog.c @@ -0,0 +1,199 @@ +/** + * \file prog.c + * + * \brief Renders an HTML chart from JSON data + * + * \author Qiming HOU + * + * Copyright (C) 2017-2018, Qiming HOU + * + * Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported + * (CC BY-SA 3.0), you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://creativecommons.org/licenses/by-sa/3.0/ + * + * This file is an IOCCC submission. + * + * This thing wouldn't be possible without the advent of C / HTML standards. + * We all love the new math functions in C99 and the inclusion of SVG in + * HTML5. + * + * Changelog: + * 2018-04-16 fixed the rounding bug + */ +#include +#include +#include +#include +#include +#include +#include + +/* Macros are named after fashionable jargon */ + +#define J ceil(log(erfc(1))) +#define S calloc(3, 1) +#define O strcat(strcat(S, m(37)), m(102)) +#define N I(T(6)) +#define _(X) mmap(fopen(S, S), 64, 3, 1, X, 0) +#define H(X) dup2(fileno(tmpfile()), X); m(ftruncate(X, 64)) +#define T(X) getenv(L(r(1, X, 64))) +#define M(X, Y) memcmp(T(X), L(Y), 1) +#define L(X) memset(S, X, 1) + +#define m(X) memset(S, X, N) +#define o(X) r(copysign(1, X), exp2(J), exp2(J)) +#define b(X) o(r(abs(X), J, 0)) +#define i(X) setenv(L(70), L(r(1, X, 48)), 1) +#define l(X, Y) setenv(m(r(1, X, 64)), L(Y), 1) +#define e(X) setenv(m(r(1, X, 64)), \ + strcat(strcpy(malloc(r(p(T(X)), 1, 2)), T(X)), T(4)), 1) + +#define W(X) printf(O, fabs(X)) +#define E(X) putchar(r(N, X, 32)) +#define B(X, Y) sprintf(_(r(N, X, 3)), O, Y) + +#define j(X) t; E(55); E(41); E(36); E(52); E(40); E(29); W(X); t; E(40); \ + E(37); E(41); E(39); E(40); E(52); E(29); W(X) +#define a(X) l(8, 0); i(o(M(8, X))) +#define v t; E(16); t +#define A E(52); E(37); E(56); E(52) +#define s W(r(200, sin(I(_(4))), 250)); t; W(r(200, cos(I(_(4))), 250)) +#define c E(38); E(41); E(44); E(44); E(29); E(50); E(39); E(34); E(8); \ + W(r(cos(p(T(2))), 48, 48)); E(5); E(12); E(16); E(5); E(12); \ + W(r(sin(p(T(2))), 48, 48)); E(5); E(9); t; E(15); E(30); e(2) +#define r fma +#define I atof +#define p strlen +#define t E(0) + +#define rulez o(r(J, exp2(N), p(T(1)))) + +/** + * @brief Renders the chart from JSON input + * + * Expected input format: + * [ {"foo": string, "bar": number}, ... ] + * + * @return nothing + */ +int C(){ + i(1); + l(4, getchar()); + l(8, r( + I(T(5)), 4, + r(N, o(M(4, 33)), r(N, b(M(4, 44)), r(b(M(4, 34)), 2, 1))) + )); + i(0); + a(13); + E(28); + E(48); + E(33); + E(52); + E(40); + t; + E(36); + E(29); + E(7); + E(45); + W(250); + t; + W(250); + E(44); + s; + B(1, r( + exp2(r(J, log2(I(_(5))), log2(I(T(1))))), + r(2, acos(J), 0), + I(_(4)) + )); + E(33); + W(200); + t; + W(200); + v; + E(r(1, o(r(2, I(T(1)), r(J, I(_(5)), 0))), 16)); + v; + s; + E(58); + E(7); + c; + setenv(m(65), strchr(T(1), r(1, I(T(7)), 9)), 1); + l(7, r(J, I(T(7)), 49)); + fflush(fopen(S, S)); + assert(rulez); + a(12); + l(5, 48); + E(28); + E(15); + A; + E(30); + a(9); + m(write(1, T(4), N)); + a(8); + l(5, 50); + E(28); + E(50); + E(37); + E(35); + E(52); + j(16); + t; + E(56); + E(29); + W(472); + t; + E(57); + E(29); + W(r(p(T(2)), 28, 0)); + t; + c; + E(28); + A; + t; + E(56); + E(29); + W(500); + t; + E(57); + E(29); + W(r(p(T(2)), 28, r(J, 16, 0))); + E(30); + a(7); + l(5, 48); + l(4, r(1, I(T(7)), 9)); + e(1); + l(7, r(J, I(T(7)), 49)); + B(2, r(1, I(_(5)), I(strrchr(T(r(N, J, 2)), r(N, I(T(7)), 9))))); + a(6); + e(1); + a(1); + i(r(N, b(M(4, 58)), 0)); + l(5, 49); + a(1); + i(r(N, b(M(4, J)), 0)); + l(7, 9); + l(5, 51); + l(2, 9); + return C(); +} + +int main(){ + i(1); + E(28); + E(51); + E(54); + E(39); + j(r(2, 250, 250)); + E(30); + l(1, 10); + l(2, 9); + l(8, 9); + l(4, 9); + l(5, 9); + l(7, 9); + H(3); + H(4); + H(5); + return C(); +} diff --git a/2018/hou/prog.orig.c b/2018/hou/prog.orig.c new file mode 100644 index 000000000..b5bebad3b --- /dev/null +++ b/2018/hou/prog.orig.c @@ -0,0 +1,197 @@ +/** + * \file prog.c + * + * \brief Renders an HTML chart from JSON data + * + * \author Qiming HOU + * + * Copyright (C) 2017-2018, Qiming HOU + * + * Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported + * (CC BY-SA 3.0), you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://creativecommons.org/licenses/by-sa/3.0/ + * + * This file is an IOCCC submission. + * + * This thing wouldn't be possible without the advent of C / HTML standards. + * We all love the new math functions in C99 and the inclusion of SVG in + * HTML5. + * + */ +#include +#include +#include +#include +#include +#include +#include + +/* Macros are named after fashionable jargon */ + +#define J ceil(log(erfc(1))) +#define S calloc(3, 1) +#define O strcat(strcat(S, m(37)), m(102)) +#define N I(T(6)) +#define _(X) mmap(fopen(S, S), 64, 3, 1, X, 0) +#define H(X) dup2(fileno(tmpfile()), X); m(ftruncate(X, 64)) +#define T(X) getenv(L(r(1, X, 64))) +#define M(X, Y) memcmp(T(X), L(Y), 1) +#define L(X) memset(S, X, 1) + +#define m(X) memset(S, X, N) +#define o(X) r(copysign(1, X), exp2(J), exp2(J)) +#define b(X) o(r(abs(X), J, 0)) +#define i(X) setenv(L(70), L(r(1, X, 48)), 1) +#define l(X, Y) setenv(m(r(1, X, 64)), L(Y), 1) +#define e(X) setenv(m(r(1, X, 64)), \ + strcat(strcpy(malloc(r(p(T(X)), 1, 2)), T(X)), T(4)), 1) + +#define W(X) printf(O, floor(X)) +#define E(X) putchar(r(N, X, 32)) +#define B(X, Y) sprintf(_(r(N, X, 3)), O, Y) + +#define j(X) t; E(55); E(41); E(36); E(52); E(40); E(29); W(X); t; E(40); \ + E(37); E(41); E(39); E(40); E(52); E(29); W(X) +#define a(X) l(8, 0); i(o(M(8, X))) +#define v t; E(16); t +#define A E(52); E(37); E(56); E(52) +#define s W(r(200, sin(I(_(4))), 250)); t; W(r(200, cos(I(_(4))), 250)) +#define c E(38); E(41); E(44); E(44); E(29); E(50); E(39); E(34); E(8); \ + W(r(cos(p(T(2))), 48, 48)); E(5); E(12); E(16); E(5); E(12); \ + W(r(sin(p(T(2))), 48, 48)); E(5); E(9); t; E(15); E(30); e(2) +#define r fma +#define I atof +#define p strlen +#define t E(0) + +#define rulez o(r(J, exp2(N), p(T(1)))) + +/** + * @brief Renders the chart from JSON input + * + * Expected input format: + * [ {"foo": string, "bar": number}, ... ] + * + * @return nothing + */ +int C(){ + i(1); + l(4, getchar()); + l(8, r( + I(T(5)), 4, + r(N, o(M(4, 33)), r(N, b(M(4, 44)), r(b(M(4, 34)), 2, 1))) + )); + i(0); + a(13); + E(28); + E(48); + E(33); + E(52); + E(40); + t; + E(36); + E(29); + E(7); + E(45); + W(250); + t; + W(250); + E(44); + s; + B(1, r( + exp2(r(J, log2(I(_(5))), log2(I(T(1))))), + r(2, acos(J), 0), + I(_(4)) + )); + E(33); + W(200); + t; + W(200); + v; + E(r(1, o(r(2, I(T(1)), r(J, I(_(5)), 0))), 16)); + v; + s; + E(58); + E(7); + c; + setenv(m(65), strchr(T(1), r(1, I(T(7)), 9)), 1); + l(7, r(J, I(T(7)), 49)); + fflush(fopen(S, S)); + assert(rulez); + a(12); + l(5, 48); + E(28); + E(15); + A; + E(30); + a(9); + m(write(1, T(4), N)); + a(8); + l(5, 50); + E(28); + E(50); + E(37); + E(35); + E(52); + j(16); + t; + E(56); + E(29); + W(472); + t; + E(57); + E(29); + W(r(p(T(2)), 28, 0)); + t; + c; + E(28); + A; + t; + E(56); + E(29); + W(500); + t; + E(57); + E(29); + W(r(p(T(2)), 28, r(J, 16, 0))); + E(30); + a(7); + l(5, 48); + l(4, r(1, I(T(7)), 9)); + e(1); + l(7, r(J, I(T(7)), 49)); + B(2, r(1, I(_(5)), I(strrchr(T(r(N, J, 2)), r(N, I(T(7)), 9))))); + a(6); + e(1); + a(1); + i(r(N, b(M(4, 58)), 0)); + l(5, 49); + a(1); + i(r(N, b(M(4, J)), 0)); + l(7, 9); + l(5, 51); + l(2, 9); + return C(); +} + +int main(){ + i(1); + E(28); + E(51); + E(54); + E(39); + j(r(2, 250, 250)); + E(30); + l(1, 10); + l(2, 9); + l(8, 9); + l(4, 9); + l(5, 9); + l(7, 9); + H(3); + H(4); + H(5); + return C(); +} diff --git a/2018/iocccsize.c b/2018/iocccsize.c new file mode 100644 index 000000000..5ba575b5e --- /dev/null +++ b/2018/iocccsize.c @@ -0,0 +1,620 @@ +/* + * iocccsize - IOCCC Source Size Tool + * + * This IOCCC size tool source file is version 2017-12-25-v25. + * + * "You are not expected to understand this" :-) + * + * Public Domain 1992, 2015 by Anthony Howe. All rights released. + * With IOCCC minor mods in 2013-2017 by chongo (Landon Curt Noll) ^oo^ + * + * SYNOPSIS + * + * ioccc [-kirs] < input + * + * -k keep comment blocks + * -i IOCCC size rule (overall size, modified) + * -r count C reserved words as 1 byte + * -s suppress source output, write only the IOCCC 2nd size count + * + * DESCRIPTION + * + * Taking input from standard input, apply the IOCCC Source Size Rule + * for 2001. The program's official length is written to standard error. + * Also filter out C comment blocks (-k to keep) sending the modified + * source to standard output. + * + * The 2001 Source Size Rule was: + * + * Your entry must be <= 4096 bytes in length. The number of octets + * excluding whitespace (tab, space, newline, form-feed, return), and + * excluding any ';', '{' or '}' followed by whitespace or end of file, + * must be <= 2048. + * + * 2013 Source Size Rule is (-r): + * + * Your entry must be <= 4096 bytes in length. The number of octets + * excluding whitespace (tab, space, newline, form-feed, return), and + * excluding any ';', '{' or '}' followed by whitespace or end of file, + * and where C reserved words, including a subset of preprocessor words, + * count as 1 byte, must be <= 2053 (first prime after 2048). + */ + +/* + * The official IOCCC rule 2 secondary limit on C code size + * + * The IOCCC size tool should be compiled as: + * + * cc -pedantic -Wall -std=c99 iocccsize.c -o iocccsize + * + * This tool computes a 2nd size C code. To check your program source + * against the 2nd limit of rule 2, use the -i command line option. + * + * For example: + * + * ./iocccsize -i < prog.c + * + * The IOCCC size tool, when using the -i option, may be summarized as: + * + * The size tool counts C language keywords (primary, secondary, and + * selected preprocessor keywords) as 1. The size tool counts all + * other octets as 1 excluding ASCII whitespace, and excluding any + * ';', '{' or '}' followed by ASCII whitespace, and excluding any + * ';', '{' or '}' octet immediately before the end of file. + * + * ASCII whitespace includes ASCII tab, ASCII space, ASCII newline, + * ASCII form-feed, and ASCII carriage return. + * + * In cases where the above summary and the algorithm implemented by + * the IOCCC size tool source code conflict, the algorithm implemented + * by the IOCCC size tool source code is preferred by the judges. + * + * See the current IOCCC rules and guidelines for more information. + * In particular, see the current IOCCC size rule for information about + * the maximum value that this tool should print for an entry to be valid. + */ + +/* + * IOCCC Judge's remarks: + * + * This code contains undocumented features. On the other hand, this code + * is RTFS (for certain values of RTFS). One might say that this code + * perfectly documents itself. :-) + * + * Many thanks to Anthony Howe for taking the time to put his OCD + * (Obfuscated Coding Determination) into this code! + */ + +/* + * HINT: The algorithm implemented by this code may or not be obfuscated. + * The algorithm may not or may appear to be obfuscated. + * + * In particular: + * + * We did not invent the algorithm. + * The algorithm consistently finds Obfuscation. + * The algorithm killed Obfuscation. + * The algorithm is banned in C. + * The algorithm is from Bell Labs in Jersey. + * The algorithm constantly finds Obfuscation. + * This is not the algorithm. + * This is close. + */ + +#include +#include +#include +#include +#include + +#define FLAG_SILENCE 1 +#define FLAG_KEEP 2 +#define FLAG_RESERVED 4 +#define FLAG_IOCCC 8 +#define FLAG_SILLY_C 16 +#define FLAG_SILLY_H 32 + +#define BUFFER_SIZE 521 +#define MAX_SIZE 4096 /* IOCCC Rule 2 */ +#define MAX_COUNT 2053 /* IOCCC Rule 2 */ + +static char usage[] = +"usage: ioccc [-kirsch] < prog.c\n" +"\n" +"-k\t\tkeep block comments\n" +"-i\t\tprint official secondary IOCCC size to stdout\n" +"\t\tmax.size warnings to stderr, NOTE: implies -r -s\n" +"-r\t\tcount C reserved words as 1 byte\n" +"-s\t\tsuppress source output, write only the official size\n" +"-c\t\tan undocumented feature\n" +"-h\t\tyet another undocumented feature\n" +; + +#define STRLEN(s) (sizeof (s)-1) + +typedef struct { + size_t length; + const char *word; +} Word; + +/* + * C reserved words, plus a few #preprocessor tokens, that count as 1 + * + * NOTE: For a good list of reserved words in C, see: + * + * http://www.bezem.de/pdf/ReservedWordsInC.pdf + * + * by Johan Bezem of JB Enterprises: + * + * See http://www.bezem.de/en/ + */ +/* + * The following editorial plea expresses a view shared by more than zero + * IOCCC judges. It may not represent the opinion of all those involved + * with this code nor the International Obfuscated C Code Contest as a whole: + * + * The long list of reserved words below should be a source + * of embarrassment to some of those involved in standardizing C. + * The growing list of reserved words, along with an expanding set of + * linguistic inventions has the appearance of feature + * creep that, if left unchecked, risks turning a beautifully elegant + * language into a steaming pile of biological excretion. + * + * The history of the IOCCC has taught us that even minor changes + * to the language are not always well understood by compiler writers, + * let alone the standards body who publishes them. We have enormous + * sympathy for C compiler writers who must keep up with the creeping + * featurism. We are aware of some C standards members who share + * these concerns. Alas, they seem to be a minority. + * + * The C standards body as a whole, before they emit yet more mountains of new + * standardese, might wish consider the option of moth-balling their committee. + * Or if they must produce a new standard, consider naming whatever + * follows c11 as CNC (C's Not C). :-) + */ +static Word cwords[] = { + /* Yes Virginia, we left #define off the list on purpose! */ + { STRLEN("#elif"), "#elif" }, + { STRLEN("#else"), "#else" }, + { STRLEN("#endif"), "#endif" }, + { STRLEN("#error"), "#error" }, + { STRLEN("#ident"), "#ident" }, + { STRLEN("#if"), "#if" }, + { STRLEN("#ifdef"), "#ifdef" }, + { STRLEN("#include"), "#include" }, + { STRLEN("#line"), "#line" }, + { STRLEN("#pragma"), "#pragma" }, + { STRLEN("#sccs"), "#sccs" }, + { STRLEN("#warning"), "#warning" }, + /**/ + { STRLEN("_Alignas"), "_Alignas" }, + { STRLEN("_Alignof"), "_Alignof" }, + { STRLEN("_Atomic"), "_Atomic" }, + { STRLEN("_Bool"), "_Bool" }, + { STRLEN("_Complex"), "_Complex" }, + { STRLEN("_Generic"), "_Generic" }, + { STRLEN("_Imaginary"), "_Imaginary" }, + { STRLEN("_Noreturn"), "_Noreturn" }, + { STRLEN("_Pragma"), "_Pragma" }, + { STRLEN("_Static_assert"), "_Static_assert" }, + { STRLEN("_Thread_local"), "_Thread_local" }, + /* + * this comment is not expected to understand itself + */ + { STRLEN("alignas"), "alignas" }, + { STRLEN("alignof"), "alignof" }, + { STRLEN("and"), "and" }, + { STRLEN("and_eq"), "and_eq" }, + { STRLEN("auto"), "auto" }, + { STRLEN("bitand"), "bitand" }, + { STRLEN("bitor"), "bitor" }, + { STRLEN("bool"), "bool" }, + { STRLEN("break"), "break" }, + { STRLEN("case"), "case" }, + { STRLEN("char"), "char" }, + { STRLEN("compl"), "compl" }, + { STRLEN("const"), "const" }, + { STRLEN("continue"), "continue" }, + { STRLEN("default"), "default" }, + { STRLEN("do"), "do" }, + { STRLEN("double"), "double" }, + { STRLEN("else"), "else" }, + { STRLEN("enum"), "enum" }, + { STRLEN("extern"), "extern" }, + { STRLEN("false"), "false" }, + { STRLEN("float"), "float" }, + { STRLEN("for"), "for" }, + { STRLEN("goto"), "goto" }, + { STRLEN("I"), "I" }, + { STRLEN("if"), "if" }, + { STRLEN("inline"), "inline" }, + { STRLEN("int"), "int" }, + { STRLEN("long"), "long" }, + { STRLEN("noreturn"), "noreturn" }, + { STRLEN("not"), "not" }, + { STRLEN("not_eq"), "not_eq" }, + { STRLEN("or"), "or" }, + { STRLEN("or_eq"), "or_eq" }, + { STRLEN("register"), "register" }, + { STRLEN("restrict"), "restrict" }, + { STRLEN("return"), "return" }, + { STRLEN("short"), "short" }, + { STRLEN("signed"), "signed" }, + { STRLEN("sizeof"), "sizeof" }, + { STRLEN("static"), "static" }, + { STRLEN("static_assert"), "static_assert" }, + { STRLEN("struct"), "struct" }, + { STRLEN("switch"), "switch" }, + { STRLEN("thread_local"), "thread_local" }, + { STRLEN("true"), "true" }, + { STRLEN("typedef"), "typedef" }, + { STRLEN("union"), "union" }, + { STRLEN("unsigned"), "unsigned" }, + { STRLEN("void"), "void" }, + { STRLEN("volatile"), "volatile" }, + { STRLEN("while"), "while" }, + { STRLEN("xor"), "xor" }, + { STRLEN("xor_eq"), "xor_eq" }, + /**/ + { 0, NULL } +}; + +/* + * Keep track of discarded bytes by read_line() so count() can report + * correct wc(1) equivalent counts. + */ +static int xlcount = 0; +static int xwcount = 0; +static int xbcount = 0; + +static Word * +find_member(Word *table, const char *string) +{ + Word *w; + for (w = table; w->length != 0; w++) { + if (strncmp(string, w->word, w->length) == 0 + && !isalnum(string[w->length]) && string[w->length] != '_') + return w; + } + return NULL; +} + +/* + * ISO C11 section 5.2.1.1 Trigraph Sequences, leading sequence "??" + */ +static char trigraph[] = "=(/)'-"; +static char asciimap[] = "#[\\]^{|}~"; + +static size_t +read_line(char *buf, size_t size) +{ + int ch; + size_t length; + + if (buf == NULL || size == 0) + return 0; + + for (size--, length = 0; length < size; ) { + if ((ch = fgetc(stdin)) == EOF) + break; + /* Map NUL bytes to space, though ideally I should chuck'em. */ + if (ch == '\0') + ch = ' '; + /* Discard bare CR and those part of CRLF. */ + if (ch == '\r') { + xbcount++; + continue; + } + /* Trigraph mapping? */ + if (2 <= length && buf[length-2] == '?' && buf[length-1] == '?') { + char *tri; + if ((tri = strchr(trigraph, ch)) != NULL) { + /* Mapped trigraphs count as 1 byte. */ + ch = asciimap[tri - trigraph]; + xbcount += 2; + length -= 2; + } + } + if (ch == '\n' && 1 <= length && buf[length-1] == '\\') { + /* ISO C11 section 5.1.1.2 Translation Phases + * point 2 discards backslash newlines. + */ + xbcount += 2; + xwcount++; + xlcount++; + length--; + continue; + } + buf[length++] = (char) ch; + if (ch == '\n') { + break; + } + } + + buf[length] = '\0'; + + return length; +} + +/* + * Count octets and strip comments. The stripped C input is sent to + * standard output. If -s is set, then suppress the source output. + * The various counters are sent to standard error. + * + * The counter output format is: + * + * lcount wcount bcount icount isaved rcount rsaved + * + * where + * lcount line count (same as wc) + * wcount word count (same as wc) + * bcount byte count (same as wc) + * icount IOCCC secondary size rule count + * + * No longer reported: + * isaved bytes saved by secondary size rule (bcount - icount) + * rcount number of C reserved words + * rsaved number of octets saved with -r + */ +static int +count(int flags) +{ + Word *w; + unsigned long span; + char *p, buf[BUFFER_SIZE]; + int lcount, wcount, bcount; + int is_comment, is_word, dquote, escape; + int count, keywords, saved, kw_saved; + + /* Start of buffer sentinel. */ + buf[0] = ' '; + buf[BUFFER_SIZE - 1] = 0; /* paranoia */ + + count = saved = 0; + keywords = kw_saved = 0; + lcount = wcount = bcount = 0; + is_comment = is_word = dquote = escape = 0; + + /* + * "no matter how well you may think you understand this code, + * you don't, so don't mess with it." :-) + */ + while (0 < read_line(buf+1, sizeof (buf)-1)) { + if (!(flags & FLAG_KEEP)) { + /* Leading whitespace before comment block? */ + span = strspn(buf+1, "\t "); + + /* Split / * across reads? */ + if (buf[1 + span] == '/' && buf[2 + span] == '\0') { + (void) ungetc('/', stdin); + continue; + } + + /* + * no comment is a comment + */ + if (buf[1 + span] == '/' && buf[2 + span] == '/') { + continue; + } + + if (buf[1 + span] == '/' && buf[2 + span] == '*') { + /* Strip leading whitespace before comment block. */ + is_comment = 1; + } + } + + for (p = buf+1; *p != '\0'; p++) { + /* Within quoted string? */ + if (dquote) { + /* Escape _this_ character. */ + if (escape) { + escape = 0; + } + + /* Escape next character. */ + else if (*p == '\\') { + escape = 1; + } + + /* Close quoted string? */ + else if (*p == '"') { + dquote = 0; + } + } + + /* Not quote string. */ + else { + /* In C comment block? */ + if (is_comment) { + /* Split * / across reads? */ + if (*p == '*' && p[1] == '\0') { + ungetc('*', stdin); + break; + } + + /* End of comment block? */ + if (*p == '*' && p[1] == '/') { + is_comment = 0; + + if (!(flags & FLAG_KEEP)) { + /* Strip whitespace and newline + * trailing closing comment. + */ + p += 1 + strspn(p+2, " \t\r\n"); + } + } + + if (!(flags & FLAG_KEEP)) { + /* Strip octets in comment block. */ + continue; + } + } + + /* Split / / or / * across reads? */ + else if (*p == '/' && p[1] == '\0') { + ungetc('/', stdin); + break; + } + + /* Start of comment line? */ + else if (*p == '/' && p[1] == '/') { + if (!(flags & FLAG_KEEP)) { + /* Strip comment to end of buffer. */ + break; + } + } + + /* Start of comment block? */ + else if (*p == '/' && p[1] == '*') { + /* Begin comment block. */ + is_comment = 1; + + if (!(flags & FLAG_KEEP)) { + /* Strip comment block. */ + p++; + continue; + } + } + + /* C reserved word? */ + else if (!isalnum(p[-1]) && p[-1] != '_' + && (w = find_member(cwords, p)) != NULL) { + keywords++; + if (flags & FLAG_RESERVED) { + bcount += w->length; + if (!is_word) { + is_word = 1; + wcount++; + } + + if (!(flags & FLAG_SILENCE)) { + fputs(w->word, stdout); + } + + /* Count reserved word as one. */ + kw_saved += w->length - 1; + p += w->length - 1; + count++; + continue; + } + } + + /* Open quoted string? */ + else if (*p == '"') { + dquote = 1; + } + } + + if (!(flags & FLAG_SILENCE)) { + fputc(*p, stdout); + } + + bcount++; + if (*p == '\n') { + lcount++; + } + + /* Ignore all whitespace. + * + * Well not ALL in the Universe, just all here. + */ + if (isspace(*p)) { + is_word = 0; + saved++; + continue; + } else if (!is_word) { + is_word = 1; + wcount++; + } + + /* Ignore curly braces and semicolons when followed + * by any whitespace or EOF. + */ + if (strchr("{;}", *p) != NULL && (isspace(p[1]) || p[1] == '\0')) { + saved++; + continue; + } + + /* Count this octet. */ + count++; + } + } + + if (flags & FLAG_IOCCC) { + /* Output the official IOCCC size tool size to standard out */ + printf("%d\n", count); + if (MAX_SIZE < bcount) { + fprintf(stderr, "WARNING: program size (%d) exceeds IOCCC Rule 2a max. size (%d)\n", bcount, MAX_SIZE); + } + if (MAX_COUNT < count) { + fprintf(stderr, "WARNING: iocccsize count (%d) exceeds IOCCC Rule 2b max. count (%d)\n", count, MAX_COUNT); + } + } else { + /* The Ugly Truth */ + fprintf( + stderr, "%d %d %d %d %d %d %d\n", + lcount + xlcount, wcount + xwcount, bcount + xbcount, count, + saved, keywords, kw_saved + ); + } + + return count; +} + +int +main(int argc, char **argv) +{ + int ch; + int flags = 0; + + while ((ch = getopt(argc, argv, "kirsch")) != -1) { + switch (ch) { + case 'k': + flags |= FLAG_KEEP; + break; + case 'i': + flags |= FLAG_IOCCC | FLAG_RESERVED | FLAG_SILENCE; + break; + case 'r': + flags |= FLAG_RESERVED; + break; + case 's': + flags |= FLAG_SILENCE; + break; + case 'c': + flags |= FLAG_SILLY_C; + break; + case 'h': + flags |= FLAG_SILLY_H; + break; + default: + fprintf(stderr, "%s\n", usage); + return 2; + } + } + // make test hack: while for do until goto if else switch case default continue return break + if (flags == (FLAG_KEEP | FLAG_IOCCC | FLAG_RESERVED | FLAG_SILENCE | FLAG_SILLY_C | FLAG_SILLY_H)) { + fprintf(stderr, "The source toasts you a glass to your health!\n" + "BTW: judges have toasted a glass of this at the South Pole.\n" + "Now try using useful flags.\n\n" + "%s\n", usage); + return 3; + } else if (flags & FLAG_SILLY_C) { + fprintf(stderr, "Do you not see this is C?\n\n" + "%s\n", usage); + return 4; + } else if (flags & FLAG_SILLY_H) { + fprintf(stderr, "%s\n", usage); + return 5; + } + + /* + * count as directed - 1 Muha .. 2 Muhaha .. 3 Muhahaha ... + */ + (void) count(flags); + + /* + * All Done!!! All Done!!! -- Jessica Noll, age 2 + */ + return 0; +} diff --git a/2018/iocccsize.mk b/2018/iocccsize.mk new file mode 100644 index 000000000..d58e76b0d --- /dev/null +++ b/2018/iocccsize.mk @@ -0,0 +1,71 @@ +.POSIX : + +####################################################################### + +CFLAGS := -pedantic -Wall -Wextra -std=c11 -g +LDFLAGS := +LIBS := +IT := iocccsize + +####################################################################### + +all: ${IT}$E + +${IT}$E: ${IT}.c + ${CC} ${CFLAGS} -o ${IT}$E ${IT}.c + +# +# Exercise the IOCCC size tool. +# +test: test-k test-wc test-rcount + +# +# -k should pass through the source with block comments intact. +# +test-k: ${IT}$E + @{ t="-k keep comments" ;\ + if ./${IT} -k <${IT}.c 2>/dev/null | diff - ${IT}.c ; then echo "-OK- $$t" ; else echo "FAIL $$t" ; fi ;\ + } + +# +# First 3 counters should match wc(1) +# +test-wc: ${IT}$E + @{ t="wc counts" ;\ + a=$$(./${IT} -s -k <${IT}.c 2>&1 | cut -d' ' -f1-3) ;\ + b=$$(wc ${IT}.c | sed -e's/^ *//; s/ */ /g' | cut -d' ' -f1-3) ;\ + if [ "$$a" = "$$b" ]; then echo "-OK- $$t"; else echo "FAIL $$t: expected '$$b', got '$$a'"; fi ;\ + } + +# +# Show counters for different option combinations. +# +test-show: ${IT}$E + ./${IT} -s <${IT}.c + ./${IT} -s -r <${IT}.c + ./${IT} -s -k <${IT}.c + ./${IT} -s -r -k <${IT}.c + +# +# Reserved word counter should be same for all option combinations. +# +test-rcount: ${IT}$E + @{ t="rcount" ;\ + ./${IT} -s <${IT}.c 2>&1 | cut -d" " -f 6 >/tmp/$$$$.tmp ;\ + ./${IT} -s -r <${IT}.c 2>&1 | cut -d" " -f 6 >>/tmp/$$$$.tmp ;\ + ./${IT} -s -k <${IT}.c 2>&1 | cut -d" " -f 6 >>/tmp/$$$$.tmp ;\ + ./${IT} -s -r -k <${IT}.c 2>&1 | cut -d" " -f 6 >>/tmp/$$$$.tmp ;\ + n=$$(sort -u /tmp/$$$$.tmp | wc -l | sed -e's/^ *//') ;\ + if [ $$n -eq 1 ]; then echo "-OK- $$t"; else echo "FAIL $$t: expected 1 unique line, got $$n"; echo "see make test-show"; fi ;\ + rm -f /tmp/$$$$.tmp ;\ + } + +clean: + rm -f iocccsize.o + rm -rf iocccsize.dSYM + +clobber: clean + rm -f iocccsize + +install: + @echo "no thank you on the install :-)" diff --git a/2018/mills/Makefile b/2018/mills/Makefile new file mode 100644 index 000000000..b353b92e2 --- /dev/null +++ b/2018/mills/Makefile @@ -0,0 +1,342 @@ +#!/usr/bin/env make +# +# 2018 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +GZIP_PROG= gzip +BZIP2= bzip2 +CURL= curl +DD= dd +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq +STRIP= strip + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +CWARN= -Wall ${CSILENCE} +#CWARN= -Wall -Wextra +#CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +CSILENCE= -Wno-unused-result +#CSILENCE= -Wno-implicit-int + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=25 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog v0 v6 +# +ALT_OBJ= +ALT_TARGET= + +# NOTE: These URLs record the location of where v0.image.fs and v6.tape.gz +# were obtained at the time this entry won IOCCC25. We have preserved +# the state of those files in this Makefile. These URLs are left here +# for historical purposes and for those who may wish to re-download +# these two files later on. +# +IMAGE_FS_URL= https://raw.githubusercontent.com/DoctorWkt/pdp7-unix/master/binaries/image.fs +V6_TAPE_URL= https://www.tuhs.org/Archive/Distributions/Research/Ken_Wellsch_v6/v6.tape.gz + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c rk05.bsd.fs + ${CC} ${CFLAGS} -DI='"rk05.bsd.fs"' -DA=4096 -DS=0173030 -DW=MAP_PRIVATE -DT= -DX=5 -DY=128 \ + -DV=270 -DP='"89!>@@89T=@@89\"89DQ@K89$$89Q1@H0@@@P@1@@"' prog.c -o $@ ${LIBS} + +rk05.bsd.fs: empty.fs.bz2 builddisk.bsd bsd.img.bz2 + @${RM} -f $@ + ${BZIP2} -dc empty.fs.bz2 > rk05.bsd.fs + ${BZIP2} -dc bsd.img.bz2 | ./builddisk.bsd + +builddisk.bsd: prog.c + ${CC} ${CFLAGS} -DI='"rk05.bsd.fs"' -DA=4096 -DS=0 -DW=MAP_SHARED -DT= -DX=0 -DY=0 -DV=270 \ + -DP='"Q@ 89D?A E@#?@$$D@H?<@E@$$8CA1@H8CJ4EH8CA1@L8CJ4FH)@!F@H%@$$1@H?@%89\"?<@89T89!Q@\"89$$89Q1@[%@#1@D<@ @EHO??@X@@@@@@@1@@"' \ + -o $@ prog.c + +rk05.v6.fs: empty.fs.bz2 builddisk.v6 v6.img.bz2 + @${RM} -f $@ + ${BZIP2} -dc empty.fs.bz2 > rk05.v6.fs + ${BZIP2} -dc v6.img.bz2 | ./builddisk.v6 + +builddisk.v6: prog.c + ${CC} ${CFLAGS} -DI='"rk05.v6.fs"' -DA=4096 -DS=0 -DW=MAP_SHARED -DT= -DX=0 -DY=0 -DV=270 \ + -DP='"Q@ 89D?A E@#?@$$D@H?<@E@$$8CA1@H8CJ4EH8CA1@L8CJ4FH)@!F@H%@$$1@H?@%89\"?<@89T89!Q@\"89$$89Q1@[%@#1@D<@ @EHO??@X@@@@@@@1@@"' \ + -o $@ prog.c + +empty.fs.bz2: boot.dat + @${RM} -f empty.fs + ${DD} if=/dev/zero of=empty.fs count=10800 + ${DD} if=boot.dat of=empty.fs conv=notrunc + ${BZIP2} empty.fs + +v0: prog.c Makefile v0.image.fs + @echo "This IOCCC25 Makefile preserves the state of v0.image.fs at the time it won." + @echo "If you want to look for v0.image.fs updates, try: ${CURL} ${IMAGE_FS_URL} -o v0.image.fs" + @echo "Warning: any updates from ${IMAGE_FS_URL} are unofficial and are not part of the IOCCC." + ${CC} ${CFLAGS} -DI='"v0.image.fs"' -DA=4096 -DS=0 -DW=MAP_PRIVATE \ + -DT="INLCR|ICRNL,0,0,ECHO" -DX=5 -DY=128 -DV=200 \ + -DP='"89!?@@89T=@@89\"Q@M89DQ@L89$$89Q1@I0A@@P@X@@1@@"' prog.c -o $@ + +v6: empty.fs.bz2 builddisk.v6 v6.img.bz2 rk05.v6.fs + ${CC} ${CFLAGS} -DI='"rk05.v6.fs"' -DA=4096 -DS=0173030 -DW=MAP_PRIVATE -DT= -DX=5 -DY=128 \ + -DV=270 -DP='"89!>@@89T=@@89\"89DQ@K89$$89Q1@H0@@@P@1@@"' prog.c -o $@ ${LIBS} + +v6.img.bz2: v6.tape.gz + @echo "This IOCCC25 Makefile preserves the state of v6.tape.gz at the time it won." + @echo "If you want to look for v6.tape.gz updates, try: ${CURL} ${V6_TAPE_URL} -o v6.tape.gz" + @echo "Warning: any updates from ${V6_TAPE_URL} are unofficial and are not part of the IOCCC." + @${RM} -f v6.tape + ${GZIP_PROG} -c -d v6.tape.gz | ${DD} of=v6.img count=4000 skip=100 + ${BZIP2} v6.img + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + ${RM} -f builddisk.bsd builddisk.v6 v0 rk05.bsd.fs rk05.v6.fs empty.fs.bz2 empty.fs v6.fs v6.img.bz2 v0.img + ${RM} -f v6.tape + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 3a3fabb90892eeb2f610ae0f74a35a970060665a063ab702bd686c17c4ae07f6 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2018/mills/boot.dat b/2018/mills/boot.dat new file mode 100644 index 000000000..2d6601db8 Binary files /dev/null and b/2018/mills/boot.dat differ diff --git a/2018/mills/bsd.img.bz2 b/2018/mills/bsd.img.bz2 new file mode 100644 index 000000000..ad1045c9d Binary files /dev/null and b/2018/mills/bsd.img.bz2 differ diff --git a/2018/mills/hint.html b/2018/mills/hint.html new file mode 100644 index 000000000..8e0dee7cf --- /dev/null +++ b/2018/mills/hint.html @@ -0,0 +1,761 @@ + + + + + + + Best of show + + +

    Best of show

    + +

    Christopher Mills mrxo@sonic.net
    +Twitter: @MisterXopher

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +./prog
    +
    + +

    Try:

    + +
    make
    +./prog
    +(At the ">boot" prompt, type return)
    +(At the ":" prompt, type "rk(0,0)rkunix")
    +NOTE: To quit, press Control-E
    +
    + +

    Selected Judges Remarks:

    + +

    Do small machines only need small programs? This program weighs in at just +3636 bytes, which is considerably lighter than the original machine it can replace.

    + +

    This program can take you back to the start of everything, it is possible to +run v0. Just type:

    + +
    make
    +./v0
    +
    +NOTE: To quit v0, press Control-E
    +
    + +

    You will be greeted with a familiar prompt of “login”. The username and +password are “dmr” and “dmr”. To make things more familiar you’ll need to +create ‘.’ as it hasn’t been invented yet on this image!

    + +
    @ ln dd dmr .
    +
    + +

    An “ls” will reveal that C hasn’t been invented yet! IOBCC anyone? The +compiler is “bc”. It producess assembly, which will then need to be assembled +together in this order “ops.s bl.s hello.s bi.s” to produce a.out!

    + +

    But wait, we said this was the start of it all! This program can also run a +program that replaces an even larger machine that can run BSD 2.9. To start this,

    + +
    make
    +./prog
    +
    +(At the ">boot" prompt, type return)
    +(At the ":" prompt, type "rk(0,0)rkunix")
    +NOTE: To quit prog, press Control-E
    +
    + +

    This should now be very familiar and it is possible to compile and run one of +the very first IOCCC entires “mullender.c”

    + +

    But wait, there is even more! Try:

    + +
    make
    +./v6
    +
    +(At the "@" prompt, type "rkunix")
    +NOTE: To quit v6, press Control-E
    +
    + +

    Author’s comments:

    + +

    This IOCCC entry is dedicated to the late Dennis M. Ritchie

    + +

    The Program

    + +

    Since this is the 25th “annual” IOCCC, I thought I should mark the occasion +with a look back to its earliest roots. At the same time the contest enters +its 34th year of providing a safe forum for poor C code, the C language +itself is fast approching its 50th anniversary, along with the UNIX operating +system whose history is so entwined with.

    + +

    The program delivered here is both a full machine emulation of the original +PDP-7 that Ken Thompson used to write the first version of UNIX and a full +machine emulation of the PDP-11/40 used by subsequent UNIXes. The Makefile +can build versions that can run each of the following:

    + +
      +
    1. UNIX v0 for the PDP-7 (circa 1969)
    2. +
    3. Research UNIX Version 6 (circa 1975)
    4. +
    5. BSD 2.9 (circa 1983)
    6. +
    + + +

    For reasons to be described in a bit, the last (BSD 2.9) is the default.

    + +

    Building and Running BSD 2.9

    + +

    To run BSD 2.9, do make to build prog and then ./prog to run it.

    + +

    You should see a prompt from the first-stage bootloader that looks like

    + +
        >boot
    +
    + +

    Type RETURN at this point and you will get to the second-stage boot loader +that looks like

    + +
        40Boot
    +    :
    +
    + +

    The 40 in the prompt indicates that the bootloder has correctly determined +that we are running on a PDP-11/40.

    + +

    At this point, type the rather cryptic command rk(0,0)rkunix – this tells +the system to look at the first partition on the first RK05 fixed disk, find +the rkunix file and load it. You should eventually see the following:

    + +
        >boot
    +
    +    40Boot
    +    : rk(0,0)rkunix
    +
    +    Berkeley UNIX (Rev. 2.9.1) Sun Nov 20 14:55:50 PST 1983
    +    mem = 135872
    +
    +    CONFIGURE SYSTEM:
    +    xp ? csr 176700 vector 254 skipped:  No CSR
    +    rk 0 csr 177400 vector 220 attached
    +    hk ? csr 177440 vector 210 skipped:  No CSR
    +    rl ? csr 174400 vector 160 skipped:  No CSR
    +    rp ? csr 176700 vector 254 skipped:  No CSR
    +    ht 0 csr 172440 vector 224 skipped:  No CSR
    +    tm 0 csr 172520 vector 224 skipped:  No CSR
    +    ts 0 csr 172520 vector 224 skipped:  No CSR
    +    dh ? csr 160020 vector 370 skipped:  No CSR
    +    dm ? csr 170500 vector 360 skipped:  No autoconfig routines
    +    dz ? csr 160110 vector 320 skipped:  No CSR
    +    dz ? csr 160110 vector 320 skipped:  No CSR
    +    dn 0 csr 175200 vector 300 skipped:  No autoconfig routines
    +    vp ? csr 177500 vector 174 skipped:  No autoconfig routines
    +    lp ? csr 177514 vector 200 skipped:  No CSR
    +    Erase=^?, kill=^U, intr=^C
    +    # 
    +
    + +

    Congratulations, you are running BSD UNIX 2.9 in single-user mode as root.

    + +

    On the other hand, if you did a typo somewhere, the boot loader has probably +crashed and halted – if so, type Control-E to quit the simulation and try +again. If you did really badly, you might have corrupted the virtual disk. +If so, consider a make clean to start from scratch.

    + +

    Assuming you managed to type 15 characters correctly, You should be at the +root prompt. Most of the commands you are familiar with work here (this was +only a quarter of a century ago – how much could things have changed?). +Let’s try some:

    + +
        # ls
    +    .cshrc       .profile     boot         hkunix       mnt          tmp
    +    .login       2.9stamp     dev          lib          mullender.c  unix
    +    .msgsrc      bin          etc          lost+found   rkunix       usr
    +    # df
    +    Filesystem  Mounted on  kbytes    used    free  % used
    +    /dev/rk0    /             1958    1688     270     86%
    +    # cc mullender.c
    +    # ./a.out
    +
    + +

    The program you’ve just run was the winner of the first IOCCC contest from +1984 (or was it 1894?), a personal favorite of mine. It is rather +tightly bound to running on either a PDP-11 or a VAX. Now you have one.

    + +

    Hitting Control-C will return you to the BSD UNIX prompt. Hitting Control-D +will log you out of the single-user session and get you back to the :login: +prompt. Here you can log in as root and get a full timesharing session. +Feel free to try things like vi. I’ve taken the liberty of editing the +.login and .profile files to set the console to a less traditional setup +so that you don’t have to wait for the Model 33 KSR teletype to move its +carriage. I’ve also predefined TERM to vt100, which will probably work +well enough with whatever sort of ANSI terminal emulation you are using.

    + +

    Note that I have not mounted the /usr disk here, so some commands from +/usr/bin will be missing, along with all of the man pages. They are +available online if you need them. Adding a second RK05 disk was +possible, but I didn’t get around to it… As the Judges can no doubt attest, +“Mid 2017” creeps up on you quicker than you expect. :)

    + +

    Once you’ve had enough fun in BSD 2.9, type Control-E to exit the emulation.

    + +

    Building and Running Research UNIX v6

    + +

    Research UNIX v6 and BSD 2.9 use the same executable, but require a different +disk image. Type make v6 to build it, then type ./prog to run it.

    + +

    You should see the boot loader prompt which is a single @:

    + +
        @
    +
    + +

    At this point, you again must type a special incantation: rkunix. After that +you should see:

    + +
        @rkunix
    +    mem = 1035
    +    RESTRICTED RIGHTS
    +
    +    Use, duplication or disclosure is subject to
    +    restrictions stated in Contract with Western
    +    Electric Company, Inc.
    +    # 
    +
    + +

    You are now running a single-user session of v6 UNIX. You might want to start +with stty -lcase because otherwise everything will be IN ALL CAPS.

    + +

    Again, if you failed typing seven characters without making a mistake, you +may need to use Control-E to quit the simulation.

    + +

    Assuming you’re more careful than that, we can try a few commands:

    + +
        @rkunix
    +    mem = 1035
    +    RESTRICTED RIGHTS
    +
    +    Use, duplication or disclosure is subject to
    +    restrictions stated in Contract with Western
    +    Electric Company, Inc.
    +    # STTY -LCASE
    +    # ls
    +    bin
    +    dev
    +    etc
    +    hpunix
    +    lib
    +    mnt
    +    rkunix
    +    rpunix
    +    tmp
    +    unix
    +    usr
    +    # cat > foo.c
    +    main()
    +    {
    +        printf("Hello, World!\n");
    +    }
    +    # cc foo.c
    +    # ./a.out
    +    Hello, World!
    +
    + +

    Why is Version 6 interesting? Well, it was the oldest version that I could +find a boot image of that had a C compiler… This C compiler is recognizably +C, but not quite the same syntax as we have today. It’s much closer to the +B language from which it is derrived. In particular, this C compiler +would not be able to compile mullender.c (as simple as it is), because the +following syntax features don’t exist yet:

    + +
      +
    • The short data type doesn’t exist yet. Only int (short will show +up when long comes, and the port to the Interdata 7/32 starts to make +the idea of portability become important).
    • +
    • Hexidecimal constants don’t exist yet. Digital’s computers all used +octal.
    • +
    • The array initializer syntax hasn’t yet moved to using =. It still uses +the older form taken from B, which looks like array[] { 1, 2, 3 };
    • +
    + + +

    It can still compile “Hello World!” (note that you must type a Control-D after +you finish entering the code, to let cat see an end-of-file).

    + +

    This version of UNIX doesn’t go into multi-user mode if you do a Control-D. +Single-user mode was entered because the front-panel console switches were +set to the magic number 0173030 (this can be changed with a re-compile).

    + +

    Once you are done with Version 6, Type Control-E to exit the simulation.

    + +

    Note that since both BSD 2.9 and UNIX v6 use the same PDP-11/40 emulation +code, and they use the same name for the disk (rk05.fs), if you want to go +back to the BSD simulation, you should either delete rk05.fs or do a +make clean before you do a make.

    + +

    Building and Running UNIX v0

    + +

    We now set the Wayback Machine to the very start of it all, 1969.

    + +

    The story here is interesting and well worth a read. Bell Labs was +pulling out of the Multics project and Ken Thompson and his collegues had +become accustomed to the relatively nice programming environment. They also +enjoyed the early computer game Space Travel and wanted another system +to run it on. They found a PDP-7 which was already obsolete at the time to +port Space Travel to. The primitive programming environment influenced +Thompson to recreate parts of the Multics experience in the much more +hardware-constrained PDP-7 environemnt. In the summer of 1969, with his wife +out on a month-long vacation, Thompson re-wrote a filesystem emulation he had +been experementing with to include an assembler, a shell, an editor and an +operating system kernel and hence created the first version of UNIX (although +it hadn’t been named that yet).

    + +

    You can try out this version by typing make v0. Since this version is a +native PDP-7 emulation, it gets its own binary. Type ./v0 to run it. You +should see the login prompt.

    + +
        login:
    +
    + +

    There are two user accounts ken and dmr, with the passwords ken and dmr +respectively. Let’s try the Dennis Richie’s dmr account:

    + +
        login: dmr
    +    password: dmr
    +    @ ls
    +    .       ?
    +
    + +

    Even though this is not Ken’s doing, I feel this gives me licence to +include this quote from the BSD fortune program:

    + +

    Ken Thompson has an automobile which he helped design. Unlike +most automobiles, it has neither speedometer, nor gas gauge, +nor any of the numerous idiot lights which plague the modern +driver. Rather, if the driver makes any mistake, a giant “?” +lights up in the center of the dashboard. “The experienced +driver”, he says, “will usually know what’s wrong.”

    + +

    What’s the deal here? Well, that’s a slightly long story. The short version +is we have gone so far back in the history of UNIX that we don’t have +filesystem paths yet. In other words, we can’t say something like +/bin/ls yet, and the shell can’t store that path in $PATH to search for it. +We also haven’t invented . or .. yet. In fact, the filesystem isn’t even +the traditional UNIX tree structure, it’s a directed graph of hard links…

    + +

    ls needs to be able to read ‘.’, the current directory. dmr’s home +directory doesn’t have that yet, but we can make it, because the home +directory has a hard link to dd, which is the directory that holds all +of the user home directories (this will eventually become /, the root +path). We can do

    + +
        @ ln dd dmr .
    +
    + +

    To make the new link (note that ln doesn’t support paths either, so you have +to give it three arguments – a directory in the current dir, a file in that +directory, and the new name).

    + +

    Now ls will work, and we can try some other things while we are here:

    + +
        login: dmr
    +    password: dmr
    +    @ ln dd dmr .
    +    @ ls
    +    dd      
    +    system  
    +    as.s    
    +    b_readme
    +    bi.s    
    +    bl.s    
    +    db.s    
    +    hello.b 
    +    ops.s   
    +    .       
    +    @ cat b_readme
    +    Here is how to compile and run hello.b:
    +
    +      @ bc hello.b hello.s
    +      @ as ops.s bl.s hello.s bi.s
    +      I
    +      II
    +      ops.s   
    +      bl.s    
    +      hello.s 
    +      bi.s    
    +      @ a.out
    +      Hello, World!
    +
    +
    +    @ bc hello.b hello.s
    +    @ as ops.s bl.s hello.s bi.s
    +    I
    +    II
    +    ops.s   
    +    bl.s    
    +    hello.s 
    +    bi.s    
    +    @ a.out
    +    Hello, World!
    +    @ 
    +
    + +

    The last command is invoking the compiler for an exteremely early version of +the B programming language, the predecessor to C. Thompson missed the +convinience of writing code in a high-level language – Multics was written +a version of PL/1 – and wanted the same convinience on UNIX. He preferred +BCPL (a typeless language) to PL/1. As Dennis Ritchie wrote:

    + +

    B can be thought of as C without types; more accurately, +it is BCPL squeezed into 8K bytes of memory and filtered +through Thompson’s brain.

    + +

    A look at the B reference manual will show the strong correlation with C, and +shows the source of a lot of C’s mysteriousness – some of which is preserved +simply so that C could compile the dozens of lines of existing B code…

    + +

    Thompson’s assembler was also extremely simple. It didn’t even know about +opcodes – these need to be defined in the first assembly file, with the +assembler OR-ing the opcode fields together (space was the “operator” for +logical OR). There is no link step – all files are provided to the assembler +on the command line, concatenated together and assembled, producing a single +a.out (assembler output) file. Even after UNIX got a linker, a.out +remained the default name of the binary generated by the linker (and hence +also by cc).

    + +

    This system is still has the familiarity of UNIX, with all the two- and +three-letter commands, device files, shell redirection, the same core system +calls (read, write, open, close, creat, fork, etc.). There are a +number of differences still:

    + +
      +
    • As noted, there are no file paths
    • +
    • read and write do I/O on (18-bit) words. Character I/O to files needs +to unpack those to bytes, and of course deal with NUL characters.
    • +
    • exec was performed by the shell directly. Arguments are passed as +four words (eight bytes), and space padded. This matches the format for +file names for open and creat.
    • +
    • wait does not yet exist. A more complicated mechanism for sending and +recieving messages (smes and rmes) are used instead.
    • +
    • File permission bits are all different, since groups don’t exist yet.
    • +
    • User programs are not allowed to run during disk I/O. This is because the +disk controller’s “data break” (DMA) accesses were so fast relative to the +CPU that transfers would be dropped if an instruction that used +“deferred” mode (indirection) was executed. This also meant that the +“program break” (interrupt) routine in the kernel had to specifically +avoid deferred accesses by using self-modifying code to do indirection +through pointers.
    • +
    • Although the PDP-7 suppoted a “trap mode” (a primitive supervisor mode), +the UNIX kernel doesn’t use it. This means that user programs could alter +or crash the kernel at will (in fact, there is a system call that returns +addresses of useful kernel routines so that user code can call them +directly).
    • +
    + + +

    As usual, when you are done exploring UNIX v0, type Control-E to exit the +simulator.

    + +

    About the Program

    + +

    The program came about when I was looking for something to honor the pending +50th anniversary of the C language (because of the mercurial nature of IOCCC +contest scheduling, I chose not to wait for the actual 50th anniversary). +I had though of writing self-hosting compilers for a stripped-down version of +C, or maybe even a version of the B language… At the same time, I was +obsessed with the idea of allowing mullender.c from 1984 to run. Although +that was still a possibility on an interpreted version of B or a stripped-down +version of C, it felt cheap, as it would be mullender.c only in spirit.

    + +

    It was during this time that I discovered that in 2016, members of the Unix +Heritage Society got access to printouts of assembly-language source for the +original version of UNIX. With what was a huge amount of work, +they scanned in the printouts, fixed up the OCR translations, built assembler +and file system tools from scratch and made an accurate simulation of +Thompson’s PDP-7 that allowed them to get the system up and running. Although +source for the entire kernel and about half of the user-space commands were +present (including the runtime and libraries for the B compiler), the +remainder needed to be written from scratch, including the shell. The final +results of the project are available on github.

    + +

    None of this was remotely easy (as I was to discover myself). The PDP-7 is +long gone, and the documentation for it is less complete than one would like. +In addition, the devices attached for it were a bit of a mystery. The disk +system is referenced only in an old price list. It was a RB09 fixed disk, +probably made by Burroughs. It is close to what was called the RC10 for the +PDP-10, but with a different interface. And the system also included a custom +display device called Graphics-2, which had been built in-house by AT&T. +It can’t be completely ignored, because the kernel itself pokes at it (the +UNIX crew used it as a second terminal – a “glass TTY”).

    + +

    I decided that implementing this PDP-7 would be possible as an IOCCC entry.

    + +

    The emulator emulates the full machine:

    + +
      +
    • PDP-7 Central Processor
    • +
    • Core Memeory Module Type 147 – extends the core to 8,192 18-bit words
    • +
    • Extended Arithmetic Element Type 177 – adds one’s-complement +multiplication, division and shifting
    • +
    • Real Time Clock
    • +
    • Teletype Model 33 KSR
    • +
    • Perforated Tape Reader Type 444
    • +
    • RB09 Fixed Disk Controller
    • +
    + + +

    The PDP-7 is an odd duck by modern computer standards:

    + +
      +
    • 18 bit words, with no byte addressing.
    • +
    • Both one’s and two’s complement math (there is ADD for one’s complement + and TAD for two’s complement). The EAE is entirely one’s-complement.
    • +
    • “Microcoded” instructions.
    • +
    • Auto-increment memory locations.
    • +
    • Non-reentrant function calls (the return address is stored at the indicated +address and the PC jumps to the location after it).
    • +
    • The XCT instruction, that executes the word loaded from memory as an +instruction.
    • +
    • An instruction LAW that loads the instruction opcode into the +accumulator.
    • +
    • Heavy use of “inline” operands. For instance the MUL instruction expects +the second operand to be stored in memory after the instruction. This +pretty much requires the use of self-modifying code.
    • +
    • No immediates. Almost all constants have to live in memory locations and +be referenced by address.
    • +
    • Common operations, like “subtract” and “inclusive OR” are not directly +supported on the machine and require multiple instructions and some spare +memory locations to support. Being clever also helps.
    • +
    • Single accumulator architecture. No direct support for things like stacks.
    • +
    • I/O is done with dedicated I/O instructions (which are also microcoded).
    • +
    • The RB09 disk controller gets a special mention here because of its +particularly annoying encoding of track and sector offsets in +packed BCD. A non-trivial amount of code space in the simulator +is needed to convert into and out of BCD, along with an equivalent amount +of code in the UNIX kernel itself.
    • +
    + + +

    The simulation handles everything I was able to discover about the PDP-7, even +things that the UNIX code itself doesn’t use. For instance, it correctly +implements the “trap mode” feature (a primitive form of supervisor mode) even +though the kernel does not enable it. It also implements the microcoding of +the EAE instructions even though the UNIX environment uses only the standard +encodings. If you wanted to do a 11-bit multiply instead of an 18-bit one, +it will probably work.

    + +

    The simulation starts by loading a boot program off of the virtualized paper +tape, which is in a modified version of the RIM boot loader format. The +RIM format encodes each 18-bit word as three six-bit characters, using one bit +to denote the final word (which is executed directly and is usually a JMP or +HLT instruction). The load address comes from the console address switches. +Both of these are controlled by compile-time flags.

    + +

    The emulator continues emulating instructions until it sees a HLT instruction +which will cause it to exit. Console I/O is emulated by setting the terminal +into raw mode and polling via read. Line-clock ticks (at 60 Hz) are done +by polling gettimeofday. Dynamic frequency code arranges to reduce the +polling interval to a few polls per tick, so that simulation remains +responsive. Since we use the real wall-clock time, this means that the +emulated system will see time advance at the correct rate.

    + +

    Licencing Fun

    + +

    So now I have a system that can run UNIX v0. One problem remains… I don’t +have permission to submit UNIX v0 to the IOCCC. It is not my code and the +copyright for it remains the property of whoever owns that part of what was +once Bell Labs – I believe it is Nokia at this point. I have worked around +this problem in two ways:

    + +

    First, I didn’t submit the source code or binary image for v0 UNIX as part of +my IOCCC entry. I merely submitted a Makefile that can issue a curl +command to fetch a prebuilt v0 disk image from the github repository. I am +hoping this is considered part of “Legal abose of the rules” which is supposed +to be “somewhat encouraged”. As per RULE 12, I am justifying said abuse here, +in the remarks file.

    + +

    Secondly, the choice to run the UNIX v0 code is optional. If you are worried +about Nokia’s lawyers running you to ground for running a 50-year old copy +of a binary image for a machine that is almost completely nonexistant, you +can just not do so. Delete the lines from the Makefile and sleep well. +You still have two other UNIXes to play with.

    + +

    What about the other two UNIX variants? These are both covered by licences +that allow me to use them. Back in 2002, Caldera International released +Research Unix versions 1-7 and 32V under a permissive BSD-like license. +BSD UNIX is based off of v7 UNIX, and of course has its own permissive +BSD licence. And in 2017, Nokia also released versions 8-10 under the +condition that it will not assert copyright rights for non-commercial use.

    + +

    So the newer UNIXes are in the clear. I doubt anyone actually cares about +version 0 either, but technically it’s still under copyright.

    + +

    PDP-11/40

    + +

    So if I have a PDP-7 emulator, how do I run operating systems that expect a +PDP-11? Simple… I emulate a PDP-11/40 on the PDP-7. I have written +PDP-7 assembler code to emulate a PDP-11/40 with the following equipment:

    + +
      +
    • PDP-11/40 (KD11-A)
    • +
    • EIS instruction set (KE11-E)
    • +
    • Memory management unit (KJ11-A)
    • +
    • Line time clock (KT11-D)
    • +
    • 124 Kwords of memory (244 Kbytes)
    • +
    • RK05 fixed disk drive (RK11)
    • +
    • Console TTY (DL11)
    • +
    + + +

    This required a few tweaks to the emulator. The first problem is that the +RK05 disk is about 2.5 MB, but the RB09 is only about 2 MB. That’s easily +solveable – just add more tracks to the RB09. UNIX v0 is unlikely to notice +(although the number of tracks is a compile time parameter, and the v0 +build commands set it to the correct value).

    + +

    The second problem is that we are simulating a system that can have up to +124 Kwords of memory on a system with only 8 Kwords total. That meant I needed +to virtualize the PDP-11/40’s physical memory (and add a few more tracks to +the disk to hold the virtualization).

    + +

    A large amount of time was spent tuning this code to be efficient. The +memory virtualization uses part of the 8 Kword memory as an LRU cache, and +uses a number of first-level microcaches to avoid having to do the LRU updates. +This also serves to offload the complexity of the PDP-11’s segmentation logic +from a large number of memory accesses (the PDP-11 does as many as eight +accesses per instruction). Despite the super fast emulated disk, the PDP-7 +code in the emulator is slow, mostly because it has to do a bunch of divides +to convert the linear disk offset into a BCD-coded track and sector for the +emulated RB09. I/O polling is again used, except this time it uses the +PDP-7’s “skip on flag set” I/O instructions. As with the PDP-7 emulator +itself, the PDP-11 emulator dynamically measures the instruction throughput +relative to the line-clock tick, so that it only polls for I/O a few times +per tick.

    + +

    The one remaining problem is building the disk images themselves. Since the +PDP-11’s disk is 16-bit, but the PDP-7’s is 18-bit (which the emulator stores +in 32-bit ints), a conversion program is needed to unpack the binary disk +images from 16 bits per word to 32. This in turn needs to be done in the +Makefile using standard POSIX tools, which aren’t exactly good with binary. +I had a wierdly clever way to do this with od, awk and uudecode that +I will leave as an exercise for the curious, but I decided it would be easier +to do it with the PDP-7 emulator itself, feeding a simple program in on its +boot tape. This required an additional tweak to the emulator, since by default +its console TTY is not eight-bit clean (in fact, UNIX v0 expects to see the +MSB set on the terminal reads, and sets it on writes, what is called “mark” +parity). This is also enabled by a compile-time setting (used only for the +builddisk program).

    + +

    Despite the complexity of the PDP-11 instruction set and its emulated I/O +devices and the corresponding primitiveness of the PDP-7’s instruction set, +the emulation itself is a suprisingly small amount of code, not really taxing +the 8 Kword memory, with about 2.25 Kwords of actual code and a similar +amount of space for the memory virtualization cache and disk block buffer, +leaving nearly half (3.5 Kwords) of the memory unused. The simulator executes +somewhere around 250 PDP-7 instructions per PDP-11 instruction. On my laptop, +the PDP-7 is running somewhere in the neighborhood of 70 MIPS, which means the +PDP-11 is running at about 0.3 MIPS, which is probably not too far off of its +actual speed (the cycle time of an 11/40 was around a microsecond for simple +instructions, but could be proportionally larger for instructions that did +multiple memory accesses, which many did).

    + +

    As an aside, although the idea of emulating the PDP-11 on an emulated PDP-7 +came about from the realization that I needed a response to the late-discovered +licence issue, I’m quite pleased with the result – it enables an interesting +window on the dawn of the UNIX era. I feel that someone should complete the +circle here by emulating a VAX 780 on the PDP-11 and run 4.2BSD on it, so that +we can get the original runtime environment used for the first IOCCC.

    + +

    Compile-time Options

    + +

    The following command flags control the compilation:

    + +
      +
    • -DI="image.fs": Name of the disk image file. This must be created + offline, and be of the correct size to avoid segmentation violations.
    • +
    • -DA=4096: Setting of the console address switches. This tells the RIM +bootloader where to load the boot image.
    • +
    • -DS=0: Setting of the console data switches. The PDP-7 emulation can +read these with the microcoded OAS (OR switches into AC) instruction. +By proxy, the PDP-11 emulation can read them via the CSW device.
    • +
    • -DW=MAP_PRIVATE: This sets the memory mapping for mmap. Setting to +MAP_PRIVATE makes the disk image be copy-on-write. Setting it to +MAP_SHARED makes the disk image be sharable. Do the latter if you want +to preserve the disk contents between sessions.
    • +
    • -DT=: List of initializers for the termios structure. The v0 UNIX +expects the terminal to be in half-duplex mode, echoing its input, with +swapped CR and NL. The PDP-11 UNIXes don’t.
    • +
    • -DX=5: The ASCII code of the control character that causes the simulation +to abort. If set to 0, there is no abort code.
    • +
    • -DY=128: Controls console I/O parity. If set to zero, the console is +eight-bit clean. If set to 128, the high bit is set on keyboard reads and +masked off on printer output (“mark” parity). UNIX v0 expects the latter.
    • +
    • -DV=270: The size of the disk, in tracks. The UNIX v0 disk has 200 +tracks (each has 80 sectors of 64 18-bit words). The PDP-11 UNIXes +increase this to 270, to allow for the larger RK05 disk emulation +(406 tracks of twelve 256-word sectors), plus the space for the 124 Kwords +of virtualized memory and the 8 Kwords of emulator code.
    • +
    • -DP="xxx": RIM bootstrap program paper tape image. Be careful with the +quoting here – there is at least three levels going on. In particular, +you will need to escape $ as $$ to protect it from make.
    • +
    + + +

    What is the ASCII art supposed to be?

    + +

    The ASCII art represents a torn piece of paper tape.

    + +

    Acknowledgements

    + +

    None of this could have been possible without the hard work of

    + +
      +
    • Warren Toomey and the other members of the +The Unix Heratage Society
    • +
    • Robert M. Supnik and the other contributors to SimH, the simulator +for historic computer architectures. The number of times I needed to +“Use the Source, Luke” on SimH to unravel some dark corner of these +machines was uncountable.
    • +
    • Bitsavers, which acquired, scanned and preserved all the manuals +I spent many hours squinting at.
    • +
    • Ken Thompson, Dennis Ritchie, Brian Kernigan, M. D. McIlroy, J. F. +Osssanna, Rudd Canaday and the other members of the Bell Labs +Computing Science Research Center who were responsible for the invention +of UNIX, the C programming language, and the innumerable other innovations +that we now take for granted as part of the modern software landscape. +In particular, the home page of the late Dennis Ritchie contained +a trove of useful information on the evolution of UNIX and C and is +recommended for perusal by others who share my peculiar retrocomputing +affectations.
    • +
    + + +

    Finally, thanks to my spouse for putting up with the many hours I spent on this +nonsense, and treating “I’m working on my IOCCC entry” as an acceptable answer +to queries about how I was spending my free time. Similarly, I apologise to +those friends and coworkers who had to listen to me complain about obscure +corner-case bugs in my code. The obsession is over, at least until next +time…

    + +
    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2018, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2018/mills/hint.text b/2018/mills/hint.text new file mode 100644 index 000000000..257eb9c6a --- /dev/null +++ b/2018/mills/hint.text @@ -0,0 +1,728 @@ +# Best of show + +Christopher Mills +Twitter: @MisterXopher + + +## Judges' comments: +### To use: + + make + ./prog + +### Try: + + make + ./prog + (At the ">boot" prompt, type return) + (At the ":" prompt, type "rk(0,0)rkunix") + NOTE: To quit, press Control-E + +### Selected Judges Remarks: + +Do small machines only need small programs? This program weighs in at just +3636 bytes, which is considerably lighter than the original machine it can replace. + +This program can take you back to the start of everything, it is possible to +run v0. Just type: + + make + ./v0 + + NOTE: To quit v0, press Control-E + +You will be greeted with a familiar prompt of "login". The username and +password are "dmr" and "dmr". To make things more familiar you'll need to +create '.' as it hasn't been invented yet on this image! + + @ ln dd dmr . + +An "ls" will reveal that C hasn't been invented yet! IOBCC anyone? The +compiler is "bc". It producess assembly, which will then need to be assembled +together in this order "ops.s bl.s hello.s bi.s" to produce a.out! + +But wait, we said this was the start of it all! This program can also run a +program that replaces an even larger machine that can run BSD 2.9. To start this, + + make + ./prog + + (At the ">boot" prompt, type return) + (At the ":" prompt, type "rk(0,0)rkunix") + NOTE: To quit prog, press Control-E + +This should now be very familiar and it is possible to compile and run one of +the very first IOCCC entires "mullender.c" + +But wait, there is even more! Try: + + make + ./v6 + + (At the "@" prompt, type "rkunix") + NOTE: To quit v6, press Control-E + +## Author's comments: + +> *This IOCCC entry is dedicated to the late Dennis M. Ritchie* + + +The Program +=========== + +Since this is the 25th "annual" IOCCC, I thought I should mark the occasion +with a look back to its earliest roots. At the same time the contest enters +its 34th year of providing a safe forum for poor C code, the C language +itself is fast approching its 50th anniversary, along with the UNIX operating +system whose history is so entwined with. + +The program delivered here is both a full machine emulation of the original +PDP-7 that Ken Thompson used to write the first version of UNIX and a full +machine emulation of the PDP-11/40 used by subsequent UNIXes. The `Makefile` +can build versions that can run each of the following: + + 1. UNIX v0 for the PDP-7 (circa 1969) + 2. Research UNIX Version 6 (circa 1975) + 3. BSD 2.9 (circa 1983) + +For reasons to be described in a bit, the last (BSD 2.9) is the default. + +Building and Running BSD 2.9 +---------------------------- + +To run BSD 2.9, do `make` to build `prog` and then `./prog` to run it. + +You should see a prompt from the first-stage bootloader that looks like + + >boot + +Type `RETURN` at this point and you will get to the second-stage boot loader +that looks like + + 40Boot + : + +The 40 in the prompt indicates that the bootloder has correctly determined +that we are running on a PDP-11/40. + +At this point, type the rather cryptic command `rk(0,0)rkunix` -- this tells +the system to look at the first partition on the first RK05 fixed disk, find +the `rkunix` file and load it. You should eventually see the following: + + >boot + + 40Boot + : rk(0,0)rkunix + + Berkeley UNIX (Rev. 2.9.1) Sun Nov 20 14:55:50 PST 1983 + mem = 135872 + + CONFIGURE SYSTEM: + xp ? csr 176700 vector 254 skipped: No CSR + rk 0 csr 177400 vector 220 attached + hk ? csr 177440 vector 210 skipped: No CSR + rl ? csr 174400 vector 160 skipped: No CSR + rp ? csr 176700 vector 254 skipped: No CSR + ht 0 csr 172440 vector 224 skipped: No CSR + tm 0 csr 172520 vector 224 skipped: No CSR + ts 0 csr 172520 vector 224 skipped: No CSR + dh ? csr 160020 vector 370 skipped: No CSR + dm ? csr 170500 vector 360 skipped: No autoconfig routines + dz ? csr 160110 vector 320 skipped: No CSR + dz ? csr 160110 vector 320 skipped: No CSR + dn 0 csr 175200 vector 300 skipped: No autoconfig routines + vp ? csr 177500 vector 174 skipped: No autoconfig routines + lp ? csr 177514 vector 200 skipped: No CSR + Erase=^?, kill=^U, intr=^C + # + +Congratulations, you are running BSD UNIX 2.9 in single-user mode as root. + +On the other hand, if you did a typo somewhere, the boot loader has probably +crashed and halted -- if so, type Control-E to quit the simulation and try +again. If you did really badly, you might have corrupted the virtual disk. +If so, consider a `make clean` to start from scratch. + +Assuming you managed to type 15 characters correctly, You should be at the +root prompt. Most of the commands you are familiar with work here (this was +only a quarter of a century ago -- how much could things have changed?). +Let's try some: + + # ls + .cshrc .profile boot hkunix mnt tmp + .login 2.9stamp dev lib mullender.c unix + .msgsrc bin etc lost+found rkunix usr + # df + Filesystem Mounted on kbytes used free % used + /dev/rk0 / 1958 1688 270 86% + # cc mullender.c + # ./a.out + +The program you've just run was the [winner of the first IOCCC contest from +1984] [1] (or was it 1894?), a personal favorite of mine. It is rather +tightly bound to running on either a PDP-11 or a VAX. Now you have one. + +Hitting Control-C will return you to the BSD UNIX prompt. Hitting Control-D +will log you out of the single-user session and get you back to the `:login:` +prompt. Here you can log in as `root` and get a full timesharing session. +Feel free to try things like `vi`. I've taken the liberty of editing the +`.login` and `.profile` files to set the console to a less traditional setup +so that you don't have to wait for the Model 33 KSR teletype to move its +carriage. I've also predefined `TERM` to `vt100`, which will probably work +well enough with whatever sort of ANSI terminal emulation you are using. + +Note that I have not mounted the `/usr` disk here, so some commands from +`/usr/bin` will be missing, along with all of the `man` pages. They are +[available online] [2] if you need them. Adding a second RK05 disk was +possible, but I didn't get around to it... As the Judges can no doubt attest, +"Mid 2017" creeps up on you quicker than you expect. :) + +Once you've had enough fun in BSD 2.9, type Control-E to exit the emulation. + +Building and Running Research UNIX v6 +------------------------------------- + +Research UNIX v6 and BSD 2.9 use the same executable, but require a different +disk image. Type `make v6` to build it, then type `./prog` to run it. + +You should see the boot loader prompt which is a single `@`: + + @ + +At this point, you again must type a special incantation: `rkunix`. After that +you should see: + + @rkunix + mem = 1035 + RESTRICTED RIGHTS + + Use, duplication or disclosure is subject to + restrictions stated in Contract with Western + Electric Company, Inc. + # + +You are now running a single-user session of v6 UNIX. You might want to start +with `stty -lcase` because otherwise everything will be IN ALL CAPS. + +Again, if you failed typing seven characters without making a mistake, you +may need to use Control-E to quit the simulation. + +Assuming you're more careful than that, we can try a few commands: + + @rkunix + mem = 1035 + RESTRICTED RIGHTS + + Use, duplication or disclosure is subject to + restrictions stated in Contract with Western + Electric Company, Inc. + # STTY -LCASE + # ls + bin + dev + etc + hpunix + lib + mnt + rkunix + rpunix + tmp + unix + usr + # cat > foo.c + main() + { + printf("Hello, World!\n"); + } + # cc foo.c + # ./a.out + Hello, World! + +Why is Version 6 interesting? Well, it was the oldest version that I could +find a boot image of that had a C compiler... This C compiler is recognizably +C, but not quite the same syntax as we have today. It's much closer to the +[B language] [3] from which it is derrived. In particular, this C compiler +would not be able to compile `mullender.c` (as simple as it is), because the +following syntax features don't exist yet: + + * The `short` data type doesn't exist yet. Only `int` (`short` will show + up when `long` comes, and the port to the Interdata 7/32 starts to make + the idea of portability become important). + * Hexidecimal constants don't exist yet. Digital's computers all used + octal. + * The array initializer syntax hasn't yet moved to using `=`. It still uses + the older form taken from B, which looks like `array[] { 1, 2, 3 };` + +It can still compile "Hello World!" (note that you must type a Control-D after +you finish entering the code, to let `cat` see an end-of-file). + +This version of UNIX doesn't go into multi-user mode if you do a Control-D. +Single-user mode was entered because the front-panel console switches were +set to the magic number 0173030 (this can be changed with a re-compile). + +Once you are done with Version 6, Type Control-E to exit the simulation. + +Note that since both BSD 2.9 and UNIX v6 use the same PDP-11/40 emulation +code, and they use the same name for the disk (`rk05.fs`), if you want to go +back to the BSD simulation, you should either delete `rk05.fs` or do a +`make clean` before you do a `make`. + +Building and Running UNIX v0 +---------------------------- + +We now set the Wayback Machine to the very start of it all, 1969. + +[The story] [4] here is interesting and well worth a read. Bell Labs was +pulling out of the Multics project and Ken Thompson and his collegues had +become accustomed to the relatively nice programming environment. They also +enjoyed the early computer game [*Space Travel*] [5] and wanted another system +to run it on. They found a PDP-7 which was already obsolete at the time to +port *Space Travel* to. The primitive programming environment influenced +Thompson to recreate parts of the Multics experience in the much more +hardware-constrained PDP-7 environemnt. In the summer of 1969, with his wife +out on a month-long vacation, Thompson re-wrote a filesystem emulation he had +been experementing with to include an assembler, a shell, an editor and an +operating system kernel and hence created the first version of UNIX (although +it hadn't been named that yet). + +You can try out this version by typing `make v0`. Since this version is a +native PDP-7 emulation, it gets its own binary. Type `./v0` to run it. You +should see the login prompt. + + login: + +There are two user accounts `ken` and `dmr`, with the passwords `ken` and `dmr` +respectively. Let's try the Dennis Richie's `dmr` account: + + login: dmr + password: dmr + @ ls + . ? + +Even though this is not Ken's doing, I feel this gives me licence to +include this quote from the BSD `fortune` program: + +> Ken Thompson has an automobile which he helped design. Unlike +> most automobiles, it has neither speedometer, nor gas gauge, +> nor any of the numerous idiot lights which plague the modern +> driver. Rather, if the driver makes any mistake, a giant "?" +> lights up in the center of the dashboard. "The experienced +> driver", he says, "will usually know what's wrong." + +What's the deal here? Well, that's a slightly long story. The short version +is we have gone so far back in the history of UNIX that *we don't have +filesystem paths yet*. In other words, we can't say something like +`/bin/ls` yet, and the shell can't store that path in `$PATH` to search for it. +We also haven't invented `.` or `..` yet. In fact, the filesystem isn't even +the traditional UNIX tree structure, it's a directed graph of hard links... + +`ls` needs to be able to read '`.`', the current directory. `dmr`'s home +directory doesn't have that yet, but we can make it, because the home +directory has a hard link to `dd`, which is the directory that holds all +of the user home directories (this will eventually become ``/``, the root +path). We can do + + @ ln dd dmr . + +To make the new link (note that `ln` doesn't support paths either, so you have +to give it three arguments -- a directory in the current dir, a file in that +directory, and the new name). + +Now `ls` will work, and we can try some other things while we are here: + + login: dmr + password: dmr + @ ln dd dmr . + @ ls + dd + system + as.s + b_readme + bi.s + bl.s + db.s + hello.b + ops.s + . + @ cat b_readme + Here is how to compile and run hello.b: + + @ bc hello.b hello.s + @ as ops.s bl.s hello.s bi.s + I + II + ops.s + bl.s + hello.s + bi.s + @ a.out + Hello, World! + + + @ bc hello.b hello.s + @ as ops.s bl.s hello.s bi.s + I + II + ops.s + bl.s + hello.s + bi.s + @ a.out + Hello, World! + @ + +The last command is invoking the compiler for an exteremely early version of +the [B programming language] [3], the predecessor to C. Thompson missed the +convinience of writing code in a high-level language -- Multics was written +a version of PL/1 -- and wanted the same convinience on UNIX. He preferred +BCPL (a typeless language) to PL/1. As Dennis Ritchie [wrote] [6]: + +> B can be thought of as C without types; more accurately, +> it is BCPL squeezed into 8K bytes of memory and filtered +> through Thompson's brain. + +A look at the B reference manual will show the strong correlation with C, and +shows the source of a lot of C's mysteriousness -- some of which is preserved +simply so that C could compile the *dozens* of lines of existing B code... + +Thompson's assembler was also extremely simple. It didn't even know about +opcodes -- these need to be defined in the first assembly file, with the +assembler OR-ing the opcode fields together (space was the "operator" for +logical OR). There is no link step -- all files are provided to the assembler +on the command line, concatenated together and assembled, producing a single +`a.out` (assembler output) file. Even after UNIX got a linker, `a.out` +remained the default name of the binary generated by the linker (and hence +also by `cc`). + +This system is still has the familiarity of UNIX, with all the two- and +three-letter commands, device files, shell redirection, the same core system +calls (`read`, `write`, `open`, `close`, `creat`, `fork`, etc.). There are a +number of differences still: + + * As noted, there are no file paths + * `read` and `write` do I/O on (18-bit) words. Character I/O to files needs + to unpack those to bytes, and of course deal with `NUL` characters. + * `exec` was performed by the shell directly. Arguments are passed as + four words (eight bytes), and space padded. This matches the format for + file names for `open` and `creat`. + * `wait` does not yet exist. A more complicated mechanism for sending and + recieving messages (`smes` and `rmes`) are used instead. + * File permission bits are all different, since groups don't exist yet. + * User programs are not allowed to run during disk I/O. This is because the + disk controller's "data break" (DMA) accesses were so fast relative to the + CPU that transfers would be dropped if an instruction that used + "deferred" mode (indirection) was executed. This also meant that the + "program break" (interrupt) routine in the kernel had to specifically + avoid deferred accesses by using self-modifying code to do indirection + through pointers. + * Although the PDP-7 suppoted a "trap mode" (a primitive supervisor mode), + the UNIX kernel doesn't use it. This means that user programs could alter + or crash the kernel at will (in fact, there is a system call that returns + addresses of useful kernel routines so that user code can call them + directly). + +As usual, when you are done exploring UNIX v0, type Control-E to exit the +simulator. + +About the Program +================= + +The program came about when I was looking for something to honor the pending +50th anniversary of the C language (because of the mercurial nature of IOCCC +contest scheduling, I chose not to wait for the actual 50th anniversary). +I had though of writing self-hosting compilers for a stripped-down version of +C, or maybe even a version of the B language... At the same time, I was +obsessed with the idea of allowing `mullender.c` from 1984 to run. Although +that was still a possibility on an interpreted version of B or a stripped-down +version of C, it felt cheap, as it would be `mullender.c` only in spirit. + +It was during this time that I discovered that in 2016, members of the Unix +Heritage Society got access to [printouts of assembly-language source for the +original version of UNIX] [7]. With what was a [huge amount of work] [8], +they scanned in the printouts, fixed up the OCR translations, built assembler +and file system tools from scratch and made an accurate simulation of +Thompson's PDP-7 that allowed them to get the system up and running. Although +source for the entire kernel and about half of the user-space commands were +present (including the runtime and libraries for the B compiler), the +remainder needed to be written from scratch, including the shell. The final +results of the project are [available on github] [9]. + +None of this was remotely easy (as I was to discover myself). The PDP-7 is +long gone, and the documentation for it is less complete than one would like. +In addition, the devices attached for it were a bit of a mystery. The disk +system is referenced only in an old price list. It was a RB09 fixed disk, +probably made by Burroughs. It is close to what was called the RC10 for the +PDP-10, but with a different interface. And the system also included a custom +display device called Graphics-2, which had been built in-house by AT&T. +It can't be completely ignored, because the kernel itself pokes at it (the +UNIX crew used it as a second terminal -- a "glass TTY"). + +I decided that implementing this PDP-7 would be possible as an IOCCC entry. + +The emulator emulates the full machine: + + * PDP-7 Central Processor + * Core Memeory Module Type 147 -- extends the core to 8,192 18-bit words + * Extended Arithmetic Element Type 177 -- adds one's-complement + multiplication, division and shifting + * Real Time Clock + * Teletype Model 33 KSR + * Perforated Tape Reader Type 444 + * RB09 Fixed Disk Controller + +The [PDP-7] [10] is an odd duck by modern computer standards: + + * 18 bit words, with no byte addressing. + * Both one's and two's complement math (there is `ADD` for one's complement + and `TAD` for two's complement). The EAE is entirely one's-complement. + * "Microcoded" instructions. + * Auto-increment memory locations. + * Non-reentrant function calls (the return address is stored at the indicated + address and the PC jumps to the location after it). + * The `XCT` instruction, that executes the word loaded from memory as an + instruction. + * An instruction `LAW` that loads the instruction opcode into the + accumulator. + * Heavy use of "inline" operands. For instance the `MUL` instruction expects + the second operand to be stored in memory after the instruction. This + pretty much requires the use of self-modifying code. + * No immediates. Almost all constants have to live in memory locations and + be referenced by address. + * Common operations, like "subtract" and "inclusive OR" are not directly + supported on the machine and require multiple instructions and some spare + memory locations to support. Being clever also helps. + * Single accumulator architecture. No direct support for things like stacks. + * I/O is done with dedicated I/O instructions (which are also microcoded). + * The RB09 disk controller gets a special mention here because of its + particularly annoying encoding of track and sector offsets in + [packed BCD] [11]. A non-trivial amount of code space in the simulator + is needed to convert into and out of BCD, along with an equivalent amount + of code in the UNIX kernel itself. + +The simulation handles everything I was able to discover about the PDP-7, even +things that the UNIX code itself doesn't use. For instance, it correctly +implements the "trap mode" feature (a primitive form of supervisor mode) even +though the kernel does not enable it. It also implements the microcoding of +the EAE instructions even though the UNIX environment uses only the standard +encodings. If you wanted to do a 11-bit multiply instead of an 18-bit one, +it will probably work. + +The simulation starts by loading a boot program off of the virtualized paper +tape, which is in a modified version of the RIM boot loader format. The +RIM format encodes each 18-bit word as three six-bit characters, using one bit +to denote the final word (which is executed directly and is usually a `JMP` or +`HLT` instruction). The load address comes from the console address switches. +Both of these are controlled by compile-time flags. + +The emulator continues emulating instructions until it sees a `HLT` instruction +which will cause it to exit. Console I/O is emulated by setting the terminal +into raw mode and polling via `read`. Line-clock ticks (at 60 Hz) are done +by polling `gettimeofday`. Dynamic frequency code arranges to reduce the +polling interval to a few polls per tick, so that simulation remains +responsive. Since we use the real wall-clock time, this means that the +emulated system will see time advance at the correct rate. + +Licencing Fun +------------- + +So now I have a system that can run UNIX v0. One problem remains... I don't +have permission to submit UNIX v0 to the IOCCC. It is not my code and the +copyright for it remains the property of whoever owns that part of what was +once Bell Labs -- I believe it is Nokia at this point. I have worked around +this problem in two ways: + +First, I didn't submit the source code or binary image for v0 UNIX as part of +my IOCCC entry. I merely submitted a `Makefile` that can issue a `curl` +command to fetch a prebuilt v0 disk image from the github repository. I am +hoping this is considered part of "Legal abose of the rules" which is supposed +to be "somewhat encouraged". As per RULE 12, I am justifying said abuse here, +in the remarks file. + +Secondly, the choice to run the UNIX v0 code is optional. If you are worried +about Nokia's lawyers running you to ground for running a 50-year old copy +of a binary image for a machine that is almost completely nonexistant, you +can just not do so. Delete the lines from the `Makefile` and sleep well. +You still have two other UNIXes to play with. + +What about the other two UNIX variants? These are both covered by licences +that allow me to use them. Back in 2002, Caldera International released +Research Unix versions 1-7 and 32V under a [permissive BSD-like license] [12]. +BSD UNIX is based off of v7 UNIX, and of course has its own permissive +BSD licence. And in 2017, Nokia also released versions 8-10 under the +condition that it will not assert copyright rights for non-commercial use. + +So the newer UNIXes are in the clear. I doubt anyone actually cares about +version 0 either, but technically it's still under copyright. + +PDP-11/40 +--------- + +So if I have a PDP-7 emulator, how do I run operating systems that expect a +PDP-11? Simple... *I emulate a PDP-11/40 on the PDP-7*. I have written +PDP-7 assembler code to emulate a PDP-11/40 with the following equipment: + + * PDP-11/40 (KD11-A) + * EIS instruction set (KE11-E) + * Memory management unit (KJ11-A) + * Line time clock (KT11-D) + * 124 Kwords of memory (244 Kbytes) + * RK05 fixed disk drive (RK11) + * Console TTY (DL11) + +This required a few tweaks to the emulator. The first problem is that the +RK05 disk is about 2.5 MB, but the RB09 is only about 2 MB. That's easily +solveable -- just add more tracks to the RB09. UNIX v0 is unlikely to notice +(although the number of tracks is a compile time parameter, and the `v0` +build commands set it to the correct value). + +The second problem is that we are simulating a system that can have up to +124 Kwords of memory on a system with only 8 Kwords total. That meant I needed +to virtualize the PDP-11/40's physical memory (and add a few more tracks to +the disk to hold the virtualization). + +A large amount of time was spent tuning this code to be efficient. The +memory virtualization uses part of the 8 Kword memory as an LRU cache, and +uses a number of first-level microcaches to avoid having to do the LRU updates. +This also serves to offload the complexity of the PDP-11's segmentation logic +from a large number of memory accesses (the PDP-11 does as many as eight +accesses per instruction). Despite the super fast emulated disk, the PDP-7 +code in the emulator is slow, mostly because it has to do a bunch of divides +to convert the linear disk offset into a BCD-coded track and sector for the +emulated RB09. I/O polling is again used, except this time it uses the +PDP-7's "skip on flag set" I/O instructions. As with the PDP-7 emulator +itself, the PDP-11 emulator dynamically measures the instruction throughput +relative to the line-clock tick, so that it only polls for I/O a few times +per tick. + +The one remaining problem is building the disk images themselves. Since the +PDP-11's disk is 16-bit, but the PDP-7's is 18-bit (which the emulator stores +in 32-bit `int`s), a conversion program is needed to unpack the binary disk +images from 16 bits per word to 32. This in turn needs to be done in the +`Makefile` using standard POSIX tools, which aren't exactly good with binary. +I had a wierdly clever way to do this with `od`, `awk` and `uudecode` that +I will leave as an exercise for the curious, but I decided it would be easier +to do it with the PDP-7 emulator itself, feeding a simple program in on its +boot tape. This required an additional tweak to the emulator, since by default +its console TTY is not eight-bit clean (in fact, UNIX v0 expects to see the +MSB set on the terminal reads, and sets it on writes, what is called "mark" +parity). This is also enabled by a compile-time setting (used only for the +`builddisk` program). + +Despite the complexity of the PDP-11 instruction set and its emulated I/O +devices and the corresponding primitiveness of the PDP-7's instruction set, +the emulation itself is a suprisingly small amount of code, not really taxing +the 8 Kword memory, with about 2.25 Kwords of actual code and a similar +amount of space for the memory virtualization cache and disk block buffer, +leaving nearly half (3.5 Kwords) of the memory unused. The simulator executes +somewhere around 250 PDP-7 instructions per PDP-11 instruction. On my laptop, +the PDP-7 is running somewhere in the neighborhood of 70 MIPS, which means the +PDP-11 is running at about 0.3 MIPS, which is probably not too far off of its +actual speed (the cycle time of an 11/40 was around a microsecond for simple +instructions, but could be proportionally larger for instructions that did +multiple memory accesses, which many did). + +As an aside, although the idea of emulating the PDP-11 on an emulated PDP-7 +came about from the realization that I needed a response to the late-discovered +licence issue, I'm quite pleased with the result -- it enables an interesting +window on the dawn of the UNIX era. I feel that someone should complete the +circle here by emulating a VAX 780 on the PDP-11 and run 4.2BSD on it, so that +we can get the [original runtime environment used for the first IOCCC] [13]. + +Compile-time Options +-------------------- + +The following command flags control the compilation: + + * `-DI="image.fs"`: Name of the disk image file. This must be created + offline, and be of the correct size to avoid segmentation violations. + * `-DA=4096`: Setting of the console address switches. This tells the RIM + bootloader where to load the boot image. + * `-DS=0`: Setting of the console data switches. The PDP-7 emulation can + read these with the microcoded `OAS` (OR switches into AC) instruction. + By proxy, the PDP-11 emulation can read them via the `CSW` device. + * `-DW=MAP_PRIVATE`: This sets the memory mapping for `mmap`. Setting to + `MAP_PRIVATE` makes the disk image be copy-on-write. Setting it to + `MAP_SHARED` makes the disk image be sharable. Do the latter if you want + to preserve the disk contents between sessions. + * `-DT=`: List of initializers for the `termios` structure. The v0 UNIX + expects the terminal to be in half-duplex mode, echoing its input, with + swapped CR and NL. The PDP-11 UNIXes don't. + * `-DX=5`: The ASCII code of the control character that causes the simulation + to abort. If set to 0, there is no abort code. + * `-DY=128`: Controls console I/O parity. If set to zero, the console is + eight-bit clean. If set to 128, the high bit is set on keyboard reads and + masked off on printer output ("mark" parity). UNIX v0 expects the latter. + * `-DV=270`: The size of the disk, in tracks. The UNIX v0 disk has 200 + tracks (each has 80 sectors of 64 18-bit words). The PDP-11 UNIXes + increase this to 270, to allow for the larger RK05 disk emulation + (406 tracks of twelve 256-word sectors), plus the space for the 124 Kwords + of virtualized memory and the 8 Kwords of emulator code. + * `-DP="xxx"`: RIM bootstrap program paper tape image. Be careful with the + quoting here -- there is at least three levels going on. In particular, + you will need to escape `$` as `$$` to protect it from `make`. + +What is the ASCII art supposed to be? +------------------------------------- + +The ASCII art represents a torn piece of [paper tape] [14]. + +Acknowledgements +---------------- + +None of this could have been possible without the hard work of + + * Warren Toomey and the other members of the + [The Unix Heratage Society] [15] + * Robert M. Supnik and the other contributors to [SimH] [16], the simulator + for historic computer architectures. The number of times I needed to + "Use the Source, Luke" on SimH to unravel some dark corner of these + machines was uncountable. + * [Bitsavers] [17], which acquired, scanned and preserved all the manuals + I spent many hours squinting at. + * Ken Thompson, Dennis Ritchie, Brian Kernigan, M\. D\. McIlroy, J\. F\. + Osssanna, Rudd Canaday and the other members of the Bell Labs + Computing Science Research Center who were responsible for the invention + of UNIX, the C programming language, and the innumerable other innovations + that we now take for granted as part of the modern software landscape. + In particular, the [home page of the late Dennis Ritchie] [18] contained + a trove of useful information on the evolution of UNIX and C and is + recommended for perusal by others who share my peculiar retrocomputing + affectations. + +Finally, thanks to my spouse for putting up with the many hours I spent on this +nonsense, and treating "I'm working on my IOCCC entry" as an acceptable answer +to queries about how I was spending my free time. Similarly, I apologise to +those friends and coworkers who had to listen to me complain about obscure +corner-case bugs in my code. The obsession is over, at least until next +time... + +------------------------------------------------------------------------------- + +[1]: http://ioccc.org/1984/mullender/mullender.c "mullender.c" +[2]: http://minnie.tuhs.org/cgi-bin/utree.pl?file=2.9BSD "2.9 BSD" +[3]: https://www.bell-labs.com/usr/dmr/www/kbman.html "B Language" +[4]: https://www.bell-labs.com/usr/dmr/www/hist.html "UNIX history" +[5]: https://www.bell-labs.com/usr/dmr/www/spacetravel.html "Space Travel" +[6]: https://www.bell-labs.com/usr/dmr/www/chist.html "C History" +[7]: http://www.tuhs.org/Archive/Distributions/Research/McIlroy_v0/ "V0 Scans" +[8]: http://minnie.tuhs.org/Y5/wkt_hapop_paper.pdf "UNIX v0" +[9]: https://github.com/DoctorWkt/pdp7-unix "PDP-7 UNIX" +[10]: http://bitsavers.trailing-edge.com/pdf/dec/pdp7/F-75P_PDP7prelimUM_Dec64.pdf "PDP-7 Manual" +[11]: https://en.wikipedia.org/wiki/Binary-coded_decimal "BCD" +[12]: http://www.tuhs.org/Archive/Caldera-license.pdf "Caldera Licence" +[13]: https://groups.google.com/forum/?hl=en#!msg/net.lang.c/lx-TAuEyeRI/HdOOnNx6LC0J "First annual IOCCC announcement" +[14]: https://en.wikipedia.org/wiki/Punched_tape "Paper Tape" +[15]: http://www.tuhs.org "The Unix Heritage Society" +[16]: http://simh.trailing-edge.com "SimH" +[17]: http://bitsavers.trailing-edge.com "Bitsavers.org" +[18]: https://www.bell-labs.com/usr/dmr/www/ "DMR Homepage" + + +-------------------------------------------------------------------------------- + diff --git a/2018/mills/prog.c b/2018/mills/prog.c new file mode 100644 index 000000000..a92714f21 --- /dev/null +++ b/2018/mills/prog.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +# define L } if(!i -- ){ +struct timeval F,G; struct termios H,U={ T} ; enum{ N=64,a=N<<7,b=a-1,c=a*32,d +=c-1, e=c/ 2,f= a*2, g=a/2,h =g/2,j =h/ 2,Q=V*j*5} ; char*s=P,K,M; +int* p, l[ a] ,m,n,J,o=A, O=j,E,R,i,k,t,r,q,u,v,w,x,y,z +,B,C, *D,Z ;int main (){ for(D=mmap(D,4*Q,3,W,open(I,2 ),K); *s; o +++[ l]=k|=* s++%N){ k=* s++%N<<12; k|=*s++% N*N; } tcgetattr(q,& H); tcsetattr +(y,2, &U); for( fcntl(B,4,4); ; o&=b){ if(k& c){ q=- --k%N; if(!q) +k-=c ;i =k /N&7; { L L if(J&1) m+= t; J|=m%N*c; J/=2; m +/= 2; if(! q&&r ^n){ m^=d; J^= d; n=0; } L L J+=J; J|=m>=0; if(q){ +m+=m; m|=J/c; m+=m<0?t:-t; } else{ m+=(m<0)*t; if(r)m^=d; if(n^r)J^= d; n=0; } +L if( (m^2 *m)/ e%2) k&=d; else{ J+=J; m+=m; m|=J/c; } L m|=n*c; J +|= m %N *c ;m /=2; J /=2; L m+=m; J+=J; J|=n; m|=J/c; L +m+=m; m|=n ; } J&=d ; } else{ i=k/f; t=i?k&b:16; p=l+t; if(k&a)p= +l+((*p+=13>i&&7t)&b); { L i=1; L*p=m; L*p++=o|n*e; o=p-l; L*p=0; L m=*p +; L m ^=*p ; L t=m; m +=*p; m+=d=0 ){ k -=c; n=1; +++o; } } i=2; } L if(Z)k=-1; else{ if(k&8)m=0; t=r=0; i=k/N%N; if(i==27){ if(k +&2)u=v=w=Z=0; } if (i==57){ i=k/16&3; { L w =1; if(k&1)x =0; if(k& +2) { t= z/N; t= t/80*/*/*/100+t% 80; r=0 ; while(t) { r ++=t%10*w; t/= 10;w <<=4; } m|=r; } if(k&4){ r=m ; t=0; while (r) { +t+=r%16*w; w*=10; r>>=4; } r=t/100; t%=100; if(V<=r||790){ if(X&& M== X)break; R=0; u|=f; } +gettimeofday(&G,0); G.tv_usec/=16667; if(G.tv_sec>F.tv_sec||F.tv_usec' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 3a3fabb90892eeb2f610ae0f74a35a970060665a063ab702bd686c17c4ae07f6 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2018/poikola/hint.html b/2018/poikola/hint.html new file mode 100644 index 000000000..54a585a12 --- /dev/null +++ b/2018/poikola/hint.html @@ -0,0 +1,165 @@ + + + + + + + Most stellar + + +

    Most stellar

    + +

    Timo Poikola ioccc2018@ig.fi
    +https://ig.fi/

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./prog
    +
    + +

    Try:

    + +

    On terminal supports 24 bit color, has black background, and size at least 125x38, try:

    + +
    ./prog
    +
    + +

    Selected Judges Remarks:

    + +

    It is said by some students of Astronomy:

    + +
    Oh, Be A Fine Gal, Kiss Me!
    +Oh, Be A Fine Gentleman, Kiss Me!
    +
    + +

    Many Mnemonic variations exist. +You might wish, on a star, to better understand the colors being displayed. +And those in the deep south might wish to go north for a better view.

    + +

    Author’s comments:

    + +

    How to build

    + +
    gcc -o prog -std=gnu11 -O3 prog.c
    +
    + +

    or

    + +
    make
    +
    + +

    Poster

    + +

    You can generate an A3 sized poster by make docs. This command creates a pdf file poikola.pdf.

    + +

    What this entry does

    + +

    Introduction

    + +

    It was a starry night when my wife pointed her finger up and asked: “What is this star and may I have some Easter eggs?”

    + +

    So I had to sit down and solve those tricky questions with Nano and a C compiler.

    + +

    Little spoilers

    + +

    Basically, the program draws animated ASCII art of the Big Dipper using Annie Jump Cannon’s spectral classification system of stars and I think the +colors of the output are as accurate as possible.

    + +

    This program also tells once in a year if it is correct time to find and eat some Easter eggs.

    + +

    The program has also at least three other functions, obvious and not so obvious.

    + +

    Technical jargon

    + +

    This program has been tested on xterm and Konsole and also Linux virtual terminal. Color support in the terminal is not necessary, but the effect is better with it. +This entry has partial support for terminals with a white background but the best viewing experience is achieved when the terminal in use supports 24-bit colors, +has a black background and the size is at least 125x38.

    + +

    Special note for Mac users: Terminal does not work as expected you might need xterm from XQuartz or some other +working terminal. Thanks to Dave Burton for spotting this problem.

    + +

    The main reason for the header unistd.h is getdelim() but once I included it I also abused other functions and defines. This header is mutually exclusive with -std=c11.

    + +

    The program was developed with little-endian machines; I tried to support big-endian too, but this support is somewhat limited.

    + +

    This program has been compiled in

    + +
      +
    1. i386 (Debian Stretch) with gcc and clang
    2. +
    3. amd64 (Debian Buster) with gcc and clang
    4. +
    5. Raspberry Pi 3 (Debian stretch) with gcc and clang
    6. +
    7. Lego Mindstorms EV3 Intelligent Brick (Debian Jessie) with gcc and clang (in this case, compiling time with clang-3.5 12 seconds and with gcc 27 seconds)
    8. +
    + + +

    Warnings and restrictions required by law

    + +

    Please do not feed little babies chocolate.

    + +

    Major spoilers

    + +
     
    + + +

    I incorporated the Fletcher 16 checksum algorithm into the source for security reasons; it might be challenging to make changes without breaking the main functionality of the code. +The space after #define p return is necessary.

    + +

    The computus uses an algorithm described in the journal Nature in 1876. It should be valid for Gregorian calendars.

    + +

    Some obfuscation techniques used

    + +
      +
    1. I tried to use meaningless or misleading variable names. For example, this program draws the Big Dipper with the correct colors, but variables +like o, b, and a are used in totally unrelated tasks.
    2. +
    3. I reused and recycled variables almost every time when possible.
    4. +
    5. Unnecessary use of predefined stuff like __ATOMIC_SEQ_CST.
    6. +
    7. When I was a kid, my favorite programming language was Pascal. In Pascal, there are things like begin; and end; instead of curly brackets. +They are used also in my code, but I had to shorten them to meet size requirements.
    8. +
    9. I also have strong Perl background, +and therefore I added some dollar signs to the code. One of the first ideas was to +write all variables with prefixed $, but then I rejected it.
    10. +
    + + +

    If you think you understand how this program works, can you answer these questions:

    + +
      +
    1. What is the value of aI_ after line 21?
    2. +
    3. Why are there some big numbers on line 47?
    4. +
    5. How is the scaling effect created?
    6. +
    7. How do you change a single bit, without changing the functionality?
    8. +
    + + +

    Rot18ed part

    + +

    Because the rot13 is too easy to decode with the plain eyes, I decided to use the Caesar cipher with the key 18.

    + +

    Lzw xajkl tsffwj ak wfugvwv mkafy AWWW 754 xdgslk gf dafw 47. Al ak hjaflwv gfdq gf dalldw-wfvasf esuzafwk.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2018, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2018/poikola/hint.text b/2018/poikola/hint.text new file mode 100644 index 000000000..899e06ca5 --- /dev/null +++ b/2018/poikola/hint.text @@ -0,0 +1,121 @@ +# Most stellar + +Timo Poikola + + + +## Judges' comments: +### To use: + + make + + ./prog + +### Try: + +On terminal supports 24 bit color, has black background, and size at least 125x38, try: + + ./prog + +### Selected Judges Remarks: + +It is said by some students of Astronomy: + + Oh, Be A Fine Gal, Kiss Me! + Oh, Be A Fine Gentleman, Kiss Me! + +Many [Mnemonic variations](http://www.star.ucl.ac.uk/%7Epac/obafgkmrns.html) exist. +You might wish, on a star, to better understand the colors being displayed. +And those in the deep south might wish to go north for a better view. + + +## Author's comments: +### How to build + + gcc -o prog -std=gnu11 -O3 prog.c + +or + + make + +### Poster + +You can generate an A3 sized poster by _make docs_. This command creates a pdf file _poikola.pdf_. + +### What this entry does +#### Introduction +It was a starry night when my wife pointed her finger up and asked: "What is this star and may I have some Easter eggs?" + +So I had to sit down and solve those tricky questions with Nano and a C compiler. + +#### Little spoilers +Basically, the program draws animated ASCII art of the Big Dipper using Annie Jump Cannon's spectral classification system of stars and I think the +colors of the output are as accurate as possible. + +This program also tells once in a year if it is correct time to find and eat some Easter eggs. + +The program has also at least three other functions, obvious and not so obvious. + +#### Technical jargon +This program has been tested on xterm and Konsole and also Linux virtual terminal. Color support in the terminal is not necessary, but the effect is better with it. +This entry has partial support for terminals with a white background but the best viewing experience is achieved when the terminal in use supports 24-bit colors, +has a black background and the size is at least 125x38. + +Special note for Mac users: __Terminal__ does not work as expected you might need xterm from XQuartz or some other +working terminal. Thanks to Dave Burton for spotting this problem. + +The main reason for the header `unistd.h` is `getdelim()` but once I included it I also abused other functions and defines. This header is mutually exclusive with _-std=c11_. + +The program was developed with little-endian machines; I tried to support big-endian too, but this support is somewhat limited. + +This program has been compiled in + +1. i386 (Debian Stretch) with gcc and clang +2. amd64 (Debian Buster) with gcc and clang +3. Raspberry Pi 3 (Debian stretch) with gcc and clang +4. Lego Mindstorms EV3 Intelligent Brick (Debian Jessie) with gcc and clang (in this case, compiling time with clang-3.5 12 seconds and with gcc 27 seconds) + +### Warnings and restrictions required by law +Please do not feed little babies chocolate. + +### Major spoilers +
     
    + +I incorporated the Fletcher 16 checksum algorithm into the source for security reasons; it might be challenging to make changes without breaking the main functionality of the code. +The space after `#define p return` is necessary. + +The computus uses an algorithm described in the journal Nature in 1876. It should be valid for Gregorian calendars. + +#### Some obfuscation techniques used + +1. I tried to use meaningless or misleading variable names. For example, this program draws the Big Dipper with the correct colors, but variables +like `o`, `b`, and `a` are used in totally unrelated tasks. +2. I reused and recycled variables almost every time when possible. +3. Unnecessary use of predefined stuff like `__ATOMIC_SEQ_CST`. +4. When I was a kid, my favorite programming language was Pascal. In Pascal, there are things like `begin;` and `end;` instead of curly brackets. +They are used also in my code, but I had to shorten them to meet size requirements. +5. I also have strong Perl background, +and therefore I added some dollar signs to the code. One of the first ideas was to +write all variables with prefixed `$`, but then I rejected it. + +If you think you understand how this program works, can you answer these questions: + +1. What is the value of `aI_` after line 21? +2. Why are there some big numbers on line 47? +3. How is the scaling effect created? +4. How do you change a single bit, without changing the functionality? + + +### Rot18ed part +Because the rot13 is too easy to decode with the plain eyes, I decided to use the Caesar cipher with the key 18. + +Lzw xajkl tsffwj ak wfugvwv mkafy AWWW 754 xdgslk gf dafw 47. Al ak hjaflwv gfdq gf dalldw-wfvasf esuzafwk. + +-------------------------------------------------------------------------------- + diff --git a/2018/poikola/poikola.tex b/2018/poikola/poikola.tex new file mode 100644 index 000000000..0e0c7c0f7 --- /dev/null +++ b/2018/poikola/poikola.tex @@ -0,0 +1,104 @@ +\documentclass[10pt]{article} +% Paper size is not really important. In this document the size is A3 from ISO 216 standard +% 297 x 420 mm (11.7 x 16.5 in) +\usepackage[a3paper,margin=3cm]{geometry} +\usepackage[pdftex,unicode]{hyperref} +\usepackage[T1]{fontenc} +\usepackage{listings} +\usepackage[usenames,dvipsnames]{xcolor} +\usepackage{textcomp} +\usepackage{bookmark} +\usepackage{fancyhdr} +\usepackage[ + type={CC}, + modifier={by-sa}, + version={3.0}, +]{doclicense} + +% headers and footers +\lhead{\large\color{NavyBlue}\textbf{25th International Obfuscated C Code Contest}} +\rhead{\large\color{NavyBlue} Winner: \textsc{Timo Poikola}\hspace{2em}Awarded in category: \textsc{Most stellar}} + +\lfoot{\begin{tabular}{ll} + \raisebox{-20pt}\doclicenseImage & \begin{tabular}{ll}\textcopyright\hspace{1em}Copyright 1984-2018, Leo Broukhis, Simon Cooper, Landon Curt Noll - All rights reserved\\ +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.\end{tabular} +\end{tabular}} + + +\cfoot{} +\rfoot{} + +\renewcommand{\headrulewidth}{0.4pt} +\renewcommand{\footrulewidth}{0.4pt} + +\hypersetup{ + unicode=false, % non-Latin characters in Acrobat's bookmarks + pdftoolbar=true, % show Acrobat's toolbar? + pdfmenubar=true, % show Acrobat's menu? + pdffitwindow=false, % window fit to page when opened + pdfstartview={FitH}, % fits the width of the page to the window + pdftitle={IOCCC Winner}, % title + pdfauthor={Timo Poikola}, % author + pdfsubject={Most stellar}, % subject of the document + pdfcreator={Pdflatex}, % creator of the document + pdfproducer={Timo Poikola}, % producer of the document + pdfkeywords={25th} {IOCCC} {Most stellar} {2108}, % list of keywords + pdfnewwindow=true, % links in new window + colorlinks=true, % false: boxed links; true: colored links + linkcolor=BrickRed, % color of internal links + citecolor=LimeGreen, % color of links to bibliography + filecolor=magenta, % color of file links + urlcolor=NavyBlue % color of external links +} + +%Compression +\pdfminorversion=5 +\pdfcompresslevel=9 +\pdfobjcompresslevel=3 + + +\definecolor{mGreen}{rgb}{0,0.6,0} +\definecolor{mGray}{rgb}{0.5,0.5,0.5} +\definecolor{mPurple}{rgb}{0.58,0,0.82} + +\lstdefinestyle{CStyle}{ + commentstyle=\color{NavyBlue}, + keywordstyle=\color{magenta}, + numberstyle=\tiny\color{mGray}, + stringstyle=\color{mPurple}, + basicstyle=\ttfamily\footnotesize, + breakatwhitespace=false, + breaklines=false, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=8, + language=C, + showlines=true, + classoffset=1, + morekeywords={T,F,E,B}, + keywordstyle=\color{WildStrawberry}, + classoffset=2,% starting another class + morekeywords={__CHAR_BIT__,unix,SEEK_END,__ATOMIC_SEQ_CST,__FILE__,NULL,__FLT_RADIX__,_XOPEN_VERSION,F_TLOCK,F_OK,R_OK,W_OK,X_OK,__ATOMIC_RELEASE}, + morekeywords={__LINE__,F_TEST,__DBL_DIG__,_POSIX_TRACE,__FLT_MAX_EXP__}, + keywordstyle=\color{Sepia}, + classoffset=3, + morekeywords={main,u,Z,getdelim,fopen,time,usleep,printf,sprintf,typedef,return,fflush,localtime,vir,stup}, + keywordstyle=\color{PineGreen} +} + +\pagestyle{fancy} + +\begin{document} + +% Prefix all but the first line of multiline comments with "@" +\lstset{language=C, style=CStyle, +moredelim=[il][\color{NavyBlue}]{\@} +} +\lstinputlisting[lastline=92]{prog-doc.c} + +\end{document} diff --git a/2018/poikola/prog-doc.c b/2018/poikola/prog-doc.c new file mode 100644 index 000000000..f14f572ce --- /dev/null +++ b/2018/poikola/prog-doc.c @@ -0,0 +1,91 @@ +#include +#include +#include +#define p return +#define X typedef +#define E { +#define B } +#define stup(y)printf("%.11s\n",(char*)y); +#define $ printf("\x1b" +#define G(y)usleep(y);fflush(stdout); +#define O __DATE__+7 +#define K printf( +X unsigned short P; +X int _; +_ s=41456; //Sleeping time factor +X char H; +_ o,b,a,f,g,k, m; // Oh, be a fine girl, kiss me +FILE *W; +X enum {T,F} z; //True & False +X double w; +_ a5_, N = 11,A4=1<<3,a8_=17,A8=2*2,aI_=~-(__FLT_MAX_EXP__<2 /* alpha Ursae Minoris Ab*/ + )p b*b*D;p b*b ; + B _ u(_ x) E if( x <2)p + F;p x*u(x-unix); B + /*alpha Ursae Minoris B*/ _ vir(H __[]) E _ e, + q=0;for(e=T;e[__];e++) + q=q* -~9+__[e]-48;p q;B P A + (H *a7_, _ a6_ );w V(_ v + ,_ i){v%=0550;w D='-'-'-'; + for(i-=i;i^__CHAR_BIT__;i++ + )D+=Z(_POSIX_TRACE,i)*Z(0x1.1df46a226e211p-6 *v,2*i)/u(2*i);p D;B _ main(a6,n)_ a6;H**n;E _ a7,A1,a1_,a8,t, + A6,D,Y;size_t a3_;_ A2[]=E'q',W_OK,5911774,'y',13,1052160,77,15,1709568,'5',a8_,1314816,34,18,1446400 + ,91,22,1314816,12,28,F_OK B;time_t j =time(NULL);a4 *= '_' ;float and [] =/*trolling is a art */ + E 4612954808543207739097088.0, 207.285645, 214354950132336733650542884425029386240.0 B ; + struct tm R = *localtime (&j) ;for (;t=aI_ ,a5_[l];) l[a5_++] ^=-~__LINE__ ; A6=a4 += + R.tm_year;a4 /='d';ssize_t A3 =1;k=A6/'d',b=k/A8,a=k%4,o=(k-((k+A4)/25)+1)/F_TEST + ,m=(19*(A6%a4 )+k-b-o+__DBL_DIG__)%30,k=(A6%'d')/R_OK;H*a2_=NULL;f=(A6%'d')% + R_OK,g=(' '+2*a+SEEK_END*k-m-f)%7,k=__ATOMIC_SEQ_CST;W=fopen(__FILE__, + "r" ); $"[40m\033[2J\033[;H\x1b[?25l");if(*(H *)(_[])E X_OK B)stup + (and)A3 =getdelim(&a2_,&a3_,'\0', W);b=((A6%19)+N*m+22*g)/(N* + ')'),o=m+g-(~-A4)*b+'r',D=o/31;for(;a1[I];a1++,a5_=0xb3) + I[a1 ]^= '-'-'#';Y=o% ~-' ' +F;for(a3 =T;a3-1) + E $ "[40m\x1b[2J");for(a6=W_OK;a6<025;a6 +=3) + E a7 = A2 [ a6 -__FLT_RADIX__ ] - 0102, a8 =k + + a6 [A2],a1 = A2[~-a6 ] *0x1.db6db6db6a92ap+0 ; + a1-=~-__DBL_DIG__,a1_=a7 *V(a5_,_XOPEN_VERSION ) - + a1*V(90-a5_,a7 )+66,A1 =(a7*V(90-a5_,a1 ) +a1 *V ( + a5_,a8 )+0xe)/1.8571428571;if(A1 >T&&a1_>0) E $"[3" + "8;2;%d;%d;%dm", (a8>> 16 )&t,(a8>>8)& 255,a8 &t);$ + "[%d;%dH%c %.*s",A1,a1_ ,a5_>90?46:111,6,a5_>45 + ?"":l+ ((a6-F_TLOCK) / __ATOMIC_RELEASE)*6); + B B G(u(A4 ) )B/**/ a4_:$ "[H\x1b[0m" + "\x1b[?25h") ;if( ( D^ (R.tm_mon+1)) + == (Y-= R./* */ tm_mday) ) E K + "%s\n",I);B K "" "%d\n", + vir(O) );p a4 ;B //END\ +@ OF THIS ENTRY IS\ +@ N E A R SO NEAR\ +@ .***** ******\ +@ **** ***\ +@ . . + + + + + + + + + + + + + + diff --git a/2018/poikola/prog.c b/2018/poikola/prog.c new file mode 100644 index 000000000..1d6949513 --- /dev/null +++ b/2018/poikola/prog.c @@ -0,0 +1,91 @@ +#include +#include +#include +#define p return +#define X typedef +#define E { +#define B } +#define stup(y)printf("%.11s\n",(char*)y); +#define $ printf("\x1b" +#define G(y)usleep(y);fflush(stdout); +#define O __DATE__+7 +#define K printf( +X unsigned short P; +X int _; +_ s=41456; //Sleeping time factor +X char H; +_ o,b,a,f,g,k, m; // Oh, be a fine girl, kiss me +FILE *W; +X enum {T,F} z; //True & False +X double w; +_ a5_, N = 11,A4=1<<3,a8_=17,A8=2*2,aI_=~-(__FLT_MAX_EXP__<2 /* alpha Ursae Minoris Ab*/ + )p b*b*D;p b*b ; + B _ u(_ x) E if( x <2)p + F;p x*u(x-unix); B + /*alpha Ursae Minoris B*/ _ vir(H __[]) E _ e, + q=0;for(e=T;e[__];e++) + q=q* -~9+__[e]-48;p q;B P A + (H *a7_, _ a6_ );w V(_ v + ,_ i){v%=0550;w D='-'-'-'; + for(i-=i;i^__CHAR_BIT__;i++ + )D+=Z(_POSIX_TRACE,i)*Z(0x1.1df46a226e211p-6 *v,2*i)/u(2*i);p D;B _ main(a6,n)_ a6;H**n;E _ a7,A1,a1_,a8,t, + A6,D,Y;size_t a3_;_ A2[]=E'q',W_OK,5911774,'y',13,1052160,77,15,1709568,'5',a8_,1314816,34,18,1446400 + ,91,22,1314816,12,28,F_OK B;time_t j =time(NULL);a4 *= '_' ;float and [] =/*trolling is a art */ + E 4612954808543207739097088.0, 207.285645, 214354950132336733650542884425029386240.0 B ; + struct tm R = *localtime (&j) ;for (;t=aI_ ,a5_[l];) l[a5_++] ^=-~__LINE__ ; A6=a4 += + R.tm_year;a4 /='d';ssize_t A3 =1;k=A6/'d',b=k/A8,a=k%4,o=(k-((k+A4)/25)+1)/F_TEST + ,m=(19*(A6%a4 )+k-b-o+__DBL_DIG__)%30,k=(A6%'d')/R_OK;H*a2_=NULL;f=(A6%'d')% + R_OK,g=(' '+2*a+SEEK_END*k-m-f)%7,k=__ATOMIC_SEQ_CST;W=fopen(__FILE__, + "r" ); $"[40m\033[2J\033[;H\x1b[?25l");if(*(H *)(_[])E X_OK B)stup + (and)A3 =getdelim(&a2_,&a3_,'\0', W);b=((A6%19)+N*m+22*g)/(N* + ')'),o=m+g-(~-A4)*b+'r',D=o/31;for(;a1[I];a1++,a5_=0xb3) + I[a1 ]^= '-'-'#';Y=o% ~-' ' +F;for(a3 =T;a3-1) + E $ "[40m\x1b[2J");for(a6=W_OK;a6<025;a6 +=3) + E a7 = A2 [ a6 -__FLT_RADIX__ ] - 0102, a8 =k + + a6 [A2],a1 = A2[~-a6 ] *0x1.db6db6db6a92ap+0 ; + a1-=~-__DBL_DIG__,a1_=a7 *V(a5_,_XOPEN_VERSION ) - + a1*V(90-a5_,a7 )+66,A1 =(a7*V(90-a5_,a1 ) +a1 *V ( + a5_,a8 )+0xe)/1.8571428571;if(A1 >T&&a1_>0) E $"[3" + "8;2;%d;%d;%dm", (a8>> 16 )&t,(a8>>8)& 255,a8 &t);$ + "[%d;%dH%c %.*s",A1,a1_ ,a5_>90?46:111,6,a5_>45 + ?"":l+ ((a6-F_TLOCK) / __ATOMIC_RELEASE)*6); + B B G(u(A4 ) )B/**/ a4_:$ "[H\x1b[0m" + "\x1b[?25h") ;if( ( D^ (R.tm_mon+1)) + == (Y-= R./* */ tm_mday) ) E K + "%s\n",I);B K "" "%d\n", + vir(O) );p a4 ;B //END\ + OF THIS ENTRY IS\ + N E A R SO NEAR\ + .***** ******\ + **** ***\ + . . + + + + + + + + + + + + + + diff --git a/2018/poikola/prog.orig.c b/2018/poikola/prog.orig.c new file mode 100644 index 000000000..a71202891 --- /dev/null +++ b/2018/poikola/prog.orig.c @@ -0,0 +1,91 @@ +#include +#include +#include +#define p return +#define X typedef +#define E { +#define B } +#define stup(y)printf("%.11s\n",(char*)y); +#define $ printf("\x1b" +#define G(y)usleep(y);fflush(stdout); +#define O __DATE__+7 +#define K printf( +X unsigned short P; +X int _; +_ s=37985; //Sleeping time factor +X char H; +_ o,b,a,f,g,k, m; // Oh, be a fine girl, kiss me +FILE *W; +X enum {T,F} z; //True & False +X double w; +_ a5_, N = 11,A4=1<<3,a8_=17,A8=2*2,aI_=~-(__FLT_MAX_EXP__<2 /* alpha Ursae Minoris Ab*/ + )p b*b*D;p b*b ; + B _ u(_ x) E if( x <2)p + F;p x*u(x-unix); B + /*alpha Ursae Minoris B*/ _ vir(H __[]) E _ e, + q=0;for(e=T;e[__];e++) + q=q* -~9+__[e]-48;p q;B P A + (H *a7_, _ a6_ );w V(_ v + ,_ i){v%=0550;w D='-'-'-'; + for(i-=i;i^__CHAR_BIT__;i++ + )D+=Z(_POSIX_TRACE,i)*Z(0x1.1df46a226e211p-6 *v,2*i)/u(2*i);p D;B _ main(a6,n)_ a6;H**n;E _ a7,A1,a1_,a8,t, + A6,D,Y;size_t a3_;_ A2[]=E'q',W_OK,5911774,'y',13,1052160,77,15,1709568,'5',a8_,1314816,34,18,1446400 + ,91,22,1314816,12,28,F_OK B;time_t j =time(NULL);a4 *= '_' ;float and [] =/*trolling is a art */ + E 4612954808543207739097088.0, 207.285645, 214354950132336733650542884425029386240.0 B ; + struct tm R = *localtime (&j) ;for (;t=aI_ ,a5_[l];) l[a5_++] ^=-~__LINE__ ; A6=a4 += + R.tm_year;a4 /='d';ssize_t A3 =1;k=A6/'d',b=k/A8,a=k%4,o=(k-((k+A4)/25)+1)/F_TEST + ,m=(19*(A6%a4 )+k-b-o+__DBL_DIG__)%30,k=(A6%'d')/R_OK;H*a2_=NULL;f=(A6%'d')% + R_OK,g=(' '+2*a+SEEK_END*k-m-f)%7,k=__ATOMIC_SEQ_CST;W=fopen(__FILE__, + "r" ); $"[40m\033[2J\033[;H\x1b[?25l");if(*(H *)(_[])E X_OK B)stup + (and)A3 =getdelim(&a2_,&a3_,'\0', W);b=((A6%19)+N*m+22*g)/(N* + ')'),o=m+g-(~-A4)*b+'r',D=o/31;for(;a1[I];a1++,a5_=0xb3) + I[a1 ]^= '-'-'#';Y=o% ~-' ' +F;for(a3 =T;a3-1) + E $ "[40m\x1b[2J");for(a6=W_OK;a6<025;a6 +=3) + E a7 = A2 [ a6 -__FLT_RADIX__ ] - 0102, a8 =k + + a6 [A2],a1 = A2[~-a6 ] *0x1.db6db6db6a92ap+0 ; + a1-=~-__DBL_DIG__,a1_=a7 *V(a5_,_XOPEN_VERSION ) - + a1*V(90-a5_,a7 )+66,A1 =(a7*V(90-a5_,a1 ) +a1 *V ( + a5_,a8 )+0xe)/1.8571428571;if(A1 >T&&a1_>0) E $"[3" + "8;2;%d;%d;%dm", (a8>> 16 )&t,(a8>>8)& 255,a8 &t);$ + "[%d;%dH%c %.*s",A1,a1_ ,a5_>90?46:111,6,a5_>45 + ?"":l+ ((a6-F_TLOCK) / __ATOMIC_RELEASE)*6); + B B G(u(A4 ) )B/**/ a4_:$ "[H\x1b[0m" + "\x1b[?25h") ;if( ( D^ (R.tm_mon+1)) + == (Y-= R./* */ tm_mday) ) E K + "%s\n",I);B K "" "%d\n", + vir(O) );p a4 ;B //END\ + OF THIS ENTRY IS\ + N E A R SO NEAR\ + .***** ******\ + **** ***\ + . . + + + + + + + + + + + + + + diff --git a/2018/rules.txt b/2018/rules.txt new file mode 100644 index 000000000..92b5717aa --- /dev/null +++ b/2018/rules.txt @@ -0,0 +1,275 @@ +| 25th International Obfuscated C Code Contest Official Rules + +| Copyright (C) 2006-2017 Leonid A. Broukhis, Simon Cooper, Landon Curt Noll + +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in +writing from the contest judges. + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: his emotions obfuscated his + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + + +| This rules file is version 2017-12-25-v25. + +| Most of the changes from the previous IOCCC rule set have +| been marked with a "|" on the left hand side of the line. + + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show the importance of programming style, in an ironic way. + * To stress C compilers with unusual code. + * To illustrate some of the subtleties of the C language. + * To provide a safe forum for poor C code. :-) + + This IOCCC runs from: + +| 2017-Dec-29 05:38:51 UTC + to: +| 2018-Mar-15 03:08:07 UTC + + Until the start of this IOCCC, these rules, guidelines and iocccsize.c tool + should be considered provisional BETA versions and may be adjusted + at any time. + + The IOCCC submission URL: + + https://submit.ioccc.org/ + + will be available and active on or slightly before the start of this IOCCC. + + The official rules, guidelines and iocccsize.c tool will be available + on the official IOCCC web site on or slightly before start of this IOCCC. + Please check the IOCCC web site "How to enter" link: + + http://www.ioccc.org/index.html#enter + + on or after the start of this IOCCC to be sure you are using the correct + versions of these items before using the IOCCC entry submission URL. + + +RULES: + + To help us with the volume of entries, we ask that you follow these rules: + + 1) Your entry must be a complete program. + +| 2) Size rule requires your entry to satisfy BOTH 2a as well as 2b: +| +| 2a) The size of your program source must be <= 4096 bytes in length. + +| 2b) When your program source is fed as input to the current IOCCC size +| tool, and the IOCCC size tool -i command line option is used, the + value printed shall not exceed 2053. + + The source to the current IOCCC size tool is found at this URL: + +| http://www.ioccc.org/2018/iocccsize.c + + 3) Submissions should be performed using the instructions outlined at: + + https://submit.ioccc.org/ + +| That URL should be active on or slightly before 2017-Dec-29 05:38:51 UTC. + + 4) If your entry is selected as a winner, it will be modified as follows: + + Your 'build' instructions will be incorporated into a makefile. + + Your source code will be the file prog.c. The compiled binary + will be called prog. + + 5) Your entry must not modify the content or filename of any part of your + original entry including, but not limited to prog.c, the Makefile + (we create from your how to build instructions), as well as any data + files you submit. + + If you entry wishes to modify such content, it must first copy the + file to a new filename and then modify that copy. + +| 6) I am not a rule, I am a free(void *man)! + +| while (!understand(ioccc(rule(you(are(number(6))))))) { laugh(); } + + 7) The obfuscated C program must be an original work that you own. + + You (the authors) must own the contents of your submission OR + you must have permission from the owners to submit their content + under the Creative Commons Attribution-ShareAlike 3.0 Unported + (CC BY-SA 3.0) license (see rule 18). + + If you submit any content that is owned by others, you MUST + detail that ownership (i.e., who owns what) and document the + permission you obtained. + +| Please note that the IOCCC size tool is not an original work. + + 8) Entries must be received prior to the end if this IOCCC which is: + +| 2018-Mar-15 03:08:07 UTC + + A confirmation of submission will be sent to the submitter + email address before the close of the contest. + +| 9) Each person may submit up to and including 8.0000 entries per contest. + Each entry must be submitted separately. + + 10) Entries requiring human interaction to be initially compiled are + not permitted. + + 11) Programs that require special privileges (setuid, setgid, super-user, + special owner, special group, etc.) are still highly discouraged. We + do not guarantee these functions will behave as you expect on our test + platforms. If your program needs special permissions please document + them in the remarks file. + + 12) Legal abuse of the rules is somewhat encouraged. An entry that, in + the opinion of the judges, violates the rules will be disqualified. + Entries that attempt to abuse the rules must try to justify why + their rule abuse is legal in the remarks file. + + 13) Any C source that fails to compile because of unescaped octets with + the high bit set (octet value >= 128) will be rejected. + + 14) Any C source that fails to compile because of lines with trailing + control-M's (i.e., lines with a tailing octet 015) will be rejected. + + Please do not put trailing control-M's on remarks file lines. + Please check to be sure, before submitting, that you have removed + any control-M at the end of remark file lines. + + 15) When you submit your entry you must have a valid email address + that can both send and receive email. The online submission + method is a two phase process that requires the use of an + approval code. This code will be emailed to you as part of + phase 1. + + Entries submitted without a working or valid email address will + be disqualified. + + The judges are not responsible for delays in email, please plan + enough time for one automated exchange of email as part of your + submission. + + After your email address has been confirmed, the submission code will + be valid for submitting and editing the entry for the lifetime of the + competition. + + 16) You are STRONGLY encouraged to submit a previously unpublished and + original entry. Submissions that are similar to previous entries are + discouraged. As we judge anonymously, submissions that have already + been published may be disqualified. + + 17) The total size of your submission: the sum of the size of the program, + hints, comments, build and info files MUST be less than or equal + to 1048576 octets in size. + + 18) The entirety of your entry must be submitted under the Creative Commons + Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0): + + http://creativecommons.org/licenses/by-sa/3.0/ + + You must not submit anything that cannot be submitted under that license. + + 19) The remarks file must be written in markdown format. See: + + http://daringfireball.net/projects/markdown/basics + + for more information. + + We currently use "Discount" to convert markdown to HTML + + http://www.pell.portland.or.us/~orc/Code/discount/ + + 20) The how to build instructions must be in make form. + + The target of the make file must be called prog. The original + C source file must be called prog.c. + + To invoke the C compiler, use ${CC}. + To invoke the C preprocessor use ${CPP}. + +| Do not assume that . (the current directory) is in the $PATH. + + Use a shell command syntax that is compatible with bash. + + Assume that commands commonly found in POSIX-like / Linux-like systems + are available in the search path. + + Do not assume any particular given value of ${CFLAGS} or other + commonly used make variables. + + 21) Your entry must not create nor modify files above the current directory + with the exception of the /tmp and the /var/tmp directories. Your entry + may create subdirectories below the current directory, or in /tmp, + or in /var/tmp provided that "." is not the first octet in any + directory name. + +| 22) Catch 22: +| + Your source code, data files, remarks and program output must NOT + identify the authors of your code. The judges STRONGLY prefer to + not know who is submitting entries to the IOCCC. + +| Even if you are a previous IOCCC winner, catch 22 still applies. + +| Identifying the authors of your entry in an obvious way anywhere +| within in your code, data, remarks or program output (unless you are +| Peter Honeyman or pretending to be Peter Honeyman) will be grounds +| for disqualification of your entry. + +| Yes, Virginia, we really mean it! + + 23) This prime rule number is reserved for future use. + + 24) Even though 24 is not prime, you should still see rule #23. + +| 25) The IOCCC rule set consists of 25 rules. This set of rules includes +| the Catch 22 rule. + + +FOR MORE INFORMATION: + +| The judging will be done by Leonid A. Broukhis, Simon Cooper, +| Landon Curt Noll. + + Please send questions or comments about the contest, to: + +| q.2018@ioccc.org (for questions only!) + + You must include the words: + +| ioccc 2018 question + + in the subject of your EMail message when sending EMail to the judges. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, visit the IOCCC web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + For the updates and breaking IOCCC news, you are encouraged to follow + the twitter handle: + + @IOCCC + + You do not have to be a twitter user to follow @IOCCC. Non-twitter + users should access: + + https://twitter.com/ioccc + + Non-twitter users should force their browsers to reload the above URL + to be sure they are seeing the most recent tweets. + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ diff --git a/2018/vokes/Makefile b/2018/vokes/Makefile new file mode 100644 index 000000000..936857d95 --- /dev/null +++ b/2018/vokes/Makefile @@ -0,0 +1,284 @@ +#!/usr/bin/env make +# +# 2018 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +GZIP_PROG= gzip +BZIP2= bzip2 +CURL= curl +DD= dd +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq +STRIP= strip + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +CSILENCE= -Wno-missing-prototypes +#CSILENCE= -Wno-implicit-int + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=25 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= +ALT_TARGET= + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 3a3fabb90892eeb2f610ae0f74a35a970060665a063ab702bd686c17c4ae07f6 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2018/vokes/example-1.txt b/2018/vokes/example-1.txt new file mode 100644 index 000000000..e0e4bb068 --- /dev/null +++ b/2018/vokes/example-1.txt @@ -0,0 +1,8 @@ +0 4 8 +1 0 +2 1 3 +3 2 +4 1 +5 4 6 +6 5 2 +7 3 6 7 diff --git a/2018/vokes/example-2.txt b/2018/vokes/example-2.txt new file mode 100644 index 000000000..b90152aff --- /dev/null +++ b/2018/vokes/example-2.txt @@ -0,0 +1,8 @@ +0 1 +1 2 4 5 +2 3 6 +3 2 7 +4 0 5 +5 6 5 +6 5 +7 3 6 diff --git a/2018/vokes/example-tab.txt b/2018/vokes/example-tab.txt new file mode 100644 index 000000000..597f12a15 --- /dev/null +++ b/2018/vokes/example-tab.txt @@ -0,0 +1,8 @@ +0 4 8 +1 0 +2 1 3 +3 2 +4 1 +5 4 6 +6 5 2 +7 3 6 7 diff --git a/2018/vokes/hint.html b/2018/vokes/hint.html new file mode 100644 index 000000000..d440910c8 --- /dev/null +++ b/2018/vokes/hint.html @@ -0,0 +1,235 @@ + + + + + + + Most connected + + +

    Most connected

    + +

    Scott Vokes
    +Twitter: @silentbicycle

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +./prog < example-1.txt
    +
    + +

    Try:

    + +
    ./prog < example-2.txt
    +./prog < example-tab.txt
    +./prog < ioccc.txt
    +
    + +

    Selected Judges Remarks:

    + +

    What this program does is not witchcraft and there are no spectres, but you +might have a meltdown trying to work it all out.

    + +

    This entry is designed to mislead in many ways. However, if you find yourself +wanting to know the possibilities for navigating a graph, you will get the +answer you seek with no hocus pocus.

    + +

    Author’s comments:

    + +

    Introduction

    + +

    This program reads a directed graph (as lines with integer node IDs), +and prints the graph’s nodes in reverse-topologically sorted order, +grouped into strongly connected components. Given a set of nodes +representing targets and edges representing dependencies between them, +it produces a build order with any dependency cycles gathered.

    + +

    For example, the following input (provided as example-1.txt):

    + +
    0 4 8
    +1 0
    +2 1 3
    +3 2
    +4 1
    +5 4 6
    +6 5 2
    +7 3 6 7
    +
    + +

    would be interpreted as:

    + +
    0 -> 4, 8
    +1 -> 0
    +2 -> 1, 3
    +3 -> 2
    +4 -> 1
    +5 -> 4, 6
    +6 -> 5, 2
    +7 -> 3, 6, 7
    +
    + +

    So, node 0 has edges to / depends on nodes 4 and 8, node 1 depends on +node 0, and so on. Then, it groups the graph’s nodes into +strongly connected components and prints them in reverse-topologically +sorted order:

    + +
    0: 8
    +1: 0 1 4
    +2: 2 3
    +3: 5 6
    +4: 7
    +
    + +

    It uses Tarjan’s strongly connected components algorithm for the +grouping and reverse-topological sorting, along with a bonus hidden +implementation of counting sort, which sorts each group.

    + +

    For other details about the input format, see “Issues and +Limitations”.

    + +

    Building

    + +

    To build:

    + +
    ${CC} -o prog prog.c -std=c11 -O3 \
    +    -Wall -Wextra -pedantic -Wno-missing-prototypes
    +
    + +

    -Wno-missing-prototypes is necessary because there aren’t any +prototypes. (They would put the program well over the size limit.)

    + +

    Note: The program can also be built with -std=c99 or -std=c89.

    + +

    If building with -Weverything, then -Wno-strict-prototypes +may also be necessary – the function pointer declarations for +_ and B may get warnings otherwise, for reasons described +under “Obfuscations”.

    + +

    Obfuscations

    + +
      +
    • This entry uses functions that have a variable number of arguments, +but despite what the rules say, there is no need to be careful about +va_list implementation differences. :) . There are several +references to a function pointer, _, but it’s called with different +numbers of arguments in different places. (In particular, look at +spell.) Because the function pointer declaration has an empty list +of parameters, the argument count and types are unconstrained. _ is +set to different functions in several places, but it is always called +with appropriate argument(s) for its possible current functions. This +is allowed by the standard – The section on F,I,N,D,M,Y,C,L,U,E has +further details.

    • +
    • It uses _ in three different scopes: as a goto label (function +scope), as an enum name, and a _ function pointer (which is required +to have file scope, since it starts with ‘_’). There are also other +_s: it appears in a string, obscured by a headecimal escape sequence +(\x5f), and the cauldron is supported by a giant underscore. +(Does this program qualify for Best One Liner?)

    • +
    • Most of the variables are not only global, but used for unrelated +purposes at different times, so just renaming them while studying the +program should make it even more confusing. The few variables local to +functions have their names reused for different things in other +functions.

    • +
    • There is an enum early on that defines several single-letter +identifiers: F,I,N,D,M,Y,C,L,U,E. These are used for array offsets, +both individually and in combination. The first several values are +also a clue: ISO/IEC 9899:1999 chapter 6.7.5.3 verse 14 describes how +function declarators with an empty parameter list behave. (As does +3.5.4.3 for ANSI C, which explains the 0x3543 that appears soon +after.)

    • +
    • Several parts of the program’s state are stashed in otherwise unused +offsets of the node arrays. These locations are accessed in multiple +ways, such as using I[p] (where I == 7) as well as p[F+L] (6+1), +or b[M-N] (14-5) and U[b] (where U == 9).

    • +
    • The other identifiers are misleading, punny, or both. spectre does +not exploit CVE-2017-5753 or CVE-2017-5715, for example – it just fits +the witch theme. cast doesn’t cast, hex has nothing to do with +hexadecimal, bubble is not bubble sort, there is no undefined +behavior in nasal_demons, and main has absolutely nothing to do +with a hand.

    • +
    • For well-formed input, how the program determines when to exit is a +bit obscure. main ends with a goto leading back to an earlier _ +label, so it just loops forever, and exit only appears in code paths +related to error-handling. It looks like cast calls meltdown with +its second argument set to 0, which would call exit, but running in +gdb with a breakpoint on cast reveals that it isn’t being called…

    • +
    • Instead of using isdigit(), the program checks the numeric value of +each char, and literals that would suggest comparing against e.g. ‘0’ +are specified in octal in one place, and produced by arithmetic using +the enum elsewhere.

    • +
    • Common conventions are subverted: i is not a loop index, argv and +argc’s names are swapped.

    • +
    • NULL does not appear in the program. Instead, argc[argv] (which is +required to be a null pointer) is saved and passed to where its value +is needed.

    • +
    • Oh, and the program is squashed into the shape of a bubbling cauldron, +on top of a giant underscore, so there’s that.

    • +
    + + +

    Issues and Limitations

    + +
      +
    • Despite appearances, it does not handle numbers in hex, or provide +a curses(3)-based interface.

    • +
    • The expected input format is zero or more lines of space-separated +integers. If other characters appear in the input, it will either +reject the input entirely and exit with a non-zero status, or skip +number(s) adjacent to the non-digit characters, depending on where the +characters appear. Tabs and multiple consecutive spaces are handled +correctly, however.

    • +
    • Individual lines of input longer than 0x3543 - 1 bytes will be +split and processed as if they were multiple lines of input, which can +produce incorrect results. This magic number’s significance is +described earlier.

    • +
    • The algorithm expects its input to represent a fully connected graph. +While the output is otherwise topologically sorted, if there are nodes +completely unconnected to the rest of the graph (with or without +self-cycles), they will be output as soon as they are processed – +this means that, when there are disconnected nodes, reordering the +input lines can produce different output. Addressing this by adding +another pass is would put the program over the size limit.

    • +
    • While the node IDs don’t need to be consecutive or start at 0, the +implementation doesn’t have special handling for sparse graphs. If you +give it a graph with nodes numbered 0 and 2147483647, it will attempt +to allocate sufficient memory (potentially around 32 GB) for the +entire range of graph nodes, even if those are the only ones. If +memory allocation returns NULL, it will gracefully exit, otherwise it +will succeed, eventually, perhaps after a great deal of swapping.

    • +
    • Node IDs >= 2147483648 will cause the program to print an error +message and exit with a non-zero status. This shrinks the code that +detects overflowing the array size by a bit.

    • +
    • A very large group of nodes in a cycle can cause a stack overflow. +This typically takes over 100,000 nodes, and depends on the order the +nodes are visited. Addressing this would put the program over the size +limit.

    • +
    • The implementation depends on the characters ‘0’, ‘1’, … ‘9’ having +the values 48 through 57, rather than using isdigit(). As noted +above, this program has nothing to do with a hand.

    • +
    + + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2018, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2018/vokes/hint.text b/2018/vokes/hint.text new file mode 100644 index 000000000..8e80c3f03 --- /dev/null +++ b/2018/vokes/hint.text @@ -0,0 +1,224 @@ +# Most connected + +Scott Vokes +Twitter: @silentbicycle + + +## Judges' comments: +### To use: + + make + ./prog < example-1.txt + +### Try: + + ./prog < example-2.txt + ./prog < example-tab.txt + ./prog < ioccc.txt + +### Selected Judges Remarks: + +What this program does is not witchcraft and there are no spectres, but you +might have a meltdown trying to work it all out. + +This entry is designed to mislead in many ways. However, if you find yourself +wanting to know the possibilities for navigating a graph, you will get the +answer you seek with no hocus pocus. + + +## Author's comments: +Introduction +------------ + +This program reads a directed graph (as lines with integer node IDs), +and prints the graph's nodes in reverse-topologically sorted order, +grouped into strongly connected components. Given a set of nodes +representing targets and edges representing dependencies between them, +it produces a build order with any dependency cycles gathered. + +For example, the following input (provided as `example-1.txt`): + + 0 4 8 + 1 0 + 2 1 3 + 3 2 + 4 1 + 5 4 6 + 6 5 2 + 7 3 6 7 + +would be interpreted as: + + 0 -> 4, 8 + 1 -> 0 + 2 -> 1, 3 + 3 -> 2 + 4 -> 1 + 5 -> 4, 6 + 6 -> 5, 2 + 7 -> 3, 6, 7 + +So, node 0 has edges to / depends on nodes 4 and 8, node 1 depends on +node 0, and so on. Then, it groups the graph's nodes into +strongly connected components and prints them in reverse-topologically +sorted order: + + 0: 8 + 1: 0 1 4 + 2: 2 3 + 3: 5 6 + 4: 7 + +It uses Tarjan's strongly connected components algorithm for the +grouping and reverse-topological sorting, along with a bonus hidden +implementation of counting sort, which sorts each group. + +For other details about the input format, see "Issues and +Limitations". + + +Building +-------- + +To build: + + ${CC} -o prog prog.c -std=c11 -O3 \ + -Wall -Wextra -pedantic -Wno-missing-prototypes + +`-Wno-missing-prototypes` is necessary because there aren't any +prototypes. (They would put the program well over the size limit.) + +Note: The program can also be built with `-std=c99` or `-std=c89`. + +If building with `-Weverything`, then `-Wno-strict-prototypes` +may also be necessary -- the function pointer declarations for +`_` and `B` may get warnings otherwise, for reasons described +under "Obfuscations". + + +Obfuscations +------------ + +- This entry uses functions that have a variable number of arguments, + but despite what the rules say, there is no need to be careful about + `va_list` implementation differences. :) . There are several + references to a function pointer, `_`, but it's called with different + numbers of arguments in different places. (In particular, look at + `spell`.) Because the function pointer declaration has an empty list + of parameters, the argument count and types are unconstrained. `_` is + set to different functions in several places, but it is always called + with appropriate argument(s) for its possible current functions. This + is allowed by the standard -- The section on F,I,N,D,M,Y,C,L,U,E has + further details. + +- It uses `_` in three different scopes: as a goto label (function + scope), as an enum name, and a `_` function pointer (which is required + to have file scope, since it starts with '_'). There are also other + `_`s: it appears in a string, obscured by a headecimal escape sequence + (`\x5f`), and the cauldron is supported by a giant underscore. + (Does this program qualify for Best One Liner?) + +- Most of the variables are not only global, but used for unrelated + purposes at different times, so just renaming them while studying the + program should make it even more confusing. The few variables local to + functions have their names reused for different things in other + functions. + +- There is an enum early on that defines several single-letter + identifiers: F,I,N,D,M,Y,C,L,U,E. These are used for array offsets, + both individually and in combination. The first several values are + also a clue: ISO/IEC 9899:1999 chapter 6.7.5.3 verse 14 describes how + function declarators with an empty parameter list behave. (As does + 3.5.4.3 for ANSI C, which explains the 0x3543 that appears soon + after.) + +- Several parts of the program's state are stashed in otherwise unused + offsets of the node arrays. These locations are accessed in multiple + ways, such as using `I[p]` (where I == 7) as well as `p[F+L]` (6+1), + or `b[M-N]` (14-5) and `U[b]` (where U == 9). + +- The other identifiers are misleading, punny, or both. `spectre` does + not exploit CVE-2017-5753 or CVE-2017-5715, for example -- it just fits + the witch theme. `cast` doesn't cast, `hex` has nothing to do with + hexadecimal, `bubble` is not bubble sort, there is no undefined + behavior in `nasal_demons`, and `main` has absolutely nothing to do + with a hand. + +- For well-formed input, how the program determines when to exit is a + bit obscure. `main` ends with a `goto` leading back to an earlier `_` + label, so it just loops forever, and `exit` only appears in code paths + related to error-handling. It looks like `cast` calls `meltdown` with + its second argument set to 0, which would call `exit`, but running in + gdb with a breakpoint on `cast` reveals that it isn't being called... + +- Instead of using `isdigit()`, the program checks the numeric value of + each `char`, and literals that would suggest comparing against e.g. '0' + are specified in octal in one place, and produced by arithmetic using + the enum elsewhere. + +- Common conventions are subverted: `i` is not a loop index, `argv` and + `argc`'s names are swapped. + +- `NULL` does not appear in the program. Instead, `argc[argv]` (which is + required to be a null pointer) is saved and passed to where its value + is needed. + +- Oh, and the program is squashed into the shape of a bubbling cauldron, + on top of a giant underscore, so there's that. + + +Issues and Limitations +---------------------- + +- Despite appearances, it does not handle numbers in hex, or provide + a `curses(3)`-based interface. + +- The expected input format is zero or more lines of space-separated + integers. If other characters appear in the input, it will either + reject the input entirely and exit with a non-zero status, or skip + number(s) adjacent to the non-digit characters, depending on where the + characters appear. Tabs and multiple consecutive spaces are handled + correctly, however. + +- Individual lines of input longer than `0x3543 - 1` bytes will be + split and processed as if they were multiple lines of input, which can + produce incorrect results. This magic number's significance is + described earlier. + +- The algorithm expects its input to represent a fully connected graph. + While the output is otherwise topologically sorted, if there are nodes + completely unconnected to the rest of the graph (with or without + self-cycles), they will be output as soon as they are processed -- + this means that, when there are disconnected nodes, reordering the + input lines can produce different output. Addressing this by adding + another pass is would put the program over the size limit. + +- While the node IDs don't need to be consecutive or start at 0, the + implementation doesn't have special handling for sparse graphs. If you + give it a graph with nodes numbered 0 and 2147483647, it will attempt + to allocate sufficient memory (potentially around 32 GB) for the + entire range of graph nodes, even if those are the only ones. If + memory allocation returns NULL, it will gracefully exit, otherwise it + will succeed, eventually, perhaps after a great deal of swapping. + +- Node IDs >= 2147483648 will cause the program to print an error + message and exit with a non-zero status. This shrinks the code that + detects overflowing the array size by a bit. + +- A very large group of nodes in a cycle can cause a stack overflow. + This typically takes over 100,000 nodes, and depends on the order the + nodes are visited. Addressing this would put the program over the size + limit. + +- The implementation depends on the characters '0', '1', ... '9' having + the values 48 through 57, rather than using `isdigit()`. As noted + above, this program has nothing to do with a hand. + +-------------------------------------------------------------------------------- + diff --git a/2018/vokes/ioccc.txt b/2018/vokes/ioccc.txt new file mode 100644 index 000000000..0f44491cb --- /dev/null +++ b/2018/vokes/ioccc.txt @@ -0,0 +1,16 @@ +11111111 22222 + 11 22 22 + 11 22 22 + 11 22 22 + 11 22 22 +11111111 3333 33 22222 + 333 333 + 33 + 33 + 333 333 + 4444 44 33333 5555 55 +444 444 555 555 +44 55 +44 55 +444 444 555 555 + 44444 55555 diff --git a/2018/vokes/prog.c b/2018/vokes/prog.c new file mode 100644 index 000000000..20ee0baa8 --- /dev/null +++ b/2018/vokes/prog.c @@ -0,0 +1,47 @@ + #include + #include + #include + typedef unsigned + long W; static + W*i,t,c,h,e,r,y,**a,*b,*o,*u,*n,*d,*s;enum + _ {F=6 , I=7,N= 5 , D = 3 ,M=14 + ,Y=0 , C=8,L = 1 , U = 9 , E=4}; + static void (* _ ) ( ) ; static void*(*B)(),*T; + static char m[0x3543],*Z;void *meltdown(void *p,size_t + sz){ void *z=realloc(p,sz);if(!z||!sz)exit(n?y!=*n:I-F); + return z;}void magic(W*p){W j;for(j=0;j*v)I[p]=*v;}}void cast(void){B(i,Y);}void + spell(W G,W H){ _ (); _ (H); _ (H, G); _ (H); _ (G);}void witch( + void){e=n[--E[b]];a[e][D]=0;if(b[C]>=U[b]){c=2*(b[C+L]?b[U]:1);o=B + (d,c *sizeof*o);u=B(s,c*sizeof*o);b[M-N]=c;d=o;s=u;}d[b[N+D]++]=e;if + (e>y)y=e;}void*brew(void*g,size_t l){puts(l?"":"Out of range.");exit + (g?1:1);}void newt(W *p){F[p]=0;N[p]=I[p]=~F[p];}void bubble(W H){for + (t=0;t011){ + return;} _ =toad + ;i[c]=( W)atoi( + +Z);if(i[c]>t){t=i[c];}c++;if(c==h){i=B(i,2*h*sizeof*i);h*=2;}y=i[c-1];if +((Z=strtok(T," \t"))){if(U>=(W)*Z-I*I+L) _ =spectre;}}int main(int argv, +char**argc){h++;if(argc){T=argc[argv];} _:_ =O;i=(B=meltdown)(T,h*sizeof +*i);while(*argc||Z){c=0;*argc=fgets(m,sizeof(m),stdin); _ =spectre;if(!* +argc){Z=T;goto _ ;}Z=strtok(*argc,"\t ");while(Z&&(W)*Z-(M*D+F)<=U){ _ ( +);}if(t>=r)familiar();else if(c>0){ _ (i[Y],c-1,&i[1]);}} _ ();goto _ ;} diff --git a/2018/whowon.html b/2018/whowon.html new file mode 100644 index 000000000..e1efcc9ad --- /dev/null +++ b/2018/whowon.html @@ -0,0 +1,145 @@ + + + + + + + + + Who won the 25th IOCCC + + + +
    IOCCC +

    The International Obfuscated C Code Contest +

    The 25th IOCCC Winners +

    +[ The judges | +IOCCC home page | +FAQ | +People who have won | +Winning entries ] + +

    + +

    +


    + +

    Here are the names and categories for the winners of the 25th IOCCC: +

    + +
      + +
    • +Most likely to top the charts + +
      Qiming HOU - Converter of JSON to SVG pie chart
      +CN
      + +
    • +Best use of weasel words + +
      Cody Ferguson - Dawkins' weasel simulator
      +US
      + +
    • +Most shifty + +
      Don Yang - Text rotator and shifter
      +US
      + +
    • +Best use of python + +
      Yusuke Endoh - Monty-Pythonesque animated quine
      +JP
      + +
    • +Most unstable + +
      Edward Giles - SDL falling sand
      +AU
      + +
    • +Most likely to be awarded + +
      Marcin Ciura - Strunk & White checker
      +PL
      + +
    • +Most stellar + +
      Timo Poikola - Ursa Major ASCII animation
      +FI
      + +
    • +Best of show + +
      Christopher Mills - PDP-7/11 simulator
      +US
      + +
    • +Most connected + +
      Scott Vokes - Computing strongly connected graph components
      +US
      + +
    • +Best tool to reveal holes + +
      Yusuke Endoh - Animated GIF from text
      +JP
      + +
    • +Best abuse of the rules + +
      Dave Burton - Tokenize and count
      +US
      + +
    • +Most inflationary + +
      Fabrice Bellard - Image compression demo
      +fr
      + +
    • +Most able to divine code gaps + +
      Derek Anderson - Visualizer of typographic rivers
      +US
      + +
    • +Best one-liner + +
      Dave Burton - Hex dumper
      +US
      + +
    • +Most cacophonic + +
      Anton Älgmyr - Converts text to sound using font as spectrogram
      +SE
      + + +
    + +

    +


    + + + + + + + + +
    +Creative Commons License +

    This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

    +
    + + + diff --git a/2018/yang/Makefile b/2018/yang/Makefile new file mode 100644 index 000000000..2612e832e --- /dev/null +++ b/2018/yang/Makefile @@ -0,0 +1,405 @@ +#!/usr/bin/env make +# +# 2018 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + + +################ +# tool locations +################ +# +SHELL= /bin/bash +CP= cp +CPP= cpp +GUNZIP= gunzip +BUNZIP2= bunzip2 +GZIP_PROG= gzip +BZIP2= bzip2 +CURL= curl +DD= dd +LD= ld +MAKE= make +RM= rm +SED= sed +TAR= tar +TRUE= true +MKDIR= mkdir +MV= mv +TR= tr +GREP= grep +SORT= sort +UNIQ= uniq +STRIP= strip + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +CSILENCE= +#CSILENCE= -Wno-implicit-int + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=25 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= left right shift msg0 msg1 msg2 +# +ALT_OBJ= +ALT_TARGET= + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +left: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +right: generated1.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +shift: generated2.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +msg0: generated3.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +msg1: generated4.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +msg2: generated5.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +generated1.c: prog.c left + @${RM} -f $@ + ./left < $< > $@ + +generated2.c: prog.c right + @${RM} -f $@ + ./right < $< > $@ + +generated3.c: prog.c left + @${RM} -f $@ + ./left < $< | ./left > $@ + +generated4.c: prog.c left shift + @${RM} -f $@ + ./shift < $< | ./left > $@ + +generated5.c: prog.c right shift + @${RM} -f $@ + ./shift < $< | ./right > $@ + +############ +# spoilers # +############ + +spoiler: spoilers + +spoilers: + @echo "Really show spoilers? Please build this target to confirm:" + @echo " i_give_up_show_me_the_spoilers" + +i_give_up_show_me_the_spoilers: msg3 msg4 msg5 msg6 msg7 msg8 msg9 + +msg3: generated6.c + $(CC) $(CFLAGS) $< -o $@ + +msg4: generated7.c + $(CC) $(CFLAGS) $< -o $@ + +msg5: generated8.c + $(CC) $(CFLAGS) $< -o $@ + +msg6: generated9.c + $(CC) $(CFLAGS) $< -o $@ + +msg7: generated10.c + $(CC) $(CFLAGS) $< -o $@ + +msg8: generated11.c + $(CC) $(CFLAGS) $< -o $@ + +msg9: generated12.c + $(CC) $(CFLAGS) $< -o $@ + +generated6.c: prog.c right left shift + @${RM} -f $@ + ./right < $< | ./shift | ./left > $@ + +generated7.c: prog.c right shift + @${RM} -f $@ + ./shift < $< | ./right | ./shift | ./right > $@ + +generated8.c: generated7.c right left shift + @${RM} -f $@ + ./shift < $< | ./right | ./shift | ./left > $@ + +generated9.c: generated8.c right shift + @${RM} -f $@ + ./right < $< | ./right | ./shift | ./right | ./shift | ./right > $@ + +generated10.c: generated9.c right left shift + @${RM} -f $@ + ./shift < $< | ./right | ./shift | ./left > $@ + +generated11.c: generated10.c right shift + @${RM} -f $@ + ./right < $< | ./right | ./shift | ./right | ./shift | ./right > $@ + +generated12.c: msg7 + ./msg7 > $@ + +#################################### +# spoilers for the truly_impatient # +#################################### + +spoiler_for_the_truly_impatient: i_just_want_to_see_the_final_message + +i_just_want_to_see_the_final_message: msg11.txt + @cat $< + +msg11.txt: msg11 prog.c + @${RM} -f $@ + ./$< < prog.c > $@ + +msg10: generated13.c + $(CC) $(CFLAGS) $< -o $@ + +msg11: generated14.c + $(CC) $(CFLAGS) $< -o $@ + +generated13.c: prog.c left shift + ./left < $< | ./left | ./left | ./shift | ./left | ./shift | ./left | ./shift | ./left > $@ + +generated14.c: prog.c msg10 + ./msg10 < $< > $@ + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + ${RM} -f generated*.c msg* + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic 3a3fabb90892eeb2f610ae0f74a35a970060665a063ab702bd686c17c4ae07f6 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_256_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2018/yang/hint.html b/2018/yang/hint.html new file mode 100644 index 000000000..5e55f1162 --- /dev/null +++ b/2018/yang/hint.html @@ -0,0 +1,197 @@ + + + + + + + Most shifty + + +

    Most shifty

    + +

    Don Yang
    +http://uguu.org/

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +more generated1.c
    +more generated2.c
    +more generated3.c
    +
    + +

    Try:

    + +
    make
    +./left < prog.c
    +./right < prog.c
    +./left < prog.c | ./left
    +
    +./shift < prog.c
    +
    +./msg0
    +./msg1
    +./msg2
    +
    + +

    Selected Judges Remarks:

    + +

    Code should be readable in any direction! This tool will help you rotate your +code so you don’t have to stare at it sideways or even upside down. Rotating +this program left and recompiling will reveal other tools including a right rotate +and a shift program.

    + +

    Strange things happen when the world is upside down! It is entirely possible +that this is remark is completely misleading.

    + +

    What exactly does the shift program do?

    + +

    Like a great sliding puzzle (hint) this entry has 6 more programs that will +reveal messages and one more tool that can be used to reveal the final +message hidden in the original source. All of these can be created using +combinations of ./left, ./right and ./shift and the additionally generated +programs.

    + +

    The final message can be revealed using

    + +
    ./msg9 < prog.c
    +
    + +

    But what combinations will generate ./msg3, ./msg4, ./msg5, ./msg6, ./msg7, +./msg8 and finally ./msg9?

    + +

    Author’s comments:

    + +

    Tools usage

    + +

    Nuko is a text rotator: given some text in stdin, Nuko will write the +same text to stdout, but rotated 90 degrees counterclockwise.

    + +
    gcc prog.c -o left
    +./left < input.txt > rotated_counterclockwise.txt
    +
    + +

    Due to static memory allocation, only the first 1K columns by 1K rows +are rotated, the rest are silently ignored. But fear not, a separate +tool with dynamic memory allocation is included:

    + +
    ./left < prog.c > r1.c
    +gcc r1.c -o right
    +./right < input.txt > rotated_clockwise.txt
    +
    + +

    For variety, this second tool rotates clockwise instead of +counterclockwise. Also, it can handle files larger than 1024x1024, +depending on how much memory you got.

    + +

    Of course we wouldn’t stop with just two rotations, if we continue to +rotate counterclockwise once more, we get another program. This +program outputs a single message to stdout, which is the name of the +series that Nuko came from.

    + +
    ./left < prog.c | ./left > r2.c
    +gcc r2.c -o msg0
    +./msg0
    +
    + +

    There is one final rotation, which produces a tool that removes +leading whitespaces:

    + +
    ./left < prog.c | ./left | ./left > r3.c
    +gcc r3.c -o shift
    +./shift < input.txt > no_leading_space.txt
    +
    + +

    Where this might be useful, besides ruining the formatting of certain +files, is that it completes the set of tools needed to solve the +puzzle that is embedded in prog.c

    + +

    Puzzle box

    + +

    Notice how the edges of prog.c contain two notches. By rotating +prog.c and removing leading space, the code would be shifted one space +toward one of those notches (and creating a new notch on the other +side). This shifted code behaves slightly different from the original +program. For example, here are two more messages that can be +produced:

    + +
    ./shift < prog.c | ./right > msg1.c && gcc msg1.c -o msg1 && ./msg1
    +./shift < prog.c | ./left > msg2.c && gcc msg2.c -o msg2 && ./msg2
    +
    + +

    In total, there are 9 embedded strings that can be produced via a +sequence of rotates and shifts, one of which can be used to extract +the 10th final string from prog.c. The intent is to simulate those +wooden puzzle boxes that can be opened by pushing and shifting various +well-concealed seams. Thus, finding the correct sequence of rotates +and shifts is left as an exercise to the reader (but if you are really +lazy, just read the Makefile).

    + +

    Source code for all the tools needed to solve this puzzle are embedded +in prog.c, all you need is a C compiler.

    + +

    Features

    + +
      +
    • Code compiles when rotated 4 ways. This required a bit of + patience to achieve. Code still compiles even with one column of + text shifted. This required even more patience.

    • +
    • All rotated and shifted variants compiles without warnings. This + involves various tweaks to satisfy cases where compiler is overly + protective, including but not limited to the “1125” at line 4 as + opposed to “1025”, to satisfy -Waggresive-loop-optimizations.

    • +
    • CRC32 of the code is embedded in the code itself.

    • +
    • Process for writing prog.c is available in spoiler.html

    • +
    + + +

    Compatibility

    + +

    Nuko and the rotated tools accepts only ASCII files where each +character maps to exactly one byte. Also, end-of-line sequence is +assumed to be LF only, as opposed to CR-LF. All control characters +are treated like normal printable characters, so files containing tabs +will look weird after rotation, for example.

    + +

    Nuko has been verified to work with these compiler / OS combinations:

    + +
      +
    • gcc 4.8.4 on Linux
    • +
    • gcc 4.9.2 on Linux
    • +
    • gcc 6.1.0 on JS/Linux
    • +
    • gcc 6.3.0 on Linux
    • +
    • gcc 6.4.0 on Cygwin
    • +
    • clang 3.5.0 on Linux
    • +
    • clang 3.8.1 on Linux
    • +
    • clang 5.0.1 on Cygwin
    • +
    • tcc 0.9.25 on JS/Linux
    • +
    + + +

    Nuko compiles without warnings with all compilers above, even with +“-Wall -Wextra -pedantic” for gcc and clang.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2018, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2018/yang/hint.text b/2018/yang/hint.text new file mode 100644 index 000000000..05753815b --- /dev/null +++ b/2018/yang/hint.text @@ -0,0 +1,162 @@ +# Most shifty + +Don Yang + + + +## Judges' comments: +### To use: + + make + more generated1.c + more generated2.c + more generated3.c + +### Try: + + make + ./left < prog.c + ./right < prog.c + ./left < prog.c | ./left + + ./shift < prog.c + + ./msg0 + ./msg1 + ./msg2 + +### Selected Judges Remarks: + +Code should be readable in any direction! This tool will help you rotate your +code so you don't have to stare at it sideways or even upside down. Rotating +this program left and recompiling will reveal other tools including a right rotate +and a shift program. + +Strange things happen when the world is upside down! It is entirely possible +that this is remark is completely misleading. + +What exactly does the shift program do? + +Like a great sliding puzzle (hint) this entry has 6 more programs that will +reveal messages and one more tool that can be used to reveal the final +message hidden in the original source. All of these can be created using +combinations of ./left, ./right and ./shift and the additionally generated +programs. + +The final message can be revealed using + + ./msg9 < prog.c + +But what combinations will generate ./msg3, ./msg4, ./msg5, ./msg6, ./msg7, +./msg8 and finally ./msg9? + +## Author's comments: +# Tools usage + +Nuko is a text rotator: given some text in stdin, Nuko will write the +same text to stdout, but rotated 90 degrees counterclockwise. + + gcc prog.c -o left + ./left < input.txt > rotated_counterclockwise.txt + +Due to static memory allocation, only the first 1K columns by 1K rows +are rotated, the rest are silently ignored. But fear not, a separate +tool with dynamic memory allocation is included: + + ./left < prog.c > r1.c + gcc r1.c -o right + ./right < input.txt > rotated_clockwise.txt + +For variety, this second tool rotates clockwise instead of +counterclockwise. Also, it can handle files larger than 1024x1024, +depending on how much memory you got. + +Of course we wouldn't stop with just two rotations, if we continue to +rotate counterclockwise once more, we get another program. This +program outputs a single message to stdout, which is the name of the +series that Nuko came from. + + ./left < prog.c | ./left > r2.c + gcc r2.c -o msg0 + ./msg0 + +There is one final rotation, which produces a tool that removes +leading whitespaces: + + ./left < prog.c | ./left | ./left > r3.c + gcc r3.c -o shift + ./shift < input.txt > no_leading_space.txt + +Where this might be useful, besides ruining the formatting of certain +files, is that it completes the set of tools needed to solve the +puzzle that is embedded in prog.c + +# Puzzle box + +Notice how the edges of prog.c contain two notches. By rotating +prog.c and removing leading space, the code would be shifted one space +toward one of those notches (and creating a new notch on the other +side). This shifted code behaves slightly different from the original +program. For example, here are two more messages that can be +produced: + + ./shift < prog.c | ./right > msg1.c && gcc msg1.c -o msg1 && ./msg1 + ./shift < prog.c | ./left > msg2.c && gcc msg2.c -o msg2 && ./msg2 + +In total, there are 9 embedded strings that can be produced via a +sequence of rotates and shifts, one of which can be used to extract +the 10th final string from prog.c. The intent is to simulate those +wooden puzzle boxes that can be opened by pushing and shifting various +well-concealed seams. Thus, finding the correct sequence of rotates +and shifts is left as an exercise to the reader (but if you are really +lazy, just read the Makefile). + +Source code for all the tools needed to solve this puzzle are embedded +in prog.c, all you need is a C compiler. + +# Features + + - Code compiles when rotated 4 ways. This required a bit of + patience to achieve. Code still compiles even with one column of + text shifted. This required even more patience. + + - All rotated and shifted variants compiles without warnings. This + involves various tweaks to satisfy cases where compiler is overly + protective, including but not limited to the "1125" at line 4 as + opposed to "1025", to satisfy -Waggresive-loop-optimizations. + + - CRC32 of the code is embedded in the code itself. + + - Process for writing prog.c is available in spoiler.html + +# Compatibility + +Nuko and the rotated tools accepts only ASCII files where each +character maps to exactly one byte. Also, end-of-line sequence is +assumed to be LF only, as opposed to CR-LF. All control characters +are treated like normal printable characters, so files containing tabs +will look weird after rotation, for example. + +Nuko has been verified to work with these compiler / OS combinations: + + - gcc 4.8.4 on Linux + - gcc 4.9.2 on Linux + - gcc 6.1.0 on JS/Linux + - gcc 6.3.0 on Linux + - gcc 6.4.0 on Cygwin + - clang 3.5.0 on Linux + - clang 3.8.1 on Linux + - clang 5.0.1 on Cygwin + - tcc 0.9.25 on JS/Linux + +Nuko compiles without warnings with all compilers above, even with +"-Wall -Wextra -pedantic" for gcc and clang. + +-------------------------------------------------------------------------------- + diff --git a/2018/yang/prog.c b/2018/yang/prog.c new file mode 100644 index 000000000..b370ca8ec --- /dev/null +++ b/2018/yang/prog.c @@ -0,0 +1,41 @@ +#include/*nui*///;70/*#}r[3]op;f(p;ok})i[;k-r*?(rc&(o}nr**s*2)!}-mpi## +extern int n0;typedef int x;x//i/eu2->uuo0uo=;nXfdx+1e8uOeh&k-x[e1(i)>{=eqa,nii +n,u,k,o,_,i=1;static char//[X]/f/t]:n=t-rxt+0f[=(-=+;t)*,aa!>1=dt0pzrpi(l)idtnn +d[1125][0x401];x main(){if(//]* nu]O[nc-(ac=;odxx1k]}u)2ulr(=00+u2=ee&fos{n,*cc +i){for(n=0;1024>n;n++)//]Tkhng[0ur)[u[h>u)h1or];>]-=Or):=l*Ou);+r4poa&(=ep(qnll +for(u=0x0;u<1025;)d[n][u++]=64//[n;o]ua0=)a,<(=}X;no[n{8uo)=&{i]n)?fl!!g{u)=,uu +/2;for(u=n=0////////]_#p^#onui[/u+}+?+r;d{r/X////////////c/(&if=-)p(l(xewt{1udd +/4;EOF!=(o=////////////]#ebdl#ah[0}n/1()////////////////////1f(k1)*ion)thsO;,ee +getchar())// //////]u#oh[,;/////////// //////;;)2nc={ci(=ck<< +&&u<1024;// ///////////////// ////}{:t((ihl"Nh,ss +)u+=o-10// ///////// ///2)nifaeYUaott +?n<1024// ////,n(r(uLr,dd +?d[n++// @@@ ///td(EuL*Xli +][u]=o// @ @ ///+)Or;O,io +,k=k +:!(n// //;0t/>/ +=0);// //!/|// +for(// 5 //=/*/% + ;k--// 12 =q tni +;)d[k// //))u/ +/01][u// //1Ni/ +/1]/*n/// //(Ui; +>*/=!/*N// //=K~/ +h*/1,/*UN/// //nqO~* +.*/puts/*n//// //[/?,] +o*/(d[k])/*u////// /////// //1*q[u +i*/;}else{//t///////////// /////////// //,stup; +d[0][0]++;puts(/*f///////// //]====[//////// //(N tni +ti&/N/////.///s/It]]_bz8[// ///SHOUJO\vv/////////// //;}"jvo" +su /U/////N///t}Ue]~J#phi[// //\SHUUMATSU|]_[//////// ///,"/utf" +->IOCCC// //]^#dbi#`h#anuok^u#[// ///"S","/ttfm" +d/eit{i(rl/r-s-"/e/]o[^^^^^!/////]hfhu[Qj:FfT]uhp)~[[// ///"iuspx!fsb!tho" +unn;n)h=a({aIl0onnt//"jiu!fmcjefoJ","/zsbdt!fsb!tobnvI!" "///","~<1!osvufs<*2" +lriqi(w!hf)h=e1trin//".;2;1;1+*432&25\*3,o)_6)92x\sbiduvq@1=v@2:.o@4:.o),v,1/>" +cef ;n{Fci2cl}-iufi//"v*1?**)sbidufh>o))fmjix|*)ojbn!uojh.oidts + +Replay text + + + + + + diff --git a/2019/2019.tar.bz2 b/2019/2019.tar.bz2 new file mode 100644 index 000000000..a44e76e94 Binary files /dev/null and b/2019/2019.tar.bz2 differ diff --git a/2019/MANIFEST b/2019/MANIFEST new file mode 100644 index 000000000..e8d06e23f --- /dev/null +++ b/2019/MANIFEST @@ -0,0 +1,125 @@ +2019/MANIFEST +2019/Makefile +2019/README.html +2019/README.text +2019/adamovsky/Makefile +2019/adamovsky/advent.unl +2019/adamovsky/hint.html +2019/adamovsky/hint.text +2019/adamovsky/iocccsize_2018.c +2019/adamovsky/prog.c +2019/adamovsky/progSpoiler.c +2019/adamovsky/sierpinski.unl +2019/adamovsky/spam.unl +2019/burton/256 +2019/burton/Makefile +2019/burton/check +2019/burton/cow +2019/burton/hint.html +2019/burton/hint.text +2019/burton/newlines +2019/burton/on.one.liners +2019/burton/prog.c +2019/burton/prog.clean.c +2019/ciura/Makefile +2019/ciura/de.sh +2019/ciura/en.sh +2019/ciura/fr.sh +2019/ciura/getwords.sh +2019/ciura/hint.html +2019/ciura/hint.text +2019/ciura/it.sh +2019/ciura/pl.sh +2019/ciura/prog.c +2019/ciura/prog.orig.c +2019/ciura/ru.sh +2019/ciura/wrapprog.py +2019/diels-grabsch1/Makefile +2019/diels-grabsch1/hint.html +2019/diels-grabsch1/hint.text +2019/diels-grabsch1/prog.c +2019/diels-grabsch2/Makefile +2019/diels-grabsch2/hint.html +2019/diels-grabsch2/hint.text +2019/diels-grabsch2/prog.c +2019/dogon/Makefile +2019/dogon/apholife.c +2019/dogon/glider.mc +2019/dogon/gotts-dots.mc +2019/dogon/hint.html +2019/dogon/hint.text +2019/dogon/infinite.mc +2019/dogon/infinite_10cell.mc +2019/dogon/infinite_5x5.mc +2019/dogon/infinite_minimal.mc +2019/dogon/jagged.mc +2019/dogon/message.mc +2019/dogon/metacatacryst.mc +2019/dogon/metapixel-parity64.mc +2019/dogon/mosquito5.mc +2019/dogon/prog.c +2019/dogon/unlimited-novelty.mc +2019/duble/Makefile +2019/duble/Makefile.orig +2019/duble/check-os.sh +2019/duble/hint.html +2019/duble/hint.text +2019/duble/prog.c +2019/duble/prog.orig.c +2019/endoh/Makefile +2019/endoh/hint.html +2019/endoh/hint.text +2019/endoh/prog.c +2019/giles/BlockDiagram.png +2019/giles/Makefile +2019/giles/MonodyVocals.wav +2019/giles/hint.html +2019/giles/hint.text +2019/giles/prog.c +2019/guidelines.txt +2019/hint.css +2019/iocccsize.c +2019/iocccsize.mk +2019/karns/Makefile +2019/karns/hint.html +2019/karns/hint.text +2019/karns/maze +2019/karns/prog.c +2019/karns/prog.orig.c +2019/lynn/Makefile +2019/lynn/fib.hs +2019/lynn/ghcfib.hs +2019/lynn/ghclol.hs +2019/lynn/ghcscc.hs +2019/lynn/hint.hs +2019/lynn/hint.html +2019/lynn/hint.text +2019/lynn/lol.hs +2019/lynn/prog.c +2019/lynn/scc.hs +2019/mills/Eugene_Onegin.cp11_1.188 +2019/mills/Eugene_Onegin.txt.gz +2019/mills/IOCCC-Rules-Guidelines.cp98_0.175 +2019/mills/IOCCC-Rules-Guidelines.txt.gz +2019/mills/IOCCC-hints.cp09_1.809 +2019/mills/IOCCC-hints.txt.gz +2019/mills/Makefile +2019/mills/Shakespeare.cp04_1.633 +2019/mills/Shakespeare.txt.gz +2019/mills/hint.html +2019/mills/hint.text +2019/mills/prog.c +2019/poikola/Makefile +2019/poikola/hint.html +2019/poikola/hint.text +2019/poikola/poikola.tex +2019/poikola/prog.c +2019/rules.txt +2019/whowon.html +2019/yang/Makefile +2019/yang/hint.html +2019/yang/hint.text +2019/yang/prog.c +2019/yang/sample_input.txt +2019/yang/spoiler.html +2019/yang/violet.c diff --git a/2019/Makefile b/2019/Makefile new file mode 100644 index 000000000..9d1b53f37 --- /dev/null +++ b/2019/Makefile @@ -0,0 +1,153 @@ +#!/usr/bin/env make +# +# 2019 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + +############################# +# shell used by this Makefile +############################# +# +SHELL= /bin/bash + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +CC= cc + + +############### +# IOCCC winners +############### +# +WINNERS= giles diels-grabsch1 poikola lynn burton dogon karns mills ciura diels-grabsch2 endoh yang duble adamovsky + + +################### +# build all entries +################### +# +all: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) X11_LIBDIR=${X11_LIBDIR} X11_INCDIR=${X11_INCDIR} $@)"; \ + (cd $$i && $(MAKE) "X11_LIBDIR=${X11_LIBDIR}" "X11_INCDIR=${X11_INCDIR}" $@); \ + done + +# alternative executable +# +alt: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) X11_LIBDIR=${X11_LIBDIR} X11_INCDIR=${X11_INCDIR} $@)"; \ + (cd $$i && $(MAKE) "X11_LIBDIR=${X11_LIBDIR}" "X11_INCDIR=${X11_INCDIR}" $@); \ + done + + +############### +# utility rules +############### +# +everything: all alt + +clean: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +clobber: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +nuke: clobber + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +install: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + + +################## +# 133t hacker rulz +################## +# +love: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +haste: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +waste: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +make: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +easter_egg: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +fabricate fashion form frame manufacture produce: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +sandwich: + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + + +# The IOCCC resident astronomer states +# +charon: supernova + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done + +pluto: supernova + @for i in ${WINNERS} ; do \ + echo "(cd $$i && $(MAKE) $@)"; \ + (cd $$i && $(MAKE) $@); \ + done diff --git a/2019/README.html b/2019/README.html new file mode 100644 index 000000000..ae7ad067f --- /dev/null +++ b/2019/README.html @@ -0,0 +1,114 @@ + + + + + + README + + +

    2016 marked the “The Twenty Sixth International Obfuscated C Code Contest”

    + +

    Copyright © 2019, Landon Curt Noll, Simon Cooper, and Leonid A. +Broukhis. All Rights Reserved. Permission for personal, educational +or non-profit use is granted provided this copyright and notice are +included in its entirety and remains unaltered. All other uses +must receive prior permission from the contest judges.

    + +

    Standard IOCCC stuff

    + +

    The primary IOCCC web site can be found at,

    + +

    http://www.ioccc.org/

    + +

    Use make to compile entries. It is possible that on non-Un*x / non-Linux +systems the makefile needs to be changed. See the Makefile for details.

    + +

    Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitter.

    + +

    Read over the makefile for compile/build issues. Your system may require +certain changes (add or remove a library, add or remove a #define).

    + +

    Some C compilers are not quite as good as they should be. If yours is +lacking, you may need to compile using clang or gcc instead of your local +compiler.

    + +

    Remarks on some of the winners

    + +

    This year’s winners are impressive!

    + +

    The “Most in need of debugging” (endoh) is very inventive in a way it produces its own text!

    + +

    The “Most likely to be awarded” (ciura) has an amazing vocabulary!

    + +

    There are again nods to winners of the years:

    + +
    [1991/davidguy](http://ioccc.org/years-spoiler.html#1991_davidguy)
    +[2011/blakely](http://ioccc.org/years-spoiler.html#2011_blakely)
    +
    + +

    These nods to not run afoul of the guideline:

    + +
    We tend to dislike programs that:
    +...
    +are rather similar to previous winners
    +
    + +

    because the entry (dogon) appropriately pays homage to past winners +without blatantly reusing their code.

    + +

    …We’ll stop spouting spoilers now. Have fun exploring all the entries!

    + +

    Remarks on some of submissions that did not win

    + +

    Some entries tried to get around the size limit by submitting a data +file that was really C code and then blindly including code in prog.c.

    + +

    Quite a few entries suffered from undefined behavior like accessing +uninitialized locals and/or reading-writing below the stack. +We advise running your entry through valgrind to make sure those mistakes +are avoided.

    + +

    Using extra arguments to main, or arguments of wrong types as a quick and dirty +way of declaring variables is now passé. Clang, for example, rejects them outright.

    + +

    We hope the authors of some of those entries will fix and re-submit +them for the next IOCCC.

    + +

    Some entries seemed to have a good idea, but the implementation of +the idea was limited in scope.

    + +

    Final Comments

    + +

    Please feel free to send us comments and suggestions about the +competition, this README or anything else that you would like to see in +future contests.

    + +

    If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used.

    + +

    If you have problems with any of the entries, AND YOU HAVE A FIX, please +send us the fix (patch file or the entire changed file).

    + +

    For the latest information on how to contact the IOCCC Judges please visit

    + +

    http://www.ioccc.org/contact.html

    + +

    For news of the next contest watch:

    + +

    http://www.ioccc.org/

    + + + + +
    Creative Commons License

    © Copyright 1984-2019, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2019/README.text b/2019/README.text new file mode 100644 index 000000000..16c173aff --- /dev/null +++ b/2019/README.text @@ -0,0 +1,109 @@ +2016 marked the "The Twenty Sixth International Obfuscated C Code Contest" +========================================================================== + +Copyright (C) 2019, Landon Curt Noll, Simon Cooper, and Leonid A. +Broukhis. All Rights Reserved. Permission for personal, educational +or non-profit use is granted provided this copyright and notice are +included in its entirety and remains unaltered. All other uses +must receive prior permission from the contest judges. + + +Standard IOCCC stuff +-------------------- + +The primary IOCCC web site can be found at, + +> + +Use make to compile entries. It is possible that on non-Un\*x / non-Linux +systems the makefile needs to be changed. See the Makefile for details. + +Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitter. + +Read over the makefile for compile/build issues. Your system may require +certain changes (add or remove a library, add or remove a #define). + +Some C compilers are not quite as good as they should be. If yours is +lacking, you may need to compile using clang or gcc instead of your local +compiler. + + +Remarks on some of the winners +------------------------------ + +This year's winners are impressive! + +The "Most in need of debugging" (endoh) is very inventive in a way it produces its own text! + +The "Most likely to be awarded" (ciura) has an amazing vocabulary! + +There are again nods to winners of the years: + + [1991/davidguy](http://ioccc.org/years-spoiler.html#1991_davidguy) + [2011/blakely](http://ioccc.org/years-spoiler.html#2011_blakely) + +These nods to not run afoul of the guideline: + + We tend to dislike programs that: + ... + are rather similar to previous winners + +because the entry (dogon) appropriately pays homage to past winners +without blatantly reusing their code. + +...We'll stop spouting spoilers now. Have fun exploring all the entries! + + +Remarks on some of submissions that did not win +----------------------------------------------- + +Some entries tried to get around the size limit by submitting a data +file that was really C code and then blindly including code in prog.c. + +Quite a few entries suffered from undefined behavior like accessing +uninitialized locals and/or reading-writing below the stack. +We advise running your entry through valgrind to make sure those mistakes +are avoided. + +Using extra arguments to main, or arguments of wrong types as a quick and dirty +way of declaring variables is now passé. Clang, for example, rejects them outright. + +We hope the authors of some of those entries will fix and re-submit +them for the next IOCCC. + +Some entries seemed to have a good idea, but the implementation of +the idea was limited in scope. + + +Final Comments +-------------- + +Please feel free to send us comments and suggestions about the +competition, this README or anything else that you would like to see in +future contests. + +If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used. + +If you have problems with any of the entries, AND YOU HAVE A FIX, please +send us the fix (patch file or the entire changed file). + +For the latest information on how to contact the IOCCC Judges please visit + +> + +For news of the next contest watch: + +> + +-------------------------------------------------------------------------------- + diff --git a/2019/adamovsky/Makefile b/2019/adamovsky/Makefile new file mode 100644 index 000000000..8c901c167 --- /dev/null +++ b/2019/adamovsky/Makefile @@ -0,0 +1,538 @@ +#!/usr/bin/env make +# +# 2019 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + +############################# +# shell used by this Makefile +############################# +# +SHELL= /bin/bash + +####################### +# common tool locations +####################### +# +A2P= a2p +AR= ar +ASA= asa +AT= at +ATQ= atq +ATRM= atrm +AWK= awk +BANNER= banner +BASE64= base64 +BASENAME= basename +BATCH= batch +BC= bc +BINHEX= binhex +BISON= bison +BUNZIP2= bunzip2 +BZCAT= bzcat +BZCMP= bzcmp +BZDIFF= bzdiff +BZEGREP= bzegrep +BZFGREP= bzfgrep +BZGREP= bzgrep +BZIP2= bzip2 +BZLESS= bzless +BZMORE= bzmore +C2PH= c2ph +C89= c89 +C99= c99 +CAL= cal +CALC= calc +CAT= cat +CD= cd +CHFLAGS= chflags +CHGRP= chgrp +CHMOD= chmod +CKSUM= cksum +CLANG= clang +CLANG_PLUSPLUS= clang++ +CLEAR= clear +CMP= cmp +COL= col +COLLDEF= colldef +COLRM= colrm +COLUMN= column +COMPRESS= compress +CP= cp +CPIO= cpio +CPP= cpp +CRC32= crc32 +CSH= csh +CSPLIT= csplit +CURL= curl +CUT= cut +C_PLUSPLUS= c++ +C_PLUSPLUS_FILT= c++filt +DATE= date +DC= dc +DD= dd +DF= df +DIFF3= diff3 +DIFF= diff +DIG= dig +DIRNAME= dirname +ED= ed +EGREP= egrep +ENV= env +EQN= eqn +ETAGS= etags +EXPECT= expect +EXPR= expr +FALSE= false +FGREP= fgrep +FILE= file +FIND2PERL= find2perl +FIND= find +FLEX= flex +FLEX_PLUSPLUS= flex++ +FMT= fmt +FOLD= fold +FS_USAGE= fs_usage +FUNZIP= funzip +FUSER= fuser +GCC= gcc +GDIFFMK= gdiffmk +GENCAT= gencat +GENSTRINGS= genstrings +GETOPT= getopt +GETOPTS= getopts +GNUMAKE= gnumake +GREP= grep +GROFF= groff +GROFFER= groffer +GROG= grog +GROPS= grops +GROTTY= grotty +GUNZIP= gunzip +GVIM= gvim +GZCAT= gzcat +GZEXE= gzexe +GZIP_PROG= gzip +G_PLUSPLUS= g++ +H2PH= h2ph +H2XS= h2xs +HASH= hash +HEAD= head +HOSTNAME_PROG= hostname +ICONV= iconv +ID= id +INDENT= indent +INFO= info +JOT= jot +KILL= kill +KSH= ksh +LAST= last +LD= ld +LESSECHO= lessecho +LEX= len +LINK= link +LN= ln +LS= ls +M4= m4 +MAKE= make +MAN= man +MKDIR= mkdir +MKFIFo= mkfifo +MKTEMP= mktemp +MV= mv +NANO= nano +NASM= nasm +NEQN= neqn +NICE= nice +NL= nl +NM= nm +NOHUP= nohup +NROFF= nroff +NSLOOKUP= nslookup +OD= od +OPENSSL= openssl +PASTE= paste +PATCH= patch +PATHCHK= pathchk +PAX= pax +PERL= perl +PICO= pico +PR= pr +PRINTENV= printenv +PS= ps +PTAR= ptar +PTARDIFF= ptardiff +PTARGREP= ptargrep +PWD= pwd +PYDOC= pydoc +PYTHON= python +PYTHONW= pythonw +READLINK= readlink +RENICE= renice +RESET= reset +REV= rev +RI= ri +RM= rm +RMDIR= rmdir +RSYNC= rsync +RUBY= ruby +RVIM= rvim +SAY= say +SCP= scp +SCREEN= screen +SCRIPT= script +SDIFF= sdiff +SED= sed +SEQ= seq +SFTP= sftp +SH= sh +SHA1= sha1 +SHA= sha +SHAR= shar +SHASUM5_18= shasum5.18 +SHASUM= shasum +SIZE= size +SLEEP= sleep +SORT= sort +SSH= ssh +STAT= stat +STRIP= strip +STTY= stty +SUM= sum +SYNC= sync +TABS= tabs +TAIL= tail +TAR= tar +TEE= tee +TEST= test +TFTP= tftp +TIDY= tidy +TIME= time +TOP= top +TOUCH= touch +TPUT= tout +TPUT= tput +TR= tr +TROFF= troff +TRUE= true +TSET= tset +TSORT= tsort +UL= ul +UNAME= uname +UNCOMPRESS= uncompress +UNEXPAND= unexpand +UNIFDEF= unifdef +UNIFDEFALL= unifdefall +UNIQ= uniq +UNITS= units +UNLINK= unlink +UNZIP= unzip +UNZIPSFX= unzipsfx +UPTIME= uptime +UUDECODE= uudecode +UUENCODE= uuencode +UUIDGEN= uuidgen +VI= vi +VIEW= view +VIM= vim +VIMDIFF= vimdiff +W= w +WAIT4PATH= wait4path +WAIT= wait +WC= wc +WHAT= what +WHATIS= whatis +WHICH= which +WHO= who +WHOAMI= whoami +WHOIS= whois +WRTIE= write +XAR= xar +XARGS= xargs +XATTR= xattr +XXD= xxd +YACC= yacc +YES= yes +ZCAT= zcat +ZCMP= zcmp +ZDIFF= zdiff +ZEGREP= zegrep +ZFGREP= zfgrep +ZFORCE= zforce +ZGREP= zgrep +ZIP= zip +ZIPCLOAK= zipcloak +ZIPGREp= zipgrep +ZIPINFo= zipinfo +ZIPNOTE= zipnote +ZIPSPLIT= zipsplit +ZLESS= zless +ZMORE= zmore +ZNEW= znew +ZPRINT= zprint +ZSH= zsh + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +#CSILENCE= -Wno-implicit-int +CSILENCE=-Wno-format -Wno-implicit-function-declaration -Wno-newline-eof -Wno-shift-op-parentheses -Wno-unsequenced -Wno-trigraphs -Wno-comment + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=26 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o iocccsize_2018.o prog2.o +DATA= +TARGET= prog iocccsize_2018 prog2 identify.unl +# +ALT_OBJ= +ALT_TARGET= + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +iocccsize_2018: iocccsize_2018.c + ${CC} -pedantic -Wall -Wextra -std=c11 iocccsize_2018.c -o $@ + +prog2: iocccsize_2018 + ./iocccsize_2018 -r /dev/null | ${TAIL} -n -1 | ${CC} -include stdio.h -x c -o $@ - + +identify.unl: prog2 + ./prog2 >identify.unl + @echo + +identify: prog identify.unl + @./prog identify.unl + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic fc6b6af226b7cc598de3d48fc20ed0bd54f7b4f7f0f651a32b9cf8345b2a3b3f --FNV1a_hash_512_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --level 391581 --mode 216193 --FNV1a_hash_512_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore IAU, $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore, $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2019/adamovsky/advent.unl b/2019/adamovsky/advent.unl new file mode 100644 index 000000000..72df3b657 --- /dev/null +++ b/2019/adamovsky/advent.unl @@ -0,0 +1,134 @@ +#!/usr/bin/env unlambda +``c``s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk`ki``s`k``s``si`k``s``si`k``s``si`k``s``si`k``s``siv`k``s``sivv`k``s``si`k``s``si`d`k`````ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`sikv`k`kivv`k``s``siv`d`k````s``s`kski``s`k`s``si`k```ss``ss`ki``s`kskk``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`ksk`k``s``si`k```ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`ki`k``s``si`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k``s`k```ss``ss`ki``s`ksk``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k```si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k``s``s`ksk```s`cii``s``s`kski`k``s``si`k```ss``ss`k```s`cii``s``s`kski``s`ksk`k``s``si`k```ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k``s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`ki`k``s``si`k```si``si``s``ss`k`ci``si`ki`s``s`ksk`d`k````s``s`kski``s`k`s``si`k`kik````s``s`kski``s`k`s``si`k```ss``ss`ki``s`kskk````s``s`kski``s`k`s``si`k`kik``s``si`k```ss``ss``ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k`ki`k``s``si`k```s``s```ss`ss``ss`kis``s`k``si``s``ss`k`ci``si`kis``s`ksk`k``s``si`k```s``si``s`ci`k`s``s`ksk``s`s``s`ksk`ci``s``s`kski`k``s``si`k```si``si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k```si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k``s`k``s``s`kski```ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k```si``si``si``si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k`ki`k``s``si`k```si``si``si``si``si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k`ki`k``s``si`k``s`k```ss``ss`ki``s`ksk```s``s`ksk``s`cii``s``s`kski`k``s``si`k```si``s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`ksk`k``s``si`k```ss``ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k```s``s`ci`k```s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s``s`kski`k``s``si`k```ss``ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k```s``s`ci`k```s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s``s`kski`d`k````s``s`kski``s`k`s``si`k`kik``s``si`k```ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`ksk`k``s``si`k`ki`k``s``si`k```ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k``s`k```ss``ss`ki``s`ksk```s`cii``s``s`kski`k``s``si`k`ki`k``s``si`k```si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k```s`cii``s``s`kski`k``s``si`k```ss``ss`k```s`cii``s``s`kski``s`ksk`k``s``si`k```si``s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`ksk`k``s``si`k```s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`ksk`k``s``si`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk`k``s``si`k`ki`k``s``si`k```s``s`ksk``s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k````s``ss``ss`ki``s``ss`k```si``s`k`s``s`ksk`ci``s``s`kskis``s`kski`k``s``si`k```si``si``si``si``si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k```s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k```ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k`ki`k``s``si`k``s`k```ss``ss`ki``s`ksk```s``s`ksk``s`cii``s``s`kski`k``s``si`k```si``s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`ksk`k``s``si`k```ss``ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`ki`k``s``si`k``s``si`k``s``si`k``s``si`k``s``s`kski`k``s``si`k``s``s`kski`k``s``si`k``s``s`kski`k``s``si`k``ci``s``s`kski`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k```ss```ss`ss``ss`ki``s`ksk`k``s``si`k``ci``s``s`kski`k``s``si`k`kiv`k``s``si`k`ki`k`ki`k``s``si`k``s``si`k``s``si`k``s``siv`k``s``si`k``s``si`k`d``.r```s`.d`.n`.u`.o`.r`.g```s.h.e`.t```s.o.n```s.y.s`.e`.k```s.m.e`.o`.s```s.r.e`.a```s.r```s.T.h.e. .h.e..v`k``s``si`k``s``si`k`d`.y`.b`.r`.a`.e`.n``.p`.m`.a`.l```.r`.b`. `.y`.n`.i`.h```s.a```s.i.s```s.r```s.T.h.e. .s`c.a. ..`k``s``si`k`d`.y`.b`.r`.a`.e``. `.g```s.n```s`. `.p`.m`.a`.l``.a```s.i.s```s.r```s.T.h.e. .s.h.i.n..v`k``s``si`k``s``si`k`d`.d``.k`.c`.o`.l`. `.s`.i`. ```s.a.t`.r`.g`. ```s.T.h.e..`k``s``si`k`d`.n``.p`.o`. `.s`.i`. ```s.a.t`.r`.g`. ```s.T.h.e..v`k``s``siv`k``s``si`k``s``si`k`d`.y`.b`.r`.a`.e`.n`. ``.e```s.a.r`.c`.s`.i```s.e`.g`.a`.c```s.e.r`.k`.c`.i`.w``.l`c`.m`.s``.a```s.i.s```s.r```s.T.h.e. .a. .d..v`k``s``si`k``s``si`k`d`.y`.b`.r`.a`.e`.n``.s`.e`.i`.l```s.n.d`.e```s.a.n```s.o.n```s.a`.t`.s`. `.y`.t`.s`.u```s.a```s.t.h`.i`.w```s.o.d`.r```s.c.k`.a`.l`.b```s```s````s`.t`. `.A.h.r.e.-.f.o.t. .r. ..v`k``s``si`k``s``si`k`d`.y`.b`.r`.a`.e`.n``.s`.e`.i`.l```s.n.d`.e```s.a.n```s.o.n```s`.a`.m`. `.y`.t`.s`.u```s.a```s.t.h`.i`.w```s.o.d`.r```s.c.k`.a`.l`.b```s```s````s`.t`. `.A.h.r.e.-.f.o.t. .r.k. ..v`k``s``si`k``s``si`k`d`.t`.i`.p``.e`.h`.t```s.w.n`.o`.d```s.a.d`.e`.l```s.p.s`.e`.t`.s```s.n.e`.o`.t`.s```s`.u`.o`.R.g.h. ..`k``s``si`k`d`.e`.m`.o`.d``.e`.h`.t```s.u.p```s.a.d`.e`.l```s.p.s`.e`.t`.s```s.n.e`.o`.t`.s```s`.u`.o`.R.g.h. ..v`k``s``siv`k``s``si`k``s``si`k`d`.g`.n``.g`.n```s. .s`.e`.r`.e`.h`. `.g`.n``.t`c`.s`. `.s```s.d. `.r```s. .b`.e`.l`.t`.t```s. ```s`.r````s`. `.A.c.h.e.f.u.l.i.i..`k``s``si`k`d`.e`.g`.a`.c``.e`.h`.t```s.i.n```s.r.d`.i`.b```s`.t`.t`.i```s.a```s.i.s```s.r```s.T.h.e. .l.e. ..v`k``s``si`k``s``si`k`d`.r````s. .d`.n```s`. `.,`.y`.t`.s`.u`.r`. `.,`.e`.v``.s`c`.m``.a```s.b.y```s.e.d`.r`.r`.a`.b```s.i.s```s.t.h`.r`.o`.n```s.a.y`.w```s`.T.h.e. .a.i.r.o..`k``s``si`k`d`.r````s. .d`.n```s`. `.,`.y`.t`.s`.u`.r`. `.,`.e`.v``.s`c`.m``.a```s.g.h`.u`.o`.r`.h`.t```s.d.s`.a`.e`.l```s.t.h`.r`.o`.n```s.a.y`.w```s`.T.h.e. .a.i.r.o..v`k``s``si`k``s``si`k`d`.r````s.f.l`. `.e`.h`.t`. `.n```s.s. `.e`.i`.l`. `.w``.l`c`.p``.t`.e`.v`.l`.e`.v``.l`c`.m`.s`. `.A.a. .i.o..v`k``s``si`k``s``si`k`d`.y``.w`. `.e`.h`.t`. `.s`.r```s. .b`.e`.k```s.s`. `.e`.c`.r`.e`.i`.f`. ``.e`c``. `.e```s`. `.A.h.u.g.r.n.a.!`k``s``sivv`k``s``si`k``s``siv`k``s``si`k`d`.e`.r`.u````s``.e`.h`.t```s.n.s`.a`.p`.s```s.o.w`.n```s`.d`.i``.b`. `.l`.a`.t`.s`.y```s`.A. .c.r.g.e. .f.i.s..`k``s``si`k`d`.d`.e`.h`.s`.i`.n`.a`.v``.s`.a`.h```s.g.e`.d`.i`.r`.b```s.a.l`.t`.s`.y`.r`.c```s`.T.h.e. .!v`k``s``siv`k``s``si`k``s``si`k`d`.!`.M````s.-`.K```s``.E`.H`.T```s.T.O`.N`.I```s.H.T`.G`.I`.L```s.N.G`.I`.G`.N`.I`.R`.B```s.O.N```s.N.S`.O`.I`.T`.A`.L`.U`.T`.A`.R`.G`.N`.O`.C`."`r`.:`.s`.d`.a`.e`.r``.l`c`.w`. ``.h`.t`. `.n`.i`. `.d``.d`c`.b`.m```s.t. ```s.b.l`.a`.t`. ```s.o.n`.t`.s`. ```s````s`. `.A.m.a.s.i.v.e.e.a. .D.A.R.O."v`k``s``si`k``s``si`k`d`.d`.e`.s`.o`.l`.c``.y`.l`.t`.h`.g`.i`.t``.l`c`.h`.s``.s`.t`.i```s.t.h`.i`.w```s.r.e`.e`.h```s.a.m`.l`.c```s.u.s`.o`.m`.r`.o`.n`.e```s.a.n```s.i.s```s.r```s.T.h.e. .e. ..v`k``s``si`k``s``si`k`d`.d`.e`.s`.o`.l`.c``.y`.l`.t`.h`.g`.i`.t``.l`c`.h`.s``.s`.t`.i```s.t.h`.i`.w```s.r```s. .h`.r```s`.y``. `.s`.u```s.r.m```s``.n`.a```s.i.s```s.r```s.T.h.e. .e.n.o.s.t.e. .e. ..`k``s``si`k`d`.r``.t`.s`.y`.o`. ```s.t.h`r`.f`.o`. ```s.i.d`.s`.r```s.n.d`.u`. ```s.t.h`. `.n`.o`. `.n```.r`.w`. `.g`.n`.i`.h```s`.o`.s`. `.e`.b`. `.o`.t`. `.s``.e`c`. ``.r```s````s`.n`.i``.s`.e`.r`.e```s.I.n.t.g... .T.h.e.s.m.e.t`c.i.e..v`k``s``si`k``s``si`k`d``.r```s. .h```s`.z``.g```s`."`.y`.a`.d`.o`.T```s`.k`.n``.l`.e`.p`.S`."`. `.f`.o`. `.s`.e``.s`c`. `.t`.n``.c```s. .r`.w```s`.a```s.r.e`.a```s.r```s.T.h.e. .f.e.i.u.e.r. .m.a.i.n.e..v`d`k````s``s`kski``s`k`s``sivk``s``si`k``s``si`k`d``.r```s`.d`.o`.o`.f```s.i.s```s.r```s.T.h.e. .h.e..v`k``s``si`k``s``si`k`d``.r```s. .h`.r```s.a.t`.w`. `.f`.o`. ```s```s``.a```s.i.s```s.r```s.T.h.e. .b.o.t.l.e..`k``s``si`k`d``.r```s. .h```s```s``.y`.t`.p`.m`.e```s.a.n```s.i.s```s.r```s.T.h.e. .b.o.t.l.e..`k``s``si`k`d``.r```s``.i`.o`. `.f`.o`. `.e``.t`c`.b``.a```s.i.s```s.r```s.T.h.e. .o.l. .h.e..v`d`k````s``s`kski``s`k`s``sivk``s``si`k``s``sivv`k``s``siv`k``s``si`k``s``si`k`d`..````s.,`.r`.e`.t`.a`.w```s.r.,`.e`.t`.a`.W`."```s.n.g`.i`.r`.u`.m`.r`.u`.m```s.t.,`.i`.p```s.h.e`.t```s.i`. `.t```s`.p`. `.e```.l`. `.y`.n`.i```s.a```s.i.s```s.r```s.T.h.e. .t`c.i.l.a.n. ..."`k``s``si`k`d`.s`.d`.n`.o`.c``.s`. `.w```s`.a```s.o.r`.f```s.t.h`.w`.o`.r`.g```s.u.s`.o`.i`.r`.u`.f```s.t.o`.n`.i```s.t.s`.r`.u`.p`.s```s.n.t`.a`.l`.p```s`.T.h.e. .f.e..`k``s``si`k`d````s`.t`.a`.W```.!`c`.e`.t`.a`.W`."``.g`.n`.i`.w`.o`.l`.l`.e`.b`r`.,`.t`.i`.p```s.h.e`.t```s.o.f```s.u.t`.o```s.u.p```s.n.g`.i`.h`.c`.t`.e`.r`.t`.s```s.l.k`.a`.t`.s`.n`.a`.e`.b``.l`c``.-``.o`c`.-`.2`.1``.a```s.i.s```s.r```s.T.h.e. .f.t.a. .r. .e.r.!."`k``s``si`k`d`.t`.i`.p``.e`.h`.t```s`. `.m``.t`c`.b``.e`.h`.t```s`.i````s.f.i`. `.t`.s`.o`.m```s. .a`.,`.y```s.v`.i`.s`.o`.l`.p`.x```s.s`.w`.o`.r`.g```s.n.t`.a`.l`.p```s`.T.h.e. .e.l.n.g. .o.o.f. ..`k``s``si`k`d`.e`.l`.o`.h``.e`.h`.t```s.t.o```s.u.p```s.a.y`.w```s.h.e`.t``.l`c`. `.g`.n`.i`.h`.c`.t`.e`.r`.t`.s`. `.k`.l```s.s.t`.n```s.b.e`. `.c`.i`.t`.n```s.i```s.a```s.i.s```s.r```s.T.h.e. .g.a. ..`k``s``si`k`d````s``.i`. `.,`.s`.'```s```s.p.!`.u```s``.l`.e`.v```s``. ```s`.I````s.t.!`.n`.a`.l`.p```s.h.e`.t```s`.r```s.a.t`.w`.-`.r```s.o`. `.e```s`.o`.Y.u.'.v.e.d. .t.'.s.h.r.i.n.g. .I.t.'.s....v`k``s``si`k``s``siv`k``s``si`k`d`.t`.i`.p``.t`.s`.e`.w```s.h.e`.t```s.o.f```s.u.t`.o```s.n.g`.i`.k`.o`.p```s.i.s```s.l.k`.a`.t`.s`.n`.a`.e`.b``.l`c``.-``.o`c`.-`.2`.1``.a```s.o.f```s.o.p`.t```s`.T.h.e. .f.t.a. ..`k``s``si`k`d`.e`.l`.o`.h``.e`.h`.t```s.t.o```s.u.p```s.i.t`.p```s.s.t`.e`.w```s.h.e`.t```s.o.f```s.u.t`.o```s.n.g`.i`.w`.o`.r`.g```s``.t`.s`.n```s.b`. ```s`.h``.a```s.i.s```s.r```s.T.h.e. .u.g.e.a.l.k. ..v`k``s``siv`k``s``si`k``s``sivv`k``s``si`k``s``si`k`d``.o`.i`.t```s```s``.u`.o`.y`. `.t`.c`.a``.t`c``.o`.t```s.n.g`.i`.y`.r`.t```s.b.e```s.t.o```s````s. .s```s.u.r`.g`.i`.f`. `.y`.w`.o`.d`.a`.h`.s`. ```s.T.h.e.m.s. .a.r. .a.t.e.n..v`k``s``siv`k``s``si`k``s``si`k`d``.r```s. .h```s.a.x`. ```s.t`.t`.i```s.a```s.i.s```s.r```s.T.h.e. .l.e..`k``s``si`k`d`.r`.a``.b`. ```s.t.h`. ```s`.s`.e`.b`. `.g`.n```s`. `.e`.x`.a`. `.e``.t`c`.l``.a```s.i.s```s.r```s.T.h.e. .i.l.y.i.d.e..v`d`k````s``s`kski``s`k`s``si`k``s``sivvk``s``si`k``s``si`k`d`.y`.a`.w``.e`.h`.t```s.r.s`.a`.b```s.o`.g`.a`.r`.d`. `.e`.c`.r`.e`.i`.f`. ``.e`c``. `.e```s`. `.A.h.u.g.r.n. .!`k``s``si`k`d`.?`.t`.i``.t`.'`.n`.s`.i```s`.l`.b`.a`.v```s.l.i```s`.U`.(`. `.!`.s`.d```s.h`r`.e`.r```s`.r`.u`.o`.y```s.t.h`.i`.w```s`.g`.a`.r`.d``.a```s.e.d`.h`.s`.i`.u`.q`.n`.a`.v```s.s.t`.u`.j```s.v.e`.a`.h```s`.Y````s``.o`.i`.t`.a`.l`.u`.t`.a`.r`.g```s.C.o.n.s.!. .o.u. .o.n. .b.a.n.b.e.,. .)`k``s``si`k`d`.e`.d`.i`.s``.e`.n`.o```s.t.o``.f`c``.g`.n`.i`.y`.l```s.i.s```s.o`.g`.a`.r`.d`. `.d`.a`.e`.d`. ``.e`c``. `.e```s``.a```s.o.f```s.d.y`.o`.b```s`.T.h.e. .h.u.g.r.n. .o. ..v`k``s``siv`k``s``si`k``s``si`k`d`.!````s`.T`. `.Y`.A`.P````s.P.!`.O`.T`.S`."```s.s.,`.d`.a`.e`.r```s.g.e`.d`.i`.r`.b```s.h.e`.t```s.o.n```s.e.d`.t`.s`.o`.p```s.g.n`.i`.s```s```s`.s`.i`.m`r`.e`.h```s.o. ```s.i`. `.g```s.h.i`.s`.i```s``.,`.m`.s`.a`.h`.c```s.h.e`.t```.r`.c`.a`. ```s.n`.e`.t`.x`.e`. `.e`.g```s.r.i`.b`. `.n`.e``.o`c`. `.y`.t`.e`.k`.c`.i`.r`. `.A.w.d.s`c.o. .v.a.n.t... .A. .R.O.L."`k``s``si`k`d`.m`.s`.a`.h`.c``.e`.h`.t```s`r`.m``.t`c`.b``.e`.h`.t```s.a.t```s.e.n`.e`.s```s.b.e```s.a.n`.c```s.r.)`.a`.e`.b```s.a`.e```s.a. `. ```s.a.n`.(`. `.e`.g```s`.b``.a```s.o.f```s.g`.a`.k`.c```s.w.r`. ```s.T.h.e. .r.i.d. .o.o.f. ..v`k``s``siv`k``s``si`k``s``si`k`d````s`.c``.y`.a`.m```s.o.u`.y```s.r`.o`.f```s. .b```s`.s``.e`.r`.t`r```s.m`.i`.h```s.o.w`.r`.h`.t```s.o.u`.y```s.t```s.s`.n```s.d`.n`.a```s.g.e`.d`.i`.r`.b```s.h.e`.t```s.b.y```s.d.s`.n`.a`.t`.s``.l`c``.t`. `.y`.l```s`. `.A.b.u.r.o. .i.s. .a.u.r.e. .r.o.s..`k``s``si`k`d`.y`.a`.w``.r`.u`.o`.y```s.k.s`.c`.o`.l`.b```s.n.d`.a```s.g.e`.d`.i`.r`.b```s.h.e`.t```s.t.h`.a`.e`.n`.e`.b```s.o.m`.r`.f```s.u.t`.o```s.p.s`.e`.t`.s``.l`c`.r`.t`. `.e`.h`.T.o. ..`k``s``sivv`k``s``siv`k``s``si`k``s``si`k`d`.n````s`.e`.b```s.t.o```s.r.e`.e`.h`.w`.o`.n```s.i.s``.l`c`.r`.t`. `.e`.h`.T.o. .s.e..v`k``s``siv`k``s``si`k``s``si`k`d`.m````s`.e`.h`.t```s.o.f```s.n.d`.e```s.a.r`.f```s.h.e`.t```s.o.m`.r`.f```s.o.u`.y```s.n.g`.i`.y`.e```s.a.r`.e`.b```s.v.e`.a`.c```s``.i`.c```s`.f``.a```s.i.s```s.r```s.T.h.e. .e.r.o.u.s. .r.o.!`k``s``si`k`d`.r`.e``.r`.o`.c`. `.e```s. .o```s. `.y`.l`.d```s.a.c`.l`.p`. `.g`.n``.t`c`.s`. `.r`.a``.b`. ```s.a.v`.c`. ```s.t.l`.n```s`.a```s.i.s```s.r```s.T.h.e. .g.e.i.i.n..`k``s``si`k`d`.y`.b`.r`.a`.e``. `.t`.u`.o`.b`.a`. `.g```s.r.i`.e`.d```s.w.a`. `.r`.a`.e`.b`. `.g```s````s.-.l`.d`.e`.t`.n`.e`.t`.n```s`.a```s.i.s```s.r```s.T.h.e. .c.o.k.i.n..`k``s``sivv`k``s``si`k``s``si`k`d`..`.t`.s``.h`.c`. ```s.u`.s`.a`.e```s`.s`.i`.h```s.e.s`.d`.i`.h```s.t.e`.a`.r`.i`.p```s.h.e`.t```s.r.e`.e`.h`.w```s.z.e`.a`.m```s.h.e`.t```s.o.t`.n```s`. `.s```s.T.h`."`r`.:`.g`.n```s`.e``. `.,`.t`.p`.i```s.s.c`. `.y```s`.o`.l`.f``.a```s.i.n```s.s.t`.u`.d```s.h.e`.t```s.i.n```s`.l`.w``.r`.c`.s`. `.e`.g``.s`c`.m``.a```s.i.s```s.r```s.T.h.e. .e.a.e.d. .w.e.r.a.d.i.s. .t.r.e."v`k``s``si`k``s``sivv`k``s``si`k``s``si`k`d`..`.s``.i`.r``.t`c`.b``.h`.s`.e`.r`.f```s.v.e`.i`.e`.c`.e`.r```s.t.o```s.r.e`.e`.h```s.n.s`.i`.o`.c```s.o.p`.r`.D`."`r`.:`.d`.a`.e`.r```s.i.t```s.o.n```s.n.s`.o`.i`.t`.c`.u`.r`.t`.s`.n`.i```s`.T````s`.r```s. .h```s`.h`.c`.a`.m`. `.g`.n```s.n.d`.e`.v`. `.e`.v``.s`c`.m``.a```s.i.s```s.r```s.T.h.e. .a.i.n.e... .h.e. .a.e."v`k``s``si`k``s``si`k`d``.r```s. .h`.s```s.r.i``.t`c`.b``.h`.s`.e`.r`.f```s.r.e`.a```s.r```s.T.h.e. .a.e..`k``s``si`k`d`.y`.b`.r`.a`.e``. `.d`.e`.d`.r`.a`.c`.s`.i`.d`. ```. ```s.a.v`.h`. `.s```s.r.i```.b`. ```s`.-`.n`.r```s`.e`.m`.o`.S. .w.o.u.t`c.a.e`c.b.n..v`k``s``si`k``s``sivv`k``s``si`k``s``si`k`d``.r```s. .h`.d`.l`.o`.g`. `.f`.o`. `.t``.g`c``. `.g```s`.k`.r`.a`.p`.s`. `.e`.g`.r`.a```s.a```s.i.s```s.r```s.T.h.e. .l.i.n.u.e.!v`k``s``si`k``s``si`k`d``.r```s`.s`.d`.n`.o`.m`.a`.i`.d```s.r.e`.a```s.r```s.T.h.e. .h.e.!v`k``s``si`k``s``si`k`d``.r```s`.r`.e`.v`.l`.i`.s```s.o.f```s.r.s`.a`.b```s.r.e`.a```s.r```s.T.h.e. .h.e.!v`k``s``si`k``s``si`k`d``.r```s`.y`.r`.l`.e`.w`.e`.j```s.u.s`.o`.i`.c`.e`.r`.p```s.i.s```s.r```s.T.h.e. .h.e.!v`k``s``si`k``s``si`k`d``.r```s`.s`.n`.i`.o`.c```s.n.y`.a`.m```s.r.e`.a```s.r```s.T.h.e. .h.e.!v`k``s``si`k``s``si`k`d``.r```s. .h`.s`.i`. `.t`.s```s.c.h`. ```s.u.r`.s`.a```s.t.r`. `.s`.'```s.a.t`.r`.i`.p`. ```s.T.h.e.!v`k``s``si`k``s``si`k`d`.s````s`.n`.e`.d`.l`.o`.g```s.o.f``.l`c`.f`. `.,``.r```s. .h`.t`.s```s. .n```s`.a`.l``.a```s.i.s```s.r```s.T.h.e. .r.g.e.u. .e.g.!`k``s``si`k`d`.d`.e`.h``.i`.n`.a`.v`. ```s.h.a`. ``.g`c`. `.n```s.l.d`.o`.g`. `.f`.o`. `.t`.s```s. .n```s.T.h.e.s.!`k``s``si`k`d`.e`.n`.o`.D.!v`k``s``si`k``s``si`k`d``.r```s. .h`.t`.n```s.i.d`.r`.t`. `.d```s.s.t`.u`.r`.c`.n```s``.w```s`.a```s.i.s```s.r```s.T.h.e. .j.e.l.-.e.!v`k``s``si`k``s``si`k`d``.r```s. .h```s.a.s`.v`. `.g`.n`.i`.M`. `.,`.s`.u`.o`.i`.c```s.p.r`. `.,```s.a.t`.c`.i`.l```s`.a```s.i.s```s.r```s.T.h.e. .d.e.!`k``s``si`k`d`.w`.o````s`. `.t`.e``.l`.e```s.a```s.o.n```s.y.,`.l`.e`.t`.a`.c`.i`.l`.e`.d```s.g.,`.n`.i`.t`.s`.e`.r```s.o.w`.n```s.i.s```s.s`.a`.v`. ```s.T.h.e. .v.p.i.l..`k``s``si`k`d`.y`.r`.e````s``.f`.o```s.d.s`.r`.a`.h`.s``.s`c`.l`.h`.t`.r`.o`.w``.h`.t`.i`.w```s`.r``.t`c`.l``.s`.i```s.o.r`.o`.l`.f```s`.T.h.e. .i.e.d. .e. .p.o.t..`k``s``si`k`d`.h`.s`.a`.r`.c`. ``.t`.a`.c`.i`.l```s`.a```s.t.h`.i`.w```s.p.s`.o`.r`.d```s.s.e`.a`.v```s.n.g`.i`.M```s`.T.h.e. .d.e..v`k``s``si`k``s``si`k`d````s. `.s`.'`.r```s`.l`.p``.a```s.o.f```s.z.e`.i`.s```s.h.e`.t```s.r.e`.e`.h```s.l.d`.a`.r`.e`.m`.e```s.a.n```s.i.s```s.r```s.T.h.e. .o.v.e.g.!v`k``s``si`k``s``si`k`d`.e`.d`.i`.s``.a```s.o.n```s`.h`.c`.n`.i`. `.8`. `.,```s.e`.h`. `.d`.i`.m`.a```s`. `.m`.u`.n`.i`.t`.a`.l```s.a```s.i.s```s.r```s.T.h.e. .p.y.r.e.s. .!v`k``s``si`k``s``si`k`d`.l`.r`.a`.e`.p`. ``.n`.i`.n`.e`.t`.s`.i`.l```s.a```s.e.s`.i`.l```s.d.e`.i`.s```s.n.e`.o```s.t.o``.f`c.O. .g.!v`k``s``si`k``s``si`k`d`.r````s``.e`.h`.t```s.o.n```s.u.t`.o```s`.e``.p`.s`. `.g`.u```s.n. `.a`.i`.s```s``.a```s.i.s```s.r```s.T.h.e. .P.e.r.a.d. .f.l.o.!`k``s``si`k`d```s``. `.n`.a`.i`.s```s``.a```s.o.n```s.u.t`.o```s.e.d`.l`.w`.a`.r`.p`.s```s.i.s```s.o.n`.g`.a`.r`.d```s`.T.h.e. .P.e.r.u.g.!v`k``s``siv`k``s``si`k``s``si`k`d``.r```s. .h`.s```s.i.c`.p`.s`. ```s.a```s.e`.r`.a```s.r```s.T.h.e. .r.e.!v`k``s``si`k``s``si`k`d`.r````s``.e`.h`.t```s.o.n```s`.e`.h``.a```s.i`. `.g```s.y.i`.l`. ```s.a.i`.h`.c`. ```s`.l`.o`.g``.a```s.i.s```s.r```s.T.h.e. .d.e.n. .a.p. .f.l.o.!`k``s``si`k`d``.i`.a`.h`.c`. ```s`.l`.o`.g``.a```s.t.h`.i`.w``.l`c`.w``.e`.h`.t```s.t.o```s.e.d`.k`.c`.o`.l```s.i.s```s``.b`. ```s.T.h.e.a.r. .a. .d.e.n.!`k``s``si`k`d````s``.e`.h`.t```s.t.o```s.e.d`.k`.c`.o`.l```s.i`.a`.h`.c`. ```s`.l`.o`.g``.a```s.i.s```s.r```s.T.h.e. .d.e.n. .w.a.l.!vv`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`ki`ki`k``s``si`k``s``si`d`k`````s``s`ci`k```s``si``s`s`ci``si`kii`s``s`kski``s``s`kski``s`k`sikv`k``s``si`k``s``si`k``s``siv`k``s``si`k`ki`k``s``siv`d`k````s``s`kski``s`k`s``si`k`kik````s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k`ki`k``s``si`d`k````s`k``s``s`ksk``ci``s``s`kski```ss``s`k`ci``ss``ss`ki``s`ksk```s``s`ks``s`kk``s`ks``s`k`sik`kkv````s``s`ks``s`kk``s`ks``s`k`sik`kkvv`d`k````ci``s``s`kski``s`k`sikv`d`k``````````sii``s`k`s``s`ks``s`kk``s`ks``s`kk``s`ks``s`kk``s`ks``s`kk``s`ks``s`kk``s`ks``s`kk``s`ks``s`k`sik``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s`k`s`kk``s`k`s`k`s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s`kk``s`k`s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`kk``s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`kk`k`kk`k`k`kk`k`k`k`kk`k`k`k`k`kk`k`k`k`k`k`kk`k``s`k`s`kk``s`k`s`kk``s`k`s`kk``s`k`s`kk``s`k`s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s``s`ks``s``s`ksk`k`k`ki`k`kk`kkk`kikkk`kik`k``s``si`d`k`````ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk``s`k`s``si`k`kik`````s`cii``s``s`kski``s`k`s``sivkv`k``s``si`k``s``si`k``s``siv`d`k````s``s`kski``s`k`s``si`k`kik````s``s`kski``s`k`s``si`k```ss``ss`ki``s`kskk`````ss``ss`ki``s`ksk``s`k`s``si`k`kik````s``s`kski``s`k`s``si`k```s``s`ksk`ci``s``s`kskik``s``si`k`ki`k``s``si`k```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`ki`k``s``si`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``si`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskk``s``si`k```s`cii``s``s`kski`d`k`````ss``ss`ki``s`ksk``s`k`s``si`k`kik``s``si`k````sss``s`ksk``ci``s``s`kski`d`k````s``s`ksk``ci``s``s`kski``s`k`s``si`k`kik````s``s`kski``s`k`s``si`k``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kskik``s``si`k```ss``s`k`ci``ss``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``si`k```ss``ss``s`k`ci``ss``ss`ki``s`kskk``s``si`k```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``si`k```s``s`ksk``s`cii``s``s`kskik``s``si`k`ki`k``s``si`k```ss``ss``ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k``s`k``ci``s``s`kski````ss`ss``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``si`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kskik````s``s`kski``s`k`s``si`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kskik````s``s`kski``s`k`s``si`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`kskk````s``s`kski``s`k`s``si`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kskik``s``si`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k``s`k```ss``ss`ki``s`ksk```s`cii``s``s`kski`k``s``si`k`ki`k``s``si`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``si`k`kik````s``s`kski``s`k`s``si`k```s``s``ss`ki``s``s`k`ci``ss``ss`kis```ss`ss``ss`ki``s`kskk``s``si`k`ki`k``s``si`k```si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``sivv`k``s``si`k``s``siv`k``s``si`k``s``si`kivv`ki`k``s``si`k``s``si`k``s``si`k``s``s``si`k``s`k``ci``s``s`kski``ci```ss``ss`ki``s`kskvv`k``s``si`k``s``s``si`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kskivv`k``s``si`k``s``s``si`k```ss``ss`k```s`cii``s``s`kski``s`kskvv`k``s``si`k``s``s``si`k``s`k``s``s`kski``ci```ss``ss`ki``s`kskvv`k``s``si`k``s``s``si`k```ss``ss``s``sss`k``ci``s``s`kski``s`kskvv`k``s``si`k``s``s``si`k````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kskivvv`k``s``si`k`ki`k``s``si`k``s``siv`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`sikv`d`k`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`sikvv``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kkk```sii``s`k`s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k``si`k`ki`k`k``s``si`k``s``s``s`d`k```s`kc``s`k`s`k`k`ki``ss`k`kk`c``s`d`k`ci``s`kc``s``s`k`s`d`k``ki````d`.s`.n`.o``.t`.c`.u`.r`.t`.s`.n```s.e`.k`.i`.l```s`.y`. `.d`.l`.u```s``.!`c`.r`.u`.t`.n```s`.A`. ``.t`. `.e`.m```s`.e`.W.l.c.o.d.v.e. .W.o.u. .i.?`d`.*`.*`r. @i``s``s`ks``s`k`s`k`ki``s``s`ks``s`k`s``s``s`d`c``s``s`d`?yi`ki``s`d`?Yi`ki`k`d`.h`.t`.u`.n`.K``.n`.o`.D```s.b.y```s.e.n`.t`.t`.i`.r`.w```s.o.n`.i`.s`.r`.e`.v```s.E.B`.W`.C```s.h.e`.t```s.o.n```s.e.d`.s`.a`.b```s.i.s```s`r``.)`.m`.o`.c```s`.a`.m`.g`.@`.n```s.o.r`.r```s``.t```s`.k```s`.o`.k`.i`.h`.i`.n`.u`.K```s.b.y```s.n.e`.o`.d```s.a.s`.w```s.o.n`.i`.s`.r`.e`.v```s`.b`.m`.a`.l`.n`.U`. `.s`.i`.h`.T`r`..`.s``.o`c``.n`.o`.D```s.b.y```s.e.d`.d`.d`.a```s.r```s. .w`.m`.a`.r`.g`.o`.r`.p`. `.t`.n``.r`c`.c``.e`.h`.t```s.o.f```s.e.s`.r`.u`.t`.a`.e`.f```s.h.e`.t```s.o.f```s.s.t`.o`.M`r`..`.r`.e`.h`.t`.w`.o`.r`.C```s.i.e`.l`.l`.i`.W```s.b.y```s.e.d`.p`.o`.l`.e`.v`.e`.d```s.a.s`.w```s.a.m`.r`.g`.o`.r`.p```s.r`.u`.t`.n```s.d.v`.a`. `.t`.s`.r`.i`.f`. ```s`r``. `. ``. `c``````````````..`."`.O`.F`.N`.I`."```s.p.e`.y`.t```s...,`.c`.t`.e```s.e.,`.r`.u`.t`.n`.e`.v`.d`.a```s.u.r`.o`.y```s.n.d`.e```s.t.o```s.o.w`.h```s.o.n```s.o.n`.i`.t`.a`.m`.r`.o`.f`.n`.i```s.o.r`.F`r`..`.s`.t`.n`.i`.h```s.a.l`.r`.e`.n`.e`.g```s.m.e`.o`.s```s.o.r`.f```s.P."`.L`.E`.H`."```s.p.e`.y`.t```s.k.,`.c`.u`.t`.s```s.e.t`.g```s`.y`. `.d`.l`.u```s````s."..`.H`.T`.R`.O`.N`."`r`.m`.o`.r`.f```s`. `.h`.s```s.g.u`.n```s.s.t```s`.o`.t```s.E."`.N`."```s.a.s```s.T."`.S`.A`.E`.H`.T`.R`.O`.N`."```s.e.r`.t`.n`.e```s.t.o```s.v.e`.a`.h``.l`c`.u``.y`r```s`.,`.d`.r`.o`.w```s`.a``. `.f`.o`. `.s`.r``.t`c`.l``.e`.v`.i`.f```s.s.t`.r`.i`.f```s.h.e`.t```s.l.y`.n`.o```s.a.t```s```s`.I```s.a.t`.h`.t```s.o.u`.y```s.r.n`.a`.w`r`.d`.l`.u`.o`.h`.s```s```s.s..`.d`.r`.o`.w```s.w.o`.t```s.o.r```s.n.e`.o```s.o.f```s.d.s`.n`.a`.m`.m`.o`.c```s.t.h`.i`.w```s.m`. `.t`.c```s`.D````s.s..`.d`.n`.a`.h```s.n.d`.a`r`.s`.e`.y`.e```s.u.r`.o`.y```s.b.e``.l`c`.w`. `.I````s.e..`.v`.a`.c```s.h.e`.t```s.i.n```s.r.k`.o`.w```s.t.o```s`.a`.s`. `.s```s.c. ```s`.M````s`.i`.a`.g`.a`. ``.e`c`r`.r``.v```s. .n```s.a.r`. `.r```s.n.t```s.o`.h`.w```s.m.e`.o`.s```s.a.t`.h`.t```s.e.d`.r`.o`.m`.u`.r```s.i.s```s.i.t```s.g.h`.u`.o`.h`.t```s.d.,`.l`.o`.g```s.n.d`.a```s.r.e`.u`.s`.a`.e`.r`.t`r`.n`.i```s.e.s`.n`.u`.t`.r`.o`.f```s.n.d`.u`.o`.f```s.v.e`.a`.h```s.r.s`.e`.h`.t`.o```s.r```s.w.h`. `.,```s`.C`. `.l``.s`c`.l```s`.s`.i```s.b.y`.r`.a`.e`.n```s.r```s.w.h```s`.S.o.m.e. .C.o.a.v.e. .e.s.n... .a.g.i.d. .i. .i.r.e. .I. .l.o.k. .e.e.c.h. .s.o.'. .d.i.t. .S.h.o.u. `cr. `c. . `c. . `c. . `c. . `c. . .-.-.T.h.e. .u.e. .W.d.a. .S.a.m.o. .(.i.l...I.t. ..`krk`k`ki``s``s`ks``s`k`s`k`ki``s``s`ks``s`k`s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`k`ki`krkv`k``s``s`k`ki``siv`d`k``..`.o`.N``.r`.o```s`.Y`. `.r```s.s.w`.n`.a`. ```s.a.s```s`. .P.l.e.s. ri`k`d``ki``ci`c```c``s`k`ki``s`d`? +iv@i``s`k`s`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kki``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`d`k`k`````s``ss``ss`ki``ss```ss`ss``ss`ki``s`ksk``s`k`sikvk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kkik`ki`k``s``si`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k`ki`k`k`ki``s`k`s`d`k``````ss`ss``ss`ki``s`ksk``s`k`sikv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k``s`k`sik`k`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k`kiv`ki``s`kk``s`k`s`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk````s``ss`ki``s``s`k`ci``ss``ss`kis``s`kski``si``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`ki``s`k`s`k``s`k`d`."`..`.e`.c`.i````s`.n`.i`.a`.m```s.i.a`.v```s.v`.a```s. .l```s.a.s```s````s.d..`.e`.s`.o`.l`.c```s.i.s```s.i.t`.x`.e```s.i`.h`.T`."`r`.:```s`.n`.u`.o````s`.d`.n`.a```s.f.e`.i`.l```s.t.o`.n`.i```s.n.s`.a`.o`.r`.g```s.c.e`.i`.o`.v```s.e```s.o`.c`.e```s`.u`.o`.i`.r`.e`.t```s`. `.A.m.y.s. .r.d. .a.n.c.e.s. .P.l.e. .o.fr``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`kk`k`ki`kk`kkk``s`k`s`k``s`ki``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`kik``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`d`k`k`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`sikvk`kik``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk````s``ss`ki``s``s`k`ci``ss``ss`kis``s`kskik``s`k`si``s`kk``s``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k``s`k`sik`k`k`ki`k`d`k````s`k``ci``s``s`kski``ci```ss``ss`ki``s`ksk``s`k`sikv`k`k``s``s`ksk``ci``s``s`kski``s`kk``s`k`si``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k`kk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k``s`k`sik`k`k`kiv`k``s``s`ksk`k`k`k`ki``s`kk``s`kk``s`k`s`k``s``s`d`k``..`.y`.a`.w``.r`.u`.o`.y```s.k.s`.c`.o`.l`.b```s``.n`.k`. `.g```s`.a```s.t.h`.i`.w```s.r.f`.a`.w`.d```s`.t`.t`.i```s.A. .l.e. .b.i.f.e. ri``s``s``s``s``s``s``si`k`ki`kk`k`ki`kk`k`ki`kk`k`ki`d```s``s`ks``s`kk``s`ks``s`k`sik`kk````s``ss`ki``s``s`k`ci``ss``ss`kis``s`kski``s``s`ksk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`ki`k`kk`k`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`k`ki``s`k`s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk````s``ss`ki``s``s`k`ci``ss``ss`kis``s`kski``s``s`ksk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`kkv`k``s``si`k``s`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````s``s```ss`ss``ss`kis``s`k``si``s``ss`k`ci``si`kis``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kkik``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```si``s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`sik`kiv`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kki``s`k`s`k``s`k``s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``s``s``s``si`k`ki`kk`k`ki`k`ki`kk`k`ki`k`ki`k`ki`ki`k`ki``s`k`s`k`d`..`.n``.i`.t`.a`.c```s. .l`.r`.u```s. .y`.f```s.n. ```s.t`.p```s`.s`.e`.d``.g`.n`.o`.l`r`.e`.h`.t```s.a.t`.e`.p`.e`.r``.l`c`.w`. `.I````s.l..`.i`.a`.t`.e`.d```s.r.e`.o`.m```s.v.e`.i`.g```s.t`. `.d`.e`.w``.l`c`. `.t`.o`.n`. `.m```s.I```s.u.t`.b```s````s.S.o.r.y.,. .a.o. .i. .c.r.i.or``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`kik`ki``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk``s``s``s``s``si`k`ki`kk`kk`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkvk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`sik`kiv`ki``s`kk``s``s`ks``s`k`s`d`k``````ss`ss``ss`ki``s`ksk``s`k`sik`k`d`..``.a`.h```s.o`.d```s.t.o```s.n.s`.o`.i`.t`.c`.u`.r`.t`.s`.n`.i```s.e`.l`.i`.a`.t`.e```s.e. `.r`.o`.m`. ``.e`c`. `.I.n.d. .tr``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`k`d`..`.m`.a`.e`.r`.t`.s``.e`.h`.t```s.r.y`.t```s.l.d`.u`.o`.w```s```s.g..`.n`.o`.l```s.o.r`.f```s.c.e`.a`.f`.r`.u`.s```s.h.e`.t`r`.n`.o```s.u.n`.r```s.a.n`.c```s.a.m`.e`.r`.t`.s```s.n.o```s.t.s`.u`.o`.b`.a`.e`.r`.e`.h```s.u.t`.b```s.s.,`.i```s.v.e`.a`.c```s.h.e`.t```s.r.e`.e`.h`.w``.e`c`. `.t`.'`.n`.a`.c`. `.I.s. .I. r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kkik``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k``s``s`kski``ci```ss``ss`ki``s`ksk``s``s`ksk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k``si`kkv``si``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`ki`k``s``si`k``s`k``s`k``s`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```si``si``si``s``ss`k`ci``si`ki`s``s`ksk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k`ki``si``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`ki``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k`ki``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k`ki`k``s``si`k``s``s``s`k`s`k`s``s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kkk`ki``s``s`ks``s`kk``s`ksk`k``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`kkk`kk``s`kc`k``s`k``sii``s`k`s`d`k``.*. i``s``s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s`k`s``si`k`k`kik`ki`k``s``s`kskk`k``s`k``s`kc``s`k`s``s`d`k``@i``ci`c```? i@i``s`d``? +i`d`..`.g`.n`.i`.h`.t`.e`.m`.o`.s``.o`.d```s.t.o```s.m.e``.l`c`.T`. .e. rv``s``s`ks``s`k`s``s`ks``s`k`s`d`k``ci`c```? i@i``s``s`ks``s`k`s`d`k`? +ik`k``s``s`ks``s`k`sikv``s`k`s``s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`d`k``ci`c```? i@i``s``s`ks``s`kk``s`ks``s`k`s`d`k`? +ik`k``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k`d`k``ci`c```c``s`k`ki``s`d`? +iv@i``s`kk``s``s`ksk`k`d`k``..`.s`.d`.n`.a````s``.d`.r`.o`.w`.-`.2```s.n.d`.a```s.1.-```s.t.o```s.c.k`.i`.t`.s```s.s`.a```s.P.l.e. .c.o.mrv``s`kk``s`k`s`kck``s`k`s`kck`k``s`k``s``s``s``s``s``s``s``s``s``s``s``s``s``s``s``s``s``s``s``s``s``s``s``s``s``s``s``s``s`d`?"i`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?pi`ki``s`d`?Pi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`kiv`k``s``s``si`ki`k```ss``ss``ss`k```s`cii``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`??i`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`kiv``s``sivv``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s``s``s``s``s`d`c``s``s`d`?bi`ki``s`d`?Bi`ki`ki`k``s``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?vi`ki``s`d`?Vi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k`ki`k```s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k`kiv``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k`kiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`kiv`k``s``s``si`k`ki`k``s``s`ksk```s`cii``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`kiv`k``s``s``si`k`ki`k```s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`kiv`k``s``s``si`k``s``s`kski`k```ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`ki`ki`k``s``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`kiv`k``s``s``si`k`ki`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?xi`ki``s`d`?Xi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k```ss``ss``s``ss`k``s`cii``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?bi`ki``s`d`?Bi`ki`ki`k``s``s``s``s``s``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k`ki`k``s`k```ss``ss`ki``s`ksk```s`cii``s``s`kskiv``s``sivv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k```si``s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`ki`k```s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`kiv`k``s``s``si`ki`k```ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?di`ki``s`d`?Di`ki`ki`k``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kskiv``s``s`d`c``s``s`d`?qi`ki``s`d`?Qi`ki`ki`k``s``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`kiv`k``s``s``si`k`ki`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?di`ki``s`d`?Di`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k```ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`kiv`k``s``s``si`k``s``s`kski`k````sss``s`ksk``ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`kiv`k``s``s``si`k``s``s`kski`k````sss``s`ksk``ci``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`kiv`k``s``s``si`ki`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?xi`ki``s`d`?Xi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k``s`k``s``s`kski```ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``ss`k```s`cii``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?fi`ki``s`d`?Fi`kiv`k``s``s``si`k``s``s`kski`k```si``s`k`s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k`ki`k```s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?di`ki``s`d`?Di`kiv`k``s``s``si`k`ki`k```ss``ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s``s``s``s``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k``s``s`ksk``ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?yi`ki``s`d`?Yi`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`kiv`k``s``s``si`k`ki`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?pi`ki``s`d`?Pi`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`kiv`k``s``s``si`k``s``s`kski`kiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s``s`d`c``s``s`d`?pi`ki``s`d`?Pi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`ki`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kskiv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?yi`ki``s`d`?Yi`kiv`k``s``s``si`k``s``s`kski`kiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?hi`ki``s`d`?Hi`kiv`k``s``s``si`k``s``s`kski`kiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?vi`ki``s`d`?Vi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```ss``ss``s``ss`k``s`cii``ss`ki``s`kskv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`kiv`k``s``s``si`k`ki`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?hi`ki``s`d`?Hi`ki`ki`k``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`kiv`k``s``s``si`ki`k```si``si``s``ss`k`ci``si`ki`s``s`kskv``s``sivv``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`kiv`k``s``s``si`ki`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`kiv`k``s``s``si`ki`k``s`k``s``s`kski```ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k``s``s`ksk```s`cii``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`ki`ki`k``s``s``s`d`c``s``s`d`?bi`ki``s`d`?Bi`kiv`k``s``s``si`k`ki`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k``s``s`kski`k``ci``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?bi`ki``s`d`?Bi`ki`ki`k``s``s``s`d`c``s``s`d`?bi`ki``s`d`?Bi`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`kiv`k``s``s``si`k`ki`k```s`s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`kiv`k``s``s``si`ki`k````s``ss`ki``s``s`k`ci``ss``ss`kis``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`kiv`k``s``s``si`k`ki`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`kiv`k``s``s``si`k`ki`k````s``ss`ki``s``s`k`ci``ss``ss`kis``s`kskiv``s``sivv``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`kiv`k``s``s``si`k`ki`k```ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`kiv`k``s``s``si`k`ki`k```si``s`k`s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?di`ki``s`d`?Di`ki`ki`k``s``s``s``s``s``s``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k````ss`ss``ss`ki``s`kskv``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```si``si``s``ss`k`ci``si`ki`s``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s``s``s``s``s`d`c``s``s`d`?bi`ki``s`d`?Bi`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`kiv`k``s``s``si`k`ki`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?pi`ki``s`d`?Pi`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k`ki`k```s``s`ksk``s`cii``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k`ki`k````ss`ss``ss`ki``s`kskv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`kiv`k``s``s``si`k`ki`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`kiv`k``s``s``si`k``s``s`kski`k````sss``s`ksk``ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?vi`ki``s`d`?Vi`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`kiv`k``s``s``si`ki`k```s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k```ss``ss`ki``s`kskv``s``sivv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`kiv`k``s``s``si`k``s``s`kski`k``s``s`kskiv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`kiv`k``s``s``si`k``s``s`kski`k```s`cii``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k``s`k``s``s`kski```ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k```ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k````ss`ss``ss`ki``s`kskv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`kiv`k``s``s``si`k`ki`k```ss``ss``ss`k```s`cii``s``s`kski``s`kskv``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`kiv`k``s``s``si`k`ki`k````ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`kiv`k``s``s``si`ki`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kskiv``s``sivv``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`kiv`k``s``s``si`ki`k```ss``ss``ss``s``ss`k``s`cii``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?pi`ki``s`d`?Pi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`ki`ki`k``s``s``s`d`c``s``s`d`?pi`ki``s`d`?Pi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s``s`d`c``s``s`d`?fi`ki``s`d`?Fi`kiv`k``s``s``si`ki`k````sss``s`ksk``ci``s``s`kskiv``s``s`d`c``s``s`d`?vi`ki``s`d`?Vi`kiv`k``s``s``si`ki`k````sss``s`ksk``ci``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s``s``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k``s``s`kskiv``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`ki`ki`k``s``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`ki`ki`k``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kskiv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`kiv`k``s``s``si`ki`k``s`k```ss``ss`ki``s`ksk````sss``s`ksk``ci``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`kiv`k``s``s``si`k`ki`k````sss``s`ksk``ci``s``s`kskiv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`kiv`k``s``s``si`k`ki`k```ss``s``ss`k``s`cii``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?xi`ki``s`d`?Xi`ki`ki`k``s``s``s``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`kiv`k``s``s``si`k`ki`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?vi`ki``s`d`?Vi`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k```ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```ss``ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?pi`ki``s`d`?Pi`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`kiv`k``s``s``si`k``s``s`kski`k````ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`kiv`k``s``s``si`k``s``s`kski`k```ss``ss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?fi`ki``s`d`?Fi`ki`ki`k``s``s``s``s``s``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski`k`ki``s``s`d`c``s``s`d`?di`ki``s`d`?Di`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k``s``s`ksk```s`cii``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s``s``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski`ki``s``sivv``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`ki`ki`k``s``s``s``s`d`c``s``s`d`?hi`ki``s`d`?Hi`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`kiv`k``s``s``si`k``s``s`kski`k```ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`kiv`k``s``s``si`ki`k```s``s`ksk``s`cii``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```ss``ss`k```s`cii``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?di`ki``s`d`?Di`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`kiv`k``s``s``si`ki`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`kiv`k``s``s``si`k`ki`k````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski`k``s``s`kski``s``sivv``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`kiv`k``s``s``si`k``s``s`kski`k````ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski`k```ss``ss`ki``s`ksk``s``s`d`c``s``s`d`?di`ki``s`d`?Di`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k```ss``ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`kiv`k``s``s``si`k`ki`k``ci```ss``ss`ki``s`kskv``s``sivv``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`kskv``s``sivv``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`kiv`k``s``s``si`k`ki`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k```ss``ss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski`k``ci``s``s`kski``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`ki`ki`k``s``s``s``s``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`kiv``s``sivv``s``s`d`c``s``s`d`?yi`ki``s`d`?Yi`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`ki`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`kiv`k``s``s``si`k`ki`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k````ss`ss``ss`ki``s`kskv``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?di`ki``s`d`?Di`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k````ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`ki`k```ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?yi`ki``s`d`?Yi`kiv`k``s``s``si`k`ki`k```ss``ss``ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?hi`ki``s`d`?Hi`ki`ki`k``s``s``s``s``s``s``s`d`?2i`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?di`ki``s`d`?Di`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`kiv`k``s``s``si`ki`k``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?pi`ki``s`d`?Pi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`kiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k`kiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k`ki`k```ss``ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k``ci```ss``ss`ki``s`kskv``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`ki`ki`k``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`kiv`k``s``s``si`k``s``s`kski`k````sss``s`ksk``ci``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```ss``ss``ss```ss`ss``ss`ki``s`kskv``s``s`d`c``s``s`d`?fi`ki``s`d`?Fi`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k```s``s`ksk`ci``s``s`kskiv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k```s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?di`ki``s`d`?Di`kiv`k``s``s``si`k`ki`k```ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?vi`ki``s`d`?Vi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`kiv`k``s``s``si`k``s``s`kski`k``ci```ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`kiv`k``s``s``si`k`ki`k```ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`ki`k```ss``ss``ss`k```s`cii``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ji`ki``s`d`?Ji`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`kiv`k``s``s``si`ki`k``s`k``s``s`kski``ci```ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`ki`ki`k``s``s``s`d`c``s``s`d`?pi`ki``s`d`?Pi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```ss``ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?pi`ki``s`d`?Pi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`kiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?yi`ki``s`d`?Yi`ki`ki`k``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`kiv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`kiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s``s`d`c``s``s`d`?fi`ki``s`d`?Fi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`ki`k```ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``s`d`c``s``s`d`?vi`ki``s`d`?Vi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`ki`k```ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kskiv``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`ki`ki`k``s``s``s`d`c``s``s`d`?pi`ki``s`d`?Pi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`ki`k``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?vi`ki``s`d`?Vi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k`ki`k```ss``ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?fi`ki``s`d`?Fi`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`ki`ki`k``s``s``s`d`c``s``s`d`?hi`ki``s`d`?Hi`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`kiv`k``s``s``si`k``s``s`kski`k``s``s`ksk``ci``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k``ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k``ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```si``si``si``s``ss`k`ci``si`ki`s``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`ki`ki`k``s``s``s``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?hi`ki``s`d`?Hi`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`kiv`k``s``s``si`ki`k``s`k```ss``ss`ki``s`ksk```s`cii``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?zi`ki``s`d`?Zi`kiv`k``s``s``si`ki`k```ss``ss``ss`k```s`cii``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k````s```ss`ss``ss`kis``s`ksk```s`s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`kiv`k``s``s``si`ki`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`kiv`k``s``s``si`ki`k``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k``s``s`ksk``ci``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`ki`ki`k``s``s``s`d`c``s``s`d`?bi`ki``s`d`?Bi`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k`kiv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k``ci``s``s`kskiv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?hi`ki``s`d`?Hi`kiv`k``s``s``si`k`ki`k`kiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?hi`ki``s`d`?Hi`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`kiv`k``s``s``si`k``s``s`kski`k```ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s`d`c``s``s`d`?hi`ki``s`d`?Hi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k`ki`k```s``s```ss`ss``ss`kis``s`k``si``s``ss`k`ci``si`kis``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`ki`ki`k``s``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`ki`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```s``s```ss`ss``ss`kis``s`k``si``s``ss`k`ci``si`kis``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```ss``ss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s``s``s``s``s``s``s``s`d`c``s``s`d`?fi`ki``s`d`?Fi`ki`ki`k``s``s``s`d`c``s``s`d`?fi`ki``s`d`?Fi`ki`ki`k``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```ss``ss`k``ci``s``s`kski``s`kskv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`kiv`k``s``s``si`k`ki`k````s```ss`ss``ss`kis``s`ksk```s`s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k```si``s`k`s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k``s``s`ksk``ci``s``s`kskiv``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`kiv`k``s``s``si`k`ki`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?pi`ki``s`d`?Pi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```ss``ss`ki``s`kskv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k`kiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`kiv`k``s``s``si`k`ki`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```ss``ss``ss``ss```ss`ss``ss`ki``s`kskv``s``s`d`c``s``s`d`?di`ki``s`d`?Di`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`kiv`k``s``s``si`k`ki`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv``s``sivv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`kiv`k``s``s``si`k`ki`k```ss``ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?vi`ki``s`d`?Vi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```s`cii``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?yi`ki``s`d`?Yi`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`ki`k```ss``ss`k```s`cii``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?pi`ki``s`d`?Pi`ki`ki`k``s``s``s``s``s``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`kiv`k``s``s``si`k`ki`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`kiv`k``s``s``si`ki`k``s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`kiv`k``s``s``si`ki`k```s``s``ss`ki``s``s`k`ci``ss``ss`kis```ss`ss``ss`ki``s`kskv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`kiv`k``s``s``si`ki`k```ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`kiv`k``s``s``si`ki`k``s`k``ci``s``s`kski````ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```si``s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`kiv`k``s``s``si`k``s``s`kski`k```s``s`ksk`ci``s``s`kskiv``s``sivv``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`kiv`k``s``s``si`ki`k```ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`kiv`k``s``s``si`ki`k````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?vi`ki``s`d`?Vi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k`ki`k```s``si``s`ci`k`s``s`ksk``s`s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`ki`ki`k``s``s``s`d`c``s``s`d`?hi`ki``s`d`?Hi`kiv`k``s``s``si`k`ki`k```si``si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k`kiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`ki`k````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k``s``s`kski`k````ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?yi`ki``s`d`?Yi`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`kiv`k``s``s``si`ki`k````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kskiv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?qi`ki``s`d`?Qi`ki`ki`k``s``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`kiv`k``s``s``si`ki`k```ss``ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?di`ki``s`d`?Di`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`kiv`k``s``s``si`k``s``s`kski`k``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`kiv`k``s``s``si`k`ki`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k`ki`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`kiv`k``s``s``si`k`ki`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`ki`ki`k``s``s``s`d`c``s``s`d`?hi`ki``s`d`?Hi`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`kiv`k``s``s``si`k`ki`k```ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?di`ki``s`d`?Di`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```ss``ss``ss``s``ss`k``s`cii``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?di`ki``s`d`?Di`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k```ss``ss`k``ci``s``s`kski``s`kskv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k``s`k```ss``ss`ki``s`ksk````sss``s`ksk``ci``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?bi`ki``s`d`?Bi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k```s``s``ss`ki``s``s`k`ci``ss``ss`kis```ss`ss``ss`ki``s`kskv``s``sivv``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k````ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s``s``s``s``s``s``s``s``s``s``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`kiv``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?yi`ki``s`d`?Yi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k``s``s`kski`k```ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k``s``s`ksk``ci``s``s`kskiv``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k`ki`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k`kiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?hi`ki``s`d`?Hi`ki`ki`k``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s``s``s``s`d`c``s``s`d`?di`ki``s`d`?Di`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`kiv`k``s``s``si`ki`k```s``s`ksk``s`cii``s``s`kskiv``s``sivv``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``ss`k``ci``s``s`kski``s`kskv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?di`ki``s`d`?Di`kiv`k``s``s``si`ki`k````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kskiv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``ss`k```s`cii``s``s`kski``s`kskv``s``sivv``s``s`d`c``s``s`d`?zi`ki``s`d`?Zi`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k`kiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`kiv`k``s``s``si`k`ki`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?vi`ki``s`d`?Vi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`ki`k```si``s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s`d`c``s``s`d`?bi`ki``s`d`?Bi`ki`ki`k``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k``s`k``ci``s``s`kski````ss`ss``ss`ki``s`kskv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`kiv`k``s``s``si`k`ki`k``s`k``ci``s``s`kski````ss`ss``ss`ki``s`kskv``s``sivv``s``s`d`c``s``s`d`?yi`ki``s`d`?Yi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k``s`k``s``s`kski``ci```ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?hi`ki``s`d`?Hi`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``ss`k```s`cii``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`ki`k```ss``ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?hi`ki``s`d`?Hi`kiv`k``s``s``si`k`ki`kiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?pi`ki``s`d`?Pi`ki`ki`k``s``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`kiv`k``s``s``si`ki`k```ss``ss``ss`k```s`cii``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`ki`k```si``s``ss`k`ci``si`ki`s``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`kiv`k``s``s``si`k`ki`k``s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`kiv`k``s``s``si`ki`k```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`kiv`k``s``s``si`k``s``s`kski`kiv``s``sivv``s``s`d`c``s``s`d`?pi`ki``s`d`?Pi`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`kiv`k``s``s``si`k`ki`k```s``s``ss`ki``s``s`k`ci``ss``ss`kis```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?pi`ki``s`d`?Pi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k```ss``ss``ss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`kiv`k``s``s``si`k`ki`k```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`kiv`k``s``s``si`k``s``s`kski`k```ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?fi`ki``s`d`?Fi`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`kiv`k``s``s``si`k`ki`k```si``s``ss`k`ci``si`ki`s``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```ss``ss``ss`k``ci``s``s`kski``s`kskv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k````ss`ss``ss`ki``s`kskv``s``sivv``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?gi`ki``s`d`?Gi`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``ss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?bi`ki``s`d`?Bi`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`ki`k```s`cii``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`kiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?mi`ki``s`d`?Mi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?hi`ki``s`d`?Hi`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`kiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?hi`ki``s`d`?Hi`kiv`k``s``s``si`k`ki`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?vi`ki``s`d`?Vi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k``s``s`kski`k````ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`kiv`k``s``s``si`ki`k``s`k``s``s`kski```ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k``s``s`kskiv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`kiv`k``s``s``si`k```ss``ss`ki``s`ksk`k``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?di`ki``s`d`?Di`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`ki`k``s`k``s``s`kski```ss``ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`kiv`k``s``s``si`ki`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k`ki`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k````ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ui`ki``s`d`?Ui`ki`ki`k``s``s``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```s``s`ksk`ci``s``s`kskiv``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`kiv`k``s``s``si`k``s``s`kski`k```ss``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?pi`ki``s`d`?Pi`ki`ki`k``s``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```s``s`ksk`ci``s``s`kskiv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`kiv`k``s``s``si`k`ki`k```ss``ss`k```s`cii``s``s`kski``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`kiv`k``s``s``si`k`ki`k```s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?vi`ki``s`d`?Vi`ki`ki`k``s``s``s``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k`ki`k```ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`ki`k````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?vi`ki``s`d`?Vi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`ki`k```ss``ss``ss```ss`ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`ki`k``s``s``s`d`c``s``s`d`?di`ki``s`d`?Di`ki`ki`k``s``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`kiv`k``s``s``si`ki`k``s`k```ss``ss`ki``s`ksk```s`cii``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ii`ki``s`d`?Ii`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?oi`ki``s`d`?Oi`ki`ki`k``s``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`?ci`ki``s`d`?Ci`ki`ki`k``s``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`kiv`k``s``s``si`ki`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?wi`ki``s`d`?Wi`ki`ki`k``s``s``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```ss``ss`ki``s`kskv``s``s`d`c``s``s`d`?ai`ki``s`d`?Ai`ki`ki`k``s``s``s``s``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```s`cii``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s``s`d`c``s``s`d`?ki`ki``s`d`?Ki`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k````ss`ss``ss`ki``s`kskv``s``sivv``s``s`d`c``s``s`d`?li`ki``s`d`?Li`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k``s`k``s``s`kski```ss``ss``s`k`ci``ss``ss`ki``s`kskv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`kiv`k``s``s``si`ki`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kskiv``s``sivv``s``sivv``s``s`d`c``s``s`d`?vi`ki``s`d`?Vi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``s``s`kski`k```ss``ss``ss`k``ci``s``s`kski``s`kskv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`?ti`ki``s`d`?Ti`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```ss``ss`ki``s`ksk`ki``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?hi`ki``s`d`?Hi`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?ri`ki``s`d`?Ri`ki`ki`k``s``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`kiv`k``s``s``si`k``s``s`kski`k``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kskiv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?xi`ki``s`d`?Xi`ki`ki`k``s``s``s`d`c``s``s`d`?yi`ki``s`d`?Yi`ki`ki`k``s``s``s`d`c``s``s`d`?zi`ki``s`d`?Zi`ki`ki`k``s``s``s`d`c``s``s`d`?zi`ki``s`d`?Zi`ki`ki`k``s``s``s`d`c``s``s`d`?yi`ki``s`d`?Yi`kiv`k``s``s``si`k`ki`k```si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`d`c``s``s`d`?yi`ki``s`d`?Yi`ki`ki`k``s``s``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``ci``s``s`kski`k`kiv``s``s`d`?2i`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k`ki`k```si``si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv``s``sivv``s``s`d`c``s``s`d`?ei`ki``s`d`?Ei`ki`ki`k``s``s``s`d`c``s``s`d`?si`ki``s`d`?Si`ki`ki`k``s``s``s`d`c``s``s`d`? i`ki``s`d`? +i`kiv`k``s``s``si`k``ci``s``s`kski`k`kiv``s``sivv``s``sivv``s``sivv``s``sivv``s``s`k``sii``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s``s`ks``s`k`s`ks``s`k`s`k`s``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s`kk``s`k`s`k`s`k``s``s`kk``s`k`sik`d`@k``s``s`ks``s`kk``s`ks``s``s`kskk`k``s`k`s`k|``s`kks``s`kk``s`k`s`kk``s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`s`k``sii``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s`k`s`k`s`d`k```s`kc``s`k`s`k`k`ki``ss`k`kk`c``s``s`d`? i`ki``s`d`? +i`ki``s``s`ks``s`kk``s`ks``s`kk``s`ksk`k``s`k`s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s`kkk`k`k``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ks``s`k`s`kk``s`k`s`k|``s`kks`k`d`@k`k`k`k`ki`kk`k`k`k`ki`ki``s``s``s``s``si`kk`kk`kk`kk`kk`k``s``si`k``s`k``s``s`k`s``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`k`ki`k`ki`k``si`ki`d`k`````ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`kk`k`kk`k`k`ki`k`k`ki`k`k`k`k`ki``s`k`s`kk``s``s`ks``s`kk``s`ksk`k``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k`ki`k``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss```ss`ss``ss`ki``s`kskk`k`k`ki``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k``s`k`sikk`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kski``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k``s``si`ki`k`kik``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k``si`k``s``s`ks``s``s`ks``s`kk``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k`sik`k``s`k`sik`k`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`d`k```ci``s``s`kski``si`ki``s``s``s``si`k`ki`k``s`kkk`k``s`k`sik`k`kiv``s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ksk`k`kkvk`kik`k``s``si`k``s``s``s``s``s``si`kk`kk`kk`kk`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`kc``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k``s`kkkv`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`kk`k`k``si`ki`k`d`k``````sss``s`ksk``ci``s``s`kski``s`k`sik`kiv`ki``s`kk``s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`kc``s`k`s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s`k`s`d`k`i``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k``s`kkk`k`k``s`k`sik`k`k`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`kk`k`k``si`ki`k`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`sik`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k``s`kkkv`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`kk`k`k``si`ki`k`d`k`````ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`sik`kiv`k`ki`ki``s`kk``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`kkv`k`ki``s`kk``s`k`s`d`k``d``.e`.w`. `.w`.o`.n`. `.e`.r`.a`. ``.e`c`. `.r`.u`.o`.Y.f.t..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k````ss`ss``ss`ki``s`ksk`k`ki``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k`k`ki`ki``s`kk``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```s``s`ksk`ci``s``s`kskik``s`kk``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss`k``ci``s``s`kski``s`kskkv``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s`k`s`d`k`i``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k``s`kkk`k`k``s`k`sik`k`k`kiv``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`kk`k`k``si`ki`k`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`sik`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`kk`k`k``si`ki`k`d`k`````si``s`k`s``s`ksk`ci``s``s`kski``s`k`sik`kiv`k`ki`k``s``s`ks``s`k`s`d`k`i``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k``s`kkk`k`k``s`k`sik`k`k`kiv`k``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`kk`k`k``si`ki`k`d`k`````ss``s`k`ci``ss``ss`ki``s`ksk``s`k`sik`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`kk`k`k``si`ki`k`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv`k`ki``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`kk`k`k``si`k`ki``s`kk``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`kk`k`k`k``s`k`sik`k`k`k`kiv`k`k`ki``s`kk``s`kk``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss`k``ci``s``s`kski``s`ksk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k``s``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``si`kk`d`k````s``s`ks``s`kk``s`ks``s`k`sik`kki``s``s``si`k``s``s`kski`k```ss``ss```ss`ss``ss`ki``s`kskvk``s`kk``s`kk``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss`k``ci``s``s`kski``s`kskkv`k``s``si`k``s``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s``s``s``s``s``s``si`k`ki`k``s`kkkv`ki``s``s``s``s``si`k`ki`k`kk`k``si`ki`d`k`````ss``ss`ki``s`ksk``s`k`sik`kiv``s``si`k`ki`k`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki``s`kk``s`k`s`k``s``s`k`ki``s``s``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`k`ki`kk`k`ki`k`ki`kk`k`ki`k`ki`k`d`..`.T`.S`.E`.W``.n`.a`.h`.t```s.e`.h`.t`.a```s.W```s.p.e`.y`.t```s.l.y`.p`.m`.i`.s```s.r.,`.e`.f`.e`.r`.p```s.o.u`.y```s`. .I.f. .r. r`ki`d```s``s`ks``s`kk``s`ks``s`k`sik`kk````ss`ss``ss`ki``s`ksk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk````ss`ss``ss`ki``s`kskk`k`ki``s``s``s``s``s``si`kk`kk`kk`kk`kk`kk`k``s``si`k``s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss`k``ci``s``s`kski``s`ksk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k``s``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``si`k`kivk`k``s``si`k``s``s``s``s``s``si`kk`kk`kk`kk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`k`ki`k`k`k`k`ki``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k``s`kkk`k`k``si`k`ki``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s`k`s`k`si``s`k`s`kk``s`k`s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski``s``s`ks``s`kk``s`ksk`k``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ks``s``s`ksk`k`k`ki`k`k`kk`ki``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s`k`s`k`si``s`k`s`kk``s`k`s`k`s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s``s``s``s``si`kk`kk`k`ki`k``si`k`ki``s``si`kk`k`ki`kk`ki`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`ki``s`kk``s``s`ks``s`kk``s`k`s``s``s``s``si`kk`k`kiv``s``s``s``si`kk`k``si`ki``s``s``s``si`k`ki`kk`k``s`k`sik`k`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`ki`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss```ss`ss``ss`ki``s`kskk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss`k```s`cii``s``s`kski``s`kskk`ki``s``s`ks``s`kk``s`ksk`k``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ks``s``s`ksk`k`k`ki`k`k`kk`ki``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`si``s`k`s`k`s`kk``s`k`s`k`s``s`ks``s`kk``s``s`ks``s`k`s`kc``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv`ki``s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ksk`k`k`k`ki`k`k`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k`k`k```ss``ss```ss`ss``ss`ki``s`ksk`k`ki`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ksk`k`k`k`ki`ki`k``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```s``s`ksk`ci``s``s`kskik`k``s`k`si``s`kk``s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k`k```ss``ss```ss`ss``ss`ki``s`kskkv``s`k`s`kk``s``s`ks``s`kk``s`ksk`k``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ks``s``s`ksk`k`k`ki`k`k`kk`ki``s`k`s`kk``s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`si``s`k`s`kk``s`k`s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`kk`k`k``si`k`ki`k`k``s``si`k`d`.d`.r`.o`.w``.c`.i`.g`.a`.m```s.u.t`.o`.-`.n`.r`.o`.w```s.l.d`.o```s.a.n```s.i.s```s.a.t`.h`.t```s.u.t`.b```s.y.,`.r`.t```s`.o`.G.o.d. ..`k``s``si`k`d`.k`.c`.u`.l`. `.d````sr.G`..`.h`.t`.u```s`.e`.h`.t```s.o.m`.r`.f```s.x.t`.e`.n```s.h.e`.t```s.n.g`.i`.r`.e`.t`.n`.e``.e`c`.n``.r```s``.t`.o`.n```s.e.s`.o`.d```s.t.h`.r`.o`.n```s.h.e`.t```s.t.o```s```s``. `.g`.n`.i`.v```s.l.e`. `.t```s.t.h`. `.d`.n```s.,. `.t`.o`.l`. ```s.n. `.r`.u`.t`. `.s`.e`.g``.s`c`.p``.e`.v`.a`.c```s.a`.h```s.e. ```s.n`. `.,```s`.A````s.t..`.s`.e`.r`.o`.f`r`.e`.h`.t```s.i.n```s.s.t`.o`.l```s.e.n`.h`.w```s.p.t`.e`.c`.x`.e```s.n.d`.u`.o`.r`.g```s.v.e`.o`.b`.a```s.r.e`.e`.h`.w`.y`.n`.a```s.o.m`.r`.f```s.n.g`.i`.d`.l`.i`.u`.b```s.h.e`.t```s.t`. `.u```sr`.s`.t`.e`.g`. ``.l`c``.s```s."`.g`.n`.i`.d`.l`.i`.u`.b`."```s.e.,`.l`.p`.m`.a`.x`.e```s`.F````s.d..`.r`.o`.w```s`.g`.n`.i`.s``.a```s.t.h`.i`.w```s`.c``.a`.t`.s`.i`.d`r`.g```s.l`. `.e`.v```s. `.s`.e```s.t.i`.e```s``.n`.a`.c```s.o.u`.y```s.m.e`.a`.g```s.h.e`.t```s.e.d`.e`.p`.s```s````s`.c`.a``. ```s`.r``.f`c`.d`r`.y``.e`.t`.e```s`.o`.c``.a```s.r.y`.t```s.l.d`.u`.o`.h`.s```s.n.d`.a```s`.i`.t``.l```s`.p```s`.)`.!`.y`.m```s.o`.(`. ```s`.h`.t`. `.d`.n`.o`.y```sr.b`.g`.n`.i`.h`.t```s.o.m`.s`. `.g`.n`.i`.t`.p`.m``.t`c``.e`.r`.a```s.c.t`.e`.j`.b`.o```s.a.n```s.t.e`.a`.l`.u`.p`.i`.n`.a`.m```s.t.o```s```s````s.c.e`.c`.u```s.u`. `.g```s`.r`.t`r`.e`.l`.p`.o`.e`.p`. ``.l`c`.u`.s`.U````s.s..`.d`.r`.o`.w```s.r`.o`.m`. `.w```s`.a```s.r.y`.t```s.t.o```s.e.d`.e`.n```s.s.t`.u`.j```s.n.g`.i`.v`.o`.m```s.l.e`.b`.u`.o`.r`.t`r`.g`.n`.i`.v`.a`.h```s.l.e`.p`.o`.e`.p```s```s`.s`.U````s.d..`.r`.i`.b```s.h.e`.t```s.e.s`.r`.a`.c`.s```s.o.d`.r```s.h`.t`. `.,```s.n.c`.a`.t`.s`.n`.i`. `.r`.o`.f`. `.;`.s`.t`.c``.f`c`r```s.i.d`.s`. ```s.a.v`.h`. `.s`.t`.c```s.b.j`.o`. ```s````s.g..`.n`.i`.y`.r`.r`.a`.c```s.r.e`.'`.u`.o`.y```s.a.t`.h`.w```s.o.f```s`.i`.l``.a```s.o.u`.y```s.v.e`.i`.g`r`.o`.t```s.m.e```s.e```s``. `.h```s.h`.w`. `.,`."`.y`.r`.o`.t`.n`.e`.v`.n```s.e. `.k`.a`.t`."`. `.s`.e```s.p.l`.m```s.". `.y`.r`.o`.t`.n`.e`.v`.n```s. ."`.,`.r`.a`.l`.u`.c```s.r.t`.a`.p`r`.n```s.;`.s`.b`.r`.e`.v```s.l.y`.p`.m`.i```s.s`.l`.a`. `.s`.t`.c`.e`.j`.b```s.e. `.m```s```s.e..`.n`.o`.l`.a```s.r.b`.e`.v```s.h.e`.t```s.o.m`.r`.f```s``.j`.b`.o`. ```s.t.h`r`.r```s`.i`. ```s``.I```s.e.s`.m`.i`.t`.e`.m`.o`.s```s.u.t`.b```s``.e`.d```s. .o```s.h`.t`.i```s.n`.i`.(```s.d.s`.r`.o`.w```s.o.n`.i`.t`.c`.a```s.n.d`.a```s.c.t`.e`.j`.b`.o`r`.e`.h`.t```s.t.h`.o`.b```s.v.e`.i`.g```s.t.o```s.e.d`.e`.n``.l`c`.w`. `.u`.o``. ``.l`c`.u`.s`.U````s`.o`.n`.k``.I```s.a.t`.h`.t```s.d.s`.r`.o`.w```s.o.n`.i`.t`.c`.a```s.h.e`.t`r`.f`.o```s.m.e`.o`.s```s.n.g`.i`.s`.u```s.e.d`.t`.a`.l`.u`.p`.i`.n`.a`.m```s.b.e```s.a.n`.c```s.t.s`.c`.e`.j`.b`.o```s.s```s.T.h`. `. `..```s.a.v`.c`. ```s.t.h`. `.n`.i`. `.n```.h`r```s`. `.k`.c`.a`.l`.b``.a```s.k`.i`.l`. `.,`.s`.t`.c```s.b.j`.o`. `.l`.a`.i`.c```s.s.p`. `.w```s`.a```s.u.t`.o`.b`.a```s.o.w`.n`.k```s```s.n..`.w`.o`.d```s.o.r```s.p`.u`r```s`.u`.o`.s`. `.,`.h```s.o.r`.n`. `.,```s`.w`. `.,`.t`.s`.a```s.,. `.r```s.n.t```s.,. `.m`.a```s`.s``.w`.o`.d`. `.,`.g```s.d`.l```s``.,`.t`.s`.e`.r`.o`.f```s.k.e`.i`.l`r`.s`.d`.r`.o`.w```s.r.y`.t```s`.v``.m`. ```s```s.e..`.r`.e`.h`.t```s.o.u`.y```s.v.e`.o`.m```s.t.o```s.e.d`.s`.u```s.i.s```s.n.d`.a```s`.c`.a`.l`.p`. `.s```s``.c`.s`.e`.d`r`.y```s.l`.u`.b```s`.v`. `.y`.m`. `.f```s.t. `.s```s```s.s..`.g`.n`.i`.h`.t```s.n.d`.a```s.s.,`.n`.o`.i`.t`.c`.a```s.s.,`.e`.c`.a`.l`.p```s`. `.w```s`. `.I.k.n.o.f. .M.o.c.a.r.i.b.e.s. .T.o.e.,. .b.u.i.n.t.r.e.s.t.h.,. .I. .f.e. .r.o.d`c.i.e. .w... .a.y.i. .e.r.).,. .c.a.n.f.e.c.t. .S.o. .i.c.a.u.s. .s.t. .T.h.e.e. .u.a.l.y. .f.e. .a.y.i.n.s.f.u.l.y. .a.e.i.r. .c.a.b.i.e.s. .m.p.l.i.e.n.t.k... .T.o. .s.o.m.o.n.e.s. .l.e. .o.r. .u.a.y.o. .l.s.o.t. .a.ar.r.o.m. .g.u.a.t. .s.o.!`k``s``si`k`d``.e`.h```s``.y`.r`.r`.e`.b```s.n.d`.a```s.c.e`.u`.r`.p`.s`r`.e`.h`.t```s.n.d`.u`.o`.r`.a```s.u.r`.o`.t`.e`.d```s.o.u`.y```s.i.f```s.s.y`.a`.e```s.t.e`.i`.u`.q```s.i.s```s.e.l`.v`.a`.r`.t```s.u.t`.b```s.s.,`.e`.v`.a`.e`.l```s.h.e`.t``.l`c`r`.y`.b`. `.d`.e``.c`.i`.r```s.e.s`.r`. `.e```s.u.i`.q`. `.s`.i`. `.y```s.l```s`.s```s`.r`.a`.e`.y```s.o.f```s.m.e`.i`.t```s.i`.h`.T`. `. `..```s`.o``. ```s.o.u`.i`.r`.a`.v`r`.f`.o`. ```s.h.e```s.b.u`. `.t`.p`.i`.r`.c```s``.o```s.s`.u`.l`.p```s.g.s`.n`.i`.l`.p`.a`.s```s.s.h`.a```s.n.d`.a```s.c.h`.r`.i`.b```s.l.y`.e`.g`.r`.a`.l```s.h.,`.t`.w`.o`.r`.g`r`.-`.r`.e`.d`.n`.u```s.o.f```s`.b``.a```s.t.e`.i`.u`.q```s.i.s```s.r```s````s.e..`.c`.u`.r`.p`.s```s.o.r```s.n.e`.i`.p```s.o.f```s.v.e`.o`.r`.g```s`.n`.o`.i`.s``.c`c`r`.n`.a``.h`.t`.i`.w```s.e.,`.l`.p`.a`.m```s.n`.a`. `.k`.a`.o`. ``.o`c`.d`.r`.a`.h``.e`.g`.r`.a`.l```s.r.e`.a```s.s.t`.e`.r`.o`.f```s.h.e`.t```s.o.f```s```s.t.r`. ```s.T.h.e.s. .w.d. .o.a.l. .T.h.e. .i.t. .n.d.e.s.r.t.s. .v.i.b.i.t.a. .b.u.s..`k``s``si`k`d`.y``.e`.k`.i```s``.s`.i```.r`.g`.o`.r`.p`r`.l`.e`.v`.o`.h```s.a```s.t.h`.i`.w```s`.v`.E````s.l..`.a`.c`.i`.t`.c`.a`.r`.p`.m`.i```s.t.e`.i`.u`.q```s.i`. `.l`.e`.v`.o`.h```s.a```s.u`.o`.h```s.w`. `.g`.n``.g`c`.D.i.i.t. .s. .e.n. .s`c.e. .u.n.l..`k``s``si`k`d`.e`.r`.a``.u`.o`.y```s.a.s```s.e.d`.s`.u`.f`.n`.o`.c```s.a.s```s`.I.'.m. ..`k``s``si`k`d`.r`.e`.t`.a`.w``.o`.t```s.w`.o`.d`. `.g```s.d`.a`.e`.l`. `.t```sr``.e`c``.a```s.o.f```s`.i`.s``.a```s.l.y`.t`.n`.e`.u`.q`.e`.r`.f```s.i.s```s.u.t`.b```s.r.e`.e`.h`.w`.y`.n`.a```s.n.d`.u`.o`.f```s.b.e```s.a.n`.c```s````s.s..`.n`.r`.e`.v`.a`.c`r`.n`.i```s.m.e`.i`.t```s.t.o```s.m.e`.i`.t```s.o.m`.r`.f```s```s. .s`.,`.r```s`.w`. `.y`.l`.l```s.s```s.,`.r`.o`.p`.a`.v```s`.i`.h`.w``.a```s.i`. `.t```s.M.i.s. .t.e. .u.a.t.e.n. .I.t. .g.n. .d.p.i.n. ..`k``s``si`k`d``.i`. `.h`.c```s.W.a.t.!`k``s``si`k`d`.p`.u``.e`.v`.i`.g```s.t.o```s.n.t`.a`.w```s.o.u`.y```s.i.f```s.t."`.i`.u`.q`."```s`.U````s."..`.p`.o`.t`.s`."```s.r.d`.o`.w```s.h.e`.t```s`.n`.k`. `.t`.'`.n```s`.I. .d.o.w. .s.e. ..`k``s``si`k`d`.o`.t``.e`.m```s.s.k`.a```s.l.y`.t`.i`.c`.i`.l`.p`.x`.e```s.o.u`.y``.s`c``.n`.u`r`.e`.c`.a```s`.a```s.o.f```s.o.n`.i`.t`.p`.i`.r`.c`.s`.e`.d``.l`c`.f``.e`.h`.t```s.a.t`.e`.p`.e`.r```s.t.o```s.e.r`.v`.e`.n```s.m.e```s.l.s`.l`.e`.t```s.c`.i```s`.,``.f`.e`.i`.r`.b```s.y`.f`.i`.c`.e`.p`.s```s.a.y`.m```s.o.u`.y```s.r.,`.e`.p`.a`.p```s.v.e`.a`.s```s.t.o```s````s`.i`.F````s.s..`.t`.n`.i`.h```s.h`.t`. `.t`.p``.c`c``.o`.t`r`.e`.r`.o`.c`.s```s.u.r`.o`.y```s.c.t`.e`.f`.f`.a``.l`c`.w``.t`.i```s.c.h`.u`.m```s.o.w`.h```s.c.e`.n`.a`.v`.d`.a```s.i.n```s.o.u`.y```s.r.n`.a`.w``.l`c`.I`. `.,`.o`.d``.I```s.I.f`r`..`.e`.l`.b`.u`.o`.r`.t```s.n.g`.i`.v`.a`.h```s.b.e```s.t.o```s.e.m`.e`.s```s.o.u`.y```s.i.f```s.t.s`.n`.i`.h```s.e.r`.f`.f`.o```s```s.n`.o`.i`.s``.c`c``.y`.a`.m```sr.I`..`.n`.o`.i`.t`.c`.e`.s```s.'.s`.r`.e`.t`.s`.a`.m```s.h.e`.t```s.i.n```s.t.s`.n`.i`.o`.p```s.r.e`.o`.m```s.n.y`.a`.m```s.e.r`.n`.r`.a`.g```s.t`r`.y`.t`.i`.n`.u`.t`.r``.p`c``.n`.a```s.v.e`.a`.h```s`.a`. `.s`.u```s.b.o`. `.a`. `.g```s```s.g`. ```s.'.r`.u`.o`.y`. `.s`.n`.a```s. .m`.t`.i`. `.,`.n``.p`c`.h``.S`.E`.O`.D`r`.g`.n`.i`.t`.s`.e`.r`.e`.t`.n`.i```s.n.g`.i`.h`.t`.e`.m`.o`.s```s````s.t..`.e`.y``.l`c``.m`.e`.h`.t```s`.u`.o`.f`. `.t`.'```s.v`.a`.h`. `.u`.o`.y`. `.,`.s`.n``.p`c`.h`r`.g``.i`.t`.s`.e`.r`.e`.t```s. .i`.g```s.h.i`.t`.o```s`.I````s`.l`.i`.h`.w``.a```s`.f`. `.g`.n`.i`.r```s`.x`.e`. ``.e`c``.t`.s`.u`.j```s.s.,`.e`.r`.u`.s`.a`.e`.r`.t`r`.e`.h`.t``.l`c``.d`.n`.u`.o`.f```s.v.e`.'`.u`.o`.y```s.n.k`.i`.h`.t```s.o.u`.y```s````s`.n``.i`.t`.c`.e`.s`. `.g`.n`.i`.w``.r`c`.h``.e`.r`.o`.m```s.h.e`.t```s.o.f`r`.e`.m`.o`.s```s.g.h`.u`.o`.r`.h`.t```s```s. .b```s.'.v`.u`.o`.y`. `.r```s.t.h```s.w.h`. ```s`.m`.r``.t```s`.o`.t```s.y.s`.a`.w```s.e.r`.h`.t`.o```s.r.e`.a```s.r.e`.e`.h`.t```s.n.d`.a`r`.,`.)`.k`.c`.a`.p```s.h.e`.t```s.o.f```s``.r`. ```s.t.h`. `.m`.o`.r`.f`. `.s`.r``.n`c`.g``.b`. ```s.t`. ```s`.u`.g`.n```s.s.t```s. .d`.o`.t`.(`. `.n```s.g. `.n``.t`c`.g`r`.r`.o`.f``.t`.s`.u`.j```s.u.s`.n`.o`.b```s`.r`.a`.l``.a```s.i.s```s.r.e`.e`.h`.t```s.r.,`.a`.l`.u`.c`.i`.t`.r`.a`.p```s.i.n```s.e.;`.r`.o`.l`.p`.x`.e```s.t.o```s.e.d`.g`.a`.n`.a`.m`r`.e`.v`.'`.u`.o`.y```s.v.e`.a`.c```s.h.e`.t```s.o.f```s.y.)`.n`.a```s.i.f`.(```s.c.h`.u`.m```s.o.w`.h```s.o.n```s.e.d`.s`.a`.b```s.t.s`.n`.i`.o`.p```s.s.o`.l`.a```s.r.e`.a```s.r```s.T.h`r`..```s`.m``.u`.o`.y```s.t.s`.s`.o`.c```s.e.r`.m`.r`.o`.f```s.h.e`.t```s.g.h`.u`.o`.h`.t```s.g.,`.n`.i`.t`.t`.i`.u`.q```s.o.r`.f```s.o.r```s`.e````s.k`. `.g`.n``.t`c`.g`. `.r``.f`r`.s`.t`.n`.i```s. .p`.e`.s```s. .l`.u```s```s.t..`.i```s.n.g`.i`.t`.a`.c`.o`.l```s.o.r`.f```s.s.t`.u`.j```s.i.t`.d`.e`.r`.c```s.a.l`.i`.t`.r`.a`.p```s.e.t`.g```s.o.u`.y```s`.u`.o`.h`.t`r`.,```s`.d`.l```s``.e`.h`.t```s.i.n```s.l.y`.e`.f`.a`.s```s.i.t```s.f.t`.e`.l```s.v.e`.a`.h```s.s.t`.u`.m```s.o.u`.y```s``.u`.s`.a`.e```s`.a```s.o.r`.f```s.i.t`.d`.e`.r`.c`r`.l`.l`.u`.f```s.e.t`.g```s````s."..`.t`.i`.u`.q`."```s.a.y`.s```s.y.,`.l`.r`.a`.e```s.r.e`.u`.t`.n`.e`.v`.d`.a```s.u.r`.o`.y```s.n.d`.e```s.t.o```s.n.t`.a`.w```s.o.u`.y```s.I.f. .T.o. .t.r.e.,. .b.u.i.n.g.h. .Y.o.e.i.l.d.,. .o.r.e. .g.e. .e.i.s.h.e.i.e.s.t. .d.e.i.n.e.n. .a.o.s... .I.f. .a. .k.p.l.o.r. .e... .f. .n.a.e.n.d. .a. .I.f. .a.e.t.i.n.d. .o.o. .o.a.l.y. .'. .i. .a.e. .n.a.l.y.,. ."r.w.h. .u. .p.l.e. ..`k``s``si`k`d`.w``.h`. `.w```s.k.n`. `.t`.'`.n```s`.I. .d.o..v`k`kk`k`kr``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskkv`k`k`k`kk`k`k`k`ki``s`kk``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`s`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``si`k`d`..`.d`.r``.w`. `.t`.a`.h`.t`. `.w```s.k.n`. `.t`.'`.n```s`.I. .d.or`k``si`k``s``si`k`d`.?`.t`.a`.h`.Wr`k`d`.!``.a`.h```s`.n`.a`.t`.s`.r`.e```s.u.n`. `.t`.'`.n`.o```s.I. .d. .trk`k`k`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``si`kk`kk`kk`kk`kk`k`ki`k`k`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```s``s`ksk`ci``s``s`kskik``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k`kiv``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss```ss`ss``ss`ki``s`kskk``s`kk``s`k`s`d`k``ki``.e`.h`.t```s.t.h`.i`.w```s.d.o```s.t.o```s.n.t`.a`.w```s.o.u`.y```s.d.o```s`.h`.W.a.t. i``s``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`kk`k`kk`k`kk`k`kk`k`ki``s`k`s`d`k``ki``.?ri``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```si``si``si``s``ss`k`ci``si`ki`s``s`kskk`k`ki`ki`k``s``si`k``s``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`k`ki`k`ki`k``si`k`ki`k``s``siv`k``s``si`k```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski`k``s``si`k```s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`ksk`k``s``si`k``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k``ci```ss``ss`ki``s`ksk`k``s``si`k```ss``s`k`ci``ss``ss`ki``s`kskv`kki`k``s``si`k``s``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`k`ki`k`ki`k``si`k`ki`k``s``siv`k``s``si`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k```s``s`ksk``s`cii``s``s`kski`k``s``si`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k```ss``ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k```s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k``s`k``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k```ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss```ss`ss``ss`ki``s`kskv`kki`k``s``si`k``s``s`k`ki``s``s``s``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`k`ki`k`ki`k``si`k`ki`k``s``siv`k``s``si`k`d`.t``. `.g`.n```s```s.c`. `.y`.d```s.r.e`.l```s.e`.r`.a```s`.Y.o.u. .a.r.y.i.!`k``s``si`k`d`.t``. `.g`.n```s```s``.t`.'`.n`.e`.r`.a```s`.Y.o.u. .c.a.r.y.i.!`d`k````s``s`kski``s`k`s``si`k`d`.g`.n`.i``.t`. `.a`. ```s.u`.s`. `.k```s.l`.n`.u`. `.r```s.k. `.c```s. .l```s. .t`.w```s. .h`.w```s.k.n`. `.t`.'`.n```s`.I. .d.o.c.h..k````s``s`kski``s`k`s``si`k`d`.t`.h`.g`.i`.l``.f`.o```s.c.e`.r`.u`.o`.s```s.n.o```s.v.e`.a`.h```s`.Y.o.u. ..k``s``si`k`d`.s`.n`.e````s`. `.g`.n`.i```s`.N.o.t.h.a.p..`k``s``si`k`d`.w`.o`.h``.n`.i`.a`.l`.p`.x`.e```s.t.o```s.r.e`.a`.c```s`.y`. `.d`.l`.u```s```s``.a`.g`. ```s.I.'.m.e... .W.o.u. .?`k``s``si`k`d``.r```s.W.h.e.?`k``s``si`k`d`.K`.O..`k``s``si`k`d`.t``. `.g`.n```s```s``.t`.'`.n`.e`.r`.a```s`.Y.o.u. .c.a.r.y.i.!`k``s``si`k`d`.s``.o`.l```s`.d```s`.e`.b```s`.n`.o`.D.'.t. .r.i.c.u.!`k``s``si`k`d`.d``.o`.c`. `.y```s.m```s.t.r`.x```s.s`.i```s````s.t..`.n`.a`.s`.a`.e`.l`.p`.n`.u```s.o.t`.n```s.i.s```s.u.t`.b```s`.l`.a``.e`.n`.i`.m`r`.f`.o`. `.y`.l`.g`.n`.o```s`. ```s.t`.s`.a`.t`. `.r```s.a.t`.w`. ```s````s.m..`.a`.e`.r`.t`.s```s.h.e`.t```s``.f`. `.k`.n`.i```s`.a```s.e.n`.k`.a`.t```s.v.e`.a`.h```s`.Y.o.u. .d.r.o.m. .T.h.e.s.t.r.s.,. .I.t. .e.l..`k``s``si`k`d`.s``.e`.p`.p`.a`.h`. `.g```s.t.i`.i`.c`.x`.e`. `.g```s.h.i`.t`.o```s.,r`.y`.a`.w`.y```s. .A`. `..`.g```s``.a`.w`.e```s.y. `.l```s.l`.u`.c`.i`.t`.r```s`.t`.o`.n```s.i.s```s.m.p`.a`.l```s.i`.r`.t```s.l```s.e`.h`.t```s`.i````s.R.u.b.n.g. .e.c. .p.a.r.d.i.n..`k``s``si`k`d`.s`.n``.p`.p`.a`.h`. `.d```s.c.t```s.x.p```s.u`. `.g```s.h`.t`.o`.N`. `. `..`.r`.a```s`.c`.e`.P.u.l.i.n.e..`k``s``si`k`d`.s``.o`.l```s`.d```s`.e`.b```s`.n`.o`.D.'.t. .r.i.c.u.!`k``s``si`k`d`.t`.a`.e``.o`.t```s.r.e`.e`.h```s.n.g`.i`.h`.t`.o`.n```s.i.s```s.r```s.T.h.e. ..`k``s``si`k`d``.a`.h```s.l`.l`.i`.f```s.'.t`.n`.a`.c```s`.Y.o.u. .t..`k``s``si`k`d``.a`.h```s.o`.d```s.t.o```s.e.r`.w`.o`.p```s.u.r`.o`.y```s.n.d`.o`.y`.e`.b```s.i.s```s.I.t. .t..`k``s``si`k`d`.e`.t``.m`.a`.n`.y`.d`. `.s`.e`.r```s.q.u`.e`.r`. `.g`.n```s`.a`.l`.B.s.t.i..`k``s``si`k`d`.s``.o`.l```s`.d```s`.e`.b```s`.n`.o`.D.'.t. .r.i.c.u.!`k``s``siv`k``s``si`k`d``.n`.a`.t`.s`.r`.e```s.u.n`. `.t`.'`.n`.o```s.I```s.i.d`.a`.r`.f`.a```s`.I.'.m. .d..`k``s``si`k`d`.w``.h`. `.w```s.k.n`. `.t`.'`.n```s`.I. .d.o..`k``s``si`k`d`.t`.a`.h`.w`. `.n`.O.?`d`k````s``s`kski``s`k`s``si`k`d`.e`.r`.a``.s`.g`.n`.i`.h`.t```s.t.e`.o`.m`.e`.r```s.r.e`.e`.h`.w```s.o.u`.y``.l`c``. ```s```s.c.a`. `.I`. `. `..`.s`.g```s``r`.e```s.l`.u`.p`.i`.n```s`.d`.n`.a```s.u.t`.o`.b`.a```s.v.e`.o`.m```s.o.u`.y```s.a.s``.e`c``.u`.o`.y```s.a.t`.h`.w```s.o.u`.y```.t`. `.y```s.o`. ```s`. `.I.c.a.n.l`c.e. .s. .m.a.t.h.i.n.o.t.e. ..k````s``s`kski``s`k`s``si`k`d`.h`.E.?kv`kk`kr`ki`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk`k``s``si`k``s``s`k`ki``s``s``s``s``s``s``s``si`kk`kk`kk`kk`kk`kk`kk`ki``s`d`k``ki``.?`.t`.a`.h`.w`. ri`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`k`ki`k`ki`k``si`ki`d`k````s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski``s`k`sik`kiv`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k``si`ki`k`d`k````ci```ss``ss`ki``s`ksk``s`k`sik`kiv`ki``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s``s``s``si`kk`kk`kk`kk`kk`k`ki`k`k`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss```ss`ss``ss`ki``s`kskk``s`k`s`d`k``ki``.o`.n``.e`c`. `.I.s. i``s``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`kk`k`kk`k`kk`k`kk`k`ki``s`k`s`d`k``ki``..``.r```s. .h.eri``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk`ki`k``s``si`k``s`k``s`k``s`k``s`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk``ci``s``s`kski``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k``s``s`ksk``ci``s``s`kskik``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s``s``s``si`kk`kk`kk`k`ki`kk`kk`k`ki``s``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss`k```s`cii``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`ki`k`ki``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss`k```s`cii``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss`k```s`cii``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`kr`k`ki``s``s`ks``s`k`s`d`k```sii``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ksk`k`k`k`ki`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ksk`k`kk`k`k``si`k`ki`k``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`k`kk`k`k`ki`k`k`ki``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`k`ki`k`kk``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s`k`s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`k`ki`k`ki`k``s`k`s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk``s`kk``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k``si`k`ki`k`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k````s``s`kski``s`k`s``sivk``s``si`ki`d`k``````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`kiv`k`kk`k`k`ki`k`k`k`ki`k`ki`kk`k`k`k`ki`k`k`ki``s``s`ks``s`k`s`d`k```sii``s`k`s``s`ksk``s`kk``s`k`s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`ki`k`ki`k`ki``s`kk``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k`s`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`kskk`ki`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`ki`k`kikk`ki``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``s``s``s``si`k`ki`kk`k`ki`kk`kk`k`ki`k`ki`k`kiv``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s``s``s``s``s``s``si`k`ki`kk`k`ki`kk`kk`k`ki`k`ki`k``si`ki``s``s``s``s``si`k`ki`kk`kk`k``s`k`sik`k`kiv``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k`kik`ki``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k`ki``si``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`k`ki`k`k``s``siv`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``si`kik``````s``ss``ss`ki``s``ss`k```si``s`k`s``s`ksk`ci``s``s`kskis``s`kski``s`k`s``sivk``s``si`ki`d`k`````ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k````ci``s``s`kski``s`k`s``sivk````s``s`kski``s`k`s``si`kikv`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s``s`kski``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki`k`k`ki``s`kk``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k```s``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``si`k`ki`kk`kk`k``si`ki`d`k```ki``s`k`sik`kiv``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```si``si``s``ss`k`ci``si`ki`s``s`kskk``s``s`ks``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`k`ki`k`k``s``siv`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``si`kik``````s``ss``ss`ki``s``ss`k```si``s`k`s``s`ksk`ci``s``s`kskis``s`kski``s`k`s``sivk``s``si`ki`d`k`````ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k````ci``s``s`kski``s`k`s``sivk````s``s`kski``s`k`s``si`kikv`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s``s`kski``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki`k`k`ki``s`kk``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k```s``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s`k`s`d`k`````si``s``si``ss`k`ci``si`ki`s``s`ksk``s`k`sik`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sikv``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`kk``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s``s``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`kk`k`ki`kk`k`ki`k`kik`k``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```si``s``ss`k`ci``si`ki`s``s`kskk``s`kk``s``s`ks``s`kk``s`ks``s``s`ksk`k`k`d`.t`.i`.p``.a```s.t.o`.n`.i```.f`. `.y```s.k.e`.i```s.t`.s`.o`.m``.l`c`.w``.u`.o`.y```s.e.d`.e`.c`.o`.r`.p```s.o.u`.y```s````s.k..`.r`.a`.d```s.c.h`.t`.i`.p```s.o.w`.n```s.i.s```s.I.t. .I.f. .i. .l`c.a. ..`kk`k`k`ki``s`kk``s`k`s`d`k`````ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`sikv``s``s`ks``s``s`ks``s`k`s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k`ki`k`k``s`k`sik`k`k`ki``s`kk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`d````ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`k`ki`k`k``s``siv`k``s``si`k``s``si`k`d`.y````s``.a```s.w`.o`.d`r`.d```s. .a`.g```s.d`.l```s``.e`.h`.t```s.o.f```s.u.t`.o```s.w.s`.o`.l`.f```s.a.m`.e`.r`.t`.s``.l`c`.m``. `.A`. `. `..`.t```s`.o`.f``.a```s.i.s```s.o.u`.y```s`.u`.o`.r`.A`r`..`.g```s.d`.l```s``.k`.c`.i`.r`.b``.l`c`.m`.s``.a```s`.o`.f`.e`.b`. `.d`.a`.o```s.a```s.o.f```s.n.d`.e```s.h.e`.t```s.a.t```s.n.g`.i`.d`.n`.a`.t`.s```s.r.e`.a```s`.Y.o.u. .r.e. .a. .b.u.i.n.d. .r.e.s.a. .b.u.i.n. .g.u.l..`k`d`.n`.i``.g```s.d`.a`.o`.r```s.o.f```s.n.d`.e```s.a.t```s`.'`.u`.o`.Y.r.e. .a..`k``s``si`k``s``si`k`d`.e`.c`.n`.a`.t`.s``.d`. `.e`.h`.t`. `.n```s.g. `.n```s.l.d```s``.a```s.i.s```s.r```s````s.l..`.l`.i`.h```s.h.e`.t```s.o.f```s.d.e`.i`.s```s.e.r`.h`.t`.o```s.h.e`.t```s.w.n`.o`.d`r`.k`.c`.a`.b```s.e.s`.p`.o`.l`.s```s.a.d`.o`.r```s`.T````s.t..`.s`.e`.r`.o`.f```s.h.e`.t```s.i.n``.l`c`.t`.s`. `.,`.l`.l```s`.a```s.u.p```s.e.d`.k`.l`.a`.w```s.v.e`.a`.h```s`.Y.o.u. .h.i. .h.e. .T.h.e. .b.u.i..`k`d`.d`.a`.o`.r``.n`.i``.l`c`.h``.t`.a```s`.'`.u`.o`.Y.r.e. .i. ..`k``s``si`k``s``si`k`d`.g`.n`.i``.p`.s`. `.e`.g```s``.a```s.o.r`.f```s.s.e`.u`.o`.h``.l`c`.w``.a```s`.n``.d`.l```s``.a```s.d.e`.i`.s`.n`.i```s.r.e`.a```s`.Y.o.u. .b.u.i.g.,. .e. .l.a.r..`k`d`.g`.n``.d`.l```s.b.u`. `.e`.d```s.n.s```s`.r`.'`.u`.o`.Y.e. .i..`k``s``si`k``s``si`k`d`.d`.e`.b`. `.y`.k`.c``.r`r`.a`. `.g`.n```s.a`. `.g`.n`.i```s`.u`.t`. ```s`.r`.t`.s`. `.a`. ```s.i.d`.s```s. .b`.t`.s```s.o.r`.f`. ```s.t.h`. `.n`.i`. `.y``.l`c`.v``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .a.e.a.m.b.l.o..`k`d`.y`.e````s``.n`.i```s`.'`.u`.o`.Y.r.e. .v.a.l..`k``s``si`k``s``si`k`d``.d`.i`.s`. ```s.o.n`. `.o`.t`. `.y``.l`c`.v`. `.p````s`.a```s.t.h`.i`.w```s.t.,`.s`.e`.r`.o`.f```s.e.n`.p`.o```s.i.n```s.r.e`.a```s`.Y.o.u. .d.e.a.e..`k`d`.t`.s`.e``.o`.f`. `.n`.i`. `.e```s`.o`.Y.u.'.r..`k``s``si`k``s``si`k`d`.d``.o`.r`. ```s.d. `.n```s.y. `.e`.l`.l```s`.a```s.t.h`.o`.b```s.a.r`.e`.n```s.s.t`.e`.r`.o`.f```s.e.n`.p`.o```s.i.n```s.r.e`.a```s`.Y.o.u. .v.a..`k`d`.t`.s`.e``.o`.f`. `.n`.i`. `.e```s`.o`.Y.u.'.r..`k``s``si`k``s``si`k`d`.k`.c`.o`.r``.e`.r`.a`.b```s.i.s```s`.b`.m`.a```s`.s`. `.e`.h```s.m. `.a`.e`.r```s`.w`.o`.D````s.k..`.c`.o`.r```s.h.e`.t```s`r`.t```s.s.l`. `.h`.c`.n```s``.a```s.t.o`.n`.i```s.e`.h```s.l.a`.p```s.m`.a`.e`.r`.t`.s```s.h.e`.t```s.o.f```s.e.r`.t`.a`.w```s.h.e`.t``.l`c``.t`.e`.e`.f```s.u.r`.o`.y```s.A.t. .a. .s. .2.-.i.n. .n.s.t.r.e.d. ..`k`d`.d``.b`.m`.a```s`.s``.n`.i```s.i.t`.l`.s```s.a.t```s`.'`.u`.o`.Y.r.e. .t.r.e..`k``s``si`k``s``si`k`d`.n`.o`.i````s.r`.p```s. .d```s.t.h`. `.o`.t`.n`.i`. `.s`.d`.a```sr.l`.d```s.m.b`.a```s`.s``.y`.r`.d```s```s`.t```s`.n`.o```s.n`.i```s.e.d`.t`.n`.u`.o`.m```s.t.e`.a`.r`.g```s```s`. `.g`.n`.o`.r`.t```s.a```s.i.s```s.r`.i`.d`r`.e`.h```s.o. ```s.i.n`. ```s.S.e`. `. `..```s.i`.d`. `.e```s.b.a`. `.h`.t`.i`.w`. `.d`.e```.f`. `.n```s```s.r`.p```s`.t````s`.0`.2``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .-.f.o. .d.e.s.i.o`c.l.r.t. .s.t.e.l. .c.r.e... .A. .t.r.e.s..`k`d`.e``.a`.r`.g`. `.e`.d`.i`.s```s.o`. `.e`.r`.'```s.Y.o.u.t..`k``s``si`k``s``si`k`d`.t`.s`.e`.w``.e`.h`.t```s.t.o```s`.r``.w`.n`.i`. `.s`.d```s`. `.s`.e``.b`c`.c``.r`.e`.v`.o```s.w.l`.a`.r`.c```s.o.w`.l```sr.A`..`.e`.c`.a`.f`.r`.u`.s```s.h.e`.t```s.t.o```s.t.e`.a`.r`.g```s.e.l`.e`.t`.s```s.x```s.a```s.t.h`.a`.e`.n`.e`.b```s.e.r`.b`.m`.a`.h`.c``.l`c`.m`.s``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .a. .3. .o.l.e.a.d.s. ..`k`d``.t`.a`.r`.g`. ```s.t.h`. `.w`.o`.l```s. .b```s`.u`.o`.Y.'.r.e..`k``s``si`k``s``si`k`d`.e`.g``.s`.s```s`.e`.h`.t```s.o.f```s.n.d`.e```s`.a``. ```s`. ```sr.a```s``.l`. `.m```s`.a```s.i.s```s.r```s````s.e..`.g`.a`.s`.s`.a`.p```s``. `.a`. `.n`.i`. `.s`.e``.b`c`.c``.r`.e`.v`.o```s.n.g`.i`.l`.w`.a`.r`.c```s.r.e`.a```s`.Y.o.u. .o.l.o.w. .T.h.e. .d.i.g.h.t.h.e.s.t. .p.a..`k`d``.w`.a`.r`.c`. `.e``.b`c`.c``.n`.i```s`.'`.u`.o`.Y.r.e. .o.l..`k``s``si`k``s``si`k`d`."``.Z`.Z```s`.D`.R`.O`.W```s.I.C`.G`.A`.M`."```s.y`.a```s```s``.e`.h`.t```s.o.n```s.t.e`.o`.n```s```s.t..`.s`.e`.w```s.n.d`.a```s.r.d`.a`.w`.p`.u```s.d.s`.a`.e`.l```s.o`.y```s.c`. `.d`.r```s.k.w`.w```s.n`.a```s.u.t`.b```s`.r```sr.h`.s`.i`.r`.b```s. ```s.a.n`. ```s.m.u`. `.h`.t`.i`.w`. ```s```s`.p`. `.s`.e`.m`.o`.c`.e`.b`. `.s`.e``.b`c`.c``.h`.t`.i`.w```s.g.e`.a`.s`.s`.a`.p```s.d.e`.i`.w```s.o.w`.l```sr.A`..`.e`.c`.a`.f`.r`.u`.s```s.h.e`.t```s.o.m`.r`.f```s.i.n```s.e.d`.h`.s`.a`.w``.f`c`.t`.s``.h`.t`.i`.w```s.e.d`.l`.l`.i`.f```s```s. `.s`.i```s`.d``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .e.b.r.o.m. .u. .o.l.u.g.e.d.e.,. .a.n. .A. .w.a.lr.s. .X.Y..`k`d`.m````s. `.s`.i```s.e.b`.d`. `.n`.i`. `.e```s`.o`.Y.u.'.r.o..`k``s``si`k`k`d``.o`.y```s``.t`.s`.e`.w`./`.t`.s`.a`.e```s.n.g`.i`.p`.o`.l`.s```s.r.d`.a`.w`.k`.w`.a```s.a.n```s.i.n```s.r.e`.a```s`.Y.o.u. .c.a.n..`k``s``si`k``s``si`k`d`.r`.e`.b`.m`.a`.h`.c``.e`.h`.t```s.o.f```s.e.s`.d`.i`.s```s.s.t`.e`.w```s``. `.t`.s```s. .e`.m`.o`.r`.f`r`.t`.i`.x`.e`. `.e`.g``.s`c`.p`. `.d````s`.a```s`.a`. ```s.y.o```s.c`. `.d`.r```s.k.w`.w```s`.A````s.e..`.n`.o`.t`.s```s.g.e`.n`.a`.r`.o```s.o.f```s`.e`.v`.i```s.nr`.e`.z`.o```s`.e`.r`.a```s.l.s`.l`.a`.w```s`.T````s.h..`.g`.i`.h```s.e.t`.e`.f```s.t.y`.r`.i`.h`.t```s.e.r`.b`.m`.a`.h`.c```s.i```s`.l`.p`.s``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .e.n.d. .h.e. .f.r.s. .n. .a.n.d. .g.o.a.a.n.d. ..`k`d``.e`.b`.m`.a`.h`.c`. `.d```s.b.i`. `.n`.i`. `.e```s`.o`.Y.u.'.r..`k``s``si`k``s``si`k`d`.n`.o``.g`.n`.i`.d`.a`.e`.l```s.c.k`.a`.r`.c``.l`c`.m`.s``.a```s.o.r`.f```s.p.t`.e`.c`.x`.e```s.r.e`.e`.h```s`.n``. ```s`.s`.s```sr.p`.t`.s```s`.n`.A````s.t..`.s`.i`.m```s.t.e`.i`.h`.w```s.o.f```s.e.s`.c`.a`.r`.t```s.n.g`.i`.h`.t`.a`.e`.r`.b```s.i.t`.p``.l`c`.m`.s``.a```s.i.s```s.e.t`.e`.f```s.u.r`.o`.y```s.A.t. .a. . .e.a.g.e.d.s. .a. ..`k`d`.t`.i`.p``.l`.l`.a`.m`.s```s.o.f```s.o.p`.t```s.a.t```s`.'`.u`.o`.Y.r.e. ..`k``s``si`k``s``si`k`d`.u`.o`.y`. ``.n`.i`.h`.e`.b`. `.e`.m`.o```s.a```s.o.f```s.o.p`.t```s``. ```s. `.e`.g``.s`c`.p``.a```s.i.s```s.r```s.T.h`. `. `..```s`.c`.r`.i```s.s`r`.e`.h```s.p`.u```s.w.s`.o`.l`.b```s.n.d`.i`.w```s.l.d`.o`.c```s```s.e..`.v`.i`.l`.a```s.i.f```s.a.s```s.s.t`.o`.m`.l`.a```s.r.o`.f```s.n.d`.a```s.t.o```s.n.g`.i`.y`.a`.w`.s`r`.t`.s`.i`.m```s.t.e`.i`.h`.w```s.o.f```s.p.s`.s`.i`.w```s.t.h`.i`.w```s.e.d`.l`.l`.i`.f```s.i.s``.l`c``. `.e```s```s`.r`.a`.w`.n`.w`.o```s.s. ```s`.l`. ```s.a`.c`.r`.i`.a`.t```s.er`.n`.o`.t```s.e`.d`.i`.w```s. `.,`.y`.b`.r```s````s.e..`.d`.i`.s```s.e.r`.h`.t`.i`.e```s.t.o```s.g.s`.n`.i`.n`.e`.p`.o```s.r.e`.a```s.r```s````s.t..`.s`.e`.w```s.h.e`.t`r`.o`.t```s.h.t`.g`.i`.s```s.o.f```s.u.t`.o```s.r.d`.a`.w`.r`.o`.f```s.n.g`.i`.h`.c`.t`.e`.r`.t`.s``.l`c`.h`. `.t`.s```s`.a```s.o.f```s.n.d`.e```s.n.e`.o```s.a.t```s.r.e`.a```s`.Y.o.u. .v.a. .T.h.e. .N.e.a. .s.e.a.d... .T.h.a. .A. .t.a.s.e. .a.a.t.h.e. .d..`k`d``.t```s``.f`.o``.l`c`.H``.n`.i```s`.'`.u`.o`.Y.r.e. .a. .M.i.s..`k``s``si`k``s``si`k`d`."``.p`.e`.t```s.e`.h`.t```s.u.p```s.i.t```s.e.t`.g```s.'.t`.n`.o`.w```s.o.u`.Y`."`r`.,`.s`.y`.a`.s```s.t`.o`.n`. ```s````s.l..`.l`.a`.w```s.h.e`.t```s.o.n```s.t`.o`.n`. ```s`.r`.c``.a```s.t.h`.i`.w```s```s. .r`.w```s`.a```s`. `.s```s.T.h.i.s. .l.o.m. .u.d.e. .T.h.e. .s..`k`d`.m````s`.d`.l`.o`.g```s.o.f```s````s.n`. `.n`.i`. `.e`.r`.'```s.Y.o.u.g.e.t. .r.o..`k``s``si`k``s``si`k`d`.p`.m`.u`.j``.o`.t```s.d.e`.i`.w``.o`c``.s`.i```s.r.e`.u`.s`.s`.i`.f```s.h.e`.t```s.n.d`.a```s.e.,`.r`.e`.h```s.c.k`.i`.h`.t```s.t.e`.i`.u`.q```s.i.s```s.s.t`.i`.m```s.h.e`.T`r`..`.l`.l`.a`.h```s.h.e`.t``.s`c`.r`.c`.a``.r`.a`.e`.l`.c```s``.c```s.s.l`. `.e`.r`.u`.s`.s```s`.a```s.o.f```s.n.k`.a`.b```s.s.t`.a`.e```s.h.e`.t```s.o.n```s.r.e`.a```s`.Y.o.u. .f.i.n.g. .o. .t. ..`k`d`.e`.r`.u````s``.f`.o```s.n.k`.a`.b```s.s.t`.a`.e```s.o.n```s`.'`.u`.o`.Y.r.e. .f.i.s..`k``s``si`k`k`d``.t```s``.f`.o``.l`c`.H``.e`.h`.t```s.i.n```s.r.e`.u`.s`.s`.i`.f```s.h.e`.t```s.o.f```s.d.e`.i`.s```s.s.t`.e`.w```s.h.e`.t```s.o.n```s.r.e`.a```s`.Y.o.u. .a. .M.i.s..`k``s``si`k``s``si`k`d`.r````s``.e`.h`.t``.f`c`. `.t````s. .f`.6`. ```s.a.g`.s`.s`.a`.p`r```s.t`.t`.i```s.a```s.i.s```s.t.h`.u`.o`.s```s.h.e`.t```s````s.h..`.t`.r`.o`.n```s.e.s`.o`.g```s.e.r`.h`.t`.o`.n`.a```s.n.d`.a```s``.w`. `.s```s`.i`.t```s`r`.l`.w`.a`.r```s.e`.d`.i`.w```s.o.w`.l```s```s.s..`.t`.s`.i`.M```s.o.f``.l`c`.H``.e`.h`.t```s.o.f```s.n.d`.e```s.s.t`.e`.w```s.h.e`.t```s.a.t```s.r.e`.a```s`.Y.o.u. .a. .A. .c.o.n.u.e.s.t. .T.o. .l.e.o. .f.l.o..`k`d``.t```s``.f`.o``.l`c`.H``.f`.o```s.n.d`.e```s.s.t`.e`.w```s.a.t```s`.'`.u`.o`.Y.r.e. .a. .M.i.s..`d`k`````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``si`k`k`d`.e`.k`.i`.l``. `.l`.l```s.,. `.s`.e`.g``.s`c`.p`. `.e`.l````s.l.i`. `.y```s.i.s`.w```s.f`.o```s`.a`.m``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .z.e. .t.a.a..k``s``si`k``s``si`k`d``.e`.v`.e```s.s`.i`.h`.t```s.a.t```s`.u`.n`.i`.t`.n`.o`.c`. ```s.a.z`.m`. ```s````s.p..`.u`r`.k`.c`.a`.b```s.e.t`.g```s.o.t`.n```s.l.d`.u`.o`.c```s.o.u`.y```s.u.t`.b```s.r.e`.e`.h```s.w.n`.o`.d```s`.i``.c`. `.d```s`.c`. `.u```s```s.l..`.l`.a`.w```s`.o`. ```s.o.w`.d`r```s.u.m`.l`.o`.c`. `.e`.g```s.r`.o`. `.e`.v`.i`.s`.s```s`.a```s`.i`.w`. ```s.p.i`. ``.o`c`.-`.y``.r`.i`.h```s.a```s.o.f```s.n.k`.i`.r`.b```s.h.e`.t```s.o.n```s.r.e`.a```s`.Y.o.u. .t.f.t.h. .m.a.n.e. .Y.o.u.l.m.b. .T.h.e.s. .l..`k`d`.t`.i`.p``.f`.o```s.n.k`.i`.r`.b```s.a.t```s`.'`.u`.o`.Y.r.e. ..`k``s``si`k``s``si`k`d`.n`.w`.o`.d`. `.s``.n`.a`.l`.s`. `.e`.l`.o`.h`. ```.-```s.t.w`. `.d`.n`.u```sr.r`.a`. `.h`.t`.r```s. .n`.e`.h`.t`. ```s```s.p..`.u```s.t.s`.n`.a`.l`.s```s.w.l`.a`.r`.c```s`.i``. ```s``.a```s.s.t`.a`.e```s.h.e`.t```s````s.s..`.r`.e`.b`.m`.a`.h`.c`r`.e`.d`.i`.s```s.u.t`.o`.h`.t`.i`.w```s.l.y`.t`.n`.e`.r`.a`.p`.p`.a``.l`c`.h``.g`.n`.o`.l```s`.e`.v``.a```s.o.f```s.n.d`.e```s.s.t`.a`.e```s.h.e`.t```s.a.t```s.r.e`.a```s`.Y.o.u. .r.y. .a. .T.o. .l.o.w.d.e. .T.o`c.f.t..`k`d````s``.g`.n`.o`.l```s.o.f```s.n.d`.e```s.s.t`.a`.e```s.a.t```s`.'`.u`.o`.Y.r.e. .h.a.l..`k``s``si`k``s``si`k`d`.e`.g``.s`.s```s`.h`.t`.u``.s`./`.h`.t`.r```s. .n`.w``.r`c`.n``.a```s.t.h`.i`.w```s.u.p```s`.i`.o`.j`r````s`. `.e```s```s.l..`.l`.a`.h``.s`c`.l```s.u.r`.t`.a```s. .f`.g`.n`.o`.l`. `.y`.r```s`.a```s.o.f```s.n.d`.e```s.s.t`.e`.w```s.h.e`.t```s.a.t```s.r.e`.a```s`.Y.o.u. .v.e. .T.h.a.l.n.s. .a.o. .p.a..`k`d````s``.g`.n`.o`.l```s.o.f```s.n.d`.e```s.s.t`.e`.w```s.a.t```s`.'`.u`.o`.Y.r.e. .h.a.l..`k``s``si`k`k`d`.t`.n``.r``.f`c`.d`. ````s. `.,`.s`.e`.g``.s`c`.p`. `.e`.l````s.l.i`. `.y```s.i.s`.w```s.f`.o```s`.a`.m``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .z.e. .t.a.a.l.i.e..`k``s``si`k`k`d`.t`.n``.r``.f`c`.d`. ````s. `.,`.s`.e`.g``.s`c`.p`. `.e`.l````s.l.i`. `.g`.n`.i```s.i.s`.w```s.f`.o```s`.a`.m``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .z.e. .t.a.a.l.i.e..`k``s``si`k`k`d`.t`.n``.r``.f`c`.d`. ````s. `.,`.s`.e`.g``.s`c`.p``.y`.t`.s`.i`.w`.t```s.o.f```s.z`.a`.m`. ```s.t`.t`.i```s.a```s.i.n```s.r.e`.a```s`.Y.o.u. .l.e. .a.a.l.i.e..`k``s``si`k`k`d`.t`.n``.r``.f`c`.d`. ````s. `.,`.s`.e`.g``.s`c`.p``.e`.l`.t`.t`.i`.l```s.o.f```s.z.e`.a`.m```s`.i``.s`.i`.w```s.a```s.i.n```s.r.e`.a```s`.Y.o.u. .t.n.g. .a.a.l.i.e..`k``s``si`k`k`d`.t`.n``.r``.f`c`.d`. ````s. `.,`.s`.e`.g``.s`c`.p``.f`.o```s.z`.a`.m`. ```s```s.l.i`. `.g`.n`.i```s.i.s`.w```s.a```s.i.n```s.r.e`.a```s`.Y.o.u. .t.l.e. .a.a.l.i.e..`k``s``si`k`k`d`.t`.n``.r``.f`c`.d`. ````s. `.,`.s`.e`.g``.s`c`.p``.f`.o```s.z`.a`.m`. ```s```s.l.i`. `.y```s.i.s`.w```s.a```s.i.n```s.r.e`.a```s`.Y.o.u. .t.l.e. .a.a.l.i.e..`k``s``si`k`k`d`.t`.n``.r``.f`c`.d`. ````s. `.,`.s`.e`.g``.s`c`.p``.e`.l`.t`.t`.i`.l```s.o.f```s.z.e`.a`.m```s`.s`.i`.w```s.a```s.i.n```s.r.e`.a```s`.Y.o.u. .t.y. .a.a.l.i.e..`k``s``si`k`k`d`.t`.n``.r``.f`c`.d`. ````s. `.,`.s`.e`.g``.s`c`.p``.f`.o```s.z.e`.a`.m```s.t.y`.s`.i`.w`.t```s`.t`.t`.i```s.a```s.i.n```s.r.e`.a```s`.Y.o.u. .l.e. .a.a.l.i.e..`k``s``si`k`k`d`.t`.n``.r``.f`c`.d`. ````s. `.,`.s`.e`.g``.s`c`.p``.g`.n`.i`.t`.s`.i`.w`.t```s.l.e`.t`.t`.i`.l```s.o.f```s`.a`.m``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .z.e. .a.a.l.i.e..`k``s``si`k`k`d`.t`.n``.r``.f`c`.d`. ````s. `.,`.s`.e`.g``.s`c`.p``.y`.t`.s`.i`.w`.t```s.l.e`.t`.t`.i`.l```s.o.f```s`.a`.m``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .z.e. .a.a.l.i.e..`k``s``si`k`k`d`.t`.n``.r``.f`c`.d`. ````s. `.,`.s`.e`.g``.s`c`.p``.g`.n`.i`.t`.s`.i`.w`.t```s.o.f```s.z`.a`.m`. ```s.t`.t`.i```s.a```s.i.n```s.r.e`.a```s`.Y.o.u. .l.e. .a.a.l.i.e..`k``s``si`k`k`d``.n`.e`. ```s`.D.e.a.d..`k``s``si`k`k`d`.e`.n`.o``.W`./`.E```s.o.w`.l```s. `.d`.n```s.e. `.g``.s`c`.p``.S`./`.N```s.g`.i```s.a```s`. `.r`.e`.v``.s`c`.r`.c``.a```s.a.t```s.r.e`.a```s`.Y.o.u. .o.o.f. .h. .a.a. ..`k``s``si`k``s``si`k`d`.s`.n`.o``.t`.c`.e`.r```s````s`.n`.i``.f`c``.s`.e`.g`.a`.s`.s`.a`.p```s.t.h`.i`.w```s.g.,`.n`.i`.K```s.i.n`.a`.t`.n`.u`.o`.M```s.h.e`.t```s.o.f``.l`c`.H``.e`.h`.t```s.i.n```s.r.e`.a```s`.Y.o.u. .a. .o. .a.lr.d.i..`k`d`.g`.n`.i`.K``.t`.M```s.o.f``.l`c`.H``.n`.i```s`.'`.u`.o`.Y.r.e. .a. ..`k``s``si`k``s``si`k`d``.r```s`.p`.u```s.n.d`.a```s.s.t`.e`.w```s.e.s`.u`.n`.i`.t`.n`.o`.c```s.g.e`.a`.s`.s`.a`.p```sr.A`..`.g`.n`.i`.K```s.i.n`.a`.t`.n`.u`.o`.M```s.h.e`.t```s.o.f``.l`c`.H``.e`.h`.t```s.o.f```s.e.r`.b`.m`.a`.h`.c```s.d.e`.i`.s```s.s.t`.e`.w```s.h.e`.t```s.i.n```s.r.e`.a```s`.Y.o.u. .a. .h.e..`k`d`.r``.b`.m`.a`.h`.c`. ```s.i.d`.s`. `.t`.s```s. .w`.n`.i`. ```s`.u`.o`.Y.'.r.e..`k``s``si`k`k`d`.r`.e`.b`.m`.a`.h`.c``.e`.d`.i`.s```s.t.h`.u`.o`.s```s.h.e`.t```s.i.n```s.r.e`.a```s`.Y.o.u. ..`k``s``si`k``s``si`k`d`.e`.g``.s`.s```s`.W`./`.E```s.a.n```s.t`. `.n`.w```sr.d`.s`.e```s. .g`.e`.l```s. `.e```s```s.r..`.o`.o`.l`.f```s.h.e`.t```s.i.n```s.l.e`.o`.h```s. `.t```s.e. `.g``.s`c`.p``.S`./`.N```s`.l``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .o.w. .a.a. .T.h.o. .p.a..`k`d`.e`.g``.s`.s```s`.S`./`.N```s.i.n```s`.'`.u`.o`.Y.r.e. .p.a..`k``s``si`k``s``si`k`d`.r``.t`.n```s`.s`.'`.m`.o`.o`.r```s.h.e`.t```s.i.n```s.c.k`.o`.r```sr.a`.n`.o```s.2."`.Y`."```s`.r`.a`.l``.a```s.i.s```s.r```s````s.t..`.s`.a`.e```s.h.e`.t```s.t.o```s.c.k`.o`.r```s.e.n`.k`.o`.r`.b```s.o.f``.l`c`.w`. ```s.d. `.n```s.,. `.t`.s`.e`.w`r`.e`.h`.t`. `.o`.t`. `.e`.g``.s`c`.p``.a```s.h.,`.t`.u`.o`.s```s.h.e`.t```s.t.o```s``.s`.s```s`.a```s.t.h`.i`.w```s````s. `.e`.g```s``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .l.a.r.o.m.,. .p.a.g.e. .a.a. .T.h.e. .g.e. .c.e..`k`d``.2`.Y```s.t`.a```s`.'`.u`.o`.Y.r.e. ."..`k``s``si`k`k`d`.e``.e`.h`.w`.y```s.v```s.s`.k`.c`.a`.r`.c```s.t.h`.i`.w```s.k.,`.c`.o`.r```s.o.f```s`.b`.m`.u`.j``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .l.e. .e.r..`k``s``si`k``s``si`k`d`.u`.o`.y``.t`.a```s.c.k`.a`.b```s`.i`.r`.e`.e`.p`. `.e`.r`.e`.h`.t`. ``.e`c``.e`.b```s.a.n`.c```s.r.e`.u`.g`.i`.f```s.w.y`.o`.d`.a`.h`.s```sr.A`..`.m`.o`.o`.r```s`.t`.h`.g``.l`. `.a`. `.o`.t`.n```s.g. `.n```s```s. `.w`.o`.d`.n`.i`.w`. `.r`.a```s.m```s`.a```s.i.s```s.r```s`. `.y`.a`.w`.a`. ``.e`c``.5`.2`r`.d`.n`.a```s.o.u`.y```s.o.m`.r`.f```s.i.t`.p```s.h.e`.t``.s`c``.c`.a`. `.y`.l`.t`.c`.e```s````s`.l`.t``.e`.c`.e`.r`. `.e`.r`.e`.h`. ```. `.s`.a`.h`. ```s`.e`.m```s``.a`.h```s.e. ```s``.d`.n```s.o`.t```s.e.m`.e`.s```s.l.d`.u`.o`.w```s.o.w`.d`.n`.i`.w```s.h.e`.t```s.n.d`.u`.o`.r`.a```s.s.t`.u`.d```s.h.e`.t```s.i.n```s.k.s`.r`.a`.M`r`..`.t`.h`.g`.i`.r```s.h.e`.t```s.t.o```s.e.r`.k`.c`.i`.h`.t```s.n.g`.i`.m`.o`.c`.e`.b```s.t.,`.i`.p```s.h.e`.t```s.o.f```s.o.r`.o`.l`.f```s.h.e`.t```s.e.r`.v`.o`.c```s.s.t`.i`.m```s.t`.i`.h`.w`r`.f`.o`. `.s```s`.r`.T````s.w..`.o`.l`.e`.b```s```s. .f`.0`.5`. `.r```s.o.v`. ```s``.s```s. .v`.y`.l`.t`.c`.n```s.s.t```s.n.d```s.s`.i```s.o.r`.o`.l`.f```s```s.t..`.h`.g`.i`.s`r`.f`.o```s.u.t`.o```s.u.p```s.d.s`.n`.e`.t`.x`.e```s.c.h`.i`.h`.w```s.t.,`.i`.p```s`.u`.h`. `.a`. ```s`.k````s.r.l`.e`.v```s.w. ```s.n.d`.i`.w`. `.w```s`.a```s.a.t```s`.'`.u`.o`.Y.r.e. .l.o.i.n.g.e. .A. .i.b.l.e.t. .a.c.e. .i.c.a.tr.s.o.n.e`c.b.n.y... .D.i.r.o. .f.t.h.e. .s.i.l.o.k.i.e.d. .s.n.g. ..`k`d`.t`.i`.p``.n`.o```s.o.w`.d`.n`.i`.w```s.a.t```s`.'`.u`.o`.Y.r.e. ..`k``s``si`k``s``si`k`d``.g`.a`.s`.s`.a`.p`. `.r```s``.n`.a`. ```s. .t`.e`.l```s`.a```s.i.s```s.o.u`.y```s.v`.o`.b`.A`. `. `..```s`.s`.s```s. .p`.e`.g`.r```s`.a```s.i.s```s.s.t`.e`.w`r`.e`.h`.t```s````s`.w`.a`.r`.c``.a```s.i.s```s.s.t`.a`.e```s.h.e`.t```s````s`.g`.a`.s`.s`.a`.p`. `.n```s``.b`. `.y`.t```s``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .d.i.r.o.k.e... .T.o. .l... .T.o. .l.a.g.e. .h.o.t.h.e..`k`d`.e`.g``.s`.s```s`.y`.t`.r`.i`.d```s.i.n```s`.'`.u`.o`.Y.r.e. .p.a..`k``s``si`k``s``si`k`d`.t`.s``.w`r`.s`.d`.a```s`.l`.w`.a`.r`.c```s```s.t..`.i`.p```s.l.e`.b`.a`.b`.m`.i`.l`.c```s.a.n`.e`.l`.c``.l`c`.m`.s``.a```s.o.f```s.n.k`.i`.r`.b```s.h.e`.t```s.o.n```s.r.e`.a```s`.Y.o.u. .a. .A. .l.e..`k`d`.t`.i`.p`. `.n`.a`.e`.l`.c``.a```s.b.y```s`.'`.u`.o`.Y.r.e. ..`k``s``si`k``s``si`k`d``.t`.i`.l```s.y`.n`.i`.t```s.g`.u`.o`.r```s. `.s```s``. `.d`.n`.a`. `.s`.r```s.n.t```s.hr`.c`.i`.h`.w`. `.,`.m`.a```s.t.r`.s`. ```s.t`.t`.i```s.a```s.t.h`.i`.w```s.i.t`.p``.l`c`.m`.s``.a```s`. `.m``.t`c`.b``.e`.h`.t```s.i.n```s.r.e`.a```s`.Y.o.u. .o.o.f. .a. .l.e.x.i.t.h. .s..`k`d`.m`.a`.e`.r`.t`.s``.y`.b```s.i.t`.p```s.i.n```s`.'`.u`.o`.Y.r.e. ..`k``s``si`k``s``si`k`d`.t`.s``.e`. `.g`.n`.i`.d```s.l.e`. `.e`.g``.s`c`.p``.a```s.n.d`.a```s``.e`.h`.w`.y```s.v.e`.e`. `.s`.k`.c`.a```s. .c`.e```s. .a`.e```s.h.e`.T`. `. `..``.o`c`.f``.e`.h`.t`r`.n`.i```s.l.e`.o`.h```s`.b``.a```s.i.s```s.r```s````s.s..`.k`.c`.o`.r```s.t.y`.s`.u`.d```s.o.f``.l`c`.f`. `.m````s. `.e`.g```s``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .l.a.r.o.u. .T.h.e. .i.g. .l.r.e.,. .a.a..`k`d`.m````s`.k`.c`.o`.r```s.t.y`.s`.u`.d```s.i.n```s`.'`.u`.o`.Y.r.e. .r.o..`k``s``si`k``s``si`k`d``.r```s`.p`.m`.a`.d```s.i.s```s.i.r`.a```s`.T````s.e..`.v`.o`.b`.a```s```s. `.e`.g```s``.a```s.s.o`.l`.a```s.i.s```s.r```s````s.t..`.s`.e`.w```s.n`.i`.o```s.er```s.s`.s```s. .p`.g`.n`.i`.k`.l```s`.a```s.k.e`.a`.m```s.t.o```s.s.t`.a`.e```s.h.e`.t```s``.f`. `.l`.w`.a```s. .c```s`.g`.i```s.a```s.n.s`.i`.o`.j```s.t.h`.r`.o`.n`r`.e`.h`.t```s.o.m`.r`.f```s`.a````s.p.a`. ``.e`c`.k`.-`.d```s.-`.s`.d`.n```s`.w`.o`.l```s```s`.o`.i`.t``.n`.u`.j`. `.x`.e`.l`.p`.m`.o```s.a```s.a.t```s.r.e`.a```s`.Y.o.u. .c.n... .A. .h.a.n.s.g.e. .h.e.r.o.m. .w.a.g. .T.h.e. .l.a.r.o.m. .h.e. .h.e..`k`d``.o`.i`.t`.c```s``.x`.e`.l`.p`.m`.o`.c```s.a.t```s`.'`.u`.o`.Y.r.e. .j.u.n..`k``s``si`k``s``si`k`d`.h``.u`.o`.s`. `.e`.h```s.m. `.o`.r`.f`. `.s`.r`.e```s`. ```s````s.p.a`. ``.e`c`.k`.-`.d```s.-`.s`.d`.n```s`.w`.o`.l```s```s.p..`.u```s`.a``.l`r```s.o.n`. `.r```s```s.s`. ```s.h`.w`.e`.m`.o`.s`. ```s.d. `.n```s.,. `.d`.r```s.n```s`. `.s``.e`c``.r`.p`. `.e`.g`.a`.s`.s`.a`.p`. `.w``.l`c`.h`.s`. `.A`r`..``.n`.o`.t`.s`. ```s.t.h`. `.n`.i`. `.d``.d`c`.b`.m```s.s`.l`.l`.e`.h`.s```s.o.f```s.t.s`.i`.b```s.t.h`.i`.w```s`.r``.t`c`.l``.e`.r`.a```s```s.w`. `.d`.n```s````s`. `.e`.h`.T````s.k..`.c`.o`.r```s.r.y`.a`.t`.n`.e`.m`.i`.d`.e`.s```s.o.f```s.u.t`.o```s.e.d`.v`.r`.a`.c```s```s. `.e`.g```s``.a```s.i.n```s`.'`.u`.o`.Y.r.e. .l.a.r.o.m. .f.l.o.rr.a.l.s. .i.e.d. .e.e.a.o.c.d.o.w.a.t.e.p.e.d.s. .A. .h.a.n.s.a.g.e.n.t..`k`d`.m````s````s.h`.S`. `.n`.i`. ```s`.u`.o`.Y.'.r.e.l. .R.o..`k``s``si`k``s``si`k`d`.r``.t`.a`.w`. `.a```s. `.f`.o`. ``.l`c`.m`.s`. `.r`.i`.a`. ```s````s.s..`.i`.r`.b`.e`.d```s.b.y```s.e.d`.k`.c`.o`.l`.b```s.o.w`.n```s.i.s```s.u.t`.b```s.e.,`.r`.e`.h```s.o.m`.r`.f`r`.t`.s`.a`.e```s.n.d`.a```s.u.p```s.e.d`.u`.n`.i`.t`.n`.o`.c```s.c.e`.n`.o```s.g.e`.a`.s`.s`.a`.p```s.a.l`.r`.o`.c```s```s.l..`.l`.a`.h```s.e.d`.h`.c`.r`.a```s.a.n```s.i.n```s.r.e`.a```s`.Y.o.u. .A. .T.h.e.s.e..`k`d````s`. `.d`.e```s`.a`. `.n`.i`. `.e```s`.o`.Y.u.'.r.c.h.a.l..`k``s``si`k`k`d`.s````s.w`. `.p`.r```s.s`. `.d`.e`.g`.g`.a`.r`. ```s`.w`. `.r`.o`.d``.r`c`.c`. `.g`.n`.i`.p```s.s`. `.g`.n`.o```s.a```s.i.n```s.r.e`.a```s`.Y.o.u. .l.o.i.t.h.a.l..`k``s``si`k`k`d````s`.c`.a``.t`.e`.e`.f```s.h.t`.g`.i`.e```s.u.t`.o`.b`.a```s.a`.s`.-`.e`.d`.-`.l`.u```s.a```s.i.n```s.r.e`.a```s`.Y.o.u. .c. .r.o.s..`k``s``si`k``s``si`k`d`.]`.Y`.N`.A`.P`.M`.O`.C``.N`.O`.I`.T`.C`.U`.R`.T`.S`.N`.O`.C``.T`c`.W`.[````s.K..`.S`.I`.R```s.W.N`.O```s.A.T```s```s`.R``r`..`.T`.N`.I`.O```s.S`.I`.H`.T```s.N.D`.O`.Y`.E`.B```s.O.N`.I`.T`.C`.U`.R`.T`.S`.N`.O`.C```s.E.R`.D`.N`.U```s.V.E`.A`.C`."```s.y.s`.a`.s```s`.e`.h`. ```s.a`.d```s. .m`.n```s.n. `.g```s. .s`.A`r`..`.t`.n`.e`.d```s.e.v`. `.e`.r`.a`. `.g`.n``.g`c`.d``.t`.n`.e`.c`.e`.r```s.o.f```s``.a```s`.r`. ```s````s.p..`.u```s.n.d`.a```s.s.t`.e`.w```s`. `.s`.e```s.s`.s```sr.p`.l`.l```s````s.t..`.s`.a`.e```s.h.e`.t```s.t.o```s``.s`.s```s. .p`.e`.g`.r```s`.a```s.t.o```s.n.g`.i`.d`.a`.e`.l```s.o.m`.o`.r`.e`.t`.n`.a```s.a.n```s.i.n```s.r.e`.a```s`.Y.o.u. .l.a.g.e. .S.m.a.g.o. .T.h.e.m.n.t.s. .i.i.r.e. .P.O.C.E.D. .I. ."`k`d`.m````s.e`.t`.n`.a`. `.n`.i`. `.e```s`.o`.Y.u.'.r.o..`k``s``si`k``s``si`k`d`.s`.n`.o``.t`.c`.e`.r```s`."`.l`.l`.a`."```s.i.n``.f`c`. `.d``.e`.l`. `.s`.e`.g``.s`c`.P````s.d..`.n`.E```s.'.s`.t`.t`.i`.W```s.a.t```s.r.e`.a```s`.Y.o.u. .a.a.o. .d.i..`k`d`.d`.n`.E``.s`.'`.t`.t`.i`.W```s.a.t```s`.'`.u`.o`.Y.r.e. ..`k``s``si`k``s``si`k`d`.n`.w`.o`.d``.r`.o```s.p.,`.u```s.h.,`.t`.u`.o`.s```s.h.,`.t`.r`.o`.n```s.c.t`.e`.l`.e`.s```s.o.m`.d`.n`.a`.r```s.a.t```s.r`.o`.l`.p`.x```s.o. `.T`r`..```s.e`.h`.w`.y```s.v```s.s. ```s.o.l`.h`. `.h`.t`.i`.w`. ```s````s.p.a`. `.t```s.w`./`.t`.s`.a```s`.n`.o`.l``.a```s.t.,`.l`.i`.u`.q`.d`.e`.B```s.i.n```s.r.e`.a```s`.Y.o.u. .g. .e.s.a.g.e.r.e. ..`k`d`.t`.l`.i``.q`.d`.e`.B`. `.n`.i`. `.e`.r`.'```s.Y.o.u..`k``s``si`k``s``si`k`d`.k`.c``.l`.b`. `.k`.c```s.d`.e`.b`r`.e`.g```s``.a```s.b.y```s.e.d`.i`.p`.u`.c`.c`.o```s.i.s```s.o.m`.o`.r```s.h.e`.t```s.o.f```s`.a`.P````s.W..`.N```s.n.d`.a```s.E.,`.N```s.t.,`.s`.a`.e```s.t.,`.s`.e`.w```s`r`.s`.e```s```s.p.a`. ```s.o.u`.i`.v`.b`.O`. `. `..`.e``.e`c`.c`. ````s.w.i`.S`. `.e`.l`.b`.m`.e```s.r.e`. ``.l`c`.w``.e`.s`.o`.h`.w```s```s`.a```s.i.n```s.r.e`.a```s`.Y.o.u. .r.o.m. .a.s.h.s.a.g.o. .r.t. .l.a.r.o..`k`d`.m````s`.e`.s`.e`.e`.h`.c``.s`c`.w`.S``.n`.i```s`.'`.u`.o`.Y.r.e. .i. .r.o..`k``s``si`k``s``si`k`d`.g`.n``.l```s``.e`.h`.t```s.r.s`.e`.v`.o`.c``.s`c`.M````s``.p`.r`.a`.c`. ```s`.p`. `.k`.c```s``.a```s.t.h`.i`.w```s.o.r`.o`.l`.f```s.h.e`.t`r`.,`.s`.n`.i`.a`.t`.r`.u`.c```s.v.y`.a`.e`.h```s.t.h`.i`.w```s`.r```s.o.v`.c`. ```s.a.r`. `.s`.l`.l`.a`.w`. ```s````s.m..`.o`.o`.R```s.f.t`.o`.S```s.h.e`.t```s.i.n```s.r.e`.a```s`.Y.o.u. .T.h.e.d. .t.h.i.l.e.t... .o. .c.e.i..`k`d`.m````s`.t`.f`.o`.S```s.i.n```s`.'`.u`.o`.Y.r.e. .R.o..`k``s``si`k``s``si`k`d`.t`.i``.o`.t```s.e.t`.g```s.'.t`.n`.a`.c```s.o.u`.y```s.r.e`.e`.h`.w```s.i.t`.p```s.s.t`.e`.w```s.h.e`.t```s.e.r`.v`.o```s.l.y`.t`.c`.e`.r`.i`.d``.l`c`.w`r`.e`.h`.t``.n`.o```s.i.s```s.n.e`.o```s.i.g`.b```s.l.y`.n`.o```s.h.e`.t```s.u.t`.b```s.r.,`.e`.v`.o``.l`c``.s`.e`.l`.o`.h```s.r.e`.a```s.r```s````s.t..`.s`.e`.w```s``r`.t`.s```s. .e`.m`.o`.r`.f`. `.s`.e`.g``.s`c`.p`. `.t`.c`.e````s.c`. ```s. `.s```s.p`. `.e`.h`.t`. `.g`.n``.s`c`.p`.y`.b`. ``.r```s. ```s`.p``.a```s.i.s```s.r```s.T.h`r`..`.s`.t`.i`.p`. ```s.t.h`. `.d`.n```s.s.c```s`.o`.t```s.s.y`.a`.e```s.i.t```s.k.e`.a`.m```s.c.h`.i`.h`.w```s.s.,`.b`.a`.l`.s```s.c.k`.o`.r```s.i.n`.h`.t```s.t.h`.i`.w```s`.r``.t`c`.l`r`.s```s``.e`.h`. ``.o`c`.f`. `.e`.h`.T````s.m..`.o`.o`.R```s.i.t`.p`.o`.w`.T```s.h.e`.t```s.o.f```s.n.d`.e```s.s.t`.a`.e```s.h.e`.t```s.a.t```s.r.e`.a```s`.Y.o.u. .l.r.e. .i.e.d. .d.e. .a.t.h.e.a.i.t.o.n.a.a.n.d. .T.h.e. .a. .a. ..`k`d`.m````s`.t`.i`.p`.o`.w`.T```s.o.f```s.n.d`.e```s.s.t`.a`.e```s.a.t```s`.'`.u`.o`.Y.r.e. .R.o..`k``s``si`k``s``si`k`d`.m````s`.e`.h`.t```s.o.f```s.n.d`.e```s.i.s`.h`.t```s.a.t```s.i.t`.p```s.h.e`.t```s.v.e`.o`.b`.a```.w`. `.e`.h`.t`r`.n`.i`. `.e```s.h.o`. `.e`.g`.r`.a```s.a```s.i.s```s.r```s````s.m..`.o`.o`.R```s.i.t`.p`.o`.w`.T```s.h.e`.t```s.o.f```s.n.d`.e```s.s.t`.e`.w```s.h.e`.t```s.a.t```s.r.e`.a```s`.Y.o.u. .T.h.e. .l`c.a. .r.o..`k`d`.m````s`.t`.i`.p`.o`.w`.T```s.o.f```s.n.d`.e```s.s.t`.e`.w```s.a.t```s`.'`.u`.o`.Y.r.e. .R.o..`k``s``si`k``s``si`k`d`.t`.i`.p``.e`.h`.t```s.o.f```s.e.r`.n`.r`.o`.c```s.n.e`.o```s.i.n```s.i.l`.o```s.o.f```s.o.l`.o`.p``.l`c`.m`.s``.a`r`.s`.i```s.r```s````s.m..`.o`.o`.R```s.i.t`.p`.o`.w`.T```s.h.e`.t```s.i.n```s.i.t`.p```s.r.n`.e`.t`.s`.a`.e```s.h.e`.t```s`. `.m``.t`c`.b``.e`.h`.t```s.a.t```s.r.e`.a```s`.Y.o.u. .o.o.f. .T.h.e. .a. ..`k`d``.i`.p`. ```s``. `.n`.i`. ```s`.u`.o`.Y.'.r.e.a.s.t..`k``s``si`k``s``si`k`d`.u`.o`.y``.e`.v`.o`.b`.a```s.e.t`.e`.f```s.2.5```s.u.t`.o`.b`.a``.l`c`.w``.e`.h`.t```s.i.n```s.l.e`.o`.h```s.g.e`.r`.a`.l```sr.a`.s`.i```s.r```s````s.m..`.o`.o`.R```s.i.t`.p`.o`.w`.T```s.h.e`.t```s.i.n```s.i.t`.p```s.r.n`.e`.t`.s`.e`.w```s.h.e`.t```s`. `.m``.t`c`.b``.e`.h`.t```s.a.t```s.r.e`.a```s`.Y.o.u. .o.o.f. .T.h.e. .a. ..`k`d``.i`.p`. ```s`.w`. `.n`.i`. ```s`.u`.o`.Y.'.r.e.s.t..`k``s``si`k``s``si`k`d`.s``.v`.a```s`.f`.o```s.o.n`.i`.s`.u`.f`.o`.r`.p`r`.a``.e`c``.n`.a`.c```s.o.u`.y```s.c`.i```s. .w```s.u.g`.o`.r```s. .t`.e`.l`.o```s.a```s.i.s```s``. `.n`.r```s`.a``. ```s`. ```s```s.t..`.s`.e`.w`r`.e`.h`.t```s.t.o```s.h.t`.g`.i`.s```s.o.f```s.u.t`.o```s``.h`.c`.t`.e`.r`.t`.s`. `.r`.o`.d``.r`c`.c`. `.w``.r`c``. `.,`.g```s``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .l.o.n.a.o.i.n.g. .A.t.h.e.s.t.e.n.d. .h. .s. .l.e..`k`d`.r``.d`.i`.r`.r```s. .c`.w```.n`. `.n`.i`. `.e```s`.o`.Y.u.'.r`c.a.o..`k``s``si`k``s``si`k`d`.]`.c`.i`.s`.[``."`.O`.O`.F```s.O.E`.F```s.I.E`.F``.E`c`."`. `.,`.n`.o``.t`.p```s.c.r`.s`.n```s.e`.h`.t```s.e.d`.l`.w`.a`.r`.c`.s```s.i.s``.l`c`.w`. ``.s`.e`.w`. `.e`.h```s`.O````s.h..`.t`.u`.o`.s```s.n.d`.a```s``.r`.o`.n`. `.,```s`.e`. `.d```s.l.e`. `.s`.e`.g``.s`c`.p`. `.s`.u`.o`.n`.r`.e`.v```s```s.t..`.i```s.o.w`.h`.s```s.t.o```s.m.p`.a`.l`r`.r`.u`.o`.y```s.o.r`.f```s.u.p```s.g.h`.i`.h``.o`c``.s`.i```s.r```s. .h`.g`.n`.i`.l`.i```s. .c```s````s.m..`.o`.o`.R```s.n.t`.a`.i`.G```s.h.e`.t```s.i.n```s.r.e`.a```s`.Y.o.u. .T.h.e. .t. .C.a.a.s.t.h.,. .nr.t.a. .i.F. ..`k`d`.m````s`.t`.n`.a`.i`.G```s.i.n```s`.'`.u`.o`.Y.r.e. .R.o..`k``s``si`k`k`d``.i`.-`.e`.v`.a`.c`. `.t```s.c```s`.a```s.b.y```s.e.d`.k`.c`.o`.l`.b```s.i.s```s.r```s. .h```s.a.g`.s`.s`.a`.p`. ```s.T.h.e. .r.e.n..`k``s``si`k`k`d`.e`.g``.s`.s```s`.h`.t`.u`.o`.s`./`.h`.t`.r`.o`.n```s.s`.n``.m`c``.n`.a```s.o.f```s.n.d`.e```s.n.e`.o```s.a.t```s.r.e`.a```s`.Y.o.u. .i.e. .p.a..`k``s``si`k``s``si`k`d`.t`.s`.e`.w``.d`.n`.a```s.t.h`.u`.o`.s```s.h.e`.t```s`. ```s``. `.s```s`.s`.s```s```s.r..`.o`.o`.l`.f```s.h.e`.t```s.i.n```s.l`.o`.h`. `.a`. `.h`.g`.u`.o`.r`.h`.t`r`.s`.r`.a``.p`c`.s`.i`.d``.t`.a`.h`.t```s.o`.o`.p```s.i`.h`.w`. `.g`.n`.i```s.o.a```s.a```s.t.o`.n`.i``.l`c`.f`.r`.e`.t```s. .w`.g`.n`.i`.l`.k`.r```s.s.p`. ```s.r. `.e`.v`.o`r`.s`.e`.d```s.s.c```s. .c`.h`.c`.i`.h`.w`. `.,`.m```s`.t`.s`. `.g`.n`.i`.h`.s`.u```s.a```s.t.h`.i`.w```s.r`.e`.v`.a`.c`. `.t```s.c.e`.i`.f`.i```s`.m``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .a.g.n. .r.e.a. .r.l. .a.e. .P.a.g.e.x.i.t.o. ..`k`d````s.f`.r`.e`.t```s`.h`.t`.i`.w```s.r.n`.e`.v`.a`.c```s.i.n```s`.'`.u`.o`.Y.r.e. .w.a.l..`k``s``si`k``s``si`k`d`.h`.t`.r`.o`.n``.e`.h`.t```s.t.o```s``.b`. `.g`.n`.i`.d```s.l.e`. `.e`.g``.s`c`.p`r```s.s`.i```s.r```s````s.p..`.u```s.m.b`.i`.l`.c```s.t.o```s.l.e`.b`.a```s.b.e```s.o.t`.n```s.l.d`.u`.o`.w```s.o.u`.y```s.u.t`.b```s.e.,`.r`.e`.h```s.w.n`.o`.d```s`.i``.c`r`.d```s`.c`. `.u```s```s````s. `.e`.g```s``.a```s.v.e`.o`.b`.a```s.n.e`.i`.l`.c`.n`.i```s```s``.a```s.o.f```s.o.p`.t```s.h.e`.t```s.a.t```s.r.e`.a```s`.Y.o.u. .s.t.e.p. .l.a.r.o.m... .Y.o.u.l.m.b. .T.h.e. .a.a.c.k. ..`k`d`.m````s`.e`.g`.r`.a`.l```s.v.e`.o`.b`.a```s.n.e`.i`.l`.c`.n`.i```s```s.s.t`. `.t`.a`. ```s`.u`.o`.Y.'.r.e.p. .r.o..`k``s``si`k`k`d`.e`.g`.a````s.p.a`. `.e`.l`.b`.a`.z`.i```s.a```s.v.e`.o`.b`.a```s.o.n`.y`.n`.a`.c```s./.S`.N```s`.r`.c```s`.a```s.i.n```s.r.e`.a```s`.Y.o.u. .s.e.t. .s..`k``s``si`k``s``si`k`d`.d`.e`.n`.i`.b`.m``.c`r```s``.r`.e`.h`.t`.o```s.h.e`.t```s.a.s``.l`c`.t``.s`.a```s.i.s```s.n.e`.o```s.t`.r`.o`.n`. `.e```s```s.E..`.S```s.n.d`.a```s.h.,`.t`.u`.o`.s```s.h.,`.t`.r`.o`.n`r`.g`.n`.i`.r`.a`.e`.b```s.s.,`.n`.o`.y`.n`.a`.c``.e`c`.h`.t``.f`.o```s.o`.i`.t`.c```s``.a```s.a.t```s.o.n`.y`.n`.a`.c```s`.r`.c```s`.a```s.i.n```s.r.e`.a```s`.Y.o.u. .s.e.t. .j.u.n. .r. .T.h. .a. .t.w.o..`k`d`.s``.o`.y```s``.t`.e`.r`.c`.e`.s``.e`c`.h`.t``.f`.o```s.o`.i`.t`.c```s.j`. `.t`.a`. `.e`.r`.'```s.Y.o.u.n. .r. .c.a.n..`k``s``si`k``s``si`k`d`.p`.u``.k`.c`.a`.b```s.m.b`.i`.l`.c```s.t.o```s.i.t```s.c.h`.a`.e`.r```s.t.o```s.l.e`.b`.a`.n`.u```s.b.e```s.l.d`.u`.o`.w```s.o.u`.y```s.s.o```s.n.e`.o`.d```s.n.g`.i`.v`.a`.h`r`.t`.u`.b```s.r.,`.o`.o`.l`.f```s.h.e`.t```s.t.o```s.i.t```s.o.m`.r`.f```s.m.p`.u`.j```s.n.d`.a```s.t.,`.i```s.w.n`.o`.d```s`.i``.c`. `.d```s`.c`. `.u```s```s.w..`.o`.l`.e`.b`r`.r`.o`.o`.l`.f```s.h.e`.t```s.e.s`.h`.c`.a`.e`.r```s.s.t`.o`.m`.l`.a```s.n.d`.a```s.o.f`.o`.r```s.h.e`.t```s.o.m`.r`.f```s`.n`.e`.t`.x``. ```s.i```s`.l```s.s.t`. `.e`.g`.r```s`.A. .l.a.c.t.e.d.s. .Y.o.u.l.m.b. ..`k`d`.e``.i```s.a.c`.l`.a```s`.f`.o```s.o.p`.t```s.o.n```s`.'`.u`.o`.Y.r.e. .s.t..`k``s``si`k`k`d`.W`.S``.d`.n`.a```s.E.,`.S```s.h.,`.t`.r`.o`.n```s`.e`.l`. `.s`.l`.w```s````s````s. .r`.w```s. `.e`.g`.r`.a```s.a```s.i.n```s.r.e`.a```s`.Y.o.u. .l.o.m... .C.r.a.d. ..`k``s``si`k`k`d`.l`.w``.r`.c`. `.d`.n`.e`. `.d```s.D.e.a..`k``s``si`k``s``si`k`d`.u`.o`.y``.t`.a```s.c.k`.a`.b```s`.i`.r`.e`.e`.p`. `.e`.r`.e`.h`.t`. ``.e`c``.e`.b```s.a.n`.c```s.r.e`.u`.g`.i`.f```s.w.y`.o`.d`.a`.h`.s```sr.A`..`.m`.o`.o`.r```s`.t`.h`.g``.l`. `.a`. `.o`.t`.n```s.g. `.n```s```s. `.w`.o`.d`.n`.i`.w`. `.r`.a```s.m```s`.a```s.i.s```s.r```s`. `.y`.a`.w`.a`. ``.e`c``.5`.2`r`.d`.n`.a```s.o.u`.y```s.o.m`.r`.f```s.i.t`.p```s.h.e`.t``.s`c``.c`.a`. `.y`.l`.t`.c`.e```s````s`.l`.t``.e`.c`.e`.r`. `.e`.r`.e`.h`. ```. `.s`.a`.h`. ```s`.e`.m```s``.a`.h```s.e. ```s``.d`.n```s.o`.t```s.e.m`.e`.s```s.l.d`.u`.o`.w```s.o.w`.d`.n`.i`.w```s.h.e`.t```s.n.d`.u`.o`.r`.a```s.s.t`.u`.d```s.h.e`.t```s.i.n```s.k.s`.r`.a`.M`r`..`.t`.f`.e`.l```s.h.e`.t```s.t.o```s.e.r`.k`.c`.i`.h`.t```s.n.g`.i`.m`.o`.c`.e`.b```s.t.,`.i`.p```s.h.e`.t```s.o.f```s.o.r`.o`.l`.f```s.h.e`.t```s.e.r`.v`.o`.c```s.s.t`.i`.m```s.t`.i`.h`.w`r`.f`.o`. `.s```s`.r`.T````s.w..`.o`.l`.e`.b```s```s. .f`.0`.5`. `.r```s.o.v`. ```s``.s```s. .v`.y`.l`.t`.c`.n```s.s.t```s.n.d```s.s`.i```s.o.r`.o`.l`.f```s```s.t..`.h`.g`.i`.s`r`.f`.o```s.u.t`.o```s.u.p```s.d.s`.n`.e`.t`.x`.e```s.c.h`.i`.h`.w```s.t.,`.i`.p```s`.u`.h`. `.a`. ```s`.k````s.r.l`.e`.v```s.w. ```s.n.d`.i`.w`. `.w```s`.a```s.a.t```s`.'`.u`.o`.Y.r.e. .l.o.i.n.g.e. .A. .i.b.l.e.t. .a.c.e. .i.c.a.tr.s.o.n.e`c.b.n.y... .D.i.r.o. .f.t.h.e. .s.i.l.o.k.i.e.d. .s.n.g. ..`k`d`.t`.i`.p``.n`.o```s.o.w`.d`.n`.i`.w```s.a.t```s`.'`.u`.o`.Y.r.e. ..`k``s``si`k``s``si`k`d`.t``.e`.w`. ```s.a.d`.e`.l`. `.l`.w`.a`.r`.c`. ``.e`c`.k`.-`.d```s.-`.s`.d`.n```s. .h```s.d. `.n```s.,. `.E`.S`. `.s`.d```s.l.e`. `.e`.g``.s`c`.p`r`.r`.e`.h`.t`.o`.n```s.,`.h`.t`.r`.o`.n```s.h.e`.t```s.t.o```s``.w`.p`.u`. `.s`.d```s.l.e`. `.e`.g```.p`. `.g`.n`.i`.p`.o`.l```s.y. `.l`.t`.n`.e`.g`. `.A`. `. `..``.l`c`.w`r`.e`.h`.t`. `.r`.e`.v`.o`.c`. `.s`.g`.n`.i`.w```s.d.r`. `.e`.v```s. .c`.l```s`.e`.i`.r`.o`. `.t```s.i.e`.c```s```s.m..`.o`.o`.R```s.a.l`.t`.n`.e`.i`.r`.O```s.h.e`.t```s`. `.s```s.T.h.i.s. .A.n.t.a.s`c.a.a.r.d. .a.a.n.s..`k`d`.m````s`.l`.a`.t`.n`.e`.i`.r`.O```s.i.n```s`.'`.u`.o`.Y.r.e. .R.o..`k``s``si`k``s``si`k`d``.s`.e`.w`. `.d`.n`.a`. `.h```s.o.u`.s`. `.e`.h```s.o. ```s.s. ```s`.e`r``.t`.a`.p`. `.e```s```s`.n``.l```s.c`. ```s.t.h`. `.n`.i`. ```s````s``.a```s.g.h`.u`.o`.r`.h`.t```s.u.p```s.e.s`.s`.i`.r```s.s.t`.i`.m```s`.T````s.d..`.r`.a`.e`.h`r`.e`.b```s.a.n`.c```s.e```s.o.i`.n`. `.g`.n`.i`.h```s.l.a`.p```s.e. `.g`.n`.a`.r`.t```s.,. `.t```s.m`. `.e`.t```s.w`. `.y`.v`.a`.e```s.a```s.g.h`.u`.o`.r`.h`.t```s.w.,`.o`.l`.e`.b```s`.F`r`..`.n`.r`.e`.v```s. .c`.e`.g`.r```s`.a```s.o.f```s.g.e`.d`.e```s.e.r`.t`.u`.o```s.h.e`.t```s.n.d`.u`.o`.r`.a```s.t.h`.a`.p```s`.i`.w``.a```s.n.g`.i`.w`.o`.l`.l`.o`.f```s.r.e`.a```s`.Y.o.u. .d.e. .l.a.r. .h.i.s. .h.e. .f.i.s.u.r.e.i.g... .T.h.x.i.t..`k`d`.n`.r`.e`.v`.a`.c``.y`.t`.s`.i`.m```s.i.n```s`.'`.u`.o`.Y.r.e. ..`k``s``si`k``s``si`k`d`.d`.n`.e``.r`.e`.h`.t`.o```s.h.e`.t```s.a.t```s.e.n`.e`.s```s.b.e```s.a.n`.c```s`.g``.l`. `.e```s```s.n. `.A`. `. `..```s```s.q.u`.s`. `.t`.h`.g`.i`.t`r`.y`.r```s. .v`.a`. ```s.i`.l`. `.s``.o`c`. ``.I`. `. `..```s``. `.s`.d`.a```s. .l`.l``.n`c``. ```s.g.h`.i```s`.l``.m```s.t.r`.x```s`.A`. `. `..`.e`.c```s``.i`.d`r`.t`.r`.o`.h```s.a```s.e.r`.t`.f`.a```s.e.n`.d`.i`.w```s.t.o```s.m.s`.e`.e`.s```s.t.h`.a`.p```s.N.W``.l`c`.m`.s`. `.A````s.e..`.v`.o`.c`.l`.a```s.a.n```s.i.n```s.r.e`.a```s`.Y.o.u. .a. .s.t.a.n. .e.y. .t.u.e.a.s.t.l.k.e.z.e.r.i.h.t. ..`k`d``.v`.o`.c`.l`.a`. `.n`.i`. ```s`.u`.o`.Y.'.r.e..`k``s``si`k``s``si`k`d`.E`.N``.s`.d`.a`.e`.l```s.o.r`.d`.i`.r`.r`.o`.c```s.r.k`.a`.d```s```s`.s`.e`.w`. `.e`.h```s.o. ```s.s. ```s``. `.l```.t`. `.w`.o`.r`.r`.a```s`.l``.m```s.t.r`.x```s`.A`. `. `..`.t`.h`.g`.i`.l`. ``.e`c`.g`. `.e`.i``.e`c`.n`.a```s.b.y```s.i.t`.l```s.e.r`.b`.m`.a`.h`.c``.l`c`.m`.s``.a```s.i.n```s`.'`.u`.o`.Y.r.e. .a. .r.n. .e.yr.n`c.u.e.x.i.t... .A. ..`k`d`.m````s`.r`.e`.v`.o`.l`.P```s.i.n```s`.'`.u`.o`.Y.r.e. .R.o..`k``s``si`k``s``si`k`d`.t`.i`.x`.e``.y`.l`.n`.o```s.h.e`.t```s.i.s```s.t.h`.u`.o`.s```s``.d`.a`.e`.l`. `.r`.o`.d``.r`c`.c`. `.A````s.m..`.o`.o`.R`.-`.k`.r`.a`.D```s.h.e`.t```s.i.n```s`.'`.u`.o`.Y.r.e. .o.i.n.g. ..`k`d`.m````s`.k``.a`.D`. `.n`.i`. `.e```s`.o`.Y.u.'.r.-.R.o..`k``s``si`k``s``si`k`d`.s`.r`.e`.d`.l`.u`.o`.b``.e`.h`.t```s.n.d`.u`.o`.r`.a```s.s.t`.a`.e`r`.s`.d`.n`.e`.b```s.l.y`.k`.c`.i`.u`.q```s.n.e`.o```s.t.h`.u`.o`.s```s.h.e`.t```s.n.d`.a```s.h.,`.t`.u`.o`.s```s.n.d`.a```s.t.h`.r`.o`.n```s.g.o```s.e.s`.g`.a`.s`.s`.a`.p``.l`c`.m``r`.w`.o`.L`. `. `..```s`.d`.l`.u`.o`.b`. `.h`.t`.i`.w`. `.d``.l`c`.f``.w`.o`.n```s.r.e`.a```s.e.y`.h`.t```s.u.t`.b```s.t.,`.s`.e`.w```s``. `.t`.s```s. .e`.e`.h`.t`. `.o`.t`r`.s`.e`.g``.s`c`.p``.e`.g`.r`.a`.l```s.r.e`.e`.w```s.c.e`.n`.o```s.r```s````s.)..`.m`.o`.o`.R```s.a.b`.l`.S`.(```s``.l```s.c`. ```s.t.h`. `.m`.o`.r`.f`. `.n```.f`r`.b`.a```s``.s`.n``.m`c``.n`.a```s.i.s```s```s.f.l`. `.e`.s```s.w`. `.r`.e`.b`.m`.a```s. `.r`.a`.l`.u```s.i.r```s`.o``. `.e`.g`.r`.a```s.a```s.i.n```s.r.e`.a```s`.Y.o.u. .l.w. .c.h.o.r. .i.e. .s.l`c.a.e.i.n.g. .T.h.e. .a.a.n.d. .i.e.r.s.a. ..`k`d`.m````s`.b`.a`.l`.S```s.i.n```s`.'`.u`.o`.Y.r.e. .R.o..`k``s``si`k`k`d`.m````s. `.e`.g```s``.a```s.v.e`.o`.b`.a```s.o.n`.y`.n`.a`.c```s./.S`.N```s`.r`.c```s`.a```s.i.n```s.r.e`.a```s`.Y.o.u. .s.e.t. .l.a.r.o..`k``s``si`k``s``si`k`d`.p`.u``.t`.e`.e`.f```s.t.y`.f`.i`.f```s.m.e`.o`.s```s.l.,`.l`.a`.w```s.e.r`.h`.t`.i`.e```s.i`. ``.e`c``.e`.b```s.a.n`.c```s.o.w`.d`.n`.i`.w```.m`.s`. `.A`r`.)`..`.n`.i`.a`.v`. `.y```s.m```s.t.r`.x```s.e`.r`.a```s.o.w`.n`.k```s.o.u`.y```s.a.s```s.h.o`.w```s.s.,`.e`.v`.r`.a`.w`.d```s.h.e`.t```s.o.f```s.s.e`.u```s.h.e`.t```s`.f`r`.d`.e`.d`.i`.v```s.p.r`. `.y`.l`.s`.u```s.v.i`.b```s.s. `.i`. `.r``.r`c`.m`. `.e`.h`.T`.(````s.s..`.l`.l`.a`.w```s.o`.y```s.c.a`. `.e`.h`.t`. ```.t```s. .b`.y`.a`.w`.d`.i`.m`r`.d`.n`.a`. `.o`.t`. `.l``.l`c`.r```s`.g`.n`.i`.g`.n`.a`.h```s.i.s```s````s.m`. `.d`.e`.d```s``.w`.t`. `.s`.u```s.r.m```s``.n`.a```s.u.,`.o`.y```s.v.e`.o`.b`.a`r`.r`.a`.f```s`.i`.o`.p`. ```.n`.u`. ```s.o.m`.s`. `.m`.o`.r`.f`. `.d```s.n.d```s`.u`.S````s.t..`.e`.e`.f``.0`c``.r`.e`.v`.o``.l`c`.w``.r`.o`.f```s.r`.a`.w`.p`.u`r```s`.t`.x```s.s. `.l`.l`.a`.w`. ```s````s.h..`.t`.r`.o`.n```s.h.e`.t```s.o.m`.r`.f```s.i.n```s.n.g`.i`.p`.e`.e`.s```s.s.t`.i`.m```s.t.e`.i`.h`.w```s.b.y```s``.e`.v`.o`.c`r`.s`.i`. ``.o`c`.f`. `.e`.h`.T````s.s..`.s`.o`.r`.c`.a```s.e.t`.e`.f```s.2.5```s.u.t`.o`.b`.a```s.o`.y```s.c.a`. `.h`.t`.u`.o`.s`./`.h`.t`.r`.o```s.a```s.i.n```s.r.e`.a```s`.Y.o.u. .n. .l.r.e.d. .T.h.e.n.d. .e. .1. .s.p.e`c.s.n.t. .e.n.o.-.s.i.r.o.r. .p.a.e`c.w.n. .i.o.r. .e.l`c.a. .s.n. ..`k`d`.n``.y`.n`.a`.c`. `.r```.m`. `.n`.i`. `.e```s`.o`.Y.u.'.r`c.i.o..`k``s``si`k``s``si`k`d`.h`.t`.u`.o`.s``.e`.h`.t```s``.w`.o`.t`. `.k`.c```s. .b`.s`.e`.o`.g`. `.e`.g``.s`c`.p``.y`.l`.n`.o```s`.T````s.t..`.s`.i`.m`r`.e`.h`.t```s.i.n`.h`.t`.i`.w```s.r```s.w.h```s.o.m`.s`. `.r```s.a`.w`. `.e`.h```s.o. ```s`. `.y`.l```s.i`.o`.n`. ```s.h.e```s.l`.p`.s`. `.d`.n```s.d. ```s.h`.r```s`r`.t````s`.0`.1```s.u.t`.o`.b`.a``.l`c`.w``.e`.h`.t```s.i.n```s`.o`.h``.a```s.o.f```s.u.t`.o```s.e.s`.l`.b`.m`.u`.t```s.c.h`.i`.h`.w```s`.a`.e`.r`.t`.s``.a```s.b.y```s`.f`r`.s`.i`. ```s.a.k`.l`. ```s````s.d..`.r`.a`.w`.p`.u```s.l.y`.d`.i`.p`.a`.r```s.e.s`.s`.i`.r```s.n.d`.a```s.o.m`.o`.r```s.h.e`.t```s.l.s`.l`.i`.f```s.s.t`.i`.m```s.t.e`.i`.h`.w```s.o.f`r`.d`.u`.o`.l`.c```s.u.e`.q`.a`.p`.o```s````s`.i`.o`.v```s.s.e`.e```s`.n`.u`.o``.g```s.d.e`.n`.u`. `.e`.g```s``.a```s.o.f```s.g.e`.d`.e```s.h.e`.t```s.a.t```s.r.e`.a```s`.Y.o.u. .l.a.r.d. .r... .A.n. .T.h.e.d. .m.,. .l.e. .a. .f.e.o.v.e.a.s.i.n.t.e. .h.e. .a.a.r.d. ..`k`d``.i`.o`.v```s.s.e`.e```s.t. `.a`. `.e```s`.o`.Y.u.'.r..`d`k`````ss``ss`ki``s`ksk``s`k`s``si`k`k`d``.s`.a`.e`. `.d`.n`.a`. `.h```s.o.r`.n`. `.e`.h```s.o. ```s.s. ```s.x.i`.e`. ```s.h.a```s.n. `.o`.y`.n`.a`.c`. ```s.r`.c```s`.a```s.i.n```s.r.e`.a```s`.Y.o.u. .s.e.t..k``s``si`k``s``si`k`d`.p`.u``.k`.c`.a`.b```s.e.t`.g```s.t.o`r`.e`.l`.b`.a```s.b.e```s.o.t`.n```s.a.y`.m```s.o.u`.y```s.w.n`.o`.d```s.g.o```s.o.u`.y```s````s.w..`.o`.l`.e`.b```s.e.t`.e`.f```s.1.5```s.o.n`.y`.n`.a`.c```s.h.t`.g`.i`.t```s``.v`r`.a`. `.r```s.o.v`. `.s``.s`c`.r`.c`. `.t`.I````s.W..`./`.E```s.n.s`.u`.r```s.r```s. ```s.i.c```s`.,`.n`.o`.y`.n`.a`.c```s`.r`.c```s`.a```s.i.n```s.r.e`.a```s`.Y.o.u. .s.e.t. .w.h.e. .o.e.r.y. .I.f. ..`k`d``.o`.y```s``.t`.h`.g`.i`.t```s.v.e`.o`.b`.a```s.o.n`.y`.n`.a`.c```s./.W`.E```s`.r`.c```s. .s`.n`.i`. ```s`.u`.o`.Y.'.r.e.t. .c.a.n..`k``s``si`k`k`d``.o`.y```s``.S`./`.N```s.h.t`.g`.i`.t```s`.e`.v``.a```s.i.n```s.c`.a`.l`.p`. ```s`.w``.a```s.a.t```s.r.e`.a```s`.Y.o.u. .i.d.e. .r.y. .c.a.n..`k``s``si`k`k`d`.h`.t`.u`.o`.s``.r`.e`.h`.t`.r`.u`.f```s.g.o```s.t.o```s.h.t`.g`.i`.t``.o`c``.s`.e`.m`.o`.c`.e`.b```s.r```s. .h`.n`.o`.y`.n`.a`.c`. ```s.T.h.e. .t. ..`k``s``si`k``s``si`k`d``.u`. `.n`.e```s. ```s. `.s`.m`.e`.e`.s`r`.d`.n`.a`. `.h```s.o.r`.n`. ``.e`c``.3```s.e.s`.o`.g```s.w.l`.a`.r`.c```s.h.t`.g`.i`.t```s.o.w`.l```s```s.n..`.o`.y`.n`.a`.c```s./.W`.E``.l`c`.t``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .a. .A. .f.t.o.p..`k`d``.o`.y```s``.W`./`.E``.l`c`.t``.n`.i```s`.'`.u`.o`.Y.r.e. .a. .c.a.n..`k``s``si`k`k`d`.d`.n`.e``.d`.a`.e`.d``.-`c``.s`.r`.e`.d`.l`.u`.o`.b```s.o.f``.s`c`.m``.a```s.t.o`.n`.i```s.n.s`.u`.r```s.o.n`.y`.n`.a`.c```s`.T.h.e. .a. .-. ..`k``s``si`k``s``si`k`d`.s`.n``.i`.t`.c`.e`.r`.i`.d`r`.h`.t```s`.n`.i```s.h.t`.g`.i`.s```s.o.f```s.u.t`.o```s``.p`.o`.l`.s`. `.r`.o`.d``.r`c`.c`. `.g``.i`.d```s.w.i`. `.g```s``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .l.o.n.o.i.n.g. .b.o..`k`d`.r``.d`.i`.r`.r```s`.g`.n`.i`.p`.o`.l`.s```s.i.n```s`.'`.u`.o`.Y.r.e. .c.o..`k``s``si`k``s``si`k`d`.r`.o`.d``.r`.r`.o`.c`. `.g`.n```s.n.d```s`.a```s.t.o`.n`.i```s.s.m`.a`.h`.c```s.h.e`.t```s.o.m`.r`.f`r`.y`.a`.w`.a```s.d.s`.a`.e`.l```s.t.h`.a`.p```s.S.W```s```s.e..`.d`.i`.s```s.a.r`.f```s.h.e`.t```s.o.f```s.e.w`.i`.v``.l`c``.s`.e`.r`.u`.c`.s`.b`.o```s.o.w`.l`.e`.b```s.o.m`.r`.f```s.u.p`r`.g`.n`.i`.s`.i`.r```s.s.t`.i`.m```s.t.e`.i`.h`.w```s.v.y`.a`.e`.h```s```s.m..`.s`.a`.h`.c```s```s. .d`.,```s`.a`.l``.a```s.o.f```s.d.e`.i`.s```s.n.e`.o```s.o.n```s.r.e`.a```s`.Y.o.u. .r.g.e.p. .A. .a. .A. .w.i..`k`d`.m`.s`.a`.h`.c``.f`.o```s.d.e`.i`.s```s.S.W```s.o.n```s`.'`.u`.o`.Y.r.e. ..`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``si`k`k`d``.n`.e`. ```s`.D.e.a.d..k``s``si`k``s``si`k`d`.e`.d`.i`.s``.s`.i`.h`.t```s.o.n```s.s.m`.a`.h`.c`r`.e`.h`.t```s.o.m`.r`.f```s.a.y`.w`.a```s.d.s`.a`.e`.l```s.t.h`.a`.p```s.N.E```s```s.m..`.s`.a`.h`.c```s.h.e`.t```s.o.f```s.d.e`.i`.s```s.a.r`.f```s.h.e`.t```s.o.n```s.r.e`.a```s`.Y.o.u. .A. ..`k`d`.m`.s`.a`.h`.c``.f`.o```s.d.e`.i`.s```s.N.E```s.o.n```s`.'`.u`.o`.Y.r.e. ..`k``s``si`k``s``si`k`d``.c`.n`.a`.t`.s`.i`.d`. ```s.t.h`. `.n`.i`. `.d`.r`.a```sr.h```s. .b`.n`.a`.c`. ```s`.o`.n`. `.g`.n```s.b.l`.m`.u`.r`. `.t`.n```s.f.a`. `.A`. `. `..`.r`.o`.d``.r`c`.c`. `.t`.s`.e`.w`./`.t`.s`.a`.e`. `.g`.n```s`.a```s.i.n```s`.'`.u`.o`.Y.r.e. .l.o.i.s.e..`k`d`.r`.o`.d`.i````s.c.o`. `.n`.i`. `.e```s`.o`.Y.u.'.r..`k``s``si`k``s``si`k`d`.t`.s`.e`.w``.e`.h`.t```s.o.m`.r`.f```s.r.s`.e`.t`.n`.e```s.o.r`.d`.i`.r`.r`.o`.c```s.i.n`.a`.m```s.h`.T`. `. `..```s.o.p`.l`.s`. ```s.t.l`.n```s`.a```s.w.n`.o`.d`r`.t`.s`.a`.e`.h`.t`.u`.o`.s```s.d.s`.a`.e`.l```s.r.k`.o`.f```s`.g`.i`.r`. `.e```s```s.n..`.o`.i`.t`.c`.e`.r`.i`.d```s.a.t`.h`.t```s.i.n```s.e.r`.d`.u`.o`.l```s.e.t`.g```s.t.o```s.m.s`.e`.e`.s`r`.g`.n`.i`.l`.b`.m`.u`.r``.l`c`.d`. `.A````s`.s`.a`.e`.h```s`.n`. `.s`.d`.a`.e`.l`. `.k`.r```s. `.t```s.l`. ```s````s.e..`.r`.e`.h```s.k.s`.r`.o`.f```s.t.h`.a`.p```s`.T.h.e. .T.h.e.f.o.r.t... .u. .T.h.t. .g.e. ..`k`d`.h`.t`.a`.p``.n`.i```s.r.k`.o`.f```s.a.t```s`.'`.u`.o`.Y.r.e. ..`k``s``si`k``s``si`k`d`.t`.s`.a`.e``.s`.e`.o`.g```s.w.l`.a`.r`.c```s.o.w`.l```s. `.d`.n```s.,. `.h`.t`.u`.o`.s`. `.s`.d```s.l.e`. `.e`.g``.s`c`.p`r`.r`.e`.h`.t`.o`.n`.A````s.g..`.n`.i`.l`.b`.m`.e`.r`.t```s.b.e```s.t.o```s````s. .s```s.a.v`.c`. ```s.i.r`.t`.n```s.e`.h`.t```s.a.t`.h`.t```s.u.d`.o`.l```s.s.o```s``.o`.r`r`.y`.d```s`.s``.a```s.r.d`.a`.e`.h```s.b.e```s.a.n`.c```s.t.h`.r`.o`.n```s.h.e`.t```s`.r`.F````s.e..`.r`.e`.h```s.r.m`.a`.w```s.t.e`.i`.u`.q```s.r.e`.a```s.l.s`.l`.a`.w```s`.T.h.e. .o.m. .t.e.a.r.,. .e.m.s. .a.a. ..`k`d`.s````s``.m`.r`.a`.w```s.t.h`.i`.w```s.o`.i`.t`.c```s.j`. `.t`.a`. `.e`.r`.'```s.Y.o.u.n. .w.a.l..`k``s``si`k``s``si`k`d`.h``.u`.o`.s`. `.e`.h```s.o. ```s.s. ```s``. ```s`.s`.s```s`.g`.n`.i`.d`.o`.b`.e`.r`.o`.f```s.k.,`.r`.a`.d```s```s`.n```s`. `.h```s```s`r`.y`.d``.e`.r`.l```s.e`.h`.t```s.t`. `.r```s`.e`.l`.p`.s`. `.l`.a```s.e.r`.f```s. .i`.l`.a```s`.t``.d`c``.n`.a```s.d.s`.n`.e`.l```s.c.h`.i`.h`.w```s.n.,`.w`.o`r`.s`.t`.i```s.o.f```s.c`.n```s.s.c```s`.a`.c```s`.n`.a```s.t.h`.i`.w```s.m.e`.a`.l`.f`.a```s.i.s``.l`c`.w``.t`.h`.g`.i`.r```s.a.r`.f```s`.T````s``.s`.u`.o`.n`.i`.m`.o`r`.s`.e`````s.h`.c`.i`.h`.w```s.e.,`.k`.a`.l```s`.o`.r```s.l.f```s`.a```s.o.f```s`.t`.n```s. .c```s.t.h`. `.n`.i`. `.d`.n`.a`.l`.s`.i`. `.n``.r`c`.b``.a```s`.r`.f`r`.y`.l`.s`.u```s.n.u`.i`.t`.n```s`.s`.t`.p`.u`.r`.e```s.a.m`.e`.t`.s```s.n.g`.i`.r`.e`.t`.s`.i`.l`.b```s.o.f```s`.s`.y```s. .g```s.n.s``.m`c``.n`.a```s.t.,`.h`.g`.i`.r`r`.e`.h`.t```s````s.t..`.f`.e`.l```s.u.r`.o`.y```s.t.o``.f`c``.r`.a`.f```s.i.t`.p``.s`c`.l`.m``.t`.t```s`.a```s.t.o`.n`.i```s.t.s`.e`.m`.m`.u`.l`.p```s.n.d`.a`r`.,`.e`.g`.r`.o`.g```s.h.e`.t```s.g.h`.u`.o`.r`.h`.t```s.a.y`.w```s.t.s`.i```s.n.s`.r`.u`.b```s.o.,`.n`.a`.c`.l`.o`.v```s.h.e`.t```s.o.f```s.h.s`.t`.p`.e`.d```s.h.e`.t```s`.r`.f`. `.t`.u```s`.e`.h```s`.c`. `.e```s.f.i`. `.f`.o`. ```s.v`.i`.r`. ```s.n.s``.m`c`. `.n`.A````s.f..`.l`.e`.s`.m`.i`.h```s.i.l`.v`.e`.D```s.h.e`.t```s.b.y```s.e.d`.t`.f`.a`.r`.c```s```sr.b```s`.h``.o`.t```s.m.s`.e`.e`.s```s.a.t`.h`.t```s`.o``. `.d`.e```s.t.u```s.t`. `.f```s.s. ```s.h`.c`. `.e`.r`.r```s`.b``.a```s.t.h`.i`.w```s`.l`.l`.i`.f`. `.,```s.r`.o```s````s`.a```s.i.s```s.d`.i`.s`. ```s`. ```s```s.s..`.l`.l`.a`.w```s.h.e`.t```s`.p`.u`. `.s`.n```s.t```s`.p`.p```s.r`.e`.t`.s`.i`.n`.i`.s```s.t.o`.n`.i```s.h.t`.g`.i`.l`r`.y`.k`.r`.u`.m```s.h`.t`. `.r``.t`c`.c`.s``.h`.c`.i`.h`.w```s.r.,`.e`.t`.s`.a`.b`.a`.l`.a```s.t.e`.i`.h`.w```s.r.e`.u`.p```s`. `.d`.e`.s```s.m.p```s. .c`.,`.s`.n```s.t.i`.a`.m`.r```s``.e`.t`.s`.i`.w`.t`. ```s.i`.r`.y`.m`. `.e`.r```s.d. ```s.h.e`.r`.e`.v`.o`. `.r```s. ``.o`c`. `.d``.g`.g`.a`.j`. ```s.t.h`. `.n`.i`. `.d``.d`c`.b`.m`.E````s.s..`.d`.n`.u`.o`.s`r`.r`.e`.h`.t`.o``.l`c``.t`.u`.o```s.n.s`.w`.o`.r`.d```s.n.o`.a`.c`.l`.o`.v```s.h.e`.t```s.o.f```s.n.g`.i`.r`.e`.d`.n`.u`.h`.t```s.h.e`.t```s.n.d`.a```s.h.,`.c`.u`.o`.t```s.h.e`.t`r`.o`.t```s.o.t`.h```s.r.e`.a```s.l.s`.l`.a`.w```s`.T````s.e..`.n`.o`.t`.s`.m`.i`.r`.b```s.o.f``.l`c`.m`.s`. `.y`.v`.a```s`.a```s.n.d`.a```s.s.h`.a```s.o.f```s``.a`.p`.s`r`.g`.n`.i```s.k`.c`.i`.l`.f`. `.h`.t`.i`.w`. `.d``.l`c`.f``.s`.i```s.i.r`.a```s.h`.T`. `. `..```s.n.c`.a`.r`.a``.p`c`. `.e``.b`.a`.c`.a`.m`. `.,`.e`.i``.e`c`.n`.a```s.n.g`.i`.h`.t`r`.-`.y`.r`.e`.v`.e```s.n.g`.i`.v`.i`.g```s.e.,`.r`.a`.l`.g```s.e`.r`.-``.o`c`.b``.a```s.t.h`.i`.w```s.r.n`.e`.v`.a`.c```s.h.e`.t```s.o.f```s.e`.h`.c`.a`.e`.r`. `.t```s.h.e`.t`.r`.a`.f`r`.e`.h`.t`. ``.l`c`.f``.k`.c`.o`.r```s.n.g`.i`.w`.o`.l`.g```s`.T````s.s..`.h`.t`.p`.e`.d```s.h.e`.t```s.t.o`.n`.i```s.w.n`.o`.d```s.c.k`.a`.b```s.n.g`.i`.d`.a`.c`.s`.a`.c```s.t.,`.u`.o`r`.g`.n`.i`.g`.r`.u`.s```s.m.e`.o`.c```s.v.a`.a`.l```s.e.n`.t`.l`.o`.m```s.o.f```s.t.s`.u`.o`.g```s.a.t`.e`.r`.g```s.c.h`.i`.h`.w```s`.r`.f`. `.,```s.a.n`.c`.l```s. `.e```s`.c``r`.n```s.s`.i```s.o.u`.y```s.o.w`.l`.e`.b```s`.F````s`.e``.v`. `.g`.n```s`.t`.-`.h`.t```s`.b``.a```s.o.f```s.g.e`.d`.e```s.h.e`.t```s.o.n```s.r.e`.a```s`.Y.o.u. .r.e.a.k.i.w... .a.r. .a.t.i.v.o.m. .h.e. .i.s. .l.d. .r.a.e. .i.e.r.k.s. .h.e. .h.e. .a. .e.e.r.f.a.dr.f.o.f. .a.e. .a.r.i.o.n. .T.o.n.e. .d.e.pr.g.e.d. .i.z.a.o.r.c.k. .a.v.e.n. .i.e.r.a.sr.o.m. .b.o.e. .o. .T.o. .i.e.r. .c.o.m. .a.e.r. .s.u.s. .b`c.u.l.y... .h.e. .a. .i.n.d.e. .a.i.o.n.d.o. .a.h.e.l.i.s.c.e... .A. .p.a.g.e.x.i.t..`k`d`.w`.e``.v`. `.g`.n```s`.t`.-`.h`.t```s`.b`. `.t`.a`. `.e```s`.o`.Y.u.'.r.e.a.k.i..`k``s``si`k``s``si`k`d`.g`.n``.m`.o`.c`. `.s```s.e. `.s```s.n.o`. `.g`.n```s.b`.m`.u`.r`r`.w`.o```s.a```s.c`.i```s. .w```s.u.g`.o`.r```s`.,`.t`.s`.e`.w```s`.i`.d``.e`.h`. `.l`.w```s``.a```s.i.s```s.i.t`.x`.e```s.l.y`.n`.o```s`.T````s.t..`.a`.e`.h`r`.e`.h`.t```s.o.m`.r`.f```s``.l`.f```s`. `.t```s`.l`.a`. `.e`.b`. `.o`.t`. ``.o`c``.e`.h`.t```s.i.n```s.i.r`.a```s.h.e`.t```s.n.g`.i`.s`.u`.a`.c```s``.a`.w`. `.y```s.v`r```s.a.r`. `.s`.l`.l`.a`.w`. ```s.T.h`. `. `..`.s`.r```s.l.d`.u`.o`.b`. ```s.r.g`.a`.l`. `.h`.t`.i`.w`. `.d``.l`c`.f``.r`.e`.b`.m`.a`.h`.c``.l`c`.m`.s``.a```s.i.n```s.r.e`.a```s`.Y.o.u. .a. .i.e.r.m.,. .r.m.o.s.t.i.n.g. .h.e. .c.r.a.n.g. .t.h. .l.i..`k`d`.s`.r`.e`.d`.l`.u`.o`.b``.f`.o```s.e.r`.b`.m`.a`.h`.c```s.i.n```s`.'`.u`.o`.Y.r.e. ..`k``s``si`k``s``si`k`d`.s`.n``.i`.t`.a`.m`.r```s``.n`.o`.t`.s```s``. `.d`.e`.p`.a`.h`.s`. `.y```r`.h`.t`.i`.w`. ```s.n`.i`.l`. ```s`.s`.s```s`.h`.t`.u``.s`./`.h`.t`.r```s. `.g```s.p.i`.o`.l`.s`. `.y`.l`.t```s``.a```s.n.g`.o`.l`.a```s.n.g`.i`.k`.l`.a`.w```s.r.e`.a```s`.Y.o.u. .g.e.n.o. .p.a.g.e.d`c.o.l.i.m.e. .f.o..`k`d``.g`.a`.s`.s`.a`.p`. ```s.o.n`.t`.s```s.i.m`.l`. `.n`.i`. ```s`.u`.o`.Y.'.r.e..`k``s``si`k``s``si`k`d`.!`.M````s. `.N`.I`. ```s.E`.B`. `. `.!`.N`.O`.I`.T`.U```s````s`.d`.a``.r`. ```s`.a`.r`.t```s. ```s.t.h`. ```s.o.v`.b`.a`. `.d```s`.o`.p`r`.n`.g`.i```s````s.m..`.o`.o`.r```s````s.b`. `.,`.e`.g`.r```s`.a```s.t.o```s.c.e`.n`.a`.r`.t`.n`.e```s.h.e`.t```s.a.t```s.n.g`.i`.d`.n`.a`.t`.s```s.r.e`.a```s`.Y.o.u. .l.a.r.e.n. .A. .s.t.e.n.c.e.s.:. .".C.A.R.O."`k`d`.m````s`.n`.e`.r`.r`.a`.b```s.o.f```s.n.t`.o`.r`.f```s.i.n```s`.'`.u`.o`.Y.r.e. .r.o..`k``s``si`k``s``si`k`d`.n`.i``.e`.m`.a`.c```s.o.u`.y```s.a.y`.w```s.h.e`.t```s.i.s```s.i.t`.x`.e```s.l.y`.n`.o```s`.T````s.m..`.o`.o`.r```s.h.e`.t```s.o.f```s.n.d`.e```s.a.r`.f`r`.e`.h`.t```s.r.d`.a`.w`.o`.t```s.a.y`.w`.a```s.a.d`.e`.l```s.s.t`.u`.d```s.h.e`.t```s.i.n```s`.r`.a`.M````s.t..`.s`.u`.d```s.m.e`.o`.s```s.o.r`.f```s.p.t`.e`.c`.x`.e```s.t`.p`.m`.e`r```s.e`.t`.e```s`.o`.c`. `.s`.i`. ``.o`c``.e`.h`.t```s.o.f```s`.t`.n```s. .c```s.T.h`. `. `..`.m`.o`.o`.r`. `.n``.r`c`.b``.a```s.d.e`.i`.s`.n`.i```s.r.e`.a```s`.Y.o.u. .a.e.r. .r.m.p.l.y. .k.s. .h.e. ..`k`d`.m````s`.n`.e````s.b.a`. `.n`.i`. `.e```s`.o`.Y.u.'.r. .r.o..`k``s``si`k``s``si`k`d`.e`.c`.n`.a`.t`.s`.i`.d``.e`.h`.t```s.i.n```s.l.y`.m`.i`.d```s.e.d`.s`.p`.m`.i`.l`.g```s.b.e```s.a.n`.c```s.t.s`.c`.e`.j`.b`.o```s.r.y`.d`.n`.u`.s`r`.r`.e`.h`.t`.o```s.u.s`.o`.i`.r`.a`.v```s.r.e`.e`.h`.w```s.m.,`.o`.o`.r```s.h.e`.t```s.o.f```s.n.d`.e```s.e.r`.h`.t`.o```s.h.e`.t```s.t.o```s.e.s`.h`.c`.t`.e`.r`.t`.s```s.n.d`.a```s```s`r`.e``.o`. `.t`.s```s`.g```s.g`.n`.i`.g`.n`.a`.h```s.i.s```s.o.r`.r`.r`.i`.m```s.s`.n``.m`c`. `.n`.A````s`.S``.V`.R`.A`.W`.D`. ```s`. `.B`.R`.U```s.I.S`.D`. ```s.N`r```s````s.s.:`.d`.a`.e`.r```s.b.y`.r`.a`.e`.n```s.g.n`.i`.s```s```s.y..`.l`.d`.u`.o`.l```s`.i``.o`.n`.s`. `.,``.o`c`.f``.e`.h`.t```s.o`. `.g```s````s.s.l`. ```s`r`.s`.e`.v`.r```s.d.w`. `.y`.n```s. .m`.t```s`.g``.a```s.d.e`.i`.s```s.n.e`.o```s.t.o``.f`c````s.s..`.n`.r`.e`.t`.n`.a`.l``.s`c`.r`.b``.f`.o```s.o.n`.i`.t`.c`.e`.l`.l`.o`.c```sr.a`.d`.n`.a```s.s.,`.d`.n`.e```s.i.r`.e`.h`.t```s.o.n```s.r.s`.a`.t`.s```s.t.y`.s`.u`.r```s.t.h`.i`.w```s.d.s`.o`.r```s.c.k`.a`.l`.b```s.o.f```s`.d`.n`.u`.b``.a```s`.r`.e`.t```s`. `.f```s`.e`.b``.a```s.y.,`.l`.t`.e`.i`.u`.q```s.n.g`.i`.r`.u`.m`.r`.u`.m```s.k`.l`.a`.t```s.a`.e`.b`. `.g```s``. `.f`.o`. ```s.e`.s```s``.a```s.).,`.y`.t`.p`.m`.e```s.e.m`.h`.t```s`r````s.(.a`. `.s`.e``.t`c`.b``.f`.o```s`.i`.p``.a```s.e.n`.e`.s```s.b.e```s.a.n`.c```s.o.u`.y```s.u.t`.o`.b`.a```s`.r``.t`c`.c`.S````s.t..`.h`.g`.i`.l```s````s`r```s``.s`. `.h`.t`.i`.w`. ``.o`c`. ``.h`.t`. ```s.t.h`.a`.b`. `.d`.a```s.r.h```s.o.v`. `.r`.a`.f`. `.s```s.c.h`.r`.o`.t`. ```s````s.M`. `. `..`.m```s.g`.o```sr.p`."`.e```s.t.u`.n`.e`.v`.d`.A`."`. `.e`.h`.t`. ```s.f`. `.y`.r```s.i.t`.s```s`.r`. `.a`. ```s. .b`.o`.t`. `.s`.r`.a``.p`c`. `.t`.I````s.m..`.o`.o`.R```s.n.t`.a`.i`.G`r`.e`.h`.t```s.a.n`.h`.t```s.e.r`.g`.r`.a`.l```s`.v```s.,. `.m`.o`.o`.r`. ```s.n.s``.m`c``.n`.a```s.o.f```s.n.d`.e```s.s.t`.a`.e`.h`.t`.r`.o`.n```s.h.e`.t```s.a.t```s.r.e`.a```s`.Y.o.u. .i.e.n. .a.e.p.o.r.a.s.i.v.e.r.m.o.k.y.e.l.o.w. .a.e.d. .l.e. .o.l.o.f. .n.u.r.y.o.u.n.s. .dr.o.y.s.,. .l.e. .a. .O. .r.e.a.r.e.p.i.n. .l.r.n.g. .A. .".D.O.T.H.E.!.". .i.e. .a.i.n.w.a.l.,. ..`k`d`.d`.n`.e``.E`.N```s.a.t```s`.'`.u`.o`.Y.r.e. ..`k``s``si`k``s``si`k`d`..`.E`.C`.I````s`.N`.I`.A`.M```s.I.N```s`.E`.K````s.T..`.L`.U`.A`.V`r`.E`.R`.U`.S`.A`.E`.R`.T`."```s.s.,`.d`.a`.e`.r```s.a.t`.h`.t```s`.i`.s``.a```s.i.s```s.c.h`.i`.h`.w```s.t.o```s.x.t`.e`.n```s.e.,`.t`.a`.r`.g```s```s.s.t`. ```s``.l`r```s.s`.i```s.e.t`.e`.f```s.u.r`.o`.y```s````s.t..`.s`.a`.e`.h`.t`.r`.o`.n```s.h.e`.t```s.t.o``.f`c`. `.s`.e`.h`.c`.t`.e`.r`.t`.s`. `.r```.m`. `.t`.s`.a`.v`. `.A`r`..``.o`c`.f``.e`.h`.t```s.o.n```s.u.t`.o`.b`.a```s`.r``.t`c`.c`.s``.e`.r`.a```s.w.s`.o`.l`.l`.i`.p```s.e.t`.v`.l`.e`.v```s.o.f```s.e.r`.b`.m`.u`.n```s.g.e`.r`.a`.l```sr.A`..`.s`.d`.n`.e```s.i.r`.e`.h`.t```s.o.n```s.k.s`.r`.a`.m```s.t.y`.s`.u`.r```s.t.h`.i`.w```s.d.s`.o`.r```s.c.k`.a`.l`.b```s.o.f```s`.d`.n`.u`.b``.a```s.i.s```s``.r`.o`.c`r`.e```s. .o```s```s`.r``.b`. `.g`.n```s`.u`.s`. `.e``.t`c`.l``.a```s.n.s`.i`.a`.t`.n`.o`.c```s.c.h`.i`.h`.w```s.o.f```s.c.h`.a`.e```s.s.,`.e`.g`.a`.c```s.e.r`.k`.c`.i`.w`r`.l`.l`.a`.m`.s```s`. `.w```s`.a```s.i.s```s.d.e`.i`.s```s.e.r`.h`.t`.o```s.h.e`.t```s.O`. `. `..`.s`.e`.k`.a```s. .s```.g`. ```s.r.c```s``.f`.o``.l`c`.f`r`.t`.i`.p``.a```s.i.s```s.d`.i`.s`. ```s`. ```s```s.y..`.r`.o`.t`.i`.s`.o`.p`.e`.r```s.h.e`.t```s.o.f```s.n.d`.e```s.s.t`.e`.w`.h`.t`.u`.o`.s```s.h.e`.t```s.a.t```s.r.e`.a```s`.Y.o.u. .T.o.n.e. .u. .f.i.e`c.r.n. .r.o.f. .i.l.k.i.d... .I.n.e.r. .l.e. .a.e.d. .l.r`c.i.o. .A.t. .a.r.g.e.l. .g.n. .Y.S. .O.F."`k`d`.d`.n`.e``.W`.S```s.a.t```s`.'`.u`.o`.Y.r.e. ..`k``s``si`k`k`d`.w``.l`.l```s`.o`.t```s.o.u`.y```s.o.r`.f``.l`c`.m`.s``.o`.o`.t```s.a.r`.f```s.i.s```s.c.k`.a`.r`.c```s`.T.h.e. .a. .f.o..`k``s``si`k`k`d``.c`.e`.n`. `.n`.e```s`.b``.a```s.t.h`.i`.w```s.i.t`.p```s.h.e`.t```s`. `.m``.t`c`.b``.e`.h`.t```s.a.t```s.r.e`.a```s`.Y.o.u. .o.o.f. .r.o.k..`k``s``si`k`k`d`.t`.i``.e`.k`.a`.m```s.'.t`.n`.d`.i`.d```s`.Y.o.u. ..`k``s``si`k`k`d`.e``.b`.a`.b`.m`.i```s`.u``.s`.i```s.m`.o`.d`. ```s.T.h.e. .n.c.l..`k``s``si`k`k`d`.p`.o`.t``.e`.h`.t```s.a.t```s.l.e`.o`.h```s.h.e`.t```s.g.h`.u`.o`.r`.h`.t```s.r.y`.r`.u`.c`.s```s.n.d`.a```s.n.t`.a`.l`.p```s.h.e`.t```s.u.p```s.e.r`.b`.m`.a`.l`.c```s`.Y.o.u. ..`k``s``siv`k``s``si`k`k`d`.e`.k`.a`.n`.s``.e`.h`.t```s.b.y```s.e.t`.g```s.'.t`.n`.a`.c```s`.Y.o.u. ..`d`k````s``s`kski``s`k`s``si`k`k`d``.t```s``.f`.o``.l`c`.H``.e`.h`.t```s.o.f`r`.h`.t`.r`.o`.n```s.n.d`.a```s.t.o```s````s.r```s. .p`.e`.g``.s`c`.p``.e`.d`.i`.w```s.o.w`.l```s`.e`.v``.a```s.g.h`.u`.o`.r`.h`.t```s.e.d`.l`.w`.a`.r`.c```s.v.e`.a`.h```s`.Y.o.u. .r.y. .a.a.l.e.l. .a. .M.i.s..k``s``si`k`k`d`.t`.i`.x`.e``.e`.h`.t```s.s.e`.u```s.t.o```s.l.e`.b`.a`.s`.i`.v`.d`.a```s.b.e```s.l.d`.u`.o`.w```s.I.t`r`..`.s`.e`.p`.i`.p```s`.w```s. .s`.r```s.e`.m`.a`.i`.d`.-``.o`c`.-`.1``.f`.o```s`.a`.p``.a```s.g.h`.u`.o`.r`.h`.t```s.u.t`.o```s.w.s`.o`.l`.f```s``.r`.t`.s`. ```s.T.h.e.a.m. .i.r. .f.t.e.r. ..`k``s``si`k`k`d`.t`.i`.p``.e`.h`.t```s.v.e`.a`.e`.l```s.t.o```s.t."`.u`.o`."```s.o.r```s.p."`.u`."```s`.U````s.b..`.m`.i`.l`.c```s.t.o```s.r.e`.e`.h```s.n.g`.i`.h`.t`.o`.n```s.i.s```s.r```s.T.h.e. .s.e. ..`k``s``si`k`k`d`.t`.i`.p``.e`.h`.t```s.o.f```s.u.t`.o```s.n.d`.a```s.n.t`.a`.l`.p```s.h.e`.t```s.u.p```s.e.d`.b`.m`.i`.l`.c```s.v.e`.a`.h```s`.Y.o.u. ..v`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`kk`k`k`ki`k`k`k`ki`k`k`kk`k`ki``s`kkk`k`ki`k`k``s`k`s``s`k`ki``s``s``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki`k`d`..`.r`.a``.b`. ```s.a.m`.t`. `.,```s.r.g`.a`.l`. `.y`.r```s`.a```s.b.y```s.e.d`.w`.o`.l`.l`.o`.f```s.n.g`.i`.e`.b```s.r.e`.a```s`.Y.o.u. .v.er`ki``s``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s`k`s`krk`k`kr`k`ki`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`d`k`````si``s``si``ss`k`ci``si`ki`s``s`ksk``s`k`sik`ki``s``s``s``s``si`k`ki`kk`kk`k``s`k`sikv``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kskik``s``s`ks``s`kk``s``s`ks``s`kk``s`k`s``s``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k``s``s``s``s``s``si`k`ki`kk`kk`k``si`ki`d`k````s`k``s``s`kski``ci```ss``ss`ki``s`ksk``s`k`sik`kiv`k``s``s``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`k`ki`kk`k`ki`k`ki`k`ki`k`ki`k`k`d`..``.H`.G`.U`.L`.P```s.s`.y`.a`.s```s`.i``.v`. `.w``.l`c`.h`. `.A.o.o.c.e. ."r`k`ki`k``s``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s``s``si`k`ki`kk`kk`k``si`k`ki`k``s``siv`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``si`kik``````s``ss``ss`ki``s``ss`k```si``s`k`s``s`ksk`ci``s``s`kskis``s`kski``s`k`s``sivk``s``si`ki`d`k`````ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k````ci``s``s`kski``s`k`s``sivk````s``s`kski``s`k`s``si`kikv`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k```s``s`kski``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`ki`k`ki``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k```s``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`ki`k`k```ss``ss`ki``s`ksk`k`k```ss``ss`k```s`cii``s``s`kski``s`ksk`kii``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``s``si`k`ki`k`ki`k``s``s``si`kkv``s``s``s``si`k`ki`kkv`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k`ki`ki`ki`k``s``si`k``s`d```sii``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``si`k`k`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s`k`s`k``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk``s``s``s``s``si`k`ki`kk`kk`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`kk``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k``s`kk``s``s`ksk`k`ki`k``s`kkk`k`k`ki`k`k`k``si`k``si`k``si`k``siv`k`ki`kkk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`k`s``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k`````s``s`ksk`ci``s``s`kski``s`k`sik`kiv`k``s``s`ks``s`k`s`kc``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`ki`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv`ki`k`k`k``si`k`ki`k``si`k`kiv`k`k`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k``si`k`ki`k``s``s``si`k`ki`k`ki`kk`k`kk`k`k``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k``si`k`ki`k``s``s``s``s``s``s``s``si`k`ki`kk`k`ki`kk`k`ki`kk`kk`kk`k`kk`k`kk`k`kr`k`ki``s`k`s`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`kskk`ki`k``s``s`ksk`k`k`ki`k``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s``si`k``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`ki`k`ki`k`k`ki``s`kk``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`kk`k`k`ki`k`ki``s`kkk``s`k`s``s`ks``s`kk``s`k`s`k``s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``s``s``s``s``s``s``si`k`ki`kk`k`ki`kk`k`ki`kk`kk`k`ki`k``si`ki``s``s``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`k`ki`kk`k`ki`kk`k``s`k`sik`k`kiv``s``s``s``s``s``s``s``s``s``si`k`ki`kk`k`ki`kk`k`ki`kk`kk`k`ki`k`kiv``s``s`d`k````ss``ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``si`ki``s``s``s``s``s``si`k`ki`kk`k`ki`k`ki`kk`kk`k`ki``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`d`k`k`````ss``ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`sikvkk`ki``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s`kk``s`k`s`k`si``s`k`s``s`ksk``s`kkk`k`kk`k`k`ki``s`k`s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s``s`ksk`k`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s`k`s`kc``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k`````s``s``ss`ki``s``s`k`ci``ss``ss`kis```ss`ss``ss`ki``s`ksk``s`k`sik`kiv`ki`k`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k`````si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`sik`kiv`ki`k`k`ki`k``si`k`k`kiv`kk``s`kkk`k`ki`k`k``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``siv`ki``s`kk``s``s`ksk`k`kk`kk`k`ki`k``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k``si`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`k`kk`k`k`ki``s``s``s`ks``s`k`s``s`k``sii``s`k`s`k`s``s`ksk``s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ksk`k`k``s`k`sik`k`k`kiv`k``s`kk``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k`k`ki`k``s`k`s`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`kskk`ki`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`ki``s``s``si`k`ki`kk`kk`k``s``si`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss`ki``s`ksk``s`k`sik`kiv`ki``s`kk``s``s`ks``s`kk``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``si`ki`ki``s`k`s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski``s``s`ks``s`kk``s`ksk`k``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kkk``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskk`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`k`ki`k`k``s``siv`k``s``si`k```s``s`ksk``s`cii``s``s`kski`k``s``siv`k``s``siv`k``s``si`k```s``s`ksk``s`cii``s``s`kski`k``s``siv`k``s``siv`k``s``si`k```s``s`ksk``s`cii``s``s`kski`k``s``siv`k``s``siv`k``s``si`k```ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k```ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k```ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k```ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k```ss``s``ss`k``s`cii``ss`ki``s`kskv`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k``````sss``s`ksk``ci``s``s`kski``s`k`sik`kiv``s`k`s`k``s`kc``s``s`ks``s``s`ks``s`k`s`d`k````s``s`kski``s`k`sik`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`k`ki`k`k``s`k`sik`kkv``s``s`ks``s`k`s`k``s``s`ksk``ci``s``s`kski``s`k`s`k`si``s`k`s`kk``s`k`s`k`s`k`sk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`kkk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k``s`kkk`k`k`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`k`kik`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss```ss`ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``s`k`ci``ss``ss`ki``s`ksk``s`k`sik`kiv``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``s`k`ci``ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`ki``s`kk``s``s`ks``s`kk``s`k`s``s``s``s``si`kk`k`kiv``s``s``s``si`kk`k``si`ki``s``s``s``si`k`ki`kk`k``s`k`sik`k`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``s`k`ci``ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv``s`k`s`d`k````ss``ss``s`k`ci``ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``s`k`ci``ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k`kiv`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss```ss`ss``ss`ki``s`ksk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``ss``s`k`ci``ss``ss`ki``s`ksk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`k`ki`k`k`ki`k`k``s`k`sik`k`k`kiv`ki``s`kk``s`k`s`k``s`d`k``d`.e`.v`.a`.c``.e`.h`.t```s.o.f```s.l.s`.l`.a`.w```s.h.e`.t```s.k.e`.i`.r`.t`.s```s.e.y`.h`.t```s.a`. `.h```s.n.i`.a`.v`. ```s.v`.i`.n`.k`. `.'`.s```s.r.v`.a`.w`.d`. ```s.T.h.e.s. ..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k````ss``ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss```ss`ss``ss`ki``s`ksk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``ss``ss`k``ci``s``s`kski``s`ksk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`sik`kiv``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`kkv`k`ki`k`ki`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss```ss`ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````si``s`k`s``s`ksk`ci``s``s`kski``s`k`sik`kiv``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k````s``s`kski``s`k`sik`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`kk`k`k`kiv`k`ki`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss```ss`ss``ss`ki``s`kskk``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskkv`k``s``si`k``s`k`d`.!`.u`.o`.y``.t`.e`.g```s.e.m`.h`.t```s.o.f``.l`c````s.u.!`.o`.y```s.a.t```s.e.s`.v`.i`.n`.k`r`.w`.o`.r`.h`.t```s.e.m`.h`.t```s`. `.t`.s```s```s.u.!`.o`.y```s.t.h`.i`.w```s.o.m`.o`.r```s.h.e`.t```s.i.n```s.e.s`.v`.r`.a`.w`.d```s.l.e`.t`.t`.i`.l```s`.i```s.t`.a```s.h`.t`r`.l`.a```s.v```s`.w`.o`.n```s.r.e`.a```s.r```s````s.s..`.e`.v`.r`.a`.w`.d```s.h.e`.t```s`.n```s`.w```s`.a`.h`. ```s.k`.c```s. .r`.g`.n`.i`.t`.l```s`.r`. ```s.T.h.e.s.u.s. .a.k.e.d. .T.h.e. .s.e.r.e.n.g. .M.o.f. .A. r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k``s``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s``s``si`k`k`ki``s`k``s`kc``s`k`s`k`ki``ssv``s``si`k`ki`k`k`ki``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s`k`s`k``s`kc``s``s`ks``s``s`ks``s`k`s`d`k````s``s`kski``s`k`sik`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`k`ki`k`k``s`k`sik`kkv``s``s`ks``s`k`s`k``s``s`ksk``ci``s``s`kski``s`k`s`k`si``s`k`s`kk``s`k`s`k`s`k`sk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`kkk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k``s`kkk`k`k`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`k`kik``s`k`s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss```ss`ss``ss`ki``s`ksk``s``s`ks``s`kk``s`ksk`k``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ksk`k`kk`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskk`k`ki``s``s``s`ks``s`k`s``s`k``sii``s`k`s`k`s``s`ksk``s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ksk`k`k``s`k`sik`k`k`kiv`k``s`kk``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k`k`ki`k``s`k`s`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`kskk`ki`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`ki``s``s``si`k`ki`kk`kk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`d`k````ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``si`kk`k`ki`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss```ss`ss``ss`ki``s`ksk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskk`ki`k``s``si`k``s``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k````si``si``s``ss`k`ci``si`ki`s``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`ki`k`ki``s`kk``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskk``s`kk``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss```ss`ss``ss`ki``s`ksk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```si``si``s``ss`k`ci``si`ki`s``s`ksk`k`k`ki``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`ki`k`ki``s`k`s`kk``s`k`s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss```ss`ss``ss`ki``s`ksk``s``s`ks``s`kk``s`ksk`k``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kkk``s`kk``s`kk``s`k`s`d`k``d`.k`.c`.o`.l``.a```s.t.h`.i`.w```s.r.e`.e`.h```s.n.g`.i`.h`.t`.o`.n```s.i.s```s.r```s.T.h.e. .!r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk`k`k`ki`k`ki``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```ci``s``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki`ki`k`k`k```ss``ss`ki``s`ksk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`ki`k`k`k```ss``ss```ss`ss``ss`ki``s`ksk``s``s`ks``s``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k```s``s`ksk```s`cii``s``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`ki`k`k`k``s``s`ksk```s`cii``s``s`kski``s``s`ks``s``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k````ss``ss`k```s`cii``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`ki`k`k`k```ss``ss`k```s`cii``s``s`kski``s`ksk`k``sivv`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s``s``si`k`ki`kk`kk`k``si`k`ki`k``s``siv`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``si`kik``````s``ss``ss`ki``s``ss`k```si``s`k`s``s`ksk`ci``s``s`kskis``s`kski``s`k`s``sivk``s``si`ki`d`k`````ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k````ci``s``s`kski``s`k`s``sivk````s``s`kski``s`k`s``si`kikv`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k```s``s`kski``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`ki`k`ki``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k```s``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskk``s`k`s`k``s`k``s`k``s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``si`kk`kk`k`ki`k`kiv``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss```ss`ss``ss`ki``s`kskk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskk`ki``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s``s``s``si`kk`kk`kk`k`ki`kk`kk`k`ki``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k````ss``ss`k```s`cii``s``s`kski``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``ss`k```s`cii``s``s`kski``s`kskk`ki``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`d`k````si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk``si`k`ki``s``si`kk`k`ki`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k`kiv``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskk``s`kk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k`kik`ki``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`d`k````s`cii``s``s`kski``si`k`ki``s``si`kk`k`ki`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k`kiv``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskk``s`kk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```s`cii``s``s`kski`k`kik`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k````ss``ss``ss`k```s`cii``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk``s`kk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``ss``ss`k```s`cii``s``s`kski``s`ksk``s`kkk`k`ki`ki`k``s``si`k``s``s`k`ki``s`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ksk`k`k`k`ki`ki`k`k`d`k``..`.g`.n`.i`.h`.t``.n`.a`. `.g`.n`.i```.c`. `.t`.o`.n`. `.e```s`.o`.Y.u.'.r`c.a.yri``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k``si`ki`k`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`sik`kiv``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ksk`k`k`ki`k`k`k`ki`kiv``s`k`si``s`kk``s`k`s`d`k````sii``s`k`s`k`si``s`k`s`kk``s`k`s``s`ks``s`k`s`ks``s`k`s`k`s`k`ki``s``s`ks``s`kk``s`ksk`kk``s`k`s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`kk`k`ki``s``s``s``s``s`k``s`kc``s`k`s`k`ki``ssv``s``s``si`k``si`ki`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`sik`kiv`k. ``s``s``si`k``si`k`ki`k``s``siv`k``s``si`k`d`.y`.e`.k``.f`.o```s`.S.e.t. .s`k``s``si`k`d`.r`.e`.t```s.l`. `.s`.s```s.B.r.a.n`d`k````s``s`kski``s`k`s``sivk``s``si`k`d`.g`.a``. `.r`.e`.k```s.W.i.c.e`d`k````s``s`kski``s`k`s``si`k`d`.o`.r`. `.k`.c`.a`.l`.B.dk````s``s`kski``s`k`s``sivk``s``si`k`d`.g`.a`.c``.n`.i```s.r.d`.i`.b```s````s.L.i.t.l.e. .e`k``s``siv`k``s``si`k`d`.o````s.p.i`. `.t`.e`.v```s.V.e.l.w`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`d`.!`.T`.N`.U`.R`.G`.>`. `.m``.l`.c`. `.t`.n```s.G.i.a.<`k``s``si`k`d`.!`.N`.A`.O`.R`.G`.>`. `.r`.e``.s`.y`.o`. ```s`.i`.G.a.n.t.<`k``s``si`k`d`.y`.a`.d`.o`.T`. `.r``.k`.n`.u`.l```s`.".S.p.e."`d`k````s``s`kski``s`k`s``sivk``s``si`k`d````s`.y`.t`.s`.a`.T. .f.o.d`k``s``si`k`d`.l````s`. ````s`.S.m.a.l.b.o.t.e`k``s``si`k`d`.l````s.b.o`. `.e`.h```s.n. `.i`. `.r`.e```s.W.a.t.e`k``s``si`k`d`.l````s``.e`.h`.t```s.i.n```s`.O.i.l. .b.o.t.e`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k`d`.x``. `.s`.'`.f`.r```s.D.w.a.e`d`k`````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`d``.i`.r``.t`c`.B.a.e.s`k``s``siv`k``s``si`k`d`.e````s.n.u`. `.d`.l`.o```s.e. ```s`.L.a.r.g.t`k``s``si`k`d`.d`.n`.o`.m``.i`.d`. `.l```s`.v`.e`.S.e.r.a.s`k``s``si`k`d`.e`.v`.l`.i`.s`. `.f`.o`. `.s```s.B.a.r`k``s``si`k`d`.r`.l``.w```s. .j`.s`.u`.o`.i`.c```s.P.r.e.y`k``s``si`k`d`.n`.i`.o`.c`. `.e`.r`.a`.R.s`k``s``si`k`d`.s``.h`.c`. ```s.u.r`.s`.a```s.T.r.e.t`k``s``si`k`d````s. `.n```s`.o`.G.l.d.e.g.s`k``s``si`k`d`.n`.e``.i`.r`.t`. ```s.l```s`.J.e.w.e.d.t`k``s``si`k`d`.s`.a`.v`. `.g`.n`.i`.M.e`k``s``si`k`d`.l`.a`.r``.m```s.d. ```s`.s`.-`.g`.g`.E.i.z.e.d`k``s``si`k`d`.i`.m``.r`.y`.p`. `.m`.u`.n`.i`.t```s.P.l.a.d`k``s``si`k`d`.r`.a`.e`.p`. `.g`.n``.n`.e`.t`.s```s.G.l.i.l`k``s``si`k`d`.u``. `.n`.a`.i`.s```s.P.e.r.g`k``s``siv`k``s``si`k`d``.c`.i`.p`.s`. ```s`.R.a.r.e.s`k``s``si`k`d`.i`.a`.h`.c`. ```s`.l`.o`.G.d.e.nv`kk`kr`ki``s`k`s`k`d`.:`.g`.n`.i`.w``.l`.l```s``.h`.t`. `.g`.n`.i`.d`.l`.o`.h`. `.y`.l`.t`.n``.r`c`.c`. `.e`.r`.a`. ```s.Y.o.u.e. .f.orkv``s``s`d`k```sii``s`k`s``s`ksk``s`kk``s`k`s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`ki`k`ki`k`ki``s`kk``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k`s`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`kskk`ki`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`k`ki`k`ki`ki``s``s`k`ki``s``s``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki`k`d`..`.r`.a``.b`. ```s.a.m`.t`. `.,```s.r.g`.a`.l`. `.y`.r```s`.a```s.b.y```s.e.d`.w`.o`.l`.l`.o`.f```s.n.g`.i`.e`.b```s.r.e`.a```s`.Y.o.u. .v.er`ki`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk`k``s``si`k``s`k``s`d`k``d``.K`.O`.O`.L```s.y`.a`.s```s.n.,`.o`.i`.t`.p`.i`.r`.c`.s`.e`.d``.l`c`.f``.e`.h`.t```s.e.t`.g```s````s.t..`.i```s.t.o```s.m.e`.o`.c```s.o.u`.y`r`.e`.m`.i`.t```s.s.t`.r`.i`.f```s.h.e`.t```.f`. `.n`.i`. `.e`.c`.a```s`.a```s.b.e`.i`.r`.c`.s`.e`.d```s.l.y`.n`.o``.l`c`.I``.n`.o```s.o.w`.n```s.o.m`.r`.f```s`.a`.k`.O.y.,. .'. .p.l`c.u. .T.o. .u. ."..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkv`k``s``si`k``s``s``s``s``s`k`d`.e`.r`.o`.c`.s```s.l.d`.u`.o`.w```s.o.u`.y```s.w.,`.o`.n```s.i.t`.u`.q```s.t.o```s.r.e`.e`.w```s.o.u`.y```s.I.f. ``s`d`k```sii``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``si`k``s`k`sik`k`ki`d`k``````ss`ss``ss`ki``s`ksk``s`k`sikv``s``s`ks``s``s`ks``s``s`ksk`k`k``si`k`ki`k`k``s``si`k.0`k``s``si`k.1`k``s``si`k.2`k``s``si`k.3`k``s``si`k.4`k``s``si`k.5`k``s``si`k.6`k``s``si`k.7`k``s``si`k.8`k``s``si`k.9v`k`kk``s`k`s``s`ks``s``s`ks``s`k`s`d`k```sii``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`kk`k``s`kk``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k``s`k`s`kk``s`k`s`kk``s`k`s``s`ks``s`k`sik``s`kk``s`k`s`d`k```sii``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`ki`k`kk`k`k`ki`k`k`k`ki`k`ki``s``s`ksk`k`ki`k`k`k`ki`k``s`k`s`d`k````ss```ss`ss``ss`ki``s`ksk``si`kik``s`kk``s`k`si``s``s`ks``s``s`ksk`k`k``s`k`sikv`k`k`ki``s`kk``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`kk`k`k``s``s``si`k``si`k`ki`k``s``si`k.0`k``s``si`k.1`k``s``si`k.2`k``s``si`k.3`k``s``si`k.4`k``s``si`k.5`k``s``si`k.6`k``s``si`k.7`k``s``si`k.8`k``s``si`k.9v`kk`k`ki``s`d`k```sii``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`ki`k`kk`k`k`ki`k`k`k`ki`k`ki``s`d`k```ci``s``s`kski``si`ki``s``s``s`d`k```sii``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`ki`k`kk`k`k`ki`k`k`k`ki`k`ki``s`d`k````ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``si`ki``s``s``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`k`ki`k`k`k```si``s`k`s``s`ksk`ci``s``s`kski`k`k`ki`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s`k`s`k``sii``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``si`k``s`k`sikv`d`k`````si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`sik`ki`k`k`ki``s`k`s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`kc``s`k`s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`k`kk`k`k`ki`k`k`ki`k`ki`k`k`k`k`ki``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`k`ki``s`kk``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`kk`k`k`k``si`ki`k`k`d`k`````ss``ss`ki``s`ksk``s`k`sik`kiv``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`k`kkv`k`k`ki`k`ki`k`k`k`k``s``s`kski`k``s``s`ks``s``s`ks``s`k`s`d`k````s`k``s``s`kski```ss``s`k`ci``ss``ss`ki``s`ksk``s`k`sikv``s``s`ks``s``s`ksk`k`k``s`k`sik`k`k`ki`ki`k`k`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s`k`si``s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`sik`k`k`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k`d`k````s`k``s``s`kski```ss``s`k`ci``ss``ss`ki``s`ksk``s`k`sik`k```s`cii``s``s`kskiv`k`kk`k``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`kk`k`k`ki`k`k`ki`k`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk`kk`k`ki`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`k```ss```ss`ss``ss`ki``s`ksk``s``s`ks``s`kk``s`ks``s`k`s`d`k```sii``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`ki`k`kk`k`k`ki`k`k`k`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss`ki``s`ksk``s`k`sikv`kk`k`ki`kk`k`ki`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss`k```s`cii``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``si`ki`k`d`k`````si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`sik`kiv`k`k`ki`k`k`k`ki`k`ki`kk`k`ki`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k`k`ki`k`k`k```si``s`k`s``s`ksk`ci``s``s`kski`k`ki`kk`k`ki`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`d`k```sii``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``si`k`k`ki`k`k`ki``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`kk`k`kk`k`k`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`kk`kk`k`ki`k``s`k`sikv`k``s`k`sikv`ki`k`d`..`.0`.5`.3`. `.e`.l`.b`.i````s``.a```s.o.f```s`.o`r.u.t. .p.o.sr`ki``s``s``s`d`k```s`kc``s`k`s`k`k`ki``ss`k`kk`c``s`d`k`ci``s`kc``s``s`k`s`d`k``ki````d`.w`.o`.n``.t`.i`.u`.q```s.t.o```s.s.h`.i`.w```s.e.d`.e`.d`.n`.i```s.o.u`.y```s.D.o. .?`d`.*`.*`r. @i``s``s`ks``s`k`s`k`ki``s``s`ks``s`k`s``s``s`d`c``s``s`d`?yi`ki``s`d`?Yi`ki`k`d`.K`.O..`krk`k`ki``s``s`ks``s`k`s`k`ki``s``s`ks``s`k`s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`k`d`.K`.O..`krkv`k``s``s`k`ki``siv`d`k``..`.o`.N``.r`.o```s`.Y`. `.r```s.s.w`.n`.a`. ```s.a.s```s`. .P.l.e.s. ri`k`d``ki``ci`c```c``s`k`ki``s`d`? +iv@i``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``s`k`ci``ss``ss`ki``s`kskk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk`ki`k``s``si`k``s``s``s`d`k```s`kc``s`k`s`k`k`ki``ss`k`kk`c``s`d`k`ci``s`kc``s``s`k`s`d`k``ki````d`.w`.o`.n``.t`.i`.u`.q```s.t.o```s.s.h`.i`.w```s.l.y`.l`.a`.e`.r```s.o.u`.y```s.D.o. .?`d`.*`.*`r. @i``s``s`ks``s`k`s`k`ki``s``s`ks``s`k`s``s``s`d`c``s``s`d`?yi`ki``s`d`?Yi`ki`k`d`.K`.O..`krk`k`ki``s``s`ks``s`k`s`k`ki``s``s`ks``s`k`s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`k`d`.K`.O..`krkv`k``s``s`k`ki``siv`d`k``..`.o`.N``.r`.o```s`.Y`. `.r```s.s.w`.n`.a`. ```s.a.s```s`. .P.l.e.s. ri`k`d``ki``ci`c```c``s`k`ki``s`d`? +iv@i``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``s`k`ci``ss``ss`ki``s`kskk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk`ki`k``s``si`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````s``s`ksk`ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik`k``s``si`k``s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``s``s``s``s``si`kk`kk`kk`kk`kk`kk`k`ki`k`kk`k``si`k`ki`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`s``sivk``s``si`ki`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`s``sivk`````ss``ss`ki``s`ksk``s`k`s``si`kikv`kk``s`k`s`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk````ss`ss``ss`ki``s`ksk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k`ki``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k``s``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``si`kkvk``s`k`s`d`k``ki``. `.,`.y`.a`.k`.O."i``s``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`kk`k`kk`k`kk`k`kk`k`ki``s`k`s`d`k``ki``..`."ri``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk`ki``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``si`kk`kk`kk`kk`kk`k`ki`k`k`ki``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k``s``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``si`k`ki``si`k`kikk`ki`k``s``si`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`k``s`d`k``d`.s`.u`.o``.c```s`.d``.s`.a`.w```s.i.t```s.u.,`.o`.y```s`.a`.h`.T.n.k. .e.l.i.!r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk`k`d`k`````ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`k`ki`k`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k````s``s`kski``s`k`s``sivk``s``si`ki`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk````s``s`kski``s`k`s``si`kik``s``siv`k``s``si`ki`d`k`````s`cii``s``s`kski``s`k`s``sivk``s``si`ki`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`kiv`k`kk`ki``s`kk``s`k`s`d`k``d``.t`.i`.t``.p`c``.y`.m```s.s`.o`.l`. ```s.u.s`.j`. `.I`. `.k`.n`.i`.h```s.I. .t. .a.e..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskkv`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``s``s``si`kk`kk`k`ki`k``si`ki`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``si`k`ki`kk`kk`k``si`ki`d`k````s``s`ksk```s`cii``s``s`kski``s`k`sik`kiv`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k`````ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`sik`kiv`ki``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k````ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki``s``s``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`k`ki`kk`k`ki`k`ki`k`ki`k`ki``s`k`s`k``s``s``s``s``s``s``s``s``s`d`k````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kk`k`ki`k``si`k`ki``s``s`d`k````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s``s``s``s``s``s``si`k`ki`kk`k`ki`kk`k`ki`kk`kk`kk`kk`k`ki`kk`kr`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k`````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k``s``si`k`k`ki`kik``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`ki`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`ki`k`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskk``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k``s``s`kski`k`ki`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s``s``s``si`kk`kk`kk`k`ki`kk`kk`k`ki``s``s``s``s`d`k````ss``ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kk`ki`ki``s``s`ks``s`kk``s`k`s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k``s`d`k`````ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`kkk`kk``s``s`ks``s`k`s`kc``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k````ss``ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`ki`k`k`d`k``d`..`.m````s`.e`.h`.t```s.o.f```s.l.s`.l`.a`.w`r`.e`.h`.t``.s`c`.r`.c`.a`. `.d``.h`.s`.a`.l`.p`.s`. `.y`.l`.n``.d`c`.s``.e`.r`.a```s.o.u`.y```s`.a`. ```s.i`.s```s.p`.x`.e`. `.d`.u`.o```s.a```s.i.s```s.r```s.T.h.e. .l.o.n.d. .u.e.o. .r.or```si``s`k`s``s`ksk`ci``s``s`kski``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k`````ss``ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv`ki`k`k`d`k``d`.!`.u`.o`.y`. `.g`.n``.d`.u`.l`.c`.n```s.,. `.h`.t`.a`.p`. `.s`.t```s.n. ```s.g. `.n```s`.y`.r``.v```s.g. `.n`.i`.y`.o`.r`.t`.s```s. .d`.,```s``. `.e```s. .t```s.u.g`.o`.r```s`.n`.i`r`.s`.r`.u`.o`.p```s.v.a`.a`.l```s.e.n`.t`.l`.o`.m```s.o.f```s.e.r`.v`.i`.r```s```s.e..`.l`.b`.b`.u`.r```s.h.e`.t```s.i.n```s.e.s`.k`.a`.n`.s```s.h.e`.t```s.n.g`.i`.y`.r`.u`.b```s```s.w`r`.r```s``.h`.t`. `.n`.i`. `.s`.r`.a``.p`c``.e`.l`.o`.h```s.o`.o`.f`.-`.y```s.e.n`.w```s.a```s`.a`. ```s.i`.s```s.p`.x`.e`. `.d`.u`.o```s.a```s.i.s```s.r```s.T.h.e. .l.o.n.d. .t. .a.e. .f.a.l.,. .A. .t.h.o.l.e.t.h.ir```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``si`k`d`k``d`..`.t`.e``.n`.u```s.e`.h`.t```s.t.o`.n`.i``.f`c`. ``.e```s``.e`.v`.d`.a`. `.g```s.r.i`.e`.u`.q```s``.e`.h`.t```s.r.y`.r`.a`.c```s`.v`.l```s.y. `.l`.d`.n```s`.f`r`.f`.o`. `.d`.n`.a`.b`. `.g`.n`.i``.e`c`.c``.a```s.r```s.w.h`. `.,```s````s`.n`.i`.a`.m```s.h.e`.t```s.i.n```s.l.f`.e`.s`.r`.u`.o`.y```s.n.d`.i`.f```s.n.d`.a`r`.e`.l`.o`.h```s.h.e`.t```s.g.h`.u`.o`.r`.h`.t```s.c.h`.r`.a`.m```s`.Y````s.e..`.l`.b`.b`.u`.r```s.h.e`.t```s.i.n```s.e.s`.v`.r`.a`.w`.d```s.h.e`.t```s.n.g`.i`.y`.r`.u`.b```s```s.w`r`.r```s``.h`.t`. `.n`.i`. `.s`.r`.a``.p`c``.e`.l`.o`.h```s.o`.o`.f`.-`.y```s.e.n`.w```s.a```s`.a`. `.,```s.i`.s```s.p`.x`.e`. `.d`.u`.o```s.a```s.i.s```s.r```s.T.h.e. .l.o.n.d. .t. .a.e. .f.a.l.,. .o.u. .o.f.i.c.e. .h.r.i.e.s. .c.o.n.t.u.r.o. .sr``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`kskv``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskk`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``si`kk`kk`k`ki`k``si`ki`d`k````s``s`kski``s`k`sik`kiv``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`ki`k``s``si`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`ki`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`ki``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`kk`k`k`ki`ki``s`kk``s`k`s`d`k``d``.r```s.w.h```s`.s``.e`.r`.e`.h```s.n.d`.u`.o`.r`.a```s.i.s```s.n.t`.a`.w```s.o.u`.y```s`.v```s`.h`.w`. `.y```s.e.s`.r```s`.I. .d.a.t.e.r. .o.m.e..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`ki``s`kk``s``s`ks``s`kk``s`k`s``s``s``s``si`kk`k`kiv``s``s``s``si`kk`k``si`ki``s``s``s``si`k`ki`kk`k``s`k`sik`k`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`ki`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`sik`kiv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````si``s`k`s``s`ksk`ci``s``s`kski``s`k`sik`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k````s``s`kski``s`k`sik`kiv`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`sik`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`kkv`k`ki`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````si``s`k`s``s`ksk`ci``s``s`kski``s`k`sik`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`kk`k`k`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k``````sss``s`ksk``ci``s``s`kski``s`k`sik`kiv``s`k`s`k``s`kc``s``s`ks``s``s`ks``s`k`s`d`k````s``s`kski``s`k`sik`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`k`ki`k`k``s`k`sik`kkv``s``s`ks``s`k`s`k``s``s`ksk``ci``s``s`kski``s`k`s`k`si``s`k`s`kk``s`k`s`k`s`k`sk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`kkk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k``s`kkk`k`k`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`k`kik`k`ki`k`ki`k`ki`k`ki`ki``s`kk``s`k`s`d`k``d`.u`.o`.y``.h`.t`.i`.w```s.r.e`.e`.h```s.h.t`.g`.i`.r```s.i.s```s.n.t`.a`.w```s.o.u`.y```s.a.t`.h`.w```s.v```s.l.i```s`.I. .b.e. ..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskkv`k``s``si`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k``````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s`k`sik`kiv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k`````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki`ki``s`kk``s`k`s`k`d`..`.d`.n`.u`.o`.r`.g``.e`.h`.t```s.t.o```s.l.y`.e`.t`.a`.c`.i`.l`.e`.d```s.i.t```s.e.d`.l`.r`.u`.h```s.n.d`.a```s.s.e`.a`.v```s.h.e`.t```s.e.n`.k`.a`.t```s.v.e`.a`.h```s`.Y.o.u. r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k`````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`ki``s`kk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk``s`k`s`d`k`````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk``s`kkk`k`ki``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k````s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski``s`k`sik`kiv`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`kk`k`k`ki`ki``s`kk``s`k`s`d`k``d`.h`.c`.a`.e`.r``.o`.t```s.o.u`.y```s.o.r`.f```s.u.p```s.a.r`.f``.o`c``.s`.i```s.I.t. .t. ..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s`k`si``s`kk``s`k`s`k`d`..`.s`.t`.n`.e`.m`.g`.a`.r`.f``.y`.n`.i`.t```s.a.d`.i`.r`.y`.m`r`.a```s.t.o`.n`.i```s.r.s`.e`.t`.t`.a`.h`.s```s.i.t```s`.p`.u``.r```s`. `.,```s.l`.b`. `.g`.n`.i`.d`.n`.u```s.e.s`.r`. `.a`. `.r``.r`c`.m``.e`.h`.t```s.k.e`.i`.r`.t`.s```s`.Y.o.u. .i.o.w.h.e.o.n. r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk````sss``s`ksk``ci``s``s`kskikv`k``s``si`k``s`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k``````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kskik``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k``````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k``s``s`kskik`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s``s``s``si`kk`kk`kk`k`ki`kk`kk`k`ki``s``s``s``s``s``si`kk`kk`k`ki`k``si`ki`d`k``````sss``s`ksk``ci``s``s`kski``s`k`sik`kiv``s`k`s`k`d`..`.e`.x`.a``.s`.i`.h```s.o.r`.f```s.b.s`.a`.r`.g```s.n.d`.a```s.s.,`.e`.s`.r`.u`.c```s.u.,`.o`.y`r`.t`.a```s.o.k`.o`.l```s.n.e`.o```s.e.s`.k`.a`.t```s.y.,`.l`.i`.p`.m`.u`.r`.g```s.u.p```s.e.s`.k`.a`.w```s.h.o`.w```s.f.,`.r`.a`.w`.d```s.s.t`.e`.r`.a`.e`.n```s.h.e`.t```s.o.d`.r`.p```s`.Y.o.u. r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk````sss``s`ksk``ci``s``s`kskik``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskk`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`d`k```s``s`kski``si`k`ki``s``si`kk`k`ki`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`kk`k`k`ki``s`kk``s`k`s`k``s`k`d`..`.n`.o``.w`.o`.n```s.i.s```s.m.p`.a`.l```s`.o`.Y.u.r. r``s``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`kk`k`ki`kk`k`ki`k`ki`k`k``s``s`ksk```s`cii``s``s`kski`k`k```ss``ss`ki``s`ksk`kii``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k````s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`kik``s`kk``s`k`s`d`k``d`.r`.e`.w`.o`.p``.f`.o```s.u.t`.o```s.u.n`.r```s.a.s`.h```s.m.p`.a`.l```s`.o`.Y.u.r. ..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk`k`ki`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`d`k```s``s`kski``si`k`ki``s``si`kk`k`ki`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskk``s`k`s`k``s`d`k``ki``..````s`.w`.o`.n```s.i.s```s.m.p`.a`.l```s`.o`.Y.u.r. .o.fri``s``s`k`ki``s``s``s``s``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s``s``si`k`ki`kk`kk`k``si`k`ki`k``s``siv`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``si`kik``````s``ss``ss`ki``s``ss`k```si``s`k`s``s`ksk`ci``s``s`kskis``s`kski``s`k`s``sivk``s``si`ki`d`k`````ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k````ci``s``s`kski``s`k`s``sivk````s``s`kski``s`k`s``si`kikv`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k```s``s`kski``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`ki`k`ki``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k```s``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`ki`k`d`.t`.i`.p``.a```s.t.o`.n`.i```.f`. `.y```s.k.e`.i```s.t`.s`.o`.m``.l`c`.w``.u`.o`.y```s.e.d`.e`.c`.o`.r`.p```s.o.u`.y```s````s.k..`.r`.a`.d```s.c.h`.t`.i`.p```s.o.w`.n```s.i.s```s.I.t. .I.f. .i. .l`c.a. ..`kr`ki`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k````s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik`ki`k``s``si`k``s``s``s`ks``s`k`s`kc``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`kiv`k`ki`ki``s`k`s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`kkv`k`ki`k`k`ki``s`kk``s``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki`k`ki``s`k`s`kk``s`k`s``s`ksk``s`kkk``s`kk``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskk`k`k`ki``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`sik`kiv`ki``s`k`s`kk``s`k`s``s`ksk``s`kkk``s`kk``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``ss``ss```ss`ss``ss`ki``s`kskv`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``si`kk`k`ki`kk``s``s``s``s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`ki``s`k`s`k``s`k``s`d`k``d`.y`.t`.p`.m`.e``.w`.o`.n```s.i.s```s.e.r`.t`.a`.w```s.o.f```s.l`.t`.t`.o`.b`. ```s.T.h.e. ..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k`````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`kik``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskk`ki`k``s``si`k``s``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`kiv`k`ki`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv`k`ki``s``s`ks``s`k`s`ks``s`k`s`k`s`kc``s`k`s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki`ki``s`k`s`kk``s`k`s``s`ksk``s`kk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k````s``s`kski``s`k`sik`kiv`ki``s`k`s`kk``s`k`s``s`ksk``s`kk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```si``s`k`s``s`ksk`ci``s``s`kski``s`kk``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskkv``s`k`s``s`ksk``s`kkk`k`ki`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`ki`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`sik`kiv``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````si``s`k`s``s`ksk`ci``s``s`kski``s`k`sik`kiv`ki``s`kk``s`k`s`d`k``d``.a`.h```s.r`.u`.o`.p```s.'.t`.n`.a`.c```s`.Y.o.u. .t..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s`k`si``s`kk``s`k`s`k``s`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s`k`ci``ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``s`k`sik`k`k`kiv`ki``s`kk``s`k`s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``si`kk`kk`k`ki`k``si`ki`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`sik`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s`k`ci``ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k``si`k`ki``s``s`ks``s``s`ks``s`k`s`d`k````ss``s`k`ci``ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`kr`k`ki``s`k`s`k``s`k``s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```s``s```ss`ss``ss`kis``s`k``si``s``ss`k`ci``si`kis``s`ksk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk``s`d`k````ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s`k`ci``ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k``si`k`ki`k`k``s``si`k`ki`k``s``si`k`ki`k``s``si`ki`k``s``si`ki`k``s``si`k``s``s`kskiv`k`kk`kk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k`````ss``s`k`ci``ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k``s``s``si`k``s`k`sik``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k``s``s`ks``s`k`s`k``s``s`kskik`ki`d`k````s``s`kski``s`k`sik`k`kik``s`k`s`d`k``d`.?`.r`.e`.t`.a`.W```s.,`.s`.k`.s`.a```s.n.d`.a```s.e.s`.v`.a`.e`.l```s.t.s`.i``.f`c``.l`.i`.o```s.h.e`.t```s.e.s`.k`.a`.h`.s```s`.t``.a```s`.d`.n```s.t`.n`.a`.l`.p```s`.T.h.e. .i.g.n.l.y. .o. ."r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk`kik``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``s`k`sik`k`k`kiv`ki``s`kk``s`k`s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``si`kk`kk`k`ki`k``si`ki`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`sik`kiv``s`k`s`k``s`d`k``d`.e`.g`.d`.u`.b``.t`.'`.n`.o`.w```s.n.d`.a```s.o.w`.n```s.e.d`.t`.s`.u`.r```s.l.y`.h`.g`.u`.o`.r`.o`.h`.t```s.t`.i`.u`.q`. ```s.a.r`. `.s```s.n.g`.i`.h`. ```s.T.h.e. ..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s`k`s`k``s`d`k``d`.n`.e`.p`.o``.w`.o`.n``.l`c`.w``.r`.o`.o`.d```s.h.e`.t```s.a.t`.h`.t```s.s.o```s.e.s`.g`.n`.i`.h```s.h.e`.t```s.u.p```s.e.d`.e`.r`.f```s.a.s`.h```s.i.l`.o```s`.T.h.e. .i. ..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`kik`kik``s`k`si``s`kk``s`k`s`d`k``d`.t`.e`.w``.s`.i```s.n.d`.u`.o`.r`.g```s.h.e`.t```s.n.d`.a```s.t.y`.p`.m`.e```s.i.s```s.l.e`.t`.t`.o`.b```s`.o`.Y.u.r. ..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskkv``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s``s``s``s``si`kk`kk`k`ki`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k`````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`kikv`k``s``si`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k``````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s`k`sik`kiv`ki``s`kk``s`k`s`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`kk`k`ki`k`ki`ki``s`kk``s`k`s`d`k``d`..`.e`.s`.a`.v``.e`.h`.t``.l`c`.f``.o`.t```s.c.h`.i`.h`.w```s.t.h`.i`.w```s.r.e`.e`.h```s.n.g`.i`.h`.t`.o`.n```s.i.s```s.r```s.T.h.e. .i. rr``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k`````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`ki`ki``s`kk``s`k`s`k`d`..`.e`.s`.a`.v``.e`.h`.t```s`.r``.t`c`.h`.s`. `.y`.l``.t`.a`.c`.i`.l```s. .d`.s`.a`.h`. ```s.u.r`.t`.a`.r```s.m.p```s. .t`.n`.i`. ```s.n.g`.a`.h`.c`. `.n``.d`c`.s`. `.e`.h`.T.u.e.a.e.d. r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk````ci``s``s`kski```s```ss`ss``ss`kis``s`kskik``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k``s``s`kskivk``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`ki``s`kk``s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k```ki``s`k`sik`kiv`k`k`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k`k`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k`kik``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k```ki``s`k`sik`kiv``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k``i``s`k`sik`kiv`k`k`ki``s`kk``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`ki`k`ki`k`ki`ki``s`kk``s`k`s`d`k``d````s.f.u`. `.y`.d`.a`.e`.r```s. .a`.s`.i`. `.e``.t`c`.b`. `.r`.u`.o`.Y.o.l..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`kk`k`ki`k`ki`ki``s`kk``s`k`s`d`k``d`.e`.l````s``.e`.h`.t``.l`c`.f``.o`.t```s.c.h`.i`.h`.w```s.t.h`.i`.w```s.r.e`.e`.h```s.n.g`.i`.h`.t`.o`.n```s.i.s```s.r```s.T.h.e. .i. .b.o.t..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s`k`si``s`kk``s``s`ks``s`kk``s`k`s``s``s`ks``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k`d`.f`.o```.f`. `.w`.o`.n`. `.s`.i`. `.e``.t`c`.b`. `.r`.u`.o`.Y.o.l`c.u. ``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kkk`k`k`k`d`.i`.o.l`k`k`k`d`.e`.t`.a`.w.r`k`ki`k`k`d`..r`k`ki`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki``s`k`s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kkk`k`k`k```si``s`k`s``s`ksk`ci``s``s`kski`k`k`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski`k`ki`k`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk`k`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk`kk`k`ki``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k``s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kkk`k`k`k``s``s`kski`k`k`k`ki`k`ki`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`kk`k`k`kivv`k``s``si`k``s``s`k`ki``s``s``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s``s``s``s``si`kk`kk`k`ki`k``si`k`ki``s``si`kk`k`ki`kk`ki`ki``s``s``s``s``s``s``si`k`ki`kk`k`ki`kk`k`ki`kk`k`ki`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s``s`k`ki``s``s``s``s``s``s``s``s``s``s``s``si`kk`kk`k`ki`k``si`k`ki``s``s``s``s``si`k`ki`k`ki`k`ki`kk`kk`kk`k`kiv``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk``s`k`s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`sik`kivv`ki`k`k`k`d`.d`.e`.k`.c`.o`.l``.l`.l`.i`.t`.s```s.i.s```s.i.n`.a`.h`.c```s`.T.h.e. ..``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`sik`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k``i``s`k`sik`kiv`ki`k`k`k`d````s``.e`.h`.t```s.t.o```s.e.d`.n`.i`.a`.h`.c``.l`c`.t`.s``.s`.i```s``.b`. ```s.T.h.e.a.r. .i. .w.a.l..``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``s`k`ci``ss``ss`ki``s`ksk``s`k`sik`kiv``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s`k`ci``ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k`kiv`ki`k`k`k`d````s.f.r`. `.d``.l`c`.p``.e`.b```s.o`.n`.n`.a`.c`. `.d`.n`.a`. `.s``.o`c`. `.p````s. .d`.y`.l`.l`.a`.n`.o`.i`.t`.p```s.x.c```s.s`.a`.h```s.n.t`.a`.l`.p```s`.T.h.e. .e.r.t. .u.e..`k``si`k`k`d``.u`.o`.i`.r`.e```s.e`.b```s.'.t`.n`.a`.c```s`.Y.o.u. .s.!v`kr``s``s``s``s``s``s``si`k`ki`kk`k`ki`kk`k`ki`kk`k`ki`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s`k``s``s`k`ki``s``s``s``s``s``s`d`k```sii``s`k`s``s`ks``s`kk``s`ksk``s`kk``s`k`s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`kc``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`ki`k`ki`k`k`ki``s`kk``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`sik`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k`````si``s`k`s``s`ksk`ci``s``s`kski``s`k`sik`kiv`k`ki`k`k`ki`k`ki`k``s`kk``s`k`s`kk``s`k`s``s`ksk``s`kkk`k``s`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ksk`k`k`ki`ki``s`k`s`kk``s`k`s``s`ksk``s`kk``s``s`ksk`k`ki`k`k`k`k``si`k`kiv``s`k`s`kk``s`k`s`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`kskk`ki`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`k`ki`k`ki`ki`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`sikv`k`d`..`.t`.s`.r`.i`.f``.g`.n`.i`.h`.t`.e`.m`.o`.s```s.o.p`.r`.d```s.t.o```s.v.e`.a`.h``.l`c`.u`.o`.Y````s.e..`.r`.o`.m```s`.i`.h`.t``.n`.a`. ``.r`c`.c``.t`.'`.n`.a`.c```s`.Y.o.u. .a.y.n.g. .'. r``s``s``s``s``s``s``si`k`ki`kk`k`ki`kk`k`ki`kk`k`ki`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s`k``s`k``s`k``s`k``s`d`k``d`.K`.O..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``si`kk`kk`k`ki`k``si`ki`d`k`````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kk`k``si`ki`d`k``i``s`k`sik`kiv`k`ki``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`ki`k`ki`ki``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k`k```si``s`k`s``s`ksk`ci``s``s`kski`k`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski`k`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk`k`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svkk`ki``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s``s``s``s``si`kk`kk`k`ki`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv`ki``s`kk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk`k`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k````s``s`ksk``ci``s``s`kski``s`k`sik`kiv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k`kiv`ki``s`kk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk`k`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``s`k`si``s`kkkv``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``si`kk`kk`k`ki`k``si`ki`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv``s``s``s``s`d`k````ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`ki``s``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`ki`k`k`d`..``.i`. `.h`.c```s.c.a`. ```s```s``.u`.o`.y```s.n`.a`. ```s.b`.r`.u`.t`.s`.i`.d`r`.s```s.o.m`.c```s`.t`.i```s.c.h`.a`.o`.r`.p`.p`.a```s.o.u`.y```s.a.s```s.u.t`.b```s``.r```s.n.t```s.u`.o`.y```s.e.n`.h`.w```s.i.d`.a`.r`.f`.a`.n`.u```s.a.s`.w```s.r.d`.i`.b```s`.T.h.e. .e.d.,. .b.e.d. .c.a.n.o.tr``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s``s`ksk``ci``s``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`ki``s`kk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`kik``s`kk``s``s`ks``s`k`s`k`d`..`.t`.i``.y`.r`.r`.a`.c```s.o.t`.n`.n`.a`.c```s.o.u`.y```s.u.t`.b```s.d.,`.r`.i`.b```s.h.e`.t```s.c.h`.t`.a`.c```s.a.n`.c```s`.Y.o.u. r``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk`k`kik`ki``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``si`kk`kk`k`ki`k``si`ki`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`sik`kiv`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````si``s`k`s``s`ksk`ci``s``s`kski``s`k`sik`kiv`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`sik`kiv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````si``s`k`s``s`ksk`ci``s``s`kski``s`k`sik`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k````s``s`kski``s`k`sik`kiv`k`ki``s`kk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`kk``s`k`s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki``s`k`s`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``ss`k```s`cii``s``s`kski``s`ksk``s``s`ksk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k`ki`ki``s``s`ks``s`k`s`k`d`..`.t`.i``.y`.r`.r`.a`.c```s.t.o```s.c.h`.i`.h`.w```s.i.n```s.n.g`.i`.h`.t`.o`.n```s.v.e`.a`.h```s`.Y.o.u. r``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk`ki``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk`k`kik`ki`k``s``si`k``s`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`ki`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k``````s``ss`ki``s``s`k`ci``ss``ss`kis``s`kski``s`k`sik`kiv``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k```s`k```ss``ss`ki``s`ksk```s`cii``s``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`ki``s`kk``s`k`s`k``s`k``s`k``s`k``s``s``s``s``s`d`k````s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s``s``s``s``s``s``si`k`ki`kk`k`ki`kk`k`ki`kk`kk`kk`kk`kk`kr`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s`d`k````s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k``````s``ss`ki``s``s`k`ci``ss``ss`kis``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kikk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`ki``s`kk``s`k`s`k``s`k``s`k``s`k``s`k`d`..`.y``.w```s.e`.k`.a`.n`.s```s.h.e`.t```s.e.s`.v`.i`.r`.d`r`.y`.r`.r`.u`.l`.f```s`.i`.d```s.o.u`.t`.s`.a`. ```s. .a```s. .i`.d```s. .a`.,`.e`.k`.a```s. .s``.e`c`.g``.e`.h`.t```s.k.s`.c`.a`.t`.t`.a```s.r.d`.i`.b```s.l`.t`.t`.i`.l`. ```s.T.h.e. .r.n.g. .ar``s``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``si`kk`kk`kk`k`ki`kk`kk`k`ki`k`k```ss``ss`ki``s`ksk`k`k````sss``s`ksk``ci``s``s`kski`kii``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s`d`k````ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`kik``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk`k`d`k`````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k`````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`ki``s`kk``s``s`ks``s`kk``s`k`s``s``s``s``si`kk`k`kiv``s``s``s``si`kk`k``si`ki``s``s``s``si`k`ki`kk`k``s`k`sik`k`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k`````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv``s`k`s`d`k`````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k`````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki`ki``s`kk``s`k`s`k``s`k``s`k``s`d`k``d`.y``.w```s.w`.o`.l`.b```s`.h`.s`.a`. ```s.T.h`. `. `..`.r```s`.i`.c``.a```s`. ```s.r.n`.u`.b`. `.s```s`r`.y`.r`.r`.u`.l`.f`. ```s.i`.d```s.o.u`.t`.s`.a`. ```s. .a```s. .i`.d```s. .a`.,```s.g.o`.a`.r`.d`. ``.e`c`.g``.e`.h`.t```s.k.s`.c`.a`.t`.t`.a```s.r.d`.i`.b```s.l`.t`.t`.i`.l`. ```s.T.h.e. .r.n.g.e.t.o. .n.d.e.s. .a..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s`d`k````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``si`kk`k`ki`kk`k``si`ki`d`k`````s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski``s`k`sik`kiv``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`kikk`ki``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk`k`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s`k`si``s`kk``s`k`s`k``s`k``s`d`k``d`.K`.O..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s`d`k````ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kikvk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k``````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s`k`sik`kiv``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k`````si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`k``s``s`k`s``s``s`ks``s`kk``s``s`ks``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kkk`k`k`ki`k`k`k```ss``ss`ki``s`ksk`k`ki`k`k``si`k`ki`k``s``s`d`k`````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski``si`k`ki``s``s``s``s``s``s``s``si`k`ki`kk`k`ki`kk`k`ki`kk`kk`kk`kk`k`kk`k`kr`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk`k``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s`d`k`````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kkk`kk`k``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k``````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kskik`k`ki``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k``s`d`k`````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kkk`k`k`k`ki`k`k`k``s``s`kski`k`ki`kk``s``s``s``s``s`d`k````ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``si`kk`k`ki`kk`k``si`ki``s``s``s``s``si`k`ki`kk`kk`k``s`k`sik`k`kivk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`sik`kiv``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`ki``s`kk``s``s`ks``s`kk``s`k`s``s``s``s``si`kk`k`kiv``s``s``s``si`kk`k``si`ki``s``s``s``si`k`ki`kk`k``s`k`sik`k`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`ki`ki``s`kk``s`k`s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`d`k``d`.k`.c`.a`.b``.s`.r`.e`.d`.n`.a`.w```s.n.d`.a```s.i.t`.u`.s`.r`.u`.p```s.h.e`.t```s.u.p```s.e.s`.v`.i`.g```s.o.n`.o`.s```s``.b`. ```s````s.y..`.a`.w`.a```s.e`.i`.r`.r`.u`.c```s.dr`.n`.a`. `.k`.e`.i`.r`.h```s.d. `.e`.l`.t`.r`.a`.t```s.a```s.u.t`.o```s.t.s`.e`.l```s.h.o`.w```s```s`.t`. `.e`.h`.t`. `.d```s.w.a`.o`.t`. `.s```s.b`.m`.u`.l`. `.r`.a```s. .b```s.T.h.e.r.o.l.,. .s. .T.h.e.a.r. ..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k``s``s`kskik``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k````s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```s``s`ci`k```s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s``s`kskik``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k``````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```ss``ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`kskk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k````s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kikk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k````s``s`ksk``ci``s``s`kski``s`k`sik`kiv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k`kiv`ki``s`kk``s`k`s`k``s`k``s`d`k``d`.K`.O..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s`d`k```s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk``s`k`s`d`k````ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk``s`k`si``s`kk``s`k`s`k``s`k``s`d`k``d`.K`.O..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s``s``s``s``si`kk`kk`k`ki`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk``s`k`s`k``s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``si`kk`kk`k`ki`k``si`ki`d`k`````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kk`k``si`ki`d`k``i``s`k`sik`kiv`k`ki``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`ki`k`ki`ki``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k`k```si``s`k`s``s`ksk`ci``s``s`kski`k`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski`k`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk`k`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kikk`ki``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``si`kk`kk`k`ki`k``si`ki`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`sik`kiv``s``s``s``s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````si``s`k`s``s`ksk`ci``s``s`kski``s`k`sik`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k````s``s`kski``s`k`sik`kiv`ki``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`kskk`kikv``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``s``si`kk`kk`k`ki`k``si`ki`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k````ss``ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki``s`k``s`kc``s`k`s`k`ki``ssv``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k````ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``ss``ss`k``ci``s``s`kski``s`kskk`ki`k``s``si`k``s`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`ki`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k`````ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk``s`k`sik`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``s`k`sikv``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`ki``s`kk``s``s`ks``s`kk``s`k`s``s``s``s``si`kk`k`kiv``s``s``s``si`kk`k``si`ki``s``s``s``si`k`ki`kk`k``s`k`sik`k`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`ki`ki``s`kk``s`k`s`k``s`k``s`k``s`k``s`k``s`k``s`d`k``d`.t`.h`.g`.i`.s``.f`.o```s.u.t`.o```s.a.y`.w`.a```s.e.s`.i`.r`.r`.u`.c`.s```s.n.d`.a```s.r.e`.u`.s`.a`.e`.r`.t```s.u.r`.o`.y```s.e.s`.h`.c`.t`.a`.c``.l`c`.r`.t`. `.e`.h`.T.o. ..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k````s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```s``s`ci`k```s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s``s`kskik``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k``````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```ss``ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`kskk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k````s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s``s``s``s``si`kk`kk`k`ki`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kikk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`ki``s`kk``s`k`s`k``s`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k``s``s`ksk```s`cii``s``s`kski``si``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k`ki`ki``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k``s``s`kski``s``s`ksk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k`ki`ki``s``s`ks``s``s`ks``s`k`s`k``s`kc``s``s`ks``s``s`ks``s`k`s`d`k````s``s`kski``s`k`sik`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`k`ki`k`k``s`k`sik`kkv``s``s`ks``s`k`s`k``s``s`ksk``ci``s``s`kski``s`k`s`k`si``s`k`s`kk``s`k`s`k`s`k`sk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`kkk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k``s`kkk`k`k`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`k`kik`ki``s`kk``s`k`s`k``s``s`k``sii``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s``si`k``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`kk`k`k``s`kkk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv``s`k`s``s`ks``s`kk``s``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kkk``s`kk``s`k`s``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`k`d`k``..`.f`.r`.a`.w`.d`. ``.l`.t`.t`.i`.l`. `.a`. `.d``.l`c`.k`. `.u`.o`.Y.i.eri`k`k`d`k``..`.e``.o`.m`.s`. ```s`.l`.b`r`.y`.s```s`.g`. `.f``. `.d`.u```s``.a```s.i.n```s.e.s`.h`.s`.i`.n`.a`.v```s.d.y`.o`.b```s`.T````s.f..`.r`.a`.w`.d```s.l`.t`.t`.i`.l`. `.a`. `.d``.l`c`.k`. `.u`.o`.Y.i.e. .h.e. .c.l.o.r.e.a.c.kri`k`ki``s`k`s`k`s`k``s`k``s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```s``s```ss`ss``ss`kis``s`k``si``s``ss`k`ci``si`kis``s`ksk``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`kik``s`k`s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk``s`kk``s``s`ks``s``s`ksk`k`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk`k`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k``s``s`ks``s`k`s``si`k`ki``s``s`ksk`k`k`kkvk`k`k``s`k`s`k`d`..`.y`.a`.w``.e`.h`.t```s.o.f```s.u.t`.o```s.e.s`.g`.d`.o`.d```s.h.e```s.u.t`.b```s.f.,`.r`.a`.w`.d```s.l.e`.t`.t`.i`.l```s. `.k`.c``.t`c`. `.u`.o`.Y.a.a. r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```s``s```ss`ss``ss`kis``s`k``si``s``ss`k`ci``si`kis``s`ksk`k`k`ki`k``s`d`k``````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski``s`k`sikv``s``s``s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s``s``s``si`k`ki`kk`k`ki`k`ki`k`ki`k``s`k`sik`k`ki`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`d````ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s`kk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk``s`k`s`d`k````ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk`k``s``s`ks``s`kk``s`ks``s``s`kskk`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`k`ki`kik``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k`````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`ki``s`kk``s``s`ks``s`kk``s`k`s``s``s``s``si`kk`k`kiv``s``s``s``si`kk`k``si`ki``s``s``s``si`k`ki`kk`k``s`k`sik`k`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k`````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv``s`k`s`d`k`````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k`````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki`ki``s`kk``s`k`s`k``s`k`d`..``.e`.l`.a`.c```s.k`.c`.i`.h`.t```s.'.s`.n`.o`.g`.a`.r`.d```s.h.e`.t``.f`c`. `.y`.l````s.l`.m`.r`.a`.h`. `.s```s.n.c`.u`.o`.b`. ```s.a.x`. ```s.T.h.e.s.o. .sr``s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```s``s```ss`ss``ss`kis``s`k``si``s``ss`k`ci``si`kis``s`ksk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk``s`k`s`d`k````ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`ki``s`kk``s``s`ks``s`kk``s`k`s``s``s``s``si`kk`k`kiv``s``s``s``si`kk`k``si`ki``s``s``s``si`k`ki`kk`k``s`k`sik`k`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`ki`ki``s`kk``s`k`s`k``s`k`d`."`..`.h`.g`.u`.o`.n``. ```s``.u`.l```s`.t`.o`.n```s.'.s`.t`.i```s.u.t`.b```s.p.,`.i`.h`.s`.n`.a`.m`.k`.r`.o`.w```s.o.d`.o`.G`."```s`.n`.i`.r`.a`.l`.c``.d`. `.,`.k`.c`.a`.b`r`.t`.i`. `.s``.s`c`.t``.d`.n`.a```s````s``.r`.a`.c`. `.t`.i`. `.s```s.i.n`.m`.a`.x```s.,. ```s.a.x`. ```s.t`. `.s`.e```s.t`.a```s.y`.l`.t`.f`.e`.d``.l`c`.r`.t`. `.e`.h`.T.o. .c.h.e.f.u.l.y.,. .o.e.g.,. .v.a.b.l.er``s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```s``s```ss`ss``ss`kis``s`k``si``s``ss`k`ci``si`kis``s`ksk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk``s`k`s`d`k````ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki`ki``s`kk``s`k`s`k``s`k``s`k``s`k``s`d`k``d`.t`.i``.t`.a```s.e.t`.g```s.'.t`.n`.a`.c```s.o.u`.y```s.r```s.w.h`. `.r`.a```s. .b```s.t.h`. `.r`.a```s. .n`.s`.d`.n`.a`.l`. `.d`.n`.a`. `.s``.s`c`.m`. ``.x`.a`. ```s.T.h.e.i.e. ..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```ss``ss``s``ss`k``s`cii``ss`ki``s`kskk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`kik``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s`d`k````ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kkk``s`k`si``s`kk``s`k`s`k``s`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``s``sss`k``ci``s``s`kski``s`ksk``si``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k`ki`ki``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k`kiv``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``s``si`kk`kk`k`ki`k``si`ki`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k````ss``ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki``s`k``s`kc``s`k`s`k`ki``ssv``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k````ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``ss``ss`k``ci``s``s`kski``s`kskk`ki`k``s``si`k``s`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``si`kk`kk`kk`k`ki`kk`kk`k`ki``s`k`s`k``s`k``s`k``s`d`k``d``.r`.a`.e`.p`.p`.a```s.d.i`. `.y`.d`.o`.b`. ```s````s.d..`.a`.e`.d```s.o.w`.n```s.i.s```s.r.d`.i`.b```s.l`.t`.t`.i`.l`. ```s.T.h.e. .I.t.s..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s`d`k````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``si`kk`k`ki`kk`k``si`ki`d`k`````s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski``s`k`sik`kiv``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`kikk`ki``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk`k`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s`k`s`d`k``d`.e`.n`.o`.l`.a`. `.d``.i`.b`. `.y`.p`.p`.a`.h`.n`.u`. ``.o`c``.e`.h`.t```s.v.e`.a`.e`.l```s`.O.h.,. .p.r..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk`kik``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k``````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``s`k`sik`kiv`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k`````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki``s`kk``s`k`s`k``s`k``s`k``s`k``s`k`d`.?`.s`.d`.n`.a`.h`. `.e``.a`.b`. ```s`.Y````s`.a`.h`.w`. `.h```s.W.i.t.?. .o.u.rr`d```s``s`ks``s`kk``s`ks``s`k`sik`kk``ci``s``s`kski``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k``s`k```ss``ss`ki``s`ksk```s`cii``s``s`kskik``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k`ki``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k`kik``s`kk``s`k`s`d`k``d``.a`.e```s.y. ```s.e`.r`.l```s.s`.i```s.n.g`.i`.h`.t```s.o.r`.o`.p```s.h.e`.t```s.d.,`.u`.o`.l```s.u.t`.o```s`.i`.y``.c`. ```s.F.o.r.n.g. .a.d.!r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k````s``s`ksk```s`cii``s``s`kski``s`k`sik`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`sik`kiv`k`ki`ki``s`kk``s`k`s`d`k``d`.k`.c``.t`.t```s.o`.t```s.u.s`.o`.i`.v`.r`.e`.p`.m`.i```s.n.d`.a```s.n.g`.o`.r`.t`.s```s.r.y`.e`.v```s.i.s``.l`c`.h`.s`. ```s.T.h.e. .a..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`d`k``d`.s`.u`.o`.r`.e`.g`.n`.a`.d``.y`.r`.e`.v```s.i.s```s.n.d`.a```s.r.k`.o`.w```s.'.t`.n`.s`.e`.o`.d```s.t.h`.o`.b```s``.n`.s`. `.e`.h`.t`. `.g`.n`.i`.k`.c``.t`c.A.a.k.e. ..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k``````sss``s`ksk``ci``s``s`kski``s`k`sik`kiv`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`kk`k`k`ki``s`kk``s`k`s`d`k``d`.s`.d`.n`.a`.h`. `.e``.a`.b`. ```s`.Y````s`.a`.h`.w`. `.h```s.W.i.t.?. .o.u.r.?r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk````sss``s`ksk``ci``s``s`kskik`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`d`k``d`.y`.l````s.l`.t`.r`.o`.f`.f```s.s`.w`.o`.l`.b```s.u.r`.o`.y``.f`c``.s`.d`.n`.e`.f``.l`c`.r`.t`. `.e`.h`.T````s.e..`.d`.i`.h```s.o.s`.r`.e`.c`.o`.n`.i`.h`.r```sr.a`.s`.a```s.g.h`.u`.o`.t```s.a.s```s.i.n`.k`.s```s.v.e`.a`.h```s.n.d`.a```s.k.s`.c`.o`.r```s.h.e`.t```s.t.h`.i`.w```s`.v`.i`.t`.a`.l```s. .r```s.o`.l`.c`. `.e`.r`.a`. ``.l`c`.r`.T.o.s.e.s. .o. .o. .e.s..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`sik`kiv`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k``si`k`ki`k`d`k````s``s`ks``s`kk``s`ks``s`k`sik`kk`d`.s`.d`.n``.h`. `.r```s.b.e`. `.S`.I`.H`. `.t`.s`.n`.i```s````s.s.?`.d`.n`.a`.h```s`.a`.b`. ```s`.Y````s`.a`.h`.w`. `.h```s.W.i.t.?. .o.u.r.e. .A.g.a.?````s``s`kski```s``s`ks``s`kk``s`ks``s`k`sik`kk`d`.d`.n`.e`.i`.r`.f``.r`.u`.o`.y```s.b.e```s.t.o```s.t.s`.n`.a`.w```s.l.y`.n`.o```s.h.e```s.d.;`.e`.s`.u`.f`.n`.o`.c```s.i.s```s``.b`. ```s.T.h.e.a.r. ..````s``s`ks``s`kk``s`ks``s`k`sik`kk`d``.a`.e```s.y. ```s.e`.r`.l```s.s`.i```s.n.g`.i`.h`.t```s.o.r`.o`.p```s.h.e`.t```s.d.,`.u`.o`.l```s.u.t`.o```s`.i`.y``.c`. ```s.F.o.r.n.g. .a.d.!v`k`kk`k`kr``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskkv``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``si`kk`kk`k`kiv`ki``s`k`s`k``s``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`k`ki``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`k`ki`k`k`k`ki``s`kk``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskk``s`k`s`kk``s``s`ks``s`kk``s`ksk`k``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ksk`k`kk`ki`k`k`ki``s`kk``s``s`ks``s`kk``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`k`ki``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`k`ki`k`k`k`ki``s`kk``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskk``s`k`s`kk``s``s`ks``s`kk``s`ksk`k``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ksk`k`kk`ki`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki``s`k`s`d`k``d`.k`.c``.t`.t```s.o`.t```s.r.e`.e`.h```s.n.g`.i`.h`.t`.o`.n```s.i.s```s.r```s.T.h.e. .a..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k````ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`kk`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv`k`k`k``s`k`s``si`k```ss```ss`ss``ss`ki``s`kskk`k`k`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k```s``s`ksk```s`cii``s``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k`ki``s`kk``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k````ss``ss`k```s`cii``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`k`k``s`k`s``si`k``s``s`ksk```s`cii``s``s`kskik`k`k`ki`k`kiv`k`ki``s``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`kc``s``s`ks``s``s`ks``s`k`s`d`k````s``s`kski``s`k`sik`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`k`ki`k`k``s`k`sik`kkv``s``s`ks``s`k`s`k``s``s`ksk``ci``s``s`kski``s`k`s`k`si``s`k`s`kk``s`k`s`k`s`k`sk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`kkk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k``s`kkk`k`k`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`k`ki`k`k``s`k`s``si`k````sss``s`ksk``ci``s``s`kskik`k`ki`ki``s``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`d`k````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``si`kk`k`ki`kk`k`k``s`k`s``si`k```ss``ss``ss``ss```ss`ss``ss`ki``s`kskk`k`ki`ki``s``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s`d`k`````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``si`k`ki``s``si`kk`k`ki`kk`k``si`ki``s``s``s``s``si`k`ki`kk`kk`k``s`k`sik`k`kiv`k`ki``s``s`ks``s`kk``s`k`s``s``s``s``si`kk`k`kiv``s``s``s``si`kk`k``si`ki``s``s``s``si`k`ki`kk`k``s`k`sik`k`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k`````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv``s`k`s`d`k`````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`ki``s``s``s``s`d`k`````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`ki`k`k``s`k`s``si`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kskik`k`ki`ki``s``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``si`kk`k`ki`kk`k``si`ki``s``s``s``s``si`k`ki`kk`kk`k``s`k`sik`k`kiv`k`ki``s``s`ks``s`kk``s`k`s``s``s``s``si`kk`k`kiv``s``s``s``si`kk`k``si`ki``s``s``s``si`k`ki`kk`k``s`k`sik`k`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`ki`k`k``s`k`s``si`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`kskk`k`ki`ki``s``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``si`k`ki``s``si`kk`k`ki`kk``s``s``s``s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`ki`k`k``s`k`s``si`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`kskk`k`ki`kivkk`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`d`k```ci``s``s`kski``si`ki``s``s``s``s``s``s``s``s``s``si`kk`kk`kk`kk`kk`kk`k`ki`k``s`kkk`k``s`k`sik`k`kiv``s`k`s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s``s``s``s``s``s`d`k`````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``si`k`ki``s``s``s``s``s``s``s``si`k`ki`kk`k`ki`kk`k`ki`kk`kk`kk`kk`k`ki`kk`kr``s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```s``s```ss`ss``ss`kis``s`k``si``s``ss`k`ci``si`kis``s`ksk``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`kskk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`d```sii``s`k`si``s`kk``s`k`s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k````s`k```ss``ss`ki``s`ksk```s``s`ksk``s`cii``s``s`kski``s`k`sik`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k`````si``s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`ksk``s`k`sik`kiv`k`ki`k`k`k```s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`ksk``s`kkk`k`ki``s`kk``s``s`ks``s``s`kskk`ki``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````s`s``s`ksk`ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````s`s``s`ksk`ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```s`s``s`ksk`ci``s``s`kskik``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kskik``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````s``s``ss`ki``s``s`k`ci``ss``ss`kis```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````s``s``ss`ki``s``s`k`ci``ss``ss`kis```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k``````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k``s``s`kskik``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ksk``ci``s``s`kskik`ki`k``s``si`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`d`k``d`.d````s`.d`.r`.i`.b```s.n.o```s.v`.a`.h`r`.u`.o`.y`. `.,`.s```s.i.d`.s```s```s.)..`.s`.d`.r`.o`.j`.f```s.h.e`.t```s.o.r`.f```s.n.'`.i`.n`.i`.p```s.l.y`.e`.r`.e`.m```s.'.s`.t`.i`.(```s.r.y`.g`.n`.u`.h```s.o.t`.n```s`.t`.I.'.s. .B.e. .s.e..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`d`k``d`.s`.i`. `.,`.r``.v```s.o.w`.h`. `.,```s`.r`.a`.v`.A````s`.e`.c`.i`.v`. ```s```s.r`.t`. `.e`.h`.t`. `.f```s.e. `.n```s.t. ```s. .n`.s`.i`. `.y`.n``.t`c`.l`.G.u.o.l.'.s... .i.c.e..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k``````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``s`k`sik`kiv`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k`````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki``s`kk``s`k`s`d`k``d`.)`.u`.o`.y`. `.s``.a`.h`.r`.e```s.t. ```s.c`.x```s`.t`.a`.e```s.t.o```s.t.s`.n`.a`.w```s.i.t```s.r.e`.e`.h```s.n.g`.i`.h`.t`.o`.n```s``.r```s.T.h.e.'.s. .(.e.p..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`kk`k`k`ki``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k````ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk``s`kk``s`k`s`k``s`k``s`k``s`d`k``d`.d`.r`.i`.b``.r`.u`.o`.y```s.e.d`.r`.u`.o`.v`.e`.d```s.o.w`.n```s.a.s`.h```s.k`.a`.n`.s`. ```s.T.h.e. ..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`kik``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk`k`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s`kk``s`k`s`d`k``d`.)`.u`.o`.y`. `.s``.a`.h`.r`.e```s.t. ```s.c`.x```s`.t`.a`.e```s.t.o```s.t.s`.n`.a`.w```s.i.t```s.r.e`.e`.h```s.n.g`.i`.h`.t`.o`.n```s``.r```s.T.h.e.'.s. .(.e.p..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`sik`kiv`ki``s`kk``s``s`ks``s`k`s`kc``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k````ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`ki``s`kk``s`k`s`k``s`k``s`k``s`k``s`d`k``d`.y`.l`.d`.n`.e`.i``.f`. ```s.h.e`.t`.a```s.s`.e`.m`.o`.c`.e`.b```s.e.n`.v`.e```s.n`.a`. `.y`.l`.b`.a`.r`.e```s.s.i`.n`.o`.c`. `.n`.w`.o```s`.l`.a`.c`. `.o`.t`. `.s```. ```s. ```s.i.c```s`.r`.e`.t`.f`.a```s.d.,`.o`.o`.f```s.u.r`.o`.y```s.w.n`.o`.d```s``.o`.w`. `.y```s`.g`.a```s.r. `.a```s. .b```s.T.h.e.r.l.f.s. .w.h.e`c.s.mr.d. .r..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`kik``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk`k`d`k`````ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki`ki``s`kk``s`k`s`d`k``d`.)`.u`.o`.y`. `.s``.a`.h`.r`.e```s.t. ```s.c`.x```s`.t`.a`.e```s.t.o```s.t.s`.n`.a`.w```s.i.t```s.r.e`.e`.h```s.n.g`.i`.h`.t`.o`.n```s``.r```s.T.h.e.'.s. .(.e.p..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k`````ss``ss`ki``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``ss``ss```ss`ss``ss`ki``s`ksk``s``s`ksk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k`ki`ki``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskkv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k``````sss``s`ksk``ci``s``s`kski``s`k`sik`kiv`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k````ss``ss``s``sss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk``s`kk``s`k`s`k``s`d`k``d`.d`.a`.m``.Y`.L`.L`.A`.E`.R```s.i.m`.h```s.d`.a`.m`. ```s`.u``.y`. `.w```s```s.l.!`.a`.o`.c```s.l.y`.n`.o```s.a.t`.e```s.e.s`.v`.r`.a`.w`.d```s.l.,`.o`.o`.f```s`.Y.o.u. .N.o.'.v.e. .!r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskk`k`ki``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`sik`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k````s``s`ksk```s`cii``s``s`kski``s`k`sik`kiv`k`ki`ki``s`kk``s`k`s`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k``si`ki`k`d`k````ci``s``s`kski``s`k`sik`kiv`ki``s`kk``s`k`s`d`k``d`.t`.a`.h`.W.?r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s`k``s``s`kski```ss``ss``s`k`ci``ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`ki`ki``s`kk``s``s`ks``s``s`ks``s`k`s`k`d`.e`.h`.t```s.e.n`.p`.o```s.t.o```s.g.h`.u`.o`.n`.e```s.n.g`.o`.r`.t`.s```s.n.g`.i`.h`.t`.y`.n`.a```s.v.e`.a`.h```s.'.t`.n`.o`.d```s`.Y.o.u. ``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k````s``s`ksk```s`cii``s``s`kski``s`k`sik`kiv`k`k`k`d`.a`.l`.c.m`k`k`k`d`.e`.t`.s`.y`.o.r`k`ki`k`k`d`..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`ki`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k`d`.e`.h`.t```s.w.n`.o`.d```s.u.t`.p```s.t.o```s.o.u`.y```s`.i`.v`.d`.a`. `.I.s.e. ``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k````s``s`ksk```s`cii``s``s`kski``s`k`sik`kiv`k`k`k`d`.a`.l`.c.m`k`k`k`d`.e`.t`.s`.y`.o.r`k`ki`k`k`d````s.t..`.i```s`.i```s.p`.o`. ```s.o.r`.f```s. .b.e.n.g. .>``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k````s``s`ksk```s`cii``s``s`kski``s`k`sik`kiv`k`k`k`d`.I`.A`.R`.T`.S.N`k`k`k`d`.C`.N`.E`.R`.W.H`k`ki`k`k`d`.<`.!r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k````s``s`ksk```s`cii``s``s`kski``s`k`sik`kiv`ki``s`kk``s`k`s`k``s`k``s`k``s`d`k``d`.n`.i``.g```s.t`.u`.h`.s```s.e.d`.p`.p`.a`.n`.s```s.o.w`.n```s.a.s`.h```s.i.t```s.s.,`.i```s.i.t```s`.v```s.a.t`.h`.W`. `. `.)`..`.s```s.l`.a```s.b`r`.g`.n```s.f.y```s`.e``.i`. `.t`.a`. ``.o`c``.y`.r`.e`.v```s.a.s`.w```s.e.r`.v`.e`.n```s````s.r..`.e`.t`.s`.y`.o```s.a.n```s.b.e```s.l.y`.l`.a`.e`.r```s.s`.u`.m`. `.s`.i`.h```s````s`.d````s```s.y..`.a`.w`.a```s.l.s`.l`.o`.r```s.n.d`.a```s.a.m`.l`.c```s.h.e`.t```s.o.f```s.u.t`.o```s.l.s`.l`.a`.f```s.r.l`.a`.e`.p```s.n`.i`.n`.e`.t`.s`.i`.l```s.A. .g. .G.o.n.e.s.,r.t. .(.I. .g.d.n.t.i.v.e.r. .a..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k````s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```si``s``ss`k`ci``si`ki`s``s`kskk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s`d`k````ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk`k`d`k````s``s`ksk```s`cii``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s`k`si``s`kk``s`k`s`d`k``d`.n`.i``.g```s.t`.u`.h`.s```s.p.s`.a`.n`.s```s.l.y`.t`.p`.m`.o`.r`.p```s.I.t`r`..`.e`.d`.i`.s`.n`.i```s.e.r`.t`.s`.y`.o```s.u.t`.b```s`.i`.h`.t`.o```s.g. ```s`.a``.v```s. .r`.,`.n```s.o.p`. `.s`.k`.a```s.c.r`. `.r```s.s.t`.y`.o`. ```s.T.h.e.l.i.n.g. .a..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskkvk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss`ki``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`d`k`i``si`k`ki``s``si`kk`k`ki`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k`ki`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s`k`s`d`k````ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````ss``ss`ki``s`ksk``s`k`sik`kiv`k`k`k``s``s`kski`k`k`k`ki`k`ki`kk`k`ki`k`k``si`k`ki`k`k``s``si`k`d``.e`.k`.c`.o`.l`. `.y```s.e`.r`.l```s.s`.a`.w```s.I.t. .a.d..`k``s``si`k`d`.d`.e`.k`.c`.o`.l``.w`.o`.n```s.i.s```s.t`.a`.r`.g`. ```s.T.h.e. ..`k``s``si`k`d`.d`.e`.k`.c`.o`.l`.n`.u``.w`.o`.n```s.i.s```s.t`.a`.r`.g`. ```s.T.h.e. ..`k``s``si`k`d``.e`.k`.c`.o`.l`.n`.u`. `.y```s.e`.r`.l```s.s`.a`.w```s.I.t. .a.d..v`k`kk`k`kr``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk``s`k`s`d`k````ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````ss``ss`ki``s`ksk``s`k`sik`kiv`k`k`ki`k`k`k`ki`k`ki`kk``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s`k`s`k``s`k`d`."`..`.e`.c`.i````s`.n`.i`.a`.m```s.i.a`.v```s.v`.a```s. .l```s.a.s```s````s.d..`.e`.s`.o`.l`.c```s.i.s```s.i.t`.x`.e```s.i`.h`.T`."`r`.:```s`.n`.u`.o````s`.d`.n`.a```s.f.e`.i`.l```s.t.o`.n`.i```s.n.s`.a`.o`.r`.g```s.c.e`.i`.o`.v```s.e```s.o`.c`.e```s`.u`.o`.i`.r`.e`.t```s`. `.A.m.y.s. .r.d. .a.n.c.e.s. .P.l.e. .o.fr``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`kk`k`ki`kk`kkk``s`k`s`k``s`ki``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`kik``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`d`k`k`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`sikvk`kik`k`ki``s`k`s`d`k``d`.s`.y`.e`.k``.o`.n```s.v.e`.a`.h```s`.Y.o.u. .!r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk`kik``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`d`k`i``si`k`ki``s``si`kk`k`ki`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````ss``ss`ki``s`ksk``s`k`sik`kiv``s`kk``s`k`s`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````si``si``s``ss`k`ci``si`ki`s``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki`ki``s`kk``s`k`s`d`k``d``.e`.k`.c`.o`.l`.n`.u`. `.y```s.e`.r`.l```s.s`.a`.w```s.I.t. .a.d..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki`ki``s`kk``s`k`s`d`k``d````s``.s`.a```s.s.t`.u`.j```s.l.y`.b`.a`.b`.o`.r`.p`r`.s`.i```s.c.h`.i`.h`.w```s.n.,`.i`.a`.h`.c```s.h.e`.t```s.c.k`.o`.l`.n`.u```s.t.o```s.a.r`.e`.b```s.h.e`.t```s.s.t`.a`.p```s.e.t`.g```s.t.o```s.a.y`.w```s.n.o```s.i.s```s.r```s.T.h.e. .w.e.l..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s`k`si``s`kk``s`k`s`k``s`k``s`k``s`d`k``d`.d`.e`.k`.c`.o`.l`.n`.u``.w`.o`.n```s.i.s```s.i.n`.a`.h`.c```s`.T.h.e. ..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kk`k``si`ki`d`k`````ss``ss`ki``s`ksk``s`k`sik`kiv``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`kskk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik`k`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k``s``s`kskik`ki``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k`````si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kikvk``s`kk``s`k`s`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k`````ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`d`k``d`.d`.e`.k`.c`.o`.l``.e`.b```s.a.n`.c```s.i.n`.a`.h`.c```s.h.e`.t```s.c.h`.i`.h`.w```s.t.o```s.r.e`.e`.h```s.n.g`.i`.h`.t`.o`.n```s.i.s```s.r```s.T.h.e. ..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````si``si``s``ss`k`ci``si`ki`s``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k`kiv`ki``s`kk``s`k`s`d`k``d``.e`.k`.c`.o`.l`. `.y```s.e`.r`.l```s.s`.a`.w```s.I.t. .a.d..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s`k`si``s`kk``s`k`s`k``s`k``s`k``s`d`k``d`.d`.e`.k`.c`.o`.l``.w`.o`.n```s.i.s```s.i.n`.a`.h`.c```s`.T.h.e. ..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k````si``si``s``ss`k`ci``si`ki`s``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk``s`k`s`d`k````si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kkk`ki``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```si``si``s``ss`k`ci``si`ki`s``s`kskk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k`````si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k``s``s`kskikvk`k`ki``s`k`s`d`k``d`.s`.y`.e`.k``.o`.n```s.v.e`.a`.h```s`.Y.o.u. .!r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk`kik``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k``i``s`k`sik`kiv`ki``s`kk``s`k`s`d`k``d`.s`.y`.e`.k``.e`.h`.t```s.c.k`.o`.l`.n`.u```s.o.r```s.c.k`.o`.l```s.'.t`.n`.a`.c```s`.Y.o.u. ..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k````s``s`ksk``ci``s``s`kski``s`k`sik`kiv`ki``s`kk``s`k`s`d`k``d`.k`.c`.o`.l``.o`.n```s.a.s`.h```s.I.t. ..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k`k`d`.K`.O..`k`k`d`.n`.e`.p`.o``.o`.t```s.e.s`.s`.u`.f`.e`.r```s.n.d`.a```s.t`.s`.u`.r`. ```s`.m```s.t`.x`.e`. `.s`.i`. ``.o`c`. `.e`.h`.T.d.r.e.l.y. ..`k`kr``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskkv`k``s``si`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`k`ki`k`k``s``siv`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``si`kik``````s``ss``ss`ki``s``ss`k```si``s`k`s``s`ksk`ci``s``s`kskis``s`kski``s`k`s``sivk``s``si`ki`d`k`````ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k````ci``s``s`kski``s`k`s``sivk````s``s`kski``s`k`s``si`kikv`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s``s`kski``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki`k`k`ki``s`kk``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k```s``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`d`k``d`.h`.s``.v`.r`.a`.w`.d`. `.n```s.n. `.e`.t`.t```s.w.r`. `.s```s.e. `.n```s`.g```s`.e`.h`.t```s.i.d`.a`.r`.f`.a```s`.I.'.m. .m.a.z.i..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````s`cii``s``s`kski``s`k`sik`kiv`ki``s`kk``s`k`s`d`k``d`.!`.M````s.-`.K```s`. `.E`.H``. `.O```s.I.N`. ```s`.I`.L`. ```s.I`.G```s.R.I`.B`. ```s. `.S`.N```s.T.I`.A`.L`.U`.T`.A`.R`.G`.N```s.".C.O.N.G.H.T.D.A.R.O."r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`d`k``d`..`.t`.s``.h`.c`. ```s.u`.s`.a`.e```s`.s`.i`.h```s.e.s`.d`.i`.h```s.t.e`.a`.r`.i`.p```s.h.e`.t```s.r.e`.e`.h`.w```s.z.e`.a`.m```s.h.e`.t```s.o.t`.n```s`. `.s```s`.".T.h.i.s. .t.r.e."r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`sik`kiv``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`kk`k`k`ki``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss`k```s`cii``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`ki`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`kk`k`kkv`k`ki``s`kk``s`k`s`d`k``d``.r`.o`.f```s`.d`.i`.d```s.i.t```s.n.g`.i`.h`.t```s.m.e`.a`.s```s.h.e`.t```s.y.s`.a`.s```s.I.t. .b.e..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk``s`kk``s`k`s`k``s``s``s`d`k```s`kc``s`k`s`k`k`ki``ss`k`kk`c``s`d`k`ci``s`kc``s``s`k`s`d`k``ki````d`.y``.w`.y`.n```s.t`.i```s.a.d`.e`.r```s.n.d`.a```s.a.d`.e`.h`.a```s.g`. `.I`. `.d`.l`.u```s````s.t..`.i```s.a.d`.e`.r`r`.o`.t```s.t.s`.n`.i`.o`.p```s.1.0```s.o.u`.y```s.s.t`.o`.c``.l`c`.t`.i``.s`.n`.a`.e`.m```s.c.h`.i`.h`.w```s`.u`.l`.c`. `.a`. ```s.i`.l`. `.s``.o`c``.s`.i`.h`.t```s```s.H.m.m.,. .l.k.e.,. .'. .S.h.o. .a.?`d`.*`.*`r. @i``s``s`ks``s`k`s`k`ki``s``s`ks``s`k`s``s``s`d`c``s``s`d`?yi`ki``s`d`?Yi`ki`k`d`..`.t`.c``.f`.f```s.w. ```s`.a```s.a.s`.h```s.o.w`.n```s.w.n`.o`.n`.k```s.y.s`.a`.w`.l`.a```s.v.e`.'`.I```s.d.s`.r`.o`.w```s.h.e`.t```s.o.f`r`.e`.n`.o```s.a.t`.h`.t```s.c.h`.u`.s```s.e.,`.c`.a`.l`.p```s.i.s`.h`.t```s.u.t`.o`.b`.a```s.g.e`.n`.a`.r`.t`.s```s.n.g`.i`.h`.t`.e`.m`.o`.s```s.i.s```s.r.e`.e`.h`.T`."```s.s.,`.y`.a`.s```s.I.t. .n.e."`krk`k`ki``s``s`ks``s`k`s`k`ki``s``s`ks``s`k`s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`k`d`.K`.O..`krkv`k``s``s`k`ki``siv`d`k``..`.o`.N``.r`.o```s`.Y`. `.r```s.s.w`.n`.a`. ```s.a.s```s`. .P.l.e.s. ri`k`d``ki``ci`c```c``s`k`ki``s`d`? +iv@i``s`k`s`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`d`k````ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``si`ki``s``s``s``s``s``si`k`ki`kk`k`ki`k`ki`kk`kk`k`ki``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`d`k```s`k```ss``ss`ki``s`ksk````ss``s`k`ss``ss`ss``ss`ki``s`ksk``s`k`sikkk`ki``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk`kik`k`ki``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`kskkv`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``s``s``s``si`k`ki`kk`k`ki`kk`kk`k`ki`kk`k``si`ki``s``s``s``s``s``s``s``s``s``si`kk`kk`kk`kk`kk`kk`k`ki`k`k`ki`k``s`k`sik`k`kiv``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s`d`k`````ss``ss`ki``s`ksk``s`k`sikv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`k`ki`k`kk`k`k``s`k`sik`k`k`ki``s`kk``s`k`s`k``s`d`k``d`.K`.O..r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k``s`kk``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`kik``s`kk``s`k`s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s`d`k`````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kski``si`k`ki``s``si`kk`k`ki`kk`k``si`ki`d`k`````s``s`ksk``s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski``s`k`sik`kiv`k`ki``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k`````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k`````s``s`ksk``s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski``s`k`sik`kiv`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``ss``ss`k``ci``s``s`kski``s`ksk``s``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`kc``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k`````s``s`ksk``s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski``s`k`sik`kiv`ki`k`k`k`ki``s``s`ks``s``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k`````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`ki`k`k`ki`k``si`k`k``s``s`kskiv`k`k``si`k`ki``s``s`ks``s`k`s`d`k`````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`kk`k`kk`k`kk`k`kr`k`ki``s`k`s`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k``````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```s``s`ksk``s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kskik``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k`````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kkv`k`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kkv`k`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki``s`kk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k`````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`kik``s`kkk`k`ki`ki``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik`k`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`k`ki`k`kkv`k`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```ss``ss``ss`k``ci``s``s`kski``s`ksk``s`kk``s`k`s`d`k``d`.r`.e`.v`.o``.t`.r`.a`.t`.s```s.s.t`.e`.b```s`.u``.y`. `.w```s```s.d.?`.a`.e`.r```s.o.u`.y```s.'.t`.n`.a`.c```s`.e````s.m.a`. `.e`.h```s.s. `.'```s`.W.h.a.t.r.,. .N.o.'.d. ..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`kskk`k`ki`ki`k``s``si`k``s``s``s``s``s``s``si`k`ki`kk`k`ki`kk`k`ki`k`ki``s`k`s``s`ks``s`k`s`k``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k``s``s``s``s``si`k`ki`kk`kk`k``s`k`sik`k`kiv`k``s`k`s`k`d`..``.r```s`.t`.o`.g```s.o.u`.y```s.o.w`.h```s`.b``.e```s.r.e`. `.o`.t`. ```. `.r```s`.o`.l`. `.o```s.I```s.u.t`.b```s````s.S.o.r.y.,. .n.g.e`c.s.m.e.r. .h.er``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kkik``s`k`s``s`ks``s`kk``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``si`ki`ki``s`k`s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k``s``s`kski``ci```ss``ss`ki``s`ksk``s``s`ks``s`kk``s`ksk`k``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kkk``s`kk``s`k`s`k`d`..``.r```s`.m`.o`.r`.f```s.r.e`.e`.h`.t```s.e.t`.g```s.'.t`.n`.a`.c```s`.Y.o.u. .h.er``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kkik`k`ki``s`k`s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`k`ki`k`k``s``siv`k``s``si`k``s``s``si`k``si`k`ki`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``s``s`kski`k``s``si`ki`k``s``si`k`ki`d`k````s``s`kski``s`k`s``sivk``s``si`k```s``s`ksk``s`cii``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`k``s``siv`k``s``si`k``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``ci```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`k``s``siv`k``s``si`k````sss``s`ksk``ci``s``s`kski`d`k``````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`d`k````s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k```si``si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`k``s``siv`k``s``si`k```ss``ss`k```s`cii``s``s`kski``s`ksk`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``ci```ss``ss`ki``s`ksk`k``s``siv`k``s``si`k```ss``ss``ss`k```s`cii``s``s`kski``s`ksk`k``s``si`k```s``s`ksk``s`cii``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k```ss``s`k`ci``ss``ss`ki``s`ksk`k``s``siv`k``s``si`k``ci```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`k``s``siv`k``s``si`k``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k``ci```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`k``s``siv`k``s``si`k```ss``ss``s`k`ci``ss``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`k```s`cii``s``s`kski``s`ksk`k``s``si`k``ci```ss``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss``ss`k```s`cii``s``s`kski``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`k``s``siv`k``s``si`k```ss``ss``s`k`ci``ss``ss`ki``s`ksk`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``ci```ss``ss`ki``s`ksk`k``s``siv`k``s``si`k```ss``ss`k```s`cii``s``s`kski``s`ksk`k``s``siv`k``s``si`k````sss``s`ksk``ci``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``siv`k``s``si`k```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k```si``s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``siv`k``s``si`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``sivk``s``si`k```si``s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k```s``s`ksk``s`cii``s``s`kski`k``s``si`k```ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``siv`k``s``si`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``siv`k``s``si`k```si``s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k```s``s`ksk``s`cii``s``s`kski`k``s``si`k```ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``siv`k``s``si`k````ss`ss``ss`ki``s`ksk`k``s``siv`k``s``si`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```si``s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k```s``s`ksk``s`cii``s``s`kski`k``s``si`k```ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``siv`k``s``si`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``siv`k``s``si`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k```s``s`ksk``s`cii``s``s`kski`k``s``si`k```ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``siv`k``s``si`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski`k``s``siv`k``s``si`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``siv`k``s``si`k````ss`ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kski`k``s``siv`k``s``si`k```ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`d`k`````s``s`ksk``s`cii``s``s`kski``s`k`s``sivk``s``si`k``s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k```si``si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k```s`cii``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s``s`ksk```s`cii``s``s`kski``s`k`s``sivk``s``si`k```s`cii``s``s`kski`k``s``siv`k``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`k``s``siv`k``s``si`ki`d`k`````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kski`k``s``siv`k``s``si`k``s``s`kski`k``s``siv`k``s``si`ki`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````sss``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``siv`k``s``si`ki`k``s``si`k``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k`````si``si``si``si``s`s`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`ksk`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````sss``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``si`k`ki`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kski`d`k````s`k```ss``ss`ki``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`k``s``si`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``s`k`s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`k``s``siv`k``s``si`k```ss``ss`ki``s`ksk`k``s``siv`k``s``si`k````ss`ss``ss`ki``s`ksk`k``s``si`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``siv`k``s``si`k``s``s`kski`k``s``si`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``s`k`s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``s``s`kski`k``s``siv`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k`ki`d`k`````si``si``si``si``si``si``s`s`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``si`k`ki`d`k`````si``si``si``s`s`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````ci```ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k````s`k```ss``ss`ki``s`ksk``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````sss``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````si``si``si``si``si``s`s`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``s`ksk``s`cii``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`k``s``siv`k``s``si`ki`d`k`````s`s`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``sivk``s``si`k`ki`d`k``````s```ss`ss``ss`kis``s`ksk```s`s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`k``ci``s``s`kski``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`ksk`d`k`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``siv`k``s``si`k`ki`k``s``si`k``s``s`kski`d`k`````s`s`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k`````s`cii``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`k``s``siv`k``s``si`ki`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`ksk`k``s``siv`k``s``si`ki`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``ci``s``s`kski`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``siv`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``ci``s``s`kski`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`ksk`k``s``si`k`ki`k``s``si`ki`k``s``si`k``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``s`k`s``sivk``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``siv`k``s``si`k`ki`k``s``si`ki`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``ci``s``s`kski`k``s``si`k``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`ksk`k``s``si`k``s``s`ksk``ci``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss`ki``s`ksk`k``s``siv`k``s``si`k``ci``s``s`kski`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``s``s`kski`k``s``si`k`ki`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``s`k`s``sivk``s``si`k``ci``s``s`kski`k``s``si`k`ki`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``siv`k``s``si`k``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`ksk`k``s``si`ki`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`ksk`k``s``si`ki`k``s``si`k``s``s`kski`k``s``siv`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``ci``s``s`kski`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```s``s`ksk`ci``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``s`k`s``sivk``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k````ss`ss``ss`ki``s`ksk`k``s``si`ki`k``s``siv`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k``ci``s``s`kski`k``s``si`k`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``s`k`s``sivk``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k``ci``s``s`kski`k``s``si`ki`k``s``si`k````ss`ss``ss`ki``s`ksk`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k`ki`k``s``siv`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`ksk`k``s``si`k``s``s`kski`k``s``si`k``ci``s``s`kski`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k`ki`k``s``si`ki`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``siv`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss`k``ci``s``s`kski``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``s`k`s``sivk``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k`ki`k``s``si`k````ss`ss``ss`ki``s`ksk`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`ki`k``s``siv`k``s``si`k``ci``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski``s`k`s``sivk``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k`ki`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k``ci``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k````ss`ss``ss`ki``s`ksk`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``siv`k``s``si`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``si`ki`d`k`````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k````s`k``s``s`kski``ci```ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`d`k`````ss``ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``si`ki`k``s``si`k`ki`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``si`k````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k````s``s`kski``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```si``si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`d`k`````s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`ki`k``s``siv`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`d`k`````ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`s``sivk``s``si`k```s``si``s`ci`k`s``s`ksk``s`s``s`ksk`ci``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kski`d`k`````s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k``s``s`kski``ci```ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`ksk``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kski`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`k``s``siv`k``s``si`k```ss``ss`ki``s`ksk`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``siv`k``s``si`k````ss`ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k``s``s`kski```ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kski``s`k`s``sivk``s``si`k``s``s`kski`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`ksk`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k```ss``ss`ki``s`ksk````sss``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kski`k``s``siv`k``s``si`k`ki`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`k``s``siv`k``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kski``s`k`s``sivk``s``si`ki`k``s``siv`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``siv`k``s``si`k```s``s`ksk`ci``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kski``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kski`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k```ss``ss`ki``s`ksk````sss``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k``s``s`kski`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k`ki`k``s``siv`k``s``si`k`ki`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``s`k``ci``s``s`kski````ss`ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k``ci``s``s`kski`k``s``siv`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`d`k`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`d`k`````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``si`k````ss`ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`ksk`d`k````s``s`ksk```s`cii``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``si``s`ci`k`s``s`ksk``s`s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``s```ss`ss``ss`kis``s`k``si``s``ss`k`ci``si`kis``s`ksk``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`ksk`k``s``siv`k``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k```ss``ss`ki``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`ki`k``s``siv`k``s``si`k``s``s`kski`k``s``si`k`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``s`ksk``s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski``s`k`s``sivk``s``si`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``s`ksk``s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski``s`k`s``sivk``s``si`ki`d`k````s``s`kski``s`k`s``sivk``s``si`k`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``s`ksk``s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski``s`k`s``sivk``s``si`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``siv`k``s``si`ki`k``s``siv`k``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````s``ss``ss`ki``s``ss`k```si``s`k`s``s`ksk`ci``s``s`kskis``s`kski``s`k`s``sivk``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`ksk`d`k`````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``si`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k``s``s`ksk``ci``s``s`kski`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`ksk`k``s``siv`k``s``si`k````ss`ss``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`ksk`d`k`````s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`ksk``s`k`s``sivk``s``si`k`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`d`k`````s`cii``s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``siv`k``s``si`k``s``s`ksk``ci``s``s`kski`d`k`````s`cii``s``s`kski``s`k`s``sivk``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``si``si``s`s`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``s`s`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k``s``s`ksk``ci``s``s`kski`d`k`````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``si``si``si``si``si``s`s`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`ki`k``s``siv`k``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``si``si``si``si``si``si``s`s`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``siv`k``s``si`k``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k``s``s`kski``ci```ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```s``si``s`ci`k`s``s`ksk``s`s``s`ksk`ci``s``s`kski`d`k`````ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``siv`k``s``si`k``ci``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk``s`k`s``sivk``s``si`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k``````sss``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`ksk`k``s``siv`k``s``si`k`ki`k``s``si`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``si`kikv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk``s`k`s``sivk``s``si`ki`k``s``siv`k``s``si`k`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk``s`k`s``sivk``s``si`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk``s`k`s``sivk``s``si`k`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk``s`k`s``sivk``s``si`k`ki`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``si``s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`d`k`````si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk``s`k`s``sivk````s``s`kski``s`k`s``si`k```ss``ss`ki``s`kskk``s``siv`k``s``si`k````ss`ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`k``s``si`k`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k``````ss``s`k`ss``ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````si``si``si``s`s`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k````ss`ss``ss`ki``s`ksk`d`k``````sss``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``s`ksk``s`cii``s``s`kski``s`k`s``sivk``s``si`k``s``s`ksk``ci``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````ci```ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```s``s`ksk`ci``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k```ss``ss``ss`k``ci``s``s`kski``s`ksk``s``s`ksk```s`cii``s``s`kski``s`k`s``sivk``s``si`k``ci``s``s`kski`k``s``si`k```s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`ksk`k``s``siv`k``s``si`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``sivk``s``si`k``s`k```ss``ss`ki``s`ksk```s`cii``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``s`ci`k```s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``siv`k``s``si`k``s``s`kski`k``s``siv`k``s``si`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``sivk``s``si`k``s`k```ss``ss`ki``s`ksk```s`cii``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k```ss``ss``ss`k``ci``s``s`kski``s`ksk``s``s`ksk```s`cii``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``siv`k``s``si`k``ci``s``s`kski`k``s``si`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk`k``s``siv`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k``s`k```ss``ss`ki``s`ksk```s`cii``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`k``s``siv`k``s``si`k`ki`k``s``si`k``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`ksk`k``s``si`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`ksk`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``siv`k``s``si`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``sivk``s``si`kiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`ksk`k``s``siv`k``s``si`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk`k``s``siv`k``s``si`k```ss``ss`ki``s`ksk`k``s``siv`k``s``si`k``s``s`kskiv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k````s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`ksk`k``s``siv`k``s``si`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````s``si``ss`k`ci``si`ki`s``s`ksk``s`k`s``sivk``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`kskv`kk`k``s``si`k``s``s``si`k``si`k`ki`d`k`````ss``ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``ci``s``s`kskiv`kkv`k`kk``s`kkk`k`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s`d`k`````si``s``si``ss`k`ci``si`ki`s``s`ksk``s`k`sik`ki``s``s`ks``s``s`ksk`k`k``s`k`sikv`kk``s`kkk`k`ki``s`kk``s``s`ksk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k``si`kk`k``s``si`k``s``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``si`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`kc``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv`ki`k`k`k`d`.y`.a`.w`. `.h`.c`.i`.h`.W.?``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`sik`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````si``si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`sik`kiv`k`ki`ki`k`k`k`d`.s`.n`.e````s`. `.g`.n`.i```s`.N.o.t.h.a.p..``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k``si`ki`k`d`k````s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski``s`k`sik`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k``si`ki`k`d`k````ci```ss``ss`ki``s`ksk``s`k`sik`kiv`k`ki`ki`k`k`k`d`.e`.r`.a``.s`.g`.n`.i`.h`.t```s.t.e`.o`.m`.e`.r```s.r.e`.e`.h`.w```s.o.u`.y``.l`c``. ```s```s.c.a`. `.I`. `. `..`.s`.g```s``r`.e```s.l`.u`.p`.i`.n```s`.d`.n`.a```s.u.t`.o`.b`.a```s.v.e`.o`.m```s.o.u`.y```s.a.s``.e`c``.u`.o`.y```s.a.t`.h`.w```s.o.u`.y```.t`. `.y```s.o`. ```s`. `.I.c.a.n.l`c.e. .s. .m.a.t.h.i.n.o.t.e. ..``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv`k`ki`ki`k`k`k`d`.o`.g``.o`.t```s.n.t`.a`.w```s.o.u`.y```s.o.n`.i`.t`.c`.e`.r`.i`.d```s.a.l`.r`.e`.n`.e`.g```s.h.e`.t```s.i.n`r`.g`.n`.i`.h`.t`.e`.m`.o`.s```s.m.e`.a`.n```s.o.r```s.t.s`.n`.i`.o`.p```.p`.m`.o`.c`. `.e```s```s.e..`.r`.e`.h```s.u.t`.o```s.o.m`.r`.f```s.i.n```s`.n`.k`. `.t`.'`.n```s`.I. .d.o.w. .U.s`c.a. ..``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv`k`ki`k`ki`ki`k`k`k`d`.s`.t`.c`.e`.j`.b`.o``.y`.b`.r`.a`.e`.n```s.o.r```s.t.s`.n`.i`.o`.p```.p`.m`.o`.c`. `.e```s```s.g..`.n`.i`.c`.a`.f```s.r.e`.a```s.o.u`.y```s.o.w`.h```s.r.e`.u`.s`.n`.u```s`. `.I.a.m. .U.s`c.a. ..``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`k`ki`k`k``s`k`sik`k`k`ki`k`d`k`````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`sikv`ki`k`k`k`d`.n`.o``.t`.c`.e`.r```s`.t`.a`.h`.t```s.i.n```s.g.o```s.t.o```s.a.y`.w```s.n.o```s.i.s```s.r```s.T.h.e. .d.i..`k``si`k`k`d``.r```s`.d`.r`.o`.w```s.a.t`.h`.t```s.l.y`.p`.p`.a```s.t`. `.w```s. .h`.w```s.k.n`. `.t`.'`.n```s`.I. .d.o. .h.e..v`k`kr``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kkik``s`k`s`k`s`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````si``s``ci``s``s`kski`ki```s``ss``s`k`ci``ss``ss`kis``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`k``s``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``si`k`k`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k``si`ki`k`d`k````s`k```ss``ss`ki``s`ksk````sss``s`ksk``ci``s``s`kski``s`k`sik`kiv``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ksk`k`k`ki`k`k`k`ki`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kki``s``s`ksk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k`````s``s``s`s`ci``si`kii``s``si`k`ci``si`ki`s``s`ksk``s`k`sik`kiv`k`k`k```s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k`k`k```s``s``s`s`ci``si`kii``s``si`k`ci``si`ki`s``s`ksk`k`ki`ki``s`kk``s`k`s`k`d`..`.g`.n`.i`.h`.t`.e`.m``.s`. `.p```s`. ```s.a`. `.y`.r`.o`.t```s.v.e```s`.e`.k`.a`.t```s.s.t`.e`.b```s.'.d`.u`.o`.Y`r`..`.u`.o`.y```s.t.h`.i`.w```s`.n`.n`.u`.t`. ```s.t`. ```s.u.g`.o`.r```s. ```s.f.i`. ```s`.o`.w`. `.g```s````s`. ``.r`.'`.u`.o`.y`. `.g`.n`.i`.h`.t```s`.S.o.m.e.c.a.r.y.i.n.'.t.h.e.l. .i.n.d.r.or``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kki``s``s`ksk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`ki`k`ki``s``s`d`k```sii``s`k`s``s`ksk``s`kk``s`k`s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`ki`k`ki`k`ki``s`kk``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k`s`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`kskk`ki`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`k`ki`k`ki`kik``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k``si`ki`k`d`k`````ss``ss``s`k``si``s``ci``s``s`kski`ki``s``ss``s`k`ci``ss``ss`kis``s`ksk``s`k`sik`kiv`ki``s`kk``s`k`s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kk`k``si`ki`d`k``i``s`k`sik`kiv``s`k`s`k``s`k``s`k``s`k``s`k``s`k``s`k`d`..`.y`.a`.w``.r`.u`.o`.y```s.k.s`.c`.o`.l`.b```s.n.d`.a```s.g.e`.d`.i`.r`.b```s.h.e`.t```s.t.h`.a`.e`.n`.e`.b```s.o.m`.r`.f```s.u.t`.o```s.p.s`.e`.t`.s``.l`c`.r`.t`. `.e`.h`.T.o. r`d```s``s`ks``s`kk``s`ks``s`k`sik`kki``si``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`ki``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k````s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k``````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k````s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```s``s`ci`k```s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s``s`kskik``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk`k`d`k`````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```ss``ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`kskk``s`k`s`k``s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kkik``s`k`s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k`d`..`.m`.s`.a`.h`.c``.e`.h`.t```s.t.o`.n`.i``.l`c`.f`. `.d`.n```s.k. `.c```s. `.e`.l```s`.t`.s`r```s`. ``.e```s````s``.e`.g`.d`.i`.r`.b```s.h.e`.t```s.a.s```s.u.t`.b```s.t.,`.r`.o`.p`.p`.u`.s```s.o.r`.f```s``.t`.a`.r```s.s.p```s. .d```s```s`.c`.s`r`.u``.Y`. `. `..`.d`.n`.u```s.a.r`. `.u```s. .y`.g`.n`.i`.w``.l`c`.f``.l`.l`.i`.t`.s```s.a.s`.w```s.h.o`.w```s.r.,`.a`.e`.b```s.h.e`.t```s.o.f```s.h`.g`.i`.e`.w`r`.e`.h```s.h. ```s`.n```s`.s`.e`.l`.k`.c`.u`.b```s.g.e`.d`.i`.r`.b```s.h.e`.t```s.e.,`.d`.i`.s```s.e.r`.h`.t`.o```s.h.e`.t```s.c.h`.a`.e`.r```s.o.u`.y```s.a`. `.t```s.J.u.s. .b.e.a.t. .o.o.r.a.b.l.e.l.y. .c.o.l.a.p.s.y.o.u.m.b.a. r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```si``si``s``ss`k`ci``si`ki`s``s`ksk``si``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`s``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``si`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki``si``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````si``si``s``ss`k`ci``si`ki`s``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`ki`k`ki``s`k`s`d`k`````s``s`ci`k```s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s``s`kski``s`k`sik`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````si``si``s``ss`k`ci``si`ki`s``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``s`k`sikv`k`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`k`ki`k`ki`kk``si``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````si``s``ss`k`ci``si`ki`s``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`ki`k`ki``s`k`s`d`k`````s``s`ci`k```s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s``s`kski``s`k`sik`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````si``s``ss`k`ci``si`ki`s``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``s`k`sikv`k`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`k`ki`k`ki`kk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```ss``ss`ki``s`kskk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`kskk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`kk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k``s``s`kskik``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k````s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`kik`ki``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`ki``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k`````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`kikk`ki``s``s`ksk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k`````s``s`ci`k```s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s``s`kski``s`k`sik`kiv`k`k`k```ss``ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk`k`k`k```s``s`ci`k```s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s``s`kski`k`ki`ki`kik``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kkikv``s`k`s``s`ks``s`k`s`d`k```sii``s`k`s``s`ksk``s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`kc``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s`k``si``s``ci``s``s`kski`ki``s``ss``s`k`ci``ss``ss`kis``s`ksk``si`ki``s``s`ks``s``s`ksk`k`k``s`k`sik`k`k`kiv`ki``s`k`s`kk``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s`k`s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`kk`k`ki`k`k``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk``s`k`s`d`k```s`k```ss``ss`ki``s`ksk````sss``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk`k`k``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`ki`k`ki`ki``s`k`s`kk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kkk``s`k`s`kk``s`k`s`k`s`k`si``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`kk`k`kkv`k``s`kk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k`ki`k``s`k`s``s`ksk``s`kkkk``s`kkk`k`ki``s``s``s``s``s``s``si`k`ki`kk`kk`k``si`k`ki`k``s``siv`k``s``si`k``s``si`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``s``s`kski`k``s``si`ki`k``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`k``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`ki`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`k``s``si`ki`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`k```ss``ss`ki``s`ksk`k``s``siv`k``s``si`ki`d`k````s``s`kski``s`k`s``si`k``s``s`kskik``s``si`k``ci``s``s`kskiv`k``s``si`k`k``s``s`kski`k``s``si`k`k```ss``ss`ki``s`ksk`k``s``si`k`k``ci``s``s`kski`k``s``si`k`k``s``s`ksk``ci``s``s`kski`k``s``si`k`k```s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``si`kik``s``si`k`ki`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``si`ki`k``s``siv`k``s``si`k`kiv`k``s``si`k`ki`k``s``si`k`k``s``s`ksk``ci``s``s`kskiv`k``s``si`k``s``si`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k``````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``si`k`ki`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k````s`k``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``siv`k``s``si`ki`k``s``si`k``s``s`kskiv`k``s``si`k`ki`k``s``si`k`k```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k``s`k``s``s`kski``ci```ss``ss`ki``s`ksk`k``s``si`k`k```ss``s``s```ss`ss``ss`kis``s`k``s``si``ss`k`ci``si`kis``s`kskv`k``s``si`k``s``si`k``s``si`k`ki`k``s``si`k``s``s`kski`d`k````s``s`kski``s`k`s``si`kik````ci``s``s`kski``s`k`s``sivk``s``si`ki`k``s``si`k``s``s`kski`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`k``s``s`kski`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`ki`k``s``siv`k``s``si`k`ki`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`kskv`k``s``si`k`ki`k``s``si`k`k``s``s`ksk``ci``s``s`kski`k``s``si`k`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k`k```s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k``s``si`ki`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k`ki`k``s``si`k```ss``ss`ki``s`ksk`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`ki`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`k``s``si`k`kiv`k``s``si`k`k``ci``s``s`kski`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`d`k`````s``s`ksk``s`cii``s``s`kski``s`k`sikv``s``s``s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s``s``s``si`k`ki`kk`k`ki`k`ki`k`ki`k``s`k`sik`k`ki`k`k``s``s`ksk``ci``s``s`kskiv`ki`k``s``si`k`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k`k``s``s`ksk``ci``s``s`kskiv`k``s``si`k``s``si`k``s``si`k`ki`k``s``si`k``s``s`kski`d`k````s``s`kski``s`k`s``si`kik````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`ki`d`k`````s`cii``s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`k``s``s`kski`k``s``si`kiv`k``s``si`k`ki`k``s``si`k`k``ci``s``s`kski`k``s``si`k`k``s``s`ksk``ci``s``s`kskiv`k``s``si`k``s``si`k``s``si`ki`k``s``si`k```ss``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``si`k``s``s`kskik````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k``ci``s``s`kski`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`ki`k``s``si`k```ss``ss`ki``s`ksk`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`k``s``siv`k``s``si`k`ki`k``s``siv`k``s``si`k``ci``s``s`kski`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``siv`k``s``si`k```ss``ss`ki``s`ksk`d`k`````s`cii``s``s`kski``s`k`s``sivk``s``si`k``ci``s``s`kskiv`k``s``si`k`ki`k``s``si`k`k``ci``s``s`kski`k``s``si`k`k``s``s`ksk``ci``s``s`kski`k``s``si`k`k```s``s`ksk`ci``s``s`kski`k``s``si`k``s`k`d`.!``.i`.l`.s`. `.h`.c`.n`.i`.-`.o`.w```s.a```s.g.h`.u`.o`.r`.h`.t```s.i.t`.f```s.'.t`.n`.o`.d```s`.Y.o.u. .tr``s``s``si`k`ki`kk`kkv`k``s``si`k``s``si`k``s``si`k``s``s`kski`d`k`````ss``ss`ki``s`ksk``s`k`s``si`k`kik````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`k``s``siv`k``s``si`k```ss``ss`ki``s`ksk`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``siv`k``s``si`ki`k``s``si`k``s``s`kskiv`k``s``si`k`k``s``s`ksk``ci``s``s`kski`k``s``si`k`ki`k``s``si`k`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k````ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`kiv`k`k````ss`ss``ss`ki``s`ksk`ki`k``s``si`k``s`k`d`.!`.e`.t`.a`.r`.g`. `.l````s.s.t`. `.d```s`.o`.l``.a```s.g.h`.u`.o`.r`.h`.t```s.g.o```s.'.t`.n`.a`.c```s`.Y.o.u. .c.k.er``s``s``si`k`ki`kk`kkv`k``s``si`k``s``si`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`k``s``si`k`ki`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k`````ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``ci``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kskiv`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k````ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`kiv`k`k```s``s`ksk`ci``s``s`kski`ki`k``s``si`k``s`k`d`.!`.e`.t`.a`.r`.g`. `.l````s.s.t`. `.d```s`.o`.l``.a```s.g.h`.u`.o`.r`.h`.t```s.g.o```s.'.t`.n`.a`.c```s`.Y.o.u. .c.k.er``s``s``si`k`ki`kk`kk`k``s``si`k`k```ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`ki`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`ki`k``s``si`k`ki`d`k````s`k``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k````s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``si`ki`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k````ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``si`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`k``s``siv`k``s``si`k```ss``ss`ki``s`ksk`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`ksk``ci``s``s`kski`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k``ci``s``s`kskiv`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k````ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`kiv`k`k```s``s`ksk`ci``s``s`kski`ki`k``s``si`k`k````ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k`````ss``ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``si`ki`d`k`````s`cii``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k``ci``s``s`kskiv`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k````ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`kiv`k`k```s``s`ksk`ci``s``s`kski`ki`k``s``si`k`k````ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``ci``s``s`kski`d`k`````ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``si`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k``ci``s``s`kski`k``s``siv`k``s``si`k```ss``ss`ki``s`ksk`d`k``````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k``ci``s``s`kskiv`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k````ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`kiv`k`k```s``s`ksk`ci``s``s`kski`ki`k``s``si`k`k````ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k``ci``s``s`kski`d`k`````ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``si`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k``ci``s``s`kski`k``s``siv`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``ci``s``s`kskiv`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k````ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`kiv`k`k```s``s`ksk`ci``s``s`kski`ki`k``s``si`k`k````ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k````ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki`k`k```si``si``s``si``ss`k`ci``si`ki`s``s`kskv`ki`k``s``si`k`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```si``s``si``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k``s``si`k``s``s`kski`k``s``si`k`ki`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``s``s`kski`k``s``si`k`ki`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k`````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k`````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``sivk``s``si`ki`d`k````s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`ksk``ci``s``s`kskiv`k``s``si`k`k```s`cii``s``s`kski`k``s``si`k`k``s``s`ksk```s`cii``s``s`kski`k``s``si`k`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k````ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki`k`k```si``si``si``si``s``si``ss`k`ci``si`ki`s``s`kskv`ki`k``s``si`k`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k````s``ss`ki``s``s`k`ci``ss``ss`kis``s`kskiv`k``s``si`k``s``si`k``s``si`k`ki`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`k```ss``ss`ki``s`ksk`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`k``s``siv`d`k````s``s`kski``s`k`s``si`k```ss``ss`ki``s`kskk````ci``s``s`kski``s`k`s``sivk``s``si`ki`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k`````ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`kiv``s`k`s`k`d`..`.g`.n`.i`.p`.m`.u`.j``.f`.o```s.a.d`.e`.t`.s`.n`.i```s.g.e`.d`.i`.r`.b```s.h.e`.t``.s`c`.r`.c`.a`. ```s. .g`.u```s. `.t`.s`.e`.g`.g`.u`.s`. ``.l`c`.f`.t`.c``.p`.s```s`.I. .r.e.u.y.o. r``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s`d`k````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kk`k``si`k`ki`k``s``siv`k``s``si`kiv`kkv`k`k```si``si``si``s``si``ss`k`ci``si`ki`s``s`ksk`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s`d`k````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kk`k``si`k`ki`k``s``siv`k``s``si`kiv`kkv``s`k`s`k`d`..`.e`.r`.u````s``.e`.h`.t``.s`c`.r`.c`.a``.y`.a`.w```s.n.o```s.i.s```s.r```s.T.h.e. .o. .f.i.sr``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`ki`k``s``si`k`k```ss``ss`k```s`cii``s``s`kski``s`kskv`k``s``si`k``s``si`k``s``si`k``ci``s``s`kski`k``s``siv`k``s``si`k``s``s`kski`k``s``si`k``s``s`ksk``ci``s``s`kski`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`k``s``siv`d`k````s``s`kski``s`k`s``si`k``s``s`kskik````ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k````s``s`kski``s`k`s``sivk``s``si`k``s``s`kskiv`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`kiv``s`k`s`k`d`..`.g`.n`.i`.p`.m`.u`.j``.f`.o```s.a.d`.e`.t`.s`.n`.i```s.g.e`.d`.i`.r`.b```s.h.e`.t``.s`c`.r`.c`.a`. ```s. .g`.u```s. `.t`.s`.e`.g`.g`.u`.s`. ``.l`c`.f`.t`.c``.p`.s```s`.I. .r.e.u.y.o. r``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s`d`k````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kk`k``si`k`ki`k``s``siv`k``s``si`kiv`kkv`k`k```si``si``si``s``si``ss`k`ci``si`ki`s``s`ksk`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s`d`k````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kk`k``si`k`ki`k``s``siv`k``s``si`kiv`kkv``s`k`s`k`d`..`.e`.r`.u````s``.e`.h`.t``.s`c`.r`.c`.a``.y`.a`.w```s.n.o```s.i.s```s.r```s.T.h.e. .o. .f.i.sr``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`ki`k``s``si`k`k``s``s`ksk```s`cii``s``s`kski`k``s``si`k`k```si``s``ci``s``s`kski`ki```s``s`k`ci``ss``ss`kis``s`ksk`k``s``si`k`k```ss``ss``ss`k```s`cii``s``s`kski``s`kskv`k``s``si`k``s``si`k``s``si`k``s``s`kski`k``s``si`k`ki`k``s``si`ki`k``s``si`k```ss``ss`ki``s`ksk`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``siv`k``s``si`k`ki`d`k`````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k````sss``s`ksk``ci``s``s`kski`k``s``si`k`k```ss``ss`k```s`cii``s``s`kski``s`ksk`k``s``si`k`k```s``s```ss`ss``ss`kis``s`k``s``si``ss`k`ci``si`kis``s`ksk`k``s``si`k`k```ss``ss``ss``s``ss`k``s`cii``ss`ki``s`kskv`k``s``si`k``s``si`k``s``si`ki`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``s``s`kski`k``s``si`k``ci``s``s`kski`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```ss``ss``ss`k```s`cii``s``s`kski``s`ksk`k``s``si`k`k````sss``s`ksk``ci``s``s`kski`k``s``si`k`k```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k```ss``ss``ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s``siv`k``s``si`ki`k``s``si`k``s``s`kski`k``s``si`k`kiv`k``s``si`k`k````sss``s`ksk``ci``s``s`kski`k``s``si`k`k```ss``ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``s``s`kski`k``s``si`k`ki`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`kiv`k``s``si`k`k```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k``s``s`ksk```s``s`ci`k```s``s`k`ci``ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k`k```si``s``s``si``s`s`ci``si`kii``s``si`k``s`cii``si`ki`s``s`kskv`k``s``si`k``s``si`k``s``si`ki`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``s``s`kski`k``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk````s``s`kski``s`k`s``si`k``ci``s``s`kskikv`k``s``si`k`k````sss``s`ksk``ci``s``s`kski`k``s``si`k`k```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k````ci``s``s`kski```s``s`k`ci``ss``ss`kis``s`kski`k``s``si`k`k```s``s`ci`k```s``s`k`ci``ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k```ss``s``ss`k``s`cii``ss`ki``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`kiv`k``s``si`k`k```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k`k``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k``s``siv`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k`ki`k``s``si`ki`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`kskiv`k``s``si`k`k```ss``ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski`k``s``si`k`k``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k`k``ci```ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s``siv`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``s``s`kski`k``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`kiv`k``s``si`k`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski`k``s``si`k`k```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k`k``ci```ss``ss`ki``s`ksk`k``s``si`k`k```ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s``si`k``ci``s``s`kski`k``s``si`k``s``s`kski`k``s``si`ki`k``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``s``s`ksk``ci``s``s`kskiv`k``s``si`k`k```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k`k``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k`k``ci```ss``ss`ki``s`ksk`k``s``si`k`k```ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`k````ci``s``s`kski```s``ss``ss``s`k`ci``ss``ss`kis``s`kskiv`k``s``si`k``s``si`k``s``si`ki`k``s``si`k``s``s`kski`k``s``siv`k``s``si`k`kiv`k``s``si`k`k``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k`k``ci```ss``ss`ki``s`ksk`k``s``si`k`k``s`k``ci``s``s`kski```ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s``si`ki`k``s``siv`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k`ki`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`kskiv`k``s``si`k`k``ci```ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`k````ci``s``s`kski```s``ss``s`k`ci``ss``ss`kis``s`kski`k``s``si`k`k```ss``ss``s``ss`k``s`cii``ss`ki``s`kskv`k``s``si`k``s``si`k``s``si`k`ki`k``s``si`ki`k``s``si`k``s``s`kski`k``s``si`kiv`k``s``si`k`k````sss``s`ksk``ci``s``s`kski`k``s``si`k`k```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss``ss``ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s``siv`k``s``si`k`ki`k``s``si`ki`k``s``si`k``s``s`kskiv`k``s``si`k`k```ss``ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k`k```s``s`ksk``s`cii``s``s`kski`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s``si`k`ki`d`k````s``s`kski``s`k`s``sivk``s``si`ki`d`k````s``s`kski``s`k`s``sivk``s``si`k``s``s`kskiv`k``s``si`k`k```ss``ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k`k```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`k``s`k``ci``s``s`kski``ci```ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk````s``s`kski``s`k`s``si`k`kikv`k``s``si`k`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``s``s`kski`k``s``si`k``ci``s``s`kski`k``s``si`ki`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`k```s``s``si``s`s`ci``si`kii``s``si`k``s`cii``si`ki`s``s`ksk`k``s``si`k`k```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`k```s``s`ksk``s`cii``s``s`kskiv`k``s``si`k``s``si`k``s``si`k``s``s`kski`k``s``siv`k``s``si`k`ki`k``s``si`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`k``s``s`kski`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kskiv`k``s``si`k`k```ss``ss``ss`k```s`cii``s``s`kski``s`ksk`k``s``si`k`k``s`k``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k`k```s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k``s``si`ki`k``s``si`k``s``s`kski`k``s``si`k`kiv`k``s``si`k`k```ss``ss``ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k`k```s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k``ki``si`k`ki``s``si`kk`k`ki`kk`ki`ki`k`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kskiv`kiv`k``s``si`k``s``si`k``s``si`k`ki`k``s``si`ki`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``ci``s``s`kski`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`kskv`k``s``si`k`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k``s`k``ci``s``s`kski````ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s``si`k`ki`k``s``si`ki`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``ci``s``s`kski`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`kskv`k``s``si`k`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kski`k``s``si`k`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s``si`k`ki`k``s``si`ki`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``ci``s``s`kski`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`kskv`k``s``si`k`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kski`k``s``si`k`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`kskv`k``s``si`k``s``si`k``s``si`k`ki`k``s``si`ki`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``ci``s``s`kski`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`kskv`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kski`k``s``si`k`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kskiv`k``s``si`k``s``si`k``s``si`k`ki`k``s``si`ki`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``ci``s``s`kski`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`kskv`k``s``si`k`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kski`k``s``si`k`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kskiv`k``s``si`k``s``si`k``s``si`k`ki`k``s``si`ki`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``ci``s``s`kski`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`kskv`k``s``si`k`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kski`k``s``si`k`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kskiv`k``s``si`k``s``si`k``s``si`k`ki`k``s``si`ki`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``ci``s``s`kski`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`kskv`k``s``si`k`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kski`k``s``si`k`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`kskv`k``s``si`k``s``si`k``s``si`k`ki`k``s``si`ki`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``ci``s``s`kski`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`kskv`k``s``si`k`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kski`k``s``si`k`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k``s``si`k`ki`k``s``si`ki`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``ci``s``s`kski`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`kskv`k``s``si`k`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kskiv`k``s``si`k``s``si`k``s``si`k`ki`k``s``si`ki`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``ci``s``s`kski`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`kskv`k``s``si`k`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kski`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k``s``si`k`ki`k``s``si`ki`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``ci``s``s`kski`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k````ss`ss``ss`ki``s`kskv`k``s``si`k`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k``s`k```ss``ss`ki``s`ksk```s`cii``s``s`kski`k``s``si`k`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s``si`k`ki`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k``s``si`ki`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k``s``s`kski`k``s``si`k`kiv`k``s``si`k`k```ss``ss``ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k`k```ss``ss``ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk`k``s``si`k`k``s`k``ci``s``s`kski````ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s``si`ki`k``s``si`k``s``s`kski`k``s``si`k`ki`k``s``si`k```ss``ss`ki``s`ksk`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k`ki`k``s``siv`k``s``si`ki`k``s``si`k``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k````ci```ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`d`k`````ss``ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`kiv`k`k```si``s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`ksk`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`kiv`k`k```s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`ksk`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`kiv`k`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk`ki`k``s``si`k`k``s`k``s``s`ksk``ci``s``s`kski``ci```ss``ss`ki``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`d`k`````ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`sikv``s``s``s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s``s``s``si`k`ki`kk`k`ki`k`ki`k`ki`k``s`k`sik`k`ki`k`k```si``si``s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`kskv`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`ki``s`kk``s``s`ks``s`kk``s`k`s``s``s``s``si`kk`k`kiv``s``s``s``si`kk`k``si`ki``s``s``s``si`k`ki`kk`k``s`k`sik`k`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv``s`k`s`d`k````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`ki`ki`k`k``s`k``s``s`ksk``ci``s``s`kski``ci```ss``ss`ki``s`kskv`ki`k``s``si`k`k```si``si``s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k`k```s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k``s``si`k`ki`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k``s``si`ki`k``s``si`k`ki`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k``````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`k``s``siv`k``s``si`k`ki`d`k``````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`kiv`k``s``si`k`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k`k``s`k``s``s`kski``ci```ss``ss`ki``s`ksk`k``s``si`k`k````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kskiv`k``s``si`k``s``si`k``s``siv`k``s``si`ki`k``s``si`k``s``s`kski`k``s``si`k```ss``ss`ki``s`ksk`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``si`k``ci``s``s`kskiv`k``s``si`k`k```ss``ss`ki``s`ksk`k``s``si`k`k```si``s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`ksk`k``s``si`k`k````s``ss`ki``s``s`k`ci``ss``ss`kis``s`kski`k``s``si`k`k``s`k``s``s`kski```ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k```s`k```ss``ss`ki``s`ksk````sss``s`ksk``ci``s``s`kski``si`k`ki``s``si`kk`k`ki`kk`ki`ki`k`k```ss``s`k``si``s``ci``s``s`kski`ki``s``ss``s`k`ci``ss``ss`kis``s`kskv`ki`k``s``si`k`k```s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`kskv`k``s``si`k``s``si`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`ki`k``s``si`k`ki`d`k``````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k``s`k``s``s`kski``ci```ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`s``sivk``s``si`ki`d`k`````si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k``s`k``s``s`kski``ci```ss``ss`ki``s`ksk`k``s``si`k`k```si``si``s``si``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`k``s``s`kski`d`k````ci``s``s`kski``s`k`s``sivk``s``si`ki`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k`````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`kiv`k``s``si`k`k``s`k``s``s`kski```ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`k```si``s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`ksk`k``s``si`k`k``s`k```ss``ss`ki``s`ksk````sss``s`ksk``ci``s``s`kski`k``s``si`k`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`ki`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``siv`k``s``si`ki`d`k`````ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`kiv`k``s``si`k`k````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kski`k``s``si`k`k````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kskiv`k``s``si`k``s``si`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`ki`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk````s``s`kski``s`k`s``si`kik`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`ki`d`k`````ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`kiv`k``s``si`k`k``s`k``s``s`kski```ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k``s`k`d`.!``.i`.l`.s`. `.h`.c`.n`.i`.-`.o`.w```s.a```s.g.h`.u`.o`.r`.h`.t```s.i.t`.f```s.'.t`.n`.o`.d```s`.Y.o.u. .tr``s``s``si`k`ki`kk`kkv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`ki`d`k`````ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`d`k`````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`kiv`k``s``si`k`k````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kski`k``s``si`k`k````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kski`k``s``si`k`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k``s``si`k``s``s`kski`k``s``siv`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`s``sivk``s``si`ki`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k``s`k```ss``ss`ki``s`ksk````sss``s`ksk``ci``s``s`kski`k``s``si`k`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k`k``s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`k```si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k``s``siv`k``s``si`k``s``s`kski`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``si`ki`d`k`````s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```s``s``ss`ki``s``s`k`ci``ss``ss`kis```ss`ss``ss`ki``s`ksk`k``s``si`k`k```s`s``s`ksk`ci``s``s`kski`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k```s``s`ksk```s`cii``s``s`kski``si`k`ki``s``si`kk`k`ki`kk`ki`ki``s`k`s`k`d`.!``.g`.a`.s`.s`.a`.p`. ```s```s.l.i`. ```s.h.a```s.h. `.g`.u`.o`.r`.h```s.m. `.a`.l`.c`. ``.o`c`.-`.e`.v`.i```s.s`.i`.h`.t```s.i.t`.f```s.'.t`.n`.a`.c```s`.Y.o.u. .f.t.l.er``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kkv`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k````ss``ss`k```s`cii``s``s`kski``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki``s`k`s`k`d`.!``.g`.a`.s`.s`.a`.p`. ```s```s.l.i`. ```s.h.a```s.h. `.g`.u`.o`.r`.h```s.r. `.e```s.y.s`.o`. ``.o`c`.-`.e`.v`.i```s.s`.i`.h`.t```s.i.t`.f```s.'.t`.n`.a`.c```s`.Y.o.u. .f.t.l.er``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kkv`ki`k``s``si`k`k````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kskiv`k``s``si`k``s``si`d`k``````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k``s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`ki`d`k``````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k``s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`k```si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`s``sivk``s``si`kiv`k``s``si`k`k```s`s``s`ksk`ci``s``s`kski`k``s``si`k`k``s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`k``s``si`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kski`k``s``si`k`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k`k```si``si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`d`k`````ss``ss`ki``s`ksk``s`k`s``si`k`kik``s``si`k``s``s`kski`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``si`k`kikv`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`d`k``````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kski``s`k`sikv``s``s``s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s``s``s``si`k`ki`kk`k`ki`k`ki`k`ki`k``s`k`sik`k`ki``s`k`s`k`d`..`.e`.g``.s`.s```s`.n`.i`.a`.m`r`.e`.h`.t```s.i.n```s.c.k`.a`.b```s.u.p```s.n.d`.u`.o`.w```s.n.d`.a```s``.o`.h`. `.e``.t`c`.l``.e`.m`.o`.s```s.i.n```s.n.d`.u`.o`.r`.a```s.e.d`.l`.w`.a`.r`.c```s.v.e`.a`.h```s`.Y.o.u. .i.l.e.s. .p.ar``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kkv`ki`k``s``si`k`k```si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k``s`k`d`..`.e`.g``.s`.s```s`.n`.i`.a`.m```s.h.e`.t```s.i.n```s.c.k`.a`.b```s.o.w`.n```s.r.e`.a```s`.Y````s`.i`.-`.e`.v`.a`.c`. `.t```s.c```s`.a```s.b.y```s.e.d`.k`.c`.o`.l`.b`r`.y`.a`.w```s.u.r`.o`.y```s.n.d`.u`.o`.f```s.n.d`.a```s``.o`.h`. `.e``.t`c`.l``.e`.m`.o`.s```s.i.n```s.n.d`.u`.o`.r`.a```s.e.d`.l`.w`.a`.r`.c```s.v.e`.a`.h```s`.Y.o.u. .i.l.e.s. .r.e.n... .o.u. .p.ar``s``s``si`k`ki`kk`kkv`k``s``si`k``s``si`k``s``si`k```ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``s``s`kski`k``s``si`k`ki`k``s``si`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k``ci``s``s`kski`k``s``si`k```ss```ss`ss``ss`ki``s`ksk`d`k````s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`kskv`k``s``si`k`k````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kski`k``s``si`k`k```si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`d`k`````ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk``s`k`sikv``s``s``s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s``s``s``si`k`ki`kk`k`ki`k`ki`k`ki`k``s`k`sik`k`ki``s`k`s`k`d`..`.e`.g``.s`.s```s`.n`.i`.a`.m`r`.e`.h`.t```s.i.n```s.c.k`.a`.b```s.u.p```s.n.d`.u`.o`.w```s.n.d`.a```s``.o`.h`. `.e``.t`c`.l``.e`.m`.o`.s```s.i.n```s.n.d`.u`.o`.r`.a```s.e.d`.l`.w`.a`.r`.c```s.v.e`.a`.h```s`.Y.o.u. .i.l.e.s. .p.ar``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kkv`ki`k``s``si`k`k```ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`d`k`````ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk``s`k`sikv``s``s``s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s``s``s``si`k`ki`kk`k`ki`k`ki`k`ki`k``s`k`sik`k`ki``s`k`s`k`d`..`.e`.g``.s`.s```s`.n`.i`.a`.m`r`.e`.h`.t```s.i.n```s.c.k`.a`.b```s.u.p```s.n.d`.u`.o`.w```s.n.d`.a```s``.o`.h`. `.e``.t`c`.l``.e`.m`.o`.s```s.i.n```s.n.d`.u`.o`.r`.a```s.e.d`.l`.w`.a`.r`.c```s.v.e`.a`.h```s`.Y.o.u. .i.l.e.s. .p.ar``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kkv`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`d`k`````s``s`ksk``s`cii``s``s`kski``s`k`sikv``s``s``s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s``s``s``si`k`ki`kk`k`ki`k`ki`k`ki`k``s`k`sik`k`ki`k`k```s`s`ci``si`ki`s``s`kskv`ki`k``s``si`k`k``s`k```ss``ss`ki``s`ksk````sss``s`ksk``ci``s``s`kski`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`d`k`````s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski``s`k`sikv``s``s``s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s``s``s``si`k`ki`kk`k`ki`k`ki`k`ki`k``s`k`sik`k`ki``s`k`s`k`d`..`.e`.g``.s`.s```s`.n`.i`.a`.m`r`.e`.h`.t```s.i.n```s.c.k`.a`.b```s.u.p```s.n.d`.u`.o`.w```s.n.d`.a```s``.o`.h`. `.e``.t`c`.l``.e`.m`.o`.s```s.i.n```s.n.d`.u`.o`.r`.a```s.e.d`.l`.w`.a`.r`.c```s.v.e`.a`.h```s`.Y.o.u. .i.l.e.s. .p.ar``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kkv`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`d`k````s`k```ss``ss`ki``s`ksk```s`cii``s``s`kski``s`k`sikv``s``s``s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s``s``s``si`k`ki`kk`k`ki`k`ki`k`ki`k``s`k`sik`k`ki`k`k```si``si``si``s`s`ci``si`ki`s``s`kskv`ki`k``s``si`k`k```si``s`s`ci``si`ki`s``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`d`k`````ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk``s`k`sikv``s``s``s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s``s``s``si`k`ki`kk`k`ki`k`ki`k`ki`k``s`k`sik`k`ki``s`k`s`k`d`..`.e`.g``.s`.s```s`.n`.i`.a`.m`r`.e`.h`.t```s.i.n```s.c.k`.a`.b```s.u.p```s.n.d`.u`.o`.w```s.n.d`.a```s``.o`.h`. `.e``.t`c`.l``.e`.m`.o`.s```s.i.n```s.n.d`.u`.o`.r`.a```s.e.d`.l`.w`.a`.r`.c```s.v.e`.a`.h```s`.Y.o.u. .i.l.e.s. .p.ar``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kkv`ki`k``s``si`k`k```si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k``s``siv`k``s``si`k``s``s`kski`k``s``si`k``ci``s``s`kski`k``s``si`ki`k``s``si`k`ki`k``s``siv`k``s``si`k``s``s`ksk``ci``s``s`kski`d`k`````ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`k``ci``s``s`kski``s`kskv`k``s``si`k`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k`k```si``si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`d`k`````ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk``s`k`sikv``s``s``s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s``s``s``si`k`ki`kk`k`ki`k`ki`k`ki`k``s`k`sik`k`ki``s`k`s`k`d`..`.e`.g``.s`.s```s`.n`.i`.a`.m`r`.e`.h`.t```s.i.n```s.c.k`.a`.b```s.u.p```s.n.d`.u`.o`.w```s.n.d`.a```s``.o`.h`. `.e``.t`c`.l``.e`.m`.o`.s```s.i.n```s.n.d`.u`.o`.r`.a```s.e.d`.l`.w`.a`.r`.c```s.v.e`.a`.h```s`.Y.o.u. .i.l.e.s. .p.ar``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kkv`ki`k``s``si`k`k```ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k`k```si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`d`k`````s``s`ksk``s`cii``s``s`kski``s`k`sikv``s``s``s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s``s``s``si`k`ki`kk`k`ki`k`ki`k`ki`k``s`k`sik`k`ki``s`k`s`k`d`..`.e`.g``.s`.s```s`.n`.i`.a`.m`r`.e`.h`.t```s.i.n```s.c.k`.a`.b```s.u.p```s.n.d`.u`.o`.w```s.n.d`.a```s``.o`.h`. `.e``.t`c`.l``.e`.m`.o`.s```s.i.n```s.n.d`.u`.o`.r`.a```s.e.d`.l`.w`.a`.r`.c```s.v.e`.a`.h```s`.Y.o.u. .i.l.e.s. .p.ar``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kkv`ki`k``s``si`k`k```si``si``si``si``si``si``s`s`ci``si`ki`s``s`kskv`k``s``si`k``s``si`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k``````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```si``si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`ki`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`ki`d`k`````ss``ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kskiv`k``s``si`k`k```si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k`k```s``si``s`ci`k`s``s`ksk``s`s``s`ksk`ci``s``s`kski`k``s``si`k`k````s```ss`ss``ss`kis``s`ksk```s`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`ki`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`s``sivk``s``si`ki`d`k`````s`cii``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`kskv`k``s``si`k`k```si``si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k`k```ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k`k```s``s```ss`ss``ss`kis``s`k``si``s``ss`k`ci``si`kis``s`ksk`k``s``si`k``s`k`d`..`.h`.c`.a`.e`.r``.o`.t```s.o.u`.y```s.o.r`.f```s.u.p```s.a.r`.f``.o`c``.s`.i```s.I.t. .t. r``s``s``si`k`ki`kk`kkv`k``s``si`k``s``si`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```si``si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k``````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`kiv`k``s``si`k`k```s``si``s`ci`k`s``s`ksk``s`s``s`ksk`ci``s``s`kski`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`d`k```ci``s``s`kski``si`ki``s``s``s``s`d`k````ss``s`k`ci``ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kk`k``s`k`sik`k`kivv`k`k``s`k``s``s`kski```si``si``si``s``ss`k`ci``si`ki`s``s`ksk`ki`k``s``si`k`k```si``si``si``si``si``s``si``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`k``s``s`kski`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`k``s``si`k`ki`d`k`````ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``s``s`kskiv`k``s``si`k`k```s``s```ss`ss``ss`kis``s`k``si``s``ss`k`ci``si`kis``s`ksk`k``s``si`k`k```si``si``s``si``ss`k`ci``si`ki`s``s`ksk`k``s``si`k`k```s``s`ksk``s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kskiv`k``s``si`k``s``si`k``s``si`k``s``s`kski`k``s``si`k`ki`k``s``si`kiv`k``s``si`k`k``s`k```ss``ss`ki``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k`k```ss``s``ss`k``s``s`ci`k```s```ss`ss``ss`kis``s`kski``ss`ki``s`ksk`k``s``si`k`k``s`k```ss``ss`ki``s`ksk``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k``s``siv`k``s``si`k`ki`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```s``s`ksk``s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kskiv`k``s``si`k``s``si`k``s``si`ki`k``s``si`k`ki`d`k`````ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`s``sivk``s``si`ki`d`k````s``s`ksk```s`cii``s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`ki`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```s``s`ksk``s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k````ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`kiv`k`k````s``ss``ss`ki``s``ss`k```si``s`k`s``s`ksk`ci``s``s`kskis``s`kski`ki`k``s``si`k``s`k`d`..`.n`.e`.p`.o``.o`.t```s.e.s`.s`.u`.f`.e`.r```s.n.d`.a```s.t`.s`.u`.r`. ```s`.m```s.t`.x`.e`. `.s`.i`. ``.o`c`. `.e`.h`.T.d.r.e.l.y. r``s``s``si`k`ki`kk`kkv`k``s``si`k``s``si`k``s``siv`k``s``si`k`ki`k``s``siv`k``s``si`k``s``s`kski`d`k``````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`kiv`k``s``si`k`k``s`k```ss``ss`ki``s`ksk``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k`k```s``s`ksk``s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k````ss``sss``s`ksk``ci``s``s`kskiv`k``s``si`k``s``si`k``s``si`k`ki`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`ki`d`k`````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k`````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk````s``s`kski``s`k`s``si`k`kikv`k``s``si`k`k````s``ss``ss`ki``s``ss`k```si``s`k`s``s`ksk`ci``s``s`kskis``s`kski`k``s``si`k`k```si``si``si``s`s`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k``s``si`k`ki`k``s``si`k``s``s`kski`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`ki`d`k`````ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`kiv`k``s``si`k`k```si``s`s`ci``si`ki`s``s`ksk`k``s``si`k`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k`k```si``si``s`s`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k``s``si`k``s``s`kski`k``s``si`ki`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k`k```s`s`ci``si`ki`s``s`ksk`k``s``si`k`k```si``si``si``si``si``s`s`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k``s``si`k`ki`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`ki`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk````s``s`kski``s`k`s``si`kikv`k``s``si`k`k```s`s`ci``si`ki`s``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`d`k````s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski``s`k`sikv``s``s``s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s``s``s``si`k`ki`kk`k`ki`k`ki`k`ki`k``s`k`sik`k`ki`k`k```si``s`k`s``s`ksk`ci``s``s`kskiv`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`d`k`````s``s`ksk``s`cii``s``s`kski``s`k`sikv``s``s``s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s``s``s``si`k`ki`kk`k`ki`k`ki`k`ki`k``s`k`sik`k`ki`k`k```ss``s`k`ci``ss``ss`ki``s`kskv`ki`k``s``si`k`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k``s``si`k``s``s`kski`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``siv`k``s``si`ki`d`k`````ss``ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`kskv`k``s``si`k`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k`k```ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k`k```si``si``si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k`k```si``si``si``si``si``si``s`s`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k``s``siv`k``s``si`k`ki`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```si``si``si``s`s`ci``si`ki`s``s`kskv`k``s``si`k``s``si`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`s``sivk``s``si`kiv`k``s``si`k`k```si``s`s`ci``si`ki`s``s`ksk`k``s``si`k`k```si``si``s``si``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k``s``si`k``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`ki`k``s``siv`k``s``si`k`ki`d`k````s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`d`k````s``s`ksk```s`cii``s``s`kski``s`k`s``sivk``s``si`k``s``s`kskiv`k``s``si`k`k```si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k`k```si``si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k`k```si``si``si``si``si``si``si``s`s`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k``s``siv`k``s``si`k`ki`k``s``siv`k``s``si`ki`d`k````s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```si``si``si``si``si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k`k```s``s``s`s`ci``si`kii``s``si`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`ki`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`k``s``si`k`kiv`k``s``si`k`k```si``si``si``si``si``si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k`k```si``s``ci``s``s`kski`ki```s``ss``s`k`ci``ss``ss`kis``s`ksk`k``s``si`k`k```s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`kskv`k``s``si`k``s``si`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``si`k``ci``s``s`kski`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k````ci```ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``ci``s``s`kski`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`kskiv`k``s``si`k`k```si``s``ci``s``s`kski`ki```s``ss``s`k`ci``ss``ss`kis``s`ksk`k``s``si`k`k```s``s``s`s`ci``si`kii``s``si`k`ci``si`ki`s``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k```s`k```ss``ss`ki``s`ksk````sss``s`ksk``ci``s``s`kski``si`k`ki``s``si`kk`k`ki`kk`ki`ki`k`k```ss``s`k``si``s``ci``s``s`kski`ki``s``ss``s`k`ci``ss``ss`kis``s`kskv`ki`k``s``si`k`k``s`k``s``s`kski``ci```ss``ss`ki``s`ksk`k``s``si`k`k```ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`kskv`k``s``si`k``s``si`k``s``siv`k``s``si`k`ki`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k````s`k``s``s`kski```ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`kskv`k``s``si`k``s``si`k``s``si`k``s``s`kski`k``s``si`k`ki`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`ki`d`k`````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`kiv`k``s``si`k`k```s``si``s`ci`k`s``s`ksk``s`s``s`ksk`ci``s``s`kski`k``s``si`k`k```ss``ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`ki`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k`ki`d`k````s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``ci``s``s`kskiv`k``s``si`k`k```ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k`````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`kiv`k`k```s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`ksk`ki`k``s``si`k`k``s`k```ss``ss`ki``s`ksk```s``s`ksk``s`cii``s``s`kski`k``s``si`k`k```ss``ss``ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k`k``s`k``s``s`ksk``ci``s``s`kski```ss``ss``ss`k```s`cii``s``s`kski``s`kskv`k``s``si`k``s``si`k``s``si`ki`k``s``si`k`ki`d`k````s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`kiv`k``s``si`k`k```ss``ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k`k``s`k``s``s`ksk``ci``s``s`kski```ss``ss``ss`k```s`cii``s``s`kski``s`kskv`k``s``si`k``s``si`k``s``siv`k``s``si`k`ki`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```ss``ss``ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`kskv`k``s``si`k``s``si`k``s``si`k`ki`k``s``siv`k``s``si`ki`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``si`kiv`k``s``si`k`k```ss``ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k``s`k`d`..`.y`.b``.t`.e`.g```s.t.o```s.r.y`.t```s.o.t`.n```s.s.t`.e`.b```s`.u`.o`.Y````s.y..`.t`.s`.a`.n```s.e.r`.h`.t`.a`.r```s.k.s`.o`.o`.l```s.o.n`.g`.a`.r`.d```s`.T.h.e. .'.d. r``s``s``si`k`ki`kk`kkv`k``s``si`k``s``si`k``s``si`k`ki`k``s``siv`k``s``si`kiv`k``s``si`k`k```ss``ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k`k```si``si``s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k``s``si`ki`k``s``siv`k``s``si`k`ki`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``si`kiv`k``s``si`k`k```si``si``s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`ksk`k``s``si`k``s`k`d`..`.y`.b``.t`.e`.g```s.t.o```s.r.y`.t```s.o.t`.n```s.s.t`.e`.b```s`.u`.o`.Y````s.y..`.t`.s`.a`.n```s.e.r`.h`.t`.a`.r```s.k.s`.o`.o`.l```s.o.n`.g`.a`.r`.d```s`.T.h.e. .'.d. r``s``s``si`k`ki`kk`kkv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k`ki`k``s``si`ki`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`kskv`k``s``si`k`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k`````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`kiv`k`k```s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`ksk`ki`k``s``si`k`k```si``s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`ksk`k``s``si`k`k````ss``s`k`ss``ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s``si`ki`k``s``si`k`kiv`k``s``si`k`k```ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s``si`k`kiv`k``s``si`k`k````ss``s`k`ss``ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s``si`k``s``s`kski`k``s``siv`k``s``si`k`ki`k``s``si`ki`d`k````s``s`ksk```s`cii``s``s`kski``s`k`s``sivk``s``si`k``s``s`kskiv`k``s``si`k`k````ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k`k```si``si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k``s``siv`k``s``si`k`kiv`k``s``si`k`k```ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`ki`k``s``si`k`kiv`k``s``si`k`k```si``si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k`k```ss``ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k````ci``s``s`kski``s`k`s``sivk``s``si`ki`d`k````s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk````s``s`kski``s`k`s``si`kik````ci``s``s`kski``s`k`s``sivk``s``si`k``ci``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`kiv`k``s``si`k`k```ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`ki``s`kk``s``s`ks``s`kk``s`k`s``s``s``s``si`kk`k`kiv``s``s``s``si`kk`k``si`ki``s``s``s``si`k`ki`kk`k``s`k`sik`k`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`ki`ki``s`k`s`k`d`..````s`.c``.u`.o`.y```s.e.t`.l```s.t.o```s.e.s`.s`.u`.f`.e`.r``.l`c`.r`.t`. `.e`.h`.T.o. .r.o.sr``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kkv`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k```s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`kiv``s`k`s`k`d`..`.m`.s`.a`.h`.c``.e`.h`.t``.s`c`.r`.c`.a``.y`.a`.w```s.n.y`.a```s.e.r`.g`.n`.o`.l```s.n.o```s.i.s```s.r```s.T.h.e. .o. r``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`ki`k``s``si`k`k```ss``ss``s`k``si``s``ci``s``s`kski`ki``s``ss``s`k`ci``ss``ss`kis``s`ksk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k```s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`kiv`k`k```si``si``si``s``si``ss`k`ci``si`ki`s``s`ksk`ki`k``s``si`k``s`k`d`..`.g`.n`.i`.p`.m`.u`.j``.f`.o```s.a.d`.e`.t`.s`.n`.i```s.g.e`.d`.i`.r`.b```s.h.e`.t``.s`c`.r`.c`.a`. ```s. .g`.u```s. `.t`.s`.e`.g`.g`.u`.s`. ``.l`c`.f`.t`.c``.p`.s```s`.I. .r.e.u.y.o. r``s``s``si`k`ki`kk`kkv`k``s``si`k``s``si`k``s``siv`k``s``si`k`ki`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k``````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```ss``ss``ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k````s``s`ksk``ci``s``s`kski``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```s``s`ksk``s`cii``s``s`kskiv`k``s``si`k``s``si`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k``````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```ss``ss``s``sss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k``````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```ss``ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```ss``ss``s``ss`k``s`cii``ss`ki``s`kskv`k``s``si`k``s``si`k``s``siv`k``s``si`k`ki`d`k`````ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```ss``ss``s``sss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k``ci```ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k````s``s`kski``s`k`s``sivk``s``si`ki`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk````s``s`kski``s`k`s``si`kik````ci``s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``sivk``s``si`ki`d`k`````ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`d`k````s``s`kski``s`k`s``sivk``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k``ci``s``s`kskiv`k``s``si`k`k``s`k```ss``ss``ss`k``ci``s``s`kski``s`ksk``s``s`ksk```s`cii``s``s`kski`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`ki``s`kk``s``s`ks``s`kk``s`k`s``s``s``s``si`kk`k`kiv``s``s``s``si`kk`k``si`ki``s``s``s``si`k`ki`kk`k``s`k`sik`k`kiv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`ki`k`kk`k`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv``s`k`s`d`k````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`ki`ki``s`k`s`k`d`..````s`.c``.u`.o`.y```s.e.t`.l```s.t.o```s.e.s`.s`.u`.f`.e`.r``.l`c`.r`.t`. `.e`.h`.T.o. .r.o.sr``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kkv`ki`k``s``si`k`k```ss``ss``s`k``si``s``ci``s``s`kski`ki``s``ss``s`k`ci``ss``ss`kis``s`ksk`k``s``si`k``s`k`d`..`.g`.n`.i`.p`.m`.u`.j``.f`.o```s.a.d`.e`.t`.s`.n`.i```s.g.e`.d`.i`.r`.b```s.h.e`.t``.s`c`.r`.c`.a`. ```s. .g`.u```s. `.t`.s`.e`.g`.g`.u`.s`. ``.l`c`.f`.t`.c``.p`.s```s`.I. .r.e.u.y.o. r``s``s``si`k`ki`kk`kk`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`k```ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```s``ss``ss`ki``ss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`ki`k``s``si`k`ki`d`k````s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`d`k````s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`k``s``si`kiv`k``s``si`k`k```s``s`ci`k```s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s``s`kski`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`k```ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```s``ss``ss`ki``ss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``si`ki`k``s``si`k``s``s`kski`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`k``s``si`ki`k``s``si`k``s``s`kski`d`k````s`k``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``ci``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`kskv`k``s``si`k`k``s`k```ss``ss``ss`k``ci``s``s`kski``s`ksk``s``s`ksk```s`cii``s``s`kski`k``s``si`k`k```s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss``ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```s``ss``ss`ki``ss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k``s``si`ki`k``s``si`k`ki`k``s``si`k``s``s`kski`d`k`````ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k`````ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`ki`k``s``si`k`kiv`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`k```ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k```ss``ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s``siv`k``s``si`k`ki`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`d`k`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`kiv`k``s``si`k`k```s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k``s`k`d`.!`.s``.o`.l```s`.d```s`.e`.b```s`.n`.o`.D.'.t. .r.i.c.ur``s``s``si`k`ki`kk`kkv`k``s``si`k``s``si`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k``````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`k``s``si`kiv`k``s``si`k`k```s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`k```ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s``si`k`ki`k``s``si`ki`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k`ki`k``s``si`ki`d`k`````s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski``s`k`s``sivk``s``si`ki`d`k````s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`k``s``si`k`kiv`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`k```s``ss``ss`ki``ss`k``ci``s``s`kski``s`ksk`k``s``si`k`k```ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k````s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`k``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k````ci```ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``s`kski`d`k````s``s`kski``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``si`kiv`k``s``si`k`k```ss``ss``ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`k```ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`ksk`k``s``si`k`k```ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k`````ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k``````ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k`ki`d`k``````ci``s``s`kski```s```ss`ss``ss`kis``s`kski``s`k`s``sivk``s``si`k``s``s`kski`k``s``si`kiv`k``s``si`k`k```s``ss``ss`ki``ss`k``ci``s``s`kski``s`ksk`k``s``si`k`k``s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k`k```ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk``s``si`k`kiv`k``s``si`k`k```s``si``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`d`k````ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`kiv`k``s``si`k`k```ss``ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``s`k`d`.!`.e`.t`.a`.r`.g`. `.l````s.s.t`. `.d```s`.o`.l``.a```s.g.h`.u`.o`.r`.h`.t```s.g.o```s.'.t`.n`.a`.c```s`.Y.o.u. .c.k.er``s``s``si`k`ki`kk`kkv`k``s``si`k``s``si`d`k```sii``s`k`s``si`k`ki``s``s`kskk`k``s``si`k`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv`d`k````s``s`kski``s`k`s``si`k``s``si`d`k```sii``s`k`s``si`k`ki``s``s`kskk`k``s``si`k`k`kivk``s``si`k``s``si`d`k```sii``s`k`s``si`k`ki``s``s`kskk`k``s``si`k`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k```sii``s`k`s``si`k`ki``s``s`kskk`k``s``si`k`k``s`k```ss``ss`ki``s`ksk```si``s`k`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`d`k```sii``s`k`s``si`k`ki``s``s`kskk`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`d`k```s``s`kski``si`ki``s``s``s``s`d`k````ss``s`k`ci``ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kk`k``s`k`sik`k`kivv`k`k```ss``ss``s``s```ss`ss``ss`kis``s`k``s``si``ss`k`ci``si`kis``s`ksk`ki`k``s``si`k`k``s`k``s``s`ksk``ci``s``s`kski```ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k```sii``s`k`s``si`k`ki``s``s`kskk`k``s``si`k`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`d`k```sii``s`k`s``si`k`ki``s``s`kskk`k``s``si`k`k```ss``ss``ss`k```s`cii``s``s`kski``s`kskv`k``s``si`k``s``si`d`k```sii``s`k`s``si`k`ki``s``s`kskk`k``s``si`k`k```ss``ss`k```s`cii``s``s`kski``s`kskv`k``s``si`k``s``si`d`k```sii``s`k`s``si`k`ki``s``s`kskk`k``s``si`k`k```ss``ss`ki``s`kskv`k``s``si`k``s``si`d`k```sii``s`k`s``si`k`ki``s``s`kskk`k``s``si`k`k```s``s```ss`ss``ss`kis``s`k``si``s``ss`k`ci``si`kis``s`kskv`k``s``si`k``s``si`d`k```sii``s`k`s``si`k`ki``s``s`kskk`k``s``si`k`k```s``si``s`ci`k`s``s`ksk``s`s``s`ksk`ci``s``s`kskivv`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`k`ki`k`k``si`k`ki`kk`k`k`kk`k`k`k``si`k`ki`k`ki`k``s``si`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``si`k`ki`kk`kk`k``s`k`sik`k`ki`d`k````s`k``ci``s``s`kski``ci```ss``ss`ki``s`ksk``s`k`sikv``s``s``s``s``si`k`ki`kk`kk`k`kiv``s``s`ks``s`k`s`kc``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`k`kiv`k`ki`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ksk```s`cii``s``s`kski``s``s`ks``s`k`s`d`k````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`sik``s`k`s`kk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik``s`kkk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`k`ki`k`k``si`ki`k`d`k``i``s`k`sik`kiv`ki``s`kk``s``s`ks``s`k`s`k``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`d`k````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`sik``s`kkk`k``s``s``s``s``si`k`ki`kk`kk`k``s`k`sikv`k``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k``s``s`kski```ss``s`k`ci``ss``ss`ki``s`kskk`k``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ksk```s`cii``s``s`kskik`k`ki``s`k`s`d`k`````ss``ss`ki``s`ksk``s`k`sikv``s``s`ks``s``s`ks``s`k`s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k`ki`k`k``s`k`sik`k`k`ki``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`d````ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kskikv``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ksk```s`cii``s``s`kskik`ki`k``s``si`k``s``s``s`ks``s`kk``s`k`s``s``s`ks``s`kk``s`k`s`k``s`k``s`k``s`k`d`.)`..`.d``.s`.s`.i`.m`. ```s.a.x`. ```s`.(````s.y..`.a`.w`.a```s.a.n`.r```s.n.d`.a```s.d.,`.e`.s`.r`.u`.c```s.u.,`.o`.y```s.a.t```s.x`.a`r```s.t`.t`.i```s.a```s.e.w`.r`.h`.t```s.u.,`.o`.y```s.a.w`.s```s`.e`.n```s``.a```s.n.d`.u`.o`.r`.a```s.e.d`.k`.l`.a`.w```s.s.t`.u`.j```s.r.f`.a`.w`.d```s`.t`.t`.i```s.A. .l.e. .c.o.r.,. .l.e. .T.h.er`d```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ksk```s`cii``s``s`kski``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s`d`k````ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk``si``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`kk``s`k`s``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``si`kk``s``s`ks``s`k`s`k``sii``s`kk``s`k`s`k`si``s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k`s`k`s`k``s``s`ks``s``s`ks``s`k`sikkv``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`kkk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`k`k```s`cii``s``s`kski`k``s`kk``s``s`ksk`k`k``s`kkk`k`k`ki`k``s`kk``s``s`ks``s``s`kskk`ki`k``si`k`ki`kk``s``s`ks``s``s`ksk`k`k``s``s`k``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`kskv`k`ki`kk``s`k`s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk``s`kk``s``s`ks``s``s`ks``s`k`s`d`k```sii``s``s`ks``s`kk``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`kk`k`kk`k`k`ki`k`k`k`ki`k`ki`k`d````ss``ss`ki``s`ksk``si`ki``s`kk``s`k`si``s``s`ks``s``s`ks``s`kk``s`k`s``s`ks``s`k`s`k``s``s`kskik``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`k``s`k`sikv`k`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk`k`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k``si`k`k``s``s`ks``s`kk``s`ks``s`k`s``si`k`kik`kkk`k`ki``s`d`k`````ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s``s``s``si`k`ki`kk`k`ki`k`ki`k`ki``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`d```ci``s``s`kski``si`k`ki`ki`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``s``si`k`ki`k`ki``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k``s``s`kski`k``s``s``s``si`kk`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`ki``s``s``s``si`k`ki`kk`ki`k`ki``s``s``s``s``si`k`ki`kk`k`ki`k`ki`k`ki`k``s``si`k``s`k``s``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`k`ki`kk`kk`kk`k`k`ki`k`k````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski`k`k``s`k``s``s`kski```ss``ss``s`k`ci``ss``ss`ki``s`ksk`kii``s``s``s`k```ss``ss`k``ci``s``s`kski``s`ksk`k``si`k``s``s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``s`kkkv`k`ki``s`k`s`kk``s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s`k`s`k`s`ks``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`kk``s`ks``s`kk``s`ks``s`kk``s``s`ks``s`kk``s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`ki`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`d````ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s`k`s``s`ks``s`kk``s`ks``s`kk``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk``s`kk``s``s`ks``s`kk``s`ks``s`kk``s`ks``s``s`ksk`k`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk`k``s`k`s`k`s`k`si``s`k`s`k`s`kk``s`k`s`k`s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s`k`s`k`s`ks``s`k`s`k`s`kk``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s`k`s``s`ks``s`k`sik``s`kkk`k`kk`k`k`kk`k``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`kk``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s``si`k``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`ki``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`k`ki``s`k`s`kk``s`k`s`kk``s`k`s``s`ks``s``s`ksk`k`k`k`ki``s`kk``s`k`s`d`k`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`sik`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sikv`k`k`k`ki`k`k`k`ki`k``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ksk`k`k`k`ki``s`kk``s`kk``s``s`ksk`k`k`kk``s`kk``s`k`s`kk``s`k`s``s`ks``s`kk``s``s`ks``s``s`ks``s`k`s`k``sii``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`kc``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ksk`k`k`k`ki`ki``s`k`s`k`s`kk``s`k`s`k`s`kk``s`k`s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`kk``s`kk``s`kkk`k``s`k`s``s`ks``s`kk``s`ks``s``s`ks``s``s`ksk`k`k`ki`ki``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`ki`k`k``s``s`ksk`k`k`ki`k`k`k``s`k`si``s`kk``s``s`ksk`k`kkv`kik``s`kk``s``s`ks``s``s`ks``s`k`s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k`ki`k`k``s`k`sikv`k`k`k`ki`k`k``s``s`ksk`k`k``s`kkk``s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s`k`s`k`s`k``sii``s`k`s`kk``s`k`s`k`s`k`si``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s`k`s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`kskv`k`ki`k``s``s``si`k``s`k`sikv`d`k````s`k``ci``s``s`kski``ci```ss``ss`ki``s`ksk``s`k`sik`ki`k`k`ki`k``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`kk`k`k``s`k`sik`k`k`kiv`k`k`ki`k`kk`k`k`k`k`ki`k`k``s`kk``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k`k`ki`k`k``s`kk``s``s`ks``s``s`kskk`ki`k`kk`k`k`k`ki`k`k``s``s``s``si`k``s`kkk`k``si`k`ki`k`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k``s``si`k````s``ss`ki``s``s`k`ci``ss``ss`kis``s`kski`k``s``si`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k``s``s`ksk```s`cii``s``s`kski`k``s``si`k```s`cii``s``s`kskiv`k``s``si`k``s``si`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k```ss``ss`k```s`cii``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k```ss``ss``ss`k```s`cii``s``s`kski``s`ksk`k``s``si`k``s``s`ksk```s`cii``s``s`kskiv`k``s``si`k``s``si`k```ss``ss``ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k```ss``ss`k```s`cii``s``s`kski``s`ksk`k``s``si`k````sss``s`ksk``ci``s``s`kskiv`k``s``si`k``s``si`k```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss`k```s`cii``s``s`kski``s`kskv`k``s``si`k``s``si`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k````sss``s`ksk``ci``s``s`kskiv`k``s``si`k``s``si`k```si``s``s``si``s`s`ci``si`kii``s``si`k``s`cii``si`ki`s``s`ksk`k``s``si`k```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k``s``s`ksk```s``s`ci`k```s``s`k`ci``ss``ss`kis``s`kski``s``s`kski`k``s``si`k```ss``s``sss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k```ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k```s``s`ci`k```s``s`k`ci``ss``ss`kis``s`kski``s``s`kski`k``s``si`k````ci``s``s`kski```s``s`k`ci``ss``ss`kis``s`kski`k``s``si`k```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k````sss``s`ksk``ci``s``s`kskiv`k``s``si`k``s``si`k``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k```si``s`k`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k``ci```ss``ss`ki``s`ksk`k``s``si`k``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski`k``s``si`k```ss``ss``s``sss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k```ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k``ci```ss``ss`ki``s`ksk`k``s``si`k```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k```s``si``s`ci`k`s``s`ksk``s`cii``s``s`kskiv`k``s``si`k``s``si`k````ci``s``s`kski```s``ss``ss``s`k`ci``ss``ss`kis``s`kski`k``s``si`k```ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k```ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k```si``s`k`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k``s`k``ci``s``s`kski```ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k``ci```ss``ss`ki``s`ksk`k``s``si`k``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k```ss``ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k````ci``s``s`kski```s``ss``s`k`ci``ss``ss`kis``s`kski`k``s``si`k``ci```ss``ss`ki``s`kskv`k``s``si`k``s``si`k```ss``ss``ss``ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k````sss``s`ksk``ci``s``s`kskiv`k``s``si`k``s``si`k``s`k``ci``s``s`kski```ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k```s``s`ksk``s`cii``s``s`kski`k``s``si`k```ss``ss``s``ss`k``s`cii``ss`ki``s`kskv`k``s``si`k``s``si`k``s`k``ci``s``s`kski``ci```ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k```ss``ss``s``ss`k``s`cii``ss`ki``s`kskv`k``s``si`k``s``si`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k```s``s`ksk``s`cii``s``s`kski`k``s``si`k```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k```s``s``si``s`s`ci``si`kii``s``si`k``s`cii``si`ki`s``s`ksk`k``s``si`k```ss``ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`k```s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``s`k``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss`k```s`cii``s``s`kski``s`kskv`k``s``si`k``s``si`k```s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss``s``ss`k``s`cii``ss`ki``s`kskv`k``s``si`k``s``si`k``s`k``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`kskv`k``s``si`k``s``si`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kski`k``s``si`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kski`k``s``si`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kski`k``s``si`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kski`k``s``si`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kskiv`k``s``si`k``s``si`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kskiv`k``s``si`k``s``si`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kski`k``s``si`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kski`k``s``si`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kskiv`k``s``si`k``s``si`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kski`k``s``si`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kski`k``s``si`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`kskv`k``s``si`k``s``si`k``s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k```si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk`k``s``si`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k```ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk`k``s``si`k``s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski`k``s``si`k``s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```s``s`ksk``s`k```sss``s`ksk`ci``s``s`kski`k``s``si`k``s`k```ss``ss`ki``s`ksk```s`cii``s``s`kski`k``s``si`k``s``s`ksk```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kskiv`k``s``si`k``s``si`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k``s`k``ci``s``s`kski````ss`ss``ss`ki``s`ksk`k``s``si`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``s``ss`k``s`cii``ss`ki``s`kskv`k``s``si`k``s``si`k```si``si``s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`ksk`k``s``si`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk`k``s``si`k```s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`ksk`k``s``si`k```si``s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`ksk`k``s``si`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k```s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kski`k``s``si`k``s`k``s``s`kski``ci```ss``ss`ki``s`ksk`k``s``si`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k```s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k``s`k``s``s`kski```ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k````s``ss`ki``s``s`k`ci``ss``ss`kis``s`kski`k``s``si`k```si``s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`kskv`k``s``si`k``s``si`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k``s`k``s``s`kski``ci```ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s`k``s``s`kski``ci```ss``ss`ki``s`kskv`k``s``si`k``s``si`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k``s`k```ss``ss`ki``s`ksk````sss``s`ksk``ci``s``s`kski`k``s``si`k```si``s``si``s`k``ss``s`k`si``ss`k`cik``si`ki`s``s`ksk`k``s``si`k``s`k``s``s`kski```ss``ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`k````s``ss`ki``s``ss``ss``s`k`ci``ss``ss`kis``s`kski`k``s``si`k````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kskiv`k``s``si`k``s``si`k``s`k``s``s`kski```ss``ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kski`k``s``si`k````s``ss`ki``s``ss``s`k`ci``ss``ss`kis``s`kskiv`k``s``si`k``s``si`k```si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k``s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k``s`k```ss``ss`ki``s`ksk````sss``s`ksk``ci``s``s`kskiv`k``s``si`k``s``si`k````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kski`k``s``si`k```s`s``s`ksk`ci``s``s`kski`k``s``si`k```s``s``ss`ki``s``s`k`ci``ss``ss`kis```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`k```si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k``s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k```s`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k```si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kskiv`k``s``si`k``s``si`k```si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k```si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k```si``s`s`ci``si`ki`s``s`ksk`k``s``si`k```si``si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k``s`k```ss``ss`ki``s`ksk````sss``s`ksk``ci``s``s`kski`k``s``si`k```s`s`ci``si`ki`s``s`ksk`k``s``si`k```ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k```si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kskiv`k``s``si`k``s``si`k```si``si``si``si``si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k```si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k```ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k```si``si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k```si``si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k````s```ss`ss``ss`kis``s`ksk```s`s``s`ksk`ci``s``s`kski`k``s``si`k```s``si``s`ci`k`s``s`ksk``s`s``s`ksk`ci``s``s`kski`k``s``si`k```si``si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k```s``s```ss`ss``ss`kis``s`k``si``s``ss`k`ci``si`kis``s`ksk`k``s``si`k```ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k```si``si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k```si``si``si``si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k```s``si``s`ci`k`s``s`ksk``s`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k```s``s`ksk``s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k```s``s```ss`ss``ss`kis``s`k``si``s``ss`k`ci``si`kis``s`kskv`k``s``si`k``s``si`k``s`k```ss``ss`ki``s`ksk``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k```ss``s``ss`k``s``s`ci`k```s```ss`ss``ss`kis``s`kski``ss`ki``s`ksk`k``s``si`k``s`k```ss``ss`ki``s`ksk```si``s`k`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k```s``s`ksk``s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kskiv`k``s``si`k``s``si`k````s``ss``ss`ki``s``ss`k```si``s`k`s``s`ksk`ci``s``s`kskis``s`kski`k``s``si`k```s``s`ksk``s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kskiv`k``s``si`k``s``si`k````ss``sss``s`ksk``ci``s``s`kski`k``s``si`k```s``s`ksk``s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kski`k``s``si`k``s`k```ss``ss`ki``s`ksk``s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k```si``si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k````s``ss``ss`ki``s``ss`k```si``s`k`s``s`ksk`ci``s``s`kskis``s`kskiv`k``s``si`k``s``si`k```si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k```si``s`s`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k```si``si``si``si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k```s`s`ci``si`ki`s``s`ksk`k``s``si`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k```s`s`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k```si``si``si``si``si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k```si``si``si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k```ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k```si``si``si``s`s`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k```si``s`s`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k```si``si``si``si``si``si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k```si``si``si``s`s`ci``si`ki`s``s`ksk`k``s``si`k```si``si``si``si``si``s``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k```s``s``s`s`ci``si`kii``s``si`k`ci``si`ki`s``s`ksk`k``s``si`k```si``si``si``si``si``si``s`s`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k```s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k```si``si``si``si``si``si``si``s`s`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k```ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k``s`k``s``s`kski``ci```ss``ss`ki``s`ksk`k``s``si`k```s``s``s`s`ci``si`kii``s``si`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k```s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`kskv`k``s``si`k``s``si`k```si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k```ss``ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k```s``si``s`ci`k`s``s`ksk``s`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k``s`k``s``s`ksk``ci``s``s`kski```ss``ss``ss`k```s`cii``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk`k``s``si`k``s`k```ss``ss`ki``s`ksk```s``s`ksk``s`cii``s``s`kski`k``s``si`k```s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`ksk`k``s``si`k```ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`kskv`k``s``si`k``s``si`k``s`k``s``s`ksk``ci``s``s`kski```ss``ss``ss`k```s`cii``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`kskv`k``s``si`k``s``si`k```ss``ss``ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`kskv`k``s``si`k``s``si`k```ss``ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`kskv`k``s``si`k``s``si`k```si``si``s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`ksk`k``s``si`k```ss``ss``ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`kskv`k``s``si`k``s``si`k```si``si``s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k````ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k```si``s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`ksk`k``s``si`k```s```s`cii``s``s`kski``s`s`ci``si`ki`s``s`ksk`k``s``si`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kskiv`k``s``si`k``s``si`k```ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k```ss```ss``s`k`ss``ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k````ss``s`k`ss``ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k```si``si``si``si``si``s``ss`k`ci``si`ki`s``s`ksk`k``s``si`k```ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k````ss``s`k`ss``ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k```ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k```ss``ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k```si``si``si``s`s`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k```ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k```s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k```ss``ss``ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`k```s``s`ksk``s`cii``s``s`kskiv`d`k````s``s`kski``s`k`s``si`k``s``si`k```ss``ss``ss``s``sss`k``ci``s``s`kski``s`kskvk``s``si`k``s``si`k```ss``ss``s``sss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k```ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`k```ss``ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`k```ss``ss``s``ss`k``s`cii``ss`ki``s`kskv`k``s``si`k``s``si`k```ss``ss``s``sss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`k``ci```ss``ss`ki``s`kskv`k``s``si`k``s``si`k```s``ss``ss`ki``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k``s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k``s`k```ss``ss``ss`k``ci``s``s`kski``s`ksk``s``s`ksk```s`cii``s``s`kskiv`k``s``si`k``s``si`k```s``ss``ss`ki``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k``s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k```s``s`ci`k```s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s``s`kskiv`k``s``si`k``s``si`k```s``ss``ss`ki``ss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k``s`k```ss``ss``ss`k``ci``s``s`kski``s`ksk``s``s`ksk```s`cii``s``s`kskiv`k``s``si`k``s``si`k```ss``ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k``s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`k``s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k```s``ss`ki``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k```ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k``s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k```s``ss`ki``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k```ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```s``ss``ss`ki``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`kskv`k``s``si`k``s``si`k```ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`kskv`k``s``si`k``s``si`k```ss``s``ss`ki``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k``s`k``ci``s``s`kski```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk`k``s``si`k```s``ss``ss`ki``ss`k``ci``s``s`kski``s`kskv`k``s``si`k``s``si`k```s``si``ss`k`ci``si`ki`s``s`kskv`k``s``si`k``s``si`k```ss``ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`kskv`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivkv`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`k`ki`k``s``s``s``s``s``si`k`ki`k`ki`k`ki`k`ki`kk`kk`k`kk`d```s``s`ks``s`kk``s`ks``s`k`sik`kk`ki`k`ki`k``s``si`k``s`k``si`k`k``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`kk``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`kskv`k`ki`k``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ksk```s`cii``s``s`kskik``s``s`ks``s`kk``s`ks``s`kk``s`ks``s`kk``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k``i``s`k`sik`kiv`k`k`k`d`.r`.a`.w`.d`. `.e`.l````s.l.i`. `.g`.n`.i`.n`.e```s.e.a`.r`.h```s.a```s.i.s```s.r```s.T.h.e. .t.f``s`kk``s``s`ks``s`k`s`k`d`.e`.r`.a```s.r```s.T.h.e. ``s``s`ks``s``s`ks``s``s`ksk`k`k``si`k`ki`k`k``s``si`ki`k``s``si`ki`k``s``si`k.2`k``s``si`k.3`k``s``si`k.4`k``s``si`k.5v`k`kk`k`k`d``.v`.r`.a`.w`.d`. ```s.t`.t`.i```s``.i```s.t`.a```s`.t`. .h.r.e.n.g. .l.e.s`k`ki`k`k`d`.!`.u`.o`.y``.h`.t`.i`.w```s.o.m`.o`.r```s.h.e`.t```s`. .i.n. r`k`ki`k``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`kskv`k`ki`k``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ksk```s`cii``s``s`kskik``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k``i``s`k`sik`kiv`k`k`k`d`.w`.o`.r`.h`.t``.s`.i```s.f.e`.i`.n`.k```s.t.y`.s`.a`.n```s.r.p`.a`.h`.s```s`.O.n.e. .n``s`kk``s``s`ks``s`k`s`k. ``s``s`ks``s``s`ks``s``s`ksk`k`k``si`k`ki`k`k``s``si`ki`k``s``si`ki`k``s``si`k.2`k``s``si`k.3`k``s``si`k.4`k``s``si`k.5v`k`kk`k`k`d`.e`.v`.i`.n`.k``.w`.o`.r`.h`.t```s.e.m`.h`.t```s`. .o.f. .s`k`ki`k`k`d`.-`.-`.-```s.o.u`.y```s`. .a.t. `k`ki``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`kskv`k`ki``s`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k``i``s`k`sik`kiv`k`k`k`d`.!`.s`.e````s`. `.t`.i.m.i.sr`k`k`k`d`.!`.u`.o`.y``.t`.i`.h```s.e.m`.h`.t```s.o.f```s`.o`.n.n.e. r`k`ki`k``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ksk```s`cii``s``s`kskik``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s`k`s`k`s`k`ki``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k``i``s`k`sik`kiv``s`kk``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k``i``s`k`sik`kiv`k`k`k`d`.!`.u`.o`.y``.s`.t`.e`.g```s.i.t. r`k`k`k`d`.!`.u`.o`.y``.s`.t`.e`.g```s.e.m`.h`.t```s.o.f```s`.o.n.e. r`k`ki`k``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k``si`k`ki`k`k``s``si`ki`k``s``si`ki`k``s``si`k.2`k``s``si`k.3`k``s``si`k.4`k``s``si`k.5v`k`kk`k`k`d`.!`.u`.o`.y``.t`.e`.g```s.e.m`.h`.t```s`. .o.f. r`k`k`ki`k`k`ki`k`k``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```si``si``s``ss`k`ci``si`ki`s``s`ksk``s``s`ksk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`s``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``si`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k`ki`k`k``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``si`k``si`ki`d`k````s``s`kski``s`k`sik`kiv`k`k```ss``ss`ki``s`kskk`ki`k`k`k`ki`k`k`k`ki``s`d`k```s``s`ksk``ci``s``s`kski``si`k``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`k`ki``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`kk``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`kk`k`k``si`ki`k``s``s``s``s``si`k`ki`kk`kk`k``s`k`sik`k`kiv``s`k`s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`kk``s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`si``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`k`kk`k`k`k`kk`k`k`k`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`d```s``s`ksk``ci``s``s`kski``si`k`ki`k`k`k``s``s`ksk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`s``s``si`ki`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k`k``s`k`s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`k```ss``ss`ki``s`ksk``s``s`ks``s`kk``s`ks``s`k`s`d`k```sii``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`ki`k`kk`k`k`ki`k`k`k`ki`k`ki``s`k`s`d`k```s``s`kski``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`k`ki`k`k``s`k`sikv`kk`k`ki`k`k``s`k`sik`k`k`ki`k``s``si`k``s`k`sik`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s`kkk`k`k`k`k``s`k`s`d`k````ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k`ki``s`k`s`k`s`k`s`kk``s`k`s`k`s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`kk``s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`si``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`kk`k`k`kk`k`k`k`kk`k`k`k`k`k`ki``s`kk``s`kk``s`kk``s`k`s`kk``s`k`s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk``s``s`ks``s`kk``s`ks``s``s`ksk`k`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk`k``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`kk``s`k`si``s`kk``s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`si``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk`k`kk`kk``s`k`s`k`s`k`s`k`s`kk``s`k`s`k`s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`kk``s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`si``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`kk`k`kk`k`k`kk`k`k`k`kk`k`k`k`k`k`ki``s`kk``s`kk``s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`k`ki`k``s``s``s``s``s``si`k`ki`k`ki`k`ki`k`ki`kk`kk`k`kk``s`k`s``s``s``s``si`ki`k`ki`k`ki`k`kik`k``s``si`k``s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``si`k`ki`kk`kk`k``si`ki`d`k````s`k``ci``s``s`kski``ci```ss``ss`ki``s`ksk``s`k`sik`kiv`k`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s`k``s``s`kski```ss``s`k`ci``ss``ss`ki``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`ki`k`ki`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k``s``s`kski```ss``ss``s`k`ci``ss``ss`ki``s`kskk``s``s`ks``s``s`ks``s`k`s`k``sii``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`kc``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`sik`k`k`ki`k`d`k`````si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`sikv`ki``s`k`s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`kc``s`k`s`k`ki``ssv``s`k`s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k``````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kski``s`k`sik`kiv``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k`````s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk``s`k`sik`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k`````ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk``s`k`sik`kiv`k`ki``s`k`s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`k`ki``s`kk``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`kk`k`k`ki`k`k`ki``s`kk``s`kk``s`k`s`k``s`k`d`..`.m````s``.e`.h`.t`r`.o`.t`.n`.i```s.e.s`.h`.s`.i`.n`.a`.v```s.n.d`.a```s.r`.u`.s`.a```s.t.r`. `.r`.u`.o`.y`. `.s```s.c.h`.t`.a`.n`.s`. ```s```s.!."`.e`.z`.a`.m```s.h.e`.t```s.i.n```s```s. .d`.t`.s```s.c.h`r```s`.h`.t`.i`.w```s.a.y`.w`.a```s.i.t```s.d.e`.i`.h```s.n.d`.a```s.t.y`.o`.o`.b```s.i.s`.h`.t``.l`c``.e`.k`.a`.t```s.s.t`.u`.j```.I`."`. `.,`.s`.e```s`.o``.c`. `.e```s`.,`.r`.a`.h`. `.,`.r`.a`.H``. `c``.t`.a`.r`.i`.p`. `.d```s.r.d`.a```s`.a```s.e.s`.c`.n`.u`.o`.p```s.o.u`.y```s.n.d`.i`.h`.e`.b```s.w.s`.o`.d`.a`.h`.s```s.h.e`.t```s.o.m`.r`.f```s`.O.u.t. .b.e.!."r.h.r.t.l`c.'. .a. .m.e.p. .H.e. .g.l.or`d````sii``s``s`ks``s`k`s`ks``s`k`s`k`s`kc``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`sikv`k`d`k`````si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`sik`ki`ki`k``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k```ss``ss`ki``s`ksk````sss``s`ksk``ci``s``s`kskik``s`k`s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k``````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kski``s`k`sik`kiv`k``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k`````s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk``s`k`sik`kiv`k`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k`````ss``s``s```ss`ss``ss`kis``s`k``s`s`ci``si`kis``s`ksk``s`k`sik`kiv`k`ki``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ksk`k`k``si`k`ki`k``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`kk`k`k`kkv`k`k`ki``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ksk`k`k``si`k`ki`k``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`kk`k`k`k``si`ki`k``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`k`ki``s`k`s`kk``s`k`s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ksk`k`k``si`k`ki`k``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`kk`k`k`ki`k`k`ki`k`k`ki`k`ki``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k``s`k`s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk``s`kk``s``s`ks``s``s`ksk`k`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk`k`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k``s`k``ci``s``s`kski``ci```ss``ss`ki``s`kskk``s`k`s`k`s`k`si``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`kkv```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`kskk``s`k`s`k`s`k`s`kk``s`k`s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kkk`k`k`ki``s`k`s`kk``s`k`s`kk``s``s`ks``s`kk``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`k`ki``s`kk``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`kk`k`k`k`ki`k`k`k`k`ki``s`kk``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`k`ki`k`k``si`ki``s``s`ks``s``s`ks``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`kk`kk`k`ki`k`k``s`k`sik`k`k`kiv`k``s`k`s`k``s`kc``s`k`s`k`ki``ssvk``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kkv`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s``s`kski``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k`kiv``s`kk``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k```s``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki``s`kk``s`kk``s`k`s`k``s`k`d`..`.m````s``.e`.h`.t```s.t.o`.n`.i```s.e.s`.h`.s`.i`.n`.a`.v```s.h.e```s`.a`.h```s.h. ```s.W.i`r`."`.!```s`.h`.c``.e`.m```s.d.e`.i`.h```s.t.o```s.z.e`.a`.m```s.h.e`.t```s.t.o```. ```s`.s```s. .m```s.h.i`. `.t`.s```s. .b`.d`.'`.I`. `. `.!`.d``.t`c`.p`.s`. `.n````sr.b```s.'.v`.I`."`. `.,`.s```s.r.i`.c`. ```s. .h`."`.!`.s`.r```s.m.b`.i`.t`. ```s. .m`.r```s.i.v`.h`.S`."`. `. `..`.t`.s```s.c.h`. ```s`.a`.l``.a```s.n.g`.i`.y`.r`.r`.a`.c```s.i.s```s.H`r`..```s.a.t`.r`.i`.p`. `.d```s.r.d`.a```s`.a```.r`.c`.a`. ``.l`c`.f``.p`.m`.a`.l```s.u.r`.o`.y```s.o.f```s.a.m`.e`.b```s.h.e`.t```s.m.,`.e`.h`.t```s.r.d`.a`.w`.o`.t```s.r.n`.u`.t`r`.u`.o`.y```s````s.u..`.o`.y```s.n.d`.i`.h`.e`.b``.s`c`.n`.k`.r`.a`.d``.e`.h`.t```s.o.m`.r`.f```s.e.s`.s`.i`.o`.n```s.n.g`.i`.l`.t`.s`.u`.r```s.n.t`.i`.a`.f```s.r.e`.a```s.r```s.T.h.e. .e. .A.s. .a.s`c.o. .b.e. .r.g.e.o.e.l.f`c.o. .e.s.t.,. .g.l.or`d```s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k```ss``ss`ki``s`ksk````sss``s`ksk``ci``s``s`kskik``s`kk``s`kk``s`kk``s`k`si``s`kk``s``s`ks``s`k`s`k``s``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ksk`k``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`k`ki`kk`kk`kk`k`kk`k``si`ki``s``s``s``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`k`ki`kk`kk`kk`k``s`kkk`k``s`k`sik`k`kiv`k`k`d`..`.u`.o`.y``.d`.n`.i`.h`.e`.b``.s`c`.n`.k`.r`.a`.d``.e`.h`.t```s.o.m`.r`.f```s.e.s`.s`.i`.o`.n```s.n.g`.i`.l`.t`.s`.u`.r```s.n.t`.i`.a`.f```s.r.e`.a```s.r```s.T.h.e. .e. r`k`ki`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k``s``s`kski```ss``ss``s`k`ci``ss``ss`ki``s`ksk``s`k`s`d`k`````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`sikv``s``s`ks``s``s`ks``s`k`s`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`ki``s`kk`s`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k`ki`k`k``s`k`sik`k`k`ki``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`d````ss``ss`k``ci``s``s`kski``s`ksk``si`k`kiv`k`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`kskv`ki``si``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`kk``s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k`s``si`kk``s`kk``s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`si``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk`k`kk`k``si`k`ki`kk`k``s``si`k``s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`d`k````si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk``si`k`ki``s``si`kk`k`ki`kkv`ki``s`k`s`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k``s``s`kski```ss``ss``s`k`ci``ss``ss`ki``s`ksk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````si``s``ci``s``s`kski`ki```s```ss`ss``ss`kis``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k``s`k```ss``ss`ki``s`ksk```s`cii``s``s`kskik``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk`k`d`k````s`k``s``s`kski```ss``s`k`ci``ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k``s`k``ci``s``s`kski``ci```ss``ss`ki``s`kskk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k``s``s`kski```ss``ss``s`k`ci``ss``ss`ki``s`kskk`ki``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k``s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s``si`k``s`k``ci``s``s`kski``ci```ss``ss`ki``s`ksk`k``s`k``ci``s``s`kski``ci```ss``ss`ki``s`kskv``si`k`kik`k``s``si`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`k`kiv`k`ki``s`k`s`d`k`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`sik`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sikv``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k````s`k``s``s`kski``ci```ss``ss`ki``s`ksk``s`k`sik`kiv``s`kk``s`k`s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`k`ki`kk`k`ki`k`ki`k`ki`k`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```s`s``s`ksk`ci``s``s`kskik``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k``s``s`kski```ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`kskk`ki``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```s`s``s`ksk`ci``s``s`kskik`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`kk`k`k`ki`ki``s`kk``s`k`s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``si`kk`kk`kk`k`ki`kk`kk`k`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```s`s``s`ksk`ci``s``s`kskik``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```s``s``ss`ki``s``s`k`ci``ss``ss`kis```ss`ss``ss`ki``s`kskk`ki``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k``si`kik``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```s`s``s`ksk`ci``s``s`kskikv`k``s``si`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k`d`."`..`.e`.c`.i````s`.n`.i`.a`.m```s.g.h`.u`.o`.r`.h`.t```s``.t`.a`.i`.d``.m`c``.t`.i`.x`.e```s.r.s`.e`.r`.u`.t`.n`.e`.v`.d`.a``.l`c````s````s. `.g`.n`.i```s.l.o`.c`r`.e`.v`.a`.C`."`. `.,```s.a.y```s``.v`.a`.c`. ```s.t`. ```s.u.g`.o`.r```s. `.g`.n`.i```s`.e`.b```s.v```s. .r`.,```s.i.c`.o`.v`. `.l`.a`.r`.h`.c`.l`.u`.p```s`.A. .s.e.r.a.t.h.e.,. .s.o.n... .A. .i.e.l.y. .o.fr`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`k``ci``s``s`kski``s`ksk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``ss``s``ss`k``s`cii``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s`d`k```s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kk`k``si`ki`d`k`````ss``ss`ki``s`ksk``s`k`sik`kivk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk`k`d`k````s`k``s``s`ksk``ci``s``s`kski````ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik`ki``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k````s`k``ci``s``s`kski```ss``ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```s``s`ci`k```s``ss``ss``s`k`ci``ss``ss`kis``s`kski``s``s`kskik``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k``````s``s`k`ci``ss``ss`kis``s`ksk```s`cii``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```ss``ss``ss``ss``ss```ss``s`k`ss``ss`ss``ss`ki``s`kskk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k````s`k``s``s`kski```ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````ss``s``ss`k``s`k```sss``s`ksk`ci``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`d`k`k`````ss``ss`k``ci``s``s`kski``s`ksk```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s``si`k`kivvvk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik`k``s``si`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s`k``s``s`d`k```sii``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ksk`k`k`k`ki`k``s`k`s`k`d`..````s`.i`.f``.d`.n`.a```s.n.d`.u`.o`.r`.a```s.o.k`.o`.l```s.o.u`.y```s`.u`.c`.o`.f`.e`.r`. ```s.y```s.r. `.u`.o`.y`. `.n```s```. `c`. ```s..```s.)..`.e`.k`.o`.m`.s`r`.e`.g`.n`.a`.r`.o```s.o.f``.f`c`.p`. ````s`.s``.a```s.n.d`.a`.(```s.h.t`.g`.i`.l```s.o.f```s.s.h`.a`.l`.f```s``.d`.n```s``.a```s.i.s```s.r```s.t.h`. `.,```s.a.d`.f`r`.s```s.h.o`.c```s.e`.h`.t```s````s..."`.d`.e`.s`.o`.l`.c```s.o.w`.n```s.i.s```s.v.e`.a`.c```s.h.e`.T`."```s.s.,`.e`.n`.o`.t`.n`.i```s.c.e`.i`.o`.v```s.a`.r`.h`.c```s``.s`. ```s.T.h.e.p.u.l. .A.s. .e. .b.l.i.n.g. .m.a.l.u. ... .T.h.e.s.;. .n.d..r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k`k```s``s```ss`ss``ss`kis``s`k``si``s``ss`k`ci``si`kis``s`ksk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`k`ki`k``s`k`s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk``s`kk``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk`k`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik`k`k`ki``s``s`d`k```sii``s`k`s``s`ksk``s`kk``s`k`s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`ki`k`ki`k`ki``s`kk``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k`s`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`kskk`ki`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`k`ki`k`ki`kii``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k``````ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```ss```ss`ss``ss`ki``s`kskk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k````ci```ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```s``si``ss`k`ci``si`ki`s``s`kskk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```s``si``ss`k`ci``si`ki`s``s`kskk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```s``si``ss`k`ci``si`ki`s``s`kskk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k````s``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```s``si``ss`k`ci``si`ki`s``s`kskk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```s``si``ss`k`ci``si`ki`s``s`kskk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```s``si``ss`k`ci``si`ki`s``s`kskk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```s``si``ss`k`ci``si`ki`s``s`kskk``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`ksk``si`k`ki``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```ss``ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`kskk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k````s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k````s``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```ss``ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`kskk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k``````sss``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k``````sss``s`ksk``ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```ss``ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`kskk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```ss``ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`kskk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k````s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k````s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```ss``ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`kskk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````ss``ss`k```s`cii``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```ss``ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`kskk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``s`k`ci``ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````ss``s`k`ci``ss``ss`ki``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```ss``ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`kskk``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk`d`k`````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````ss``ss``ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```ss``ss``s``ss``ss`ki``ss`k``ci``s``s`kski``s`kskk`k``s``si`k``s``s`k`s``s``s`ks``s`k`s`kc``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s`k`s`d`k````ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`kk`k`k`ki``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k````s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kkv`k`ki``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k```s``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`ki``s`kk``s`k`s`k`d`..`.s``.i`.r``.t`c`.b``.e`.h`.t`r`.g`.n`.i`.c`.a`.l`.p`.e`.r```s.o.f```s.t.y`.r`.e`.b`.i`.l```s.h.e`.t```s.n.g`.i`.k`.a`.t```s.'`.I`. `. `..```s.d`. `.g`.n``.t`c`.g``.s`.i```s.m.p`.a`.l```s`.o`.Y.u.r. .e.i.m. .a.er``s`k`s`k``s`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`k``ci``s``s`kski``s`ksk``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`d`k`k`````s``s`kski```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski``s`k`sikvk``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s`d`k````s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`kk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k`````s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`kik``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ksk`k`k`ki`k``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`kk`k`k`ki`k`ki`k``s`kk``s``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k```s``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k`d`..`.r`.e`.w`.o`.p``.f`.o```s.u.t`.o```s.u.n`.r```s.a.s`.h```s.m.p`.a`.l```s`.o`.Y.u.r. r`k`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`k``ci``s``s`kski``s`ksk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kkk`k`d`k````s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik`k``s``s`ks``s``s`ks``s`k`s`d`k``````ss`ss``ss`ki``s`ksk``s`k`sikv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik``s`k`s`kk``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`kk`k`k`ki`ki``s`kk``s`k`s`k`d`..`.y`.a`.d``.a```s.i.t``.l`c`.c``.t`.s`.u`.j```s.'.s`.t`.e`.l```s````s`.m`.a`.l``.a```s.u.t`.o`.h`.t`.i`.w```s.v.e`.a`.c```s.h.e`.t```s.r.e`.o`.l`.p`.x`.e`r`.t`.'`.n`.a`.c```s.o.u`.y```s.n.d`.a```s.e.,`.r`.e`.h```s.u.t`.o```s.n.d`.u`.o`.r`.a```s.n.g`.i`.r`.e`.d`.n`.a`.w```s.i.n```s.n.t`.i`.o`.p```s.c.h`.u`.m```s.o.t`.n```s``.r```s.T.h.e.'.s. .p... .S.o. .a. r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss``s`k`ci``ss``ss`ki``s`kskk`k``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s`k`s`d`k````ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`kk`k`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`kk`k`kk``s``s`ks``s`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`ks``s`k`s`d`k```s``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`ki``s`kk``s``s`ks``s`k`s`k`d``.d`. `.g`.n``.t`c`.g``.s`.i```s.m.p`.a`.l```s`.o`.Y.u.r. .e.i.m``s``s`ks``s`k`s`kc``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k`kiv`ki`k`k`k`d`..`.p`.u`. `.s``.h`.t`. `.g`.n``.p`c`.r`.w`. ``.r`.a```s. `.t```s.b`r`.d`.'`.u`.o`.Y`. `. `..`.s```s.r.i``.t`c`.b``.e`.r`.a`.p`.s```s.o.f```s.u.t`.o```s.r.e`.'`.u`.o`.y```s`.a`. `.,.n.d. .a.e.s.t.a.ir``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````s``ss`ki``ss``ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kkv`k`ki`ki`k`k`k`d`..`.u`.o`.y``.h`.t`.i`.w```s.n.s`.i`.o`.c```s.m.e`.o`.s```s`.i`.r`.B````s.e..`.z`.a`.m```s.h.e`.t```s.i.n```s.n.e`.i`.h`.c`.a`.m```s.n.g`.i`.d`.n`.e`.v```sr.a`.s`.'`.e`.r`.e`.h`.t```s.a.t`.h`.t``.l`c`.c`.e`.r``.o`.t```s```s. .s`.I`. `. `..`.s```s.r.i``.t`c`.b``.h`.s`.e`.r`.f```s.m.e`.o`.s```s.n.d`.i`.f```s.a.n`.c```s`.y`r````s.l.e`.n`.u`. `.,`.p`.u`. ```s.h`.t`. `.g`.n``.p`c`.r`.w``.t`.r`.a`.t`.s```s.s.t`.e`.b```s.'.d`.u`.o`.Y```s... . .a.i.s.o.u. .a.e.m. .a. .n.g. r`k``si`k`k`d`..`.s``.i`.r``.t`c`.b``.e`.s`.o`.h`.t```s.o.r`.f```s.c.k`.a`.b```s.g.o```s.s.t`.e`.b```s.'.d`.u`.o`.Y```s... . .a.erv``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`k``ci``s``s`kski``s`ksk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk`k``s`k`si``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`k``ci``s``s`kski``s`kskkv``s``s`ksk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s``s`kski``si`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k``i``s`k`sik`kiv`k`k`k``si`ki`k`k`ki`k`ki`kk``s``s``s``s``s``si`k`ki`kk`k`ki`k`ki`kk`kk`k``s``si`k``s`k``s`k`d`.!`.y`.d`.o`.b``.r`.u`.o`.y```s.i.n```s.n.e`.o`.b```s.r.y`.e`.v`.e```s.k.e`.o`.r`.b```s.n.d`.a```s`.p``.a```s.t.o`.n`.i``.l`c`.f`. `.u`.o`.Y.e. .i.t. r`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```si``si``s``ss`k`ci``si`ki`s``s`ksk``si``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`s``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``si`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k``s``si`k``s`k``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`ki``s`kk``s`k`s`k`d`..`.y`.a`.d``.a```s.i.t``.l`c`.c``.t`.s`.u`.j```s.'.s`.t`.e`.l```s.y.,`.a`.w`.y`.n`.a```s``.t`. `.g`.n```s`.l`.c`. ```sr.t`.e`.s```s.c.l`. ```s. ```s``. `.w`.o`.h`. `.s`.a`. `.g`.n```. `.,`.l`.l```s```s.d..`.a`.e`.d```s.r.e`.'`.u`.o`.y```s.g.h`.u`.o`.h`.t```s.a.s```s.k.s`.o`.o`.l```s.I.t. .W.e`c.s.i.t.'.s.o.s.i.m.e. .a. r``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```si``si``si``si``s``ss`k`ci``si`ki`s``s`kskk``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s`k`s`kc``s`kk``s`k`s`d`k`ci``s`k`s`kc``s``s`ks``s``s`ks``s`kk``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`k``si`k`ki`k`k``s``siv`k``s``si`k`d`.u`.o`.y``.e`.t`.a`.n`.r`.a`.c`.n`.i`.e`.r```s.t.o```s.r.y`.t```s.t.o`r`.e`.m```s.n.t`.a`.w```s`.y`. ```s```s.e..`.r`.o`.f`.e`.b```s.i.s`.h`.t```s.n.e`.o`.d```s```s``. ```s.v```s`.e`.v`.'`.I```s.u.t`.b```s.t.,`.u`.o```s.o.u`.y```s.l.p`.e`.h`r`.o`.t```s.l.e`.b`.a```s.b.e```s.h.t`.g`.i`.m```s```s`.e````s.k.i`. `.f```s.s`.r`.u`.o`.y`. `.n``.t`c`.g``.e`.v`.a`.h```s.t.o```s.e.m`.e`.s```s.o.u`.y```s.r.,`.a`.e`.d```s.O.h. .o.e.l.d... .I. .n.e.r.e.a.l.y. .D.o.u. .?`k``s``si`k`d`.n`.i``.g```s.u`.o`.y```s`.i`.t`.a```s.a`.c`.n`.i`.e```s.y`.r`.t```s.t.o```s.m.e```s.n.t`.a`.w```s`.y`. ```s```s`.u`. `.s`.i`.h`.t`. ``.e`c`r`.n`.a`.c``.I```s.n.g`.o`.l```s.o.w`.h```s.o.w`.n`.k```s.'.t`.n`.o`.d```s```s.n.!`.i`.a`.g`.a```s.i.t```s.n.e`.o`.d```s.v.e`.'`.u`.o`.y```s.f.,`.a`.o```s`.m``.l`.c`. ```s.Y.o.u.s.y. .I. .k.p... .D.o.u. .r.n.g. .a.?`k``s``si`k`d`.u`.o`.y``.o`.d```s.e.,`.k`.o`.m`.s```s.g.e`.n`.a`.r`.o```s.n.y`.a```s.u.t`.o`.h`.t`.i`.w```s.o`.i`.t`.a```s.a.r`.c```s.e.i`.r`. `.t```s.c```s`.a```s.d.o```s.t.o```s.m`r`.t`.c```s.x.p```s`.'`.n``.d`. `.u```s```s.e.!`.k`.o`.m`.s```s.g.e`.n`.a`.r`.o```s.o.f```s.u.t`.o```s`.I````s.t.!`.i```s.n.e`.o`.d```s.l.y`.l`.a`.e`.r```s.v.e`.'`.u`.o`.y```s`.N.o.w. .'.m. .Y.o.t. .e. .d.e.n. .?v`k`kk`k`k`d`.*`.*`r. `k`k@`k`ki``s``s`ks``s`k`s`ks``s`k`s`k`s`k`ki``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s`k`s`d`c``s``s`d`?yi`ki``s`d`?Yi`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`k``si`k`ki`k`k``s``siv`k``s``si`k`d``..`c`.n`.i`.f``.d`.n`.a```s.k.e`.o`.m`.s```s.h.e`.t```s.o.m`.r`.f```s`.r`.e`.m`.e`. `.u`.o`.y`r`.,```s.i.n`.p`.s`.a```s.d. `.n`.a`. ```s.i.n`.h```s`.C`. `. `..`.e`.k```s.s.m`. `.e`.g`.n`.a`.r```s.f. ```s.d. `.u```s``.a```s.i.n```s.e.d`.f`.l`.u`.g`.n`.e```s.r.e`.a```s.o.u`.Y`r`.-`.-`.-``.!`c````s`.-`.-`.-```````````s`````s``.s`.e`.o`.g```s.n.g`.i`.h`.t`.e`.m`.o`.s```s.i.f```s.m.e```s.m.e`.a`.l`.b```s.'`.n`.o`.d`. ```s````s.t..`.h`.g`.i`.r``.l`c.A. .B.u.t. .w.r..`c....r. `c. . `c. . `c. . `c. . .P.O.F. .c.l.o.u.g.e. .d..`k``s``si`k`d`.e`.k`.o`.m`.s``.e`.g`.n`.a`.r`.o```s.o.f```s.u.d`.o`.l`.c```s.s`.n```s. .d`.a`. `.n`.i`. `.s`.r`.a``.p`c`.s``.d`. `.g`.n```s`.y`.r`.e`.v`.E`r`.<`.!`.F````s``````s`.i`.k`. `.n`.o`.i```s````s.s.u`.e```s.y`.m```s`.p``.I```s.i.d`.d```s.r.e`.e`.h`.w```s.o.w`.n```s`.a`.k`.O.y.,. .u.t. .r.e.c.t.?..`c... .>.P.O.t.h.i.a.e. ..`k``s``si`k`d`.g`.n`.i`.v`.a`.e`.l`. `.m`.'`.I````s.f.!`.l`.e`.s`.r`.u`.o`.y```s.i.t```s.d.o```s.t.,`.r`.a`.m`.s```s.s.o```s.r.e`.'`.u`.o`.y```s.i.f```s`.a`.k`.O.y.,. .!v`k`kk`k`kr`kk`k`k`ki`k``s``s`ks``s`k`s`k`ki``s``s`ks``s`k`s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`k`d`.K`.O..`krkv`k``s``s`k`ki``siv`d`k``..`.o`.N``.r`.o```s`.Y`. `.r```s.s.w`.n`.a`. ```s.a.s```s`. .P.l.e.s. ri`k`k`d``ki``ci`c```c``s`k`ki``s`d`? +iv@i``s`k`s`d`k`````ss``ss`ki``s`ksk``s`k`sikv``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`k``s`k`sik`k`k`ki`ki``s`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```si``si``si``si``s``ss`k`ci``si`ki`s``s`kskk``s`k`si``s`kk``s`k`s`k``s`k``s`k``s`k``s`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ksk```s`cii``s``s`kski``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk``si`k`ki``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k```ss``ss`ki``s`kskk``s`d```sii``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``si`k`k`ki``s`kkk``s`k`s`k`s``s`ksk``s`k`s`kk``s`k`s`kk``s``s`ks``s`kk``s`ks``s`kk``s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`kskk`ki`kk`k``s``s`ks``s`kk``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk``s`k`s``s`ks``s``s`ksk`k`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``s`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`k`s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k`ki`kk`k`k`ki``s``s`d`k```sii``s`k`s``s`ksk``s`kk``s`k`s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`ki`k`ki`k`ki``s`kk``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k`s`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`kskk`ki`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`k`ki`k`ki`ki``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````si``s`k`s``s`ksk`ci``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk`d`k`````s``si``s`ci`k`s``s`ksk``s`cii``s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s``s`kski``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`ki`k`ki``s`kk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk``s``s`ks``s`k`s`k``s``s`ksk`k``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkkk`k`d`k````s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`kik`k`d`k````s``s`kski``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s`kkk`k`kiv``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k``s``si`k``s``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`kk`k`k`kkv`k`k`ki`k`ki``s`kk``s`k`s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```s`cii``s``s`kski``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``s`k`s`k`s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s``s``s``s``s``s``s``s``s``si`kk`kk`kk`kk`k`ki`kk`kk`k``si`k`ki`k``s``si`k``ci``s``s`kski`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k```s``s`ksk`ci``s``s`kski`k``s``si`k``s`k```ss``ss`ki``s`ksk```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k```si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k````sss``s`ksk``ci``s``s`kskiv`kk`k``s`k`sik`k`ki``s``s``s`d`k```sii``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`ki`k`kk`k`k`ki`k`k`k`ki`k`ki``s``s``s``s``s``s``si`kk`kk`kk`kk`k`ki`kk`k`ki`k``s`k`sikv``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`kk`k`k``si`k`ki`k`k``s``si`k``s``s``s``s``s`d`k````ss``ss`ki``s`ksk``si`k`ki``s``s``si`k`ki`k`ki`kk`kkv`ki``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`d`k`i``si`k`ki``s``si`kk`k`ki`kk`k``s``si`k``s``s``s``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`d`k````ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``si`kk`k`ki`kk``s``s``s``s``s``s``s``s``s``s``s``si`k`ki`k`ki`k`ki`kk`k`ki`kk`k`ki`kk`k`ki`k``si`ki`d`k`````ss```ss`ss``ss`ki``s`ksk``s`k`sik`kiv``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k````ss``ss`k``ci``s``s`kski``s`ksk``si`k`ki``s``si`kk`k`ki`kk`ki`ki`k``s``si`k``s``s``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`d`k````ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``si`kk`k`ki`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``s``si`ki`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`ki``s``s`d`k````ss```ss`ss``ss`ki``s`ksk``si`k`ki``s``si`kk`k`ki`kk`k``s``si`k``s``s`k``s`kc``s`k`s`k`ki``ssv``s``s`k``sii``s`k`s`k`si``s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`kk`k`k``s`k`sik`k`k`kiv`k`k`k`ki``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k``s`k`sik`k`k`kiv`k`k`k`ki``s`k`s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k`ki`k`k``s`k`sik`k`k`kiv`k`k`k`ki`k``s`kk``s`k`s`kk``s``s`ks``s`kk``s`ks``s``s`kskk`kk`k`k`k`k`ki`k`k`k`k`ki`k`k`k`ki``s``si`kk`k`ki``s``s``s``s`d`k```sii``s`k`s``s`ksk``s`kk``s`k`s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`ki`k`ki`k`ki``s`kk``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k`s`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`kskk`ki`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s``si`kk`k`ki`k`ki`ki`k`ki`k`k`ki`k``s``si`k``s``s``s``s``s`d`k```s`k```ss``ss`ki``s`ksk````sss``s`ksk``ci``s``s`kski``si`k`ki``s``s``si`k`ki`k`ki`kk`kk`ki`ki``s`k``s`kc``s`k`s`k`ki``ssv``s``s``s``s`d`k`````s``ss``ss`ki```ss``s``s`ks`ss`ks`k``ci``s``s`kski``s`kski``si`k`ki``s``s``si`k`ki`k`ki`kk`kk`ki`ki`k``s``si`k`kiv`k`kkk``s`kk``s`k`s`k``s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```s`cii``s``s`kski``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk``s`k`s`k``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`kc``s`k`s`d`k`ci``s`k`s`kc``s``s`ks``s``s`ks``s`kk``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`kk`k`k``si`k`ki`k`k``s``si`k`d`.e`.v`.a`.c``.e`.h`.t```s.t.o`.n`.i```s.e.t`.g```s.t.o```s.n.g`.i`.y`.r`.t```s.o.u`.y```s`.A.r.e. .?`k``s``si`k`d`.d`.r`.i`.b``.e`.h`.t```s.c.h`.t`.a`.c```s.t.o```s.n.g`.i`.y`.r`.t```s.o.u`.y```s`.A.r.e. .?`k``s``si`k`d``.k`.a`.n`.s`. ```s`. `.h```s`. ```s.h`.e`.m```s`.l`.a`.e`.d```s.t.o```s.n.g`.i`.y`.r`.t```s.o.u`.y```s`.A.r.e. .s.o.w.i.t.h.e.?`k``s``si`k`d`.e`.z`.a`.m``.e`.h`.t```s.o.f```s.u.t`.o```s.n.g`.i`.t`.t`.e`.g```s.l.p`.e`.h```s.e.d`.e`.n```s.o.u`.y```s.D.o. .?`k``s``si`k`d`.m````s`.r`.e`.v`.o`.l`.P```s.h.e`.t```s.n.d`.o`.y`.e`.b```s.r.e`.o`.l`.p`.x`.e```s.t.o```s.n.g`.i`.y`.r`.t```s.o.u`.y```s`.A.r.e. .R.o.?`k``s``si`k`d``.r```s`.f`.o```s.u.t`.o```s.n.g`.i`.t`.t`.e`.g```s.l.p`.e`.h```s.e.d`.e`.n```s.o.u`.y```s.D.o. .h.e.?v`k`kk`k`k`d`.*`.*`r. `k`k@`k`ki`k``s``s`ks``s`k`s`k`ki``s``s`ks``s`k`s``s``s`d`c``s``s`d`?yi`ki``s`d`?Yi`ki`k`d`.t`.n`.i`.h``.a```s.o.u`.y```s.v.e`.i`.g```s.t.o```s.e.d`.r`.a`.p`.e`.r`.p```s.a.m```s. .I. .,`krk`k`ki``s``s`ks``s`k`s`k`ki``s``s`ks``s`k`s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`k`d`.K`.O..`krkv`k``s``s`k`ki``siv`d`k``..`.o`.N``.r`.o```s`.Y`. `.r```s.s.w`.n`.a`. ```s.a.s```s`. .P.l.e.s. ri`k`k`d``ki``ci`c```c``s`k`ki``s`d`? +iv@i``s``s`ks``s``s`ks``s``s`ks``s`k`s`k`d`.u`.o`.y```s.s.t`.o`.c``.l`c`.w`. ``.i`. ```s`. .b.u.t.i. ``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`kk`k`k``si`k`ki`k`k``s``si`k.2`k``s``si`k.2`k``s``si`k.2`k``s``si`k.4`k``s``si`k.5`k``s``si`k.3v`k`kk`k`k`d```s`.t`.n`.i`.o`.p`. .s... `k`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s`kc``s`kk``s`k`s`d`k`ci``s`k`s`kc``s``s`ks``s`k`s`k`s`d`k``ki````d`.t`.n`.i`.h``.e`.h`.t```s.n.t`.a`.w```s.o.u`.y```s.D.o. .?`d`.*`.*`r. @i``s``s`ks``s`k`s`ks``s`k`s`k`s`k`ki``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s`k`s`d`c``s``s`d`?yi`ki``s`d`?Yi`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`kk`k`k``si`k`ki`k`k``s``si`k`d`.s`.y`.e`.k``.e`.h`.t```s.o.r`.f```s.r```s.w.h```s.l.s```s.g. `.n`.i`.k`.o`.o`.l`r`.d`.n``.m`c`.c`.e`.r``.d`.l`.u`.o`.w```s```s.t..`.h`.g`.i`.s```s.i.n```s.y.s`.e`.k```s.n.o```s.r.e`.a```s.r```s.t.h`. `.d`.n`.a`. `.,`.y```s`.a```s.u`.o`.h```s.w.i`. `.r`.e```s.e.n`r```s.n`.n`.a`.c`. `.u```s. .Y`. `..`.k`.c```s. ``.e`c`.s`. ``.e`.n`.e```s`.h``.a```s.a.s`.h```s.n.d`.a```s.i.d`.l`.o`.s```s.r.y`.e`.v```s.i.s```s.t`.a`.r`.g`. ```s.T.h.e. .a.r.d.t.l.o.t. .k.e. .I. .o.e. ..`k``s``si`k`d``.e`.t`.a`.l`. `.y```s. ```s.g`.i`.m`. `.u`.o`.y`. `.s`.p`.a```s`.P````s.y..`.r`.t```s.o.u`.y```s.a.t`.h`.w```s.e.r`.t`.t`.a`.m```s.n.o```s.i.t```s`.t`.a```s.tr`.o`.n`.n`.a```s.u`.o`.y```s.n.d`.a```s.o.w`.n```s.s.t`.u`.j```s.r.d`.i`.b```s.h.e`.t```s.n.g`.i`.n`.e`.t`.h`.g`.i`.r`.f```s.b.e```s.t.o```s````s. .s`.g`.n`.i`.h`.t```s`.S.o.m.e.m.s. .c.h. .e.r.h.t.r..`k``s``si`k`d`.w`.o`.n`. `.t`.h`.g`.i``. `.s`.e`.c```s.o.u`.s`.e```s.yr```s```s.c```s`.e`.h`.t```s.v.e`.a`.h```s.'.t`.n`.o`.d```s.o.u`.y```s.u.t`.b```s.y.,`.b```s.e.t`.g```s.t.o```s`.w``.a```s.i.s```s.r```s````s.t..`.a`.h`.t```s.k.e`.i`.l`r`.g`.n`.i`.h`.t`.y`.n`.a```s.o.r```s.t.,`.i```s.i.d`.o`.v`.a```s.o.r```s.y.,`.a`.w`.a```s.i.t```s.v.e`.i`.r`.d```s.o.r```s.e.,`.k`.a`.n`.s```s.h.e`.t``.l`c`.k``.t`.'`.n`.a`.c```s`.Y.o.u. .i. .T.h.e. .a.y. .n.e.s.a.r..`k``s``si`k`d`.s`.g`.n``.h`.t`. `.g`.n``.p`c`.r`.d``.y`.b```s.k.e`.i`.l`.a``.s`c`.l``.k`.o`.o`.l```s.e.s`.g`.a`.s`.s`.a`.p```s.h.e`.t```s.k.e`.a`.m```s.a.n`.c```s`.Y.o.u. .e. .o.i..`k``s``si`k`d`.t``.r`.c```s. .s```s.t.h`. `.g`.n`.i`.r```s`.c`.s`.i`.d`. `.r```s. `.l`.u```s.s`.u`r`.y`.l```s.a.t`.i`.d``.m`c`. `.s```s.e. `.l`.b`.a`.l```s.v```s.s`.t`.c`.e`.j`.b`.o```s.h.e`.t```s`. `.e`.n```s```s``.p`. `.a`. `.o`.t`.n```s.g. `.n``.l`c`.f`r`.t`.u`.o`.b```s.y`.r`.r`.o`.w```s.t.o```s.n.g`.i`.v`.a`.h```s.u.t`.o`.h`.t`.i`.w```s.o.n`.i`.g`.e`.r```s.a.t`.h`.t```s.r.e`.o`.l`.p`.x`.e```s.t.o```s`.w``.a```s.i.s```s.r```s.T.h.e. .a.y. .a.i.t... .N.o.f. .a.i.e.f.o.v.e..`k``s``si`k`d``.s`.e`.w`. `.o`.g`. ```s`.o`.D.n.'.t..v`k`kk`k`kr`kk`k`k`ki`k``s``s`ks``s`k`s`k`ki``s``s`ks``s`k`s``s``s`d`c``s``s`d`?ni`ki``s`d`?Ni`ki`k`d`.K`.O..`krkv`k``s``s`k`ki``siv`d`k``..`.o`.N``.r`.o```s`.Y`. `.r```s.s.w`.n`.a`. ```s.a.s```s`. .P.l.e.s. ri`k`k`d``ki``ci`c```c``s`k`ki``s`d`? +iv@i``s`kk``s`k`s`k``s`ki``s``s``s`ksk`k``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ksk`kk``s``s``s``s``s``s``s``s``si`kk`kk`kk`kk`k`ki`kk`kk`k``s`k`si``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`sik``s`kk`s`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s`k`k`kik``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`d`k````ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``si`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`kk`k`k`ki``s`kk``s``s`ksk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`k```ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`kk`k`k``si`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`kk`k`kk`kk`k`ki`k`k``s`k`sik`kk``s`kkk`k`ki``s`kkk`k`kik`kik``s`kk``s`k`s`k`d```s``s`ks``s`kk``s`ks``s`k`sik`kk```s`cii``s``s`kski``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`kk`k`k``si`ki`k`d`k``i``s`k`sik`kiv``s`kkk``s`kk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ksk`k`k``s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk`k``si`k``s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`svk`k`ki`k`ki``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk```s`cii``s``s`kskik`ki``s``s`ks``s`kk``s`ksk`k``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`si``s`kk``s`k`s`k`s``s`k`s``s`ks``s`k`sik``s`kkk``s``s`ks``s`kk``s`ks``s`kk``s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s`k`s`k`si``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k``si`ki``s`kk``s``s`ks``s``s`ksk`k`k``s`k`sik`k`k`kiv`k``s``s`ksk`k`k`ki`kk`k`ki``s``s``s``s``s``si`k`ki`kk`kk`k``si`k`ki`d`k`````s``s`ksk`ci``s``s`kski``s`k`s``sivk``s``si`k`ki`d`k````ci``s``s`kski``s`k`s``sivk``s``si`ki`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`s``sivk`````ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``si`k```ss``ss`ki``s`kskk`````s`cii``s``s`kski``s`k`s``sivk``s``si`k``s``s`kski`d`k`````s`cii``s``s`kski``s`k`s``sivk``s``si`k``s``s`ksk``ci``s``s`kski`d`k`````ss``s``sss`k``ci``s``s`kski``s`ksk``s`k`s``sivk`````ss``ss`ki``s`ksk``s`k`s``si`k``ci``s``s`kskik`````ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk``s`k`s``sivk``s``si`k```ss``ss`ki``s`ksk`k``s``siv`d`k````s``s`ksk``ci``s``s`kski``s`k`s``si`k```ss``ss`ki``s`kskk``s``siv`d`k`````ss``ss`ki``s`ksk``s`k`s``si`k```ss``ss`ki``s`kskkv`kk`k``s``si`k``s``s``s`k`s`k`s`d`k``ki``.d`.e`.r`.o`.c`.s```s`.Y.o.u. i``s`k`s``s`ks``s`k`s`k`ki``s``s`ks``s`k`sik`k`ki``s`k`s`k`s`d`k``ki``.n`.i`.o`.p`. .ti``s`k`s``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k``i``s`k`sik`kiv`k`k`ki`k`k`k.s`k`ki`k`ki``s`k`s`k`s`d`k``ki``.g`.n``.s`.u`. `.,`.0`.5`.3`. `.e`.l`.b``.s`c`.p``.a```s.o.f```s`.o`. .u.t. .o.i. i``s``s`ks``s`kk``s`ks``s`k`s`k`ki``s``s`ks``s`k`si``s`k`s`d`k```sii``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`ki`k`kk`k`k`ki`k`k`k`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`kk`k`ki``s`k`s`k`s`d`k``ki``.r`.u`.t`. .ni``s``s`ks``s`kk``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`kk`k`ki`k`k`ki`k`k`k.s`k`k`ki`k`ki`k`ki`k``s`k`s`d`k``ki``..ri``s``s`ks``s`k`s`k`s``s`k`ki``s``s``s``si`k``si`k`ki`k``s``si`k`d``.m`.i`.t`. `.t`.x```s. .n`.k`.c`.u`.l`. `.r```.B`. `. `..`.r`.u`.e```s.m```s.k. `.n```s`.a```s.l.y`.s`.u`.o`.i`.v`.b`.o```s.r.e`.a```s`.Y.o.u. .r.a.t`c.e.e..`k``s``si`k`d`.r``.r`.u`.t`.n```s``. `.s`.s```s`. `.e```s`.o`.n``.a```s.a.s```s.o.u`.y```s``.f```s``.q`. `.e`.r`.o`.c`.s`. `.r```s.Y.o.u.a.l.i.e.s. .v.i.c.l.a.d.v.e..`k``s``si`k`d`."`.r``.r`.u`.t`.n```s.d.v`.A`. `.d```s.n.c```s.r.i```s`.E`."``.g`.n`.i`.t`.a`.r```s.h.e`.t```s.e.d`.v`.e`.i`.h`.c`.a```s.v.e`.a`.h```s`.Y.o.u. .x.p.e..`k``s``si`k`d`."`.r``.r`.u`.t`.n```s.d.v`.A`. `.d```s.o.n`.s`.a```s``.a```s.l.f`.e`.s`.r`.u`.o`.y```s.e.r`.d`.i`.s`.n`.o`.c```s.o.w`.n```s.a.y`.m```s`.Y.o.u. .".S.e..`k``s``si`k`d``.u`.t`.a`.t```s."`.r`.e`.t`.s`.a`.M```s.o.r`.i`.n`.u`.J`."```s.e.d`.h`.c`.a`.e`.r```s.v.e`.a`.h```s`.Y.o.u. .s..`k``s``si`k`d`.C``.s`.s`.a`.l`.C```s.e.r`.r`.u`.t`.n`.e`.v`.d`.A```s.e.r`.t`.s`.a`.M```s.i.n```s.o.u`.y```s.t.s`.u`.p```s`.o`.c`.s`. ```s`.Y.o.u.r.e. ..`k``s``si`k`d`.B``.s`.s`.a`.l`.C```s.e.r`.r`.u`.t`.n`.e`.v`.d`.A```s.e.r`.t`.s`.a`.M```s.i.n```s.o.u`.y```s.t.s`.u`.p```s`.o`.c`.s`. ```s`.Y.o.u.r.e. ..`k``s``si`k`d`.A``.s`.s`.a`.l`.C```s.e.r`.r`.u`.t`.n`.e`.v`.d`.A```s.e.r`.t`.s`.a`.M```s.i.n```s.o.u`.y```s.t.s`.u`.p```s`.o`.c`.s`. ```s`.Y.o.u.r.e. ..`k``s``si`k`d``.e`.t`.s`.a`.m`.d`.n`.a```s. .G`.e```s.t`.n`.e`.v`.d`.A`. `.,```s.y`. ```s. `.e```s.b.u`.i`.r```s.s`.e`.v`.i`.g```s.o.m`.d`.e`.r`.u`.t`.n`.e`.v`.d`.A```s.o.f``.l`c.A. .t.o.u.r.!v`kk`ki``s`k`s`k`s`d`k``ki``.n`.i`.t`.a``. ```s`.g`.i```s.t`.x`.e`.n```s.h.e`.t```s.v.e`.e`.i`.h`.c`.a```s`r.T.o. .h.e.r.gi``s``s`ks``s`k`s`ks``s`k`s`k`s`k`ki``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`d`k`````s``s`ksk`ci``s``s`kski``s`k`sikv``s``si`k``s`k`sik`k`ki``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s`k`s`kk``s`k`s`k`s`d`k``ki``.d`.e`.e`.n```s`.y`. `.,.o.u. i``s``s`ks``s`k`s`ks``s`k`s`k`s`k`ki``s``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kk``s`k`s`d`k```sii``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`ki`k`kk`k`k`ki`k`k`k`ki`k`ki``s``s`ks``s``s`ksk`k`k``si`ki`k``s``si`k``s`k`sikv`k`k`ki``s`kk``s`k`s`d`k``ki``.n`.i``.p`. `.e`.r```s. .m.o.ti``s``s`ks``s`k`s`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`k``si`ki`k``s``si`k``s`k`sik`k`kiv`k`k`ki`k`k`k.s`k`ki`k`ki`k`d`k``..ri`k`k``s``s`ks``s``s`ks``s``s`ksk`k`k``si`k`ki`k`k``s``si`k```ss``ss``ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k````ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k```si``si``s``si``ss`k`ci``si`ki`s``s`ksk`k``s``si`k``s`k``s``s`kski````ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k````s``ss``ss`ki``s`k``s``si``si``s`s`ci``si`kiis``s`kski`k``s``si`k``s`k```ss``ss`ki``s`ksk````ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k```s``s`ci`k```s``si``s`s`ci``si`kii`s``s`kski``s``s`kski`k``s``si`k```s``s`ci`k```s``s`s`ci``si`kii`s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k```s``s`ksk`ci``ci``s``s`kskiv`k`kk`k`k`k`d`k`````s`.o`.i`.t``.l`.u`.t```s.g`.n`.o`.C`r`.!`.k`.c`.i```s. ```s`.n``.a```s.b.e```s`.u`.o`.w`. .l.d. .e.a.t.r.a.n.s.!ri`k`k`kiv``s``s`ks``s`k`s`k``sii``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s``s``s``si`kk`k``s`k`sikv``s``s`ks``s``s`ksk`k`k``s`k`sik`k`k`ki`k`k`k`ki`k``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k``s``si`k```ss``ss``ss``s``ss`k``s`cii``ss`ki``s`ksk`k``s``si`k````ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k```si``si``s``si``ss`k`ci``si`ki`s``s`ksk`k``s``si`k``s`k``s``s`kski````ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k````s``ss``ss`ki``s`k``s``si``si``s`s`ci``si`kiis``s`kski`k``s``si`k``s`k```ss``ss`ki``s`ksk````ss``s`k`ss``ss`ss``ss`ki``s`ksk`k``s``si`k```s``s`ci`k```s``si``s`s`ci``si`kii`s``s`kski``s``s`kski`k``s``si`k```s``s`ci`k```s``s`s`ci``si`kii`s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k```s``s`ksk`ci``ci``s``s`kskiv``s`d`k```sii``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`ki`k`kk`k`k`ki`k`k`k`ki`k`ki``s`d`k````ss``ss``ss``ss``s`k`ci``ss``ss`ki``s`ksk``si`ki``s``s``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`kk`k`kk`k`k`ki`k`kk`k`k`ki`k`k`k```si``s`k`s``s`ksk`ci``s``s`kski`k`k`ki`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s`k`s`k``sii``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``si`k``s`k`sikv`d`k`````si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`sik`ki`k`k`ki``s`k`s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`kc``s`k`s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`k`kk`k`k`ki`k`k`ki`k`ki`k`k`k`k`ki``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`k`ki``s`kk``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`k`kk`k`k`k``si`ki`k`k`d`k`````ss``ss`ki``s`ksk``s`k`sik`kiv``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k``si`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`kk`k`k`kkv`k`k`ki`k`ki`k`k`k`k``s``s`kski`k``s``s`ks``s``s`ks``s`k`s`d`k````s`k``s``s`kski```ss``s`k`ci``ss``ss`ki``s`ksk``s`k`sikv``s``s`ks``s``s`ksk`k`k``s`k`sik`k`k`ki`ki`k`k`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s`k`si``s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``s`k`sik`k`k`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k`d`k````s`k``s``s`kski```ss``s`k`ci``ss``ss`ki``s`ksk``s`k`sik`k```s`cii``s``s`kskiv`k`kk`k``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`kk`k`k`ki`k`k`ki`k`k```ss``s``ss`k``si``s`k`s``s`ksk`ci``ss`ki``s`ksk`kk`k`ki`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`k```ss```ss`ss``ss`ki``s`ksk``s``s`ks``s`kk``s`ks``s`k`s`d`k```sii``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`ki`k`kk`k`k`ki`k`k`k`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`k`ki`k`kk`k`k`ki`k`kk`k`k`ki`k`k``si`ki`k`d`k`````ss``ss`ki``s`ksk``s`k`sikv`kk`k`ki`kk`k`ki`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k````ss``ss``ss`k```s`cii``s``s`kski``s`ksk``si`k`ki``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`kk`k`k``si`ki`k`d`k`````si``si``si``s``ss`k`ci``si`ki`s``s`ksk``s`k`sik`kiv`k`k`ki`k`k`k`ki`k`ki`kk`k`ki`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`kk`k`k`ki`k`k`ki`k`k`ki`k`k`ki`k`k`k`ki`k`k`k```si``s`k`s``s`ksk`ci``s``s`kski`k`ki`kk`k`ki`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`d`k```sii``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k``s`kc``s`k`s`k`ki``ssv``si`k`k`ki`k`k`ki``s`k`s``s`ksk``s`kk``s`kk``s`k`s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`kk`k`kk`k`k`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`ki`k`kk`k`k`ki`k`kk`k`kk`k`kk`kk`k`ki`k``s`k`sikv`d`k```sii``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``si`k``s`k`sik`k`ki`d`k``````ss`ss``ss`ki``s`ksk``s`k`sikv``s``s`ks``s``s`ks``s``s`ksk`k`k``si`k`ki`k`k``s``si`k.0`k``s``si`k.1`k``s``si`k.2`k``s``si`k.3`k``s``si`k.4`k``s``si`k.5`k``s``si`k.6`k``s``si`k.7`k``s``si`k.8`k``s``si`k.9v`k`kk``s`k`s``s`ks``s``s`ks``s`k`s`d`k```sii``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`kk`k``s`kk``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k``s`k`s`kk``s`k`s`kk``s`k`s``s`ks``s`k`sik``s`kk``s`k`s`d`k```sii``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`ki`k`kk`k`k`ki`k`k`k`ki`k`ki``s``s`ksk`k`ki`k`k`k`ki`k``s`k`s`d`k````ss```ss`ss``ss`ki``s`ksk``si`kik``s`kk``s`k`si``s``s`ks``s``s`ksk`k`k``s`k`sikv`k`k`ki``s`kk``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`kk`k`k``s``s``si`k``si`k`ki`k``s``si`k.0`k``s``si`k.1`k``s``si`k.2`k``s``si`k.3`k``s``si`k.4`k``s``si`k.5`k``s``si`k.6`k``s``si`k.7`k``s``si`k.8`k``s``si`k.9v`kk`k`kiv`k`kk`ki``s`kk``s``s`kskk \ No newline at end of file diff --git a/2019/adamovsky/hint.html b/2019/adamovsky/hint.html new file mode 100644 index 000000000..dfaa5b0e2 --- /dev/null +++ b/2019/adamovsky/hint.html @@ -0,0 +1,281 @@ + + + + + + Most functional interpreter + + +

    Most functional interpreter

    + +

    Ondřej Adamovský oa@cmail.cz

    + +

    Judges' comments:

    + +

    To use:

    + +
    make prog
    +./prog file.unl
    +
    + +

    Try:

    + +
    ./prog spam.unl
    +
    +./prog sierpinski.unl | less
    +
    +./prog advent.unl
    +
    + +

    Selected Judges Remarks:

    + +

    Even after pre-processing and indenting, the C code of this entry +is about as understandable as the Unlambda code.

    + +

    Pretending that we don’t know a bit of functional programming :) and lacking a better way +to understand the entry but to fuzz it, +we stumbled on a string of bytes which crashed it:

    + +
    ````.0`.0`.0`c.0``sssss
    +
    + +

    Functional programming is not a panacea against core dumps, after all.

    + +

    Author’s comments:

    + +

    »A highly structured state state machine«

    + +

    Purpose

    + +

    The purpose of this program is to allow you to play Colossal Cave Adventure as +implemented by Kunihiko Sakamoto. As that was written in Unlambda programming +language designed by David Alexander Madore it has to be an Unlambda interpreter.

    + +

    Aesthetics

    + +

    The program grew a bit too long so I had to use several macros to downsize it. +That unfortunately reduced my options for program layout. I decided to separate +it into two portions. The initial macro section where I had limited resources and +you should disregard its shape, unless you like it, and the rest is a separator in the +form of a single line followed by a section signifying the function of the program, +a block with removed shape of lambda character. Even the official IOCCC size tool +acknowledges this: When you call ./iocccsize -i <prog.c, using the +2019 version of iocccsize, +iocccsize returns 955, which is the Unicode codepoint of the λ character.

    + +

    It might be a surprise for you that according to the IOCCC size tool the program is +actually a oneliner. It certainly was for me. I like to think the tool is overwhelmed +by the sheer length of the dividing line and totally overlooks the rest of the program.

    + +

    Usage

    + +

    When built directly

    + +
    make
    +
    + +

    the program (prog) accepts a single parameter with the name of an Unlambda program. You can +download the Colossal Cave Adventure (the advent.unl file) and run it like this

    + +
    ./prog advent.unl
    +
    + +

    You can also try other programs from the Web. Many example programs are in the official +Unlambda distribution on the Unlambda homepage. The most complex programs there are +entries from quine contest.

    + +

    There is an alternative build path that requires IOCCC size tool to complete. Put the tool +source iocccsize.c in the project directory and call

    + +
    make identify
    +
    + +

    It will build the tool and use it to build an alternative program prog2, which in turn will +produce an Unlambda program identify.unl. make identify runs this program to identify +itself.

    + +

    The base program (prog) implements an interpreter of Unlambda 2.0. It recognises all its +builtins (k, s, i, v, c, d, .x, e, @, ?x and |) including the syntactic sugar function +(​r​) and formating properties in the form of ignoring whitespace and comments +to the end of line introduced by the # character.

    + +

    In case of wrong usage (missing Unlambda program file or missing parameter) or use of an unseekable +Unlambda program source if it uses the c function, the program returns message fail. It +also informs you about syntactic errors in the Unlambda program should there be any (but only +when the execution reaches them).

    + +

    The Unlambda source file may contain several Unlambda programs. The interpreter will run +them all in sequence.

    + +

    Unlambda

    + +

    If you want to familiarise yourself with the language, visit its Wikipedia page for +a brief introduction or its homepage for an indepth discussion. For further reading you +can visit Wikipedia pages on Lambda Calculus and Combinatory Logic.

    + +

    You can also play with an online interpreter by Github user inazz. There you can +debug one of example programs provided or try your wits in writing your own.

    + +

    Hints

    + +

    Here are some pointers where to start when trying to understand the interpreter:

    + +
      +
    • Where is syntax error detected?
    • +
    • How is the memory managed?
    • +
    • How does a program character turn into a function?
    • +
    • How does exit function e work?
    • +
    • Can fD0 function be called?
    • +
    • Are the function names familiar? (warning: some are misleading)
    • +
    + + +

    Obfuscation sources

    + +
      +
    • The elephant in the room is the Unlambda language. As we all know, functional +programming defies sanity. Furthermore, Unlambda was specifically designed +to be unintelligible and hard to code in. Most of its functions are quite +simple and straightforward to implement, but two make it a mess: the promise +operator d and the call with current continuation c.
    • +
    • Most of the additional obfuscation is derived from basic design choices. That +is, how the state of the program is stored and how are the Unlambda functions +implemented.
    • +
    + + +

    More on this in the Spoilers section.

    + +

    Build notes

    + +

    The program does not require any special treatment by compilers. Some warnings +had to be suppressed when compiling with -Wall -Wextra -pedantic. Those were +produced because of the formatting of the source code, not any programming +technique. Compilation with -Weverything produced many more warnings, but those +are only relevant for multi-source-file projects and some are really questionable +(e.g. -Wdisabled-macro-expansion).

    + +

    Portability

    + +

    Development was done on Debian 9 on x86-64 architecture using mainly Clang 3.8.1-24 +and GCC 6.3.0. The source is C11 compliant and does not use any special properties +except the following:

    + +
      +
    • The interpreter sort of relies on tail call optimization. It works well even +without it, but the stack runs out quickly with some Unlambda programs (e.g. trivial.unl +example from the reference Unlambda distribution produces segfault). +Clang with -O3 option does this optimization well and said example does +not segfault with it. I was not able to force GCC to optimize it out (probably +an operator fault).
    • +
    • The only data structure of the program (the union structure) had much more +members originally. I joined all integers to a single long long member in the name +of obfuscation. It is used for reference counting (only 1 for every reference) among +other uses. size_t should be used for that, but practically, I think the memory +would run out sooner than the reference counter in any real world situation +even when size_t is bigger than long long. It is also used for storing chars +for later printing. This might produce some warnings, but since it was developed +using chars it should be always used safely.
    • +
    + + +

    Spoilers

    + +
      +
    • You can examine the progSpoiler.c file. It is the original final version of +the interpreter, before I started the downsizing. It accepts one more optional +parameter that specifies filename for the output Unlambda function (it’s the +Unlambda function, that remains after all function applications are done). +When no filename is provided, stderr is used.

      + +

      The function output is used for this additional functionality. You can use +it while debugging to visualise current variables.

    • +
    • The Unlambda functions are represented by a record consisting of an array of five +multipurpose arguments. The first one refers to the function implementing its +application, the second and the third ones are for arguments of the function, +the fourth one is for stack building, and the fifth one is the reference counter.

      + +

      The function argument is used not only for evaluation of the functions, but also +as a state variable to decide whether we want to call it, or do something else.

    • +
    • The interpreter reads the Unlambda source as it interprets it, translating +the incoming character to a function using a constructor stored in translation array T.

      + +

      This means the interpreter must reposition in the source file whenever current +continuation is called.

    • +
    • The state of the interpreter is represented by trees representing evaluated +Unlambda functions stored on the C stack as local variables, plus the source file +position. When a current continuation is created, the stack is unwound using the +fourth argument of the nodes, stored in the continuation, and rebuilt back resuming +the evaluation. When its called, the stack is unwound and thrown away, and the +stack stored in the continuation is restored.

      + +

      This makes implementation of a complete debugger a bit more challenging.

      + +

      For this to work, the functions that do the work (i.e. make series of applications +and/or evaluations each of which may be a call to current continuation), the s +combinator and the ` application operation had to be broken down to pieces, one +for each application/evaluation and corresponding helper functions for stack +rebuilding. (the helper functions are named beginning with r instead of f)

    • +
    • The ` application operation does the reading of the Unlambda source when needed. It +also implements the promise function. Whenever it would apply it, it overwrites +the Apply constructor in translation array T, changing its function to build +unevaluated subtree that is later evaluated whenever the promise is applied.

    • +
    • To further the obfuscation, I shortened the function names while downsizing, +but preserved their meaning (with the exception of Apply functions, which I +renamed to Y to possibly confuse with Y combinator). Simple functions retained +their names to misguide the reader to believe to know what is what. The names +of continuation and exit functions were swapped. The names of S and Apply +functions were shuffled both for S functions and Apply functions in the same way +to hide the meaning of f and r prefixes.

    • +
    + + +

    Identification spoiler

    + +

    The alternative build path make identify output commemorates a previous IOCCC winner which uses +similar methods to mess with the size tool.

    + +

    Judges remarks spoilers

    + +

    It is not a bug, it is a feature. :)

    + +

    The crash is caused by a stack overflow. Conventional Unlabmda interpreters implement +the Unlambda execution stack using data structures on the heap. This interpreter uses +the C call stack for this purpose. In a conventional interpreter, the judges program would +consume memory until the user (or the operating system) would lose patience. The C call stack +is usually of a limited size and protected, so this interpreter crashes, when the judges +program depletes the stack. You can always increase the maximal stack size through +the system settings (on Linux) or compiler options (on Windows) if your Unlambda program +needs it. Nevertheless, it will not help the judges program which quickly depletes any limit +you define.

    + +

    The judges, pretending not to know what they are doing, created a program that grows +Unlambda execution stack indefinitely. You may consider it an Unlambda antipattern. +Normally, infinite cycles in Unlambda work by creating two functions and applying one +to the other which creates further functions to apply. The application of the function +frees its position on the stack. This program builds one ever growing function that will +never be complete and able to be applied.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2019, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2019/adamovsky/hint.text b/2019/adamovsky/hint.text new file mode 100644 index 000000000..5b3b29078 --- /dev/null +++ b/2019/adamovsky/hint.text @@ -0,0 +1,254 @@ +# Most functional interpreter + +OndÅ™ej Adamovský + + +## Judges' comments: +### To use: + + make prog + ./prog file.unl + +### Try: + + ./prog spam.unl + + ./prog sierpinski.unl | less + + ./prog advent.unl + +### Selected Judges Remarks: + +Even after pre-processing and indenting, the C code of this entry +is about as understandable as the Unlambda code. + +Pretending that we don't know a bit of functional programming :) and lacking a better way +to understand the entry but to fuzz it, +we stumbled on a string of bytes which crashed it: + + ````.0`.0`.0`c.0``sssss + +Functional programming is not a panacea against core dumps, after all. + +## Author's comments: +**»A highly structured state state machine«** + +### Purpose ### + +The purpose of this program is to allow you to play Colossal Cave Adventure as +implemented by [Kunihiko Sakamoto][1]. As that was written in [Unlambda programming +language][2] designed by David Alexander Madore it has to be an Unlambda interpreter. + +### Aesthetics ### + +The program grew a bit too long so I had to use several macros to downsize it. +That unfortunately reduced my options for program layout. I decided to separate +it into two portions. The initial macro section where I had limited resources and +you should disregard its shape, unless you like it, and the rest is a separator in the +form of a single line followed by a section signifying the function of the program, +a block with removed shape of lambda character. Even the official IOCCC size tool +acknowledges this: When you call `./iocccsize -i diff --git a/2019/adamovsky/iocccsize_2018.c b/2019/adamovsky/iocccsize_2018.c new file mode 100644 index 000000000..5ba575b5e --- /dev/null +++ b/2019/adamovsky/iocccsize_2018.c @@ -0,0 +1,620 @@ +/* + * iocccsize - IOCCC Source Size Tool + * + * This IOCCC size tool source file is version 2017-12-25-v25. + * + * "You are not expected to understand this" :-) + * + * Public Domain 1992, 2015 by Anthony Howe. All rights released. + * With IOCCC minor mods in 2013-2017 by chongo (Landon Curt Noll) ^oo^ + * + * SYNOPSIS + * + * ioccc [-kirs] < input + * + * -k keep comment blocks + * -i IOCCC size rule (overall size, modified) + * -r count C reserved words as 1 byte + * -s suppress source output, write only the IOCCC 2nd size count + * + * DESCRIPTION + * + * Taking input from standard input, apply the IOCCC Source Size Rule + * for 2001. The program's official length is written to standard error. + * Also filter out C comment blocks (-k to keep) sending the modified + * source to standard output. + * + * The 2001 Source Size Rule was: + * + * Your entry must be <= 4096 bytes in length. The number of octets + * excluding whitespace (tab, space, newline, form-feed, return), and + * excluding any ';', '{' or '}' followed by whitespace or end of file, + * must be <= 2048. + * + * 2013 Source Size Rule is (-r): + * + * Your entry must be <= 4096 bytes in length. The number of octets + * excluding whitespace (tab, space, newline, form-feed, return), and + * excluding any ';', '{' or '}' followed by whitespace or end of file, + * and where C reserved words, including a subset of preprocessor words, + * count as 1 byte, must be <= 2053 (first prime after 2048). + */ + +/* + * The official IOCCC rule 2 secondary limit on C code size + * + * The IOCCC size tool should be compiled as: + * + * cc -pedantic -Wall -std=c99 iocccsize.c -o iocccsize + * + * This tool computes a 2nd size C code. To check your program source + * against the 2nd limit of rule 2, use the -i command line option. + * + * For example: + * + * ./iocccsize -i < prog.c + * + * The IOCCC size tool, when using the -i option, may be summarized as: + * + * The size tool counts C language keywords (primary, secondary, and + * selected preprocessor keywords) as 1. The size tool counts all + * other octets as 1 excluding ASCII whitespace, and excluding any + * ';', '{' or '}' followed by ASCII whitespace, and excluding any + * ';', '{' or '}' octet immediately before the end of file. + * + * ASCII whitespace includes ASCII tab, ASCII space, ASCII newline, + * ASCII form-feed, and ASCII carriage return. + * + * In cases where the above summary and the algorithm implemented by + * the IOCCC size tool source code conflict, the algorithm implemented + * by the IOCCC size tool source code is preferred by the judges. + * + * See the current IOCCC rules and guidelines for more information. + * In particular, see the current IOCCC size rule for information about + * the maximum value that this tool should print for an entry to be valid. + */ + +/* + * IOCCC Judge's remarks: + * + * This code contains undocumented features. On the other hand, this code + * is RTFS (for certain values of RTFS). One might say that this code + * perfectly documents itself. :-) + * + * Many thanks to Anthony Howe for taking the time to put his OCD + * (Obfuscated Coding Determination) into this code! + */ + +/* + * HINT: The algorithm implemented by this code may or not be obfuscated. + * The algorithm may not or may appear to be obfuscated. + * + * In particular: + * + * We did not invent the algorithm. + * The algorithm consistently finds Obfuscation. + * The algorithm killed Obfuscation. + * The algorithm is banned in C. + * The algorithm is from Bell Labs in Jersey. + * The algorithm constantly finds Obfuscation. + * This is not the algorithm. + * This is close. + */ + +#include +#include +#include +#include +#include + +#define FLAG_SILENCE 1 +#define FLAG_KEEP 2 +#define FLAG_RESERVED 4 +#define FLAG_IOCCC 8 +#define FLAG_SILLY_C 16 +#define FLAG_SILLY_H 32 + +#define BUFFER_SIZE 521 +#define MAX_SIZE 4096 /* IOCCC Rule 2 */ +#define MAX_COUNT 2053 /* IOCCC Rule 2 */ + +static char usage[] = +"usage: ioccc [-kirsch] < prog.c\n" +"\n" +"-k\t\tkeep block comments\n" +"-i\t\tprint official secondary IOCCC size to stdout\n" +"\t\tmax.size warnings to stderr, NOTE: implies -r -s\n" +"-r\t\tcount C reserved words as 1 byte\n" +"-s\t\tsuppress source output, write only the official size\n" +"-c\t\tan undocumented feature\n" +"-h\t\tyet another undocumented feature\n" +; + +#define STRLEN(s) (sizeof (s)-1) + +typedef struct { + size_t length; + const char *word; +} Word; + +/* + * C reserved words, plus a few #preprocessor tokens, that count as 1 + * + * NOTE: For a good list of reserved words in C, see: + * + * http://www.bezem.de/pdf/ReservedWordsInC.pdf + * + * by Johan Bezem of JB Enterprises: + * + * See http://www.bezem.de/en/ + */ +/* + * The following editorial plea expresses a view shared by more than zero + * IOCCC judges. It may not represent the opinion of all those involved + * with this code nor the International Obfuscated C Code Contest as a whole: + * + * The long list of reserved words below should be a source + * of embarrassment to some of those involved in standardizing C. + * The growing list of reserved words, along with an expanding set of + * linguistic inventions has the appearance of feature + * creep that, if left unchecked, risks turning a beautifully elegant + * language into a steaming pile of biological excretion. + * + * The history of the IOCCC has taught us that even minor changes + * to the language are not always well understood by compiler writers, + * let alone the standards body who publishes them. We have enormous + * sympathy for C compiler writers who must keep up with the creeping + * featurism. We are aware of some C standards members who share + * these concerns. Alas, they seem to be a minority. + * + * The C standards body as a whole, before they emit yet more mountains of new + * standardese, might wish consider the option of moth-balling their committee. + * Or if they must produce a new standard, consider naming whatever + * follows c11 as CNC (C's Not C). :-) + */ +static Word cwords[] = { + /* Yes Virginia, we left #define off the list on purpose! */ + { STRLEN("#elif"), "#elif" }, + { STRLEN("#else"), "#else" }, + { STRLEN("#endif"), "#endif" }, + { STRLEN("#error"), "#error" }, + { STRLEN("#ident"), "#ident" }, + { STRLEN("#if"), "#if" }, + { STRLEN("#ifdef"), "#ifdef" }, + { STRLEN("#include"), "#include" }, + { STRLEN("#line"), "#line" }, + { STRLEN("#pragma"), "#pragma" }, + { STRLEN("#sccs"), "#sccs" }, + { STRLEN("#warning"), "#warning" }, + /**/ + { STRLEN("_Alignas"), "_Alignas" }, + { STRLEN("_Alignof"), "_Alignof" }, + { STRLEN("_Atomic"), "_Atomic" }, + { STRLEN("_Bool"), "_Bool" }, + { STRLEN("_Complex"), "_Complex" }, + { STRLEN("_Generic"), "_Generic" }, + { STRLEN("_Imaginary"), "_Imaginary" }, + { STRLEN("_Noreturn"), "_Noreturn" }, + { STRLEN("_Pragma"), "_Pragma" }, + { STRLEN("_Static_assert"), "_Static_assert" }, + { STRLEN("_Thread_local"), "_Thread_local" }, + /* + * this comment is not expected to understand itself + */ + { STRLEN("alignas"), "alignas" }, + { STRLEN("alignof"), "alignof" }, + { STRLEN("and"), "and" }, + { STRLEN("and_eq"), "and_eq" }, + { STRLEN("auto"), "auto" }, + { STRLEN("bitand"), "bitand" }, + { STRLEN("bitor"), "bitor" }, + { STRLEN("bool"), "bool" }, + { STRLEN("break"), "break" }, + { STRLEN("case"), "case" }, + { STRLEN("char"), "char" }, + { STRLEN("compl"), "compl" }, + { STRLEN("const"), "const" }, + { STRLEN("continue"), "continue" }, + { STRLEN("default"), "default" }, + { STRLEN("do"), "do" }, + { STRLEN("double"), "double" }, + { STRLEN("else"), "else" }, + { STRLEN("enum"), "enum" }, + { STRLEN("extern"), "extern" }, + { STRLEN("false"), "false" }, + { STRLEN("float"), "float" }, + { STRLEN("for"), "for" }, + { STRLEN("goto"), "goto" }, + { STRLEN("I"), "I" }, + { STRLEN("if"), "if" }, + { STRLEN("inline"), "inline" }, + { STRLEN("int"), "int" }, + { STRLEN("long"), "long" }, + { STRLEN("noreturn"), "noreturn" }, + { STRLEN("not"), "not" }, + { STRLEN("not_eq"), "not_eq" }, + { STRLEN("or"), "or" }, + { STRLEN("or_eq"), "or_eq" }, + { STRLEN("register"), "register" }, + { STRLEN("restrict"), "restrict" }, + { STRLEN("return"), "return" }, + { STRLEN("short"), "short" }, + { STRLEN("signed"), "signed" }, + { STRLEN("sizeof"), "sizeof" }, + { STRLEN("static"), "static" }, + { STRLEN("static_assert"), "static_assert" }, + { STRLEN("struct"), "struct" }, + { STRLEN("switch"), "switch" }, + { STRLEN("thread_local"), "thread_local" }, + { STRLEN("true"), "true" }, + { STRLEN("typedef"), "typedef" }, + { STRLEN("union"), "union" }, + { STRLEN("unsigned"), "unsigned" }, + { STRLEN("void"), "void" }, + { STRLEN("volatile"), "volatile" }, + { STRLEN("while"), "while" }, + { STRLEN("xor"), "xor" }, + { STRLEN("xor_eq"), "xor_eq" }, + /**/ + { 0, NULL } +}; + +/* + * Keep track of discarded bytes by read_line() so count() can report + * correct wc(1) equivalent counts. + */ +static int xlcount = 0; +static int xwcount = 0; +static int xbcount = 0; + +static Word * +find_member(Word *table, const char *string) +{ + Word *w; + for (w = table; w->length != 0; w++) { + if (strncmp(string, w->word, w->length) == 0 + && !isalnum(string[w->length]) && string[w->length] != '_') + return w; + } + return NULL; +} + +/* + * ISO C11 section 5.2.1.1 Trigraph Sequences, leading sequence "??" + */ +static char trigraph[] = "=(/)'-"; +static char asciimap[] = "#[\\]^{|}~"; + +static size_t +read_line(char *buf, size_t size) +{ + int ch; + size_t length; + + if (buf == NULL || size == 0) + return 0; + + for (size--, length = 0; length < size; ) { + if ((ch = fgetc(stdin)) == EOF) + break; + /* Map NUL bytes to space, though ideally I should chuck'em. */ + if (ch == '\0') + ch = ' '; + /* Discard bare CR and those part of CRLF. */ + if (ch == '\r') { + xbcount++; + continue; + } + /* Trigraph mapping? */ + if (2 <= length && buf[length-2] == '?' && buf[length-1] == '?') { + char *tri; + if ((tri = strchr(trigraph, ch)) != NULL) { + /* Mapped trigraphs count as 1 byte. */ + ch = asciimap[tri - trigraph]; + xbcount += 2; + length -= 2; + } + } + if (ch == '\n' && 1 <= length && buf[length-1] == '\\') { + /* ISO C11 section 5.1.1.2 Translation Phases + * point 2 discards backslash newlines. + */ + xbcount += 2; + xwcount++; + xlcount++; + length--; + continue; + } + buf[length++] = (char) ch; + if (ch == '\n') { + break; + } + } + + buf[length] = '\0'; + + return length; +} + +/* + * Count octets and strip comments. The stripped C input is sent to + * standard output. If -s is set, then suppress the source output. + * The various counters are sent to standard error. + * + * The counter output format is: + * + * lcount wcount bcount icount isaved rcount rsaved + * + * where + * lcount line count (same as wc) + * wcount word count (same as wc) + * bcount byte count (same as wc) + * icount IOCCC secondary size rule count + * + * No longer reported: + * isaved bytes saved by secondary size rule (bcount - icount) + * rcount number of C reserved words + * rsaved number of octets saved with -r + */ +static int +count(int flags) +{ + Word *w; + unsigned long span; + char *p, buf[BUFFER_SIZE]; + int lcount, wcount, bcount; + int is_comment, is_word, dquote, escape; + int count, keywords, saved, kw_saved; + + /* Start of buffer sentinel. */ + buf[0] = ' '; + buf[BUFFER_SIZE - 1] = 0; /* paranoia */ + + count = saved = 0; + keywords = kw_saved = 0; + lcount = wcount = bcount = 0; + is_comment = is_word = dquote = escape = 0; + + /* + * "no matter how well you may think you understand this code, + * you don't, so don't mess with it." :-) + */ + while (0 < read_line(buf+1, sizeof (buf)-1)) { + if (!(flags & FLAG_KEEP)) { + /* Leading whitespace before comment block? */ + span = strspn(buf+1, "\t "); + + /* Split / * across reads? */ + if (buf[1 + span] == '/' && buf[2 + span] == '\0') { + (void) ungetc('/', stdin); + continue; + } + + /* + * no comment is a comment + */ + if (buf[1 + span] == '/' && buf[2 + span] == '/') { + continue; + } + + if (buf[1 + span] == '/' && buf[2 + span] == '*') { + /* Strip leading whitespace before comment block. */ + is_comment = 1; + } + } + + for (p = buf+1; *p != '\0'; p++) { + /* Within quoted string? */ + if (dquote) { + /* Escape _this_ character. */ + if (escape) { + escape = 0; + } + + /* Escape next character. */ + else if (*p == '\\') { + escape = 1; + } + + /* Close quoted string? */ + else if (*p == '"') { + dquote = 0; + } + } + + /* Not quote string. */ + else { + /* In C comment block? */ + if (is_comment) { + /* Split * / across reads? */ + if (*p == '*' && p[1] == '\0') { + ungetc('*', stdin); + break; + } + + /* End of comment block? */ + if (*p == '*' && p[1] == '/') { + is_comment = 0; + + if (!(flags & FLAG_KEEP)) { + /* Strip whitespace and newline + * trailing closing comment. + */ + p += 1 + strspn(p+2, " \t\r\n"); + } + } + + if (!(flags & FLAG_KEEP)) { + /* Strip octets in comment block. */ + continue; + } + } + + /* Split / / or / * across reads? */ + else if (*p == '/' && p[1] == '\0') { + ungetc('/', stdin); + break; + } + + /* Start of comment line? */ + else if (*p == '/' && p[1] == '/') { + if (!(flags & FLAG_KEEP)) { + /* Strip comment to end of buffer. */ + break; + } + } + + /* Start of comment block? */ + else if (*p == '/' && p[1] == '*') { + /* Begin comment block. */ + is_comment = 1; + + if (!(flags & FLAG_KEEP)) { + /* Strip comment block. */ + p++; + continue; + } + } + + /* C reserved word? */ + else if (!isalnum(p[-1]) && p[-1] != '_' + && (w = find_member(cwords, p)) != NULL) { + keywords++; + if (flags & FLAG_RESERVED) { + bcount += w->length; + if (!is_word) { + is_word = 1; + wcount++; + } + + if (!(flags & FLAG_SILENCE)) { + fputs(w->word, stdout); + } + + /* Count reserved word as one. */ + kw_saved += w->length - 1; + p += w->length - 1; + count++; + continue; + } + } + + /* Open quoted string? */ + else if (*p == '"') { + dquote = 1; + } + } + + if (!(flags & FLAG_SILENCE)) { + fputc(*p, stdout); + } + + bcount++; + if (*p == '\n') { + lcount++; + } + + /* Ignore all whitespace. + * + * Well not ALL in the Universe, just all here. + */ + if (isspace(*p)) { + is_word = 0; + saved++; + continue; + } else if (!is_word) { + is_word = 1; + wcount++; + } + + /* Ignore curly braces and semicolons when followed + * by any whitespace or EOF. + */ + if (strchr("{;}", *p) != NULL && (isspace(p[1]) || p[1] == '\0')) { + saved++; + continue; + } + + /* Count this octet. */ + count++; + } + } + + if (flags & FLAG_IOCCC) { + /* Output the official IOCCC size tool size to standard out */ + printf("%d\n", count); + if (MAX_SIZE < bcount) { + fprintf(stderr, "WARNING: program size (%d) exceeds IOCCC Rule 2a max. size (%d)\n", bcount, MAX_SIZE); + } + if (MAX_COUNT < count) { + fprintf(stderr, "WARNING: iocccsize count (%d) exceeds IOCCC Rule 2b max. count (%d)\n", count, MAX_COUNT); + } + } else { + /* The Ugly Truth */ + fprintf( + stderr, "%d %d %d %d %d %d %d\n", + lcount + xlcount, wcount + xwcount, bcount + xbcount, count, + saved, keywords, kw_saved + ); + } + + return count; +} + +int +main(int argc, char **argv) +{ + int ch; + int flags = 0; + + while ((ch = getopt(argc, argv, "kirsch")) != -1) { + switch (ch) { + case 'k': + flags |= FLAG_KEEP; + break; + case 'i': + flags |= FLAG_IOCCC | FLAG_RESERVED | FLAG_SILENCE; + break; + case 'r': + flags |= FLAG_RESERVED; + break; + case 's': + flags |= FLAG_SILENCE; + break; + case 'c': + flags |= FLAG_SILLY_C; + break; + case 'h': + flags |= FLAG_SILLY_H; + break; + default: + fprintf(stderr, "%s\n", usage); + return 2; + } + } + // make test hack: while for do until goto if else switch case default continue return break + if (flags == (FLAG_KEEP | FLAG_IOCCC | FLAG_RESERVED | FLAG_SILENCE | FLAG_SILLY_C | FLAG_SILLY_H)) { + fprintf(stderr, "The source toasts you a glass to your health!\n" + "BTW: judges have toasted a glass of this at the South Pole.\n" + "Now try using useful flags.\n\n" + "%s\n", usage); + return 3; + } else if (flags & FLAG_SILLY_C) { + fprintf(stderr, "Do you not see this is C?\n\n" + "%s\n", usage); + return 4; + } else if (flags & FLAG_SILLY_H) { + fprintf(stderr, "%s\n", usage); + return 5; + } + + /* + * count as directed - 1 Muha .. 2 Muhaha .. 3 Muhahaha ... + */ + (void) count(flags); + + /* + * All Done!!! All Done!!! -- Jessica Noll, age 2 + */ + return 0; +} diff --git a/2019/adamovsky/prog.c b/2019/adamovsky/prog.c new file mode 100644 index 000000000..93e7936ee --- /dev/null +++ b/2019/adamovsky/prog.c @@ -0,0 +1,62 @@ +#define j(n,r,i) A*n=R(r[i].a);// +#define E X("syntax error\n",1)// + #define d(n) A*n(A*x,A*y)// + #define k(d,v) D(d);e v;// + #define F X("fail\n",-1)// + #define h(n) A*n(A*x)// + #include // + #define u(n) n[0].l// + #include // + #define w union A// + #define e return// + #define N 5// + #define q c=getc(p)// + #define o(i,v) [i]={[1].p=v},// + #define m(i,I,n) [i]={{I},[1].l=n},// + #define g(n) A*r=C(&(A){.l=n});r[1].a=// +#define s(x,y,i,q,n,o) if(x[3].a){if(u(x)==rT||u(x)==rC){i;if(q)k(y,x)}g(n)y;o;r[3].a=x;e r;}// +// +void X(char*f,int r){ fputs(f,stderr);exit(r);}typedef w{w* (*t) (w*x);w* (*l) (w*x,w*y);w*a;long long p;}A;h(R) {x[N-1].p++;e x;}h(Ch) ;h(Y) ;h(fA) ;d(fD) ;d(fT) ;d(fW) ;d(fCh) ;d(rA2) ;d(fA2) ;d(rY2) ;d(Y2) ;d(rS2) ;d(fS22) ;d(rD) ;d(rE) ;d(rT) ;d(rC) ;void D(A*f) {if(f&&!--f[N-1].p) {if(u(f)!=fW&&u(f)!=fCh) D(f[1].a);if(u(f)!=fT) D(f[2].a);if(u(f)!=rE&&u(f)!=rT&&u(f)!=rC) D(f[3].a);free(f);}}int ch=EOF,c;FILE*p;A T[256][2];void U(void) {do{if(c==EOF) e;if(T[c][0].t) e;if(!T[c][1].p) E;if(T[c][1].p==4) for(/**??/ +/ +q;c!='\n'&&c!=EOF;q);q;}while(1);}A*I(void){if(c==EOF)E;A*f=T[c];if +(f[0].t!=Ch){q;U();}e f[0].t(&f[1]);}h(C){A*r=malloc(sizeof(A[N])); +if(!r) X("memory error\n",-2); r[0]=*x; for(int i=1;i +#include + +void X(char* m, int s) { + fputs(m, stderr); + exit(s); +} + +void E() { + X("syntax error\n", 1); +} + +void F() { + X("fail\n", -1); +} + +typedef union Argument { + union Argument* (*init)(union Argument* f); + union Argument* (*call)(union Argument* f, union Argument* x); + union Argument* a; + char c; + long p; + size_t n; +} Argument; + +#define NUMBER_OF_ARGUMENTS 5 + +static inline Argument* Reference(Argument* f) { + f[NUMBER_OF_ARGUMENTS-1].n++; + return f; +} + +Argument* Char(Argument* f); +Argument* Apply(Argument* f); +Argument* fA(Argument* f); +Argument* fD(Argument* f, Argument* x); +Argument* fCont(Argument* f, Argument* x); +Argument* fW(Argument* f, Argument* x); +Argument* fCh(Argument* f, Argument* x); +Argument* rA1(Argument* s, Argument* x); +Argument* rA2(Argument* s, Argument* x); +Argument* rApply1(Argument* s, Argument* x); +Argument* rApply2(Argument* s, Argument* x); +Argument* rS1(Argument* s, Argument* x); +Argument* rS2(Argument* s, Argument* x); +Argument* rD(Argument* s, Argument* x); +Argument* rC(Argument* f, Argument* x); +Argument* rCont(Argument* f, Argument* x); +Argument* rE(Argument* f, Argument* x); + +static inline void Dereference(Argument* f) { + if(f && !--f[NUMBER_OF_ARGUMENTS-1].n) { + if(f[0].call!=fW && f[0].call!=fCh) Dereference(f[1].a); + if(f[0].call!=fCont) Dereference(f[2].a); + if(f[0].call!=rC && f[0].call!=rCont && f[0].call!=rE) Dereference(f[3].a); + free(f); + } +} + +int ch=EOF, c; +FILE *p, *o=NULL; +static Argument T[256][2]; + +void Next(void) { + do { + if(c==EOF) return; + if(T[c][0].init) return; + if(!T[c][1].c) E(); + if(T[c][1].c=='c') for(c=getc(p); c!='\n'&&c!=EOF; c=getc(p)); + c = getc(p); + } while(1); +} + +Argument* I(void) { + if(c==EOF) E(); + Argument* f = T[c]; + if(f[0].init!=Char) { + c = getc(p); + Next(); + } + return f[0].init(&f[1]); +} + +Argument* Create(Argument* f) { + Argument* record = malloc(sizeof(Argument[NUMBER_OF_ARGUMENTS])); + if(!record) X("memory error\n", -2); + record[0] = *f; + for(int i=1; i3) F(); + p = fopen(argv[1],"rb"); + if(!p) F(); + c = getc(p); + Next(); + if(argc==3) { + o = fopen(argv[2],"wb"); + if(!o) F(); + } else o = stderr; + while(c!=EOF) { + Argument* f = I(); + while(f[3].a) { + if(f[0].call==rCont) { + f = f[1].a[0].call(Reference(f[1].a), f); + } else if(f[0].call==rE) { + T[96][0].init = Apply; + Argument* r = Reference(f[1].a); + Dereference(f); + f = r; + } else { + Argument* r = Create(&(Argument){ .call=fCont }); + r[1].a = f; + r[2].p = ftell(p)+(c==EOF); + f = f[0].call(Reference(f), r); + } + } + if(o) { + Output(f); + fputc('\n', o); + fflush(o); + } + Dereference(f); + } + return 0; +} + +Argument* Char(Argument* f) { + Argument* r = Create(f); + c = getc(p); + if(c==EOF) E(); + r[1].c = c; + c = getc(p); + Next(); + return r; +} + +Argument* NewLine(Argument* f) { + Argument* r = Create(f); + r[1].c = '\n'; + return r; +} + +Argument* rCont(Argument* f, Argument* x) { + Argument* r = Reference(f[2].a); + Dereference(x); + Dereference(f); + return r; +} + +Argument* fD0(Argument* f, Argument* x) { + Argument* r = Create(&(Argument){ .call=fD }); + r[1].a = x; + Dereference(f); + return r; +} + +Argument* fA2(Argument* x, Argument*y) { + if(y[3].a) { + if(y[0].call==rCont || y[0].call==rE) { + Dereference(x); + return y; + } + Argument* r = Create(&(Argument){ .call=rA2 }); + r[1].a = x; + r[3].a = y; + return r; + } + return x[0].call(x, y); +} + +Argument* rA2(Argument* s, Argument* x) { + Argument* a = Reference(s[1].a); + Argument* b = Reference(s[3].a); + Dereference(s); + return fA2(a, b[0].call(b, x)); +} + +Argument* fA1(Argument* f, Argument* x) { + if(x[3].a) { + if(x[0].call==rCont || x[0].call==rE) return x; + Argument* r = Create(&(Argument){ .call=rA1 }); + r[1].a = f; + r[3].a = x; + return r; + } + if(x[0].call==fD0) { + Argument* r = Create(&(Argument){ .call=fD }); + r[1].a = Reference(f[2].a); + Dereference(x); + Dereference(f); + return r; + } + Argument* y = fA(f[2].a); + Dereference(f); + return fA2(x, y); +} + +Argument* rA1(Argument* s, Argument* x) { + Argument* f = Reference(s[1].a); + Argument* a = Reference(s[3].a); + Dereference(s); + return fA1(f, a[0].call(a, x)); +} + +Argument* fA(Argument* f) { + Reference(f); + if(f[0].init!=fA) return f; + return fA1(f, fA(f[1].a)); +} + +Argument* fD1(Argument* a, Argument* x) { + if(a[3].a) { + if(a[0].call==rCont || a[0].call==rE) { + Dereference(x); + return a; + } + Argument* r = Create(&(Argument){ .call=rD }); + r[1].a = x; + r[3].a = a; + return r; + } + return a[0].call(a, x); +} + +Argument* rD(Argument* s, Argument* x) { + Argument* a = Reference(s[3].a); + Argument* y = Reference(s[1].a); + Dereference(s); + return fD1(a[0].call(a, x), y); +} + +Argument* fD(Argument* f, Argument* x) { + Argument* a = fA(f[1].a); + Dereference(f); + return fD1(a, x); +} + +Argument* ApplyInit(Argument* f) { + (void)f; + Argument* r = Create(&(Argument){ .init=fA }); + r[1].a = I(); + r[2].a = I(); + return r; +} + +Argument* ApplyExit(Argument* f) { + (void)f; + Dereference(I()); + return I(); +} + +Argument* Apply2(Argument* x, Argument* y) { + if(y[3].a) { + if(y[0].call==rCont || y[0].call==rE) { + Dereference(x); + return y; + } + Argument* r = Create(&(Argument){ .call=rApply2 }); + r[1].a = x; + r[3].a = y; + return r; + } + return x[0].call(x, y); +} + +Argument* rApply2(Argument* s, Argument* x) { + Argument* a = Reference(s[1].a); + Argument* b = Reference(s[3].a); + Dereference(s); + return Apply2(a, b[0].call(b, x)); +} + +Argument* Apply1(Argument* x) { + if(x[3].a) { + if(x[0].call==rCont) return x; + if(x[0].call==rE) { + Dereference(I()); + return x; + } + Argument* r = Create(&(Argument){ .call=rApply1 }); + r[3].a = x; + return r; + } + if(x[0].call!=fD0) return Apply2(x, I()); + Dereference(x); + T[96][0].init = ApplyInit; + Argument* r = Create(&(Argument){ .call=fD }); + r[1].a = I(); + T[96][0].init = Apply; + return r; +} + +Argument* rApply1(Argument* s, Argument* x) { + Argument* a = Reference(s[3].a); + Dereference(s); + return Apply1(a[0].call(a, x)); +} + +Argument* Apply(Argument* f) { + (void)f; + return Apply1(I()); +} + +Argument* fK1(Argument* f, Argument* x) { + Argument* r = Reference(f[1].a); + Dereference(x); + Dereference(f); + return r; +} + +Argument* fK0(Argument* f, Argument* x) { + Argument* r = Create(&(Argument){ .call=fK1 }); + r[1].a = x; + Dereference(f); + return r; +} + +Argument* fS22(Argument* a, Argument* b) { + if(b[3].a) { + if(b[0].call==rCont || b[0].call==rE) { + Dereference(a); + return b; + } + Argument* r = Create(&(Argument){ .call=rS2 }); + r[1].a = a; + r[3].a = b; + return r; + } + return a[0].call(a, b); +} + +Argument* rS2(Argument* s, Argument* x) { + Argument* a = Reference(s[1].a); + Argument* b = Reference(s[3].a); + Dereference(s); + return fS22(a, b[0].call(b, x)); +} + +Argument* fS21(Argument* f, Argument* a, Argument* x) { + if(a[3].a) { + if(a[0].call==rCont || a[0].call==rE) { + Dereference(x); + Dereference(f); + return a; + } + Argument* r = Create(&(Argument){ .call=rS1 }); + r[1].a = f; + r[2].a = x; + r[3].a = a; + return r; + } + if(a[0].call==fD0) { + Argument* r = Create(&(Argument){ .call=fD }); + r[1].a = Create(&(Argument){ .init=fA }); + r[1].a[1].a = Reference(f[2].a); + r[1].a[2].a = x; + Dereference(f); + return r; + } + Argument* b = Reference(f[2].a); + Dereference(f); + return fS22(a, b[0].call(b, x)); +} + +Argument* rS1(Argument* s, Argument* x) { + Argument* a = Reference(s[3].a); + Argument* y = Reference(s[2].a); + Argument* f = Reference(s[1].a); + Dereference(s); + return fS21(f, a[0].call(a, x), y); +} + +Argument* fS2(Argument* f, Argument* x) { + Argument* a = Reference(f[1].a); + Reference(x); + return fS21(f, a[0].call(a, x), x); +} + +Argument* fS1(Argument* f, Argument* x) { + Argument* r = Create(&(Argument){ .call=fS2 }); + r[1].a = Reference(f[1].a); + r[2].a = x; + Dereference(f); + return r; +} + +Argument* fS0(Argument* f, Argument* x) { + Argument* r = Create(&(Argument){ .call=fS1 }); + r[1].a = x; + Dereference(f); + return r; +} + +Argument* fI(Argument* f, Argument* x) { + Dereference(f); + return x; +} + +Argument* fV(Argument* f, Argument* x) { + Dereference(x); + return f; +} + +Argument* fW(Argument* f, Argument* x) { + putc(f[1].c, stdout); + Dereference(f); + return x; +} + +Argument* fR(Argument* f, Argument* x) { + ch = getc(stdin); + Argument* r = Create(&(Argument){ .call=ch!=EOF?fI:fV }); + Dereference(f); + return x[0].call(x, r); +} + +Argument* fCh(Argument* f, Argument* x) { + Argument* r = Create(&(Argument){ .call=ch==f[1].c?fI:fV }); + Dereference(f); + return x[0].call(x, r); +} + +Argument* fP(Argument* f, Argument* x) { + Argument* r = Create(&(Argument){ .call=ch!=EOF?fW:fV }); + if(ch!=EOF) r[1].c = ch; + Dereference(f); + return x[0].call(x, r); +} + +Argument* rC(Argument* f, Argument* x) { + if(x[3].a==x) return x[0].call(x, f); + Argument* r = Reference(f[1].a); + Dereference(f); + return r[0].call(r, x); +} + +Argument* fC(Argument* f, Argument* x) { + Argument* r = Create(&(Argument){ .call=rC }); + r[1].a = x; + r[3].a = r; + Dereference(f); + return r; +} + +Argument* fCont(Argument* f, Argument* x) { + Argument* r = Create(&(Argument){ .call=rCont }); + r[1].a = Reference(f[1].a); + r[2].a = x; + r[3].a = r; + if(fseek(p, f[2].p-1, SEEK_SET)) F(); + c = getc(p); + Next(); + Dereference(f); + return r; +} + +Argument* rE(Argument* f, Argument* x) { + (void)f; + return x; +} + +Argument* fE(Argument* f, Argument* x) { + Argument* r = Create(&(Argument){ .call=rE }); + r[1].a = x; + r[3].a = r; + T[96][0].init = ApplyExit; + Dereference(f); + return r; +} + +static Argument T[256][2] = { + [9]={ [1].c='s' }, //\t + [10]={ [1].c='s' }, //\n + [11]={ [1].c='s' }, //\v + [12]={ [1].c='s' }, //\f + [13]={ [1].c='s' }, //\r + [32]={ [1].c='s' }, //' ' + [35]={ [1].c='c' }, //# + [46]={ {Char}, [1].call=fW }, //. + [63]={ {Char}, [1].call=fCh }, //? + [64]={ {Create}, [1].call=fR }, //@ + [96]={ {Apply} }, //` + [99]={ {Create}, [1].call=fC }, //c + [100]={ {Create}, [1].call=fD0 }, //d + [101]={ {Create}, [1].call=fE }, //e + [105]={ {Create}, [1].call=fI }, //i + [107]={ {Create}, [1].call=fK0 }, //k + [114]={ {NewLine}, [1].call=fW }, //r + [115]={ {Create}, [1].call=fS0 }, //s + [118]={ {Create}, [1].call=fV }, //v + [124]={ {Create}, [1].call=fP }, //| +}; + +void Output(Argument* f) { + if(f[0].call==fK0) { fputc('k', o); + } else if(f[0].call==fK1) { + fprintf(o, "`k"); + Output(f[1].a); + } else if(f[0].call==fS0) { fputc('s', o); + } else if(f[0].call==fS1) { + fprintf(o, "`s"); + Output(f[1].a); + } else if(f[0].call==fS2) { + fprintf(o, "``s"); + Output(f[1].a); + Output(f[2].a); + } else if(f[0].call==fI) { fputc('i', o); + } else if(f[0].call==fV) { fputc('v', o); + } else if(f[0].call==fW) { + if(f[1].c=='\n') fputc('r', o); else { + fputc('.', o); + fputc(f[1].c, o); + } + } else if(f[0].call==fR) { fputc('@', o); + } else if(f[0].call==fCh) { + fputc('?', o); + fputc(f[1].c, o); + } else if(f[0].call==fP) { fputc('|', o); + } else if(f[0].call==fC) { fputc('c', o); + } else if(f[0].call==fE) { fputc('e', o); + } else if(f[0].call==fD0) { fputc('d', o); + } else if(f[0].call==fD) { + fprintf(o, "`d"); + Output(f[1].a); + } else if(f[0].init==fA) { + fputc('`', o); + Output(f[1].a); + Output(f[2].a); + } else if(f[0].call==fCont) { + fprintf(o, "", f[2].p); + } else { + fprintf(o, ""); + } +} diff --git a/2019/adamovsky/sierpinski.unl b/2019/adamovsky/sierpinski.unl new file mode 100644 index 000000000..309cc875d --- /dev/null +++ b/2019/adamovsky/sierpinski.unl @@ -0,0 +1,5 @@ +```ci``s``s`ks``s`k`s``s`kc``s``s``si`kr`k. `k.*k +`k``s``s``s``s`s`k`s``s`ksk`k``s``si`kk`k``s`kkk +`k``s`k`s``si`kk``s`kk``s``s``s``si`kk`k`s`k`s``s`ksk`k`s`k`s`k`si``si`k`ki +`k``s`k`s``si`k`ki``s`kk``s``s``s``si`kk`k`s`k`s`k`si`k`s`k`s``s`ksk``si`k`ki +`k`ki``s`k`s`k`si``s`kkk diff --git a/2019/adamovsky/spam.unl b/2019/adamovsky/spam.unl new file mode 100644 index 000000000..6df2c2fd7 --- /dev/null +++ b/2019/adamovsky/spam.unl @@ -0,0 +1 @@ +``ci``s``s`kr``s``s``s``s`k.S`k.P`k.A`k.Mii diff --git a/2019/burton/256 b/2019/burton/256 new file mode 100644 index 000000000..a73e4f953 Binary files /dev/null and b/2019/burton/256 differ diff --git a/2019/burton/Makefile b/2019/burton/Makefile new file mode 100644 index 000000000..874f831a7 --- /dev/null +++ b/2019/burton/Makefile @@ -0,0 +1,538 @@ +#!/usr/bin/env make +# +# 2019 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + +############################# +# shell used by this Makefile +############################# +# +SHELL= /bin/bash + +####################### +# common tool locations +####################### +# +A2P= a2p +AR= ar +ASA= asa +AT= at +ATQ= atq +ATRM= atrm +AWK= awk +BANNER= banner +BASE64= base64 +BASENAME= basename +BATCH= batch +BC= bc +BINHEX= binhex +BISON= bison +BUNZIP2= bunzip2 +BZCAT= bzcat +BZCMP= bzcmp +BZDIFF= bzdiff +BZEGREP= bzegrep +BZFGREP= bzfgrep +BZGREP= bzgrep +BZIP2= bzip2 +BZLESS= bzless +BZMORE= bzmore +C2PH= c2ph +C89= c89 +C99= c99 +CAL= cal +CALC= calc +CAT= cat +CD= cd +CHFLAGS= chflags +CHGRP= chgrp +CHMOD= chmod +CKSUM= cksum +CLANG= clang +CLANG_PLUSPLUS= clang++ +CLEAR= clear +CMP= cmp +COL= col +COLLDEF= colldef +COLRM= colrm +COLUMN= column +COMPRESS= compress +CP= cp +CPIO= cpio +CPP= cpp +CRC32= crc32 +CSH= csh +CSPLIT= csplit +CURL= curl +CUT= cut +C_PLUSPLUS= c++ +C_PLUSPLUS_FILT= c++filt +DATE= date +DC= dc +DD= dd +DF= df +DIFF3= diff3 +DIFF= diff +DIG= dig +DIRNAME= dirname +ED= ed +EGREP= egrep +ENV= env +EQN= eqn +ETAGS= etags +EXPECT= expect +EXPR= expr +FALSE= false +FGREP= fgrep +FILE= file +FIND2PERL= find2perl +FIND= find +FLEX= flex +FLEX_PLUSPLUS= flex++ +FMT= fmt +FOLD= fold +FS_USAGE= fs_usage +FUNZIP= funzip +FUSER= fuser +GCC= gcc +GDIFFMK= gdiffmk +GENCAT= gencat +GENSTRINGS= genstrings +GETOPT= getopt +GETOPTS= getopts +GNUMAKE= gnumake +GREP= grep +GROFF= groff +GROFFER= groffer +GROG= grog +GROPS= grops +GROTTY= grotty +GUNZIP= gunzip +GVIM= gvim +GZCAT= gzcat +GZEXE= gzexe +GZIP_PROG= gzip +G_PLUSPLUS= g++ +H2PH= h2ph +H2XS= h2xs +HASH= hash +HEAD= head +HOSTNAME_PROG= hostname +ICONV= iconv +ID= id +INDENT= indent +INFO= info +JOT= jot +KILL= kill +KSH= ksh +LAST= last +LD= ld +LESSECHO= lessecho +LEX= len +LINK= link +LN= ln +LS= ls +M4= m4 +MAKE= make +MAN= man +MKDIR= mkdir +MKFIFo= mkfifo +MKTEMP= mktemp +MV= mv +NANO= nano +NASM= nasm +NEQN= neqn +NICE= nice +NL= nl +NM= nm +NOHUP= nohup +NROFF= nroff +NSLOOKUP= nslookup +OD= od +OPENSSL= openssl +PASTE= paste +PATCH= patch +PATHCHK= pathchk +PAX= pax +PERL= perl +PICO= pico +PR= pr +PRINTENV= printenv +PS= ps +PTAR= ptar +PTARDIFF= ptardiff +PTARGREP= ptargrep +PWD= pwd +PYDOC= pydoc +PYTHON= python +PYTHONW= pythonw +READLINK= readlink +RENICE= renice +RESET= reset +REV= rev +RI= ri +RM= rm +RMDIR= rmdir +RSYNC= rsync +RUBY= ruby +RVIM= rvim +SAY= say +SCP= scp +SCREEN= screen +SCRIPT= script +SDIFF= sdiff +SED= sed +SEQ= seq +SFTP= sftp +SH= sh +SHA1= sha1 +SHA= sha +SHAR= shar +SHASUM5_18= shasum5.18 +SHASUM= shasum +SIZE= size +SLEEP= sleep +SORT= sort +SSH= ssh +STAT= stat +STRIP= strip +STTY= stty +SUM= sum +SYNC= sync +TABS= tabs +TAIL= tail +TAR= tar +TEE= tee +TEST= test +TFTP= tftp +TIDY= tidy +TIME= time +TOP= top +TOUCH= touch +TPUT= tout +TPUT= tput +TR= tr +TROFF= troff +TRUE= true +TSET= tset +TSORT= tsort +UL= ul +UNAME= uname +UNCOMPRESS= uncompress +UNEXPAND= unexpand +UNIFDEF= unifdef +UNIFDEFALL= unifdefall +UNIQ= uniq +UNITS= units +UNLINK= unlink +UNZIP= unzip +UNZIPSFX= unzipsfx +UPTIME= uptime +UUDECODE= uudecode +UUENCODE= uuencode +UUIDGEN= uuidgen +VI= vi +VIEW= view +VIM= vim +VIMDIFF= vimdiff +W= w +WAIT4PATH= wait4path +WAIT= wait +WC= wc +WHAT= what +WHATIS= whatis +WHICH= which +WHO= who +WHOAMI= whoami +WHOIS= whois +WRTIE= write +XAR= xar +XARGS= xargs +XATTR= xattr +XXD= xxd +YACC= yacc +YES= yes +ZCAT= zcat +ZCMP= zcmp +ZDIFF= zdiff +ZEGREP= zegrep +ZFGREP= zfgrep +ZFORCE= zforce +ZGREP= zgrep +ZIP= zip +ZIPCLOAK= zipcloak +ZIPGREp= zipgrep +ZIPINFo= zipinfo +ZIPNOTE= zipnote +ZIPSPLIT= zipsplit +ZLESS= zless +ZMORE= zmore +ZNEW= znew +ZPRINT= zprint +ZSH= zsh + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +#CSILENCE= -Wno-implicit-int +CSILENCE= -Wno-implicit-int -Wno-missing-variable-declarations -Wno-parentheses + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=26 + +# include files that are needed to compile +# +#CINCLUDE= +#CINCLUDE= -include stdlib.h +CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o prog.clean.o +DATA= +TARGET= prog prog.clean correct remarks +# +ALT_OBJ= +ALT_TARGET= + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +prog.clean: prog.clean.c + ${CC} ${CSTD} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} $< -o $@ ${LIBS} + +remarks: remarks.markdown + ${CP} $? $@ + +correct: newlines remarks 256 check + @env out=${CAT} ${SHELL} ./check ${WC} > $@ + +test: prog prog.clean correct check + -${SHELL} ./check ./prog + -${SHELL} ./check ./prog.clean + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic fc6b6af226b7cc598de3d48fc20ed0bd54f7b4f7f0f651a32b9cf8345b2a3b3f --FNV1a_hash_512_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --level 391581 --mode 216193 --FNV1a_hash_512_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore IAU, $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore, $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2019/burton/check b/2019/burton/check new file mode 100644 index 000000000..cdfe073fc --- /dev/null +++ b/2019/burton/check @@ -0,0 +1,17 @@ +#!/bin/sh + +x=$1 +: ${x:=prog} + +: ${out:="diff - correct"} + +( +/bin/echo -n | $x +$x < /dev/null +echo | $x +/bin/echo -n a | $x +echo a | $x +$x < newlines +$x < 256 +$x < remarks +) | $out diff --git a/2019/burton/cow b/2019/burton/cow new file mode 100644 index 000000000..c9f2949f1 --- /dev/null +++ b/2019/burton/cow @@ -0,0 +1,19 @@ +#!/bin/sh + +if test $# -eq 0; then + ./prog + exit 0 +fi + +args=$* +for name in $args +do if test -r $name; then + s=$(./prog < $name) + echo "$s" $name + set -- $s + ((a += $1)) + ((b += $2)) + ((c += $3)) + ((d += 1)) +fi; done +((d > 1)) && printf "%8d%8d%8d total\n" $a $b $c diff --git a/2019/burton/hint.html b/2019/burton/hint.html new file mode 100644 index 000000000..a23b9df3d --- /dev/null +++ b/2019/burton/hint.html @@ -0,0 +1,109 @@ + + + + + + Best one-liner + + +

    Best one-liner

    + +

    Dave Burton

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    + +

    Try:

    + +
    ./prog < prog.c
    +
    + +

    Selected Judges Remarks:

    + +

    A tiny, but punctually correct way of POSIX counting for text files. This one +line, one word, 127 character beauty continues to expand the number of classic +unix utilities available as winning entries.

    + +

    Author’s comments:

    + +

    Synopsis

    + +

    Feed it anything on stdin.
    +The output should look familiar.

    + +

    Compiles cleanly with:

    + +
    WARN="-Wno-implicit-int -Wno-missing-variable-declarations -Wno-parentheses"
    +clang -Wall -Wextra -Weverything -pedantic $WARN -include stdio.h -o prog prog.c
    +
    + +

    Description

    + +

    Included is a test script, useful for the corner cases. +As in all good Unix programs, it is silent upon success; any output demonstrates an error. +Instead of checking correctness, the check script can simply output the results:
    +(The Makefile contains the spoiler):

    + +
    out=cat ./check ./prog
    +
    + +

    Interestingly, and a spoiler here: MacOS and FreeBSD implement the common utility “correctly”. +Centos and Ubuntu both share a “flawed” utility that changes output format based upon input redirection or pipeline(!). +As well, the latter two also behave slightly differently on what they count as whitespace: +\a and \b are both counted whitespace(!), even though the relevant man pages on these systems +omit these characters from the description.

    + +

    This program follows FreeBSD and MacOS, the arbiters of correct for these purposes.

    + +

    Limits

    + +

    Requires the C locale and ASCII character set.
    +Input should be less than ten million octets toavoidthisproblem.

    + +

    See Also

    + +

    You can enjoy this code from beginning to end.
    +No whitespace was harmed in the creation of this program.
    +All your base belong to us, but the constants seem a bit … off?

    + +

    Bonus

    + +

    The script cow provides a closer analog, and perhaps a more useful interface.

    + +

    Included is a version without compilation warnings:

    + +
    clang -Wall -Wextra -Weverything -pedantic -include stdio.h -o prog.clean prog.clean.c
    +
    + +

    Bugs

    + +

    The flags are not supported. Although they could easily be added into cow. +This exercise left to the reader.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2019, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2019/burton/hint.text b/2019/burton/hint.text new file mode 100644 index 000000000..9d2ea19a1 --- /dev/null +++ b/2019/burton/hint.text @@ -0,0 +1,81 @@ +# Best one-liner + +Dave Burton + + +## Judges' comments: +### To use: + + make + +### Try: + + ./prog < prog.c + +### Selected Judges Remarks: + +A tiny, but punctually correct way of POSIX counting for text files. This one +line, one word, 127 character beauty continues to expand the number of classic +unix utilities available as winning entries. + +## Author's comments: +Synopsis +-------- + +Feed it anything on stdin. +The output should look familiar. + +Compiles cleanly with: + + WARN="-Wno-implicit-int -Wno-missing-variable-declarations -Wno-parentheses" + clang -Wall -Wextra -Weverything -pedantic $WARN -include stdio.h -o prog prog.c + +Description +----------- +Included is a test script, useful for the corner cases. +As in all good Unix programs, it is silent upon success; any output demonstrates an error. +Instead of checking correctness, the check script can simply output the results: +(The Makefile contains the spoiler): + + out=cat ./check ./prog + +Interestingly, and a spoiler here: MacOS and FreeBSD implement the common utility "correctly". +Centos and Ubuntu both share a "flawed" utility that changes output format based upon input redirection or pipeline(!). +As well, the latter two also behave slightly differently on what they count as whitespace: +\a and \b are both counted whitespace(!), even though the relevant man pages on these systems +omit these characters from the description. + +This program follows FreeBSD and MacOS, the arbiters of correct for these purposes. + +Limits +------ +Requires the C locale and ASCII character set. +Input should be less than ten million octets toavoidthisproblem. + +See Also +-------- +You can enjoy this code from beginning to end. +No whitespace was harmed in the creation of this program. +All your base belong to us, but the constants seem a bit ... off? + +Bonus +----- +The script `cow` provides a closer analog, and perhaps a more useful interface. + +Included is a version without compilation warnings: + + clang -Wall -Wextra -Weverything -pedantic -include stdio.h -o prog.clean prog.clean.c + +Bugs +---- +The flags are not supported. Although they could easily be added into `cow`. +This exercise left to the reader. + +-------------------------------------------------------------------------------- + diff --git a/2019/burton/newlines b/2019/burton/newlines new file mode 100644 index 000000000..b28b04f64 --- /dev/null +++ b/2019/burton/newlines @@ -0,0 +1,3 @@ + + + diff --git a/2019/burton/on.one.liners b/2019/burton/on.one.liners new file mode 100644 index 000000000..e76855024 --- /dev/null +++ b/2019/burton/on.one.liners @@ -0,0 +1,42 @@ +On Writing An IOCCC One-Liner + +There is a tug-of-war when writing a one-liner between obscurity +and length. On the one hand, one-liners are often obscure in nature, +simply by doing so much with so little. As well, the reduction of +interesting logic into a single line typically involves transformations +that tend to obscure the logic in the hunt for fewer bytes. + +Sometimes, the minimalist logic can be easily deciphered because +of the simplified logic required to get it into one line, and due +to the almost necessary reliance on stdlib routines to do the heavy +lifting. printf, scanf, getchar, putchar, atoi, isspace, isdigit, +are succinct but explicit size-reducing functions, and may sometimes +open an unwanted window on the nature of the otherwise obscured logic. + +The flip-side, replacing these routines, invariably requires more +bytes. So what is a one-liner-writer to do when confronted by such +a choice? Therein lies the art form, and the risk: the additional +obscurity requiring additional bytes may push a one-liner close to +or over the limit. Fewer bytes is generally better, until it is not. + +Further, the predilections of the judges may change daily, for all +this author knows. The guidelines are opaque on purpose. So brevity, +or better obscurity? Both if at all possible, but perhaps at some +risk for being juuuuuust too long, or not quiiiiiiite obscure enough. + +Finally, the desire for clean compilation is almost anathema to an +obscure one-liner. The extra characters of the types and storage +classes, which are historically implicit, but made explicit to +silence modern compilers, tend to occupy the very precious bytes +left in the one-liner budget. + +It is a fun challenge to write something "interesting" within the +draconian budget. As history has shown, most years someone conceives +of something clever enough. This year, the present author is hopeful +the artistic balance is deemed favorable, and is interesting to the +world at large. But if not, it was still fun to write -- and with no +small amount of angst for the final form of the entry, of which there +were several different attempts at the same algorithm, each with +different compromises in logic, expression, and obscurity mechanisms. + +Because there is a tug-of-war between obscurity and brevity. diff --git a/2019/burton/prog.c b/2019/burton/prog.c new file mode 100644 index 000000000..c146f2448 --- /dev/null +++ b/2019/burton/prog.c @@ -0,0 +1 @@ +e,n,j,o,y;main(){for(++o;n=-~getchar();e+=11==n,y++)o=n>0xe^012>n&&'`'^n^65?!n:!o?++j:o;printf("%8d%8d%8d\n",e^n,j+=!o&&y,y);} diff --git a/2019/burton/prog.clean.c b/2019/burton/prog.clean.c new file mode 100644 index 000000000..04a73ac23 --- /dev/null +++ b/2019/burton/prog.clean.c @@ -0,0 +1 @@ +static int e,n,j,o,y;int main(){for(++o;(n=-~getchar());e+=11==n,y++)o=n>0xe^012>n&&'`'^n^65?!n:!o?++j:o;printf("%8d%8d%8d\n",e^n,j+=!o&&y,y);} diff --git a/2019/ciura/Makefile b/2019/ciura/Makefile new file mode 100644 index 000000000..a2aa4f208 --- /dev/null +++ b/2019/ciura/Makefile @@ -0,0 +1,526 @@ +#!/usr/bin/env make +# +# 2019 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + +############################# +# shell used by this Makefile +############################# +# +SHELL= /bin/bash + +####################### +# common tool locations +####################### +# +A2P= a2p +AR= ar +ASA= asa +AT= at +ATQ= atq +ATRM= atrm +AWK= awk +BANNER= banner +BASE64= base64 +BASENAME= basename +BATCH= batch +BC= bc +BINHEX= binhex +BISON= bison +BUNZIP2= bunzip2 +BZCAT= bzcat +BZCMP= bzcmp +BZDIFF= bzdiff +BZEGREP= bzegrep +BZFGREP= bzfgrep +BZGREP= bzgrep +BZIP2= bzip2 +BZLESS= bzless +BZMORE= bzmore +C2PH= c2ph +C89= c89 +C99= c99 +CAL= cal +CALC= calc +CAT= cat +CD= cd +CHFLAGS= chflags +CHGRP= chgrp +CHMOD= chmod +CKSUM= cksum +CLANG= clang +CLANG_PLUSPLUS= clang++ +CLEAR= clear +CMP= cmp +COL= col +COLLDEF= colldef +COLRM= colrm +COLUMN= column +COMPRESS= compress +CP= cp +CPIO= cpio +CPP= cpp +CRC32= crc32 +CSH= csh +CSPLIT= csplit +CURL= curl +CUT= cut +C_PLUSPLUS= c++ +C_PLUSPLUS_FILT= c++filt +DATE= date +DC= dc +DD= dd +DF= df +DIFF3= diff3 +DIFF= diff +DIG= dig +DIRNAME= dirname +ED= ed +EGREP= egrep +ENV= env +EQN= eqn +ETAGS= etags +EXPECT= expect +EXPR= expr +FALSE= false +FGREP= fgrep +FILE= file +FIND2PERL= find2perl +FIND= find +FLEX= flex +FLEX_PLUSPLUS= flex++ +FMT= fmt +FOLD= fold +FS_USAGE= fs_usage +FUNZIP= funzip +FUSER= fuser +GCC= gcc +GDIFFMK= gdiffmk +GENCAT= gencat +GENSTRINGS= genstrings +GETOPT= getopt +GETOPTS= getopts +GNUMAKE= gnumake +GREP= grep +GROFF= groff +GROFFER= groffer +GROG= grog +GROPS= grops +GROTTY= grotty +GUNZIP= gunzip +GVIM= gvim +GZCAT= gzcat +GZEXE= gzexe +GZIP_PROG= gzip +G_PLUSPLUS= g++ +H2PH= h2ph +H2XS= h2xs +HASH= hash +HEAD= head +HOSTNAME_PROG= hostname +ICONV= iconv +ID= id +INDENT= indent +INFO= info +JOT= jot +KILL= kill +KSH= ksh +LAST= last +LD= ld +LESSECHO= lessecho +LEX= len +LINK= link +LN= ln +LS= ls +M4= m4 +MAKE= make +MAN= man +MKDIR= mkdir +MKFIFo= mkfifo +MKTEMP= mktemp +MV= mv +NANO= nano +NASM= nasm +NEQN= neqn +NICE= nice +NL= nl +NM= nm +NOHUP= nohup +NROFF= nroff +NSLOOKUP= nslookup +OD= od +OPENSSL= openssl +PASTE= paste +PATCH= patch +PATHCHK= pathchk +PAX= pax +PERL= perl +PICO= pico +PR= pr +PRINTENV= printenv +PS= ps +PTAR= ptar +PTARDIFF= ptardiff +PTARGREP= ptargrep +PWD= pwd +PYDOC= pydoc +PYTHON= python +PYTHONW= pythonw +READLINK= readlink +RENICE= renice +RESET= reset +REV= rev +RI= ri +RM= rm +RMDIR= rmdir +RSYNC= rsync +RUBY= ruby +RVIM= rvim +SAY= say +SCP= scp +SCREEN= screen +SCRIPT= script +SDIFF= sdiff +SED= sed +SEQ= seq +SFTP= sftp +SH= sh +SHA1= sha1 +SHA= sha +SHAR= shar +SHASUM5_18= shasum5.18 +SHASUM= shasum +SIZE= size +SLEEP= sleep +SORT= sort +SSH= ssh +STAT= stat +STRIP= strip +STTY= stty +SUM= sum +SYNC= sync +TABS= tabs +TAIL= tail +TAR= tar +TEE= tee +TEST= test +TFTP= tftp +TIDY= tidy +TIME= time +TOP= top +TOUCH= touch +TPUT= tout +TPUT= tput +TR= tr +TROFF= troff +TRUE= true +TSET= tset +TSORT= tsort +UL= ul +UNAME= uname +UNCOMPRESS= uncompress +UNEXPAND= unexpand +UNIFDEF= unifdef +UNIFDEFALL= unifdefall +UNIQ= uniq +UNITS= units +UNLINK= unlink +UNZIP= unzip +UNZIPSFX= unzipsfx +UPTIME= uptime +UUDECODE= uudecode +UUENCODE= uuencode +UUIDGEN= uuidgen +VI= vi +VIEW= view +VIM= vim +VIMDIFF= vimdiff +W= w +WAIT4PATH= wait4path +WAIT= wait +WC= wc +WHAT= what +WHATIS= whatis +WHICH= which +WHO= who +WHOAMI= whoami +WHOIS= whois +WRTIE= write +XAR= xar +XARGS= xargs +XATTR= xattr +XXD= xxd +YACC= yacc +YES= yes +ZCAT= zcat +ZCMP= zcmp +ZDIFF= zdiff +ZEGREP= zegrep +ZFGREP= zfgrep +ZFORCE= zforce +ZGREP= zgrep +ZIP= zip +ZIPCLOAK= zipcloak +ZIPGREp= zipgrep +ZIPINFo= zipinfo +ZIPNOTE= zipnote +ZIPSPLIT= zipsplit +ZLESS= zless +ZMORE= zmore +ZNEW= znew +ZPRINT= zprint +ZSH= zsh + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} +#CWARN= -W -Wall -Wextra -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +#CSILENCE= -Wno-implicit-int +CSILENCE= -Wno-empty-body -Wno-format-nonliteral -Wno-incompatible-pointer-types-discards-qualifiers -Wno-parentheses -Wno-shorten-64-to-32 -Wno-sign-conversion -Wno-string-plus-int + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=26 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= +ALT_TARGET= + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic fc6b6af226b7cc598de3d48fc20ed0bd54f7b4f7f0f651a32b9cf8345b2a3b3f --FNV1a_hash_512_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --level 391581 --mode 216193 --FNV1a_hash_512_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore IAU, $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore, $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2019/ciura/de.sh b/2019/ciura/de.sh new file mode 100644 index 000000000..c785b1500 --- /dev/null +++ b/2019/ciura/de.sh @@ -0,0 +1,3 @@ +#!/bin/sh +set -x +./getwords.sh de | tr A-ZÄÖÜ a-zäöü | grep .. | ./prog aäbcdefghijklmnoöpqrsßtuüvwxyz diff --git a/2019/ciura/en.sh b/2019/ciura/en.sh new file mode 100644 index 000000000..96620c344 --- /dev/null +++ b/2019/ciura/en.sh @@ -0,0 +1,3 @@ +#!/bin/sh +set -x +./getwords.sh en | grep .. | ./prog abcdefghijklmnopqrstuvwxyz diff --git a/2019/ciura/fr.sh b/2019/ciura/fr.sh new file mode 100644 index 000000000..03f30c85e --- /dev/null +++ b/2019/ciura/fr.sh @@ -0,0 +1,3 @@ +#!/bin/sh +set -x +./getwords.sh fr | ./prog aàâbcdeéèêfghiîjklmnoôpqrstuùûvwxyz\' diff --git a/2019/ciura/getwords.sh b/2019/ciura/getwords.sh new file mode 100644 index 000000000..308479301 --- /dev/null +++ b/2019/ciura/getwords.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +if [ "$#" -ne 1 ]; then + echo "Usage: $0 " + echo "Run (aspell dump dicts) to see the available codes." + exit 2 +fi + +aspell --lang=$1 dump master \ + | aspell --lang=$1 expand \ + | tr ' ' '\n' \ + | sort -u diff --git a/2019/ciura/hint.html b/2019/ciura/hint.html new file mode 100644 index 000000000..c71478529 --- /dev/null +++ b/2019/ciura/hint.html @@ -0,0 +1,191 @@ + + + + + + Most alphabetic + + +

    Most alphabetic

    + +

    Marcin Ciura
    +Twitter: @mciura

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./getwords.sh en | grep .. | ./prog aeiouvwxyz
    +
    + +

    Try:

    + +
    ./getwords.sh en | grep .. | ./prog aeiouhjklmnvwxyz
    +
    +./getwords.sh en | grep .. | ./prog mrjocktvquizphdbagsfewlynx
    +
    +./en.sh
    +
    +./fr.sh
    +
    +./ru.sh
    +
    + +

    Selected Judges Remarks:

    + +

    A few letters, one at a time, with no repeats. +How many different ways can this be done?

    + +

    While a quick brown fox might jump over the lazy dog, +it has too many repeat letters to allow this entry to repeat. +It is better that Mr Jock, TV quiz PhD, bags few lynx.

    + +

    Speaking of jumping, can you rewrite the code to +remote all of the goto jumps in this code?

    + +

    Author’s comments:

    + +

    What is this?

    + +

    This entry reads from standard input a list of words in any language +written with an alphabet and outputs perfect pangrams composed of these +words. A perfect pangram is a series of words that contains every letter +of the alphabet exactly once.

    + +

    Example execution:

    + +
    $ grep .. /usr/share/dict/words | ./prog abcdefghijklmnopqrstuvwxyz
    +qualm fjord wiz pyx vs beg kc nth
    +quartz jinx vs fed kc womb glyph
    +quid jamb fez vs pyx kc growl nth
    +quiz fjord pyx vs bag kc mewl nth
    +quiz fjord pyx vs gab kc mewl nth
    +quiz fjord pyx vs gem bawl kc nth
    +quiz fjord pyx vs meg bawl kc nth
    +quiz fjord vex bawl kc gyp ms nth
    +quiz jamb flex vs kc gyp word nth
    +quiz jamb pyx vs kc flog drew nth
    +quiz jamb pyx vs kc frog lewd nth
    +quiz jamb pyx vs kc frog weld nth
    +quiz jamb pyx vs kc golf drew nth
    +quiz jamb pyx vs kc grew fold nth
    +quiz jamb pyx vs kc grow nth fled
    +quiz jamb pyx vs kc growl fed nth
    +
    + +

    Rearranging the words into more or less meaningful expressions is the +user’s duty.

    + +

    This entry implements Algorithm X (Exact cover via dancing links) +from Section 7.2.2.1 in fascicle 5C of The Art of Computer +Programming by Donald E. Knuth. As of June 2019, you can download an +incomplete draft of the fascicle from Knuth’s +website.

    + +

    Usage

    + +

    prog LETTERS [N] +reads allowed words from standard input and writes perfect pangrams +with at most N words composed of LETTERS to standard output, one +per line. If N is not given, the number of words in the pangrams is +unlimited. The characters in LETTERS must not repeat. The length of +LETTERS must not exceed 97 characters.

    + +

    The exit status is 0 if no error occurred, 1 if the input word list +is too long, and 2 if the command-line arguments are missing.

    + +

    Helper scripts

    + +

    getwords.sh LANGUAGE_CODE +outputs a sorted list of unique words in a given language, one per +line. It requires aspell with a dictionary for LANGUAGE_CODE.

    + +

    wrapprog.py LETTERS [N] +works similarly to prog LETTERS [N] except that it merges +anagrams before passing them to prog and expands them in +prog’s output. This way, it finishes the job faster than +prog when there are millions of perfect pangrams. It requires a +UTF-8 locale.

    + +

    de.sh, en.sh, fr.sh, it.sh, pl.sh, +and ru.sh output German, English, French, Italian, Polish, +and Russian perfect pangrams, respectively. They require a UTF-8 +locale.

    + +

    Miscellaneous remarks

    + +

    I dare submit this entry to categories algorithms, +internationalization (I have not found active use of <wchar.h> +among the programs that won IOCCC in the past), and obscure bugs (see +the questions about Linux core dumps below).

    + +

    To a casual eye, this entry may look similar to +2005 klausler. +However, prog is internationalized and way faster. On my machine, +./klausler abcdefghijklmnopqrstuvwxyz printed only 3,965 perfect +pangrams until I killed it after 144 hours running, while the +equivalent +tr A-Z a-z < /usr/share/dict/words | egrep -v '^[^ais]$' | ./prog abcdefghijklmnopqrstuvwxyz | wc -l +finished in 62 minutes, reporting 1,640,569,315 perfect pangrams, and +the example from section What is this? finished in 1.35 +seconds. On the other hand, prog can only output series of words +with nonrepeating characters, unlike klausler.

    + +

    In contrast to prog.orig.c, prog.c does not call +fflush(stdout) after outputting each line, thus running faster. +I am grateful to Witold Jarnicki for suggesting this change. +The original prog finished the example above in 100 minutes +instead of 62 minutes.

    + +

    If your word list contains meaningless one-letter words, pipe +grep .. [FILE] through prog to eliminate the pangrams that +contain them.

    + +

    According to prog and aspell, some languages, e.g. Spanish, +have no perfect pangrams.

    + +

    Why does yes | ./prog y hang on Linux? Change static int to +int and static wchar_t to wchar_t, and recompile +prog. Why does yes | ./prog y dump core now? Change the line +#define P 9<<23^1 to #define P 9<<23 and recompile +prog. Why does yes | ./prog y exit gracefully?

    + +

    Answer: Nf bs Whar 2019, guhf znavsrfg ohtf va tyvop 2.22–2.29: +1 naq +2.

    + +

    The source code uses goto three times. While it could easily get +by without goto M and goto H, I challenge the adherents of +structured programming to refactor goto T, which jumps back into a +nested if block.

    + +

    With the supplied Makefile, both gcc and clang compile +prog.c without warnings in C11 and C99 mode. For a clean +compilation with gcc -std=c90, add -Wno-format to +CSILENCE in Makefile.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2019, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2019/ciura/hint.text b/2019/ciura/hint.text new file mode 100644 index 000000000..22c5915cd --- /dev/null +++ b/2019/ciura/hint.text @@ -0,0 +1,164 @@ +# Most alphabetic + +Marcin Ciura +Twitter: @mciura + + +## Judges' comments: +### To use: + + make + + ./getwords.sh en | grep .. | ./prog aeiouvwxyz + +### Try: + + ./getwords.sh en | grep .. | ./prog aeiouhjklmnvwxyz + + ./getwords.sh en | grep .. | ./prog mrjocktvquizphdbagsfewlynx + + ./en.sh + + ./fr.sh + + ./ru.sh + +### Selected Judges Remarks: + +A few letters, one at a time, with no repeats. +How many different ways can this be done? + +While a quick brown fox might jump over the lazy dog, +it has too many repeat letters to allow this entry to repeat. +It is better that Mr Jock, TV quiz PhD, bags few lynx. + +Speaking of jumping, can you rewrite the code to +remote all of the goto jumps in this code? + +## Author's comments: +### What is this? + +This entry reads from standard input a list of words in any language +written with an alphabet and outputs perfect pangrams composed of these +words. A perfect pangram is a series of words that contains every letter +of the alphabet exactly once. + +Example execution: + + $ grep .. /usr/share/dict/words | ./prog abcdefghijklmnopqrstuvwxyz + qualm fjord wiz pyx vs beg kc nth + quartz jinx vs fed kc womb glyph + quid jamb fez vs pyx kc growl nth + quiz fjord pyx vs bag kc mewl nth + quiz fjord pyx vs gab kc mewl nth + quiz fjord pyx vs gem bawl kc nth + quiz fjord pyx vs meg bawl kc nth + quiz fjord vex bawl kc gyp ms nth + quiz jamb flex vs kc gyp word nth + quiz jamb pyx vs kc flog drew nth + quiz jamb pyx vs kc frog lewd nth + quiz jamb pyx vs kc frog weld nth + quiz jamb pyx vs kc golf drew nth + quiz jamb pyx vs kc grew fold nth + quiz jamb pyx vs kc grow nth fled + quiz jamb pyx vs kc growl fed nth + +Rearranging the words into more or less meaningful expressions is the +user's duty. + +This entry implements Algorithm X (_Exact cover via dancing links_) +from Section 7.2.2.1 in fascicle 5C of _The Art of Computer +Programming_ by Donald E. Knuth. As of June 2019, you can download an +incomplete draft of the fascicle from [Knuth's +website](https://www-cs-faculty.stanford.edu/~knuth/fasc5c.ps.gz). + +### Usage + +**`prog LETTERS [N]`** +reads allowed words from standard input and writes perfect pangrams +with at most _N_ words composed of _LETTERS_ to standard output, one +per line. If _N_ is not given, the number of words in the pangrams is +unlimited. The characters in _LETTERS_ must not repeat. The length of +_LETTERS_ must not exceed 97 characters. + +The exit status is 0 if no error occurred, 1 if the input word list +is too long, and 2 if the command-line arguments are missing. + +### Helper scripts + +**`getwords.sh LANGUAGE_CODE`** +outputs a sorted list of unique words in a given language, one per +line. It requires **`aspell`** with a dictionary for _LANGUAGE_CODE_. + +**`wrapprog.py LETTERS [N]`** +works similarly to **`prog LETTERS [N]`** except that it merges +anagrams before passing them to **`prog`** and expands them in +**`prog`**'s output. This way, it finishes the job faster than +**`prog`** when there are millions of perfect pangrams. It requires a +UTF-8 locale. + +**`de.sh`**, **`en.sh`**, **`fr.sh`**, **`it.sh`**, **`pl.sh`**, +and **`ru.sh`** output German, English, French, Italian, Polish, +and Russian perfect pangrams, respectively. They require a UTF-8 +locale. + +### Miscellaneous remarks + +I dare submit this entry to categories _algorithms_, +_internationalization_ (I have not found active use of **``** +among the programs that won IOCCC in the past), and _obscure bugs_ (see +the questions about Linux core dumps below). + +To a casual eye, this entry may look similar to +[2005 klausler](https://www.ioccc.org/years.html#2005_klausler). +However, **`prog`** is internationalized and way faster. On my machine, +**`./klausler abcdefghijklmnopqrstuvwxyz`** printed only 3,965 perfect +pangrams until I killed it after 144 hours running, while the +equivalent +**`tr A-Z a-z < /usr/share/dict/words | egrep -v '^[^ais]$' | ./prog abcdefghijklmnopqrstuvwxyz | wc -l`** +finished in 62 minutes, reporting 1,640,569,315 perfect pangrams, and +the example from section [What is this?](#wit) finished in 1.35 +seconds. On the other hand, **`prog`** can only output series of words +with nonrepeating characters, unlike **`klausler`**. + +In contrast to **`prog.orig.c`**, **`prog.c`** does not call +**`fflush(stdout)`** after outputting each line, thus running faster. +I am grateful to Witold Jarnicki for suggesting this change. +The original **`prog`** finished the example above in 100 minutes +instead of 62 minutes. + +If your word list contains meaningless one-letter words, pipe +**`grep .. [FILE]`** through **`prog`** to eliminate the pangrams that +contain them. + +According to **`prog`** and **`aspell`**, some languages, e.g. Spanish, +have no perfect pangrams. + +Why does **`yes | ./prog y`** hang on Linux? Change **`static int`** to +**`int`** and **`static wchar_t`** to **`wchar_t`**, and recompile +**`prog`**. Why does **`yes | ./prog y`** dump core now? Change the line +**`#define P 9<<23^1`** to **`#define P 9<<23`** and recompile +**`prog`**. Why does **`yes | ./prog y`** exit gracefully? + +Answer: Nf bs Whar 2019, guhf znavsrfg ohtf va **`tyvop`** 2.22--2.29: +[1](https://sourceware.org/bugzilla/show_bug.cgi?id=20568) naq +[2](https://sourceware.org/bugzilla/show_bug.cgi?id=20632). + +The source code uses **`goto`** three times. While it could easily get +by without **`goto M`** and **`goto H`**, I challenge the adherents of +structured programming to refactor **`goto T`**, which jumps back into a +nested **`if`** block. + +With the supplied **`Makefile`**, both **`gcc`** and **`clang`** compile +**`prog.c`** without warnings in C11 and C99 mode. For a clean +compilation with **`gcc -std=c90`**, add **`-Wno-format`** to +**`CSILENCE`** in **`Makefile`**. + +-------------------------------------------------------------------------------- + diff --git a/2019/ciura/it.sh b/2019/ciura/it.sh new file mode 100644 index 000000000..0040fdcc7 --- /dev/null +++ b/2019/ciura/it.sh @@ -0,0 +1,5 @@ +#!/bin/sh +(>&2 echo "Please be patient. Extracting Italian words") +(>&2 echo "from aspell takes a few minutes.") +set -x +./getwords.sh it | grep .. | ./prog aàbcdeèéfghiìlmnoòpqrstuùvz #jkwxy diff --git a/2019/ciura/pl.sh b/2019/ciura/pl.sh new file mode 100644 index 000000000..129639084 --- /dev/null +++ b/2019/ciura/pl.sh @@ -0,0 +1,3 @@ +#!/bin/sh +set -x +./getwords.sh pl | egrep -v '^[^aiouwz]$' | ./prog aąbcćdeęfghijklłmnńoóprsśtuwyzźż diff --git a/2019/ciura/prog.c b/2019/ciura/prog.c new file mode 100644 index 000000000..f3002ae19 --- /dev/null +++ b/2019/ciura/prog.c @@ -0,0 +1,30 @@ +#include +#include +#include +#include + +#define P 9<<23^1 +#define A 1;O-L;L=0W-s;++W)if(33>(*W=S)){ + for(*W=L,Z=w;*Z;++Z)if(R(*Z,Z)||!R(*Z,z)){W=w-1;goto M;} + for(I=L;I[w];++I)++o[O=R(I[w],z)-z],k[K[l[o+I+1]=O]=k[l[K+I+1]=O[K]]=l+I+1]=O; + *q++=w;l[k]=l+I;o[l+=I+1]=p-q;l[K]=l-I;M:w=1+W;} + *j="Dictionary too long\n";if(WEOF-S)H:return fputs(*j,stderr),**j/36; + d=2[j]?atoi(2[j]):97;while(P){if(I=*v){for(O=P;I;I=I[v])O>I[o]?l=I,O=I[o]:P; + b();c[C]=l[k];T:if(l-c[C]){for(I=G b(),I+1:I[K]);if(d>c++)continue;}else y(); + }else{for(;I-c;++I){for(O=I[C];0>~O[o];++O);printf(!I+" %ls",p[~O[o]]);} + putchar(10);} + if(!c--)return 0; + for(I=-G y(),I-1:I[k]); + l=c[C][o];c[C]=c[C][k];goto T;}} + *j="Need an argument or two\n";goto H;} diff --git a/2019/ciura/prog.orig.c b/2019/ciura/prog.orig.c new file mode 100644 index 000000000..510907134 --- /dev/null +++ b/2019/ciura/prog.orig.c @@ -0,0 +1,30 @@ +#include +#include +#include +#include + +#define P 9<<23^1 +#define A 1;O-L;L=0W-s;++W)if(33>(*W=S)){ + for(*W=L,Z=w;*Z;++Z)if(R(*Z,Z)||!R(*Z,z)){W=w-1;goto M;} + for(I=L;I[w];++I)++o[O=R(I[w],z)-z],k[K[l[o+I+1]=O]=k[l[K+I+1]=O[K]]=l+I+1]=O; + *q++=w;l[k]=l+I;o[l+=I+1]=p-q;l[K]=l-I;M:w=1+W;} + *j="Dictionary too long\n";if(WEOF-S)H:return fputs(*j,stderr),**j/36; + d=2[j]?atoi(2[j]):97;while(P){if(I=*v){for(O=P;I;I=I[v])O>I[o]?l=I,O=I[o]:P; + b();c[C]=l[k];T:if(l-c[C]){for(I=G b(),I+1:I[K]);if(d>c++)continue;}else y(); + }else{for(;I-c;++I){for(O=I[C];0>~O[o];++O);printf(!I+" %ls",p[~O[o]]);} + putchar(10);fflush(stdout);} + if(!c--)return 0; + for(I=-G y(),I-1:I[k]); + l=c[C][o];c[C]=c[C][k];goto T;}} + *j="Need an argument or two\n";goto H;} diff --git a/2019/ciura/ru.sh b/2019/ciura/ru.sh new file mode 100644 index 000000000..4943644b4 --- /dev/null +++ b/2019/ciura/ru.sh @@ -0,0 +1,3 @@ +#!/bin/sh +set -x +./getwords.sh ru | ./prog абвгдеёжзийклмнопр�туфхцчшщъыь�ю� diff --git a/2019/ciura/wrapprog.py b/2019/ciura/wrapprog.py new file mode 100644 index 000000000..1b60ad747 --- /dev/null +++ b/2019/ciura/wrapprog.py @@ -0,0 +1,40 @@ +#!/usr/bin/python3 + +"""Reads allowed words and writes perfect pangrams composed of them. + +Merges anagrams before passing them to ./prog and expands them +in ./prog's output. +""" + +import collections +import subprocess +import sys + + +def main(): + """Wraps the execution of ./prog""" + + if len(sys.argv) < 2: + sys.stderr.write('Usage: {} LETTERS [N]\n'.format(sys.argv[0])) + sys.exit(2) + anagrams = collections.defaultdict(list) + for line in sys.stdin: + word = line.strip() + anagrams[''.join(sorted(word))].append(word) + prog = subprocess.Popen( + ['./prog'] + sys.argv[1:], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE) + try: + for word in anagrams: + prog.stdin.write(bytes(word + '\n', 'utf-8')) + except BrokenPipeError: + sys.exit(1) + prog.stdin.close() + for anagram in prog.stdout: + words = anagram.decode('utf-8').split() + print(' '.join('/'.join(anagrams[w]) for w in words)) + + +if __name__ == '__main__': + main() diff --git a/2019/diels-grabsch1/Makefile b/2019/diels-grabsch1/Makefile new file mode 100644 index 000000000..b44fa7ab9 --- /dev/null +++ b/2019/diels-grabsch1/Makefile @@ -0,0 +1,525 @@ +#!/usr/bin/env make +# +# 2019 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + +############################# +# shell used by this Makefile +############################# +# +SHELL= /bin/bash + +####################### +# common tool locations +####################### +# +A2P= a2p +AR= ar +ASA= asa +AT= at +ATQ= atq +ATRM= atrm +AWK= awk +BANNER= banner +BASE64= base64 +BASENAME= basename +BATCH= batch +BC= bc +BINHEX= binhex +BISON= bison +BUNZIP2= bunzip2 +BZCAT= bzcat +BZCMP= bzcmp +BZDIFF= bzdiff +BZEGREP= bzegrep +BZFGREP= bzfgrep +BZGREP= bzgrep +BZIP2= bzip2 +BZLESS= bzless +BZMORE= bzmore +C2PH= c2ph +C89= c89 +C99= c99 +CAL= cal +CALC= calc +CAT= cat +CD= cd +CHFLAGS= chflags +CHGRP= chgrp +CHMOD= chmod +CKSUM= cksum +CLANG= clang +CLANG_PLUSPLUS= clang++ +CLEAR= clear +CMP= cmp +COL= col +COLLDEF= colldef +COLRM= colrm +COLUMN= column +COMPRESS= compress +CP= cp +CPIO= cpio +CPP= cpp +CRC32= crc32 +CSH= csh +CSPLIT= csplit +CURL= curl +CUT= cut +C_PLUSPLUS= c++ +C_PLUSPLUS_FILT= c++filt +DATE= date +DC= dc +DD= dd +DF= df +DIFF3= diff3 +DIFF= diff +DIG= dig +DIRNAME= dirname +ED= ed +EGREP= egrep +ENV= env +EQN= eqn +ETAGS= etags +EXPECT= expect +EXPR= expr +FALSE= false +FGREP= fgrep +FILE= file +FIND2PERL= find2perl +FIND= find +FLEX= flex +FLEX_PLUSPLUS= flex++ +FMT= fmt +FOLD= fold +FS_USAGE= fs_usage +FUNZIP= funzip +FUSER= fuser +GCC= gcc +GDIFFMK= gdiffmk +GENCAT= gencat +GENSTRINGS= genstrings +GETOPT= getopt +GETOPTS= getopts +GNUMAKE= gnumake +GREP= grep +GROFF= groff +GROFFER= groffer +GROG= grog +GROPS= grops +GROTTY= grotty +GUNZIP= gunzip +GVIM= gvim +GZCAT= gzcat +GZEXE= gzexe +GZIP_PROG= gzip +G_PLUSPLUS= g++ +H2PH= h2ph +H2XS= h2xs +HASH= hash +HEAD= head +HOSTNAME_PROG= hostname +ICONV= iconv +ID= id +INDENT= indent +INFO= info +JOT= jot +KILL= kill +KSH= ksh +LAST= last +LD= ld +LESSECHO= lessecho +LEX= len +LINK= link +LN= ln +LS= ls +M4= m4 +MAKE= make +MAN= man +MKDIR= mkdir +MKFIFo= mkfifo +MKTEMP= mktemp +MV= mv +NANO= nano +NASM= nasm +NEQN= neqn +NICE= nice +NL= nl +NM= nm +NOHUP= nohup +NROFF= nroff +NSLOOKUP= nslookup +OD= od +OPENSSL= openssl +PASTE= paste +PATCH= patch +PATHCHK= pathchk +PAX= pax +PERL= perl +PICO= pico +PR= pr +PRINTENV= printenv +PS= ps +PTAR= ptar +PTARDIFF= ptardiff +PTARGREP= ptargrep +PWD= pwd +PYDOC= pydoc +PYTHON= python +PYTHONW= pythonw +READLINK= readlink +RENICE= renice +RESET= reset +REV= rev +RI= ri +RM= rm +RMDIR= rmdir +RSYNC= rsync +RUBY= ruby +RVIM= rvim +SAY= say +SCP= scp +SCREEN= screen +SCRIPT= script +SDIFF= sdiff +SED= sed +SEQ= seq +SFTP= sftp +SH= sh +SHA1= sha1 +SHA= sha +SHAR= shar +SHASUM5_18= shasum5.18 +SHASUM= shasum +SIZE= size +SLEEP= sleep +SORT= sort +SSH= ssh +STAT= stat +STRIP= strip +STTY= stty +SUM= sum +SYNC= sync +TABS= tabs +TAIL= tail +TAR= tar +TEE= tee +TEST= test +TFTP= tftp +TIDY= tidy +TIME= time +TOP= top +TOUCH= touch +TPUT= tout +TPUT= tput +TR= tr +TROFF= troff +TRUE= true +TSET= tset +TSORT= tsort +UL= ul +UNAME= uname +UNCOMPRESS= uncompress +UNEXPAND= unexpand +UNIFDEF= unifdef +UNIFDEFALL= unifdefall +UNIQ= uniq +UNITS= units +UNLINK= unlink +UNZIP= unzip +UNZIPSFX= unzipsfx +UPTIME= uptime +UUDECODE= uudecode +UUENCODE= uuencode +UUIDGEN= uuidgen +VI= vi +VIEW= view +VIM= vim +VIMDIFF= vimdiff +W= w +WAIT4PATH= wait4path +WAIT= wait +WC= wc +WHAT= what +WHATIS= whatis +WHICH= which +WHO= who +WHOAMI= whoami +WHOIS= whois +WRTIE= write +XAR= xar +XARGS= xargs +XATTR= xattr +XXD= xxd +YACC= yacc +YES= yes +ZCAT= zcat +ZCMP= zcmp +ZDIFF= zdiff +ZEGREP= zegrep +ZFGREP= zfgrep +ZFORCE= zforce +ZGREP= zgrep +ZIP= zip +ZIPCLOAK= zipcloak +ZIPGREp= zipgrep +ZIPINFo= zipinfo +ZIPNOTE= zipnote +ZIPSPLIT= zipsplit +ZLESS= zless +ZMORE= zmore +ZNEW= znew +ZPRINT= zprint +ZSH= zsh + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +#CSILENCE= -Wno-implicit-int +#CSILENCE= -Wextra -Weverything + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=26 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= +ALT_TARGET= + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic fc6b6af226b7cc598de3d48fc20ed0bd54f7b4f7f0f651a32b9cf8345b2a3b3f --FNV1a_hash_512_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --level 391581 --mode 216193 --FNV1a_hash_512_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore IAU, $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore, $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2019/diels-grabsch1/hint.html b/2019/diels-grabsch1/hint.html new file mode 100644 index 000000000..59a9948a4 --- /dev/null +++ b/2019/diels-grabsch1/hint.html @@ -0,0 +1,92 @@ + + + + + + Best small program + + +

    Best small program

    + +

    Volker Diels-Grabsch
    +https://njh.eu

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./prog < file > file.Z
    +
    + +

    Try:

    + +
    dd bs=1024 count=2048 < /dev/zero | compress > ref.Z
    +dd bs=1024 count=2048 < /dev/zero | ./prog > dg1.Z
    +cmp ref.Z dg1.Z
    +
    +compress < ../mills/Shakespeare.txt > ref.Z
    +./prog < ../mills/Shakespeare.txt > dg1.Z
    +cmp ref.Z dg1.Z # Oops, the files differ
    +zcat < dg1.Z | cmp - ../mills/Shakespeare.txt # Decompresses correctly. What is going on?
    +
    + +

    Selected Judges Remarks:

    + +

    Finally, IOCCC now has its own text compression program, and it is short +enough to qualify for the Best Short Program award! That said, can you +compress it down to a one-liner, still producing files in the UNIX compress format, +albeit sacrificing the compression ratio?

    + +

    Can you explain why the zero file compresses identically by the entry and the +standard compress tool, but the text file compresses differently? The judges know. :)

    + +

    Author’s comments:

    + +

    A tiny “compress” tool

    + +

    Usage:

    + +
    ./prog < guidelines.txt > guidelines.txt.Z
    +
    + +

    Check for correctness:

    + +
    zcat guidelines.txt.Z > guidelines2.txt
    +diff -s guidelines.txt guidelines2.txt
    +
    + +

    Of course you can
    +also use 2015/mills2 instead of zcat to verify the output
    +file. The achieved compression ratio roughly matches that
    +of the classic Unix compress tool. And the source code is
    +very compressed, too: It has exactly the same size as the
    +paragraph you are reading right now. And exactly the same
    +shape. Nevertheless, it is portable C99 code that runs on
    +32-bit and 64-bit platforms. It compiles without warnings
    +on both GCC and Clang even with -Wextra and -Weverything.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2019, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2019/diels-grabsch1/hint.text b/2019/diels-grabsch1/hint.text new file mode 100644 index 000000000..56b47f422 --- /dev/null +++ b/2019/diels-grabsch1/hint.text @@ -0,0 +1,64 @@ +# Best small program + +Volker Diels-Grabsch + + + +## Judges' comments: +### To use: + + make + + ./prog < file > file.Z + +### Try: + + dd bs=1024 count=2048 < /dev/zero | compress > ref.Z + dd bs=1024 count=2048 < /dev/zero | ./prog > dg1.Z + cmp ref.Z dg1.Z + + compress < ../mills/Shakespeare.txt > ref.Z + ./prog < ../mills/Shakespeare.txt > dg1.Z + cmp ref.Z dg1.Z # Oops, the files differ + zcat < dg1.Z | cmp - ../mills/Shakespeare.txt # Decompresses correctly. What is going on? + +### Selected Judges Remarks: + +Finally, IOCCC now has its own text compression program, and it is short +enough to qualify for the Best Short Program award! That said, can you +compress it down to a one-liner, still producing files in the UNIX compress format, +albeit sacrificing the compression ratio? + +Can you explain why the zero file compresses identically by the entry and the +standard compress tool, but the text file compresses differently? The judges know. :) + +## Author's comments: +### A tiny "compress" tool + +`Usage:` + + ./prog < guidelines.txt > guidelines.txt.Z + +`Check for correctness:` + + zcat guidelines.txt.Z > guidelines2.txt + diff -s guidelines.txt guidelines2.txt + +`Of course you can` +`also use 2015/mills2 instead of zcat to verify the output` +`file. The achieved compression ratio roughly matches that` +`of the classic Unix compress tool. And the source code is` +`very compressed, too: It has exactly the same size as the` +`paragraph you are reading right now. And exactly the same` +`shape. Nevertheless, it is portable C99 code that runs on` +`32-bit and 64-bit platforms. It compiles without warnings` +`on both GCC and Clang even with -Wextra and -Weverything.` + +-------------------------------------------------------------------------------- + diff --git a/2019/diels-grabsch1/prog.c b/2019/diels-grabsch1/prog.c new file mode 100644 index 000000000..49eeddb77 --- /dev/null +++ b/2019/diels-grabsch1/prog.c @@ -0,0 +1,9 @@ +#include +int main(){int a=0,b=a;long long c[178819],d=8,e=257,f,g, +h,i=d-9;for(;a<178819;){c[a++]=i;}for(a*=53;a;a>>=8)putc\ +har(a);if((f=getchar())<0)return 0;for(;(g=getchar())>=0; +){h=i=g<<8^f;g+=f<<8;a=e<(512<256?a:a>6?15 +:a+1;for(;c[i]>-1&&c[i]>>16!=g;)i+=i+h<69000?h+1:h-69000; +h=c[i]<0;b|=h*f<15;d-=8)putchar(b=b +>>8);f=h?g-f*256:c[i]%65536L;if(a<8*h){c[i]=g*65536L|e++; +}}b|=f<-1;d-=8)putchar(b>>=8);return!53;} diff --git a/2019/diels-grabsch2/Makefile b/2019/diels-grabsch2/Makefile new file mode 100644 index 000000000..3e4994c23 --- /dev/null +++ b/2019/diels-grabsch2/Makefile @@ -0,0 +1,524 @@ +#!/usr/bin/env make +# +# 2019 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + +############################# +# shell used by this Makefile +############################# +# +SHELL= /bin/bash + +####################### +# common tool locations +####################### +# +A2P= a2p +AR= ar +ASA= asa +AT= at +ATQ= atq +ATRM= atrm +AWK= awk +BANNER= banner +BASE64= base64 +BASENAME= basename +BATCH= batch +BC= bc +BINHEX= binhex +BISON= bison +BUNZIP2= bunzip2 +BZCAT= bzcat +BZCMP= bzcmp +BZDIFF= bzdiff +BZEGREP= bzegrep +BZFGREP= bzfgrep +BZGREP= bzgrep +BZIP2= bzip2 +BZLESS= bzless +BZMORE= bzmore +C2PH= c2ph +C89= c89 +C99= c99 +CAL= cal +CALC= calc +CAT= cat +CD= cd +CHFLAGS= chflags +CHGRP= chgrp +CHMOD= chmod +CKSUM= cksum +CLANG= clang +CLANG_PLUSPLUS= clang++ +CLEAR= clear +CMP= cmp +COL= col +COLLDEF= colldef +COLRM= colrm +COLUMN= column +COMPRESS= compress +CP= cp +CPIO= cpio +CPP= cpp +CRC32= crc32 +CSH= csh +CSPLIT= csplit +CURL= curl +CUT= cut +C_PLUSPLUS= c++ +C_PLUSPLUS_FILT= c++filt +DATE= date +DC= dc +DD= dd +DF= df +DIFF3= diff3 +DIFF= diff +DIG= dig +DIRNAME= dirname +ED= ed +EGREP= egrep +ENV= env +EQN= eqn +ETAGS= etags +EXPECT= expect +EXPR= expr +FALSE= false +FGREP= fgrep +FILE= file +FIND2PERL= find2perl +FIND= find +FLEX= flex +FLEX_PLUSPLUS= flex++ +FMT= fmt +FOLD= fold +FS_USAGE= fs_usage +FUNZIP= funzip +FUSER= fuser +GCC= gcc +GDIFFMK= gdiffmk +GENCAT= gencat +GENSTRINGS= genstrings +GETOPT= getopt +GETOPTS= getopts +GNUMAKE= gnumake +GREP= grep +GROFF= groff +GROFFER= groffer +GROG= grog +GROPS= grops +GROTTY= grotty +GUNZIP= gunzip +GVIM= gvim +GZCAT= gzcat +GZEXE= gzexe +GZIP_PROG= gzip +G_PLUSPLUS= g++ +H2PH= h2ph +H2XS= h2xs +HASH= hash +HEAD= head +HOSTNAME_PROG= hostname +ICONV= iconv +ID= id +INDENT= indent +INFO= info +JOT= jot +KILL= kill +KSH= ksh +LAST= last +LD= ld +LESSECHO= lessecho +LEX= len +LINK= link +LN= ln +LS= ls +M4= m4 +MAKE= make +MAN= man +MKDIR= mkdir +MKFIFo= mkfifo +MKTEMP= mktemp +MV= mv +NANO= nano +NASM= nasm +NEQN= neqn +NICE= nice +NL= nl +NM= nm +NOHUP= nohup +NROFF= nroff +NSLOOKUP= nslookup +OD= od +OPENSSL= openssl +PASTE= paste +PATCH= patch +PATHCHK= pathchk +PAX= pax +PERL= perl +PICO= pico +PR= pr +PRINTENV= printenv +PS= ps +PTAR= ptar +PTARDIFF= ptardiff +PTARGREP= ptargrep +PWD= pwd +PYDOC= pydoc +PYTHON= python +PYTHONW= pythonw +READLINK= readlink +RENICE= renice +RESET= reset +REV= rev +RI= ri +RM= rm +RMDIR= rmdir +RSYNC= rsync +RUBY= ruby +RVIM= rvim +SAY= say +SCP= scp +SCREEN= screen +SCRIPT= script +SDIFF= sdiff +SED= sed +SEQ= seq +SFTP= sftp +SH= sh +SHA1= sha1 +SHA= sha +SHAR= shar +SHASUM5_18= shasum5.18 +SHASUM= shasum +SIZE= size +SLEEP= sleep +SORT= sort +SSH= ssh +STAT= stat +STRIP= strip +STTY= stty +SUM= sum +SYNC= sync +TABS= tabs +TAIL= tail +TAR= tar +TEE= tee +TEST= test +TFTP= tftp +TIDY= tidy +TIME= time +TOP= top +TOUCH= touch +TPUT= tout +TPUT= tput +TR= tr +TROFF= troff +TRUE= true +TSET= tset +TSORT= tsort +UL= ul +UNAME= uname +UNCOMPRESS= uncompress +UNEXPAND= unexpand +UNIFDEF= unifdef +UNIFDEFALL= unifdefall +UNIQ= uniq +UNITS= units +UNLINK= unlink +UNZIP= unzip +UNZIPSFX= unzipsfx +UPTIME= uptime +UUDECODE= uudecode +UUENCODE= uuencode +UUIDGEN= uuidgen +VI= vi +VIEW= view +VIM= vim +VIMDIFF= vimdiff +W= w +WAIT4PATH= wait4path +WAIT= wait +WC= wc +WHAT= what +WHATIS= whatis +WHICH= which +WHO= who +WHOAMI= whoami +WHOIS= whois +WRTIE= write +XAR= xar +XARGS= xargs +XATTR= xattr +XXD= xxd +YACC= yacc +YES= yes +ZCAT= zcat +ZCMP= zcmp +ZDIFF= zdiff +ZEGREP= zegrep +ZFGREP= zfgrep +ZFORCE= zforce +ZGREP= zgrep +ZIP= zip +ZIPCLOAK= zipcloak +ZIPGREp= zipgrep +ZIPINFo= zipinfo +ZIPNOTE= zipnote +ZIPSPLIT= zipsplit +ZLESS= zless +ZMORE= zmore +ZNEW= znew +ZPRINT= zprint +ZSH= zsh + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +CSILENCE= +#CSILENCE= -Wno-implicit-int + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=26 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= +ALT_TARGET= + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic fc6b6af226b7cc598de3d48fc20ed0bd54f7b4f7f0f651a32b9cf8345b2a3b3f --FNV1a_hash_512_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --level 391581 --mode 216193 --FNV1a_hash_512_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore IAU, $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore, $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2019/diels-grabsch2/hint.html b/2019/diels-grabsch2/hint.html new file mode 100644 index 000000000..574a6f873 --- /dev/null +++ b/2019/diels-grabsch2/hint.html @@ -0,0 +1,218 @@ + + + + + + Most self-aware + + +

    Most self-aware

    + +

    Volker Diels-Grabsch
    +https://njh.eu

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    + +

    Try:

    + +
    ./prog
    +sha512sum prog.c || shasum -a 512 prog.c
    +
    + +

    Selected Judges Remarks:

    + +

    Before running this one, stay calm. Chill out, have a cup of tea. Is this bad?

    + +

    To understand what is going on here, please check if you are dreaming, or are you dreaming +that you are dreaming? Or is it, wake up from the simulation?

    + +

    Author’s comments:

    + +

    Almost a hash collision

    + +

    This program prints its own SHA-512 hash. To verify, run:

    + +
    sha512sum prog.c; ./prog
    +
    + +

    Output:

    + +
    43bd0c4381a5078d2850fca9ae5e0647596bcc03cd67d8d973ad02ff35c316c728e7b347ca70abe6c74e745e63646cc7643cb0cffcd3d9a969cbf31a7ce5bf68  prog.c
    +43bd0c4381a5078d2850fca9ae5e0647596bcc03cd67d8d973ad02ff35c316c728e7b347ca70abe6c74e745e63646cc7643cb0cffcd3d9a969cbf31a7ce5bf68
    +
    + +

    It started as a complicated “hello world” program that prints some +random hex digits instead of “hello world”. Then, the digits were +adjusted until the resulting program matched its own SHA-512 hash, +via brute force through all 2512 possibilities. Just kidding.

    + +

    This wasn’t brute force, but involved quite some math, using a variant +of Jane Doe’s algorithm for generating SHA-512 collisions efficiently. +If you still don’t believe me, you are right.

    + +

    No crypto was broken in the making of this program!

    + +

    The trick is that under the hood, this program is a quine! That is, +it is aware of its own source code in string representation. But +instead of printing that string, its SHA-512 hash is computed and +printed. So two major steps were needed to obfuscate this program:

    + +
      +
    • Step 1: Hide the quine
    • +
    • Step 2: Hide the SHA-512 computation
    • +
    + + +

    Note that both steps were achieved mostly algorithmically. The code +is otherwise as short and as clean as possible. The implementation is +portable C99 code for 32-bit and 64-bit systems that compiles without +any warnings on current GCC and Clang versions even with -Wextra and +-Weverything. The program is composed of mostly pure functions, and +the “#define"s are only used to shorten redundant parts of the code, +they are not meant to obfuscate much. Having that out of the way, how +are step 1 and step 2 achieved then?

    + +

    Regarding step 1, note that the large string literal “`x{bh}ndbq…” +in the last line doesn’t look like C code. Moreover, it is too short +to contain even a compressed representation of all preceding and +subsequent code. Instead, the preceding code including the ‘“’ +character has already been run through the SHA-512 computation by an +external script. The internal state of the SHA-512 computation at +that point has been extracted and encoded into the string. This works +because the preceding code is exactly 1280 bytes, which is a multiple +of 1024 bits, the block size of SHA-512. The program itself then just +continues the SHA-512 computation from that point, adding the last +1024-bit block, finalizing the hash and printing it. The last block +is taken directly from the string literal at runtime, plus the +subsequent code which consists of just ‘”’, ‘;’ and ‘\n’. Those 3 +characters are short enough to be hidden in … well, let’s leave this +as an exercise for the reader.

    + +

    To summarize, the main trick here is to move the string constant to +the end, so the preceding code can be precalculated and the subsequent +code is short enough to be hidden anywhere.

    + +

    Regarding step 2, almost all macros, functions and variables have +meaningless single-letter names. Moreover, the SHA-512 computation is +reduced to the special case of adding just one block and immediately +finalizing it, where the total size is known in advance.

    + +

    But this is not enough! For SHA-512 we need 8 initial hash values and +80 round constants, which are very characteristic. If any of them +appeared in the source, a quick web search (e.g. for 0x428a2f98d728ae22) +would tell the reader immediately what’s going on. Because of the +precomputation, the 8 initial hash values are not needed, but the +80 round constants are.

    + +

    It is almost impossible to hide those 640 bytes in the source. +Luckily, the round constants where not chosen by fair dice rolls. +They are the fractional parts of certain irrational numbers, namely, +the cube roots of the first 80 primes. So the round constrants are +calculated at runtime, which makes the program shorter and adds +another layer of obfuscation.

    + +

    While this sounds like just iterating primes and executing pow(), this +turned out to be harder than expected. If we were computing SHA-256, +it would have been as simple as that, because the round constants +would have been 32-bit values. However, SHA-512 needs the cube roots +at 64-bit precision, while double has only 53-bit mantissa precision.

    + +

    Using higher-precision floating point is no option here, because the +program is meant to be portable C99. And implementing +arbitrary-precision arithmetic would have been overkill and would have +increased the program size dramatically.

    + +

    Instead, the program just multiplies. That is, it computes cubes +instead of cube roots. It steps through cube root candidates via +bisection, and calculates their cubes until those match the given +prime. Thus, we don’t need floating point and can use 64-bit integers +instead. But that still doesn’t solve the problem as it poses the +following new challenges:

    + +
      +
    • Challenge 1: We can multiply at most two 32-bit numbers at once.
    • +
    • Challenge 2: We need to calculate with at least 67-bit precision.
    • +
    • Challenge 3: We need to truncate the cube root result.
    • +
    + + +

    The reason for challenge 1 is that in portable C99, the result must +fit into the same data type. To multiply two 64-bit integers we would +need a 128-bit integer for the result. So we can at most multiply two +32-bit integers to get the 64-bit product at full precision. While +GCC and Clang both support 128-bit arithmetics, that isn’t standard +and wouldn’t have been portable C99.

    + +

    The reason for challenge 2 is that cube root of the 80th prime is +around 7, so we need to compute with 3 bits for the integral part and +64 bits for the fractional part.

    + +

    The reason for challenge 3 is that the cube of a 67-bit number is +3*67=201 bits, but fortunately we only need to check if it is close +enough to the actual prime. It won’t be exactly e.g. “409.0000…” +anyway, but must be accurate enough to distinguish the correct cube +root from its neighbours, e.g. the same number with the 64th +fractional digit increased.

    + +

    The solution here is to split the 67-bit input into 3 integers of +24-bit each. Those are cubed using the multiplication formulas +numbers with 3 “digits” of base 224 each. During that calculation, +at most two values are multiplied at once, and the accuracy of +intermediate values is reduced using right-shifts as far as allowable +for the computation. Finding woking right-shift values was mostly +trial-and-error, producing correct results for the first 80 primes, +but not much more. Moreover, for some terms it was possible to leave +them out entirely, especially higher-order terms of the last digits. +Luckily, in the end, all intermediate results did fit into 64-bit +integer addition and multiplication, but that was not obvious at the +beginning.

    + +

    That’s it.

    + +

    Well, I could continue with details about the encoding of the internal +state values into the string, how to avoid escaping issues, how to +find short notations for various loops, how to get rid of if(), where +the final “\”;\n" is stored, how to eliminate intermediate values and +arrays by reordering of operations, and so on. But those were all +minor issues compared to the challenges described above. What’s +documented here is all you need to know to write your own version of +that program.

    + +

    I’d like to finish with an open problem:

    + +

    Is it possible for the cubing and bisection to be implemented with +just two parts instead of three? That would simplify the formulas a +lot. For example, one could split the 67-value into two 34-bit parts, +but whenever one multiplies two of them, one needs to right-shift one +of them by at least 4 bits, or both by 2. Or, one splits the 67 bits +asymmetrically? I wasn’t able to make it work with 2 parts, but that +doesn’t have to mean anything.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2019, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2019/diels-grabsch2/hint.text b/2019/diels-grabsch2/hint.text new file mode 100644 index 000000000..0020ed31d --- /dev/null +++ b/2019/diels-grabsch2/hint.text @@ -0,0 +1,184 @@ +# Most self-aware + +Volker Diels-Grabsch + + + +## Judges' comments: +### To use: + + make + +### Try: + + ./prog + sha512sum prog.c || shasum -a 512 prog.c + +### Selected Judges Remarks: + +Before running this one, stay calm. Chill out, have a cup of tea. Is this bad? + +To understand what is going on here, please check if you are dreaming, or are you dreaming +that you are dreaming? Or is it, wake up from the simulation? + +## Author's comments: +### Almost a hash collision + +This program prints its own SHA-512 hash. To verify, run: + + sha512sum prog.c; ./prog + +Output: + + 43bd0c4381a5078d2850fca9ae5e0647596bcc03cd67d8d973ad02ff35c316c728e7b347ca70abe6c74e745e63646cc7643cb0cffcd3d9a969cbf31a7ce5bf68 prog.c + 43bd0c4381a5078d2850fca9ae5e0647596bcc03cd67d8d973ad02ff35c316c728e7b347ca70abe6c74e745e63646cc7643cb0cffcd3d9a969cbf31a7ce5bf68 + +It started as a complicated "hello world" program that prints some +random hex digits instead of "hello world". Then, the digits were +adjusted until the resulting program matched its own SHA-512 hash, +via brute force through all 2^512 possibilities. Just kidding. + +This wasn't brute force, but involved quite some math, using a variant +of Jane Doe's algorithm for generating SHA-512 collisions efficiently. +If you still don't believe me, you are right. + +No crypto was broken in the making of this program! + +The trick is that under the hood, this program is a quine! That is, +it is aware of its own source code in string representation. But +instead of printing that string, its SHA-512 hash is computed and +printed. So two major steps were needed to obfuscate this program: + +- Step 1: Hide the quine +- Step 2: Hide the SHA-512 computation + +Note that both steps were achieved mostly algorithmically. The code +is otherwise as short and as clean as possible. The implementation is +portable C99 code for 32-bit and 64-bit systems that compiles without +any warnings on current GCC and Clang versions even with -Wextra and +-Weverything. The program is composed of mostly pure functions, and +the "#define"s are only used to shorten redundant parts of the code, +they are not meant to obfuscate much. Having that out of the way, how +are step 1 and step 2 achieved then? + +Regarding step 1, note that the large string literal "`x{bh}ndbq..." +in the last line doesn't look like C code. Moreover, it is too short +to contain even a compressed representation of all preceding and +subsequent code. Instead, the preceding code including the '"' +character has already been run through the SHA-512 computation by an +external script. The internal state of the SHA-512 computation at +that point has been extracted and encoded into the string. This works +because the preceding code is exactly 1280 bytes, which is a multiple +of 1024 bits, the block size of SHA-512. The program itself then just +continues the SHA-512 computation from that point, adding the last +1024-bit block, finalizing the hash and printing it. The last block +is taken directly from the string literal at runtime, plus the +subsequent code which consists of just '"', ';' and '\n'. Those 3 +characters are short enough to be hidden in ... well, let's leave this +as an exercise for the reader. + +To summarize, the main trick here is to move the string constant to +the end, so the preceding code can be precalculated and the subsequent +code is short enough to be hidden anywhere. + +Regarding step 2, almost all macros, functions and variables have +meaningless single-letter names. Moreover, the SHA-512 computation is +reduced to the special case of adding just one block and immediately +finalizing it, where the total size is known in advance. + +But this is not enough! For SHA-512 we need 8 initial hash values and +80 round constants, which are very characteristic. If any of them +appeared in the source, a quick web search (e.g. for 0x428a2f98d728ae22) +would tell the reader immediately what's going on. Because of the +precomputation, the 8 initial hash values are not needed, but the +80 round constants are. + +It is almost impossible to hide those 640 bytes in the source. +Luckily, the round constants where not chosen by fair dice rolls. +They are the fractional parts of certain irrational numbers, namely, +the cube roots of the first 80 primes. So the round constrants are +calculated at runtime, which makes the program shorter and adds +another layer of obfuscation. + +While this sounds like just iterating primes and executing pow(), this +turned out to be harder than expected. If we were computing SHA-256, +it would have been as simple as that, because the round constants +would have been 32-bit values. However, SHA-512 needs the cube roots +at 64-bit precision, while double has only 53-bit mantissa precision. + +Using higher-precision floating point is no option here, because the +program is meant to be portable C99. And implementing +arbitrary-precision arithmetic would have been overkill and would have +increased the program size dramatically. + +Instead, the program just multiplies. That is, it computes cubes +instead of cube roots. It steps through cube root candidates via +bisection, and calculates their cubes until those match the given +prime. Thus, we don't need floating point and can use 64-bit integers +instead. But that still doesn't solve the problem as it poses the +following new challenges: + +- Challenge 1: We can multiply at most two 32-bit numbers at once. +- Challenge 2: We need to calculate with at least 67-bit precision. +- Challenge 3: We need to truncate the cube root result. + +The reason for challenge 1 is that in portable C99, the result must +fit into the same data type. To multiply two 64-bit integers we would +need a 128-bit integer for the result. So we can at most multiply two +32-bit integers to get the 64-bit product at full precision. While +GCC and Clang both support 128-bit arithmetics, that isn't standard +and wouldn't have been portable C99. + +The reason for challenge 2 is that cube root of the 80th prime is +around 7, so we need to compute with 3 bits for the integral part and +64 bits for the fractional part. + +The reason for challenge 3 is that the cube of a 67-bit number is +3*67=201 bits, but fortunately we only need to check if it is close +enough to the actual prime. It won't be exactly e.g. "409.0000..." +anyway, but must be accurate enough to distinguish the correct cube +root from its neighbours, e.g. the same number with the 64th +fractional digit increased. + +The solution here is to split the 67-bit input into 3 integers of +24-bit each. Those are cubed using the multiplication formulas +numbers with 3 "digits" of base 2^24 each. During that calculation, +at most two values are multiplied at once, and the accuracy of +intermediate values is reduced using right-shifts as far as allowable +for the computation. Finding woking right-shift values was mostly +trial-and-error, producing correct results for the first 80 primes, +but not much more. Moreover, for some terms it was possible to leave +them out entirely, especially higher-order terms of the last digits. +Luckily, in the end, all intermediate results did fit into 64-bit +integer addition and multiplication, but that was not obvious at the +beginning. + +That's it. + +Well, I could continue with details about the encoding of the internal +state values into the string, how to avoid escaping issues, how to +find short notations for various loops, how to get rid of if(), where +the final "\";\n" is stored, how to eliminate intermediate values and +arrays by reordering of operations, and so on. But those were all +minor issues compared to the challenges described above. What's +documented here is all you need to know to write your own version of +that program. + +I'd like to finish with an open problem: + +Is it possible for the cubing and bisection to be implemented with +just two parts instead of three? That would simplify the formulas a +lot. For example, one could split the 67-value into two 34-bit parts, +but whenever one multiplies two of them, one needs to right-shift one +of them by at least 4 bits, or both by 2. Or, one splits the 67 bits +asymmetrically? I wasn't able to make it work with 2 parts, but that +doesn't have to mean anything. + +-------------------------------------------------------------------------------- + diff --git a/2019/diels-grabsch2/prog.c b/2019/diels-grabsch2/prog.c new file mode 100644 index 000000000..85bf2b349 --- /dev/null +++ b/2019/diels-grabsch2/prog.c @@ -0,0 +1,15 @@ +#include +#define f(f,g){z e=0;for(;e>b|a<<(64-b);}i(_, +(a>>6)^b(a,61)^b(a,19))i(_a,b(a,39)^b(a,28)^b(a,34))h(x,((a^b)&c)^(a&b))i(u,b(a,41)^b(a,18)^b(a,14))h(t,(((((3*(a*c+b*b)>>9)+(3* +b*c>>32))*a>>21)+(3*a*a*b>>6)+((b>>4)*(b>>4)*b>>46))>>18)+a*a*a)h(m,t((b<<16)|(c>>48),(c>>24)%(1<<24),c%(1<<24))>>48>7))g(o,0,0,c<8;c++,a*256+w[b*8+c])g(d,0,0,c<13;c++,a*31+w[b*13+c]-96)g(p,0,4,c;c/=2,a|c*m(b,a|c,a) +)g(q,0,1ull<<63,c;c/=2,a|c*m(b,p(b),a|c))g(v,b>1,2,c14),c[e]+=c[(e+9)%16]+r(c[ +(e+1)%16])+_(c[(e+14)%16])))j(k,f(8,b[e]=a[e])f(80,n(a,&e,c))f(8,a[e]+=b[e]))int main(){z a[8],b[8],c[16];f(8,a[e]=d(e))f(16,c[e +]=e-15?o(e):d(8))k(a,b,c);f(16,c[e]=e?e-15?0:11264:1ull<<63)k(a,b,c);f(8,printf("%016llx%s",a[e],e-7?"":"\n"))return!w;}y*w=(y*) +"crsmyiajqhwy{unwa|hjoi`hlxhpxrzb~edko~rtr~ileqyjk`znqgsuitvgqnfdfa||wedvnmhozkpokootqzcexeld~oibqzpcsuw{ib{x`m`hsa`jmn}wcfzpb"; diff --git a/2019/dogon/Makefile b/2019/dogon/Makefile new file mode 100644 index 000000000..ffc6dc120 --- /dev/null +++ b/2019/dogon/Makefile @@ -0,0 +1,530 @@ +#!/usr/bin/env make +# +# 2019 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + +############################# +# shell used by this Makefile +############################# +# +SHELL= /bin/bash + +####################### +# common tool locations +####################### +# +A2P= a2p +AR= ar +ASA= asa +AT= at +ATQ= atq +ATRM= atrm +AWK= awk +BANNER= banner +BASE64= base64 +BASENAME= basename +BATCH= batch +BC= bc +BINHEX= binhex +BISON= bison +BUNZIP2= bunzip2 +BZCAT= bzcat +BZCMP= bzcmp +BZDIFF= bzdiff +BZEGREP= bzegrep +BZFGREP= bzfgrep +BZGREP= bzgrep +BZIP2= bzip2 +BZLESS= bzless +BZMORE= bzmore +C2PH= c2ph +C89= c89 +C99= c99 +CAL= cal +CALC= calc +CAT= cat +CD= cd +CHFLAGS= chflags +CHGRP= chgrp +CHMOD= chmod +CKSUM= cksum +CLANG= clang +CLANG_PLUSPLUS= clang++ +CLEAR= clear +CMP= cmp +COL= col +COLLDEF= colldef +COLRM= colrm +COLUMN= column +COMPRESS= compress +CP= cp +CPIO= cpio +CPP= cpp +CRC32= crc32 +CSH= csh +CSPLIT= csplit +CURL= curl +CUT= cut +C_PLUSPLUS= c++ +C_PLUSPLUS_FILT= c++filt +DATE= date +DC= dc +DD= dd +DF= df +DIFF3= diff3 +DIFF= diff +DIG= dig +DIRNAME= dirname +ED= ed +EGREP= egrep +ENV= env +EQN= eqn +ETAGS= etags +EXPECT= expect +EXPR= expr +FALSE= false +FGREP= fgrep +FILE= file +FIND2PERL= find2perl +FIND= find +FLEX= flex +FLEX_PLUSPLUS= flex++ +FMT= fmt +FOLD= fold +FS_USAGE= fs_usage +FUNZIP= funzip +FUSER= fuser +GCC= gcc +GDIFFMK= gdiffmk +GENCAT= gencat +GENSTRINGS= genstrings +GETOPT= getopt +GETOPTS= getopts +GNUMAKE= gnumake +GREP= grep +GROFF= groff +GROFFER= groffer +GROG= grog +GROPS= grops +GROTTY= grotty +GUNZIP= gunzip +GVIM= gvim +GZCAT= gzcat +GZEXE= gzexe +GZIP_PROG= gzip +G_PLUSPLUS= g++ +H2PH= h2ph +H2XS= h2xs +HASH= hash +HEAD= head +HOSTNAME_PROG= hostname +ICONV= iconv +ID= id +INDENT= indent +INFO= info +JOT= jot +KILL= kill +KSH= ksh +LAST= last +LD= ld +LESSECHO= lessecho +LEX= len +LINK= link +LN= ln +LS= ls +M4= m4 +MAKE= make +MAN= man +MKDIR= mkdir +MKFIFo= mkfifo +MKTEMP= mktemp +MV= mv +NANO= nano +NASM= nasm +NEQN= neqn +NICE= nice +NL= nl +NM= nm +NOHUP= nohup +NROFF= nroff +NSLOOKUP= nslookup +OD= od +OPENSSL= openssl +PASTE= paste +PATCH= patch +PATHCHK= pathchk +PAX= pax +PERL= perl +PICO= pico +PR= pr +PRINTENV= printenv +PS= ps +PTAR= ptar +PTARDIFF= ptardiff +PTARGREP= ptargrep +PWD= pwd +PYDOC= pydoc +PYTHON= python +PYTHONW= pythonw +READLINK= readlink +RENICE= renice +RESET= reset +REV= rev +RI= ri +RM= rm +RMDIR= rmdir +RSYNC= rsync +RUBY= ruby +RVIM= rvim +SAY= say +SCP= scp +SCREEN= screen +SCRIPT= script +SDIFF= sdiff +SED= sed +SEQ= seq +SFTP= sftp +SH= sh +SHA1= sha1 +SHA= sha +SHAR= shar +SHASUM5_18= shasum5.18 +SHASUM= shasum +SIZE= size +SLEEP= sleep +SORT= sort +SSH= ssh +STAT= stat +STRIP= strip +STTY= stty +SUM= sum +SYNC= sync +TABS= tabs +TAIL= tail +TAR= tar +TEE= tee +TEST= test +TFTP= tftp +TIDY= tidy +TIME= time +TOP= top +TOUCH= touch +TPUT= tout +TPUT= tput +TR= tr +TROFF= troff +TRUE= true +TSET= tset +TSORT= tsort +UL= ul +UNAME= uname +UNCOMPRESS= uncompress +UNEXPAND= unexpand +UNIFDEF= unifdef +UNIFDEFALL= unifdefall +UNIQ= uniq +UNITS= units +UNLINK= unlink +UNZIP= unzip +UNZIPSFX= unzipsfx +UPTIME= uptime +UUDECODE= uudecode +UUENCODE= uuencode +UUIDGEN= uuidgen +VI= vi +VIEW= view +VIM= vim +VIMDIFF= vimdiff +W= w +WAIT4PATH= wait4path +WAIT= wait +WC= wc +WHAT= what +WHATIS= whatis +WHICH= which +WHO= who +WHOAMI= whoami +WHOIS= whois +WRTIE= write +XAR= xar +XARGS= xargs +XATTR= xattr +XXD= xxd +YACC= yacc +YES= yes +ZCAT= zcat +ZCMP= zcmp +ZDIFF= zdiff +ZEGREP= zegrep +ZFGREP= zfgrep +ZFORCE= zforce +ZGREP= zgrep +ZIP= zip +ZIPCLOAK= zipcloak +ZIPGREp= zipgrep +ZIPINFo= zipinfo +ZIPNOTE= zipnote +ZIPSPLIT= zipsplit +ZLESS= zless +ZMORE= zmore +ZNEW= znew +ZPRINT= zprint +ZSH= zsh + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +#CSILENCE= -Wno-implicit-int +CSILENCE= -Wno-bitwise-op-parentheses -Wno-format -Wno-parentheses \ + -Wno-shift-op-parentheses -Wno-sign-compare -Wno-unused-variable + +# compiler standard +# +#CSTD= +#CSTD= -ansi +#CSTD= -std=c11 +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +#ARCH= +ARCH= -march=native + +# defines that are needed to compile +# +#CDEFINE= +#CDEFINE= -DIOCCC=26 +CDEFINE= -DX=1280l -DY=1024l -DZ=0x20000000 + +# include files that are needed to compile +# +#CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +#LIBS= +#LIBS= -L ${X11_LIBDIR} +LIBS= -L ${X11_LIBDIR} -lX11 + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= +ALT_TARGET= + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic fc6b6af226b7cc598de3d48fc20ed0bd54f7b4f7f0f651a32b9cf8345b2a3b3f --FNV1a_hash_512_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --level 391581 --mode 216193 --FNV1a_hash_512_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore IAU, $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore, $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2019/dogon/apholife.c b/2019/dogon/apholife.c new file mode 100644 index 000000000..0d4331a59 --- /dev/null +++ b/2019/dogon/apholife.c @@ -0,0 +1,459 @@ +// APOHLIFE : Annotated Partially Obfuscated 64-bit Hash Life program. +// This program assumes sizeof(long)==8 (64 bits) and little endianess. +// Also unaligned (mod 8) long loads support. +// Xlib is evidently used . Should be runnable almost everywhere +// with gcc command such as: +// gcc -O3 -std=c99 apholife.c -lX11 -lm +// +// If you want to understand Hashlife The clearest description with diagrams of the recursion I found was in: +// https://jennyhasahat.github.io/hashlife.html +// You can also read Tom Rokicki article appearing in DrDobbs +// http://www.drdobbs.com/jvm/an-algorithm-for-compressing-space-and-t/184406478 +// And of course look it up in wikipedia, etc ... +// +#include +#include +#include +#include +#include +#include +#include + +#define MAXLEV 1024 // Maximal level supported by our universe. +#define W (32*40l) // Display window size +#define H (32*40l) +#define HBITS 29 // This wil determine our memory usage (hash + cells) + +#define HSIZE (1ll<>i & m4; + o+= in*2>>i & m4; + o+= in/2>>i & m4; + o+=(o << 8)+(o >> 8); // And now we have in 'o' nibbles 16 sums each of a 3*3 neighborhood. + // This line, implementing Conways GOL rule, is left as an exercise for the reader. Muhahaha... + res |= (((o+m4 & m4*6 ^ 3*m4)+m4 >> 3) & (in >> i | o) & m4) << i; + } + in=res; + } + return in>>18 & mh ; // this just returns the middle quarter-leaf as the result. +} + +// +// We have the following tricky but efficient way to encode node and leaf data in the same array of longs in +// an econmoical and aligned manner. We use 32bit indices into the array in lieu of pointers which occupy 64bit +// nowdays. This results in almost factor of 2 compression of memory usage. +// +// A node at ptr i will be encoded using three longs as follows: +// g_lmem[i] : Two upper quads ptrs (each 32 bits of course). +// g_lmem[i+1]: Upper 32bit word : Result ptr. Lower 13 bits: the log2 of step used for calculating result. 14th bit : 1. +// g_lmem[i+2]: Two lower quads ptrs. +// +// A leaf at ptr i will be encoded using two longs as: +// g_lmem[i] : 64 bits of the 8*8 leaf. +// g_lmem[i+1]: Upper 32bit word: Result 4*4 encoded in lower nibble of each byte. Lower 13 bits same as above. 14th bit: 0. +// +// Notice this encoding can support upto 2^32 pointers which would +// mean g_lmem would be 32 Gbytes and together with a hash of a reasonable load factor we would probably +// need more than 48 GBytes of RAM in order to run out of usable encoding space. +// +ulong *g_lmem; +unsigned *g_hash; +// +// The following functions/Macros are heavily used in the hashlife algorithm which is essentialy all about +// splitting cells into four quadrants, and then creating new cells by joining four quadrants. +// We use the term cell to denote *both* leafs and nodes which are stored of course in the same hash. +// Quads are always stored in an array conviently called q, with an implicit assumption +// that q is 2D with stride *Four*. I.e. to move vertically in q we need to add/sub 4 ... +// This way we naturally have a 4*4 array structure on a q[16] vector needed for hashlife recursion. +// We call the quads of each quad subquads. So we can say in q there are four quads and sixteen subquads. + +// This QUADLOOP macro is used to shorten many loops in the code that work on 4 quads/subquads. +#define QUADLOOP(x) {int j; for(int i=0;i<4;i++) {j=i+(i&2); x;} } // j is quad index in q. + +// Get a quad (indexed by i) from a cell pointer. +// The main complication here is the case of leaves that gets splitted to quarters-leaves differenty. +// Notice that here is the single place we actualy assume little endianity, as it affects the expression +// to get two 32bit words out of each long. +unsigned getquad(unsigned cell,int i){ + return g_lmem[cell+1]&8192 ? g_lmem[cell+(i&2)] >> i%2*32 : g_lmem[cell] >> i%2*4+16*(i&2)&mh ; +} + +// This mq function does the splitting of a cell into four quads and stores them in the q array. +void mq(unsigned cell,unsigned *q) { + QUADLOOP (q[j]=getquad(cell,i)); +} + +// This GQ macro is using the q array and generates the union of four cells there using the main +// hget hash lookup/update recursive function. All our recursions are done using this macro. +#define GQ(i,level,flags) hget(q+(i),(level)*4+flags) + +unsigned calc_result(unsigned cell,ulong leaf,ulong lh,unsigned *q,int level,int res_step); + +// This single hget routine will do most of the work for us. +// It will get (or create a new) node or leaf from the hash, looking it up from its four quarters. +// The four quarters are passed in the qi array, as usual in places 0,1, 4 and 5. +// In the level argument's 2 low bits we have flags described below. +// level>>2 is the level of the joined node made from the quarters, where 0 is for a leaf. +// Remember that quarter leaf encoding is always an unsigned with low nibbles only containing the 4*4 data. +// level&2: If on, we just return the joined node. If 0 we return the joined node's *Result*. +// level&1: Signals "half" recursion mode, Where we join four middle *quarters* of the 4 inputs, to produce a middle quad, +// In that case we return this middle cell's node (and not the middles result). +unsigned hget(unsigned* qi, int level) +{ + ulong leaf,lh,ll; + int lv=level>>2; + unsigned hind=0; // Wil be used to calculate hash function + unsigned cell; + + ulong *data=(ulong *)qi; // Here we seem to use little endianity but in fact we dont. as we store + // and compare the q unsigned array contents to the g_lmem long array. + // What we do use is tha fact longs can be loaded and stored from *unaligned* + // addresses. So we break pointer punning. + if(lv>0) { + if(level&1) { + unsigned q[6]; + QUADLOOP(q[j]=getquad(qi[j],i^3)); // That ^3 will neatly give us the 4 middle subquads to be joined into middle quad. + return GQ(0,lv-1,2); + } + QUADLOOP(hind=917*hind+qi[j]); // Our node hash function ... + leaf=data[0]; // Misleading but used for the hash lookup + lh=data[2]; + } + else { + // Inputs in qi are quarter leaves. + hind= (ll=qi[0]|qi[1]<<4) + 719*(lh=qi[4]|qi[5]<<4); // Hash calculation and create two longs... + // A bit tricky but that will be the quarter leaf mid of the joined leaf. + if(level&1) return (ll>>18)&0xf0f | (lh&0x3c3c)<<14; + leaf= ll | lh <<32; + } + + // Do linear hash probing, nice and simple ... + for(; cell=g_hash[hind&=HMASK]; hind++) + if (leaf==g_lmem[cell] && (!lv || g_lmem[cell+2]==lh) && !!lv == (g_lmem[cell+1]>>13&1)) break; + + // The last condition above is to avoid a very rare and subtle bug that can happen, for example + // when searching a leaf, we might find a node instead whose lower data is identical to the leaf's bits + // *and* its hash is also similar/close. This is possible but the probablity is very low indeed. + // The probablity of encountering this bug is so low that the actual obfuscated entry has not got + // the fix above but the bug does not seem to happen on the supplied patterns. + + int res_step= lv+1; // res_step is the maximal timestep we can get result for. + if(res_step > g_step) res_step=g_step; // Notice that if g_step is small, res_step will not be maximal. + // This will mean we will do half recursion later. + if (!cell || g_lmem[cell+1]&8191^res_step) { + // We enter here whenever we need to (re) calculate result, either because g_step changed or + // if its a new cell. In principle result needs to be recalculated whenever g_step was increased + // compared to earlier calculation but also upon decrease. Though notice that when g_step is high + // and the cell is lower level, g_step changing will not affect res_step. + cell=g_hash[hind]=calc_result(cell,leaf,lh,qi,lv,res_step); + } + // Remember the result is always in cell+1 high part ... + return (level&2) ? cell: g_lmem[cell+1]>>32; +} + +// This g_ptr variable is the pointer to the g_lmem nodes/leaf array where we will allocate the next cell. +unsigned g_ptr=2; // skip the 0 which is null ptr in the hash. Start from 2 in order to leave space + // at zero used by the getin leaf reading code. +// +// Finaly we reached the most intersting part of result calculation / hashlife recursion. +// After all the ground work we've layed before, it becomes surprsingly short, heck the +// comments are longer than the code ! +// +unsigned calc_result(unsigned cell,ulong leaf,ulong lh,unsigned *qi,int level,int res_step) +{ + if(!cell) { // Create a new one ... + g_lmem[cell=g_ptr]=leaf; + g_lmem[g_ptr+=2]=lh; // This will write some junk in case of leaf but we dont care + g_ptr+= level>0; + } + if(!level) { + g_lmem[cell+1]=res_step|(q8x8(leaf)<<32); + } + else { + int j; + unsigned q[16]; + // Finaly we have reached Hashlifes glorious recusion: make new node from four quadrants and calculate its result. + // A neat obfuscation/compression trick here is that q can be updated in-place shrinking from 4*4 to 3*3 to 2*2, + // all during the sub-steps in the hashlife recursion calculation. Its recommended looking at the link above for + // some diagrams describing this recursion. + // 'hr' flag will indicates half recursion. All it does is, that in the second sub-step the 4 recursive calls just join + // cells to calculate middle cell, rather then calculate result forward in time. + // + // This QUADLOOP wil create the 16 subquads data in q. + // Notice that rather conveniently 2*j here is just 0,2,8,10 which are indices of the quads we want inside the 4*4 q. + QUADLOOP(mq(qi[j],q+2*j)); + unsigned hr = level>g_step-1; + + // The whole recursion stuff just becomes the two innocently looking loops below, and hopefuly gcc is decent + // enough to unroll them under -O3 so its also rather efficient as well... + for(int i=0;i<11;i++) if((i+1)&3) q[i]=GQ(i,level-1,0); // Neatly do the first step. 9 recursive calls. + QUADLOOP(q[j]=GQ(j, level-1, hr)); //Second step. four recursive calls, and QUADLOOP can be used.... + + // We get our final result from q by a simple quads join... + ulong result= GQ(0,level-1,2); + g_lmem[cell+1]=res_step|8192|(result<<32); + } + return cell; +} + +// Create the empty space cells/empty universe. Must happen before getin. +void init_empty_space(int maxlev) +{ + unsigned q[16]; + unsigned cell=0; + for(unsigned i=0;i= MAXLEV) { + g_freeze=1; + return cell; + } + if(target>32; // Thats the expanded cell's result which does the actual timestep! + // + // Now we need to see if the result can be shrunk (i.e. is at a too high level). + // + while(--level > 0) { + mq(cell,q+10); // Split cell into 4 quads at index 10 (the bottom right quad) + QUADLOOP(mq(q[10+j],q+2*j)); // after this we are back with 16 subquads of original cell. + // Thats rather condensed but if the loop below finds one of the external 12 quads + // is nonempty it just returns with the current cell value. + for(int i=0;i<16;i++) if((i^i/2)&5^5 && q[i] != 3*level-4) {*ilevel=level; return cell;} + cell=GQ(5,level-1,2); // Shrink by one level to the middle quad. + } +} + +#define MAXMOVES 500000 +unsigned g_cells[MAXMOVES]; // Will be use to hold input cells and then later to hold moves history +double g_gens[MAXMOVES]; // Will be use to hold gens history + +// We even have some minimal error handling here :) +void error(char *s) {printf("%s\n",s);exit(1);} +// +// This is our input routine, reading marocell (.mc) golly format. +// Its quite pedantic but hopefuly does not dump cores on bad input :) +// +int getin(FILE *f,int *lv) +{ + char c,line[100]; + static int lev,skip; // Skip is needed to skip Gollys header line. + unsigned cell,q[16]; + unsigned iptr=1; // Start input counter from 1 as defined by .mc format. + while(fgets(line,100,f)) { + if(skip++ && line[0]!='#') { + if(sscanf(line,"%d%d%d%d%d",&lev,q,q+1,q+4,q+5)==5){ + lev-=3; + // Put the Referenced nodes into q array. Notice that 0 uses the formula for the empty cell... + QUADLOOP(if(q[j]>=iptr)error("Bad node input data")); + QUADLOOP(q[j]=q[j]?g_cells[q[j]]:lev*3-1); + } + else { + // Put 64 bits leaf pattern into g_lmem[0]. + lev=g_lmem[0]=0; + int l=0,j=0,i=0; + while(c=line[i++]){ + if(c=='*') { + if(l*8+j>64) error("Bad leaf input data"); + g_lmem[0]|=1l< 6) return; + double width2=ldexp(W,g_pscale-5); + double height2=ldexp(H,g_pscale-5); + if(sx >= g_mx+width2 || sx+sz<=g_mx-width2) return; + if(sy >= g_my+height2 || sy+sz<=g_my-height2) return; + double ox=(sx-g_mx+width2); + double oy=(sy-g_my+height2); + unsigned *pout=g_out+lround(ldexp(oy,4-g_pscale))*g_stride + lround(ldexp(ox,4-g_pscale)); + if(level <= g_pscale-7) { // Our cell is smaller than a single pixel, its non empty though, so we set it. + *pout=-1; //Yes Virginia, -1 is needed here to get white color .... + return; + } + if(level) { + level--; sz*=0.5; + // Notice QUADLOOP macro is also usefull for this quadrants draw loop recursion. + unsigned q[6]; + mq(cell,q); + QUADLOOP(draw(q[j],level,sx+i%2*sz,sy+i/2*sz,cx*2+i%2,cy*2+i/2)); + } + else { + int z0=0,z=4-g_pscale; + if(z<0) { + z0=-z; + z=0; + } + // Generate color background pattern, another nice? coding riddle.. + cx^=cy; unsigned background=0x22<<(cx&8?8:cx&64?16:24); + // Leaf drawing here supports both positive zoom of upto 4 and negative ofcourse. + ulong in=g_lmem[cell]; + for(int i=0;i<8<>z0)*g_stride+(j>>z0)] |= + (!i|!j && g_pscale<4) ? 0x80 : // This is the condition to draw leaf borders + (in>>((i>>z)*8+(j>>z)))&1 ? -1 : background; + } + } + } +} + +int g_adv=0, g_dir=0, g_sstep=0; + +void processEvent(Display *d, Window win, XImage *xi) +{ + XEvent ev; + if(XCheckWindowEvent(d,win,1,&ev)&&ev.type==KeyPress) { + int N=XLookupKeysym(&ev.xkey,0)&255; + // The keys ui is documented in the IOCCC entry remarks... + if (N==27) { exit(0);} // Use escape key to exit ... + if (N==83) { g_mx+=5l<= MAXMEM-g_ptr || curr>=MAXMOVES-3) { + g_freeze=curr; + } + } + else if(curr2) { + lev=g_cells[curr-=2]; cell=g_cells[curr-1]; gen=g_gens[curr/2]; + } + } + if(curr>2) { + printf("G: %g M: %d L%d S%d%s\n",gen,g_ptr,lev,g_pscale,g_freeze?" (Frozen)":""); + } + } + if(g_sstep)g_adv=0; + } +} diff --git a/2019/dogon/glider.mc b/2019/dogon/glider.mc new file mode 100644 index 000000000..8df22acff --- /dev/null +++ b/2019/dogon/glider.mc @@ -0,0 +1,4 @@ +[M2] (golly 2.0) +#C glider +$$..*$...*$.***$$$$ +4 0 0 0 1 diff --git a/2019/dogon/gotts-dots.mc b/2019/dogon/gotts-dots.mc new file mode 100644 index 000000000..882033782 --- /dev/null +++ b/2019/dogon/gotts-dots.mc @@ -0,0 +1,36 @@ +[M2] (golly 2.0) +#C 'Gotts Dots': sprouts its nth switchengine at t ~ 2^(24n-6) -- +#C 41 ON cells, growth rate O(t ln t): Bill Gosper, 11 March 2006 +#C More precisely, at t = 215643, 3662092278363, 61439713210231265883, +#C ..., = 3 (4281 4096^(2 n - 1) - 211655)/241 whereat the +#C populations go 316387, 5742718768151, 103173468009186875005, ..., +#C = (9280232545511 2^(24 n) - 888556308770717696)/529964572999680 +#C + (614 + 1427 2^(24 n - 12)/241) n. 25 Jan 2015 +$$$$$$$*$ +4 0 0 1 0 +5 0 0 2 0 +6 0 0 3 0 +7 0 0 4 0 +8 0 0 5 0 +*$*$ +$$....*$.....*.*$......*$ +$$*$$.*$.*$.*$ +4 7 0 8 9 +5 10 0 0 0 +6 11 0 0 0 +7 12 0 0 0 +$$$$$$$.*$ +$......*$.......*$...*$....**$...*$.......*$......*$ +..*$..*$***$$$$***$..*$ +4 0 14 15 16 +5 0 0 0 17 +$$.......*$$..*$...*****$ +4 0 19 0 0 +$$$*$*$*$ +..*$.*$ +4 21 22 0 0 +5 20 23 0 0 +6 0 18 0 24 +7 25 0 0 0 +8 13 26 0 0 +9 0 6 0 27 diff --git a/2019/dogon/hint.html b/2019/dogon/hint.html new file mode 100644 index 000000000..577b0100b --- /dev/null +++ b/2019/dogon/hint.html @@ -0,0 +1,177 @@ + + + + + + Best use of space and time + + +

    Best use of space and time

    + +

    Gil Dogon

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./prog < pattern.mc
    +
    + +

    Try:

    + +
    ./prog < glider.mc
    +
    +./prog < infinite_5x5.mc
    +
    +./prog < mosquito5.mc
    +# Press the minus key a few times until you see white specks,
    +# then press space, and the ] key a few times.
    +
    +./prog < message.mc
    +
    + +

    Selected Judges Remarks:

    + +

    1991/davidguy, +2011/blakely,…

    + +

    …This entry likely concludes the IOCCC category “Cellular automata simulators”, +it would be very hard to beat it on its field.

    + +

    FYI: The .mc extension stands for Golly macrocell format.

    + +

    We truly have not much more to add, except two things:

    + +
      +
    • If a large sparse pattern is given, at the start of the program +you are much more likely to see a blank board rather than the loaded configuration, +and to see it, you may need to zoom out a few times.

    • +
    • if you’re using a virtual machine with less than 4 Gb of available +model RAM, you’d want to reduce the value of the Z define in the Makefile +to 0x10000000, otherwise the entry will promptly crash.

    • +
    + + +

    In the interest of saving lives, this entry was not fuzzed.

    + +

    Author’s comments:

    + +

    What is it?

    + +

    Just run with no arguments on an X11-compatible system using one of the supplied input .mc files as standard input. Press ‘-’ several time to zoom out if neccessary, then press space. For acceleration press ‘]’ several times. Thats rather quick dont you think?

    + +

    Historical Timeline.

    + +
      +
    • 3.5 Billion years ago: Microrganism life appears on earth
    • +
    • 3000 BC: Ankh symbol is used in Egyptian hyroglyphs to represent life.
    • +
    • 1940s: John Von Neumann and Stanislav Ulam are interested in artificial life eventually kick starting research on Cellular Automata.
    • +
    • 1970: J.H. Conways research discovers a rather minimal set of rules that seems quite interesting. Conways game of life gets published in Gardners Scientific American column.
    • +
    • 1970’s: According to Knuth, a significant portion of computer time in the world is spent simulating GOL, mostly without the awareness of the people footing the bill.
    • +
    • 1984: Bill Gosper invents the Hashlife algorithm. His implementation runs on Symbolics Lisp Machines. Unrelated to that, but in a cosmic coincidence the first IOCCC is run!
    • +
    • December 2000: Tom Rokicki has a breakthrough implementing Hashlife in C, efficient, stable and production ready for modern machines.
    • +
    • 2006: First version of Golly by Andrew Trevorrow and Tomas Rokicki. Brings the delights of hashlife to the masses.
    • +
    + + +

    Which brings us to the present moment in time.

    + +

    Full documentation and keys UI.

    + +

    Yes, this program is Conway’s game of life graphic simulator implementing Bill Gosper’s hash life algorithm. The entry’s UI is rather terse and somewhat obfuscated, as it should be. Also, when you accidentally, or not, press any of the keys not specified bellow, some stuff will happen or not, there is no guarantee whatsoever.

    + +

    The program should be used as follows:

    + +

    The standard input should contain a Golly macrocell format file for a two state automaton. See: http://golly.sourceforge.net/Help/formats.html. Of course only Conways GOL rules are supported, so rules in the files are ignored. The supplied input examples should be quite interesting. Except one, all are taken from Golly’s standard distribution. Information and credits to their designer are in the header comment of each.

    + +
      +
    • For image navigation use the arrow keys, and zoom in and out by the +/- keys (without pressing the shift on the +)
    • +
    • Space : Toggle start/stop.
    • +
    • 0(zero): Toggle single step/free run mode.
    • +
    • Backspace: Toggle direction for the arrow of time.
    • +
    • ]: Increase speed (time step) by a factor of 2.
    • +
    • [: Decrease speed (time step) by a factor of 2.
    • +
    + + +

    Notice that when going backward in time we ignore current timestep setting and just jump by the amount that was specified before. However going forward is always using the current time step.

    + +

    There is a minimal text printout by the program, so you can know what Generation your are in(G:), Internal memory allocated till now (M:), and then which Level is the current macrocell (L) and which zoom Scale you are watching (S).

    + +

    Portability issues.

    + +

    This entry is quite portable hopefully on most modern platforms. It assumes X Window support of course. More than 2GBytes memory is recommended. Configuration through makefile is provided for the display windows size and for the memory usage. The makefile provided configuration (Z=0x20000000) will need a system with 4GB DRAM to run nicely. There are several other salient assumptions though:

    + +
      +
    • The entry assumes sizeof(long)=8. However it actually almost avoids using any pointers which are 64 bits this days, in order to save space. On machines with sizeof(long)=4 try adding #define long long long …
    • +
    • The entry assumes the X11 displays default visual has 24 bit depth (RGB).
    • +
    • The entry assumes little endianity (in only one place though! if you have powerpc you can try and find that place to make it work), but more than this it assumes unaligned loads of 64 bits longs are supported, i.e. it assumes that a long can be loaded from any address that could hold an int otherwise. On non antiquated X86 you’ll be fine.
    • +
    • The entry heavily relies on bit complement arithmetic (you dont say!).
    • +
    + + +

    Limitations.

    + +

    Foremost the entry is very strict, unsafe and picky regarding its input. Anything straying from the standard Golly macrocell legal format will result in undefined behavior, meaning mostly a very defined core dump. Since aforementioned core is rather large by default (about 4Gb) it is highly recommended to ‘set limit coredumpsize 0’ in the shell before playing with fire …

    + +

    This entry needs quite a lot of memory to be effective, but by modern standards that is not too much. It does not do any garbage collection, so sooner or later memory will run out, resulting, surprise, surprise, in a core dump. On the plus side, this enables the nice time reversal feature… Anyway the amount of memory used can be controlled by the Makefile -DZ=… argument. With the default Z, the program will support in total about 240 million 64bit longs for the internal memory, which should be sufficient for about 100 million nodes+leafs, as each node is 3 longs and each leaf is 2. +Important: Makefile Z define must be apower of two!

    + +

    Zooming out past about S58 scale will enter a buggy twilight zone as only long integers are used in the drawing code. Reverting to doubles could have remedied that, but then I’d need to use a lot of ldexps which would take the program over the size limit. Also the program will crash once the universe goes past level 64, though this is simply fixed by modifying a single constant in the program, can you find it ? Anyway 258 squared is quite a big enough universe for such a tiny progam to simulate, no ?

    + +

    In case cell memory did not run out, or your pattern did not grow too big, and you have had patience enough and did not increase speed too much, you can run out of the history buffer after 33333 steps.

    + +

    If all of the above did not happen and result in the expected core dump, you will encounter the final limitation, which is the absence of an escape key. Just close the window or use ^C to exit ….

    + +

    Warnings.

    + +

    Oh don’t get me started on the torrent of litanies gcc emits when used with -Wall ! Does it think I have not memorized by heart C’s precious operator precedence table (or at least have a cheatsheet nearby) that it dares suggest extra parentheses that would take the program over the limit ? And what if I do not use a variable here or there, do I have to pay extra tax for every orphaned variable?

    + +

    There is the reasonable warning about some longs printed as ints but its OK too, trust me.

    + +

    Then there’s the warning about ‘gets’ being unsafe, which is indeed the only one that appears by default in some versions of gcc linker. Yes Virginia, I know it is unsafe, and I would not recommend anyone using this entry as part of a web daemon, or a spaceship, no, Seriously Dont do that!

    + +

    Obfuscations.

    + +

    Well almost none of the obfuscations are done on purpose, but mostly out of necessity, so all identifiers possible to be one character, are, and they are mercilessly reused. In the main There’s even a nice little identifier first used as a global and then reused (shadowed) in the same scope, and this did not produce even a lile squeak of a warning from the compiler! Macro compression is raher sparingly used, however Magic numbers abound everywhere, and bit twiddling is magical too. Do you know for example why we have unsigned F=-1 ? (No warning there of course :) Hint:Later in the program you have F/=17. Did that make any sense? Further hint: print the resulting F in hexadecimal…

    + +

    And yes, the layout hint involves a mix of the most trendy typographical character juxtaposed against a very ancient one, Not to mention the program includes some famous name dropping and documents itself as usual.

    + +

    Further spoilers, engineering, and obfuscation galore.

    + +

    Those wait for you, curious and interpid reader, in the attached apohlife.c file, Which is a partially obfuscated version of the program I wrote with a lot of helpful annotations and comments for myself and posterity, revealing some of the magic under the hood. This program is also a somewhat improved version which uses ldexps in the draw routine and has bigger constants, so it can zoom up to level 1024 if memory allows, and it tries its best to avoid dumping core on the poor user when its memory runs out, rather it enters freeze mode where you can still travel in calculated frozen space-time. Well, its no nice and tame, it even has an escape key, usage message, and to top it all it even avoids gets!

    + +

    Special thanks.

    + +

    To Tom Rockiki, the original co-writer of Golly, a personal friend and hashlife master, who reviewed some earlier versions of the entry and freely shared some of his vast knowledge regarding GOL programming and hashlife. As a free bonus, Tom has allowed me to show his code which is probably the most efficient yet most obfuscated way of calculating the GOL function on a 64 bits 8*8 leaf:

    + +

    c +unsigned long life8x8(long a) { unsigned long aw = a << 1, ae = a >> 1, s0 = aw ^ ae, s1 = aw & ae, hs0 = s0 ^ a, hs1 = (s0 & a) | s1, hs0w8 = hs0 >> 8, hs0e8 = hs0 << 8, hs1w8 = hs1 >> 8, hs1e8 = hs1 << 8, ts0 = hs0w8 ^ hs0e8, ts1 = (hs0w8 & hs0e8) | (ts0 & s0); return (hs1w8 ^ hs1e8 ^ ts1 ^ s1) & ((hs1w8 | hs1e8) ^ (ts1 | s1)) & ((ts0 ^ s0) | a); } + +This uses only 19 bitwise operations and six shifts to calculate the inner 6x6 next generation bits of the input 8x8 !

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2019, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2019/dogon/hint.text b/2019/dogon/hint.text new file mode 100644 index 000000000..e31e67c9a --- /dev/null +++ b/2019/dogon/hint.text @@ -0,0 +1,132 @@ +# Best use of space and time + +Gil Dogon + + +## Judges' comments: +### To use: + + make + + ./prog < pattern.mc + +### Try: + + ./prog < glider.mc + + ./prog < infinite_5x5.mc + + ./prog < mosquito5.mc + # Press the minus key a few times until you see white specks, + # then press space, and the ] key a few times. + + ./prog < message.mc + +### Selected Judges Remarks: + +[1991/davidguy](http://ioccc.org/years-spoiler.html#1991_davidguy), +[2011/blakely](http://ioccc.org/years-spoiler.html#2011_blakely),... + +...This entry likely concludes the IOCCC category "Cellular automata simulators", +it would be very hard to beat it on its field. + +FYI: The .mc extension stands for Golly macrocell format. + +We truly have not much more to add, except two things: + +* If a large sparse pattern is given, at the start of the program + you are much more likely to see a blank board rather than the loaded configuration, + and to see it, you may need to zoom out a few times. + +* if you're using a virtual machine with less than 4 Gb of available + model RAM, you'd want to reduce the value of the Z define in the Makefile + to 0x10000000, otherwise the entry will promptly crash. + +In the interest of saving lives, this entry was not fuzzed. + +## Author's comments: +### What is it? +Just run with no arguments on an X11-compatible system using one of the supplied input .mc files as standard input. Press '-' several time to zoom out if neccessary, then press space. For acceleration press ']' several times. Thats rather quick dont you think? + +### Historical Timeline. + * 3.5 Billion years ago: Microrganism life appears on earth + * 3000 BC: Ankh symbol is used in Egyptian hyroglyphs to represent life. + * 1940s: John Von Neumann and Stanislav Ulam are interested in artificial life eventually kick starting research on Cellular Automata. + * 1970: J.H. Conways research discovers a rather minimal set of rules that seems quite interesting. Conways game of life gets published in Gardners Scientific American column. + * 1970's: According to Knuth, a significant portion of computer time in the world is spent simulating GOL, mostly without the awareness of the people footing the bill. + * 1984: Bill Gosper invents the Hashlife algorithm. His implementation runs on Symbolics Lisp Machines. Unrelated to that, but in a cosmic coincidence the first IOCCC is run! + * December 2000: Tom Rokicki has a breakthrough implementing Hashlife in C, efficient, stable and production ready for modern machines. + * 2006: First version of Golly by Andrew Trevorrow and Tomas Rokicki. Brings the delights of hashlife to the masses. + +Which brings us to the present moment in time. + +### Full documentation and keys UI. +Yes, this program is Conway's game of life graphic simulator implementing Bill Gosper's hash life algorithm. The entry's UI is rather terse and somewhat obfuscated, as it should be. Also, when you accidentally, or not, press any of the keys not specified bellow, some stuff will happen or not, there is no guarantee whatsoever. + +The program should be used as follows: + +The standard input should contain a Golly macrocell format file for a two state automaton. See: http://golly.sourceforge.net/Help/formats.html. Of course only Conways GOL rules are supported, so rules in the files are ignored. The supplied input examples should be quite interesting. Except one, all are taken from Golly's standard distribution. Information and credits to their designer are in the header comment of each. + +* For image navigation use the arrow keys, and zoom in and out by the +/- keys (without pressing the shift on the +) +* Space : Toggle start/stop. +* 0(zero): Toggle single step/free run mode. +* Backspace: Toggle direction for the arrow of time. +* ]: Increase speed (time step) by a factor of 2. +* [: Decrease speed (time step) by a factor of 2. + +Notice that when going backward in time we ignore current timestep setting and just jump by the amount that was specified before. However going forward is always using the current time step. + +There is a minimal text printout by the program, so you can know what Generation your are in(G:), Internal memory allocated till now (M:), and then which Level is the current macrocell (L) and which zoom Scale you are watching (S). + + +### Portability issues. +This entry is quite portable hopefully on most modern platforms. It assumes X Window support of course. More than 2GBytes memory is recommended. Configuration through makefile is provided for the display windows size and for the memory usage. The makefile provided configuration (Z=0x20000000) will need a system with 4GB DRAM to run nicely. There are several other salient assumptions though: + + * The entry assumes sizeof(long)=8. However it actually almost avoids using any pointers which are 64 bits this days, in order to save space. On machines with sizeof(long)=4 try adding #define long long long ... + * The entry assumes the X11 displays default visual has 24 bit depth (RGB). + * The entry assumes little endianity (in only one place though! if you have powerpc you can try and find that place to make it work), but more than this it assumes unaligned loads of 64 bits longs are supported, i.e. it assumes that a long can be loaded from any address that could hold an int otherwise. On non antiquated X86 you'll be fine. + * The entry heavily relies on bit complement arithmetic (you dont say!). + +### Limitations. +Foremost the entry is very strict, unsafe and picky regarding its input. Anything straying from the standard Golly macrocell legal format will result in undefined behavior, meaning mostly a very defined core dump. Since aforementioned core is rather large by default (about 4Gb) it is highly recommended to 'set limit coredumpsize 0' in the shell before playing with fire ... + +This entry needs quite a lot of memory to be effective, but by modern standards that is not too much. It does not do any garbage collection, so sooner or later memory will run out, resulting, surprise, surprise, in a core dump. On the plus side, this enables the nice time reversal feature... Anyway the amount of memory used can be controlled by the Makefile -DZ=... argument. With the default Z, the program will support in total about 240 million 64bit longs for the internal memory, which should be sufficient for about 100 million nodes+leafs, as each node is 3 longs and each leaf is 2. +*Important:* Makefile Z define must be apower of two! + +Zooming out past about S58 scale will enter a buggy twilight zone as only long integers are used in the drawing code. Reverting to doubles could have remedied that, but then I'd need to use a lot of ldexps which would take the program over the size limit. Also the program will crash once the universe goes past level 64, though this is simply fixed by modifying a single constant in the program, can you find it ? Anyway 2^58 squared is quite a big enough universe for such a tiny progam to simulate, no ? + +In case cell memory did not run out, or your pattern did not grow too big, and you have had patience enough and did not increase speed too much, you can run out of the history buffer after 33333 steps. + +If all of the above did not happen and result in the expected core dump, you will encounter the final limitation, which is the absence of an escape key. Just close the window or use ^C to exit .... + +### Warnings. +Oh don't get me started on the torrent of litanies gcc emits when used with -Wall ! Does it think I have not memorized by heart C's precious operator precedence table (or at least have a cheatsheet nearby) that it dares suggest extra parentheses that would take the program over the limit ? And what if I do not use a variable here or there, do I have to pay extra tax for every orphaned variable? + +There is the reasonable warning about some longs printed as ints but its OK too, trust me. + +Then there's the warning about 'gets' being unsafe, which is indeed the only one that appears by default in some versions of gcc linker. Yes Virginia, I know it is unsafe, and I would not recommend anyone using this entry as part of a web daemon, or a spaceship, no, Seriously Dont do that! + +### Obfuscations. +Well almost none of the obfuscations are done on purpose, but mostly out of necessity, so all identifiers possible to be one character, are, and they are mercilessly reused. In the main There's even a nice little identifier first used as a global and then reused (shadowed) in the *same* scope, and this did not produce even a lile squeak of a warning from the compiler! Macro compression is raher sparingly used, however Magic numbers abound everywhere, and bit twiddling is magical too. Do you know for example why we have unsigned F=-1 ? (No warning there of course :) Hint:Later in the program you have F/=17. Did that make any sense? Further hint: print the resulting F in hexadecimal... + +And yes, the layout hint involves a mix of the most trendy typographical character juxtaposed against a very ancient one, Not to mention the program includes some famous name dropping and documents itself as usual. + +### Further spoilers, engineering, and obfuscation galore. +Those wait for you, curious and interpid reader, in the attached apohlife.c file, Which is a partially obfuscated version of the program I wrote with a lot of helpful annotations and comments for myself and posterity, revealing some of the magic under the hood. This program is also a somewhat improved version which uses ldexps in the draw routine and has bigger constants, so it can zoom up to level 1024 if memory allows, and it tries its best to avoid dumping core on the poor user when its memory runs out, rather it enters freeze mode where you can still travel in calculated frozen space-time. Well, its no nice and tame, it even has an escape key, usage message, and to top it all it even avoids gets! + +### Special thanks. +To Tom Rockiki, the original co-writer of Golly, a personal friend and hashlife master, who reviewed some earlier versions of the entry and freely shared some of his vast knowledge regarding GOL programming and hashlife. As a free bonus, Tom has allowed me to show his code which is probably the most efficient yet most obfuscated way of calculating the GOL function on a 64 bits 8*8 leaf: + +````c +unsigned long life8x8(long a) { unsigned long aw = a << 1, ae = a >> 1, s0 = aw ^ ae, s1 = aw & ae, hs0 = s0 ^ a, hs1 = (s0 & a) | s1, hs0w8 = hs0 >> 8, hs0e8 = hs0 << 8, hs1w8 = hs1 >> 8, hs1e8 = hs1 << 8, ts0 = hs0w8 ^ hs0e8, ts1 = (hs0w8 & hs0e8) | (ts0 & s0); return (hs1w8 ^ hs1e8 ^ ts1 ^ s1) & ((hs1w8 | hs1e8) ^ (ts1 | s1)) & ((ts0 ^ s0) | a); } +```` +This uses only 19 bitwise operations and six shifts to calculate the inner 6x6 next generation bits of the input 8x8 ! + +-------------------------------------------------------------------------------- + diff --git a/2019/dogon/infinite.mc b/2019/dogon/infinite.mc new file mode 100644 index 000000000..2d391a861 --- /dev/null +++ b/2019/dogon/infinite.mc @@ -0,0 +1,4 @@ +[M2] (golly 2.0) +#C Infinite Growth by Paul Callahan +$$.***.*$.*$....**$..**.*$.*.*.*$$ +4 0 0 0 1 diff --git a/2019/dogon/infinite_10cell.mc b/2019/dogon/infinite_10cell.mc new file mode 100644 index 000000000..b9fa37ba5 --- /dev/null +++ b/2019/dogon/infinite_10cell.mc @@ -0,0 +1,4 @@ +[M2] (golly 2.0) +#C Infinite Growth by Paul Callahan +......*.$....*.**$....*.*.$....*...$..*.....$*.*.....$ +4 1 0 0 0 diff --git a/2019/dogon/infinite_5x5.mc b/2019/dogon/infinite_5x5.mc new file mode 100644 index 000000000..2d391a861 --- /dev/null +++ b/2019/dogon/infinite_5x5.mc @@ -0,0 +1,4 @@ +[M2] (golly 2.0) +#C Infinite Growth by Paul Callahan +$$.***.*$.*$....**$..**.*$.*.*.*$$ +4 0 0 0 1 diff --git a/2019/dogon/infinite_minimal.mc b/2019/dogon/infinite_minimal.mc new file mode 100644 index 000000000..d7f74c2f2 --- /dev/null +++ b/2019/dogon/infinite_minimal.mc @@ -0,0 +1,5 @@ +[M2] (golly 2.0) +#C Infinite Growth by Paul Callahan +$$$$$$..*..**.$..******$ +$$$$$$****.*$.**..*$ +4 1 2 0 0 diff --git a/2019/dogon/jagged.mc b/2019/dogon/jagged.mc new file mode 100644 index 000000000..f29f39eb6 --- /dev/null +++ b/2019/dogon/jagged.mc @@ -0,0 +1,152 @@ +[M2] (golly 2.0) +#C Jagged lines of gliders, formed by a drifting collision of two +#C LWSS streams, crash to form an approximately vertical jagged line +#C of pairs of blocks. I don't know if the line stays within a +#C bounded distance of the center line, or extends infinitely far to +#C the left, or to the right, or both. +#C Dean Hickerson, 5/3/2005 +$$$$$$$..*$ +4 0 0 0 1 +$$$$$$$*$ +4 0 0 0 3 +5 0 0 2 4 +6 0 0 0 5 +$$$$$$$....*$ +4 0 0 7 0 +4 0 0 1 0 +5 0 0 8 9 +6 0 0 10 0 +7 0 0 6 11 +$$$$****$*...*$*$.*$ +$$$$.**$**.**$.****$..**$ +4 0 0 13 14 +$$$.......*$ +4 0 0 0 16 +$$...**$..*..*$..*..*$..**.**$....**$ +$.....*$.....**$.......*$..*****$..****$..*$ +$$****$*...*$*$.*$ +$...***$..*****$.**.***$..**$ +4 18 19 20 21 +$$...*$....**$...**$ +$$$$$$...**$..****$ +4 0 23 24 0 +5 15 17 22 25 +.***$**.*$***$.**....*$.......*$ +$.***$*****$*.***$**$ +$.***$*..*$...*$...*$...*$..*$ +4 0 27 28 29 +.......*$.*....**$***...**$..**...*$...*$**.*$..**$ +**$.*$*$*$ +.......*$.......*$.......*$.......*$$..*$**.*$*..*$ +**$..*$$$*$ +4 31 32 33 34 +$....**$.....*$ +$$$$.....**$....****$...**.**$....**$ +4 0 36 37 0 +$...*$..*.*$.*$ +$$$$$$$.***$ +4 39 0 0 40 +5 30 35 38 41 +$$$$$$$..****$ +$$$$$$$...**$ +4 0 0 43 44 +.**.**$..**$$$.......*$.....***$....*.**$...**$ +$$$$$*$***$...*$ +....***$.....***$$$...**$..****$.**.**$..**$ +*...*$...*$..*$$$..****$..*...*$..*$ +4 46 47 48 49 +..*...*$..*$...*$$$.....*$....*$....*$ +..**.**$...****$....**$$$....*$....**$...**$ +....**$......*$$$$..****$..*...*$..*$ +..**$$**$ +4 51 52 53 54 +...*$$$$$$.......*$.......*$ +$$$$$$....*$...*$ +$$$..***$..*$...*$ +4 0 56 57 58 +5 45 50 55 59 +$$$$.***$.*$..*$ +4 0 0 0 61 +$$$$$$$.......*$ +*..*$...*$...*$...*$..*$$$*$ +......**$.......*$ +.***$****$***$ +4 63 64 65 66 +$....***$....*$.....*$$$**$ +*$ +4 68 0 69 0 +5 62 67 70 0 +6 26 42 60 71 +...***$...*.**$....***$....**$ +$...*$..***$.**..*$.*...*$.*.**$.**$ +...***$..*..*$.....*$.....*$....*$ +$$$$$..*$.*.**$.*..*$ +4 73 74 75 76 +.***$.*.**$..***$..**$ +$.***$.*..*$.*$.*$.*$..*$ +$.***$*****$***.**$...**$ +4 78 0 79 80 +$.*$*.*$...*$ +4 0 82 40 0 +$$$$......**$.....***$.....**$.......*$ +$$$$$*$**$*$ +4 0 16 84 85 +5 77 81 83 86 +$$$$..**$**.**$****$.**$ +$$$$.****$*...*$....*$...*$ +4 0 0 88 89 +$$.*$*$**$ +$.......*$......**$.....*$......**$.......*$ +$.......*$......**$......**$$$**$***$ +4 91 92 63 93 +$$$.......*$***....*$***...**$..*....*$ +$$**$..*$..*$.**$*$ +$**$***$*.**$.**$ +$$.****$*...*$....*$...*$ +4 95 96 97 98 +5 0 90 94 99 +.*..*$.*$.*$.*$..*$$$....**$ +.***.**$.*****$..***$ +4 101 0 102 0 +$$$$.***$...*$..*$ +$$$$$.......*$......*$ +4 0 0 104 105 +$......**$$.......*$ +$*$*$$$$...***$.....*$ +....*$ +4 107 108 0 109 +5 103 106 0 110 +.......*$$$$.....*$....****$..*****$.*$ +*.**$.**$$$$$*$**$ +*...*.**$.*...***$..*$$$***....*$..*....*$..*$ +*$$$$**$***$*.**$.**$ +4 112 113 114 115 +$$$$$$$**.....*$ +$$$$$$$***$ +4 0 0 117 118 +.*$ +......**$......**$.......*$$$$.......*$ +$$$***$..*$.*$ +$$$$$$*$.*$ +4 120 121 122 123 +.**...*$**$*$$$*......*$*$**$ +..*$..*$.*$$$$*$*$ +.**....*$......*$...**$$$.......*$......*$ +*$$$$$***$..*$..*$ +4 125 126 127 128 +5 116 119 124 129 +6 87 100 111 130 +...*$ +4 132 0 0 0 +...*...*$...****$ +4 134 0 0 0 +5 133 135 0 0 +6 136 0 0 0 +.....*$......**$ +.*$**$ +4 138 139 0 0 +4 0 120 0 0 +5 140 141 0 0 +6 0 142 0 0 +7 72 131 137 143 +8 0 12 0 144 diff --git a/2019/dogon/message.mc b/2019/dogon/message.mc new file mode 100644 index 000000000..3acf579b0 --- /dev/null +++ b/2019/dogon/message.mc @@ -0,0 +1,7393 @@ +[M2] (golly 1.2) +#C A digital pixel Display in Conway's Life. +#C Based on hexadecimal.mc pixel display example in Gollys distribution. +#C The pixel unit itself is just copied as is from Brice Dues 2006/7 design. +#C The tiles have the same base period, 35328 ticks, and share the +#C same large-scale pixel machinery. +#C The first pixel updates begin just before generation 6000. +#C Did you get the message ? +#C +**$.*$.*.*$..**$ +4 0 0 0 1 +$$$$...**..*$...**..*$.......*$ +$$...*$....*$*$.....**$.*.....*$**...***$ +$$.......*$...**..*$...**..*$ +$**...***$.*.....*$.....**$*$....*$...*$ +4 3 4 5 6 +$$$*$.*$.*$*$ +$$*$.*$.*$*$ +$$......**$......**$....*.**$...*.***$...*$...*$ +4 8 0 9 10 +5 0 2 7 11 +$$$.......*$......*$.....*$......*$.......*$ +$$$**$...*$...*$$*$ +4 0 0 13 14 +.**$.**$$$..**$..**$ +4 0 0 16 0 +$.......*$......*$.....*$......*$.......*$ +$*$$...*$...*$**$ +$$$$*..**$*..**$.*$ +4 18 19 20 0 +$$$..**$..**$$$.**$ +.**$ +4 22 0 23 0 +5 15 17 21 24 +$.....**$.....**$$$....**$....**$ +$$$$....**$....**$ +4 26 0 27 0 +$$$...**$..*****$..*....*$..***..*$...*..**$ +....*$....*$.......*$...*$...*.*$....*$ +....**$$....**$...*..**$..***..*$..*....*$..*****$...**$ +4 29 30 31 0 +.....**$.....**$ +$$$.....**$.....**$$$....****$ +$$$$$$*.**$..**..**$ +4 33 0 34 35 +$$..***$.*..*$....*$*..*$**....*$.**...*$ +$$$$$$$*$ +**....*$*$$...*$ +4 0 37 38 39 +5 28 32 36 40 +$...****$..******$..****.*$......**$ +..**$.*.*$..*$$$$$.......*$ +$$$$$$.*$**$ +4 0 42 43 44 +$$$*$ +$$$.....**$...**..*$...*****$...****$ +$$$......**$......**$*....*$....*.**$....*.**$ +4 46 0 47 48 +......*$.......*$ +$**$.*$$$$****$*..**$ +.*..**$.*..*$..**$$..**$.*..*$.*..**$*..**$ +4 50 51 0 52 +$$...****$...*****$...**..*$.....**$ +$....*.**$....*.**$*....*$......*$......*$.......*$ +$.*$.***$....*$.***$.*$ +4 54 55 56 0 +5 45 49 53 57 +6 12 25 41 58 +$$$$$$.......*$.......*$ +$$$$$$*...**$.*.*..*$ +4 0 0 60 61 +$$$$$$.**$*.*$ +4 0 0 63 0 +$......*$.....*.*$.....*.*$....**.*$.......*$.......*$....**.*$ +.*.*..*$..*.**.*$.***..**$.*..**$.*$.**.**.*$*...**$.***..**$ +.....*.*$.....*.*$......*$.......*$ +..*....*$....**$...*..*$**$.*.*..*$..******$ +4 65 66 67 68 +*$...*$*.*.*$*.*.*$*.*.**$*.*$.**$*.*.**$ +..*.*$..*.*$...*$***$*$ +4 70 0 71 0 +5 62 64 69 72 +$....**$....**$ +$$$$$$$.......*$ +4 0 74 0 75 +$$$$$$$......**$ +$$$$$$*$*$ +.....*$......**$ +$*$*$ +4 77 78 79 80 +$$$.*...*$*.....*$......*$.*...**$..***$ +$..***$.*...**$......*$*.....*$.*...*$ +4 82 0 83 0 +5 0 76 81 84 +$$$$$*$ +$$$.*.*$*$.*..*$.*.*.*$..*..*$ +4 0 0 86 87 +$$$*$$..**$...*$..*$ +...**$$...**$...**$ +4 89 90 0 0 +$$..**$..**$ +4 92 0 0 0 +5 88 0 91 93 +6 73 85 94 0 +....****$.......*$$$$.......*$....****$....****$ +......**$*...***$.*...*$$.*...*$*...***$......**$..**..**$ +$$.....**$.....**$ +*.**$ +4 96 97 98 99 +$$$$$$$......*$ +....**$....*.*$......*$......**$$$$..*$ +4 38 0 101 102 +..**$..**$$$$$$..**$ +..**$ +4 0 104 0 105 +.....*$$......*$.......*$$.......*$......*$ +...*$...*$..**$**$$**$..**$...*$ +.....*$......*$ +...*$..*$ +4 107 108 109 110 +5 100 103 106 111 +****$ +$$$$..***$....*$...*$ +4 0 113 0 114 +......**$.....*.*$.......*$ +4 116 0 0 0 +$$$.**$**$.*****$..****$ +..****$.*****$**$.**$ +4 0 118 0 119 +$$$.**$.**$ +$$.**$.**$ +4 0 121 0 122 +5 115 117 120 123 +$$$$$......**$......**$ +$......*$$....*$...*...*$....*$$......*$ +$*...*.*$*...*$$.....*$$*...*$*..*$ +4 125 0 126 127 +$$$$.....*.*$....*$.....*$......**$ +$$$$..**$*.***$....**$***.*..*$ +$$$*.....**$.*...*$*...*$.....*.*$ +.***...*$$.***...*$***.*..*$....**$*.***$..**$ +4 129 130 131 132 +...*..*$...*..*$...**$.....*$ +4 0 134 0 0 +$$$$......**$.....*$......**$ +$$....**$*.*..*$*.**$$*.**$*.**$ +$$$$$$$...**..*$ +$$$$$.**$.***$*..*$ +4 136 137 138 139 +5 128 133 135 140 +**$..*$**$ +4 0 0 142 0 +.....**$.....***$.....***$$$$.....***$.....***$ +.*$***$*$$$$*$***$ +4 75 38 144 145 +$$$$**$**$ +.**$.**$$$$$$.**$ +4 147 0 148 0 +5 143 0 146 149 +6 112 124 141 150 +$$$..***$..*..**$...***$....*$ +$$$$$...**$...**$ +4 0 152 0 153 +$$$..***$**..*$.***$..*$ +$$$$$..**$..**$ +4 155 0 156 0 +5 154 157 0 0 +6 158 0 0 0 +7 59 95 151 159 +**.....*$**.....*$ +*$*..**$...**$ +$$$..*...*$..*...*$$$*.*...*$ +$$$$$$$**$ +4 161 162 163 164 +***...**$.*.....*$ +*$ +$.......*$.......*$ +4 166 167 168 80 +5 165 0 169 0 +$$$$$.......*$ +4 0 74 0 171 +$$$....**$....***$....***$.......*$ +$.......*$.......*$.*.....*$*.**$...*$...*$***$ +$$.......*$....***$....***$....**$ +$***$...*$...*$*.**$.*$ +4 173 174 175 176 +5 0 172 81 177 +6 170 178 0 0 +$$$$**.....*$..*...*$*..*.*$...*.*$ +$$$$*$.*$*$ +4 161 162 180 181 +.***.***$**.....*$*$*$*.**.**$***...**$.*.....*$ +$**$**$**$*$*$ +4 183 184 168 80 +5 182 0 185 0 +$$.......*$$$$.......*$ +4 0 74 0 187 +$$....*$...**$..***.*$.**$..**$...*$ +$$$......*$.....*.*$....*$....*$....*$ +$...*$..**$.**$..***.*$...**$....*$ +...*$..**$..**.**$...**..*$....*..*$.....**$ +4 189 190 191 192 +5 0 188 81 193 +6 186 194 0 0 +7 179 195 0 0 +...*...*$....*$.***$.*$ +*.*.*$....*$**$..***$ +4 197 198 77 0 +.....*$...**.*$...**.*$.......*$ +.*$**...*$.*..*.*$...**.*$**.***$ +$.......*$$$$......**$.......*$.....*$ +4 200 201 0 202 +5 0 199 0 203 +.....**$.......*$$$$....**$....**$......*$ +.*$*$ +....**.*$...*...*$..*..*$..*.***$$..**$..***$..*..*$ +4 205 206 207 0 +.**$$$**$**$ +4 209 0 0 0 +...**$$$$.......*$......*$......*$.......*$ +$$$$**.**$**...*$*..*..*$...**.*$ +**$..*$***$.**$$*.*$..*$.*$ +...*...*$.....**$ +4 211 212 213 214 +$$$$$$**$**$ +$$$..*$.*.*$.*.*$**.**$.*.*$ +4 216 0 0 217 +5 208 210 215 218 +.....*.*$......*$.......*$.......*$ +...**$...**$$$$$...***$...*..*$ +4 0 220 0 221 +$$$$$$....**$.....*$ +$$$..*.*$.....*$.....*$..*..*$...***$ +.....*.*$......**$ +4 223 224 225 0 +..*...*$...*..*$.....*$...**$..***$..***$ +4 0 227 0 0 +5 0 222 226 228 +*$$*$*$ +..**$..**$$$$$.***$*..*$ +4 230 0 231 0 +$$$$$......**$$.....*$ +**.**$.*.*$**.**$$$.....**$$.......*$ +.....*$.....*$......*$.......*$ +.*.*...*$.*.*...*$*...*.*$.....*$ +4 233 234 235 236 +*...*$*..*$.*$..**$..***$..***$ +4 238 0 0 0 +$$$....*$...***$..**.**$.***$ +$$$..*....*$.***$**.**$...***$ +4 0 0 240 241 +5 232 237 239 242 +6 204 219 229 243 +$$$$..*$.*.*$.*.*$**.**$ +4 0 0 245 0 +5 0 0 0 246 +$$......*$......**$......**$$$.....**$ +4 0 0 0 248 +$$......*$.....**$*...***$**.**$*...*$......**$ +4 0 0 250 0 +.....**$$.....*$......**$ +$$.*$.*$**$$$.......*$ +4 0 252 253 0 +......**$.*.*$*...*..*$*...***$..*$.***...*$.*.**.**$**$ +$$$$*$**$.*$.**$ +**$***$..***.**$....*.*$.*..*.*$*..*...*$.**$ +.**$***$*$$.*$..*$**$ +4 255 256 257 258 +5 249 251 254 259 +6 247 0 260 0 +$$$.***$.***$..**$....*$..*..**$ +.*...*$..*..*$..***$ +4 0 262 0 263 +$$$$$$$....**$ +....**$....**$....***$....*.*$....*..*$......**$ +$$..***$..*.*$.*..*$.**$ +4 265 0 266 267 +$.......*$.......*$$$......**$.......*$....***$ +4 0 0 269 80 +5 0 264 268 270 +$$$..**$..**$ +$$$.......*$.....***$....*$....**$ +$$$$.......*$.......*$ +4 272 0 273 274 +...*$$$$.....**$$.....**$ +...*$$$$**$$**$.......*$ +.....**$......*$..*...*$***....*$$*$ +**....*$*.....*$*....**$ +4 276 277 278 279 +4 0 0 0 74 +5 275 280 281 0 +$$....**$....**.*$....*..*$....***$ +$$...**$.*.**$.*..*$..***$ +4 283 284 0 0 +....*$.....**$......*$.*....*$.***...*$....*$...**$ +$$$*$*$...*$...*$....*$ +..*$.***$$$$$$...**$ +4 286 287 272 288 +$$....**$....**$ +$$...**$...**$ +....**$.....*$.....*.*$......**$ +.......*$.......*$ +4 290 291 292 293 +...**$ +$**$..*$.**$ +4 0 295 296 0 +5 285 289 294 297 +$.....***$....**$...*.**$....**$.....**$.*....*$*.*....*$ +$$*$.*$**$..*...*$.***.***$**.***$ +.....*$.**...**$.....***$..*$$.*.*$.*.*$.*.*$ +....**$..*.*$..*$..*..*$.......*$....**.*$$....**.*$ +4 299 300 301 302 +$$$**$*$*$ +$$$$$**$..*$**$ +4 304 0 305 0 +..*$ +.....*.*$.....*.*$......*$ +4 307 308 0 0 +$$.*$*.*$*.*$*.**$ +4 171 310 0 0 +5 303 306 309 311 +6 271 282 298 312 +.......*$.......*$$$$$$*$ +.*$*$$$..**$..*.*$....*$....**$ +4 314 315 167 0 +$...**.**$....*.*$....*.*$.....*$ +4 0 0 317 0 +5 316 318 0 0 +6 319 0 0 0 +7 244 261 313 320 +8 160 196 321 0 +$***...**$..*...*$...*.*$...*.*$...*.*$..*...*$*$ +$*$.*$$$$.*$*$ +4 161 162 323 324 +$$$$***$...*$$..**$ +..*$.*.....*$.*.....*$ +4 326 0 327 80 +5 325 0 328 0 +$....**$....**$$$$.......*$ +$$.......*$.......*$ +4 0 330 0 331 +$$$......**$.....**$....**$*....*$*.....**$ +$*.....**$*....*$....**$.....**$......**$ +4 77 333 79 334 +$$$**$.*$*$*$ +$$$$$$$....**.*$ +$$*$*$.*$**$ +...**$..*....*$...****$ +4 336 337 338 339 +5 0 332 335 340 +6 329 341 0 0 +**.....*$**.....*$$$***...**$*..*.*$...*.*$*..*.*$ +*$*..**$...**$$*$*$.*$*$ +..*...*$**.....*$**.....*$**.....*$ +$*$**$**$ +4 343 344 345 346 +*$.......*$.......*$ +4 0 0 348 80 +5 347 0 349 0 +$$$......**$.......*$ +4 0 74 0 351 +$$$$$...*$*...*$*****$ +$*****$*...*$...*$ +4 77 353 79 354 +$$$.**$*..*$*..**$*..*$..*$ +$$$$$$$.*..**$ +$..*$*..*$*..**$*..*$.**$ +*$.*...*$....*$ +4 356 357 358 359 +5 0 352 355 360 +6 350 361 0 0 +7 342 362 0 0 +$*$$*$*.**.**$***...**$.*.....*$ +$*$$***$**$*$ +4 161 162 364 365 +4 0 0 168 80 +5 366 0 367 0 +4 0 74 0 60 +$$$......**$......*$$......**$ +.......*$.......*$$$*$*$*$ +$$......**$$......*$......**$ +$$*$*$*$ +4 370 371 372 373 +5 0 369 81 374 +6 368 375 0 0 +$$$$$$*$.**...**$ +$$$$$$**$.*$ +4 161 162 377 378 +...*.*$*..*.*$***...**$.*.....*$ +.*$**$*$ +4 380 381 168 80 +5 379 0 382 0 +$$$$$.......*$.......*$ +4 0 74 0 384 +$$$....*$...*$...*..**$....**$.....***$ +$$.*$*$....**$.....*$...*.*.*$...**$ +$.....***$....**$...*..**$...*$....*$ +$...**$...*.*$.....*$....**$*$.*$ +4 386 387 388 389 +5 0 385 81 390 +6 383 391 0 0 +7 376 392 0 0 +8 363 393 0 0 +$$$$$$.**$.**$ +4 0 395 0 0 +$$$$$$......**$......**$ +4 0 397 0 331 +.....**$......*$......*$.......*$ +$$*$*$ +$.......*$.....***$....*$.....***$.......*$.......*$ +$.**$.**$$.**$.*$.*$*$ +4 399 400 401 402 +$$$$.**$.**$ +......*$......**$ +$$$$$....*$....*$......*$ +$$$$..**$..**$ +4 404 405 406 407 +5 396 398 403 408 +$$*$$***$..*$**$*$ +$$$$..**$..**...*$.......*$.......*$ +4 0 0 410 411 +.....***$.....*$.....**$.....**$ +...***$*.*..*$*.*.**$....**$ +.......*$.....*$.....*.*$.*...***$***$...*$*.**$*.**$ +*.**$*.*..*$...*.*$...***$....**$....**$....**$ +4 413 414 415 416 +*....*$...***$..*$..**$ +$.......*$.......*$.......*$ +...**$...**$ +$$$$..*$.****$.*...*.*$..*..*.*$ +4 418 419 420 421 +$*.**...*$*.**...*$...*$***$.*$ +$$$$..*$****$...*...*$..*....*$ +$$$$$*..**$...**..*$.......*$ +4 423 80 424 425 +5 412 417 422 426 +.....**$....*..*$.....*$ +4 428 0 0 0 +$$$.......*$.......*$$$......**$ +$$$*......*$*......*$......**$.......*$.......*$ +.......*$....***$....*$.....**$......*$.*....*$.***...*$....*$ +$$$$$*$*$ +4 430 431 432 433 +5 0 429 0 434 +$$$$$.......*$.....***$....*$ +..***$$$$$....**.*$.....*.*$.....*.*$ +....**$ +......*$$$...**$...*$.*.*$.**$ +4 436 437 438 439 +***$$$$$*$ +4 441 113 0 0 +$$.****$.**.**$**...**$....**$..*$***$ +$$$....**$....**$ +4 443 444 23 101 +$$$$$**$*$*$ +4 0 0 446 0 +5 440 442 445 447 +6 409 427 435 448 +4 0 0 78 0 +5 0 0 450 0 +$$......*$......*$......**$ +4 0 0 452 46 +....**$....**$ +$$$$$$.....**$....*..*$ +$$$$$$....**$...*..*$ +4 0 454 455 456 +5 0 0 453 457 +6 451 0 458 0 +...**$$$$$..**$..**$ +$...**$...**$ +4 460 0 0 461 +$$....**$.....*$.....*.*$......**$ +4 463 331 0 0 +$$$**$..*$.**$ +4 465 0 0 0 +5 0 462 464 466 +......**$$$$$$....**.*$....**.*$ +$....**.*$..*..*.*$..**$$$$..**...*$ +4 0 468 0 469 +..*$**$$$$.*$***$...*$ +4 164 0 471 0 +..**..*$......*$.......*$$.......*$......*$......*$.......*$ +$$$$$$..*$**.**$ +4 0 473 0 474 +....*$....*$...*$$...*$....*$....*$...*$ +$$$.......*$.....**$.......*$......*$ +***$.*$$$$$..*$**.**$ +4 476 477 478 0 +5 470 472 475 479 +.**$.**$ +$$.....**$......*$......*$.......*$ +$$$$*$*$ +4 0 481 482 483 +......**$......**$$$.......*$.......*$ +$$......*$......**$ +4 0 485 0 486 +$$$.......*$.....***$....*$.....***$.......*$ +$$$.**$.**$$.**$.*$ +.......*$ +4 488 489 490 206 +$$$$$$..**$..**$ +4 0 492 0 0 +5 484 487 491 493 +$$$$*$$***$..*$ +$...*.*.*$.*...*.*$.*..**.*$..***$...*$ +**$*$*....*$...***$..*$..**$ +4 495 496 497 92 +$.*$...*$*..*$***$.*$ +4 499 0 122 0 +4 291 0 75 0 +$$$$$$$.**$ +4 0 0 502 0 +5 498 500 501 503 +6 467 480 494 504 +.....*$$......**$....***$....**$....**$.....*.*$.....***$ +*.*..*$*.*$*.***$....***$.....**$.....**$*.**.*$...***$ +......*$$$.....**$.....**$ +....*$$$....**$....**$ +4 506 507 508 509 +4 86 0 0 0 +5 0 510 511 0 +$$$$$$.......*$......*$ +.....*$......**$......**$$......**$......**$...**.**$...*.*.*$ +*....***$.*.....*$.*$$.*$.*.....*$*....***$......*$ +4 397 513 514 515 +$$$$$$*$.**$ +$$$...**$...**$$$....**$ +***$***$$$$***$***$.**$ +....**$$$$$$....**$....**$ +4 517 518 519 520 +....****$.....**$ +4 522 490 0 0 +$.....**$.....**$ +4 167 291 524 74 +5 516 521 523 525 +6 512 0 526 0 +7 449 459 505 527 +4 0 0 384 433 +$......**$.......*$....***$....*$.....**$......*$.*....*$ +.***...*$....*$...**$$$$$..**$ +4 530 38 531 167 +5 0 529 0 532 +.....***$....*$....**$ +$$$$$....**$....**$ +4 534 168 0 535 +.*$.*$*$ +4 537 0 0 0 +$......*$......**$ +4 0 0 0 539 +*$*$ +4 164 0 541 0 +5 536 538 540 542 +$$$....*$....***$.......*$......**$ +4 0 0 544 274 +$$$...**$...**$ +$$$$$**$..*$.**$ +4 105 546 547 0 +4 0 0 0 122 +$$......**$......**$$$.......*$.......*$ +4 0 0 0 550 +5 545 548 549 551 +....**.*$....**.*$$....**.*$.....*.*$.....*.*$......*$ +4 0 553 0 0 +$**$..*$**$ +4 555 0 0 0 +$$$$$$*$ +4 0 0 557 0 +$$$$$$......*$....***$ +$$$$$**$***$...*$ +4 0 0 559 560 +5 554 556 558 561 +6 533 543 552 562 +$$$$$$$.....**$ +.....*.*$......*$......*$.....*$$$$.......*$ +*.**.*$*.*.*$*.*.*$.....*$$$$*.**$ +4 564 265 565 566 +.....*$.....***$......*$$.....**$.....**$ +*.*..*$...***$....*$ +4 568 569 0 0 +5 0 567 0 570 +$$$$..*$*..*$*****$***.**$ +4 0 0 572 0 +5 0 0 573 0 +6 571 0 574 0 +$$$$.....**$......*$......*$.......*$ +$$$$$.**$.**$ +4 576 78 436 577 +$$$$......*$......**$ +4 0 579 481 0 +.....***$.......*$.......*$ +.**$.*$.*$*$ +4 581 582 0 0 +..**$..**$ +4 0 584 0 0 +5 578 580 583 585 +***$..*$**$*$*....*$...***$..*$..**$ +$$$$...**$...**$ +4 587 0 588 0 +......*$$$$$....**$....**$ +***$**$ +4 590 591 0 0 +$.......*$.....***$....*$....**$ +$$$.......*$.......*$ +4 0 0 593 594 +$.**$.*$.*$*$ +4 0 0 596 0 +5 589 592 595 597 +.......*$$$......**$.......*$....***$....*$.....**$ +4 75 38 599 167 +......*$.*....*$.***...*$....*$...**$ +$..**$..**$ +4 601 80 602 153 +5 0 600 0 603 +4 0 265 0 438 +$$$......*$......**$ +$$....**.*$....**.*$$....**.*$.....*.*$.....*.*$ +4 535 606 0 607 +$**$*$*$ +$$$**$..*$**$ +4 609 0 610 0 +5 605 0 608 611 +6 586 598 604 612 +.**.*$..**$$..**$.**.*$***.**$*****$*..*$ +.....*$.....***$$.....***$.....*$ +4 614 615 307 0 +$$*$ +4 617 0 0 0 +5 616 618 0 0 +6 619 0 0 0 +7 563 575 613 620 +8 528 0 621 0 +9 322 394 622 0 +$$$.*.....*$***...**$...*.*$$***...**$ +$$$$*$.*$.*$*$ +4 161 162 624 625 +$$$$..**.**$...*.*$*.**.**$*.*...*$ +.*$......*$.......*$ +4 627 378 628 537 +5 626 0 629 0 +4 0 74 0 293 +$$$$$.......*$*$*$ +$*$*$.......*$ +4 77 632 79 633 +$$$$**$*$*****$.****$ +$.****$*****$*$**$ +...*.**$...*...*$...*.**$$......*$......**$......*$ +4 635 0 636 637 +5 0 631 634 638 +6 630 639 0 0 +**.....*$**.....*$$$$$$***...**$ +*$*..**$...**$$$$$*$ +..*...*$*.*...*$ +.*$**$ +4 641 642 643 644 +$*......*$.*.....*$$.*$*$ +4 0 0 646 80 +5 645 0 647 0 +$....**.*$....**.*$......**$$$......*$.......*$ +$$$.......*$ +4 0 649 0 650 +$$$....**$...***.*$..**$*..*.***$*...***$ +$*...***$*..*.***$..**$...***.*$....**$ +4 77 652 79 653 +$$$*.*$...*$..*$**$ +$$$$$$$..**$ +$$**$..*$...*$*.*$ +....*..*$.*..*.*$..**...*$ +4 655 656 657 658 +5 0 651 654 659 +6 648 660 0 0 +7 640 661 0 0 +**.....*$.*.....*$*$****.***$*.**.**$ +*$.*.**$**.**$***$*$$..*$.*$ +.*.*.*.*$.*.*.*.*$..**.**$..*...*$**.....*$ +$$$.*$*$ +4 663 664 665 666 +*$.......*$*......*$ +4 0 0 668 80 +5 667 0 669 0 +4 0 74 0 0 +$$..**$....*$.**..*$..*..*$...*.*$...**$ +$...**$...*.*$..*..*$.**..*$....*$..**$ +4 672 0 673 0 +5 0 671 81 674 +6 670 675 0 0 +$$$..**.**$..**.**$..**.**$*.**.**$***...**$ +4 161 162 677 78 +.*.....*$ +4 679 0 168 80 +5 678 0 680 0 +$$$$$.......*$$.......*$ +4 0 74 0 682 +$$......**$.....***$.....*$.....***$......*$.......*$ +$$.......*$**.....*$..*$..*$.**$*$ +$.......*$......*$.....***$.....*$.....***$......**$ +$*$.**$..*$..*$**$ +4 684 685 686 687 +5 0 683 81 688 +6 681 689 0 0 +7 676 690 0 0 +8 662 691 0 0 +$$$$*$.*.....*$..*...*$..*...*$ +$$$$*$.*$$.*$ +4 161 162 693 694 +*.*...*$..**.**$*.**.**$*..*.*$***...**$.*.....*$ +*$$**$**$*$ +4 696 697 168 80 +5 695 0 698 0 +$$$.......*$......*$......*$ +4 0 74 0 700 +$$$....**$..**..*$..******$..****$ +$$$$.......*$....***$$.....*$ +$$..****$..******$..**..*$....**$ +...*.**$...*$...*.**$....*..*$.....**$.....**$ +4 702 703 704 705 +5 0 701 81 706 +6 699 707 0 0 +$$***...**$...*.*$..**.**$**.....*$*$ +$$*$.*$..*$*.*$*$ +4 161 162 709 710 +$$$$*.*$..*$*..*$*..*$ +**$.**....*$.......*$ +4 712 0 713 80 +5 711 0 714 0 +$....**$....**$$$$.......*$.......*$ +......**$......**$.......*$ +4 0 716 0 717 +$$$.......*$......*$.....**$*.....**$*......*$ +$*......*$*.....**$.....**$......*$.......*$ +4 77 719 79 720 +$$$*$*$*$ +...**.**$..*..*$...**$$$$.....*.*$......*$ +4 722 0 722 723 +5 0 718 721 724 +6 715 725 0 0 +7 708 726 0 0 +**.....*$**.....*$$$$***...**$..*...*$...*.*$ +*$*..**$...**$$$*$.*$.*$ +.*.*.*.*$.**...**$**.....*$ +.**$.**$**$ +4 728 729 730 731 +5 732 0 349 0 +4 0 74 0 331 +$$$$.......*$.*.*$*..*$*.**$ +$*.**$*..*$.*.*$.......*$ +4 77 735 79 736 +$$$$..**$**.*$..*$***$ +$$$$$$$..*$ +$***$..*$**.*$..**$ +.*****$*.....*$.*$......*$....*$ +4 738 739 740 741 +5 0 734 737 742 +6 733 743 0 0 +.*.....*$**.....*$.**...**$.**...**$***...**$***...**$ +$*$.*$.*$*$*$ +4 161 162 745 746 +5 747 0 367 0 +$$$$.....***$...*...*$..*....*$..*...*$ +$..*...*$..*....*$...*...*$.....***$ +4 749 490 750 0 +5 0 76 81 751 +6 748 752 0 0 +7 744 753 0 0 +8 727 754 0 0 +9 692 755 0 0 +$$$$$....*$....***$.......*$ +......**$ +4 757 60 758 0 +..*$.**$ +4 164 0 760 0 +$$$$$$.....**$......*$ +4 0 404 762 0 +$$$$......**$......**$ +.......*$.......*$$$$$......*$......**$ +4 0 764 0 765 +5 759 761 763 766 +......*$ +4 0 768 0 0 +*$$***$..*$**$*$*....*$...***$ +4 0 0 770 0 +5 769 0 771 0 +......*$.......*$$$$$$.......*$ +*$*$$$$$$.**$ +.....***$....*$.....***$.......*$.......*$ +.**$$.**$.*$.*$*$ +4 773 774 775 776 +4 122 0 0 92 +5 777 778 0 0 +..*$..**$$$$$...**$...**$ +4 780 0 0 0 +4 273 384 0 0 +$$$.**$.*$.*$*$ +4 783 0 0 0 +5 781 0 782 784 +6 767 772 779 785 +$$$*$*$ +4 269 80 286 787 +$$$$$$$...**$ +4 272 789 0 295 +5 0 788 0 790 +$$$$$......*$......**$ +4 0 74 265 792 +4 0 0 304 0 +$$$$....**.*$....**.*$$....**.*$ +4 438 795 0 308 +4 305 0 0 0 +5 793 794 796 797 +$$..**$...*$...*.*$....**$ +4 0 293 799 0 +4 296 0 0 0 +4 77 0 758 0 +5 800 801 0 802 +$......**$......*$....*.*$....**$ +4 0 0 804 0 +$$$$$$...*$...***$ +4 0 0 806 0 +.....***$....*$.....***$.......*$ +4 75 0 808 0 +5 805 0 807 809 +6 791 798 803 810 +$$$$..***$.*....*$*.....*$.*$ +$$$....*..*$....*$$.......*$..*$ +..**$$..**$.*$*.....*$.*....*$..***$ +....**$$....**$..*...*$...*..*$...*..*$....**$ +4 812 813 814 815 +4 433 0 0 0 +5 0 0 816 817 +6 0 0 818 0 +7 786 0 811 819 +$$.......*$ +$$$$$...**$....*$....*.*$ +4 0 821 0 822 +.....**$ +4 0 824 0 60 +5 0 823 0 825 +......*$.....**$*$*$*.*$.**$ +....**$....*.*$$.....**$**$***$...*$ +4 827 0 0 828 +......*$.......*$.......*$ +*...*$*$*.**$.*$ +$$$$$...**$...*$....***$ +4 830 831 656 832 +$......**$......*$.......*$ +$$$**$.*$ +4 0 0 834 835 +5 829 0 833 836 +.......*$.......*$$$$.......*$......*$.....**$ +4 0 838 0 50 +*$*$$$**...**$..*.*..*$ +......*$.......*$.......*$$$$*......*$**.....*$ +$..*.*..*$**...**$ +*.....*$.......*$.......*$ +4 840 841 842 843 +$$$$$$......**$......*$ +4 0 0 0 845 +5 839 844 0 846 +....*$.*..**$...**$.***$$.***$...**$.*..**$ +......*$$*$***$...*$***$*$ +....*$..**$ +4 848 849 850 272 +$....*$..***$.*$.**$.......*$.......*$.....*.*$ +4 852 86 824 0 +$$.....***$.....***$....*..*$..**..*$..*...*$..****$ +$$..*$..*.***$..*.***$$$....**$ +$$$$**$.*$*$ +....**$....*$.*.*$..*$ +4 854 855 856 857 +$$$.***$.**.*$.*..**$....**$...**$ +...**$...*$.*.*$.**$ +..**$..*$ +4 859 860 861 0 +5 851 853 858 862 +6 826 837 847 863 +$$$$$..**$..***$.*.**$ +.***$..*$ +4 0 865 0 866 +5 867 0 0 0 +6 0 0 868 0 +$$$$$.......*$.......*$......**$ +$$$$*$.*$.*$.**$ +4 870 871 0 0 +4 0 0 0 606 +.....*$....*.*$...*...*$...*...*$...*$$....**$ +...*$..*.*$.*...*$.*...*$.....*$$...**$ +$$......*$$..**...*$.......*$$..*..*$ +$$..*$...**$.*...*$.*...*$..***$ +4 874 875 876 877 +5 872 873 878 0 +...**$....*$.***$.*$$$$.*$ +$$$$*$.*$**$ +.***$....*$...**$$$$$......**$ +4 0 880 881 882 +$$$$$**$$*$ +4 0 0 884 0 +.....**$..******$..**..**$....**$....**.*$....**$.....*$..**$ +**.*.*.*$.*....**$..**$.*..*..*$..**...*$..*$.....*$.....***$ +4 0 886 454 887 +$$$*$*$**$***$.**$ +.*$.*$.*$*$$$$.***$ +.*.*$...*$...**$ +4 889 502 890 891 +5 883 885 888 892 +4 438 0 0 0 +$$$$$.....*.*$....*$....*$ +4 0 0 895 0 +$$.....*.*$....*$....*$....*$....*..*$....***$ +4 0 897 0 0 +....*..*$....***$$$*$ +4 899 0 0 0 +5 894 896 898 900 +$$$.**$.*.*$...***$..*...*$..**.*$ +$......*$$$$$**$...*$ +.....*$..**.*$..*...*$...***$.*.*$.**$ +...*$...*$**$$$......**$......*$.....***$ +4 902 903 904 905 +..**$$**...**$.....*.*$.......*$.......*$ +$.......*$.......*$.....*.*$*....**$**$*.*$..**$ +$*$ +4 907 86 908 909 +$$$$.....*.*$....*$....*$.....*$ +$......**$.***$...*$..**...*$.*.....*$**.***$...***.*$ +.....*$.*...*.*$*....*$.....**$..**..**$...**$.....*$.....*.*$ +4 911 912 0 913 +$$$*$*$*$.*$..*$ +$$$$...**$...*$.*.*$.**$ +..*$.*$*$$*$$$*$ +4 915 916 917 0 +5 906 910 914 918 +6 879 893 901 919 +7 864 869 920 0 +8 820 0 921 0 +$$......**$......*$ +4 0 923 0 764 +$$$.....**$...*..*$$...*..*$....*..*$ +.....*.*$......*$$.....**$.....**$ +4 925 0 926 0 +5 0 924 927 0 +**$.*$*$ +$$$$...**$....*$.***$.*$ +$$$..*...*$.*.....*$.*$.**...*$...***$ +4 929 930 0 931 +*$**$ +4 933 0 60 164 +$...***$.**...*$.*$.*.....*$..*...*$ +$$......*$.....*$.....*$......**$ +4 0 935 0 936 +..*$**$.......*$......*$......*$.....**$ +$$.**$.**..**$.....**$**$ +$...***$..*..*$..*...*$.**.*.*$.**.**$..***$ +4 168 938 939 940 +5 932 934 937 941 +...*..*$$...*..*$....*..*$.....*.*$......*$$.....**$ +4 564 0 943 0 +4 824 0 0 0 +.......*$......**$ +4 0 0 0 946 +5 944 0 945 947 +.....*$....**$....*.*$ +$$$$$.......*$......**$......**$ +4 0 949 0 950 +$$$$....*$...*.*$..*...*$..*****$ +$$$$**$.*$*......*$.***.**$ +.*.*.*.*$..*...*$$..*...*$.*.*.*.*$..*****$..*...*$****.*$ +4 0 952 953 954 +*$$*$ +4 0 490 956 293 +****.**$.*.....*$..**.**$$$$.*.....*$**.....*$ +**..*$$$$$$$*$ +.**...**$.**...**$***...**$***...**$ +.*$.*$*$*$ +4 958 959 960 961 +5 951 955 957 962 +6 928 942 948 963 +$..**$..***$.*.**$.***$..*$ +4 0 965 0 0 +$$$*$*$**$ +$.***$.*..*$*...*$*.*.**$.**.**$..***$ +4 967 0 968 0 +5 966 0 969 0 +4 0 0 156 0 +5 971 0 0 0 +6 970 0 972 0 +$$$$$..**.**$...*.*$...*.*$ +....*$ +4 974 0 975 0 +5 0 976 0 0 +6 0 977 0 0 +4 0 0 0 865 +5 0 0 979 0 +..***$$.*...*$.*...*$..*.*$..***$ +4 265 866 438 981 +$$$....*$..*.**$..*...**$...*...*$....***$ +$$$....*$...**.*$.**...*$.*...*$..***$ +4 983 984 0 0 +5 982 0 985 0 +6 980 0 986 0 +7 964 973 978 987 +4 290 291 0 0 +5 989 0 0 0 +6 990 0 0 0 +..**$..*$...***$.....*$ +4 0 0 0 992 +5 0 993 0 0 +6 994 0 0 0 +7 0 991 995 0 +8 988 0 996 0 +9 922 0 997 0 +10 623 756 998 0 +$$$$$$$**.....*$ +4 161 162 1000 164 +..**.**$***...**$.*.....*$ +4 1002 206 168 80 +5 1001 0 1003 0 +$$$$...***$....**$.....***$......*$ +$$$**.*$**..*$....*$...**$..*$ +$......*$.....***$....**$...***$ +$..*$...**$....*$**..*$**.*$ +4 1005 1006 1007 1008 +5 0 671 81 1009 +6 1004 1010 0 0 +$$$$**.....*$*.**.**$.*.*.*.*$.*.*.*.*$ +4 161 162 1012 483 +*$$$$..**.**$*..*.*$***...**$.*.....*$ +*$$$$$*$*$ +4 1014 1015 168 80 +5 1013 0 1016 0 +$$...*$..*..*$.*****$**.***$.*.**$..**$ +$$.......*$.....*$....*$...*$ +$..**$.*.**$**.***$.*****$..*..*$...*$ +..*.*$...***$......*$...***$...***.*$....***$ +4 1018 1019 1020 1021 +5 0 671 81 1022 +6 1017 1023 0 0 +7 1011 1024 0 0 +***...**$*..*.*$*$$.*.....*$..**.**$ +*$*$*$ +4 161 162 1026 1027 +$$*$..*$$$$....*$ +$*..*...*$*......*$*$*$ +4 1029 0 1030 80 +5 1028 0 1031 0 +$....**$....**$$.......*$$.......*$.......*$ +4 0 1033 0 0 +$$$.....**$....*$...**..*$*...**$*....***$ +$*....***$*...**$...**..*$....*$.....**$ +4 77 1035 79 1036 +$$.*$.*$..*$.*$.*$ +$$$$$$....*$...*...*$ +..*$..*$...*...*$...*..*$ +4 1038 1039 1038 1040 +5 0 1034 1037 1041 +6 1032 1042 0 0 +**.....*$**.....*$**.....*$***...**$..*...*$...*.*$*$*$ +*$*..**$*..**$*$.*$$**$**$ +..*...*$..**.**$***...**$**.....*$*$ +4 1044 1045 1046 373 +*$*......*$.......*$ +4 0 0 1048 80 +5 1047 0 1049 0 +$$.......*$$......*$.......*$ +4 0 74 0 1051 +$$$$.......*$.......*$*.*.*$*****$ +$*****$*.*.*$.......*$.......*$ +4 77 1053 79 1054 +$$$.***$....*$.....*$....*$..**$ +$..**$....*$.....*$....*$.***$ +4 1056 0 1057 0 +5 0 1052 1055 1058 +6 1050 1059 0 0 +7 1043 1060 0 0 +8 1025 1061 0 0 +$$**.....*$***...**$****.***$*..*.*$***...**$.*.....*$ +$$**$*$*.*$**$*$ +4 161 162 1063 1064 +5 1065 0 367 0 +$$$$$$......**$ +4 0 74 0 1067 +$$$......**$.....**$......*$......*$.......*$ +$.......*$.......*$$**$.*$.*$*$ +$.......*$......*$......*$.....**$......**$ +$*$.*$.*$**$ +4 1069 1070 1071 1072 +5 0 1068 81 1073 +6 1066 1074 0 0 +$$$$$*$.**...**$ +$$$$$*$.**$ +4 161 162 1076 1077 +.*.*.*.*$...*.*$..**.**$***...**$.*.....*$ +$.*$.*$*$ +4 1079 1080 168 80 +5 1078 0 1081 0 +$$$$.......*$.......*$.......*$ +4 0 74 0 1083 +$$$$...****$...*.**$...*$....**$ +$$$$....**$.......*$...*.*$...***$ +$....**$...*$...*.**$...****$ +$...**$...*.**$......*$....***$ +4 1085 1086 1087 1088 +5 0 1084 81 1089 +6 1082 1090 0 0 +7 1075 1091 0 0 +$$.*.....*$*.*...*$...*.*$...*.*$ +$$$*$.*$.*$.*$ +4 161 162 1093 1094 +**.....*$$$$..*...*$**$...*.*$...*.*$ +*$$$$$$.**$ +***$.......*$.......*$ +$..*$*$ +4 1096 1097 1098 1099 +5 1095 0 1100 0 +$$$$.......*$......**$*......*$*$ +$*$*......*$......**$.......*$ +4 77 1102 79 1103 +$$$*$*$$*..**$ +$$*..**$$*$*$ +...*..**$...**$...**$$$.....**$.....***$ +4 1105 0 1106 1107 +5 0 631 1104 1108 +6 1101 1109 0 0 +**.....*$**.....*$$$$$***...**$*..*.*$ +*$*..**$...**$$$$*$*$ +...*.*$***...**$*$ +4 1111 1112 1113 381 +*$.......*$*......*$*$ +4 0 0 1115 80 +5 1114 0 1116 0 +$....**$....*$.....*$ +4 0 1118 0 0 +$$$....***$..*****$......**$*.**...*$*.**...*$ +$*.**...*$*.**...*$......**$..*****$....***$ +4 77 1120 79 1121 +$$$..*$.*.*$...*$..*$**$ +$**$..*$...*$.*.*$..*$ +..*$.**....*$..*****$ +4 1123 789 1124 1125 +5 0 1119 1122 1126 +6 1117 1127 0 0 +7 1110 1128 0 0 +8 1092 1129 0 0 +9 1062 1130 0 0 +**.....*$.*.....*$ +*$...**$....*$...*$ +$**.....*$**.*.*.*$*..*.*$***...**$ +$*$*$*$*$ +4 1132 1133 1134 1135 +5 1136 0 367 0 +6 1137 85 0 0 +7 1138 179 0 0 +7 195 342 0 0 +8 1139 1140 0 0 +7 362 376 0 0 +....*$....***$.......*$......**$ +4 0 0 1143 0 +5 626 0 629 1144 +....**$....*.*$......*$......**$ +4 0 0 1146 0 +$$$$$$......**$.....*$ +.....*$......*$$$$$.......*$ +$**.*$.***$$.***$**.*$$**$ +4 1148 378 1149 1150 +$$$$$$.**$*..*$ +$$$.....**$.....**$$$......**$ +*..**$*..*$..*$$..*$*..*$*..**$*..*$ +......**$$$$$$......**$......**$ +4 1152 1153 1154 1155 +5 1147 0 1151 1156 +6 1145 0 0 1157 +$$...***$...*..*$.....**$$.*$..*$ +.*$$.***$*..*$**$$.....*$....*$ +....*.*$....*.*$.....**$..*..*$...**$ +*.*$*.*$**$.*..*$..**$ +4 1159 1160 1161 1162 +4 23 98 0 0 +......*$......*$.......*$ +4 564 164 1165 541 +5 1163 1164 1166 0 +$$$$$$......**$.....**$ +....**$.....*$......**$$......**$.....*$....**$.....**$ +4 564 1168 824 1169 +*$*$$$$*$*$.*$ +4 378 1153 1171 1155 +5 0 0 1170 1172 +6 0 1167 0 1173 +7 392 1158 0 1174 +$$$$$$$...***$ +......**$$$$$$$.***$ +..*..*$..**.*$ +.*..*$.*.**$ +4 1176 1177 1178 1179 +**$ +4 1181 98 0 0 +5 1180 1182 1166 0 +4 564 0 824 0 +$$$$$....*$...**$..***.*$ +.**$..**$...*$$...*$..**$.**$..***.*$ +4 1185 1153 1186 1155 +5 0 0 1184 1187 +6 0 1183 0 1188 +$$......*$.....*$$$......*$.......*$ +$$*$*$$$*$ +$$$....*$...***$..*...*$..*$...***$ +$$$..*$.***$*...*$....*$.***$ +4 1190 1191 1192 1193 +...**$....*$ +4 1195 98 0 0 +$$$.....**$....*.*$......*$......*$.....**$ +$$$**$*.*$*$*$**$ +4 1197 1198 1165 541 +5 1194 1196 1199 0 +.....**$$$$$$$.......*$ +4 564 0 1201 0 +$$$$$$....**$....***$ +$$$.....**$.....**$$.*$*.**..**$ +....***$.......*$$$$.......*$....***$....***$ +...*..**$...*$***$$***$...*$...*..**$*.**..**$ +4 1203 1204 1205 1206 +5 0 0 1202 1207 +6 0 1200 0 1208 +7 0 1189 0 1209 +8 1142 1175 0 1210 +......*$.....*$.....*$.....*.*$.....*.*$......*$ +$$$$$$..**$..*.**$ +$$$$$$...**$.**.*$ +4 1212 230 1213 1214 +.*$$.....**$.....**$ +4 438 1216 0 0 +..*...*$..**..*$...***$....*$$$$.....**$ +*...*$*..**$.***$..*$$$$**$ +4 1218 1219 1165 541 +5 1215 1217 1220 0 +.....**$$$$$.......*$.....**$ +$$$$*.*$*..*$...*$...*$ +4 564 0 1222 1223 +$$$$$$.*...*$*.....*$ +......*$.*...**$..***$$..***$.*...**$......*$*.....*$ +4 1225 1153 1226 1155 +5 0 0 1224 1227 +6 0 1221 0 1228 +...**$..*..*$..*..*$...**$....****$.....**$ +...*$....*$...*$***$ +$...*$$.***$..**.**$...***$....*$ +$...*$$...***$**.**$.***$..*$ +4 1230 1231 1232 1233 +.*...*$ +4 1235 98 0 0 +5 1234 1236 1166 0 +$$$$$$....***$..*****$ +.**...**$..**...*$...*...*$$...*...*$..**...*$.**...**$..*****$ +4 564 1238 824 1239 +$$$$$$..*$.*.*$ +...*$..*$**$$**$..*$...*$.*.*$ +4 1241 1153 1242 1155 +5 0 0 1240 1243 +6 0 1237 0 1244 +7 0 1229 0 1245 +$$$$...***$...*..*$..*...*$...*..*$ +....***$$$$.***$*..*$*...*$*..*$ +.....*$...**$..***$..***$ +.*$..**$..***$..***$ +4 1247 1248 1249 1250 +4 307 98 0 0 +5 1251 1252 1166 0 +......**$.......*$$$$.......*$......**$.......*$ +4 564 75 824 1254 +$*..**$$$$*..**$$*$ +4 78 1153 1256 1155 +5 0 0 1255 1257 +6 0 1253 0 1258 +$...***$..*..*$......*$......*$......*$..*..*$...*$ +$.***$.*..*$*$*$*$.*..*$...*$ +4 0 0 1260 1261 +4 167 98 0 0 +5 1262 1263 1166 0 +$$$$$$$...****$ +$$$.....**$....*.*$$$.......*$ +...*.**$...*$....**$$....**$...*$...*.**$...****$ +......**$$$$$$......**$.......*$ +4 1265 1266 1267 1268 +5 0 0 1184 1269 +6 0 1264 0 1270 +7 0 1259 0 1271 +8 0 1246 0 1272 +9 1141 1211 0 1273 +......*$.....*$.....*$.....*$.....*$.....***$......*$ +$$$$...**$..*..*$...*..*$......*$ +$$$$..**$.*..*$*..*$*$ +4 1275 787 1276 1277 +$$....*.*$.....**$ +4 0 1279 0 0 +....***$..***$..**$..**$...*.**$...*.**$$.....**$ +***$..***$...**$...**$**.*$**.*$$**$ +4 1281 1282 1165 541 +5 1278 1280 1283 0 +.....**$$$$$$$....**.*$ +4 564 0 1285 0 +$$$.....**$.....**$$$**....**$ +......*$......*$.......*$$.......*$......*$......*$.....**$ +.*....**$.*$*$$*$.*$.*....**$**....**$ +4 1168 1287 1288 1289 +5 0 0 1286 1290 +6 0 1284 0 1291 +.*.....*$.**....*$.**$.....**$.....***$ +$$$.....*$.....*$$$..**.*$ +$$$.*$.*$$$.*.**$ +4 1293 0 1294 1295 +4 758 98 0 0 +...***$....*$$$$$$.....**$ +.***$..*$$$$$$**$ +4 1298 1299 1165 541 +5 1296 1297 1300 0 +$$$$$......*$$.....*$ +$$$$$.*$.*$.......*$ +.....**$$$$$.......*$.......*$.......*$ +.......*$...*$**$$**$...*$..*....*$..*....*$ +4 1302 1303 1304 1305 +$$$$$$.***$....*$ +.....*$....*$..**$$..**$....*$.....*$....*$ +4 1307 1153 1308 1155 +5 0 0 1306 1309 +6 0 1301 0 1310 +7 0 1292 0 1311 +$...***$...*.*$...*..*$.....**$ +..*$$**.*$*..*$**$ +$...**$...**.*$...*..*$...***$ +$..**$*.**$*..*$.***$ +4 1313 1314 1315 1316 +.***$ +4 1318 98 0 0 +5 1317 1319 1166 0 +$$$$$$.....**$....*$ +...**..*$....**$.....***$$.....***$....**$...**..*$....*$ +4 564 1321 824 1322 +$$$$$.*$.*$..*$ +.*$.*$$$$.*$.*$..*$ +4 1324 1153 1325 1155 +5 0 0 1323 1326 +6 0 1320 0 1327 +$$$$$$...***$...*..*$ +.....**$$$$$$.***$*..*$ +..*...*$..****$...*$ +*...*$.****$...*$ +4 1329 1330 1331 1332 +.*$.*$ +4 1334 98 0 0 +5 1333 1335 1166 0 +$$$$$...*$..*..*$.*****$ +**.***$.*.**$..**$$..**$.*.**$**.***$.*****$ +4 1337 1153 1338 1155 +5 0 0 1184 1339 +6 0 1336 0 1340 +7 0 1328 0 1341 +8 0 1312 0 1342 +$$....*$...*.*$..*...*$..*...*$..*$ +$$..*$.*.*$*...*$*...*$....*$ +4 0 0 1344 1345 +..*..*$...*$ +4 1347 98 0 0 +...**$$$.....**$......*$.....**$......*$.....**$ +..**$$$**$*$**$*$**$ +4 1349 1350 1165 541 +5 1346 1348 1351 0 +.....**$$$$$$$......**$ +4 564 0 1353 0 +$$$.....**$.....**$$**.*$**..****$ +....**$.....***$......*$$......*$.....***$....**$...***$ +....****$...**$..*$$..*$...**$....****$**..****$ +4 1176 1355 1356 1357 +5 0 0 1354 1358 +6 0 1352 0 1359 +.....*$....*$$$....**$......**$ +*$$$.*$*$ +$$$$$...*$.**.**$ +4 1361 1362 1363 1363 +**.*$$.....**$.....**$ +4 0 1365 0 0 +....*.*$..*...*$..*..**$...***$....*$$$.....**$ +*.*$*...*$**..*$.***$..*$$$**$ +4 1367 1368 1165 541 +5 1364 1366 1369 0 +.....**$$$$......*$$$...****$ +$$$*$$....*$$.....*$ +4 564 0 1371 1372 +$$$$$$$.....***$ +...*...*$..*....*$..*...*$$..*...*$..*....*$...*...*$.....***$ +4 1374 1153 1375 1155 +5 0 0 1373 1376 +6 0 1370 0 1377 +7 0 1360 0 1378 +...*$..*..*$..***.*$..***.**$...**.*$.......*$ +.....*$$....*$...*$..*$ +$$..***$...***$.*.****$..**..*$...***$....*$ +$$..***$.***$****.*$*..**$.***$..*$ +4 1380 1381 1382 1383 +4 0 98 0 0 +5 1384 1385 1166 0 +$$$$$$$.**....*$ +**$.*.*$..**$$..**$.*.*$**$.**....*$ +4 564 1387 824 1388 +**.*$..*$***$$***$..*$**.*$..**$ +4 656 1153 1390 1155 +5 0 0 1389 1391 +6 0 1386 0 1392 +$$$...***$..*..*$......*$..**$..**$ +$$$.***$.*..*$*$...**$...**$ +.....*$.....**$...***$...**$...*$ +.*$**$.***$..**$...*$ +4 1394 1395 1396 1397 +5 1398 1385 1166 0 +.....**$......**$.......*$$.......*$......**$.....**$......*$ +4 564 513 824 1400 +*$$$$$$*$*$ +4 78 1153 1402 1155 +5 0 0 1401 1403 +6 0 1399 0 1404 +7 0 1393 0 1405 +8 0 1379 0 1406 +9 0 1343 0 1407 +10 1131 1274 0 1408 +.*.*$..**$ +4 378 0 1410 0 +$$$$$$.**$**$ +4 1412 0 307 0 +5 1411 0 0 1413 +4 0 0 0 75 +5 0 0 0 1415 +6 0 0 1414 1416 +$$$$$..*$***$ +4 0 0 1418 0 +5 0 0 1419 0 +6 0 0 1420 0 +.......*$$$$$$.....**$.....**$ +$.......*$......*$......*$......**$..**...*$..**$ +$*$*$*$.*$..*$*..*$.***$ +4 0 1422 1423 1424 +......**$.......*$....***$....*$ +4 0 0 0 1426 +$$$$.**$..*$**$ +4 0 0 60 1428 +5 0 1425 1427 1429 +6 0 1430 0 0 +*$.....**$.....*$...*.*$...**$ +$$**$**$$**$**.....*$.......*$ +$$$$.**$.*$.*$*$ +4 1432 0 1433 1434 +5 1435 0 0 0 +6 1436 0 0 0 +7 1417 1421 1431 1437 +8 1438 0 0 0 +9 0 0 1439 0 +$$.....*$....*.*$....*.*$...**.**$ +4 0 0 0 1441 +$.***...*$*..*...*$*...*.*$*.*.*.*$*.**...*$***$ +$$$$$.......*$......*$......**$ +4 274 1443 0 1444 +5 0 1442 0 1445 +4 588 407 0 0 +$$$$$.......*$......*$.......*$ +4 0 1448 0 0 +5 0 0 1447 1449 +.....*.*$......*$$......*$.....*.*$.**...**$.**...*$.......*$ +4 0 1451 0 0 +$$$.*.*...*$...*...*$$..*$ +$$$.*$$...*...*$*...*$...*$ +...*...*$.*.*...*$$$.**$.**$ +$.*$$$$.......*$ +4 1453 1454 1455 1456 +$$$$*.*..**$...*.***$*......*$.*****.*$ +$$$$$....**$*...**$ +....***$$....***$.*****.*$*......*$...*.***$*.*..**$ +$$$$*...**$....**$ +4 1458 1459 1460 1461 +5 0 1452 1457 1462 +6 0 1446 1450 1463 +$**$..*$..*$*.**$*.**$***$ +$$$$*$.*$..*$***$ +4 1465 0 1466 0 +5 0 0 1467 0 +.*.*$..*$$..*$.*.*$***$..*$.*$ +4 1469 0 167 0 +5 1470 0 0 0 +4 594 787 0 0 +$.....*$....*..*$...*****$..**.***$...*.**$....**$ +....**$...*.**$..**.***$...*****$....*..*$.....*$ +4 1473 0 1474 0 +5 0 0 1472 1475 +6 1468 0 1471 1476 +$$...**$...*.**$....*.*$....*.*$...*$ +$$..**$**.*$*.*$*.*$...*$ +$$.....**$...*..*$...***$....*$$...**$ +$$**$*..*$.***$..*$ +4 1478 1479 1480 1481 +$$$$$$$.*$ +.......*$......*$.......*$ +**$$**$.*$ +4 0 1483 1484 1485 +4 295 0 602 821 +.**$*..*$*..*$*..*$.*$$.*$*..*$ +..*$..**$....*$*.**$***$$***$*.**$ +4 0 0 1488 1489 +5 1482 1486 1487 1490 +$$$$$....****$....*.**$....*$ +$$$$$.....***$.......*$....*.**$ +.....**$$.....**$....*$....*.**$....****$ +....**$$....**$....*.**$.......*$.....***$ +4 1492 1493 1494 1495 +$$$$$***$***$ +.......*$.......*$$$$$$.......*$ +*..**$*.**$...*.*$....**$$....**$...*.*$*.**$ +4 1497 0 1498 1499 +*..**$ +4 490 1501 0 0 +5 1496 1500 0 1502 +4 584 490 0 0 +*..*$*..*$.**$ +....*$..***..*$..*....*$ +$$$$.......*$$.....***$......**$ +4 1505 1506 0 1507 +4 0 0 216 0 +4 0 490 0 274 +5 1504 1508 1509 1510 +$*$*.....*$.....***$....*.*$.....*$.....***$......*$ +$$$$.......*$$.......*$.**.**.*$ +$$$$$$**$*......*$ +4 1512 483 1513 1514 +4 0 0 38 0 +**...***$*.....*$ +.......*$$.......*$......*$......**$ +$$$$*.....**$*.....**$ +$$......**$......*$.......*$$.......*$.......*$ +4 1517 1518 1519 1520 +*$.*..*$**...*$***$.*....**$.**$.**...**$ +$$.*$..*$..*$**$*$ +.**...**$.**$.*....**$***$**...*$.*..*$*$*$ +*$**$..*$..*$.*$ +4 1522 1523 1524 1525 +5 1515 1516 1521 1526 +6 1491 1503 1511 1527 +.*..**$..**.*$....*$..***$$..***$....*$..**.*$ +4 0 0 1529 0 +4 0 0 584 0 +.*..**$ +4 1532 0 0 0 +5 1530 1531 1533 0 +$$$$$$...**$..*.**.*$ +..*$..*.**.*$...**$$$$..**$..**$ +4 0 1535 0 1536 +$$$$$$**$*.*$ +$$$$$$...**$...*.*$ +..*$*.*$**$ +...*.**$....**$....*$$....*$....**$...*.**$...*.*$ +4 1538 1539 1540 1541 +$$$$$$...**$..*.*$ +4 0 0 1543 0 +4 0 295 0 0 +5 1537 1542 1544 1545 +4 0 0 0 594 +$.....*$*...*$.......*$..**$**.....*$.***...*$ +$$$$.*$*.*$*.***$.....*$ +4 0 395 1548 1549 +4 0 331 0 0 +.***...*$**.....*$..**$.......*$*...*$.....*$ +*.***$*.*$.*$ +4 1552 1553 0 0 +5 1547 1550 1551 1554 +.**.*$..**$...*$$...*$..**$.**.*$..*.*$ +4 1556 0 295 0 +$..*$..***$.....*$..***$..*$ +4 1558 0 0 0 +5 1557 1559 0 0 +6 1534 1546 1555 1560 +7 1464 1477 1528 1561 +4 272 0 92 0 +5 0 0 1563 0 +6 0 0 1564 0 +.....**$$$$$$.....**$.....**$ +4 564 0 1566 0 +5 1567 0 0 0 +6 1568 0 0 0 +7 1565 0 1569 0 +8 0 0 1562 1570 +9 0 0 1571 0 +4 0 593 0 0 +4 75 1418 490 1432 +5 0 0 1573 1574 +6 0 0 0 1575 +$......**$.....*.*$.....*$....**$ +4 0 1577 0 0 +5 0 1578 0 0 +$$$$$$.......*$ +$..*$.***$*..**$*.**$..**.**$.....*$*....*$ +$$$$..**$.*.*$.*$**$ +.*..*$...*$ +4 1580 1581 1582 1583 +$....*$.....**$....**$ +4 0 0 1585 0 +5 1584 0 0 1586 +6 1579 1587 0 0 +4 0 0 992 0 +5 0 0 0 1589 +6 0 0 1590 0 +7 1576 0 1588 1591 +8 0 0 0 1592 +9 0 0 1593 0 +10 1440 0 1572 1594 +...***$...*..*$...*$$....*$.....**$ +.***$*..*$...*$$..*$**$ +4 0 490 1596 1597 +5 1598 1263 1166 0 +$$$$$$....**$..**..*$ +..******$..****$$$$..****$..******$..**..*$ +4 1600 1153 1601 1155 +5 0 0 1184 1602 +6 0 1599 0 1603 +$....*.*$.......*$...*...*$.......*$.......*$.....*.*$......*$ +$$$$...**$...*.**$....*.*$....*.*$ +$$$$..**$**.*$*.*$*.*$ +4 1605 86 1606 1607 +4 438 98 0 0 +...*$$$$....***$......*$....*$.....**$ +...*$$$$***$*$..*$**$ +4 1610 1611 1165 541 +5 1608 1609 1612 0 +$$$$$......**$.....***$.....*$ +$$$.....**$.....**$$**$..*...**$ +.....***$......*$.......*$$.......*$......*$.....***$.....*$ +..*...**$.**$*$$*$.**$..*...**$..*...**$ +4 1614 1615 1616 1617 +5 0 0 1202 1618 +6 0 1613 0 1619 +7 0 1604 0 1620 +.*.....*$*......*$.*....*$.....*.*$.....*.*$......*$ +$$$$$$$..***$ +4 1622 0 1623 1623 +.....***$......**$ +**$$.....**$.....**$ +4 1625 1626 0 0 +..*..**$...***$....*$$$$$.....**$ +**..*$.***$..*$$$$$**$ +4 1628 1629 1165 541 +5 1624 1627 1630 0 +.....**$$$$$......*$......**$.......*$ +$$$$**$..**$$**.*$ +4 564 0 1632 1633 +$$$$$..**$....*$.**..*$ +..*..*$...*.*$...**$$...**$...*.*$..*..*$.**..*$ +4 1635 1153 1636 1155 +5 0 0 1634 1637 +6 0 1631 0 1638 +....*$..**.*.*$..**.*.*$....*$.....***$ +...*$..*$*.*$..*$ +....*$...**$..*.**$..*.**$...***$...***$ +..*$..**$.**.*$.**.*$.***$.***$ +4 1640 1641 1642 1643 +4 850 98 0 0 +5 1644 1645 1166 0 +$$$$$$....**$...***.*$ +..**$...*.***$....***$$....***$...*.***$..**$...***.*$ +4 564 1647 824 1648 +$$$$$$*.*$...*$ +..*$**$$$$**$..*$...*$ +4 1650 1153 1651 1155 +5 0 0 1649 1652 +6 0 1646 0 1653 +7 0 1639 0 1654 +8 0 1621 0 1655 +$$$$$...***$..*..*$..*...*$ +....**$$$$$.***$.*..*$*...*$ +.**.*.*$.**.**$..***$ +*.*.**$.**.**$..***$ +4 1657 1658 1659 1660 +*.*$ +4 1662 98 0 0 +5 1661 1663 1166 0 +.......*$$$$$$.......*$ +4 564 0 824 1665 +*$*****$.****$$.****$*****$*$**$ +4 164 1153 1667 1155 +5 0 0 1666 1668 +6 0 1664 0 1669 +$$...***$..*...*$.*...**$.*.**$...*$ +$$.***$*...*$**...*$..**.*$...*$ +4 0 0 1671 1672 +5 1673 1385 1166 0 +.....**$$$$$$$.....*.*$ +4 564 0 1675 0 +$$$$$$....*$...*$ +$$$.....**$.....**$.*..*$*...***$...***.*$ +...*..**$....**$.....***$$.....***$....**$...*..**$...*$ +....*.**$...**$...**$$...**$...**$....*.**$...***.*$ +4 1677 1678 1679 1680 +5 0 0 1676 1681 +6 0 1674 0 1682 +7 0 1670 0 1683 +.....*.*$......*$$......**$.....*$.....*$......*$ +$$$$...*$..*.*$.....*$..*..*$ +$$$$...*$..*.*$.*$.*..*$ +4 1685 483 1686 1687 +*...***$.*..*$.....**$.....**$ +4 975 1689 0 0 +...*.*$.....**$..**.**$..**..*$...***$....*$$.....**$ +.*.*$**$**.**$*..**$.***$..*$$**$ +4 1691 1692 1165 541 +5 1688 1690 1693 0 +.....**$$$$$$...*.*$..*...*$ +4 564 0 1695 0 +$$$.....**$.....**$$$*.....**$ +$......**$$$$......**$$......*$ +*.....**$*$$$$*$*.....**$*.....**$ +4 845 1697 1698 1699 +5 0 0 1696 1700 +6 0 1694 0 1701 +..*...*$.***.*.*$.....*.*$$.....***$ +$$$.....**$.....**$.....**$...*.**$...***$ +$$$**$**$**$**.*$.***$ +4 1703 0 1704 1705 +....*$$$$$$$.....**$ +..*$$$$$$$**$ +4 1707 1708 1165 541 +5 1706 1297 1709 0 +5 0 0 1151 1156 +6 0 1710 0 1711 +7 0 1702 0 1712 +8 0 1684 0 1713 +9 0 1656 0 1714 +4 0 0 0 164 +**$$$$$$**$**$ +4 0 1717 0 0 +5 0 1716 0 1718 +6 0 0 0 1719 +4 0 0 0 378 +5 0 0 0 1721 +4 0 1410 0 0 +5 0 1723 0 0 +6 0 1722 0 1724 +7 0 1720 1725 0 +$$$$$$.**$.*.*$ +4 0 0 0 1727 +.*.**$..**$..*$$..*$..**$.*.**$.*.*$ +4 0 1729 0 23 +$$$$$$...**$...**$ +4 1731 0 0 0 +5 1728 0 1730 1732 +..**$.**.**$..****$...**$ +4 0 1734 0 0 +5 0 0 0 1735 +6 0 0 1733 1736 +4 0 0 0 33 +.**....*$**$.*.*$..**$$..**$.*.*$**$ +..**$**.*$..*$***$$***$..*$**.*$ +4 0 0 1739 1740 +5 0 0 1738 1741 +$$......*$......**$$......**$......*$ +$$$*$.*$*$ +4 0 0 1743 1744 +5 0 0 1745 0 +6 0 0 1742 1746 +$$$$$......*$....***$...*$ +....***$......*$$..*$...**$..**$ +4 1748 0 1749 0 +5 0 1750 0 0 +6 0 1751 0 0 +$$$...***$.*...*$*....*$*...*$ +*...*$*....*$.*...*$...***$ +$$......**$......**$ +4 1753 0 1754 1755 +.**....*$$$$$..**$..**$ +..**$$$$$.......*$.......*$ +$.......*$......*$.....*$$.....*$.......*$ +4 1757 1758 0 1759 +5 1756 1760 0 0 +$...*$..*.*$..*.*$.**.**$ +*$.*.....*$.*....**$*.....*$......*$*.....**$*$ +*.....*$**...***$..*.*..*$..*.*$**...**$.......*$ +4 433 1762 1763 1764 +$$*$*$*$*$$......**$ +$$$$$$$.....*$ +4 0 0 1766 1767 +$$$$.......*$*.*....*$.**...*$.*...*$ +$$$$**$**$..*$...*$ +......**$$......**$.....*$......*$.......*$.......*$ +.**$$.**$...*$..*...**$**....**$**$ +4 1769 1770 1771 1772 +.....*.*$.....*$....**$ +$...***$...***$...**$....**$ +$$..**$.*.*$.*$**$ +4 1774 1775 0 1776 +5 1765 1768 1773 1777 +$$$$...**$...*.*$...*$ +4 1779 0 0 0 +$$$$....****$...*$...*...*$....*..*$ +4 0 1781 0 0 +$$$$$...**$*..**$*$ +4 1783 384 0 0 +5 0 1780 1782 1784 +$$$$****$.......*$...**..*$*..**$ +4 1786 433 0 0 +5 0 0 1787 0 +6 1761 1778 1785 1788 +7 1737 1747 1752 1789 +8 0 0 1726 1790 +4 0 0 75 0 +......**$.....**$......**$.......*$ +$**$**$*$ +4 1793 1794 0 0 +5 0 0 1792 1795 +4 0 0 1483 0 +5 0 0 1797 0 +6 0 0 1796 1798 +$$$$$$$...*$ +4 0 0 0 1800 +5 0 0 1801 0 +$$$$.......*$......**$.....**$ +4 1734 1803 0 0 +5 0 0 0 1804 +6 0 0 1802 1805 +$$$$$$..*.*$..*$ +4 534 384 1807 0 +$$$..*...*$***...**$$*$ +4 1809 881 0 0 +..**$...*...*$$.....***$.*$*.**$*..*$*.*$ +.......*$......*$......**$ +4 1811 0 0 1812 +$..***$...*$$..***$.*...*$*.....*$*.*.*.*$ +*.*.*.**$.**.**$.......*$ +4 1814 0 1815 80 +5 1808 1810 1813 1816 +.***$....*$...**$ +$$$$$$.....*$......**$ +4 1818 0 1819 0 +4 0 0 502 656 +.....**$.....**$.*$..*$..*...**$.....**$.....*$.......*$ +...*$...*.*$......*$$...***$*$**$ +$$.....**$.....*.*$.......*$.......*$ +4 1822 1823 0 1824 +.*.*$.*$**$ +$$......**$.....*.*$.....*$....**$ +4 891 1826 86 1827 +5 1820 1821 1825 1828 +$$$$.*$..**$.**$ +4 0 1830 0 0 +$$$$......*$.....*$.....***$ +4 0 1832 0 0 +4 0 1731 0 0 +5 1831 1833 0 1834 +$$$$$.****$.*...*$.*$ +$$$$$$......*$.....**$ +..*..*$ +4 0 1836 1837 1838 +....**$.....**$$$$.....**$....**$.....**$ +$.**$$$$.**$ +4 1840 1841 768 0 +$....*$....***$.......*$....***$....*$ +4 1843 0 0 0 +5 1839 0 1842 1844 +6 1817 1829 1835 1845 +.***$*$**$ +.**.**$.**.**$$$$$**$..*.*$ +4 0 1847 60 1848 +$$$......*$....***$...*$...**$ +$$.......*$$$$$.**$ +$.......*$.......*$**$**$ +.*$.*$*$$$...**$....*$....*.*$ +4 1850 1851 1852 1853 +*.*...*$.*....*$.**...*$..*.**$....**$$.**$.**$ +4 490 1855 0 0 +.......*$......*$......*$.....**$ +.....**$*$*$**$ +$$$$$$.***$*..*$ +4 1857 1858 1329 1859 +5 1849 1854 1856 1860 +$$*$*$*.*$.**$ +....**$....**$$$$$...*****$.***$ +4 1862 0 564 1863 +$$$$$$.**$ +4 0 0 1865 0 +...*..*$...*$....*.*$.....**$....*$...*..*$....***$ +$...**.*$*...*$..**$..***$$$....**$ +....**$$$$$...**$...*$....***$ +4 1867 1868 0 1869 +...**$.....*$*...***$...**.*$.*...**$ +$$$$$..**$..*.*$....*$ +....**$$$**$.*$ +4 1871 1872 834 1873 +5 1864 1866 1870 1874 +...**.*$...**$$$$$.....**$...*..*$ +*.**$..**$$$$$**$*..*$ +...*.*$...***$ +.*.*$.***$..**$..**$..**$ +4 1876 1877 1878 1879 +5 0 1880 0 0 +5 769 0 0 0 +6 1861 1875 1881 1882 +7 1799 1806 1846 1883 +$$$.....**$.....**$ +4 0 0 1885 0 +$$$$.....*$*...***$*...*.**$ +$*...*$*...*$ +4 1887 0 1888 0 +5 1886 0 1889 0 +6 0 0 1890 0 +$$$$**.**$.*.*$.*.*$..*$ +4 1892 0 0 0 +......*$....***$...*$...**$ +4 0 0 1894 0 +5 1893 0 0 1895 +$$$$$.*$*.*$*.*$ +4 0 0 0 1897 +$$$$$$....*$..***$ +4 0 0 1899 0 +......**$.....*$......**$ +*.**$$*.**$*.**$ +4 1901 1902 0 0 +.*$.**$ +4 1904 98 0 0 +5 1898 1900 1903 1905 +4 0 0 293 541 +$$$$$....**$....*.*$......*$ +4 0 0 0 1908 +$$..**$..*$...***$.....*$ +4 0 758 1910 0 +5 1907 1909 0 1911 +4 594 787 0 588 +...*$....***$......*$.**....*$.*.*$...*$...**$ +.**..**$*.*$*$*$ +4 789 564 1914 1915 +5 1913 1916 0 0 +6 1896 1906 1912 1917 +$$$$$....*$..***$.*$ +4 0 0 0 1919 +4 0 23 0 860 +$$$**$**....*$......**$ +4 0 0 0 1922 +5 1920 0 1921 1923 +$$**$*$*$....**$...*.*$.***.*.*$ +4 0 0 1925 0 +$.......*$ +4 0 1927 0 0 +5 0 0 1926 1928 +4 27 0 0 535 +$$$$$.....*.*$...***.*$..*$ +$$$$$*$*$......**$ +...***.*$.....*.*$.....*.*$......*$ +*.....*$.......*$ +4 1931 1932 1933 1934 +5 0 1930 0 1935 +*.....**$**$ +4 1937 584 0 0 +$$$$$......**$......*$ +4 0 0 1939 78 +$**$.*$ +4 0 156 1941 0 +*$.*$.*$.**$ +4 0 1181 293 1943 +5 1938 1940 1942 1944 +6 1924 1929 1936 1945 +7 1891 0 1918 1946 +8 0 0 1884 1947 +9 0 0 1791 1948 +7 0 1174 0 1189 +7 0 1209 0 1229 +8 0 1950 0 1951 +$$$$$$$....*$ +4 0 0 0 1953 +...*.*$...*.*$..**.**$ +$.*.....*$***...**$*.**.**$..**.**$..**.**$..**.**$ +4 0 1955 0 1956 +5 0 1954 0 1957 +6 0 0 0 1958 +4 0 0 400 0 +5 0 0 1960 0 +$.....*$....**$...*$....**.*$.....***$$.....***$ +..*.**.*$.*$.*...*$..****$ +4 0 1962 0 1963 +$.....**$....*..*$....*..*$....*..*$......*$$......*$ +....*..*$....*..*$....*..*$.....**$ +4 1965 46 1966 909 +5 1964 1967 0 0 +6 0 0 1961 1968 +$$$$$...*$..*.*$..*.*$ +4 0 0 1970 559 +***.**$$***.**$..*.**$ +...*$...**$ +4 1972 1973 0 122 +4 331 400 0 0 +5 1971 0 1974 1975 +4 0 0 1748 0 +$$$$......**$......**$$.....**$ +.....*$......**$**.....*$**$ +4 0 1978 0 1979 +.....**$.....*$...*.*$...**$ +4 295 0 1981 0 +$$..**$..*$*.*$**....**$.....*.*$...***.*$ +4 0 0 272 1983 +5 1977 1980 1982 1984 +$$$$.....**$.....**$ +.....*$......**$$...**$...*.*$.....*$.....**$ +4 121 564 1986 1987 +...**..*$*.*.*$*.*$.**$ +4 75 38 1989 167 +5 1988 1990 0 0 +4 0 764 0 0 +..*$..**$ +4 0 1993 125 0 +4 0 436 0 581 +*$.***$...*$ +4 577 164 582 1996 +5 1992 1994 1995 1997 +6 1976 1985 1991 1998 +$$$$*$*$$**$ +4 2000 0 206 0 +$$$$$.....*$....*.*$....*.*$ +4 0 0 0 2002 +..***.**$.*$..***.**$....*.**$ +4 0 2004 0 0 +5 2001 2003 1797 2005 +4 0 0 77 78 +4 0 0 0 1148 +.....*$.....**$ +4 2009 0 0 0 +.......*$.......*$.....*.*$.....**$ +4 122 824 0 2011 +5 2007 2008 2010 2012 +**..**$....**$ +4 2014 0 0 0 +$$$$$**$*.*$..*$ +4 0 546 2016 274 +4 535 0 0 0 +.**$.*.*$...*$...**$ +4 105 0 2019 0 +5 2015 2017 2018 2020 +.......*$$$.....**$*....*.*$*......*$.......*$ +.....**$***.*.*$..*.*$...**$$$*$ +4 75 38 2022 2023 +4 502 0 23 0 +5 2024 2025 0 0 +6 2006 2013 2021 2026 +7 1959 1969 1999 2027 +$$.......*$...**..*$...**$ +$$$.......*$......*$ +4 290 2029 74 2030 +$$*.....**$*.....**$ +$$$**...***$.*...*$..*.*$..*.*$..*.*$ +$$$$*$ +4 2032 272 2033 2034 +4 0 50 0 594 +.*...*$.......*$$$$......*$....**.*$ +*$$$$$$*$ +....**.*$....*$.....***$*$*$ +4 2037 2038 2039 541 +5 2031 2035 2036 2040 +....**$...****$..*.*.*$..**.***$.....**$.....**$$.....**$ +$......**$.....*$....****$*.....**$*$$*$ +.....**$..**.***$..*.*.*$...****$....**$ +*.....**$....****$.....*$......**$ +4 2042 2043 2044 2045 +4 0 0 0 1483 +5 0 2046 2047 0 +6 0 0 2041 2048 +$$**$**$**$ +**$**$**$ +4 2050 98 2051 0 +$.*.*$.**$..*$ +4 0 0 2053 0 +5 2052 0 2054 1415 +5 0 0 1516 0 +6 0 0 2055 2056 +4 0 0 433 0 +$$$$$...**..*$...**..*$.......*$ +$$$...*$....*$*$.....**$.*.....*$ +4 0 0 2059 2060 +4 0 0 167 444 +$$$.......*$...**..*$...**..*$ +**...***$$**...***$.*.....*$.....**$*$....*$...*$ +$$....**$....*$..*.*$..**$.......*$.....***$ +$$$$$**$.*$.*.*$ +4 2063 2064 2065 2066 +5 2058 2061 2062 2067 +.*.*$*.*$..*$ +4 0 2069 625 0 +$$$$$.......*$......*$......*$ +4 0 0 2071 78 +4 8 764 0 0 +.....**$$.....**$......*$....*$....**$ +**.....*$.......*$**$**$ +4 2074 2075 0 0 +5 2070 2072 2073 2076 +4 0 147 0 0 +....*$....**$ +..**..**$......**$ +4 2079 2080 0 0 +$$$$$.*.**$**.**$ +**.**$.*.*$.*.*$..*$ +4 513 2082 490 2083 +..*$...***$.....*$ +4 656 125 2085 0 +5 2078 2081 2084 2086 +4 0 0 0 1872 +$$$.......*$.**....*$.**$ +4 1885 0 0 2089 +4 0 438 0 992 +5 2088 2090 2091 0 +6 2068 2077 2087 2092 +$$$$$$..*$***$ +4 0 0 2094 0 +.......*$$$......**$......**$$$.......*$ +.......*$$$$.....**$....***$...**$.*..*.**$ +4 0 2096 0 2097 +4 909 291 0 0 +.......*$......*$.......*$....*$..***$.*$.**$ +**...***$$**...***$.*..*.**$...**$....***$.....**$ +4 2100 2101 331 582 +5 2095 2098 2099 2102 +.*$***$.**$$*$$$*$ +*$$$$.*.*$*...*$...*...*$***$ +....**$$$..*.*$....*$*$...*$*$ +4 2104 265 2105 2106 +$$**$**$$$$...**$ +.....**$.......*$....**$.....*$......*$......**$$......**$ +.*...**$.*...**$*..*$**$**$...*$..*$ +......*$.....*$....**$.......*$.....**$ +4 2108 2109 2110 2111 +$$$***$...*$*...*$.*.*$ +....*$..*.*$ +$$$......**$......**$ +$$......**$......*$....*.*$....**$$.......*$ +4 2113 2114 2115 2116 +*$*.*$$$.**$.**$ +$$$$$..**$.*.*$**.*.*$ +4 2118 0 2119 0 +5 2107 2112 2117 2120 +.*.....*$..***.*$....*.*$*....**$.*$.*$.**$ +*..**$*$ +4 502 789 2122 2123 +$$......**$.....*$....*$.....*.*$......*$ +$$**$$.*$*$ +4 2125 2126 0 0 +5 2124 2127 0 0 +$$$***$ +4 407 405 2129 156 +**$**$ +4 438 2131 0 0 +$$$$$...*.**$.***.**$*$ +.***.**$...*.*$...*.*$....*$ +....*$.....***$.......*$ +4 2133 265 2134 2135 +$$$$$**$**$ +4 0 2137 0 0 +5 2130 2132 2136 2138 +6 2103 2121 2128 2139 +7 2049 2057 2093 2140 +8 0 0 2028 2141 +7 0 1245 0 1259 +$$$$.*$.***$....*$.***$ +.*$ +4 373 2144 1027 2145 +4 0 0 1897 1899 +4 0 1901 0 0 +4 1902 1904 0 0 +5 2146 2147 2148 2149 +$$$$$....**$....*$..*.*$ +4 0 0 2151 0 +$$$$$...*$...**$..*.*$ +$$$....***$***.****$*...*$*.**...*$..**.**$ +4 98 2153 2154 0 +4 105 0 860 588 +5 0 2152 2155 2156 +4 0 594 1908 0 +4 787 789 588 1914 +....**$....*$.....***$.......*$ +4 758 444 2160 290 +$$$..****$..*.**$..*$...**$ +...**$..*$..*.**$..****$ +4 0 2162 0 2163 +5 2158 2159 2161 2164 +...*.**$....*$$$$$$.....**$ +4 2166 0 1915 0 +....**$...***$.***$.***$.***$...***$....**$ +$$$..**$.*.*$...*$ +4 0 2168 2169 0 +$$$...***$.....*$..*.**$..**$ +..**$..*.**$.....***$...*****$ +4 2171 0 2172 400 +$......*$.......*$ +4 0 2174 0 0 +5 2167 2170 2173 2175 +6 2150 2157 2165 2176 +$$$..**...*$..***.*$..***$.....*$......**$ +4 0 0 0 2178 +$$$$**....**$.*....**$.*$*$ +4 0 0 2180 0 +5 0 0 2179 2181 +$$$$$.......*$...**..*$...**$ +4 0 0 0 2183 +$$$$$$.***$.*..*$ +.......*$$$$.....*$....*.*$....*..*$....**.*$ +...*$***$.*.....*$......**$.......*$$$*$ +4 0 2185 2186 2187 +$*$$.**$..*$*.*$.*$ +4 0 513 2189 830 +5 0 2184 2188 2190 +.**$.***$...***$...***$...***$.***$.**$ +$......**$.....*$..***$..***.*$..**...*$ +4 2192 2193 0 0 +$*$.*$.*....**$**....**$ +4 2195 0 0 0 +......**$......*$.......*$ +$$**$.*$ +4 1027 0 2197 2198 +$$.......*$.......*$.......*$ +4 0 2200 0 0 +5 2194 2196 2199 2201 +.......*$......*$ +.....*$....***$...*...*$..*..*$...***$ +4 2203 2204 0 0 +$$$......*$.....*.*$.....*$....**$ +4 0 0 0 2206 +$*..*$$...*$***$ +4 2208 0 0 0 +5 2205 2207 2209 0 +6 2182 2191 2202 2210 +7 0 0 2177 2211 +$$$...**$..*.*$.**.*$..**$...*$ +4 0 0 404 2213 +$...*$..**$.**.*$..*.*$...**$ +4 121 2215 0 0 +5 0 2214 0 2216 +6 0 0 0 2217 +4 0 0 0 27 +$$$....**.*$....**.*$ +$$$$.**$*.*$$....*$ +4 0 2220 0 2221 +$$**$..*$.*..*$*$.**.*$...*$ +4 2223 0 739 0 +5 2219 0 2222 2224 +$$$......**$.....*$....*.**$....*$...**$ +$$*..*$*..***$......*$******$.*$*.****.*$ +4 0 0 2226 2227 +$$$$$**$.*$*$ +4 0 0 2229 0 +..*....*$..**.*$..*...*$..*...*$..**.*$..*....*$...**$....*$ +*.*..**$*....*.*$.**.*.*$.**.*.*$*....*.*$*.*..**$*.****.*$.*$ +....*.**$.....*$......**$ +******$......*$*..***$*..*$ +4 2231 2232 2233 2234 +$*$.*$.*$*$$*$.*$ +4 2236 0 1181 0 +5 2228 2230 2235 2237 +6 0 1264 2225 2238 +$$$$$*.....**$*.....**$ +4 0 0 2240 492 +$$$$$*.....*$*.....**$**...**$ +**...**$**...***$**...***$ +4 2242 38 2243 167 +$$$$$......*$.....*.*$.....*.*$ +4 0 0 2245 0 +5 2241 0 2244 2246 +4 535 153 0 0 +.....***$.......*$......*$ +4 0 0 0 2249 +$$......**$......**$......**$....*.**$....***$.....*$ +$$.**$.**$.**$.**.*$..***$...*$ +4 2251 2252 0 0 +$$$$.......*$.......*$.......*$.......*$ +4 2169 2254 0 0 +5 2248 2250 2253 2255 +$$$$$$.*$..**$ +$$....**$.....*$**.*$**.**$$**.**$ +.**$$$*$*$ +.*.*$.*.*$..*$ +4 2257 2258 2259 2260 +....**.*$$...*$..***$.**..*.*$.**.**.*$....**.*$..*.*$ +*$$.*$***$..**$*.**$*$*.*$ +.*..*$....*$.*.*$..*$$$...*$..*.*$ +*..*$*$.*.*$..*$ +4 2262 2263 2264 2265 +$*.....*$...*$**...**$$$$**...**$ +...*$*.....*$$..*.*$...*$ +4 2267 0 2268 481 +5 2261 2266 0 2269 +$$$$.......*$......*$ +$$$$**...***$.*...*$..*.*$..*.*$ +..*.*$.*...*$.......*$ +4 2271 2272 2174 2273 +....*$....***$.......*$......**$$*$ +4 2275 0 909 38 +4 274 1519 0 0 +$$$$.......*$.......*$$.......*$ +**.....*$***...**$..**.**$..*...*$*$*$...*.*$..*...*$ +***...**$**.....*$**.....*$**.....*$ +4 2278 2279 74 2280 +5 2274 2276 2277 2281 +6 2247 2256 2270 2282 +.*...**$..**.**$....*$.....**$$$$....*$ +$$$....*$...*.*$...*.*$..**.**$ +...**$..*.**$..*.**$...***$...***$ +4 0 2284 2285 2286 +**.**$**.**$..*$**$$$$..*$ +..**$.**.*$.**.*$.***$.***$ +4 2288 0 2289 1953 +$$.*.....*$***...**$*..*.*$...*.*$.**...**$*$ +$$$*$**$.*$.*...**$**....*$ +4 2291 2292 0 50 +$$$$$$**$*$ +...***$...*.**$....***$....***$....***$....**$ +*$$$$......**$.....*.*$......*$ +4 2294 2295 2296 0 +5 2287 2290 2293 2297 +$$$$...**$*..**$*$ +4 0 0 384 2299 +$$$$..**$..**..**$......**$ +4 0 0 2301 0 +$$$$...**$$..*$..*...*$ +$$$..**$..**$$.*$..**$ +..*...*$...*.*$....*$ +4 0 2303 2304 2305 +$$$$..**$$....*$*...*$ +*...*$.*.*$..*$ +4 2307 0 2308 0 +5 2300 2302 2306 2309 +$.......*$$$....*$$.......*$......**$ +$**$$...***$..*..*$*....*$**..*$.**$ +4 2311 2312 38 0 +.....*$$...*$..*...**$...**$ +..***$.*..*$.*...*.*$**.*.*.*$**.**$.***$ +***$*..*$...*$.*.**$**.**$.***$ +4 0 2314 2315 2316 +*$*$$$**$**$$.*$ +*$*..**$*..**$*$ +$......**$......**$ +4 2318 0 2319 2320 +$.....**$.**..**$.**$ +4 0 0 92 2322 +5 2313 2317 2321 2323 +..****$..****$..*$...*$***$ +$$$$$$...**$..*..*$ +$$$$$$..**$.*..*$ +4 2325 0 2326 2327 +$$$$....**$....*$.....***$.......*$ +4 2329 0 0 0 +.....**$....*.*$....*.*$..*$.*$$.....**$...*..*$ +**$*.*$*.*$....*$.....*$$**$*..*$ +...***$$$...**$...**$ +.***$$$..**$..**$ +4 2331 2332 2333 2334 +5 2328 2330 2335 0 +6 2298 2310 2324 2336 +7 2218 2239 2283 2337 +8 0 2143 2212 2338 +9 0 1952 2142 2339 +10 0 1715 1949 2340 +11 999 1409 1595 2341 +12 0 0 2342 2342 +4 0 0 378 0 +5 0 0 0 2344 +4 1410 0 0 0 +5 0 2346 0 0 +6 0 2345 0 2347 +7 0 1720 2348 0 +8 0 0 2349 1790 +9 0 0 2350 1948 +10 0 1715 2351 2340 +11 999 1409 1595 2352 +4 0 992 0 0 +5 0 993 0 2354 +6 2355 0 0 0 +7 0 991 2356 0 +8 988 0 2357 0 +9 922 0 2358 0 +10 623 756 2359 0 +7 0 1720 0 0 +8 0 0 2361 1790 +9 0 0 2362 1948 +10 0 1715 2363 2340 +11 2360 1409 1595 2364 +12 0 0 2353 2365 +13 0 0 2343 2366 +4 0 992 0 992 +5 0 2368 0 2354 +5 0 0 0 993 +6 2369 977 2370 0 +7 964 973 2371 987 +6 0 0 994 0 +5 0 2354 0 0 +6 994 0 2374 0 +7 2373 991 2375 0 +8 2372 0 2376 0 +9 922 0 2377 0 +10 623 756 2378 0 +6 0 0 2370 0 +5 0 2368 0 0 +6 2381 0 2370 0 +7 2380 0 2382 0 +5 0 0 0 2354 +5 0 2354 0 993 +6 2384 0 2385 0 +6 2374 0 2374 0 +7 2386 0 2387 0 +8 2383 0 2388 0 +5 1411 2368 0 1413 +6 2374 0 2390 1416 +7 2391 1421 1431 1437 +8 2392 0 0 0 +9 2389 0 2393 0 +$$..*.*$.....*$.....*$..*..*$...***$ +4 2395 0 0 0 +5 2396 1442 0 1445 +6 0 2397 1450 1463 +7 2398 1477 1528 1561 +8 0 0 2399 1570 +9 0 0 2400 0 +5 0 0 1721 0 +5 0 0 1721 2344 +5 1723 0 0 1589 +5 1723 2346 0 0 +6 2402 2403 2404 2405 +7 1576 0 1588 2406 +8 0 0 0 2407 +6 2403 0 2405 0 +5 0 0 1721 1721 +5 1723 1723 0 0 +6 2345 2410 2347 2411 +7 0 0 2409 2412 +4 0 0 378 378 +5 0 0 2344 2414 +4 1410 1410 0 0 +5 2346 2416 0 0 +6 0 2415 0 2417 +5 0 0 0 2414 +5 0 2416 0 0 +6 0 2419 0 2420 +7 0 0 2418 2421 +8 0 0 2413 2422 +9 0 0 2408 2423 +10 2394 0 2401 2424 +5 0 0 2344 1721 +5 2346 1723 0 0 +6 0 2426 0 2427 +5 1723 0 0 0 +6 2402 0 2429 0 +7 0 1720 2428 2430 +6 2345 1751 2347 0 +7 1737 1747 2432 1789 +8 0 0 2431 2433 +9 0 0 2434 1948 +10 0 1715 2435 2340 +11 2379 1409 2425 2436 +6 2381 977 2384 0 +7 964 973 2438 987 +7 0 991 2375 0 +8 2439 0 2440 0 +9 922 0 2441 0 +10 623 756 2442 0 +5 0 2354 0 2368 +6 2444 0 0 0 +7 995 0 2445 0 +5 0 993 0 2368 +6 2447 0 0 0 +7 2448 0 2380 0 +8 2446 0 2449 0 +4 1412 0 307 992 +5 1411 2354 0 2451 +6 2370 0 2452 1416 +7 2453 1421 1431 1437 +8 2454 0 0 0 +9 2450 0 2455 0 +5 0 2346 0 1589 +6 2345 2419 2457 2420 +7 1576 0 1588 2458 +8 0 0 0 2459 +6 2419 1722 2420 1724 +6 2415 0 2417 0 +7 0 0 2461 2462 +5 0 0 2344 0 +5 0 0 2414 2414 +5 2346 0 0 0 +5 2416 2416 0 0 +6 2464 2465 2466 2467 +6 2464 2345 2466 2347 +7 0 0 2468 2469 +8 0 0 2463 2470 +9 0 0 2460 2471 +10 2456 0 2401 2472 +6 1722 1722 1724 1724 +7 0 1720 2474 2409 +5 0 1750 1721 0 +6 2464 2476 2466 2429 +7 1737 1747 2477 1789 +8 0 0 2475 2478 +9 0 0 2479 1948 +10 0 1715 2480 2340 +11 2443 1409 2473 2481 +5 0 0 0 2368 +6 994 977 2483 0 +7 964 973 2484 987 +6 0 0 2384 0 +6 0 0 2374 0 +7 2486 991 2487 0 +8 2485 0 2488 0 +9 922 0 2489 0 +10 623 756 2490 0 +5 0 2368 0 2368 +6 2492 0 994 0 +5 0 2368 0 993 +6 2374 0 2494 0 +7 2493 0 2495 0 +8 2383 0 2496 0 +5 0 993 0 993 +5 1411 2368 0 2451 +6 2498 0 2499 1416 +7 2500 1421 1431 1437 +8 2501 0 0 0 +9 2497 0 2502 0 +5 0 0 2344 2344 +5 2346 2346 0 1589 +6 2504 2465 2505 2467 +7 1576 0 1588 2506 +8 0 0 0 2507 +6 2465 1722 2467 1724 +6 2465 2464 2467 2466 +7 0 0 2509 2510 +6 2464 2415 2466 2417 +7 0 0 2512 2421 +8 0 0 2511 2513 +9 0 0 2508 2514 +10 2503 0 1572 2515 +6 0 2464 0 2466 +7 0 1720 2517 2430 +5 0 1750 0 2344 +6 2403 2519 2405 2347 +7 1737 1747 2520 1789 +8 0 0 2518 2521 +9 0 0 2522 1948 +10 0 1715 2523 2340 +11 2491 1409 2516 2524 +6 2381 977 2483 0 +7 964 973 2526 987 +7 2380 991 2487 0 +8 2527 0 2528 0 +9 922 0 2529 0 +10 623 756 2530 0 +6 2444 0 2370 0 +7 995 0 2532 0 +6 2492 0 2444 0 +6 2381 0 2369 0 +7 2534 0 2535 0 +8 2533 0 2536 0 +4 1412 992 307 992 +5 1411 2368 0 2538 +6 2444 0 2539 1416 +7 2540 1421 1431 1437 +8 2541 0 0 0 +9 2537 0 2542 0 +5 0 0 1721 2414 +5 0 1723 0 1589 +5 1723 2416 0 0 +6 1722 2544 2545 2546 +7 1576 0 1588 2547 +8 0 0 0 2548 +5 0 0 2414 2344 +5 2416 2346 0 0 +6 2550 0 2551 0 +6 2415 1722 2417 1724 +7 0 0 2552 2553 +6 0 2465 0 2467 +7 0 0 2555 2469 +8 0 0 2554 2556 +9 0 0 2549 2557 +10 2543 0 2401 2558 +6 1722 0 1724 0 +7 0 1720 2560 2430 +5 2346 2346 0 0 +6 2504 2519 2562 2347 +7 1737 1747 2563 1789 +8 0 0 2561 2564 +9 0 0 2565 1948 +10 0 1715 2566 2340 +11 2531 1409 2559 2567 +12 2437 2482 2525 2568 +6 2374 977 2384 0 +7 964 973 2570 987 +6 2374 0 2370 0 +6 994 0 2381 0 +7 2572 991 2573 0 +8 2571 0 2574 0 +9 922 0 2575 0 +10 623 756 2576 0 +6 2384 0 0 0 +6 2494 0 2374 0 +7 2578 0 2579 0 +6 2494 0 2384 0 +6 994 0 2355 0 +7 2581 0 2582 0 +8 2580 0 2583 0 +5 1411 0 0 2538 +6 2483 0 2585 1416 +7 2586 1421 1431 1437 +8 2587 0 0 0 +9 2584 0 2588 0 +6 1722 1722 2545 1724 +7 1576 0 1588 2590 +8 0 0 0 2591 +6 2464 0 2466 0 +6 2426 2402 2427 2429 +7 0 0 2593 2594 +7 0 0 2555 2348 +8 0 0 2595 2596 +9 0 0 2592 2597 +10 2589 0 2401 2598 +6 2345 0 2347 0 +7 0 1720 2348 2600 +5 0 1750 1721 2344 +6 0 2602 0 2405 +7 1737 1747 2603 1789 +8 0 0 2601 2604 +9 0 0 2605 1948 +10 0 1715 2606 2340 +11 2577 1409 2599 2607 +6 2385 977 0 0 +7 964 973 2609 987 +6 2374 0 2384 0 +6 2355 0 994 0 +7 2611 991 2612 0 +8 2610 0 2613 0 +9 922 0 2614 0 +10 623 756 2615 0 +5 0 2354 0 2354 +6 2617 0 0 0 +7 0 0 2618 0 +6 2385 0 994 0 +6 2381 0 994 0 +7 2620 0 2621 0 +8 2619 0 2622 0 +4 1412 992 307 0 +5 1411 993 0 2624 +6 994 0 2625 1416 +7 2626 1421 1431 1437 +8 2627 0 0 0 +9 2623 0 2628 0 +5 0 0 2414 0 +5 2346 0 0 1589 +5 2416 0 0 0 +6 2464 2630 2631 2632 +7 1576 0 1588 2633 +8 0 0 0 2634 +6 2630 0 2632 0 +6 2402 2504 2429 2562 +7 0 0 2636 2637 +6 1722 2544 1724 2546 +6 0 2403 0 2405 +7 0 0 2639 2640 +8 0 0 2638 2641 +9 0 0 2635 2642 +10 2629 0 2401 2643 +7 0 1720 2560 2593 +6 2402 2519 2429 2347 +7 1737 1747 2646 1789 +8 0 0 2645 2647 +9 0 0 2648 1948 +10 0 1715 2649 2340 +11 2616 1409 2644 2650 +6 2617 977 2483 0 +7 964 973 2652 987 +6 2374 0 0 0 +6 0 0 2381 0 +7 2654 991 2655 0 +8 2653 0 2656 0 +9 922 0 2657 0 +10 623 756 2658 0 +6 2381 0 2498 0 +7 2621 0 2660 0 +8 2580 0 2661 0 +5 1411 2368 0 2624 +6 2498 0 2663 1416 +7 2664 1421 1431 1437 +8 2665 0 0 0 +9 2662 0 2666 0 +6 2465 2550 2467 2551 +7 0 0 2509 2668 +7 0 0 2468 2348 +8 0 0 2669 2670 +9 0 0 2508 2671 +10 2667 0 2401 2672 +7 0 1720 0 2636 +8 0 0 2674 2647 +9 0 0 2675 1948 +10 0 1715 2676 2340 +11 2659 1409 2673 2677 +6 0 977 2483 0 +7 964 973 2679 987 +7 2572 991 2373 0 +8 2680 0 2681 0 +9 922 0 2682 0 +10 623 756 2683 0 +6 2492 0 2384 0 +6 2381 0 2355 0 +7 2685 0 2686 0 +8 2619 0 2687 0 +6 2444 0 2663 1416 +7 2689 1421 1431 1437 +8 2690 0 0 0 +9 2688 0 2691 0 +5 1723 1723 0 1589 +6 2410 2544 2693 2546 +7 1576 0 1588 2694 +8 0 0 0 2695 +6 2550 2345 2551 2347 +6 2465 2426 2467 2427 +7 0 0 2697 2698 +8 0 0 2699 2641 +9 0 0 2696 2700 +10 2692 0 1572 2701 +6 2464 2602 2466 2405 +7 1737 1747 2703 1789 +8 0 0 2645 2704 +9 0 0 2705 1948 +10 0 1715 2706 2340 +11 2684 1409 2702 2707 +12 2608 2651 2678 2708 +6 994 977 2444 0 +7 964 973 2710 987 +6 2370 0 2617 0 +7 2712 991 2487 0 +8 2711 0 2713 0 +9 922 0 2714 0 +10 623 756 2715 0 +6 2384 0 2447 0 +7 2717 0 2382 0 +6 2369 0 994 0 +7 2719 0 2495 0 +8 2718 0 2720 0 +9 2721 0 2502 0 +6 2465 0 2467 0 +7 0 0 2509 2723 +6 0 2504 0 2562 +7 0 0 2512 2725 +8 0 0 2724 2726 +9 0 0 2508 2727 +10 2722 0 1572 2728 +7 0 1720 2512 2430 +5 0 1750 2414 2344 +6 2544 2731 2546 2551 +7 1737 1747 2732 1789 +8 0 0 2730 2733 +9 0 0 2734 1948 +10 0 1715 2735 2340 +11 2716 1409 2729 2736 +6 2494 977 2447 0 +7 964 973 2738 987 +6 2370 0 2370 0 +6 2384 0 2374 0 +7 2740 991 2741 0 +8 2739 0 2742 0 +9 922 0 2743 0 +10 623 756 2744 0 +6 2374 0 2381 0 +6 2374 0 2385 0 +7 2746 0 2747 0 +6 2369 0 2492 0 +7 2749 0 2535 0 +8 2748 0 2750 0 +9 2751 0 2542 0 +6 2504 2426 2562 2427 +7 0 0 2552 2753 +6 2630 2403 2632 2405 +7 0 0 1725 2755 +8 0 0 2754 2756 +9 0 0 2549 2757 +10 2752 0 2401 2758 +6 2410 0 2411 0 +7 0 1720 2474 2760 +5 0 1750 2344 2344 +6 2415 2762 2417 2562 +7 1737 1747 2763 1789 +8 0 0 2761 2764 +9 0 0 2765 1948 +10 0 1715 2766 2340 +11 2745 1409 2759 2767 +6 2370 0 2384 0 +7 2769 991 2375 0 +8 2711 0 2770 0 +9 922 0 2771 0 +10 623 756 2772 0 +6 2385 0 2494 0 +7 2774 0 2382 0 +7 2719 0 2373 0 +8 2775 0 2776 0 +6 2370 0 2499 1416 +7 2778 1421 1431 1437 +8 2779 0 0 0 +9 2777 0 2780 0 +5 0 0 2414 1721 +5 2416 1723 0 0 +6 2504 2782 2505 2783 +7 1576 0 1588 2784 +8 0 0 0 2785 +6 2504 0 2562 0 +6 2465 2630 2467 2632 +7 0 0 2787 2788 +6 1722 2419 1724 2420 +7 0 0 2512 2790 +8 0 0 2789 2791 +9 0 0 2786 2792 +10 2781 0 1572 2793 +6 2464 2426 2466 2427 +6 2410 2630 2411 2632 +7 0 1720 2795 2796 +8 0 0 2797 2733 +9 0 0 2798 1948 +10 0 1715 2799 2340 +11 2773 1409 2794 2800 +6 2370 0 2385 0 +7 2802 991 2375 0 +8 2739 0 2803 0 +9 922 0 2804 0 +10 623 756 2805 0 +7 2573 0 2532 0 +6 2492 0 2492 0 +7 2808 0 2486 0 +8 2807 0 2809 0 +6 2385 0 2539 1416 +7 2811 1421 1431 1437 +8 2812 0 0 0 +9 2810 0 2813 0 +6 1722 2410 2545 2411 +7 1576 0 1588 2815 +8 0 0 0 2816 +6 2504 1722 2562 1724 +7 0 0 2600 2818 +6 2504 2415 2562 2417 +7 0 0 2555 2820 +8 0 0 2819 2821 +9 0 0 2817 2822 +10 2814 0 2401 2823 +6 2426 1722 2427 1724 +6 2410 2464 2411 2466 +7 0 1720 2825 2826 +8 0 0 2827 2764 +9 0 0 2828 1948 +10 0 1715 2829 2340 +11 2806 1409 2824 2830 +12 2737 2768 2801 2831 +6 2617 977 2444 0 +7 964 973 2833 987 +6 2355 0 2381 0 +7 2654 991 2835 0 +8 2834 0 2836 0 +9 922 0 2837 0 +10 623 756 2838 0 +6 2369 0 0 0 +7 2386 0 2840 0 +6 2381 0 2374 0 +7 2842 0 2660 0 +8 2841 0 2843 0 +9 2844 0 2666 0 +6 2782 2403 2783 2405 +7 0 0 2509 2846 +6 2426 2419 2427 2420 +7 0 0 2848 2412 +8 0 0 2847 2849 +9 0 0 2508 2850 +10 2845 0 2401 2851 +6 2782 2464 2783 2466 +7 0 1720 0 2853 +6 2544 2762 2546 2562 +7 1737 1747 2855 1789 +8 0 0 2854 2856 +9 0 0 2857 1948 +10 0 1715 2858 2340 +11 2839 1409 2852 2859 +6 0 977 2447 0 +7 964 973 2861 987 +6 2374 0 2498 0 +6 994 0 994 0 +7 2863 991 2864 0 +8 2862 0 2865 0 +9 922 0 2866 0 +10 623 756 2867 0 +6 2370 0 2483 0 +7 2869 0 2618 0 +8 2870 0 2687 0 +9 2871 0 2691 0 +6 2550 1722 2551 1724 +7 0 0 2697 2873 +6 1722 2410 1724 2411 +7 0 0 2639 2875 +8 0 0 2874 2876 +9 0 0 2696 2877 +10 2872 0 1572 2878 +6 1722 2402 1724 2429 +6 2464 2464 2466 2466 +7 0 1720 2880 2881 +6 2415 2731 2417 2551 +7 1737 1747 2883 1789 +8 0 0 2882 2884 +9 0 0 2885 1948 +10 0 1715 2886 2340 +11 2868 1409 2879 2887 +7 2620 991 2573 0 +8 2834 0 2889 0 +9 922 0 2890 0 +10 623 756 2891 0 +6 2617 0 2369 0 +7 2893 0 2579 0 +6 2494 0 0 0 +7 2895 0 2654 0 +8 2894 0 2896 0 +9 2897 0 2666 0 +6 2504 2426 2505 2427 +7 1576 0 1588 2899 +8 0 0 0 2900 +7 0 0 2409 2846 +7 0 0 2468 2790 +8 0 0 2902 2903 +9 0 0 2901 2904 +10 2898 0 2401 2905 +7 0 1720 2348 2853 +8 0 0 2907 2856 +9 0 0 2908 1948 +10 0 1715 2909 2340 +11 2892 1409 2906 2910 +7 2747 991 2612 0 +8 2862 0 2912 0 +9 922 0 2913 0 +10 623 756 2914 0 +6 994 0 2369 0 +7 2916 0 2618 0 +7 2685 0 2611 0 +8 2917 0 2918 0 +6 2370 0 2663 1416 +7 2920 1421 1431 1437 +8 2921 0 0 0 +9 2919 0 2922 0 +6 2410 2419 2693 2420 +7 1576 0 1588 2924 +8 0 0 0 2925 +7 0 0 2430 2698 +6 2345 2544 2347 2546 +7 0 0 2639 2928 +8 0 0 2927 2929 +9 0 0 2926 2930 +10 2923 0 1572 2931 +6 2415 2464 2417 2466 +7 0 1720 2560 2933 +8 0 0 2934 2884 +9 0 0 2935 1948 +10 0 1715 2936 2340 +11 2915 1409 2932 2937 +12 2860 2888 2911 2938 +13 2569 2709 2832 2939 +14 0 2367 0 2940 +7 0 991 2578 0 +8 988 0 2942 0 +9 922 0 2943 0 +10 623 756 2944 0 +11 2945 1409 1595 2352 +6 0 2402 0 2429 +7 0 1720 2947 0 +8 0 0 2948 1790 +9 0 0 2949 1948 +10 0 1715 2950 2340 +11 2945 1409 1595 2951 +12 0 0 2946 2952 +6 2483 0 0 0 +7 0 991 2954 0 +8 988 0 2955 0 +9 922 0 2956 0 +10 623 756 2957 0 +11 2958 1409 1595 2364 +6 2370 0 0 0 +7 0 991 2960 0 +8 988 0 2961 0 +9 922 0 2962 0 +10 623 756 2963 0 +11 2964 1409 1595 2951 +12 0 0 2959 2965 +13 0 0 2953 2966 +7 0 1720 2517 0 +8 0 0 2968 1790 +9 0 0 2969 1948 +10 0 1715 2970 2340 +11 2964 1409 1595 2971 +6 2370 0 2374 0 +7 0 991 2973 0 +8 988 0 2974 0 +9 922 0 2975 0 +10 623 756 2976 0 +11 2977 1409 1595 2364 +12 0 0 2972 2978 +7 0 991 2487 0 +8 988 0 2980 0 +9 922 0 2981 0 +10 623 756 2982 0 +11 2983 1409 1595 2971 +7 0 1720 2560 0 +8 0 0 2985 1790 +9 0 0 2986 1948 +10 0 1715 2987 2340 +11 2983 1409 1595 2988 +12 0 0 2984 2989 +13 0 0 2979 2990 +6 2384 977 2370 0 +7 964 973 2992 987 +6 2384 0 994 0 +7 0 991 2994 0 +8 2993 0 2995 0 +9 922 0 2996 0 +10 623 756 2997 0 +6 2498 0 2374 0 +7 2578 0 2999 0 +7 2954 0 2654 0 +8 3000 0 3001 0 +9 3002 0 2393 0 +6 2403 2345 2405 2347 +6 2403 2426 2405 2427 +7 0 0 3004 3005 +6 1722 2465 1724 2467 +7 0 0 3007 2947 +8 0 0 3006 3008 +9 0 0 2408 3009 +10 3003 0 1572 3010 +6 2345 2345 2347 2347 +6 2630 1722 2632 1724 +7 0 1720 3012 3013 +5 0 1750 2344 0 +6 0 3015 0 2466 +7 1737 1747 3016 1789 +8 0 0 3014 3017 +9 0 0 3018 1948 +10 0 1715 3019 2340 +11 2998 1409 3011 3020 +6 0 977 2370 0 +7 964 973 3022 987 +6 2617 0 2355 0 +7 995 991 3024 0 +8 3023 0 3025 0 +9 922 0 3026 0 +10 623 756 3027 0 +6 2384 0 2381 0 +7 2960 0 3029 0 +6 2355 0 2385 0 +6 2384 0 2370 0 +7 3031 0 3032 0 +8 3030 0 3033 0 +9 3034 0 2455 0 +6 2345 1722 2347 1724 +6 2345 2464 2347 2466 +7 0 0 3036 3037 +8 0 0 3038 3008 +9 0 0 2460 3039 +10 3035 0 1572 3040 +7 0 1720 2947 2430 +5 0 1750 2414 0 +6 0 3043 0 2632 +7 1737 1747 3044 1789 +8 0 0 3042 3045 +9 0 0 3046 1948 +10 0 1715 3047 2340 +11 3028 1409 3041 3048 +6 2374 0 994 0 +7 2654 991 3050 0 +8 2993 0 3051 0 +9 922 0 3052 0 +10 623 756 3053 0 +6 2492 0 2494 0 +6 2369 0 2498 0 +7 3055 0 3056 0 +8 3000 0 3057 0 +6 2498 0 2539 1416 +7 3059 1421 1431 1437 +8 3060 0 0 0 +9 3058 0 3061 0 +6 2345 2465 2457 2467 +7 1576 0 1588 3063 +8 0 0 0 3064 +7 0 0 2873 3004 +8 0 0 3066 3008 +9 0 0 3065 3067 +10 3062 0 1572 3068 +6 2464 1722 2466 1724 +7 0 1720 2600 3070 +6 2402 2476 2429 2429 +7 1737 1747 3072 1789 +8 0 0 3071 3073 +9 0 0 3074 1948 +10 0 1715 3075 2340 +11 3054 1409 3069 3076 +6 2370 977 2370 0 +7 964 973 3078 987 +6 2381 0 0 0 +6 0 0 2355 0 +7 3080 991 3081 0 +8 3079 0 3082 0 +9 922 0 3083 0 +10 623 756 3084 0 +6 2355 0 2384 0 +6 2369 0 2384 0 +7 3086 0 3087 0 +8 3030 0 3088 0 +9 3089 0 2542 0 +6 2465 2782 2467 2783 +7 0 0 2697 3091 +8 0 0 3092 3008 +9 0 0 2696 3093 +10 3090 0 1572 3094 +7 0 1720 1725 2593 +8 0 0 3096 2478 +9 0 0 3097 1948 +10 0 1715 3098 2340 +11 3085 1409 3095 3099 +12 3021 3049 3077 3100 +6 0 977 2374 0 +7 964 973 3102 987 +6 994 0 2370 0 +6 2483 0 2384 0 +7 3104 991 3105 0 +8 3103 0 3106 0 +9 922 0 3107 0 +10 623 756 3108 0 +6 2498 0 0 0 +7 2960 0 3110 0 +6 994 0 2384 0 +7 3112 0 3086 0 +8 3111 0 3113 0 +9 3114 0 2588 0 +6 2426 2630 2427 2632 +7 0 0 2593 3116 +6 2345 2550 2347 2551 +7 0 0 3118 2947 +8 0 0 3117 3119 +9 0 0 2592 3120 +10 3115 0 1572 3121 +7 0 1720 3036 0 +8 0 0 3123 2478 +9 0 0 3124 1948 +10 0 1715 3125 2340 +11 3109 1409 3122 3126 +6 2370 977 0 0 +7 964 973 3128 987 +7 2654 991 2769 0 +8 3129 0 3130 0 +9 922 0 3131 0 +10 623 756 3132 0 +7 2973 0 995 0 +8 3030 0 3134 0 +9 3135 0 2628 0 +6 2630 2402 2632 2429 +6 2782 2345 2783 2347 +7 0 0 3137 3138 +6 2419 2550 2420 2551 +7 0 0 3140 2517 +8 0 0 3139 3141 +9 0 0 2635 3142 +10 3136 0 1572 3143 +6 2402 2410 2429 2411 +7 0 1720 3145 2469 +6 1722 1751 1724 0 +7 1737 1747 3147 1789 +8 0 0 3146 3148 +9 0 0 3149 1948 +10 0 1715 3150 2340 +11 3133 1409 3144 3151 +7 3080 991 2611 0 +8 3023 0 3153 0 +9 922 0 3154 0 +10 623 756 3155 0 +6 2447 0 2370 0 +6 2355 0 2370 0 +7 3157 0 3158 0 +8 3111 0 3159 0 +9 3160 0 3061 0 +6 2550 2410 2551 2411 +6 2465 2504 2467 2562 +7 0 0 3162 3163 +8 0 0 3164 3119 +9 0 0 2508 3165 +10 3161 0 1572 3166 +7 0 1720 3036 1725 +8 0 0 3168 3045 +9 0 0 3169 1948 +10 0 1715 3170 2340 +11 3156 1409 3167 3171 +7 3080 991 3112 0 +8 2610 0 3173 0 +9 922 0 3174 0 +10 623 756 3175 0 +6 2447 0 2369 0 +7 3177 0 2685 0 +8 3030 0 3178 0 +9 3179 0 2542 0 +6 2630 2345 2632 2347 +7 0 0 3181 3137 +8 0 0 3182 3141 +9 0 0 2696 3183 +10 3180 0 2401 3184 +6 2402 1722 2429 1724 +7 0 1720 3186 2348 +6 2464 3015 2466 2466 +7 1737 1747 3188 1789 +8 0 0 3187 3189 +9 0 0 3190 1948 +10 0 1715 3191 2340 +11 3176 1409 3185 3192 +12 3127 3152 3172 3193 +6 2384 977 2444 0 +7 964 973 3195 987 +7 2387 991 2620 0 +8 3196 0 3197 0 +9 922 0 3198 0 +10 623 756 3199 0 +6 2498 0 2355 0 +7 3201 0 2864 0 +6 2492 0 2447 0 +7 3203 0 3056 0 +8 3202 0 3204 0 +9 3205 0 3061 0 +6 2410 2345 2411 2347 +7 0 0 2873 3207 +6 2464 2402 2466 2429 +7 0 0 2421 3209 +8 0 0 3208 3210 +9 0 0 3065 3211 +10 3206 0 1572 3212 +7 0 1720 3012 2818 +6 2544 2476 2546 2429 +7 1737 1747 3215 1789 +8 0 0 3214 3216 +9 0 0 3217 1948 +10 0 1715 3218 2340 +11 3200 1409 3213 3219 +6 2498 977 2447 0 +7 964 973 3221 987 +6 2483 0 2355 0 +7 3080 991 3223 0 +8 3222 0 3224 0 +9 922 0 3225 0 +10 623 756 3226 0 +6 2370 0 994 0 +7 3228 0 2445 0 +7 2612 0 3087 0 +8 3229 0 3230 0 +9 3231 0 2542 0 +6 2504 2782 2562 2783 +7 0 0 2697 3233 +7 0 0 2928 2637 +8 0 0 3234 3235 +9 0 0 2696 3236 +10 3232 0 1572 3237 +7 0 1720 1725 2462 +5 0 1750 1721 1721 +6 2415 3240 2417 2411 +7 1737 1747 3241 1789 +8 0 0 3239 3242 +9 0 0 3243 1948 +10 0 1715 3244 2340 +11 3227 1409 3238 3245 +6 2355 977 2444 0 +7 964 973 3247 987 +6 2617 0 994 0 +7 3050 991 3249 0 +8 3248 0 3250 0 +9 922 0 3251 0 +10 623 756 3252 0 +6 2384 0 2355 0 +7 3254 0 2999 0 +7 3203 0 2572 0 +8 3255 0 3256 0 +6 994 0 2539 1416 +7 3258 1421 1431 1437 +8 3259 0 0 0 +9 3257 0 3260 0 +6 2345 2504 2457 2562 +7 1576 0 1588 3262 +8 0 0 0 3263 +7 0 0 3186 2637 +6 2410 2544 2411 2546 +7 0 0 3007 3266 +8 0 0 3265 3267 +9 0 0 3264 3268 +10 3261 0 1572 3269 +6 2415 2426 2417 2427 +7 0 1720 3012 3271 +6 2544 3240 2546 2411 +7 1737 1747 3273 1789 +8 0 0 3272 3274 +9 0 0 3275 1948 +10 0 1715 3276 2340 +11 3253 1409 3270 3277 +6 2381 0 2617 0 +7 3279 991 3254 0 +8 3222 0 3280 0 +9 922 0 3281 0 +10 623 756 3282 0 +6 2498 0 2447 0 +7 3284 0 3029 0 +6 2355 0 2374 0 +7 3286 0 3080 0 +8 3285 0 3287 0 +6 2384 0 2539 1416 +7 3289 1421 1431 1437 +8 3290 0 0 0 +9 3288 0 3291 0 +6 2410 2345 2693 2347 +7 1576 0 1588 3293 +8 0 0 0 3294 +7 0 0 2636 3233 +6 2345 2403 2347 2405 +7 0 0 3007 3297 +8 0 0 3296 3298 +9 0 0 3295 3299 +10 3292 0 1572 3300 +6 0 2410 0 2411 +7 0 1720 3302 2462 +8 0 0 3303 3242 +9 0 0 3304 1948 +10 0 1715 3305 2340 +11 3283 1409 3301 3306 +12 3220 3246 3278 3307 +6 2381 0 2384 0 +6 2617 0 2384 0 +7 3309 991 3310 0 +8 2485 0 3311 0 +9 922 0 3312 0 +10 623 756 3313 0 +7 2802 0 2895 0 +8 3315 0 3159 0 +9 3316 0 3061 0 +6 2630 2504 2632 2562 +7 0 0 3162 3318 +7 0 0 3118 3012 +8 0 0 3319 3320 +9 0 0 2508 3321 +10 3317 0 1572 3322 +6 2345 2426 2347 2427 +7 0 1720 3324 2474 +5 0 1750 2414 1721 +6 2544 3326 2546 2783 +7 1737 1747 3327 1789 +8 0 0 3325 3328 +9 0 0 3329 1948 +10 0 1715 3330 2340 +11 3314 1409 3323 3331 +6 2385 977 2447 0 +7 964 973 3333 987 +6 994 0 2617 0 +7 2621 991 3335 0 +8 3334 0 3336 0 +9 922 0 3337 0 +10 623 756 3338 0 +6 2384 0 2444 0 +6 2384 0 2384 0 +7 3340 0 3341 0 +6 2447 0 2444 0 +7 3343 0 2685 0 +8 3342 0 3344 0 +9 3345 0 2542 0 +6 2504 2402 2562 2429 +7 0 0 3181 3347 +6 0 2544 0 2546 +7 0 0 3349 2517 +8 0 0 3348 3350 +9 0 0 2696 3351 +10 3346 0 2401 3352 +6 2402 2345 2429 2347 +7 0 1720 3145 3354 +5 0 1750 2344 2414 +6 2504 3356 2562 2417 +7 1737 1747 3357 1789 +8 0 0 3355 3358 +9 0 0 3359 1948 +10 0 1715 3360 2340 +11 3339 1409 3353 3361 +6 2444 0 2384 0 +7 2621 991 3363 0 +8 2485 0 3364 0 +9 922 0 3365 0 +10 623 756 3366 0 +6 2483 0 2447 0 +7 3368 0 3110 0 +7 3157 0 3104 0 +8 3369 0 3370 0 +6 0 0 2539 1416 +7 3372 1421 1431 1437 +8 3373 0 0 0 +9 3371 0 3374 0 +6 2504 2403 2505 2405 +7 1576 0 1588 3376 +8 0 0 0 3377 +7 0 0 3070 3163 +6 2402 2403 2429 2405 +7 0 0 3118 3380 +8 0 0 3379 3381 +9 0 0 3378 3382 +10 3375 0 1572 3383 +6 2544 1722 2546 1724 +7 0 1720 3036 3385 +8 0 0 3386 2733 +9 0 0 3387 1948 +10 0 1715 3388 2340 +11 3367 1409 3384 3389 +6 2498 0 2384 0 +7 3309 991 3391 0 +8 2739 0 3392 0 +9 922 0 3393 0 +10 623 756 3394 0 +7 2869 0 3029 0 +7 3343 0 3080 0 +8 3396 0 3397 0 +5 1411 993 0 2538 +6 2617 0 3399 1416 +7 3400 1421 1431 1437 +8 3401 0 0 0 +9 3398 0 3402 0 +6 2410 2402 2693 2429 +7 1576 0 1588 3404 +8 0 0 0 3405 +7 0 0 2469 2594 +6 2504 2550 2562 2551 +7 0 0 3140 3408 +8 0 0 3407 3409 +9 0 0 3406 3410 +10 3403 0 2401 3411 +6 2544 2345 2546 2347 +7 0 1720 3145 3413 +6 2504 2762 2562 2562 +7 1737 1747 3415 1789 +8 0 0 3414 3416 +9 0 0 3417 1948 +10 0 1715 3418 2340 +11 3395 1409 3412 3419 +12 3332 3362 3390 3420 +13 3101 3194 3308 3421 +6 2374 977 0 0 +7 964 973 3423 987 +7 2618 991 3391 0 +8 3424 0 3425 0 +9 922 0 3426 0 +10 623 756 3427 0 +6 2370 0 2355 0 +7 2973 0 3429 0 +6 2483 0 994 0 +6 2385 0 0 0 +7 3431 0 3432 0 +8 3430 0 3433 0 +9 3434 0 2393 0 +7 0 0 3354 2760 +7 0 0 3140 0 +8 0 0 3436 3437 +9 0 0 2408 3438 +10 3435 0 2401 3439 +6 2402 2464 2429 2466 +7 0 1720 3441 2593 +6 1722 3015 1724 2466 +7 1737 1747 3443 1789 +8 0 0 3442 3444 +9 0 0 3445 1948 +10 0 1715 3446 2340 +11 3428 1409 3440 3447 +6 2374 977 994 0 +7 964 973 3449 987 +6 2494 0 2385 0 +7 2578 991 3451 0 +8 3450 0 3452 0 +9 922 0 3453 0 +10 623 756 3454 0 +6 2384 0 2617 0 +7 2487 0 3456 0 +7 3032 0 2532 0 +8 3457 0 3458 0 +9 3459 0 2455 0 +6 2419 2464 2420 2466 +7 0 0 0 3461 +6 1722 2630 1724 2632 +7 0 0 3463 2517 +8 0 0 3462 3464 +9 0 0 2460 3465 +10 3460 0 2401 3466 +7 0 1720 2430 1725 +8 0 0 3468 3017 +9 0 0 3469 1948 +10 0 1715 3470 2340 +11 3455 1409 3467 3471 +6 2374 977 2374 0 +7 964 973 3473 987 +7 2840 991 3112 0 +8 3474 0 3475 0 +9 922 0 3476 0 +10 623 756 3477 0 +6 2483 0 2370 0 +6 2492 0 2370 0 +7 3479 0 3480 0 +8 3430 0 3481 0 +9 3482 0 3061 0 +7 0 0 3137 3163 +8 0 0 3484 3437 +9 0 0 2508 3485 +10 3483 0 2401 3486 +7 0 1720 3186 1725 +8 0 0 3488 3017 +9 0 0 3489 1948 +10 0 1715 3490 2340 +11 3478 1409 3487 3491 +7 2840 991 3104 0 +8 988 0 3493 0 +9 922 0 3494 0 +10 623 756 3495 0 +7 2954 0 2445 0 +8 3457 0 3497 0 +9 3498 0 2542 0 +6 2630 2415 2632 2417 +7 0 0 3500 2788 +8 0 0 3501 3464 +9 0 0 2696 3502 +10 3499 0 1572 3503 +7 0 1720 3354 2348 +8 0 0 3505 3444 +9 0 0 3506 1948 +10 0 1715 3507 2340 +11 3496 1409 3504 3508 +12 3448 3472 3492 3509 +7 995 991 2487 0 +8 3474 0 3511 0 +9 922 0 3512 0 +10 623 756 3513 0 +7 2487 0 3429 0 +7 2373 0 2578 0 +8 3515 0 3516 0 +9 3517 0 2588 0 +6 2504 2630 2562 2632 +7 0 0 2795 3519 +6 2544 2630 2546 2632 +7 0 0 3521 2560 +8 0 0 3520 3522 +9 0 0 2592 3523 +10 3518 0 2401 3524 +7 0 1720 3500 2947 +8 0 0 3526 2433 +9 0 0 3527 1948 +10 0 1715 3528 2340 +11 3514 1409 3525 3529 +7 3110 991 2386 0 +8 3424 0 3531 0 +9 922 0 3532 0 +10 623 756 3533 0 +6 0 0 2385 0 +7 2655 0 3535 0 +7 2712 0 2375 0 +8 3536 0 3537 0 +9 3538 0 2628 0 +7 0 0 3209 2787 +6 2419 2630 2420 2632 +7 0 0 3541 0 +8 0 0 3540 3542 +9 0 0 2635 3543 +10 3539 0 2401 3544 +7 0 1720 2825 0 +6 2419 1751 2420 0 +7 1737 1747 3547 1789 +8 0 0 3546 3548 +9 0 0 3549 1948 +10 0 1715 3550 2340 +11 3534 1409 3545 3551 +7 2356 991 2356 0 +8 3103 0 3553 0 +9 922 0 3554 0 +10 623 756 3555 0 +6 2483 0 2492 0 +6 2492 0 2385 0 +7 3557 0 3558 0 +8 3515 0 3559 0 +9 3560 0 3061 0 +7 0 0 3209 2881 +8 0 0 3562 3522 +9 0 0 2508 3563 +10 3561 0 1572 3564 +7 0 1720 2636 3302 +8 0 0 3566 3148 +9 0 0 3567 1948 +10 0 1715 3568 2340 +11 3556 1409 3565 3569 +7 2448 991 3032 0 +8 3450 0 3571 0 +9 922 0 3572 0 +10 623 756 3573 0 +6 2492 0 2374 0 +7 2960 0 3575 0 +8 3536 0 3576 0 +9 3577 0 2542 0 +7 0 0 2795 2788 +8 0 0 3579 3542 +9 0 0 2696 3580 +10 3578 0 2401 3581 +7 0 1720 2469 2348 +8 0 0 3583 3148 +9 0 0 3584 1948 +10 0 1715 3585 2340 +11 3574 1409 3582 3586 +12 3530 3552 3570 3587 +6 2374 977 2444 0 +7 964 973 3589 987 +6 2498 0 2617 0 +7 2840 991 3591 0 +8 3590 0 3592 0 +9 922 0 3593 0 +10 623 756 3594 0 +6 0 0 2617 0 +7 3596 0 2712 0 +7 3105 0 3480 0 +8 3597 0 3598 0 +9 3599 0 3061 0 +6 2410 2504 2411 2562 +7 0 0 3137 3601 +7 0 0 2555 2594 +8 0 0 3602 3603 +9 0 0 2508 3604 +10 3600 0 2401 3605 +6 2403 1722 2405 1724 +7 0 1720 3186 3607 +6 2403 3356 2405 2417 +7 1737 1747 3609 1789 +8 0 0 3608 3610 +9 0 0 3611 1948 +10 0 1715 3612 2340 +11 3595 1409 3606 3613 +6 2355 977 2483 0 +7 964 973 3615 987 +6 2369 0 2370 0 +6 2498 0 2370 0 +7 3617 991 3618 0 +8 3616 0 3619 0 +9 922 0 3620 0 +10 623 756 3621 0 +6 2369 0 2374 0 +7 2655 0 3623 0 +8 3624 0 3497 0 +9 3625 0 2542 0 +7 0 0 3500 3116 +6 2402 2402 2429 2429 +7 0 0 2796 3628 +8 0 0 3627 3629 +9 0 0 2696 3630 +10 3626 0 1572 3631 +7 0 1720 3207 3012 +6 2415 3015 2417 2466 +7 1737 1747 3634 1789 +8 0 0 3633 3635 +9 0 0 3636 1948 +10 0 1715 3637 2340 +11 3622 1409 3632 3638 +6 2369 977 2444 0 +7 964 973 3640 987 +7 3056 991 3391 0 +8 3641 0 3642 0 +9 922 0 3643 0 +10 623 756 3644 0 +6 2483 0 2444 0 +6 2385 0 2355 0 +7 3646 0 3647 0 +7 3431 0 2840 0 +8 3648 0 3649 0 +6 2370 0 3399 1416 +7 3651 1421 1431 1437 +8 3652 0 0 0 +9 3650 0 3653 0 +6 2504 2410 2505 2411 +7 1576 0 1588 3655 +8 0 0 0 3656 +7 0 0 2593 3601 +7 0 0 3140 3628 +8 0 0 3658 3659 +9 0 0 3657 3660 +10 3654 0 2401 3661 +6 2402 2426 2429 2427 +7 0 1720 3663 3607 +8 0 0 3664 3610 +9 0 0 3665 1948 +10 0 1715 3666 2340 +11 3645 1409 3662 3667 +6 2498 0 2385 0 +7 3087 991 3669 0 +8 2485 0 3670 0 +9 922 0 3671 0 +10 623 756 3672 0 +6 2370 0 2444 0 +6 2617 0 2617 0 +7 3674 0 3675 0 +7 2954 0 2618 0 +8 3676 0 3677 0 +6 2385 0 3399 1416 +7 3679 1421 1431 1437 +8 3680 0 0 0 +9 3678 0 3681 0 +6 2402 2410 2404 2411 +7 1576 0 1588 3683 +8 0 0 0 3684 +7 0 0 2421 2788 +6 2464 2630 2466 2632 +7 0 0 3463 3687 +8 0 0 3686 3688 +9 0 0 3685 3689 +10 3682 0 1572 3690 +7 0 1720 3354 2697 +5 0 1750 2414 2414 +6 2415 3693 2417 2467 +7 1737 1747 3694 1789 +8 0 0 3692 3695 +9 0 0 3696 1948 +10 0 1715 3697 2340 +11 3673 1409 3691 3698 +12 3614 3639 3668 3699 +7 3087 991 2612 0 +8 2711 0 3701 0 +9 922 0 3702 0 +10 623 756 3703 0 +6 2370 0 2498 0 +6 2385 0 2370 0 +7 3705 0 3706 0 +6 2483 0 2494 0 +6 2447 0 2385 0 +7 3708 0 3709 0 +8 3707 0 3710 0 +9 3711 0 3061 0 +7 0 0 3209 3441 +6 0 2550 0 2551 +7 0 0 3714 2560 +8 0 0 3713 3715 +9 0 0 2508 3716 +10 3712 0 1572 3717 +6 2630 2464 2632 2466 +6 2464 2410 2466 2411 +7 0 1720 3719 3720 +6 2410 2476 2411 2429 +7 1737 1747 3722 1789 +8 0 0 3721 3723 +9 0 0 3724 1948 +10 0 1715 3725 2340 +11 3704 1409 3718 3726 +6 2374 977 2447 0 +7 964 973 3728 987 +6 2492 0 0 0 +6 2384 0 2494 0 +7 3730 991 3731 0 +8 3729 0 3732 0 +9 922 0 3733 0 +10 623 756 3734 0 +6 0 0 2494 0 +7 3705 0 3736 0 +7 2740 0 3575 0 +8 3737 0 3738 0 +9 3739 0 2542 0 +6 2415 2630 2417 2632 +7 0 0 2795 3741 +7 0 0 3007 2600 +8 0 0 3742 3743 +9 0 0 2696 3744 +10 3740 0 2401 3745 +7 0 1720 2469 3181 +6 2426 2602 2427 2405 +7 1737 1747 3748 1789 +8 0 0 3747 3749 +9 0 0 3750 1948 +10 0 1715 3751 2340 +11 3735 1409 3746 3752 +7 3617 991 3286 0 +8 3248 0 3754 0 +9 922 0 3755 0 +10 623 756 3756 0 +7 2802 0 3647 0 +7 3708 0 2356 0 +8 3758 0 3759 0 +6 2498 0 2585 1416 +7 3761 1421 1431 1437 +8 3762 0 0 0 +9 3760 0 3763 0 +7 0 0 2947 3037 +6 2544 2782 2546 2783 +6 2410 2402 2411 2429 +7 0 0 3766 3767 +8 0 0 3765 3768 +9 0 0 2901 3769 +10 3764 0 1572 3770 +7 0 1720 3719 3162 +6 2410 2602 2411 2405 +7 1737 1747 3773 1789 +8 0 0 3772 3774 +9 0 0 3775 1948 +10 0 1715 3776 2340 +11 3757 1409 3771 3777 +6 2617 0 2385 0 +7 2685 991 3779 0 +8 2739 0 3780 0 +9 922 0 3781 0 +10 623 756 3782 0 +6 2370 0 2494 0 +7 3784 0 2747 0 +7 2769 0 3730 0 +8 3785 0 3786 0 +5 1411 2354 0 2538 +6 2370 0 3788 1416 +7 3789 1421 1431 1437 +8 3790 0 0 0 +9 3787 0 3791 0 +6 2402 2419 2404 2420 +7 1576 0 1588 3793 +8 0 0 0 3794 +7 0 0 1725 3741 +6 2419 2782 2420 2783 +7 0 0 3797 2881 +8 0 0 3796 3798 +9 0 0 3795 3799 +10 3792 0 2401 3800 +6 2426 2345 2427 2347 +7 0 1720 3802 3181 +8 0 0 3803 3749 +9 0 0 3804 1948 +10 0 1715 3805 2340 +11 3783 1409 3801 3806 +12 3727 3753 3778 3807 +13 3510 3588 3700 3808 +14 2967 2991 3422 3809 +15 0 0 2941 3810 +7 0 991 2655 0 +8 988 0 3812 0 +9 922 0 3813 0 +10 623 756 3814 0 +11 3815 1409 1595 2364 +7 0 991 2373 0 +8 988 0 3817 0 +9 922 0 3818 0 +10 623 756 3819 0 +11 3820 1409 1595 2988 +12 0 0 3816 3821 +7 0 1720 2600 0 +8 0 0 3823 1790 +9 0 0 3824 1948 +10 0 1715 3825 2340 +11 3820 1409 1595 3826 +7 0 991 3081 0 +8 988 0 3828 0 +9 922 0 3829 0 +10 623 756 3830 0 +11 3831 1409 1595 2364 +12 0 0 3827 3832 +13 0 0 3822 3833 +7 0 991 2486 0 +8 988 0 3835 0 +9 922 0 3836 0 +10 623 756 3837 0 +11 3838 1409 1595 3826 +7 0 1720 2430 0 +8 0 0 3840 1790 +9 0 0 3841 1948 +10 0 1715 3842 2340 +11 3838 1409 1595 3843 +12 0 0 3839 3844 +7 0 991 2380 0 +8 988 0 3846 0 +9 922 0 3847 0 +10 623 756 3848 0 +11 3849 1409 1595 3843 +12 0 0 3844 3850 +13 0 0 3845 3851 +6 0 977 2384 0 +7 964 973 3853 987 +7 2960 991 2835 0 +8 3854 0 3855 0 +9 922 0 3856 0 +10 623 756 3857 0 +6 2370 0 2447 0 +7 3050 0 3859 0 +7 2960 0 2579 0 +8 3860 0 3861 0 +9 3862 0 2393 0 +6 2544 0 2546 0 +7 0 0 0 3864 +6 2544 2464 2546 2466 +7 0 0 3866 2560 +8 0 0 3865 3867 +9 0 0 2408 3868 +10 3863 0 1572 3869 +7 0 1720 2593 2348 +8 0 0 3871 3148 +9 0 0 3872 1948 +10 0 1715 3873 2340 +11 3858 1409 3870 3874 +6 0 977 2355 0 +7 964 973 3876 987 +7 2578 991 2864 0 +8 3877 0 3878 0 +9 922 0 3879 0 +10 623 756 3880 0 +6 0 0 2444 0 +7 2373 0 3882 0 +7 2486 0 3432 0 +8 3883 0 3884 0 +9 3885 0 2455 0 +6 1722 2345 1724 2347 +7 0 0 3887 2826 +7 0 0 2510 3036 +8 0 0 3888 3889 +9 0 0 2460 3890 +10 3886 0 1572 3891 +7 0 1720 2594 2517 +8 0 0 3893 1790 +9 0 0 3894 1948 +10 0 1715 3895 2340 +11 3881 1409 3892 3896 +7 2448 991 2578 0 +8 3424 0 3898 0 +9 922 0 3899 0 +10 623 756 3900 0 +7 2973 0 2579 0 +8 3860 0 3902 0 +9 3903 0 3061 0 +6 2426 2403 2427 2405 +7 0 0 3905 2510 +8 0 0 3906 3867 +9 0 0 2508 3907 +10 3904 0 2401 3908 +7 0 1720 3209 2947 +8 0 0 3910 3548 +9 0 0 3911 1948 +10 0 1715 3912 2340 +11 3901 1409 3909 3913 +6 0 977 994 0 +7 964 973 3915 987 +7 2954 991 2954 0 +8 3916 0 3917 0 +9 922 0 3918 0 +10 623 756 3919 0 +6 2492 0 2381 0 +7 3859 0 3921 0 +8 3883 0 3922 0 +9 3923 0 2542 0 +6 1722 2464 1724 2466 +7 0 0 2428 3925 +8 0 0 3926 3889 +9 0 0 2696 3927 +10 3924 0 1572 3928 +7 0 1720 2593 2725 +8 0 0 3930 2433 +9 0 0 3931 1948 +10 0 1715 3932 2340 +11 3920 1409 3929 3933 +12 3875 3897 3914 3934 +7 2578 991 3228 0 +8 988 0 3936 0 +9 922 0 3937 0 +10 623 756 3938 0 +6 2374 0 2355 0 +7 3940 0 3081 0 +7 2863 0 2994 0 +8 3941 0 3942 0 +9 3943 0 2588 0 +7 0 0 2428 3441 +7 0 0 3461 1725 +8 0 0 3945 3946 +9 0 0 2592 3947 +10 3944 0 1572 3948 +7 0 1720 3012 2517 +6 2403 1751 2405 0 +7 1737 1747 3951 1789 +8 0 0 3950 3952 +9 0 0 3953 1948 +10 0 1715 3954 2340 +11 3939 1409 3949 3955 +7 2487 991 3223 0 +8 3023 0 3957 0 +9 922 0 3958 0 +10 623 756 3959 0 +7 3112 0 3882 0 +7 2387 0 2835 0 +8 3961 0 3962 0 +9 3963 0 2628 0 +7 0 0 0 2552 +7 0 0 2723 3036 +8 0 0 3965 3966 +9 0 0 2635 3967 +10 3964 0 1572 3968 +7 0 1720 0 2947 +8 0 0 3970 2433 +9 0 0 3971 1948 +10 0 1715 3972 2340 +11 3960 1409 3969 3973 +7 2954 991 2960 0 +8 3854 0 3975 0 +9 922 0 3976 0 +10 623 756 3977 0 +7 2387 0 3921 0 +8 3941 0 3979 0 +9 3980 0 3061 0 +7 0 0 3887 2510 +8 0 0 3982 3946 +9 0 0 2508 3983 +10 3981 0 1572 3984 +6 0 2630 0 2632 +7 0 1720 2947 3986 +8 0 0 3987 2433 +9 0 0 3988 1948 +10 0 1715 3989 2340 +11 3978 1409 3985 3990 +6 2483 0 2374 0 +7 3992 991 2960 0 +8 2571 0 3993 0 +9 922 0 3994 0 +10 623 756 3995 0 +7 3050 0 2835 0 +8 3961 0 3997 0 +6 2483 0 2539 1416 +7 3999 1421 1431 1437 +8 4000 0 0 0 +9 3998 0 4001 0 +6 2345 2782 2347 2783 +7 0 0 4003 2510 +8 0 0 4004 3966 +9 0 0 2696 4005 +10 4002 0 2401 4006 +7 0 1720 2517 2517 +8 0 0 4008 2433 +9 0 0 4009 1948 +10 0 1715 4010 2340 +11 3996 1409 4007 4011 +12 3956 3974 3991 4012 +6 2385 977 2370 0 +7 964 973 4014 987 +6 2617 0 2374 0 +7 3730 991 4016 0 +8 4015 0 4017 0 +9 922 0 4018 0 +10 623 756 4019 0 +7 3940 0 3431 0 +7 2973 0 2999 0 +8 4021 0 4022 0 +9 4023 0 3061 0 +6 2426 2544 2427 2546 +7 0 0 4025 3461 +7 0 0 3271 2881 +8 0 0 4026 4027 +9 0 0 2508 4028 +10 4024 0 2401 4029 +7 0 1720 3347 3145 +6 2544 2519 2546 2347 +7 1737 1747 4032 1789 +8 0 0 4031 4033 +9 0 0 4034 1948 +10 0 1715 4035 2340 +11 4020 1409 4030 4036 +6 2355 977 2498 0 +7 964 973 4038 987 +7 3480 991 3105 0 +8 4039 0 4040 0 +9 922 0 4041 0 +10 623 756 4042 0 +7 3596 0 2842 0 +6 2444 0 2381 0 +7 3647 0 4045 0 +8 4044 0 4046 0 +9 4047 0 2542 0 +6 2426 2464 2427 2466 +7 0 0 2517 4049 +7 0 0 3463 3036 +8 0 0 4050 4051 +9 0 0 2696 4052 +10 4048 0 1572 4053 +7 0 1720 2825 2725 +5 0 1750 2344 1721 +6 2504 4056 2562 2427 +7 1737 1747 4057 1789 +8 0 0 4055 4058 +9 0 0 4059 1948 +10 0 1715 4060 2340 +11 4043 1409 4054 4061 +7 3480 991 3029 0 +8 2372 0 4063 0 +9 922 0 4064 0 +10 623 756 4065 0 +6 2494 0 2447 0 +7 2774 0 4067 0 +7 2973 0 3110 0 +8 4068 0 4069 0 +6 994 0 3788 1416 +7 4071 1421 1431 1437 +8 4072 0 0 0 +9 4070 0 4073 0 +6 2464 2504 2631 2562 +7 1576 0 1588 4075 +8 0 0 0 4076 +7 0 0 3349 2510 +6 2544 2426 2546 2427 +7 0 0 4079 2560 +8 0 0 4078 4080 +9 0 0 4077 4081 +10 4074 0 2401 4082 +6 2630 2410 2632 2411 +7 0 1720 3720 4084 +6 2544 3693 2546 2467 +7 1737 1747 4086 1789 +8 0 0 4085 4087 +9 0 0 4088 1948 +10 0 1715 4089 2340 +11 4066 1409 4083 4090 +6 2498 977 2498 0 +7 964 973 4092 987 +6 2444 0 994 0 +7 3730 991 4094 0 +8 4093 0 4095 0 +9 922 0 4096 0 +10 623 756 4097 0 +6 2374 0 2444 0 +7 2655 0 4099 0 +7 3429 0 2445 0 +8 4100 0 4101 0 +6 2384 0 2452 1416 +7 4103 1421 1431 1437 +8 4104 0 0 0 +9 4102 0 4105 0 +7 0 0 2517 2826 +6 2465 2415 2467 2417 +7 0 0 4108 2753 +8 0 0 4107 4109 +9 0 0 3295 4110 +10 4106 0 1572 4111 +7 0 1720 2825 3318 +6 2504 3693 2562 2467 +7 1737 1747 4114 1789 +8 0 0 4113 4115 +9 0 0 4116 1948 +10 0 1715 4117 2340 +11 4098 1409 4112 4118 +12 4037 4062 4091 4119 +7 3730 991 3429 0 +8 2485 0 4121 0 +9 922 0 4122 0 +10 623 756 4123 0 +6 2374 0 2617 0 +7 4125 0 3940 0 +6 2447 0 2381 0 +7 2387 0 4127 0 +8 4126 0 4128 0 +9 4129 0 3061 0 +7 0 0 3887 3866 +7 0 0 3140 3186 +8 0 0 4131 4132 +9 0 0 2508 4133 +10 4130 0 1572 4134 +6 2464 2782 2466 2783 +7 0 1720 3302 4136 +6 2345 3326 2347 2783 +7 1737 1747 4138 1789 +8 0 0 4137 4139 +9 0 0 4140 1948 +10 0 1715 4141 2340 +11 4124 1409 4135 4142 +6 2374 977 2617 0 +7 964 973 4144 987 +6 2498 0 994 0 +7 3575 991 4146 0 +8 4145 0 4147 0 +9 922 0 4148 0 +10 623 756 4149 0 +6 994 0 2483 0 +7 4151 0 2973 0 +6 2617 0 2381 0 +7 2373 0 4153 0 +8 4152 0 4154 0 +9 4155 0 4001 0 +6 2345 2465 2347 2467 +7 0 0 4157 4079 +6 2419 2419 2420 2420 +7 0 0 4159 2474 +8 0 0 4158 4160 +9 0 0 2696 4161 +10 4156 0 2401 4162 +6 2464 2504 2466 2562 +7 0 1720 3441 4164 +5 0 1750 1721 2414 +6 2504 4166 2562 2546 +7 1737 1747 4167 1789 +8 0 0 4165 4168 +9 0 0 4169 1948 +10 0 1715 4170 2340 +11 4150 1409 4163 4171 +7 3480 991 4146 0 +8 3248 0 4173 0 +9 922 0 4174 0 +10 623 756 4175 0 +6 2374 0 2369 0 +7 4177 0 2686 0 +7 2747 0 3575 0 +8 4178 0 4179 0 +6 0 0 2499 1416 +7 4181 1421 1431 1437 +8 4182 0 0 0 +9 4180 0 4183 0 +6 2464 2403 2631 2405 +7 1576 0 1588 4185 +8 0 0 0 4186 +7 0 0 2348 3866 +6 2419 2415 2420 2417 +7 0 0 4189 2474 +8 0 0 4188 4190 +9 0 0 4187 4191 +10 4184 0 1572 4192 +7 0 1720 2412 4136 +6 2345 2731 2347 2551 +7 1737 1747 4195 1789 +8 0 0 4194 4196 +9 0 0 4197 1948 +10 0 1715 4198 2340 +11 4176 1409 4193 4199 +6 2494 977 2384 0 +7 964 973 4201 987 +6 2494 0 2355 0 +7 3575 991 4203 0 +8 4202 0 4204 0 +9 922 0 4205 0 +10 623 756 4206 0 +6 2617 0 2444 0 +7 2916 0 4208 0 +7 3050 0 2741 0 +8 4209 0 4210 0 +5 1411 993 0 2451 +6 2384 0 4212 1416 +7 4213 1421 1431 1437 +8 4214 0 0 0 +9 4211 0 4215 0 +6 1722 2402 2545 2429 +7 1576 0 1588 4217 +8 0 0 0 4218 +7 0 0 2555 2510 +6 2465 2419 2467 2420 +7 0 0 4221 3036 +8 0 0 4220 4222 +9 0 0 4219 4223 +10 4216 0 2401 4224 +7 0 1720 2428 4164 +8 0 0 4226 2884 +9 0 0 4227 1948 +10 0 1715 4228 2340 +11 4207 1409 4225 4229 +12 4143 4172 4200 4230 +13 3935 4013 4120 4231 +6 2374 977 2483 0 +7 964 973 4233 987 +7 2960 991 3341 0 +8 4234 0 4235 0 +9 922 0 4236 0 +10 623 756 4237 0 +6 0 0 2447 0 +7 2486 0 4239 0 +7 2572 0 2375 0 +8 4240 0 4241 0 +6 0 0 2390 1416 +7 4243 1421 1431 1437 +8 4244 0 0 0 +9 4242 0 4245 0 +6 2345 2402 2347 2429 +7 0 0 4247 2553 +6 2402 2419 2429 2420 +7 0 0 2462 4249 +8 0 0 4248 4250 +9 0 0 2408 4251 +10 4246 0 2401 4252 +7 0 1720 3037 2560 +8 0 0 4254 1790 +9 0 0 4255 1948 +10 0 1715 4256 2340 +11 4238 1409 4253 4257 +7 2960 991 3596 0 +8 2571 0 4259 0 +9 922 0 4260 0 +10 623 756 4261 0 +6 0 0 2483 0 +7 4151 0 4263 0 +7 3112 0 3432 0 +8 4264 0 4265 0 +9 4266 0 2455 0 +6 2345 2345 2457 2347 +7 1576 0 1588 4268 +8 0 0 0 4269 +6 2419 2345 2420 2347 +6 2426 0 2427 0 +7 0 0 4271 4272 +7 0 0 3864 2348 +8 0 0 4273 4274 +9 0 0 4270 4275 +10 4267 0 2401 4276 +7 0 1720 3628 2560 +6 2464 1751 2466 0 +7 1737 1747 4279 1789 +8 0 0 4278 4280 +9 0 0 4281 1948 +10 0 1715 4282 2340 +11 4262 1409 4277 4283 +7 2960 991 2973 0 +8 2571 0 4285 0 +9 922 0 4286 0 +10 623 756 4287 0 +7 4099 0 3921 0 +8 4240 0 4289 0 +9 4290 0 3061 0 +6 2504 2550 2505 2551 +7 1576 0 1588 4292 +8 0 0 0 4293 +7 0 0 4271 2461 +8 0 0 4295 4250 +9 0 0 4294 4296 +10 4291 0 2401 4297 +7 0 1720 0 3463 +6 2402 1751 2429 0 +7 1737 1747 4300 1789 +8 0 0 4299 4301 +9 0 0 4302 1948 +10 0 1715 4303 2340 +11 4288 1409 4298 4304 +7 2973 991 2487 0 +8 2680 0 4306 0 +9 922 0 4307 0 +10 623 756 4308 0 +6 2492 0 2369 0 +7 2864 0 4310 0 +8 4264 0 4311 0 +9 4312 0 4001 0 +6 2410 2403 2693 2405 +7 1576 0 1588 4314 +8 0 0 0 4315 +7 0 0 4247 2723 +8 0 0 4317 4274 +9 0 0 4316 4318 +10 4313 0 1572 4319 +7 0 1720 2517 3925 +8 0 0 4321 1790 +9 0 0 4322 1948 +10 0 1715 4323 2340 +11 4309 1409 4320 4324 +12 4258 4284 4305 4325 +7 3050 991 2712 0 +8 3424 0 4327 0 +9 922 0 4328 0 +10 623 756 4329 0 +7 3032 0 4239 0 +6 2444 0 2355 0 +7 2621 0 4332 0 +8 4331 0 4333 0 +9 4334 0 2588 0 +6 1722 0 2545 0 +7 1576 0 1588 4336 +8 0 0 0 4337 +7 0 0 0 3013 +7 0 0 2787 3354 +8 0 0 4339 4340 +9 0 0 4338 4341 +10 4335 0 2401 4342 +7 0 1720 2430 2517 +8 0 0 4344 4301 +9 0 0 4345 1948 +10 0 1715 4346 2340 +11 4330 1409 4343 4347 +6 2374 977 2370 0 +7 964 973 4349 987 +7 2654 991 2740 0 +8 4350 0 4351 0 +9 922 0 4352 0 +10 623 756 4353 0 +7 2380 0 4263 0 +7 3080 0 3249 0 +8 4355 0 4356 0 +6 0 0 2625 1416 +7 4358 1421 1431 1437 +8 4359 0 0 0 +9 4357 0 4360 0 +6 2403 2419 2405 2420 +7 0 0 3663 4362 +6 2464 2403 2466 2405 +7 0 0 2409 4364 +8 0 0 4363 4365 +9 0 0 2635 4366 +10 4361 0 2401 4367 +7 0 1720 2760 3037 +8 0 0 4369 1790 +9 0 0 4370 1948 +10 0 1715 4371 2340 +11 4354 1409 4368 4372 +7 3228 991 2487 0 +8 3023 0 4374 0 +9 922 0 4375 0 +10 623 756 4376 0 +7 3309 0 3431 0 +8 4331 0 4378 0 +6 2370 0 2539 1416 +7 4380 1421 1431 1437 +8 4381 0 0 0 +9 4379 0 4382 0 +6 2544 2415 2546 2417 +7 0 0 4384 2509 +8 0 0 4385 4340 +9 0 0 4294 4386 +10 4383 0 1572 4387 +7 0 1720 2560 3925 +8 0 0 4389 4301 +9 0 0 4390 1948 +10 0 1715 4391 2340 +11 4377 1409 4388 4392 +7 2487 991 2655 0 +8 4350 0 4394 0 +9 922 0 4395 0 +10 623 756 4396 0 +7 2660 0 4310 0 +8 4355 0 4398 0 +9 4399 0 4001 0 +6 2403 2402 2405 2429 +7 0 0 4401 4362 +8 0 0 4402 4365 +9 0 0 3406 4403 +10 4400 0 2401 4404 +7 0 1720 0 3461 +8 0 0 4406 4280 +9 0 0 4407 1948 +10 0 1715 4408 2340 +11 4397 1409 4405 4409 +12 4348 4373 4393 4410 +6 2385 977 2384 0 +7 964 973 4412 987 +7 3730 991 2579 0 +8 4413 0 4414 0 +9 922 0 4415 0 +10 623 756 4416 0 +6 0 0 2498 0 +7 4418 0 3254 0 +6 994 0 2444 0 +6 2498 0 2381 0 +7 4420 0 4421 0 +8 4419 0 4422 0 +9 4423 0 3061 0 +6 2419 0 2420 0 +7 0 0 2461 4425 +7 0 0 4079 4249 +8 0 0 4426 4427 +9 0 0 4294 4428 +10 4424 0 2401 4429 +6 1722 2782 1724 2783 +7 0 1720 2409 4431 +5 0 1750 0 2414 +6 2410 4433 2411 2420 +7 1737 1747 4434 1789 +8 0 0 4432 4435 +9 0 0 4436 1948 +10 0 1715 4437 2340 +11 4417 1409 4430 4438 +6 2384 977 2483 0 +7 964 973 4440 987 +7 3575 991 3882 0 +8 4441 0 4442 0 +9 922 0 4443 0 +10 623 756 4444 0 +6 994 0 2498 0 +7 4446 0 4151 0 +6 2483 0 2369 0 +7 2864 0 4448 0 +8 4447 0 4449 0 +9 4450 0 4001 0 +7 0 0 3521 2469 +8 0 0 4317 4452 +9 0 0 4316 4453 +10 4451 0 1572 4454 +6 1722 2504 1724 2562 +7 0 1720 2418 4456 +6 1722 4056 1724 2427 +7 1737 1747 4458 1789 +8 0 0 4457 4459 +9 0 0 4460 1948 +10 0 1715 4461 2340 +11 4445 1409 4455 4462 +6 2617 977 2617 0 +7 964 973 4464 987 +7 3730 991 3591 0 +8 4465 0 4466 0 +9 922 0 4467 0 +10 623 756 4468 0 +6 994 0 2447 0 +7 3081 0 4470 0 +7 4099 0 2999 0 +8 4471 0 4472 0 +5 1411 993 0 1413 +6 2370 0 4474 1416 +7 4475 1421 1431 1437 +8 4476 0 0 0 +9 4473 0 4477 0 +6 2504 2402 2505 2429 +7 1576 0 1588 4479 +8 0 0 0 4480 +7 0 0 2560 2553 +6 2415 2544 2417 2546 +6 2410 2419 2411 2420 +7 0 0 4483 4484 +8 0 0 4482 4485 +9 0 0 4481 4486 +10 4478 0 2401 4487 +6 2345 2419 2347 2420 +6 2426 2782 2427 2783 +7 0 1720 4489 4490 +6 2410 2731 2411 2551 +7 1737 1747 4492 1789 +8 0 0 4491 4493 +9 0 0 4494 1948 +10 0 1715 4495 2340 +11 4469 1409 4488 4496 +6 2370 977 2447 0 +7 964 973 4498 987 +6 2369 0 2617 0 +7 3575 991 4500 0 +8 4499 0 4501 0 +9 922 0 4502 0 +10 623 756 4503 0 +6 2384 0 2483 0 +7 4470 0 4505 0 +7 2864 0 3921 0 +8 4506 0 4507 0 +6 2370 0 2625 1416 +7 4509 1421 1431 1437 +8 4510 0 0 0 +9 4508 0 4511 0 +6 0 2402 1590 2429 +7 1576 0 1588 4513 +8 0 0 0 4514 +7 0 0 2947 2723 +6 2544 2544 2546 2546 +7 0 0 4517 3012 +8 0 0 4516 4518 +9 0 0 4515 4519 +10 4512 0 1572 4520 +7 0 1720 3663 4456 +6 1722 2731 1724 2551 +7 1737 1747 4523 1789 +8 0 0 4522 4524 +9 0 0 4525 1948 +10 0 1715 4526 2340 +11 4504 1409 4521 4527 +12 4439 4463 4497 4528 +6 994 977 2498 0 +7 964 973 4530 987 +6 2447 0 994 0 +7 4532 991 3456 0 +8 4531 0 4533 0 +9 922 0 4534 0 +10 623 756 4535 0 +7 3032 0 4177 0 +7 2486 0 4146 0 +8 4537 0 4538 0 +9 4539 0 4382 0 +6 2544 2550 2546 2551 +6 2465 2345 2467 2347 +7 0 0 4541 4542 +7 0 0 3297 3012 +8 0 0 4543 4544 +9 0 0 4294 4545 +10 4540 0 1572 4546 +7 0 1720 2825 4431 +6 2402 3043 2429 2632 +7 1737 1747 4549 1789 +8 0 0 4548 4550 +9 0 0 4551 1948 +10 0 1715 4552 2340 +11 4536 1409 4547 4553 +6 2381 977 2385 0 +7 964 973 4555 987 +6 2447 0 2374 0 +7 4557 991 2835 0 +8 4556 0 4558 0 +9 922 0 4559 0 +10 623 756 4560 0 +6 2385 0 2483 0 +7 2486 0 4562 0 +6 2384 0 2498 0 +7 4564 0 2893 0 +8 4563 0 4565 0 +9 4566 0 4001 0 +7 0 0 3004 2409 +7 0 0 4542 4364 +8 0 0 4568 4569 +9 0 0 3406 4570 +10 4567 0 2401 4571 +6 2419 2504 2420 2562 +7 0 1720 2636 4573 +6 2504 2476 2562 2429 +7 1737 1747 4575 1789 +8 0 0 4574 4576 +9 0 0 4577 1948 +10 0 1715 4578 2340 +11 4561 1409 4572 4579 +6 2384 977 2385 0 +7 964 973 4581 987 +6 2355 0 2617 0 +7 4532 991 4583 0 +8 4582 0 4584 0 +9 922 0 4585 0 +10 623 756 4586 0 +7 2717 0 3284 0 +7 3309 0 2620 0 +8 4588 0 4589 0 +5 1411 0 0 2624 +6 2370 0 4591 1416 +7 4592 1421 1431 1437 +8 4593 0 0 0 +9 4590 0 4594 0 +6 2345 2464 2457 2466 +7 1576 0 1588 4596 +8 0 0 0 4597 +6 1722 2550 1724 2551 +7 0 0 4599 2509 +6 2504 2403 2562 2405 +7 0 0 4601 3354 +8 0 0 4600 4602 +9 0 0 4598 4603 +10 4595 0 1572 4604 +7 0 1720 4484 4431 +6 2544 3043 2546 2632 +7 1737 1747 4607 1789 +8 0 0 4606 4608 +9 0 0 4609 1948 +10 0 1715 4610 2340 +11 4587 1409 4605 4611 +6 2370 977 2498 0 +7 964 973 4613 987 +6 2355 0 2494 0 +7 4557 991 4615 0 +8 4614 0 4616 0 +9 922 0 4617 0 +10 623 756 4618 0 +7 4263 0 4505 0 +7 2660 0 4153 0 +8 4620 0 4621 0 +5 1411 2354 0 2624 +6 2370 0 4623 1416 +7 4624 1421 1431 1437 +8 4625 0 0 0 +9 4622 0 4626 0 +6 2402 0 2404 0 +7 1576 0 1588 4628 +8 0 0 0 4629 +7 0 0 3036 4362 +6 2403 2550 2405 2551 +7 0 0 4632 4601 +8 0 0 4631 4633 +9 0 0 4630 4634 +10 4627 0 1572 4635 +7 0 1720 3145 4573 +6 2415 3043 2417 2632 +7 1737 1747 4638 1789 +8 0 0 4637 4639 +9 0 0 4640 1948 +10 0 1715 4641 2340 +11 4619 1409 4636 4642 +12 4554 4580 4612 4643 +13 4326 4411 4529 4644 +14 3834 3852 4232 4645 +7 0 991 0 0 +8 988 0 4647 0 +9 922 0 4648 0 +10 623 756 4649 0 +7 0 1720 2636 0 +8 0 0 4651 1790 +9 0 0 4652 1948 +10 0 1715 4653 2340 +11 4650 1409 1595 4654 +7 0 1720 2593 0 +8 0 0 4656 1790 +9 0 0 4657 1948 +10 0 1715 4658 2340 +11 3849 1409 1595 4659 +12 0 0 4655 4660 +7 2654 0 0 0 +8 4662 0 0 0 +9 4663 0 1439 0 +10 4664 0 1572 1594 +11 4650 1409 4665 4659 +7 0 0 0 1725 +8 0 0 0 4667 +9 0 0 1593 4668 +10 1440 0 1572 4669 +11 4650 1409 4670 4659 +12 0 0 4666 4671 +13 0 0 4661 4672 +10 4664 0 1572 4669 +11 4650 1409 4674 2364 +12 0 0 4675 0 +13 0 0 4676 0 +7 2487 991 2373 0 +8 3023 0 4678 0 +9 922 0 4679 0 +10 623 756 4680 0 +6 2374 0 2483 0 +7 3032 0 4682 0 +6 2617 0 2370 0 +7 4684 0 2842 0 +8 4683 0 4685 0 +9 4686 0 4245 0 +6 2402 2402 2404 2429 +7 1576 0 1588 4688 +8 0 0 0 4689 +7 0 0 4401 2600 +7 0 0 2787 2947 +8 0 0 4691 4692 +9 0 0 4690 4693 +10 4687 0 1572 4694 +7 0 1720 3719 3036 +8 0 0 4696 1790 +9 0 0 4697 1948 +10 0 1715 4698 2340 +11 4681 1409 4695 4699 +7 3112 991 3736 0 +8 988 0 4701 0 +9 922 0 4702 0 +10 623 756 4703 0 +7 2960 0 4682 0 +7 3087 0 3669 0 +8 4705 0 4706 0 +9 4707 0 2455 0 +6 2345 0 2457 0 +7 1576 0 1588 4709 +8 0 0 0 4710 +6 2464 2419 2466 2420 +7 0 0 3036 4712 +7 0 0 2430 3209 +8 0 0 4713 4714 +9 0 0 4711 4715 +10 4708 0 1572 4716 +7 0 1720 2593 2560 +8 0 0 4718 4280 +9 0 0 4719 1948 +10 0 1715 4720 2340 +11 4704 1409 4717 4721 +7 3050 991 2373 0 +8 4350 0 4723 0 +9 922 0 4724 0 +10 623 756 4725 0 +7 3310 0 3055 0 +8 4683 0 4727 0 +9 4728 0 4382 0 +6 2504 2630 2505 2632 +7 1576 0 1588 4730 +8 0 0 0 4731 +6 2403 2464 2405 2466 +7 0 0 4733 2552 +8 0 0 4734 4692 +9 0 0 4732 4735 +10 4729 0 2401 4736 +7 0 1720 2560 3461 +8 0 0 4738 1790 +9 0 0 4739 1948 +10 0 1715 4740 2340 +11 4726 1409 4737 4741 +6 994 977 0 0 +7 964 973 4743 987 +7 4125 991 2373 0 +8 4744 0 4745 0 +9 922 0 4746 0 +10 623 756 4747 0 +7 3617 0 2712 0 +8 4705 0 4749 0 +9 4750 0 4382 0 +6 2465 2544 2467 2546 +6 2550 2419 2551 2420 +7 0 0 4752 4753 +8 0 0 4754 4714 +9 0 0 3406 4755 +10 4751 0 1572 4756 +7 0 1720 2600 4425 +5 0 1750 0 1721 +6 2464 4759 2466 1724 +7 1737 1747 4760 1789 +8 0 0 4758 4761 +9 0 0 4762 1948 +10 0 1715 4763 2340 +11 4748 1409 4757 4764 +12 4700 4722 4742 4765 +7 3080 991 2487 0 +8 4744 0 4767 0 +9 922 0 4768 0 +10 623 756 4769 0 +7 3432 0 4682 0 +7 2840 0 3391 0 +8 4771 0 4772 0 +6 2370 0 2585 1416 +7 4774 1421 1431 1437 +8 4775 0 0 0 +9 4773 0 4776 0 +7 0 0 3802 2755 +7 0 0 3070 2947 +8 0 0 4778 4779 +9 0 0 4338 4780 +10 4777 0 1572 4781 +7 0 1720 2787 2760 +6 0 4759 0 1724 +7 1737 1747 4784 1789 +8 0 0 4783 4785 +9 0 0 4786 1948 +10 0 1715 4787 2340 +11 4770 1409 4782 4788 +7 3050 991 2486 0 +8 4744 0 4790 0 +9 922 0 4791 0 +10 623 756 4792 0 +7 2960 0 2572 0 +7 2895 0 2719 0 +8 4794 0 4795 0 +9 4796 0 4360 0 +6 2464 2464 2631 2466 +7 1576 0 1588 4798 +8 0 0 0 4799 +7 0 0 3719 3186 +7 0 0 3186 2428 +8 0 0 4801 4802 +9 0 0 4800 4803 +10 4797 0 1572 4804 +7 0 1720 4272 3354 +8 0 0 4806 4785 +9 0 0 4807 1948 +10 0 1715 4808 2340 +11 4793 1409 4805 4809 +7 3050 991 3081 0 +8 4744 0 4811 0 +9 922 0 4812 0 +10 623 756 4813 0 +7 3087 0 3055 0 +8 4705 0 4815 0 +9 4816 0 4382 0 +6 2504 2464 2505 2466 +7 1576 0 1588 4818 +8 0 0 0 4819 +6 2550 2464 2551 2466 +7 0 0 4821 2755 +8 0 0 4822 4779 +9 0 0 4820 4823 +10 4817 0 1572 4824 +7 0 1720 0 3385 +8 0 0 4826 4785 +9 0 0 4827 1948 +10 0 1715 4828 2340 +11 4814 1409 4825 4829 +7 3309 991 2486 0 +8 3424 0 4831 0 +9 922 0 4832 0 +10 623 756 4833 0 +6 2494 0 2370 0 +7 4835 0 4310 0 +8 4794 0 4836 0 +9 4837 0 2813 0 +6 2410 0 2693 0 +7 1576 0 1588 4839 +8 0 0 0 4840 +6 2782 0 2783 0 +7 0 0 4842 3013 +7 0 0 3186 2517 +8 0 0 4843 4844 +9 0 0 4841 4845 +10 4838 0 2401 4846 +7 0 1720 2600 3864 +6 0 4433 0 2420 +7 1737 1747 4849 1789 +8 0 0 4848 4850 +9 0 0 4851 1948 +10 0 1715 4852 2340 +11 4834 1409 4847 4853 +12 4789 4810 4830 4854 +7 2493 991 2864 0 +8 4015 0 4856 0 +9 922 0 4857 0 +10 623 756 4858 0 +6 2617 0 2483 0 +7 3310 0 4860 0 +7 3310 0 2774 0 +8 4861 0 4862 0 +9 4863 0 4382 0 +7 0 0 3271 2947 +8 0 0 4734 4865 +9 0 0 4732 4866 +10 4864 0 2401 4867 +7 0 1720 3767 3541 +6 2419 2519 2420 2347 +7 1737 1747 4870 1789 +8 0 0 4869 4871 +9 0 0 4872 1948 +10 0 1715 4873 2340 +11 4859 1409 4868 4874 +6 994 977 2384 0 +7 964 973 4876 987 +6 2444 0 2617 0 +7 4878 991 3705 0 +8 4877 0 4879 0 +9 922 0 4880 0 +10 623 756 4881 0 +6 2374 0 2447 0 +7 2960 0 4883 0 +7 2380 0 3456 0 +8 4884 0 4885 0 +9 4886 0 4382 0 +6 2550 2402 2551 2429 +7 0 0 3091 4888 +6 2402 2782 2429 2783 +7 0 0 4890 3145 +8 0 0 4889 4891 +9 0 0 3406 4892 +10 4887 0 1572 4893 +7 0 1720 3012 4573 +6 2426 3356 2427 2417 +7 1737 1747 4896 1789 +8 0 0 4895 4897 +9 0 0 4898 1948 +10 0 1715 4899 2340 +11 4882 1409 4894 4900 +6 0 977 2444 0 +7 964 973 4902 987 +7 2493 991 4532 0 +8 4903 0 4904 0 +9 922 0 4905 0 +10 623 756 4906 0 +7 4505 0 4562 0 +7 3310 0 3921 0 +8 4908 0 4909 0 +6 0 0 3788 1416 +7 4911 1421 1431 1437 +8 4912 0 0 0 +9 4910 0 4913 0 +6 0 2464 1590 2466 +7 1576 0 1588 4915 +8 0 0 0 4916 +7 0 0 3037 2552 +7 0 0 3408 3628 +8 0 0 4918 4919 +9 0 0 4917 4920 +10 4914 0 1572 4921 +7 0 1720 3138 3541 +6 2419 3043 2420 2632 +7 1737 1747 4924 1789 +8 0 0 4923 4925 +9 0 0 4926 1948 +10 0 1715 4927 2340 +11 4907 1409 4922 4928 +6 2498 977 2355 0 +7 964 973 4930 987 +6 2447 0 2498 0 +7 4878 991 4932 0 +8 4931 0 4933 0 +9 922 0 4934 0 +10 623 756 4935 0 +7 2869 0 4208 0 +7 3617 0 3335 0 +8 4937 0 4938 0 +6 0 0 2452 1416 +7 4940 1421 1431 1437 +8 4941 0 0 0 +9 4939 0 4942 0 +7 0 0 3797 4753 +6 2402 2630 2429 2632 +7 0 0 4945 3209 +8 0 0 4944 4946 +9 0 0 4841 4947 +10 4943 0 1572 4948 +7 0 1720 3347 4573 +6 2415 4056 2417 2427 +7 1737 1747 4951 1789 +8 0 0 4950 4952 +9 0 0 4953 1948 +10 0 1715 4954 2340 +11 4936 1409 4949 4955 +12 4875 4901 4929 4956 +6 2355 977 2355 0 +7 964 973 4958 987 +7 4094 991 3223 0 +8 4959 0 4960 0 +9 922 0 4961 0 +10 623 756 4962 0 +7 2740 0 4420 0 +6 2385 0 2384 0 +6 2494 0 2498 0 +7 4965 0 4966 0 +8 4964 0 4967 0 +9 4968 0 4382 0 +7 0 0 4888 3013 +6 2504 2410 2562 2411 +7 0 0 4971 3302 +8 0 0 4970 4972 +9 0 0 4820 4973 +10 4969 0 1572 4974 +7 0 1720 2593 3766 +6 0 4056 0 2427 +7 1737 1747 4977 1789 +8 0 0 4976 4978 +9 0 0 4979 1948 +10 0 1715 4980 2340 +11 4963 1409 4975 4981 +6 2492 0 2617 0 +7 4983 991 3341 0 +8 3474 0 4984 0 +9 922 0 4985 0 +10 623 756 4986 0 +7 3618 0 2740 0 +7 4835 0 2535 0 +8 4988 0 4989 0 +9 4990 0 2813 0 +6 2544 2419 2546 2420 +7 0 0 4992 2517 +8 0 0 4843 4993 +9 0 0 4841 4994 +10 4991 0 2401 4995 +6 2504 2464 2562 2466 +7 0 1720 4997 3866 +6 2403 4166 2405 2546 +7 1737 1747 4999 1789 +8 0 0 4998 5000 +9 0 0 5001 1948 +10 0 1715 5002 2340 +11 4987 1409 4996 5003 +6 994 977 2617 0 +7 964 973 5005 987 +8 5006 0 4960 0 +9 922 0 5007 0 +10 623 756 5008 0 +7 3706 0 4562 0 +6 2494 0 994 0 +7 3087 0 5011 0 +8 5010 0 5012 0 +9 5013 0 4183 0 +6 2464 0 2631 0 +7 1576 0 1588 5015 +8 0 0 0 5016 +7 0 0 3004 2755 +7 0 0 4490 3628 +8 0 0 5018 5019 +9 0 0 5017 5020 +10 5014 0 1572 5021 +7 0 1720 4164 3766 +6 2544 4056 2546 2427 +7 1737 1747 5024 1789 +8 0 0 5023 5025 +9 0 0 5026 1948 +10 0 1715 5027 2340 +11 5009 1409 5022 5028 +6 2483 0 2617 0 +7 4983 991 5030 0 +8 3729 0 5031 0 +9 922 0 5032 0 +10 623 756 5033 0 +7 2740 0 2747 0 +8 5035 0 4836 0 +6 0 0 4212 1416 +7 5037 1421 1431 1437 +8 5038 0 0 0 +9 5036 0 5039 0 +7 0 0 2760 3013 +6 2410 2782 2411 2783 +7 0 0 5042 2795 +8 0 0 5041 5043 +9 0 0 4338 5044 +10 5040 0 2401 5045 +7 0 1720 3347 3866 +6 2419 3356 2420 2417 +7 1737 1747 5048 1789 +8 0 0 5047 5049 +9 0 0 5050 1948 +10 0 1715 5051 2340 +11 5034 1409 5046 5052 +12 4982 5004 5029 5053 +13 4766 4855 4957 5054 +6 2381 977 0 0 +7 964 973 5056 987 +7 3032 991 3081 0 +8 5057 0 5058 0 +9 922 0 5059 0 +10 623 756 5060 0 +6 2385 0 2374 0 +7 5062 0 3104 0 +7 3480 0 4153 0 +8 5063 0 5064 0 +9 5065 0 2393 0 +7 0 0 3354 2640 +7 0 0 3070 1725 +8 0 0 5067 5068 +9 0 0 4630 5069 +10 5066 0 2401 5070 +7 0 1720 0 3036 +6 0 2519 0 2347 +7 1737 1747 5073 1789 +8 0 0 5072 5074 +9 0 0 5075 1948 +10 0 1715 5076 2340 +11 5061 1409 5071 5077 +7 4446 991 2486 0 +8 3424 0 5079 0 +9 922 0 5080 0 +10 623 756 5081 0 +7 2973 0 3104 0 +7 3730 0 2495 0 +8 5083 0 5084 0 +9 5085 0 3374 0 +6 2550 2465 2551 2467 +7 0 0 5087 2755 +7 0 0 3070 0 +8 0 0 5088 5089 +9 0 0 2901 5090 +10 5086 0 2401 5091 +7 0 1720 2430 3607 +8 0 0 5093 4850 +9 0 0 5094 1948 +10 0 1715 5095 2340 +11 5082 1409 5092 5096 +12 5078 0 5097 0 +6 2498 0 2498 0 +7 5099 991 3596 0 +8 4350 0 5100 0 +9 922 0 5101 0 +10 623 756 5102 0 +7 5062 0 4151 0 +6 2385 0 2498 0 +7 2654 0 5105 0 +8 5104 0 5106 0 +9 5107 0 3374 0 +7 0 0 4108 3719 +6 2426 2504 2427 2562 +7 0 0 5110 2469 +8 0 0 5109 5111 +9 0 0 2901 5112 +10 5108 0 2401 5113 +7 0 1720 3628 3766 +6 2419 4166 2420 2546 +7 1737 1747 5116 1789 +8 0 0 5115 5117 +9 0 0 5118 1948 +10 0 1715 5119 2340 +11 5103 1409 5114 5120 +7 5099 991 5030 0 +8 3590 0 5122 0 +9 922 0 5123 0 +10 623 756 5124 0 +6 2385 0 2385 0 +7 5126 0 4966 0 +6 2617 0 2498 0 +7 3730 0 5128 0 +8 5127 0 5129 0 +6 0 0 4474 1416 +7 5131 1421 1431 1437 +8 5132 0 0 0 +9 5130 0 5133 0 +6 2504 0 2505 0 +7 1576 0 1588 5135 +8 0 0 0 5136 +7 0 0 4384 2755 +6 2426 2426 2427 2427 +7 0 0 5139 1725 +8 0 0 5138 5140 +9 0 0 5137 5141 +10 5134 0 2401 5142 +7 0 1720 3441 3766 +6 2544 4433 2546 2420 +7 1737 1747 5145 1789 +8 0 0 5144 5146 +9 0 0 5147 1948 +10 0 1715 5148 2340 +11 5125 1409 5143 5149 +12 5121 0 5150 0 +13 5098 0 5151 0 +14 4673 4677 5055 5152 +15 0 0 4646 5153 +6 994 977 2385 0 +7 964 973 5155 987 +7 3705 991 2375 0 +8 5156 0 5157 0 +9 922 0 5158 0 +10 623 756 5159 0 +7 2774 0 3104 0 +7 3056 0 2373 0 +8 5161 0 5162 0 +9 5163 0 2780 0 +7 0 0 2787 3741 +7 0 0 4164 2790 +8 0 0 5165 5166 +9 0 0 2786 5167 +10 5164 0 1572 5168 +7 0 1720 2795 3463 +6 2419 2731 2420 2551 +7 1737 1747 5171 1789 +8 0 0 5170 5172 +9 0 0 5173 1948 +10 0 1715 5174 2340 +11 5160 1409 5169 5175 +6 2494 977 2355 0 +7 964 973 5177 987 +7 2973 991 2375 0 +8 5178 0 5179 0 +9 922 0 5180 0 +10 623 756 5181 0 +7 2573 0 3479 0 +7 4983 0 2611 0 +8 5183 0 5184 0 +9 5185 0 2813 0 +7 0 0 2600 2553 +7 0 0 3714 2820 +8 0 0 5187 5188 +9 0 0 2817 5189 +10 5186 0 2401 5190 +7 0 1720 2825 2933 +6 2426 2762 2427 2562 +7 1737 1747 5193 1789 +8 0 0 5192 5194 +9 0 0 5195 1948 +10 0 1715 5196 2340 +11 5182 1409 5191 5197 +7 2486 991 2375 0 +8 2711 0 5199 0 +9 922 0 5200 0 +10 623 756 5201 0 +7 4682 0 2382 0 +7 2578 0 3050 0 +8 5203 0 5204 0 +9 5205 0 2780 0 +7 0 0 2787 3233 +7 0 0 2418 3007 +8 0 0 5207 5208 +9 0 0 2786 5209 +10 5206 0 1572 5210 +7 0 1720 2795 3767 +8 0 0 5212 2733 +9 0 0 5213 1948 +10 0 1715 5214 2340 +11 5202 1409 5211 5215 +7 2740 991 2375 0 +8 2739 0 5217 0 +9 922 0 5218 0 +10 623 756 5219 0 +7 3177 0 2611 0 +8 2807 0 5221 0 +9 5222 0 2813 0 +7 0 0 2600 4272 +6 2630 2544 2632 2546 +7 0 0 2555 5225 +8 0 0 5224 5226 +9 0 0 2817 5227 +10 5223 0 2401 5228 +7 0 1720 2825 2760 +6 2782 2762 2783 2562 +7 1737 1747 5231 1789 +8 0 0 5230 5232 +9 0 0 5233 1948 +10 0 1715 5234 2340 +11 5220 1409 5229 5235 +12 5176 5198 5216 5236 +8 4465 0 2889 0 +9 922 0 5238 0 +10 623 756 5239 0 +7 2893 0 5062 0 +7 5011 0 2654 0 +8 5241 0 5242 0 +9 5243 0 2666 0 +6 2465 2403 2467 2405 +7 0 0 2409 5245 +6 2464 2550 2466 2551 +7 0 0 5247 2790 +8 0 0 5246 5248 +9 0 0 2901 5249 +10 5244 0 2401 5250 +7 0 1720 2348 2933 +6 2419 2762 2420 2562 +7 1737 1747 5253 1789 +8 0 0 5252 5254 +9 0 0 5255 1948 +10 0 1715 5256 2340 +11 5240 1409 5251 5257 +7 4125 991 2719 0 +8 3916 0 5259 0 +9 922 0 5260 0 +10 623 756 5261 0 +7 0 0 3186 4079 +7 0 0 2880 2928 +8 0 0 5263 5264 +9 0 0 2926 5265 +10 2923 0 1572 5266 +8 0 0 4738 2733 +9 0 0 5268 1948 +10 0 1715 5269 2340 +11 5262 1409 5267 5270 +6 2444 0 2494 0 +7 5272 0 2579 0 +7 4146 0 2654 0 +8 5273 0 5274 0 +9 5275 0 2666 0 +6 2544 2402 2546 2429 +7 0 0 3607 5277 +7 0 0 2468 2421 +8 0 0 5278 5279 +9 0 0 2901 5280 +10 5276 0 2401 5281 +7 0 1720 2348 2636 +8 0 0 5283 5254 +9 0 0 5284 1948 +10 0 1715 5285 2340 +11 5240 1409 5282 5286 +6 0 977 2498 0 +7 964 973 5288 987 +7 2572 991 2612 0 +8 5289 0 5290 0 +9 922 0 5291 0 +10 623 756 5292 0 +7 3618 0 2618 0 +7 3432 0 3309 0 +8 5294 0 5295 0 +9 5296 0 2922 0 +7 0 0 2430 3601 +6 2419 2544 2420 2546 +7 0 0 2639 5299 +8 0 0 5298 5300 +9 0 0 2926 5301 +10 5297 0 1572 5302 +7 0 1720 2560 4997 +6 2465 2731 2467 2551 +7 1737 1747 5305 1789 +8 0 0 5304 5306 +9 0 0 5307 1948 +10 0 1715 5308 2340 +11 5293 1409 5303 5309 +12 5258 5271 5287 5310 +6 2617 0 2447 0 +7 5312 0 2382 0 +7 2618 0 2495 0 +8 5313 0 5314 0 +9 5315 0 2502 0 +7 0 0 2723 3519 +7 0 0 2418 3266 +8 0 0 5317 5318 +9 0 0 2508 5319 +10 5316 0 1572 5320 +7 0 1720 2795 2826 +8 0 0 5322 2733 +9 0 0 5323 1948 +10 0 1715 5324 2340 +11 5202 1409 5321 5325 +7 3535 991 2375 0 +8 2739 0 5327 0 +9 922 0 5328 0 +10 623 756 5329 0 +7 3284 0 2387 0 +6 2444 0 2369 0 +7 5332 0 4177 0 +8 5331 0 5333 0 +9 5334 0 2542 0 +7 0 0 2873 2560 +6 2504 2544 2562 2546 +7 0 0 3070 5337 +8 0 0 5336 5338 +9 0 0 2549 5339 +10 5335 0 2401 5340 +8 0 0 5230 2764 +9 0 0 5342 1948 +10 0 1715 5343 2340 +11 5330 1409 5341 5344 +7 5312 0 3080 0 +7 3249 0 2495 0 +8 5346 0 5347 0 +9 5348 0 2502 0 +7 0 0 2509 3541 +7 0 0 2512 3266 +8 0 0 5350 5351 +9 0 0 2508 5352 +10 5349 0 1572 5353 +11 5202 1409 5354 5325 +7 3284 0 2445 0 +7 4878 0 2535 0 +8 5356 0 5357 0 +9 5358 0 2542 0 +7 0 0 2552 2461 +7 0 0 2555 5337 +8 0 0 5360 5361 +9 0 0 2549 5362 +10 5359 0 2401 5363 +11 5330 1409 5364 5344 +12 5326 5345 5355 5365 +7 3050 991 2573 0 +8 2834 0 5367 0 +9 922 0 5368 0 +10 623 756 5369 0 +6 2444 0 2447 0 +7 5371 0 2840 0 +7 2620 0 2660 0 +8 5372 0 5373 0 +9 5374 0 2666 0 +6 2544 2410 2546 2411 +7 0 0 2723 5376 +6 2402 2544 2429 2546 +7 0 0 2790 5378 +8 0 0 5377 5379 +9 0 0 2508 5380 +10 5375 0 2401 5381 +7 0 1720 2348 4842 +8 0 0 5383 2856 +9 0 0 5384 1948 +10 0 1715 5385 2340 +11 5370 1409 5382 5386 +8 2862 0 5290 0 +9 922 0 5388 0 +10 623 756 5389 0 +6 2498 0 2483 0 +7 5391 0 2618 0 +7 2895 0 2582 0 +8 5392 0 5393 0 +9 5394 0 2691 0 +7 0 0 2873 2826 +6 2504 2465 2562 2467 +7 0 0 2639 5397 +8 0 0 5396 5398 +9 0 0 2696 5399 +10 5395 0 1572 5400 +7 0 1720 2560 2462 +8 0 0 5402 2884 +9 0 0 5403 1948 +10 0 1715 5404 2340 +11 5390 1409 5401 5405 +7 5371 0 2579 0 +7 5011 0 4446 0 +8 5407 0 5408 0 +9 5409 0 2666 0 +7 0 0 2509 5277 +7 0 0 2555 5378 +8 0 0 5411 5412 +9 0 0 2508 5413 +10 5410 0 2401 5414 +11 5370 1409 5415 5386 +7 3391 0 2582 0 +8 5392 0 5417 0 +9 5418 0 2691 0 +7 0 0 2697 4079 +8 0 0 5420 5398 +9 0 0 2696 5421 +10 5419 0 1572 5422 +11 5390 1409 5423 5405 +12 5387 5406 5416 5424 +13 5237 5311 5366 5425 +7 2712 991 2741 0 +8 2653 0 5427 0 +9 922 0 5428 0 +10 623 756 5429 0 +7 4099 0 3080 0 +7 2741 0 2487 0 +8 5431 0 5432 0 +9 5433 0 2393 0 +6 2403 2410 2405 2411 +7 0 0 3607 5435 +7 0 0 2512 2639 +8 0 0 5436 5437 +9 0 0 2408 5438 +10 5434 0 2401 5439 +7 0 1720 2469 2636 +8 0 0 5441 3274 +9 0 0 5442 1948 +10 0 1715 5443 2340 +11 5430 1409 5440 5444 +6 2385 977 2483 0 +7 964 973 5446 987 +7 2740 991 2618 0 +8 5447 0 5448 0 +9 922 0 5449 0 +10 623 756 5450 0 +7 2573 0 2445 0 +7 3480 0 3104 0 +8 5452 0 5453 0 +9 5454 0 2455 0 +7 0 0 4425 4425 +8 0 0 5456 5226 +9 0 0 2460 5457 +10 5455 0 2401 5458 +7 0 1720 2594 2760 +8 0 0 5460 3242 +9 0 0 5461 1948 +10 0 1715 5462 2340 +11 5451 1409 5459 5463 +12 5445 5464 0 0 +6 2381 977 2447 0 +7 964 973 5466 987 +7 2654 991 3431 0 +8 5467 0 5468 0 +9 922 0 5469 0 +10 623 756 5470 0 +6 2444 0 2498 0 +7 5472 0 2579 0 +8 5473 0 2583 0 +9 5474 0 2588 0 +7 0 0 2555 2790 +8 0 0 2595 5476 +9 0 0 2592 5477 +10 5475 0 2401 5478 +7 0 1720 1725 2853 +8 0 0 5480 4550 +9 0 0 5481 1948 +10 0 1715 5482 2340 +11 5471 1409 5479 5483 +6 2494 977 2483 0 +7 964 973 5485 987 +7 2863 991 3228 0 +8 5486 0 5487 0 +9 922 0 5488 0 +10 623 756 5489 0 +7 5099 0 2618 0 +7 3228 0 2373 0 +8 5491 0 5492 0 +9 5493 0 2628 0 +7 0 0 3181 3500 +8 0 0 5495 2929 +9 0 0 2635 5496 +10 5494 0 2401 5497 +7 0 1720 3302 2881 +6 2504 3015 2562 2466 +7 1737 1747 5500 1789 +8 0 0 5499 5501 +9 0 0 5502 1948 +10 0 1715 5503 2340 +11 5490 1409 5498 5504 +12 5484 5505 0 0 +13 5465 5506 0 0 +14 0 5426 0 5507 +7 2373 991 2994 0 +8 3248 0 5509 0 +9 922 0 5510 0 +10 623 756 5511 0 +7 3254 0 2973 0 +6 2492 0 2498 0 +7 5514 0 2382 0 +8 5513 0 5515 0 +9 5516 0 3260 0 +6 2403 2504 2405 2562 +7 0 0 2430 5518 +7 0 0 4431 3266 +8 0 0 5519 5520 +9 0 0 3264 5521 +10 5517 0 1572 5522 +7 0 1720 4489 4079 +6 2419 3240 2420 2411 +7 1737 1747 5525 1789 +8 0 0 5524 5526 +9 0 0 5527 1948 +10 0 1715 5528 2340 +11 5512 1409 5523 5529 +7 3335 991 3254 0 +8 3222 0 5531 0 +9 922 0 5532 0 +10 623 756 5533 0 +7 3284 0 2655 0 +7 4583 0 995 0 +8 5535 0 5536 0 +9 5537 0 3291 0 +6 2550 2782 2551 2783 +7 0 0 3013 5539 +7 0 0 4431 3297 +8 0 0 5540 5541 +9 0 0 3295 5542 +10 5538 0 1572 5543 +7 0 1720 3302 3864 +8 0 0 5545 5526 +9 0 0 5546 1948 +10 0 1715 5547 2340 +11 5534 1409 5544 5548 +7 2654 991 3249 0 +8 3248 0 5550 0 +9 922 0 5551 0 +10 623 756 5552 0 +7 5371 0 3104 0 +8 3255 0 5554 0 +9 5555 0 3260 0 +7 0 0 3186 3037 +7 0 0 3007 2468 +8 0 0 5557 5558 +9 0 0 3264 5559 +10 5556 0 1572 5560 +7 0 1720 3012 2753 +8 0 0 5562 3242 +9 0 0 5563 1948 +10 0 1715 5564 2340 +11 5553 1409 5561 5565 +6 2498 0 2369 0 +7 5567 0 4153 0 +7 3456 0 995 0 +8 5568 0 5569 0 +9 5570 0 3291 0 +6 2550 2426 2551 2427 +7 0 0 3181 5572 +7 0 0 3007 2640 +8 0 0 5573 5574 +9 0 0 3295 5575 +10 5571 0 1572 5576 +7 0 1720 3302 2593 +8 0 0 5578 5526 +9 0 0 5579 1948 +10 0 1715 5580 2340 +11 5534 1409 5577 5581 +12 5530 5549 5566 5582 +6 2447 0 2384 0 +7 4446 991 5584 0 +8 4877 0 5585 0 +9 922 0 5586 0 +10 623 756 5587 0 +7 0 0 2469 3163 +7 0 0 3037 3380 +8 0 0 5589 5590 +9 0 0 3378 5591 +10 3375 0 1572 5592 +8 0 0 4848 5306 +9 0 0 5594 1948 +10 0 1715 5595 2340 +11 5588 1409 5593 5596 +7 2611 991 3391 0 +8 2739 0 5598 0 +9 922 0 5599 0 +10 623 756 5600 0 +7 2869 0 2655 0 +6 2447 0 2617 0 +7 5603 0 2840 0 +8 5602 0 5604 0 +9 5605 0 3402 0 +6 2782 2402 2783 2429 +7 0 0 2593 5607 +7 0 0 4573 3408 +8 0 0 5608 5609 +9 0 0 3406 5610 +10 5606 0 2401 5611 +7 0 1720 3628 4542 +6 2345 2762 2347 2562 +7 1737 1747 5614 1789 +8 0 0 5613 5615 +9 0 0 5616 1948 +10 0 1715 5617 2340 +11 5601 1409 5612 5618 +7 3080 991 3363 0 +8 3854 0 5620 0 +9 922 0 5621 0 +10 623 756 5622 0 +7 3992 0 2895 0 +7 995 0 3158 0 +8 5624 0 5625 0 +9 5626 0 3374 0 +7 0 0 2593 3741 +6 2403 2403 2405 2405 +7 0 0 3118 5629 +8 0 0 5628 5630 +9 0 0 3378 5631 +10 5627 0 1572 5632 +6 2410 1722 2411 1724 +7 0 1720 3036 5634 +6 2465 3693 2467 2467 +7 1737 1747 5636 1789 +8 0 0 5635 5637 +9 0 0 5638 1948 +10 0 1715 5639 2340 +11 5623 1409 5633 5640 +7 3080 991 3391 0 +8 3334 0 5642 0 +9 922 0 5643 0 +10 623 756 5644 0 +6 2498 0 2444 0 +7 5646 0 2618 0 +8 3396 0 5647 0 +9 5648 0 3402 0 +7 0 0 2469 2760 +6 2419 2465 2420 2467 +7 0 0 5651 4599 +8 0 0 5650 5652 +9 0 0 3406 5653 +10 5649 0 2401 5654 +7 0 1720 3145 4484 +6 2345 3356 2347 2417 +7 1737 1747 5657 1789 +8 0 0 5656 5658 +9 0 0 5659 1948 +10 0 1715 5660 2340 +11 5645 1409 5655 5661 +12 5597 5619 5641 5662 +7 3646 0 2621 0 +7 3284 0 4446 0 +8 5664 0 5665 0 +9 5666 0 3061 0 +7 0 0 2697 3324 +7 0 0 2421 5378 +8 0 0 5668 5669 +9 0 0 3065 5670 +10 5667 0 1572 5671 +8 0 0 3214 3274 +9 0 0 5673 1948 +10 0 1715 5674 2340 +11 3253 1409 5672 5675 +7 3309 991 3254 0 +8 3222 0 5677 0 +9 922 0 5678 0 +10 623 756 5679 0 +7 5646 0 2445 0 +7 3335 0 3086 0 +8 5681 0 5682 0 +9 5683 0 2542 0 +6 2550 2504 2551 2562 +7 0 0 2552 5685 +7 0 0 2928 5247 +8 0 0 5686 5687 +9 0 0 2696 5688 +10 5684 0 1572 5689 +7 0 1720 3302 2787 +8 0 0 5691 3242 +9 0 0 5692 1948 +10 0 1715 5693 2340 +11 5680 1409 5690 5694 +7 3646 0 2579 0 +6 2355 0 2498 0 +7 5099 0 5697 0 +8 5696 0 5698 0 +9 5699 0 3061 0 +7 0 0 2552 5518 +7 0 0 3007 5378 +8 0 0 5701 5702 +9 0 0 3065 5703 +10 5700 0 1572 5704 +11 3253 1409 5705 5675 +7 5646 0 4153 0 +7 4583 0 3341 0 +8 5707 0 5708 0 +9 5709 0 2542 0 +7 0 0 2697 4821 +7 0 0 3007 5247 +8 0 0 5711 5712 +9 0 0 2696 5713 +10 5710 0 1572 5714 +11 5680 1409 5715 5694 +12 5676 5695 5706 5716 +8 2485 0 5620 0 +9 922 0 5718 0 +10 623 756 5719 0 +6 2483 0 2385 0 +7 5721 0 2895 0 +7 2356 0 3032 0 +8 5722 0 5723 0 +9 5724 0 3061 0 +7 0 0 2697 2933 +6 2410 2403 2411 2405 +7 0 0 4157 5727 +8 0 0 5726 5728 +9 0 0 2508 5729 +10 5725 0 1572 5730 +7 0 1720 3036 3607 +8 0 0 5732 2733 +9 0 0 5733 1948 +10 0 1715 5734 2340 +11 5720 1409 5731 5735 +7 3784 0 3310 0 +7 3340 0 3310 0 +8 5737 0 5738 0 +9 5739 0 2542 0 +7 0 0 3137 3207 +7 0 0 3349 5247 +8 0 0 5741 5742 +9 0 0 2696 5743 +10 5740 0 2401 5744 +8 0 0 3355 3416 +9 0 0 5746 1948 +10 0 1715 5747 2340 +11 3395 1409 5745 5748 +7 3032 0 3032 0 +8 5722 0 5750 0 +9 5751 0 3061 0 +7 0 0 4888 3163 +8 0 0 5753 5728 +9 0 0 2508 5754 +10 5752 0 1572 5755 +11 5720 1409 5756 5735 +7 3784 0 4153 0 +7 3456 0 3363 0 +8 5758 0 5759 0 +9 5760 0 2542 0 +7 0 0 2636 5607 +7 0 0 5651 5247 +8 0 0 5762 5763 +9 0 0 2696 5764 +10 5761 0 2401 5765 +11 3395 1409 5766 5748 +12 5736 5749 5757 5767 +13 5583 5663 5717 5768 +7 5128 991 2769 0 +8 3641 0 5770 0 +9 922 0 5771 0 +10 623 756 5772 0 +7 3646 0 3940 0 +6 2483 0 2498 0 +7 5775 0 2618 0 +8 5774 0 5776 0 +9 5777 0 3653 0 +6 2782 2504 2783 2562 +7 0 0 2469 5779 +7 0 0 4573 3628 +8 0 0 5780 5781 +9 0 0 3657 5782 +10 5778 0 2401 5783 +7 0 1720 2637 2552 +8 0 0 5785 3610 +9 0 0 5786 1948 +10 0 1715 5787 2340 +11 5773 1409 5784 5788 +6 2444 0 2385 0 +7 3341 991 5790 0 +8 2485 0 5791 0 +9 922 0 5792 0 +10 623 756 5793 0 +7 0 0 3302 2788 +7 0 0 2560 3687 +8 0 0 5795 5796 +9 0 0 3685 5797 +10 3682 0 1572 5798 +7 0 1720 2430 2873 +8 0 0 5800 3695 +9 0 0 5801 1948 +10 0 1715 5802 2340 +11 5794 1409 5799 5803 +7 5128 991 3391 0 +8 2834 0 5805 0 +9 922 0 5806 0 +10 623 756 5807 0 +7 3557 0 3429 0 +7 3705 0 2618 0 +8 5809 0 5810 0 +9 5811 0 3653 0 +7 0 0 3209 3138 +7 0 0 5651 2947 +8 0 0 5813 5814 +9 0 0 3657 5815 +10 5812 0 2401 5816 +7 0 1720 3663 0 +6 2403 4056 2405 2427 +7 1737 1747 5819 1789 +8 0 0 5818 5820 +9 0 0 5821 1948 +10 0 1715 5822 2340 +11 5808 1409 5817 5823 +7 2356 991 3669 0 +8 2680 0 5825 0 +9 922 0 5826 0 +10 623 756 5827 0 +6 2370 0 2381 0 +7 5829 0 4583 0 +7 2578 0 2954 0 +8 5830 0 5831 0 +9 5832 0 3681 0 +7 0 0 1725 3866 +6 2630 2630 2632 2632 +7 0 0 3463 5835 +8 0 0 5834 5836 +9 0 0 3685 5837 +10 5833 0 1572 5838 +6 2504 2419 2562 2420 +7 0 1720 3354 5840 +6 2415 3326 2417 2783 +7 1737 1747 5842 1789 +8 0 0 5841 5843 +9 0 0 5844 1948 +10 0 1715 5845 2340 +11 5828 1409 5839 5846 +12 5789 5804 5824 5847 +7 2382 991 2741 0 +8 3248 0 5849 0 +9 922 0 5850 0 +10 623 756 5851 0 +7 2802 0 3940 0 +7 3708 0 3730 0 +8 5853 0 5854 0 +9 5855 0 3763 0 +7 0 0 0 4997 +7 0 0 5376 3767 +8 0 0 5857 5858 +9 0 0 2901 5859 +10 5856 0 1572 5860 +6 2630 2426 2632 2427 +7 0 1720 5862 4888 +8 0 0 5863 3774 +9 0 0 5864 1948 +10 0 1715 5865 2340 +11 5852 1409 5861 5866 +7 2581 991 2747 0 +8 2739 0 5868 0 +9 922 0 5869 0 +10 623 756 5870 0 +7 3784 0 2572 0 +7 2769 0 2895 0 +8 5872 0 5873 0 +9 5874 0 3791 0 +7 0 0 3302 3741 +6 2419 2410 2420 2411 +7 0 0 5877 2881 +8 0 0 5876 5878 +9 0 0 3795 5879 +10 5875 0 2401 5880 +6 2426 2410 2427 2411 +7 0 1720 5882 2636 +8 0 0 5883 3749 +9 0 0 5884 1948 +10 0 1715 5885 2340 +11 5871 1409 5881 5886 +7 2840 991 3286 0 +8 2711 0 5888 0 +9 922 0 5889 0 +10 623 756 5890 0 +7 4564 0 2895 0 +8 3758 0 5892 0 +9 5893 0 3763 0 +7 0 0 2947 4997 +6 2419 2402 2420 2429 +7 0 0 4541 5896 +8 0 0 5895 5897 +9 0 0 2901 5898 +10 5894 0 1572 5899 +7 0 1720 3719 4601 +8 0 0 5901 3723 +9 0 0 5902 1948 +10 0 1715 5903 2340 +11 5891 1409 5900 5904 +7 2581 991 3779 0 +8 2739 0 5906 0 +9 922 0 5907 0 +10 623 756 5908 0 +6 2370 0 2492 0 +7 5910 0 2747 0 +7 3596 0 3110 0 +8 5911 0 5912 0 +9 5913 0 3791 0 +7 0 0 2517 3347 +8 0 0 5915 3141 +9 0 0 3795 5916 +10 5914 0 2401 5917 +7 0 1720 3802 0 +6 2426 1751 2427 0 +7 1737 1747 5920 1789 +8 0 0 5919 5921 +9 0 0 5922 1948 +10 0 1715 5923 2340 +11 5909 1409 5918 5924 +12 5867 5887 5905 5925 +7 3617 991 3391 0 +8 2834 0 5927 0 +9 922 0 5928 0 +10 623 756 5929 0 +6 2494 0 2617 0 +7 3708 0 5931 0 +7 4564 0 2532 0 +8 5932 0 5933 0 +9 5934 0 3061 0 +7 0 0 2555 2880 +8 0 0 5762 5936 +9 0 0 2508 5937 +10 5935 0 2401 5938 +7 0 1720 3663 3186 +6 2403 2762 2405 2562 +7 1737 1747 5941 1789 +8 0 0 5940 5942 +9 0 0 5943 1948 +10 0 1715 5944 2340 +11 5930 1409 5939 5945 +7 2840 991 3669 0 +8 2680 0 5947 0 +9 922 0 5948 0 +10 623 756 5949 0 +7 5829 0 4016 0 +7 2954 0 2960 0 +8 5951 0 5952 0 +9 5953 0 2542 0 +7 0 0 4084 3864 +6 2410 2465 2411 2467 +7 0 0 5956 3519 +8 0 0 5955 5957 +9 0 0 2696 5958 +10 5954 0 1572 5959 +7 0 1720 3354 3181 +8 0 0 5961 2884 +9 0 0 5962 1948 +10 0 1715 5963 2340 +11 5950 1409 5960 5964 +7 3708 0 4203 0 +7 5775 0 3706 0 +8 5966 0 5967 0 +9 5968 0 3061 0 +7 0 0 3137 4842 +7 0 0 5651 2880 +8 0 0 5970 5971 +9 0 0 2508 5972 +10 5969 0 2401 5973 +11 5930 1409 5974 5945 +7 5829 0 3675 0 +7 2960 0 3432 0 +8 5976 0 5977 0 +9 5978 0 2542 0 +6 2465 2402 2467 2429 +7 0 0 5862 5980 +7 0 0 3007 3519 +8 0 0 5981 5982 +9 0 0 2696 5983 +10 5979 0 1572 5984 +11 5950 1409 5985 5964 +12 5946 5965 5975 5986 +8 3196 0 3754 0 +9 922 0 5988 0 +10 623 756 5989 0 +6 2370 0 2369 0 +7 5991 0 4835 0 +7 3705 0 4835 0 +8 5992 0 5993 0 +9 5994 0 3061 0 +7 0 0 2881 3347 +8 0 0 5996 5936 +9 0 0 2508 5997 +10 5995 0 1572 5998 +11 5990 1409 5999 3726 +7 3730 991 3779 0 +8 3334 0 6001 0 +9 922 0 6002 0 +10 623 756 6003 0 +6 2617 0 2494 0 +7 5991 0 6005 0 +7 2769 0 2999 0 +8 6006 0 6007 0 +9 6008 0 2542 0 +7 0 0 2593 4997 +7 0 0 3007 3037 +8 0 0 6010 6011 +9 0 0 2696 6012 +10 6009 0 2401 6013 +7 0 1720 3802 2469 +6 2426 2476 2427 2429 +7 1737 1747 6016 1789 +8 0 0 6015 6017 +9 0 0 6018 1948 +10 0 1715 6019 2340 +11 6004 1409 6014 6020 +7 5991 0 4203 0 +7 3705 0 3451 0 +8 6022 0 6023 0 +9 6024 0 3061 0 +6 2544 2465 2546 2467 +7 0 0 6026 2880 +8 0 0 6010 6027 +9 0 0 2508 6028 +10 6025 0 1572 6029 +11 5990 1409 6030 3726 +7 5991 0 3779 0 +7 2769 0 2842 0 +8 6032 0 6033 0 +9 6034 0 2542 0 +7 0 0 2795 4997 +7 0 0 5651 3037 +8 0 0 6036 6037 +9 0 0 2696 6038 +10 6035 0 2401 6039 +11 6004 1409 6040 6020 +12 6000 6021 6031 6041 +13 5848 5926 5987 6042 +6 0 977 2385 0 +7 964 973 6044 987 +7 2387 991 2895 0 +8 6045 0 6046 0 +9 922 0 6047 0 +10 623 756 6048 0 +7 2448 0 2618 0 +8 3255 0 6050 0 +9 6051 0 2393 0 +7 0 0 2409 4733 +8 0 0 6053 5558 +9 0 0 2408 6054 +10 6052 0 1572 6055 +7 0 1720 3037 2818 +8 0 0 6057 5942 +9 0 0 6058 1948 +10 0 1715 6059 2340 +11 6049 1409 6056 6060 +7 3080 991 3591 0 +8 2485 0 6062 0 +9 922 0 6063 0 +10 623 756 6064 0 +7 3591 0 4153 0 +7 3031 0 4684 0 +8 6066 0 6067 0 +9 6068 0 2455 0 +7 0 0 2600 3037 +8 0 0 6070 3298 +9 0 0 2460 6071 +10 6069 0 1572 6072 +8 0 0 3239 4897 +9 0 0 6074 1948 +10 0 1715 6075 2340 +11 6065 1409 6073 6076 +12 6061 6077 0 0 +7 3309 991 4125 0 +8 3248 0 6079 0 +9 922 0 6080 0 +10 623 756 6081 0 +7 5030 0 2895 0 +7 2486 0 2486 0 +8 6083 0 6084 0 +9 6085 0 2588 0 +6 2426 2550 2427 2551 +7 0 0 3720 6087 +8 0 0 6088 3381 +9 0 0 2592 6089 +10 6086 0 1572 6090 +7 0 1720 2418 2474 +6 1722 4759 1724 1724 +7 1737 1747 6093 1789 +8 0 0 6092 6094 +9 0 0 6095 1948 +10 0 1715 6096 2340 +11 6082 1409 6091 6097 +7 2621 991 3286 0 +8 3916 0 6099 0 +9 922 0 6100 0 +10 623 756 6101 0 +7 3992 0 3110 0 +8 3396 0 6103 0 +9 6104 0 2628 0 +7 0 0 2636 4842 +8 0 0 6106 5652 +9 0 0 2635 6107 +10 6105 0 1572 6108 +7 0 1720 5634 3354 +6 2782 4166 2783 2546 +7 1737 1747 6111 1789 +8 0 0 6110 6112 +9 0 0 6113 1948 +10 0 1715 6114 2340 +11 6102 1409 6109 6115 +12 6098 6116 0 0 +13 6078 6117 0 0 +7 2840 991 2835 0 +8 4350 0 6119 0 +9 922 0 6120 0 +10 623 756 6121 0 +7 3708 0 3429 0 +7 3431 0 2895 0 +8 6123 0 6124 0 +9 6125 0 2393 0 +7 0 0 2430 2760 +7 0 0 5651 3628 +8 0 0 6127 6128 +9 0 0 2408 6129 +10 6126 0 2401 6130 +8 0 0 3608 5117 +9 0 0 6132 1948 +10 0 1715 6133 2340 +11 6122 1409 6131 6134 +6 2492 977 2498 0 +7 964 973 6136 987 +7 3617 991 4446 0 +8 6137 0 6138 0 +9 922 0 6139 0 +10 623 756 6140 0 +7 3784 0 4583 0 +7 2380 0 2572 0 +8 6142 0 6143 0 +9 6144 0 2455 0 +7 0 0 2725 3541 +8 0 0 6146 3688 +9 0 0 2460 6147 +10 6145 0 2401 6148 +6 1722 2403 1724 2405 +7 0 1720 6150 3012 +8 0 0 6151 2433 +9 0 0 6152 1948 +10 0 1715 6153 2340 +11 6141 1409 6149 6154 +12 6135 6155 0 0 +7 3086 991 4532 0 +8 2439 0 6157 0 +9 922 0 6158 0 +10 623 756 6159 0 +7 3228 0 2741 0 +8 3758 0 6161 0 +9 6162 0 2588 0 +7 0 0 3070 4997 +8 0 0 6164 5897 +9 0 0 2592 6165 +10 6163 0 2401 6166 +7 0 1720 2787 3720 +6 2504 3043 2562 2632 +7 1737 1747 6169 1789 +8 0 0 6168 6170 +9 0 0 6171 1948 +10 0 1715 6172 2340 +11 6160 1409 6167 6173 +7 3730 991 3223 0 +8 2571 0 6175 0 +9 922 0 6176 0 +10 623 756 6177 0 +7 5991 0 2747 0 +7 2712 0 3286 0 +8 6179 0 6180 0 +9 6181 0 2628 0 +7 0 0 2593 2787 +7 0 0 3140 2881 +8 0 0 6183 6184 +9 0 0 2635 6185 +10 6182 0 2401 6186 +8 0 0 3747 4196 +9 0 0 6188 1948 +10 0 1715 6189 2340 +11 6178 1409 6187 6190 +12 6174 6191 0 0 +13 6156 6192 0 0 +14 5769 6043 6118 6193 +15 5508 6194 0 0 +7 3706 991 4421 0 +8 2372 0 6196 0 +9 922 0 6197 0 +10 623 756 6198 0 +7 2973 0 2895 0 +8 4068 0 6200 0 +9 6201 0 4073 0 +7 0 0 2725 2510 +7 0 0 3607 2560 +8 0 0 6203 6204 +9 0 0 4077 6205 +10 6202 0 2401 6206 +6 2630 2419 2632 2420 +7 0 1720 3070 6208 +8 0 0 6209 4087 +9 0 0 6210 1948 +10 0 1715 6211 2340 +11 6199 1409 6207 6212 +7 2840 991 5011 0 +8 4093 0 6214 0 +9 922 0 6215 0 +10 623 756 6216 0 +7 2655 0 4682 0 +7 3429 0 3575 0 +8 6218 0 6219 0 +9 6220 0 4105 0 +7 0 0 1725 2826 +6 2550 2415 2551 2417 +7 0 0 6223 2753 +8 0 0 6222 6224 +9 0 0 3295 6225 +10 6221 0 1572 6226 +7 0 1720 2825 3719 +8 0 0 6228 4115 +9 0 0 6229 1948 +10 0 1715 6230 2340 +11 6217 1409 6227 6231 +7 2445 991 3029 0 +8 4350 0 6233 0 +9 922 0 6234 0 +10 623 756 6235 0 +6 2385 0 2369 0 +7 6237 0 3368 0 +7 2960 0 5062 0 +8 6238 0 6239 0 +9 6240 0 4073 0 +7 0 0 2421 2723 +7 0 0 4079 4272 +8 0 0 6242 6243 +9 0 0 4077 6244 +10 6241 0 2401 6245 +7 0 1720 3720 5378 +8 0 0 6247 2856 +9 0 0 6248 1948 +10 0 1715 6249 2340 +11 6236 1409 6246 6250 +7 3730 991 3431 0 +8 4531 0 6252 0 +9 922 0 6253 0 +10 623 756 6254 0 +7 2769 0 3623 0 +8 4100 0 6256 0 +9 6257 0 4105 0 +7 0 0 2428 2760 +7 0 0 3091 3005 +8 0 0 6259 6260 +9 0 0 3295 6261 +10 6258 0 1572 6262 +7 0 1720 2825 4945 +8 0 0 6264 3358 +9 0 0 6265 1948 +10 0 1715 6266 2340 +11 6255 1409 6263 6267 +12 6213 6232 6251 6268 +7 3617 991 2864 0 +8 3248 0 6270 0 +9 922 0 6271 0 +10 623 756 6272 0 +7 4177 0 3309 0 +7 2747 0 3623 0 +8 6274 0 6275 0 +9 6276 0 4183 0 +7 0 0 2725 3866 +6 2345 2415 2347 2417 +7 0 0 6279 2474 +8 0 0 6278 6280 +9 0 0 4187 6281 +10 6277 0 1572 6282 +7 0 1720 6279 2795 +8 0 0 6284 4196 +9 0 0 6285 1948 +10 0 1715 6286 2340 +11 6273 1409 6283 6287 +6 2369 0 2369 0 +7 2842 991 6289 0 +8 4202 0 6290 0 +9 922 0 6291 0 +10 623 756 6292 0 +7 3050 0 3286 0 +8 4209 0 6294 0 +9 6295 0 4215 0 +7 0 0 2875 2510 +7 0 0 6208 3036 +8 0 0 6297 6298 +9 0 0 4219 6299 +10 6296 0 2401 6300 +7 0 1720 1725 4364 +8 0 0 6302 2884 +9 0 0 6303 1948 +10 0 1715 6304 2340 +11 6293 1409 6301 6305 +7 3617 991 4146 0 +8 3248 0 6307 0 +9 922 0 6308 0 +10 623 756 6309 0 +6 2374 0 2492 0 +7 6311 0 2686 0 +7 2863 0 4016 0 +8 6312 0 6313 0 +9 6314 0 4183 0 +7 0 0 2560 3441 +7 0 0 3541 2474 +8 0 0 6316 6317 +9 0 0 4187 6318 +10 6315 0 1572 6319 +7 0 1720 4247 2428 +6 2345 4759 2347 1724 +7 1737 1747 6322 1789 +8 0 0 6321 6323 +9 0 0 6324 1948 +10 0 1715 6325 2340 +11 6310 1409 6320 6326 +7 2579 991 3201 0 +8 2571 0 6328 0 +9 922 0 6329 0 +10 623 756 6330 0 +6 994 0 2492 0 +7 6332 0 3674 0 +7 2654 0 2573 0 +8 6333 0 6334 0 +9 6335 0 4215 0 +7 0 0 3349 4821 +8 0 0 6337 4222 +9 0 0 4219 6338 +10 6336 0 2401 6339 +7 0 1720 2517 5247 +6 2415 4166 2417 2546 +7 1737 1747 6342 1789 +8 0 0 6341 6343 +9 0 0 6344 1948 +10 0 1715 6345 2340 +11 6331 1409 6340 6346 +12 6288 6306 6327 6347 +7 3730 991 3029 0 +8 4350 0 6349 0 +9 922 0 6350 0 +10 623 756 6351 0 +7 6237 0 4146 0 +7 2960 0 2387 0 +8 6353 0 6354 0 +9 6355 0 3061 0 +7 0 0 2512 4821 +6 2415 2465 2417 2467 +7 0 0 6358 2760 +8 0 0 6357 6359 +9 0 0 2508 6360 +10 6356 0 2401 6361 +7 0 1720 3720 3720 +8 0 0 6363 4608 +9 0 0 6364 1948 +10 0 1715 6365 2340 +11 6352 1409 6362 6366 +8 4614 0 4095 0 +9 922 0 6368 0 +10 623 756 6369 0 +6 0 0 2492 0 +7 6371 0 2741 0 +7 4125 0 3623 0 +8 6372 0 6373 0 +9 6374 0 2542 0 +7 0 0 2474 3441 +7 0 0 3007 3324 +8 0 0 6376 6377 +9 0 0 2696 6378 +10 6375 0 1572 6379 +8 0 0 4055 5501 +9 0 0 6381 1948 +10 0 1715 6382 2340 +11 6370 1409 6380 6383 +7 6237 0 3284 0 +7 2487 0 2842 0 +8 6385 0 6386 0 +9 6387 0 3061 0 +7 0 0 3802 4821 +7 0 0 6026 2760 +8 0 0 6389 6390 +9 0 0 2508 6391 +10 6388 0 2401 6392 +11 6352 1409 6393 6366 +7 6371 0 3340 0 +6 2369 0 2381 0 +7 2486 0 6396 0 +8 6395 0 6397 0 +9 6398 0 2542 0 +6 2465 2465 2467 2467 +7 0 0 6400 3324 +8 0 0 6222 6401 +9 0 0 2696 6402 +10 6399 0 1572 6403 +11 6370 1409 6404 6383 +12 6367 6384 6394 6405 +7 3730 991 4146 0 +8 4903 0 6407 0 +9 922 0 6408 0 +10 623 756 6409 0 +7 6311 0 3201 0 +7 2572 0 4153 0 +8 6411 0 6412 0 +9 6413 0 3061 0 +7 0 0 0 2826 +7 0 0 3140 5634 +8 0 0 6415 6416 +9 0 0 2508 6417 +10 6414 0 1572 6418 +6 0 2782 0 2783 +7 0 1720 2412 6420 +6 2345 3015 2347 2466 +7 1737 1747 6422 1789 +8 0 0 6421 6423 +9 0 0 6424 1948 +10 0 1715 6425 2340 +11 6410 1409 6419 6426 +7 3575 991 3201 0 +8 2571 0 6428 0 +9 922 0 6429 0 +10 623 756 6430 0 +7 6332 0 2741 0 +7 2487 0 2864 0 +8 6432 0 6433 0 +9 6434 0 4001 0 +6 2782 1722 2783 1724 +7 0 0 2639 6436 +7 0 0 3140 2818 +8 0 0 6437 6438 +9 0 0 2696 6439 +10 6435 0 2401 6440 +7 0 1720 2428 2725 +8 0 0 6442 3635 +9 0 0 6443 1948 +10 0 1715 6444 2340 +11 6431 1409 6441 6445 +7 2747 0 2719 0 +8 6411 0 6447 0 +9 6448 0 3061 0 +7 0 0 3887 2760 +8 0 0 6450 6416 +9 0 0 2508 6451 +10 6449 0 1572 6452 +11 6410 1409 6453 6426 +7 6332 0 3340 0 +7 3050 0 2612 0 +8 6455 0 6456 0 +9 6457 0 4001 0 +7 0 0 2412 4842 +7 0 0 2668 2818 +8 0 0 6459 6460 +9 0 0 2696 6461 +10 6458 0 2401 6462 +11 6431 1409 6463 6445 +12 6427 6446 6454 6464 +13 6269 6348 6406 6465 +7 3730 991 4583 0 +8 4465 0 6467 0 +9 922 0 6468 0 +10 623 756 6469 0 +7 3081 0 4151 0 +7 4099 0 4127 0 +8 6471 0 6472 0 +9 6473 0 4477 0 +7 0 0 2348 2553 +7 0 0 4025 4484 +8 0 0 6475 6476 +9 0 0 4481 6477 +10 6474 0 2401 6478 +7 0 1720 4489 2825 +8 0 0 6480 4493 +9 0 0 6481 1948 +10 0 1715 6482 2340 +11 6470 1409 6479 6483 +7 3730 991 3087 0 +8 4499 0 6485 0 +9 922 0 6486 0 +10 623 756 6487 0 +7 4470 0 3032 0 +7 2864 0 2493 0 +8 6489 0 6490 0 +9 6491 0 4511 0 +7 0 0 2880 2723 +7 0 0 3266 3012 +8 0 0 6493 6494 +9 0 0 4515 6495 +10 6492 0 1572 6496 +6 2410 2410 2411 2411 +7 0 1720 6498 3887 +8 0 0 6499 4524 +9 0 0 6500 1948 +10 0 1715 6501 2340 +11 6488 1409 6497 6502 +7 3730 991 2712 0 +8 2571 0 6504 0 +9 922 0 6505 0 +10 623 756 6506 0 +7 3081 0 4239 0 +7 2747 0 4532 0 +8 6508 0 6509 0 +9 6510 0 4477 0 +7 0 0 3887 2818 +6 2415 2415 2417 2417 +6 2782 2419 2783 2420 +7 0 0 6513 6514 +8 0 0 6512 6515 +9 0 0 4481 6516 +10 6511 0 2401 6517 +7 0 1720 3012 2825 +6 2410 4166 2411 2546 +7 1737 1747 6520 1789 +8 0 0 6519 6521 +9 0 0 6522 1948 +10 0 1715 6523 2340 +11 6507 1409 6518 6524 +6 2447 977 2447 0 +7 964 973 6526 987 +7 3575 991 3675 0 +8 6527 0 6528 0 +9 922 0 6529 0 +10 623 756 6530 0 +6 2369 0 2483 0 +7 4470 0 6532 0 +7 3112 0 5011 0 +8 6533 0 6534 0 +9 6535 0 4511 0 +7 0 0 3866 3012 +8 0 0 5224 6537 +9 0 0 4515 6538 +10 6536 0 1572 6539 +7 0 1720 3441 4456 +8 0 0 6541 1790 +9 0 0 6542 1948 +10 0 1715 6543 2340 +11 6531 1409 6540 6544 +12 6484 6503 6525 6545 +6 2447 0 2355 0 +7 2612 991 6547 0 +8 4582 0 6548 0 +9 922 0 6549 0 +10 623 756 6550 0 +7 2717 0 5099 0 +7 3309 0 4094 0 +8 6552 0 6553 0 +9 6554 0 4594 0 +6 2345 2504 2347 2562 +7 0 0 6556 2509 +7 0 0 4364 3354 +8 0 0 6557 6558 +9 0 0 4598 6559 +10 6555 0 1572 6560 +7 0 1720 4249 6420 +8 0 0 6562 4608 +9 0 0 6563 1948 +10 0 1715 6564 2340 +11 6551 1409 6561 6565 +7 2448 991 4932 0 +8 4614 0 6567 0 +9 922 0 6568 0 +10 623 756 6569 0 +7 4263 0 3032 0 +7 2660 0 4045 0 +8 6571 0 6572 0 +9 6573 0 4626 0 +7 0 0 2412 4362 +7 0 0 3118 4601 +8 0 0 6575 6576 +9 0 0 4630 6577 +10 6574 0 1572 6578 +7 0 1720 3145 6556 +8 0 0 6580 4639 +9 0 0 6581 1948 +10 0 1715 6582 2340 +11 6570 1409 6579 6583 +6 994 977 2370 0 +7 964 973 6585 987 +7 2835 991 3456 0 +8 6586 0 6587 0 +9 922 0 6588 0 +10 623 756 6589 0 +7 2717 0 6311 0 +8 6591 0 4356 0 +9 6592 0 4594 0 +7 0 0 3118 6436 +8 0 0 6594 4602 +9 0 0 4598 6595 +10 6593 0 1572 6596 +7 0 1720 5634 4431 +6 2403 3043 2405 2632 +7 1737 1747 6599 1789 +8 0 0 6598 6600 +9 0 0 6601 1948 +10 0 1715 6602 2340 +11 6590 1409 6597 6603 +7 2448 991 3736 0 +8 3023 0 6605 0 +9 922 0 6606 0 +10 623 756 6607 0 +7 4263 0 4263 0 +7 2621 0 4878 0 +8 6609 0 6610 0 +9 6611 0 4626 0 +7 0 0 2412 4249 +7 0 0 4517 4601 +8 0 0 6613 6614 +9 0 0 4630 6615 +10 6612 0 1572 6616 +6 2504 2731 2562 2551 +7 1737 1747 6618 1789 +8 0 0 6580 6619 +9 0 0 6620 1948 +10 0 1715 6621 2340 +11 6608 1409 6617 6622 +12 6566 6584 6604 6623 +6 2381 977 2617 0 +7 964 973 6625 987 +8 6626 0 4466 0 +9 922 0 6627 0 +10 623 756 6628 0 +7 4239 0 3647 0 +7 4446 0 4532 0 +8 6630 0 6631 0 +9 6632 0 3061 0 +7 0 0 3012 4272 +7 0 0 4541 4484 +8 0 0 6634 6635 +9 0 0 4294 6636 +10 6633 0 2401 6637 +7 0 1720 3012 4431 +6 2410 4759 2411 1724 +7 1737 1747 6640 1789 +8 0 0 6639 6641 +9 0 0 6642 1948 +10 0 1715 6643 2340 +11 6629 1409 6638 6644 +6 994 977 2447 0 +7 964 973 6646 987 +7 3575 991 4583 0 +8 6647 0 6648 0 +9 922 0 6649 0 +10 623 756 6650 0 +7 4470 0 4208 0 +7 995 0 5011 0 +8 6652 0 6653 0 +9 6654 0 4001 0 +7 0 0 2600 2462 +6 2504 2345 2562 2347 +7 0 0 3521 6657 +8 0 0 6656 6658 +9 0 0 4316 6659 +10 6655 0 1572 6660 +8 0 0 6541 6094 +9 0 0 6662 1948 +10 0 1715 6663 2340 +11 6651 1409 6661 6664 +6 2385 0 2447 0 +7 4239 0 6666 0 +7 2572 0 4532 0 +8 6667 0 6668 0 +9 6669 0 3061 0 +7 0 0 3012 2553 +6 2415 2550 2417 2551 +7 0 0 6672 4484 +8 0 0 6671 6673 +9 0 0 4294 6674 +10 6670 0 2401 6675 +11 6629 1409 6676 6644 +7 2864 0 2685 0 +8 6652 0 6678 0 +9 6679 0 4001 0 +7 0 0 4247 2787 +8 0 0 6681 6658 +9 0 0 4316 6682 +10 6680 0 1572 6683 +11 6651 1409 6684 6664 +12 6645 6665 6677 6685 +8 6586 0 4533 0 +9 922 0 6687 0 +10 623 756 6688 0 +7 2717 0 3647 0 +7 2373 0 3310 0 +8 6690 0 6691 0 +9 6692 0 4382 0 +7 0 0 3118 6657 +7 0 0 3797 3354 +8 0 0 6694 6695 +9 0 0 4294 6696 +10 6693 0 1572 6697 +7 0 1720 3207 4431 +8 0 0 6699 4033 +9 0 0 6700 1948 +10 0 1715 6701 2340 +11 6689 1409 6698 6702 +6 2381 977 2498 0 +7 964 973 6704 987 +7 4557 991 3731 0 +8 6705 0 6706 0 +9 922 0 6707 0 +10 623 756 6708 0 +7 4263 0 4099 0 +6 2444 0 2374 0 +7 3341 0 6711 0 +8 6710 0 6712 0 +9 6713 0 4001 0 +7 0 0 5435 2600 +7 0 0 3091 4601 +8 0 0 6715 6716 +9 0 0 3406 6717 +10 6714 0 2401 6718 +7 0 1720 3628 4573 +8 0 0 6720 2564 +9 0 0 6721 1948 +10 0 1715 6722 2340 +11 6709 1409 6719 6723 +7 2717 0 6666 0 +7 3309 0 2445 0 +8 6725 0 6726 0 +9 6727 0 4382 0 +7 0 0 5518 2818 +6 2415 2782 2417 2783 +7 0 0 6730 3354 +8 0 0 6729 6731 +9 0 0 4294 6732 +10 6728 0 1572 6733 +11 6689 1409 6734 6702 +7 3080 0 4878 0 +8 6710 0 6736 0 +9 6737 0 4001 0 +7 0 0 3145 4362 +7 0 0 3766 4601 +8 0 0 6739 6740 +9 0 0 3406 6741 +10 6738 0 2401 6742 +11 6709 1409 6743 6723 +12 6703 6724 6735 6744 +13 6546 6624 6686 6745 +6 2498 977 2617 0 +7 964 973 6747 987 +7 3730 991 3310 0 +8 6748 0 6749 0 +9 922 0 6750 0 +10 623 756 6751 0 +7 6237 0 5371 0 +7 0 0 3080 0 +8 6753 0 6754 0 +9 6755 0 2393 0 +7 0 0 2880 3866 +8 0 0 6757 4080 +9 0 0 2408 6758 +10 6756 0 1572 6759 +6 2345 2630 2347 2632 +7 0 1720 6761 3628 +6 2402 4433 2429 2420 +7 1737 1747 6763 1789 +8 0 0 6762 6764 +9 0 0 6765 1948 +10 0 1715 6766 2340 +11 6752 1409 6760 6767 +7 3479 991 5030 0 +8 3616 0 6769 0 +9 922 0 6770 0 +10 623 756 6771 0 +7 2486 0 2620 0 +8 4100 0 6773 0 +9 6774 0 2455 0 +7 0 0 2348 2826 +8 0 0 6776 6260 +9 0 0 2460 6777 +10 6775 0 1572 6778 +7 0 1720 3186 2418 +8 0 0 6780 4459 +9 0 0 6781 1948 +10 0 1715 6782 2340 +11 6772 1409 6779 6783 +12 6768 6784 0 0 +7 2448 991 2712 0 +8 3023 0 6786 0 +9 922 0 6787 0 +10 623 756 6788 0 +7 6371 0 2582 0 +7 2495 0 3431 0 +8 6790 0 6791 0 +9 6792 0 2588 0 +7 0 0 1725 2430 +7 0 0 3797 2474 +8 0 0 6794 6795 +9 0 0 2592 6796 +10 6793 0 1572 6797 +7 0 1720 3145 3687 +6 2410 3693 2411 2467 +7 1737 1747 6800 1789 +8 0 0 6799 6801 +9 0 0 6802 1948 +10 0 1715 6803 2340 +11 6789 1409 6798 6804 +6 0 977 2494 0 +7 964 973 6806 987 +7 4557 991 3618 0 +8 6807 0 6808 0 +9 922 0 6809 0 +10 623 756 6810 0 +7 2654 0 2356 0 +8 6333 0 6812 0 +9 6813 0 2628 0 +7 0 0 3037 2723 +7 0 0 4221 2600 +8 0 0 6815 6816 +9 0 0 2635 6817 +10 6814 0 1572 6818 +7 0 1720 2826 2881 +6 2464 4166 2466 2546 +7 1737 1747 6821 1789 +8 0 0 6820 6822 +9 0 0 6823 1948 +10 0 1715 6824 2340 +11 6811 1409 6819 6825 +12 6805 6826 0 0 +13 6785 6827 0 0 +6 2444 977 2370 0 +7 964 973 6829 987 +6 2494 0 2381 0 +7 3432 991 6831 0 +8 6830 0 6832 0 +9 922 0 6833 0 +10 623 756 6834 0 +8 4471 0 4241 0 +9 6836 0 4245 0 +6 2415 2504 2417 2562 +7 0 0 6838 3138 +8 0 0 4248 6839 +9 0 0 2408 6840 +10 6837 0 2401 6841 +7 0 1720 2636 4599 +6 2419 4759 2420 1724 +7 1737 1747 6844 1789 +8 0 0 6843 6845 +9 0 0 6846 1948 +10 0 1715 6847 2340 +11 6835 1409 6842 6848 +7 6711 991 3736 0 +8 5057 0 6850 0 +9 922 0 6851 0 +10 623 756 6852 0 +7 4239 0 4860 0 +6 2385 0 2617 0 +7 2582 0 6855 0 +8 6854 0 6856 0 +9 6857 0 2455 0 +7 0 0 2348 2593 +6 2544 2504 2546 2562 +7 0 0 6860 3012 +8 0 0 6859 6861 +9 0 0 4270 6862 +10 6858 0 2401 6863 +7 0 1720 2512 3925 +8 0 0 6865 4639 +9 0 0 6866 1948 +10 0 1715 6867 2340 +11 6853 1409 6864 6868 +12 6849 6869 0 0 +6 2381 977 2355 0 +7 964 973 6871 987 +7 4094 991 2741 0 +8 6872 0 6873 0 +9 922 0 6874 0 +10 623 756 6875 0 +7 5312 0 6311 0 +7 3080 0 2445 0 +8 6877 0 6878 0 +9 6879 0 2588 0 +7 0 0 2760 2873 +7 0 0 4601 2430 +8 0 0 6881 6882 +9 0 0 4338 6883 +10 6880 0 2401 6884 +6 1722 2426 1724 2427 +7 0 1720 2553 6886 +8 0 0 6887 3045 +9 0 0 6888 1948 +10 0 1715 6889 2340 +11 6876 1409 6885 6890 +6 2385 977 2617 0 +7 964 973 6892 987 +6 2355 0 2369 0 +7 2842 991 6894 0 +8 6893 0 6895 0 +9 922 0 6896 0 +10 623 756 6897 0 +8 4620 0 4356 0 +9 6899 0 4360 0 +7 0 0 5376 4971 +8 0 0 4363 6901 +9 0 0 2635 6902 +10 6900 0 2401 6903 +7 0 1720 2593 3541 +6 2345 2519 2347 2347 +7 1737 1747 6906 1789 +8 0 0 6905 6907 +9 0 0 6908 1948 +10 0 1715 6909 2340 +11 6898 1409 6904 6910 +12 6891 6911 0 0 +13 6870 6912 0 0 +14 6466 6746 6828 6913 +7 3575 991 2448 0 +8 4903 0 6915 0 +9 922 0 6916 0 +10 623 756 6917 0 +7 4505 0 3432 0 +7 3310 0 4983 0 +8 6919 0 6920 0 +9 6921 0 4913 0 +10 6922 0 1572 4921 +7 0 1720 5685 4247 +8 0 0 6924 4925 +9 0 0 6925 1948 +10 0 1715 6926 2340 +11 6918 1409 6923 6927 +6 2370 977 2355 0 +7 964 973 6929 987 +7 3363 991 3343 0 +8 6930 0 6931 0 +9 922 0 6932 0 +10 623 756 6933 0 +7 2869 0 3675 0 +7 3617 0 2999 0 +8 6935 0 6936 0 +9 6937 0 4942 0 +7 0 0 5376 4753 +7 0 0 3986 3209 +8 0 0 6939 6940 +9 0 0 4841 6941 +10 6938 0 1572 6942 +7 0 1720 3209 4456 +8 0 0 6944 3635 +9 0 0 6945 1948 +10 0 1715 6946 2340 +11 6934 1409 6943 6947 +6 2370 977 2444 0 +7 964 973 6949 987 +7 3921 991 4146 0 +8 6950 0 6951 0 +9 922 0 6952 0 +10 623 756 6953 0 +6 2444 0 2483 0 +7 4505 0 6955 0 +7 4684 0 3623 0 +8 6956 0 6957 0 +9 6958 0 4913 0 +7 0 0 2409 2600 +7 0 0 2553 3628 +8 0 0 6960 6961 +9 0 0 4917 6962 +10 6959 0 1572 6963 +7 0 1720 4842 5896 +8 0 0 6965 5074 +9 0 0 6966 1948 +10 0 1715 6967 2340 +11 6954 1409 6964 6968 +6 2384 977 2384 0 +7 964 973 6970 987 +7 4332 991 5099 0 +8 6971 0 6972 0 +9 922 0 6973 0 +10 623 756 6974 0 +6 2381 0 2447 0 +7 2869 0 6976 0 +8 6977 0 4772 0 +9 6978 0 4942 0 +7 0 0 5042 5840 +8 0 0 6980 4946 +9 0 0 4841 6981 +10 6979 0 1572 6982 +7 0 1720 2787 4573 +6 2426 3015 2427 2466 +7 1737 1747 6985 1789 +8 0 0 6984 6986 +9 0 0 6987 1948 +10 0 1715 6988 2340 +11 6975 1409 6983 6989 +12 6928 6948 6969 6990 +7 2445 991 5030 0 +8 5006 0 6992 0 +9 922 0 6993 0 +10 623 756 6994 0 +7 3706 0 4965 0 +6 2494 0 2369 0 +7 3087 0 6997 0 +8 6996 0 6998 0 +9 6999 0 4183 0 +7 0 0 2637 2755 +7 0 0 4431 3628 +8 0 0 7001 7002 +9 0 0 5017 7003 +10 7000 0 1572 7004 +7 0 1720 4164 5042 +8 0 0 7006 5025 +9 0 0 7007 1948 +10 0 1715 7008 2340 +11 6995 1409 7005 7009 +7 3921 991 3992 0 +8 5467 0 7011 0 +9 922 0 7012 0 +10 623 756 7013 0 +7 2740 0 2387 0 +7 3618 0 3055 0 +8 7015 0 7016 0 +9 7017 0 5039 0 +10 7018 0 2401 5045 +7 0 1720 5607 3441 +6 2419 4056 2420 2427 +7 1737 1747 7021 1789 +8 0 0 7020 7022 +9 0 0 7023 1948 +10 0 1715 7024 2340 +11 7014 1409 7019 7025 +7 2445 991 3081 0 +8 4744 0 7027 0 +9 922 0 7028 0 +10 623 756 7029 0 +7 3706 0 4682 0 +6 2498 0 2494 0 +7 3087 0 7032 0 +8 7031 0 7033 0 +9 7034 0 4183 0 +7 0 0 2637 4364 +7 0 0 5397 3628 +8 0 0 7036 7037 +9 0 0 5017 7038 +10 7035 0 1572 7039 +6 2410 3326 2411 2783 +7 1737 1747 7041 1789 +8 0 0 7006 7042 +9 0 0 7043 1948 +10 0 1715 7044 2340 +11 7030 1409 7040 7045 +6 2381 977 2494 0 +7 964 973 7047 987 +7 4310 991 3456 0 +8 7048 0 7049 0 +9 922 0 7050 0 +10 623 756 7051 0 +7 2740 0 5126 0 +7 2895 0 2493 0 +8 7053 0 7054 0 +9 7055 0 5039 0 +7 0 0 2636 3186 +7 0 0 4362 2795 +8 0 0 7057 7058 +9 0 0 4338 7059 +10 7056 0 2401 7060 +7 0 1720 2787 4733 +6 0 3240 0 2411 +7 1737 1747 7063 1789 +8 0 0 7062 7064 +9 0 0 7065 1948 +10 0 1715 7066 2340 +11 7052 1409 7061 7067 +12 7010 7026 7046 7068 +7 2493 991 3431 0 +8 2653 0 7070 0 +9 922 0 7071 0 +10 623 756 7072 0 +7 4505 0 4067 0 +7 2618 0 4500 0 +8 7074 0 7075 0 +9 7076 0 4382 0 +7 0 0 2430 2409 +7 0 0 3271 3628 +8 0 0 7078 7079 +9 0 0 4732 7080 +10 7077 0 2401 7081 +7 0 1720 4842 3541 +8 0 0 7083 6907 +9 0 0 7084 1948 +10 0 1715 7085 2340 +11 7073 1409 7082 7086 +8 3854 0 4879 0 +9 922 0 7088 0 +10 623 756 7089 0 +7 2869 0 4099 0 +7 2486 0 3618 0 +8 7091 0 7092 0 +9 7093 0 4382 0 +7 0 0 5042 3628 +7 0 0 4384 3209 +8 0 0 7095 7096 +9 0 0 3406 7097 +10 7094 0 1572 7098 +6 2504 2602 2562 2405 +7 1737 1747 7100 1789 +8 0 0 4950 7101 +9 0 0 7102 1948 +10 0 1715 7103 2340 +11 7090 1409 7099 7104 +7 3310 0 3558 0 +8 7074 0 7106 0 +9 7107 0 4382 0 +7 0 0 3441 2430 +8 0 0 7109 7079 +9 0 0 4732 7110 +10 7108 0 2401 7111 +11 7073 1409 7112 7086 +8 7091 0 6936 0 +9 7114 0 4382 0 +6 2782 2410 2783 2411 +7 0 0 7116 4249 +8 0 0 7117 7096 +9 0 0 3406 7118 +10 7115 0 1572 7119 +11 7090 1409 7120 7104 +12 7087 7105 7113 7121 +7 4094 991 3429 0 +8 6971 0 7123 0 +9 922 0 7124 0 +10 623 756 7125 0 +7 3706 0 6976 0 +7 3706 0 4421 0 +8 7127 0 7128 0 +9 7129 0 4382 0 +7 0 0 3318 3186 +7 0 0 6513 3628 +8 0 0 7131 7132 +9 0 0 4820 7133 +10 7130 0 1572 7134 +7 0 1720 2881 3766 +8 0 0 7136 3073 +9 0 0 7137 1948 +10 0 1715 7138 2340 +11 7126 1409 7135 7139 +7 4983 991 2712 0 +8 5447 0 7141 0 +9 922 0 7142 0 +10 623 756 7143 0 +7 2740 0 4208 0 +7 2895 0 4932 0 +8 7145 0 7146 0 +9 7147 0 4382 0 +7 0 0 2593 3013 +7 0 0 4992 2795 +8 0 0 7149 7150 +9 0 0 4841 7151 +10 7148 0 2401 7152 +7 0 1720 2787 3866 +6 0 2476 0 2429 +7 1737 1747 7155 1789 +8 0 0 7154 7156 +9 0 0 7157 1948 +10 0 1715 7158 2340 +11 7144 1409 7153 7159 +6 2355 977 2384 0 +7 964 973 7161 987 +8 7162 0 7123 0 +9 922 0 7163 0 +10 623 756 7164 0 +7 2840 0 7032 0 +8 7127 0 7166 0 +9 7167 0 4382 0 +7 0 0 4164 2755 +8 0 0 7169 7132 +9 0 0 4820 7170 +10 7168 0 1572 7171 +6 2402 3240 2429 2411 +7 1737 1747 7173 1789 +8 0 0 7136 7174 +9 0 0 7175 1948 +10 0 1715 7176 2340 +11 7165 1409 7172 7177 +8 5486 0 7141 0 +9 922 0 7179 0 +10 623 756 7180 0 +7 4835 0 4127 0 +8 7145 0 7182 0 +9 7183 0 2813 0 +7 0 0 4272 3070 +8 0 0 7185 7150 +9 0 0 4841 7186 +10 7184 0 2401 7187 +8 0 0 7154 7064 +9 0 0 7189 1948 +10 0 1715 7190 2340 +11 7181 1409 7188 7191 +12 7140 7160 7178 7192 +13 6991 7069 7122 7193 +6 2381 977 2444 0 +7 964 973 7195 987 +6 2483 0 2381 0 +7 3618 991 7197 0 +8 7196 0 7198 0 +9 922 0 7199 0 +10 623 756 7200 0 +7 2448 0 4153 0 +8 5127 0 7202 0 +9 7203 0 5133 0 +7 0 0 6223 2755 +7 0 0 6886 1725 +8 0 0 7205 7206 +9 0 0 5137 7207 +10 7204 0 2401 7208 +7 0 1720 3441 3797 +8 0 0 7210 4033 +9 0 0 7211 1948 +10 0 1715 7212 2340 +11 7201 1409 7209 7213 +6 2494 977 2370 0 +7 964 973 7215 987 +7 5391 991 3456 0 +8 7216 0 7217 0 +9 922 0 7218 0 +10 623 756 7219 0 +7 5126 0 6532 0 +7 3730 0 3779 0 +8 7221 0 7222 0 +9 7223 0 5133 0 +7 0 0 6838 3380 +8 0 0 7225 5140 +9 0 0 5137 7226 +10 7224 0 2401 7227 +7 0 1720 2430 3766 +8 0 0 7229 4871 +9 0 0 7230 1948 +10 0 1715 7231 2340 +11 7220 1409 7228 7232 +12 7214 0 7233 0 +7 5126 0 6976 0 +7 2572 0 2741 0 +8 7235 0 7236 0 +6 2374 0 2539 1416 +7 7238 1421 1431 1437 +8 7239 0 0 0 +9 7237 0 7240 0 +7 0 0 6838 2881 +7 0 0 4483 1725 +8 0 0 7242 7243 +9 0 0 4820 7244 +10 7241 0 2401 7245 +8 0 0 5144 4550 +9 0 0 7247 1948 +10 0 1715 7248 2340 +11 5103 1409 7246 7249 +6 2381 977 2370 0 +7 964 973 7251 987 +8 7252 0 5100 0 +9 922 0 7253 0 +10 623 756 7254 0 +7 3730 0 4153 0 +8 7235 0 7256 0 +9 7257 0 3374 0 +6 2504 2504 2562 2562 +7 0 0 7259 4364 +8 0 0 7260 7243 +9 0 0 2901 7261 +10 7258 0 2401 7262 +6 2402 2731 2429 2551 +7 1737 1747 7264 1789 +8 0 0 5144 7265 +9 0 0 7266 1948 +10 0 1715 7267 2340 +11 7255 1409 7263 7268 +12 7250 0 7269 0 +13 7234 0 7270 0 +7 4146 991 2582 0 +8 988 0 7272 0 +9 922 0 7273 0 +10 623 756 7274 0 +7 4682 0 4562 0 +6 2381 0 2494 0 +7 4860 0 7277 0 +8 7276 0 7278 0 +9 7279 0 4245 0 +7 0 0 2947 0 +6 2415 2410 2417 2411 +7 0 0 7282 3145 +8 0 0 7281 7283 +9 0 0 4690 7284 +10 7280 0 1572 7285 +6 2419 2426 2420 2427 +7 0 1720 2880 7287 +8 0 0 7288 2856 +9 0 0 7289 1948 +10 0 1715 7290 2340 +11 7275 1409 7286 7291 +7 3591 991 3228 0 +8 4441 0 7293 0 +9 922 0 7294 0 +10 623 756 7295 0 +7 5391 0 6976 0 +7 2840 0 2999 0 +8 7297 0 7298 0 +9 7299 0 2455 0 +7 0 0 2818 6208 +7 0 0 4945 3070 +8 0 0 7301 7302 +9 0 0 4711 7303 +10 7300 0 1572 7304 +7 0 1720 3004 4271 +8 0 0 7306 3444 +9 0 0 7307 1948 +10 0 1715 7308 2340 +11 7296 1409 7305 7309 +12 7292 7310 0 0 +6 994 977 2492 0 +7 964 973 7312 987 +7 2612 991 3223 0 +8 7313 0 7314 0 +9 922 0 7315 0 +10 623 756 7316 0 +7 2740 0 4562 0 +7 2840 0 3110 0 +8 7318 0 7319 0 +9 7320 0 4776 0 +6 2415 2345 2417 2347 +7 0 0 7322 2755 +7 0 0 2820 4249 +8 0 0 7323 7324 +9 0 0 4338 7325 +10 7321 0 1572 7326 +7 0 1720 2430 3866 +8 0 0 7328 7064 +9 0 0 7329 1948 +10 0 1715 7330 2340 +11 7317 1409 7327 7331 +7 3341 991 4505 0 +8 4744 0 7333 0 +9 922 0 7334 0 +10 623 756 7335 0 +7 3104 0 2747 0 +6 2369 0 2355 0 +7 4835 0 7338 0 +8 7337 0 7339 0 +6 2374 0 2625 1416 +7 7341 1421 1431 1437 +8 7342 0 0 0 +9 7340 0 7343 0 +7 0 0 2517 1725 +6 2403 2415 2405 2417 +7 0 0 7346 4164 +8 0 0 7345 7347 +9 0 0 4800 7348 +10 7344 0 1572 7349 +7 0 1720 3037 6860 +6 2465 3240 2467 2411 +7 1737 1747 7352 1789 +8 0 0 7351 7353 +9 0 0 7354 1948 +10 0 1715 7355 2340 +11 7336 1409 7350 7356 +12 7332 7357 0 0 +13 7311 7358 0 0 +7 6005 991 3596 0 +8 7216 0 7360 0 +9 922 0 7361 0 +10 623 756 7362 0 +7 2386 0 6532 0 +8 7364 0 7256 0 +9 7365 0 4245 0 +6 2402 1722 2404 1724 +7 1576 0 1588 7367 +8 0 0 0 7368 +7 0 0 3354 4364 +7 0 0 5139 2348 +8 0 0 7370 7371 +9 0 0 7369 7372 +10 7366 0 2401 7373 +7 0 1720 3137 4401 +8 0 0 7375 4871 +9 0 0 7376 1948 +10 0 1715 7377 2340 +11 7363 1409 7374 7378 +12 7379 0 0 0 +13 7380 0 0 0 +14 7194 7271 7359 7381 +15 6914 7382 0 0 +16 3811 5154 6195 7383 diff --git a/2019/dogon/metacatacryst.mc b/2019/dogon/metacatacryst.mc new file mode 100644 index 000000000..3aececed1 --- /dev/null +++ b/2019/dogon/metacatacryst.mc @@ -0,0 +1,84 @@ +[M2] (golly 2.0) +#C metacatacryst -- a 52-cell pattern exhibiting quadratic growth. +#C Found by Nick Gotts, December 2000. +$$$$$$$......*$ +4 0 0 1 0 +5 0 0 2 0 +6 0 0 3 0 +7 0 0 4 0 +8 0 0 5 0 +9 0 0 6 0 +10 0 0 7 0 +11 0 0 0 8 +12 0 0 0 9 +13 0 0 0 10 +14 0 0 0 11 +15 0 0 12 0 +16 0 0 13 0 +......*$....**$...*$...*$...*$...*$ +4 15 0 0 0 +$$$$$......*$$......*$ +4 0 0 0 17 +.......*$ +4 0 19 0 0 +5 16 18 0 20 +$$$.*$**$.*$$*$ +4 0 0 22 0 +5 23 0 0 0 +6 21 24 0 0 +7 25 0 0 0 +$$$$$**$.**$.*$ +4 27 0 0 0 +5 0 0 0 28 +$$$$..*$.*.*$...*$....*$ +4 30 0 0 0 +5 0 0 31 0 +6 29 0 32 0 +7 0 33 0 0 +8 26 0 0 34 +9 35 0 0 0 +10 36 0 0 0 +11 0 37 0 0 +12 0 38 0 0 +13 0 39 0 0 +$$$$$$$.*...*$ +..*.*$*..*$*$*$ +4 41 0 42 0 +5 43 0 0 0 +6 0 0 44 0 +$$.......*$$$.....***$ +4 0 46 0 0 +5 0 47 0 0 +.*$*$$*$.*$ +4 49 0 0 0 +5 50 0 0 0 +6 48 51 0 0 +7 45 0 52 0 +8 53 0 0 0 +9 0 0 54 0 +10 55 0 0 0 +11 56 0 0 0 +12 0 0 57 0 +13 0 0 58 0 +14 0 40 59 0 +15 60 0 0 0 +$$..**$.**$..*$ +4 0 62 0 0 +5 0 0 63 0 +6 0 0 64 0 +$$$$.......*$ +$.*$*.*$*$ +4 66 67 0 0 +5 0 0 0 68 +6 69 0 0 0 +7 0 65 0 70 +8 0 0 71 0 +9 0 72 0 0 +10 0 0 73 0 +11 74 0 0 0 +12 0 75 0 0 +13 76 0 0 0 +14 0 77 0 0 +15 0 78 0 0 +16 61 79 0 0 +17 0 14 0 80 diff --git a/2019/dogon/metapixel-parity64.mc b/2019/dogon/metapixel-parity64.mc new file mode 100644 index 000000000..fe797de06 --- /dev/null +++ b/2019/dogon/metapixel-parity64.mc @@ -0,0 +1,5601 @@ +[M2] (OTCAmetapixel: tile-otcamp.pl) +#R B3/S23 +#C this is an OTCAmetapixel tiling which requires Golly. +#C get Golly at http://golly.sourceforge.net +#C +#C OTCAmetapixel unit cell by Brice Due (fall 2005 - spring 2006) +#C for info, base patterns, and a perl script to automate tilings, +#C see http://otcametapixel.blogspot.com +#C +#C USAGE: Speed steps 8^3 - 8^6 are good. Be patient after changing the speed +#C step; the hashlife cache needs time to warm up. Try increasing the maximum +#C hash memory setting if the meta-pattern continues to run haltingly. +#C +#C------------------------------------------------------------------- +#C +#C model pattern: parity64.rle +#C simulated rule: B135 / S135 +#C neighborhood: von Neumann: 01010101 =(NW,N,NE,E,SE,S,SW,W) +#C bbox specified: ,,, +#C generated: Thu Jun 8 01:03:23 2006 +#C +#C------------------------------------------------------------------- +#C +#C Parity rule (B135/S135) for von Neumann neighborhood. Boundry feedback +#C and inital pattern produce nice geometric trends. Reflections from the +#C 64x64 boundry inject the feedback. Initial pattern by Brice. +#C +#C comments extracted from model pattern: +#C +$$$$$$*$*$ +.....*$.....**$$$$$$......**$ +....*.**$....***$.....*$$$$$$ +.......*$......**$.....**$......**$$$$$ +$$*$*$$$$$ +$$$$$$.....**$.....***$ +*$**$**$$$$$$ +$$$$$$$....**$ +...***$...**.*$....***$.....*$$$$$ +$.....**$....**.*$.....***$......**$$$$ +.....**$....****$...**.**$....**$$$$$ +.....**$.....***$....*.**$....***$.....*$$$$ +$...**$..**.**$...****$....**$$$$ +$....**$...***$...**.*$....***$.....*$$$ +...**$..****$.**.**$..**$$$$$ +$$.....**$.....***$....*.**$....***$.....*$$ +$$.......*$$$$$$ +.....*$$$$$$$$ +$.**$**.**$.****$..**$$$$ +$$$....**$...***$...**.*$....***$.....*$ +.**$****$*.**$**$$$$$ +$$$$.....**$.....***$....*.**$....***$ +$.......*$......**$.......*$$$$$ +....***$.....*$$$$$$$ +$*$.**$***$**$$$$ +$$$$$....**$...***$...**.*$ +*$$$$$$$$ +$$$$$$$.......*$ +......**$......**$$$$$$$ +*$*$$$$$$*$ +$$$$$$$*.....**$ +......**$.......*$.......*$$$$$$ +.....***$.......*$$$$$$$ +$$$$$.......*$.....***$....*$ +.**$.*$.*$*$$$$$ +$$$$$$$*$ +..**$..**$$$$$$$ +$$$$......**$......**$$$ +.......*$$$$$$$$ +*.....**$$$$$$$$ +.......*$.......*$$$$$$.......*$ +...**..*$...**$$$$$$$ +.......*$$$......**$......**$$$$ +$$$$$$$......**$ +*$*$.**$***$**$$$$ +....***$.....*.*$......**$.......*$$$$$ +$$$$$....**$...***$...**.**$ +.....*$.....**$$$$$$$ +$......*$$......*$$......*$$......*$ +$*$$*$$*$$*$ +.......*$.......*$$$$$$$ +......**$$$$$$$$ +*$*$$$$$$$ +$$$$$$$....*$ +......*$......**$$$$$$$ +*.*.*.*$$$$$$$$ +$$$$$$*$$ +$$$$$$$..**$ +$$$$$$*$*.....**$ +$$$$*$$$$ +$$$$$$.......*$.......*$ +...**$$$$$$$$ +$$$*$$$$$ +$$$$$*$*$$ +$$$$$$$**$ +..**$$$$$$$$ +......**$.......*$$$$$$$ +$$$$$.......*$.......*$$ +$$$.**$.**$$$$ +$$$$$$$*.*.*.*$ +$*$*$$$$$$ +$$.......*$.......*$$$$$ +.**$$$$$$$$ +$$$.......*$$$$$ +$$$$$*.*.*.*$$$ +$$$$$$$...*$ +*....*$.....**$*$$*$$*$......**$ +$$$$$....**$....**$$ +.....**$$$$$$$$ +....**$$$$$$$$ +$**$**$$$$$$ +$*$*$*$$$$$ +$$*$*$*$$$$ +$$$$*$*$$$ +$$$$$..**$..**$$ +$$$$$$$...**$ +....*$.....*$.....*$******$$$$$ +.......*$$.......*$$$$$$ +$$....***$....*..*$....*$....*$....*$....*$ +..***$$$$$$$$ +$$$$$$$.....**$ +**$.*$*$*$*$$.......*$......**$ +*$$.......*$......**$......**$.......*$$$ +..*...*$..*...*$......*$...*.*$$$$$ +..*$...*$...*$****$$$$$ +...*..*$......*$..*...*$..*...*$......*$...*.*$$$ +...*$$...*$....****$$$$$ +....*$....*$....*$....*$.....*.*$$$$ +....*$....*$.....*.*$$$$$$ +.....**$.....**$$$$$$$ +.....*$$.....*$......**$$$$$ +......*$...*.*$$$$$$$ +.......*$......**$......**$......**$.......*$$$$ +$*****$....*$....*$...*$**$$$ +$...*****$..*$$..*....*$....**$$$ +$....**$....**$$$$$$ +$.....***$....*$$....*$......**$$$ +$.......*$......*$$......*$$$$ +$$$....***$...*..*$......*$..*...*$..*...*$ +$$$......**$......**$$$$ +$$$$....***$....*..*$....*$....*$ +$$$$.......*$......**$......**$......**$ +$$$$$.....**$.....**$$ +....*$$$$$$$$ +.**$.**$$$$$$$ +**$$$$$$$$ +$$*$$$$$$ +$$$*$**$.*$*$*$ +$$$$$$$.....*$ +$$$$$$$....***$ +$$$$$$$.**$ +.*....*$.......*$.*.....*$..******$$$$$ +....***$....*..*$....*$....*$....*$....*$.....*.*$$ +$.******$*.....*$......*$*....*$..**$$$ +$....***$...*..*$......*$..*...*$..*...*$......*$...*.*$ +$$$.......*$.......*$.......*$$$ +.....*.*$$$$$$$$ +**....**$......**$$$$$$$ +*....*$*....**$$$$$$......**$ +.*.....*$$.*.....*$$.*.....*$$.*.....*$$ +....*.*$.....*$$$$$$$ +....*..*$....***$$$$$$$ +.....***$.....*$$$$$$$ +.....*$*....**$**$.*$*$*$$......**$ +.....*$.....**$$$$*$**$.*....**$ +......**$......**$$$$$.......*$.......*$ +$***$..*$..*$.*$$$$ +$...**$...**$$$$$$ +$.......*$.......*$$$$$$ +$$$.....**$.....**$$$$ +$$$$.......*$.......*$$$ +$$$$$....***$...*..*$......*$ +$$$$$......**$......**$$ +$$$$$.......*$.......*$.......*$ +$$$$$$*.....**$*.....**$ +$$$$$$...***$...***$ +$$$$$$....***$....*..*$ +.*$$$$$$$$ +**$**$$$$$$$ +*$.*$.*$**$$$$$ +$.**$.**$$$$$$ +$$**$**$**$$$$ +$$$**$**$$$$ +$$$$.......*$$$$ +$$$$.**$.**$$$ +$$$$$.**$.**$$ +$$$$$**$**$$ +$$$$$$.......*$$ +$$$$$$.*.*$$ +$$$$$$$...***$ +$$$$$$$.*$ +$$$$...**$...**$$$ +***$*...*$*....*$.*...*$$.*...*$*....*$*...*$ +*......*$$$......**$......**$$$$ +*$$$...**$...*$.*.*$.**$$ +.*.*...*$..*$$$$$$$ +.*..*$..***$$$$$$$ +..*.*$..*.*..*$.*...*$*.....**$$$$$ +...***$.....*$$$$$$$ +...***$......*$...***$...*$$$$$ +...**..*$...**$$$$$$.......*$ +...*.*$....*$$$$$$$ +......**$*.....**$*$$$$$$ +......**$.....*$......**$$$$$$ +......**$......**$$$$$$.....**$ +......**$......*$$$$$$$ +......*$......*$.......*$$$$$$ +......*$.......*$$$$$$$ +.......*$......*$......*$......**$$$$$ +.......*$......*$......*$.......*$$$$$ +$.....**$.....**$$$$$$ +$......**$......**$$$$$$ +$.......*$......*$.......*$$$$$ +$$....**$....**$$$$$ +$$....**$.....*$..***$..*$$$ +$$$......**$......*$......*$.......*$$ +$$$$.*.*.*.*$$.*.*.*.*$$ +$$$$..**$..**..**$......**$$ +$$$$...**$*..**$*$$ +$$$$....**$....*$..*.*$..**$ +$$$$.....**$.....**$$$ +$$$$......**$.......*$$$ +$$$$$$....**$....**$ +$$$$$$......**$......*$ +......*$$$$$$$$ +....***$$$$$$$$ +..*$$$$$$$$ +.*$*$$$$$$$ +.*$$.*$$.*$$$$ +**...***$$$$$$$$ +***$$$$$$$$ +$$.**$.**$$$$$ +$$$$..**$..**$$$ +$$$$$.......*$$$ +$$$$$*$$$ +$$$$$$.**$*..*$ +$$$$$$**$**$ +$$$$$$*$***$ +$$$$$$*$**$ +$$$$$$$......*$ +$$$..**$..**$$$$ +****$**$.**.*$...**$$...**$.**.*$.*$ +**.*$*.*.*$*****$**.**$.**$$$$ +**...***$.**.**.*$.**.**$.**.**$.**.**$$$$ +**...***$$..*.*$**...***$*.....*$$$$ +**...**$.......*$$$$$$$ +**$**$$$.**$.**$$$ +**$*.*$..**$***$**$$$$ +*.***..*$..**$$......**$......**$$$$ +*.***..*$....**.*$***.*$.***$$.***$***.*$....**.*$ +*.**$*.**$*$$*$*$*$$ +*.**$...*$.**$$$$$$ +*.*.*.*$*.*.*.*$.**.**.*$*.....**$$$$$ +*.*$.***$.**.*$.**.*$$.**.*$.**.*$*..*$ +*..*..*$*...*.*$.....*$$$$$$ +*...*$.......*$.....*$.....*.*$......**$$$$ +*...*$.......*$$....**$$....**$$.......*$ +*....***$.......*$$$$$$$ +*.....**$......**$$$$$$$ +*.....**$$*.....*$**...***$..*.*..*$.**.**.*$.**.**$.*...*.*$ +*.....**$$$*.....*$**...***$.**.**$..*.*$*.*.*.*$ +*.....**$$$$*.....*$**...***$..*.*..*$..*.*$ +*.....**$$$$$*.....*$**...***$.**.**$ +*.....**$$$$$$*.....*$**...***$ +*.....**$$$$$$$*.....*$ +*.....*$**...***$..*.*..*$***.****$**...***$*.....**$$$ +*.....*$$..*.*$..*.*..*$$$$.......*$ +*......*$**.....*$*$$$$*$**.....*$ +*$**$.**$.*$*$$$$ +*$*$*$**$**$**$$$ +*$*$$*$$.......*$.....***$....*$ +*$*$$$...**$...*$.*.*$.**$ +*$.*$$$$.......*$.....***$....*$ +*$$$**$..*$.*$*$$ +.****$**$*...**.*$*...*$$*...*$*...**.*$**$ +.****$.*****$.....**$....**$$$$$ +.****$.***.***$$......**$......**$$$$ +.****$.**.*$....*$..**$$..**$....*$.**.*$ +.***$*...*$$.....*$*...*$$$$ +.***$.***$*$$$$*$.***$ +.***$$$...*$..***$.**.*$....**$....**$ +.**....*$**$$......**$......**$$$$ +.**....*$..**...*$..*$**$$**$..*$..**...*$ +.**$*.*$*..*$*..**$.*$..**$$$ +.**$.**$..*$..***$.*..*$.**$$$ +.**$.**$$$$$$.**$ +.**$.*$.*$*$$*$.*$.*$ +.**$.*$.*$*$$$**$***$ +.**$.*$.*$*$$$......*$.......*$ +.**$.*$.*$*$$$$....*.**$ +.**$.*$.*$*$$$$......*$ +.**$..*.*$..*..*$..*$...*.*$....*$$$ +.**$..*$....**$....**$.*$..*..*$..***$..*$ +.**$$$..**$..**$$$$ +.*.*$.*.*$.....*$......*$$.**.*$.**$...*$ +.*.*$.*.*$$.......*$$$$$ +.*.*$.*$**$......**$.......*$....***$....*$$ +.*.*$$.*.*$$.*.*$$$$ +.*.*$$$$$$.*.*.*.*$$ +.*..**$******$..****$$$$..****$******$ +.*..**$.*...*$..**.*$....**$$$$$ +.*..**$..**$$$$$$$ +.*..*..*$..*.*$...*$$$$$$ +.*...*.*$$$.*...*$.*...*$$$$ +.*...*$.*.*$$..**.**$....*$$$$ +.*...*$.*...*$*.....*$.......*$$$$$ +.*...*$$.*...*$.**.**.*$.......*$.......*$*.....**$***.***$ +.*.....*$*$$......**$......**$$$$ +.*.....*$.**....*$**$*$$*$**$.**....*$ +.*.....*$.*$.**...*$...***$$...***$.**...*$.*$ +.*.....*$..*...*$$$$$$$ +.*.....*$$.*.*.*.*$$.*.*.*.*$$$$ +.*.....*$$.*.....*$$.......*$$$$ +.*$.***$....*$.***$.*$$$$ +.*$..***$....*$$$$$$ +.*$$.*.*.*.*$$.*.*.*.*$$.*$$ +..*****$..***.**$...**.*$....**$$....**$...**.*$..***.**$ +..*****$..*..*$....*$$$$$$ +..****$.*...*$.*..*$..***$$$$$ +..****$..******$..**..*$....**$$$$$ +..***$.*$..*$.**$$$$$ +..***$..**$***$.*$$.*$***$..**$ +..**.**$.*.*.**$.*...*$..*..*$..***$$$$ +..**.**$..**.*.*$...*...*$...*..*$....***$$$$ +..**$.*$*.....*$.*....*$..***$$$$ +..**$..**$$$*$*$$$ +..**$..**$$$$*$*$$ +..**$..**$$$$$*$*$ +..**$..**$$$$$$*$ +..**$..*$..*.*$...**$$...**$..*.*$..*$ +..**$...*$.*$.**$$.**$.*$.*$ +..**$.......*$......*$$...*$..***$.*..**$.**.**$ +..*.**$..*..*$..***$$$$$$ +..*.*..*$**...***$$$$$$$ +..*.*..*$..*.*$..*.*..*$**...***$$$$$ +..*..**$..*..*$..*.*$...**$$...**$..*.*$..*..*$ +..*..**$...*$....**$$$$$$ +..*$***$$*$$$.....*$.....***$ +..*$..**$...**$****$**$$$$ +..*$..**$...**$.***$.**$.*$$$ +..*$$..*$$..*$$..*$$ +...***$.***$.*$.*..*$..*..*$...**$$$ +...***$...*$$$$$$$ +...***$....**$....**$..***$****$***$*$$ +...***$.....***$.......*$....*..*$...*..*$....**$$$ +...**.*$...**.*$......*$.......*$......**$......**$......**$$ +...**.*$...*..*$....***$$$$$$ +...**.*$...*$....**$.......*$$$$.......*$ +...**..*$...**$$.......*$......**$......**$$.......*$ +...**..*$...**$$$.......*$......*$......*$$ +...**..*$...**$$$$.......*$......**$......*$ +...**..*$...**$$$$$.......*$......*$ +...**..*$...*$$$$$$$ +...**$..*..*$...**$$$$$$ +...**$..*$.*..*$.*...*$.*..*$..***$$$ +...**$...*$$$.**$.*$.*$.*$ +...*.*.*$$...*.*$$...*.*$$...*.*.*$$ +...*..**$...*$...**$.....*$$.....*$...**$...*$ +...*..**$....*.**$$$$...*$..***$.**..*$ +...*...*$***...**$.*$.*..**$..*.**$$$$ +...*...*$*..**..*$..**$***$$***$..**$*..**..*$ +...*...*$.**$$......**$......**$$$$ +...*...*$.....*.*$$..**.**$....*$$$$ +...*$..***$..*.**$$$..*$..*$$ +...*$...*$..*$*$$$$$ +....***$...*..*$..*...**$..*.*..*$...*...*$$$$ +....**.*$....*$....*$.....***$$.....***$....*$....*$ +....**.*$......*$$$$$...*$..***$ +....**$....**$$$$$$$ +....**$....*.**$.....*$.....***$$.....***$.....*$....*.**$ +....*.*$....*$.....*$......**$$......**$.....*$....*$ +....*..*$...**..*$....*..*$.....*$$.....*$....*..*$...**..*$ +....*..*$.....**$$$$$$$ +....*$**..*$..**$***$$***$..**$**..*$ +....*$..***$.*$..***$....*$$$$ +....*$...*$$$$$$$ +....*$.....*.*$$$$$$$ +....*$.....*$......**$$$$......**$.....*$ +....*$$$$.**$$.**$$ +....*$$$$......**$$......**$$ +.....***$$.......*$$$$$$ +.....**$...**..*$...*..**$...*$....****$......**$$$ +.....**$....**$...*..*$...*..*$....*$....*$.....*$$ +.....**$.....**$$$....**$....**$$$ +.....**$.....*$......**$$$$$$ +.....*.*$.....**$$$$$$$ +.....*$....*.*$....*.*$.....*$$$$$ +.....*$......*$......*$$$$......*$......*$ +.....*$......*$......*$$$$$$ +......**$....*$....*.*$...*$....*..*$....*$$$ +......**$.....*$.....**$$$$$$ +......**$......**$*$.*....*$.**....*$**$*$$ +......**$......**$$$$$$*$ +......**$......**$$$$$$.......*$ +......**$......*$...**$...**$.......*$...*..*$....***$......*$ +......**$......*$......*$.......*$$.......*$......*$......*$ +......**$.......*$...*****$...****$$...****$...*****$.......*$ +......**$.......*$.......*$$$$$.......*$ +......**$$$.....**$.....**$$$$ +......**$$$.......*$......*$.....*$......**$$ +......**$$$$$$......**$......**$ +......*$.....*$**$***$..**...*$*.*....*$**$$ +......*$.......*$.......*$$$$.......*$.......*$ +......*$$......*$.......*$$$$$ +.......*$*......*$$$$$$*......*$ +.......*$.*...*$..*.*$..*.*$..*.*$.*...*$**...***$$ +.......*$......*$......*$.......*$$$$.......*$ +.......*$......*$.......*$*......*$**$*$$$ +.......*$......*$$$$......*$.......*$$ +.......*$.......*$..*.*$.*...*$**...***$$$$ +.......*$.......*$.......*$$$$.......*$.......*$ +.......*$$...**..*$$$$...**..*$$ +.......*$$.......*$$.......*$$.......*$$ +.......*$$$.......*$......**$$$$ +$****$****$..**$**$$$$ +$***.**$..*.*..*$......**$$$$$ +$**...**$.......*$$$$$$ +$**$**..**$....**$$$$$ +$**$..*$.*$*$$$**$ +$*$$$$.......*$.....***$....*$ +$.**$.**$$$..**$..**$$ +$.*$.**$.***$...**$..**$..*$$ +$..**$.*$*..**$*..*$*.*$.**$$ +$..*$***$$***$..*$$$ +$..*$*..*$*****$***.**$.**.*$..**$$ +$...**$$.....*$.*...*$.*...*$..*.*$...*$ +$...*$..***$.**.*$.**$.**$.**$$ +$....**.*$.*....**$..**..*$....**$$$$ +$....**$..**..*$..******$..****$$$$ +$....**$.....*$..***$..*$$$$ +$....**$$...*$...*...*$...*...*$....*.*$.....*$ +$....*$.*.*$.*.*$.**.*$...**$$$ +$....*$..*.*$...*.*$...*$$$$ +$....*$....*..*$...*$....*.*$....*$......**$$ +$....*$.....*$..*$*.....**$.**$.**...**$$ +$.....***$.....*$.....*.*$......**$$$$ +$.....***$.....*$$$$$$ +$.....**$.......*$$$$$$ +$.....*$...***$..*$..**$$$$ +$.....*$....***$....*.**$......**$......**$......**$$ +$......**$....****$...*$...*..**$...**..*$.....**$$ +$......**$.....*$.....**$$$$$ +$.......*$*.....**$.**.**$..*.*$**...***$$$ +$.......*$...**..*$...**$$$$$ +$.......*$.....*.*$.....*$......*$.......*$$$ +$.......*$......**$.....*.*$.......*$......**$$$ +$.......*$......*$.....*$......**$$$.......*$ +$.......*$......*$.......*$$$$.......*$ +$.......*$.......*$.......*$$$$$ +$$**...***$**...***$**...**$**...**$*.....**$*.....*$ +$$**$****$...**..*$..**...*$..*....*$$ +$$**$**$$$.**$.**$ +$$*...*$.....*$$*...*$.***$$ +$$*$**$**$.**$.**$***$ +$$.**.**$*.....*$$.......*$..*.*..*$**...***$ +$$.*$$.*.*$$.*.*$$ +$$..***$.*....*$*.....*$.*$..**$$ +$$..**$..*$...***$.....*$$$ +$$..**$...*$...*.*$....**$$$ +$$..*.**$.*..**$.*$***...**$...*...*$$ +$$...**$...*$.*.*$.**$$$ +$$...*.*$..*...*$...*$....****$.......*$$ +$$...*...*$..*.*..*$..*...**$...*..*$....***$$ +$$...*$..***$.*..**$.****.*$..***$...***$ +$$....****$....*..*$.....*$.....*$......**$$ +$$....*$..**.*.*$..*....*$..*...*$...***$$ +$$....*$..*..*$.*$.*$.*$..*..*$ +$$....*$...*.*$...*.*$....*$$$ +$$....*$...*..*$.......*$.......*$.......*$...*..*$ +$$.....***$....****$...**..*$..***$..**$.***$ +$$.....*$....*.*$....*.*$.....*$$$ +$$.....*$.....**$......**$.**..**$$$ +$$......**$....**.*$....*..*$....*..*$.....**$$ +$$......**$.....*.*$.....*$.....***$$$ +$$......**$......**$$$$$ +$$.......*$.......*$......*$......*$.......*$$ +$$.......*$.......*$$**$**$$ +$$$**...***$..*.*..*$*.*.*.**$*.....**$$ +$$$*.....**$.*...*$.**.**$*.*.*.*$*.*.*.*$ +$$$*$.**$***$.*$$ +$$$*$..*$...*$...*$$ +$$$.**.**$*.....*$.**.****$.**.***$*......*$ +$$$.**.**$..*.*..*$**...***$$$ +$$$.**.**$..*.*..*$.*...*.*$**...***$......**$ +$$$.*$.***$....*$.***$.*$ +$$$..**..*$..*.**$...*$...***$$ +$$$..*$..***$.....*$....**$$ +$$$...**$...**$$$$ +$$$...**$....*$..*.****$..**..**$$ +$$$...*$..***$.**.**$....***$$ +$$$...*$$$$...**$ +$$$....***$....**.*$...*.**$...***.*$....****$ +$$$....**.*$.....*.*$.....*.*$......*$$ +$$$....**$....**$$$.....**$ +$$$....**$....*$..*.*$..**$$ +$$$....**$.....**$.*****$.****$$ +$$$....*$..*.**$..*...**$...*...*$....***$ +$$$....*$...**.*$.**...*$.*...*$..***$ +$$$.....**$.....*.*$.......*$.......*$.**$ +$$$.....*$....***$...**.**$..***$$ +$$$.....*$....***$....*.**$...**$...**$ +$$$......**$.......*$.......*$$$ +$$$......*$....***$...*$....***$......*$ +$$$.......*$*.....**$**...***$.**.**$.*...*$ +$$$.......*$......**$...*$****$$ +$$$.......*$......*$$$$ +$$$.......*$.......*$.......*$.......*$$ +$$$.......*$.......*$$$$ +$$$.......*$$.*.*$.*.*$$ +$$$$**$*..*.*$..**.***$$ +$$$$*.....**$*.....**$*.....**$.*...*$ +$$$$.**$...*$$....*$ +$$$$....***$....***$...*.**$...*.**$ +$$$$....**.*$.....*.*$.....*.*$......*$ +$$$$....**$....**$$$ +$$$$....*$..***$.*$..***$ +$$$$.....**$.....*$......*$...***$ +$$$$.....*$....***$...**..*$...**.**$ +$$$$.....*$....*.*$....*.*$.....*$ +$$$$......**$.....*.*$.....*$....**$ +$$$$......**$.....*.*$.....*$.......*$ +$$$$......**$.....*$$....*$ +$$$$......**$......**$.......*$$ +$$$$......**$......**$$**$ +$$$$......**$......**$$*$ +$$$$......**$......**$$.***.***$ +$$$$......**$......**$$.**$ +$$$$......**$......**$$..**$ +$$$$.......*$.....***$....*$....**$ +$$$$$***$*****$*..***$ +$$$$$*......*$**...***$**..*$ +$$$$$.**$.**..**$.....**$ +$$$$$.*$.***$....*$ +$$$$$..**$.***$..*.*$ +$$$$$..*$.*.*...*$.*..*..*$ +$$$$$...**$...**..*$.......*$ +$$$$$....*$...**$..***$ +$$$$$....*$...*.*$*..*..*$ +$$$$$....*$....**$....***$ +$$$$$.....**$.....*$......**$ +$$$$$.....*$....***$...*..**$ +$$$$$.....*$.....***$$ +$$$$$......*$......**$$ +$$$$$.......*$**...***$..*.*$ +$$$$$.......*$......**$......*$ +$$$$$.......*$......*$.....*$ +$$$$$.......*$.......*$.....*.*$ +$$$$$.......*$.......*$......**$ +$$$$$.......*$$.....***$ +$$$$$$.*...*.*$.*...*$ +$$$$$$..***$..******$ +$$$$$$..***$..***$ +$$$$$$..*$.**...**$ +$$$$$$....**$...*$ +$$$$$$....*$..*..*$ +$$$$$$....*$....***$ +$$$$$$.....***$.....*$ +$$$$$$.....**$.....**$ +$$$$$$.....**$.....*$ +$$$$$$.....**$......*$ +$$$$$$.....*$*...*.*$ +$$$$$$.....*$....***$ +$$$$$$.....*$....*.*$ +$$$$$$......*$..*****$ +$$$$$$......*$..**..*$ +$$$$$$......*$......*$ +$$$$$$.......*$...**..*$ +$$$$$$.......*$......**$ +$$$$$$.......*$......*$ +...*...*$$$$$$$$ +...*$***$*$$$$$$ +...*$$$$$$$$ +..**$...*$$$$$$$ +.*.*.*.*$$$$$$$$ +.****$$$$$$$$ +.***$..**$$$$$$$ +.**$**$$$$$$$ +.*$**$$$$$$$ +.*$$**$$$$**$$ +*.*$*.*$.*$$$$$$ +**$**$$$$$$**$ +**$*$$$$$$$ +**$$$$$$$*$ +*$*.*$.**$$$$$$ +*$*$$$$**$*$$ +*$$*$$$$$$ +*$$$$*$.*$*$$ +$.......*$$$$$$$ +$..**$..**$$$$$$ +$.*$**$$$$$$ +$***$..*$$$$$$ +$**$*$*$*$*$$$ +$**$$$*$*$$$ +$**$$$$$$$ +$*$**$***$$$$$ +$*$**$*$$$$$ +$*$*$$*$$$$ +$*$$$$*$$$ +$*$$$$$$$ +$$..**$..**$$$$$ +$$.*$.*$*$$$$ +$$**$**$$$$$ +$$*$.*$$*$$$ +$$$***$**$*$$$ +$$$*$*...*$$$$ +$$$*$*$$$$ +$$$$**$**$$$ +$$$$*$.*$.*$*$ +$$$$$$..**$..**$ +$$$$$$.**$.**$ +$$$$$$**$.**$ +$$$$$$**$***$ +$$$$$$$.....*.*$ +$$$$$$$.....***$ +$$$$$$$...*.**$ +$$$$$$$..*...*$ +$$$$$$$***$ +******$....*$***.**$..*.*..*$......**$$$$ +****$*..**$.*..**$.*..*$..**$$..**$.*..*$ +****$...*$......**$.......*$$$$.....**$ +****$...*$......**$.......*$$$$$ +***...**$.*.....*$$$$$$$ +***...**$$$$$$**$**$ +***$.*$$$$*$......**$.......*$ +***$..**$.**$.*$$.*$.**$..**$ +***$..**$.*.....*$.......*$$$$$ +***$...*$..**$$$$$$ +***$$***$...*$...*$*.**$.*$$ +***$$$$***$..*$*.*$**$ +**.***$**.**.*$......**$**.**.*$**.***$$$$ +**.**.*$**.***$$$$$$$ +**.**..*$**.**$$$$$$*$ +**.**$**.**$$.*.*.*$$**.**$.***$..*$ +**.**$$**.**$.*.*..*$.....**$$$$ +**.*$***$***$$$$$$ +**.*$**..*$....*$..*..*$...**$$$$ +**.*$..**$$..**$..**$$$$ +**..**$..*..*$..***$$$$$$ +**..**$....***$...*..*$.......*$...**$...**$......*$......**$ +**..*$.....*$..*.*$*...*$***$$***$*...*$ +**...***$..*.*..*$..*.*$..*.*..*$.*...*$*.....**$*.....**$*.....**$ +**...***$..*.*$.**.**$*.....**$.......*$$$$ +**...**$.***..*$......*$...*.*$....*$$$$ +**...**$.....***$*...*.**$.*..**.*$.**.**.*$.*...*.*$*....*$.....***$ +**...**$.......*$*.....**$*.....**$*$.......*$$$ +**...*$*....*$..*.*$$*$$$$ +**...*$.***$$.***$**...*$*..*.*$*.....*$.**..*$ +**....**$**.....*$$$$$$$ +**....**$$$$$$$*$ +**....*$*......*$*.*$.**....*$$.**....*$*.*$*......*$ +**....*$......*$**....**$*.*$..**$***$**$$ +**.....*$..*$*.*$***$$$$$ +**$**$**$$$$$.**$ +**$*..*$.*.*$.***$..**$..**$..**$$ +**$.**$*..*$...*$..*$$$$ +**$.*.**$...**$.*.**$**$$$$ +**$..*....*$**...***$....*$.....***$.......*$$$ +**$$**$***$..**$.**$$$ +**$$**$.**$..**..**$..*...**$**$$ +**$$$...**$..*.*$....*$$$ +**$$$$...*$*.*$*.*$**.*$ +*.*****$.***$$.***$*.*****$*......*$***.*$.**..*.*$ +*.**.**$...*.*$..**.**$$$$$***...**$ +*.**.*$$...*$****$$$$$ +*.**..*$....***$$$$$$$ +*.**...*$*.**...*$.**$..*$$$$...**.**$ +*.**$*..*$.***$$$$$$ +*.**$$*.**$*.*..*$....**$$$$ +*.**$$$$$...***$......*$*.*...*$ +*.*.**$....**$$$$...*$*.**$*.*.*$ +*.*.*.*$$$$.*.*.*.*$$.*.*.*.*$$ +*.*.*.*$$$$.*.....*$$.*.....*$$ +*.*.*.*$$$$.*$$.*$$ +*.*.*.*$$$$.......*$$.*.....*$$ +*.*.*.*$$$$$$.*.*$$ +*.*.*.*$$$$$$.....*.*$$ +*.*.*.*$$$$$$.......*$$ +*.*.*$$....*$$....*$$$$ +*.*..*$*.*$*.***$....***$.....**$.....**$*.**.*$*.**.*$ +*.*..*$...**$$$$$$$ +*.*...*$...***$$$$$$$ +*.*$**$.*$$.*$**$*.*$*.*$ +*.*$*.**$*.*$*.*$.*$$$$ +*.*$*.**$$$$$....*$...***$ +*.*$*.*$**$*$$$$$ +*.*$*.*$...*..*$...***$$$$$ +*.*$.**$.*$$$$$.....**$ +*.*$.*$$$$$......**$.....*$ +*.*$..*$*$$*$..*$*.*$...*$ +*.*$..*$.**$$$$$$ +*.*$..*$..**$$$$$$ +*..***$******$..***$$$$$$ +*..**$*..**$$$$$$$ +*..**$*...*$.**.*$...**$$$$$ +*..**$.**$$.**$*..**$**..*$....*$****$ +*..**$...**$$$$$$$ +*..**$...*$.**$$$$$$ +*..*$**.**$.*.**$..****$.....*$....**$....**$....**$ +*..*$*$.*.*$..*$$$$$ +*..*$..*$$..*$*..*$*..**$*..*$.**$ +*...***$.**$.**...**$.*....*$......**$..**$$..***$ +*...**$*...***$......**$......**$......**$*...***$*...**$$ +*...**$..***$$..***$*...**$*.*..**$.....*$*..**$ +*...*.**$.*.*..**$$$$$$$ +*...*.**$.*$..*****$.....***$$.....***$..*****$.*$ +*...*.*$*..*...*$.***...*$$$$...**.**$....*.*$ +*$.*$*$$$$*$.*$ +*...*$*****$$*****$*...*$...*$$$ +*...*$**.**$$**.**$..*$$$$ +*...*$$*...*$.*.*.*$*****$*...*$.*.*$..*$ +*...*$$.....*$$*...*$*...*.*$$$ +*....*.*$*..**$......*$...*$....****$......*$$$ +*....*$.*...*$..***$$$$$*$ +*....*$.....**$$$$$$......**$ +*.....**$*.....**$*.....**$.*...*$..*.*..*$..*.*$..*.*..*$**...***$ +*.....**$.....*$.....**$$$$$$ +*.....**$.......*$.......*$$$$$$ +*.....**$$$$$$$*.....**$ +*.....**$$$$$$$.*$ +*.....*$.*...*.*$..*.*$..*.*$$$*.....**$$ +*......*$**$..*$..*$.*$$$$ +*......*$*......*$$$$$$*......*$ +*......*$$$$$$.......*$$ +*$***$...*$***$*$$$$ +*$***$...*$..**$$$$$ +*$**.**$.*.*.*$.*.**$***$*.*$**$...**$ +*$**$**$$......*$....*$....*$.....**$ +*$**$**$$$$....***$....*..*$ +*$**$*$$$$*$**...**$ +*$**$..*$..*$.*$$$$ +*$*.**$..**$***$.*$$$$ +*$*..**$...**$$$$$$ +*$*.....**$$*.....**$*$.....**$.....***$$ +*$*$**$*$.*$.*$.....***$.......*$ +*$*$*....*$.....***$$.....***$*....*$*$ +*$*$$$$**$*.*$..*$ +*$*$$$$*$*....*$*$ +*$*$$$$.......*$.....***$....*$ +*$*$$$$$$.......*$ +*$.*$*..*$$**.*$..*$$$ +*$.*$.*$**$$$.....**$.....***$ +*$.*$.*$..*$***$$$$ +*$..**$$..**$*...*$.*..*$.*..*$..**$ +*$..*$...*$$$.*$**$$ +*$....*$...*...*$....*$$......*$$$ +*$....*$.....*.*$.....*.*$....*.**$....**$$$ +*$.......*$..**.***$.*..*.*$.*.*.**$......*$.......*$$ +*$$**$**$$$.......*$$ +*$$*$**$..*$**$*$$ +*$$*$*.....**$....****$.....*$......**$$ +*$$*$*.....**$.....*$......**$$$ +*$$*$*$.*$.**$$**$ +*$$*$..*$......*$......*$*$*$ +*$$*$$...*$...*$**$$ +*$$....**$**..**$**$$$$ +*$$$*.**$***$.*$$$ +*$$$..**$..*$...***$.....*$$ +*$$$$..***$..***$..**.*$..**.*$ +*$$$$$...**$..*..*$.**$ +*$$$$$$$......**$ +$$$$$$.*.....*$*.*...*$ +.***...*$**$**..**$....**.*$$$$$ +.***$***.*$....**$*.***$..**$$$$ +.***$*.*****$*......*$***.*$.**..*.*$$$$ +.***$*..*$*.**$..**$$$$$ +.***$*..*$*.*.*$.***$..*$$$$ +.***$*$.***$...*$.......*$$$$ +.***$*$.***$...*$$$$$ +.***$....*$.***$.*$$$$$ +.***$....*$...**$$$$$$ +.***$....*$...**$$$$$$ +.**.**.*$$$$*.*.*.*$*.*.*.*$.**.**$.*...*$ +.**.**$*.....**$$$$$$$ +.**.**$*.....*$.*...*$..***$..***$$$$ +.**.**$..*.*$..*.*$...*$$$$$ +.**.**$$.**.**$*.....*$.*...*$..***$..***$$ +.**.*$..**$..*$$$$$$ +.**..**$.**$$$$$$$ +.**..*.*$*.****.*$..***$.***$$$$$ +.**...**$.**...*$$$$$$$ +.**...**$.**$*.....**$..*$.....*$....*$$...**$ +.**...**$.**$*.....**$..*$.....*$....*$$$ +.**...**$..*.**$...*..*$...*..*$....**$$$.**$ +.**...**$..*.**$...*..*$...*..*$....**$$$$ +.**...**$...*.***$....**$.....*.*$....**.*$.....*$....*$$ +.**...**$...*.***$....**$.....*.*$....**.*$.....*$$$ +.**...**$....*$....*$....*..*$..*...*$$$$ +.**$****$*.**$**$$.....***$....*$.....*$ +.**$*.**$*.***$*****$.*..*$..*$$$ +.**$*.*$.*$**$$**$.*$*.*$ +.**$*..**$*$.*...*$......*$$$$ +.**$.**..**$.....**$$.*$***$*..*$...*$ +.**$.**..**$.....**$$$$$$ +.**$.**....*$.......*$......*$......**$......*$.......*$.......*$ +.**$.**$$$$....**$..*...**$..*....*$ +.**$.**$$$$$$..**$ +.**$.*$.*$*$$$$......**$ +.**$.*$..***$.....*$....*$...*$..*$.*$ +.**$..*...**$**....**$$$$$$ +.**$..*....*$..*$.*$$$$$ +.**$..*$..*$.*$$$$$ +.**$...*$*..**$..**$***$$***$..**$ +.**$......*$...*$....*$$$$$ +.**$.......*$...*$....*$$$$$ +.**$$.**$*..*$*..*$**..*$.****$$ +.**$$.**$...*$....*$...*$***$$ +.**$$$....*.**$..*$..*$......**$....*.*$ +.*.***$.**...*$$$$$$$ +.*.***$...**$...*$$$$$$ +.*.***$.....**$....**$....*$$....*$....**$.....**$ +.*.**$..***$..***$$$$$$ +.*.*.*.*$$.*.*$$.*.*$$...*.*.*$$ +.*.*.*.*$$...*.*.*$$$$.....*$....*.*$ +.*.*.*$$.*.*$$$$$$ +.*.*.*$$...*.*$$...*.*$$.*.*$$ +.*.*..**$*...*.**$.*$..*****$.....***$$.....***$..*****$ +.*.*...*$$.*.*...*$$.*..*..*$$.*...*.*$$ +.*.*$****$.*$$$..*.*$...**$...*$ +.*.*$**.**$.*.*$.*.*$..*$$$$ +.*.*$**.*$.**$..*$$..*$.**$**.*$ +.*.*$$.*.*.*.*$$...*.*.*$$$$ +.*.*$$.*.*.*$$...*.*$$...*.*$$ +.*.*$$.*.*$$.*.*$$.*$$ +.*.*$$.*.*$$.*$$$$ +.*.*$$.*.*$$...*.*.*$$$$ +.*.*$$.*.*$$$$.*$$ +.*.*$$...*.*.*$$$$.*.*$$ +.*.*$$...*.*$$...*.*$$.*.*.*$$ +.*.*$$$$.*$$.*.*$$ +.*.*$$$$$$.***$*..*$ +.*..***$..**$$.....*$....*.*$...**$.....*$$ +.*..***$..**$$$$.....*$.....*$$ +.*..**$*..**$****$$$$$$ +.*..**$..***$...*$$$$$$ +.*..*..*$..**$$$....***$....***$$.....**$ +.*..*..*$..**$$$....*.*$....*.*$.....*$$ +.*..*$**..*$$*...*$$..**...*$.......*$$ +.*..*$**...*$*..*.*$*...*$$$$$ +.*..*$..**$$..**$.*..*$**..*$.**..*$..****$ +.*..*$....*$.*.*$..*$$$$$ +.*...**$.*$$...*..*$...**$$$$ +.*...**$..****$...**$$$$$$ +.*...**$..****$...*.*$....*$...*.*$.....*$...**$.......*$ +.*...**$...***$$...***$.*...**$.*.*..**$*.....*$.*..**$ +.*...*.*$*.....*$$$$$$$ +.*...*.*$*.....*$$$$$$$ +.*...*.*$..***$...*$$$$$$ +.*...*.*$$.*.....*$$.*.....*$$$$ +.*...*$..***$$$$$$$ +.*...*$...*$$$$$$$ +.*...*$$$.*...*.*$**...***$*.....*$$$ +.*$***$...*$*.*..**$*....**$$$$ +.*$***$...*$....*$....*$...*$$...*$ +.*$**.....*$$**.....*$.*$......**$*.....**$$ +.*$*...*.**$.*.*..**$$$$$$ +.*$*$$*$.*$.*$**$$ +.*$*$$$$.*$.**$**.*$ +.*$*$$$$$.......*$$ +.*$.***$..*$.....**$.....**$.....*$...***$$ +.*$.*..*.*$.***...*$$$$$$ +.*$.*...*.*$..***$...*$$$$$ +.*$.*$*$$*$.*$.*$**$ +.*$.*$*$$$.......*$......*$.......*$ +.*$.*$.*$*$$*$.*$.*$ +.*$...***$...*..*$*.*$.....**$.....**$...*$*.**$ +.*$.....*$....***$....*..*$......**$$$$ +.*$$**.**$..*$$$$$ +.*$$$$$$....**$....**.*$ +..****$..*****$......**$.....**$$$$$ +..****$$..****$.*****$**$.**$$$ +..***.*$.....*.*$..*....*$......**$..*..**$....*$$...**$ +..***.*$.....*.*$..*....*$......**$..*..**$....*$$$ +..***$**.*.**$.....**$**.*.**$..***$$$$ +..***$*...*$....*$...*$$...*$....*$*...*$ +..***$.**..*$...***$$$$$$ +..***$.*$..***$....*$$$$$ +..***$..**$$.*$*$*$$..*$ +..***$..*.**$.**..*$.**.**$..*.*$...*$$$ +..***$..*.**$......*$....**$....*$$$$ +..***$...***$$$$$$$ +..***$...**$....*$$$$$$ +..***$...*$$$$....**.*$.....*.*$.....*.*$ +..***$....*$$$$$$$ +..***$$..**$****$$.**$$$ +..***$$$$$$...**$...**$ +..**.***$..**.*$*$*$*$$$$ +..**.***$..**.*$$$$$$$ +..**.***$$..**.***$*..*.*$**$$$$ +..**.**$..**.**$$..**.**$..**.**$..*...*$...***$....*$ +..**.**$..*..*$..*..*$...**$$...**$..*..*$..*..*$ +..**.**$...****$....**$$$$$$ +..**.**$....**$$$$$$$ +..**.**$$$$*$$*$*.**.**$ +..**.*.*$..*....*$..*...*$...***$$...***$..*...*$..*....*$ +..**.*.*$....*$$*$*$$$$ +..**..**$..**$$$$$$$ +..**..*$..*...*$..*.**$..**$$$$$ +..**...*$.*.*$.*.....*$.**$......*$.....*$$$ +..**...*$......**$$$$$$$ +..**$***.*$***$.***$$$$$ +..**$*.***$....**$***.*$.***$$.***$***.*$ +..**$*.*$**$$**$*.*$..**...*$***....*$ +..**$*..**$*..*$.**$$.**$*..*$*..**$ +..**$.**.*$***.**$*****$*..*$..*$$*$ +..**$.**.*$***.**$*****$*..*$..*$$$ +..**$.*$*..*$*...*$*..*$.***$$$ +..**$..**$$$...*$..***$.*..**.*$.*...*.*$ +..**$..**$$$$$$..**$ +..**$..*.*$..*$$$$$$ +..**$..*.*$....**$...**$$$$*$ +..**$..*.*$....**$...**$$$$$ +..**$..*.*$....*$....**$$$$$ +..**$...*$..**$.*.**$$$$$ +..**$...*$$$....**.*$.....*.*$.....*.*$.....*.*$ +..**$.....*$...**$...**$*..**$...**$*$****$ +..**$$..**$..*.**$.....***$...*****$$$ +..**$$$$......**$......**$$$ +..*.**$...**$....*$$$$$$ +..*.*.*$*$$$...**.**$.*..*.*$.***...*$$ +..*.*.*$$..*...*$$..*.*.*$$$$ +..*.*.*$$..*$$..*$$..*$$ +..*.*.*$$......*$$..*.*.*$$..*$$ +..*.*.*$$......*$$..*.*.*$$$$ +..*.*.*$$$$$....*$$....*$ +..*.*$.*...*$**...***$$$$$$ +..*.*$.....*$**..*$....*$$$$$ +..*..**$...**$$...**$..*..**$.***..*$.*....*$.*****$ +..*..*.*$.....*.*$...***.*$.***$.**$.**$..*.**.*$..***$ +..*..*$*.*...*$.*.....*$$$$$$ +..*..*$..**.**$....**$$$$$$ +..*..*$..*..**$..*..*$...**$$$$$ +..*..*$..*..*$.**.**$..**$$$$$ +..*...**$***...**$$***...**$..*...**$..**$*..*****$...***$ +..*...**$*$.**$**$$$$$ +..*...**$....**$$$$$$$ +..*...*$$..*.*.*$$$$$$ +..*....*$$***$***$.*$$$$ +..*....*$$..*....*$$..*....*$$..*....*$$ +..*....*$$..*....*$$..*$$..*$$ +..*$*****.**$*.***.**$**$*.*$.**$$$ +..*$***$.*$*$$*$.*$***$ +..*$.*.*...*$*...***$*..*$.***$..*$**$*......*$ +..*$.*$*$$$**$..*$.*$ +..*$.*$.*$*$$*$.*$.*$ +..*$.*$$.*$..*$..*$***$$ +..*$..***$.....*$..***$..*$$$$ +..*$..**.**$*..**.*$*.**$***$$..*$*...**$ +..*$..**$.*.*$$$*$*$.*$ +..*$..**$...**$..**$.**$$$$ +..*$..*.**$.....*$....*$$*****$.****$...*$ +..*$..*$**.....*$.......*$$$$$ +..*$..*$*.*$.*$.....**$.....***$....*.**$....***$ +..*$..*$.*.....*$$$$$$ +..*$..*$.*$$.*$..*$..*..**$.*...**$ +..*$...***$.*.***$*...**$$$$$ +..*$...***$.....***$.......*$.......*$$$$ +..*$.....*$..**.*$$$.....*.*$.....***$......*$ +..*$$**$.***$..**$..**$*.*$***$ +..*$$..*.*.*$$..*...*$$..*.*.*$$ +..*$$..*$$..*$$..*....*$$ +..*$$..*$$$$$*.*.*$ +..*$$$.**$.**$$$$ +...*****$..*....*$...***.*$.....*.*$$$$$ +...****$..**...*$..*$..****.*$..**$..**.*$....***$....***$ +...****$...*...*$....*..*$....***$$$$*$ +...****$...*...*$....*..*$....***$$$$$ +...***$*.**..*$*.*...*$*.*.*$$...**.**$.....*$$ +...***$..*...*$..*....*$..**.*.*$....*$$$.**$ +...***$..*...*$..*....*$..**.*.*$....*$$$$ +...***$...**.**$....****$......*$.......*$$$$ +...***$...*..*$...**.*$...**$$$$$ +...***$...*$..*.**$..**..*$$$$.......*$ +...***$...*$..*.**$..**..*$$$$$ +...***$....**$.....*$$$$$$ +...***$....*$$$$...**$...**$$ +...***$....*$$$$$$$ +...***$$$$$$$...**$ +...**.**$......**$..*****$.*.*.*$......*$.......*$.......*$$ +...**.**$......**$..*****$...*.*$......*$.......*$.......*$$ +...**.*$..***.**$..*****$..*..*$....*$$$.....*$ +...**.*$..*$...**.*$.....***$$$$$ +...**.*$...*..*$...***$$$$$$ +...**.*$....*.*$.....**$$$$$$ +...**..*$..***$..*..*$.*$....**$....**$..*$.**$ +...**..*$...*...*$...*.**$*..**$*$$$$ +...**..*$...*...*$...*.**$...**$$$$$ +...**..*$....***$.....*$$$$$$ +...**$.**$$$$$$*$ +...**$...**$$$*.....**$*.....**$.**$.**...**$ +...**$...**$$$..*..*$..*$......*$.....**$ +...**$...**$$$$$$...**$ +...**$...**$$$$$$$ +...**$...*.*$.....**$....**$$$.......*$$ +...**$...*$....***$......*$$$$$ +...**$....*.**$....***$.....*$$$....**$....**$ +...**$.....*$...*..*$..*...*$...*..*$...***$$$ +...**$$...**$..*$..*.**$..****$$$ +...**$$$$.*$*.*$.***$..*$ +...**$$$$..*$.**$.*.*$.*$ +...**$$$$...**$*..**$*...****$.....***$ +...**$$$$....*$...***$..*$.*.**$ +...*.**$....***$.....*.*$.....***$......**$$$$ +...*.*.*$$**.**$..*$$$$$ +...*.*.*$$...*.*.*$$...*.*$$...*.*$$ +...*.*.*$$...*.*.*$$$$....*$...*.*$ +...*.*.*$$$$....*$...*.*$...*.*$....*$ +...*.*$..*$..*..*$..*.*$.**$.**.**$.*..**$..***$ +...*.*$...***.*$.......*$*......*$*.*$*.*..**$....***$.......*$ +...*.*$...*$..**$$$......**$......*$$ +...*.*$.....*$.....**$$$$$$ +...*.*$......*$...*..*$....*.*$......**$...**.**$...**..*$....***$ +...*.*$$.*.*$$...*.*$$...*.*$$ +...*.*$$...*.*.*$$...*.*$$...*.*$$ +...*.*$$...*.*$$.*.*.*$$.*.*$$ +...*.*$$...*.*$$...*.*.*$$...*.*.*$$ +...*..*$...*..*$....**$$....**$...*..*$...*..*$...**.**$ +...*...*$***$.*$$$$.**$.**$ +...*...*$...*...*$....***$$$$$$ +...*...*$....*.**$$$......**$......**$$$ +...*$***$.*$$$$$$ +...*$.**$**$$$$$$ +...*$.**$$.**$...*$**.*$****$$ +...*$.*..*$*$*$*$.*..*$.***$$ +...*$..**$...*..*$....***$....***$$$$ +...*$..**$$$$$.......*$.......*$ +...*$..*.*$.*$.*..*$.*.*$**$**.**$*..**$ +...*$..*.*$.....*$..*..*$...*.*$.....**$..**.**$..**..*$ +...*$..*..*$.**..*$..*..*$...**$$$$ +...*$..*..*$......*$......*$......*$..*..*$...***$$ +...*$..*$...***$.....*$$$$$ +..**$..*$...***$.....*$$$$$ +...*$..*$...*$....**$$....**$...*$..*$ +...*$...***$......*$...***$...*$$$$ +...*$...*$***$.*$......**$.......*$......*$$ +...*$...*$.....***$$$$$.....**$ +...*$....****$.......*$$.......*$....****$...*$..*...*$ +...*$....***$$$$$$$ +...*$....**.*$$$$...*$..**$.*.**$ +...*$....*..*$.....***$.......*$$$...**$...**$ +...*$....*$..***$$$$*$*$ +...*$....*$$...*$***$$***$...*$ +...*$.....***$....*..*$$....**$....**$.......*$.......*$ +...*$......*$.**$*.....**$***...**$$***...**$*.....**$ +...*$.......*$.**$*.....*$***...**$$***...**$*.....*$ +...*$$....**$$$$......*$....**$ +...*$$$$...**$...**$$$ +...*$$$$$$..**$..**$ +....***$...***$$$$$$$ +....***$...**..*$...*..*$*.*....*$*......*$...*.*.*$$$ +....***$...**..*$...*..*$..*....*$.......*$...*.*.*$$$ +....***$...*..**$...***$$$$$$ +....***$....**$....*$$$$$$ +....***$....*$...*.**$...**..*$$$$$ +....***$....*$$$.*$**$$$ +....***$......*$$$$$$$ +....***$.......*$......**$$$$$$ +....**.*$.**.**.*$.**..*.*$..***$...*$$$$ +....**.*$.....**$$$$$$$ +....**.*$.....*.*$.....*.*$......*$$$$$ +....**.*$.....*.*$......*$$$$$.*...*$ +....**.*$.....*$.....*$......**$$......**$.....*$.....*$ +....**.*$$....**.*$..*..*.*$..**$$$$ +....**.*$$$.......*$.......*$$$$ +....**$*.***$..**$$$$$$ +....**$*...**$.*...*.*$..*.****$..**..*$..**$.*$*$ +....**$*....*$*$$......**$.......*$.......*$.......*$ +....**$.**.*$..***$...*$$$$$ +....**$.*...**$**....**$$**....**$.*...**$....**$.....*$ +....**$..**.**$..*..*$..*..*$...**$$...**$..*..*$ +....**$..*...*$.*....**$.*.....*$$..*....*$..**.*.*$$ +....**$...**$....****$....*.**$..**$..***$.*...*$*.....*$ +....**$....**.*$$$$$$....**.*$ +....**$....**$$....*..*$.....***$$*$*$ +....**$....**$$$...**$...**$$$ +....**$....**$$$$***$....*$....*$ +....**$....**$$$$**$***$..*$ +....**$....**$$$$$*.*$$ +....**$....**$$$$$$....**$ +....**$....*$..*.*$..**$$$$$ +....**$.....**$....*$$$$$$ +....**$.....**$......*$$......*$.....**$....**$.....***$ +....**$.....*$......**$$$$$$ +....**$.....*$$$......**$.......*$.......*$.......*$ +....**$......*$....*..*$...*...*$....*..*$*...***$*$$ +....**$......*$....*..*$...*...*$....*..*$....***$$$ +....**$$....**$...*..*$...*..**$..*..**$..****$$ +....**$$$.*$**$$$$ +....**$$$.....**$.....**$$$$ +....**$$$$......*$......**$.....*.*$.......*$ +....**$$$$$$$....**.*$ +....*.*$...**.**$$$$$$$ +....*.*$....*..*$..*....*$.*.....*$..*...*$...**$$$ +....*.*$.....*$$$...*.*.*$$.*.*.*.*$$ +....*..*$.....**$$.....**$....*..*$....*..*$...**.**$....**$ +....*..*$.....**$$.....**$....*..*$....*..*$....**.*$......**$ +....*$*.**.**$*.**.**$....*$*.**$$$$ +....*$*..*$..**$$$$$$ +....*$.***$.***.*.*$.**...*$$$$$ +....*$.*.*$.*.*$.**.*$...**$$$$ +....*$..***$.*$.**$$$$$ +....*$..*..*$..*****$..***.**$...**.*$....**$$....**$ +....*$...*.*$...*.*$....*$$$...*.*.*$$ +....*$...*.*$...*.*$....*$$$$*.*.*.*$ +....*$...*.*$...*.*$....*$$$$$ +....*$....**.*$$....**.*$......*$$$$ +....*$....**$...**.*$...**.*$...***$...***$$$ +....*$....**$.....**$.*.***$...**$...*$$$ +....*$....**$$$$$$$ +....*$....*$...*$***$.*$$$$ +....*$....*$.....*$$.....*$....*$....*$.....*$ +....*$.....***$.......*$$$$$$ +....*$.....***$$$$$$$ +....*$.....**$.***..**$...**$.*..*$*.*.*$....*$..*.***$ +....*$.....*.*$.....*.*$....*.**$....**$$$$ +....*$......**$*****..*$*..***$**$$$$ +....*$$....*$...*$...*...*$...***$$$ +....*$$....*$$....*$$....*$$ +....*$$$.**.*$..***$...*$$$ +.....***$...*$...*$*$*.....**$$*.....**$*$ +.....***$....*..*$....*$......*$$...**.**$.....*$$ +.....***$....*$.....***$.......*$$$$$ +.....***$.....**$.....*$$$$$$ +.....***$......*$$$$$$$ +.....***$.......*$$$$$$*$ +.....***$.......*$$$$$$...**$ +.....***$.......*$$$$$$.....**$ +.....***$.......*$$$$$$.......*$ +.....***$$.......*$$$$$.....*$ +.....**$**..**$$$$**..**$.....**$....**$ +.....**$...*..*$...*.*$...***$$$$$ +.....**$....*.*$...**.*$....**$.....*$$.....*$....**$ +.....**$....*..*$....*..*$....**.*$......**$$$*$ +.....**$....*..*$....*..*$....**.*$......**$$$$ +.....**$....*..*$.....**$$$$$$ +.....**$.....**$*.**.*$...***$....*$$$$ +.....**$.....**$*.*$...*..*$...***$$$$ +.....**$.....**$$$$**.***$**.**.*$......**$ +.....**$.....**$$$$.......*$.......*$......*$ +.....**$.....**$$$$$*$*$ +.....**$.....*.*$.....*$.....**$......**$.......*$$$ +.....**$......*$.......*$.......*$$.......*$.......*$......*$ +.....**$......*$.......*$.......*$$$..*.**$***.**$ +.....**$.......*$$.......*$.......*$$$..*$ +.....**$$......**$$$$$$ +.....**$$$$...*$....*.*$....*.*$...*.**$ +.....**$$$$$$$....*$ +.....*.*$....**.*$$$$$..***$.*$ +.....*.*$....*$.....*$......**$$$$......**$ +.....*.*$.....**$*$*$*$$$$ +.....*.*$.....**$*$$$$*$$ +.....*.*$.....*.*$...*.*.*$....**.*$$$$..***$ +.....*.*$.....*.*$...*$*.*$*$....*.**$......**$.....*$ +.....*.*$.....*.*$...*$..*$$....*.**$......**$.....*$ +.....*.*$......*$$$$$$$ +.....*.*$.......*$.......*$$$$$$ +.....*.*$$.....*.*$$.....*.*$$$$ +.....*.*$$$$$*$*$$ +.....*$*....**$**$.*$*$*$$$ +.....*$*....**$*.....*$*****..*$....**$*.*..*$...*.*$..*$ +.....*$...*..*$*.*$*.*$*.*$...*..*$...***$$ +.....*$....***$...**.*$$$*.....*$*.....*$$ +.....*$....***$...**.*$$$......*$......*$$ +.....*$....**$.......*$.....**$$$$$ +.....*$....*.*$....**.*$.......*$.......*$$$$ +.....*$....*..*$$$$....*..*$.....***$$ +.....*$....*$....*$$....*$....*$.....*$.......*$ +.....*$....*$.....*.*$$$$$$ +.....*$.....**$......**$.....*$$$$$ +.....*$.....**$$$$*$**$.*$ +.....*$.....*.*$......**$$$$$$ +.....*$.....*$.....**$.......*$$.......*$.....**$.....*$ +.....*$.....*$$.....*$.....*$*.....*$$$ +.....*$......**$$$.....**$.....**$$$ +.....*$......**$$$$$$...*$ +.....*$......**$$$$$$$ +.....*$......*$.......*$$$$$$ +.....*$$*$*$*..*$...***$......*$...***$ +.....*$$...***$....**.*$.....***$......*$$$ +.....*$$...**$$$$..*$$ +.....*$$....*$.....*$$$$$ +.....*$$.....***$*.**.**$...***$....*$$$ +.....*$$......**$....***$....**$....**$*....*.*$*....*.*$ +.....*$$......**$$$$$$ +.....*$$$$....**$....**$$$ +......**$**$*$.***$...*$$$$ +......**$*...**.*$.*.*...*$.*.*..**$*...***$.....*$$$ +......**$*...*.*$*..*..*$......*$...*.*$....*$$$ +......**$*......*$*......*$$$$$$ +......**$..**..**$..**$$$$$$ +......**$....*.*$...*..*$......*$...*.*$....*$$$ +......**$.....**$......*$.......*$$.......*$......*$.....**$ +......**$.....*.*$....**.*$.....***$......*$.......*$$$ +......**$.....*$.....**$$$**$.*$.**.*$ +......**$.....*$.....*$....*..*$....****$$$...**$ +......**$.....*$.....*$....*..*$....****$$$$ +......**$......**$.......*$$.......*$......*$.......*$.......*$ +......**$......**$$$$*$*$$ +......**$......**$$$$$.......*$$ +......**$......**$$$$$$.**$ +......**$......**$$$$$$......**$ +......**$......*$.......*$$$$$$ +......**$.......*$..**..**$$$$..**..**$.......*$ +......**$.......*$.......*$*$*$$$$ +......**$.......*$.......*$$$$$*$ +......**$$......**$*.....**$*$*$$$ +......**$$......**$.*....*$.*$.*$*$$ +......**$$......**$....*..*$....**$$$$ +......**$$$.......*$.......*$$$$ +......**$$$$......**$...****$...*****$$ +......**$$$$$$....***$....***$ +......*$.*...*$*$*..**$.**$..***$$..***$ +......*$..**..*$..**...*$$$$$$ +......*$...***$...*$$$$$$ +......*$....***$...*$....***$......*$$$$ +......*$....*.*$....**$$$$$$ +......*$.....**$....*.**$....*.**$.....***$.....***$$$ +......*$.....*.*$.....*.*$....**.*$$$$$ +......*$.....*$....*$...*$..*$...***$......*$.....**$ +......*$.....*$.....*$.....***$$$$$ +......*$.....*$......**$$$.......*$......*$.....*$ +......*$.....*$......*$......*$$$$......*$ +......*$.....*$......*$......*$$$$$ +......*$......**$.....*.*$.....*.*$.....**$$$$ +......*$......**$$......**$......*$$$$ +......*$......*$.....**$$.....**$......*$....*$....**$ +......*$......*$.....**$$$$$$ +......*$......*$.......*$$*$$$$ +......*$......*$$$$$.......*$$ +......*$.......*$$$$.......*$......*$.......*$ +......*$.......*$$.......*$......*$.....*$......*$.......*$ +......*$.......*$$$$.......*$......*$.......*$ +......*$.......*$$$$$$...**$ +......*$$..*.*.*$$$$$..*...*$ +......*$$$$$.......*$......**$.....*$ +......*$$$$$.......*$......*$......**$ +......*$$$$$$*$*$ +......*$$$$$$*$.*$ +.......*$*.**$*.**$..**...*$......*$......*$.......*$$ +.......*$*......*$.*$.*$$$$$ +.......*$*$$*$.......*$...*$...*$**$ +.......*$..**$.*$..**...*$......*$......*$.......*$$ +.......*$....****$...*$..*...*$...*.*$$$.....**$ +.......*$....****$...*$..*...*$...*.*$$$$ +.......*$....***$....*$$$$$$ +.......*$....**.*$...*..*$...*..*$....**$*.....**$*......*$$ +.......*$....**.*$...*..*$...*..*$....**$......**$.......*$$ +.......*$....**$.....*$......*$......**$$......**$......*$ +.......*$.....*.*$.....**$**$$$.*$*$ +.......*$.....*.*$.....**$*$$*$***$..*$ +.......*$.....*.*$.......*$$$$$$ +.......*$......**$....***$....***$....***$......**$.......*$$ +.......*$......**$......*$$$$$.......*$ +.......*$......**$$$$......**$......**$$ +.......*$......**$$$$$$$ +.......*$......*$.....**$......**$.......*$$$$ +.......*$......*$.....**$......*$.......*$$$$ +.......*$......*$.....*$.....*.*$.......*$$$$ +.......*$......*$......*$......**$$$$......**$ +.......*$......*$.......*$$$$$$ +.......*$......*$$$$$$..**$ +.......*$.......*$......*$.......*$$.......*$......**$......**$ +.......*$.......*$$$...**$....*$....*.*$.....**$ +.......*$.......*$$$$$$......**$ +.......*$$...**$..*.*$..*$.**$$$ +.......*$$.....**$$$**.**$.*.*$**.**$ +.......*$$.....*$......*$$$$......*$ +.......*$$.......*$....****$...*$..*...*$...*.*$$ +.......*$$.......*$.....*$.....*.*$....*$.....*$.....*$ +.......*$$.......*$......*$.....**$......*$.......*$$ +.......*$$.......*$......*$.....*$......*$.......*$$ +.......*$$.......*$......*$......*$......*$.......*$$ +.......*$$.......*$.......*$$$$$ +.......*$$.......*$$....**$....*$$.....*$ +.......*$$.......*$$.......*$$$$ +.......*$$.......*$$$$$.**$ +.......*$$$**$**$$*$$ +.......*$$$*$**$*.*$$$ +.......*$$$.**$.**$$$$ +.......*$$$..*$.**$$$$ +.......*$$$....**$.....*$..***$..*$$ +.......*$$$......**$......**$$......**$*.....**$ +.......*$$$$.......*$......*$......*$.......*$ +.......*$$$$.......*$......*$.......*$$ +.......*$$$$$....***$....*..*$....**.*$ +.......*$$$$$....**$...*..*$......**$ +.......*$$$$$.....***$....*$....*$ +.......*$$$$$$..*.**$***.**$ +.......*$$$$$$...**$.*.**$ +$***...**$*.....*$.**$.......*$...*$....*$$ +$***$..*$..*$.*$$$....**$ +$***$...*$*.**$*.*$$*.*$*.**$ +$**$**$..*$.**$..*$.*$.*$ +$**$*.*$..*$..**$$$$ +$**$*..*$......**$......**$..**$$$ +$**$$**$$....*$....*$***$ +$*.**$*.*$*.*$.*$$$$ +$*.*.*$$*...*$$*.*.*$$*...*$ +$*.*.*$$*$$*.*.*$$$ +$*.*.*$$....*$$*.*.*$$....*$ +$*.*.*$$$$$*.*.*$$ +$*..**$*..**$*$$$$*$ +$*..*.*$.**...**$$$**$**$$ +$*..*$*$.**$$$.....**$.....***$ +$*...**$.*.***$...***$..*$**$$**$ +$*...*$*..*.*$**...*$.*..*$.***$$.***$ +$*...*$*...**$**...**$.*****$.***$$$ +$*...*$$*.*.*$$$$$ +$*...*$$*...*$$*...*$$*.*.*$ +$*....**$**...**$*$$$$*$ +$*.....**$.*...*.*$..*..*$...*.*$....*$$$ +$*.....**$.*...*$*...*$.....*.*$$$$ +$*.....*$**...***$.**.**.*$.......*$.......*$*.....**$***.***$ +$*.....*$**...***$.**.**.*$.......*$$.......*$$ +$*$*..**$...**$$$$$ +$*$*$*$$....**$...***$...**.*$ +$*$*$$$.......*$......**$$ +$*$.**$***$**$$$....***$ +$*$.*$.**$.*$*$$$ +$*$......*$......**$$......**$......*$*$ +$*$$*.*.*$$....*$$*.*.*$ +$.***$*...*$*....***$**.*.***$..*...**$$$ +$.***$.*.*$.*.*$..*.*$....*$$$ +$.***$...*$..*$......**$......**$$$ +$.**..**$......**$.....**$.....*$$$.**$ +$.**..**$......**$.....**$.....*$$$$ +$.**...*$.***.*.*$.***$....*$.....***$$.....***$ +$.**$.**$$$**$**$$ +$.**$.**$$$$$....**$ +$.**$.*.*$...*$...**$$$$ +$.**$...*$....*$...*$.*$.*$*$ +$.**$$.**$...*$*..*$*..*$.**$ +$.*...*$*...***$......**$..**..**$*.**$$$ +$.*....*$*.*..*.*$*.*.*$.*...**$$**....*$......*$ +$.*$***$*..*$...**$.*.*$.**$$ +$.*$*.**...*$$..*.*.*$*...*.*$*..**.**$.***...*$ +$.*$*.**$$*$..*$..*$**$ +$.*$*.*$*.*$*.**$$$....*$ +$.*$*.*$*.*$*.**$$$$ +$.*$*..*$...*$..*.**$**...*$******$.***$ +$.*$.***$....*$...*$$$$ +$.*$.***$....*$...*$$$$ +$.*$.***$....*$...*$$$$ +$.*$..*$..*$.**$*$$*$ +$..***.**$.*.**.**$**$.*.**.**$..***.**$$$ +$..***$.*...*$.**.**$..*.*$$..*.*$.**.**$ +$..***$..**$....*$$....**$....****$....***$ +$..**$*...**$*....*$*...**$..**$$$ +$..**$.**.**$..*..*$..*..*$...**$$...**$ +$..**$..**...*$.......*$$$$.......*$ +$..**$..*.**$..*...*$..**..*$...***$....*$$ +$..*.*.*$$......*$$......*$$......*$ +$..*...*$$..*.*.*$$......*$$......*$ +$..*$.*..*$*****$*.***$*.**$.**$$ +$...**.**$...*...*$....***$.....*$$$$ +$...**$.****$.*$.*....*$.....**$......**$$ +$...**$.**.*$*...*$*..**$.***$..*$$ +$...**$..**$....*$$$$$ +$...**$..*..*$.*..*$.*$.***$...***$....**$ +$...**$..*..*$..*..**$..*..*$....*$$....*$ +$...**$...**$$$..**$..**$$ +$...**$...*$....***$......*$$$$ +$...*.*$***...**$.*.....*$$$$$ +$...*...*$.*..*..*$..**...*$..*...*$......*$.......*$$ +$...*...*$....***$$....***$...*...*$$..*$ +$...*$**...*$**.*.**$......**$**.*.**$**...*$...*$ +$...*$.***$*$.***$...*$$$ +$...*$..***$.*..*$.**$$$$ +$...*$..**$.*$..**.*$...***$$...***$ +$...*$..*.*$..*.*$.**.**$$$$ +$...*$...**$.*.***$.....**$....**$....*$$ +$...*$...**$..*.**$..*.*$..**$$$ +$....***$....*$....*.*$.....**$$$$ +$....**.*$**..**$**$.***...*$..*...*$$..*...*$ +$....**$...*..*$....*..*$.......*$.....***$...***$...**$ +$....**$....**$$$...**$...**$$ +$....**$....**$$$.....**$.....**$$ +$....**$.....*$.....*.*$......**$$$$ +$....*.*$....**.*$.......*$.......*$$$$ +$....*$...**$..**.*$...*.*$....**$$$ +$....*$...*.*.*$.**..*.*$.**$.**..*.*$...*.*.*$....*$ +$....*$...*.*$*.*...*$*.*...*$......*$$....**$ +$....*$...*.*$...*.*$..**.**$$..**.**$$ +$....*$...*$$$$$$ +$....*$.....*.*$.....*.*$....*.**$....**$$$ +$....*$$....*$$....*$$$ +$.....**$*.....*$*....*$....***$.*.**.**$...*$*..***$ +$.....**$.**..**$.**$$$$$ +$.....**$....*.*$....*$...**$$$$ +$.....**$.....**$....*..*$...*.**$...*.**$$...*.**$ +$.....**$.....**$$**$..*...**$..**..**$.**$ +$.....**$.....*.*$....*..*$...**..*$......*$....**$$ +$.....*$*...***$**.**..*$.*.*...*$.*.*.*$$*...**.*$ +$.....*$....**.*$...**.**$...***.*$...***$$$ +$.....*$....*.*$...**.**$.......*$......**$$$ +$.....*$....*$$.....*$......**$$......**$ +$.....*$.....***$$.......*$$$$ +$.....*$.....*.*$......*$$.......*$$$ +$.....*$......*$.**$.*.....*$.*.*$..**...*$$ +$......**$..**..**$..**$$$$......*$ +$......**$...*..**$***..*$***.**$....**.*$......*$*$ +$......**$....****$...**$....**$.....*$$.....*$ +$......**$.....*$....*.*$...***.*$...***$$$ +$......**$.....*$....*$....*.*$.....*$$$ +$......**$.....*$......**$$$$$ +$......**$......**$$$.....**$.....**$$ +$......**$......**$$$$.....***$.....***$ +$......**$......**$$$$.....**$.....**$ +$......**$......**$$$$$$ +$......**$......*$$$$$*$ +$......**$.......*$.......*$$$$$ +$......*$.....*.*$....*$....*$....*$$.....**$ +$......*$......**$.....*.*$$$$$ +$......*$......*$......*$.......*$$$$ +$......*$.......*$.......*$.......*$......*$......**$$ +$......*$$......*$$......*$$$ +$......*$$$$$..*.*.*$$ +$.......*$.**....*$.......*$......*$......*$.......*$$ +$.......*$.....*$.....*$....*$.....***$$$ +$.......*$......**$.....**$.....**$......*$.......*$$ +$.......*$......**$.....*$.....*$.......*$$....**.*$ +$.......*$......**$.......*$$$$.......*$ +$.......*$......*$.....***$....**.*$.....*.*$......**$$ +$.......*$......*$......*$.....**$$.....**$......*$ +$.......*$......*$......*$......*$$.......*$$ +$.......*$.......*$$$......**$......**$..**$ +$.......*$$$......*$.......*$.....***$$ +$.......*$$$$$*$*$ +$.......*$$$$$......*$.....***$ +$.......*$$$$$$....*..*$ +$.......*$$$$$$....*$ +$$*****$***.***$....****$....*$.....**$......**$ +$$***$.*.**$...**$.*.**$***$$ +$$***$..*$.*$.*$*$$ +$$**$**$$$....*$..**.*$ +$$**$.*$..*$..*$$**....**$ +$$**$..**$****$****$$.......*$ +$$**$..**$****$****$$$ +$$**$..*$.**$.*$$.*$ +$$**$..*$..*$*.*....*$.*.....*$$ +$$*.**$*.*$*.**$*.*$*.**$*.*$ +$$*.....*$*....*.*$....*$....*$...***.*$....*$ +$$*$***$...*$..**$$$ +$$*$*..**$*..**$$$$ +$$*$*..**$...**$$$$ +$$*$*$$....***$...*..*$......*$ +$$*$.*$*$*$....**$....**$ +$$*$.*$.***$....*$.***$.*$ +$$.***$**.**..*$....**.*$******$.**..*$.....**$ +$$.***$*..*$***$.*$$$ +$$.***$*..*$*...*$.****$...*$$ +$$.***$.*..**.*$..***$...*$$$ +$$.**..**$**$.**$..*$$$ +$$.**..**$..*..**$*.*$**$$**$ +$$.**..*.*$***.*$*......*$*.*****$.***$$ +$$.**$*..*$.*....*$.*..****$..*.**$.**.*.**$ +$$.**$.**..**$.....**$$$$ +$$.**$.**$$$..**$..**$ +$$.**$..*$..*.*$...**$$.......*$ +$$.**$..*$$$.*$**$ +$$.*.*$**.***$......*$**.***$**.*$$ +$$.*.*$$.*.*.*.*$$...*.*.*$$ +$$.*.*$$.*.*.*$$...*.*$$ +$$.*...*.*$......*$..*.*..*$..*.*$.....*.*$*$ +$$.*...*$*.*.*.**$**...**$*.....*$**...**$*.*.*.**$ +$$.*.....*$.*.....*$**$$$$ +$$.*$***$..**$*.**$*$*.*$ +$$.*$**$$......**$......**$$ +$$.*$.***$....*$.***$.*$.....*$ +$$.*$.***$....*$...**$$$ +$$.*$.*$$$$....**$ +$$.*$..*$..*$**$*$.......*$ +$$.*$..*$..*$**$*$$ +$$..***$**..*$.***$..*$$$ +$$..***$..***$.*...*$*.....*$.**.**$$ +$$..***$..*..**$...***$....*$$$ +$$..***$.....*$.*...*$..***$...*$$ +$$..**...*$..**$$$$$ +$$..**$*.***$....**$***.*$.***$$ +$$..**$..**$$..*$.***$*..*$ +$$..**$..**$$$.**$.**$ +$$..*.*.*$$..*...*$$..*...*$$ +$$..*.*.*$$..*$$..*.*.*$$ +$$..*.*$..*.*$.*...*.*$*.....*$$$ +$$..*$.***$**..*$..***$$$ +$$..*$.***$.*.**$..***$..***$*.***$ +$$..*$..***$.....*$..***$..*$$ +$$..*$...*$*..*$.**$**$$ +$$..*$$..*$$..*$$ +$$...***$.**..*$..***$...*$$$ +$$...***$...*..**$....***$.....*$$$ +$$...***$...*..*$..*...*$..****$...*$$ +$$...**$..*..*$.**..*$..*..*$...*$$ +$$...**$...**$$$$$ +$$...**$...*.*$.....*$.....**$$$ +$$...*.*.*$$.*.*.*.*$$.*.*$$ +$$...*.*.*$$...*.*.*$$...*.*$$ +$$...*$***.*$....**$*****$**$$ +$$...*$..***$.**..*.*$.**.**.*$....**.*$..*.*$ +$$...*$..*.*$..*..*$*.*...*$**.....*$$ +$$...*$..*$...***$.....*$$$ +$$...*$..*$...***$.....*$$$ +$$...*$...***$......*$.....**$$$ +$$....***$...*$...*...*$....***$.....*$$ +$$....**$***..*$.*****$$.*$*$ +$$....**$...*.*.*$..**...*$...*.*.*$....**$$ +$$....**$...*..*$*.*..*$*.*$*.***$....***$ +$$....**$....**$$$...**$...**..*$ +$$....**$....*.*$......*$......**$**$*$ +$$....**$....*$.....***$.......*$$$ +$$....**$......*$...**..*$....*..*$.....*.*$.....**$ +$$....*..*$.....***$$$$$ +$$....*$...***$..*..**$..***$$$ +$$....*$...*$.......*$.**$*.....*$***...**$ +$$.....***$.....***$.....**$.......*$$$ +$$.....**$....**$.....**$......*$$$ +$$.....**$....*.*$....*$....***$$$ +$$.....**$....*..*$....*$....*..*$....**.*$$ +$$.....**$....*..*$.....*$$......**$....***$ +$$.....**$.....**$$$......**$......**$ +$$.....**$.....**$$$$$ +$$.....**$.....*.*$.....*.*$......**$......*$$ +$$.....**$.....*$...*.*$...**$$$ +$$.....*.*$....*$.....*$......**$$$ +$$.....*.*$$.....*.*$$$$ +$$.....*$...***$..*$...***$.....*$$ +$$.....*$....***$...**..*$..*.****$....***$*..***$ +$$.....*$....***$...**..*$..*.****$....***$...***$ +$$.....*$....***$....*..*$......**$$*$ +$$.....*$....***$....*..*$......**$$$ +$$.....*$....*.*$....*.*$*....*$$$ +$$......**$**....**$$..*$..*$..*$ +$$......**$*.....**$$......**$.......*$.......*$ +$$......**$..**..**$..**$$$$ +$$......**$.....***$.....***$.....**$......*$......**$ +$$......**$.....*.*$.....*$.....**$.......*$.......*$ +$$......**$.....*$$.....*$.......*$...*..**$ +$$......**$......**$$......**$.......*$.......*$ +$$......**$......**$$$$.......*$ +$$......**$......*$**....*$***....*$..**$*.*....*$ +$$......**$.......*$$$$$ +$$......*$....**.*$$....**$.......*$.....*.*$ +$$......*$......**$$$$$ +$$......*$...*..**$..*.*$...*$$$ +$$.......*$.*...*$..*.*$..*.*$..*.*$.*...*$ +$$.......*$......**$.....***$.....**$.......*$$ +$$.......*$......**$.....***$$.......*$$ +$$.......*$......**$.....**$......*$.......*$$ +$$.......*$......**$......**$.......*$$$ +$$.......*$......*$......**$.......*$$.......*$ +$$.......*$......*$......*$......*$.......*$$ +$$.......*$......*$......*$.......*$$.......*$ +$$.......*$......*$......*$.......*$$$ +$$.......*$......*$.......*$$$$ +$$.......*$......*$$$$......*$ +$$.......*$.......*$......**$......**$......**$$ +$$.......*$.......*$......*$......*$$.......*$ +$$.......*$.......*$$.......*$.......*$$ +$$.......*$$.......*$$.......*$$ +$$.......*$$$$*$*$ +$$$****$*****$***.**$...**$*$ +$$$****$****$..**$**$$ +$$$**.**$.*.*..*$*...*.*$*...***$.....**$ +$$$**.....*$.**...**$.*.*.*.*$...*.*$..*...*$ +$$$**$**..**$....**$$$ +$$$**$.**$.**$.*$.*$ +$$$*.**$*.*$*.*$.*$$ +$$$*.**$*..*$***$$$ +$$$*.**$..**..**$......**$*...***$.*...*$ +$$$*.*.*$$*$$*.*.*$ +$$$*...***$.*.*..*$.*.*.**$.....**$$ +$$$*...**$**.**.*$......*$**.**.*$*...**$ +$$$*$**$.*$*.*$**$ +$$$*$*....*$*...*.*$....*.*$$ +$$$*$*$*.**$.*.*$$ +$$$*$*$......*$......*$..*$ +$$$*$.*...*$*....***$$.......*$ +$$$*$$......**$.......*$.......*$ +$$$.***$*...*.*$*...*.*$.**$...*...*$ +$$$.***$.*****$**...**$*...**$*...*$ +$$$.**.*$.*..*$..***$$$ +$$$.**$**....**$..*...*$.....***$......*$ +$$$.**$*..*$...*$*..*$*.**$ +$$$.**$.**..**$.....**$$$ +$$$.**$.*.**$.*...*.*$.**..*.*$..***$ +$$$.**$.*.*$..***$**.**$****$ +$$$.**$$*$*...*.*$*...*.*$ +$$$.*.*$.*.*$.**$..*$*.*.*$ +$$$.*$.***$....*$...*$$ +$$$.*$.***$....*$...**$$ +$$$..**$**.*$...*$..**$***$ +$$$..**$..**...*$$$$ +$$$..**$..*.*$..*.**$...**$...*$ +$$$..**$..*$...***$.....*$$ +$$$..**$...*$...*.*$....**$$ +$$$..*...**$**.*.***$*....***$*...*$.***$ +$$$..*$.**$**$.**..**$$ +$$$..*$.*.*$*...*$*****$.*.*.*$ +$$$..*$.*.*$*$*..*$*.*$ +$$$..*$.*.*$....*$.*..*$..*.*$ +$$$...***$.**.*.**$.**$.**.*.**$...***$ +$$$...***$..**.**$.*.*.**$.*...*$..*..*$ +$$$...***$..**.**$..**.*.*$...*...*$...*..*$ +$$$...**..*$...*.**$....*$....***$$ +$$$...**$*.*..*$......*$......**$......*$ +$$$...**$..*..*$..*.*.*$...*..*$.......*$ +$$$...**$...**$.*$**$*.*$ +$$$...**$...**$$$....**$ +$$$...*$.***$*$**$......**$ +$$$...*$.***$*$.***$...*$ +$$$...*$..***$.**.*$.**$.**$ +$$$....**$...**.*$....*.**$.....*$......*$ +$$$....**$...*.*$..**.*$...**$....*$ +$$$....**$....**$$$$ +$$$....**$.....**$...*.*$...**$$ +$$$....**$.....*$..***$..*$$ +$$$....*.*$..******$.*$..******$....*.*$ +$$$....*.*$.....*$$$$ +$$$....*$...*.*$...*.*$..**.**$$ +$$$....*$....***$.......*$....***$....*$ +$$$.....***$.....*$.....*$.....*$......*$ +$$$.....***$.....*$.....*$......*$$ +$$$.....**$*....**$$$.......*$ +$$$.....**$...*..*$...*..*$..**.**$.**.**$ +$$$.....**$......**$..*****$..****$$ +$$$.....**$......*$*.....*$*......*$$ +$$$.....*.*$...***.*$..*$...****$.....*.*$ +$$$.....*$...***$..*$...***$.....*$ +$$$.....*$....****$..**...*$..**$..***$ +$$$.....*$....***$....*.**$......**$......**$ +$$$.....*$....**$...***$*.**$...*$ +$$$.....*$....*.*$....*$.....*$......**$ +$$$.....*$.....***$$.......*$$ +$$$.....*$.....**$.....***$*......*$*......*$ +$$$.....*$.....*$....*$.....*.*$.....*$ +$$$.....*$$....*$....**$$ +$$$......**$.....*$....*$...**$....*$ +$$$......**$.....*$....*$....*$.......*$ +$$$......**$......**$$*$.*....*$ +$$$......**$......*$..*....*$..***$.....*$ +$$$......**$......*$......**$......**$$ +$$$......**$......*$.......*$$$ +$$$......**$.......*$$$$ +$$$......*$.....**$....**$.....**$$ +$$$......*$.....**$.....**$.......*$......*$ +$$$......*$.....*.*$.....*.*$....**.*$$ +$$$......*$.......*$......**$$$ +$$$.......*$.*.....*$..**$***$$ +$$$.......*$....***$....***$....**$$ +$$$.......*$....**.*$..*.**.*$..*.*$....*$ +$$$.......*$.....**$.....***$.....***$$ +$$$.......*$......**$*.....**$....*$..**$ +$$$.......*$......**$....*.*$....**$*$ +$$$.......*$......**$.....*$......**$.......*$ +$$$.......*$......**$......**$.......*$.......*$ +$$$.......*$......*$.....*$......*$.......*$ +$$$.......*$......*$......*$......*$.......*$ +$$$.......*$......*$......*$.......*$$ +$$$.......*$......*$.......*$$$ +$$$$****$*...*$....*$**.*$ +$$$$***$***$**.*$**.*$ +$$$$***$...*$*...*$.**.*$ +$$$$***$...*$....*$...*$ +$$$$**.....*$.*....*$.*.*...*$..*.*$ +$$$$**.....*$.*$......**$$ +$$$$**$****$....*$**..*$ +$$$$**$*$.***$...*$ +$$$$**$.*...**$.**...*$.*...*$ +$$$$**$.*$.*.*$..**$ +$$$$**$..**$****$****$ +$$$$**$..*$.......*$..*...*$ +$$$$**$...*$...*$$ +$$$$*..**$*..**$*$$ +$$$$*...*$$*...*$$ +$$$$*.....**$*.....**$$$ +$$$$*.....**$*.....*$.......*$***.****$ +$$$$*$***$...*$***$ +$$$$*$*..**$.....*$*.*..**$ +$$$$*$.*.....*$*......*$.......*$ +$$$$*$.*$.*$.*....*$ +$$$$.****$**..*$*..*$*..*$ +$$$$.***...*$*..*...*$**.*...*$$ +$$$$.**...**$*..*.*$$$ +$$$$.**$*..*...*$...**.**$..*.*.*$ +$$$$.**$.*.**$.*...*.*$.**..*.*$ +$$$$.*..*$.*$.....*$....**$ +$$$$.*.....*$$.*.....*$$ +$$$$.*$*.**$...*$...*$ +$$$$.*$.***$....*$.***$ +$$$$.*$.*.*$$**..*$ +$$$$.*$.*..**$*.....*$.*.*..**$ +$$$$..****$..*..**$...*..**$...*..*$ +$$$$..***$.*...*.*$*...**.*$*.**$ +$$$$..***$..***$.*.**$.*.**$ +$$$$..***$..***$..**.*$..**.*$ +$$$$..**$**.*$...*$..**$ +$$$$..**$.*****$.*....*$.***..*$ +$$$$..**$..*$...***$.....*$ +$$$$..**$...*$...*.*$....**$ +$$$$..*.*.*$$..*...*$$ +$$$$..*.*.*$$......*$$ +$$$$..*...*$..******$$..******$ +$$$$..*$..***$.....*$....**$ +$$$$...***$..*..**$.*...**$..***$ +$$$$...*.*$..*...*$...*$....****$ +$$$$...*$.****$*...*$*..*$ +$$$$...*$..****$..*...*$...*..*$ +$$$$...*$..***$.*..**$.****.*$ +$$$$...*$..*.*$.*...*$.*...*$ +$$$$..**$..*$...***$.....*$ +$$$$..**$..*$...***$.....*$ +$$$$....****$....*.*$....*$.....*$ +$$$$....**$..**.**$*..*.*$*$ +$$$$....**$...*.*$...*$..**$ +$$$$....**$....***$....***$.......*$ +$$$$....*$...*.*$*.**.**$*.*$ +$$$$....*$...*.*$...*.*$....*$ +$$$$.....***$.....***$....****$...**$ +$$$$.....**$.**..**$.**$$ +$$$$.....**$.....**$....*..*$.....**$ +$$$$.....**$$$.....*$ +$$$$.....*$*...*.*$.*.*...*$.*.*...*$ +$$$$.....*$.**..*$*.....*$*..*.*$ +$$$$.....*$....***$...**..*$..*.****$ +$$$$.....*$....*.*$...*...*$...*...*$ +$$$$.....*$....*.*$....*.*$...**.**$ +$$$$......**$.....*$....****$*.....**$ +$$$$......*$.....*.*$.....*.*$....**.*$ +$$$$......*$.....*.*$.....*.*$......*$ +$$$$......*$......*$......**$......**$ +$$$$.......*$...**.*$...**.**$.....***$ +$$$$.......*$...**..*$...**$$ +$$$$.......*$......*$.....**$......*$ +$$$$.......*$......*$.....*$.....*$ +$$$$.......*$......*$.....*$......*$ +$$$$.......*$......*$......*$.....**$ +$$$$.......*$......*$......*$......*$ +$$$$.......*$......*$.......*$$ +$$$$.......*$.......*$.....***$...***$ +$$$$.......*$.......*$.....*.*$.....**$ +$$$$.......*$$.*.....*$$ +$$$$.......*$$$......*$ +$$$$$***$*.**...*$*.*.*.*$ +$$$$$***$*.**$*.**$ +$$$$$**.**$.*.*$.*.*$ +$$$$$**....*$.*...*.*$.....*.*$ +$$$$$**$..*$.**...**$ +$$$$$**$...*$...*$ +$$$$$*.**$*.**$**$ +$$$$$*.**$*.*$*.*$ +$$$$$*.*.*$$....*$ +$$$$$*...***$*...*..*$*...*.**$ +$$$$$*....*$*...**$...**$ +$$$$$*.....**$**...**$*.*.*.*$ +$$$$$*.....**$*.....**$$ +$$$$$*.....*$.*...*.*$..*..*$ +$$$$$*$*.**...*$...*$ +$$$$$*$.*.....*$.**$ +$$$$$.***...*$*..*...*$**.*...*$ +$$$$$.***$.***$.**.*$ +$$$$$.**..*.*$***.*$*......*$ +$$$$$.**$**$.*****$ +$$$$$.**$*..*$*..**$ +$$$$$.**$*..*$.**$ +$$$$$.**$..**$***$ +$$$$$.*$**....**$.....**$ +$$$$$.*$*.**$**.**$ +$$$$$..*****$.*....*$......*$ +$$$$$..****$.**..*$**..*$ +$$$$$..****$..*.**$..*$ +$$$$$..**.**$*.*...*$.*...*$ +$$$$$..**.**$...*.*$...*.*$ +$$$$$..**$..*$...***$ +$$$$$..**$..*$...*$ +$$$$$..*$.***...*$**.**.**$ +$$$$$..*$..*$...*$ +$$$$$...*****$.....***$..*.**$ +$$$$$...***$*..*****$..**$ +$$$$$...***$...***$..*.**$ +$$$$$...***$...*...*$...*$ +$$$$$...**.**$..*$$ +$$$$$...**..*$...**$$ +$$$$$...**$..*..*$.**$ +$$$$$...**$...**$$ +$$$$$...**$...*.**$...*...*$ +$$$$$...**$...*...*$....*$ +$$$$$...**$...*...*$$ +$$$$$...**$....*$...*$ +$$$$$...*$.**.**.*$.**.**.*$ +$$$$$...*$..*.*$.**.**.*$ +$$$$$....***$...*..*$..*...*$ +$$$$$....**$**..**$**$ +$$$$$....**$**...*$*$ +$$$$$....**$..**.*$.*...*$ +$$$$$....**$...**.**$....*..*$ +$$$$$....**$...*..*$......**$ +$$$$$....**$....*.*$......*$ +$$$$$....**$....*$..*.*$ +$$$$$....**$....*$.....***$ +$$$$$....**$....*$.....*$ +$$$$$....*$...***$..*...*$ +$$$$$....*$...***$...*..*$ +$$$$$.....**$*....**$*$ +$$$$$.....**$*....*$...*.*$ +$$$$$.....**$.....*$......*$ +$$$$$.....**$......*$......*$ +$$$$$.....*$...*.**$...*...*$ +$$$$$.....*$...*..*$*.*$ +$$$$$.....*$....**.*$*.**...*$ +$$$$$.....*$....*..*$$ +$$$$$......**$....**.*$....*..*$ +$$$$$......**$.....**$.....**$ +$$$$$......**$.....*$.....**$ +$$$$$......**$.....*$......**$ +$$$$$......*$.....*.*$.....*.*$ +$$$$$.......*$...*...*$..*.*$ +$$$$$.......*$.....***$....*..*$ +$$$$$.......*$......**$.*.....*$ +$$$$$.......*$......**$.....***$ +$$$$$.......*$......*$.....**$ +$$$$$.......*$......*$......*$ +$$$$$.......*$......*$.......*$ +$$$$$$**$.*.....*$ +$$$$$$*....**$*...*..*$ +$$$$$$*.....**$......**$ +$$$$$$*.....*$**...***$ +$$$$$$*$.*.....*$ +$$$$$$.***...*$.***...*$ +$$$$$$.*.....*$*.*...*$ +$$$$$$..**$.*..*$ +$$$$$$..**$..**...*$ +$$$$$$..**$..*...**$ +$$$$$$..*$.*.**.*$ +$$$$$$...*****$...****$ +$$$$$$...***$*.*..*$ +$$$$$$...**$*...*$ +$$$$$$...**$..*.*$ +$$$$$$...**$...**..*$ +$$$$$$...*.*$..*...*$ +$$$$$$...*...*$..*$ +$$$$$$...*$..***$ +$$$$$$...*$..*.*$ +$$$$$$...*$...***$ +$$$$$$...*$...**$ +$$$$$$....**.*$.....*.*$ +$$$$$$....**$**..**$ +$$$$$$....**$...*..*$ +$$$$$$....**$....*.*$ +$$$$$$....**$....*$ +$$...*$..*.*$...*$$....**$....*$ +$$$$$$....*$..****$ +$$$$$$....*$..**$ +$$$$$$....*$...***$ +$$$$$$....*$...*.*$ +$$$$$$....*$....**$ +$$$$$$.....***$.....**$ +$$$$$$.....**$.**..**$ +$$$$$$.....**$...**.**$ +$$$$$$.....**$....*.*$ +$$$$$$.....**$.....**$ +$$$$$$.....*$.....***$ +$$$$$$......**$.....*$ +$$$$$$......**$.......*$ +$$$$$$......*$.....***$ +$$$$$$......*$.......*$ +$$$$$$.......*$*......*$ +$$$$$$.......*$...*$ +.....***$$$$$$$$ +....*.*$$$$$$$$ +....**.*$$$$$$$$ +...*.*$$$$$$$$ +...*$...*$$$$$$$ +...*$..**$$$$$$$ +...*$..**$$....*$...*.*$....*$$$ +...*$..**$$$$$$$ +...*$***$$$$$$$ +...*$$$$$$$.*$ +...*$$$$$$$$ +..*...*$$$$$$$$ +..*.*.*$$$$$$$$ +..*.*$.**$$$$$$$ +..*.*$$$$$*$$$ +..***$..*$$$$$$$ +..**$***$$$$$$$ +..*$..*$$$$$$$ +..*$.*$*$$$$$$ +..*$***$**$$$$$$ +..*$***$$*$$$$$ +..*$***$$$$$$$ +.*...*$$$$$$$$ +.*.*$..**$$$$$$$ +.*.*$$.*$$$$$$ +.*.*$$$$$$$$ +.***$...*$$$$$$$ +.***$..*$$$$$$$ +.***$.*$$$$$$$ +.***$$.*$$$$$$ +.***$$$$$$$$ +.**$.**$$$$$$$ +.**$.*$$$*$$$$ +.**$$$**$**$$$$ +.**$$$$$$$*.**$ +.*$.*$**$$$$$$ +.*$.*$*$$$$$$ +.*$**$*.*$$$$$$ +.*$*$$$$$$*$ +.*$$.*$$.*$$.*$$ +.*$$$..*$.**$$$$ +.*$$$$$$.**$.**$ +*....**$$$$$$$$ +*....*$**$$$$$$$ +*..*$*$*$$$$$$ +*.*$.*$$$$$*$*$ +*.*$.*$$$$$$$ +**....*$$$$$$$$ +***$**$*$$$$$$ +**$..*$**$$$$$$ +**$.*$$$$$$$ +**$$.*$$$$$..*$ +**$$$.**$.**$$$$ +**$$$$**$**$*$$ +**$$$$$$**$**$ +*$.**$.**$*$$$$$ +*$.*$*$$$$*$.*$ +*$**$$$$$$$ +*$*$*$$$$$$ +*$*$$*$$$$$ +*$*$$$**$**$$$ +*$*$$$$*$$$ +*$*$$$$$$**$ +*$$***$..*$$$$$ +*$$*$..*$.**$$$$ +*$$*$*$$$$$ +*$$$$*$*$*$$ +*$$$$*$*$$*$ +*$$$$$$*$*$ +*$$$$$$*$$ +*$$$$$$$.....*$ +$*.*.*$$$$$$$ +$**$..*$.**$$$$$ +$**$.*$*$$$$$ +$**$**$$$*$*$$ +$*$.*$*$$$$*$ +$*$.*$*$$$$$ +$*$**$.*$*$*$$$ +$*$**$**$.*$$$$ +$*$*$*$$$$*$ +$*$$***$..*$$$$ +$*$$*$*$.*$*$$ +$*$$*$$*$$$ +$*$$$$$***$...*$ +$*$$$$$$...**$ +$$.**$..*$*$$$*$ +$$.**$$$$$$ +$$.*$**$**$*$$$ +$$.*$*$$$$***$ +$$.*$*$$$$*$ +$$*$.*$*$$$$ +$$*$***$.*$*$$$ +$$*$*$**$$**$**$ +$$*$*$$$....**$$ +$$*$$$$*$*$ +$$$.**$.**$$$**$ +$$$.**$**$*$$$ +$$$.*$**$*$.*$$ +$$$.*$**$$**$.*$ +$$$.*$**$$$*$ +$$$.*$*$***$$$ +$$$**$.*$*$$$ +$$$**$*.*$*$$$ +$$$**$**$**$$$ +$$$**$**$$$*$ +$$$**$*$*$$$ +$$$**$$.**$.*$*$ +$$$*$.*$***$*$$ +$$$*$**$$$$ +$$$*$*$$$**$ +$$$*$*$$$*$ +$$$*$$$...*$..*$ +$$$*$$$$*$ +$$$$..*$***$$*$ +$$$$.*$..*$..*$$ +$$$$.*$**$$**$ +$$$$.*$*$$....*$ +$$$$.*$$.*.*$$ +$$$$.*$$.*$$ +$$$$**$..*$.**$$ +$$$$**$..*$$*$ +$$$$**$.*$$$ +$$....*$...*.*$**..*$.*$$$ +$$$$**$.*$$$ +$$$$*$..*$$..*$ +$$$$*$.*$.*$.**$ +$$$$*$**$.*$$ +$$$$*$*$**$*$ +$$$$*$*$*$$ +$$$$*$*$$....*$ +$$$$*$$***$**$ +$$$$*$$$*$ +$$$$$..*.*.*$$$ +$$$$$.**$..*$.*$ +$$$$$.*$**$$ +$$$$$.*$*$*$ +$$$$$*.*$$...*$ +$$$$$**$..*$**$ +$$$$$**$.*$$ +$$$$$**$**$**$ +$$$$$**$**$$ +$$$$$**$*$.*$ +$$$$$*$.*$..*$ +$$$$$*$.*$.*$ +$$$$$*$.*$*$ +$$$$$*$**$.**$ +$$$$$*$**$**$ +$$$$$*$*$*.**$ +$$$$$*$*$**$ +$$$$$*$*$*$ +$$$$$$......**$$ +$$$$$$...*.*.*$$ +$$$$$$...*$..*$ +$$$$$$...*$..*$ +$$$$$$...*$..*$ +$$$$$$..*$.***$ +$$$$$$..*$***$ +$$$$$$..*$**$ +$$$$$$.**$..**$ +$$$$$$.**$*.*$ +$$$$$$.**$$ +$$$$$$.*$*.*$ +$$$$$$.*$***$ +$$$$$$.*$$ +$$$$$$*.**$*.*$ +$$$$$$****$**.*$ +$$$$$$***$..*$ +$$$$$$***$*$ +$$$$$$**$.*$ +$$$$$$**$*$ +$$$$$$$..**...*$ +$$$$$$$..**.*$ +$$$$$$$..*$ +$$$$$$$.*.*..**$ +$$$$$$$.*.**$ +$$$$$$$.***$ +$$$$$$$*...*.*$ +$$$$$$$*..**$ +$$$$$$$*.*.*$ +$$$$$$$*.**...*$ +.*$$$$$..***$.*..*$.*.**$ +..**$$..**$.*.*$..*$$$$ +..*.*$...*$$.......*$......*$.......*$$$ +....*$*$.***$$$....**$...***$...**.*$ +.....***$.......*$$$$$$.**$ +......**$......**$$*$*$$$$ +......**$......**$$$$$$...**$ +......**$.......*$.......*$$$*$*$$ +$*$*$$$$...*$..*.*$ +$*$.**$***....*$**...*$.....*$.....*$......*$ +$$$***$*.*$..*$**.....*$$ +$$$***$*.*$..*$**$$ +$$$*$.*$*$$.....**$ +$$$$$.*$***$...*$ +$$$$$..***$.*..*$.*.**$ +$$$$$$**.*$*****$ +$$$*$**$*$**$**$ +$$$$*$.*$.**$.*$ +4 2 1 2 1 +4 0 0 0 4 +4 3 0 0 0 +4 0 0 7 0 +4 0 0 6 0 +4 8 0 9 0 +4 0 0 10 5 +4 12 0 0 0 +4 0 0 0 11 +4 4 7 0 0 +4 0 6 0 3 +4 0 10 0 0 +4 0 9 0 0 +4 5 0 0 0 +4 0 0 14 0 +4 0 0 0 8 +4 0 0 13 0 +4 0 0 0 12 +4 0 0 0 15 +4 11 0 0 0 +4 16 0 0 0 +4 0 13 0 0 +4 0 14 0 0 +4 0 0 20 0 +4 0 0 17 21 +4 22 0 18 0 +4 0 0 19 0 +4 15 0 0 0 +4 0 0 0 16 +4 0 20 0 0 +4 24 0 0 0 +4 0 19 0 0 +4 0 18 0 0 +4 0 17 0 0 +4 0 0 0 23 +4 0 0 26 0 +4 0 0 25 0 +4 0 0 8 0 +4 21 0 0 0 +4 0 0 0 22 +4 6 0 3 0 +4 0 0 4 7 +4 9 0 0 0 +4 0 0 0 10 +4 0 26 0 24 +4 23 25 0 0 +4 0 0 5 0 +4 0 3 0 0 +4 0 4 0 0 +4 27 0 0 0 +4 0 0 12 0 +4 7 0 0 0 +4 0 0 0 6 +4 0 0 11 0 +4 0 0 0 13 +4 14 0 0 0 +4 10 5 0 0 +4 0 8 0 9 +4 0 12 0 0 +4 0 11 0 0 +4 0 0 0 28 +4 20 0 0 0 +4 0 0 16 0 +4 13 0 0 0 +4 0 0 0 14 +4 0 0 0 19 +4 0 0 15 0 +4 0 15 0 0 +4 0 0 0 17 +4 18 0 0 0 +4 0 16 0 0 +4 0 0 21 0 +4 0 0 28 31 +4 0 0 22 0 +4 26 0 24 0 +4 19 0 0 0 +4 0 0 23 25 +4 0 0 0 20 +4 0 22 0 18 +4 0 23 0 0 +4 0 24 0 0 +4 30 0 27 0 +4 17 21 0 0 +4 0 0 30 0 +4 0 0 31 0 +4 0 0 0 26 +4 25 0 0 0 +4 47 0 46 45 +4 0 0 0 47 +4 0 46 0 0 +4 45 0 0 0 +4 0 34 29 33 +4 32 35 29 0 +4 34 0 33 0 +4 0 0 32 35 +4 50 0 50 0 +4 44 1 2 1 +4 37 0 0 0 +4 0 0 0 38 +4 56 56 0 0 +4 0 148 0 0 +4 77 1 77 1 +4 103 92 0 67 +4 0 0 0 36 +4 135 1 129 1 +4 57 0 0 0 +4 112 118 39 93 +4 2 1 48 0 +4 2 1 134 1 +4 0 0 70 70 +4 0 0 65 38 +4 0 0 391 0 +4 0 44 0 51 +4 499 428 113 447 +4 0 127 0 0 +4 1 0 0 0 +4 59 1 48 0 +4 0 108 0 0 +4 48 48 0 0 +4 0 0 44 0 +4 48 0 0 0 +4 0 0 59 1 +4 0 429 0 0 +4 52 53 308 0 +4 37 0 84 0 +4 203 0 115 0 +4 490 0 0 58 +4 0 0 189 188 +4 0 102 0 0 +4 0 0 112 118 +4 64 36 361 165 +4 0 0 0 156 +4 39 93 0 0 +4 0 111 0 99 +4 0 36 103 92 +4 0 27 0 0 +4 0 0 469 57 +4 88 87 0 0 +4 0 78 0 0 +4 0 149 0 0 +4 205 0 0 0 +4 0 267 0 403 +4 36 0 0 0 +4 0 89 0 127 +4 39 561 0 0 +4 101 95 0 0 +4 0 0 324 0 +4 0 0 58 38 +4 0 67 0 0 +4 0 109 0 102 +4 0 74 0 0 +4 400 519 190 18 +4 0 88 0 0 +4 0 0 0 68 +4 73 0 0 0 +4 0 39 0 0 +4 0 0 138 0 +4 2 59 48 48 +4 0 0 61 1 +4 2 1 2 59 +4 0 0 0 191 +4 37 0 1 0 +4 108 104 0 0 +4 107 137 0 0 +4 97 150 0 0 +4 82 0 0 0 +4 29 0 0 0 +4 0 123 0 0 +4 0 94 0 0 +4 0 98 0 0 +4 150 0 0 0 +4 137 0 0 0 +4 0 99 0 0 +4 104 0 0 0 +4 0 0 0 109 +4 0 105 0 0 +4 0 0 0 29 +4 0 107 0 0 +4 105 82 0 0 +4 0 101 0 0 +4 0 96 0 0 +4 0 0 0 147 +4 124 0 0 0 +4 0 147 0 98 +4 0 122 0 0 +4 0 120 0 96 +4 0 97 0 0 +4 0 0 0 142 +4 0 0 0 125 +4 0 0 0 120 +4 0 142 0 94 +4 1586 1089 0 1005 +4 1536 0 0 1705 +4 0 0 1110 1156 +4 0 0 0 1706 +4 237 222 223 0 +4 0 0 120 38 +4 17 759 1395 1286 +4 0 1590 0 0 +4 42 40 446 420 +4 1219 0 0 0 +4 417 557 1190 1927 +4 619 36 686 165 +4 783 1861 131 0 +4 0 0 1709 60 +4 617 0 18 0 +4 1483 1642 1259 1413 +4 74 680 61 1712 +4 29 328 511 329 +4 0 0 51 53 +4 42 40 1516 1283 +4 0 0 1066 0 +4 508 505 166 816 +4 1637 0 689 53 +4 235 37 214 0 +4 355 5 0 0 +4 0 106 0 0 +4 0 0 0 1338 +4 1583 458 0 0 +4 1002 692 1007 164 +4 0 55 0 581 +4 340 227 80 226 +4 558 53 91 0 +4 1977 0 0 0 +4 0 433 0 336 +4 1968 208 0 1844 +4 1361 28 1307 39 +4 71 0 0 0 +4 0 1820 0 757 +4 37 0 571 0 +4 0 0 1566 0 +4 0 0 0 161 +4 113 0 763 768 +4 32 35 136 504 +4 409 409 0 0 +4 316 277 183 168 +4 1744 1982 1888 1866 +4 549 41 548 43 +4 0 0 1784 0 +4 369 1486 1489 1342 +4 0 0 181 0 +4 0 42 0 493 +4 0 140 0 0 +4 0 1205 0 1673 +4 0 0 154 1323 +4 0 0 1805 1801 +4 0 42 0 446 +4 40 37 520 1 +4 372 453 218 29 +4 621 925 0 0 +4 232 298 216 53 +4 0 0 354 1565 +4 0 143 0 0 +4 0 1599 0 1180 +4 0 1524 0 39 +4 0 124 0 0 +4 36 1155 1904 399 +4 1953 1185 616 0 +4 1575 1800 1838 204 +4 116 0 0 0 +4 0 1031 0 1028 +4 471 251 315 312 +4 270 41 272 43 +4 42 40 477 448 +4 0 0 157 151 +4 0 1668 0 0 +4 540 27 0 1874 +4 58 38 270 41 +4 182 570 1807 36 +4 780 41 779 43 +4 0 0 0 111 +4 1424 63 734 63 +4 0 0 1714 74 +4 1416 0 0 1766 +4 0 1550 0 463 +4 1595 1942 141 1962 +4 0 0 0 1697 +4 0 354 0 464 +4 0 1776 0 1082 +4 455 0 0 0 +4 1080 924 67 27 +4 830 1872 69 153 +4 589 455 803 0 +4 49 1074 49 438 +4 0 0 1517 1403 +4 28 495 41 279 +4 511 329 333 275 +4 0 322 0 52 +4 305 390 29 33 +4 0 34 173 33 +4 0 42 0 476 +4 962 0 1678 0 +4 915 156 0 81 +4 242 0 28 36 +4 1925 995 1004 205 +4 37 0 27 0 +4 888 747 702 1159 +4 66 445 1623 912 +4 548 43 0 0 +4 0 158 0 0 +4 110 0 0 0 +4 0 138 0 0 +4 145 58 0 66 +4 735 0 624 0 +4 50 0 1919 0 +4 703 1903 0 0 +4 1582 1626 1349 0 +4 86 0 980 0 +4 42 40 144 425 +4 0 1733 0 0 +4 0 1868 0 0 +4 0 1460 0 388 +4 1732 1614 670 1233 +4 2001 0 1883 0 +4 317 303 368 258 +4 1519 1408 1171 769 +4 1491 1197 1193 117 +4 0 0 36 78 +4 0 0 0 1380 +4 0 537 0 62 +4 421 454 309 29 +4 28 74 1195 704 +4 401 396 0 0 +4 0 0 0 491 +4 169 1270 1000 1087 +4 27 1317 0 1711 +4 538 1722 39 1880 +4 1635 579 665 85 +4 319 230 374 276 +4 0 840 0 0 +4 0 0 1329 0 +4 1778 0 651 0 +4 1632 0 776 141 +4 0 1314 0 151 +4 0 0 1738 0 +4 1443 0 0 0 +4 49 327 49 985 +4 586 38 280 41 +4 959 61 904 356 +4 222 0 0 0 +4 0 38 292 41 +4 40 37 449 60 +4 1422 0 0 0 +4 40 37 236 573 +4 1191 772 1192 667 +4 739 0 0 0 +4 0 1394 0 1690 +4 231 297 387 564 +4 1895 291 31 0 +4 52 43 0 0 +4 0 0 17 1305 +4 0 1090 0 86 +4 0 37 1748 1729 +4 0 38 367 375 +4 0 609 0 1022 +4 114 0 0 0 +4 29 337 532 338 +4 1730 57 632 57 +4 1628 913 418 244 +4 775 1821 0 62 +4 350 349 32 35 +4 0 0 1345 81 +4 0 1616 0 0 +4 901 0 0 0 +4 0 0 1308 0 +4 559 0 37 0 +4 36 61 614 1120 +4 1533 1535 593 27 +4 674 1879 0 0 +4 884 1869 1029 27 +4 745 133 0 0 +4 660 580 0 1426 +4 0 1479 0 0 +4 230 296 276 556 +4 0 53 1306 0 +4 0 115 1662 1631 +4 1448 69 733 202 +4 0 38 163 41 +4 0 0 153 0 +4 399 1671 290 1848 +4 0 2015 1679 1290 +4 1845 0 1419 0 +4 489 0 533 0 +4 357 0 1500 1969 +4 161 0 740 0 +4 373 253 55 252 +4 0 0 64 0 +4 64 1551 727 1250 +4 0 0 1804 0 +4 0 79 0 0 +4 0 42 0 416 +4 1701 1644 1231 611 +4 29 366 0 52 +4 0 42 0 379 +4 0 0 1650 0 +4 1588 0 0 0 +4 466 39 246 0 +4 0 1828 0 940 +4 29 212 471 251 +4 0 0 525 38 +4 640 0 653 0 +4 1640 36 633 553 +4 1001 1269 0 1908 +4 968 0 116 0 +4 720 1940 0 0 +4 186 451 179 335 +4 390 0 33 0 +4 1707 1935 0 0 +4 0 0 536 497 +4 30 79 27 0 +4 0 0 339 0 +4 0 80 0 1477 +4 0 0 0 89 +4 1540 0 1532 0 +4 1527 844 0 90 +4 0 1564 0 0 +4 0 323 0 180 +4 0 0 1359 0 +4 42 40 476 449 +4 32 35 29 366 +4 221 0 117 0 +4 0 882 0 0 +4 0 0 0 527 +4 1717 1655 1210 1301 +4 1541 0 140 0 +4 42 40 493 481 +4 1461 1420 1770 0 +4 1862 893 0 0 +4 90 43 0 0 +4 42 40 126 474 +4 0 0 1950 0 +4 0 540 0 0 +4 1332 1873 1741 1700 +4 0 0 1675 0 +4 0 178 0 0 +4 0 58 0 66 +4 139 634 0 0 +4 185 1168 0 133 +4 453 243 29 33 +4 296 0 556 0 +4 0 0 0 1163 +4 1390 1362 1204 1207 +4 1372 5 181 0 +4 34 430 33 330 +4 0 39 410 397 +4 341 245 131 247 +4 149 39 0 0 +4 559 0 0 0 +4 781 605 484 60 +4 1063 1954 795 799 +4 0 0 1310 0 +4 191 0 1048 0 +4 65 0 551 1508 +4 1725 508 172 166 +4 0 62 0 0 +4 0 0 1289 1546 +4 207 0 655 0 +4 122 0 0 0 +4 0 0 76 0 +4 306 41 307 43 +4 0 0 0 204 +4 1649 1629 1176 719 +4 889 714 151 0 +4 28 1795 55 743 +4 1917 0 0 0 +4 0 0 0 176 +4 800 0 883 0 +4 0 171 0 52 +4 1882 144 1434 1648 +4 1921 1230 952 637 +4 0 1669 0 890 +4 79 0 0 0 +4 1178 865 0 0 +4 1068 1881 0 0 +4 0 0 533 0 +4 0 1186 0 28 +4 1061 0 1653 1957 +4 1464 0 1980 0 +4 0 182 154 1418 +4 1537 0 63 0 +4 1069 0 121 89 +4 0 0 0 174 +4 40 37 425 0 +4 0 0 0 54 +4 0 42 0 51 +4 34 479 33 266 +4 1229 604 0 0 +4 131 247 0 0 +4 0 1044 0 1577 +4 39 1887 0 0 +4 17 732 0 28 +4 1549 155 1276 69 +4 1226 600 0 100 +4 23 626 0 0 +4 141 1966 1170 864 +4 243 126 33 419 +4 0 1116 36 1088 +4 0 0 0 1392 +4 1292 0 1841 0 +4 0 183 0 506 +4 0 0 58 0 +4 0 0 0 1731 +4 0 1030 1612 821 +4 87 0 64 1573 +4 69 0 0 0 +4 54 54 981 977 +4 283 818 1656 187 +4 0 1153 0 0 +4 828 673 0 27 +4 0 1762 64 838 +4 0 0 583 498 +4 0 517 82 79 +4 833 1127 0 1505 +4 1990 1643 169 648 +4 353 314 467 468 +4 49 0 1385 75 +4 234 37 274 27 +4 1041 808 746 0 +4 0 0 0 486 +4 1988 2000 782 796 +4 0 0 0 1347 +4 292 41 90 43 +4 464 1291 79 0 +4 0 179 1356 211 +4 945 1864 0 0 +4 1482 1454 0 0 +4 297 0 564 0 +4 1375 156 1280 0 +4 0 1478 0 1863 +4 0 1177 0 0 +4 1905 0 0 0 +4 0 1327 0 0 +4 188 0 0 0 +4 202 1162 0 0 +4 0 38 0 1782 +4 377 1013 177 773 +4 0 155 0 551 +4 0 320 0 408 +4 0 0 203 28 +4 0 0 53 0 +4 785 1355 984 1451 +4 0 0 0 1523 +4 1431 793 441 0 +4 0 0 0 345 +4 1850 0 0 0 +4 0 0 0 58 +4 0 42 0 415 +4 809 0 0 91 +4 433 421 336 309 +4 0 1445 0 162 +4 169 1278 75 75 +4 1526 1405 0 52 +4 0 1495 0 0 +4 0 1764 0 1064 +4 68 1911 0 0 +4 0 0 61 145 +4 1824 44 1099 371 +4 27 463 0 0 +4 544 268 159 0 +4 136 500 353 314 +4 0 66 0 0 +4 0 0 586 38 +4 320 231 408 387 +4 298 0 53 0 +4 40 37 413 571 +4 954 27 851 486 +4 424 34 128 33 +4 0 0 0 39 +4 918 1398 0 132 +4 1266 0 0 0 +4 0 0 1646 0 +4 0 1320 139 1284 +4 450 34 128 33 +4 0 1108 0 558 +4 162 0 36 0 +4 690 83 1433 1309 +4 315 312 0 0 +4 0 0 1657 157 +4 0 0 1964 0 +4 378 305 566 29 +4 1238 629 0 100 +4 1833 971 1085 606 +4 0 1624 0 0 +4 44 1793 2 1152 +4 1124 0 0 0 +4 0 158 115 0 +4 1432 1321 982 1386 +4 382 238 51 164 +4 972 1910 0 0 +4 0 1469 181 1297 +4 1438 0 351 71 +4 1351 0 1410 0 +4 0 0 44 1772 +4 0 1579 0 0 +4 0 0 0 1487 +4 898 928 1012 835 +4 1856 43 0 0 +4 347 219 0 0 +4 1003 0 0 0 +4 284 0 65 1613 +4 37 0 82 0 +4 1476 1382 1105 0 +4 0 1444 0 744 +4 40 37 448 0 +4 1875 0 597 0 +4 860 1789 862 178 +4 0 0 465 0 +4 0 0 1943 76 +4 91 0 1217 1916 +4 40 37 376 568 +4 1761 506 0 0 +4 196 90 32 259 +4 85 51 1298 0 +4 0 941 0 1100 +4 0 0 0 1688 +4 0 1826 0 73 +4 41 279 51 278 +4 1263 0 0 0 +4 49 1466 49 983 +4 1758 1555 1008 827 +4 0 0 997 996 +4 318 237 72 223 +4 182 877 0 973 +4 323 40 180 215 +4 0 155 0 0 +4 509 507 365 263 +4 321 232 55 216 +4 44 0 371 0 +4 749 870 1834 1986 +4 0 42 0 1781 +4 64 0 84 0 +4 0 0 1998 0 +4 0 0 78 0 +4 0 42 0 126 +4 0 0 1755 1576 +4 1792 36 682 771 +4 0 0 1708 1538 +4 810 669 1814 57 +4 1974 1768 0 39 +4 1570 1142 0 0 +4 524 38 306 41 +4 76 1702 738 1239 +4 539 1045 1253 1265 +4 0 54 0 1026 +4 0 0 84 961 +4 285 0 27 0 +4 0 0 0 1319 +4 0 1324 70 70 +4 272 43 0 0 +4 1909 0 0 1404 +4 0 0 569 0 +4 872 1 116 0 +4 37 0 60 0 +4 1634 885 8 848 +4 2 59 1139 48 +4 1414 1503 0 0 +4 0 1452 0 1203 +4 0 144 1427 39 +4 0 316 0 183 +4 359 332 0 0 +4 0 1561 0 1447 +4 62 66 522 522 +4 364 1736 1364 854 +4 0 1237 0 0 +4 1611 1715 0 1839 +4 0 110 1727 1647 +4 0 466 0 246 +4 1248 27 529 0 +4 171 234 52 274 +4 0 1742 1296 1147 +4 0 0 2003 422 +4 51 304 0 29 +4 608 1245 0 658 +4 0 28 0 0 +4 59 1 48 431 +4 40 543 215 71 +4 866 0 0 0 +4 0 0 0 1683 +4 168 117 145 85 +4 1580 0 73 0 +4 0 65 1246 1877 +4 0 0 1913 0 +4 458 1591 1463 1189 +4 1252 903 0 28 +4 1928 1932 0 116 +4 0 0 0 1042 +4 170 0 0 0 +4 358 331 359 332 +4 0 517 919 79 +4 55 252 0 0 +4 0 1050 1371 1275 +4 370 1893 417 557 +4 1240 724 0 0 +4 0 0 0 1358 +4 0 0 916 0 +4 49 172 49 1072 +4 256 39 264 51 +4 0 0 28 38 +4 1472 0 1515 1467 +4 1459 0 414 71 +4 1049 0 0 0 +4 0 1627 153 1522 +4 472 1735 0 1052 +4 1311 0 1559 0 +4 859 85 0 0 +4 1835 1083 730 671 +4 1470 1539 0 1277 +4 1759 1552 1117 1920 +4 0 0 478 576 +4 27 0 63 0 +4 817 990 484 60 +4 171 688 1383 1453 +4 0 0 17 1343 +4 42 40 416 236 +4 0 0 1829 0 +4 1558 0 503 0 +4 937 0 0 0 +4 1507 301 60 27 +4 257 41 547 43 +4 0 0 72 1411 +4 0 1720 1471 1268 +4 0 1241 0 0 +4 645 56 269 159 +4 153 0 1956 0 +4 1417 0 27 0 +4 294 293 32 35 +4 0 0 194 0 +4 0 1806 0 114 +4 162 132 917 0 +4 0 1475 0 0 +4 0 318 0 72 +4 979 1938 473 1101 +4 684 1 2 1 +4 285 0 119 0 +4 0 1554 0 1017 +4 78 0 0 0 +4 0 0 317 303 +4 0 676 0 131 +4 0 1797 1713 636 +4 0 61 1370 1119 +4 1798 531 225 273 +4 49 975 49 172 +4 197 197 211 69 +4 0 1779 0 1481 +4 0 0 210 1073 +4 60 1183 0 0 +4 0 81 0 0 +4 161 1492 630 1832 +4 0 892 159 894 +4 0 0 1366 576 +4 542 1112 39 386 +4 407 27 0 0 +4 0 0 0 1815 +4 0 1775 0 39 +4 388 414 28 31 +4 725 72 0 0 +4 1455 52 847 0 +4 1399 1899 989 198 +4 480 36 857 54 +4 170 867 28 36 +4 193 65 0 116 +4 541 0 0 0 +4 2 1 2 1603 +4 1425 1474 987 0 +4 1769 1598 1852 2011 +4 0 0 1774 527 +4 0 0 1600 0 +4 0 0 1721 0 +4 0 0 208 0 +4 1368 1457 868 625 +4 1740 0 1081 0 +4 1912 106 198 0 +4 2 1043 2 1109 +4 36 0 834 1456 +4 80 226 0 0 +4 0 953 0 0 +4 0 879 0 0 +4 1827 0 986 0 +4 155 577 0 0 +4 1357 0 0 0 +4 1032 1886 0 0 +4 1510 907 0 0 +4 44 1 48 431 +4 1960 1939 0 1674 +4 531 1811 273 899 +4 0 427 0 295 +4 430 574 330 565 +4 706 1023 599 694 +4 39 666 485 157 +4 0 0 0 81 +4 0 934 30 1134 +4 0 0 1771 1449 +4 1092 944 204 1719 +4 0 906 75 75 +4 546 43 0 0 +4 1665 0 594 0 +4 1865 1871 174 638 +4 1299 0 0 0 +4 0 1803 0 1179 +4 0 69 0 1651 +4 921 910 0 0 +4 480 36 856 54 +4 0 0 36 208 +4 0 0 0 1993 +4 0 0 1691 0 +4 0 0 1548 1264 +4 1143 650 0 0 +4 201 0 0 0 +4 1040 1047 0 0 +4 0 0 119 496 +4 0 1006 0 1840 +4 0 0 524 38 +4 40 37 481 84 +4 1251 777 27 80 +4 513 1608 176 715 +4 1922 210 1557 1172 +4 583 498 348 220 +4 0 1610 0 1699 +4 0 550 0 0 +4 791 794 357 0 +4 0 28 0 1196 +4 722 170 0 0 +4 2 1529 2 1 +4 0 1462 0 998 +4 0 1256 0 1093 +4 846 1086 1645 1718 +4 0 1889 0 0 +4 1339 0 0 0 +4 0 44 0 52 +4 440 424 398 128 +4 0 0 44 494 +4 0 319 0 374 +4 452 501 55 228 +4 1115 631 62 66 +4 1352 0 863 1967 +4 1739 1746 967 886 +4 0 0 0 32 +4 0 1521 0 1182 +4 0 0 1423 0 +4 0 1015 0 988 +4 1234 788 1428 121 +4 62 0 1227 612 +4 0 0 487 1689 +4 1753 2012 0 679 +4 1609 1975 1057 86 +4 0 947 0 62 +4 333 275 0 0 +4 209 0 1890 0 +4 0 0 1104 0 +4 49 974 49 327 +4 37 0 568 0 +4 49 976 49 1823 +4 32 261 29 337 +4 32 35 175 0 +4 0 80 0 0 +4 1135 1130 502 193 +4 1786 581 1009 991 +4 0 0 54 1749 +4 1465 426 797 426 +4 1024 0 0 1070 +4 0 139 1685 0 +4 705 60 27 0 +4 0 86 0 62 +4 685 1898 1468 1436 +4 473 1228 0 177 +4 1867 0 0 0 +4 470 460 350 349 +4 0 42 0 515 +4 891 56 311 0 +4 72 5 1639 68 +4 1794 2005 824 826 +4 343 384 0 0 +4 0 0 620 760 +4 0 0 0 1791 +4 42 40 379 376 +4 185 158 465 133 +4 0 748 0 1148 +4 1859 0 0 0 +4 1379 1430 707 1726 +4 40 37 1723 1983 +4 1051 1787 67 0 +4 2010 0 675 699 +4 1951 110 923 843 +4 0 42 0 144 +4 37 0 573 0 +4 42 40 415 413 +4 64 0 0 0 +4 0 0 110 140 +4 1316 696 0 62 +4 1680 1458 1991 931 +4 1187 1547 1799 206 +4 34 411 33 352 +4 100 0 0 0 +4 0 412 1506 1948 +4 288 43 0 0 +4 0 8 0 1140 +4 40 37 514 1 +4 0 1346 0 0 +4 0 0 582 0 +4 0 0 0 1525 +4 143 0 1282 1965 +4 299 0 27 0 +4 0 1336 0 0 +4 0 256 0 73 +4 693 652 1992 73 +4 572 0 0 0 +4 0 0 0 1184 +4 0 0 29 100 +4 88 282 1710 187 +4 148 950 0 356 +4 492 482 132 167 +4 0 0 1509 1274 +4 61 1 0 572 +4 1777 0 656 0 +4 873 2007 1853 869 +4 1544 0 1659 0 +4 543 0 71 0 +4 501 444 228 406 +4 51 278 0 0 +4 0 68 0 0 +4 143 1330 1261 0 +4 1098 71 1062 0 +4 926 1302 0 0 +4 39 1272 0 0 +4 0 518 0 0 +4 1363 822 1367 1409 +4 0 114 0 0 +4 377 1014 177 774 +4 0 1660 0 814 +4 52 1854 0 0 +4 0 69 0 0 +4 355 5 1830 0 +4 49 438 49 1686 +4 0 1166 0 0 +4 0 1636 0 0 +4 0 28 1303 1218 +4 0 1837 0 0 +4 0 0 91 192 +4 1133 53 0 0 +4 1106 0 0 1620 +4 42 40 515 514 +4 410 397 0 0 +4 0 1494 0 0 +4 65 0 661 0 +4 65 38 549 41 +4 0 2009 74 603 +4 80 149 1151 0 +4 1698 0 0 0 +4 545 43 0 0 +4 0 209 195 595 +4 36 0 554 186 +4 525 38 287 41 +4 1914 28 0 39 +4 0 174 0 0 +4 444 0 406 0 +4 32 35 136 500 +4 160 160 294 293 +4 1923 1214 1435 1857 +4 0 0 623 0 +4 313 1113 1400 588 +4 0 0 1788 161 +4 0 1381 0 1528 +4 1149 0 811 0 +4 592 27 0 0 +4 0 1391 0 618 +4 0 202 0 0 +4 0 761 0 0 +4 0 0 0 1378 +4 0 0 478 1946 +4 404 362 360 239 +4 0 81 0 217 +4 1107 0 601 0 +4 1941 528 27 184 +4 695 0 0 0 +4 1585 1222 190 407 +4 0 541 1944 217 +4 908 130 909 282 +4 280 41 281 43 +4 0 0 1633 1936 +4 479 392 266 310 +4 0 1987 765 1111 +4 0 0 1696 1976 +4 0 51 1621 1530 +4 960 0 713 0 +4 1615 57 1810 1999 +4 342 41 343 384 +4 87 0 0 0 +4 65 38 257 41 +4 1011 1589 1353 0 +4 1118 871 1137 1034 +4 664 0 44 0 +4 0 0 81 0 +4 966 876 0 570 +4 718 1429 121 0 +4 0 1809 394 1334 +4 654 0 635 0 +4 1760 1785 927 1851 +4 129 1 2 1 +4 307 43 0 0 +4 0 1751 0 106 +4 457 1563 560 0 +4 0 737 587 0 +4 115 0 0 0 +4 0 1737 28 820 +4 269 159 544 268 +4 0 0 36 1996 +4 348 220 347 219 +4 2013 1493 681 1281 +4 313 0 0 0 +4 647 641 383 130 +4 0 0 0 1676 +4 0 1754 0 957 +4 742 1926 40 0 +4 42 40 194 520 +4 304 34 29 33 +4 0 0 28 587 +4 0 0 1480 51 +4 958 0 726 0 +4 1581 1046 369 552 +4 0 1484 0 657 +4 536 497 358 331 +4 1597 1039 0 900 +4 0 321 0 55 +4 0 0 710 0 +4 51 164 0 0 +4 0 1121 0 831 +4 0 0 75 75 +4 362 380 239 29 +4 1884 73 0 0 +4 1235 0 789 0 +4 1145 71 512 36 +4 472 1971 0 0 +4 503 0 1846 0 +4 0 76 1374 678 +4 1206 0 0 0 +4 792 1322 798 1670 +4 0 1376 1388 615 +4 1847 0 0 0 +4 0 0 143 0 +4 36 0 27 1578 +4 250 41 546 43 +4 66 0 1663 1630 +4 1188 502 0 151 +4 0 1970 2008 853 +4 68 1724 207 210 +4 1556 1501 166 198 +4 978 1129 709 553 +4 1978 2004 1907 607 +4 346 43 0 0 +4 547 43 0 0 +4 858 569 0 54 +4 1154 1016 0 0 +4 0 0 487 1681 +4 1902 1618 0 0 +4 195 0 0 0 +4 311 0 930 187 +4 933 1901 0 0 +4 0 121 1924 264 +4 44 494 373 253 +4 1572 1571 196 855 +4 0 1488 1350 1035 +4 0 0 0 138 +4 154 1335 0 445 +4 0 1654 0 852 +4 0 1891 72 5 +4 467 468 0 0 +4 0 209 0 1138 +4 0 510 0 1783 +4 1587 1757 1060 1025 +4 920 291 0 0 +4 1326 1518 1369 0 +4 113 0 0 0 +4 0 0 0 1808 +4 839 0 0 0 +4 1763 0 804 0 +4 1981 0 0 0 +4 1531 0 0 0 +4 0 0 0 110 +4 394 1136 0 0 +4 114 1236 0 39 +4 0 0 1412 0 +4 63 0 0 0 +4 790 0 1860 0 +4 0 0 0 1658 +4 457 0 560 0 +4 784 929 0 0 +4 0 1091 0 0 +4 528 0 113 0 +4 37 0 1945 0 +4 0 491 340 227 +4 0 0 1767 0 +4 0 1569 0 1027 +4 284 1331 0 0 +4 393 440 254 398 +4 0 0 1790 1747 +4 0 0 0 1377 +4 1553 0 100 0 +4 1175 628 0 0 +4 95 0 0 0 +4 1067 176 1780 57 +4 0 0 36 1684 +4 40 37 420 84 +4 0 0 1952 1071 +4 0 42 0 477 +4 130 286 283 199 +4 383 286 1244 199 +4 0 0 1365 1313 +4 68 189 0 0 +4 0 0 1704 1641 +4 365 263 32 35 +4 1592 0 1202 1900 +4 1128 0 44 1 +4 27 1056 0 0 +4 963 1963 0 0 +4 0 1937 1010 0 +4 0 878 0 66 +4 598 0 0 0 +4 119 1144 1021 845 +4 418 244 1201 389 +4 0 0 0 539 +4 195 1885 0 0 +4 0 518 0 28 +4 27 290 0 0 +4 832 1485 0 74 +4 0 0 86 0 +4 134 1 2 1 +4 441 0 489 0 +4 1396 53 1293 0 +4 0 0 69 1534 +4 1560 0 1878 0 +4 52 0 0 0 +4 0 0 1984 0 +4 1817 1638 55 0 +4 184 0 106 0 +4 1915 1450 0 0 +4 905 1114 1602 64 +4 1672 1667 1437 0 +4 287 41 288 43 +4 178 27 0 0 +4 1065 57 0 0 +4 1271 0 663 0 +4 1502 301 60 27 +4 526 0 1224 0 +4 0 0 44 1734 +4 0 0 0 123 +4 42 235 51 214 +4 29 300 488 302 +4 197 0 0 0 +4 550 554 0 0 +4 167 0 510 36 +4 0 0 412 242 +4 0 42 0 194 +4 999 993 530 2006 +4 30 0 27 154 +4 248 41 545 43 +4 0 579 0 85 +4 126 423 419 249 +4 76 38 344 41 +4 344 41 346 43 +4 0 29 1825 1 +4 85 0 1931 0 +4 1514 1949 200 158 +4 741 0 1312 0 +4 233 299 40 27 +4 163 41 201 43 +4 1831 1745 1038 659 +4 584 78 1075 1896 +4 582 38 911 41 +4 0 29 0 1703 +4 32 259 29 300 +4 0 0 1985 0 +4 1756 1 1258 0 +4 1607 1543 1033 1933 +4 281 43 0 0 +4 368 258 55 224 +4 0 516 345 1200 +4 1490 932 0 0 +4 0 0 28 1567 +4 736 577 0 1743 +4 0 0 60 1812 +4 1242 627 0 0 +4 0 61 0 1625 +4 1593 0 613 0 +4 0 0 1594 0 +4 83 0 0 0 +4 28 38 382 238 +4 40 37 474 0 +4 53 0 44 1 +4 1849 56 0 0 +4 0 0 485 0 +4 0 994 0 1348 +4 0 39 0 1421 +4 1693 1677 1018 850 +4 0 1601 0 1373 +4 1473 1446 0 0 +4 0 0 121 0 +4 1619 1542 849 229 +4 0 0 140 0 +4 1622 1304 27 0 +4 542 1257 39 386 +4 1161 914 67 1858 +4 0 1995 0 836 +4 91 192 342 41 +4 0 38 248 41 +4 0 0 1773 580 +4 72 807 28 602 +4 439 437 196 90 +4 0 44 1692 0 +4 0 125 0 0 +4 199 0 1955 0 +4 1605 1545 1243 723 +4 1870 1340 422 1077 +4 1249 27 529 0 +4 0 0 0 51 +4 411 83 352 83 +4 0 0 1897 0 +4 0 393 0 254 +4 1058 0 157 0 +4 2002 0 992 1194 +4 0 1894 0 193 +4 786 1279 825 552 +4 0 0 1934 1661 +4 0 0 86 58 +4 0 1687 68 970 +4 1695 1084 1728 1716 +4 1076 1232 2016 36 +4 0 404 0 360 +4 1568 0 701 0 +4 0 0 76 38 +4 0 0 538 1652 +4 1892 0 0 0 +4 764 1262 1750 1906 +4 1393 1929 1078 139 +4 277 221 168 117 +4 0 0 1997 526 +4 1520 1300 0 0 +4 861 0 0 1439 +4 721 1402 0 0 +4 0 1511 0 1220 +4 0 0 207 106 +4 2 1397 135 1 +4 964 0 0 0 +4 0 1596 513 1796 +4 185 1198 0 133 +4 1344 1328 965 1037 +4 0 0 0 1836 +4 1288 1318 0 902 +4 0 339 0 1694 +4 0 584 163 951 +4 0 1666 0 897 +4 0 0 1813 38 +4 1225 712 0 0 +4 0 0 1989 1267 +4 1150 770 0 0 +4 119 496 341 245 +4 1682 114 683 0 +4 887 192 1209 53 +4 322 233 52 40 +4 1221 672 0 0 +4 0 0 512 36 +4 1816 0 649 0 +4 610 0 896 0 +4 1315 0 819 0 +4 0 0 766 0 +4 141 1247 76 1822 +4 639 0 946 0 +4 58 38 250 41 +4 0 0 32 261 +4 0 0 0 180 +4 0 184 537 145 +4 644 642 130 787 +4 201 43 0 0 +4 0 1562 0 1341 +4 367 375 52 43 +4 0 0 28 495 +4 0 0 0 1181 +4 643 646 1876 1126 +4 32 35 173 0 +4 955 271 0 0 +4 423 461 249 842 +4 462 450 754 128 +4 206 0 668 1169 +4 1441 206 691 922 +4 0 102 0 15 +4 535 0 805 29 +4 521 0 812 29 +4 1930 0 470 460 +4 823 0 1079 0 +4 461 0 842 173 +4 0 435 0 1165 +4 0 147 7 98 +4 54 54 936 289 +4 1199 389 1512 1855 +4 10 1415 0 94 +4 34 0 1094 0 +4 0 107 0 8 +4 0 124 0 20 +4 2022 0 2026 2034 +4 0 34 0 33 +4 0 15 0 89 +4 1131 334 0 0 +4 0 395 28 874 +4 442 51 1294 0 +4 716 402 0 0 +4 34 475 33 590 +4 34 436 33 938 +4 2024 767 29 1141 +4 9 97 0 0 +4 32 35 0 0 +4 454 34 29 33 +4 124 0 20 0 +4 29 0 126 2033 +4 758 578 1255 729 +4 0 0 1497 434 +4 29 0 1208 563 +4 54 54 935 289 +4 456 459 943 881 +4 2014 0 0 29 +4 461 0 841 173 +4 29 0 0 1947 +4 0 0 21 123 +4 34 405 33 752 +4 105 82 26 0 +4 895 708 29 2021 +4 1132 334 0 0 +4 505 1979 815 1842 +4 29 0 949 567 +4 535 0 806 29 +4 83 521 83 812 +4 523 0 750 29 +4 97 711 0 3 +4 451 585 335 755 +4 532 338 955 271 +4 0 0 1604 1360 +4 0 34 175 33 +4 0 0 11 111 +4 0 98 0 10 +4 0 432 0 1213 +4 432 372 1213 218 +4 241 0 1095 0 +4 0 0 13 109 +4 15 89 0 127 +4 29 0 1384 1918 +4 1497 434 0 0 +4 823 99 1079 0 +4 173 0 1930 0 +4 0 13 0 109 +4 1158 35 29 212 +4 427 462 295 753 +4 27 0 32 35 +4 442 51 1295 0 +4 1765 1752 1123 265 +4 25 96 0 0 +4 32 35 1167 0 +4 132 167 32 35 +4 32 35 363 0 +4 32 35 29 381 +4 392 0 310 0 +4 29 381 0 39 +4 87 0 16 0 +4 107 1260 0 9 +4 136 504 1215 213 +4 95 0 1604 1360 +4 0 120 25 96 +4 0 11 0 111 +4 0 456 0 942 +4 717 240 160 160 +4 483 728 1053 326 +4 1160 262 0 0 +4 105 1285 0 24 +4 0 94 0 11 +4 87 16 0 0 +4 29 0 1223 555 +4 0 0 470 460 +4 1173 260 29 328 +4 0 122 0 22 +4 19 125 0 0 +4 1054 325 32 35 +4 483 1664 1036 326 +4 462 450 753 128 +4 241 0 33 0 +4 29 0 948 567 +4 108 104 1584 162 +4 1325 555 146 146 +4 55 224 1498 255 +4 432 372 1212 218 +4 0 0 1606 1574 +4 63 534 63 801 +4 456 459 942 880 +4 101 95 0 12 +4 0 97 0 6 +4 29 0 1387 562 +4 936 289 32 35 +4 0 34 363 33 +4 1407 1973 385 1273 +4 0 442 0 1295 +4 459 452 880 55 +4 0 19 0 125 +4 0 0 10 1415 +4 152 523 152 829 +4 0 34 1169 33 +4 0 4 0 147 +4 122 22 0 18 +4 11 111 0 99 +4 1216 213 401 396 +4 1199 389 1513 1855 +4 14 101 0 0 +4 585 0 755 29 +4 2029 0 1125 117 +4 122 0 22 0 +4 29 0 697 1961 +4 3 105 0 0 +4 392 0 310 1440 +4 1802 0 778 29 +4 948 567 492 482 +4 1406 2014 385 0 +4 0 0 32 260 +4 104 14 0 0 +4 91 0 1125 117 +4 229 381 0 39 +4 436 152 938 152 +4 1617 2027 596 622 +4 0 0 19 125 +4 119 0 351 71 +4 0 0 1173 260 +4 1123 265 32 35 +4 1818 731 1146 225 +4 82 2019 0 120 +4 1254 2031 1059 969 +4 1973 0 1273 29 +4 0 0 1337 0 +4 12 107 0 0 +4 697 1961 483 1664 +4 532 338 956 271 +4 0 0 23 1287 +4 435 378 1165 566 +4 1019 575 439 437 +4 4 698 0 98 +4 29 0 758 578 +4 1401 578 509 507 +4 17 21 0 123 +4 574 206 565 668 +4 1020 575 439 437 +4 762 0 837 0 +4 1157 262 0 0 +4 687 35 0 0 +4 711 0 3 0 +4 0 34 0 1097 +4 1167 0 1401 578 +4 0 105 0 26 +4 395 0 875 0 +4 1223 555 146 146 +4 34 186 33 179 +4 488 302 1160 262 +4 574 1802 565 778 +4 0 395 0 875 +4 0 432 0 1212 +4 107 137 8 0 +4 104 0 14 0 +4 34 186 1096 179 +4 1285 0 24 0 +4 534 0 802 29 +4 1498 255 716 402 +4 34 0 33 28 +4 956 271 0 0 +4 95 12 0 0 +4 436 152 939 152 +4 1260 0 9 0 +4 88 87 0 16 +4 1053 326 32 35 +4 34 443 1097 1102 +4 459 452 881 55 +4 451 585 335 756 +4 0 2018 530 0 +4 1174 35 229 381 +4 1389 240 160 160 +4 0 0 15 89 +4 405 1441 751 691 +4 516 1959 370 677 +4 2032 0 90 29 +4 505 1979 815 1843 +4 1496 434 27 0 +4 32 260 29 328 +4 395 0 874 0 +4 29 0 1211 563 +4 895 708 29 33 +4 1255 729 1122 265 +4 435 378 1164 566 +4 1617 2028 596 622 +4 29 0 1325 555 +4 443 63 1103 63 +4 405 1442 752 700 +4 0 535 0 805 +4 200 34 364 1094 +4 137 9 0 0 +4 423 461 249 841 +4 29 0 1504 1972 +4 1354 402 0 0 +4 136 504 1216 213 +4 34 405 33 751 +4 488 302 1157 262 +4 34 443 33 1103 +4 0 52 1132 334 +4 1211 563 0 0 +4 0 66 530 0 +4 32 35 29 212 +4 380 241 29 33 +4 523 0 829 29 +4 0 125 0 17 +4 454 34 29 1096 +4 29 0 1333 562 +4 34 436 33 939 +4 0 0 1440 175 +4 1254 2017 1059 969 +4 124 20 0 0 +4 1442 1994 700 662 +4 211 109 1337 102 +4 34 475 33 591 +4 1499 255 1354 402 +4 0 0 1584 0 +4 200 34 29 33 +4 119 0 351 2025 +4 175 0 1020 575 +4 18 124 0 0 +4 762 0 837 111 +4 39 200 0 364 +4 24 122 0 0 +4 443 63 1102 63 +4 1333 562 54 54 +4 0 142 5 94 +4 0 123 0 23 +4 7 98 0 0 +4 427 462 295 754 +4 949 567 492 482 +4 0 99 0 13 +4 0 435 0 1164 +4 0 101 1606 1574 +4 521 0 813 363 +4 146 146 1054 325 +4 0 456 0 943 +4 1215 213 401 396 +4 475 1407 590 385 +4 0 1947 483 728 +4 206 0 922 29 +4 363 0 717 240 +4 1208 563 0 0 +4 0 52 1131 334 +4 0 0 1496 434 +4 475 1406 591 385 +4 29 0 1389 240 +4 39 200 0 29 +4 21 123 0 0 +4 63 534 63 802 +4 585 0 756 29 +4 146 146 1055 325 +4 1994 0 662 29 +4 55 224 1499 255 +4 83 521 83 813 +4 0 0 1174 35 +4 23 1287 0 96 +4 1387 562 54 54 +4 175 0 1019 575 +4 0 10 0 142 +4 935 289 687 35 +4 1819 731 1146 225 +4 132 167 1158 35 +4 1055 325 32 35 +4 0 96 0 4 +4 1504 1972 1765 1752 +4 1036 326 32 35 +4 0 0 4 698 +4 1384 1918 509 507 +4 16 108 0 0 +4 1122 265 32 35 +4 95 0 12 0 +4 380 241 29 1095 +4 32 767 29 1141 +4 0 442 0 1294 +4 534 0 801 29 +4 152 523 152 750 +4 150 3 0 0 +4 5 94 0 0 +4 0 535 0 806 +4 97 150 6 0 +4 2030 0 2020 2023 +4 516 1958 370 677 +5 2035 0 2035 0 +5 0 2042 0 2040 +5 0 2039 0 2037 +5 2046 2048 0 0 +5 0 2051 0 0 +5 0 2050 0 2047 +5 2036 2038 0 0 +5 2041 2043 0 0 +5 2047 0 2045 0 +5 0 2060 0 2058 +5 2061 2059 0 0 +5 2040 0 2039 0 +5 0 2057 0 2052 +5 0 2062 0 0 +5 2054 2056 0 0 +5 0 0 2043 0 +5 0 0 2042 0 +5 2053 0 0 0 +5 0 0 2044 2046 +5 0 2049 0 0 +5 0 2063 0 0 +5 0 0 2038 2041 +5 0 0 2056 0 +5 2066 2068 0 0 +5 2058 0 0 0 +5 0 0 2057 0 +5 0 2067 0 2064 +5 0 0 2048 2054 +5 0 0 0 2055 +5 2055 0 2049 0 +5 0 0 2051 2053 +5 2073 2080 0 0 +5 2052 0 2050 0 +5 2069 2071 0 0 +5 0 2079 0 2074 +5 0 0 0 2061 +5 0 2085 0 2072 +5 2076 2078 0 0 +5 0 0 2059 2069 +5 0 0 2062 2066 +5 0 2087 0 2082 +5 0 2070 0 2065 +5 2081 2088 0 0 +5 2065 0 2060 0 +5 2064 0 2063 0 +5 2083 2086 0 0 +5 2072 0 2077 0 +5 2101 2100 0 0 +5 0 0 2068 2073 +5 2089 0 0 0 +5 2075 0 2070 0 +5 0 2099 0 0 +5 0 2093 0 2092 +5 0 0 2080 2083 +5 0 0 2078 2081 +5 0 0 2071 2076 +5 2091 2094 0 0 +5 2082 0 2079 0 +5 0 2098 0 0 +5 0 2077 0 2075 +5 2074 0 2067 0 +5 0 2096 0 2097 +5 2103 2106 0 0 +5 0 0 0 2105 +5 2097 0 0 0 +5 0 0 0 2101 +5 2104 0 2096 0 +5 2110 2117 0 0 +5 2114 2121 0 0 +5 2090 0 2085 0 +5 0 0 2086 2091 +5 2092 0 2087 0 +5 0 2113 0 2112 +5 2038 2041 0 0 +5 0 0 2094 0 +5 0 0 2100 2103 +5 2105 0 2099 0 +5 0 0 2098 2102 +5 0 0 2093 0 +5 0 0 0 2090 +5 2102 0 0 0 +5 0 0 2088 2089 +5 0 2120 0 2115 +5 2111 2036 0 0 +5 2109 0 2108 0 +5 2112 0 0 0 +5 2048 2054 0 0 +5 0 2037 0 2109 +5 2043 0 0 0 +5 2051 2053 0 0 +5 0 0 2117 2114 +5 2115 0 2113 0 +5 0 2052 0 2050 +5 0 0 2036 2038 +5 0 2047 0 2045 +5 0 0 0 2110 +5 2039 0 2037 0 +5 0 2108 0 2104 +5 2044 2046 0 0 +5 0 2040 0 2039 +5 0 0 2106 2111 +5 2056 0 0 0 +5 0 2065 0 2060 +5 0 2061 0 0 +5 2042 0 2040 0 +5 2062 2066 0 0 +5 2068 2073 0 0 +5 0 2055 0 2049 +5 0 2045 0 2123 +5 2057 0 2052 0 +5 2059 2069 0 0 +5 0 0 2121 2044 +5 0 2122 0 0 +5 0 0 0 2051 +5 0 2064 0 2063 +5 0 0 2054 2056 +5 0 0 0 2042 +5 0 0 2053 0 +5 0 0 0 2057 +5 2037 0 2122 2036 +5 2071 2076 0 0 +5 0 2058 0 0 +5 0 2124 0 0 +5 0 2074 0 2067 +5 2125 2044 0 0 +5 0 0 2055 0 +5 2045 0 2120 0 +5 2049 0 0 0 +5 0 0 2046 2048 +5 0 0 2041 2043 +5 2050 0 2047 0 +5 2067 0 2064 0 +5 2088 2089 0 0 +5 2060 0 2058 0 +5 0 2075 0 2070 +5 0 0 2069 2071 +5 0 0 0 2062 +5 0 0 2061 2059 +5 0 0 2066 2068 +5 0 2082 0 2079 +5 2086 2091 0 0 +5 0 2092 0 2087 +5 2123 0 2124 2125 +5 2070 0 2065 0 +5 2063 0 0 0 +5 2080 2083 0 0 +5 2078 2081 0 0 +5 0 0 2090 0 +5 2079 0 2074 0 +5 2077 0 2075 0 +5 0 2105 0 2099 +5 0 2110 0 0 +5 0 0 2081 2088 +5 0 2104 0 2096 +5 2087 0 2082 0 +5 0 2112 0 0 +5 0 0 0 2093 +5 0 2090 0 2085 +5 0 0 2089 0 +5 2100 2103 0 0 +5 0 0 2073 2080 +5 0 0 2091 2094 +5 2098 2102 0 0 +5 0 0 2083 2086 +5 2085 0 2072 0 +5 2094 0 0 0 +5 2093 0 2092 0 +5 0 0 2076 2078 +5 0 2072 0 2077 +5 2099 0 0 0 +5 0 2109 0 2108 +5 2117 2114 0 0 +5 0 2101 0 0 +5 0 0 2105 0 +5 0 2115 0 2113 +5 2108 0 2104 0 +5 0 2097 0 0 +5 0 0 0 2098 +5 2096 0 2097 0 +5 0 0 2102 0 +5 2106 2111 0 0 +5 0 0 2103 2106 +5 0 2045 0 2120 +5 0 0 2101 2100 +5 2121 2044 0 0 +5 0 0 2114 2121 +5 0 0 2110 2117 +5 0 0 2111 2036 +5 2120 0 2115 0 +5 2037 0 2109 0 +5 2113 0 2112 0 +5 2194 2156 2153 2155 +5 0 0 0 2188 +5 0 0 2162 0 +5 2130 0 2130 0 +5 0 0 2140 0 +5 2317 2911 0 2334 +5 2035 2653 2143 2776 +5 2035 2147 2035 2157 +5 2566 0 2309 2514 +5 0 0 0 2166 +5 2892 2352 2860 3272 +5 2185 2227 0 3045 +5 0 0 3103 0 +5 2515 2544 2547 2763 +5 0 2498 0 2350 +5 2119 0 2376 0 +5 3033 2084 2443 0 +5 3157 2623 2643 2191 +5 0 0 2412 2118 +5 3149 2672 2456 2619 +5 3237 2118 2906 2084 +5 0 2095 2264 2276 +5 2354 2337 2381 2610 +5 3311 2757 3244 2593 +5 2385 2409 3211 2790 +5 3285 0 2304 3188 +5 0 0 2569 2802 +5 2826 0 2868 2728 +5 2095 2119 2572 2382 +5 0 2573 0 2731 +5 3171 2966 2923 2257 +5 2402 0 0 0 +5 2496 0 0 0 +5 0 3190 0 2475 +5 2516 2685 0 0 +5 2449 2364 0 0 +5 0 0 2754 2613 +5 2359 2577 2741 2417 +5 2525 2383 3057 2285 +5 2190 2360 0 2386 +5 2142 0 2131 0 +5 2494 2116 0 0 +5 0 0 3284 3078 +5 2119 0 2638 0 +5 2265 2803 2377 2796 +5 2131 2483 2035 0 +5 0 2736 0 0 +5 2148 2158 2843 2792 +5 2131 3264 2035 2958 +5 3125 3185 2332 2970 +5 2595 3085 2628 2570 +5 0 2164 0 2167 +5 3269 0 2992 2999 +5 0 0 2979 2118 +5 2107 2961 2234 2159 +5 0 2390 0 0 +5 0 0 0 2275 +5 0 3212 0 2242 +5 2984 2154 3155 3165 +5 2782 2869 2811 2998 +5 2333 2084 2358 0 +5 2136 2318 2136 2884 +5 2310 0 3276 3056 +5 3278 2565 0 0 +5 2476 2177 2315 0 +5 0 0 2269 2654 +5 0 0 3257 0 +5 2107 0 2245 3123 +5 2457 2423 2608 2435 +5 0 0 3082 3253 +5 0 3142 0 2648 +5 0 0 2759 2174 +5 2232 2904 3291 3111 +5 3115 0 0 0 +5 2752 0 0 0 +5 2139 0 2035 0 +5 0 2107 0 2975 +5 2461 0 2739 0 +5 2311 2837 3060 2329 +5 0 3005 0 0 +5 0 0 2175 0 +5 2119 0 2599 0 +5 3041 2116 0 0 +5 0 0 2555 0 +5 2166 3178 2764 3132 +5 0 0 2248 3232 +5 2719 0 0 0 +5 2671 3214 2957 2780 +5 0 2307 0 3182 +5 3199 2116 0 0 +5 3205 0 2468 0 +5 0 0 3129 0 +5 2272 2116 0 0 +5 2345 0 0 0 +5 2950 2141 3052 0 +5 0 2785 0 0 +5 0 2833 0 0 +5 2119 0 2931 0 +5 2195 3163 2602 2271 +5 0 0 0 2169 +5 0 3187 0 3173 +5 2150 0 0 0 +5 2808 0 2639 0 +5 0 0 3218 2413 +5 2144 2682 3287 2554 +5 3159 0 2438 0 +5 2035 3054 2035 2424 +5 0 2617 0 0 +5 2095 2119 2322 3198 +5 0 2720 0 2889 +5 2107 0 3292 2936 +5 2850 2490 3134 2255 +5 0 0 0 2824 +5 0 0 0 2553 +5 2422 3081 0 2786 +5 2095 2119 2765 2230 +5 0 0 2935 0 +5 0 0 2891 2591 +5 2910 2709 3101 2723 +5 2193 0 3217 2171 +5 2636 3259 2784 3017 +5 3035 3065 3207 2702 +5 0 0 2375 2118 +5 0 2903 0 3090 +5 0 0 2532 3092 +5 0 2852 2800 3194 +5 3012 2116 0 0 +5 0 2735 0 0 +5 0 3096 0 3227 +5 2415 2484 2548 2854 +5 2107 0 2464 2132 +5 2190 2504 0 2470 +5 0 0 2675 2118 +5 3297 0 2734 0 +5 0 2861 0 0 +5 3044 3305 2943 2541 +5 0 0 2362 0 +5 2980 3274 0 2288 +5 0 2138 0 2137 +5 0 0 2716 0 +5 2421 0 0 0 +5 2629 2895 2859 3300 +5 3200 2762 2964 0 +5 2699 2680 3126 3262 +5 0 0 0 2669 +5 0 2137 0 0 +5 2480 2116 0 0 +5 0 0 2963 2729 +5 3094 0 0 0 +5 2131 0 2035 2400 +5 3108 2940 2277 2804 +5 0 0 3023 0 +5 2387 0 2331 2717 +5 0 2095 2474 2428 +5 0 0 3068 2347 +5 0 3011 0 3223 +5 0 0 0 2571 +5 2256 2116 0 0 +5 2035 2871 2035 2450 +5 0 0 2341 2459 +5 0 2181 0 0 +5 2560 2540 2690 3086 +5 0 2745 2922 0 +5 2606 3105 2442 2379 +5 2983 2084 2145 0 +5 2829 2084 2846 0 +5 0 0 2985 2715 +5 0 2831 2527 2185 +5 0 0 3122 0 +5 2133 0 2556 2116 +5 3263 0 3193 2116 +5 3222 0 2192 2150 +5 2732 0 2622 2116 +5 0 0 0 2930 +5 2267 0 3153 0 +5 2035 2176 2035 2737 +5 2095 2119 2451 2710 +5 2900 0 2368 3281 +5 0 0 0 2407 +5 2908 3137 2678 2944 +5 0 2095 2196 3138 +5 2170 0 0 0 +5 3156 2818 3121 2698 +5 2463 2084 2596 0 +5 2905 3073 0 0 +5 0 2880 0 0 +5 3104 0 0 2708 +5 0 0 2916 0 +5 2753 2444 0 0 +5 0 2095 2951 2902 +5 0 0 3238 2118 +5 0 2107 0 2746 +5 2119 0 2517 0 +5 3309 0 2651 2116 +5 0 0 3038 3107 +5 2035 0 2689 2151 +5 0 0 3051 3250 +5 2788 2848 0 3102 +5 3289 2118 2522 2084 +5 3306 2084 2844 0 +5 2186 2165 3071 2401 +5 0 2897 3255 0 +5 2994 2340 3296 2314 +5 0 2761 0 2524 +5 3275 2604 3032 2509 +5 2146 2766 2160 2810 +5 2246 0 3260 2684 +5 0 2789 0 2597 +5 0 2404 0 0 +5 0 0 0 2500 +5 2182 0 2297 2116 +5 2182 0 3075 2116 +5 0 2107 0 3048 +5 3131 3143 2659 2727 +5 0 2167 0 0 +5 2254 2116 0 0 +5 2303 2814 2600 3141 +5 0 0 3201 2486 +5 0 3002 0 0 +5 2294 0 0 0 +5 2035 2176 2035 3066 +5 0 2432 0 2510 +5 2446 3242 3034 2240 +5 0 0 2293 2392 +5 2336 2482 2584 2370 +5 0 3037 0 0 +5 2146 0 2160 0 +5 2778 2948 2396 2770 +5 0 2445 2618 3295 +5 2367 2679 0 2489 +5 2574 0 0 0 +5 2181 0 0 0 +5 2241 2645 0 3279 +5 3029 2913 2466 2816 +5 2299 3026 2773 2491 +5 0 0 2849 3042 +5 0 0 2414 3110 +5 2535 2564 3117 2625 +5 3220 2118 3059 2084 +5 0 0 0 2899 +5 3183 3240 0 2179 +5 3047 2587 2921 0 +5 0 2107 0 2920 +5 2072 0 2640 3006 +5 2136 2886 2767 2730 +5 2289 3196 0 2405 +5 0 2095 2374 3186 +5 2119 0 2914 0 +5 3013 0 2301 2536 +5 2472 3069 0 0 +5 0 0 3087 3256 +5 2148 2158 3053 3162 +5 3130 2397 0 2533 +5 2674 2327 0 0 +5 0 0 3210 2458 +5 2119 0 2282 0 +5 0 3015 0 3170 +5 0 0 2411 0 +5 0 0 2941 2588 +5 0 0 2832 0 +5 2107 0 2703 2330 +5 2319 3095 3286 3000 +5 2035 2511 2857 2497 +5 0 3225 0 0 +5 2713 0 0 0 +5 0 2518 2781 2962 +5 2261 3007 2751 2932 +5 2366 2982 3176 0 +5 2186 2165 2513 2774 +5 2403 0 0 0 +5 2437 3161 2755 2893 +5 3116 0 0 0 +5 2797 2801 2807 2974 +5 2193 0 2670 2171 +5 2119 0 3221 0 +5 3167 3031 2652 2969 +5 3219 2787 0 2389 +5 3208 2084 2545 0 +5 0 0 2372 2118 +5 0 0 0 2877 +5 2133 0 3189 2116 +5 0 2988 0 0 +5 2835 3265 0 0 +5 3112 3228 2260 2733 +5 2107 0 2748 2919 +5 2722 2116 0 0 +5 2192 2151 2627 2667 +5 2589 0 0 0 +5 0 0 0 2650 +5 0 2313 3202 2825 +5 2529 2487 2507 2481 +5 2035 3303 2035 0 +5 0 0 2154 0 +5 0 2095 2132 2325 +5 3009 2237 3273 2373 +5 3206 0 3184 0 +5 0 0 0 2477 +5 0 2872 2795 3236 +5 2107 0 2298 2132 +5 2879 2768 2616 2956 +5 2274 3097 2253 0 +5 2695 2306 2523 3307 +5 3119 3294 2361 3247 +5 3088 3151 0 0 +5 3050 0 3235 2938 +5 2250 0 0 0 +5 0 2095 2885 2668 +5 2812 2662 2506 0 +5 2677 3018 3074 0 +5 3148 2841 2947 0 +5 3093 2118 2724 2084 +5 0 0 0 2878 +5 0 2107 0 2363 +5 3230 0 3246 2965 +5 2119 0 2847 0 +5 2119 0 3136 0 +5 0 0 2258 0 +5 3224 2870 0 0 +5 2894 0 3106 0 +5 2718 2634 3113 3158 +5 3174 2170 0 0 +5 0 2107 0 2656 +5 0 2273 0 3089 +5 2119 0 2644 0 +5 2890 3252 0 0 +5 0 3282 0 2874 +5 0 2995 2937 2915 +5 0 0 0 3248 +5 0 0 3192 2118 +5 2696 0 3027 0 +5 2139 2353 2035 2300 +5 2295 2896 0 0 +5 3020 2116 0 0 +5 0 2183 0 0 +5 2865 0 2420 2116 +5 0 0 0 2287 +5 2434 0 3172 2116 +5 3083 2084 2133 0 +5 2580 3270 3010 0 +5 2144 2144 2505 2485 +5 2855 2740 0 2875 +5 2229 2642 2756 2856 +5 2700 2960 2543 3127 +5 0 3304 0 2876 +5 0 2095 2455 2918 +5 0 3267 0 3098 +5 2557 3293 0 0 +5 2631 2084 2231 0 +5 0 0 2712 0 +5 3024 3298 0 3076 +5 2981 3114 2348 2954 +5 2465 2772 2084 0 +5 2095 2119 2693 3268 +5 3203 2839 2542 3064 +5 2308 0 2291 2452 +5 2851 2118 2632 2084 +5 2691 2419 3070 2738 +5 0 0 0 2141 +5 2095 2119 2519 2249 +5 0 0 2493 0 +5 0 0 2430 0 +5 3145 0 3271 3177 +5 2035 0 3146 0 +5 0 0 2917 0 +5 2469 2592 0 0 +5 2135 0 0 0 +5 2683 2084 2145 2312 +5 2292 0 0 0 +5 2266 0 2853 0 +5 2143 2147 2035 2157 +5 2842 2189 0 0 +5 0 0 2399 0 +5 2681 2955 3226 2416 +5 3036 2394 2949 2805 +5 2621 2750 3120 3072 +5 2692 2436 2647 2467 +5 0 0 3135 2612 +5 2946 3118 2284 2135 +5 2907 2244 3063 0 +5 0 0 3022 2118 +5 3160 0 2035 2161 +5 2262 2095 2561 2581 +5 0 2174 0 0 +5 0 3019 0 2663 +5 2173 2552 3046 3109 +5 0 2278 2959 2688 +5 2499 2637 0 2769 +5 3124 2118 2809 2084 +5 2365 2605 2398 2084 +5 2798 2978 2563 0 +5 2775 2562 0 0 +5 3058 2912 3266 0 +5 2924 2238 2585 2418 +5 3234 3147 0 2344 +5 2686 3043 0 0 +5 2791 2822 2342 2725 +5 2537 2744 3079 2705 +5 0 2838 0 2179 +5 0 2141 0 0 +5 2107 0 2460 2159 +5 2971 0 0 0 +5 2986 2118 2929 2084 +5 2410 0 2777 0 +5 3310 2873 3001 2406 +5 0 2576 0 0 +5 0 2169 0 2183 +5 2558 3028 2707 2538 +5 2575 3197 2828 3061 +5 2035 2371 2139 2550 +5 2142 3245 0 0 +5 0 2107 0 2270 +5 0 2107 0 2343 +5 2987 3233 2620 2673 +5 0 0 0 2934 +5 0 0 0 2164 +5 3025 0 2711 0 +5 2973 0 0 2863 +5 3290 3288 2084 0 +5 2501 2137 2830 0 +5 3139 3140 2134 2134 +5 0 0 0 2749 +5 2142 0 0 2233 +5 0 0 2793 0 +5 2388 2118 2384 2084 +5 0 2107 0 2909 +5 0 0 0 2138 +5 0 0 3283 2993 +5 0 0 0 2928 +5 0 0 2624 2247 +5 3215 2845 0 0 +5 0 0 0 2590 +5 2448 3277 2927 3254 +5 0 2840 2328 3080 +5 3084 2084 2972 0 +5 0 2095 2196 2281 +5 2512 0 2189 0 +5 2095 2119 2425 2378 +5 2462 0 2783 3067 +5 2320 2118 2953 2084 +5 2235 2813 0 0 +5 3055 2118 2694 2084 +5 2439 2794 2649 2823 +5 2131 2779 2035 2967 +5 2704 0 2508 0 +5 0 2252 0 2471 +5 0 2095 3016 3299 +5 2815 0 0 0 +5 2133 0 3308 2116 +5 0 2534 0 0 +5 2316 0 0 0 +5 2641 2817 2263 2546 +5 0 0 3166 2138 +5 2721 0 0 0 +5 2426 3195 3258 2882 +5 3091 0 0 3150 +5 0 2676 3175 0 +5 2526 0 0 0 +5 0 2726 0 3077 +5 2107 0 3180 2132 +5 0 2862 2968 2898 +5 2883 0 2747 2836 +5 2095 2119 2502 2551 +5 0 0 0 2742 +5 2239 2666 2603 3030 +5 0 0 2302 2118 +5 2035 2827 2035 2135 +5 2107 0 2661 2598 +5 0 0 0 2495 +5 3040 3003 2939 3099 +5 0 0 0 2578 +5 2665 0 0 0 +5 0 2586 0 0 +5 0 2095 2635 2664 +5 0 2521 0 0 +5 2655 0 2559 0 +5 2143 2925 2035 2630 +5 2977 3039 2134 2134 +5 0 2107 0 2658 +5 2633 2173 0 0 +5 0 0 3008 0 +5 2095 2119 2866 2408 +5 3239 2369 2579 2582 +5 2380 2528 0 0 +5 0 0 2834 2758 +5 2107 0 2453 2687 +5 0 0 3301 2118 +5 2996 2626 3216 2503 +5 0 2356 3154 2531 +5 0 0 0 2799 +5 2035 0 2035 2161 +5 0 2427 0 3359 +5 3434 2126 2152 2208 +5 0 3213 2933 3508 +5 0 2990 0 2549 +5 2128 2431 0 0 +5 3371 3380 2225 2901 +5 3358 2858 2172 2152 +5 0 3302 0 2391 +5 2614 2441 2060 2217 +5 3599 2819 2286 2195 +5 2202 3313 2220 2127 +5 3458 0 0 3453 +5 2191 0 2714 0 +5 2128 2351 0 3549 +5 2184 3524 2447 3573 +5 3363 2126 0 0 +5 2393 2251 3440 2346 +5 2128 3420 2206 3365 +5 0 3213 2933 3539 +5 2203 2611 2168 3509 +5 2163 2268 3376 3575 +5 2323 2820 2290 2187 +5 0 0 3280 2429 +5 3315 2926 0 0 +5 3322 3343 3465 0 +5 2178 3483 2223 2660 +5 2942 0 2228 0 +5 2128 2351 0 0 +5 0 3333 3554 3421 +5 2076 2078 0 2657 +5 2323 2820 0 0 +5 2568 3169 2488 3515 +5 2128 3373 0 0 +5 3366 2126 3484 2200 +5 3442 3534 3357 2219 +5 2130 2108 2130 2104 +5 2202 3608 3398 3416 +5 2539 0 3164 0 +5 2335 0 0 0 +5 2520 3447 2212 3529 +5 3381 2479 2163 2129 +5 0 3346 0 3463 +5 2473 3191 0 0 +5 2222 2771 2203 3209 +5 0 3408 0 2395 +5 3569 3454 2184 2976 +5 3530 2324 3410 0 +5 2821 3316 2217 2172 +5 2615 0 0 0 +5 3490 2211 0 0 +5 2567 3513 2338 2236 +5 0 0 2177 0 +5 0 3468 0 2129 +5 2128 3485 0 0 +5 3249 3320 0 0 +5 0 2201 0 2901 +5 0 2127 0 3595 +5 0 2321 0 2129 +5 0 3577 0 3504 +5 2128 3385 0 0 +5 2036 2038 3280 2429 +5 0 2646 0 3181 +5 2864 3340 3345 2172 +5 0 3377 0 2660 +5 3318 2427 2178 3335 +5 2204 3479 2225 2127 +5 3555 2259 0 0 +5 3550 2126 0 0 +5 3507 2126 0 0 +5 2222 2127 3616 3563 +5 3334 3581 2149 2129 +5 3602 3445 2218 3413 +5 2326 0 2997 0 +5 3049 3574 0 0 +5 3432 3152 0 2129 +5 3614 2126 0 0 +5 2942 0 2228 2055 +5 2567 3620 2338 2236 +5 0 2479 0 2129 +5 0 3144 0 3557 +5 2128 3004 0 0 +5 0 3407 0 3589 +5 2225 2349 3370 3419 +5 2701 3560 2197 3441 +5 0 3427 0 2697 +5 0 2888 3586 3471 +5 3562 3613 3397 3492 +5 3319 0 3618 2210 +5 3461 2819 2286 2195 +5 2126 3324 0 0 +5 3565 3332 2220 3548 +5 3475 3367 2224 2129 +5 0 2127 0 3486 +5 2393 2251 3327 2346 +5 0 2357 0 2887 +5 0 3241 0 3204 +5 2126 3491 2198 2221 +5 0 3229 0 3611 +5 3455 3542 3021 2197 +5 3336 2211 2180 3466 +5 0 2077 3168 2075 +5 3501 3364 0 0 +5 3062 3415 0 0 +5 0 3532 0 2454 +5 3472 3535 2222 2129 +5 3456 3619 2213 3561 +5 2041 2043 2226 2806 +5 3588 3356 0 0 +5 3527 2126 3425 2205 +5 2128 3337 2187 3406 +5 2609 0 2130 0 +5 3231 3536 0 0 +5 0 3393 0 2976 +5 2128 2583 0 0 +5 3317 2126 2067 2217 +5 2163 3229 2178 3341 +5 2568 3169 2488 3360 +5 3498 3518 2214 3500 +5 0 3482 3417 3571 +5 3344 2440 0 0 +5 2614 2441 0 0 +5 0 2349 0 3591 +5 2130 2037 2130 2109 +5 2126 3372 0 0 +5 0 0 2226 2806 +5 3528 2259 2180 2212 +5 0 2090 2140 2085 +5 0 0 3168 0 +5 2335 2049 0 0 +5 2130 0 2339 0 +5 0 2296 0 2129 +5 3594 2321 2216 2129 +5 2149 2357 3243 2887 +5 2128 3004 2205 3404 +5 0 3499 0 2127 +5 3612 2706 2172 3607 +5 0 2127 0 3603 +5 2128 3423 2208 3424 +5 3431 2952 3609 2198 +5 0 3403 0 2127 +5 3362 0 0 0 +5 0 2268 0 3439 +5 2539 0 3164 2090 +5 2220 2646 3605 3181 +5 3399 3582 2207 3384 +5 2821 3448 0 0 +5 2216 2127 3566 3580 +5 3438 3497 2209 2129 +5 0 3152 0 2129 +5 2447 3388 2149 3474 +5 0 3451 0 2243 +5 2130 2096 2339 2097 +5 2128 3470 0 0 +5 2283 2530 3481 2213 +5 0 2127 0 3538 +5 0 2771 0 3209 +5 2128 2431 2152 3452 +5 2209 2127 2163 3418 +5 3564 3545 3559 3350 +5 2355 3487 0 0 +5 0 3584 0 2991 +5 0 2888 0 3477 +5 2864 3546 0 0 +5 2520 3392 0 0 +5 2609 0 2130 2042 +5 3567 2607 0 0 +5 2283 2530 0 0 +5 3383 2607 3503 2152 +5 3249 3572 2208 2180 +5 2178 3412 3457 2594 +5 2168 3598 3375 2697 +5 0 2881 0 2127 +5 3430 2706 0 0 +5 2216 2945 2204 3382 +5 3323 2478 0 0 +5 3049 3400 2197 2214 +5 2326 2070 2997 2065 +5 0 2097 2177 0 +5 3231 3505 3493 2180 +5 2126 3261 0 0 +5 2126 3570 2213 2219 +5 3556 0 3462 3443 +5 3128 2601 3331 2187 +5 3329 2583 3133 3395 +5 0 3553 0 2129 +5 3476 3435 2187 3021 +5 2184 2760 3511 3396 +5 3543 3473 3179 3521 +5 3353 2478 3444 2290 +5 2867 2989 0 0 +5 3610 3251 2219 0 +5 3243 3144 3355 3596 +5 2224 3241 2215 3204 +5 3576 3464 2199 3446 +5 3489 2126 0 0 +5 0 2039 2175 2037 +5 0 3426 3478 3326 +5 3617 2126 0 0 +5 0 0 0 2657 +5 0 2101 2279 2743 +5 0 2127 0 3510 +5 0 3488 0 2129 +5 2207 3338 2184 2454 +5 3526 3590 0 0 +5 3369 3261 2199 2210 +5 0 3100 0 3517 +5 3506 2952 0 0 +5 2867 2989 2212 2206 +5 2215 2881 2218 3312 +5 3541 3251 0 0 +5 0 3460 0 3361 +5 3592 3428 2214 3133 +5 3014 3547 2198 3342 +5 0 2201 0 3378 +5 2215 0 3325 3349 +5 2106 2111 2095 2280 +5 0 3348 0 2129 +5 3523 3514 0 0 +5 0 3389 0 2433 +5 2128 3522 2200 3437 +5 3583 3352 0 0 +5 2615 2077 0 2075 +5 0 2075 2140 2070 +5 3405 2201 2168 3516 +5 3179 3459 3469 2243 +5 0 2072 2175 2077 +5 0 3531 0 3386 +5 2218 3600 3433 2433 +5 2223 2127 2068 3347 +5 3339 3429 2221 3615 +5 3422 2126 3330 2206 +5 0 2109 2140 2108 +5 3414 2926 3394 2197 +5 0 2611 0 3391 +5 0 0 0 3519 +5 0 2127 0 3606 +5 2149 2990 3411 2549 +5 0 3100 2202 3409 +5 0 0 2095 2280 +5 2355 3494 3502 2199 +5 0 2760 0 3533 +5 3587 2126 0 0 +5 2191 2055 2714 2049 +5 3128 2601 0 0 +5 0 3537 0 2129 +5 3314 2324 0 0 +5 2224 2127 3387 3449 +5 0 3601 0 2594 +5 2701 3585 0 0 +5 3062 3374 3495 2492 +5 3525 3496 3368 0 +5 0 2945 0 3540 +5 2130 2040 2130 2039 +5 3520 2858 0 0 +5 3597 3321 2203 2395 +5 3512 3578 2492 3558 +5 0 2127 0 3568 +5 3552 3450 0 0 +5 3544 2440 2221 2205 +5 2223 3302 2059 2391 +5 0 3354 0 3402 +5 3328 2296 2305 3593 +5 3014 2211 0 0 +5 2168 3579 2209 2991 +5 3436 3467 2204 3604 +5 0 0 2279 2743 +5 3379 3480 3551 0 +5 2128 3351 0 0 +5 2473 3191 2210 2200 +5 2305 3390 2207 3401 +6 0 3621 0 3621 +6 3646 3622 3653 3623 +6 3651 3656 0 0 +6 3642 3636 0 0 +6 0 3637 0 3632 +6 0 3740 0 0 +6 0 3645 0 3650 +6 3640 3626 3622 3729 +6 3627 3628 3648 3643 +6 3635 3634 3638 3631 +6 3666 3677 3663 3670 +6 3697 3657 3699 3680 +6 3679 3701 3668 3683 +6 3632 3763 3740 3642 +6 3630 3641 3649 3633 +6 3643 3660 3656 3659 +6 3659 3676 0 0 +6 0 0 3624 3635 +6 3658 3663 3695 3698 +6 3664 3665 3645 3646 +6 3675 3702 0 0 +6 3681 3649 3665 3640 +6 3688 3689 3704 3694 +6 0 3687 0 3685 +6 3650 3653 3637 3629 +6 3729 0 3743 3745 +6 3745 3624 3628 3625 +6 3633 0 3626 0 +6 3661 0 3655 0 +6 3639 3648 3636 3651 +6 3623 3743 3733 3627 +6 0 0 3652 3666 +6 3686 3696 0 0 +6 3629 3733 3763 3639 +6 3625 3638 3660 3669 +6 0 3690 0 3667 +6 0 3671 0 3664 +6 0 0 3634 3644 +6 3644 3652 3654 3658 +6 3692 3662 3678 3630 +6 3631 3654 3674 3691 +6 3647 0 3641 0 +6 3680 3655 3662 3647 +6 3705 3706 3687 3697 +6 3700 3673 3657 3661 +6 3739 0 3713 0 +6 3712 3682 3706 3700 +6 0 0 3701 3688 +6 0 0 3677 3679 +6 3715 0 3703 0 +6 3721 3714 0 0 +6 3718 3684 3682 3672 +6 3749 3736 3734 3738 +6 3694 3709 3736 3757 +6 3744 0 3735 0 +6 3746 3730 3748 3751 +6 3738 3758 0 0 +6 3723 3735 3742 3739 +6 3722 3726 3724 3731 +6 3667 3678 3671 3681 +6 0 3770 0 3764 +6 0 3768 0 3785 +6 3756 3788 0 0 +6 3711 3732 3714 3750 +6 3769 3742 3752 3728 +6 3685 3699 3690 3692 +6 3751 3708 3747 3718 +6 0 3754 0 3746 +6 3670 3668 3716 3711 +6 3731 3741 3784 3782 +6 3783 3772 3780 3801 +6 0 0 3689 3719 +6 0 0 3707 3722 +6 3691 3695 3702 3686 +6 3765 3737 3730 3720 +6 3698 3716 3696 3721 +6 3725 3747 3717 3712 +6 3669 3674 3676 3675 +6 0 3748 0 3725 +6 3693 0 3684 0 +6 0 3717 0 3705 +6 3710 3724 3759 3781 +6 3773 3779 0 0 +6 3683 3704 3732 3749 +6 3750 3734 0 0 +6 3727 3766 3741 3767 +6 0 0 3726 3727 +6 3672 0 3673 0 +6 3719 3707 3709 3710 +6 3761 3786 3753 3793 +6 3787 3755 3775 3723 +6 3720 3703 3708 3693 +6 0 3650 0 3637 +6 3781 3784 3788 3773 +6 0 0 3635 3634 +6 0 0 3786 3783 +6 3652 3666 3658 3663 +6 3789 3760 3755 3744 +6 0 0 3772 3792 +6 0 0 3766 3761 +6 0 3632 0 3810 +6 3794 3778 3790 3789 +6 0 0 3805 3624 +6 3757 3759 3758 3756 +6 3728 3713 3737 3715 +6 3676 3675 0 0 +6 3665 3640 3646 3622 +6 3762 0 3760 0 +6 3797 3777 3778 3762 +6 3637 3629 3632 3809 +6 3800 3807 3802 3808 +6 3785 3775 3770 3769 +6 3767 3753 3798 3800 +6 3653 3623 3629 3791 +6 3656 3659 0 0 +6 3628 3625 3643 3660 +6 3634 3644 3631 3654 +6 3764 3752 3754 3765 +6 3791 3776 3774 3771 +6 3641 0 3633 0 +6 0 3664 0 3645 +6 3804 3802 0 0 +6 3638 3631 3669 3674 +6 3624 3635 3625 3638 +6 3782 3798 3779 3804 +6 3801 3627 3639 3648 +6 3682 3672 3700 3673 +6 3792 3805 3627 3628 +6 3771 0 3777 0 +6 3809 3774 3811 3797 +6 3808 3642 0 0 +6 3678 3630 3681 3649 +6 3636 3651 0 0 +6 3626 0 3803 0 +6 3799 3790 3768 3787 +6 3793 3780 3807 3806 +6 3677 3679 3670 3668 +6 3806 3639 3642 3636 +6 3649 3633 3640 3626 +6 3657 3661 3680 3655 +6 3810 3811 3796 3794 +6 0 3667 0 3671 +6 3662 3647 3630 3641 +6 0 3796 0 3799 +6 3795 0 3776 0 +6 0 4034 0 0 +6 0 3991 0 3994 +6 4041 3870 3895 3839 +6 0 0 3956 3903 +6 3973 3993 4091 4257 +6 3737 3715 3720 3703 +6 4256 4200 0 4043 +6 0 0 3846 3834 +6 4087 3874 0 0 +6 3878 0 4141 4093 +6 3702 3686 0 0 +6 3717 3712 3705 3706 +6 0 4098 0 4084 +6 4071 0 0 0 +6 4078 4215 3886 0 +6 0 3746 0 3748 +6 0 0 0 3868 +6 3696 3721 0 0 +6 3933 3930 3859 4012 +6 3957 4142 0 3970 +6 3747 3718 3712 3682 +6 4108 3877 0 3857 +6 3881 3951 4266 4055 +6 3716 3711 3721 3714 +6 3907 4253 0 4039 +6 3778 3762 3789 3760 +6 4120 4274 4179 3974 +6 4015 0 0 3908 +6 3939 0 0 0 +6 0 4194 0 0 +6 0 0 3848 3896 +6 3701 3688 3683 3704 +6 3880 3820 0 0 +6 3707 3722 3710 3724 +6 3999 4225 4081 4260 +6 4195 4271 4057 3831 +6 0 4286 0 3858 +6 3622 3803 3623 3795 +6 3766 3761 3767 3753 +6 4053 3847 0 0 +6 0 0 4044 3913 +6 0 0 4183 0 +6 4165 0 4114 4262 +6 0 0 4242 0 +6 3985 4077 4033 4018 +6 0 3990 0 0 +6 4035 3980 3822 4060 +6 3645 3646 3650 3653 +6 0 3812 0 3961 +6 0 4104 0 4112 +6 4188 0 4115 0 +6 0 4265 0 4212 +6 0 4147 0 3937 +6 3673 0 3661 0 +6 3684 0 3672 0 +6 4130 4221 4064 4173 +6 3838 0 3900 4045 +6 0 0 0 4062 +6 0 3889 0 0 +6 4143 0 0 0 +6 3758 3756 0 0 +6 4169 3818 3835 3873 +6 3714 3750 0 0 +6 0 3764 0 3754 +6 4229 3998 0 4113 +6 4267 3844 4239 4244 +6 0 0 3666 3677 +6 3915 0 3962 4047 +6 0 3905 4272 0 +6 3689 3719 3694 3709 +6 3703 0 3693 0 +6 0 4074 4038 3852 +6 4184 0 4028 4234 +6 0 4009 0 3924 +6 0 4205 4232 0 +6 3734 3738 0 0 +6 0 4197 4025 4017 +6 0 0 3935 3947 +6 4207 4121 4196 4099 +6 0 3867 0 4066 +6 0 3836 0 0 +6 4209 3856 0 3972 +6 0 4021 3963 0 +6 0 4102 0 4180 +6 4214 0 4171 0 +6 4100 4109 4073 3932 +6 4128 0 0 4299 +6 0 0 4069 4051 +6 4138 3917 3885 0 +6 0 3685 0 3690 +6 3971 3960 0 0 +6 3975 4224 0 0 +6 0 3725 0 3717 +6 0 4279 0 4157 +6 3755 3744 3723 3735 +6 0 3987 3911 4007 +6 3968 4238 3946 4182 +6 3943 4125 0 0 +6 0 0 3644 3652 +6 3695 3698 3686 3696 +6 3663 3670 3698 3716 +6 3841 4185 0 0 +6 4228 4116 0 0 +6 0 3860 0 3621 +6 3966 3897 4049 4294 +6 4290 4132 3921 4190 +6 3826 4042 4013 4119 +6 3891 4161 0 4020 +6 0 0 0 3925 +6 3979 4131 4216 3954 +6 0 0 3679 3701 +6 0 3845 0 4152 +6 3742 3739 3728 3713 +6 4226 3819 4026 4192 +6 4264 0 0 0 +6 0 4291 3996 4129 +6 4079 0 0 4030 +6 3706 3700 3697 3657 +6 3726 3727 3731 3741 +6 0 0 0 3919 +6 4154 4247 0 0 +6 3863 4174 0 3812 +6 4166 3876 3829 4117 +6 3730 3720 3751 3708 +6 3926 4251 3813 3814 +6 4139 3964 0 0 +6 4083 4301 4237 4032 +6 3671 3681 3664 3665 +6 4172 4155 3843 4283 +6 4134 0 4280 0 +6 0 0 3719 3707 +6 4210 4287 0 4277 +6 3704 3694 3749 3736 +6 3690 3692 3667 3678 +6 4111 3861 3842 4106 +6 4037 3949 4151 3916 +6 3674 3691 3675 3702 +6 3967 4231 0 0 +6 0 4040 4217 4016 +6 3654 3658 3691 3695 +6 3871 0 4298 3948 +6 4203 4031 4261 0 +6 4063 4080 3931 3875 +6 4145 3983 0 4254 +6 4241 4206 0 0 +6 4123 0 3912 0 +6 3668 3683 3711 3732 +6 3655 0 3647 0 +6 4068 3914 4150 4201 +6 3709 3710 3757 3759 +6 0 0 0 4160 +6 4186 3849 4168 3941 +6 3660 3669 3659 3676 +6 0 4176 0 0 +6 3869 4046 4163 4094 +6 3687 3697 3685 3699 +6 0 0 4048 0 +6 4153 0 4189 0 +6 4085 4061 3955 4295 +6 3864 4014 4255 0 +6 0 0 4293 4187 +6 4249 4082 4219 4204 +6 3713 0 3715 0 +6 0 0 3890 4275 +6 0 0 3821 0 +6 0 3918 0 4233 +6 4288 4056 3950 4220 +6 3884 3952 0 0 +6 0 4281 0 0 +6 0 3705 0 3687 +6 3699 3680 3692 3662 +6 0 0 3813 3814 +6 3953 4198 3823 3902 +6 4175 0 3940 0 +6 3928 4052 4076 0 +6 3648 3643 3651 3656 +6 0 3621 3906 4181 +6 3997 3989 0 4137 +6 4070 3824 0 4258 +6 3817 4162 0 0 +6 3708 3693 3718 3684 +6 0 4029 0 4136 +6 0 0 3688 3689 +6 3899 0 4282 0 +6 3752 3728 3765 3737 +6 4036 0 0 3929 +6 0 0 4243 3923 +6 3898 0 4095 4268 +6 4208 0 4065 0 +6 4300 3959 4285 4177 +6 4263 4103 4230 3887 +6 3854 0 3862 3883 +6 4273 4133 4348 4349 +6 4417 4101 4376 4159 +6 4372 4245 4489 4144 +6 4358 4252 4386 3837 +6 3745 3624 4408 3625 +6 3882 4379 4008 4269 +6 0 0 3783 3772 +6 4118 4086 4435 4492 +6 4222 4156 4403 4355 +6 4054 3833 4495 4521 +6 0 3810 0 3796 +6 4340 0 0 0 +6 4127 4278 4509 4389 +6 4363 3982 4441 3830 +6 4554 3703 4424 3693 +6 4126 4096 4323 4534 +6 4381 3984 4397 4140 +6 4539 3934 4433 3995 +6 4473 4090 4346 4089 +6 4227 3936 4240 4333 +6 0 0 3761 3786 +6 4339 0 0 0 +6 4561 4023 4312 3944 +6 4270 4164 4464 4377 +6 3802 3808 0 0 +6 3629 3791 3809 3774 +6 3754 3765 3746 3730 +6 3815 0 4431 0 +6 4004 4296 4425 4468 +6 4305 4235 4452 3981 +6 3779 3804 0 0 +6 3724 3731 3781 3784 +6 4384 4022 4504 4191 +6 3732 3749 3750 3734 +6 4289 4001 4557 4411 +6 3630 3641 4378 3633 +6 0 0 0 4324 +6 3942 4170 4404 4545 +6 4321 3865 4342 3872 +6 3927 4024 4487 4385 +6 4390 4202 4158 4088 +6 4054 3833 4522 4454 +6 4371 4252 4472 3837 +6 3893 4211 4482 4310 +6 0 0 3727 3766 +6 4546 4245 4528 4144 +6 3777 0 3762 0 +6 3992 3855 4485 4560 +6 3803 0 3795 0 +6 3909 3866 4375 4508 +6 3775 3723 3769 3742 +6 3893 4211 4391 4422 +6 4486 4178 4302 4000 +6 3986 0 4318 3945 +6 4222 4156 4400 4419 +6 4019 4193 4552 4559 +6 3788 3773 0 0 +6 3736 3757 3738 3758 +6 3772 3792 4517 3627 +6 4289 4001 4505 4361 +6 4553 4002 4432 3976 +6 4414 3904 4537 4199 +6 4223 4105 4351 4334 +6 4309 4023 4436 3944 +6 4402 3655 4478 3647 +6 3942 4170 4551 4484 +6 0 3851 4483 4075 +6 4343 4027 4456 4122 +6 3786 3783 4501 3780 +6 0 0 4540 0 +6 3816 0 0 0 +6 4423 4022 4405 4191 +6 4126 4096 4332 4325 +6 3815 0 3815 0 +6 4307 3938 4571 4167 +6 3827 4072 4570 4490 +6 3623 3743 3733 4362 +6 4459 4010 4471 4259 +6 4518 4011 4383 3958 +6 3909 3866 4477 4440 +6 4337 3684 4453 3672 +6 4004 4296 4398 4455 +6 0 0 4328 0 +6 4058 4067 4306 4368 +6 3811 3797 3794 3778 +6 3748 3751 3725 3747 +6 4542 4148 4396 4297 +6 3790 3789 3787 3755 +6 4535 3865 4380 3872 +6 4510 4090 4556 4089 +6 4058 4067 4458 4427 +6 3796 3794 3799 3790 +6 4430 3626 3622 3803 +6 4479 3777 4428 3762 +6 0 0 3722 3726 +6 4538 4235 4526 3981 +6 3623 3795 3791 3776 +6 4536 4146 4457 4276 +6 4488 4148 4434 4297 +6 3735 0 3739 0 +6 3978 0 4218 4330 +6 3622 3803 4497 3795 +6 4311 4202 4158 4088 +6 3850 4003 4499 4519 +6 3892 0 3816 0 +6 4326 0 3825 4107 +6 0 3851 4313 4075 +6 4533 3776 3774 3771 +6 3879 3840 4480 4532 +6 4507 3934 4359 3995 +6 4360 3828 4498 4097 +6 4110 3920 4461 4370 +6 3784 3782 3773 3779 +6 4284 4059 4329 4555 +6 4118 4086 4382 4511 +6 4566 3828 4460 4097 +6 4446 4011 4316 3958 +6 4248 4124 4469 4470 +6 3978 0 4218 4420 +6 3780 3801 3806 3639 +6 4327 3969 4387 4050 +6 3965 4135 4341 4506 +6 4568 0 3825 4107 +6 4445 3982 4367 3830 +6 0 0 4426 0 +6 0 3785 0 3770 +6 4475 4002 4563 3976 +6 0 0 3892 0 +6 3850 4003 4410 4407 +6 0 0 3792 3805 +6 3986 0 4395 3945 +6 4292 4236 4513 4514 +6 3879 3840 4413 4543 +6 4273 4133 4547 4447 +6 4314 0 4412 0 +6 0 3799 0 3768 +6 4284 4059 4315 4308 +6 4227 3936 4240 4418 +6 4399 4101 4450 4159 +6 4523 3655 3662 3647 +6 3753 3793 3800 3807 +6 4449 4178 4366 4000 +6 3776 0 3771 0 +6 4223 4105 4401 4319 +6 3798 3800 3804 3802 +6 4110 3920 4541 4335 +6 4406 4149 4525 3901 +6 4558 4250 4520 4092 +6 3644 3652 3654 4331 +6 4438 3832 4512 4005 +6 3922 3988 4336 4416 +6 3992 3855 4415 4421 +6 4127 4278 4491 4442 +6 4392 4027 4448 4122 +6 4530 3832 4338 4005 +6 3965 4135 4465 4481 +6 3741 3767 3782 3798 +6 0 0 4567 0 +6 4365 3969 4463 4050 +6 4503 4149 4515 3901 +6 4350 0 0 0 +6 0 3910 4006 4304 +6 0 3910 4006 4320 +6 3888 4246 4437 4439 +6 4019 4193 4388 4531 +6 0 0 0 4500 +6 3759 3781 3756 3788 +6 4462 3894 4443 4213 +6 3770 3769 3764 3752 +6 3805 3624 3628 3625 +6 4548 4250 4529 4092 +6 3768 3787 3785 3775 +6 3922 3988 4409 4369 +6 3774 3771 3797 3777 +6 4444 3673 3657 3661 +6 3882 4352 4008 4269 +6 4248 4124 4467 4356 +6 3760 0 3744 0 +6 4527 3760 4524 3744 +6 4292 4236 4317 4564 +6 4270 4164 4364 4303 +6 4357 3938 4502 4167 +6 3927 4024 4496 4550 +6 3827 4072 4344 4476 +6 4516 4146 4345 4276 +6 4544 3713 4466 3715 +6 4394 4010 4549 4259 +6 4393 3977 4373 3853 +6 4347 3904 4451 4199 +6 3888 4246 4474 4569 +6 4493 3984 4494 4140 +6 4565 3894 4322 4213 +6 4354 3977 4562 3853 +6 4429 0 4374 0 +6 4353 0 3816 0 +7 4595 4583 4607 4611 +7 4601 4587 4609 4603 +7 4580 4606 4574 4588 +7 4579 4577 4602 4598 +7 4599 4585 4597 4589 +7 4576 4605 4577 4575 +7 4600 4591 4613 4596 +7 4608 4593 4578 4573 +7 4612 4590 4592 4604 +7 4751 4891 0 0 +7 4656 4628 4630 4657 +7 4573 4597 4605 4580 +7 4575 4574 4581 4610 +7 4841 4797 4753 4757 +7 4623 4607 4616 4608 +7 0 4572 4881 4838 +7 4713 4703 4692 4678 +7 4618 4659 4583 4600 +7 4871 4798 0 0 +7 4719 4720 4725 4826 +7 4651 4637 4659 4631 +7 4691 4681 4705 4712 +7 4664 4685 4672 4701 +7 0 4717 0 4828 +7 4662 4626 4636 4617 +7 4676 4652 4663 4595 +7 0 4738 0 4572 +7 0 4572 4862 4729 +7 4669 4639 4629 4650 +7 4627 4663 4648 4623 +7 4794 4778 4854 4883 +7 4610 4582 4645 4647 +7 4716 4706 4700 4683 +7 4832 4900 4873 4867 +7 4877 4763 4896 4756 +7 4649 4645 4620 4619 +7 4634 4654 4661 4642 +7 4646 4621 4638 4651 +7 4617 4648 4621 4615 +7 4596 4602 4585 4601 +7 0 4790 0 4746 +7 4614 4578 4586 4576 +7 4611 4613 4593 4599 +7 4723 4744 0 4733 +7 4769 4903 4876 4822 +7 4598 4581 4587 4649 +7 0 4572 0 4572 +7 0 4882 0 4820 +7 4631 4586 4591 4579 +7 4604 4622 4594 4660 +7 4584 4594 4635 4624 +7 4650 4638 4652 4618 +7 4715 4673 4633 4662 +7 4803 4893 4870 4843 +7 4603 4620 4590 4640 +7 0 4888 0 4775 +7 4752 4736 4902 4830 +7 4588 4592 4582 4584 +7 4707 4697 4702 4704 +7 4624 4675 4658 4671 +7 4679 4689 4626 4627 +7 4665 4696 4667 4670 +7 4774 4801 4791 4831 +7 4644 4658 4653 4641 +7 4615 4616 4637 4614 +7 0 4572 4805 4765 +7 4905 4848 4810 4907 +7 4641 4684 4654 4693 +7 4796 4812 4768 4860 +7 4589 4609 4606 4612 +7 4687 4694 4686 4677 +7 4632 4636 4639 4646 +7 4619 4643 4655 4625 +7 4824 4855 4747 4788 +7 4640 4655 4622 4656 +7 4813 4898 0 0 +7 4690 4633 4680 4632 +7 4647 4635 4643 4644 +7 4682 4709 4674 4666 +7 4625 4653 4628 4634 +7 5033 0 4776 0 +7 4671 4667 4684 4707 +7 4795 5069 4743 4991 +7 5100 0 4931 4880 +7 4866 4940 4777 4965 +7 4851 5002 4735 5087 +7 0 0 5092 5091 +7 4793 4772 5039 4808 +7 4740 4942 4847 5003 +7 4683 4629 4689 4676 +7 4976 4762 4980 0 +7 0 0 0 4836 +7 4901 4879 4840 4787 +7 4677 4727 4708 4748 +7 4760 0 4823 0 +7 4721 4846 4741 4928 +7 0 0 4932 4971 +7 5011 4789 4800 4781 +7 4642 4699 4804 4799 +7 4897 4806 4698 4713 +7 5068 0 5095 0 +7 4732 4840 4809 4737 +7 0 4718 5060 5081 +7 4863 4849 4779 4792 +7 4712 4680 4706 4669 +7 4829 4809 4722 4886 +7 5018 0 5090 0 +7 4889 5083 4894 4973 +7 4678 4705 4685 4716 +7 4926 0 4983 0 +7 4868 4982 4878 4936 +7 4857 4985 4858 4818 +7 4967 5078 4814 4761 +7 4997 0 5067 0 +7 0 0 5040 4916 +7 4904 4698 4837 4711 +7 4745 0 5045 5017 +7 4793 4772 4962 4808 +7 4657 4661 4696 4682 +7 4842 4890 5009 4964 +7 4748 4786 4730 0 +7 0 0 5054 4943 +7 4913 4581 4776 0 +7 4874 0 5072 4921 +7 4853 4816 4827 4899 +7 0 0 0 4895 +7 4701 4700 4673 4679 +7 5007 0 5096 0 +7 4955 5077 5086 4935 +7 5070 4773 4861 0 +7 4966 5075 4953 4929 +7 4842 4890 5027 5073 +7 0 0 5020 4968 +7 0 0 5042 4992 +7 4857 4945 4858 4818 +7 4581 5057 4782 4802 +7 4938 0 4927 0 +7 4668 4708 0 4895 +7 4670 4674 4697 4687 +7 4875 4629 4852 5094 +7 4839 5001 4819 5005 +7 4642 4699 4709 4892 +7 4759 5010 4859 5016 +7 4704 4686 4688 4668 +7 4584 4594 4726 4767 +7 0 0 4804 4799 +7 4728 4698 4872 4711 +7 4850 4714 4844 4710 +7 4711 4692 4714 4664 +7 5097 0 5099 0 +7 4904 0 4837 0 +7 4970 0 4925 0 +7 5021 5053 4915 5038 +7 0 0 4909 4999 +7 4912 4758 5047 4833 +7 4695 4688 4869 4853 +7 4750 4835 0 4836 +7 4710 4672 4754 4715 +7 4737 4771 4834 4770 +7 4887 4864 4703 4691 +7 4660 4630 4885 4908 +7 4951 4758 4910 4833 +7 4957 5000 5051 5080 +7 4886 4834 4806 4887 +7 0 0 4821 4784 +7 4892 4869 4815 4783 +7 0 0 4960 5085 +7 5032 0 5025 0 +7 4783 4827 4817 4863 +7 4668 4708 4816 4740 +7 0 5066 4845 4884 +7 0 0 4950 4981 +7 4742 4780 4811 4732 +7 4578 4573 4576 4934 +7 0 0 4918 4924 +7 4792 4777 4835 4755 +7 0 0 4984 4948 +7 4839 4920 4819 0 +7 0 0 5064 4946 +7 4693 4702 4699 4695 +7 4911 0 5079 0 +7 4954 0 5056 0 +7 5058 0 4969 0 +7 4657 4661 4821 4784 +7 4795 5048 4743 4944 +7 0 5074 4782 4802 +7 5093 4766 5050 4807 +7 4721 4846 4741 5046 +7 5006 4766 4961 4807 +7 0 0 5030 4974 +7 4919 4993 5044 4996 +7 4889 4930 4894 5102 +7 4856 4817 4727 4734 +7 4764 4754 4681 4690 +7 4874 0 5098 5061 +7 0 0 4952 5026 +7 4770 4844 4864 4764 +7 4868 4923 4878 4989 +7 0 5082 0 4742 +7 4949 4789 4800 4781 +7 0 0 4917 4937 +7 0 4718 4956 5059 +7 0 0 4726 4767 +7 4755 4977 4845 4884 +7 4666 4815 4694 4856 +7 0 0 5089 5052 +7 5062 4762 4941 0 +7 4922 0 4987 0 +7 5065 5049 4939 4933 +7 5071 4773 4861 0 +7 5008 4994 4879 4728 +7 4995 0 5101 0 +7 5028 4580 4575 4574 +7 5034 4959 4780 4901 +7 0 4811 0 4829 +7 4947 0 5029 0 +7 5024 4749 5031 0 +7 4745 0 5022 5041 +7 4899 4847 4849 4866 +7 5004 0 4998 0 +7 4760 4714 4823 4710 +7 4734 4779 4786 4750 +7 4787 4872 4771 4850 +7 4695 4688 4739 4906 +7 0 0 4730 0 +7 4660 4630 4675 4665 +7 5019 4749 5014 0 +7 0 0 4865 0 +7 4759 5036 4859 4979 +7 0 4586 0 4579 +7 0 0 5088 5023 +7 0 0 4739 4906 +7 0 0 4963 4990 +7 5055 0 4986 0 +7 0 0 4885 4908 +7 5063 0 5035 0 +7 4825 4785 4958 5012 +7 4978 0 4814 4761 +7 4851 5103 4735 5013 +7 4875 0 4852 5043 +7 4610 4582 0 0 +7 5076 0 4972 4880 +7 0 4722 4865 4897 +7 4825 4785 4988 5037 +7 4724 5084 4975 4731 +7 4724 5084 5015 4731 +7 4724 4914 4975 4731 +7 4724 4914 5015 4731 +8 5111 5108 5109 5106 +8 5151 5219 5169 5324 +8 5327 5241 5166 0 +8 5120 5125 5126 5136 +8 5150 0 5131 5331 +8 5136 5132 5164 5129 +8 5322 5319 5279 5271 +8 5268 5249 5147 5137 +8 5224 5260 5159 0 +8 5218 5309 5128 5133 +8 5141 5168 5121 5152 +8 5190 5206 0 0 +8 5119 5211 5177 5333 +8 5146 5143 5115 5173 +8 5178 5183 5329 5222 +8 5172 5243 5134 5301 +8 5110 5107 5108 5105 +8 5287 5202 5147 5137 +8 5307 5216 5179 5113 +8 5256 5323 5316 5187 +8 5185 5242 5283 5247 +8 5157 5246 5160 5189 +8 5251 5126 5297 5156 +8 5151 5254 5169 5198 +8 5308 5272 5197 5325 +8 5328 5195 5159 0 +8 5335 5229 5166 0 +8 5236 5340 0 0 +8 5150 5318 5131 5346 +8 5176 5167 5114 5140 +8 5205 5326 5267 5300 +8 5105 5139 5112 5178 +8 5270 5282 0 0 +8 5248 5264 5313 5122 +8 5336 5257 5276 5196 +8 5144 5281 5130 0 +8 5145 5115 5107 5116 +8 5299 5293 5277 5266 +8 5252 5212 5261 5230 +8 5154 5337 5167 5213 +8 5133 5104 5168 5111 +8 5155 5124 5104 5110 +8 5209 5262 5203 5263 +8 5152 5109 5143 5149 +8 5116 5161 5139 5181 +8 5181 5163 5183 5171 +8 5144 5244 5130 5302 +8 5225 5347 5250 5120 +8 5294 5232 5317 5314 +8 0 5286 0 5255 +8 5129 5121 5118 5146 +8 5153 5114 5163 5165 +8 5304 5237 0 0 +8 5119 5295 5177 0 +8 0 5217 0 5311 +8 5149 5135 5158 5176 +8 5280 5305 5104 5110 +8 5171 5162 5245 5259 +8 5321 5275 0 0 +8 5105 5339 5112 5253 +8 5140 5231 5182 5265 +8 0 5315 0 5258 +8 5192 5234 5188 5312 +8 0 5240 0 5345 +8 5156 5164 5175 5142 +8 5157 5332 5160 5342 +8 0 5204 0 5210 +8 5142 5118 5124 5145 +8 5184 0 5148 5138 +8 5180 5128 5132 5141 +8 5306 5338 5233 5122 +8 5208 5175 5193 5155 +8 5106 5112 5135 5154 +8 5165 5182 5162 5174 +8 5174 5310 5273 5284 +8 5173 5158 5161 5153 +8 5226 5344 5148 5138 +8 5269 5228 5296 5207 +8 5274 5341 5179 5113 +8 5220 5278 5125 5180 +8 0 5194 0 5285 +8 5172 5343 5134 5214 +8 5334 5200 0 0 +8 5239 5320 5117 5199 +8 5170 5215 5191 5123 +8 5201 5223 5127 5186 +8 5170 5238 5191 5123 +8 5170 5215 5221 5123 +8 5239 5320 5117 5291 +8 5298 5351 0 5292 +8 5289 5330 5117 5291 +8 5170 5238 5221 5123 +8 5227 5348 5107 5290 +8 5303 5235 5127 5288 +8 5289 5330 5117 5199 +8 5227 5350 5107 5290 +8 5201 5235 5127 5288 +8 5298 5349 0 5292 +8 5303 5223 5127 5186 +9 5417 0 5433 0 +9 5425 5429 5354 5360 +9 0 5418 0 5413 +9 5402 5395 5388 5427 +9 5380 5382 5353 5355 +9 5431 5361 5357 5362 +9 5409 5426 5376 5358 +9 0 5432 0 5406 +9 5419 5365 5368 5396 +9 5390 5423 5421 5392 +9 5383 5397 5385 5369 +9 5424 5366 5381 5372 +9 0 0 5378 5377 +9 5386 5399 5394 5374 +9 5410 5434 0 0 +9 5404 5379 0 0 +9 0 0 5422 5359 +9 5373 5416 5367 5393 +9 5356 0 5375 0 +9 5407 5391 5403 5412 +9 5414 5371 5370 5440 +9 5364 5352 5439 5428 +9 5445 5389 5398 5400 +9 5450 5384 5387 0 +9 5363 5441 0 5401 +9 5405 0 5443 5420 +9 5448 5389 5398 5400 +9 5414 5371 5370 5435 +9 0 5415 5430 5442 +9 0 5415 5430 5446 +9 5405 0 5438 5420 +9 5364 5352 5436 5428 +9 5408 5444 5352 5411 +9 5437 5384 5387 0 +9 5363 5449 0 5401 +9 5408 5447 5352 5411 +10 5465 5485 0 5453 +10 0 5458 5463 5480 +10 5477 5464 5455 5460 +10 5451 0 5476 5467 +10 5465 5475 0 5453 +10 5462 5457 5452 5471 +10 5462 5457 5452 5478 +10 5451 0 5481 5467 +10 5468 5454 5472 5461 +10 5473 5464 5455 5460 +10 5468 5454 5482 5461 +10 0 5458 5463 5479 +10 5456 5483 5459 5470 +10 5456 5486 5459 5470 +10 5474 5466 5469 0 +10 5484 5466 5469 0 +11 5501 5491 5490 5498 +11 5501 5491 5494 5488 +11 5501 5491 5490 5488 +11 5501 5487 5494 5498 +11 5501 5487 5494 5488 +11 5502 5491 5494 5498 +11 5502 5491 5490 5498 +11 5502 5487 5494 5498 +11 5502 5487 5490 5488 +11 5496 5500 5495 5493 +11 5496 5499 5497 5493 +11 5489 5500 5495 5492 +11 5489 5499 5497 5492 +12 5504 5505 5507 5511 +12 5505 5505 5511 5511 +12 5512 5512 5511 5511 +12 5505 5503 5511 5509 +12 5507 5511 5507 5511 +12 5511 5511 5511 5511 +12 5511 5509 5511 5509 +12 5511 5514 5511 5514 +12 5513 5511 5513 5511 +12 5507 5511 5506 5510 +12 5511 5511 5510 5510 +12 5511 5511 5515 5515 +12 5511 5509 5510 5508 +13 5516 5517 5520 5521 +13 5517 5517 5521 5521 +13 5518 5518 5521 5521 +13 5517 5519 5521 5522 +13 5520 5521 5520 5521 +13 5521 5521 5521 5521 +13 5521 5522 5521 5522 +13 5521 5523 5521 5523 +13 5524 5521 5524 5521 +13 5520 5521 5525 5526 +13 5521 5521 5526 5526 +13 5521 5521 5527 5527 +13 5521 5522 5526 5528 +14 5529 5530 5533 5534 +14 5531 5531 5534 5534 +14 5530 5530 5534 5534 +14 5530 5532 5534 5535 +14 5533 5534 5533 5534 +14 5534 5534 5534 5534 +14 5534 5536 5534 5536 +14 5534 5535 5534 5535 +14 5537 5534 5537 5534 +14 5533 5534 5538 5539 +14 5534 5534 5539 5539 +14 5534 5534 5540 5540 +14 5534 5535 5539 5541 +15 5542 5543 5546 5547 +15 5543 5544 5547 5547 +15 5544 5544 5547 5547 +15 5544 5545 5547 5548 +15 5546 5547 5546 5547 +15 5547 5547 5547 5547 +15 5547 5548 5547 5549 +15 5546 5547 5550 5547 +15 5547 5549 5547 5549 +15 5550 5547 5551 5552 +15 5547 5547 5552 5552 +15 5547 5547 5552 5553 +15 5547 5549 5553 5554 +16 5555 5556 5559 5560 +16 5557 5558 5560 5561 +16 5562 5560 5564 5565 +16 5560 5563 5566 5567 +17 5568 5569 5570 5571 diff --git a/2019/dogon/mosquito5.mc b/2019/dogon/mosquito5.mc new file mode 100644 index 000000000..e7e3f84a6 --- /dev/null +++ b/2019/dogon/mosquito5.mc @@ -0,0 +1,81 @@ +[M2] (golly 2.0) +#C mosquito5 -- a 71-cell pattern with a quadratic growth rate. +#C Nick Gotts, 21 Oct 1998 +$$$$$$$......*$ +4 0 0 0 1 +5 0 0 0 2 +6 0 0 0 3 +7 0 0 4 0 +8 0 0 5 0 +9 0 0 6 0 +10 0 0 0 7 +11 0 0 8 0 +12 0 0 0 9 +$$$$...*$....*$*...*$.****$ +4 11 0 0 0 +5 0 0 12 0 +6 0 0 13 0 +7 14 0 0 0 +$.......*$.....*$.....***$......*$ +4 0 0 0 16 +$$**$ +4 0 0 18 0 +5 17 19 0 0 +6 0 20 0 0 +7 21 0 0 0 +8 0 0 15 22 +9 0 0 23 0 +.*****$*....*$.....*$....*$ +4 0 0 25 0 +5 0 0 0 26 +6 0 0 0 27 +7 0 0 28 0 +$$$$$$$.....*$ +$$$$$*$.*$.*$ +......**$ +**$ +4 30 31 32 33 +5 0 34 0 0 +6 35 0 0 0 +7 36 0 0 0 +8 29 0 37 0 +9 0 38 0 0 +$$$$$.......*$ +$$$.*$**$.*$ +4 40 41 0 0 +5 0 42 0 0 +$$$$$$***$ +4 0 44 0 0 +5 0 0 0 45 +6 43 46 0 0 +7 0 0 47 0 +8 48 0 0 0 +9 0 49 0 0 +10 24 0 39 50 +11 51 0 0 0 +.......*$...*...*$....****$ +4 0 53 0 0 +5 0 54 0 0 +6 0 55 0 0 +7 56 0 0 0 +$.....*$......**$$$$.....*$......**$ +.......*$.......*$......*$$$$$.....*$ +4 0 58 0 59 +4 0 32 0 0 +5 0 60 0 61 +6 0 0 0 62 +$$$$$$$*$ +4 0 0 64 0 +5 0 0 65 0 +.*$.*$**$ +4 67 0 31 0 +4 33 0 0 0 +5 68 0 69 0 +6 66 0 70 0 +7 63 71 0 0 +8 57 72 0 0 +9 73 0 0 0 +10 0 74 0 0 +11 75 0 0 0 +12 52 76 0 0 +13 0 10 0 77 diff --git a/2019/dogon/prog.c b/2019/dogon/prog.c new file mode 100644 index 000000000..56b490a23 --- /dev/null +++ b/2019/dogon/prog.c @@ -0,0 +1,76 @@ +#include +#include +#include +#define G >> +#define O << +#define S E(4)k=V+(V&2), +#define P(V,I) U(q+V,t*4+I) +#define E(b) for(int V=0; V + 6|I>=H+ t|I+2 *c <=H-t|b>=A +r|b+ 2* c + <= A-r) return; o n=w+(b-A +r O 4 G s + )*D+(I- H+t O 4 G s); if( g<=s -7){ + *n =-1; return; } J(l,q); if( g--){ + S u(q[k ],g,I+V %2*c,b+V /2*c,M*8 + +V ); } else{ t =0; r=4- s; if(r< + 0){ t=- r; r=0; } M^=M G 1; E(8 O + r){ for (k=0; k <8 O r;k ++){n[(V + G t)*D+ (k G t) ]|=V*k|r <2?-(p[l + ]G(V G r)*8+(k G r)&1)|M &513 O 12 + :99; } } } } a U(o v,a j){ R; r=0; t=j/4; T N=(T)v; if (t>0){ S J(v[k],q+ + 2*k),r=917*r+v[k]; if(j&1)return P(5,-2);d=N[0];} else { r=(d=v[ 0]|v[1 ]O + 4)+719*(m=v[4]|v[5]O 4); if(j&1)return d G 18&3855| (m &15420 ) O 14; d|= + m O 32 ; } for(; c=n[r&=Z-1]; r++)if(d==p[c]&(!t|p[c+2 ]==N[2])) break; int + L=t--+1; if(L>h)L=h; if(C[c]&63^L|!c){ if(!c){ p[n[r]= c=g]=d; p [g+=2]=N[ + 2]; g+=t>=0; } if(t<0){ E(2-!h){ r=0; E(4){ a B=d G V& y; B+=d*2 G V&y; B+= + d/2 G V &y; B+= (B O 8)+( B G 8 ); r + |=(((B+ y&y*6^3 *y)+y G 3 )&(d G V|B + )&y)O V ; } d=r ; } d=(d G 18&F )O 32; + } else{ E(11)if (V+1&3)q[V ]=P(V,0); S + q[k]=P( k,(t>h- 2)); d=64| P(0,2)O 32; + } C[c]= L| d; } return j&2 ?c:C[c]G 32 + ; } int main(){ n=calloc(Z,8); F/= 17; + w=n+Z+F / 256 ; char*b=(char*) w-99; + o z=w+F /32 ,Q; p=(T)(99999+z); C= + p+1; R; y/= 15; E(64){ { S q[k]= + l; } t= V; l=P( 0,2); g+=!V; } Display*_=XOpenDisplay(0); while(gets(b)) { + if(I ++ &&b[0]^ 35){ if(sscanf(b,"%d%d%d%d%d",&t,q,q+1,q+2,q+3)==5){ t-=3; + S q[k]= q[V]?w[ q[V]]:t*3-1; } else{ t=p[0]=j=k=r=0; while(f=b[r++]){ if(f + ==42)p[ 0]|= 1l O j*8+k; k++; if(f==36)j++,k=0; } J(0,q); } l=w[++D]=P(0,2 + ); } } *z=l; z[1]=t; Window f = XCreateSimpleWindow(_, RootWindow(_,0),0,0,X,Y,1,0,0); Q=z+=2; D=X+128; XImage*j= + XCreateImage(_, DefaultVisual(_,0),24,2,0,(char*)w,X,Y ,32,D*4); + XEvent m; XSelectInput( _, f, 1 ); XMapWindow(_, f); d : printf( + "G:%ld M:%d L%d S%d\n",e,g,t,s); K:L-=L>2; u(l,t,-4l O t,-4l O t + ,0); XPutImage(_,f,DefaultGC(_,0),j,0,0,0,0,X,Y); E(Y* (X+128))w + [V]=0; if(XCheckWindowEvent(_,f,1,&m)){I=XLookupKeysym (&m.xkey, + 0) &63; if((I-1 &15)<4)*( + I&1?&H: &A)+=(I -1&2)-1 O + s +2; i ^=I==8; h+=(I==29 + )-(h&&I ==27); s+=(I==45 + )-(s&&I == 61); L^=I==32| + 2*(I == 48) ; } if(L&1 ){ + if(!i){ e+=1l O h; d=t+2; + do{E(16 )q[V]=3 *t-1; t++ + ; r=t Q){ z-=3; + e=*z; t=z + [-1]; l=z + [- 2] ; } + goto d; } + }goto K;} diff --git a/2019/dogon/unlimited-novelty.mc b/2019/dogon/unlimited-novelty.mc new file mode 100644 index 000000000..6231f8103 --- /dev/null +++ b/2019/dogon/unlimited-novelty.mc @@ -0,0 +1,32 @@ +[M2] (golly 2.0) +#C nick-gotts-n type rake interaction with apparently unlimited novelty +#C (screenshot at 4.9e8: www.tweedledum.com/rwg/nick-gotts-g.png). +#C The interaction of the downward puffer's trail with the first +#C bounce of its backrake produces two very sparse LWSS waves. +#C Bill Gosper, 27 Feb 2006 +$$$$$$$..****$ +4 0 0 0 1 +5 0 0 0 2 +6 0 0 0 3 +7 0 0 4 0 +.*...*$.....*$....*$$$..*$...*$...*$ +$....*$...**$ +..**$.*$$$$..****$.*...*$.....*$ +4 0 6 7 8 +....*$ +4 0 10 0 0 +5 0 9 0 11 +$$$$$$$.*$ +$...*$..**$$$$$..*....*$ +4 0 0 13 14 +5 0 0 15 0 +6 0 12 16 0 +*.....*$*......*$*..*$***$ +.*....*$**....*$......*$......**$ +4 18 19 0 0 +$$.*$*$ +4 21 0 0 0 +5 20 22 0 0 +6 23 0 0 0 +7 17 0 24 0 +8 0 5 0 25 diff --git a/2019/duble/Makefile b/2019/duble/Makefile new file mode 100644 index 000000000..2360adcb1 --- /dev/null +++ b/2019/duble/Makefile @@ -0,0 +1,596 @@ + +#!/usr/bin/env make +# +# 2019 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + +############################# +# shell used by this Makefile +############################# +# +SHELL= /bin/bash + +####################### +# common tool locations +####################### +# +A2P= a2p +AR= ar +ASA= asa +AT= at +ATQ= atq +ATRM= atrm +AWK= awk +BANNER= banner +BASE64= base64 +BASENAME= basename +BATCH= batch +BC= bc +BINHEX= binhex +BISON= bison +BUNZIP2= bunzip2 +BZCAT= bzcat +BZCMP= bzcmp +BZDIFF= bzdiff +BZEGREP= bzegrep +BZFGREP= bzfgrep +BZGREP= bzgrep +BZIP2= bzip2 +BZLESS= bzless +BZMORE= bzmore +C2PH= c2ph +C89= c89 +C99= c99 +CAL= cal +CALC= calc +CAT= cat +CD= cd +CHFLAGS= chflags +CHGRP= chgrp +CHMOD= chmod +CKSUM= cksum +CLANG= clang +CLANG_PLUSPLUS= clang++ +CLEAR= clear +CMP= cmp +COL= col +COLLDEF= colldef +COLRM= colrm +COLUMN= column +COMPRESS= compress +CP= cp +CPIO= cpio +CPP= cpp +CRC32= crc32 +CSH= csh +CSPLIT= csplit +CURL= curl +CUT= cut +C_PLUSPLUS= c++ +C_PLUSPLUS_FILT= c++filt +DATE= date +DC= dc +DD= dd +DF= df +DIFF3= diff3 +DIFF= diff +DIG= dig +DIRNAME= dirname +ED= ed +EGREP= egrep +ENV= env +EQN= eqn +ETAGS= etags +EXPECT= expect +EXPR= expr +FALSE= false +FGREP= fgrep +FILE= file +FIND2PERL= find2perl +FIND= find +FLEX= flex +FLEX_PLUSPLUS= flex++ +FMT= fmt +FOLD= fold +FS_USAGE= fs_usage +FUNZIP= funzip +FUSER= fuser +GCC= gcc +GDIFFMK= gdiffmk +GENCAT= gencat +GENSTRINGS= genstrings +GETOPT= getopt +GETOPTS= getopts +GNUMAKE= gnumake +GREP= grep +GROFF= groff +GROFFER= groffer +GROG= grog +GROPS= grops +GROTTY= grotty +GUNZIP= gunzip +GVIM= gvim +GZCAT= gzcat +GZEXE= gzexe +GZIP_PROG= gzip +G_PLUSPLUS= g++ +H2PH= h2ph +H2XS= h2xs +HASH= hash +HEAD= head +HOSTNAME_PROG= hostname +ICONV= iconv +ID= id +INDENT= indent +INFO= info +JOT= jot +KILL= kill +KSH= ksh +LAST= last +LD= ld +LESSECHO= lessecho +LEX= len +LINK= link +LN= ln +LS= ls +M4= m4 +MAKE= make +MAN= man +MKDIR= mkdir +MKFIFo= mkfifo +MKTEMP= mktemp +MV= mv +NANO= nano +NASM= nasm +NEQN= neqn +NICE= nice +NL= nl +NM= nm +NOHUP= nohup +NROFF= nroff +NSLOOKUP= nslookup +OD= od +OPENSSL= openssl +PASTE= paste +PATCH= patch +PATHCHK= pathchk +PAX= pax +PERL= perl +PICO= pico +PR= pr +PRINTENV= printenv +PS= ps +PTAR= ptar +PTARDIFF= ptardiff +PTARGREP= ptargrep +PWD= pwd +PYDOC= pydoc +PYTHON= python +PYTHONW= pythonw +READLINK= readlink +RENICE= renice +RESET= reset +REV= rev +RI= ri +RM= rm +RMDIR= rmdir +RSYNC= rsync +RUBY= ruby +RVIM= rvim +SAY= say +SCP= scp +SCREEN= screen +SCRIPT= script +SDIFF= sdiff +SED= sed +SEQ= seq +SFTP= sftp +SH= sh +SHA1= sha1 +SHA= sha +SHAR= shar +SHASUM5_18= shasum5.18 +SHASUM= shasum +SIZE= size +SLEEP= sleep +SORT= sort +SSH= ssh +STAT= stat +STRIP= strip +STTY= stty +SUM= sum +SYNC= sync +TABS= tabs +TAIL= tail +TAR= tar +TEE= tee +TEST= test +TFTP= tftp +TIDY= tidy +TIME= time +TOP= top +TOUCH= touch +TPUT= tout +TPUT= tput +TR= tr +TROFF= troff +TRUE= true +TSET= tset +TSORT= tsort +UL= ul +UNAME= uname +UNCOMPRESS= uncompress +UNEXPAND= unexpand +UNIFDEF= unifdef +UNIFDEFALL= unifdefall +UNIQ= uniq +UNITS= units +UNLINK= unlink +UNZIP= unzip +UNZIPSFX= unzipsfx +UPTIME= uptime +UUDECODE= uudecode +UUENCODE= uuencode +UUIDGEN= uuidgen +VI= vi +VIEW= view +VIM= vim +VIMDIFF= vimdiff +W= w +WAIT4PATH= wait4path +WAIT= wait +WC= wc +WHAT= what +WHATIS= whatis +WHICH= which +WHO= who +WHOAMI= whoami +WHOIS= whois +WRTIE= write +XAR= xar +XARGS= xargs +XATTR= xattr +XXD= xxd +YACC= yacc +YES= yes +ZCAT= zcat +ZCMP= zcmp +ZDIFF= zdiff +ZEGREP= zegrep +ZFGREP= zfgrep +ZFORCE= zforce +ZGREP= zgrep +ZIP= zip +ZIPCLOAK= zipcloak +ZIPGREp= zipgrep +ZIPINFo= zipinfo +ZIPNOTE= zipnote +ZIPSPLIT= zipsplit +ZLESS= zless +ZMORE= zmore +ZNEW= znew +ZPRINT= zprint +ZSH= zsh + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +#CSILENCE= -Wno-implicit-int +CSILENCE=-Wno-incompatible-pointer-types -Wno-return-type -Wno-format-security \ + -Wno-bitwise-op-parentheses -Wno-logical-op-parentheses -Wno-parentheses \ + -Wno-dangling-else -Wno-implicit-int -Wno-unused-value -Wno-pedantic \ + -Wno-misleading-indentation -Wno-sequence-point -Wno-unknown-warning-option + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=26 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +#OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= prog.orig.o +ALT_TARGET= default.orig prog.orig + +LINES= 24 +COLUMNS= 80 + +OS_SET= Linux FreeBSD Darwin + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: + $(MAKE) `${UNAME}` + +check-os: check-os.sh + ${SHELL} ./check-os.sh ${LINES} ${COLUMNS} + +error-stty: + @echo "No stty command here. Please manually specify size in the Makefile." >&2 ; false + +has-stty: + which stty >/dev/null || $(MAKE) error-stty + +fullscreen: has-stty + $(MAKE) prog \ + LINES=`stty size | sed -s 's/ .*$$//'` \ + COLUMNS=`stty size | sed -s 's/^.* //'` + +Darwin: prog.c + @${RM} -f $@ + ${CC} ${CFLAGS} -Dg=392 \ + -Ds=46 \ + -DV=${LINES} \ + -DW=${COLUMNS} \ + $< -o prog ${LIBS} + ${LN} prog $@ + +FreeBSD: prog.c + @${RM} -f $@ + ${CC} ${CFLAGS} -Dg=392 \ + -Ds=46 \ + -DV=${LINES} \ + -DW=${COLUMNS} \ + $< -o prog ${LIBS} + ${LN} prog $@ + +Linux: prog.c + @${RM} -f $@ + ${CC} ${CFLAGS} -Dg=11 \ + -Ds=0 \ + -DV=${LINES} \ + -DW=${COLUMNS} \ + $< -o prog ${LIBS} + ${LN} prog $@ + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +prog.orig: + $(MAKE) `${UNAME}`.orig + +FreeBSD.orig: prog.orig.c + @${RM} -f $@ + ${CC} ${CFLAGS} -Dg=392 \ + -Ds=46 \ + -DV=${LINES} \ + -DW=${COLUMNS} \ + $< -o prog.orig ${LIBS} + ${LN} prog.orig $@ + +Linux.orig: prog.orig.c + @${RM} -f $@ + ${CC} ${CFLAGS} -Dg=11 \ + -Ds=0 \ + -DV=${LINES} \ + -DW=${COLUMNS} \ + $< -o prog.orig ${LIBS} + ${LN} prog.orig $@ + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + ${RM} -f ${OS_SET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic fc6b6af226b7cc598de3d48fc20ed0bd54f7b4f7f0f651a32b9cf8345b2a3b3f --FNV1a_hash_512_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --level 391581 --mode 216193 --FNV1a_hash_512_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore IAU, $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore, $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2019/duble/Makefile.orig b/2019/duble/Makefile.orig new file mode 100644 index 000000000..16b8250eb --- /dev/null +++ b/2019/duble/Makefile.orig @@ -0,0 +1,33 @@ + +LINES=24 +COLUMNS=80 +CC=gcc + +CSILENCE=-Wno-incompatible-pointer-types -Wno-return-type -Wno-format-security \ + -Wno-bitwise-op-parentheses -Wno-logical-op-parentheses \ + -Wno-dangling-else -Wno-implicit-int -Wno-unused-value + +CFLAGS=$(CSILENCE) + +default: + $(MAKE) `uname` + +check-os: + sh check-os.sh $(LINES) $(COLUMNS) + +FreeBSD: + RAW_MODE=392 \ + IPC_MODE=46 \ + $(MAKE) binary + +Linux: + RAW_MODE=11 \ + IPC_MODE=0 \ + $(MAKE) binary + +binary: + $(CC) $(CFLAGS) -Dg=$$RAW_MODE \ + -Ds=$$IPC_MODE \ + -DV=$(LINES) \ + -DW=$(COLUMNS) \ + -o prog prog.c diff --git a/2019/duble/check-os.sh b/2019/duble/check-os.sh new file mode 100644 index 000000000..9959f040a --- /dev/null +++ b/2019/duble/check-os.sh @@ -0,0 +1,77 @@ +#!/bin/sh + +PROGNAME="$0" +LINES="$1" +COLUMNS="$2" + +if [ "$2" = "" ] +then + echo "Usage: $0 " + exit 1 +fi + +OS=$(uname) + +MAGIC_VALUE_LINUX=$(((COLUMNS*28+12)*LINES+36)) + +linux_min_vals() { + cat << EOF +net.core.wmem_max $MAGIC_VALUE_LINUX +net.core.wmem_default $MAGIC_VALUE_LINUX +EOF +} + +MAGIC_VALUE_FREEBSD=16777216 + +freebsd_min_vals() { + cat << EOF +net.local.dgram.recvspace $MAGIC_VALUE_FREEBSD +net.local.dgram.maxdgram $MAGIC_VALUE_FREEBSD +net.local.seqpacket.recvspace $MAGIC_VALUE_FREEBSD +net.local.seqpacket.maxseqpacket $MAGIC_VALUE_FREEBSD +kern.ipc.maxsockbuf $((4*MAGIC_VALUE_FREEBSD)) +EOF +} + +list_fixup_commands() { + while read param min_value + do + cur_val=$(sysctl -n $param) + if [ "$cur_val" -lt "$min_value" ] + then + echo "$PROGNAME -- $ sudo sysctl $param=$min_value" + fi + done +} + +echo +echo "$PROGNAME -- Detected OS: $OS" + +case "$OS" in + "Linux") + fixup_commands="$(linux_min_vals | list_fixup_commands)" + ;; + "FreeBSD") + fixup_commands="$(freebsd_min_vals | list_fixup_commands)" + ;; + *) + echo "$PROGNAME -- Sorry, the program has not been designed or tested for your OS!" + exit 1 # failed, unknown OS +esac + +if [ -z "$fixup_commands" ] +then + echo "$PROGNAME -- Checking IPC parameters... OK!" + echo + exit # script was successful +else + cat << EOF +$PROGNAME -- Checking IPC parameters... FAILED! + +$PROGNAME -- Program compiled as ${COLUMNS}x${LINES} needs higher default IPC parameters. +$PROGNAME -- Please run: +$fixup_commands + +EOF + exit 2 # failed, OS needs higher IPC parameter values. +fi diff --git a/2019/duble/hint.html b/2019/duble/hint.html new file mode 100644 index 000000000..f1ed1d525 --- /dev/null +++ b/2019/duble/hint.html @@ -0,0 +1,204 @@ + + + + + + Best collaborative graphics + + +

    Best collaborative graphics

    + +

    Etienne Duble
    +https://lig-membres.imag.fr/duble
    +Twitter: @etienne_duble

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    + +

    Try:

    + +
    ./prog /tmp/drawing
    +
    +(open another window / terminal)
    +
    +./prog /tmp/drawing
    +
    +(open more terminals....)
    +
    +./prog /tmp/drawing
    +
    + +

    Selected Judges Remarks:

    + +

    After starting the program, use the cursor keys, then try some modes, like “p” +or “l” (they toggle).

    + +

    Author’s comments:

    + +

    Introduction

    + +

    This program is a graphics editor, running on the terminal.

    + +

    It provides collaborative features: one can join the drawing session +of someone else by just opening the same file!

    + +

    Getting started

    + +

    The program can run on Linux, FreeBSD, Mac OS X, and in most terminals. +See section ‘Limits, Portability’ for more info.

    + +

    To build, type make (assuming gcc) or make CC=clang.

    + +

    Then you can start the program. It expects a file path as its first argument:

    + +
    $ ./prog /tmp/drawing
    +
    + +

    (If not started this way, prog will refuse to start.)

    + +

    If the file does not exist, you will start with a blank drawing.

    + +

    If someone else (or another instance of yourself, maybe??) is already +editing this file, you will join the session!

    + +

    Edition features

    + +
      +
    • arrow keys: move cursor.
    • +
    • p key: enter pen mode (type p again to return to the default move mode).
    • +
    • l key: enter line mode (type l again to validate the line and return to the move mode).
    • +
    • c key: cycle through a small set of different colors.
    • +
    • q key: quit the editor. The drawing is automatically saved.
    • +
    + + +

    The mode and current color is indicated at the bottom left corner of +the editor.

    + +

    Bonus features

    + +
      +
    • If you just want to display the content of a drawing file, you do not +need to start the editor. Just execute the drawing file: ./<the-file>. +(This will fail if someone is still editing the file, though.)
    • +
    • ls --color <drawing-files...> will probably select different colors +to indicate whether a drawing file is being edited or not. :-)
    • +
    + + +

    Obfuscation

    + +

    You will probably have a hard time analyzing this entry, because:

    + +
      +
    • Analyzing a system made of several communicating programs is known to +be a complex task. (And if you think that observing a single-user drawing +session will be a good starting point, read on.)
    • +
    • Code coverage of single vs multi-user sessions is more or less the same. :-)
    • +
    • Code coverage when using move, pen or line modes is almost the same. +(so, is there a Bresenham algorithm somewhere??)
    • +
    • Some OS resource values and stdlib call results are inferred.
    • +
    • Whenever possible, variable names are reused.
    • +
    • You might start analyzing escape code sequences right now, but warming up +your brain is actually recommended. Start with a simple question such as: +in inverse video mode, will a space char show the foreground color or +background color?
    • +
    + + +

    A few more things

    + +

    Did you notice the enum declaration? Could it be just an int or const int +variable, instead? (spoiler: http://c-faq.com/ansi/constasconst.html)

    + +

    If your keyboard has no arrow keys, you can probably find alternate keys by +reading the source code.

    + +

    Limits, Portability

    + +

    I tested the program on several Linux systems, on FreeBSD 12, and on +Mac OS X (mojave).

    + +

    On Linux, the program uses an OS-specific detail to hide communication +artefacts, and avoids the need to remove them on exit. +Since this is Linux-specific, it was not possible on FreeBSD or Mac OS. +Its behavior is a little more dirty there.

    + +

    The program should work on most terminals that support 8-bit colors, +inverse video mode, and movement escape codes, e.g. xterm, gnome-terminal, +terminator, etc.

    + +

    Note: the drawing files prog generates are probably even more portable than +prog itself!

    + +

    Drawing area size

    + +

    The drawing area size is set at compilation time.

    + +

    The default size is the one of my xterm (see top of Makefile). +You may set it to the full size of your terminal window by typing:

    + +
    $ make fullscreen
    +
    + +

    IMPORTANT NOTES:

    + +
      +
    • The program compiled with a given size will fail to reload a drawing file +with a different size!
    • +
    • No scrolling is implemented (sorry but that would be too much for rule2!), +so any peer reaching the session should have a terminal with the same +size or larger.
    • +
    + + +

    prog.c vs prog.orig.c

    + +

    The file prog.orig.c is the one I submitted.

    + +

    Judges proposed a small update: the program was using macro FD_SET inside an +expression, which breaks compilation on Mac OS X. Wrapping this macro into a +function was enough to fix this compilation issue.

    + +

    However, that was not enough to make the program work on Mac OS X. If you analyse +the program you will see that it heavily relies on OS resources. And, for this +first version of the program, you even needed to increase default sysctl +parameters to make it work on FreeBSD (this was the purpose of file check-os.sh). +I tried hard to tune Mac OS X the same, but failed.

    + +

    The simple fact Judges proposed this update meant they wish it could work on Mac. +And if judges wish something, it has to be done. ;) +So I refactored a little more the program to reduce OS resources consumption. +Or maybe not reduce consumption, but consume them differently… +And I obtained prog.c. With this version, no need to touch sysctl parameters, +and it works on Mac OS X too! +I must confess it was challenging to remain below the size limit with this little +change.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2019, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2019/duble/hint.text b/2019/duble/hint.text new file mode 100644 index 000000000..0ea41c6ad --- /dev/null +++ b/2019/duble/hint.text @@ -0,0 +1,165 @@ +# Best collaborative graphics + +Etienne Duble + +Twitter: @etienne_duble + + +## Judges' comments: +### To use: + + make + +### Try: + + ./prog /tmp/drawing + + (open another window / terminal) + + ./prog /tmp/drawing + + (open more terminals....) + + ./prog /tmp/drawing + +### Selected Judges Remarks: + +After starting the program, use the cursor keys, then try some modes, like "p" +or "l" (they toggle). + +## Author's comments: +### Introduction + +This program is a **graphics editor**, running on the terminal. + +It provides **collaborative** features: one can join the drawing session +of someone else by just opening the same file! + +### Getting started + +The program can run on Linux, FreeBSD, Mac OS X, and in most terminals. +See section 'Limits, Portability' for more info. + +To build, type `make` (assuming gcc) or `make CC=clang`. + +Then you can start the program. It expects a file path as its first argument: + + $ ./prog /tmp/drawing + +(If not started this way, `prog` will refuse to start.) + +If the file does not exist, you will start with a blank drawing. + +If someone else (or another *instance of yourself*, maybe??) is already +editing this file, you will join the session! + +### Edition features + +* **arrow keys**: move cursor. +* **p** key: enter *pen* mode (type **p** again to return to the default *move* mode). +* **l** key: enter *line* mode (type **l** again to validate the line and return to the *move* mode). +* **c** key: cycle through a small set of different *colors*. +* **q** key: quit the editor. The drawing is automatically saved. + +The mode and current color is indicated at the bottom left corner of +the editor. + +### Bonus features + +* If you just want to display the content of a drawing file, you do not + need to start the editor. Just **execute the drawing file**: `./`. + (This will fail if someone is still editing the file, though.) +* `ls --color ` will probably select different colors + to indicate whether a drawing file is being edited or not. :-) + +### Obfuscation + +You will probably have a hard time analyzing this entry, because: + +* Analyzing a system made of several communicating programs is known to + be a complex task. (And if you think that observing a single-user drawing + session will be a good starting point, read on.) +* Code coverage of single vs multi-user sessions is more or less the same. :-) +* Code coverage when using *move*, *pen* or *line* modes is almost the same. + (so, is there a Bresenham algorithm somewhere??) +* Some OS resource values and stdlib call results are inferred. +* Whenever possible, variable names are reused. +* You might start analyzing escape code sequences right now, but warming up + your brain is actually recommended. Start with a simple question such as: + *in inverse video mode, will a space char show the foreground color or + background color?* + +### A few more things + +Did you notice the `enum` declaration? Could it be just an `int` or `const int` +variable, instead? (spoiler: http://c-faq.com/ansi/constasconst.html) + +If your keyboard has no arrow keys, you can probably find alternate keys by +reading the source code. + +### Limits, Portability + +I tested the program on several Linux systems, on FreeBSD 12, and on +Mac OS X (mojave). + +On Linux, the program uses an OS-specific detail to hide communication +artefacts, and avoids the need to remove them on exit. +Since this is Linux-specific, it was not possible on FreeBSD or Mac OS. +Its behavior is a little more *dirty* there. + +The program should work on most terminals that support 8-bit colors, +inverse video mode, and movement escape codes, e.g. `xterm`, `gnome-terminal`, +`terminator`, etc. + +Note: the drawing files `prog` generates are probably even more portable than +`prog` itself! + +### Drawing area size + +*The drawing area size is set at compilation time*. + +The default size is the one of my xterm (see top of Makefile). +You may set it to the full size of your terminal window by typing: + + $ make fullscreen + +IMPORTANT NOTES: + +* **The program compiled with a given size will fail to reload a drawing file + with a different size!** +* No scrolling is implemented (sorry but that would be too much for rule2!), + so any peer reaching the session should have a terminal with the same + size or larger. + +### prog.c vs prog.orig.c + +The file `prog.orig.c` is the one I submitted. + +Judges proposed a small update: the program was using macro `FD_SET` inside an +expression, which breaks compilation on Mac OS X. Wrapping this macro into a +function was enough to fix this compilation issue. + +However, that was not enough to make the program work on Mac OS X. If you analyse +the program you will see that it heavily relies on OS resources. And, for this +first version of the program, you even needed to increase default `sysctl` +parameters to make it work on FreeBSD (this was the purpose of file `check-os.sh`). +I tried hard to tune Mac OS X the same, but failed. + +The simple fact Judges proposed this update meant they wish it could work on Mac. +And if judges wish something, it **has to** be done. ;) +So I refactored a little more the program to reduce OS resources consumption. +Or maybe not reduce consumption, but consume them differently... +And I obtained `prog.c`. With this version, no need to touch `sysctl` parameters, +and it works on Mac OS X too! +I must confess it was challenging to remain below the size limit with this little +change. + + +-------------------------------------------------------------------------------- + diff --git a/2019/duble/prog.c b/2019/duble/prog.c new file mode 100644 index 000000000..c38244314 --- /dev/null +++ b/2019/duble/prog.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int a,b,c,d,e,f,h,i,j,k,l,m,n;fd_set p[1],q;struct{int A,B,C,D,E, F +,G,H,I,J,L,K;}w ,x;r(int r){return b=r,FD_ISSET(r,p);}enum{u=V*( 11 *W ++5)+16};t( int t){FD_SET(t,&q);}struct sockaddr_un A, B,*D,C={ . +sun_family=1}; char v[u];unsigned int E=sizeof(B),F= sizeof( x +);char*I="\e" "[0m\e[2J\e[0;0H",*K,*L=&C.sun_path, *M,*J = +"\e[0;30;40" "m \0\e[0m\n\0#!/bin/cat\n\e[1A",N; O(){ n= +0;while(++n< 9)*(n+L)=rand()%13+65;t(b=socket(1 ,2 ,0 +));n=bind(b, b==4?&B:&C,E);}struct timeval y,z ;H ( +){recvfrom(b ,&w,F,0,&A,&E),a=w.A;}Q(){close ( 4) +;fopen(K,"r" ) &&(read(4,v,u),close(4),unlink (K ) +),O();b=3;}P ( int P){strcat(v,J+P);}G(int G ){ x. +A=G;D=G<5?0: G ^8?&B:&A;return sendto(b,G^3 ? & +x:&w,F,0,D,! ! D*E);}struct termios o;main ( int +F,char**D){n = 0;for(P(18);n++c +&&(c=b),G(1) ; if(r(3) ) if(H(),a^2){ a ||G(6), +a^1||(x.B=w.C, x.D||(x. D=x.B%6+1),x. L ||G(5)) +,a^4||(v[x.L++] =w.K, x. L8)// +for(d=w.F,e=w.G,f =w.H,h=w.I,a=w.E,i=dl?j:-l)/ 2;M=34+ +(v+(e+1)*(5+W * 11 )+d*11) +,47^w.J&&43^w . J|w.A ^ +10||(*M=w.D+ 48 ),*(M-3 +)=w.D*(w.D +48!=*M)+48,*(M-6)=w.E*7+48,*(M+2)=a?42:32 , +printf("" "\e[%d;%dH%.11s\e[%d;%dH\e[0;4%dm%c%s%s",e+2, +d+2,M-8 ,V,8,x.D,x.J+65,I+8,J),f^d|e^h;)(b=n)>-j&&(n-=l +,d+=i) ,b +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct sockaddr_un u,v={.sun_family=1},*w=&v,x;struct timeval b,c ; +fd_set r,t[ 1]; enum{z=V*(11*W+5)+15};struct{int A,B,C,D,E,F,G,H ,I ; +char J,K[z];}A ,B;y(int y){return FD_ISSET(y,t);} int d,e,f,h, i, +j,k,l,m,n,o,p, q;unsigned int I=sizeof(x),J=sizeof(B );char* E +=B.K,*D="\e[" "0;30;40m \0\e[0m\n\0#!/bin/cat\n\e" "[1A" , +*C="\e[0m\e" "[2J\e[0;0H",*F,*G=&v.sun_path,H;K( int K) +{strcat(E,D+ K);}struct termios a;N(){p=0;while ( ++ +p<9)*(p+ G)= rand()%13+65;p=bind(d=socket(1,2, 0) , +w,I);FD_SET( d,&r);}O(){close(4);fopen(F,"r" ) && +(read(4,B.K, z ),close(4),unlink(F)),w=&x;N() ;d = +3;}L(int L){ B .A=L;return sendto(d,&B,J,0,w ,I *! +!w);}M(int M ) {return recvfrom(M,&A,J,0,&u , & +I);}main(int P ,char**Q){for(p=0,K(18);p++ +e&&(e=d),w=0,L (4);if(y (3 ))if(M(3),A. A^5){A. +A^1||L(+0),A.A ^4||(B. B ||printf("%s%" ".*s\r" +" \e[97mmode:" ,C,z-5,A .K),B.B=A.C,B.D ||(B.D= +B.B%6+1),strcpy (B.K, A. K));if(A.A==2)if( B.B^5|| +close(A.B),A. B ==B. B ){if(6==1+B.B)for( unlink( +F),write(creat(F,511), B.K,z),d=5,w=0;++d<= e;)if(L +(5)+1)for(M(d);++d<= e;)L(1);(int)printf(C );break +;}if(A.A>6)for(h=A. F,i=A.G,j=A.H,k=A.I,f= A.E,l=h +o?m: +-o)/2;E=34+(B.K+ (i+1)*(5+W*11)+h*11),47^A .J&&43^ +A.J|8^A.A||(*E= 48 +A.D),* +(E-3)=A.D*(A. D +48!=*E +)+48,*(E-6)= A. E*7+48, +*(E+2)=f ? 42:32,printf("\e[%d;%dH%.11s\e[%d;%dH\e[0;4" +"%dm%c%s" "%s",2+i,h+2,E-8,V,8,B.D,B.J+65,C+8,D),j^h|i^ +k;)(d=p )>-m&&(p-=o,h+=l),d' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic fc6b6af226b7cc598de3d48fc20ed0bd54f7b4f7f0f651a32b9cf8345b2a3b3f --FNV1a_hash_512_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --level 391581 --mode 216193 --FNV1a_hash_512_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore IAU, $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore, $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2019/endoh/hint.html b/2019/endoh/hint.html new file mode 100644 index 000000000..8b454d415 --- /dev/null +++ b/2019/endoh/hint.html @@ -0,0 +1,132 @@ + + + + + + Most in need of debugging + + +

    Most in need of debugging

    + +

    Yusuke Endoh
    +Twitter: @mametter

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    + +

    Try:

    + +
    ./prog
    +
    +gdb ./prog || llvm ./prog
    +
    + +

    Selected Judges Remarks:

    + +

    The purpose of this program is to crash. You’ll want to have memorized “man +ascii” when debugging it to reveal its purpose.

    + +

    Author’s comments:

    + +

    backtrace quine

    + +

    Compile prog.c with no optimization.

    + +
    $ gcc -g -O0 -o prog prog.c
    +
    + +

    Then, run it. You will see a segmentation fault.

    + +
    $ ./prog
    +Segmentation fault (core dumped)
    +
    + +

    Let’s debug. As usual, run it under gdb.

    + +
    $ gdb ./prog
    +(gdb) run
    +Starting program: /home/.../prog
    +
    +Program received signal SIGSEGV, Segmentation fault.
    +0x0000000000000000 in ?? ()
    +
    + +

    Okay, check the backtrace.

    + +
    (gdb) backtrace
    +#0  0x0000000000000000 in ?? ()
    +#1  0x0000555555555201 in x23 () at prog.c:35
    +#2  0x000055555555571a in x64 () at prog.c:100
    +#3  0x0000555555555747 in x65 () at prog.c:101
    +#4  0x0000555555555774 in x66 () at prog.c:102
    +#5  0x00005555555557ce in x69 () at prog.c:105
    +#6  0x0000555555555828 in x6e () at prog.c:110
    +#7  0x0000555555555747 in x65 () at prog.c:101
    +...
    +
    + +

    See the line numbers and lookup the ASCII table.

    + +
     35 = '#'
    +100 = 'd'
    +101 = 'e'
    +102 = 'f'
    +105 = 'i'
    +110 = 'n'
    +101 = 'e'
    +...
    +
    + +

    One more thing

    + +

    The original program can be used as a GDB command file.

    + +
    $ gdb -q -x prog.c ./prog | cat
    +Reading symbols from ./prog...done.
    +
    +Program received signal SIGSEGV, Segmentation fault.
    +0x0000000000000000 in ?? ()
    +#0  0x0000000000000000 in ?? ()
    +#1  0x0000555555555201 in x23 () at prog.c:35
    +#2  0x000055555555571a in x64 () at prog.c:100
    +#3  0x0000555555555747 in x65 () at prog.c:101
    +#4  0x0000555555555774 in x66 () at prog.c:102
    +#5  0x00005555555557ce in x69 () at prog.c:105
    +#6  0x0000555555555828 in x6e () at prog.c:110
    +#7  0x0000555555555747 in x65 () at prog.c:101
    +...
    +
    + +

    By using this, you can confirm that it is actually a quine.

    + +
    $ gdb -q -x prog.c ./prog | sed -n -r 's/#.*:([0-9]+)/\1/p' | awk '{printf "%c",$1}' > prog2.c
    +$ diff prog.c prog2.c
    +
    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2019, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2019/endoh/hint.text b/2019/endoh/hint.text new file mode 100644 index 000000000..2cf84c7bb --- /dev/null +++ b/2019/endoh/hint.text @@ -0,0 +1,100 @@ +# Most in need of debugging + +Yusuke Endoh +Twitter: @mametter + + +## Judges' comments: +### To use: + + make + +### Try: + + ./prog + + gdb ./prog || llvm ./prog + +### Selected Judges Remarks: + +The purpose of this program is to crash. You'll want to have memorized "man +ascii" when debugging it to reveal its purpose. + +## Author's comments: +### backtrace quine + +Compile prog.c with no optimization. + + $ gcc -g -O0 -o prog prog.c + +Then, run it. You will see a segmentation fault. + + $ ./prog + Segmentation fault (core dumped) + +Let's debug. As usual, run it under gdb. + + $ gdb ./prog + (gdb) run + Starting program: /home/.../prog + + Program received signal SIGSEGV, Segmentation fault. + 0x0000000000000000 in ?? () + +Okay, check the backtrace. + + (gdb) backtrace + #0 0x0000000000000000 in ?? () + #1 0x0000555555555201 in x23 () at prog.c:35 + #2 0x000055555555571a in x64 () at prog.c:100 + #3 0x0000555555555747 in x65 () at prog.c:101 + #4 0x0000555555555774 in x66 () at prog.c:102 + #5 0x00005555555557ce in x69 () at prog.c:105 + #6 0x0000555555555828 in x6e () at prog.c:110 + #7 0x0000555555555747 in x65 () at prog.c:101 + ... + +See the line numbers and lookup the ASCII table. + + 35 = '#' + 100 = 'd' + 101 = 'e' + 102 = 'f' + 105 = 'i' + 110 = 'n' + 101 = 'e' + ... + + +#### One more thing + +The original program can be used as a GDB command file. + + $ gdb -q -x prog.c ./prog | cat + Reading symbols from ./prog...done. + + Program received signal SIGSEGV, Segmentation fault. + 0x0000000000000000 in ?? () + #0 0x0000000000000000 in ?? () + #1 0x0000555555555201 in x23 () at prog.c:35 + #2 0x000055555555571a in x64 () at prog.c:100 + #3 0x0000555555555747 in x65 () at prog.c:101 + #4 0x0000555555555774 in x66 () at prog.c:102 + #5 0x00005555555557ce in x69 () at prog.c:105 + #6 0x0000555555555828 in x6e () at prog.c:110 + #7 0x0000555555555747 in x65 () at prog.c:101 + ... + +By using this, you can confirm that it is actually a quine. + + $ gdb -q -x prog.c ./prog | sed -n -r 's/#.*:([0-9]+)/\1/p' | awk '{printf "%c",$1}' > prog2.c + $ diff prog.c prog2.c + +-------------------------------------------------------------------------------- + diff --git a/2019/endoh/prog.c b/2019/endoh/prog.c new file mode 100644 index 000000000..25e3275fc --- /dev/null +++ b/2019/endoh/prog.c @@ -0,0 +1,126 @@ +#define o void/* +r +bt +q +*/ +char*d="o x!!(){f[*r--]();}!!#define o void/*!r!bt!q!*/!char*d=!!o(*f[])()={b!!,*q;o(*f[128])();int*r,t[9999],*h=t+127,\ +n;o x0a(){f[*r--]();}int main(){f[0]();f[59]();}o v(int x!){for(q=d+x;*q+q[1]-66;q++)*++h=*q-33?*q:10;}o a(int x){*++r=\ +*++h=x+48+x/10*39;}o b(){*h=1;r=2096+t;v(21);for(*++h=34,q=!d;*q;t[*++h=*q++]=1){(q-d+8)%119?0:(t[*++h=92]=1,t[*++h=10]\ +=1);}for(v(t[*++h=34]=71);++n/126-1;n/13?*++h=10:0){*++r=44,*!++r=48,t[n]?*r+=72,v(0),a(n/16),a(n%16),v(5),h-=n-10?0:19\ +:h;}v(57);*++r=125;}!!",*q;o(*f[128])();int*r,t[9999],*h=t+127,n;o x0a(){f[*r--]();}int main(){f[0]();f[59]();}o v(int x +){for(q=d+x;*q+q[1]-66;q++)*++h=*q-33?*q:10;}o a(int x){*++r=*++h=x+48+x/10*39;}o b(){*h=1;r=2096+t;v(21);for(*++h=34,q= +d;*q;t[*++h=*q++]=1){(q-d+8)%119?0:(t[*++h=92]=1,t[*++h=10]=1);}for(v(t[*++h=34]=71);++n/126-1;n/13?*++h=10:0){*++r=44,* +++r=48,t[n]?*r+=72,v(0),a(n/16),a(n%16),v(5),h-=n-10?0:19:h;}v(57);*++r=125;} + + + + + + + + + + + + + + + + + + +o x20(){f[*r--]();} +o x21(){f[*r--]();} +o x22(){f[*r--]();} +o x23(){f[*r--]();} + +o x25(){f[*r--]();} + + +o x28(){f[*r--]();} +o x29(){f[*r--]();} +o x2a(){f[*r--]();} +o x2b(){f[*r--]();} +o x2c(){f[*r--]();} +o x2d(){f[*r--]();} + +o x2f(){f[*r--]();} +o x30(){f[*r--]();} +o x31(){f[*r--]();} +o x32(){f[*r--]();} +o x33(){f[*r--]();} +o x34(){f[*r--]();} +o x35(){f[*r--]();} +o x36(){f[*r--]();} +o x37(){f[*r--]();} +o x38(){f[*r--]();} +o x39(){f[*r--]();} +o x3a(){f[*r--]();} +o x3b(){f[*r--]();} + +o x3d(){f[*r--]();} + +o x3f(){f[*r--]();} + + + + + + + + + + + + + + + + + + + + + + + + + + + +o x5b(){f[*r--]();} +o x5c(){f[*r--]();} +o x5d(){f[*r--]();} + + + +o x61(){f[*r--]();} +o x62(){f[*r--]();} +o x63(){f[*r--]();} +o x64(){f[*r--]();} +o x65(){f[*r--]();} +o x66(){f[*r--]();} + +o x68(){f[*r--]();} +o x69(){f[*r--]();} + + + +o x6d(){f[*r--]();} +o x6e(){f[*r--]();} +o x6f(){f[*r--]();} + +o x71(){f[*r--]();} +o x72(){f[*r--]();} + +o x74(){f[*r--]();} + +o x76(){f[*r--]();} + +o x78(){f[*r--]();} + + +o x7b(){f[*r--]();} + +o x7d(){f[*r--]();} +o(*f[])()={b,0,0,0,0,0,0,0,0,0,x0a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,x20,x21,x22,x23,0,x25,0,0,x28,x29,x2a,x2b,x2c,x2d,0,x2f,x30,x31,x32,x33,x34,x35,x36,x37,x38,x39,x3a,x3b,0,x3d,0,x3f,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,x5b,x5c,x5d,0,0,0,x61,x62,x63,x64,x65,x66,0,x68,x69,0,0,0,x6d,x6e,x6f,0,x71,x72,0,x74,0,x76,0,x78,0,0,x7b,0,x7d}; diff --git a/2019/giles/BlockDiagram.png b/2019/giles/BlockDiagram.png new file mode 100644 index 000000000..7c914bb78 Binary files /dev/null and b/2019/giles/BlockDiagram.png differ diff --git a/2019/giles/Makefile b/2019/giles/Makefile new file mode 100644 index 000000000..30567b22c --- /dev/null +++ b/2019/giles/Makefile @@ -0,0 +1,526 @@ +#!/usr/bin/env make +# +# 2019 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + +############################# +# shell used by this Makefile +############################# +# +SHELL= /bin/bash + +####################### +# common tool locations +####################### +# +A2P= a2p +AR= ar +ASA= asa +AT= at +ATQ= atq +ATRM= atrm +AWK= awk +BANNER= banner +BASE64= base64 +BASENAME= basename +BATCH= batch +BC= bc +BINHEX= binhex +BISON= bison +BUNZIP2= bunzip2 +BZCAT= bzcat +BZCMP= bzcmp +BZDIFF= bzdiff +BZEGREP= bzegrep +BZFGREP= bzfgrep +BZGREP= bzgrep +BZIP2= bzip2 +BZLESS= bzless +BZMORE= bzmore +C2PH= c2ph +C89= c89 +C99= c99 +CAL= cal +CALC= calc +CAT= cat +CD= cd +CHFLAGS= chflags +CHGRP= chgrp +CHMOD= chmod +CKSUM= cksum +CLANG= clang +CLANG_PLUSPLUS= clang++ +CLEAR= clear +CMP= cmp +COL= col +COLLDEF= colldef +COLRM= colrm +COLUMN= column +COMPRESS= compress +CP= cp +CPIO= cpio +CPP= cpp +CRC32= crc32 +CSH= csh +CSPLIT= csplit +CURL= curl +CUT= cut +C_PLUSPLUS= c++ +C_PLUSPLUS_FILT= c++filt +DATE= date +DC= dc +DD= dd +DF= df +DIFF3= diff3 +DIFF= diff +DIG= dig +DIRNAME= dirname +ED= ed +EGREP= egrep +ENV= env +EQN= eqn +ETAGS= etags +EXPECT= expect +EXPR= expr +FALSE= false +FGREP= fgrep +FILE= file +FIND2PERL= find2perl +FIND= find +FLEX= flex +FLEX_PLUSPLUS= flex++ +FMT= fmt +FOLD= fold +FS_USAGE= fs_usage +FUNZIP= funzip +FUSER= fuser +GCC= gcc +GDIFFMK= gdiffmk +GENCAT= gencat +GENSTRINGS= genstrings +GETOPT= getopt +GETOPTS= getopts +GNUMAKE= gnumake +GREP= grep +GROFF= groff +GROFFER= groffer +GROG= grog +GROPS= grops +GROTTY= grotty +GUNZIP= gunzip +GVIM= gvim +GZCAT= gzcat +GZEXE= gzexe +GZIP_PROG= gzip +G_PLUSPLUS= g++ +H2PH= h2ph +H2XS= h2xs +HASH= hash +HEAD= head +HOSTNAME_PROG= hostname +ICONV= iconv +ID= id +INDENT= indent +INFO= info +JOT= jot +KILL= kill +KSH= ksh +LAST= last +LD= ld +LESSECHO= lessecho +LEX= len +LINK= link +LN= ln +LS= ls +M4= m4 +MAKE= make +MAN= man +MKDIR= mkdir +MKFIFo= mkfifo +MKTEMP= mktemp +MV= mv +NANO= nano +NASM= nasm +NEQN= neqn +NICE= nice +NL= nl +NM= nm +NOHUP= nohup +NROFF= nroff +NSLOOKUP= nslookup +OD= od +OPENSSL= openssl +PASTE= paste +PATCH= patch +PATHCHK= pathchk +PAX= pax +PERL= perl +PICO= pico +PR= pr +PRINTENV= printenv +PS= ps +PTAR= ptar +PTARDIFF= ptardiff +PTARGREP= ptargrep +PWD= pwd +PYDOC= pydoc +PYTHON= python +PYTHONW= pythonw +READLINK= readlink +RENICE= renice +RESET= reset +REV= rev +RI= ri +RM= rm +RMDIR= rmdir +RSYNC= rsync +RUBY= ruby +RVIM= rvim +SAY= say +SCP= scp +SCREEN= screen +SCRIPT= script +SDIFF= sdiff +SED= sed +SEQ= seq +SFTP= sftp +SH= sh +SHA1= sha1 +SHA= sha +SHAR= shar +SHASUM5_18= shasum5.18 +SHASUM= shasum +SIZE= size +SLEEP= sleep +SORT= sort +SSH= ssh +STAT= stat +STRIP= strip +STTY= stty +SUM= sum +SYNC= sync +TABS= tabs +TAIL= tail +TAR= tar +TEE= tee +TEST= test +TFTP= tftp +TIDY= tidy +TIME= time +TOP= top +TOUCH= touch +TPUT= tout +TPUT= tput +TR= tr +TROFF= troff +TRUE= true +TSET= tset +TSORT= tsort +UL= ul +UNAME= uname +UNCOMPRESS= uncompress +UNEXPAND= unexpand +UNIFDEF= unifdef +UNIFDEFALL= unifdefall +UNIQ= uniq +UNITS= units +UNLINK= unlink +UNZIP= unzip +UNZIPSFX= unzipsfx +UPTIME= uptime +UUDECODE= uudecode +UUENCODE= uuencode +UUIDGEN= uuidgen +VI= vi +VIEW= view +VIM= vim +VIMDIFF= vimdiff +W= w +WAIT4PATH= wait4path +WAIT= wait +WC= wc +WHAT= what +WHATIS= whatis +WHICH= which +WHO= who +WHOAMI= whoami +WHOIS= whois +WRTIE= write +XAR= xar +XARGS= xargs +XATTR= xattr +XXD= xxd +YACC= yacc +YES= yes +ZCAT= zcat +ZCMP= zcmp +ZDIFF= zdiff +ZEGREP= zegrep +ZFGREP= zfgrep +ZFORCE= zforce +ZGREP= zgrep +ZIP= zip +ZIPCLOAK= zipcloak +ZIPGREp= zipgrep +ZIPINFo= zipinfo +ZIPNOTE= zipnote +ZIPSPLIT= zipsplit +ZLESS= zless +ZMORE= zmore +ZNEW= znew +ZPRINT= zprint +ZSH= zsh + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +#CSILENCE= -Wno-implicit-int +CSILENCE= -Wno-empty-body + +# compiler standard +# +#CSTD= +#CSTD= -ansi +#CSTD= -std=c11 +CSTD= -std=c99 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=26 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= +ALT_TARGET= + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic fc6b6af226b7cc598de3d48fc20ed0bd54f7b4f7f0f651a32b9cf8345b2a3b3f --FNV1a_hash_512_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --level 391581 --mode 216193 --FNV1a_hash_512_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore IAU, $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore, $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2019/giles/MonodyVocals.wav b/2019/giles/MonodyVocals.wav new file mode 100644 index 000000000..e0a4bf913 Binary files /dev/null and b/2019/giles/MonodyVocals.wav differ diff --git a/2019/giles/hint.html b/2019/giles/hint.html new file mode 100644 index 000000000..0f12f82e5 --- /dev/null +++ b/2019/giles/hint.html @@ -0,0 +1,200 @@ + + + + + + Most in need of wide space + + +

    Most in need of wide space

    + +

    Edward Giles

    + +

    Judges' comments:

    + +

    To use:

    + +
    make prog
    +./prog infile.wav outfile.wav
    +
    + +

    Try:

    + +
    play MonodyVocals.wav
    +./prog MonodyVocals.wav
    +play out.wav
    +
    + +

    Selected Judges Remarks:

    + +

    Do you need to pretend enjoying a more spacious living environment than you actually are in, +or the great outdoors with mountains and canyons, when recording your outgoing voicemail message? +Then don’t waste another minute! Record yourself, send the audio file through this entry, +and let your callers be surprised.

    + +

    Author’s comments:

    + +

    Description

    + +

    This program takes a WAV audio file as input, and applies an artificial reverberation effect to it. It works by feeding the audio through a number of delay lines of various lengths, with various amounts of feedback, to create a smooth echo that fades away over time. A number of parameters of the effect can be altered, to change its sonic characteristics.

    + +

    BlockDiagram.png is a block-diagram of the internal structure of the reverb algorithm, which is most likely easier to understand than the source code.

    + +

    MonodyVocals.wav is for testing the program: It is an extract of the unprocessed vocals from Monody by TheFatRat, featuring Laura Brehm. The track was published under a free license.

    + +

    This program has also been successfully compiled on Windows, with both the Tiny C Compiler and Microsoft’s C/C++ compiler. However, the latter reports warnings about loss of information when converting floats, and that void (*)() and void (*)(void) are not the same thing.

    + +

    Interesting fact: The size of the program from ./iocccsize -i is 2019.

    + +

    How to use:

    + +
    ./prog input [output [size [dry [wet [damping]]]]]
    +prog.exe input [output [size [dry [wet [damping]]]]]
    +
    + +
      +
    • input: The path to the input file. Required.
    • +
    • output: The path to the output file. Optional, defaults to out.wav.
    • +
    • size: The perceived size of the room, i.e. the approximate amount of time taken for the echo to fade away. Optional, default 1.6 seconds.
    • +
    • dry: The amount of unprocessed signal (“dry” in audio terminology) to add to the output. Optional, default 0.3 or 30%.
    • +
    • wet: The amount of processed (“wet”) signal to add to the output. Optional, default 0.5 or 50%.
    • +
    • damping: The amount by which high frequencies are damped out as the echo continues. This models the tendency for higher frequencies to be absorbed more than lower ones. Increasing this value causes the echo to be less “harsh” and more “muffled”. Optional, default 0.06 or 6%.
    • +
    + + +

    The values size, dry, wet, and damping can be specified either as decimal numbers (e.g. 0.35) or as percentages (e.g. 35%).

    + +

    The default settings are designed to make the effect obvious rather than subtle, so it may be a good idea to adjust the ratio of “dry” to “wet”, to give a more pleasant result:

    + +
    ./prog in.wav out.wav 1.8 80% 15%
    +
    + +

    The program only supports WAV files, and only mostly. Other audio formats, such as MP3, are not supported because they are difficult to decode, but there are free programs such as ffmpeg that can perform the conversion. Some of the advanced features of the WAV file format are also not supported, such as metadata, 3 or more channels, or a bit depth other than 16 bits. Fortunately, WAV files that don’t use these features are very common. The program validates the input file, so passing it a file it can’t process will cause the program to print Bad input file or Wave file must be 16 bits,1-2 channels. depending on what it thinks the problem is. If the output file cannot be opened, the program will print Can't open output file.

    + +

    Assumptions

    + +
      +
    1. The code is compiled using the C99 or C11 standard
    2. +
    3. Values are stored in memory in little-endian order
    4. +
    5. float is a floating-point type of any size, such that all zero bits represents the number zero
    6. +
    7. int16_t and int32_t are 2’s-complement, sizeof(int16_t) == 2 and sizeof(int32_t) == 4.
    8. +
    + + +

    Obfuscations

    + +

    The main obfuscation is that digital signal processing algorithms are inherently opaque. They just consist of iterating through a list of floating-point numbers and performing a series of arithmetic operations on each value. Even if this entry were entirely cleaned of all other obfuscation, it will appear to the average programmer to do the following:

    + +
      +
    • Read and validate command-line arguments.
    • +
    • Read and validate the header portion of the input file, and print some errors if that fails.
    • +
    • Write a modified form of that header into the output file.
    • +
    • Print the parameters read from the command-line arguments, in a human-readable format.
    • +
    • Dynamically allocate some arrays of floating-point numbers, to be used later, with lengths based on the size parameter
    • +
    • Read 16-bit audio samples from the input file, converting them to floating-point.
    • +
    • For each audio sample, do a weird combination of addition, subtraction, and multiplication by constants, using the previously-allocated arrays to store results between iterations. Write the resulting audio samples to the output file, converting them back to 16-bit integers.
    • +
    • Close all of the file handles and free the memory.
    • +
    + + +

    Note that no part of the above description of the code’s function had anything to do with echoes in a room. The purpose of the code is therefore hidden.

    + +

    The source code, on cursory inspection, appears to be a jumbled series of characters arranged into three arcs, representing sound waves. The overall layout distracts people from the fact that it is source code rather than only ASCII art, and the random appearance of the code discourages people from trying to decipher it.

    + +

    #defines are used to abbreviate the code, which has a side effect of making it very slightly harder to read.

    + +
      +
    • k is just a general-purpose replacement for 16.
    • +
    • i is the number of delay-lines to allocate and use (currently 24).
    • +
    • q is an abbreviation for multiplying two elements of w[] together.
    • +
    • u() is used to display percentages with proper rounding.
    • +
    • j() imposes an upper limit on a floating-point value, and then negates it. This operation is used eight times.
    • +
    • D() abbreviates a call to setvbuf, used to speed up file I/O.
    • +
    • l() is used to clip audio samples to the acceptable range, and convert them to 16-bit integers for output.
    • +
    • g() handles errors.
    • +
    • C() contains the bulk of the signal-processing code, as well as a preprocessor obfuscation trick: If you were to read the body of the macro out of context, it will appear to have multiple mismatched square brackets, since [ occurs more than ]. However, this macro is always invoked with arguments such as C(v],+10) which contain an unmatched ] character. When the macro is used in this manner, the extra [s in the macro’s body are matched with the ]s added through the first argument.
    • +
    + + +

    Every variable name is one letter long. This allows the code to fit into the IOCCC size limit, and it also makes the purpose of a given variable much less clear. For example, it is not evident from the name of the variable t that it contains pointers to the delay-line arrays.

    + +

    As many values as possible have been crammed into arrays. float w[] contains:

    + +
      +
    • the input parameters (w[0] to w[3])
    • +
    • various constants needed for the reverb algorithm (w[4] to w[9])
    • +
    • temporary storage of floating-point audio samples (w[10] to w[20])
    • +
    + + +

    int32_t f[] is even more multi-purpose. It contains:

    + +
      +
    • the header of the input file (f[0] to f[11])
    • +
    • the number of channels in the input file (f[12])
    • +
    • the number of samples of output to generate (f[13])
    • +
    • an end-of-file flag (f[14])
    • +
    • a variable that I forgot the exact purpose of (f[15])
    • +
    • indices into the circular buffers where audio samples should be inserted (f[16] to f[39])
    • +
    • indices where audio samples should be read out (f[40] to f[63])
    • +
    • lengths of the buffers (f[64] to f[87])
    • +
    + + +

    All of the strings are concatenated together and “encrypted” by breaking the string into 4-byte chunks (by casting it to an int32_t*), and then XORing the sequence of ints with a known numeric sequence. The “decryption” is not done in-place, to avoid writing over the string constant.

    + +

    int32_t *c is a pointer that points into f[], except that it is often incremented or decremented when it is accessed. In order to determine which indices of f[] are being accessed through c at any given point in the code, you would have to locate the places where c is modified.

    + +

    In order for this program to read and write WAV files, it needs to parse the header. The necessary information, such as the sample rate and channel count, is defined by the standard to be in somewhat arbitrary locations within the file. Therefore, even if you know which indices of f[] are being accessed, it takes extra effort to look up the WAV file format and determine which field that corresponds to.

    + +

    Some array accesses (which make up most of the program) have been replaced with harder-to-interpret equivalents, for example:

    + +
      +
    • X[1] -> 1[X]
    • +
    • f[14] -> 10[f+4]
    • +
    • X[0] -> *X
    • +
    + + +

    Assignments return the assigned value, allowing them to be included into later expressions: 10[f]=f[13]<<2; f[1]=20+10[f]+k; is replaced with f[1]=20+(10[f]=f[13]<<2)+k;

    + +

    This technique is used in conjuction with the comma operator to further obscure where the data ends up. For example,

    + +
      +
    • 12[f]=4[++c]>>k; was incorporated into w[0]*=6[f]; to yield w[0]*=(12[f]=4[++c]>>k,6[f]);
    • +
    • w[15]=w[k]=e[12[f]]; w[11]=w[10]=e[1]; becomes w[11]=(w[15]=w[k]=e[12[f]],w[10]=e[1]);
    • +
    + + +

    A few other miscellaneous obfuscations have also been done:

    + +
      +
    • while(++f[15]<12); is used instead of f[15]=12;
    • +
    • for(s=14[f]=0;s<f[13];s++) is used instead of f[14]=0; for(s=0;s<f[13];s++)
    • +
    • The line that contains printf("Hello, world!"); is mostly commented out.
    • +
    + + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2019, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2019/giles/hint.text b/2019/giles/hint.text new file mode 100644 index 000000000..7dd336ef7 --- /dev/null +++ b/2019/giles/hint.text @@ -0,0 +1,149 @@ +# Most in need of wide space + +Edward Giles + + +## Judges' comments: +### To use: + + make prog + ./prog infile.wav outfile.wav + +### Try: + + play MonodyVocals.wav + ./prog MonodyVocals.wav + play out.wav + +### Selected Judges Remarks: + +Do you need to pretend enjoying a more spacious living environment than you actually are in, +or the great outdoors with mountains and canyons, when recording your outgoing voicemail message? +Then don't waste another minute! Record yourself, send the audio file through this entry, +and let your callers be surprised. + +## Author's comments: +Description +----------- + +This program takes a WAV audio file as input, and applies an artificial reverberation effect to it. It works by feeding the audio through a number of delay lines of various lengths, with various amounts of feedback, to create a smooth echo that fades away over time. A number of parameters of the effect can be altered, to change its sonic characteristics. + +BlockDiagram.png is a block-diagram of the internal structure of the reverb algorithm, which is most likely easier to understand than the source code. + +MonodyVocals.wav is for testing the program: It is an extract of the unprocessed vocals from [Monody by TheFatRat, featuring Laura Brehm](https://www.youtube.com/watch?v=B7xai5u_tnk). The track was published under a free license. + +This program has also been successfully compiled on Windows, with both the [Tiny C Compiler](https://bellard.org/tcc/) and Microsoft's C/C++ compiler. However, the latter reports warnings about loss of information when converting floats, and that `void (*)()` and `void (*)(void)` are not the same thing. + +Interesting fact: The size of the program from `./iocccsize -i` is 2019. + +**How to use**: + + ./prog input [output [size [dry [wet [damping]]]]] + prog.exe input [output [size [dry [wet [damping]]]]] + +* `input`: The path to the input file. Required. +* `output`: The path to the output file. Optional, defaults to `out.wav`. +* `size`: The perceived size of the room, i.e. the approximate amount of time taken for the echo to fade away. Optional, default 1.6 seconds. +* `dry`: The amount of unprocessed signal ("dry" in audio terminology) to add to the output. Optional, default 0.3 or 30%. +* `wet`: The amount of processed ("wet") signal to add to the output. Optional, default 0.5 or 50%. +* `damping`: The amount by which high frequencies are damped out as the echo continues. This models the tendency for higher frequencies to be absorbed more than lower ones. Increasing this value causes the echo to be less "harsh" and more "muffled". Optional, default 0.06 or 6%. + +The values `size`, `dry`, `wet`, and `damping` can be specified either as decimal numbers (e.g. 0.35) or as percentages (e.g. 35%). + +The default settings are designed to make the effect obvious rather than subtle, so it may be a good idea to adjust the ratio of "dry" to "wet", to give a more pleasant result: + + ./prog in.wav out.wav 1.8 80% 15% + +The program only supports WAV files, and only mostly. Other audio formats, such as MP3, are not supported because they are difficult to decode, but there are free programs such as `ffmpeg` that can perform the conversion. Some of the advanced features of the WAV file format are also not supported, such as metadata, 3 or more channels, or a bit depth other than 16 bits. Fortunately, WAV files that don't use these features are very common. The program validates the input file, so passing it a file it can't process will cause the program to print `Bad input file` or `Wave file must be 16 bits,1-2 channels.` depending on what it thinks the problem is. If the output file cannot be opened, the program will print `Can't open output file`. + +Assumptions +----------- + +1. The code is compiled using the C99 or C11 standard +2. Values are stored in memory in little-endian order +3. `float` is a floating-point type of any size, such that all zero bits represents the number zero +4. `int16_t` and `int32_t` are 2's-complement, `sizeof(int16_t) == 2` and `sizeof(int32_t) == 4`. + +Obfuscations +------------ + +The main obfuscation is that digital signal processing algorithms are inherently opaque. They just consist of iterating through a list of floating-point numbers and performing a series of arithmetic operations on each value. Even if this entry were entirely cleaned of all other obfuscation, it will appear to the average programmer to do the following: + +* Read and validate command-line arguments. +* Read and validate the header portion of the input file, and print some errors if that fails. +* Write a modified form of that header into the output file. +* Print the parameters read from the command-line arguments, in a human-readable format. +* Dynamically allocate some arrays of floating-point numbers, to be used later, with lengths based on the `size` parameter +* Read 16-bit audio samples from the input file, converting them to floating-point. +* For each audio sample, do a weird combination of addition, subtraction, and multiplication by constants, using the previously-allocated arrays to store results between iterations. Write the resulting audio samples to the output file, converting them back to 16-bit integers. +* Close all of the file handles and free the memory. + +Note that no part of the above description of the code's function had anything to do with echoes in a room. The purpose of the code is therefore hidden. + +The source code, on cursory inspection, appears to be a jumbled series of characters arranged into three arcs, representing sound waves. The overall layout distracts people from the fact that it is source code rather than only ASCII art, and the random appearance of the code discourages people from trying to decipher it. + +`#define`s are used to abbreviate the code, which has a side effect of making it very slightly harder to read. + +* `k` is just a general-purpose replacement for 16. +* `i` is the number of delay-lines to allocate and use (currently 24). +* `q` is an abbreviation for multiplying two elements of `w[]` together. +* `u()` is used to display percentages with proper rounding. +* `j()` imposes an upper limit on a floating-point value, and then negates it. This operation is used eight times. +* `D()` abbreviates a call to `setvbuf`, used to speed up file I/O. +* `l()` is used to clip audio samples to the acceptable range, and convert them to 16-bit integers for output. +* `g()` handles errors. +* `C()` contains the bulk of the signal-processing code, as well as a preprocessor obfuscation trick: If you were to read the body of the macro out of context, it will appear to have multiple mismatched square brackets, since `[` occurs more than `]`. However, this macro is always invoked with arguments such as `C(v],+10)` which contain an unmatched `]` character. When the macro is used in this manner, the extra `[`s in the macro's body are matched with the `]`s added through the first argument. + +Every variable name is one letter long. This allows the code to fit into the IOCCC size limit, and it also makes the purpose of a given variable much less clear. For example, it is not evident from the name of the variable `t` that it contains pointers to the delay-line arrays. + +As many values as possible have been crammed into arrays. `float w[]` contains: + +* the input parameters (`w[0]` to `w[3]`) +* various constants needed for the reverb algorithm (`w[4]` to `w[9]`) +* temporary storage of floating-point audio samples (`w[10]` to `w[20]`) + +`int32_t f[]` is even more multi-purpose. It contains: + +* the header of the input file (`f[0]` to `f[11]`) +* the number of channels in the input file (`f[12]`) +* the number of samples of output to generate (`f[13]`) +* an end-of-file flag (`f[14]`) +* a variable that I forgot the exact purpose of (`f[15]`) +* indices into the circular buffers where audio samples should be inserted (`f[16]` to `f[39]`) +* indices where audio samples should be read out (`f[40]` to `f[63]`) +* lengths of the buffers (`f[64]` to `f[87]`) + +All of the strings are concatenated together and "encrypted" by breaking the string into 4-byte chunks (by casting it to an `int32_t*`), and then XORing the sequence of ints with a known numeric sequence. The "decryption" is not done in-place, to avoid writing over the string constant. + +`int32_t *c` is a pointer that points into `f[]`, except that it is often incremented or decremented when it is accessed. In order to determine which indices of `f[]` are being accessed through `c` at any given point in the code, you would have to locate the places where `c` is modified. + +In order for this program to read and write WAV files, it needs to parse the header. The necessary information, such as the sample rate and channel count, is defined by the standard to be in somewhat arbitrary locations within the file. Therefore, even if you know which indices of `f[]` are being accessed, it takes extra effort to look up the WAV file format and determine which field that corresponds to. + +Some array accesses (which make up most of the program) have been replaced with harder-to-interpret equivalents, for example: + +* `X[1]` -> `1[X]` +* `f[14]` -> `10[f+4]` +* `X[0]` -> `*X` + +Assignments return the assigned value, allowing them to be included into later expressions: `10[f]=f[13]<<2; f[1]=20+10[f]+k;` is replaced with `f[1]=20+(10[f]=f[13]<<2)+k;` + +This technique is used in conjuction with the comma operator to further obscure where the data ends up. For example, + +* `12[f]=4[++c]>>k;` was incorporated into `w[0]*=6[f];` to yield `w[0]*=(12[f]=4[++c]>>k,6[f]);` +* `w[15]=w[k]=e[12[f]]; w[11]=w[10]=e[1];` becomes `w[11]=(w[15]=w[k]=e[12[f]],w[10]=e[1]);` + +A few other miscellaneous obfuscations have also been done: + +* `while(++f[15]<12);` is used instead of `f[15]=12;` +* `for(s=14[f]=0;s diff --git a/2019/giles/prog.c b/2019/giles/prog.c new file mode 100644 index 000000000..6437137c8 --- /dev/null +++ b/2019/giles/prog.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include + +#define k 16 +#define i 24 +#define q(a,b)(w[a]*w[b]) +#define u(u)(int)((u[w]>0?1:-1)*.5f+100*u[w]) +#define j(j,J)w[j]=w[j]>J?-(J):-w[j]; +#define D(D)setvbuf(D,0,_IOFBF,a+1); +#define l(l)(K)(l>a?a:l>-a?l:-a) +#define g(g){fprintf(stderr,"%s\n",g);return 1;} + +typedef int32_t I; +typedef int16_t K; + +#define C(A,B) w[2 B]=t[ A[d[A];w[3 B]=w[1 B]+q(4 ,2 B);w[4 B]=w[2 B]-q(3 \ + B,4);z[A*=w[3];z[A+= q(3 B,9);t[A[f[k+A]=z[A;k[f+ A=d[A++;if(d[A>=d[i+A)d[A + FILE*n=0,*h=0;float*t[i] ;void m(){if(n)fclose(n) ;if(h)fclose(h);for(I s=0 + ;s;)0,y\25[RY" + "\0MHY\33\4\26F\7\7)tFW" "\4IM\\\37\0\21A\3\3,bF" "JWNFO\22\15\35M\14\14 *" + "**",a=65535,f[3*i+k],O[ 42],*o =O,*c=f+1,*d=f +i +k,s,v;char*y; float z[i] + ,X[i],w[21]={1.60f,.30f, 0.5f,.06f,.77f,.965926f, .258819f,.64731f,.9f};for + (s=0;s<5;s++)if(A>s+3){s [w]=strtod(b[s+3],&y);w[ s]/=*y==37?100:/*reverb!! + v[3]=2<>k,6[f]);j(0, 6e5f)j(0,-4e3f)j(2, 0)f[ 13]=(I)*w+f[10]/(2*12[f]) + ;K*e=(K*)(f+ 10);j(3,1)w [9]=3[w]<0?1+3[w]:1-w[3] ;if( 3<=f[12]||(4[c++]&a) + !=1|| 6[c--]>>k!=k) g(y+ 59)7[c]=k/2*(4[c]=5+4*(a >>=1))-i+20;c[6]=2*c[6]/f + [12];f[1]=20+(10[f]=f[13 ]<<2)+k;n=fopen(A>2?1[b+ 1]:y+28,y+3);if(!n)g(y+36 + )D(n)fwrite(f,28+k,1,n); printf(y+99,w[0]/6[f],u( 1),u(2),u(3));*X=(*w/=k); + 1[X]=q(0,8);for(s=0;s1)s[X]=X[s-2]* 7[w];s[d+i]=(I)s[X];s[z]= + (s[d]=0);s[f+k]=1;if(s[X ]>99)f[k-1]=(s-1)|1;s[t] =calloc(sizeof(float),s[d + +i]);}while(++f[15]<12); for(s= 14[f]=0;s 2048. These reasons + may be searched for and discovered if you are "Curios!" about 2053. :-) + Moreover, 2053 was the number of the kernel disk pack of one of the + judge's BESM-6. + + Take note that this secondary limit imposed by the IOCCC size tool + obviates some of the need to #define C reserved words in an effort + to get around the size limits of rule 2. + + Yes Virginia, that is a hint! + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many C compilers dislike the following code, and so do we: + + #define d define + #d foo /* <-- don't expect this to turn into #define foo */ + + When declaring local or global variables, you should declare the type: + + int this_is_fine; + this_is_not; /* <-- Try to avoid implicit type declarations */ + + We suggest that you compile your entry with a commonly available + c11 (formerly C1X) C compiler (ISO/IEC 9899:2011). + + Do not assume that optional c11 features are supported. If you + must use an optional c11 feature, use feature test macros so + that implementations without such optional c11 features will see + an entry that is both functional and interesting. + + We like entries that have workarounds that allow someone with + an older c99 (ISO/IEC 9899:1999) compiler to be able to compile + and enjoy your entry. + + We really like "lint free" code. However lint is a toll of the past. + So try to ensure that your entry compiles warning free. If possible, + to compile compile your code using: + + -Wall -Wextra -pedantic + + For compilers, such as clang, that have the -Weverything option, try + to make your code compile warning free using: + + -Wall -Wextra -Weverything -pedantic + + If you must turn off various warnings on the compile line such as: + + ... -Wno-empty-body -Wno-return-type ... + + be sure to clearly state so in your remarks AS WELL AS in + your "how to build" / Makefile. + + All other things being equal, a program that must turn off fewer + warnings will be considered better, for certain values of better. + + Unless you clearly state otherwise in your remarks AS WELL AS in + your "how to build" / Makefile we will compile using: + + -O3 -std=c11 + + Anyone care to submit an entry that makes gratuitous use of all + of the c11 reserved words in their intended C language contexts? + NOTE: As with the use of the word Belgium, the use of certain gratuitous + c11 reserved words may be completely banned in all parts of the Galaxy, + except in one small part (ISO/IEC 9899:2011) where they might not truly + understand the implications of such words. + + http://hitchhikers.wikia.com/wiki/Belgium + http://www.bezem.de/pdf/ReservedWordsInC.pdf + + DO NOT assume that we will use gcc to compile your program. + We will first try to compile your program using Clang. + + It is much better to not use any obscure compiler flags if + you can help it. We want to discourage the use of obscure compiler + flags that would make the program less portable. + + One side effect of the above is that you cannot assume the use + of nested functions such as: + + main() { +| void please_do_not_do_this() { +| printf("The machine that goes BING!\n"); + } +| please_do_not_do_this(); + } + + This is because such nested functions often requires one to compile with + a flag such as -fnested-functions that is not found on some compilers. + + On 2012 July 20, the judges rescinded the encouragement of + nested functions. Such constructions, while interesting and sometimes + amusing, will have to wait until they required by a C standard that are + actually implemented in commonly used C compilers. Sorry! + +| We prefer programs that do not require a fish license, crayons not +| withstanding. + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using . Use instead. + + On 28 January 2007, the Judges rescinded the requirement that the + '#" in a C preprocessor directive must be the 1st non-whitespace octet. + + The exit() function returns void. Some broken systems have exit() + return int, your entry should assume that exit() returns a void. + +| This guideline has a change mark at the very beginning is this line. + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + +| While those who are used to temperatures found on dwarf planet, +| (yes Virginia, dwarf planets are planets) such as Pluto might be able to +| explain to the Walrus why our seas are boiling hot, the question of +| whether pigs have wings is likely to remain a debatable point to most. + + One line programs should be short one line programs: say around 80 to 120 + octets long. Going well beyond 140 octets is a bit too long to be called + a one-liner in our vague opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS version specific + (index/strchr differences are OK, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is OK only if you warn us in the 'remark' header item) + * won't compile or run under a POSIX P1003.1/P1003.2 like systems + * depend on a utility or application not normally found on most + most POSIX P1003.1/P1003.2 like systems + * abuse the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are "blob-ier" than they need to be + * are rather similar to previous winners :-( + * are too similar to previous losers :-) + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + At least one judge prefers to maintain the use of the leap-second + as part of the world's time standard. If your code prints time + with seconds, we prefer that your code be capable of printing the + time of day during a leap-second where the value in seconds + after the minute mark is 60. + + The "how to build" make process should not be used to try and get + around the size limit. It is one thing to make use of a several -D's + on the compile like to help out, but it is quite another to use many + bytes of -D's in order to try and squeeze the source under the size limit. + + The judges, as a group, have a history giving wide degree of latitude + to reasonable entries. And recently they have had as much longitudinal + variation as it is possible to have on Earth. :-) + + You should try to restrict commands used on the build file to + POSIX-like or common Un*x-like commands. You can also compile + and use your own programs. If you do, try to build and execute + from the current directory. This restriction is not a hard and + absolute one. The intent is to ensure that the building if your + program is reasonably portable. + + We prefer programs that are portable across a wide variety of Un*x-like +| operating systems (i.e., Linux, GNU Hurd, BSD, Un*x, etc.). + + You are in a maze of twisty guidelines, all different. + + There are at least zero judges who think that Fideism has little + or nothing to do with the IOCCC judging process. + + Don't forget that the building of your program should be done + ***without human intervention***. So don't do things such as: + + prog: prog.c + #echo this next line requires data from standard input + cat > prog.c + ${CC} prog.c -o prog + + However, you can do something cute such as making your program + do something dumb (or cute) when it is built 'automatically'. And + when it is run with a human involved, do something more clever. + For example, one could use the build instructions: + + prog: prog.c + ${CC} prog.c -DNON_HUMAN_COMPILE -o prog + @echo "See remarks section about alternate ways to compile" + + and then include special notes in the program "remarks" for + alternate / human intervention based building. + + We want to get away from source that is simply a compact blob of + octets. Really try to be more creative than blob coding. *HINT!* + + Please do not use things like gzip to get around the size limit. +| Please try to be much more creative. + + We really dislike entries that make blatant use of including + large data files to get around the source code size limit. + + We do not recommend submitting systemd source code to the IOCCC, + if nothing else because that code is likely to exceed the source code + size limit. This isn't to say that another highly compact and obfuscated + replacement of init would not be an interesting submission. + + Did we remember to indicate that programs that blatantly use + some complex state machine to do something simple are boring? + We think we did. :-) + + All generalizations are false, including this one. -- Mark Twain + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! + Remember, you can submit more than one entry. See the rules for details. + + We suggest that you avoid trying for the 'smallest self-replicating' + source. The smallest, a zero byte entry, won in 1994. + + Programs that claim to be the smallest C source that does something, really + better be the smallest such program or they risk being rejected because + they do not work as documented. + + Please note that the C source below, besides lacking in obfuscation, + is NOT the smallest C source file that when compiled and run, dumps core: + + main; + + We do not like writable strings. That is, we don't want stuff like: + + char *T = "So many primes, so little time!"; + ... + T[14] = ';'; + + Please don't make use of this feature, even if your system allows it. + However, initialized char arrays are OK to write over. This is OK: + + char b[] = "Is this OK"; + b[9] = 'K'; + +| There are more than one typos in this sentence. + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. For + example, don't depend on a particular type or size of display. + Don't assume the use of a particular browser. Instead assume a + generic browser that forms to a widely used W3C standard. + Don't assume a particular sound sub-system or video driver is installed + in the OS. Instead, make use of a well known and widely available open + source program (one that actually works) to display audio/visual data. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. + + This is the only guideline that contains the word fizzbin. +| However, do you know how to play fizzbin? + + We don't like entries that use proprietary toolkits such as the M*tif, + Xv*ew, or OpenL*ok toolkits, since not everyone has them. Use of an + open source toolkit that is widely and freely available instead. + + The previous guideline in this spot has been replaced by this guideline. + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines + in the program "remarks". They should also not depend on any + particular window manager. + + Try to avoid entries that play silent sound segments or play the + Happy Birthday song; music that some people believe is copyrighted + (even if such copyrights appear to be bogus and/or blatant abuses of + the copyright system). + + While we recognize that UN*X is not a universal operating system, the + contest does have a bias towards such systems. In an effort to expand + the scope of the contest, we phrase our bias in terms of POSIX P1003.1 + and P1003.2 standards. This will allow certain non-UN*X OS users to + submit entries. On the other hand, this is a guideline and not a rule. + We will not reject an entry based on some POSIX technicality. + + When dealing with OS and application environments, we suggest that you + be reasonable with a nod towards vanilla UN*X-like systems. POSIX will + evolve but not as much as the contest. + + You very well might not be completely prohibited from failing to not + partly misunderstand this particular guideline, but of course we could +| not possibly comment. Nevertheless, you are neither prohibited, nor +| required to determine that this or the previous sentence is either false +| and/or misleading. Therefore, it might be wise to not fail to consider +| to do so, accordingly. + +| Any complaints about the above guideline could be addressed to the +| Speaker of the House of Commons, or to the speaker of your national +| pariliment should you have one. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION <== HINT!! + * make us laugh and/or throw up :-) (humor really helps!) + * make us want to eat good chocolate. + + Some types of programs can't excel (anti-tm) in some areas. Your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + You are better off explaining what your entry does in the program + "remarks" section rather than leaving it obscure for the judges + as we might miss something and/or be too tired to notice. + +| Please avoid this specific individual guideline, if possible. + + We freely admit that interesting, creative or humorous comments in + the program "remarks" help your chances of winning. If you had to + read so many twisted entries, you too would enjoy a good laugh or two. + We think the readers of the contest winners do as well. We do read + the program "remarks" during the judging process, so it is worth your + while to write remarkable program "remarks". + + We dislike C code with trailing control-M's (\r or \015) that results + in compilation failures. Some non-Un*x/non-Linux tools such as + MS Visual C and MS Visual C++ leave trailing control-M's on lines. + Users of such tools should strip off such control-M's before submitting + their entries. In some cases tools have a "Save As" option that will + prevent such trailing control-M's being added. + + One should restrict libcurses to portable features found on BSD + or Linux curses. + + Rule 13 states any C source that fails to compile because of unescaped + octets with the high bit set (octet value >= 128) will be rejected. + Instead of unescaped octets, you should use \octal or \hex escapes: + + /* 123456789 123456789 123456789 123456 */ + char *foo = "This string is 36 octets in length \263"; + /* This octet requires 4 octets of source ^^^^ */ + if (strlen(foo) == 36) printf("foo is 36 octets plus a final NUL\n"); + else printf("This code should not print this message\n"); + + It is a very good idea to, in your remarks file, tell us why you + think your entry is obfuscated. This is particularly true if + your entry is has some very subtle obfuscations that we might + otherwise overlook. <<-- Hint! + + Anyone can format their code into a dense blob. A really clever + author will try format their entry using a "normal" formatting style + such that at first glance (if you squint and don't look at the details) + the code might pass for non-obfuscated C. Deceptive comments, + and mis-leading formatting, in some cases, may be a plus. On the + other hand, a misleading code style requires more source bytes. + + If you do elect to use misleading formatting and comments, we + suggest you remark on this point in your remarks where you talk + about why you think your entry is obfuscated. On the other hand, + if you are pushing up against the size limits, you may be forced + into creating a dense blob. Such are the trade offs that obfuscators face! + + We prefer code that can run on either a 64-bit or 32-bit processor. + However, it is unwise to assume it will run on an i386 or x86 architecture. + + We believe that Mark Twain's remark: + + Get your facts first, then you can distort them as you please. + + is a good guideline for those writing code for the IOCCC. + + The IOCCC size tool source, iocccsize.c, is not an original work. + Submitting an entry based on our iocccsize.c violates rule 8, + even if you write that code! + + Rule 8 does not prohibit you from writing your own obfuscated IOCCC size tool. + However if you do, you might wish to make your tool do something more + interesting than simply implementing the IOCCC size tool algorithm. + + While programs that only run in a specific word size are OK. If you have + to pick, choose a 64-bit word size. + + If we are feeling ornery we might choose to compile your program + for running on an Arduino or a PDP-11. Heck, should we ever find + an emulator of 60-bit CDC Cyber CPU running a POSIX-like OS, we + might just try your entry on that emulator as well :-) + + If your entry MUST run only in 32-bit mode on an Intel processor, add the + following compiler flag: + + -arch i386 + + to your "how to build" make compile line. For example: + + prog: prog.c + ${CC} prog.c -arch i386 -o prog + + Be even more creative! + + If there are limitations in your entry, you are highly encouraged + to note such limitations in your remarks file. For example if your + entry factors values up to a certain size, you might want to state: + + This entry factors values up 2305567963945518424753102147331756070. + Attempting to factor larger values will produce unpredictable results. + + The judges might try to factor the value -5, so you want to might state: + + This entry factors positive values up 2305567963945518424753102147331756070. + Attempting to factor large values will produce unpredictable results. + + However the judges might try to also factor 0, so you want to might state: + + This entry factors values between 1 and 2305567963945518424753102147331756070. + Attempting to factor values outside that range will produce unpredictable results. + + Moreover the try to also factor 3.5 or 0x7, or Fred, so you want to might state: + + This entry factors integers between 1 and 2305567963945518424753102147331756070. + Attempting to factor anything else will produce unpredictable results. + + You entry might be better off catching the attempt to factor bogus values + and doing something interesting. So you might want to code accordingly and state: + + This entry factors integers between 1 and 2305567963945518424753102147331756070. + Attempting to factor anything else will cause the program to insult your + pet fish Eric. + + The judges might not have a pet fish named Eric, so might want to state: + + This entry factors integers between 1 and 2305567963945518424753102147331756070. + Attempting to factor anything else will cause the program to insult your + pet fish Eric, or in the case that you lack such a pet, will insult the + pet that you do not have. + + When all other things are equal, an entry with fewer limitation will be judged + better than an entry with lots of limitations. So you might want to code accordingly + and state: + + This entry attempts to a factor value of any size provided that the program + is given enough time and memory. If the value is not a proper integer, the + program will insult a fish named Eric, even if such a fish does not exist. + + +ABUSING THE RULES: + + Legal abuse of the rules is somewhat encouraged. Legal rule abuse may + involve, but is not limited to, doing things that are technically + allowed by the rules and yet do not fit the spirit of what we intended + to be submitted. + + Legal rule abuse is encouraged to help promote creativity. Rule abuse + entries, regardless of if they receive an award, result in changes to + the next year's rules and guidelines. + + Legal abuse of the rules is NOT an invitation to violate the rules. + An entry that violates the rules in the opinion of the judges, WILL be + disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK! If you + have an entry that might otherwise be interesting, you might want to + submit two versions; one that does not abuse the rules and one that + does. + + If you intend to abuse the rules, indicate so in the program + "remarks". You must try to justify why you consider your rule abuse + to be allowed under the rules. That is, you must plead your case as + to why your entry is valid. Humor and/or creativity help plead a + case. + + Abusing the web submission procedure tends to annoy us more + than amuse us. Spend your creative energy on content of your + entry rather than on the submission process itself. + + We are often asked why the contest rules and guidelines seem too + strange or contain mistakes, flaws or grammatical errors. One reason + is that we sometimes make genuine mistakes. But in many cases such + problems, flaws or areas of confusion are deliberate. Changes to + rules and guidelines in response to rule abuses, are done in a minimal + fashion. Often we will deliberately leave behind holes (or introduce + new ones) so that future rule abuse may continue. A cleaver author + should be able to read them and "drive a truck through the holes" in + the rules and guidelines. + + At the risk of stating the obvious, this contest is a parody of the + software development process. The rules and guidelines are only a + small part of the overall contest. Even so, one may think the contest + rules and guideline process as a parody of the sometimes tragic + mismatch between what a customer (or marketing) wants and what + engineering delivers. Real programmers must face obfuscated + and sometimes conflicting specifications and requirements from marketing, + sales, product management an even from customers themselves on a + all too regular basis. This is one of the reasons why the rules and + guidelines are written in obfuscated form. + + +JUDGING PROCESS: + + Entries are judged by Leonid A. Broukhis, Simon Cooper, Landon Curt Noll. + + Each entry submitted is given a random id number and subdirectory. The + entry files including, but not limited to prog.c, Makefile (that we + form from around your "how to build" information), as well as any + data files that you submit are all placed under their own directory. + stored and judged from this directory. + + Any information about the authors is not read by the judges until + the judging process is complete, and then only from entries that have + won an award. Because we do not read this information for entries that + do not win, we do not know who did not win. + + The above process helps keep us biased for/against any one particular + individual. Therefore you MUST refrain from putting any information + that reveals your identity in your entry. + + Now some people point out that coding style might reveal the information + about the others. However we consider this to be simply circumstantial + and outside the scope of the above paragraph. + + Some people, in the past, have attempted to obfuscate their identity by + including comments of famous Internet personalities such as Peter Honeyman + (http://www.citi.umich.edu/u/honey/). The judges are on to this + trick and therefore consider any obfuscated source or data file + claiming to be from Honeyman to not be form Honeyman. This of course + creates an interesting paradox known as the "obfuscated Peter Honeyman + paradox". Should Peter Honeyman actually submit an obfuscated entry, + he alone is excluded from the above, as we will likely believe + it just another attempt at confusion. This guideline is known + as the "Peter Honeyman is exempt" guideline. + + BTW: None of the entries claiming to be from Peter Honeyman have ever + won an award. So it is theoretically possible that Peter Honeyman + did submit an entry in the past. In the past, Peter had denied + submitting anything to the IOCCC. Perhaps those entries were + submitted by one of his students? + +| Hopefully we are very CLEAR on this point! The rules now strongly state: +| PLEASE DO NOT put a name of an author, in an obvious way, into your + source code, remarks, data files, etc. The above "Peter Honeyman is + exempt" not withstanding. + + We seemed to have digressed again ... :-) Returning to the judging process: + + We prefer to be kept in the dark as much as you are until the final + awards are given. We enjoy the surprise of finding out in the end, + who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. + + During the judging process. a process that spans multiple sessions + over a few weeks, post general updates from our @IOCCC twitter account. + + Once we have selected the winners, for each category we will tweet: + + category name + name(s) of the authors (or anonymous if requested) + twitter handle(s) (if provided and if anonymity was not requested) + country code(s) of the author(s) + + After the initial announcement, we attempt to send Email to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes and typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the "how to build" information and forming a Makefile + * reading prog.c, the C source + * reviewing the "remarks" information + * briefly looking any any supplied data files + * passing the source thru the C pre-processor + skipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + skipping over any #include files + * compiling/building the source + * running the program + * Doing other things that only IOCCC judges know about :-) + + In later rounds, other actions are performed including performing + miscellaneous tests on the source and binary. + +! This is the guideline that goes, BING! + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry will often compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program (see above about one line programs) + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code (code with deceptive comments and source code) + * best X client (see OUR LIKES AND DISLIKES) + * best abuse of ISO C or ANSI C standard (see above about compilers) + * best abuse of the C preprocessor + * worst abuse of the rules + * (anything else so strange that it deserves an award) + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to to about + half that number: declaring those remaining to be winners. + + Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry is good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + + More than one IOCCC judge has been known to bribe another IOCCC judge + into voting for a winning entry by offering a bit high quality chocolate. + This technique is highly discouraged for use by non-IOCCC judges. + + More often than not, we select a small entry (usually one line), a + strange/creative layout entry. We sometimes also select an + entry that abuses the contest guidelines in an interesting way, + or that stretches the content rules that while legal, is + nevertheless goes against the intent of the rules. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entries. More often, the + 'best' is picked because it does well in a number of categories. + + In years past, we renamed the winning entry from prog.c to a + name related to the submitter(s) names. This is no longer done. + Winning source is called prog.c A compiled binary is called prog. + + +ANNOUNCEMENT OF WINNERS: + + The judges will tweet initial announcement of who won, the name + of their award, and a very brief description of the winning entry + from the @IOCCC twitter handle. Non-twitter users should visit: + + https://twitter.com/ioccc + + Non-twitter users should force their browsers to reload the above URL + to be sure they are seeing the most recent tweets. + + The judges will then post an initial announcement of who won, the name + of their award, and a very brief description of the winning entry + on the IOCCC web site: + + http://www.ioccc.org/whowon.html + + We will also attempt to submit a brief announcement story to /.: + + http://slashdot.org + + that, depending on the willingness of the /. editors, may be posted + to their site at the same time. + + Note that initial announcement will NOT contain source. This is because + the winning authors are given a chance to review the judges comments, + and test our Makefile. This review process typically takes a few weeks. + + Sometime after the initial announcement, and once the the review + by the winners has been completed, the winning source will be + posted to the IOCCC web site: + + http://www.ioccc.org/years.html + + NOTE: previous winners are available at that URL + + We will also tweet, via @IOCCC, when the winning source is available. + + It is pointless to ask the IOCCC judges how many entries we receive. + Other government TLA or FLA snooping organizations are prohibited from + either confirming, denying or revealing any knowledge of this data point. + + Often, winning entries are published in selected magazines from around + the world. Winners have appeared in books ("The New Hackers Dictionary") + and on T-Shirts. More than one winner has been turned in a tattoo! + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending Email to the following address: + +| q.2019@ioccc.org (do not submit entries to this address) + +| You must include the words 'ioccc 2019 question' in the subject of your + Email message when sending Email to the judges. + + Questions and comments about the contest are welcome. Comments about + confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. + + Check out the IOCCC Web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + For the updates and breaking IOCCC news, you are encouraged to follow + the twitter handle: + + @IOCCC + + You do not have to be a twitter user to follow @IOCCC. Non-twitter + users should access: + + https://twitter.com/ioccc + + Non-twitter users should force their browsers to reload the above URL + to be sure they are seeing the most recent tweets. + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ diff --git a/2019/hint.css b/2019/hint.css new file mode 100644 index 000000000..d05503f93 --- /dev/null +++ b/2019/hint.css @@ -0,0 +1,77 @@ +* { + font-family: Helvetica Neue, Helvetica, Arial, sans-serif; +} +body { + max-width: 50em; + margin: 0 auto; + color: #111; +} + +pre, code { + font-family: Monaco, Courier New, monospace; + font-size: 12px; +} + +h1 { + font-size: 40px; + font-weight: bold; + letter-spacing: -1px; + margin-bottom: -5px; +} +h1 code { + font-size: 40px; +} + +h2 { + color: rgb(43,105,145); + font-weight: bold; + margin-bottom: -5px; +} +h2 code { + font-size: 22px; +} + +h3 { + /* color: rgb(43,105,145); */ + font-weight: bold; + margin-bottom: -5px; +} +h3 code { + font-size: 16px; +} + +a { + color: blue; + text-decoration: underline; +} +a:visited { + color: navy; +} +a:hover { + text-decoration: underline; +} + +pre { + border-radius: 10px; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + border-width: 1px; + border-color: rgb(16,48,0); + border-style: solid; + padding: 0.6em; + padding-left: 1em; + margin-left: 5%; + margin-right: 8%; + overflow: auto; + color: rgb(194,0,194); + background-color: rgb(40,0,40); +} + +p, li { + font-size: 14px; + line-height: 18px; +} + diff --git a/2019/iocccsize.c b/2019/iocccsize.c new file mode 100644 index 000000000..0327eacc2 --- /dev/null +++ b/2019/iocccsize.c @@ -0,0 +1,620 @@ +/* + * iocccsize - IOCCC Source Size Tool + * + * This IOCCC size tool source file is version 2018-12-25-v26. + * + * "You are not expected to understand this" :-) + * + * Public Domain 1992, 2015 by Anthony Howe. All rights released. + * With IOCCC minor mods in 2013-2017 by chongo (Landon Curt Noll) ^oo^ + * + * SYNOPSIS + * + * ioccc [-kirs] < input + * + * -k keep comment blocks + * -i IOCCC size rule (overall size, modified) + * -r count C reserved words as 1 byte + * -s suppress source output, write only the IOCCC 2nd size count + * + * DESCRIPTION + * + * Taking input from standard input, apply the IOCCC Source Size Rule + * for 2001. The program's official length is written to standard error. + * Also filter out C comment blocks (-k to keep) sending the modified + * source to standard output. + * + * The 2001 Source Size Rule was: + * + * Your entry must be <= 4096 bytes in length. The number of octets + * excluding whitespace (tab, space, newline, form-feed, return), and + * excluding any ';', '{' or '}' followed by whitespace or end of file, + * must be <= 2048. + * + * 2013 Source Size Rule is (-r): + * + * Your entry must be <= 4096 bytes in length. The number of octets + * excluding whitespace (tab, space, newline, form-feed, return), and + * excluding any ';', '{' or '}' followed by whitespace or end of file, + * and where C reserved words, including a subset of preprocessor words, + * count as 1 byte, must be <= 2053 (first prime after 2048). + */ + +/* + * The official IOCCC rule 2 secondary limit on C code size + * + * The IOCCC size tool should be compiled as: + * + * cc -pedantic -Wall -std=c11 iocccsize.c -o iocccsize + * + * This tool computes a 2nd size C code. To check your program source + * against the 2nd limit of rule 2, use the -i command line option. + * + * For example: + * + * ./iocccsize -i < prog.c + * + * The IOCCC size tool, when using the -i option, may be summarized as: + * + * The size tool counts C language keywords (primary, secondary, and + * selected preprocessor keywords) as 1. The size tool counts all + * other octets as 1 excluding ASCII whitespace, and excluding any + * ';', '{' or '}' followed by ASCII whitespace, and excluding any + * ';', '{' or '}' octet immediately before the end of file. + * + * ASCII whitespace includes ASCII tab, ASCII space, ASCII newline, + * ASCII form-feed, and ASCII carriage return. + * + * In cases where the above summary and the algorithm implemented by + * the IOCCC size tool source code conflict, the algorithm implemented + * by the IOCCC size tool source code is preferred by the judges. + * + * See the current IOCCC rules and guidelines for more information. + * In particular, see the current IOCCC size rule for information about + * the maximum value that this tool should print for an entry to be valid. + */ + +/* + * IOCCC Judge's remarks: + * + * This code contains undocumented features. On the other hand, this code + * is RTFS (for certain values of RTFS). One might say that this code + * perfectly documents itself. :-) + * + * Many thanks to Anthony Howe for taking the time to put his OCD + * (Obfuscated Coding Determination) into this code! + */ + +/* + * HINT: The algorithm implemented by this code may or not be obfuscated. + * The algorithm may not or may appear to be obfuscated. + * + * In particular: + * + * We did not invent the algorithm. + * The algorithm consistently finds Obfuscation. + * The algorithm killed Obfuscation. + * The algorithm is banned in C. + * The algorithm is from Bell Labs in Jersey. + * The algorithm constantly finds Obfuscation. + * This is not the algorithm. + * This is close. + */ + +#include +#include +#include +#include +#include + +#define FLAG_SILENCE 1 +#define FLAG_KEEP 2 +#define FLAG_RESERVED 4 +#define FLAG_IOCCC 8 +#define FLAG_SILLY_C 16 +#define FLAG_SILLY_H 32 + +#define BUFFER_SIZE 521 +#define MAX_SIZE 4096 /* IOCCC Rule 2 */ +#define MAX_COUNT 2053 /* IOCCC Rule 2 */ + +static char usage[] = +"usage: ioccc [-kirsch] < prog.c\n" +"\n" +"-k\t\tkeep block comments\n" +"-i\t\tprint official secondary IOCCC size to stdout\n" +"\t\tmax.size warnings to stderr, NOTE: implies -r -s\n" +"-r\t\tcount C reserved words as 1 byte\n" +"-s\t\tsuppress source output, write only the official size\n" +"-c\t\tan undocumented feature\n" +"-h\t\tyet another undocumented feature\n" +; + +#define STRLEN(s) (sizeof (s)-1) + +typedef struct { + size_t length; + const char *word; +} Word; + +/* + * C reserved words, plus a few #preprocessor tokens, that count as 1 + * + * NOTE: For a good list of reserved words in C, see: + * + * http://www.bezem.de/pdf/ReservedWordsInC.pdf + * + * by Johan Bezem of JB Enterprises: + * + * See http://www.bezem.de/en/ + */ +/* + * The following editorial plea expresses a view shared by more than zero + * IOCCC judges. It may not represent the opinion of all those involved + * with this code nor the International Obfuscated C Code Contest as a whole: + * + * The long list of reserved words below should be a source + * of embarrassment to some of those involved in standardizing C. + * The growing list of reserved words, along with an expanding set of + * linguistic inventions has the appearance of feature + * creep that, if left unchecked, risks turning a beautifully elegant + * language into a steaming pile of biological excretion. + * + * The history of the IOCCC has taught us that even minor changes + * to the language are not always well understood by compiler writers, + * let alone the standards body who publishes them. We have enormous + * sympathy for C compiler writers who must keep up with the creeping + * featurism. We are aware of some C standards members who share + * these concerns. Alas, they seem to be a minority. + * + * The C standards body as a whole, before they emit yet more mountains of new + * standardese, might wish consider the option of moth-balling their committee. + * Or if they must produce a new standard, consider naming whatever + * follows c11 as CNC (C's Not C). :-) + */ +static Word cwords[] = { + /* Yes Virginia, we left #define off the list on purpose! */ + { STRLEN("#elif"), "#elif" }, + { STRLEN("#else"), "#else" }, + { STRLEN("#endif"), "#endif" }, + { STRLEN("#error"), "#error" }, + { STRLEN("#ident"), "#ident" }, + { STRLEN("#if"), "#if" }, + { STRLEN("#ifdef"), "#ifdef" }, + { STRLEN("#include"), "#include" }, + { STRLEN("#line"), "#line" }, + { STRLEN("#pragma"), "#pragma" }, + { STRLEN("#sccs"), "#sccs" }, + { STRLEN("#warning"), "#warning" }, + /**/ + { STRLEN("_Alignas"), "_Alignas" }, + { STRLEN("_Alignof"), "_Alignof" }, + { STRLEN("_Atomic"), "_Atomic" }, + { STRLEN("_Bool"), "_Bool" }, + { STRLEN("_Complex"), "_Complex" }, + { STRLEN("_Generic"), "_Generic" }, + { STRLEN("_Imaginary"), "_Imaginary" }, + { STRLEN("_Noreturn"), "_Noreturn" }, + { STRLEN("_Pragma"), "_Pragma" }, + { STRLEN("_Static_assert"), "_Static_assert" }, + { STRLEN("_Thread_local"), "_Thread_local" }, + /* + * this comment is not expected to understand itself + */ + { STRLEN("alignas"), "alignas" }, + { STRLEN("alignof"), "alignof" }, + { STRLEN("and"), "and" }, + { STRLEN("and_eq"), "and_eq" }, + { STRLEN("auto"), "auto" }, + { STRLEN("bitand"), "bitand" }, + { STRLEN("bitor"), "bitor" }, + { STRLEN("bool"), "bool" }, + { STRLEN("break"), "break" }, + { STRLEN("case"), "case" }, + { STRLEN("char"), "char" }, + { STRLEN("compl"), "compl" }, + { STRLEN("const"), "const" }, + { STRLEN("continue"), "continue" }, + { STRLEN("default"), "default" }, + { STRLEN("do"), "do" }, + { STRLEN("double"), "double" }, + { STRLEN("else"), "else" }, + { STRLEN("enum"), "enum" }, + { STRLEN("extern"), "extern" }, + { STRLEN("false"), "false" }, + { STRLEN("float"), "float" }, + { STRLEN("for"), "for" }, + { STRLEN("goto"), "goto" }, + { STRLEN("I"), "I" }, + { STRLEN("if"), "if" }, + { STRLEN("inline"), "inline" }, + { STRLEN("int"), "int" }, + { STRLEN("long"), "long" }, + { STRLEN("noreturn"), "noreturn" }, + { STRLEN("not"), "not" }, + { STRLEN("not_eq"), "not_eq" }, + { STRLEN("or"), "or" }, + { STRLEN("or_eq"), "or_eq" }, + { STRLEN("register"), "register" }, + { STRLEN("restrict"), "restrict" }, + { STRLEN("return"), "return" }, + { STRLEN("short"), "short" }, + { STRLEN("signed"), "signed" }, + { STRLEN("sizeof"), "sizeof" }, + { STRLEN("static"), "static" }, + { STRLEN("static_assert"), "static_assert" }, + { STRLEN("struct"), "struct" }, + { STRLEN("switch"), "switch" }, + { STRLEN("thread_local"), "thread_local" }, + { STRLEN("true"), "true" }, + { STRLEN("typedef"), "typedef" }, + { STRLEN("union"), "union" }, + { STRLEN("unsigned"), "unsigned" }, + { STRLEN("void"), "void" }, + { STRLEN("volatile"), "volatile" }, + { STRLEN("while"), "while" }, + { STRLEN("xor"), "xor" }, + { STRLEN("xor_eq"), "xor_eq" }, + /**/ + { 0, NULL } +}; + +/* + * Keep track of discarded bytes by read_line() so count() can report + * correct wc(1) equivalent counts. + */ +static int xlcount = 0; +static int xwcount = 0; +static int xbcount = 0; + +static Word * +find_member(Word *table, const char *string) +{ + Word *w; + for (w = table; w->length != 0; w++) { + if (strncmp(string, w->word, w->length) == 0 + && !isalnum(string[w->length]) && string[w->length] != '_') + return w; + } + return NULL; +} + +/* + * ISO C11 section 5.2.1.1 Trigraph Sequences, leading sequence "??" + */ +static char trigraph[] = "=(/)'-"; +static char asciimap[] = "#[\\]^{|}~"; + +static size_t +read_line(char *buf, size_t size) +{ + int ch; + size_t length; + + if (buf == NULL || size == 0) + return 0; + + for (size--, length = 0; length < size; ) { + if ((ch = fgetc(stdin)) == EOF) + break; + /* Map NUL bytes to space, though ideally I should chuck'em. */ + if (ch == '\0') + ch = ' '; + /* Discard bare CR and those part of CRLF. */ + if (ch == '\r') { + xbcount++; + continue; + } + /* Trigraph mapping? */ + if (2 <= length && buf[length-2] == '?' && buf[length-1] == '?') { + char *tri; + if ((tri = strchr(trigraph, ch)) != NULL) { + /* Mapped trigraphs count as 1 byte. */ + ch = asciimap[tri - trigraph]; + xbcount += 2; + length -= 2; + } + } + if (ch == '\n' && 1 <= length && buf[length-1] == '\\') { + /* ISO C11 section 5.1.1.2 Translation Phases + * point 2 discards backslash newlines. + */ + xbcount += 2; + xwcount++; + xlcount++; + length--; + continue; + } + buf[length++] = (char) ch; + if (ch == '\n') { + break; + } + } + + buf[length] = '\0'; + + return length; +} + +/* + * Count octets and strip comments. The stripped C input is sent to + * standard output. If -s is set, then suppress the source output. + * The various counters are sent to standard error. + * + * The counter output format is: + * + * lcount wcount bcount icount isaved rcount rsaved + * + * where + * lcount line count (same as wc) + * wcount word count (same as wc) + * bcount byte count (same as wc) + * icount IOCCC secondary size rule count + * + * No longer reported: + * isaved bytes saved by secondary size rule (bcount - icount) + * rcount number of C reserved words + * rsaved number of octets saved with -r + */ +static int +count(int flags) +{ + Word *w; + unsigned long span; + char *p, buf[BUFFER_SIZE]; + int lcount, wcount, bcount; + int is_comment, is_word, dquote, escape; + int count, keywords, saved, kw_saved; + + /* Start of buffer sentinel. */ + buf[0] = ' '; + buf[BUFFER_SIZE - 1] = 0; /* paranoia */ + + count = saved = 0; + keywords = kw_saved = 0; + lcount = wcount = bcount = 0; + is_comment = is_word = dquote = escape = 0; + + /* + * "no matter how well you may think you understand this code, + * you don't, so don't mess with it." :-) + */ + while (0 < read_line(buf+1, sizeof (buf)-1)) { + if (!(flags & FLAG_KEEP)) { + /* Leading whitespace before comment block? */ + span = strspn(buf+1, "\t "); + + /* Split / * across reads? */ + if (buf[1 + span] == '/' && buf[2 + span] == '\0') { + (void) ungetc('/', stdin); + continue; + } + + /* + * no comment is a comment + */ + if (buf[1 + span] == '/' && buf[2 + span] == '/') { + continue; + } + + if (buf[1 + span] == '/' && buf[2 + span] == '*') { + /* Strip leading whitespace before comment block. */ + is_comment = 1; + } + } + + for (p = buf+1; *p != '\0'; p++) { + /* Within quoted string? */ + if (dquote) { + /* Escape _this_ character. */ + if (escape) { + escape = 0; + } + + /* Escape next character. */ + else if (*p == '\\') { + escape = 1; + } + + /* Close quoted string? */ + else if (*p == '"') { + dquote = 0; + } + } + + /* Not quote string. */ + else { + /* In C comment block? */ + if (is_comment) { + /* Split * / across reads? */ + if (*p == '*' && p[1] == '\0') { + ungetc('*', stdin); + break; + } + + /* End of comment block? */ + if (*p == '*' && p[1] == '/') { + is_comment = 0; + + if (!(flags & FLAG_KEEP)) { + /* Strip whitespace and newline + * trailing closing comment. + */ + p += 1 + strspn(p+2, " \t\r\n"); + } + } + + if (!(flags & FLAG_KEEP)) { + /* Strip octets in comment block. */ + continue; + } + } + + /* Split / / or / * across reads? */ + else if (*p == '/' && p[1] == '\0') { + ungetc('/', stdin); + break; + } + + /* Start of comment line? */ + else if (*p == '/' && p[1] == '/') { + if (!(flags & FLAG_KEEP)) { + /* Strip comment to end of buffer. */ + break; + } + } + + /* Start of comment block? */ + else if (*p == '/' && p[1] == '*') { + /* Begin comment block. */ + is_comment = 1; + + if (!(flags & FLAG_KEEP)) { + /* Strip comment block. */ + p++; + continue; + } + } + + /* C reserved word? */ + else if (!isalnum(p[-1]) && p[-1] != '_' + && (w = find_member(cwords, p)) != NULL) { + keywords++; + if (flags & FLAG_RESERVED) { + bcount += w->length; + if (!is_word) { + is_word = 1; + wcount++; + } + + if (!(flags & FLAG_SILENCE)) { + fputs(w->word, stdout); + } + + /* Count reserved word as one. */ + kw_saved += w->length - 1; + p += w->length - 1; + count++; + continue; + } + } + + /* Open quoted string? */ + else if (*p == '"') { + dquote = 1; + } + } + + if (!(flags & FLAG_SILENCE)) { + fputc(*p, stdout); + } + + bcount++; + if (*p == '\n') { + lcount++; + } + + /* Ignore all whitespace. + * + * Well not ALL in the Universe, just all here. + */ + if (isspace(*p)) { + is_word = 0; + saved++; + continue; + } else if (!is_word) { + is_word = 1; + wcount++; + } + + /* Ignore curly braces and semicolons when followed + * by any whitespace or EOF. + */ + if (strchr("{;}", *p) != NULL && (isspace(p[1]) || p[1] == '\0')) { + saved++; + continue; + } + + /* Count this octet. */ + count++; + } + } + + if (flags & FLAG_IOCCC) { + /* Output the official IOCCC size tool size to standard out */ + printf("%d\n", count); + if (MAX_SIZE < bcount) { + fprintf(stderr, "WARNING: program size (%d) exceeds IOCCC Rule 2a max. size (%d)\n", bcount, MAX_SIZE); + } + if (MAX_COUNT < count) { + fprintf(stderr, "WARNING: iocccsize count (%d) exceeds IOCCC Rule 2b max. count (%d)\n", count, MAX_COUNT); + } + } else { + /* The Ugly Truth */ + fprintf( + stderr, "%d %d %d %d %d %d %d\n", + lcount + xlcount, wcount + xwcount, bcount + xbcount, count, + saved, keywords, kw_saved + ); + } + + return count; +} + +int +main(int argc, char **argv) +{ + int ch; + int flags = 0; + + while ((ch = getopt(argc, argv, "kirsch")) != -1) { + switch (ch) { + case 'k': + flags |= FLAG_KEEP; + break; + case 'i': + flags |= FLAG_IOCCC | FLAG_RESERVED | FLAG_SILENCE; + break; + case 'r': + flags |= FLAG_RESERVED; + break; + case 's': + flags |= FLAG_SILENCE; + break; + case 'c': + flags |= FLAG_SILLY_C; + break; + case 'h': + flags |= FLAG_SILLY_H; + break; + default: + fprintf(stderr, "%s\n", usage); + return 2; + } + } + // make test hack: while for do until goto if else switch case default continue return break + if (flags == (FLAG_KEEP | FLAG_IOCCC | FLAG_RESERVED | FLAG_SILENCE | FLAG_SILLY_C | FLAG_SILLY_H)) { + fprintf(stderr, "The source toasts you a glass to your health!\n" + "BTW: judges have toasted a glass of this at the South Pole.\n" + "Now try using useful flags.\n\n" + "%s\n", usage); + return 3; + } else if (flags & FLAG_SILLY_C) { + fprintf(stderr, "Do you not see this is C?\n\n" + "%s\n", usage); + return 4; + } else if (flags & FLAG_SILLY_H) { + fprintf(stderr, "%s\n", usage); + return 5; + } + + /* + * count as directed - 1 Muha .. 2 Muhaha .. 3 Muhahaha ... + */ + (void) count(flags); + + /* + * All Done!!! All Done!!! -- Jessica Noll, age 2 + */ + return 0; +} diff --git a/2019/iocccsize.mk b/2019/iocccsize.mk new file mode 100644 index 000000000..d58e76b0d --- /dev/null +++ b/2019/iocccsize.mk @@ -0,0 +1,71 @@ +.POSIX : + +####################################################################### + +CFLAGS := -pedantic -Wall -Wextra -std=c11 -g +LDFLAGS := +LIBS := +IT := iocccsize + +####################################################################### + +all: ${IT}$E + +${IT}$E: ${IT}.c + ${CC} ${CFLAGS} -o ${IT}$E ${IT}.c + +# +# Exercise the IOCCC size tool. +# +test: test-k test-wc test-rcount + +# +# -k should pass through the source with block comments intact. +# +test-k: ${IT}$E + @{ t="-k keep comments" ;\ + if ./${IT} -k <${IT}.c 2>/dev/null | diff - ${IT}.c ; then echo "-OK- $$t" ; else echo "FAIL $$t" ; fi ;\ + } + +# +# First 3 counters should match wc(1) +# +test-wc: ${IT}$E + @{ t="wc counts" ;\ + a=$$(./${IT} -s -k <${IT}.c 2>&1 | cut -d' ' -f1-3) ;\ + b=$$(wc ${IT}.c | sed -e's/^ *//; s/ */ /g' | cut -d' ' -f1-3) ;\ + if [ "$$a" = "$$b" ]; then echo "-OK- $$t"; else echo "FAIL $$t: expected '$$b', got '$$a'"; fi ;\ + } + +# +# Show counters for different option combinations. +# +test-show: ${IT}$E + ./${IT} -s <${IT}.c + ./${IT} -s -r <${IT}.c + ./${IT} -s -k <${IT}.c + ./${IT} -s -r -k <${IT}.c + +# +# Reserved word counter should be same for all option combinations. +# +test-rcount: ${IT}$E + @{ t="rcount" ;\ + ./${IT} -s <${IT}.c 2>&1 | cut -d" " -f 6 >/tmp/$$$$.tmp ;\ + ./${IT} -s -r <${IT}.c 2>&1 | cut -d" " -f 6 >>/tmp/$$$$.tmp ;\ + ./${IT} -s -k <${IT}.c 2>&1 | cut -d" " -f 6 >>/tmp/$$$$.tmp ;\ + ./${IT} -s -r -k <${IT}.c 2>&1 | cut -d" " -f 6 >>/tmp/$$$$.tmp ;\ + n=$$(sort -u /tmp/$$$$.tmp | wc -l | sed -e's/^ *//') ;\ + if [ $$n -eq 1 ]; then echo "-OK- $$t"; else echo "FAIL $$t: expected 1 unique line, got $$n"; echo "see make test-show"; fi ;\ + rm -f /tmp/$$$$.tmp ;\ + } + +clean: + rm -f iocccsize.o + rm -rf iocccsize.dSYM + +clobber: clean + rm -f iocccsize + +install: + @echo "no thank you on the install :-)" diff --git a/2019/karns/Makefile b/2019/karns/Makefile new file mode 100644 index 000000000..299e42bdf --- /dev/null +++ b/2019/karns/Makefile @@ -0,0 +1,528 @@ +#!/usr/bin/env make +# +# 2019 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + +############################# +# shell used by this Makefile +############################# +# +SHELL= /bin/bash + +####################### +# common tool locations +####################### +# +A2P= a2p +AR= ar +ASA= asa +AT= at +ATQ= atq +ATRM= atrm +AWK= awk +BANNER= banner +BASE64= base64 +BASENAME= basename +BATCH= batch +BC= bc +BINHEX= binhex +BISON= bison +BUNZIP2= bunzip2 +BZCAT= bzcat +BZCMP= bzcmp +BZDIFF= bzdiff +BZEGREP= bzegrep +BZFGREP= bzfgrep +BZGREP= bzgrep +BZIP2= bzip2 +BZLESS= bzless +BZMORE= bzmore +C2PH= c2ph +C89= c89 +C99= c99 +CAL= cal +CALC= calc +CAT= cat +CD= cd +CHFLAGS= chflags +CHGRP= chgrp +CHMOD= chmod +CKSUM= cksum +CLANG= clang +CLANG_PLUSPLUS= clang++ +CLEAR= clear +CMP= cmp +COL= col +COLLDEF= colldef +COLRM= colrm +COLUMN= column +COMPRESS= compress +CP= cp +CPIO= cpio +CPP= cpp +CRC32= crc32 +CSH= csh +CSPLIT= csplit +CURL= curl +CUT= cut +C_PLUSPLUS= c++ +C_PLUSPLUS_FILT= c++filt +DATE= date +DC= dc +DD= dd +DF= df +DIFF3= diff3 +DIFF= diff +DIG= dig +DIRNAME= dirname +ED= ed +EGREP= egrep +ENV= env +EQN= eqn +ETAGS= etags +EXPECT= expect +EXPR= expr +FALSE= false +FGREP= fgrep +FILE= file +FIND2PERL= find2perl +FIND= find +FLEX= flex +FLEX_PLUSPLUS= flex++ +FMT= fmt +FOLD= fold +FS_USAGE= fs_usage +FUNZIP= funzip +FUSER= fuser +GCC= gcc +GDIFFMK= gdiffmk +GENCAT= gencat +GENSTRINGS= genstrings +GETOPT= getopt +GETOPTS= getopts +GNUMAKE= gnumake +GREP= grep +GROFF= groff +GROFFER= groffer +GROG= grog +GROPS= grops +GROTTY= grotty +GUNZIP= gunzip +GVIM= gvim +GZCAT= gzcat +GZEXE= gzexe +GZIP_PROG= gzip +G_PLUSPLUS= g++ +H2PH= h2ph +H2XS= h2xs +HASH= hash +HEAD= head +HOSTNAME_PROG= hostname +ICONV= iconv +ID= id +INDENT= indent +INFO= info +JOT= jot +KILL= kill +KSH= ksh +LAST= last +LD= ld +LESSECHO= lessecho +LEX= len +LINK= link +LN= ln +LS= ls +M4= m4 +MAKE= make +MAN= man +MKDIR= mkdir +MKFIFo= mkfifo +MKTEMP= mktemp +MV= mv +NANO= nano +NASM= nasm +NEQN= neqn +NICE= nice +NL= nl +NM= nm +NOHUP= nohup +NROFF= nroff +NSLOOKUP= nslookup +OD= od +OPENSSL= openssl +PASTE= paste +PATCH= patch +PATHCHK= pathchk +PAX= pax +PERL= perl +PICO= pico +PR= pr +PRINTENV= printenv +PS= ps +PTAR= ptar +PTARDIFF= ptardiff +PTARGREP= ptargrep +PWD= pwd +PYDOC= pydoc +PYTHON= python +PYTHONW= pythonw +READLINK= readlink +RENICE= renice +RESET= reset +REV= rev +RI= ri +RM= rm +RMDIR= rmdir +RSYNC= rsync +RUBY= ruby +RVIM= rvim +SAY= say +SCP= scp +SCREEN= screen +SCRIPT= script +SDIFF= sdiff +SED= sed +SEQ= seq +SFTP= sftp +SH= sh +SHA1= sha1 +SHA= sha +SHAR= shar +SHASUM5_18= shasum5.18 +SHASUM= shasum +SIZE= size +SLEEP= sleep +SORT= sort +SSH= ssh +STAT= stat +STRIP= strip +STTY= stty +SUM= sum +SYNC= sync +TABS= tabs +TAIL= tail +TAR= tar +TEE= tee +TEST= test +TFTP= tftp +TIDY= tidy +TIME= time +TOP= top +TOUCH= touch +TPUT= tout +TPUT= tput +TR= tr +TROFF= troff +TRUE= true +TSET= tset +TSORT= tsort +UL= ul +UNAME= uname +UNCOMPRESS= uncompress +UNEXPAND= unexpand +UNIFDEF= unifdef +UNIFDEFALL= unifdefall +UNIQ= uniq +UNITS= units +UNLINK= unlink +UNZIP= unzip +UNZIPSFX= unzipsfx +UPTIME= uptime +UUDECODE= uudecode +UUENCODE= uuencode +UUIDGEN= uuidgen +VI= vi +VIEW= view +VIM= vim +VIMDIFF= vimdiff +W= w +WAIT4PATH= wait4path +WAIT= wait +WC= wc +WHAT= what +WHATIS= whatis +WHICH= which +WHO= who +WHOAMI= whoami +WHOIS= whois +WRTIE= write +XAR= xar +XARGS= xargs +XATTR= xattr +XXD= xxd +YACC= yacc +YES= yes +ZCAT= zcat +ZCMP= zcmp +ZDIFF= zdiff +ZEGREP= zegrep +ZFGREP= zfgrep +ZFORCE= zforce +ZGREP= zgrep +ZIP= zip +ZIPCLOAK= zipcloak +ZIPGREp= zipgrep +ZIPINFo= zipinfo +ZIPNOTE= zipnote +ZIPSPLIT= zipsplit +ZLESS= zless +ZMORE= zmore +ZNEW= znew +ZPRINT= zprint +ZSH= zsh + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +#CSILENCE= -Wno-implicit-int +CSILENCE=-Wno-implicit-function-declaration -Wno-implicit-int -Wno-incompatible-function-pointer-types -Wno-logical-op-parentheses -Wno-sign-compare -Wno-unused-label -Wno-unused-variable + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=26 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= prog.orig.o +ALT_TARGET= prog.orig + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +test: prog + ${CAT} prog.c | ./prog + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic fc6b6af226b7cc598de3d48fc20ed0bd54f7b4f7f0f651a32b9cf8345b2a3b3f --FNV1a_hash_512_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --level 391581 --mode 216193 --FNV1a_hash_512_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore IAU, $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore, $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2019/karns/hint.html b/2019/karns/hint.html new file mode 100644 index 000000000..9adfd15c6 --- /dev/null +++ b/2019/karns/hint.html @@ -0,0 +1,113 @@ + + + + + + Most in need of whitespace + + +

    Most in need of whitespace

    + +

    Joshua Karns
    +Twitter: @jkarnss

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./prog < textfile_that_fits_on_the_screen
    +
    + +

    Try:

    + +
    make test
    +
    +./prog < hint.text
    +
    + +

    Selected Judges Remarks:

    + +

    If you typically get lost in mazes, watching this program run might – or might not, YMMV – +teach you how to find your way in a maze. The algorithm is well-known but the drawing is amazing!

    + +

    Before running, make sure that your terminal can accommodate the whole file. Before running “make test”, +make it about 120x40 to be safe, ensuring that you see the @ sign as well as the exclamation mark.

    + +

    …Oh, and the first M in YMMV stands for “mazing”.

    + +

    A puzzle for the reader: Can you change the program to consider a diagonal movement as one step?

    + +

    Author’s comments:

    + +

    The Program

    + +

    This program is pretty simple! It performs a breadth first search on the +specified graph. The graph can be any ascii text file that has an ‘at’ +character, which is going to be the starting location, and a ‘!’ character +which will be the destination.

    + +

    The nodes on this graph that are spaces are connected with any directly +adjacent nodes that are also spaces. Nodes that aren’t spaces are not +connected with anything.

    + +

    Compiling and Running

    + +

    This program usually compiles under both GCC and clang. Build with:

    + +
    $(CC) -std=c99 -o tbfs prog.c
    +
    + +

    where $(CC) is cc, gcc, clang, or somet other c compiler.

    + +

    You can then run it with: + cat | ./tbfs

    + +

    Examples: + ./tbfs < maze + ./tbfs < prog.c

    + +

    Issues

    + +
      +
    • The program must be ran in a terminal that supports ANSI escape codes for +moving the cursor and changing colors.
    • +
    • Segfaults happen sometimes.
    • +
    • I don’t know what memergy management there is, if any.
    • +
    • Ths program will not compile by an ANSI C compiler: it uses for loops, and +it uses C++ style comments. It should compile cleanly using a C99 standard.
    • +
    • Breadth first search is slow (and very slow on certain maps), but my A star +version of this program is too big.
    • +
    • Lots of extra whitespace may be needed if you want to feed in an arbitrary +file.
    • +
    • It fails to compile on GCC sometimes (according to a friend of mine, I’ve +not encountered this myself).
    • +
    • The program could be obfuscated much further.
    • +
    • The program contains some unused code and data.
    • +
    + + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2019, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2019/karns/hint.text b/2019/karns/hint.text new file mode 100644 index 000000000..d9d65c3ed --- /dev/null +++ b/2019/karns/hint.text @@ -0,0 +1,87 @@ +# Most in need of whitespace + +Joshua Karns +Twitter: @jkarnss + + +## Judges' comments: +### To use: + + make + + ./prog < textfile_that_fits_on_the_screen + +### Try: + + make test + + ./prog < hint.text + +### Selected Judges Remarks: + +If you typically get lost in mazes, watching this program run might -- or might not, YMMV -- +teach you how to find your way in a maze. The algorithm is well-known but the drawing is amazing! + +Before running, make sure that your terminal can accommodate the whole file. Before running "make test", +make it about 120x40 to be safe, ensuring that you see the @ sign as well as the exclamation mark. + +...Oh, and the first M in YMMV stands for "mazing". + +A puzzle for the reader: Can you change the program to consider a diagonal movement as one step? + +## Author's comments: +The Program +----------- + +This program is pretty simple! It performs a breadth first search on the +specified graph. The graph can be any ascii text file that has an 'at' +character, which is going to be the starting location, and a '!' character +which will be the destination. + +The nodes on this graph that are spaces are connected with any directly +adjacent nodes that are also spaces. Nodes that aren't spaces are not +connected with anything. + + +Compiling and Running +--------------------- + +This program usually compiles under both GCC and clang. Build with: + + $(CC) -std=c99 -o tbfs prog.c + +where $(CC) is cc, gcc, clang, or somet other c compiler. + +You can then run it with: + cat | ./tbfs + +Examples: + ./tbfs < maze + ./tbfs < prog.c + +Issues +----------- + +- The program must be ran in a terminal that supports ANSI escape codes for +moving the cursor and changing colors. +- Segfaults happen sometimes. +- I don't know what memergy management there is, if any. +- Ths program will not compile by an ANSI C compiler: it uses for loops, and +it uses C++ style comments. It should compile cleanly using a C99 standard. +- Breadth first search is slow (and very slow on certain maps), but my A star +version of this program is too big. +- Lots of extra whitespace may be needed if you want to feed in an arbitrary +file. +- It fails to compile on GCC sometimes (according to a friend of mine, I've +not encountered this myself). +- The program could be obfuscated much further. +- The program contains some unused code and data. + +-------------------------------------------------------------------------------- + diff --git a/2019/karns/maze b/2019/karns/maze new file mode 100644 index 000000000..56e30a406 --- /dev/null +++ b/2019/karns/maze @@ -0,0 +1,25 @@ ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +| @ | | | ++ +---+---+---+---+ + +---+---+---+ +---+---+---+---+---+---+---+ +---+---+ +---+---+ +| | | | | | | | | | | | ++ +---+ + + +---+---+ +---+ +---+---+---+ + + + + +---+ + +---+ + + +| | | | | | | | | | | | | | ++---+ +---+---+---+ + +---+ +---+---+---+ +---+---+---+ + + +---+ + +---+ + +| | | | | | | | | | | | | | | ++ +---+ + + +---+---+ + + + +---+ + +---+ +---+ +---+ + + + +---+ +| | | | | | | | | | | | | | | | ++ + +---+ +---+ + + +---+ +---+ +---+---+ + + +---+---+---+ + +---+ + +| | | | | | | | | | | | | | | ++ + +---+---+ + + +---+---+---+ +---+ + +---+---+ + + + +---+ + + + +| | | | | | | | | | | | | | | | ++ + + + + +---+---+---+ + +---+ +---+---+---+---+ + + +---+ +---+ + + +| | | | | | | | | | | | ++ +---+ +---+---+ + +---+---+---+ +---+---+---+---+ +---+ +---+ + + +---+ + +| | | | | | | | | | | | | | ++ + +---+---+---+---+ + + +---+---+ + + + + + +---+ +---+---+---+ + + +| | | | | | | | | | | | | | ++---+---+---+---+ + +---+---+ + +---+---+---+---+ +---+---+---+ + + +---+ +---+ +| | | | | | | | | | | | | ++ + + +---+---+---+ + +---+ + + + +---+---+ +---+ + + +---+ +---+ + +| | | | | | | ! | ++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ diff --git a/2019/karns/prog.c b/2019/karns/prog.c new file mode 100644 index 000000000..a7050e21c --- /dev/null +++ b/2019/karns/prog.c @@ -0,0 +1,34 @@ +#include +#include +#include +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//@ // +char _int[]={37,99,0,10,0,71,111, 111,100,98,121,101,32,58,45,41,10,0,27,91, 72, +27, 91,74,0,27,91,37,100,59,37, 100,72,0,27,91,37,100,109,0,0,0,-30,-108, -125,0,- +30, -108,-127,0,-30,-108,-109,0, -30,-108,-113,0,-30,-108,-101,0,-30,-108, -105,0, +33, 0x20,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0 +,0,0 ,0,0,0};main(){void* y3=stdout,*s0=stdin,*(*mv)(size_t)=& malloc;int qq_,*hh, +qf,(*g4) (void*)=&fflush,(* z1)(const char*,...)=&printf,(*p0)(int)= &putchar,c=0, +i,dd,sz,h ,s,e,pr,*trundle,* vp5,*nqd,oo[10];char*p5;goto cow;pic:g4(y3 ); sz=dd*h; +hh=mv( sizeof(int)*sz); z1(_int+18);goto china;tokyo:;if(qq_== qf) goto ten ;c=hh [ +qq_++]; oo[0]=dd;oo[1]=h;oo [2]=c%dd;oo[3]=c/dd;oo[4]=0;{int x= oo[2], y=oo[3],dd=* +oo,h= oo[1],i=x+y*dd;if(x+ 1 -1&&(p5[i-1]==_int[66] ||p5[i-1]==_int[67]))chew: oo [5+oo[4]++]=i -1;if(y+1-1&& p5[i-dd] +==_int [67]||p5[i-dd]==_int [66])chun:oo[5+oo[4] ++]=i -dd;}if(c&1?nqd [c]:vp5[c] ) +goto tokyo;wow:;if(oo[4]-- <=0) goto chin;i=oo[5+oo [4]]; if((i&1?vp5[i]: nqd[i])==0 +){ trundle[i]=c;usleep( 25000) ;g4(y3);z1(_int+34 ,_int[ 67]);z1(_int+25, 1+i/dd,1+i% +dd); p0(88);if(i==e)goto z; i&1?(vp5 [i]=1):(nqd[i] =1);hh[ qf++]=i;}goto wow;chin:c +&1?( nqd[c]=1):(vp5[c]=1); goto tokyo; z:;z1(_int+34, 36);z1( _int+25,1+e/ dd, 1+e%dd) +;p0( 33);tww:;if(trundle [i]==s)goto ten;i=trundle [i]; usleep(50000) ;z1( _int+34,35 +);z1( _int+25,1+i/dd, 1+i%dd);p0(47) ;g4(y3);z1( _int+34 ,33);z1(_int +25,1 + s/dd,1+s% +dd);p0 (95);goto tww;ten:;z1(_int +25,h+3,1); g4(y3); goto pio; cow:; {int c=0;s=e=-1 +;char** strs=mv (1000),d;h=0;for(; h<1000;){ char*s= mv(512);if (fgets (s, 512, s0) || +feof(s0)) { dd= strlen(s)>dd?strlen( s):dd; strs[h]= s;h+=1;if (feof(s0 ) &&(h--|1))goto +tau;}else goto ten; }tau:p5=mv(dd*h);for( int i=0; i +#include +#include +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//@ // +char _int[]={37,99,0,10,0,71,111, 111,100,98,121,101,32,58,45,41,10,0,27,91, 72, +27, 91,74,0,27,91,37,100,59,37, 100,72,0,27,91,37,100,109,0,0,0,-30,-108, -125,0,- +30, -108,-127,0,-30,-108,-109,0, -30,-108,-113,0,-30,-108,-101,0,-30,-108, -105,0, +33, 0x20,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0 +,0,0 ,0,0,0};main(){void* y3=stdout,*s0=stdin,*(*mv)(size_t)=& malloc;int qq_,*hh, +qf,(*g4) (void*)=&fflush,(* z1)(const char*,...)=&printf,(*p0)(int)= &putchar,c=0, +i,dd,sz,h ,s,e,pr,*trundle,* vp5,*nqd,oo[10];char*p5;goto cow;pic:g4(y3 ); sz=dd*h; +hh=mv( sizeof(int)*sz); z1(_int+18);goto china;tokyo:;if(qq_== qf) goto ten ;c=hh [ +qq_++]; oo[0]=dd;oo[1]=h;oo [2]=c%dd;oo[3]=c/dd;oo[4]=0;{int x= oo[2], y=oo[3],dd=* +oo,h= oo[1],i=x+y*dd;if(x+ 1 -1&&(p5[i-1]==_int[66] ||p5[i-1]==_int[67]))chew: oo [5+oo[4]++]=i -1;if(y+1-1&& p5[i-dd] +==_int [67]||p5[i-dd]==_int [66])chun:oo[5+oo[4] ++]=i -dd;}if(c&1?nqd [c]:vp5[c] ) +goto tokyo;wow:;if(oo[4]-- <=0) goto chin;i=oo[5+oo [4]]; if((i&1?vp5[i]: nqd[i])==0 +){ trundle[i]=c;usleep( 25000) ;g4(y3);z1(_int+34 ,_int[ 67]);z1(_int+25, 1+i/dd,1+i% +dd); p0(88);if(i==e)goto z; i&1?(vp5 [i]=1):(nqd[i] =1);hh[ qf++]=i;}goto wow;chin:c +&1?( nqd[c]=1):(vp5[c]=1); goto tokyo; z:;z1(_int+34, 36);z1( _int+25,1+e/ dd, 1+e%dd) +;p0( 33);tww:;if(trundle [i]==s)goto ten;i=trundle [i]; usleep(50000) ;z1( _int+34,35 +);z1( _int+25,1+i/dd, 1+i%dd);p0(47) ;g4(y3);z1( _int+34 ,33);z1(_int +25,1 + s/dd,1+s% +dd);p0 (95);goto tww;ten:;z1(_int +25,h+3,1); g4(y3); goto pio; cow:; {int c=0;s=e=-1 +;char** strs=mv (1000),d;h=0;for(; h<1000;){ char*s= mv(512);if (fgets (s, 512, s0) || +feof(s0)) { dd= strlen(s)>dd?strlen( s):dd; strs[h]= s;h+=1;if (feof(s0 ) &&(h--|1))goto +tau;}else goto ten; }tau:p5=mv(dd*h);for( int i=0; i' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic fc6b6af226b7cc598de3d48fc20ed0bd54f7b4f7f0f651a32b9cf8345b2a3b3f --FNV1a_hash_512_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --level 391581 --mode 216193 --FNV1a_hash_512_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore IAU, $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore, $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2019/lynn/fib.hs b/2019/lynn/fib.hs new file mode 100644 index 000000000..aa10b5331 --- /dev/null +++ b/2019/lynn/fib.hs @@ -0,0 +1,36 @@ +-- We define these because we're starting from scratch. +undefined = undefined; +(.) f g x = f (g x); +id x = x; +data Bool = True | False; +(==) x y = case x <= y of { True -> y <= x ; False -> x <= y }; +ifz n x y = case 0 == n of { True -> x ; False -> y }; +showsInt n = let + { showsNonzero n = let { q = n/10 } in + ifz n id ((.) (showsNonzero q) (chr (ord '0'+(n-(q*10))):) ) + } in ifz n ('0':) (showsNonzero n); +tail xs = case xs of { [] -> undefined; (:) _ t -> t }; +(!!) xs n = case xs of { [] -> undefined; (:) h t -> ifz n h (t!!(n - 1)) }; +zipWith f xs ys = case xs of + { [] -> [] + ; (:) x xt -> case ys of + { [] -> [] + ; (:) y yt -> f x y : zipWith f xt yt + } + }; + +-- One of the first Haskell examples I saw. It got my attention. How can it +-- possibly work? And even after I understood it, I wondered: how do I write +-- a compiler that can understand it? (Now, I know!) +-- +-- Let f be the generating function for Fibonacci numbers. We have: +-- +-- f = 0 + x + (f + f/x )x^2 +-- +-- This translates neatly to: + +fibs = 0 : (1 : zipWith (+) fibs (tail fibs)); + +-- See M. Douglas McIlroy, "Power Series, Power Serious" for more examples. + +go _ = showsInt (fibs !! 30) "\n"; diff --git a/2019/lynn/ghcfib.hs b/2019/lynn/ghcfib.hs new file mode 100644 index 000000000..abb3d20b2 --- /dev/null +++ b/2019/lynn/ghcfib.hs @@ -0,0 +1,8 @@ +{-# LANGUAGE CPP #-} +import Prelude ((+), (-), (*)) +import Data.Char (ord, chr) +import qualified Prelude +a <= b = if (a Prelude.<= b) then True else False +a / b = Prelude.div a b +#include "fib.hs" +main = Prelude.interact go diff --git a/2019/lynn/ghclol.hs b/2019/lynn/ghclol.hs new file mode 100644 index 000000000..042c251b1 --- /dev/null +++ b/2019/lynn/ghclol.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE CPP #-} +import Prelude ((+), (-), Char) +import qualified Prelude +a <= b = if (a Prelude.<= b) then True else False +#include "lol.hs" +main = Prelude.interact go diff --git a/2019/lynn/ghcscc.hs b/2019/lynn/ghcscc.hs new file mode 100644 index 000000000..ab4ea6828 --- /dev/null +++ b/2019/lynn/ghcscc.hs @@ -0,0 +1,7 @@ +{-# LANGUAGE CPP #-} +import Prelude ((+), (-), (*)) +import Data.Char (ord, chr) +import qualified Prelude +a <= b = if (a Prelude.<= b) then True else False +#include "scc.hs" +main = Prelude.interact go diff --git a/2019/lynn/hint.hs b/2019/lynn/hint.hs new file mode 100644 index 000000000..f66a74c66 --- /dev/null +++ b/2019/lynn/hint.hs @@ -0,0 +1,100 @@ +-- The output of a certain stage of our compiler when run on its source, +-- with these differences: +-- +-- * Definitions of the basic combinators so this file compiles. +-- (GHC won't like this file though, as the Scott encodings are unrolled, +-- which messes up the types.) +-- * A few syntax-based rewrites, e.g. Y(Kx) -> x. +-- * Inlined a few functions to shrink the code further. +-- * The original compiler produced a list of numbers and relied on the C +-- program to print them as a comma-separated list along with a certain header +-- and footer. This version of the compiler does all this itself. +-- +-- Studying the code below may partially spoil this entry; please avert your +-- eyes if you want to honestly reverse-engineer the compiler! + +y x = x(y x); +s x y z = x z(y z); +b x y z = x(y z); +c x y z = x z y; +r x y z = y z x; +t x y = y x; +k x _ = x; +i x = x; + +f0 = b c t; +f1 = y(b(b(s(b c t)))(s(b b(b c(b b))))); +f2 = b c(r i(b f1(b(b(c b)) c))); +f3 = b(c(t b)) f2; +f4 = t k; +f5 = b(r(k i))(s(b s (<=))(c (<=))); +f6 = y(b(c(b s(b(b s)(b(b(b s))(r(b(r(b k k))(b b))(b b(b b b)))))))(b(c(b b(b s(b(b b)(b b)))))(b(r i)(b(b s)(b(b(b c))(b(b(b(b c)))(b(b(b(b(b c))))(b(b(b(b(b(b c)))))(b(b(b(c(b b(b c(b(b b) f5))))))(b(b c)(b(b(b c))(b c(b c))))))))))))); +f7 = c(b f1(b (:))) k; +f8 = b c(b(b c)(b(b f1)(b c(c f5)))); +f9 = b k t; +f10 = b(b(b k))(b(b(b k))(b(b(b k))(b(b(b k))(b c t)))); +f11 = b k(b(b k)(b(b k)(b(b k) t))); +f12 = b k(b k(b(b k)(b(b k) t))); +f13 = b k(b k(b k(b(b k) t))); +f14 = b(b k)(b(b k)(b(b k)(b(b k)(b c t)))); +f15 = b k(b k(b k k)); +f16 = c(t k); +f17 = b f16(b f9); +f18 = c(f1 (:)); +f19 = f1 f18 k; +f20 = f5 0; +f21 = f11 8; +f22 = f11 9; +f23 = f11 6; +f24 = f11 5; +f25 = f11 3; +f26 = f11 2; +f27 = b(b(b f12))(r f11 b); +f28 = b(b(b(b f12)))(s(b b b)(r f11 b)); +f29 = y(b(b(r b))(s(b c(b(b s)(s(b c(b(b s)(s(b s(b(b s)(b(c b)(b(r b)(s(b c(b(c(r(b f12(b f11(f14 f23)))(t(f12(f11(f14(f14 f26 f22) f22))))))(r(f14 f26 f22) f27)))(r f23 f27))))))(b(b(b(r b)))(s(b b(b c(b(b c)(b(c(b s(r(b(b f11) f14)(b s(r(b f12 f11) b)))))(r(f14 f24)(b b f27))))))(b(b f13)))))))(b(b(r b))(s(b c(b(b s)(s(b c(b(b s)(s(b c(b(b s)(b(c b)(b(r(f11 f22))(r f26 f28)))))(b c(r(f14(f11 4))(b b f27))))))(r f26 f28))))(r f25 f28))))))(b(b(r b))(s(b c(b(b s)(s(b c(b(b s)(b(s(b s(r f12 b)))(b(b(b k))(b(b(b f13)) c)))))(r f24 f28))))(b(b f13)))))); +f30 = b(b(r b(r b(r b(r i(t b)))))(y(s(b c(b(r f11)(s(b c(b(c(t f15))(b f13)))(b(r b)(b(r(f29(f11 f21)))(b(r i)(b(r(b f11(f14 f21)))(r(f11 f22)))))))))(s(b c(b(b b)(b f29))) i))))(y(s(b s(b(b c)(r(b(r i)(r(b f13 f13)(b s(c(r k(b f1(b(r(f17 f11))(b(b b)(b(r(f9 f15))(c f6))))))))))(b s(b(b c)(b(b(r(b f13 f12)))(b(b(r(b f13 f11)))(b(b t)(b(b(b(b f12)))(r(c (:))(b b b)))))))))))(s(b s(b(b c)(b(b(b b))(b(b f14))))) i)) k); +f31 = b(b f9) f0; +f32 = c(b b(b f16(b t(c(b b(b f17(b t(b f0)))))))); +f33 = b f32 f31; +f34 = b(b(r f9)) s; +f35 = b f32(f33(k i)); +f36 = y(b(r(f31 k))(b(b f34)(s(b f32(f33 (:)))))); +f37 = s(b f32(f33 (:))) f36; +f38 = b(f0 k)(b(b(r k))(r f31(b s(b b)))); +f39 = b(b(b c))(b(c(b s(b(b(b s(b b))) (<=))))(c (<=))); +f40 = b f38 f5; +f41 = b f32(f33 k); +f42 = r(c f41)(b b(b b f35)); +f43 = b b(b f16(b(r k)(r f9(b s(r f4 b))))); +f44 = c(b f43 f6); +f45 = f37(f38(c f8 [58,33,35,36,37,38,42,43,46,47,60,61,62,63,64,92,94,124,45,126])); +f46 = f36(f34(f38(r [32,10] f8))(f35(f35(f44 f45 [45,45])(f36(f38(b c(f5 10)))))(f40 10))); +f47 = r f46 f41; +f48 = b f47 f40; +f49 = b(r(f31 k))(b(b f34)(s(b b(b f32(f32(f31 (:)))))(b(b f36)(c(b f35 f48))))); +f50 = b(f33 f12)(b(f34(f35(f40 92)(f34(f38(r [92,39,34] f8))(f33(k 10)(f40 110)))))(b f38(b(b c) f5))); +f51 = f38(f39 47 58); +f52 = b f14 f13; +f53 = f33(f1(b f14(f52 [58])) f21); +f54 = r f48(b b f42); +f55 = b f54 f48; +f56 = f55 91 93; +f57 = f38(s(b(b s(b b))(s(b(b s(b b))(f39 96 123))(f39 64 91)))(f5 95)); +f58 = [111,102]; +f59 = f47(f32(f33 (:) f57)(f36(f34(f34 f57 f51)(f40 39)))); +f60 = f43(b c(f6 f58)) f59; +f61 = f47(f34 f45(f55 96 96 f60)); +f62 = f55 40 41; +f63 = f34 f60(f62 f61); +f64 = f1 f10; +f65 = b(f34(f33 f13 f63))(b f53(b f56(r 44 f49))); +f66 = f44 f61 [45,62]; +f67 = b(f55 123 125)(r 59 f49); +f68 = f44 f59; +f69 = f37 f60; +f70 = b(f32(f33(s(b b f0)(b(b f30)(b(b(f52 k)) f10))) f63))(b(f32(f33(c f64)(f36 f60)))(f35(f48 61))); +f71 = b(f33(f3 f14))(b f37(s(b f34(r(f34(f34(f54(f40 39) 39(f50 39))(f53(f54(f40 34) 34(f36(f50 34)))))(f33 f12(f33(f2(b(r 48)(b(b (-))(r i(b b(b (+)(r 10 (*))))))) 0)(f47(f37 f51)))))(b f34(s(b f34(s(b f34(s(b f34(s(b f32(b(f33(c(f1(c(b t(b(b f14)(c f10)))))))(b(f42(f68 [108,101,116])(f68 [105,110]))(b f67 f70)))) i))(s(b f32(b(f33(b(b(f3 f14)) (:)))(f42(f68 [99,97,115,101])(f68 f58))))(b f67(s(b f35 f65)(b(f32(f33(c f64)(f36 f60)))(f35 f66)))))))(f32(f33(c(f1 f10))(f42(f48 92) f66 f69)))))(b f62(s(b f34(r(f34(f33 f52 f61)(f31 i))(b f32(f33 t))))(f32(f33(b f14(b(f14 f25) f13)) f61)))))))) f65)); +f72 = b(b(t(k i)))(r(f0 0 k)(b f2(b c(b(b t)(b(b(s(b b(b f0((+) 1)))))(b(b (:)))))))); +f73 = r(b(b(b t))(b(b(b(s(b b f0))))(b(b(c(b b(b b f0))))(b(b(c(b b(b f0(r 2 (+))))))(b(c(b b (:))) (:))))))(b b b); +f74 = b f4(r i(t b)); +f75 = r [47,42,10](b f18(b(f18 [35,100,101,102,105,110,101,32,120,32,92,10])(b(b(b f19) f7(r [44](s(r((:) 48) f20)(y(b(s(r i f20))(r(b (:)(b((+) 48)(r 10(s(b b (-))(r i(b s(b(b (*)) (/))))))))(b s(b(b b)(r(r 10 (/)) b)))))))))(r(b t(b(c(b b (:)))(r(b(f18(y(b(s(b b(r k f20)))(b(b(s (:)))(r(r 1 (-)) b))) 22 0))(f2(c (:)) k))(b b(b (:)(b(t(k i))(f1 k b)))))))(b(b(f2(b t(r(b(b t)(b(b(b f0))(b(b (:)) f0)))(b b(b c(y(b(s(b c(s(b c(s(b c(b(c(t b))(c f0)))(r 1 f73)))(s(b b(c f0))(b(c(r 9(b f1(b(c b)(b c(b(b c) f6)))))) f4)))))(s(b c(b(b c)(b(b b))))(b(r(b c(c f73)))(b(b b)(b(b c) c))))))))))(f0(f72(r((+) 16)(b b f0))((:) k(f74(f36 f61 [58,32,60,61,32,42,32,43,32,45,32,47]))))(f0 24 k))) f74)(f35 f46(f33 f19(f49(f34(f35(f54(f68 [100,97,116,97]) 61 f69)(f33(s(b f7(b t(b(s(b b f0))(b(b(b f30))(b(c(b s(b(b f64)(b(f2(r f13(b b f14))) f13))))(b(c f18)(f7 f4))))))) i)(f49(f32(f33 f0 f63)(f33(f72(k(c (:) k)))(f36(f34(f34(f62 f69)(f56 f69)) f60)))) 124)))(f33(c (:) k)(f70(y(s(b f32(b(f33(f2 t)) f71))(b f36(b(f32(f33(b c(b(b f14) f52)) f61)) f71))))))) 59)))))))); diff --git a/2019/lynn/hint.html b/2019/lynn/hint.html new file mode 100644 index 000000000..3dcf4012d --- /dev/null +++ b/2019/lynn/hint.html @@ -0,0 +1,306 @@ + + + + + + Most functional compiler + + +

    Most functional compiler

    + +

    Ben Lynn
    +https://crypto.stanford.edu/~blynn/
    +Twitter: @bmxlynn

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    + +

    Try:

    + +
    (./prog < fib.hs; cat prog.c) > fib.c
    +cc fib.c -o fib
    +./fib
    +
    + +

    Selected Judges Remarks:

    + +

    A fully functional compiler. The example prints out the 30th Fibonacci number.

    + +

    Author’s comments:

    + +

    Remarks

    + +

    A Haskell compiler. Supports a subset of Haskell more than large enough to +self-host. Like GHC with custom language extensions:

    + +
      +
    • WeDontServeYourType: Compilation failing because of inscrutable type +checking rules? Confused by the ever-growing mire of extensions to the type +system? The solution is simple: no type checking. It also means no +typeclasses. Just pass dictionaries explicitly.

    • +
    • ZeroPauseGarbageCollection: Instead of disruptive stop-the-world garbage +collection, we only tidy up when the world stops of its own accord, that is, +on program termination.

    • +
    • OneHundredPercentPure: Gone is the catch-all lawless IO monad. And no +trace of those scary unsafeThisAndThat functions. All functions must be pure.

    • +
    • SyntaxForTheMasses: See below.

    • +
    + + +

    Demos

    + +

    Build the compiler:

    + +
    $ $(CC) -o prog prog.c
    +
    + +

    Fibonacci numbers

    + +

    Test the compiler on fib.hs:

    + +
    $ (./prog < fib.hs ; cat prog.c) > fib.c
    +
    + +

    Compiling the output produces a binary that prints the 30th Fibonacci number.

    + +

    The file ghcfib.hs includes fib.hs with some glue code, and shows GHC +also accepts our subset of Haskell:

    + +
    $ ghc ghcfib.hs
    +
    + +

    Self-hosting compiler

    + +

    To avoid spoiling this entry by revealing the original Haskell source, we +instead provide hint.hs, the output of a certain stage of the compiler when +run on itself. This intermediate output is hopefully difficult to understand, +yet is accepted by our compiler:

    + +
    $ (./prog < hint.hs ; cat prog.c) > hint.c
    +
    + +

    The output program behaves like the compiler itself.

    + +

    Unlike the original source from which it is derived, GHC fails to compile +hint.hs. This is because values have been replaced with their Scott encodings +by this stage, which messes up type-checks; we’d need equirecursive types for +it to work.

    + +

    Regexes

    + +

    The file lol.hs contains an adaptation of Doug McIlroy’s elegant code from +“Enumerating the strings of regular +languages”. We exercise it by +showing the first entries of the length-ordered list of all strings consisting +of the characters a and b that contain an even number of a’s.

    + +
    $ (./prog < lol.hs ; cat prog.c) > lol.c
    +
    + +

    A GHC wrapper is provided:

    + +
    $ ghc ghclol.hs
    +
    + +

    Strongly-connected components

    + +

    See scc.hs (and its GHC wrapper ghcscc.hs) for an elegant way to print the +strongly-connected components of a graph in reverse topological order.

    + +
    $ (./prog < scc.hs ; cat prog.c) > scc.c
    +
    + +

    It expects the input to be in a similar format as a previous entry +(2018 vokes). Indeed, obtain the 2018 winners, and run:

    + +
    $ ./scc < 2018/vokes/example-1.txt
    +$ ./scc < 2018/vokes/example-2.txt
    +
    + +

    The output should agree, though our program omits line numbers and does not +sort entries within a line. (Also, our program only treats spaces as +whitespace, and supports any nonspace character in a vertex name.)

    + +

    Syntax

    + +

    Some claim Haskell syntax is frightening because braces and semicolons are +optional. Some complain about a zoo of twisty little operators, all alike. Our +compiler addresses such concerns by making braces and semicolons compulsory, +disabling layout-based rules, making every operator left-associative with same +precedence, and only defining 6 primitive functions:

    + +
    : + - * / <=
    +
    + +

    The arithmetic operations behave as they do in C on unsigned ints, and (:) is +Haskell’s cons function. Like Haskell and unlike C, (<=) returns a Bool +(which are Church booleans behind the scenes) and not an Int.

    + +

    No ifs, ands, or buts. Define them yourself. No tuples. Who needs them when +algebraic data types delivers a better product? There is no do. No where. No +list comprehensions. No unary operators.

    + +

    Let expressions and operator sections are supported.

    + +

    Within global scope or a let expression, each definition can only refer to +itself or previous definitions. This implies we can only achieve mutual +recursion by having one function pass itself to others.

    + +

    Caveats

    + +

    The only primitive type is Int. In particular, they represent characters. To +interoperate with GHC, our compiler treats any undefined functions as the +identity function, so that we may freely use ord and chr (or fromEnum and +toEnum) to make our code acceptable to both compilers.

    + +

    The main function is the last function to successfully parse. It should have +type [Int] -> [Int], and our compiler treats this like the function passed +into Prelude.interact, that is, the entire standard input is passed to this +function, and the result is printed to standard output.

    + +

    Bool must be defined as:

    + +
    data Bool = True | False;
    +
    + +

    so that it matches the Scott-encoded booleans internally used by the primitive +function (<=).

    + +

    The alternatives in a case expressions must list every data constructor in +the order they are defined. For example, if we have:

    + +
    data Foo a b = Bar a | Baz | Qux Int [b]
    +
    + +

    then a case expression that examines a term of this type must have the form:

    + +
    case x of
    +  { Bar a    -> ...
    +  ; Baz      -> ...
    +  ; Qux n bs -> ...
    +  }
    +
    + +

    We stress braces and semicolons are required. Our fussy parser treats +semicolons as separators, not terminators.

    + +

    The effect of erroneous input is undefined. It may be best to develop with GHC, +but even then, be mindful of changes needed because of issues caused by the +uniform operator precedence and the touchy format of case alternatives.

    + +

    Why?

    + +

    One-letter variable names abound in IOCCC entries, and for good reason. These +tiny pieces of confetti are hard to read, and leave room for more code. Then +why not go further and use zero-letter variable names? That is, tacit +programming or point-free style.

    + +

    I had been playing with an algorithm devised by Oleg Kiselyov that effortlessly +and efficiently eliminates those pesky variables, leaving behind terms composed +from a small set of combinators. No need for lambda lifting or supercombinators.

    + +

    By adding a handful of lines of mostly parsing code, we get a Haskell compiler, +or rather, a compiler that accepts a subset of Haskell sufficiently large to +self-host. You might say I wrote a tool for this contest, then ran it on itself +to make an entry for it.

    + +

    Obfuscation techniques

    + +

    Even with Kiselyov’s algorithm and some term rewriting, the compiler only fit +after compression, which naturally obfuscates the code. More tricks were needed +to fit within the size limits.

    + +
      +
    • One-letter variables, until enough is done to banish variables completely.
    • +
    • Ipse dixit. Near the end, the code declares itself to be an obfuscated +program. (There is also an exhortation intended for the judges in a similar +format earlier in the source.)
    • +
    • Typical C mischief: pre- and post-increment, commutative array indexing, +ternary operators, and so on.
    • +
    • Huffman coding.
    • +
    • Base-85 because high bits are frowned upon.
    • +
    • Mixed radix encoding to game iocccsize. From a past winner (2018 bellard), +it seems 9 11 12 32 are the only whitespace octets that may appear verbatim in +string literals.
    • +
    • Choosing what to encode in Huffman/base-85 and what to encode in mixed radix +was a delicate balancing act. In the end, I only had a few bytes to spare, +which I spent on gratuitous confusion.
    • +
    • The effects of some functions depend on the order their arguments are +evaluated, yet the program works either way. Why?
    • +
    • Ugly macros for the runtime system’s jump table for lazy reduction. A +previous winner (2013 endoh1) has a cuter solution, which I avoid because of +originality concerns and also because my combinators are compressed.
    • +
    • Relies on the inability of C comments to nest.
    • +
    • Cheaper and more complicated to print comma-separated ints (and header and +footer) in C.
    • +
    • Primitive functions use a trick described in depth by Naylor and Runciman, +“The Reduceron reconfigured and +re-evaluated”. We +represent the integer n with a term equivalent to Y(BT)n; it works because +Y(BT)ne = e(Y(BT)n).
    • +
    • A sentinel in the heap often confused me, so ought to confuse others.
    • +
    + + +

    Other obfuscation techniques are better appreciated after decoding the +compiler. See hint.hs.

    + +
      +
    • Mercilessly point-free. Everything is a combinator.
    • +
    • Scott encoding. Everything is a combinator.
    • +
    • Sum types are oddly ordered and may even contain unused data constructors +to reduce code duplication. (In C terms, unions may have extra fields, and +they’re ordered in such a way so we can reuse code to access certain fields.)
    • +
    • The undefined function compiles to the (.) function.
    • +
    • Replaced the only (&&) with (||) and not using De Morgan’s law, which +makes some comparisons less comprehensible.
    • +
    • Kiselyov only published “λ to SKI, Semantically” last +year.
    • +
    • Recursion via the fixpoint (Y) combinator, which is represented by the +variable “” during one stage of compilation.
    • +
    • Involves theory that may be less familiar to C programmers: maps, folds, +parser combinators, lambda calculus, bracket abstraction, denotational +semantics, etc.
    • +
    + + +

    Warnings

    + +

    On my system, it compiles cleanly with -Wall with older standards, e.g. +-std=c89, but less cleanly if -pedantic is also supplied.

    + +

    Compiling the compiler output with -Wall triggers a warning about a +strange-looking comment.

    + +

    Behind-the-scenes commentary

    + +

    My website reveals how this compiler +works.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2019, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2019/lynn/hint.text b/2019/lynn/hint.text new file mode 100644 index 000000000..2e4cb2648 --- /dev/null +++ b/2019/lynn/hint.text @@ -0,0 +1,262 @@ +# Most functional compiler + +Ben Lynn + +Twitter: @bmxlynn + + +## Judges' comments: +### To use: + + make + +### Try: + + (./prog < fib.hs; cat prog.c) > fib.c + cc fib.c -o fib + ./fib + +### Selected Judges Remarks: + +A fully functional compiler. The example prints out the 30th Fibonacci number. + +## Author's comments: +# Remarks # + +A Haskell compiler. Supports a subset of Haskell more than large enough to +self-host. Like GHC with custom language extensions: + + * `WeDontServeYourType`: Compilation failing because of inscrutable type + checking rules? Confused by the ever-growing mire of extensions to the type + system? The solution is simple: no type checking. It also means no + typeclasses. Just pass dictionaries explicitly. + + * `ZeroPauseGarbageCollection`: Instead of disruptive stop-the-world garbage + collection, we only tidy up when the world stops of its own accord, that is, + on program termination. + + * `OneHundredPercentPure`: Gone is the catch-all lawless IO monad. And no + trace of those scary `unsafeThisAndThat` functions. All functions must be pure. + + * `SyntaxForTheMasses`: See below. + +## Demos ## + +Build the compiler: + + $ $(CC) -o prog prog.c + +### Fibonacci numbers + +Test the compiler on `fib.hs`: + + $ (./prog < fib.hs ; cat prog.c) > fib.c + +Compiling the output produces a binary that prints the 30th Fibonacci number. + +The file `ghcfib.hs` includes `fib.hs` with some glue code, and shows GHC +also accepts our subset of Haskell: + + $ ghc ghcfib.hs + +### Self-hosting compiler + +To avoid spoiling this entry by revealing the original Haskell source, we +instead provide `hint.hs`, the output of a certain stage of the compiler when +run on itself. This intermediate output is hopefully difficult to understand, +yet is accepted by our compiler: + + $ (./prog < hint.hs ; cat prog.c) > hint.c + +The output program behaves like the compiler itself. + +Unlike the original source from which it is derived, GHC fails to compile +`hint.hs`. This is because values have been replaced with their Scott encodings +by this stage, which messes up type-checks; we'd need equirecursive types for +it to work. + +### Regexes + +The file `lol.hs` contains an adaptation of [Doug McIlroy's elegant code from +"Enumerating the strings of regular +languages"](https://www.cs.dartmouth.edu/~doug/nfa.pdf). We exercise it by +showing the first entries of the length-ordered list of all strings consisting +of the characters a and b that contain an even number of a's. + + $ (./prog < lol.hs ; cat prog.c) > lol.c + +A GHC wrapper is provided: + + $ ghc ghclol.hs + +### Strongly-connected components + +See `scc.hs` (and its GHC wrapper `ghcscc.hs`) for an elegant way to print the +strongly-connected components of a graph in reverse topological order. + + $ (./prog < scc.hs ; cat prog.c) > scc.c + +It expects the input to be in a similar format as a previous entry +(2018 vokes). Indeed, obtain the 2018 winners, and run: + + $ ./scc < 2018/vokes/example-1.txt + $ ./scc < 2018/vokes/example-2.txt + +The output should agree, though our program omits line numbers and does not +sort entries within a line. (Also, our program only treats spaces as +whitespace, and supports any nonspace character in a vertex name.) + +## Syntax ## + +Some claim Haskell syntax is frightening because braces and semicolons are +optional. Some complain about a zoo of twisty little operators, all alike. Our +compiler addresses such concerns by making braces and semicolons compulsory, +disabling layout-based rules, making every operator left-associative with same +precedence, and only defining 6 primitive functions: + + : + - * / <= + +The arithmetic operations behave as they do in C on unsigned ints, and `(:)` is +Haskell's cons function. Like Haskell and unlike C, `(<=)` returns a Bool +(which are Church booleans behind the scenes) and not an Int. + +No ifs, ands, or buts. Define them yourself. No tuples. Who needs them when +algebraic data types delivers a better product? There is no do. No where. No +list comprehensions. No unary operators. + +Let expressions and operator sections are supported. + +Within global scope or a let expression, each definition can only refer to +itself or previous definitions. This implies we can only achieve mutual +recursion by having one function pass itself to others. + +## Caveats ## + +The only primitive type is `Int`. In particular, they represent characters. To +interoperate with GHC, our compiler treats any undefined functions as the +identity function, so that we may freely use `ord` and `chr` (or `fromEnum` and +`toEnum`) to make our code acceptable to both compilers. + +The main function is the last function to successfully parse. It should have +type `[Int] -> [Int]`, and our compiler treats this like the function passed +into `Prelude.interact`, that is, the entire standard input is passed to this +function, and the result is printed to standard output. + +Bool must be defined as: + + data Bool = True | False; + +so that it matches the Scott-encoded booleans internally used by the primitive +function `(<=)`. + +The alternatives in a case expressions must list every data constructor in +the order they are defined. For example, if we have: + + data Foo a b = Bar a | Baz | Qux Int [b] + +then a case expression that examines a term of this type must have the form: + + case x of + { Bar a -> ... + ; Baz -> ... + ; Qux n bs -> ... + } + +We stress braces and semicolons are required. Our fussy parser treats +semicolons as separators, not terminators. + +The effect of erroneous input is undefined. It may be best to develop with GHC, +but even then, be mindful of changes needed because of issues caused by the +uniform operator precedence and the touchy format of case alternatives. + +## Why? ## + +One-letter variable names abound in IOCCC entries, and for good reason. These +tiny pieces of confetti are hard to read, and leave room for more code. Then +why not go further and use zero-letter variable names? That is, tacit +programming or point-free style. + +I had been playing with an algorithm devised by Oleg Kiselyov that effortlessly +and efficiently eliminates those pesky variables, leaving behind terms composed +from a small set of combinators. No need for lambda lifting or supercombinators. + +By adding a handful of lines of mostly parsing code, we get a Haskell compiler, +or rather, a compiler that accepts a subset of Haskell sufficiently large to +self-host. You might say I wrote a tool for this contest, then ran it on itself +to make an entry for it. + +## Obfuscation techniques ## + +Even with Kiselyov's algorithm and some term rewriting, the compiler only fit +after compression, which naturally obfuscates the code. More tricks were needed +to fit within the size limits. + + * One-letter variables, until enough is done to banish variables completely. + * Ipse dixit. Near the end, the code declares itself to be an obfuscated + program. (There is also an exhortation intended for the judges in a similar + format earlier in the source.) + * Typical C mischief: pre- and post-increment, commutative array indexing, + ternary operators, and so on. + * Huffman coding. + * Base-85 because high bits are frowned upon. + * Mixed radix encoding to game iocccsize. From a past winner (2018 bellard), + it seems 9 11 12 32 are the only whitespace octets that may appear verbatim in + string literals. + * Choosing what to encode in Huffman/base-85 and what to encode in mixed radix + was a delicate balancing act. In the end, I only had a few bytes to spare, + which I spent on gratuitous confusion. + * The effects of some functions depend on the order their arguments are + evaluated, yet the program works either way. Why? + * Ugly macros for the runtime system's jump table for lazy reduction. A + previous winner (2013 endoh1) has a cuter solution, which I avoid because of + originality concerns and also because my combinators are compressed. + * Relies on the inability of C comments to nest. + * Cheaper and more complicated to print comma-separated ints (and header and + footer) in C. + * Primitive functions use a trick described in depth by [Naylor and Runciman, +"The Reduceron reconfigured and +re-evaluated"](https://www.cs.york.ac.uk/fp/reduceron/jfp-reduceron.pdf). We +represent the integer n with a term equivalent to `Y(BT)n`; it works because +`Y(BT)ne = e(Y(BT)n)`. + * A sentinel in the heap often confused me, so ought to confuse others. + +Other obfuscation techniques are better appreciated after decoding the +compiler. See `hint.hs`. + + * Mercilessly point-free. Everything is a combinator. + * Scott encoding. Everything is a combinator. + * Sum types are oddly ordered and may even contain unused data constructors + to reduce code duplication. (In C terms, unions may have extra fields, and + they're ordered in such a way so we can reuse code to access certain fields.) + * The `undefined` function compiles to the `(.)` function. + * Replaced the only `(&&)` with `(||)` and `not` using De Morgan's law, which + makes some comparisons less comprehensible. + * [Kiselyov only published "λ to SKI, Semantically" last +year](http://okmij.org/ftp/tagless-final/ski.pdf). + * Recursion via the fixpoint (Y) combinator, which is represented by the + variable "" during one stage of compilation. + * Involves theory that may be less familiar to C programmers: maps, folds, + parser combinators, lambda calculus, bracket abstraction, denotational + semantics, etc. + +## Warnings ## + +On my system, it compiles cleanly with `-Wall` with older standards, e.g. +`-std=c89`, but less cleanly if `-pedantic` is also supplied. + +Compiling the compiler output with `-Wall` triggers a warning about a +strange-looking comment. + +## Behind-the-scenes commentary ## + +[My website reveals how this compiler +works.](https://crypto.stanford.edu/~blynn/compiler/ioccc.html) + +-------------------------------------------------------------------------------- + diff --git a/2019/lynn/lol.hs b/2019/lynn/lol.hs new file mode 100644 index 000000000..f068864b1 --- /dev/null +++ b/2019/lynn/lol.hs @@ -0,0 +1,59 @@ +-- See M. Douglas McIlroy, "Enumerating the strings of regular languages". +undefined = undefined; +data Bool = True | False; +(==) x y = case x <= y of { True -> y <= x ; False -> x <= y }; +ife b t f = case b of { True -> t ; False -> f }; +foldr c n xs = case xs of + { [] -> n + ; (:) h t -> c h (foldr c n t) + }; +(++) = \xs ys -> foldr (:) ys xs; +unwords xs = case xs of + { [] -> "" + ; (:) x xt -> x ++ foldr (\a s -> ' ':a ++ s) "" xt + }; +take n xs = ife (n == 0) [] (case xs of + { [] -> [] + ; (:) x xt -> x:take (n-1) xt + }); +length xs = case xs of { [] -> 0 ; (:) x xt -> 1 + length xt }; + +data Ordering = LT | GT | EQ; + +intcmp x y = ife (x <= y) (ife (y <= x) EQ LT) GT; + +flst xs n c = case xs of { [] -> n ; (:) x xt -> c x xt }; + +eqstrcmp xs ys = flst xs EQ (\x xt -> flst ys undefined (\y yt -> case intcmp x y of { LT -> LT ; GT -> GT ; EQ -> eqstrcmp xt yt })); + +cmp xs ys = case intcmp (length xs) (length ys) of { LT -> LT ; GT -> GT ; EQ -> eqstrcmp xs ys }; + +alt xs ys = flst xs ys (\x xt -> flst ys xs (\y yt -> case cmp x y of { LT -> x:alt xt ys ; GT -> y:alt xs yt ; EQ -> x:alt xt yt } )); + +cat xs ys = flst xs [] (\x xt -> flst ys [] (\y yt -> (x ++ y) : alt (cat [x] yt) (cat xt ys))); + +clo xs = flst xs [""] (\x xt -> flst x (clo xt) (\_ _ -> "" : cat xs (clo xs))); + +data Re = Nil + | Eps + | Sym Char + | Clo Re + | Cat Re Re + | Alt Re Re + ; + +enumR expr = case expr of + { Nil -> [] + ; Eps -> [""] + ; Sym a -> [[a]] + ; Clo x -> clo (enumR x) + ; Cat x y -> cat (enumR x) (enumR y) + ; Alt x y -> alt (enumR x) (enumR y) + }; + +a = Sym 'a'; +b = Sym 'b'; +sandwich = Cat a (Cat (Clo b) a); +even_a = Clo (Alt sandwich b); + +go stdin = unwords (take 32 (enumR even_a)); diff --git a/2019/lynn/prog.c b/2019/lynn/prog.c new file mode 100644 index 000000000..daf95fa1c --- /dev/null +++ b/2019/lynn/prog.c @@ -0,0 +1,48 @@ +#define x 0/**/ +char*v,*y="33Yb59@&iBFApt;[[h3V19\\3<:4cJ!U 2eT18pC,Qqik4J:sh?HUXMrR(-l0R\"!eKZcI!@E(@B,C/*!aogn5LbK/e=2CmReb+6,]kD!iOC9DEOC9Dc1EV6976c?&s)Be;P;E^tl2eUYkg*#Yf:6^d[Mg_P;VGCr823^L_^#d6B!tb-on27d%i_OS5(W5eV-=M14kYO);Fe7k!N41LW%m/R\\rON3-=G]^akjT778YCJ7B8e-5E#RX R=Ig8#/pDdAI;=a[ ISbp't+ZLJ;lUO71C)b5[Y)qTWmFJ)G1ehmS<.`n3RnE IG+G_A`CE=?hZU)bScgt7R3GNs+V(HQLL_R)n4;]#cUR.p>5!^4T3pQg^o//WLATCE18mSUme[Q<53e:')Q_%L.*D2%;[0B+#8UANT1.tSd/^@L$&a6^g@jYNMC7OWCKOk&#[9FCQ#WFoga(tK<[PG6@5k2KY\\ oW':M;e//kd\"[l,_V?UlZ,m(Hh?O81mhM!G18 ]7m?X7e^[7EZYj[;kR,YXD\\X,!k6.HF8Z(V^^nBYea^NIL:]lG0(/\\IkjPam;F-A,(tVN+bG@ { { ; } ; } } } ; } } } } } } { } } ; } } } } } } } } { } } } } ; } { } } ; ; { } ; ; } ; } } ; { } { ; ; } } } } } } } } } ; } } ; } { { } ; let ; in } ; } } ; } } { } ; case ; } } ; } } } { } { } { ; } } ; { { } { } { ; } } } } } } } ; } } ; } } } } } ; ; ; } { ; { ; { ; } } } ; } } ; } { ; { ; } } ; { ; } ; } } ; } ; } ; ; } ; ; ; } ; ; ; } ; } } ; } : <= * + - / } ; { } } { } } ; } { } } ; } data } ; } ; ; } { { ; { } ; ; ; } } } } ; } ; } ; } { } { } } } ; ; { } } { } } } { ; ; } } } } { { ; ; #define x \\"; +#include +typedef unsigned P; +enum{ L=1<<26} ; + +P I,C,K=24,M,E + +,j[L]={ x},*D=j+L/2,*i=j+L-3; +P w(P _){ return j[_[i]+1]; } +#define X(f,b,y,d) void f(){ D=j+b[i]; *D=y; *++D=d; i+=b; } +X(A,1,w(1),i[1])X(a,2,w(2),w(1))P l(P _,P E){ j[K++]=_; K++[j]=E; return K-2; } +int S; +X(t,1,9,(S=getchar())<0?8:l(l(17,l(1,S)),l(7,0)))P U(P _){ return j[w(_)+1]; } +X(_,2,9,U(1)>U(2)?l(8,9):8)X(b,2,w(2),i[1])P G(P _,P S){ return l(w(_),w(S)); } +#define B(f,o) X(f,2,1,U(1)o U(2)) +B(p,*)X(c,3,w(1),G(2,3))X(u,3,G(1,3),w(2))P N(P l,P L,P _){ +I=0; +while(*T-I[v])I++; +T++; +return I/6?l:N(l+I/_*L,L*6/_,3-_); +} +X(s,3,G(2,3),w(1))X(m,4,G(4,1),w(2))B(o,-)X(f,3,G(1,3),G(2,3))P Z(){ +P _=*T++; +return _-9?l(l(17,l(1,_)),Z()):8; +} +X(d,2,w(1),w(2))X(R,2,l(w(2),printf(E?"%c":"%u,",U(1))),l(23,9))P W(P _){ +if(S--); else{ M=0; C=5; while(C--)M=85*M+*y++-32; S=31; } +I=_*2+!!(M&1< f (g x); +flip f = \x y -> f y x; +(==) x y = case x <= y of { True -> y <= x ; False -> x <= y }; +ife b t f = case b of { True -> t ; False -> f }; +foldr c n xs = case xs of + { [] -> n + ; (:) h t -> c h (foldr c n t) + }; +foldl f a bs = foldr (\b g x -> g (f x b)) id bs a; +foldl1 f xs = case xs of { [] -> undefined ; (:) h t -> foldl f h t }; +map = flip (foldr . ((.) (:))) []; +(++) = \xs ys -> foldr (:) ys xs; +concat = foldr (++) []; +concatMap = (concat .) . map; +elemWith f k xs = foldr (\x t -> ife (f x k) True t) False xs; +elem = elemWith (==); +eqStr s t = case s of + { [] -> case t of { [] -> True; (:) _ _ -> False } + ; (:) x xs -> case t of + { [] -> False + ; (:) y ys -> ife (x == y) (eqStr xs ys) False + } + }; +elemStr = elemWith eqStr; +data Maybe a = Nothing | Just a; +lookup n = foldr (\h t -> case h of { Pair k v -> ife (n == k) (Just v) t }) Nothing; +data Pair x y = Pair x y; +fst p = case p of { Pair x _ -> x }; +snd p = case p of { Pair _ y -> y }; +break p xs = case xs of + { [] -> Pair [] [] + ; (:) x xs' -> ife (p x) (Pair [] xs) (case break p xs' of { Pair ys zs -> Pair (x:ys) zs }) + }; +lines s = case s of + { [] -> [] + ; (:) _ _ -> case break (\c -> '\n' == c) s of + { Pair l s' -> l : case s' of + { [] -> [] + ; (:) _ s'' -> lines s'' + } + } + }; +dropWhile p xs = case xs of + { [] -> [] + ; (:) x xs' -> ife (p x) (dropWhile p xs') xs + }; +length xs = case xs of { [] -> 0 ; (:) x xt -> 1 + length xt }; +isSpace c = c `elem` " \n"; +words s = case dropWhile isSpace s of + { [] -> [] + ; (:) h t -> case break isSpace (h:t) of + { Pair w s' -> w:words s' } + }; +unwords xs = case xs of + { [] -> "" + ; (:) x xt -> x ++ foldr (\a s -> ' ':a ++ s) "" xt + }; + +depthFirstSearch = let + { search relation st vertex = case st of + { Pair visited sequence -> ife (vertex `elemStr` visited) st (case depthFirstSearch relation (Pair (vertex:visited) sequence) (relation vertex) of + { Pair visited' sequence' -> Pair visited' (vertex:sequence') + }) + } + } in foldl . search; + +spanningSearch = let + { search relation st vertex = case st of + { Pair visited setSequence -> ife (vertex `elemStr` visited) st (case depthFirstSearch relation (Pair (vertex:visited) []) (relation vertex) of + { Pair visited' sequence -> Pair visited' ((vertex:sequence):setSequence) + }) + } + } in foldl . search; + +scc ins outs = let + { depthFirst = snd . depthFirstSearch outs (Pair [] []) + ; spanning = snd . spanningSearch ins (Pair [] []) + } in spanning . depthFirst; + +go s = let + { nums = map words (lines s) + ; outs v = foldr (\h t -> case h of + { [] -> t + ; (:) x xs -> ife (x `eqStr` v) xs t + }) [] nums + ; ins w = foldr (\h t -> case h of + { [] -> t + ; (:) x xs -> ife (w `elemStr` xs) (x:t) t + }) [] nums + } in concatMap (++ "\n") (map unwords (scc ins outs (concat nums))); diff --git a/2019/mills/Eugene_Onegin.cp11_1.188 b/2019/mills/Eugene_Onegin.cp11_1.188 new file mode 100644 index 000000000..7b9b2a420 Binary files /dev/null and b/2019/mills/Eugene_Onegin.cp11_1.188 differ diff --git a/2019/mills/Eugene_Onegin.txt.gz b/2019/mills/Eugene_Onegin.txt.gz new file mode 100644 index 000000000..ca107c879 Binary files /dev/null and b/2019/mills/Eugene_Onegin.txt.gz differ diff --git a/2019/mills/IOCCC-Rules-Guidelines.cp98_0.175 b/2019/mills/IOCCC-Rules-Guidelines.cp98_0.175 new file mode 100644 index 000000000..b4dddbbc1 Binary files /dev/null and b/2019/mills/IOCCC-Rules-Guidelines.cp98_0.175 differ diff --git a/2019/mills/IOCCC-Rules-Guidelines.txt.gz b/2019/mills/IOCCC-Rules-Guidelines.txt.gz new file mode 100644 index 000000000..c2bcc219c Binary files /dev/null and b/2019/mills/IOCCC-Rules-Guidelines.txt.gz differ diff --git a/2019/mills/IOCCC-hints.cp09_1.809 b/2019/mills/IOCCC-hints.cp09_1.809 new file mode 100644 index 000000000..ab521ef97 Binary files /dev/null and b/2019/mills/IOCCC-hints.cp09_1.809 differ diff --git a/2019/mills/IOCCC-hints.txt.gz b/2019/mills/IOCCC-hints.txt.gz new file mode 100644 index 000000000..517ea4a7f Binary files /dev/null and b/2019/mills/IOCCC-hints.txt.gz differ diff --git a/2019/mills/Makefile b/2019/mills/Makefile new file mode 100644 index 000000000..d7c1094f8 --- /dev/null +++ b/2019/mills/Makefile @@ -0,0 +1,707 @@ +#!/usr/bin/env make +# +# 2019 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + +############################# +# shell used by this Makefile +############################# +# +SHELL= /bin/bash + +####################### +# common tool locations +####################### +# +A2P= a2p +AR= ar +ASA= asa +AT= at +ATQ= atq +ATRM= atrm +AWK= awk +BANNER= banner +BASE64= base64 +BASENAME= basename +BATCH= batch +BC= bc +BINHEX= binhex +BISON= bison +BUNZIP2= bunzip2 +BZCAT= bzcat +BZCMP= bzcmp +BZDIFF= bzdiff +BZEGREP= bzegrep +BZFGREP= bzfgrep +BZGREP= bzgrep +BZIP2= bzip2 +BZLESS= bzless +BZMORE= bzmore +C2PH= c2ph +C89= c89 +C99= c99 +CAL= cal +CALC= calc +CAT= cat +CD= cd +CHFLAGS= chflags +CHGRP= chgrp +CHMOD= chmod +CKSUM= cksum +CLANG= clang +CLANG_PLUSPLUS= clang++ +CLEAR= clear +CMP= cmp +COL= col +COLLDEF= colldef +COLRM= colrm +COLUMN= column +COMPRESS= compress +CP= cp +CPIO= cpio +CPP= cpp +CRC32= crc32 +CSH= csh +CSPLIT= csplit +CURL= curl +CUT= cut +C_PLUSPLUS= c++ +C_PLUSPLUS_FILT= c++filt +DATE= date +DC= dc +DD= dd +DF= df +DIFF3= diff3 +DIFF= diff +DIG= dig +DIRNAME= dirname +ED= ed +EGREP= egrep +ENV= env +EQN= eqn +ETAGS= etags +EXPECT= expect +EXPR= expr +FALSE= false +FGREP= fgrep +FILE= file +FIND2PERL= find2perl +FIND= find +FLEX= flex +FLEX_PLUSPLUS= flex++ +FMT= fmt +FOLD= fold +FS_USAGE= fs_usage +FUNZIP= funzip +FUSER= fuser +GCC= gcc +GDIFFMK= gdiffmk +GENCAT= gencat +GENSTRINGS= genstrings +GETOPT= getopt +GETOPTS= getopts +GNUMAKE= gnumake +GREP= grep +GROFF= groff +GROFFER= groffer +GROG= grog +GROPS= grops +GROTTY= grotty +GUNZIP= gunzip +GVIM= gvim +GZCAT= gzcat +GZEXE= gzexe +GZIP_PROG= gzip +G_PLUSPLUS= g++ +H2PH= h2ph +H2XS= h2xs +HASH= hash +HEAD= head +HOSTNAME_PROG= hostname +ICONV= iconv +ID= id +INDENT= indent +INFO= info +JOT= jot +KILL= kill +KSH= ksh +LAST= last +LD= ld +LESSECHO= lessecho +LEX= len +LINK= link +LN= ln +LS= ls +M4= m4 +MAKE= make +MAN= man +MKDIR= mkdir +MKFIFo= mkfifo +MKTEMP= mktemp +MV= mv +NANO= nano +NASM= nasm +NEQN= neqn +NICE= nice +NL= nl +NM= nm +NOHUP= nohup +NROFF= nroff +NSLOOKUP= nslookup +OD= od +OPENSSL= openssl +PASTE= paste +PATCH= patch +PATHCHK= pathchk +PAX= pax +PERL= perl +PICO= pico +PR= pr +PRINTENV= printenv +PS= ps +PTAR= ptar +PTARDIFF= ptardiff +PTARGREP= ptargrep +PWD= pwd +PYDOC= pydoc +PYTHON= python +PYTHONW= pythonw +READLINK= readlink +RENICE= renice +RESET= reset +REV= rev +RI= ri +RM= rm +RMDIR= rmdir +RSYNC= rsync +RUBY= ruby +RVIM= rvim +SAY= say +SCP= scp +SCREEN= screen +SCRIPT= script +SDIFF= sdiff +SED= sed +SEQ= seq +SFTP= sftp +SH= sh +SHA1= sha1 +SHA= sha +SHAR= shar +SHASUM5_18= shasum5.18 +SHASUM= shasum +SIZE= size +SLEEP= sleep +SORT= sort +SSH= ssh +STAT= stat +STRIP= strip +STTY= stty +SUM= sum +SYNC= sync +TABS= tabs +TAIL= tail +TAR= tar +TEE= tee +TEST= test +TFTP= tftp +TIDY= tidy +TIME= time +TOP= top +TOUCH= touch +TPUT= tout +TPUT= tput +TR= tr +TROFF= troff +TRUE= true +TSET= tset +TSORT= tsort +UL= ul +UNAME= uname +UNCOMPRESS= uncompress +UNEXPAND= unexpand +UNIFDEF= unifdef +UNIFDEFALL= unifdefall +UNIQ= uniq +UNITS= units +UNLINK= unlink +UNZIP= unzip +UNZIPSFX= unzipsfx +UPTIME= uptime +UUDECODE= uudecode +UUENCODE= uuencode +UUIDGEN= uuidgen +VI= vi +VIEW= view +VIM= vim +VIMDIFF= vimdiff +W= w +WAIT4PATH= wait4path +WAIT= wait +WC= wc +WHAT= what +WHATIS= whatis +WHICH= which +WHO= who +WHOAMI= whoami +WHOIS= whois +WRTIE= write +XAR= xar +XARGS= xargs +XATTR= xattr +XXD= xxd +YACC= yacc +YES= yes +ZCAT= zcat +ZCMP= zcmp +ZDIFF= zdiff +ZEGREP= zegrep +ZFGREP= zfgrep +ZFORCE= zforce +ZGREP= zgrep +ZIP= zip +ZIPCLOAK= zipcloak +ZIPGREp= zipgrep +ZIPINFo= zipinfo +ZIPNOTE= zipnote +ZIPSPLIT= zipsplit +ZLESS= zless +ZMORE= zmore +ZNEW= znew +ZPRINT= zprint +ZSH= zsh + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +#CSILENCE= -Wno-implicit-int +CSILENCE= -Wno-missing-field-initializers -Wno-for-loop-analysis + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +#CDEFINE= +#CDEFINE= -DIOCCC=26 +CDEFINE= ${param} + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +#LIBS= +#LIBS= -L ${X11_LIBDIR} +LIBS= -lm + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +INPUTS_GZ= IOCCC-hints.txt.gz Shakespeare.txt.gz \ + IOCCC-Rules-Guidelines.txt.gz Eugene_Onegin.txt.gz +INPUTS= IOCCC-hints.txt Shakespeare.txt \ + IOCCC-Rules-Guidelines.txt Eugene_Onegin.txt +CPFILES= IOCCC-hints.cp09_1.809 Shakespeare.cp04_1.633 \ + IOCCC-Rules-Guidelines.cp98_0.175 Eugene_Onegin.cp11_1.188 +OUTPUTS= IOCCC-hints.output.txt Shakespeare.output.txt \ + IOCCC-Rules-Guidelines.output.txt Eugene_Onegin.output.txt +DATA= ${CPFILES} ${INPUTS_GZ} ${CPFILES} +TARGET = lin1 per1 rnn1 rnn2 rnn3 lstm1 lstm2 lstm3 lstmp1 lstmp2 lstmp3 \ + rlstm1 rlstm2 rlstm3 gru1 gru2 gru3 prog +# +ALT_OBJ= +ALT_TARGET= + +# hyperparameters +param = -DRS=.15 -DTR=.95 -DLR=.002 -DLD=.97 -DLE=10 -DCL=5 -DB1=.9 -DB2=.999 \ + -DEP=1e-8 -DWD=8e-5 -DDI=100 -DSL=200 -DN=50 -DTP=1 \ + -DPF='"cp%02d_%.3f"' + +############################################################## +# Networks +# +# Note that temp variables have been added to force evaluation +# order. This allows checkpoint files to be portable beetween +# different compilers. +############################################################## + +# linear +lin = -DBK='y=x' + +# perceptron +per = -DBK='y=T(x)' + +# recurrent neural network +rnn = -DHS=128 -DBK=' \ + hp = I(HS), \ + t1 = L(HS, x), \ + h = C(hp, T(A(t1, L(HS, hp)))), \ + y = h \ +' + +# long short term memory +lstm = -DHS=128 -DBK=' \ + cp = I(HS), \ + hp = I(HS), \ + t1 = L(HS, x), \ + f = S(A(t1, L(HS, hp))), \ + t2 = L(HS, x), \ + i = S(A(t2, L(HS, hp))), \ + t3 = L(HS, x), \ + cn = T(A(t3, L(HS, hp))), \ + t4 = M(f, cp), \ + c = C(cp, A(t4, M(i, cn))), \ + t5 = L(HS, x), \ + o = S(A(t5, L(HS, hp))), \ + h = C(hp, M(o, T(c))), \ + y = h \ +' + +# lstm with passthrough +lstmp = -DHS=128 -DBK=' \ + cp = I(HS), \ + hp = I(HS), \ + t1 = L(HS, x), \ + t2 = A(t1, L(HS, hp)), \ + f = S(A(CM(cp), t2)), \ + t3 = L(HS, x), \ + t4 = A(t3, L(HS, hp)), \ + i = S(A(CM(cp), t4)), \ + t5 = L(HS, x), \ + cn = T(A(t5, L(HS, hp))), \ + t6 = M(f, cp), \ + c = C(cp, A(t6, M(i, cn))), \ + t7 = L(HS, x), \ + t8 = A(t7, L(HS, hp)), \ + o = S(A(CM(c), t8)), \ + h = C(hp, M(o, T(c))), \ + y = h \ +' + +# residual lstm +rlstm = -DHS=128 -DBK=' \ + cp = I(HS), \ + hp = I(HS), \ + t1 = L(HS, x), \ + t2 = A(t1, L(HS, hp)), \ + f = S(A(CM(cp), t2)), \ + t3 = L(HS, x), \ + t4 = A(t3, L(HS, hp)), \ + i = S(A(CM(cp), t4)), \ + t5 = L(HS, x), \ + cn = T(A(t5, L(HS, hp))), \ + t6 = M(f, cp), \ + c = C(cp, A(t6, M(i, cn))), \ + t7 = L(HS, x), \ + t8 = A(t7, L(HS, hp)), \ + o = S(A(CM(c), t8)), \ + m = L(HS, T(c)), \ + h = C(hp, M(o, A(m, L(HS, x)))), \ + y = h \ +' + +# gated recurrent unit +gru = -DHS=128 -DBK=' \ + hp = I(HS), \ + t1 = L(HS, x), \ + z = S(A(t1, L(HS, hp))), \ + t2 = L(HS, x), \ + r = S(A(t2, L(HS, hp))), \ + t3 = L(HS, x), \ + c = T(A(t3, L(HS, M(r, hp)))), \ + zc = OG(1, -1, z), \ + t4 = M(zc, hp), \ + h = C(hp, A(t4, M(z, c))), \ + y = h \ +' + +# single-layer network +one_layer = -DNW=' \ + x = I(n), \ + y = L(n, MD(x)) \ +' + +# two-layer network +two_layer = -DNW=' \ + x = I(n), \ + y = L(n, MD(MD(x))) \ +' + +# three-layer network +three_layer = -DNW=' \ + x = I(n), \ + y = L(n, MD(MD(MD(x)))) \ +' + +# Enumerated list of networks +# +lin1 = ${lin} ${one_layer} +per1 = ${per} ${one_layer} +rnn1 = ${rnn} ${one_layer} +rnn2 = ${rnn} ${two_layer} +rnn3 = ${rnn} ${three_layer} +lstm1 = ${lstm} ${one_layer} +lstm2 = ${lstm} ${two_layer} +lstm3 = ${lstm} ${three_layer} +lstmp1 = ${lstmp} ${one_layer} +lstmp2 = ${lstmp} ${two_layer} +lstmp3 = ${lstmp} ${three_layer} +rlstm1 = ${rlstm} ${one_layer} +rlstm2 = ${rlstm} ${two_layer} +rlstm3 = ${rlstm} ${three_layer} +gru1 = ${gru} ${one_layer} +gru2 = ${gru} ${two_layer} +gru3 = ${gru} ${three_layer} + +# default network +# +prog = ${rnn1} + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +${TARGET}: prog.c Makefile ${INPUTS} + ${CC} ${CFLAGS} -o $@ $< $($@) ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + +${INPUTS}: %.txt: %.txt.gz + ${ZCAT} < $< > $@ + +test: ${OUTPUTS} + +# First 1000 lines of generated output +# +generator = ./lstm2 + +test-64bit: IOCCC-hints.output.txt IOCCC-Rules-Guidelines.output.txt Shakespeare.output.txt Eugene_Onegin.output.txt + +IOCCC-hints.output.txt: IOCCC-hints.cp09_1.809 ${generator} + ${generator} < $< | ${HEAD} -n 1000 > $@ + +Shakespeare.output.txt: Shakespeare.cp04_1.633 ${generator} + ${generator} < $< | ${HEAD} -n 1000 > $@ + +IOCCC-Rules-Guidelines.output.txt: IOCCC-Rules-Guidelines.cp98_0.175 ${generator} + ${generator} < $< | ${HEAD} -n 1000 > $@ + +Eugene_Onegin.output.txt: Eugene_Onegin.cp11_1.188 ${generator} + ${generator} < $< | ${HEAD} -n 1000 > $@ + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +cpclean: + ${RM} -f cp*_*.* + +clobber: clean cpclean + ${RM} -f ${TARGET} ${ALT_TARGET} + ${RM} -f ${INPUTS} + ${RM} -f ${OUTPUTS} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic fc6b6af226b7cc598de3d48fc20ed0bd54f7b4f7f0f651a32b9cf8345b2a3b3f --FNV1a_hash_512_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --level 391581 --mode 216193 --FNV1a_hash_512_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore IAU, $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore, $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2019/mills/Shakespeare.cp04_1.633 b/2019/mills/Shakespeare.cp04_1.633 new file mode 100644 index 000000000..4cbfcb498 Binary files /dev/null and b/2019/mills/Shakespeare.cp04_1.633 differ diff --git a/2019/mills/Shakespeare.txt.gz b/2019/mills/Shakespeare.txt.gz new file mode 100644 index 000000000..ee8653e22 Binary files /dev/null and b/2019/mills/Shakespeare.txt.gz differ diff --git a/2019/mills/hint.html b/2019/mills/hint.html new file mode 100644 index 000000000..73cc4163b --- /dev/null +++ b/2019/mills/hint.html @@ -0,0 +1,659 @@ + + + + + + Most in need to be tweeted + + +

    Most in need to be tweeted

    + +

    Christopher Mills
    +Twitter: @MisterXopher

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +make cpclean
    +# Let this run for about about an hour and then kill it
    +./prog Shakespeare.txt
    +./prog < $(< ls -1tr cp* | tail -1) | head -100
    +
    + +

    Try:

    + +
    # If you are on a 64-bit system:
    +
    +make test-64bit
    +
    +less IOCCC-Rules-Guidelines.output.txt
    +
    +less IOCCC-hints.output.txt
    +
    +less Eugene_Onegin.output.txt
    +
    +# However, as the binary model files used to produce the output are in an implementation-specific format,
    +# your mileage may vary.
    +
    + +

    Selected Judges Remarks:

    + +

    Can a machine learn?

    + +

    Some say so.

    + +

    But can a machine learn to write like Shakespeare,

    + +

    or tweet like Trump?

    + +

    Can it write rules and guidelines for the IOCCC?

    + +

    You decide. :-)

    + +

    Author’s comments:

    + +

    Welcome to OMLET! 🍳

    + +

    OMLET is the Obfuscated Machine Learning Environment Toolkit, a +micro-framework for experimenting with recurrent neural networks. OMLET +lets you build, train and evaluate deep neural networks. Why invest +hours reading documentation and megabytes of disk space on a full-featured DNN +framework like TensorFlow or Torch when you can have full RNN +functionality in less than 4 KB!

    + +

    OMLET has the following features:

    + +
      +
    • User-programmable network configurations and hyperparameters
    • +
    • Support for various types of recurrent and feed-forward neural networks +including vanilla RNNs, LSTMs and GRUs of depths of up to 99 layers
    • +
    • No limit on parameter size (except for those imposed by the system)
    • +
    • Training and inference modes, with periodic checkpointing
    • +
    • Advanced Adam optimizer with weight decay for simplified +training
    • +
    • Hyperparamer support for batch sizing, learning rate schedule, weight +decay and gradient clipping
    • +
    • Easily extensible (requires some expertise in the C programming language)
    • +
    • Friendly markdown documentation
    • +
    + + +

    OMLET is based on Andrej Karpathy’s character-level language model +as described in his blog post The Unreasonable Effectiveness of Recurrent +Neural Networks. I’ve included a small sample dataset to use for +training, but you can have even more fun by downloading some larger datasets:

    + + + + +

    Getting started with OMLET

    + +

    OMLET has three operating modes:

    + +
      +
    • Training, which trains a network from scratch
    • +
    • Continuation, which trains starting from an existing checkpoint
    • +
    • Inference, which uses an existing trained network to make predictions
    • +
    + + +

    For your first OMLET experiment, we will try training a simple single-level +RNN to write some Shakespere plays. Start by typing

    + +
    make
    +
    + +

    After it builds, train it using

    + +
    ./prog shakespere.txt
    +
    + +

    This will immediately start outputting gibberish to the output, e.g.

    + +
    ./prog shakespere.txt
    + sins ohennAu
    +T-teooclelp tiThoWy
    +
    +g
    +nlakuafy 
    +e
    +sselW usnsofueB Aoee pasfUsuslhe ooM ot Wou moy
    +me neltAl -no IoyI mhuyakse  inT-l chu ghenn ffo? fnsoe yhyye
    +ue nnfrlass heUthole saounlcesyee pee 
    +t,
    +T0:0% 3.210888
    +o',,vU
    + An ,hTf lnm  Far rur:s moilt WoEgrv wonds mith Aog thernw
    +Rni So
    +co Nnd :
    +For an bImy pgafoun:
    +Wf'r hom wortiverita
    +int fod mous Eheledet,
    +Tho he theket nonS wnu-ang dorlaMSp
    +nrocWiSe tflg 'o.
    +T0:0% 2.995950
    +d whecedhencrysesil yr bn,
    +we hh y thiwt
    +
    +
    +hut fithlot,
    +Fmdy s he alt
    +Vh th no dh foud bobt werw:s Aotnf Fhwi't whe, eusu
    +
    +lhh thele wewcond ary soupfy wind tDont couc ths:
    +er fucwald oncli hen bos, f
    +T0:1% 2.878945
    +
    + +

    The gibberish is the networks attempt to write a play. So far, it’s not very +successful! Between the chunks of gibberish are training progress reports +that look like

    + +
    T0:1% 2.878945
    +
    + +

    This tells you that we are 1% through training epoch 0, and that the training +loss is about 2.88. As the training continues, the training loss will +reduce and the generated snippets will improve quickly:

    + +
    ses, kuth
    +LAs of the wish,
    +As, I nos you,
    +Yov not to nalll,
    +Tr tot wonds.
    +
    +First Sondy, llt lrte, our, tw.
    +
    +First.
    +
    +BRUTUS:
    +Helsting the kith gops of hoch Whay, fars surd what to,
    +The cownens golt te.
    +T0:12% 2.259114
    +eplerrotrur tandans one wiok thy or thach and cullice ded yourssting
    +And wours:
    +Whed ur surt.
    +
    +SINENIUS:
    +On we lain bith
    +rerytund: tich lon hyivetetgor.
    +
    +VOLUONIA:
    +He brich nom dove worthan then wise,
    +T0:13% 2.254926
    +
    + +

    It’s already started to figure out things about Shakespere plays – how to +spell short English words, how long lines tend to be, and that characters take +turns speaking with their names capitalized. The training loss has dropped to +2.25 and the improvement is noticeable.

    + +

    Eventually, we will finish with the training data set and move on to a +validation cycle:

    + +
    y fath onother,
    +I sucess,
    +For I me the west crare.
    +
    +TRANIO:
    +Whow and'd have not to had you you one in my lapteny she very ame come me a gut and shourd aghir you as ignested; shend to make I strem
    +To h
    +T0:99% 1.924063
    + notnce gaud and is nicked thou day, ha the dusing you disaid: in thim, you things in ere thee thus erile Iht that tare theme my hast thesp thou shay: thou not eaten-or-ho-bess resing: I the but had d
    +T0:99% 1.923128
    +V0:0% 1.678907
    +V0:9% 1.700527
    +V0:18% 1.733179
    +V0:27% 1.714891
    +V0:36% 1.716672
    +V0:45% 1.782946
    +V0:54% 1.835629
    +V0:63% 1.876108
    +V0:72% 1.906814
    +V0:81% 1.924096
    +V0:90% 1.954492
    +V0:99% 1.969287
    +serfs you'll alliencseard:
    +We
    +got you? before
    +I say.
    +
    +Farstred dentlentecaly, sir, I it one bosticield
    +All me the backnour mino,
    +Whith capitaned mid! but stell the ifvemion
    +Willerity.
    +
    +First Cumfol of
    +T1:0% 1.885619
    +
    + +

    Validation cycles are used to test the network to see if it has learned to +generalize – how well performs on data it hasn’t seen before (as opposed to +the training data that the network will see many times as it trains). Progress +on the validation set is also displayed with a validation progress report that +looks like

    + +
    V0:36% 1.716672
    +
    + +

    which means we are 36% of the way through the validation for epoch 0, and the +validation loss is about 1.72. Comparing the validation loss and the +training loss will give you an idea of how well the network is learning and +can let you know if the network is overfitting or underfitting.

    + +

    As part of the training process, the data set (which for OMLET is the +shakespere.txt file you gave on the command line) is divided into +training and validation sets (by default, 95% of the data is used for +training, but like most OMLET parameters, you can change this at compile-time).

    + +

    At the end of the validation run, OMLET writes out a checkpoint file with a +name like cp01_1.970. This saves the state of the run at the start of the +epoch 1, after computing a validation loss of 1.970. The checkpoint is +helpful if you need to stop and restart training. You can stop training by +doing Control-C.

    + +

    You can continue training from a previous checkpoint by providing the +checkpoint file name as the second parameter, for example:

    + +
    ./prog shakespere.txt cp01_1.970
    +
    + +

    After the validation cycle finishes, OMLET begins the next epoch by restarting +training at the beginning of the training set. Training continues forever, +until you quit it with Control-C. You should monitor the checkpoints to +see that the validation loss continues to drop. If it rises, the network has +probably started to overfit on the training data.

    + +

    Once you’ve trained the validation loss as low as it will go, you can use +OMLET to run the network in inference mode which uses the frozen checkpoint +parameters to generate data. Inference mode takes the checkpoint file as +standard input (not on the command line) and hence must be run with a +command like

    + +
    ./prog < cp55_1.807
    +
    + +

    Running it produces an infinite amount of generated output, until you hit +Control-C to stop it.

    + +

    Note that if you decide to change networks or use a different input file, you +will want to delete all the checkpoint files because the format depends on +both the network and the input – using the wrong checkpoint is likely to +cause a crash.

    + +

    Experimenting with different networks

    + +

    The default network for OMLET (the one you get if you type make with the +executable name prog) is the simplest recurrent neural network. It looks +like

    + +
    h = tanh(Wxh * x + Whh * h' + Bh)
    +y = Why * h + By
    +
    + +

    where

    + +
      +
    • x is the input vector
    • +
    • y is the output vector
    • +
    • h is the hidden state vector
    • +
    • h' is the previous value of h
    • +
    • Wxh, Whh, and Why are weight matrices
    • +
    • Bh and By are bias vectors.
    • +
    • tanh is the hyperbolic tangent function
    • +
    + + +

    The W’s and B’s are the trainable parameters of the network, and the +process of training is optimizing the values of these parameters to minimize +the loss of the network across the training set.

    + +

    It is the presence of the hidden state vector that allows the RNN to +“remember” the past. We can see what would happen if we removed this hidden +state. If you type

    + +
    make lin1
    +
    + +

    OMLET will create an ADALINE network that does

    + +
    y = Wxy * x + By
    +
    + +

    This simple linear feed-forward network. You can run it with

    + +
    ./lin1 shakespeare.txt
    +
    + +

    The linear network won’t be able to get past the gibberish stage, because it +lacks history:

    + +
    ./lin1 shakespeare.txt
    +UERond w,
    +
    +
    +Gir:
    +KINof s, mesther s thouth.
    +E:
    +KINTret, at fu,
    +GOMy t, as sth kesewit sooos atse ang k, ck,
    +Sotheouserivesthecowhet been's, t he, h nre; t and, har wiread of pincer cedst sur has, ut:
    +
    +T14:67% 2.465115
    +UKESpan,
    +NGaromy soreate e m esewfoure pamitherarjulthengeoly tl.
    +NG s at e! w.
    +
    +WAllinoully?
    +Wamisw ofilem:
    +I'delandinarrstath har aksubly s cath Whern t Is, weciss:
    +
    +GLat s; llde.
    +Y aterit dsthence 
    +T14:67% 2.465404
    +
    + +

    It is able to guess at what character is likely to follow the current one +(by doing a linear regression), but it lacks any history beyond that to +guide it.

    + +

    You might be wondering about the role of the tanh function in the RNN. +tanh acts as an activation function which adds nonlinearity +to the network and allows it to solve complicated problems. Without +nonlinearity, all of the linear functions would fold together into a single +matrix-vector multiply and you’d effectively regress to the linear network +above. Alas, even adding a nonlinearity to the feed-forward network +(creating a perceptron) does not improve the performance because we +still lack the history provided by the hidden state vector (although if you +want to try it yourself, you can do so with make per1).

    + +

    Going deeper

    + +

    We can try to improve the RNN’s performance by stacking RNN modules atop each +other:

    + +
    h1 = RNN(h1', x)
    +h2 = RNN(h2', h1)
    +y = Why * h2 + By
    +
    + +

    with RNN(h, x) defined as above. Each RNN module has its own set of +parameters and its own hidden state vector. This will improve the network’s +performance, at the cost of a much larger parameter space

    + +

    IMPORTANT NOTE: Since OMLET uses the system stack for network storage, +larger networks may cause OMLET to crash (typically with a message like +Segmentation fault) unless the system stack size is first increased. +The exact command for doing so depends on your shell and your system’s +hard limits. On sh/ksh/bash shells, you can view the hard limit +with ulimit -Hs and set it with ulimit -s 65532 (replacing 65532 +with the actual hard limit). On csh/tcsh shells, you can view +the hard limit with limit -h stacksize and set it with +limit stacksize 65532 (replacing 65532 with the actual hard limit).

    + +

    You can try the deeper network by doing

    + +
    make rnn2
    +
    + +

    (or even make rnn3 if you want a three-layer RNN) and train it with

    + +
    ./rnn2 shakespeare.txt
    +
    + +

    The additional depth should allow the network to make better predictions (it +can represent more complicated history), but it may take a long time to train +– both because the network (being larger) now requires more time to train and +because of the vanishing and exploding gradient problem, which might +keep it from ever reaching its potential.

    + +

    LSTMs and GRUs

    + +

    RNNs are particularly hard to train because the they are trained using +bankpropagation through time. The RNN is trained by effectively +converting it into a non-recurrent network by making many copies of it +and propagating the hidden state through the copies. During training, +the backpropagation through many clones of the network amplifies the +gradient, worsening the exploding and vanishing gradient problem.

    + +

    Long Short Term Memory networks (also called LSTMs) were developed to +solve this problem. Christopher Olah gives a good description of them +at his blog posting. You can build a two-level LSTM by doing

    + +
    make lstm2
    +
    + +

    and train with it with

    + +
    ./lstm2 shakespeare.txt
    +
    + +

    The LSTM is much easier to train because it explicitly decides how to update +its hidden state via “gates”. These gates are called

    + +
      +
    • input gate, which decides what part of the input to pay attention to
    • +
    • forget gate, which decides what part of the hidden state to forget
    • +
    • output gate, which decides what part of the hidden state is used to +produce the output
    • +
    + + +

    The basic LSTM equations are

    + +
    f = sigmoid(Wxf * x + Whf * h' + Bf)
    +i = sigmoid(Wxi * x + Whi * h' + Bi)
    +o = sigmoid(Wxo * x + Who * h' + Bo)
    +c = f * c' + i * tanh(Wxc * x + Whc * h' + Bc)
    +h = o * tanh(c)
    +
    + +

    Where

    + +
      +
    • x is the input vector
    • +
    • h is the hidden state (and the output to the next layer)
    • +
    • c is the cell state which represents the “memory” of the LSTM
    • +
    • h' and c‘ are the previous values of h and c respectively
    • +
    • f is the forget gate that tells the LSTM what portion of the hidden +state to forget
    • +
    • i is the input gate that tells the LSTM what portion of the input +vector to pay attention to
    • +
    • o is the output gate that tells the LSTM what portion of the cell +state to use to generate the hidden state
    • +
    • Wxf, Whf, Wxi, Whi, Wxo, Who, Wxc, and Whc are trainable +parameter matrices
    • +
    • Bf, Bi, Bo, and Bc are trainable bias vectors
    • +
    • tanh is the hyperbolic tangent function
    • +
    • sigmoid is the logistic function
    • +
    + + +

    There are several LSTM variants (see C. Olah’s blog post for more +examples). One important one is the gated recurrent unit. GRUs are +simplified versions of an LSTM which combine the gates together, meaning they +require fewer learned parameters. This allows them to train faster than a +generic LSTM. You can build a two-layer GRU with

    + +
    make gru2
    +
    + +

    Building your own networks

    + +

    The OMLET Makefile comes with one-, two- and three-layer RNNs, LSTMs and +GRUs, along with simpler feed-forward networks like multi-layer perceptrons and +a linear network. This isn’t the limit of OMLET’s power – you can create your +own networks by modifying the Makefile. Networks are passed in on the +compiler’s command-line by using -D directives. The network is defined by +a -DNW='...' command which consists of a series of comma-separated +assignments. For example, the simple one-layer RNN could be defined like

    + +
    -DNW=` x  = I(n), hp = I(128),                  \
    +       h  = C(hp, T(A(L(128, x), L(128, hp)))), \
    +       y  = L(n, h)'
    +
    + +

    The network declares x as an input vector (there must be a declaration for +x). It is declared as I(n), which is an input vector of size n, which +is the number of characters of the input alphabet (OMLET computes this from +the input file at the start of training). OMLET will arrange to present the +input character as a one-hot vector based on the current input +character.

    + +

    The second declaration, hp, declares the previous hidden state vector (what +we called h' above). We declare this to be of size 128 – an arbitrary +choice. A larger state vector can (theoretically) carry more state, but at +a cost of larger parameter matrices and longer training time. You can +experiment with increasing the hidden vector size and see.

    + +

    The third line is the core of the RNN. It sets h, the hidden vector output +to be the sum of two linear elements specified by L. The L function +takes two parameters – the output vector size (which must match the size of +h) and the input vector. L will compute y = W * x + B where each L +has its own W (weight) and B (bias) training parameters. Both x and +hp are sent through L and the result passed through the A function, +which does vector addition. That result is passed through T which does +element-wise tanh activation.

    + +

    Next, we wrap the whole thing with the C function. C connects hp +with h, causing the new value of h to be passed to the hp vector on +the next iteration of the algorithm (allowing the RNN to retain state in h).

    + +

    Finally, the whole result is passed through another instance of L, this time +producing a vector of size n, which will have the negative log +likelihood function. This is assigned to y, which is the output of +the network (and hence must also be declared).

    + +

    OMLET will take the y result and pass it through the softmax function, +which converts the log probabilities into a probability distribution. In +inference mode, this is used to select the next character to emit. In +training mode, this is used to generate the loss which is backpropagated.

    + +

    As an example of a more complicated network, we can look at a two-layer +GRU network:

    + +
    -DHS=128,                                 \
    +-DNW=' x  = I(n),                         \
    +       y  = L(n, MD(MD(x)))'              \
    +-DBK=' hp = I(HS),                        \
    +       z  = S(A(L(HS, x), L(HS, hp))),    \
    +       r  = S(A(L(HS, x), L(HS, hp))),    \
    +       c  = T(A(L(HS, x), L(HS, hp))),    \
    +       zc = OG(1, -1, z),                 \
    +       h  = C(hp, A(M(zc, hp), M(z, c))), \
    +       y  = h'
    +
    + +

    We are using a few new tricks here – first, we are defining HS as the size +of the hidden and cell vectors. There’s nothing special about this name, its +just convenient to specify it so we don’t have a bunch of constants in the +code. Second, the network itself is very simple – it declares x and has +the matrix that converts the HS-sized hidden vector back to the n-sized +alphabet vector… but it now calls MD, which is the user-definable +module (here we are using it twice, to have two cascaded GRU blocks). The +MD function performs the sub-network defined by the BK compile-time +parameter (specified in the -DBK='...' setting). This sub-module again +takes an x parameter and produces a y output. Inside it, we declare +hp and h, the previous and current state vector, plus equations for the +various GRU gates (these use S for the sigmoid activation function). +One final new call is OG which does offset and gain, performing +y = offset + gain * x where offset (the first parameter) and gain (the +second) are constants. We are using this here to compute (1 - z) for the +GRU’s linear interpolator.

    + +

    The full set of available function blocks follows:

    + +
      +
    • I(s): declares a vector (input or state) of size s
    • +
    • L(s, x): learnable linear function y = W * x + B with an output vector +size of s
    • +
    • CM(x): learnable element-wise gain function y = W * x
    • +
    • A(a, b): element-wise add: y = a + b
    • +
    • M(a, b): element-wise multiply: y = a * b
    • +
    • S(x): sigmoid activation function y = sigmoid(x)
    • +
    • T(x): hyperbolic tangent activation function y = tanh(x)
    • +
    • C(xp, x): copy x to xp in the next time step (propagate through + time)
    • +
    • OG(o, g, x): apply a constant offset and gain: y = o + g * x
    • +
    • MD(x): apply the sub-network specified by BK
    • +
    + + +

    Note: even if you don’t use MD in your network, you should still define +BK by adding -DBK='y=x' to the command line, otherwise you will get a +compile-time error.

    + +

    Hyperparameters

    + +

    OMLET has a large number of training and inference parameters which can be +changed by the user. All of these are set by -D on the compile command line. +The list of hyperparameters follows:

    + +
      +
    • TP: Temperature parameter for use in inference mode. This divides the +log probabilities before softmax. A low temperature makes the model choose +safer but more boring choices. A high temperature takes more risks but +makes more mistakes. Default is 1.0, which uses the computed +probabilities.
    • +
    • ‘N’: Batch size. This is the number of times the RNN is unrolled, so it +controls how far back in the past the RNN can see. The default is 50. +Larger batch sizes update the weights less frequently and allow the RNN to +see farther back in time, but at a cost of proportionally more memory.
    • +
    • TR: The percentage of batches in the input data set that will be used +for training. The default value of 0.95 sets this as 95%.
    • +
    • LR: The initial learning rate, The default is 0.002.
    • +
    • LE: The epoch where the learning rate will start decaying. Defaults to +epoch 10.
    • +
    • LD: Learning rate decay, per epoch (after LE epochs). The learning +rate is scaled by this number. Default is 0.97
    • +
    • WD: Weight-decay parameter, to promote regularizaiton. The default +is 0.00008.
    • +
    • RS: The random scale for weight initialization. Weight parameters will +be initialized to be between -RS to +RS. The default is 0.15.
    • +
    • CL: Clamp value for gradients. Gradients will be limited to the range +-CL to +CL. Default is 5.
    • +
    • B1: Momentum mean parameter for Adam optimizer. Set to 0.9.
    • +
    • B2: Momentum variance parameter for Adam optimizer, Set to 0.999.
    • +
    • EP: Epsilon parameter for Adam, to provide numerical stability. Set to +0.00000001.
    • +
    • DI: How often to print a training or validation progress message and +inference snippet. The default prints every 100 training batches.
    • +
    • SL: The number of characters to print when doing an inference snippet. +Default is 200.
    • +
    • PF: Format string for the checkpoint filename. The default is +"cp%02d_%.3f" which includes the epoch and validation loss. You may +wish to add a subdirectory to the name to keep checkpoint files out of +the current directory.
    • +
    + + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2019, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2019/mills/hint.text b/2019/mills/hint.text new file mode 100644 index 000000000..efb43b696 --- /dev/null +++ b/2019/mills/hint.text @@ -0,0 +1,636 @@ +# Most in need to be tweeted + +Christopher Mills +Twitter: @MisterXopher + + +## Judges' comments: +### To use: + + make + + make cpclean + # Let this run for about about an hour and then kill it + ./prog Shakespeare.txt + ./prog < $(< ls -1tr cp* | tail -1) | head -100 + +### Try: + + # If you are on a 64-bit system: + + make test-64bit + + less IOCCC-Rules-Guidelines.output.txt + + less IOCCC-hints.output.txt + + less Eugene_Onegin.output.txt + + # However, as the binary model files used to produce the output are in an implementation-specific format, + # your mileage may vary. + +### Selected Judges Remarks: + +Can a machine learn? + +Some say so. + +But can a machine learn to write like Shakespeare, + +or tweet like [Trump](http://trumptwitterarchive.com)? + +Can it write rules and guidelines for the IOCCC? + +You decide. :-) + + +## Author's comments: + +Welcome to OMLET! 🍳 +================= + +OMLET is the _Obfuscated Machine Learning Environment Toolkit_, a +micro-framework for experimenting with [recurrent neural networks][1]. OMLET +lets you build, train and evaluate [deep neural networks][2]. Why invest +hours reading documentation and megabytes of disk space on a full-featured DNN +framework like [TensorFlow][3] or [Torch][4] when you can have full RNN +functionality in less than 4 KB! + +OMLET has the following features: + + + User-programmable network configurations and hyperparameters + + Support for various types of recurrent and feed-forward neural networks + including vanilla RNNs, LSTMs and GRUs of depths of up to 99 layers + + No limit on parameter size (except for those imposed by the system) + + Training and inference modes, with periodic checkpointing + + Advanced [Adam][42] optimizer with [weight decay][43] for simplified + training + + Hyperparamer support for batch sizing, learning rate schedule, weight + decay and gradient clipping + + Easily extensible (requires some expertise in the C programming language) + + Friendly markdown documentation + +OMLET is based on [Andrej Karpathy's][40] [character-level language model][41] +as described in his blog post [_The Unreasonable Effectiveness of Recurrent +Neural Networks_][44]. I've included a small sample dataset to use for +training, but you can have even more fun by downloading some larger datasets: + + + [Linux kernel source][30] + + [_War and Peace_][31] + + [Donald Trump's 2016 campaign speeches][32] + + +Getting started with OMLET +-------------------------- + +OMLET has three operating modes: + + + _Training_, which trains a network from scratch + + _Continuation_, which trains starting from an existing checkpoint + + _Inference_, which uses an existing trained network to make predictions + +For your first OMLET experiment, we will try training a simple single-level +RNN to write some [Shakespere][5] plays. Start by typing + + make + +After it builds, train it using + + ./prog shakespere.txt + +This will immediately start outputting gibberish to the output, e.g. + + ./prog shakespere.txt + sins ohennAu + T-teooclelp tiThoWy + + g + nlakuafy + e + sselW usnsofueB Aoee pasfUsuslhe ooM ot Wou moy + me neltAl -no IoyI mhuyakse inT-l chu ghenn ffo? fnsoe yhyye + ue nnfrlass heUthole saounlcesyee pee + t, + T0:0% 3.210888 + o',,vU + An ,hTf lnm Far rur:s moilt WoEgrv wonds mith Aog thernw + Rni So + co Nnd : + For an bImy pgafoun: + Wf'r hom wortiverita + int fod mous Eheledet, + Tho he theket nonS wnu-ang dorlaMSp + nrocWiSe tflg 'o. + T0:0% 2.995950 + d whecedhencrysesil yr bn, + we hh y thiwt + + + hut fithlot, + Fmdy s he alt + Vh th no dh foud bobt werw:s Aotnf Fhwi't whe, eusu + + lhh thele wewcond ary soupfy wind tDont couc ths: + er fucwald oncli hen bos, f + T0:1% 2.878945 + +The gibberish is the networks attempt to write a play. So far, it's not very +successful! Between the chunks of gibberish are training progress reports +that look like + + T0:1% 2.878945 + +This tells you that we are 1% through training epoch 0, and that the training +[loss][6] is about 2.88. As the training continues, the training loss will +reduce and the generated snippets will improve quickly: + + ses, kuth + LAs of the wish, + As, I nos you, + Yov not to nalll, + Tr tot wonds. + + First Sondy, llt lrte, our, tw. + + First. + + BRUTUS: + Helsting the kith gops of hoch Whay, fars surd what to, + The cownens golt te. + T0:12% 2.259114 + eplerrotrur tandans one wiok thy or thach and cullice ded yourssting + And wours: + Whed ur surt. + + SINENIUS: + On we lain bith + rerytund: tich lon hyivetetgor. + + VOLUONIA: + He brich nom dove worthan then wise, + T0:13% 2.254926 + +It's already started to figure out things about Shakespere plays -- how to +spell short English words, how long lines tend to be, and that characters take +turns speaking with their names capitalized. The training loss has dropped to +2.25 and the improvement is noticeable. + +Eventually, we will finish with the training data set and move on to a +validation cycle: + + y fath onother, + I sucess, + For I me the west crare. + + TRANIO: + Whow and'd have not to had you you one in my lapteny she very ame come me a gut and shourd aghir you as ignested; shend to make I strem + To h + T0:99% 1.924063 + notnce gaud and is nicked thou day, ha the dusing you disaid: in thim, you things in ere thee thus erile Iht that tare theme my hast thesp thou shay: thou not eaten-or-ho-bess resing: I the but had d + T0:99% 1.923128 + V0:0% 1.678907 + V0:9% 1.700527 + V0:18% 1.733179 + V0:27% 1.714891 + V0:36% 1.716672 + V0:45% 1.782946 + V0:54% 1.835629 + V0:63% 1.876108 + V0:72% 1.906814 + V0:81% 1.924096 + V0:90% 1.954492 + V0:99% 1.969287 + serfs you'll alliencseard: + We + got you? before + I say. + + Farstred dentlentecaly, sir, I it one bosticield + All me the backnour mino, + Whith capitaned mid! but stell the ifvemion + Willerity. + + First Cumfol of + T1:0% 1.885619 + +Validation cycles are used to test the network to see if it has learned to +generalize -- how well performs on data it hasn't seen before (as opposed to +the training data that the network will see many times as it trains). Progress +on the validation set is also displayed with a validation progress report that +looks like + + V0:36% 1.716672 + +which means we are 36% of the way through the validation for epoch 0, and the +validation loss is about 1.72. Comparing the validation loss and the +training loss will give you an idea of how well the network is learning and +can let you know if the network is [overfitting or underfitting][7]. + +As part of the training process, the data set (which for OMLET is the +`shakespere.txt` file you gave on the command line) is divided into +[training and validation sets][8] (by default, 95% of the data is used for +training, but like most OMLET parameters, you can change this at compile-time). + +At the end of the validation run, OMLET writes out a checkpoint file with a +name like `cp01_1.970`. This saves the state of the run at the start of the +epoch 1, after computing a validation loss of 1.970. The checkpoint is +helpful if you need to stop and restart training. You can stop training by +doing `Control-C`. + +You can continue training from a previous checkpoint by providing the +checkpoint file name as the second parameter, for example: + + ./prog shakespere.txt cp01_1.970 + +After the validation cycle finishes, OMLET begins the next epoch by restarting +training at the beginning of the training set. Training continues forever, +until you quit it with `Control-C`. You should monitor the checkpoints to +see that the validation loss continues to drop. If it rises, the network has +probably started to overfit on the training data. + +Once you've trained the validation loss as low as it will go, you can use +OMLET to run the network in inference mode which uses the frozen checkpoint +parameters to generate data. Inference mode takes the checkpoint file as +*standard input* (not on the command line) and hence must be run with a +command like + + ./prog < cp55_1.807 + +Running it produces an infinite amount of generated output, until you hit +`Control-C` to stop it. + +Note that if you decide to change networks or use a different input file, you +will want to delete all the checkpoint files because the format depends on +both the network and the input -- using the wrong checkpoint is likely to +cause a crash. + +Experimenting with different networks +------------------------------------- + +The default network for OMLET (the one you get if you type `make` with the +executable name `prog`) is the simplest recurrent neural network. It looks +like + + h = tanh(Wxh * x + Whh * h' + Bh) + y = Why * h + By + +where + + * `x` is the *input vector* + * `y` is the *output vector* + * `h` is the *hidden state vector* + * `h'` is the previous value of `h` + * `Wxh`, `Whh`, and `Why` are *weight matrices* + * `Bh` and `By` are *bias vectors*. + * `tanh` is the [hyperbolic tangent function][9] + +The `W`'s and `B`'s are the trainable parameters of the network, and the +process of training is optimizing the values of these parameters to minimize +the loss of the network across the training set. + +It is the presence of the hidden state vector that allows the RNN to +"remember" the past. We can see what would happen if we removed this hidden +state. If you type + + make lin1 + +OMLET will create an [ADALINE][10] network that does + + y = Wxy * x + By + +This simple [linear][11] [feed-forward network][12]. You can run it with + + ./lin1 shakespeare.txt + +The linear network won't be able to get past the gibberish stage, because it +lacks history: + + ./lin1 shakespeare.txt + UERond w, + + + Gir: + KINof s, mesther s thouth. + E: + KINTret, at fu, + GOMy t, as sth kesewit sooos atse ang k, ck, + Sotheouserivesthecowhet been's, t he, h nre; t and, har wiread of pincer cedst sur has, ut: + + T14:67% 2.465115 + UKESpan, + NGaromy soreate e m esewfoure pamitherarjulthengeoly tl. + NG s at e! w. + + WAllinoully? + Wamisw ofilem: + I'delandinarrstath har aksubly s cath Whern t Is, weciss: + + GLat s; llde. + Y aterit dsthence + T14:67% 2.465404 + +It is able to guess at what character is likely to follow the current one +(by doing a [linear regression][13]), but it lacks any history beyond that to +guide it. + +You might be wondering about the role of the `tanh` function in the RNN. +`tanh` acts as an [activation function][14] which adds [nonlinearity][15] +to the network and allows it to solve complicated problems. Without +nonlinearity, all of the linear functions would fold together into a single +matrix-vector multiply and you'd effectively regress to the linear network +above. Alas, even adding a nonlinearity to the feed-forward network +(creating a [perceptron][16]) does not improve the performance because we +still lack the history provided by the hidden state vector (although if you +want to try it yourself, you can do so with `make per1`). + +Going deeper +------------ + +We can try to improve the RNN's performance by stacking RNN modules atop each +other: + + h1 = RNN(h1', x) + h2 = RNN(h2', h1) + y = Why * h2 + By + +with `RNN(h, x)` defined as above. Each RNN module has its own set of +parameters and its own hidden state vector. This will improve the network's +performance, at the cost of a much larger parameter space + +> **IMPORTANT NOTE**: Since OMLET uses the system stack for network storage, +> larger networks may cause OMLET to crash (typically with a message like +> `Segmentation fault`) unless the system stack size is first increased. +> The exact command for doing so depends on your shell and your system's +> hard limits. On `sh`/`ksh`/`bash` shells, you can view the hard limit +> with `ulimit -Hs` and set it with `ulimit -s 65532` (replacing `65532` +> with the actual hard limit). On `csh`/`tcsh` shells, you can view +> the hard limit with `limit -h stacksize` and set it with +> `limit stacksize 65532` (replacing `65532` with the actual hard limit). + +You can try the deeper network by doing + + make rnn2 + +(or even `make rnn3` if you want a three-layer RNN) and train it with + + ./rnn2 shakespeare.txt + +The additional depth should allow the network to make better predictions (it +can represent more complicated history), but it may take a long time to train +-- both because the network (being larger) now requires more time to train and +because of the [vanishing and exploding gradient problem][17], which might +keep it from ever reaching its potential. + +LSTMs and GRUs +-------------- + +RNNs are particularly hard to train because the they are trained using +[bankpropagation through time][18]. The RNN is trained by effectively +converting it into a non-recurrent network by making many copies of it +and propagating the hidden state through the copies. During training, +the backpropagation through many clones of the network amplifies the +gradient, worsening the exploding and vanishing gradient problem. + +[Long Short Term Memory][19] networks (also called LSTMs) were developed to +solve this problem. Christopher Olah gives a good description of them +at his [blog posting][20]. You can build a two-level LSTM by doing + + make lstm2 + +and train with it with + + ./lstm2 shakespeare.txt + +The LSTM is much easier to train because it explicitly decides how to update +its hidden state via "gates". These gates are called + + * _input gate_, which decides what part of the input to pay attention to + * _forget gate_, which decides what part of the hidden state to forget + * _output gate_, which decides what part of the hidden state is used to + produce the output + +The basic LSTM equations are + + f = sigmoid(Wxf * x + Whf * h' + Bf) + i = sigmoid(Wxi * x + Whi * h' + Bi) + o = sigmoid(Wxo * x + Who * h' + Bo) + c = f * c' + i * tanh(Wxc * x + Whc * h' + Bc) + h = o * tanh(c) + +Where + + * `x` is the input vector + * `h` is the hidden state (and the output to the next layer) + * `c` is the _cell state_ which represents the "memory" of the LSTM + * `h'` and `c`' are the previous values of `h` and `c` respectively + * `f` is the _forget gate_ that tells the LSTM what portion of the hidden + state to forget + * `i` is the _input gate_ that tells the LSTM what portion of the input + vector to pay attention to + * `o` is the _output gate_ that tells the LSTM what portion of the cell + state to use to generate the hidden state + * `Wxf`, `Whf`, `Wxi`, `Whi`, `Wxo`, `Who`, `Wxc`, and `Whc` are trainable + parameter matrices + * `Bf`, `Bi`, `Bo`, and `Bc` are trainable bias vectors + * `tanh` is the hyperbolic tangent function + * `sigmoid` is the [logistic function][21] + +There are several LSTM variants (see [C. Olah's blog post][20] for more +examples). One important one is the [gated recurrent unit][22]. GRUs are +simplified versions of an LSTM which combine the gates together, meaning they +require fewer learned parameters. This allows them to train faster than a +generic LSTM. You can build a two-layer GRU with + + make gru2 + +Building your own networks +-------------------------- + +The OMLET `Makefile` comes with one-, two- and three-layer RNNs, LSTMs and +GRUs, along with simpler feed-forward networks like multi-layer perceptrons and +a linear network. This isn't the limit of OMLET's power -- you can create your +own networks by modifying the `Makefile`. Networks are passed in on the +compiler's command-line by using `-D` directives. The network is defined by +a `-DNW='...'` command which consists of a series of comma-separated +assignments. For example, the simple one-layer RNN could be defined like + + -DNW=` x = I(n), hp = I(128), \ + h = C(hp, T(A(L(128, x), L(128, hp)))), \ + y = L(n, h)' + +The network declares `x` as an input vector (there must be a declaration for +`x`). It is declared as `I(n)`, which is an input vector of size `n`, which +is the number of characters of the input alphabet (OMLET computes this from +the input file at the start of training). OMLET will arrange to present the +input character as a [one-hot][23] vector based on the current input +character. + +The second declaration, `hp`, declares the previous hidden state vector (what +we called `h'` above). We declare this to be of size 128 -- an arbitrary +choice. A larger state vector can (theoretically) carry more state, but at +a cost of larger parameter matrices and longer training time. You can +experiment with increasing the hidden vector size and see. + +The third line is the core of the RNN. It sets `h`, the hidden vector output +to be the sum of two linear elements specified by `L`. The `L` function +takes two parameters -- the output vector size (which must match the size of +`h`) and the input vector. `L` will compute `y = W * x + B` where each `L` +has its own `W` (weight) and `B` (bias) training parameters. Both `x` and +`hp` are sent through `L` and the result passed through the `A` function, +which does vector addition. That result is passed through `T` which does +element-wise `tanh` activation. + +Next, we wrap the whole thing with the `C` function. `C` connects `hp` +with `h`, causing the new value of `h` to be passed to the `hp` vector on +the next iteration of the algorithm (allowing the RNN to retain state in `h`). + +Finally, the whole result is passed through another instance of `L`, this time +producing a vector of size `n`, which will have the negative log +[likelihood][24] function. This is assigned to `y`, which is the output of +the network (and hence must also be declared). + +OMLET will take the `y` result and pass it through the [softmax][25] function, +which converts the log probabilities into a probability distribution. In +inference mode, this is used to select the next character to emit. In +training mode, this is used to generate the loss which is backpropagated. + +As an example of a more complicated network, we can look at a two-layer +GRU network: + + -DHS=128, \ + -DNW=' x = I(n), \ + y = L(n, MD(MD(x)))' \ + -DBK=' hp = I(HS), \ + z = S(A(L(HS, x), L(HS, hp))), \ + r = S(A(L(HS, x), L(HS, hp))), \ + c = T(A(L(HS, x), L(HS, hp))), \ + zc = OG(1, -1, z), \ + h = C(hp, A(M(zc, hp), M(z, c))), \ + y = h' + +We are using a few new tricks here -- first, we are defining `HS` as the size +of the hidden and cell vectors. There's nothing special about this name, its +just convenient to specify it so we don't have a bunch of constants in the +code. Second, the network itself is very simple -- it declares `x` and has +the matrix that converts the `HS`-sized hidden vector back to the `n`-sized +alphabet vector... but it now calls `MD`, which is the user-definable +module (here we are using it twice, to have two cascaded GRU blocks). The +`MD` function performs the sub-network defined by the `BK` compile-time +parameter (specified in the `-DBK='...'` setting). This sub-module again +takes an `x` parameter and produces a `y` output. Inside it, we declare +`hp` and `h`, the previous and current state vector, plus equations for the +various GRU gates (these use `S` for the sigmoid activation function). +One final new call is `OG` which does offset and gain, performing +`y = offset + gain * x` where `offset` (the first parameter) and `gain` (the +second) are constants. We are using this here to compute `(1 - z)` for the +GRU's linear interpolator. + +The full set of available function blocks follows: + + * `I(s)`: declares a vector (input or state) of size `s` + * `L(s, x)`: learnable linear function `y = W * x + B` with an output vector + size of `s` + * `CM(x)`: learnable element-wise gain function `y = W * x` + * `A(a, b)`: element-wise add: `y = a + b` + * `M(a, b)`: element-wise multiply: `y = a * b` + * `S(x)`: sigmoid activation function `y = sigmoid(x)` + * `T(x)`: hyperbolic tangent activation function `y = tanh(x)` + * `C(xp, x)`: copy `x` to `xp` in the next time step (propagate through + time) + * `OG(o, g, x)`: apply a constant offset and gain: `y = o + g * x` + * `MD(x)`: apply the sub-network specified by `BK` + +Note: even if you don't use `MD` in your network, you should still define +`BK` by adding `-DBK='y=x'` to the command line, otherwise you will get a +compile-time error. + +Hyperparameters +--------------- + +OMLET has a large number of training and inference parameters which can be +changed by the user. All of these are set by `-D` on the compile command line. +The list of hyperparameters follows: + + * `TP`: Temperature parameter for use in inference mode. This divides the + log probabilities before softmax. A low temperature makes the model choose + safer but more boring choices. A high temperature takes more risks but + makes more mistakes. Default is 1.0, which uses the computed + probabilities. + * 'N': Batch size. This is the number of times the RNN is unrolled, so it + controls how far back in the past the RNN can see. The default is 50. + Larger batch sizes update the weights less frequently and allow the RNN to + see farther back in time, but at a cost of proportionally more memory. + * `TR`: The percentage of batches in the input data set that will be used + for training. The default value of 0.95 sets this as 95%. + * `LR`: The initial learning rate, The default is 0.002. + * `LE`: The epoch where the learning rate will start decaying. Defaults to + epoch 10. + * `LD`: Learning rate decay, per epoch (after `LE` epochs). The learning + rate is scaled by this number. Default is 0.97 + * `WD`: Weight-decay parameter, to promote [regularizaiton][27]. The default + is 0.00008. + * `RS`: The random scale for weight initialization. Weight parameters will + be initialized to be between `-RS` to `+RS`. The default is 0.15. + * `CL`: Clamp value for gradients. Gradients will be limited to the range + `-CL` to `+CL`. Default is 5. + * `B1`: Momentum mean parameter for Adam optimizer. Set to 0.9. + * `B2`: Momentum variance parameter for Adam optimizer, Set to 0.999. + * `EP`: Epsilon parameter for Adam, to provide numerical stability. Set to + 0.00000001. + * `DI`: How often to print a training or validation progress message and + inference snippet. The default prints every 100 training batches. + * `SL`: The number of characters to print when doing an inference snippet. + Default is 200. + * `PF`: Format string for the checkpoint filename. The default is + `"cp%02d_%.3f"` which includes the epoch and validation loss. You may + wish to add a subdirectory to the name to keep checkpoint files out of + the current directory. + + + [1]: https://en.wikipedia.org/wiki/Recurrent_neural_network + [2]: https://en.wikipedia.org/wiki/Deep_learning + [3]: https://www.tensorflow.org + [4]: http://torch.ch + [5]: https://en.wikipedia.org/wiki/William_Shakespeare + [6]: https://en.wikipedia.org/wiki/Loss_function + [7]: https://en.wikipedia.org/wiki/Overfitting + [8]: https://en.wikipedia.org/wiki/Training,_validation,_and_test_sets + [9]: https://en.wikipedia.org/wiki/Hyperbolic_function + [10]: https://en.wikipedia.org/wiki/ADALINE + [11]: https://en.wikipedia.org/wiki/Linear_map + [12]: https://en.wikipedia.org/wiki/Feedforward_neural_network + [13]: https://en.wikipedia.org/wiki/Linear_regression + [14]: https://en.wikipedia.org/wiki/Activation_function + [15]: https://en.wikipedia.org/wiki/Nonlinear_system + [16]: https://en.wikipedia.org/wiki/Perceptron + [17]: https://en.wikipedia.org/wiki/Vanishing_gradient_problem + [18]: https://en.wikipedia.org/wiki/Backpropagation_through_time + [19]: https://en.wikipedia.org/wiki/Long_short-term_memory + [20]: http://colah.github.io/posts/2015-08-Understanding-LSTMs/ + [21]: https://en.wikipedia.org/wiki/Logistic_function + [22]: https://en.wikipedia.org/wiki/Gated_recurrent_unit + [23]: https://en.wikipedia.org/wiki/One-hot + [24]: https://en.wikipedia.org/wiki/Likelihood_function + [25]: https://en.wikipedia.org/wiki/Softmax_function + [26]: https://en.wikipedia.org/wiki/Dropout_(neural_networks) + [27]: https://en.wikipedia.org/wiki/Regularization_(mathematics) + + [30]: https://cs.stanford.edu/people/karpathy/char-rnn/linux_input.txt + [31]: https://cs.stanford.edu/people/karpathy/char-rnn/warpeace_input.txt + [32]: https://github.com/ryanmcdermott/trump-speeches + + [40]: https://cs.stanford.edu/people/karpathy/ + [41]: https://github.com/karpathy/char-rnn + [42]: https://arxiv.org/abs/1412.6980 + [43]: https://www.fast.ai/2018/07/02/adam-weight-decay/ + [44]: http://karpathy.github.io/2015/05/21/rnn-effectiveness/ + + +-------------------------------------------------------------------------------- + diff --git a/2019/mills/prog.c b/2019/mills/prog.c new file mode 100644 index 000000000..4f4aedc7e --- /dev/null +++ b/2019/mills/prog.c @@ -0,0 +1,73 @@ + + + #/*void*/include + #include/*#pragma _Atomic int*/ +/* { */struct{ int o,s; } typedef V ; +struct{ int x; V o,i,p; }typedef R; int +d,w,a,i,b, u,g,n,j,F,h; R*Q,B [99],*E=B +; V I(int s ){ V o={ d,s} ; d +=s; return +#define O ; { } } if(! n --) { { { ; } } +o; } float*p,ll=1,* q, *e,s,*r,*G,*W,y=1, +# define _ V i ){ V o= I(i .s); * E++=( R) { +*x,l,*z,m; V A(V p,_ 4,o ,p,i} ; return o; } V +X,Y; double drand48(); V C (V i,V o){ *E++=(R) +#define OO ){ P(Q->o,a=Q->i. o-n; b=Q->p .o-n\ +; r=b+W+n){ { n=Q->x O//struct volatile union { +{ 3,o,i} ; return o; } unsigned char c[256],t[ +sizeof c+N]; V M(V p,_ 5,o,p,i} ; return o ; } +struct{ float r ; short k ,p; char unsigned d[ +sizeof c]; } k={ LR} ; V S(_ 2,o,i} ; return o +; } void Z(float*p,int n){ while(n--) *p++=0; } +V L(int s,V i){ V o=I(s),p={ w,s+i.s*s } ; w+=p +#define P(v,i)n=v.o; e=G+n; p=e+v.s; q= p+d; i\ +; while(--q,p-->e)// _Alignas _Imaginary _Bool; +.s; *E++=(R){0,o,i,p}; return o; } V CM(V i){ V + o=I(a=i.s),p={ w,a} ; w+=a; *E++=(R){ 7, o,i, +p} ; return o; } void J(int c){ Z(e=G+X.o, X.s) +; c[e]++ ; for(Q=B; Qi +.s; while(n--)*p+=*r++*e[a+n]O*p=tanh(a[p]) O*p +=1/(exp(-a[p])+1)O p[a+u]=*p O*p=p[a]+b[p]O* p= +a[p]*p[b]O*p=a[p ]*Q->p.s+Q->p.o O*p=a[p]**r ++ +; } } } Z(G+d,d); P(Y,m=*e)m=fmax(m,*p); P(Y, s +=0)s+=*q=exp((*p-m)/TP); P(Y, )*q/=s; } V T(_ 1 +,o,i}; return o; } int K(int K ){ J(K); P(Y,s = +drand48( ))if((s-=*q)<0)break; return j=p-e; } +V OG(int a,int b,_ 6,o,(V){ b,a} } ; return o; +} void D(char unsigned*s){ float V[2*d]; int R +=u; u=V-G; J(c[*s++ ]); n=c[*s]; l-=log(n[++q] +--)/N; G+=u; p=d+G; if(1[s])D(s); else while(p +-->G){ p[x-G]=*p; d[p]=0; } G-=u; Q=E; while(F +B OO r++[w ]+=*q; n=Q->i .s; z=e+a +n; +while(n--){ w[r ]+=*q**--z; d[z]+=*q**r++; } O +a[q]+=*q*(1-*p**p)O q[a]+=*q*(1-*p)**p O*q+=q [ +a+u]O a[q]+=*q; q[b]+=*q O q[a]+=b[p]**q; b[q ] ++=p[a ]**q O a[q ]+=Q->p.s**q O a[q ]+=*q**r; r +++[w]+=*q**p; } } } u=R; } V MD( V x){ V BK; // +return y; } int main(int Q,char**E){ FILE*f, *o +=stdin; if(--Q){ o=fopen(2[E],"r"); f=fopen (1[ +E],"r"); while(w>-(n=getc(f))){ ++h; if(!n[ t]) +{ n[t]++; k.d[k.k]=n; n[c]=k .k++; } } } o &&f\ +read(&k,sizeof k,1,o); n=k.k; { V NW; X=x ; Y= +y; } float R[d+d],B[4*w],q[d*2]; G=x=R; W =B; Z +(W,4*w); p=W+w; while(p-->W)*p=2*drand48 ()*RS- +RS; o&&fread(W,1,sizeof B,o); Z(G,d); h /=N; i= +h*TR; h-=i; for(t[1+N]=m; Q; fclose(o) ){ rewi\ +nd(f ); while(fread(t,1 +N,1,f) ){ G= q; p=d+G; +while(p-->G)*p=p[x-G]; D(t); ungetc (j=N[t],f) +; if(F++W +){ m=fmax(-CL,fmin(CL,w[p ])); ll *=B1; p[a]=m+ +(a[p]-m)*B1; y*=B2; m*=m; b[p]= m+(p[b]-m)*B2; +*p+=(a[p]/sqrt(p[b]/(1-y)+EP)/ (ll-1)+WD**p)*k. +r; p[w]=0; } if(1>F%DI){ G=R ; z=SL+W; while(z +-->B)putchar(k.d[K(j)]); } } if(1>F%DI ){ b=F; +a=i; j=b>a; if(j){ b-=a; a= h; } printf(&j[//; +"\n%c%d:%d%% %f\n"],j[ "TV"],k.p,100*b/a,l/b +); } l*=F!=i; } /** */ char p[999]; if(LE +<=++k .p)k.r*=LD; /*if*/ sprintf(p,PF,k.p +,l/h); fwrite( &k,sizeof k, 1,o =fopen(p, +"w")); F=l =0; fwrite(B,w,/** */sizeof* +W,o); } while(putchar(k.d[K(j)]) ){ } } +/* typedef volatile long double not ; + register restrict unsigned volatile void + _Complex struct bitand*/ + diff --git a/2019/poikola/Makefile b/2019/poikola/Makefile new file mode 100644 index 000000000..996db9bc3 --- /dev/null +++ b/2019/poikola/Makefile @@ -0,0 +1,529 @@ +#!/usr/bin/env make +# +# 2019 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + +############################# +# shell used by this Makefile +############################# +# +SHELL= /bin/bash + +####################### +# common tool locations +####################### +# +A2P= a2p +AR= ar +ASA= asa +AT= at +ATQ= atq +ATRM= atrm +AWK= awk +BANNER= banner +BASE64= base64 +BASENAME= basename +BATCH= batch +BC= bc +BINHEX= binhex +BISON= bison +BUNZIP2= bunzip2 +BZCAT= bzcat +BZCMP= bzcmp +BZDIFF= bzdiff +BZEGREP= bzegrep +BZFGREP= bzfgrep +BZGREP= bzgrep +BZIP2= bzip2 +BZLESS= bzless +BZMORE= bzmore +C2PH= c2ph +C89= c89 +C99= c99 +CAL= cal +CALC= calc +CAT= cat +CD= cd +CHFLAGS= chflags +CHGRP= chgrp +CHMOD= chmod +CKSUM= cksum +CLANG= clang +CLANG_PLUSPLUS= clang++ +CLEAR= clear +CMP= cmp +COL= col +COLLDEF= colldef +COLRM= colrm +COLUMN= column +COMPRESS= compress +CP= cp +CPIO= cpio +CPP= cpp +CRC32= crc32 +CSH= csh +CSPLIT= csplit +CURL= curl +CUT= cut +C_PLUSPLUS= c++ +C_PLUSPLUS_FILT= c++filt +DATE= date +DC= dc +DD= dd +DF= df +DIFF3= diff3 +DIFF= diff +DIG= dig +DIRNAME= dirname +ED= ed +EGREP= egrep +ENV= env +EQN= eqn +ETAGS= etags +EXPECT= expect +EXPR= expr +FALSE= false +FGREP= fgrep +FILE= file +FIND2PERL= find2perl +FIND= find +FLEX= flex +FLEX_PLUSPLUS= flex++ +FMT= fmt +FOLD= fold +FS_USAGE= fs_usage +FUNZIP= funzip +FUSER= fuser +GCC= gcc +GDIFFMK= gdiffmk +GENCAT= gencat +GENSTRINGS= genstrings +GETOPT= getopt +GETOPTS= getopts +GNUMAKE= gnumake +GREP= grep +GROFF= groff +GROFFER= groffer +GROG= grog +GROPS= grops +GROTTY= grotty +GUNZIP= gunzip +GVIM= gvim +GZCAT= gzcat +GZEXE= gzexe +GZIP_PROG= gzip +G_PLUSPLUS= g++ +H2PH= h2ph +H2XS= h2xs +HASH= hash +HEAD= head +HOSTNAME_PROG= hostname +ICONV= iconv +ID= id +INDENT= indent +INFO= info +JOT= jot +KILL= kill +KSH= ksh +LAST= last +LD= ld +LESSECHO= lessecho +LEX= len +LINK= link +LN= ln +LS= ls +M4= m4 +MAKE= make +MAN= man +MKDIR= mkdir +MKFIFo= mkfifo +MKTEMP= mktemp +MV= mv +NANO= nano +NASM= nasm +NEQN= neqn +NICE= nice +NL= nl +NM= nm +NOHUP= nohup +NROFF= nroff +NSLOOKUP= nslookup +OD= od +OPENSSL= openssl +PASTE= paste +PATCH= patch +PATHCHK= pathchk +PAX= pax +PERL= perl +PICO= pico +PR= pr +PRINTENV= printenv +PS= ps +PTAR= ptar +PTARDIFF= ptardiff +PTARGREP= ptargrep +PWD= pwd +PYDOC= pydoc +PYTHON= python +PYTHONW= pythonw +READLINK= readlink +RENICE= renice +RESET= reset +REV= rev +RI= ri +RM= rm +RMDIR= rmdir +RSYNC= rsync +RUBY= ruby +RVIM= rvim +SAY= say +SCP= scp +SCREEN= screen +SCRIPT= script +SDIFF= sdiff +SED= sed +SEQ= seq +SFTP= sftp +SH= sh +SHA1= sha1 +SHA= sha +SHAR= shar +SHASUM5_18= shasum5.18 +SHASUM= shasum +SIZE= size +SLEEP= sleep +SORT= sort +SSH= ssh +STAT= stat +STRIP= strip +STTY= stty +SUM= sum +SYNC= sync +TABS= tabs +TAIL= tail +TAR= tar +TEE= tee +TEST= test +TFTP= tftp +TIDY= tidy +TIME= time +TOP= top +TOUCH= touch +TPUT= tout +TPUT= tput +TR= tr +TROFF= troff +TRUE= true +TSET= tset +TSORT= tsort +UL= ul +UNAME= uname +UNCOMPRESS= uncompress +UNEXPAND= unexpand +UNIFDEF= unifdef +UNIFDEFALL= unifdefall +UNIQ= uniq +UNITS= units +UNLINK= unlink +UNZIP= unzip +UNZIPSFX= unzipsfx +UPTIME= uptime +UUDECODE= uudecode +UUENCODE= uuencode +UUIDGEN= uuidgen +VI= vi +VIEW= view +VIM= vim +VIMDIFF= vimdiff +W= w +WAIT4PATH= wait4path +WAIT= wait +WC= wc +WHAT= what +WHATIS= whatis +WHICH= which +WHO= who +WHOAMI= whoami +WHOIS= whois +WRTIE= write +XAR= xar +XARGS= xargs +XATTR= xattr +XXD= xxd +YACC= yacc +YES= yes +ZCAT= zcat +ZCMP= zcmp +ZDIFF= zdiff +ZEGREP= zegrep +ZFGREP= zfgrep +ZFORCE= zforce +ZGREP= zgrep +ZIP= zip +ZIPCLOAK= zipcloak +ZIPGREp= zipgrep +ZIPINFo= zipinfo +ZIPNOTE= zipnote +ZIPSPLIT= zipsplit +ZLESS= zless +ZMORE= zmore +ZNEW= znew +ZPRINT= zprint +ZSH= zsh + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +#CSILENCE= +#CSILENCE= -Wno-implicit-int +CSILENCE= -Wno-gnu-label-as-value -Wno-sign-compare -Wno-unsequenced \ + -Wno-dollar-in-identifier-extension -Wno-sometimes-uninitialized + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=26 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= +ALT_TARGET= + +DOCS= poikola.tex +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + +docs: ${DOCS} + pdflatex ${DOCS} + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic fc6b6af226b7cc598de3d48fc20ed0bd54f7b4f7f0f651a32b9cf8345b2a3b3f --FNV1a_hash_512_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --level 391581 --mode 216193 --FNV1a_hash_512_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore IAU, $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore, $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them + diff --git a/2019/poikola/hint.html b/2019/poikola/hint.html new file mode 100644 index 000000000..13e68a3af --- /dev/null +++ b/2019/poikola/hint.html @@ -0,0 +1,193 @@ + + + + + + Most calendrical + + +

    Most calendrical

    + +

    Timo Poikola
    +https://ig.fi/other/ioccc
    +Twitter: @timpoiko

    + +

    Judges' comments:

    + +

    To use:

    + +
    make prog
    +./prog 512 ./prog
    +
    +sleep 86400; make clobber prog
    +./prog 512 ./prog
    +
    +sleep 86400; make clobber prog
    +./prog 512 ./prog
    +
    + +

    Try:

    + +
    If you don't have a few days, try:
    +
    +TZ=UTC24 make clobber prog
    +./prog 512 ./prog
    +
    +TZ=UTC48 make clobber prog
    +./prog 512 ./prog
    +
    + +

    Selected Judges Remarks:

    + +

    Do you have the time to see what this program does? Think again, come back and try again.

    + +

    Note that 2 can be said to be the least odd prime because it is the greatest even prime. +Moreover 2 can be also said to be the greatest odd prime because it is the least even prime.

    + +

    The source code layout and some of the variable names honors the ski jumping accomplishments of +Matti Nykänen.

    + +

    Author’s comments:

    + +

    How to build

    + +
    gcc -O0 -o prog prog.c
    +
    + +

    or

    + +
    clang -O[0123s] -o prog prog.c
    +
    + +

    Poster

    + +

    You can generate an A3 sized poster by make docs. This command creates a pdf file poikola.pdf.

    + +

    What this entry does

    + +

    An old wise man mumbled to me:

    + +

    Implement a program, which can calculate SHA-3 checksum for a file

    + +

    I think it is easy, but the wizard didn’t stop yet:

    + +

    and primes and Fibonacci numbers.

    + +

    Still easy. But the Gandalf the Grey impersonator is not ready:

    + +

    But use only main(), and do not use math.h nor predefined stuff at all. But wait, there are some more rules: This +work should reflect the extraordinary mind of Matti Nykänen, +the all-time best ski jumper and +amateur philosopher, who passed away on fourth of +February 2019.

    + +

    Oh boys.

    + +

    So, I followed the rules given by Gandalf the White and the Judges of IOCCC. Output of iocccsize, +using the 2019 version of iocccsize, is carefully selected. +For the sake of clarity, I used single letter variables in the code. I also avoided unnecessary use of functions. +Like a tripundra, this program has three levels. In order to reveal all of them, you have to compile this program +on three consecutive days.

    + +

    As this is a contest for obfuscated code, the program does not perform unnecessary checks, but either fails or gets +stuck if invoked erroneously. The program is invoked in this way: ./prog <integer> <file> in where <integer> is +224, 256, 384, 512 or even 1024. Yes, I know 1024 is not a supported length of output, but as I said, the program does +not validate its input in any way. These same parameters should be given in calculating a Fibonacci sequence or prime +numbers. Please note that maximum file size is one gigabyte.

    + +

    Obfuscation

    + +

    Matti Nykänen: Every time I jump, and I get that feeling of bon voyage, the feeling that I’ve been here +before.

    + +

    Matti Nykänen: When you are about to jump, you are all alone and have to make your own decisions. Up there, +it’s all up yours.

    + +

    This code has some jumping too. I used some gotos instead of longjmp(). Some Finnish ski jumping sites are +used as labels, however, there is lahti instead of salpausselkä.

    + +

    SHA-3-512 Compatibility chart

    + +

    Tested against test vectors. +Clang-4.0: For optimization levels [0123s], the program compiles and produces correct output for every tested vector using +c11, c89, c90, c99, gnu11, gnu1x, gnu89, gnu90, gnu99, iso9899:1990, iso9899:199409, iso9899:1999 and +iso9899:2011 as argument of -std=

    + +

    Gcc-6: For optimization level 0, correct output using +c11, c99, gnu11, gnu1x, gnu89, gnu90, gnu99, iso9899:1999 and iso9899:2011

    + +

    Missing a prime

    + +

    For obvious reason, the oddest prime is missing from output.

    + +

    Observations

    + +

    Gcc and clang are very fragile compilers. I spent numerous hours trying to achieve exactly the same output from +different optimization levels and compilers. Small change in code can produce really unexpected results, i.e. the compiler +can skip a few expressions or statements without obvious reason.

    + +

    Major spoilers

    + +

    Please scroll down if you want to see spoilers.

    + +
     
    + + +

    It is commonly believed that Mike Keith’s algorithm published in Journal of +Recreational Mathematics, Vol. 22, No. 4, 1990, p. 280, is the shortest way to calculate weekday for given date. +Keith’s algorithm:
    +(d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7
    +My algorithm: I noticed that
    +(23*m/9+(m<3?y--:y-2)+d+4+y/4-y/100+y/400)%7
    +is one character shorter. In my solution, m<3?y--:y-2 is used directly, instead of assign value for d.

    + +

    Q is pronounced in Finnish exactly like “kuu”, a word for month or the Moon. So, Q = k is intended.

    + +

    Last term of outputted Fibonacci sequence is the last one smaller than 264. It is plain coincidence (but a funny) +that value of ‘^’ is 94 in ASCII table.

    + +

    For prime calculations: I recycled code from my high school C-programming course. Originally, I wrote it over 20 years +ago. My teacher said that it is (too) complicated to use bits stored in arrays, so I did it.

    + +

    Other stuff

    + +

    Cody: I really like that you enjoyed my previous entry. I hope that you will like this entry too. +Because I did not want to give too many clues to Judges, I tried to write this entry in a different way +than Most Stellar, but in this code there is at least one recycled thing from it. By the way, +answers to questions: 1. 255. 2. Try to compare binary representations of those floats and binary representation +of the string “25th IOCCC!”. 3. I don’t know. I used standard trigonometric functions from math.h for rotating the Big Dipper +and later replaced those functions with my own implementations. But there was a bug in my code and the effect was more +beautiful than intended. I did not even debug this bug and now it works as a feature. 4. It is not possible. If you +change a single bit, the Fletcher 16 checksum does not match anymore and goto jumps to end of the code.

    + +

    I see that Volker Diels-Grabsch’s winner is awarded in category Most self-aware. In last year, my entry incorporates +the Fletcher 16 algorithm to ensure integrity of code. One of my first ideas for this year was to do the same thing, +but with SHA-3. Using Fletcher 16, calculating a checksum which matches with sleeping time factor took about one minute. +I realized that SHA-3 even with 224-bit output could take too much CPU time.

    + +

    I would like to say thanks to PSP, because there were not too much interrupts during the coding phase.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2019, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2019/poikola/hint.text b/2019/poikola/hint.text new file mode 100644 index 000000000..5466bf6b0 --- /dev/null +++ b/2019/poikola/hint.text @@ -0,0 +1,150 @@ +# Most calendrical + +Timo Poikola + +Twitter: @timpoiko + + +## Judges' comments: +### To use: + + make prog + ./prog 512 ./prog + + sleep 86400; make clobber prog + ./prog 512 ./prog + + sleep 86400; make clobber prog + ./prog 512 ./prog + +### Try: + + If you don't have a few days, try: + + TZ=UTC24 make clobber prog + ./prog 512 ./prog + + TZ=UTC48 make clobber prog + ./prog 512 ./prog + +### Selected Judges Remarks: + +Do you have the time to see what this program does? Think again, come back and try again. + +Note that 2 can be said to be the least odd prime because it is the greatest even prime. +Moreover 2 can be also said to be the greatest odd prime because it is the least even prime. + +The source code layout and some of the variable names honors the ski jumping accomplishments of +[Matti Nykänen](https://en.wikipedia.org/wiki/Matti_Nyk%C3%A4nen). + +## Author's comments: +### How to build ### + gcc -O0 -o prog prog.c + +or + + clang -O[0123s] -o prog prog.c + +### Poster + +You can generate an A3 sized poster by _make docs_. This command creates a pdf file _poikola.pdf_. + +### What this entry does ### +An old wise man mumbled to me: +>Implement a program, which can calculate SHA-3 checksum for a file + +I think it is easy, but the wizard didn't stop yet: +>and primes and Fibonacci numbers. + +Still easy. But the Gandalf the Grey impersonator is not ready: +>But use only _main()_, and do not use _math.h_ nor predefined stuff at all. But wait, there are some more rules: This +work should reflect the extraordinary mind of Matti Nykänen, +the all-time best [ski jumper](https://en.wikipedia.org/wiki/Matti_Nyk%C3%A4nen) and +[amateur philosopher](http://telefinn.blogspot.com/2011/11/matti-nykanen-quotes.html), who passed away on fourth of +February 2019. + +####Oh boys. +So, I followed the rules given by Gandalf the White and the Judges of IOCCC. Output of `iocccsize`, +using the [2019 version of iocccsize](https://www.ioccc.org/2019/iocccsize.c), is carefully selected. +For the sake of clarity, I used single letter variables in the code. I also avoided unnecessary use of functions. +Like a tripundra, this program has three levels. In order to reveal all of them, you have to compile this program +on three consecutive days. + +As this is a contest for obfuscated code, the program does not perform unnecessary checks, but either fails or gets +stuck if invoked erroneously. The program is invoked in this way: ./prog `` `` in where `` is +224, 256, 384, 512 or even 1024. Yes, I know 1024 is not a supported length of output, but as I said, the program does +not validate its input in any way. These same parameters should be given in calculating a Fibonacci sequence or prime +numbers. *Please note that maximum file size is one gigabyte.* + +### Obfuscation ### +*Matti Nykänen*: Every time I jump, and I get that feeling of _bon voyage_, the feeling that I’ve been here +before. + +*Matti Nykänen*: When you are about to jump, you are all alone and have to make your own decisions. Up there, +it's all _up yours_. + +This code has some jumping too. I used some `goto`s instead of `longjmp()`. Some Finnish ski jumping sites are +used as labels, however, there is `lahti` instead of salpausselkä. + +### SHA-3-512 Compatibility chart ### +Tested against [test vectors](https://www.di-mgt.com.au/sha_testvectors.html). +Clang-4.0: For optimization levels [0123s], the program compiles and produces correct output for every tested vector using +c11, c89, c90, c99, gnu11, gnu1x, gnu89, gnu90, gnu99, iso9899:1990, iso9899:199409, iso9899:1999 and +iso9899:2011 as argument of `-std=` + +Gcc-6: For optimization level 0, correct output using +c11, c99, gnu11, gnu1x, gnu89, gnu90, gnu99, iso9899:1999 and iso9899:2011 + +### Missing a prime ### +For obvious reason, the oddest prime is missing from output. + +### Observations ### +Gcc and clang are very fragile compilers. I spent numerous hours trying to achieve exactly the same output from +different optimization levels and compilers. Small change in code can produce really unexpected results, i.e. the compiler +can skip a few expressions or statements without obvious reason. + +### Major spoilers ### +Please scroll down if you want to see spoilers. +
     
    +It is commonly believed that [Mike Keith's algorithm](http://www.cadaeic.net/calendar.htm) published in _Journal of +Recreational Mathematics_, Vol. 22, No. 4, 1990, p. 280, is the shortest way to calculate weekday for given date. +Keith's algorithm:
    +`(d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7`
    +My algorithm: I noticed that
    +`(23*m/9+(m<3?y--:y-2)+d+4+y/4-y/100+y/400)%7`
    +is one character shorter. In my solution, `m<3?y--:y-2` is used directly, instead of assign value for `d`. + +Q is pronounced in Finnish exactly like "kuu", a word for month or the Moon. So, `Q = k` is intended. + +Last term of outputted Fibonacci sequence is the last one smaller than 264. It is plain coincidence (but a funny) +that value of '^' is 94 in ASCII table. + +For prime calculations: I recycled code from my high school C-programming course. Originally, I wrote it over 20 years +ago. My teacher said that it is (too) complicated to use bits stored in arrays, so I did it. + +### Other stuff ### +Cody: I really like that you enjoyed my previous entry. I hope that you will like this entry too. +Because I did not want to give too many clues to Judges, I tried to write this entry in a different way +than Most Stellar, but in this code there is at least one recycled thing from it. By the way, +answers to questions: 1. 255. 2. Try to compare binary representations of those floats and binary representation +of the string "25th IOCCC!". 3. I don't know. I used standard trigonometric functions from `math.h` for rotating the Big Dipper +and later replaced those functions with my own implementations. But there was a bug in my code and the effect was more +beautiful than intended. I did not even debug this bug and now it works as a feature. 4. It is not possible. If you +change a single bit, the Fletcher 16 checksum does not match anymore and `goto` jumps to end of the code. + +I see that _Volker Diels-Grabsch_'s winner is awarded in category __Most self-aware__. In last year, my entry incorporates +the Fletcher 16 algorithm to ensure integrity of code. One of my first ideas for this year was to do the same thing, +but with SHA-3. Using Fletcher 16, calculating a checksum which matches with `sleeping time factor` took about one minute. +I realized that SHA-3 even with 224-bit output could take too much CPU time. + +I would like to say _thanks_ to PSP, because there were not too much interrupts during the coding phase. + +-------------------------------------------------------------------------------- + diff --git a/2019/poikola/poikola.tex b/2019/poikola/poikola.tex new file mode 100644 index 000000000..5d7d9be21 --- /dev/null +++ b/2019/poikola/poikola.tex @@ -0,0 +1,103 @@ +\documentclass[10pt]{article} +% Paper size is not really important. In this document the size is A3 from ISO 216 standard +% 297 x 420 mm (11.7 x 16.5 in) +\usepackage[a3paper,margin=3cm]{geometry} +\usepackage[pdftex,unicode]{hyperref} +\usepackage[T1]{fontenc} +\usepackage{listings} +\usepackage[usenames,dvipsnames]{xcolor} +\usepackage{textcomp} +\usepackage{bookmark} +\usepackage{fancyhdr} +\usepackage[ + type={CC}, + modifier={by-sa}, + version={3.0}, +]{doclicense} + +% headers and footers +\lhead{\large\color{NavyBlue}\textbf{26th International Obfuscated C Code Contest}} +\rhead{\large\color{NavyBlue} Winner: \textsc{Timo Poikola}\hspace{2em}Awarded in category: \textsc{Most calendrical}} + +\lfoot{\begin{tabular}{ll} + \raisebox{-20pt}\doclicenseImage & \begin{tabular}{ll}\textcopyright\hspace{1em}Copyright 1984-2019, Leo Broukhis, Simon Cooper, Landon Curt Noll - All rights reserved\\ +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.\end{tabular} +\end{tabular}} + + +\cfoot{} +\rfoot{} + +\renewcommand{\headrulewidth}{0.4pt} +\renewcommand{\footrulewidth}{0.4pt} + +\hypersetup{ + unicode=false, % non-Latin characters in Acrobat's bookmarks + pdftoolbar=true, % show Acrobat's toolbar? + pdfmenubar=true, % show Acrobat's menu? + pdffitwindow=false, % window fit to page when opened + pdfstartview={FitH}, % fits the width of the page to the window + pdftitle={IOCCC Winner}, % title + pdfauthor={Timo Poikola}, % author + pdfsubject={Most stellar}, % subject of the document + pdfcreator={Pdflatex}, % creator of the document + pdfproducer={Timo Poikola}, % producer of the document + pdfkeywords={25th} {IOCCC} {Most stellar} {2108}, % list of keywords + pdfnewwindow=true, % links in new window + colorlinks=true, % false: boxed links; true: colored links + linkcolor=BrickRed, % color of internal links + citecolor=LimeGreen, % color of links to bibliography + filecolor=magenta, % color of file links + urlcolor=NavyBlue % color of external links +} + +%Compression +\pdfminorversion=5 +\pdfcompresslevel=9 +\pdfobjcompresslevel=3 + + +\definecolor{mGreen}{rgb}{0,0.6,0} +\definecolor{mGray}{rgb}{0.5,0.5,0.5} +\definecolor{mPurple}{rgb}{0.58,0,0.82} + +\lstdefinestyle{CStyle}{ + commentstyle=\color{NavyBlue}, + keywordstyle=\color{magenta}, + numberstyle=\tiny\color{mGray}, + stringstyle=\color{mPurple}, + basicstyle=\ttfamily\footnotesize, + breakatwhitespace=false, + breaklines=false, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=8, + language=C, + showlines=true, + classoffset=1, + morekeywords={}, + keywordstyle=\color{WildStrawberry}, + classoffset=2,% starting another class + morekeywords={laajavuori,ruka,puijo,virpiniemi,vuokatti,lahti,ounasvaara,C,http}, + keywordstyle=\color{Sepia}, + classoffset=3, + morekeywords={main,typedef,union,open,puts,printf,struct,for,while,fstat,memset,mmap}, + keywordstyle=\color{PineGreen} +} + +\pagestyle{fancy} + +\begin{document} + +% Prefix all but the first line of multiline comments with "@" +\lstset{language=C, style=CStyle, +moredelim=[il][\color{NavyBlue}]{\@} +} +\lstinputlisting[lastline=47]{prog.c} + +\end{document} diff --git a/2019/poikola/prog.c b/2019/poikola/prog.c new file mode 100644 index 000000000..712c86747 --- /dev/null +++ b/2019/poikola/prog.c @@ -0,0 +1,71 @@ +#include +#include +#include +#include +#include + +#define W 48 +#define b '\b' +#define q R[2]== +#define R __DATE__ +#define n 1073741824ul +#define L (V) l[++S] << b * S +#define D (R[7]-W)*1000+(R[b]-W)*100+(R[9]-W)*10+R[10]-W +#define k q'p'?9:q'y'?5:q'n'?(R[1]=='u'?6:1):q'b'?2:q'r'?(*R=='M'?3:4):q'g'?8:q't'?10:q'v'?11:q'l'?7:12 +#define Z B |= (V) *l++ << u++ * b; +#define g for(a=0;a<5;a++) +#define o 25 +#define G a+ + +typedef unsigned long long V;V _=1ULL << 63; V d=1UL<<037; unsigned int x[ +n/16]; V m,F,u,T,a,r,H ,B,I; int main(int P, char *U[]){union{V K[o]; unsigned +char E[1]; }c ; const unsigned char *f, *l ; V X,i,e,z,A,Q,M=-~9, Y; struct stat +J; void *p; r++ ;V t,y= 0,v[5];const void*j[ ]= {&&laajavuori,&&ruka, &&puijo,&&lahti +,&&vuokatti,&&virpiniemi, &&ounasvaara};V N[o]={r, P,6,M,15,21, 28,36,45, 55,2,14, 27,41, +56,b,o,43, 62,18,39,61,20, 44};for(;U[r][a]; a++)T=T *M+U[!u][a]-W; T >>=P ; X=open(U[--P],F +); V w[o]= {_|d|32776,d|r, _|32896,_| d |32897,_|d|M, 32778,_+128,_ |32770,_ | 32771,_ |32905, +_ |139, d| 32907 , d|M,d| 32777,136,138,_|32777,_|d| 32897,d|1,32907,_|d|32768 ,_|32906,32898, +r,_}; i= fstat (X,&J); V O [o ]={M,7,11,17,18,3,5,16,b ,21,24,4,15,23,19,13, 12,P, 20,14,22,9,6,r} +; Y=H=J./*****/ st_size; p= mmap(/*TODO: FIX THIS */NULL ,H,r,r,X, u ); memset(&c,0, 200 ) ; z = b & +7; r = T/11 [O]; l=p ; for(I=2; I<= Y; x[I++>>4]|=( 1<<(I&4[N])) ); goto C; ruka: for(I=b*3; I--; +) { g v[ a ] =c .K[a]^c.K[G b-3]^ c.K[G M] ^ c.K[G 15]^ c.K[G M+M] ; g {t = v[(G 4) %5]^(v[(G 1)% +5]<<1|v[(G 1 ) %5] >> '?') ; for(A =0; A< o; A+= 5)c.K[ G A]^=t;}t=c .K[ 1] ; for ( a =0; a-24; a ++) +A =O[a],*v = c .K[A],c.K[A] =t<> (0100-N[a]),t=* v;for(A =!o; A^o; A += 5 ) {g v[a] = c.K[G +A]; g c .K[G A] ^= ~v[( G 1) %5]&v[(G P) %5];}c.K[!1] ^= w[I]; } goto *j[Q];C:for( I=P; I <=Y/P; +y=I*P) { while ( y <= Y ) x[y>>4]&=~(1 <<(y&O[12])), y +=I; do I++; while(~x[I>>4 ]&(1<<(I&15))); +}if(HP?a-P:a --)+(R[4]==32?0 +:((R[4]-W)*M))+ R[5]-45+a /4+a /0620-a/0x64)% 3]; ounasvaara: for ( I = 2 ; I<= Y; I ++) +if (x[I>>4]& (1 <<(15& I) ) ) printf( "%llu " , I);goto http; virpiniemi:for( I= !I; I-T +; ){ char s[30] ={W,W,'\0'} ;X=!!W;for(e=f[ I++]; e^0; e>>= 4)P = e & 15, s[X--]= P < +M ? W | P : P + 'W'; printf ( "%s" , s); } /* addr(ioccc) */ http://www.ioccc.org/ +return /******/ puts(""); /***/ vuokatti:for(;I ^'^';++I,printf("%llx " +,_),t =_+d,_=d, d = t) ; goto http;/*m= o/i; v[a]=a+n;return 0;*/} + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2019/rules.txt b/2019/rules.txt new file mode 100644 index 000000000..872544cb2 --- /dev/null +++ b/2019/rules.txt @@ -0,0 +1,278 @@ +| 26th International Obfuscated C Code Contest Official Rules + +| Copyright (C) 2006-2018 Leonid A. Broukhis, Simon Cooper, Landon Curt Noll + +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in +writing from the contest judges. + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: his emotions obfuscated his + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + + +| This rules file is version 2017-12-25-v25. + +| Most of the changes from the previous IOCCC rule set have +| been marked with a "|" on the left hand side of the line. + + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show the importance of programming style, in an ironic way. + * To stress C compilers with unusual code. + * To illustrate some of the subtleties of the C language. + * To provide a safe forum for poor C code. :-) + + This IOCCC runs from: + +| 2018-Dec-26 16:06:69 == 2018-Dec-26 16:07:09 UTC + to: +| 2019-Mar-15 00:86:07 == 2019-Mar-15 01:26:07 UTC + + Until the start of this IOCCC, these rules, guidelines and iocccsize.c tool + should be considered provisional BETA versions and may be adjusted + at any time. + + The IOCCC submission URL is: + + https://submit.ioccc.org/ + +| The submit URL should be active on or slightly before 2019-Jan-15 15:15:15 UTC. +| Please wait to submit your entries until after that time. + + The official rules, guidelines and iocccsize.c tool will be available + on the official IOCCC web site on or slightly before start of this IOCCC. + Please check the IOCCC web site "How to enter" link: + + http://www.ioccc.org/index.html#enter + + on or after the start of this IOCCC to be sure you are using the correct + versions of these items before using the IOCCC entry submission URL. + + +RULES: + + To help us with the volume of entries, we ask that you follow these rules: + + 1) Your entry must be a complete program. + +| 2) Size rule requires your entry to satisfy BOTH rule 2a and rule 2b: + + 2a) The size of your program source must be <= 4096 bytes in length. + + 2b) When your program source is fed as input to the current IOCCC size + tool, and the IOCCC size tool -i command line option is used, the + value printed shall not exceed 2053. + + The source to the current IOCCC size tool is found at this URL: + +| http://www.ioccc.org/2019/iocccsize.c + + 3) Submissions should be performed using the instructions outlined at: + + https://submit.ioccc.org/ + +| The submit URL should be active on or slightly before 2019-Jan-15 15:15:15 UTC. +| Please wait to submit your entries until after that time. + + 4) If your entry is selected as a winner, it will be modified as follows: + + Your 'build' instructions will be incorporated into a makefile. + + Your source code will be the file prog.c. The compiled binary + will be called prog. + + 5) Your entry must not modify the content or filename of any part of your + original entry including, but not limited to prog.c, the Makefile + (we create from your how to build instructions), as well as any data + files you submit. + + If you entry wishes to modify such content, it must first copy the + file to a new filename and then modify that copy. + + 6) I am not a rule, I am a free(void *man)! + +| while (!understand(ioccc(rule(you(are(number(6))))))) { ha_ha(); } + + 7) The obfuscated C program must be an original work that you own. + + You (the authors) must own the contents of your submission OR + you must have permission from the owners to submit their content + under the Creative Commons Attribution-ShareAlike 3.0 Unported + (CC BY-SA 3.0) license (see rule 18). + + If you submit any content that is owned by others, you MUST + detail that ownership (i.e., who owns what) and document the + permission you obtained. + +| Please note that the IOCCC size tool is not an original work. + + 8) Entries must be received prior to the end if this IOCCC which is: + +| 2019-Mar-15 08:60:07 == 2019-Mar-15 09:00:07 UTC + + A confirmation of submission will be sent to the submitter + email address before the close of the contest. + +| 9) Each person may submit up to and including 8.00000 entries per contest. + Each entry must be submitted separately. + + 10) Entries requiring human interaction to be initially compiled are + not permitted. + + 11) Programs that require special privileges (setuid, setgid, super-user, + special owner, special group, etc.) are still highly discouraged. We + do not guarantee these functions will behave as you expect on our test + platforms. If your program needs special permissions please document + them in the remarks file. + + 12) Legal abuse of the rules is somewhat encouraged. An entry that, in + the opinion of the judges, violates the rules will be disqualified. + Entries that attempt to abuse the rules must try to justify why + their rule abuse is legal in the remarks file. + + 13) Any C source that fails to compile because of unescaped octets with + the high bit set (octet value >= 128) will be rejected. + + 14) Any C source that fails to compile because of lines with trailing + control-M's (i.e., lines with a tailing octet 015) will be rejected. + + Please do not put trailing control-M's on remarks file lines. + Please check to be sure, before submitting, that you have removed + any control-M at the end of remark file lines. + + 15) When you submit your entry you must have a valid email address + that can both send and receive email. The online submission + method is a two phase process that requires the use of an + approval code. This code will be emailed to you as part of + phase 1. + + Entries submitted without a working or valid email address will + be disqualified. + + The judges are not responsible for delays in email, please plan + enough time for one automated exchange of email as part of your + submission. + + After your email address has been confirmed, the submission code will + be valid for submitting and editing the entry for the lifetime of the + competition. + + 16) You are STRONGLY encouraged to submit a previously unpublished and + original entry. Submissions that are similar to previous entries are + discouraged. As we judge anonymously, submissions that have already + been published may be disqualified. + + 17) The total size of your submission: the sum of the size of the program, + hints, comments, build and info files MUST be less than or equal + to 1048576 octets in size. + + 18) The entirety of your entry must be submitted under the Creative Commons + Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0): + + http://creativecommons.org/licenses/by-sa/3.0/ + + You must not submit anything that cannot be submitted under that license. + + 19) The remarks file must be written in markdown format. See: + + http://daringfireball.net/projects/markdown/basics + + for more information. + + We currently use "Discount" to convert markdown to HTML + + http://www.pell.portland.or.us/~orc/Code/discount/ + + 20) The how to build instructions must be in make form. + + The target of the make file must be called prog. The original + C source file must be called prog.c. + + To invoke the C compiler, use ${CC}. + To invoke the C preprocessor use ${CPP}. + + Do not assume that . (the current directory) is in the $PATH. + + Use a shell command syntax that is compatible with bash. + + Assume that commands commonly found in POSIX-like / Linux-like systems + are available in the search path. + + Do not assume any particular given value of ${CFLAGS} or other + commonly used make variables. + + 21) Your entry must not create nor modify files above the current directory + with the exception of the /tmp and the /var/tmp directories. Your entry + may create subdirectories below the current directory, or in /tmp, + or in /var/tmp provided that "." is not the first octet in any + directory name. + + 22) Catch 22: + + Your source code, data files, remarks and program output must NOT + identify the authors of your code. The judges STRONGLY prefer to + not know who is submitting entries to the IOCCC. + + Even if you are a previous IOCCC winner, catch 22 still applies. + + Identifying the authors of your entry in an obvious way anywhere + within in your code, data, remarks or program output (unless you are + Peter Honeyman or pretending to be Peter Honeyman) will be grounds + for disqualification of your entry. + + Yes, Virginia, we really mean it! + + 23) This prime rule number is reserved for future use. + + 24) Even though 24 is not prime, you should still see rule #23. + +| 25) The IOCCC rule set consists of at least 25 rules. + +| 26) Rule 26 is a rule. + + +FOR MORE INFORMATION: + + The judging will be done by Leonid A. Broukhis, Simon Cooper, + Landon Curt Noll. + + Please send questions or comments about the contest, to: + +| q.2019@ioccc.org (for questions only!) + + You must include the words: + +| ioccc 2019 question + + in the subject of your EMail message when sending EMail to the judges. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, visit the IOCCC web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + For the updates and breaking IOCCC news, you are encouraged to follow + the twitter handle: + + @IOCCC + + You do not have to be a twitter user to follow @IOCCC. Non-twitter + users should access: + + https://twitter.com/ioccc + + Non-twitter users should force their browsers to reload the above URL + to be sure they are seeing the most recent tweets. + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ diff --git a/2019/whowon.html b/2019/whowon.html new file mode 100644 index 000000000..70f4ee260 --- /dev/null +++ b/2019/whowon.html @@ -0,0 +1,139 @@ + + + + + + + + + Who won the 26th IOCCC + + + +
    IOCCC +

    The International Obfuscated C Code Contest +

    The 26th IOCCC Winners +

    +[ The judges | +IOCCC home page | +FAQ | +People who have won | +Winning entries ] + +

    + +

    +


    + +

    Here are the names and categories for the winners of the 26th IOCCC: +

    + + + +

    +


    + + + + + + + + +
    +Creative Commons License +

    This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

    +
    + + + diff --git a/2019/yang/Makefile b/2019/yang/Makefile new file mode 100644 index 000000000..3e4994c23 --- /dev/null +++ b/2019/yang/Makefile @@ -0,0 +1,524 @@ +#!/usr/bin/env make +# +# 2019 makefile +# +# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +# is licensed under: +# +# Creative Commons Attribution-ShareAlike 3.0 Unported License. +# +# See: http://creativecommons.org/licenses/by-sa/3.0/ + +############################# +# shell used by this Makefile +############################# +# +SHELL= /bin/bash + +####################### +# common tool locations +####################### +# +A2P= a2p +AR= ar +ASA= asa +AT= at +ATQ= atq +ATRM= atrm +AWK= awk +BANNER= banner +BASE64= base64 +BASENAME= basename +BATCH= batch +BC= bc +BINHEX= binhex +BISON= bison +BUNZIP2= bunzip2 +BZCAT= bzcat +BZCMP= bzcmp +BZDIFF= bzdiff +BZEGREP= bzegrep +BZFGREP= bzfgrep +BZGREP= bzgrep +BZIP2= bzip2 +BZLESS= bzless +BZMORE= bzmore +C2PH= c2ph +C89= c89 +C99= c99 +CAL= cal +CALC= calc +CAT= cat +CD= cd +CHFLAGS= chflags +CHGRP= chgrp +CHMOD= chmod +CKSUM= cksum +CLANG= clang +CLANG_PLUSPLUS= clang++ +CLEAR= clear +CMP= cmp +COL= col +COLLDEF= colldef +COLRM= colrm +COLUMN= column +COMPRESS= compress +CP= cp +CPIO= cpio +CPP= cpp +CRC32= crc32 +CSH= csh +CSPLIT= csplit +CURL= curl +CUT= cut +C_PLUSPLUS= c++ +C_PLUSPLUS_FILT= c++filt +DATE= date +DC= dc +DD= dd +DF= df +DIFF3= diff3 +DIFF= diff +DIG= dig +DIRNAME= dirname +ED= ed +EGREP= egrep +ENV= env +EQN= eqn +ETAGS= etags +EXPECT= expect +EXPR= expr +FALSE= false +FGREP= fgrep +FILE= file +FIND2PERL= find2perl +FIND= find +FLEX= flex +FLEX_PLUSPLUS= flex++ +FMT= fmt +FOLD= fold +FS_USAGE= fs_usage +FUNZIP= funzip +FUSER= fuser +GCC= gcc +GDIFFMK= gdiffmk +GENCAT= gencat +GENSTRINGS= genstrings +GETOPT= getopt +GETOPTS= getopts +GNUMAKE= gnumake +GREP= grep +GROFF= groff +GROFFER= groffer +GROG= grog +GROPS= grops +GROTTY= grotty +GUNZIP= gunzip +GVIM= gvim +GZCAT= gzcat +GZEXE= gzexe +GZIP_PROG= gzip +G_PLUSPLUS= g++ +H2PH= h2ph +H2XS= h2xs +HASH= hash +HEAD= head +HOSTNAME_PROG= hostname +ICONV= iconv +ID= id +INDENT= indent +INFO= info +JOT= jot +KILL= kill +KSH= ksh +LAST= last +LD= ld +LESSECHO= lessecho +LEX= len +LINK= link +LN= ln +LS= ls +M4= m4 +MAKE= make +MAN= man +MKDIR= mkdir +MKFIFo= mkfifo +MKTEMP= mktemp +MV= mv +NANO= nano +NASM= nasm +NEQN= neqn +NICE= nice +NL= nl +NM= nm +NOHUP= nohup +NROFF= nroff +NSLOOKUP= nslookup +OD= od +OPENSSL= openssl +PASTE= paste +PATCH= patch +PATHCHK= pathchk +PAX= pax +PERL= perl +PICO= pico +PR= pr +PRINTENV= printenv +PS= ps +PTAR= ptar +PTARDIFF= ptardiff +PTARGREP= ptargrep +PWD= pwd +PYDOC= pydoc +PYTHON= python +PYTHONW= pythonw +READLINK= readlink +RENICE= renice +RESET= reset +REV= rev +RI= ri +RM= rm +RMDIR= rmdir +RSYNC= rsync +RUBY= ruby +RVIM= rvim +SAY= say +SCP= scp +SCREEN= screen +SCRIPT= script +SDIFF= sdiff +SED= sed +SEQ= seq +SFTP= sftp +SH= sh +SHA1= sha1 +SHA= sha +SHAR= shar +SHASUM5_18= shasum5.18 +SHASUM= shasum +SIZE= size +SLEEP= sleep +SORT= sort +SSH= ssh +STAT= stat +STRIP= strip +STTY= stty +SUM= sum +SYNC= sync +TABS= tabs +TAIL= tail +TAR= tar +TEE= tee +TEST= test +TFTP= tftp +TIDY= tidy +TIME= time +TOP= top +TOUCH= touch +TPUT= tout +TPUT= tput +TR= tr +TROFF= troff +TRUE= true +TSET= tset +TSORT= tsort +UL= ul +UNAME= uname +UNCOMPRESS= uncompress +UNEXPAND= unexpand +UNIFDEF= unifdef +UNIFDEFALL= unifdefall +UNIQ= uniq +UNITS= units +UNLINK= unlink +UNZIP= unzip +UNZIPSFX= unzipsfx +UPTIME= uptime +UUDECODE= uudecode +UUENCODE= uuencode +UUIDGEN= uuidgen +VI= vi +VIEW= view +VIM= vim +VIMDIFF= vimdiff +W= w +WAIT4PATH= wait4path +WAIT= wait +WC= wc +WHAT= what +WHATIS= whatis +WHICH= which +WHO= who +WHOAMI= whoami +WHOIS= whois +WRTIE= write +XAR= xar +XARGS= xargs +XATTR= xattr +XXD= xxd +YACC= yacc +YES= yes +ZCAT= zcat +ZCMP= zcmp +ZDIFF= zdiff +ZEGREP= zegrep +ZFGREP= zfgrep +ZFORCE= zforce +ZGREP= zgrep +ZIP= zip +ZIPCLOAK= zipcloak +ZIPGREp= zipgrep +ZIPINFo= zipinfo +ZIPNOTE= zipnote +ZIPSPLIT= zipsplit +ZLESS= zless +ZMORE= zmore +ZNEW= znew +ZPRINT= zprint +ZSH= zsh + +# Set X11_LIBDIR to the directory where the X11 library resides +# +#X11_LIBDIR= /usr/X11R6/lib +#X11_LIBDIR= /usr/X11/lib +X11_LIBDIR= /opt/X11/lib + +# Set X11_INCLUDEDIR to the directory where the X11 include files reside +# +#X11_INCDIR= /usr/X11R6/include +#X11_INCDIR= /usr/X11/include +X11_INCDIR= /opt/X11/include + +# Compiler warnings +# +#CWARN= +#CWARN= -Wall +#CWARN= -Wall -Wextra +CWARN= -Wall -Wextra -pedantic ${CSILENCE} +#CWARN= -Wall -Wextra -Weverything +#CWARN= -Wall -Wextra -Weverything -pedantic +#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} + +# Silence warnings that ${CWARN} would normally complain about +# +CSILENCE= +#CSILENCE= -Wno-implicit-int + +# compiler standard +# +#CSTD= +#CSTD= -ansi +CSTD= -std=c11 + +# compiler bit architecture +# +# Some entries require 32-bitness: +# ARCH= -m32 +# +# Some entries require 64-bitness: +# ARCH= -m64 +# +# By default we assume nothing: +# +ARCH= + +# defines that are needed to compile +# +CDEFINE= +#CDEFINE= -DIOCCC=26 + +# include files that are needed to compile +# +CINCLUDE= +#CINCLUDE= -include stdlib.h +#CINCLUDE= -include stdio.h +#CINCLUDE= -include stdlib.h -include stdio.h +#CINCLUDE= -I ${X11_INCDIR} + +# optimization +# +# Most compiles will safely use -O2. Some can use only -O1 or -O. +# A few compilers have broken optimizers or this entry make break +# under those buggy optimizers and thus you may not want anything. +# Reasonable compilers will allow for -O3. +# +#OPT= +#OPT= -O +#OPT= -O1 +#OPT= -O2 +OPT= -O3 + +# default flags for ANSI C compilation +# +CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} + +# Libraries needed to build +# +LIBS= +#LIBS= -L ${X11_LIBDIR} + +# ANSI compiler +# +# Set CC to the name of your ANSI compiler. +# +# Some entries seem to need gcc. If you have gcc, set +# both CC and MAY_NEED_GCC to gcc. +# +# If you do not have gcc, set CC to the name of your ANSI compiler, and +# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just : +# to disable such programs. +# +CC= cc +#CC=clang +MAY_NEED_GCC= gcc + + +############################## +# Special flags for this entry +############################## +# +OBJ= prog.o +DATA= +TARGET= prog +# +ALT_OBJ= +ALT_TARGET= + + +################# +# build the entry +################# +# +all: ${TARGET} ${DATA} + @${TRUE} + +prog: prog.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# alternative executable +# +alt: ${ALT_TARGET} + @${TRUE} + +# data files +# +data: ${DATA} + @${TRUE} + + +############### +# utility rules +############### +# +everything: all alt + +clean: + ${RM} -f ${OBJ} ${ALT_OBJ} + +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi + +nuke: clobber + @${TRUE} + +dist_clean: nuke + @${TRUE} + +install: + @echo "Surely you are performing, Dr. May!" + @${TRUE} + +# backwards compatibility +# +build: all + @${TRUE} + + +################## +# 133t hacker rulz +################## +# +love: + @echo 'not war?' + @${TRUE} + +haste: + $(MAKE) waste + @${TRUE} + +waste: + @echo 'haste' + @${TRUE} + +make: + @echo 'Attend a maker faire' + @${TRUE} + +easter_egg: + @echo you expected to often mis-understand this $${RANDOM} magic + @echo chongo '' "/\\oo/\\" + @echo Eggy + +fabricate fashion form frame manufacture produce: make + @${TRUE} + +sandwich: + @if [ `id -u` -eq 0 ]; then \ + echo 'Okay.'; \ + echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + else \ + echo 'What? Make it yourself.'; \ + exit 1; \ + fi + +# Understand the history of the Homebrew Computer Club +# as well as the West Coast Computer Faire and +# you might be confused different. :-) +# +supernova: nuke + @-if [ -r .code_anal ]; then \ + ${RM} -f .code_anal_v6; \ + else \ + echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \ + fi + @echo A $@ helps ${MAKE} the elements that help form planets + @${TRUE} + +deep_magic: + @-if [ -r .code_anal ]; then \ + ccode_analysis --deep_magic fc6b6af226b7cc598de3d48fc20ed0bd54f7b4f7f0f651a32b9cf8345b2a3b3f --FNV1a_hash_512_bit "prog"; \ + else \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + sleep 2; \ + echo "Wrong! Do it again!"; \ + fi + @${TRUE} + +magic: deep_magic + @-if [ -r .code_anal ]; then \ + ccode_analysis --level 391581 --mode 216193 --FNV1a_hash_512_bit "prog"; \ + else \ + echo "If you don't eat yer meat, you can't have any pudding!"; \ + echo "How can you have any pudding if you don't eat yer meat?!"; \ + fi + @${TRUE} + +# The IOCCC resident astronomer states +# +charon: supernova + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore IAU, $@ is a planet + +pluto: supernova + ${MAKE} charon + @echo $@ is a dwarf planet + @echo dwarf is a type of planet + @echo therefore, $@ is a planet + @echo get used to having lots of planets because a $< can ${MAKE} a lot of them diff --git a/2019/yang/hint.html b/2019/yang/hint.html new file mode 100644 index 000000000..fd555f95b --- /dev/null +++ b/2019/yang/hint.html @@ -0,0 +1,237 @@ + + + + + + Most in need of transparency + + +

    Most in need of transparency

    + +

    Don Yang
    +http://uguu.org/

    + +

    Judges' comments:

    + +

    To use:

    + +
    make
    +
    +./prog sample_input.txt a b c d
    +
    +cat a
    +
    +cat b
    +
    +cat c
    +
    +cat d
    +
    +cat a b c d | ./prog
    +
    + +

    Try:

    + +
    ./prog prog.c a b c d e
    +
    +cat a
    +
    +cat b
    +
    +cat c
    +
    +cat d
    +
    +cat e
    +
    +cat a b c d e | ./prog
    +
    +cat a b c d e | ./prog | diff - prog.c
    +
    + +

    Selected Judges Remarks:

    + +

    Do you understand how this program works? +You may have to go over and over the output again.

    + +

    Author’s comments:

    + +

    Summary

    + +

    Scramble/unscramble to single file:

    + +
    ./prog original.txt > scrambled.txt
    +
    +./prog < scrambled.txt > unscrambled.txt
    +
    + +

    Scramble/unscramble to multiple files:

    + +
    ./prog input.txt output1.txt output2.txt ...
    +
    +cat output1.txt output2.txt ... | ./prog > unscrambled.txt
    +
    + +

    Re-scramble:

    + +
    ./prog original.txt | ./prog - > scrambled1.txt
    +./prog original.txt | ./prog - | ./prog - > scrambled2.txt
    +./prog original.txt | ./prog - | ./prog - | ... > scrambled3.txt
    +
    + +

    Scramble slowly:

    + +
    ./prog input.txt | ruby prog.c
    +
    + +

    Input must be in UTF-8 encoding.

    + +

    Details

    + +

    This is a text scrambling utility. To scramble text, specify input +file name as the first argument:

    + +
    ./prog input.txt > output.txt
    +
    + +

    If original input file was small enough to fit in your terminal, you +can simply use cat to unscramble the output text.

    + +
    cat output.txt
    +
    + +

    It might seem like nothing was scrambled, but you can try passing the +output through strings(1) and see that most of the original strings +are gone. What happened is that the original text has been shuffled +with ANSI cursor positioning codes inserted such that characters are +printed in random order. This effect is more visible if there is a +delay after each character is printed. For convenience, an utility is +included in the source to output characters slowly:

    + +
    ./prog input.txt | ruby prog.c
    +
    + +

    Scrambling order is deterministic, but you can reshuffle the output by +piping it through the same utility again, by specifying - as the +first argument:

    + +
    ./prog input.txt | ./prog - | ./prog - | ...
    +
    + +

    You can also split the input to multiple files, each getting a subset +of the original input characters:

    + +
    ./prog input.txt output1.txt output2.txt ...
    +cat output1.txt output2.txt ... > unscrambled.txt
    +
    + +

    You can only unscramble files with cat if the input fits in a single +terminal screen. If you don’t know what will be the terminal size of +the recipient, note that prog.c will fit in a 80x25 terminal, so a +good guideline is to pick files that have fewer rows and columns than +prog.c.

    + +

    For files that are larger than your terminal window, cat will not be +sufficient for unscrambling because any scrolling causes the character +positions to be misaligned. But fear not, this utility also includes +unscrambling functionality. If no argument is specified, input will +be read through stdin and unscrambled to stdout:

    + +
    ./prog < scrambled.txt > unscrambled.txt
    +
    + +

    Where this is useful is that if you scramble the input to multiple +files and unscramble each output files individually, those output +files can be printed on transparencies and distributed separately.

    + +
    ./prog input.txt output1.txt output2.txt output3.txt
    +./prog < output1.txt > layer1.txt
    +./prog < output2.txt > layer2.txt
    +./prog < output3.txt > layer3.txt
    +
    + +

    In other words, this is a utility for facilitating +visual cryptography.

    + +

    This utility can also be used just for removing trailing whitespaces +and expanding tabs to 8 spaces.

    + +
    ./prog input.txt | ./prog
    +
    + +

    Features

    + +

    UTF-8 support

    + +

    A simple text scrambling utility might not have required a screenful +of code, but this particular one natively supports UTF-8. +Specifically: individual UTF-8 byte sequences will not be split into +broken ones, and the utility is aware of full-width versus half-width +differences such that cursor is positioned correctly for most CJK +input. sample_input.txt demonstrates this feature with a mix of +Basic Latin and Japanese characters.

    + +

    Output cursor positions will most definitely be wrong for inputs +containing combining characters and right-to-left text, but it should +be possible to unscramble those text back to the original using this +same utility, since the utility is self-consistent in how cursor +positions are handled.

    + +

    Error handling

    + +

    If any file can not be opened for reading or writing, an error is +printed to stderr, and the utility will exit with nonzero status.

    + +

    If there isn’t enough memory, the utility will likely crash.

    + +

    If input contains CR-LF end of line sequences, those CRs are silently +dropped. In fact, most control codes are silently ignored except line +feeds (preserved) and tabs (expanded to 8 spaces).

    + +

    Compatibility

    + +

    Verified to work and compiles without warnings on these environments:

    + +
      +
    • gcc 7.3.0 on Linux
    • +
    • gcc 7.4.0 on Cygwin
    • +
    • clang 4.0.1-10 on Linux
    • +
    • clang 5.0.1 on Cygwin
    • +
    • gcc 4.8.4 on Linux
    • +
    + + +

    Full version

    + +

    I tried really hard to make prog.c fit in a 80x25 terminal without +wrapping. If I were not constrained by space, I would have made an +ASCII art out of it. violet.c is that program, and also comes with +the minor benefit of supporting lines longer than a million columns +depending on sizeof(int).

    + +

    Violet is named after “Violet Evergarden”, the character who is highly +skilled in writing letters.

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2019, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2019/yang/hint.text b/2019/yang/hint.text new file mode 100644 index 000000000..04b8d6691 --- /dev/null +++ b/2019/yang/hint.text @@ -0,0 +1,196 @@ +# Most in need of transparency + +Don Yang + + + +## Judges' comments: +### To use: + + make + + ./prog sample_input.txt a b c d + + cat a + + cat b + + cat c + + cat d + + cat a b c d | ./prog + +### Try: + + ./prog prog.c a b c d e + + cat a + + cat b + + cat c + + cat d + + cat e + + cat a b c d e | ./prog + + cat a b c d e | ./prog | diff - prog.c + +### Selected Judges Remarks: + +Do you understand how this program works? +You may have to go over and over the output again. + +## Author's comments: +# Summary + +Scramble/unscramble to single file: + + ./prog original.txt > scrambled.txt + + ./prog < scrambled.txt > unscrambled.txt + +Scramble/unscramble to multiple files: + + ./prog input.txt output1.txt output2.txt ... + + cat output1.txt output2.txt ... | ./prog > unscrambled.txt + +Re-scramble: + + ./prog original.txt | ./prog - > scrambled1.txt + ./prog original.txt | ./prog - | ./prog - > scrambled2.txt + ./prog original.txt | ./prog - | ./prog - | ... > scrambled3.txt + +Scramble slowly: + + ./prog input.txt | ruby prog.c + +Input must be in UTF-8 encoding. + +# Details + +This is a text scrambling utility. To scramble text, specify input +file name as the first argument: + + ./prog input.txt > output.txt + +If original input file was small enough to fit in your terminal, you +can simply use `cat` to unscramble the output text. + + cat output.txt + +It might seem like nothing was scrambled, but you can try passing the +output through `strings(1)` and see that most of the original strings +are gone. What happened is that the original text has been shuffled +with ANSI cursor positioning codes inserted such that characters are +printed in random order. This effect is more visible if there is a +delay after each character is printed. For convenience, an utility is +included in the source to output characters slowly: + + ./prog input.txt | ruby prog.c + +Scrambling order is deterministic, but you can reshuffle the output by +piping it through the same utility again, by specifying `-` as the +first argument: + + ./prog input.txt | ./prog - | ./prog - | ... + +You can also split the input to multiple files, each getting a subset +of the original input characters: + + ./prog input.txt output1.txt output2.txt ... + cat output1.txt output2.txt ... > unscrambled.txt + +You can only unscramble files with `cat` if the input fits in a single +terminal screen. If you don't know what will be the terminal size of +the recipient, note that `prog.c` will fit in a 80x25 terminal, so a +good guideline is to pick files that have fewer rows and columns than +`prog.c`. + +For files that are larger than your terminal window, `cat` will not be +sufficient for unscrambling because any scrolling causes the character +positions to be misaligned. But fear not, this utility also includes +unscrambling functionality. If no argument is specified, input will +be read through stdin and unscrambled to stdout: + + ./prog < scrambled.txt > unscrambled.txt + +Where this is useful is that if you scramble the input to multiple +files and unscramble each output files individually, those output +files can be printed on transparencies and distributed separately. + + ./prog input.txt output1.txt output2.txt output3.txt + ./prog < output1.txt > layer1.txt + ./prog < output2.txt > layer2.txt + ./prog < output3.txt > layer3.txt + +In other words, this is a utility for facilitating +[visual cryptography](https://en.wikipedia.org/wiki/Visual_cryptography). + +This utility can also be used just for removing trailing whitespaces +and expanding tabs to 8 spaces. + + ./prog input.txt | ./prog + +# Features + +## UTF-8 support + +A simple text scrambling utility might not have required a screenful +of code, but this particular one natively supports UTF-8. +Specifically: individual UTF-8 byte sequences will not be split into +broken ones, and the utility is aware of full-width versus half-width +differences such that cursor is positioned correctly for most CJK +input. `sample_input.txt` demonstrates this feature with a mix of +Basic Latin and Japanese characters. + +Output cursor positions will most definitely be wrong for inputs +containing combining characters and right-to-left text, but it should +be possible to unscramble those text back to the original using this +same utility, since the utility is self-consistent in how cursor +positions are handled. + +## Error handling + +If any file can not be opened for reading or writing, an error is +printed to stderr, and the utility will exit with nonzero status. + +If there isn't enough memory, the utility will likely crash. + +If input contains CR-LF end of line sequences, those CRs are silently +dropped. In fact, most control codes are silently ignored except line +feeds (preserved) and tabs (expanded to 8 spaces). + +## Compatibility + +Verified to work and compiles without warnings on these environments: + + * gcc 7.3.0 on Linux + * gcc 7.4.0 on Cygwin + * clang 4.0.1-10 on Linux + * clang 5.0.1 on Cygwin + * gcc 4.8.4 on Linux + +## Full version + +I tried really hard to make `prog.c` fit in a 80x25 terminal without +wrapping. If I were not constrained by space, I would have made an +ASCII art out of it. `violet.c` is that program, and also comes with +the minor benefit of supporting lines longer than a million columns +depending on `sizeof(int)`. + +Violet is named after "Violet Evergarden", the character who is highly +skilled in writing letters. + +-------------------------------------------------------------------------------- + diff --git a/2019/yang/prog.c b/2019/yang/prog.c new file mode 100644 index 000000000..4150ee992 --- /dev/null +++ b/2019/yang/prog.c @@ -0,0 +1,23 @@ +#include +#include/* +e=nil;ARGF.each_char{|c|print c;e=e ?c<"A"||c>"Z":c=="\e"?1:!(sleep 0.1)};%q{*/ +#define T(_,S,C,R,A,M,B,L,E) _ V,i,o,l,e,t=1,n[4],I[22]={4352,95,4554,1,2902,4\ +46,2,29839,1841,11171,8541,511,785,9,23,63,145,96,128,6,61466,135167},g=240,H,\ +h,p,q,x,y;typedef struct{_ x,y,z;}b;b*U,u;FILE*f;A m(_ p,_ q){_ d=(p+q)/2;C(d-\ +p){m(p,d);m(d,q);S(i=p,o=d,y=H+p;y=d||(oU[o\ +].y*1e6+U[o].x)?o++:i++,B;S(y=p,x=H+p;yl);i++);x+=2-i/22;}A a(){C(H+2>t)U=(b*)realloc(U,(t*=2\ +)*24);U[H].x=x;U[H].y=y;U[H++].z=e;p=p>y?y:p;q=q>7){S(;p>63>>o;p>>=6)n[o++]=(p&63)|128;n[o]=(g*8>>o&g)|p;}S(;o>-1;)fputc\ +(n[o--],f);}A Q(_ O){O?fprintf(f,"\33[%d%c",abs(O),V+(O>0)):0;V^=2;}R d[2]="r"\ +;_ main(_ O,R**Z){f=stdin;C(--O&&(**++Z-45||1[*Z])&&--Z&&L)M;S(*d|=5;(e=fgetc(\ +f))>0;h=h<0?e-91?e<48||e>59?l*=(e&2)-1,e>64&&e<67?y+=l,0:e<69&&(x+=l)<0?x=0:0:\ +~(l=l*10+e-48):h:h?(e=l=l<<6|(e&63),!--h)?a(),h:h:(e&224)==192?l=e&31,1:(e&g)=\ +=224?l=e&15,2:(248&e)==g?l=e&7,3:e-27?e==10?y++,x=0:e-32?e==9?x=(x+8)&~7:e>32?\ +a(),h:h:x++,h:~(l=0))V+=(V+e)<<10,V^=V>>6;E;f=stdout;C(U){C(O<1){m(0,U[H].x=H)\ +;S(h=x=0,y=p;h + +Replay text + + + + + + diff --git a/2019/yang/violet.c b/2019/yang/violet.c new file mode 100644 index 000000000..5f06e2b75 --- /dev/null +++ b/2019/yang/violet.c @@ -0,0 +1,52 @@ + #include + #/* [bbde3cf3]*/include + # define D(o,l,I)/*( C ) 2 0 1 9 */o##l##I/* + e = nil;ARGF.each_char{ | c | print c; e=e ? c < "A"|| + c >"Z": c == "\e" ?1:(!sleep 0.1 ) } ;%q{bU'*Evergarden*/ + D( t ,ype ,def ) D ( i ,n,t)_; D ( t , ypede , f ) D ( s , tru + ,ct ) { _ x , y , z ; } b ; b*U , u ; _ h ; FILE* ( f); _ H , h ,g + =6 * 40, V , i , o , l , e , t = 1,E [ 4 ] , I [22 ] = { 8 * + 4 * 17 + *8,5 * 19, 2 * D ( 7 , 5 , 9 ) * 3 , 1,2 + 5 * 4 * 5*29, 446 , 2 , ~ - (2 + *20 * 2 * (31 * 2 * 3 * 2 + 1 ) ) , 7 * ( 2*2 * 3 * 2 * ~-( 2*3 * 2 ) - 1 ) ,7 + * ~ - (4* 5 ) * 4 * + 7 * 3 - 1 , 3 * - ~(2 * 3 * 2 ) * ~ - (2*-~(2 * 3 * 2*3 + ) ) * 3,~ - ( 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 ) , 1 + 7 * 4 * 7 *4, 9 , 4 * 6 + - 1 , 63, 5 * ~ - ( 5 * 6 ) , 3 * 4 * 8,8 * 2 * 8 , 6 , ( 17* 113 * 8 * 4 - 6 ) , + 11 * 3 * 8 * 4 * 8 * 8 * 2 - 1 },p , q ,x, y ; D ( v , o , id) s ( ){u = U [ x ] , + U[x ]=U[y ] , U [ y ] = u ; } D ( v ,oi , d)m(_ p , _ q ) { _ d=( + p+q ) / 2 ;if (d + -p) {m( p ,d) ; m ( d , q ) ;D(f, o , r)( i =p,o= d , y = H + p ;y< H + q ; y ++) { x + =i>= d|| ( oU[o ] . y|| ( U[+i] . y== U [ o ].y&& U [ + i ] .x> U[ + o]. x))) ? o++ : i++ ; s ( );} for (y=p , x=H + p;y l)) ; i ++) {}x=2 + x-i /22 ;} void a (){if(H+2 > t){ U = ( b *)D(r ,ea ,lloc ) ( + U ,2* ( t*=2) *D (siz , e , of)(b ));} U[ H].x=x;U[H].y = y ; U [ H++]. z = e;p=p >y + ? y:p ; q=q0) ):0; V ^=2 ;}D(vo,i, d ) P ( _ p){;E [ o =0] = e=p +; if( p >> 7){for( ; p >63>>o; p>>=6){E[o++]= 128| ( 9 * 7 & p );}E[ o]= (g* 8>>o +& g )| p; }for(;o >- 1 ;D(f,pu, tc)(E[o--] ,f ));} D ( c , h , ar) d[2 ]="r";D(i + , n, t)r (char*u ){return (f=D(fo, pe , n) ( u , d ))? 0:(perror(u),-1); + } _ /* Q */D(m, a,in) (_ O,D( ch, a , r ) **Z ){f=stdin;if(-- + O&& ( ( **++Z) -45|| 01[ * Z ] ) &&r ( *Z)){goto X;} + D(f ,o , r ) (*d |=( 5 );(e=D(f,get + ,c) ( f ) ) - EOF ;h= h<0?e-91?e<48|| + e>59 ?l= l * ~ -(e &2),e>64&&e<67?y+=l,0 + :e<69 && (x= l + x)< 0?x=0:0:~(l=l*10+e-48 + ):h:h ?( e= l=l<< 6 |(e &63),!--h) ?a(),h:h: + 192==( 32* 7& e)?l= e & 31,1:(e&g)== 224?l=e&15, + 2: (e &248) == g?l=e & 7 ,3:e-27?e==10 ?y++,x=0:e- + 32 ?e ==9?x=(x +8)&~ 7:32< e? a() ,h:h:x++,h:~(l = 0)){V + +=( V+ e)<<10;V^= V>>6 ; } fclose(f);f=D(std, o, ut + ); if (U) {if(O<1){ m(0 , U [H].x=H);for(h= x=0 ,y = + p;h 0 ;s()){V =D(ra, n , d ) ( + ) ; y=V % -~x;}if ((-- O) ? r(*++Z) :O++){ D ( g , o + , to ) X ;};for( t=h= 0, y =q+1;h< H&&t< O ; D ( f + , clos, e )(f)) {if( t&& r (*++Z) ){;D( g , o , to + ) X ;}if (!t){; for( h=q -p+2;--h ;P(10 ) ); }for + ( V = 65 ;h 2048. These reasons + may be searched for and discovered if you are "Curios!" about 2053. :-) + Moreover, 2053 was the number of the kernel disk pack of one of the + judge's BESM-6. + + Take note that this secondary limit imposed by the IOCCC size tool + obviates some of the need to #define C reserved words in an effort + to get around the size limits of rule 2. + + Yes Virginia, that is a hint! + +| We applaud programs that do not issue warnings when compiled. +| To avoid warnings, you might be tempted to add various -Wno-foobar +| flags. Unfortunately such flags are NOT portable. Moreover, +| such flags are not consistent between different C compilers. +| Therefore we recommend that you consider one of several approaches: +| +| a) Write code that does not generate compiler warnings +| b) Do not use flags that disable compiler warnings +| c) Provide instructions (such as in your Makefile) that +| uses appropriate disable compiler warnings flags for +| both clang and gcc +| d) Do something creative + + +OUR LIKES AND DISLIKES: + + Doing masses of #defines to obscure the source has become 'old'. We + tend to 'see thru' masses of #defines due to our pre-processor tests + that we apply. Simply abusing #defines or -Dfoo=bar won't go as far + as a program that is more well rounded in confusion. + + Many C compilers dislike the following code, and so do we: + + #define d define + #d foo /* <-- don't expect this to turn into #define foo */ + + When declaring local or global variables, you should declare the type: + + int this_is_fine; + this_is_not; /* <-- Try to avoid implicit type declarations */ + + We suggest that you compile your entry with a commonly available + c11 (formerly C1X) C compiler (ISO/IEC 9899:2011). + + Do not assume that optional c11 features are supported. If you + must use an optional c11 feature, use feature test macros so + that implementations without such optional c11 features will see + an entry that is both functional and interesting. + + We like entries that have workarounds that allow someone with + an older c99 (ISO/IEC 9899:1999) compiler to be able to compile + and enjoy your entry. + + We really like "lint free" code. However lint is a toll of the past. + So try to ensure that your entry compiles warning free. If possible, + to compile compile your code using: + + -Wall -Wextra -pedantic + + For compilers, such as clang, that have the -Weverything option, try + to make your code compile warning free using: + + -Wall -Wextra -Weverything -pedantic + + If you must turn off various warnings on the compile line such as: + + ... -Wno-empty-body -Wno-return-type ... + + be sure to clearly state so in your remarks AS WELL AS in + your "how to build" / Makefile. + + All other things being equal, a program that must turn off fewer + warnings will be considered better, for certain values of better. + + Unless you clearly state otherwise in your remarks AS WELL AS in + your "how to build" / Makefile we will compile using: + + -O3 -std=c11 + + Anyone care to submit an entry that makes gratuitous use of all + of the c11 reserved words in their intended C language contexts? + NOTE: As with the use of the word Belgium, the use of certain gratuitous + c11 reserved words may be completely banned in all parts of the Galaxy, + except in one small part (ISO/IEC 9899:2011) where they might not truly + understand the implications of such words. + + http://hitchhikers.wikia.com/wiki/Belgium + http://www.bezem.de/pdf/ReservedWordsInC.pdf + + DO NOT assume that we will use gcc to compile your program. + We will first try to compile your program using Clang. + + It is much better to not use any obscure compiler flags if + you can help it. We want to discourage the use of obscure compiler + flags that would make the program less portable. + + One side effect of the above is that you cannot assume the use + of nested functions such as: + + main() { +| void please_do_not_submit_this() { +| printf("The machine that goes BING!\n"); + } +| please_do_not_submit_this(); + } + + This is because such nested functions often requires one to compile with + a flag such as -fnested-functions that is not found on some compilers. + + On 2012 July 20, the judges rescinded the encouragement of + nested functions. Such constructions, while interesting and sometimes + amusing, will have to wait until they required by a C standard that are + actually implemented in commonly used C compilers. Sorry! + +| We prefer programs that do not require a fish license: crayons and +| cat detector vans not withstanding. + + If your entry uses functions that have a variable number of + arguments, be careful. Systems implement va_list as a wide variety + of ways. Because of this, a number of operations using va_list are + not portable and must not be used: + + * assigning a non-va_list variable to/from a va_list variable + * casting a non-va_list variable into/from a va_list variable + * passing a va_list variable to a function expecting a non-va_list arg + * passing a non-va_list variable to a function expecting a va_list arg + * performing arithmetic on va_list variables + * using va_list as a structure or union + + In particular, do not treat va_list variables as if they were a char **'s. + + Avoid using . Use instead. + + On 28 January 2007, the Judges rescinded the requirement that the + '#" in a C preprocessor directive must be the 1st non-whitespace octet. + + The exit() function returns void. Some broken systems have exit() + return int, your entry should assume that exit() returns a void. + +| This guideline has a change mark at the very start of this line. + + Small programs are best when they are short, obscure and concise. + While such programs are not as complex as other winners, they do + serve a useful purpose. They are often the only program that people + attempt to completely understand. For this reason, we look for + programs that are compact, and are instructional. + + While those who are used to temperatures found on dwarf planet, + (yes Virginia, dwarf planets are planets) such as Pluto might be able to + explain to the Walrus why our seas are boiling hot, the question of + whether pigs have wings is likely to remain a debatable point to most. + + One line programs should be short one line programs: say around 80 to 120 + octets long. Going well beyond 140 octets is a bit too long to be called + a one-liner in our vague opinion. + + We tend to dislike programs that: + + * are very hardware specific + * are very OS version specific + (index/strchr differences are OK, but socket/streams specific + code is likely not to be) + * dump core or have compiler warnings + (it is OK only if you warn us in the 'remark' header item) + * won't compile or run under a POSIX P1003.1/P1003.2 like systems + * depend on a utility or application not normally found on most + most POSIX P1003.1/P1003.2 like systems + * abuse the build file to get around the size limit + * obfuscate by excessive use of ANSI tri-graphs + * are longer than they need to be + * are "blob-ier" than they need to be + * are rather similar to previous winners :-( + * are too similar to previous losers :-) +| * that mandate the exclusive the use of an specific Integrated +| Development Environment (IDE) + +| In order to encourage entry portability, we dislike entries that +| fail to build unless one is using an IDE. For example, do not +| mandate that one must use Microsoft Visual Studio to compile +| your entry. Nevertheless some of the better IDEs have command-line +| interfaces to their compilers, once one learns how to invoke a shell. + +| The program must compile and link cleanly in a POSIX-like environment. +| Therefore do not assume the system has a windows.h include file: +| +| #include /* we dislike this include */ + + Unless you are cramped for space, or unless you are entering the + 'best one liner' category, we suggest that you format your program + in a more creative way than simply forming excessively long lines. + + At least one judge prefers to maintain the use of the leap-second + as part of the world's time standard. If your code prints time + with seconds, we prefer that your code be capable of printing the + time of day during a leap-second where the value in seconds + after the minute mark is 60. + + The "how to build" make process should not be used to try and get + around the size limit. It is one thing to make use of a several -D's +| on the compile line to help out, but it is quite another to use many + bytes of -D's in order to try and squeeze the source under the size limit. + +| Your source code, post-pre-processing, should not exceed the size +| of Windows. :-) + + The judges, as a group, have a history giving wide degree of latitude + to reasonable entries. And recently they have had as much longitudinal + variation as it is possible to have on Earth. :-) + + You should try to restrict commands used on the build file to + POSIX-like or common Un*x-like commands. You can also compile + and use your own programs. If you do, try to build and execute + from the current directory. This restriction is not a hard and + absolute one. The intent is to ensure that the building if your + program is reasonably portable. + + We prefer programs that are portable across a wide variety of Un*x-like + operating systems (i.e., Linux, GNU Hurd, BSD, Un*x, etc.). + + You are in a maze of twisty guidelines, all different. + + There are at least zero judges who think that Fideism has little + or nothing to do with the IOCCC judging process. + + Don't forget that the building of your program should be done + ***without human intervention***. So don't do things such as: + + prog: prog.c + #echo this next line requires data from standard input + cat > prog.c + ${CC} prog.c -o prog + + However, you can do something cute such as making your program + do something dumb (or cute) when it is built 'automatically'. And + when it is run with a human involved, do something more clever. + For example, one could use the build instructions: + + prog: prog.c + ${CC} prog.c -DNON_HUMAN_COMPILE -o prog + @echo "See remarks section about alternate ways to compile" + + and then include special notes in the program "remarks" for + alternate / human intervention based building. + + We want to get away from source that is simply a compact blob of + octets. Really try to be more creative than blob coding. *HINT!* + + Please do not use things like gzip to get around the size limit. + Please try to be much more creative. + + We really dislike entries that make blatant use of including + large data files to get around the source code size limit. + + We do not recommend submitting systemd source code to the IOCCC, + if nothing else because that code is likely to exceed the source code + size limit. This isn't to say that another highly compact and obfuscated + replacement of init would not be an interesting submission. + + Did we remember to indicate that programs that blatantly use + some complex state machine to do something simple are boring? + We think we did. :-) + + All generalizations are false, including this one. -- Mark Twain + + Given two versions of the same program, one that is a compact blob + of code, and the other that is formatted more like a typical C + program, we tend to favor the second version. Of course, a third + version of the same program that is formatted in an interesting + and/or obfuscated way, would definitely win over the first two! + Remember, you can submit more than one entry. See the rules for details. + + We suggest that you avoid trying for the 'smallest self-replicating' + source. The smallest, a zero byte entry, won in 1994. + + Programs that claim to be the smallest C source that does something, really + better be the smallest such program or they risk being rejected because + they do not work as documented. + + Please note that the C source below, besides lacking in obfuscation, + is NOT the smallest C source file that when compiled and run, dumps core: + + main; + + We do not like writable strings. That is, we don't want stuff like: + + char *T = "So many primes, so little time!"; + ... + T[14] = ';'; + + Please don't make use of this feature, even if your system allows it. + However, initialized char arrays are OK to write over. This is OK: + + char b[] = "Is this OK"; + b[9] = 'K'; + +| There are more than one typos in this very sentence. + + X client entries should be as portable as possible. Entries that + adapt to a wide collection of environments will be favored. For + example, don't depend on a particular type or size of display. + Don't assume the use of a particular browser. Instead assume a + generic browser that forms to a widely used W3C standard. + Don't assume a particular sound sub-system or video driver is installed + in the OS. Instead, make use of a well known and widely available open + source program (one that actually works) to display audio/visual data. + + X client entries should avoid using X related libraries and + software that is not in wide spread use. + + This is the only guideline that contains the word fizzbin. +| However, do you know how to play fizzbin? You do?!? (Except on Tuesday) + + We don't like entries that use proprietary toolkits such as the M*tif, + Xv*ew, or OpenL*ok toolkits, since not everyone has them. Use of an + open source toolkit that is widely and freely available instead. + +| The previous guideline in this spot has been replaced by this guideline: +| ------------------------------------------------------------------------ + + X client entries should not to depend on particular items on + .Xdefaults. If you must do so, be sure to note the required lines + in the program "remarks". They should also not depend on any + particular window manager. + + Try to avoid entries that play silent sound segments or play the + Happy Birthday song; music that some people believe is copyrighted + (even if such copyrights appear to be bogus and/or blatant abuses of + the copyright system). + + While we recognize that UN*X is not a universal operating system, the + contest does have a bias towards such systems. In an effort to expand + the scope of the contest, we phrase our bias in terms of POSIX P1003.1 + and P1003.2 standards. This will allow certain non-UN*X OS users to + submit entries. On the other hand, this is a guideline and not a rule. + We will not reject an entry based on some POSIX technicality. + + When dealing with OS and application environments, we suggest that you + be reasonable with a nod towards vanilla UN*X-like systems. POSIX will + evolve but not as much as the contest. + + You very well might not be completely prohibited from failing to not + partly misunderstand this particular guideline, but of course we could +| not possibly comment. Nevertheless, you are neither prohibited, nor are +| you required to determine that this or the previous sentence is either false +| and/or misleading. Therefore, it might be wise for you to not fail to consider +| to do so, accordingly. Thank you. + + Any complaints about the above guideline could be addressed to the + Speaker of the House of Commons, or to the speaker of your national +| parliament should you have one. + + We like programs that: + + * are as concise and small as they need to be + * do something at least quasi-interesting + * are portable + * are unique or novel in their obfuscation style + * MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION <== HINT!! + * make us laugh and/or throw up :-) (humor really helps!) + * make us want to eat good chocolate. + + Some types of programs can't excel (anti-tm) in some areas. Your + program doesn't have to excel in all areas, but doing well in several + areas really does help. + + You are better off explaining what your entry does in the program + "remarks" section rather than leaving it obscure for the judges + as we might miss something and/or be too tired to notice. + +| Please avoid this specific individual guideline, if at all possible. + + We freely admit that interesting, creative or humorous comments in + the program "remarks" help your chances of winning. If you had to + read so many twisted entries, you too would enjoy a good laugh or two. + We think the readers of the contest winners do as well. We do read + the program "remarks" during the judging process, so it is worth your + while to write remarkable program "remarks". + + We dislike C code with trailing control-M's (\r or \015) that results + in compilation failures. Some non-Un*x/non-Linux tools such as + MS Visual C and MS Visual C++ leave trailing control-M's on lines. + Users of such tools should strip off such control-M's before submitting + their entries. In some cases tools have a "Save As" option that will + prevent such trailing control-M's being added. + + One should restrict libcurses to portable features found on BSD + or Linux curses. + + Rule 13 states any C source that fails to compile because of unescaped + octets with the high bit set (octet value >= 128) will be rejected. + Instead of unescaped octets, you should use \octal or \hex escapes: + + /* 123456789 123456789 123456789 123456 */ + char *foo = "This string is 36 octets in length \263"; + /* This octet requires 4 octets of source ^^^^ */ + if (strlen(foo) == 36) printf("foo is 36 octets plus a final NUL\n"); + else printf("This code should not print this message\n"); + + It is a very good idea to, in your remarks file, tell us why you + think your entry is obfuscated. This is particularly true if + your entry is has some very subtle obfuscations that we might + otherwise overlook. <<-- Hint! + + Anyone can format their code into a dense blob. A really clever + author will try format their entry using a "normal" formatting style + such that at first glance (if you squint and don't look at the details) + the code might pass for non-obfuscated C. Deceptive comments, + and mis-leading formatting, in some cases, may be a plus. On the + other hand, a misleading code style requires more source bytes. + + If you do elect to use misleading formatting and comments, we + suggest you remark on this point in your remarks where you talk + about why you think your entry is obfuscated. On the other hand, + if you are pushing up against the size limits, you may be forced + into creating a dense blob. Such are the trade offs that obfuscators face! + + We prefer code that can run on either a 64-bit or 32-bit processor. + However, it is unwise to assume it will run on an i386 or x86 architecture. + + We believe that Mark Twain's remark: + + Get your facts first, then you can distort them as you please. + + is a good guideline for those writing code for the IOCCC. + + The IOCCC size tool source, iocccsize.c, is not an original work, +| unless you are Anthony C Howe, in which case it is original! +| Submitting source that uses the content iocccsize.c, unless you are +| Anthony C Howe, might run the risk of violating rule 7. + + Rule 7 does not prohibit you from writing your own obfuscated IOCCC size tool. + However if you do, you might wish to make your tool do something more + interesting than simply implementing the IOCCC size tool algorithm. + + While programs that only run in a specific word size are OK. If you have + to pick, choose a 64-bit word size. + + If we are feeling ornery we might choose to compile your program + for running on an Arduino or a PDP-11. Heck, should we ever find + an emulator of 60-bit CDC Cyber CPU running a POSIX-like OS, we + might just try your entry on that emulator as well :-) + + If your entry MUST run only in 32-bit mode on an Intel processor, add the + following compiler flag: + + -arch i386 + + to your "how to build" make compile line. For example: + + prog: prog.c + ${CC} prog.c -arch i386 -o prog + + Be even more creative! + + If there are limitations in your entry, you are highly encouraged + to note such limitations in your remarks file. For example if your + entry factors values up to a certain size, you might want to state: + + This entry factors values up 2305567963945518424753102147331756070. + Attempting to factor larger values will produce unpredictable results. + + The judges might try to factor the value -5, so you want to might state: + + This entry factors positive values up 2305567963945518424753102147331756070. + Attempting to factor large values will produce unpredictable results. + + However the judges might try to also factor 0, so you want to might state: + + This entry factors values between 1 and 2305567963945518424753102147331756070. + Attempting to factor values outside that range will produce unpredictable results. + + Moreover the try to also factor 3.5 or 0x7, or Fred, so you want to might state: + + This entry factors integers between 1 and 2305567963945518424753102147331756070. + Attempting to factor anything else will produce unpredictable results. + + You entry might be better off catching the attempt to factor bogus values + and doing something interesting. So you might want to code accordingly and state: + + This entry factors integers between 1 and 2305567963945518424753102147331756070. + Attempting to factor anything else will cause the program to insult your + pet fish Eric. + + The judges might not have a pet fish named Eric, so might want to state: + + This entry factors integers between 1 and 2305567963945518424753102147331756070. + Attempting to factor anything else will cause the program to insult your + pet fish Eric, or in the case that you lack such a pet, will insult the + pet that you do not have. + + When all other things are equal, an entry with fewer limitation will be judged + better than an entry with lots of limitations. So you might want to code accordingly + and state: + + This entry attempts to a factor value of any size provided that the program + is given enough time and memory. If the value is not a proper integer, the + program will insult a fish named Eric, even if such a fish does not exist. + + +ABUSING THE RULES: + + Legal abuse of the rules is somewhat encouraged. Legal rule abuse may + involve, but is not limited to, doing things that are technically + allowed by the rules and yet do not fit the spirit of what we intended + to be submitted. + + Legal rule abuse is encouraged to help promote creativity. Rule abuse + entries, regardless of if they receive an award, result in changes to + the next year's rules and guidelines. + + Legal abuse of the rules is NOT an invitation to violate the rules. + An entry that violates the rules in the opinion of the judges, WILL be + disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK! If you + have an entry that might otherwise be interesting, you might want to + submit two versions; one that does not abuse the rules and one that + does. + + If you intend to abuse the rules, indicate so in the program + "remarks". You must try to justify why you consider your rule abuse + to be allowed under the rules. That is, you must plead your case as + to why your entry is valid. Humor and/or creativity help plead a + case. + + Abusing the web submission procedure tends to annoy us more + than amuse us. Spend your creative energy on content of your + entry rather than on the submission process itself. + + We are often asked why the contest rules and guidelines seem too + strange or contain mistakes, flaws or grammatical errors. One reason + is that we sometimes make genuine mistakes. But in many cases such + problems, flaws or areas of confusion are deliberate. Changes to + rules and guidelines in response to rule abuses, are done in a minimal + fashion. Often we will deliberately leave behind holes (or introduce + new ones) so that future rule abuse may continue. A cleaver author + should be able to read them and "drive a truck through the holes" in + the rules and guidelines. + + At the risk of stating the obvious, this contest is a parody of the + software development process. The rules and guidelines are only a + small part of the overall contest. Even so, one may think the contest + rules and guideline process as a parody of the sometimes tragic + mismatch between what a customer (or marketing) wants and what + engineering delivers. Real programmers must face obfuscated + and sometimes conflicting specifications and requirements from marketing, + sales, product management an even from customers themselves on a + all too regular basis. This is one of the reasons why the rules and + guidelines are written in obfuscated form. + + +JUDGING PROCESS: + + Entries are judged by Leonid A. Broukhis, Simon Cooper, Landon Curt Noll. + + Each entry submitted is given a random id number and subdirectory. The + entry files including, but not limited to prog.c, Makefile (that we + form from around your "how to build" information), as well as any + data files that you submit are all placed under their own directory. + stored and judged from this directory. + + Any information about the authors is not read by the judges until + the judging process is complete, and then only from entries that have + won an award. Because we do not read this information for entries that + do not win, we do not know who did not win. + + The above process helps keep us biased for/against any one particular + individual. Therefore you MUST refrain from putting any information + that reveals your identity in your entry. + + Now some people point out that coding style might reveal the information + about the others. However we consider this to be simply circumstantial + and outside the scope of the above paragraph. + + Some people, in the past, have attempted to obfuscate their identity by + including comments of famous Internet personalities such as Peter Honeyman + (http://www.citi.umich.edu/u/honey/). The judges are on to this + trick and therefore consider any obfuscated source or data file + claiming to be from Honeyman to not be form Honeyman. This of course + creates an interesting paradox known as the "obfuscated Peter Honeyman + paradox". Should Peter Honeyman actually submit an obfuscated entry, + he alone is excluded from the above, as we will likely believe + it just another attempt at confusion. This guideline is known + as the "Peter Honeyman is exempt" guideline. + + BTW: None of the entries claiming to be from Peter Honeyman have ever + won an award. So it is theoretically possible that Peter Honeyman + did submit an entry in the past. In the past, Peter had denied + submitting anything to the IOCCC. Perhaps those entries were + submitted by one of his students? + + Hopefully we are very CLEAR on this point! The rules now strongly state: + PLEASE DO NOT put a name of an author, in an obvious way, into your + source code, remarks, data files, etc. The above "Peter Honeyman is + exempt" not withstanding. + + We seemed to have digressed again ... :-) Returning to the judging process: + + We prefer to be kept in the dark as much as you are until the final + awards are given. We enjoy the surprise of finding out in the end, + who won and where they were from. + + We attempt to keep all entries anonymous, unless they win an award. + Because the main 'prize' of winning is being announced, we make all + attempts to send non-winners into oblivion. We remove all non-winning + files, and shred all related paper. By tradition, we do not even + reveal the number of entries that we received. + + During the judging process. a process that spans multiple sessions + over a few weeks, post general updates from our @IOCCC twitter account. + + Once we have selected the winners, for each category we will tweet: + + category name + name(s) of the authors (or anonymous if requested) + twitter handle(s) (if provided and if anonymity was not requested) + country code(s) of the author(s) + + After the initial announcement, we attempt to send Email to the + authors of the winning entries. One reason we do this is to give + the authors a chance to comment on the way we have presented their + entry. They are given the chance to correct mistakes and typos. We + often accept their suggestions/comments about our remarks as well. + This is done prior to posting the winners to the wide world. + + Judging consists of a number of elimination rounds. During a round, + the collection of entries are divided into two roughly equal piles; + the pile that advances on to the next round, and the pile that does + not. We also re-examine the entries that were eliminated in the + previous round. Thus, an entry gets at least two readings. + + A reading consists of a number of actions: + + * reading the "how to build" information and forming a Makefile + * reading prog.c, the C source + * reviewing the "remarks" information + * briefly looking any any supplied data files + * passing the source thru the C pre-processor + skipping over any #include files + * performing a number of C beautify/cleanup edits on the source + * passing the beautified source thru the C pre-processor + skipping over any #include files + * compiling/building the source + * running the program + * Doing other things that only IOCCC judges know about :-) + + In later rounds, other actions are performed including performing + miscellaneous tests on the source and binary. + +! This is the very guideline that goes, BING! + + Until we reduce the stack of entries down to about 25 entries, entries + are judged on an individual basis. An entry is set aside because it + does not, in our opinion, meet the standard established by the round. + When the number of entries thins to about 25 entries, we begin to form + award categories. Entries begin to compete with each other for awards. + An entry will often compete in several categories. + + The actual award category list will vary depending on the types of entries + we receive. A typical category list might be: + + * best small one line program (see above about one line programs) + * best small program + * strangest/most creative source layout + * most useful obfuscated program + * best game that is obfuscated + * most creatively obfuscated program + * most deceptive C code (code with deceptive comments and source code) + * best X client (see OUR LIKES AND DISLIKES) + * best abuse of ISO C or ANSI C standard (see above about compilers) + * best abuse of the C preprocessor + * worst abuse of the rules + * (anything else so strange that it deserves an award) + + We do not limit ourselves to this list. For example, a few entries are so + good/bad that they are declared winners at the start of the final round. + We will invent awards categories for them, if necessary. + + In the final round process, we perform the difficult tasks of + reducing the remaining entries (typically about 25) down to to about + half that number: declaring those remaining to be winners. + + Often we are confident that the entries that make it into + the final round are definitely better than the ones that do not + make it. The selection of the winners out of the final round, is + less clear cut. + + Sometimes a final round entry is good enough to win, but is beat out + by a similar, but slightly better entry. For this reason, it is + sometimes worthwhile to re-enter an improved version of an entry + that failed to win in a previous year. This assumes, of course, + that the entry is worth improving in the first place! + + More than one IOCCC judge has been known to bribe another IOCCC judge + into voting for a winning entry by offering a bit high quality chocolate. + This technique is highly discouraged for use by non-IOCCC judges. + + More often than not, we select a small entry (usually one line), a + strange/creative layout entry. We sometimes also select an + entry that abuses the contest guidelines in an interesting way, + or that stretches the content rules that while legal, is + nevertheless goes against the intent of the rules. + + In the end, we traditionally pick one entry as 'best'. Sometimes such + an entry simply far exceeds any of the other entries. More often, the + 'best' is picked because it does well in a number of categories. + + In years past, we renamed the winning entry from prog.c to a + name related to the submitter(s) names. This is no longer done. + Winning source is called prog.c A compiled binary is called prog. + + +ANNOUNCEMENT OF WINNERS: + + The judges will tweet initial announcement of who won, the name + of their award, and a very brief description of the winning entry + from the @IOCCC twitter handle. Non-twitter users should visit: + + https://twitter.com/ioccc + + Non-twitter users should force their browsers to reload the above URL + to be sure they are seeing the most recent tweets. + + The judges will then post an initial announcement of who won, the name + of their award, and a very brief description of the winning entry + on the IOCCC web site: + + http://www.ioccc.org/whowon.html + + We will also attempt to submit a brief announcement story to /.: + + http://slashdot.org + + that, depending on the willingness of the /. editors, may be posted + to their site at the same time. + + Note that initial announcement will NOT contain source. This is because + the winning authors are given a chance to review the judges comments, + and test our Makefile. This review process typically takes a few weeks. + + Sometime after the initial announcement, and once the the review + by the winners has been completed, the winning source will be + posted to the IOCCC web site: + + http://www.ioccc.org/years.html + + NOTE: previous winners are available at that URL + + We will also tweet, via @IOCCC, when the winning source is available. + + It is pointless to ask the IOCCC judges how many entries we receive. + Other government TLA or FLA snooping organizations are prohibited from + either confirming, denying or revealing any knowledge of this data point. + + Often, winning entries are published in selected magazines from around + the world. Winners have appeared in books ("The New Hackers Dictionary") + and on T-Shirts. More than one winner has been turned in a tattoo! + + Last, but not least, winners receive international fame and flames! :-) + + +FOR MORE INFORMATION: + + You may contact the judges by sending Email to the following address: + +| q.2020@ioccc.org (do not submit entries to this address) + +| You must include the words 'ioccc 2020 question' in the subject of your + Email message when sending Email to the judges. + + Questions and comments about the contest are welcome. Comments about + confusing rules and guidelines are also welcome. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. + + Check out the IOCCC Web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + For the updates and breaking IOCCC news, you are encouraged to follow + the twitter handle: + + @IOCCC + + You do not have to be a twitter user to follow @IOCCC. Non-twitter + users should access: + + https://twitter.com/ioccc + + Non-twitter users should force their browsers to reload the above URL + to be sure they are seeing the most recent tweets. + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ diff --git a/2020/hint.css b/2020/hint.css new file mode 100644 index 000000000..eef3016bf --- /dev/null +++ b/2020/hint.css @@ -0,0 +1,122 @@ +* { + font-family: Helvetica Neue, Helvetica, Arial, sans-serif; +} +body { + max-width: 50em; + margin: 0 auto; + color: #111; +} + +pre, code { + font-family: Monaco, Courier New, monospace; + font-size: 12px; +} + +h1 { + font-size: 30px; + font-weight: bold; + letter-spacing: -1px; + margin-bottom: -5px; +} +h1 code { + font-size: 30px; +} + +h2 { + color: rgb(43,105,145); + font-weight: bold; + margin-bottom: -5px; +} +h2 code { + font-size: 22px; +} + +h3 { + /* color: rgb(43,105,145); */ + font-weight: bold; + margin-bottom: -5px; +} +h3 code { + font-size: 16px; +} + +a { + color: blue; + text-decoration: underline; +} +a:visited { + color: navy; +} +a:hover { + text-decoration: underline; +} + +code { + white-space: pre; +} + +pre { + border-radius: 10px; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + border-width: 1px; + border-color: rgb(16,48,0); + border-style: solid; + padding: 0.6em; + padding-left: 1em; + margin-left: 5%; + margin-right: 8%; + overflow: auto; + color: rgb(255,223,0); + background-color: rgb(53,46,0); +} + +p, li { + font-size: 14px; + line-height: 18px; +} + +/* For a navigation menu */ +#bar ul { + list-style-type: none; + margin: 0; + /* padding: 0; */ + overflow: hidden; + /* border: 1px solid black; */ + /* background-color: #f0f0f0; */ +} + +#bar li { + /* border-right: 1px solid black; */ + display: inline; + float: left; +} + +#bar li a { + display: block; + color: black; + text-align: center; + padding: 10px 16px; + text-decoration: none; + background-color: #f0f0f0; + border: 1px solid black; + border-right: none; +} + +#bar li a:hover:not(.active) { + color: black; + background-color: white; +} + +#bar li:last-child { + border-right: 1px solid black; +} + +#bar .active { + color: black; + background-color: #4CAF50; +} + diff --git a/2020/index.html b/2020/index.html new file mode 100644 index 000000000..c32465b9e --- /dev/null +++ b/2020/index.html @@ -0,0 +1,126 @@ + + + + + + + README + + +
    + IOCCC +

    The International Obfuscated C Code Contest

    + +

    The 27th IOCCC

    +
    + + +

    2020 marked the “The Twenty Seventh International Obfuscated C Code Contest”

    + +

    Copyright © 2020, Landon Curt Noll, Simon Cooper, and Leonid A. +Broukhis. All Rights Reserved. Permission for personal, educational +or non-profit use is granted provided this copyright and notice are +included in its entirety and remains unaltered. All other uses +must receive prior permission from the contest judges.

    + +

    Standard IOCCC stuff

    + +

    The primary IOCCC web site can be found at,

    + +

    http://www.ioccc.org/

    + +

    Use make to compile entries. It is possible that on non-Un*x / non-Linux +systems the makefile needs to be changed. See the Makefile for details.

    + +

    Look at the source and try to figure out what the programs do, and run +them with various inputs. If you want to, look at the hints files for +spoilers - this year we included most of the information included +by the submitter.

    + +

    Read over the makefile for compile/build issues. Your system may require +certain changes (add or remove a library, add or remove a #define).

    + +

    Some C compilers are not quite as good as they should be. If yours is +lacking, you may need to compile using clang or gcc instead of your local +compiler.

    + +

    Remarks on some of the winners

    + +

    This year’s Best of Show (carlini) is such a novel way of obfuscation that it would be +worth of a special mention in the (future) Best of IOCCC list!

    + +

    For some reason, this year’s set of winners contains three nostalgic games, +Asteroids (tsoj), Minesweeper (endoh1), and Snake (ferguson1).

    + +

    An entry (kurdyukov1) pays homage to a previous winner (2015/hou).

    + +

    …We’ll stop spouting spoilers now. Have fun exploring all the entries!

    + +

    Remarks on some of submissions that did not win

    + +

    As a rule, we try to compile the entries on a variety of platforms. +Quite a few entries this year could not be built or executed on some of them due to reliance on +library internals or the system runtime.

    + +

    A few entries were violating the “2053 significant bytes” rule. If an entry could not be brought to +compliance within a few seconds of looking at the source, it was disqualified.

    + +

    One entry tried to get around the size limit by putting the code into +makefile variables and using -D. This is already called out as discouraged +technique in the guidelines, but it is worth a reminder.

    + +

    Several promising entries attempted to make use of the syscall function using literal syscall numbers. +This is utterly non-portable.

    + +

    A note to the authors: when submitting multiple entries, don’t let us easily correlate them by +coding style or documentation content, and definitely don’t submit nearly identical versions +of your program separately. As we try to judge the entries anonymously, the similarities will cause such +entries to compete against one another, making each less likely to win.

    + +

    We hope the authors of non-winning entries will refine their entries and +perhaps re-submit them for the next IOCCC.

    + +

    Final Comments

    + +

    One more thing that feels dated is digraphs and trigraphs.

    + +

    Please feel free to send us comments and suggestions about the +competition, this README or anything else that you would like to see in +future contests.

    + +

    If you use, distribute or publish these entries in some way, please drop +us a line. We enjoy seeing who, where and how the contest is used.

    + +

    If you have problems with any of the entries, AND YOU HAVE A FIX, please +send us the fix (patch file or the entire changed file).

    + +

    For the latest information on how to contact the IOCCC Judges please visit

    + +

    http://www.ioccc.org/contact.html

    + +

    For news of the next contest watch:

    + +

    http://www.ioccc.org/

    +
    +
    + + + + +
    Creative Commons License

    © Copyright 1984-2020, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + diff --git a/2020/iocccsize-test.sh b/2020/iocccsize-test.sh new file mode 100644 index 000000000..f3e38a39b --- /dev/null +++ b/2020/iocccsize-test.sh @@ -0,0 +1,385 @@ +#!/usr/bin/env bash +# +# iocccsize-test.sh - IOCCC Size Tool Tests +# +# "You are not expected to understand this" :-) +# +# This IOCCC size tool source file is version 2019-06-20-v27. +# +# Public Domain 1992, 2015, 2019 by Anthony Howe. All rights released. +# With IOCCC minor mods in 2019 by chongo (Landon Curt Noll) ^oo^ + +export PATH='/bin:/usr/bin:/usr/local/bin:/usr/pkg/bin' +export ENV='' +export CDPATH='' +export LANG=C + +usage() +{ + echo 'usage: iocccsize-test.sh [-bv][-t tool]' + exit 2 +} + +__tool="./iocccsize" +__verbose=false + +while getopts 'bvt:' opt; do + case "$opt" in + (b) + __build="distclean" + ;; + (v) + __verbose=true + __tool_args="-v" + ;; + (t) + __tool="$OPTARG" + ;; + (*) + usage + esac +done +shift $(($OPTIND - 1)) +#if [ $# -lt 1 ]; then +# usage +#fi + +make -f iocccsize.mk ${__build} all + +if [ ! -d test ]; then + mkdir test +fi + +get_wc() +{ + typeset file="$1" + typeset field="$2" + wc $file | sed -e's/^ *//; s/ */ /g' | cut -d' ' -f$field +} + +test_size() +{ + typeset file="test/$1" + typeset expect="$2" + typeset gross_count + typeset got + + got=$($__tool $__tool_args <$file 2>&1 >/dev/null) + if $__verbose ; then + gross_count=$(echo $got | cut -d' ' -f2) + bytes=$(get_wc $file 3 $filter) + if [ $gross_count != $bytes ]; then + echo "FAIL $file: got $gross_count != wc $bytes" + return + fi + else + got=$(echo $got | cut -d' ' -f1) + expect=$(echo $expect | cut -d' ' -f1) + fi + if [ "$expect" = "$got" ]; then + echo "-OK- $file: $got" + else + echo "FAIL $file: got $got != expect $expect" + fi +} + +####################################################################### + +cat <test/splitline0.c +#define FOO \\ + int a = 666; +FOO; +EOF +test_size splitline0.c "19 36 1" + +####################################################################### + +cat <test/comment0.c +// comment one line "with a comment string" inside +int x; +EOF +test_size comment0.c "44 58 1" + +####################################################################### + +cat <test/comment1.c +/* comment block same line 'with a comment string' */ +int x; +EOF +test_size comment1.c "46 61 1" + +####################################################################### + +cat <test/comment2.c +/* +comment block +multiline +*/ +int x; +EOF +test_size comment2.c "27 37 1" + +####################################################################### + +cat <test/comment3.c +a//foo +EOF +test_size comment3.c "6 7 0" + +####################################################################### + +cat <test/comment4.c +/*/ int if for /*/ +EOF +test_size comment4.c "14 19 0" + +####################################################################### + +cat <test/comment5.c +'"' "/*" foobar "*/" +EOF +test_size comment5.c "17 21 0" + +####################################################################### + +cat <test/comment6.c +char str[] = "string /* with */ comment"; +EOF +test_size comment6.c "30 42 1" + +####################################################################### + +cat <test/comment7.c +// comment with backslash newline \\ +int a = 666; +EOF +test_size comment7.c "37 49 0" + +####################################################################### + +cat <test/quote0.c +char str[] = "and\"or"; +EOF +test_size quote0.c "16 24 1" + +####################################################################### + +cat <test/quote1.c +char squote = '\''; +EOF +test_size quote1.c "12 20 1" + +####################################################################### + +cat <test/quote2.c +char str[] = "'xor'"; +EOF +test_size quote2.c "14 22 1" + +####################################################################### + +cat <test/digraph.c +char str<::> = "'xor'"; +EOF +test_size digraph.c "14 24 1" + +####################################################################### + +cat <test/trigraph0.c +char str??(??) = "'xor'"; +EOF +test_size trigraph0.c "14 26 1" + +####################################################################### + +# Example from https://en.wikipedia.org/wiki/Digraphs_and_trigraphs#C +cat <test/trigraph1.c +// Will the next line be executed????????????????/ +int a = 666; +EOF +test_size trigraph1.c "49 64 0" + +####################################################################### + +# Example from https://en.wikipedia.org/wiki/Digraphs_and_trigraphs#C +cat <test/trigraph2.c +/??/ +* A comment *??/ +/ +EOF +test_size trigraph2.c "12 24 0" + +####################################################################### + +cat <test/trigraph3.c +#define FOO ??/ + int a = 666; +FOO; +EOF +test_size trigraph3.c "19 38 1" + +####################################################################### + +cat <test/main0.c +int +main(int argc, char **argv) +{ + return 0; +} +EOF +test_size main0.c "22 47 4" + +####################################################################### + +cat <test/hello.c +#include + +int +main(int argc, char **argv) +{ + (void) printf("Hello world!\n"); + return 0; +} +EOF +test_size hello.c "58 101 6" + +####################################################################### + +# Digraph for #include and curlys. Digraphs are tokens and are not +# translated like trigraphs. +cat <test/hello_digraph.c +%: include + +int +main(int argc, char **argv) +<% + (void) printf("Hello world!\n"); + return 0; +%> +EOF +test_size hello_digraph.c "60 108 6" + +####################################################################### + +# Trigraph for #include and curlys. Trigraphs are translated, unlike +# digraphs which are tokens. +cat <test/hello_trigraph.c +??= include + +int +main(int argc, char **argv) +??< + (void) printf("Hello world!\n"); + return 0; +??> +EOF +test_size hello_trigraph.c "58 111 6" + +####################################################################### + +cat <test/include0.c +# include +EOF +test_size include0.c "10 21 1" + +####################################################################### + +cat <test/include1.c +# include +#/*hi*/include +EOF +test_size include1.c "26 46 2" + +####################################################################### + +cat <test/curly0.c +char str = "{ curly } "; +EOF +test_size curly0.c "12 25 1" + +####################################################################### + +# No spaces after curly braces in array initialiser. +cat <test/curly1.c +#include + +#define STRLEN(s) (sizeof (s)-1) + +typedef struct { + size_t length; + const char *word; +} Word; + +Word list[] = { + {STRLEN("abutted curly"), "abutted curly"}, + {0, NULL} +}; +EOF +test_size curly1.c "119 192 6" + +####################################################################### + +# Spaces after curly braces in array initialiser. +cat <test/curly2.c +#include + +#define STRLEN(s) (sizeof (s)-1) + +typedef struct { + size_t length; + const char *word; +} Word; + +Word list[] = { + { STRLEN("spaced curly"), "spaced curly"} , + { 0, NULL} +} ; +EOF +test_size curly2.c "113 196 6" + +####################################################################### + +cat <test/semicolon0.c +char str = "; xor; "; +EOF +test_size semicolon0.c "10 22 1" + +####################################################################### + +# Spaces after semicolons in for( ; ; ). +cat <test/semicolon1.c +#include + +int +main(int argc, char **argv) +{ + int i; + for (i = 0; i < 3; i++) { + (void) printf("%d\n", i); + } + return 0; +} +EOF +test_size semicolon1.c "65 133 8" + +####################################################################### + +# No spaces after semicolons in for(;;). +cat <test/semicolon2.c +#include + +int +main(int argc, char **argv) +{ + int i; + for (i=0;i<3;i++) { + (void) printf("%d\n", i); + } + return 0; +} +EOF +test_size semicolon2.c "67 127 8" + +####################################################################### +# END +####################################################################### diff --git a/2020/iocccsize.c b/2020/iocccsize.c new file mode 100644 index 000000000..4e74f87d5 --- /dev/null +++ b/2020/iocccsize.c @@ -0,0 +1,477 @@ +/* + * iocccsize - IOCCC Source Size Tool + * + * "You are not expected to understand this" :-) + * + * Public Domain 1992, 2015, 2018, 2019 by Anthony Howe. All rights released. + * With IOCCC minor mods in 2019 by chongo (Landon Curt Noll) ^oo^ + * + * SYNOPSIS + * + * iocccsize [-ihv] < input + * + * -i ignored for backward compatibility + * -h print usage message in stderr and exit + * -v turn on some debugging to stderr; -vv or -vvv for more + * + * The source is written to stdout, with possible translations ie. trigraphs. + * The IOCCC net count rule 2b is written to stderr; with -v, net count (2b), + * gross count (2a), number of keywords counted as 1 byte; -vv or -vvv write + * more tool diagnostics. + * + * DESCRIPION + * + * Reading a C source file from standard input, apply the IOCCC + * source size rules as explained in the Guidelines. The source + * code is passed through on standard output. The source's net + * length is written to standard error; with -v option the net + * length, gross length, and matched keyword count are written. + * + * The entry's gross size in bytes must be less than equal to 4096 + * bytes in length. + * + * The entry's net size in bytes must be less than equal to 2053 + * bytes (first prime after 2048). The net size is computed as + * follows: + * + * The size tool counts most C reserved words (keyword, secondary, + * and selected preprocessor keywords) as 1. The size tool counts all + * other octets as 1 excluding ASCII whitespace, and excluding any + * ';', '{' or '}' followed by ASCII whitespace, and excluding any + * ';', '{' or '}' octet immediately before the end of file. + */ + +#define DIGRAPHS +#define TRIGRAPHS + +/* + * IOCCC Judge's remarks: + * + * This code contains undocumented features. On the other hand, this code + * is RTFS (for certain values of RTFS). One might say that this code + * perfectly documents itself. :-) + * + * Many thanks to Anthony Howe for taking the time to put his OCD + * (Obfuscated Coding Determination) into this code! + */ + +/* + * HINT: The algorithm implemented by this code may or not be obfuscated. + * The algorithm may not or may appear to be obfuscated. + * + * In particular: + * + * We did not invent the algorithm. + * The algorithm consistently finds Obfuscation. + * The algorithm killed Obfuscation. + * The algorithm is banned in C. + * The algorithm is from Bell Labs in Jersey. + * The algorithm constantly finds Obfuscation. + * This is not the algorithm. + * This is close. + */ + +#include +#include +#include +#include +#include + +#define WORD_BUFFER_SIZE 64 +#define MAX_SIZE 4096 /* IOCCC Rule 2a */ +#define MAX_COUNT 2053 /* IOCCC Rule 2b */ +#define STRLEN(s) (sizeof (s)-1) + +#define NO_COMMENT 0 +#define COMMENT_EOL 1 +#define COMMENT_BLOCK 2 + +static char usage[] = +"usage: iocccsize [-ihv] < prog.c\n" +"\n" +"-i\t\tignored for backward compatibility\n" +"-h\t\tprint usage message in stderr and exit\n" +"-v\t\tturn on some debugging to stderr; -vv or -vvv for more\n" +"\n" +"The source is written to stdout, with possible translations ie. trigraphs.\n" +"The IOCCC net count rule 2b is written to stderr; with -v, net count (2b),\n" +"gross count (2a), number of keywords counted as 1 byte; -vv or -vvv write\n" +"more tool diagnostics.\n" +"\n" +"Version: 2019-06-20-v27" +; + +static int debug; +static char *out_fmt = "%lu\n"; + +/* + * C reserved words, plus a few #preprocessor tokens, that count as 1 + * + * NOTE: For a good list of reserved words in C, see: + * + * http://www.bezem.de/pdf/ReservedWordsInC.pdf + * + * by Johan Bezem of JB Enterprises: + * + * See http://www.bezem.de/en/ + */ +typedef struct { + size_t length; + const char *word; +} Word; + +static Word cwords[] = { + /* Yes Virginia, we left #define off the list on purpose! */ + { STRLEN("#elif"), "#elif" } , + { STRLEN("#else"), "#else" } , + { STRLEN("#endif"), "#endif" } , + { STRLEN("#error"), "#error" } , + { STRLEN("#ident"), "#ident" } , + { STRLEN("#if"), "#if" } , + { STRLEN("#ifdef"), "#ifdef" } , + { STRLEN("#ifndef"), "#ifndef" } , + { STRLEN("#include"), "#include" } , + { STRLEN("#line"), "#line" } , + { STRLEN("#pragma"), "#pragma" } , + { STRLEN("#sccs"), "#sccs" } , + { STRLEN("#warning"), "#warning" } , + + { STRLEN("_Alignas"), "_Alignas" } , + { STRLEN("_Alignof"), "_Alignof" } , + { STRLEN("_Atomic"), "_Atomic" } , + { STRLEN("_Bool"), "_Bool" } , + { STRLEN("_Complex"), "_Complex" } , + { STRLEN("_Generic"), "_Generic" } , + { STRLEN("_Imaginary"), "_Imaginary" } , + { STRLEN("_Noreturn"), "_Noreturn" } , + { STRLEN("_Pragma"), "_Pragma" } , + { STRLEN("_Static_assert"), "_Static_assert" } , + { STRLEN("_Thread_local"), "_Thread_local" } , + + { STRLEN("alignas"), "alignas" } , + { STRLEN("alignof"), "alignof" } , + { STRLEN("and"), "and" } , + { STRLEN("and_eq"), "and_eq" } , + { STRLEN("auto"), "auto" } , + { STRLEN("bitand"), "bitand" } , + { STRLEN("bitor"), "bitor" } , + { STRLEN("bool"), "bool" } , + { STRLEN("break"), "break" } , + { STRLEN("case"), "case" } , + { STRLEN("char"), "char" } , + { STRLEN("compl"), "compl" } , + { STRLEN("const"), "const" } , + { STRLEN("continue"), "continue" } , + { STRLEN("default"), "default" } , + { STRLEN("do"), "do" } , + { STRLEN("double"), "double" } , + { STRLEN("else"), "else" } , + { STRLEN("enum"), "enum" } , + { STRLEN("extern"), "extern" } , + { STRLEN("false"), "false" } , + { STRLEN("float"), "float" } , + { STRLEN("for"), "for" } , + { STRLEN("goto"), "goto" } , + { STRLEN("if"), "if" } , + { STRLEN("inline"), "inline" } , + { STRLEN("int"), "int" } , + { STRLEN("long"), "long" } , + { STRLEN("noreturn"), "noreturn" } , + { STRLEN("not"), "not" } , + { STRLEN("not_eq"), "not_eq" } , + { STRLEN("or"), "or" } , + { STRLEN("or_eq"), "or_eq" } , + { STRLEN("register"), "register" } , + { STRLEN("restrict"), "restrict" } , + { STRLEN("return"), "return" } , + { STRLEN("short"), "short" } , + { STRLEN("signed"), "signed" } , + { STRLEN("sizeof"), "sizeof" } , + { STRLEN("static"), "static" } , + { STRLEN("static_assert"), "static_assert" } , + { STRLEN("struct"), "struct" } , + { STRLEN("switch"), "switch" } , + { STRLEN("thread_local"), "thread_local" } , + { STRLEN("true"), "true" } , + { STRLEN("typedef"), "typedef" } , + { STRLEN("union"), "union" } , + { STRLEN("unsigned"), "unsigned" } , + { STRLEN("void"), "void" } , + { STRLEN("volatile"), "volatile" } , + { STRLEN("while"), "while" } , + { STRLEN("xor"), "xor" } , + { STRLEN("xor_eq"), "xor_eq" } , + + { 0, NULL } +}; + +static Word * +find_member(Word *table, const char *string) +{ + Word *w; + for (w = table; w->length != 0; w++) { + if (strcmp(string, w->word) == 0) { + return w; + } + } + return NULL; +} + +static int +read_ch(FILE *fp) +{ + int ch; + + while ((ch = fgetc(fp)) != EOF && ch == '\r') { + /* Discard bare CR and those part of CRLF. */ + } + if (ch == '\0' || 128 <= ch) { + errx(1, "NUL or non-ASCII characters"); + } + + return ch; +} + +static void +rule_count(FILE *fp) +{ + char word[WORD_BUFFER_SIZE]; + size_t gross_count = 0, net_count = 0, keywords = 0, wordi = 0; + int ch, next_ch, quote = 0, escape = 0, is_comment = NO_COMMENT; + + while ((ch = read_ch(fp)) != EOF) { + /* Future gazing. */ + next_ch = read_ch(fp); + +#ifdef TRIGRAPHS + if (ch == '?' && next_ch == '?') { + /* ISO C11 section 5.2.1.1 Trigraph Sequences */ + const char *t; + static const char trigraphs[] = "=#([)]'^<{!|>}-~/\\"; + + ch = fgetc(fp); + for (t = trigraphs; *t != '\0'; t += 2) { + if (ch == t[0]) { + /* Mapped trigraphs count as 1 byte. */ + next_ch = fgetc(fp); + gross_count += 2; + ch = t[1]; + break; + } + } + + /* Unknown trigraph, push back the 3rd character. */ + if (*t == '\0') { + if (ch != EOF && ungetc(ch, fp) == EOF) { + errx(1, "ungetc error: bad \?\?%c trigraph", ch); + } + ch = '?'; + } + } +#endif + if (ch == '\\' && next_ch == '\n') { + /* ISO C11 section 5.1.1.2 Translation Phases + * point 2 discards backslash newlines. + */ + gross_count += 2; + continue; + } + + if (next_ch != EOF && ungetc(next_ch, fp) == EOF) { + /* ISO C ungetc() guarantees one character (byte) pushback. + * How does that relate to UTF8 and wide-character library + * handling? An invalid trigraph results in 2x ungetc(). + */ + errx(1, "ungetc error: @SirWumpus goofed"); + } + + /* Within quoted string? */ + if (quote != 0) { + /* Escape _this_ character. */ + if (escape) { + escape = 0; + } + + /* Escape next character. */ + else if (ch == '\\') { + escape = 1; + } + + /* Close matching quote? */ + else if (ch == quote) { + quote = 0; + } + } + + /* Within comment to end of line? */ + else if (is_comment == COMMENT_EOL && ch == '\n') { + if (debug > 1) { + (void) fprintf(stderr, "~~NO_COMMENT\n"); + } + is_comment = NO_COMMENT; + } + + /* Within comment block? */ + else if (is_comment == COMMENT_BLOCK && ch == '*' && next_ch == '/') { + if (debug > 1) { + (void) fprintf(stderr, "~~NO_COMMENT\n"); + } + is_comment = NO_COMMENT; + } + + /* Start of comment to end of line? */ + else if (is_comment == NO_COMMENT && ch == '/' && next_ch == '/') { + if (debug > 1) { + (void) fprintf(stderr, "~~COMMENT_EOL\n"); + } + is_comment = COMMENT_EOL; + + /* Consume next_ch. */ + (void) fputc(ch, stdout); + ch = fgetc(fp); + gross_count++; + net_count++; + } + + /* Start of comment block? */ + else if (is_comment == NO_COMMENT && ch == '/' && next_ch == '*') { + if (debug > 1) { + (void) fprintf(stderr, "~~COMMENT_BLOCK\n"); + } + is_comment = COMMENT_BLOCK; + + /* Consume next_ch. */ + (void) fputc(ch, stdout); + ch = fgetc(fp); + gross_count++; + net_count++; + } + + /* Open single or double quote? */ + else if (is_comment == NO_COMMENT && (ch == '\'' || ch == '"')) { + quote = ch; + } + + (void) fputc(ch, stdout); + +#ifdef DIGRAPHS + /* ISO C11 section 6.4.6 Punctuators, digraphs handled during + * tokenization, but map here and count as 1 byte, like their + * ASCII counter parts. + */ + if (is_comment == NO_COMMENT && quote == 0) { + const char *d; + static const char digraphs[] = "[<:]:>{<%}%>#%:"; + for (d = digraphs; *d != '\0'; d += 3) { + if (ch == d[1] && next_ch == d[2]) { + (void) fputc(next_ch, stdout); + (void) fgetc(fp); + gross_count++; + ch = d[0]; + break; + } + } + } +#endif + /* Sanity check against file size and wc(1) byte count. */ + gross_count++; + + /* End of possible keyword? Care with #word as there can + * be whitespace or comments between # and word. + */ + if ((word[0] != '#' || 1 < wordi) && !isalnum(ch) && ch != '_' && ch != '#') { + if (find_member(cwords, word) != NULL) { + /* Count keyword as 1. */ + net_count = net_count - wordi + 1; + keywords++; + if (debug > 1) { + (void) fprintf(stderr, "~~keyword %zu \"%s\"\n", keywords, word); + } + } + word[wordi = 0] = '\0'; + } + + /* Ignore all whitespace. */ + if (isspace(ch)) { + if (debug > 2) { + (void) fprintf(stderr, "~~ignore whitespace %#02x\n", ch); + } + continue; + } + + /* Ignore begin/end block and end of statement. */ + if (strchr("{;}", ch) != NULL && (isspace(next_ch) || next_ch == EOF)) { + if (debug > 2) { + (void) fprintf(stderr, "~~ignore %c\n", ch); + } + continue; + } + + /* Collect next word not in a string or comment. */ + if (quote == is_comment && (isalnum(ch) || ch == '_' || ch == '#')) { + if (sizeof (word) <= wordi) { + wordi = 0; + } + word[wordi++] = (char) ch; + word[wordi] = '\0'; + } + + net_count++; + } + + /* + * The original author was not entirely in agreement with printing + * these warnings, since he believes that its the programmer's job to + * be cognisant of the rules, guidelines, and the state of their work. + * + * The IOCCC judges observe that enough IOCCC submitters are not so + * cognizant (cognisant) and so make these warnings manditory in the + * hopes it will reduce the number of entries that violate the IOCCC + * size rules. + */ + if (debug == 0) { + if (MAX_SIZE < gross_count) { + (void) fprintf(stderr, "warning: size %zu exceeds Rule 2a %u\n", gross_count, MAX_SIZE); + } + if (MAX_COUNT < net_count) { + (void) fprintf(stderr, "warning: count %zu exceeds Rule 2b %u\n", net_count, MAX_COUNT); + } + } + + (void) fprintf(stderr, out_fmt, net_count, gross_count, keywords); +} + +int +main(int argc, char **argv) +{ + int ch; + + while ((ch = getopt(argc, argv, "6ihv")) != -1) { + switch (ch) { + case 'i': /* ignored for backward compatibility */ + break; + + case 'v': + debug++; + out_fmt = "%lu %lu %lu\n"; + break; + + case '6': /* You're a RTFS master! Congrats. */ + errx(6, "There is NO... Rule 6!\nI'm not a number!\nI'm a free(void *man)!\n"); + + case 'h': + default: + errx(2, "%s", usage); + } + } + + (void) setvbuf(stdin, NULL, _IOLBF, 0); + + /* The Count - 1 Muha .. 2 Muhaha .. 3 Muhahaha ... */ + rule_count(stdin); + + /* + * All Done!!! All Done!!! -- Jessica Noll, age 2 + */ + return 0; +} diff --git a/2020/iocccsize.mk b/2020/iocccsize.mk new file mode 100644 index 000000000..742f2fca3 --- /dev/null +++ b/2020/iocccsize.mk @@ -0,0 +1,61 @@ +#!/usr/bin/env make +# +# iocccsize - IOCCC Source Size Tool +# +# This IOCCC size tool source file is version 2019-06-20-v27. +# +# "You are not expected to understand this" :-) +# +# Public Domain 1992, 2015, 2018, 2019 by Anthony Howe. All rights released. +# With IOCCC minor mods in 2019 by chongo (Landon Curt Noll) ^oo^ + +.POSIX : + +O := .o +E := + +.SUFFIXES : +.SUFFIXES : .c .h .i $O $E + +######################################################################## +### No further configuration beyond this point. +######################################################################## + +top_srcdir := .. +PROJ := iocccsize +TAR_I := -T +CFLAGS := -g -std=c11 -Wall -Wextra -Wno-char-subscripts -pedantic +CFLAGS89 := -g -std=c89 -Wall -Wextra -Wno-char-subscripts -pedantic +CPPFLAGS := +LIBS := + +.c.i: + ${CC} -E ${CFLAGS} ${CPPFLAGS} $*.c >$*.i + +.c$E: + ${CC} ${CFLAGS} ${CPPFLAGS} -o$*$E $*.c + +####################################################################### + +all: build + @true + +build: ${PROJ} + +clean: + -rm -f ${PROJ}.i ${PROJ}$O *.stackdump *.core + +clobber: distclean + +distclean: clean + -rm -fr ${PROJ}$E test a.out + -rm -fr decom a.out iocccsize.dSYM + +test: ./${PROJ}-test.sh ${PROJ} + ./${PROJ}-test.sh -v + +unittest: test + ./${PROJ}-test.sh -v + +version: + git describe --tags --abbrev=0 >VERSION diff --git a/2020/rules.txt b/2020/rules.txt new file mode 100644 index 000000000..6ce9a93cf --- /dev/null +++ b/2020/rules.txt @@ -0,0 +1,278 @@ +| 27th International Obfuscated C Code Contest Official Rules + +| Copyright (C) 2006-2019 Leonid A. Broukhis, Simon Cooper, Landon Curt Noll + +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided this this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in +writing from the contest judges. + + Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: his emotions obfuscated his + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + + +| This rules file is version 2019-06-15-v27. + +Most of the changes from the previous IOCCC rule set have +been marked with a "|" on the left hand side of the line. + + +GOALS OF THE CONTEST: + + * To write the most Obscure/Obfuscated C program under the rules below. + * To show the importance of programming style, in an ironic way. + * To stress C compilers with unusual code. + * To illustrate some of the subtleties of the C language. + * To provide a safe forum for poor C code. :-) + + This IOCCC runs from: + +| 2019-Dec-26 06:01:41 UTC + to: +| 2020-Mar-15 06:26:49 UTC + + Until the start of this IOCCC, these rules, guidelines and iocccsize.c tool + should be considered provisional BETA versions and may be adjusted + at any time. + + The IOCCC submission URL is: + + https://submit.ioccc.org/ + +| The submit URL should be active on or slightly before 2020-Jan-15 12:21:37 UTC. + Please wait to submit your entries until after that time. + + The official rules, guidelines and iocccsize.c tool will be available + on the official IOCCC web site on or slightly before start of this IOCCC. + Please check the IOCCC web site "How to enter" link: + + http://www.ioccc.org/index.html#enter + + on or after the start of this IOCCC to be sure you are using the correct + versions of these items before using the IOCCC entry submission URL. + + +RULES: + + To help us with the volume of entries, we ask that you follow these rules: + + 1) Your entry must be a complete program. + +| 2) This size rule requires your entry to satisfy BOTH rule 2a and rule 2b: + + 2a) The size of your program source must be <= 4096 bytes in length. + + 2b) When your program source is fed as input to the current IOCCC size + tool, and the IOCCC size tool -i command line option is used, the + value printed shall not exceed 2053. + + The source to the current IOCCC size tool is found at this URL: + +| http://www.ioccc.org/2020/iocccsize.c + + 3) Submissions should be performed using the instructions outlined at: + + https://submit.ioccc.org/ + +| The submit URL should be active on or slightly before 2020-Jan-15 12:21:37 UTC. + Please wait to submit your entries until after that time. + + 4) If your entry is selected as a winner, it will be modified as follows: + + Your 'build' instructions will be incorporated into a makefile. + + Your source code will be the file prog.c. The compiled binary + will be called prog. + + 5) Your entry must not modify the content or filename of any part of your + original entry including, but not limited to prog.c, the Makefile + (we create from your how to build instructions), as well as any data + files you submit. + + If you entry wishes to modify such content, it must first copy the + file to a new filename and then modify that copy. + + 6) I am not a rule, I am a free(void *man)! + +| while (!understand(ioccc(rule(you(are(number(6))))))) { ha_ha_ha(); } + + 7) The obfuscated C program must be an original work that you own. + + You (the authors) must own the contents of your submission OR + you must have permission from the owners to submit their content + under the Creative Commons Attribution-ShareAlike 3.0 Unported + (CC BY-SA 3.0) license (see rule 18). + + If you submit any content that is owned by others, you MUST + detail that ownership (i.e., who owns what) and document the + permission you obtained. + + Please note that the IOCCC size tool is not an original work. + +| 8) Entries must be received prior to the end of this IOCCC which is: + +| 2020-Mar-15 06:26:49 UTC + + A confirmation of submission will be sent to the submitter + email address before the close of the contest. + +| 9) Each person may submit up to and including 8.000000 entries per contest. + Each entry must be submitted separately. + + 10) Entries requiring human interaction to be initially compiled are + not permitted. + + 11) Programs that require special privileges (setuid, setgid, super-user, + special owner, special group, etc.) are still highly discouraged. We + do not guarantee these functions will behave as you expect on our test + platforms. If your program needs special permissions please document + them in the remarks file. + + 12) Legal abuse of the rules is somewhat encouraged. An entry that, in + the opinion of the judges, violates the rules will be disqualified. + Entries that attempt to abuse the rules must try to justify why + their rule abuse is legal in the remarks file. + + 13) Any C source that fails to compile because of unescaped octets with + the high bit set (octet value >= 128) will be rejected. + + 14) Any C source that fails to compile because of lines with trailing + control-M's (i.e., lines with a tailing octet 015) will be rejected. + + Please do not put trailing control-M's on remarks file lines. + Please check to be sure, before submitting, that you have removed + any control-M at the end of remark file lines. + + 15) When you submit your entry you must have a valid email address + that can both send and receive email. The online submission + method is a two phase process that requires the use of an + approval code. This code will be emailed to you as part of + phase 1. + + Entries submitted without a working or valid email address will + be disqualified. + + The judges are not responsible for delays in email, please plan + enough time for one automated exchange of email as part of your + submission. + + After your email address has been confirmed, the submission code will + be valid for submitting and editing the entry for the lifetime of the + competition. + + 16) You are STRONGLY encouraged to submit a previously unpublished and + original entry. Submissions that are similar to previous entries are + discouraged. As we judge anonymously, submissions that have already + been published may be disqualified. + + 17) The total size of your submission: the sum of the size of the program, + hints, comments, build and info files MUST be less than or equal + to 1048576 octets in size. + + 18) The entirety of your entry must be submitted under the Creative Commons + Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0): + + http://creativecommons.org/licenses/by-sa/3.0/ + + You must not submit anything that cannot be submitted under that license. + + 19) The remarks file must be written in markdown format. See: + + http://daringfireball.net/projects/markdown/basics + + for more information. + + We currently use "Discount" to convert markdown to HTML + + http://www.pell.portland.or.us/~orc/Code/discount/ + + 20) The how to build instructions must be in make form. + + The target of the make file must be called prog. The original + C source file must be called prog.c. + + To invoke the C compiler, use ${CC}. + To invoke the C preprocessor use ${CPP}. + + Do not assume that . (the current directory) is in the $PATH. + + Use a shell command syntax that is compatible with bash. + + Assume that commands commonly found in POSIX-like / Linux-like systems + are available in the search path. + + Do not assume any particular given value of ${CFLAGS} or other + commonly used make variables. + + 21) Your entry must not create nor modify files above the current directory + with the exception of the /tmp and the /var/tmp directories. Your entry + may create subdirectories below the current directory, or in /tmp, + or in /var/tmp provided that "." is not the first octet in any + directory name. + + 22) Catch 22: + + Your source code, data files, remarks and program output must NOT + identify the authors of your code. The judges STRONGLY prefer to + not know who is submitting entries to the IOCCC. + + Even if you are a previous IOCCC winner, catch 22 still applies. + + Identifying the authors of your entry in an obvious way anywhere + within in your code, data, remarks or program output (unless you are + Peter Honeyman or pretending to be Peter Honeyman) will be grounds + for disqualification of your entry. + + Yes, Virginia, we really mean it! + + 23) This prime rule number is reserved for future use. + + 24) Even though 24 is not prime, you should still see rule #23. + +| 25) The IOCCC rule set consists of at least 26 rules. + +| 26) Rule 26 is also a rule. + + +FOR MORE INFORMATION: + + The judging will be done by Leonid A. Broukhis, Simon Cooper, + Landon Curt Noll. + + Please send questions or comments about the contest, to: + +| q.2020@ioccc.org (for questions only!) + + You must include the words: + +| ioccc 2020 question + +| in the subject of your Email message when sending Email to the judges. + + The rules and the guidelines may (and often do) change from year to + year. You should be sure you have the current rules and guidelines + prior to submitting entries. To obtain them, visit the IOCCC web page: + + http://www.ioccc.org + + It has rules, guidelines and winners of previous contests (1984 to date). + + For the updates and breaking IOCCC news, you are encouraged to follow + the twitter handle: + + @IOCCC + + You do not have to be a twitter user to follow @IOCCC. Non-twitter + users should access: + + https://twitter.com/ioccc + + Non-twitter users should force their browsers to reload the above URL + to be sure they are seeing the most recent tweets. + +Leonid A. Broukhis +Simon Cooper +chongo (Landon Curt Noll) /\cc/\ diff --git a/2020/whowon.html b/2020/whowon.html new file mode 100644 index 000000000..ab4e7e069 --- /dev/null +++ b/2020/whowon.html @@ -0,0 +1,131 @@ + + + + + + + + + The 27<sup>th</sup> IOCCC Winners + + +
    + IOCCC +

    The International Obfuscated C Code Contest

    + +

    The 27th IOCCC Winners

    +
    + + +

    Here are the names and categories for the winners of the 27th IOCCC:

    + + + +

    The Judges annoucement and notes for the 27th IOCCC.

    + +

    +


    + + + + + + + + +
    +Creative Commons License +

    This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis +is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

    +
    + + + diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..e67f79ac1 --- /dev/null +++ b/Makefile @@ -0,0 +1,40 @@ +# %W% %G% %U% +# +# Copyright (c) 1993, Landon Curt Noll & Larry Bassel. +# All Rights Reserved. Permission for personal, educational or non-profit +# use is granted provided this this copyright and notice are included in its +# entirety and remains unaltered. All other uses must receive prior permission +# in writing from both Landon Curt Noll and Larry Bassel. + + +SHELL=/bin/sh + +all: + @-for i in [12][0-9][0-9]?; do \ + if [ -f $$i/[Mm]akefile ]; then \ + echo "cd $$i; make all"; \ + (cd $$i; make all); \ + fi; \ + done + +clean: + @-for i in [12][0-9][0-9]?; do \ + if [ -f $$i/[Mm]akefile ]; then \ + echo "cd $$i; make clean"; \ + (cd $$i; make clean); \ + fi; \ + done +clobber: + @-for i in [12][0-9][0-9]?; do \ + if [ -f $$i/[Mm]akefile ]; then \ + echo "cd $$i; make clobber"; \ + (cd $$i; make clobber); \ + fi; \ + done +install: + @-for i in [12][0-9][0-9]?; do \ + if [ -f $$i/[Mm]akefile ]; then \ + echo "cd $$i; make install"; \ + (cd $$i; make install); \ + fi; \ + done diff --git a/all/README b/all/README new file mode 100644 index 000000000..7cab6adee --- /dev/null +++ b/all/README @@ -0,0 +1,176 @@ + The International Obfuscated C Code Contest + +Copyright (c) Landon Curt Noll, Simon Cooper, Peter Seebach +and Leonid A. Broukhis, 2001-2009. +All Rights Reserved. Permission for personal, educational or non-profit +use is granted provided this this copyright and notice are included in its +entirety and remains unaltered. All other uses must receive prior permission +from the contest judges. + +Obfuscate: tr.v. -cated, -cating, -cates. 1. a. To render obscure. + b. To darken. 2. To confuse: Their emotions obfuscated their + judgment. [LLat. obfuscare, to darken : ob(intensive) + + Lat. fuscare, to darken < fuscus, dark.] -obfuscation n. + obfuscatory adj. + + + Last updated: Tue Jun 29 13:29:27 PDT 1999 + +The official IOCCC web site is: + + http://www.ioccc.org + + +How it was started: + +The original inspiration of the International Obfuscated C Code +Contest came from the Bourne Shell source and the finger command as +distributed in 4.2BSD. If this is what could result from what some +people claim is reasonable programming practice, then to what depths +might quality sink if people really tried to write poor code? + +I put that question to the USENET news groups net.lang.c and +net.unix-wizards in the form of a contest. I selected a form similar +to the contest (Bulwer-Lytton) that asks people to create the worst +opening line to a novel. (that contest in turn was inspired by disgust +over a novel that opened with the line "It was a dark and stormy +night.") The rules were simple: write, in 512 bytes or less, the worst +complete C program. + +Thru the contest I have tried to instill two things in people. First +is a disgust for poor coding style. Second was the notion of just how +much utility is lost when a program is written in an unstructured +fashion. Contest winners help do this by what I call satirical +programming. To see why, observe one of the definitions of satire: + + Keen or energetic activity of the mind used for the purpose + of exposing and discrediting vice or folly. + +The authors of the winning entries placed a great deal of thought into +their programs. These programs in turn exposed and discredited what I +considered to be the programmer's equivalent of "vice or folly". + +There were two unexpected benefits that came from the contest winners. +First was an educational value to the programs. To understand these C +programs is to understand subtle points of the C programming language. +The second benefit is the entertainment value, which should become +evident as you read further! + + + +Suggestions on how to understand the winning entries: + +You are strongly urged to try to determine what each program will +produce by visual inspection. Often this is an impossible task, but +the difficulty that you encounter should give you more appreciation +for the entry. + +If you have the energy to type in the text, or if you have access to +a machine readable version of these programs, you should next consider +some preprocessing such as: + + sed -e '/^#.*include/d' program.c | cc -E + +This strips away comments and expands the program's macros without +having things such as macros clutter up the output. If the +entry requires or suggests the use of compile line options (such as +-Dindex=strchr) they should be added after the '-E' flag. + +The next stage towards understanding is to use a C beautifier or C +indenting program on the source. Be warned that a number of these +entries are so twisted that such tools may abort or become very +confused. You may need to help out by doing some initial formatting +with an editor. You might also try renaming variables and labels to +give more meaningful names. + +Now try linting the program. You may be surprised at how little lint +complains about these programs. Pay careful attention to messages +about unused variables, wrong types, pointer conversions, etc. But be +careful, some lints produce incorrect error messages or even abort! +Your lint may detect syntax errors in the source. See the next +paragraph for suggestions on how to deal with this. + +When you get to the stage where you are ready to compile the program +examine the compilation comments above each entry. A simple define or +edit may be required due to differing semantics between operating +systems. If you are able to successfully compile the program, +experiment with it by giving it different arguments or input. +You may also use the makefile provided to compile the program. +Keep in mind that C compilers often have bugs, or features which +result the program failing to compile. You may have to do some +syntax changing as we did to get old programs to compile on strict +ANSI C compilers. + +Last, read the judges' comments/spoilers on the program. Hints +for `foo.c' are given in `foo.hint'. Often they will contain suggested +arguments or recommended data to use. + +If you do gain some understanding of how a program works, go back to +the source and reexamine it using some of the techniques outlined above. +See if you can convince yourself of why the program does what it does. + + +Regarding the source archive: + +Each sub-directory contains all the entries for a single year. Often +the file names match one of the last names of the author. Judges' +hints are given in files of the form ``*.hint''. + +You may need to tweak the Makefile to get everything to compile correctly. +Read the hint files for suggestions. + +The rules for a given year are given in the file named ``rules''. Each +archive contains a copy of the rules for the upcoming contest. + +The following URL is the official archive of the winning entries: + + http://www.ioccc.org/years.html + + +Regarding the distribution of sources: + +All contest results are in the public domain. We do ask that you observe +the following request: + +You may share these files with others, but please do not prevent them of +doing the same. If some of these files and/or contest entries are +published in printed form, or if you use them in a business or classroom +setting, please let us know. We ask that you drop a line to the +'judges' EMail box. See the following page for instructions on +how to send us a message, + + http://www.ioccc.org/contact.html + +Some final things to remember: + +While the idea for the contests has remained the same through the +years, the contest rules and guidelines vary. What was novel one year +may be considered common the next. The categories for awards differ +because they are determined after the judges examine all of the +entries. + +The judges' hints assume that the program resides in a file with the +same username as the author. Where there is more than one author, the +first named author is used. + +Some C compilers are unable to compile some of these programs. The +judges tried to select programs that were widely portable and +compilable, but did not always succeed. As of 1990, and entry +may use both ``K&R'' and ANSI C compilers. Makefiles for both +types of C compilers are used. See the contest rules for details. + +You are strongly encouraged to read the new contest rules before +sending any entries. The rules, and sometimes the contest Email +address itself, change from time to time. A valid entry one year may +be rejected in a later year due to changes in the rules. See: + + http://www.ioccc.org/index.html#enter + +for up to date information on how to enter. + +Last, PLEASE don't code in the style of these programs It is hoped that +you will gain an understanding that poor style destroys an otherwise +correct program. Real programmers don't write obfuscated programs, +unless they are submitting a contest entry! :-) + +Happy pondering! diff --git a/all/all.tar.bz2 b/all/all.tar.bz2 new file mode 100644 index 000000000..890ab0551 Binary files /dev/null and b/all/all.tar.bz2 differ diff --git a/all/summary.txt b/all/summary.txt new file mode 100644 index 000000000..0793776a1 --- /dev/null +++ b/all/summary.txt @@ -0,0 +1,354 @@ +# yr filename Spoiler summary +# + +1984 anonymous prints hello world, where read is write +1984 decot prints garbage, weird cpp defines (keywords for others) +1984 laman prints spiralling numbers, laid out in columns +1984 mullender hardcoded vax and pdp-11 code to move :-) across the screen + +1985 applin one-liner to print hello world, with execlp +1985 august cpp obfuscated, compressed, main-recursive primes in binary +1985 lycklama heavily cpped with o_oo identifiers, scrolls text right +1985 shapiro two defines, one 7-liner, results in a maze +1985 sicherman rot13 with strange #defs that create comment headers etc. + +1986 applin hello world works under cc, /bin/sh, and f77 +1986 august struct-heavy e-computation, memory allocation with sbrk +1986 bright hex dump, cpp compressed, uses lost of << for constants +1986 hague morse code filter written with 'DIT DAH _DIT DIT_DAH' +1986 holloway prints hello world! via a recursive main +1986 marshall train engine-shaped program prints "choo choo" +1986 pawka prints 'obfuscated?' big, uses xyyyx idents... +1986 stein prints HHMMSS in UTC time +1986 wall dvorak keyboard emulator + +1987 biggar program: "P;" defined on command line +1987 heckbert obfuscated fold program +1987 hines counts goto's, all ids anagrams of 'goto', all flow w goto +1987 korn one-liner that prints a message on a Un*x system +1987 lievaart very good othello player +1987 wall roman numeral -> decimal and vice versa conversion +1987 westley individually palindromic lines prints a palindrome + +1988 applin massive #define stuff, includes itself; prints table of primes +1988 dale prints command line, using lots of system calls +1988 isaak table driven table of the elements; cpp, self-inclusion +1988 litmaath sorts each arg using only argc, argv, and 'while();' +1988 phillipps 'first day of christmas', tables, heavily main() calling +1988 reddy prints name of 'char *(*(foo[16])();', compressed +1988 robison print e in any base, uses only --, >=, and while() +1988 spinellis #include "/dev/tty" +1988 westley prints '3.141', circle made of '_-_-_-_' in layout + +1989 fubar self-reconstructing, recompiling factorial program +1989 jar.1 char*_="Hello world.\n"; +1989 jar.2 lisp interpreter, compressed +1989 ovdluhe monkey-typer following template, 'APE' identifiers +1989 paul print fibonacci base 2 by simulating turing machine +1989 robison apl-expression interpreter (binary), written in C-- +1989 roemer prints e, script-pi shaped layout, _31415 identifiers +1989 tromp squished tetris +1989 vanb one-liner prints all subsets of arguments +1989 westley reversible, rot13able program that reverses and/or rot13s. + +1990 baruch short prog to solve N-queens problem +1990 cmills squished blackjack game +1990 dds basic interpreter, heavily compressed +1990 dg rot13 done with strange cpp macros +1990 jaw compress & atob standins +1990 pjr the quick brown fox... cppd, structs of functions +1990 scjones trigraph-abusing self-reproducing program +1990 stig nested-comment tester (all on command line) +1990 tbr simple compressed shell, silly layout +1990 theorem numerically solves the equation y'=f(x,y) +1990 westley poetic exchange between lovers, prints "luvs me, luvs not" + +1991 ant compressed vi-like editor +1991 brnstnd sorta stack language +1991 buzzard walk thru a maze from a first person point of view +1991 cdupont prints a message without vowels +1991 davidguy plays life on a root window, doesn't need Xlib or include files +1991 dds basic compiler, heavily compressed +1991 fine rot13s lines of input +1991 rince game with sprites, boulders, dimonds, and keys +1991 westley plays tic-tac-toe, compile output for next move, prints board + +1992 adrian grep-like utility using a state machine transition language +1992 albert factors multi-precision numbers with factors < MAX_LONG +1992 ant make utility +1992 buzzard.1 print factorial, gcd or prime test using a Babbage-like engine +1992 buzzard.2 forth-like stack machine +1992 gson anagram generator +1992 imc Mandelbrot/Julia drawer +1992 kivinen X11 space invaders, dropout and knockout games +1992 lush prints "Hello, World" using error messages +1992 marangon game to balance a grid of digits to all 5's +1992 nathan obfuscation by (trivial) encryption (source not exported) +1992 vern plays chess +1992 westley print ASCII world map and mark a location by lat/long + +1993 ant egrep utility with Posix-like documentation +1993 cmills X11 program that shatters and bounces windows +1993 dgibson plays the game of like using cpp +1993 ejb tower of Hanoi and patience pizzle +1993 jonth game of Tetris +1993 leo game of mastermind (cows & bulls) +1993 lmfjyh source is the filename, prints value of __FILE__ +1993 plummer prints numbers up to a given value +1993 rince game state machine language, comes with a number of games +1993 schnitzi answers questions about English text in a file +1993 vanb calculator that prints in octal + +1994 dodsond1 plays a game of othello +1994 dodsond2 Hunt the Wumpus (gziped source) +1994 horton Plot cubic equations on a tty +1994 imc print a random n by n magic square +1994 ldb print a random line from stdin +1994 schnitzi flips stdin along a diagonal (source mirrored along diagonal) +1994 shapiro print time of day on an tty +1994 smr world's smallest self reproducing program +1994 tvr interactive fractals for the X Window System +1994 weisberg prints prime numbers +1994 westley Adventure/Dungeon like game played via the C pre-processor + +1995 cdua Generate a maze on the scren and then solve it +1995 dodsond1 Text to "Pig Latin" translator +1995 dodsond2 Interactive 3D Maze +1995 esde Searches for words in a file which have the same Soundex code +1995 garry Environment-expansion and binary output via escaped env vars +1995 heathbar 16 bit addition the easy/hard way +1995 leo Output interesting patterns and cycles in PostScript +1995 makarios Emits the base 8 representation of prime palindromic in base 8 +1995 savastio Infinite-precision factorial calculator +1995 schnitzi Find divisors: where a core dump is a feature, not a bug +1995 spinellis Abusing the rules +1995 vanschnitz Towers of Hanoi via the C pre-processor + +1996 august Subset of C compiler and byte code interpreter +1996 dalbec Generator of strong probable-primes to a given base +1996 eldby Flying 3D spheres in an ASCII display +1996 gandalf Displays the ASCII and 8 bit character tables +1996 huffman Braille to ASCII and vice versa +1996 jonth X based dual player tic-tac-toe game +1996 rcm Gunzip equivalent +1996 schweikh1 Calculates Easter dates from 1582 to 2199 AD +1996 schweikh2 Search for a limited class of expressions that equal a constant +1996 schweikh3 Determins the memory allocation honesty of the OS +1996 westley Shows the time on clock with a configurable face and style + +# There is no 1997 IOCCC contest + +1998 banks A flight simulator! +1998 bas1 Outputs a gziped 3D beam maze in Postscript +1998 bas2 determines the size of stdin under IOCCC sizing rules +1998 chaos Rotates and zooms an object using ASCII graphics +1998 df A word guessing game +1998 dlowe Pootifies stdin (useful to view Microsoft html files) +1998 dloweneil A very addictive ASCII poot game +1998 dorssel ASCII / Morse code translator +1998 fanf Translates Lambda expressions into combinator expressions +1998 schnitzi Prints a C program that sorts arguments using strange functions +1998 schweikh1 Tests to see if your compiler and headers are standard +1998 schweikh2 Prints random 0's and 1's; causes some gcc's as passes to choke +1998 schweikh3 Finds duplicate files that waste disk space +1998 tomtorfs CRC generator + +# There is no 1999 IOCCC contest + +2000 anderson ASCII to semaphore code convertor +2000 bellard Prints M6972593 (2^6972593-1) by Modular Fast Fourier Transform +2000 bmeyer An image compressor +2000 briddlebane Verbally abuses the user +2000 dhyang Saitou Hajime image that prints a prog that prints a prog ... +2000 dlowe A dc-style calculator that uses embedded Perl +2000 jarijyrki An X-based spreadsheet program with graphing features! +2000 natori Phase of the moon +2000 primenum Source with English words that looks like a prime tester +2000 rince Plots the positions of the four Galilean moons of Jupiter +2000 robison Highly Compressed Program for Playing Hygienic Checkers +2000 schneiderwent Prints the aproximate time in words +2000 thadgavin Prints a dazzeling moving image under multiple interfaces +2000 tomx C source, shell program and Makefile + +2001 anonymous optimizing dynamic binary translator, x86 progs on any host +2001 bellard A C subset programming system for x86 +2001 cheong Computes arbitrary-precision square root +2001 coupard Outputs current time as a sound file +2001 ctk A driver game +2001 dgbeards Plays suicide chess +2001 herrmann1 A Turing machine using preprocessor +2001 herrmann2 A SIRDS/3D generator, the source is SIRDS/3D itself +2001 jason An Adventure-like game +2001 kev A Pong game across network +2001 ollinger Prints primes with a sieve graph +2001 rosten Makes X mouse pointer have inertia or anti-inertia +2001 schweikh Shell glob matcher +2001 westley Sorts/scrambles, outputs as text/punch-cards +2001 williams Plays X-based missile command + +# There is no 2002 IOCCC contest + +# There is no 2003 IOCCC contest + +2004 anonymous Rendering of a stroked font +2004 arachnid Curses maze displayer/navigator with only line-of-sight visibility +2004 burley A Poker game +2004 gavare A ray tracer +2004 gavin Mini-OS +2004 hibachi A CGI capable HTTP server +2004 hoyle Curses based polynomial graphing with auto-scale +2004 jdalbec Conway's look'n'say sequence split into elements +2004 kopczynski OCR of 8, 9, 10 and 11 +2004 newbern Renders arbitary bitmapped fonts +2004 omoikane A CRC inserter +2004 schnitzi Editor animation +2004 sds Space/tab/linefeed steganography +2004 vik1 X Windows car racing game +2004 vik2 Calculates prime numbers using only CPP + +2005 aidan Sudoku solver +2005 anon Multi-dimensional sliding tile puzzle generator +2005 boutines Voronoi diagram generator +2005 chia Java parody +2005 giljade 2D sliding tile puzzle solver +2005 jetro Audio synthesizer +2005 klausler Anagram generator +2005 mikeash Self-printing Common Lisp interpreter +2005 mynx Web browser +2005 persano Generates animated knots +2005 sykes Commodore PET emulator +2005 timwi A BF lanaguage interpreter +2005 toledo Play chess +2005 vik Wolfenstein style graphics engine +2005 vince Rotating GL Cube demo + +2006 birken Circuit Simulator +2006 borsanyi Email address to gif image +2006 grothe Plays audio using a monitor +2006 hamre A calculator for rational numbers +2006 meyer A two player sudoku like game +2006 monge Graphical fractal generator +2006 night A maze game +2006 sloane Animated donut +2006 stewart IFS fractal generator +2006 sykes1 Bedlam cube solver +2006 sykes2 A clock in one line +2006 toledo1 Solve the knight chess problem +2006 toledo2 An 8080 emulator +2006 toledo3 An X11 chess game + +# There is no 2007 IOCCC contest + +# There is no 2008 IOCCC contest + +# There is no 2009 IOCCC contest + +# There is no 2010 IOCCC contest + +2011 akari Downsampler with 3 embeded programs +2011 blakely Life/reverse life +2011 borsanyi Bar graph plotter +2011 dlowe Neural network classifier +2011 eastman Bouncing Ball in ANSI Graphics +2011 fredriksson Aproximate grep +2011 goren Magritte tribute +2011 hamaji Paint by number puzzle +2011 hou Scientific calculator +2011 konno QWERTY keyboard position identifer +2011 richards JIT dc +2011 toledo Dual player tank shooter game +2011 vik Tracker player +2011 zucker Text raytracing + +2012 blakely Animated GIFs of surfaces +2012 deckmyn Music notation printer +2012 dlowe Conway's game of death +2012 endoh1 ASCII fluid dynamics +2012 endoh2 Pi/e quine +2012 grothe Shamir secret sharing +2012 hamano PDF with little dancing men +2012 hou Syntax highlighter +2012 kang Decodes spelled out numbers +2012 konno Linear cellular automaton 1-liner +2012 omoikane Encodes text as a C program +2012 tromp Lambda interpreter +2012 vik Steganography +2012 zeitak Brace matcher + +2013 birken use Tetris to paint a picture +2013 cable1 1-liner party of a US President +2013 cable2 OCR in quick brown fox ASCII art +2013 cable3 IBM PC emulator +2013 dlowe ASCII spark line graph +2013 endoh1 SKI Combinator Calculus tool +2013 endoh2 JPEG quine that expands and inverts +2013 endoh3 play music with ABC notation +2013 endoh4 ASCII solid rotation +2013 hou ray tracer +2013 mills HTTP server ray tracing a timestamp +2013 misaka horizontal or vertical file concat +2013 morgan1 X11 based Solar system simulator +2013 morgan2 X11 & ASCII domino matching game +2013 robison multi-precision arithmetic + +2014 birken Klingon web server +2014 deak CPP and C99 abuse +2014 endoh1 QR encoder +2014 endoh2 ASCII to DNA transcoder +2014 maffiodo1 homage to a popular game +2014 maffiodo2 ASCII art 1-line converter +2014 morgan make clone +2014 sinon optimizer-controlled shooter game +2014 skeggs dynamic library abusing game +2014 vik Morse audio transcoder +2014 wiedijk Y combinator + +2015 burton hex/decimal calculator +2015 dogon X11 Minecraft demo +2015 duble handwriting with Braille +2015 endoh1 reaction-diffusion system HTTP server +2015 endoh2 hidden text quine +2015 endoh3 1984/mullender emulator +2015 endoh4 visual factorization +2015 hou MD5 without integers +2015 howe diff tool +2015 mills1 flappy bird +2015 mills2 uncompress +2015 muth preprocessor Turing engine +2015 schweikhardt Collatz bignum computation +2015 yang text encoder with sea star pattern, varies with C flavor + +# There is no 2016 IOCCC contest + +# There is no 2017 IOCCC contest + +2018 algmyr Converts text to sound using font as spectrogram +2018 anderson Visualizer of typographic rivers +2018 bellard Image compression demo +2018 burton1 Hex dumper +2018 burton2 Tokenize and count +2018 ciura Strunk & White checker +2018 endoh1 Animated GIF from text +2018 endoh2 Monty-Pythonesque animated quine +2018 ferguson Dawkins' weasel simulator +2018 giles SDL falling sand +2018 hou Converter of JSON to SVG pie chart +2018 mills PDP-7/11 simulator +2018 poikola Ursa Major ASCII animation +2018 vokes Computing strongly connected graph components +2018 yang Text rotator and shifter + +2019 adamovsky Unlambda interpreter +2019 burton Word count +2019 ciura Pangram generator +2019 diels-grabsch1 Tiny compress +2019 diels-grabsch2 Self hashing +2019 dogon X11 Golly game of Life +2019 duble Collaborative graphics editor +2019 endoh Backtrace quine +2019 giles WAV reverberator +2019 karns Breadth-first search on text +2019 lynn Haskell compiler +2019 mills Machine Learning on text +2019 poikola SHA, Prime, Fibonacci +2019 yang Text scrambler diff --git a/contact.html b/contact.html new file mode 100644 index 000000000..9b40da623 --- /dev/null +++ b/contact.html @@ -0,0 +1,51 @@ + + + + + + Contacting the IOCCC Judges + + + +
    IOCCC

    +
    The International Obfuscated C Code +Contest

    +

    [ The judges | +IOCCC home page | +How to enter | +FAQ | +
    +IOCCC news | +People who have won | +Winning entries ]

    +
    + +
    + +

    Contacting the IOCCC Judges

    + +

    If you want to contact the IOCCC please send email to + +

    q.2020@ioccc.org
    + +

    +You must include the following two words (separated by a space) in the subject of your email, otherwise the email will be rejected: + +

    IOCCC 2020
    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2020, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + + + diff --git a/faq.html b/faq.html new file mode 100644 index 000000000..7f669bedb --- /dev/null +++ b/faq.html @@ -0,0 +1,546 @@ + + + + + + + + The FAQ + + + +
    IOCCC

    +
    The International Obfuscated C Code +Contest

    +

    [ The judges | +IOCCC home page | +How to enter | +FAQ | +
    +IOCCC news | +People who have won | +Winning entries ]

    +
    + +
    + +

    The IOCCC FAQ

    + +

    +

    Q: How many entries do you receive each +year? +
    A: By tradition, we do not say. +

    Q: How many judging rounds do you have? +
    A: Are you trying to trick us? We will not say +that either. +

    Q: I cannot get entry xyzzy from year 19xx to compile! +
    A: Some winners, particularly winners from long +ago, no longer compile on more modern systems because the C language has +evolved (i.e. the modern C compilers are much more strict in what they +accept as a valid program), or the entry depended on operation system +and library features that where common back then but are different/missing +today. +
    E.g. it is highly unlikely that you'll be able to execute 1984/mullender on a computer you're using to read this FAQ. +

    Q: I found a bug in a previous winner, what should +I do? +
    A: We do not ``maintain'' the contest winners. +The code is made available on an ``AS IS'' basis. If you have a FIX for +a entry, we suggest that you try and EMail it to the authors and to CC: +us using the instructions on the contacting the IOCCC +Judges page. +
    IF you have a FIX, and IF the author does not object, and IF your fix +looks reasonable, we will add a web link to a copy of your EMail message +for others to see. +

    Q: Are there types of entries that are submitted +so frequently that the judges get tired of them? +
    A: Yes, there are types of entries that show up +over and over again. +
    The guidelines say: +

    We tend to dislike programs that: +
  • are similar to previous winners
  • +
    +We like variety. However too often we see (please look at the winning examples +given to be aware of the level of the competition): + +

    HINT: It is not fatal to send in those types of entries, it is just MUCH +HARDER to win. Such an entry would have to do something really unique and +interesting to even make it into the final judging rounds. Entries that +re-use these 'worn out' themes frequently lose to other entries that do +something different. +

    HINT: If you really MUST send in an entry based on an 'over-used theme', +be sure that it is obfuscated in several new and novel ways. Be sure to clearly +explain near the beginning of your remarks why you are submitting a entry +based on an 'over-used theme' and why the judges should not simply toss +it out as being boring. +

    Q: What should I write in the 'remark' section +of my entry, if anything at all? +
    A: As much or as little as you wish. +

    What helps: +

      +
    • +explaining what your entry does
    • + +
    • +how to entice it to do what it is suppoosed to do
    • + +
    • +what obfuscations are used
    • + +
    • +what are the limitations of your entry in respect of portability and/or input +data
    • + +
    • +how it works (if you are really condescending)
    • +
    +

    What does not help: +

      +
    • +admitting that your entry is not very obfuscated (you see, the contest +is called IOCCC, not INVOCCC); but even if you do not admit it, +not very obfuscated entries have a minuscule chance to win +(although 2000/tomx is a notable counterexample)
    • + +
    • +mentioning your name or any identifying information in the remark section +(or in the C code for that matter) - we like to be unbiased during the +judging rounds; we look at the author name only if an entry wins
    • + +
    • +leaving the remark section empty
    • +
    +

    Q: I am confused: what should I put to the 'build' +section? +
    A: The 'build' section must contain UNIX shell-style +commands to compile your C language entry in a file named prog.c +and produce an executable file. More than one command is allowed, +as far as the size rule is followed. +Usually one (or more) of these commands will be an invocation of +a C compiler (use cc or gcc), but there may be exceptions +(or not anymore, see 2000/tomx). +
    If your entry depends on a particular source file name during +compilation or execution, you will have to put a line +

    cp prog.c desired_name.c
    before the compiler invocation line. +
    If in doubt, put +
    cc -o prog prog.c
    in the 'build' section. +

    Q: What happened to the winners for 1997, 1999 +and 2002? +
    A: There are none. There was no IOCCC in those +years. +

    Q: Why don't you publish non-winners? +
    A: Because the publication on the IOCCC site IS +the award! Anyone is free to put their IOCCC hopefuls, lookalikes and/or +non-winners on their web page for everyone to see. +

    Q: How much time does it take to judge the contest? +
    A: It takes a fair amount of time to setup, run, +answer EMail, process (note that we do not contact the author if an entry +does not compile or does not work as advertised, we might attempt to fix +obvious compilation problems or incompatibilities, but no more than that +- so be sure that your entry does work on at least a couple different platforms, +at least one of them being UNIX or POSIX-conforming) entries, review entries, +trim down the set entries to a set of winners, doing the write-up of the +winners, announcing the winners, reviewing final edits of the winning entry +set, posting the winners, being flamed :-), tell folks who send in late +entries to wait until the next contest, etc... It takes a few weekends +and a number nights of study and work ... which is hard given that we are busy +with many other activities as well. +

    Q: What platform should I assume for my entry? +
    A: Your entry must compile with GCC and run under +at least one flavor of UNIX (e.g. Linux or Solaris). To improve chances +to win, it should work under both BSD and SysV style UNIX (think stty +cbreak), and should not depend on endianness. If it can compile and +run on Windows and/or Mac (see 2000/thadgavin), +even better. +

    Q: I would like to mirror the IOCCC web site. May +I do so? +
    A: Please see: http://www.ioccc.org/mirror-request.html +for more information. +

    Q: I want to publish some parts of the IOCCC in +an article, or book, or newsletter, or use then in class/instructional +notes, or quote from the IOCCC. May I do so? +
    A: Please ask the IOCCC judges first. Please send +your request using the instructions on the contacting +the IOCCC Judges page. +

    Q: What are the grand prize / Best of Show winners? +
    A: In 1984-1987, the grand prize winners are: +

    +
    Starting from 1988, the entry we liked the most in that year is called +"Best of Show". Here are the "Best of Show" entries: + +
    In 1993, 1994 and 1995 the judges were unable to select a clear overall +winner. So to give a nod to the entry that had the highest approval ranking +from the judges, they used the following awards: + +These could be considered the 'better entry' for those years with 1 or +more other entries that came in close behind. + +

    Q: I managed to get entry xyzzy from year 19xx to compile; now it fails to run! +
    A: switch(19xx/xyzzy) {

      +
    • case 1984/mullender: try +
      main(){int i=512;do write(1,"  :-)\b\b\b\b",9),usleep(i);while(--i);}
      +instead.
      Enable reverse wraparound in your xterm window for best results. +
      break; +
    • +

    • case 1991/davidguy: disable access +control of your X server (xhost +). If it does not help (or if you +see black screen), restart the X server without access control and with visual +depth of 8 bits or less. +
      break; +
    • +

    • default: Try enabling -fwritable-strings for GCC +or its equivalent for other compilers. +
    +} + +

    Q: How +did the IOCCC get started? +
    A: + +One day (23 March 1984 to be exact), back Larry Bassel and I (Landon Curt +Noll) were working for National Semiconductor's Genix porting group, we +were both in our offices trying to fix some very broken code. +Larry had +been trying to fix a bug in the classic Bourne shell (C code #defined +to death to sort of look like Algol) and I had been working on the +finger program from early BSD (a bug ridden finger implementation to be +sure). +We happened to both wander (at the same time) out to the hallway +in Building 7C to clear our heads. + +

    + +We began to compare notes: ''You won't believe the code I am trying to +fix''. +And: ''Well you cannot imagine the brain damage level of the code +I'm trying to fix''. +As well as: ''It more than bad code, the author really +had to try to make it this bad!''. + +

    + +After a few minutes we wandered back into my office where I posted a +flame +to net.lang.c +inviting people to try and out obfuscate the +UN*X source code we had just been working on. + +

    + +BTW: +I (Landon Curt Noll) +had to post this +typo +correction. +Thus began the tradition of putting typos in the contest rules and +guidelines ... to make them more obfuscated of course! :-) + +

    + +BTW: +This posting was made back in the days when AT&T was the evil giant. +Now, Microsoft makes AT&T look mild and kind in comparison. :-( (IMHO) ). + +

    + +BTW: +See the story about the '' +Bill +Gates'' award. :-) + +

    + +

    + +OK, back to the story. +We (Larry and I) received a number of entries by EMail. +When we began to receive messages from outside of the US, Larry and I +decided to include International in the name. +The +1st IOCCC winners +were posted on 17 April 1984. + +

    + +There were 4 winners in 1984: + +
      +
    1. <dis>honorable +mention +
    2. 3rd +place +
    3. 2nd +place +
    4. 1st +place +
    + +BTW: +The <dis>honorable +mention wished to remain anonymous. +While many have asked who it was, we have continued to follow the +author's wish to remain anonymous. +A few years ago, we asked the author if they still wanted to remain anonymous. +They said: ''Yes, I want to keep my anonymity. +But you can tell them that I am a well known for my connection to the +C language"''. +It was not until 2001 that another +anonymous +entry received an award. + +

    + +BTW: +The +1984 winner +remains one of my (Landon Curt Noll) all time favorites. + +

    + +The name used in the posting of the +1st +IOCCC winner +posting was International Obfuscated C Code +Contest or IOCCC for short. + +

    +The posting said ''1st annual'', +so in 1985 we held the +2nd IOCCC contest +and the tradition continues as the longest running contest +on the Internet. + +

    + +P.S. Part of the inspiration for making the IOCCC a contest goes to the +Bulwer-Lytton fiction contest. + +

    + +P^2.S. See the +overall README +for more details. + +

    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2020, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + + + diff --git a/guidelines.html b/guidelines.html new file mode 100644 index 000000000..ec32d60e0 --- /dev/null +++ b/guidelines.html @@ -0,0 +1,11 @@ + + + + + + Current IOCCC Guidelines + + +

    The current guidelines

    + + diff --git a/index.html b/index.html new file mode 100644 index 000000000..7ea1c9d25 --- /dev/null +++ b/index.html @@ -0,0 +1,112 @@ + + + + + + + + + The International Obfuscated C Code Contest + + + +
    IOCCC
    Logo by winner Matt Zucker

    +
    The International Obfuscated C Code +Contest

    +

    [ The judges | +IOCCC home page | +How to enter | +FAQ | +Mirrors | +
    +IOCCC news | +People who have won | +Winning entries ]

    + +

    + +


    + +

    The winners of the 27th IOCCC have been announced. Congratulations!

    +

    Please see the following news items.

    + + +
    + +

    Goals of the Contest

    +

    +

      +
    • Obfuscate: tr.v. -cated, -cating, -cates. +
      1. +
        1. To render obscure. +
        2. To darken. +
        +
      2. To confuse: his emotions obfuscated his judgment.
        +[LLat. obfuscare, to darken : ob(intensive) + Lat. fuscare,
        +to darken < fuscus, dark.] -obfuscation n. obfuscatory adj
        +
      +
      +
    • The IOCCC: +
        +
      • To write the most Obscure/Obfuscated C program within the rules. +
      • To show the importance of programming style, in an ironic way. +
      • To stress C compilers with unusual code. +
      • To illustrate some of the subtleties of the C language. +
      • To provide a safe forum for poor C code. :-) +
      +
    + +
    + + +

    IOCCC news

    + +
    • 2020-07-25
      +
    • 2020-03-22
      • Due to current world events, we are extending the 27th IOCCC until 2020-May-15 06:26:49 UTC +
      • The submission tool will now be active until 2020-May-15 06:26:49 UTC +

      +
    • 2019-10-13
      • The source code for the winners of the 26th IOCCC has been released. +
      • The 27th IOCCC will be open from 2019-Dec-26 06:01:41 UTC (Boxing Day)
        to 2020-Mar-15 06:26:49 UTC (Ides of March). +
      • The submission tool will be available around 2020-Jan-15 15:15:15 UTC. +
      • Draft Rules, Guidelines and IOCCC size tool for the 27th IOCCC are available. +

      +
    • 2019-06-16
      • Due to some delays, we now plan to publish source and annotations in early July 2019. +

      +
    • 2019-05-11
      +
    • 2019-03-16
      • The 26th IOCCC is now closed and Judging has commenced. +

      +
    • 2018-12-26
      +
    • 2018-05-06
      • The source code for the winners of the 25th IOCCC has been released. +

      +
    • 2018-04-01
      • The winners of the 25th IOCCC have been announced. Congratulations! +
      • We plan to publish source and annotations in the next 30 days +

      +
    • 2018-02-16
      • Due to a scheduling conflict with one of the IOCCC judges, the 25th IOCCC end date is now the Ideas of March. +
      • Please submit your entries by 2018-Mar-15 03:08:07 UTC. +
      • Updated: The 25th IOCCC will be open from 2017-Dec-29 05:38:51 UTC to 2018-Mar-15 03:08:07 UTC. +

      +
    • 2018-01-19
      • There is a delay in making the submission tool available. Please retry on 2018-Jan-21 23:09:09 UTC. +

      +
    + +

    Older news has been archived, but is not currently available

    + +
    + + + + + +
    Creative Commons License

    © Copyright 1984-2020, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + + + diff --git a/ioccc.css b/ioccc.css new file mode 100644 index 000000000..cb24837ff --- /dev/null +++ b/ioccc.css @@ -0,0 +1,77 @@ +* { + font-family: Helvetica Neue, Helvetica, Arial, sans-serif; +} +body { + max-width: 50em; + margin: 0 auto; + color: #111; +} + +pre, code { + font-family: Monaco, Courier New, monospace; + font-size: 12px; +} + +h1 { + font-size: 40px; + font-weight: bold; + letter-spacing: -1px; + margin-bottom: -5px; +} +h1 code { + font-size: 40px; +} + +h2 { + color: rgb(43,105,145); + font-weight: bold; + margin-bottom: -5px; +} +h2 code { + font-size: 22px; +} + +h3 { + /* color: rgb(43,105,145); */ + font-weight: bold; + margin-bottom: -5px; +} +h3 code { + font-size: 16px; +} + +a { + color: blue; + text-decoration: underline; +} +a:visited { + color: navy; +} +a:hover { + text-decoration: underline; +} + +pre { + border-radius: 10px; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + border-width: 1px; + border-color: rgb(16,48,0); + border-style: solid; + padding: 0.6em; + padding-left: 1em; + margin-left: 5%; + margin-right: 8%; + background-color: rgb(16,48,0); + overflow: auto; + color: rgb(75,224,0); +} + +p, li { + font-size: 14px; + line-height: 18px; +} + diff --git a/ioccc.ico b/ioccc.ico new file mode 100644 index 000000000..b727b5559 Binary files /dev/null and b/ioccc.ico differ diff --git a/judges.html b/judges.html new file mode 100644 index 000000000..436742433 --- /dev/null +++ b/judges.html @@ -0,0 +1,58 @@ + + + + + + The Judges + + + +
    IOCCC

    +
    The International Obfuscated C Code +Contest

    +

    [ The judges | +IOCCC home page | +How to enter | +FAQ | +
    +IOCCC news | +People who have won | +Winning entries ]

    +
    + +
    + +

    The Judges

    + +

    Leonid A. Broukhis -- http://www.mailcom.com/main.shtml

    +

    Simon Cooper -- http://www.sfik.com/

    +

    Landon Curt Noll -- http://www.isthe.com/chongo/

    + + +

    Contacting the IOCCC Judges

    + +

    If you want to contact the IOCCC please send email to + +

    q.2020@ioccc.org
    + +

    +You must include the following two words (separated by a space) in the subject of your email, otherwise the email will be rejected: + +

    IOCCC 2020
    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2020, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + + + diff --git a/main.html b/main.html new file mode 100644 index 000000000..86e5a9430 --- /dev/null +++ b/main.html @@ -0,0 +1,11 @@ + + + +IOCCC Main + + +Your browser should have redirected you to here + + + + diff --git a/mirror-request.html b/mirror-request.html new file mode 100644 index 000000000..25b1fb744 --- /dev/null +++ b/mirror-request.html @@ -0,0 +1,63 @@ + + + +Requesting to mirror the IOCCC + + + + +
    IOCCC

    +
    The International Obfuscated C Code Contest

    +
    Requesting to mirror the IOCCC
    +

    +
    [ The judges | +IOCCC home page | +How to enter | +FAQ | +
    +IOCCC news | +People who have won | +Winning entries ]
    + +

    +




    + +If you want to mirror this site, +especially in an area that we do +not have already covered, +please send EMail to +Simon Cooper at: +

    +
    mirror-request -at- ioccc -dot- org
    + +

    +Please include the following words in the subject of your EMail message: + +
    +

    IOCCC 2009
    + +

    +We will ask you a few questions and provide you with information on how we would prefer you +to mirror the site. + +

    +Please don't start mirroring until we have responded +and processed your mirror request. + +

    +Thank you. We appreciate your interest in mirroring the IOCCC. + +

    +


    + +

    + +Copyright © 2004-2009, Landon Curt Noll, Simon Cooper, Peter Seebach and +Leonid A. Broukhis. All Rights Reserved.
    +Permission for personal, education or non-profit use is +granted provided this copyright and notice are included in its entirety +and remains unaltered. All other uses must receive prior permission in writing +from the contest judges.
    + + + diff --git a/mirror.html b/mirror.html new file mode 100644 index 000000000..c237cd735 --- /dev/null +++ b/mirror.html @@ -0,0 +1,76 @@ + + + + + + Mirrors + + + +

    IOCCC

    +
    The International Obfuscated C Code +Contest

    +

    [ The judges | +IOCCC home page | +How to enter | +FAQ | +
    +IOCCC news | +People who have won | +Winning entries ]

    +
    + +
    + +

    IOCCC Mirrors

    + + + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2020, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + + + diff --git a/png/by-sa-3.0-88x31.png b/png/by-sa-3.0-88x31.png new file mode 100644 index 000000000..f0a944e0b Binary files /dev/null and b/png/by-sa-3.0-88x31.png differ diff --git a/png/ioccc.png b/png/ioccc.png new file mode 100644 index 000000000..5b3bd1b03 Binary files /dev/null and b/png/ioccc.png differ diff --git a/robots.txt b/robots.txt new file mode 100644 index 000000000..736972a72 --- /dev/null +++ b/robots.txt @@ -0,0 +1,18 @@ +# If you are an official mirror you know what the user agent field should be! +# If you want to be an ioccc mirror contact . You +# must include IOCCC 2013 in the subject line or your email will bounce. + +# Added due to slurping up everthing as fast as it could +User-agent: sistrix +Disallow: / + +# I watched this bot for 4 consecutive days, it indexed the whole site 4 times +# each day (using GETs) +User-agent: AhrefsBot +Disallow: / + +# Repeated indexing +User-agent: Ezooms +Disallow: / + +User-Agent: * diff --git a/winners.html b/winners.html new file mode 100644 index 000000000..bc4444620 --- /dev/null +++ b/winners.html @@ -0,0 +1,1393 @@ + + + + + + Winners: The authors of winning IOCCC entries + + + +
    IOCCC

    +
    The International Obfuscated C Code +Contest

    +

    [ The judges | +IOCCC home page | +How to enter | +FAQ | +
    +IOCCC news | +People who have won | +Winning entries ]

    +
    + +

    [ +A   +B   +C   +D   +E   +F   +G   +H   +I   +J   +K   +L   +M   +N   +O   +P   +Q   +R   +S   +T   +U   +V   +W   +X   +Y   +Z +]

    + +

    +


    +

    People Who Have Won

    + + + +

    A is for atoi

    + + + + + +

    B is for break

    + + + + + +

    C is for cc

    + + + + + +

    D is for do

    + + + + + +

    E is for errno

    + + + + + +

    F is for float

    + + + + + +

    G is for goto

    + + + + + +

    H is for hypot

    + + + + + +

    I is for int

    + + + + + +

    J is for jmp_buf

    + + + + + +

    K is for killchar

    + + + + + +

    L is for libc

    + + + + + +

    M is for malloc

    + + + + + +

    N is for nan

    + + + + + +

    O is for open

    + + + + + +

    P is for printf

    + + + + + +

    Q is for qsort

    + + + + +

    R is for realloc

    + + + + + +

    S is for scanf

    + + + + + +

    T is for tmpfile

    + + + + + +

    U is for ungetc

    + + + + +

    V is for vfprintf

    + + + + + +

    W is for while

    + + + + + +

    X is for xor

    + + + + +

    Y is for y0

    + + + + + +

    Z is for zlib

    + + + + + +
    + +
    +

    For sending updates / corrections to this page please visit the +judges page.

    +
    + +
    + + + + + + + +
    Creative Commons License

    © Copyright 1984-2020, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + + + diff --git a/years-spoiler.html b/years-spoiler.html new file mode 100644 index 000000000..68d3ff22f --- /dev/null +++ b/years-spoiler.html @@ -0,0 +1,3740 @@ + + + + + +Previous IOCCC Winners with spoilers + + + + +
    IOCCC
    +
    +
    The International Obfuscated C Code +Contest
    +
    +

    [ The judges | +IOCCC home page | +How to enter | +FAQ | +
    +IOCCC news | +People who have won | +Winning entries ]

    +
    + +
    [ + +2019 | 2018 | 2015 | 2014 | 2013 | 2012 | 2011 | 2006 | 2005 | 2004 | 2001 | 2000 | 1998 | 1996 | 1995 | 1994 | 1993 | 1992 | 1991 | 1990 | 1989 | 1988 | 1987 | 1986 | 1985 | 1984 | ALL ]
    + +
    +
    + +

    Winning Entries

    + + + + +

    26th International Obfuscated C Code Contest (2019)

    + + +

    adamovsky - Unlambda interpreter

    + + + +

    burton - Word count

    + + + +

    ciura - Pangram generator

    + + + +

    diels-grabsch1 - Tiny compress

    + + + +

    diels-grabsch2 - Self hashing

    + + + +

    dogon - X11 Golly game of Life

    + + + +

    duble - Collaborative graphics editor

    + + + +

    endoh - Backtrace quine

    + + + +

    giles - WAV reverberator

    + + + +

    karns - Breadth-first search on text

    + + + +

    lynn - Haskell compiler

    + + + +

    mills - Machine Learning on text

    + + + +

    poikola - SHA, Prime, Fibonacci

    + + + +

    yang - Text scrambler

    + + +
    +

    25th International Obfuscated C Code Contest (2018)

    + + +

    algmyr - Converts text to sound using font as spectrogram

    + + + +

    anderson - Visualizer of typographic rivers

    + + + +

    bellard - Image compression demo

    + + + +

    burton1 - Hex dumper

    + + + +

    burton2 - Tokenize and count

    + + + +

    ciura - Strunk & White checker

    + + + +

    endoh1 - Animated GIF from text

    + + + +

    endoh2 - Monty-Pythonesque animated quine

    + + + +

    ferguson - Dawkins' weasel simulator

    + + + +

    giles - SDL falling sand

    + + + +

    hou - Converter of JSON to SVG pie chart

    + + + +

    mills - PDP-7/11 simulator

    + + + +

    poikola - Ursa Major ASCII animation

    + + + +

    vokes - Computing strongly connected graph components

    + + + +

    yang - Text rotator and shifter

    + + +
    +

    24th International Obfuscated C Code Contest (2015)

    + + +

    burton - hex/decimal calculator

    + + + +

    dogon - X11 Minecraft demo

    + + + +

    duble - handwriting with Braille

    + + + +

    endoh1 - reaction-diffusion system HTTP server

    + + + +

    endoh2 - hidden text quine

    + + + +

    endoh3 - 1984/mullender emulator

    + + + +

    endoh4 - visual factorization

    + + + +

    hou - MD5 without integers

    + + + +

    howe - diff tool

    + + + +

    mills1 - flappy bird

    + + + +

    mills2 - uncompress

    + + + +

    muth - preprocessor Turing engine

    + + + +

    schweikhardt - Collatz bignum computation

    + + + +

    yang - text encoder with sea star pattern, varies with C flavor

    + + +
    +

    23rd International Obfuscated C Code Contest (2014)

    + + +

    birken - Klingon web server

    + + + +

    deak - CPP and C99 abuse

    + + + +

    endoh1 - QR encoder

    + + + +

    endoh2 - ASCII to DNA transcoder

    + + + +

    maffiodo1 - homage to a popular game

    + + + +

    maffiodo2 - ASCII art 1-line converter

    + + + +

    morgan - make clone

    + + + +

    sinon - optimizer-controlled shooter game

    + + + +

    skeggs - dynamic library abusing game

    + + + +

    vik - Morse audio transcoder

    + + + +

    wiedijk - Y combinator

    + + +
    +

    22nd International Obfuscated C Code Contest (2013)

    + + +

    birken - use Tetris to paint a picture

    + + + +

    cable1 - 1-liner party of a US President

    + + + +

    cable2 - OCR in quick brown fox ASCII art

    + + + +

    cable3 - IBM PC emulator

    + + + +

    dlowe - ASCII spark line graph

    + + + +

    endoh1 - SKI Combinator Calculus tool

    + + + +

    endoh2 - JPEG quine that expands and inverts

    + + + +

    endoh3 - play music with ABC notation

    + + + +

    endoh4 - ASCII solid rotation

    + + + +

    hou - ray tracer

    + + + +

    mills - HTTP server ray tracing a timestamp

    + + + +

    misaka - horizontal or vertical file concat

    + + + +

    morgan1 - X11 based Solar system simulator

    + + + +

    morgan2 - X11 & ASCII domino matching game

    + + + +

    robison - multi-precision arithmetic

    + + +
    +

    21st International Obfuscated C Code Contest (2012)

    + + +

    blakely - Animated GIFs of surfaces

    + + + +

    deckmyn - Music notation printer

    + + + +

    dlowe - Conway's game of death

    + + + +

    endoh1 - ASCII fluid dynamics

    + + + +

    endoh2 - Pi/e quine

    + + + +

    grothe - Shamir secret sharing

    + + + +

    hamano - PDF with little dancing men

    + + + +

    hou - Syntax highlighter

    + + + +

    kang - Decodes spelled out numbers

    + + + +

    konno - Linear cellular automaton 1-liner

    + + + +

    omoikane - Encodes text as a C program

    + + + +

    tromp - Lambda interpreter

    + + + +

    vik - Steganography

    + + + +

    zeitak - Brace matcher

    + + +
    +

    20th International Obfuscated C Code Contest (2011)

    + + +

    akari - Downsampler with 3 embeded programs

    + + + +

    blakely - Life/reverse life

    + + + +

    borsanyi - Bar graph plotter

    + + + +

    dlowe - Neural network classifier

    + + + +

    eastman - Bouncing Ball in ANSI Graphics

    + + + +

    fredriksson - Aproximate grep

    + + + +

    goren - Magritte tribute

    + + + +

    hamaji - Paint by number puzzle

    + + + +

    hou - Scientific calculator

    + + + +

    konno - QWERTY keyboard position identifer

    + + + +

    richards - JIT dc

    + + + +

    toledo - Dual player tank shooter game

    + + + +

    vik - Tracker player

    + + + +

    zucker - Text raytracing

    + + +
    +

    19th International Obfuscated C Code Contest (2006)

    + + +

    birken - Circuit Simulator

    + + + +

    borsanyi - Email address to gif image

    + + + +

    grothe - Plays audio using a monitor

    + + + +

    hamre - A calculator for rational numbers

    + + + +

    meyer - A two player sudoku like game

    + + + +

    monge - Graphical fractal generator

    + + + +

    night - A maze game

    + + + +

    sloane - Animated donut

    + + + +

    stewart - IFS fractal generator

    + + + +

    sykes1 - Bedlam cube solver

    + + + +

    sykes2 - A clock in one line

    + + + +

    toledo1 - Solve the knight chess problem

    + + + +

    toledo2 - An 8080 emulator

    + + + +

    toledo3 - An X11 chess game

    + + +
    +

    18th International Obfuscated C Code Contest (2005)

    + + +

    aidan - Sudoku solver

    + + + +

    anon - Multi-dimensional sliding tile puzzle generator

    + + + +

    boutines - Voronoi diagram generator

    + + + +

    chia - Java parody

    + + + +

    giljade - 2D sliding tile puzzle solver

    + + + +

    jetro - Audio synthesizer

    + + + +

    klausler - Anagram generator

    + + + +

    mikeash - Self-printing Common Lisp interpreter

    + + + +

    mynx - Web browser

    + + + +

    persano - Generates animated knots

    + + + +

    sykes - Commodore PET emulator

    + + + +

    timwi - A BF lanaguage interpreter

    + + + +

    toledo - Play chess

    + + + +

    vik - Wolfenstein style graphics engine

    + + + +

    vince - Rotating GL Cube demo

    + + +
    +

    17th International Obfuscated C Code Contest (2004)

    + + +

    anonymous - Rendering of a stroked font

    + + + +

    arachnid - Curses maze displayer/navigator with only line-of-sight visibility

    + + + +

    burley - A Poker game

    + + + +

    gavare - A ray tracer

    + + + +

    gavin - Mini-OS

    + + + +

    hibachi - A CGI capable HTTP server

    + + + +

    hoyle - Curses based polynomial graphing with auto-scale

    + + + +

    jdalbec - Conway's look'n'say sequence split into elements

    + + + +

    kopczynski - OCR of 8, 9, 10 and 11

    + + + +

    newbern - Renders arbitary bitmapped fonts

    + + + +

    omoikane - A CRC inserter

    + + + +

    schnitzi - Editor animation

    + + + +

    sds - Space/tab/linefeed steganography

    + + + +

    vik1 - X Windows car racing game

    + + + +

    vik2 - Calculates prime numbers using only CPP

    + + +
    +

    16th International Obfuscated C Code Contest (2001)

    + + +

    anonymous - optimizing dynamic binary translator, x86 progs on any host

    + + + +

    bellard - A C subset programming system for x86

    + + + +

    cheong - Computes arbitrary-precision square root

    + + + +

    coupard - Outputs current time as a sound file

    + + + +

    ctk - A driver game

    + + + +

    dgbeards - Plays suicide chess

    + + + +

    herrmann1 - A Turing machine using preprocessor

    + + + +

    herrmann2 - A SIRDS/3D generator, the source is SIRDS/3D itself

    + + + +

    jason - An Adventure-like game

    + + + +

    kev - A Pong game across network

    + + + +

    ollinger - Prints primes with a sieve graph

    + + + +

    rosten - Makes X mouse pointer have inertia or anti-inertia

    + + + +

    schweikh - Shell glob matcher

    + + + +

    westley - Sorts/scrambles, outputs as text/punch-cards

    + + + +

    williams - Plays X-based missile command

    + + +
    +

    15th International Obfuscated C Code Contest (2000)

    + + +

    anderson - ASCII to semaphore code convertor

    + + + +

    bellard - Prints M6972593 (2^6972593-1) by Modular Fast Fourier Transform

    + + + +

    bmeyer - An image compressor

    + + + +

    briddlebane - Verbally abuses the user

    + + + +

    dhyang - Saitou Hajime image that prints a prog that prints a prog ...

    + + + +

    dlowe - A dc-style calculator that uses embedded Perl

    + + + +

    jarijyrki - An X-based spreadsheet program with graphing features!

    + + + +

    natori - Phase of the moon

    + + + +

    primenum - Source with English words that looks like a prime tester

    + + + +

    rince - Plots the positions of the four Galilean moons of Jupiter

    + + + +

    robison - Highly Compressed Program for Playing Hygienic Checkers

    + + + +

    schneiderwent - Prints the aproximate time in words

    + + + +

    thadgavin - Prints a dazzeling moving image under multiple interfaces

    + + + +

    tomx - C source, shell program and Makefile

    + + +
    +

    14th International Obfuscated C Code Contest (1998)

    + + +

    banks - A flight simulator!

    + + + +

    bas1 - Outputs a gziped 3D beam maze in Postscript

    + + + +

    bas2 - determines the size of stdin under IOCCC sizing rules

    + + + +

    chaos - Rotates and zooms an object using ASCII graphics

    + + + +

    df - A word guessing game

    + + + +

    dlowe - Pootifies stdin (useful to view Microsoft html files)

    + + + +

    dloweneil - A very addictive ASCII poot game

    + + + +

    dorssel - ASCII / Morse code translator

    + + + +

    fanf - Translates Lambda expressions into combinator expressions

    + + + +

    schnitzi - Prints a C program that sorts arguments using strange functions

    + + + +

    schweikh1 - Tests to see if your compiler and headers are standard

    + + + +

    schweikh2 - Prints random 0's and 1's; causes some gcc's as passes to choke

    + + + +

    schweikh3 - Finds duplicate files that waste disk space

    + + + +

    tomtorfs - CRC generator

    + + +
    +

    13th International Obfuscated C Code Contest (1996)

    + + +

    august - Subset of C compiler and byte code interpreter

    + + + +

    dalbec - Generator of strong probable-primes to a given base

    + + + +

    eldby - Flying 3D spheres in an ASCII display

    + + + +

    gandalf - Displays the ASCII and 8 bit character tables

    + + + +

    huffman - Braille to ASCII and vice versa

    + + + +

    jonth - X based dual player tic-tac-toe game

    + + + +

    rcm - Gunzip equivalent

    + + + +

    schweikh1 - Calculates Easter dates from 1582 to 2199 AD

    + + + +

    schweikh2 - Search for a limited class of expressions that equal a constant

    + + + +

    schweikh3 - Determins the memory allocation honesty of the OS

    + + + +

    westley - Shows the time on clock with a configurable face and style

    + + +
    +

    12th International Obfuscated C Code Contest (1995)

    + + +

    cdua - Generate a maze on the scren and then solve it

    + + + +

    dodsond1 - Text to "Pig Latin" translator

    + + + +

    dodsond2 - Interactive 3D Maze

    + + + +

    esde - Searches for words in a file which have the same Soundex code

    + + + +

    garry - Environment-expansion and binary output via escaped env vars

    + + + +

    heathbar - 16 bit addition the easy/hard way

    + + + +

    leo - Output interesting patterns and cycles in PostScript

    + + + +

    makarios - Emits the base 8 representation of prime palindromic in base 8

    + + + +

    savastio - Infinite-precision factorial calculator

    + + + +

    schnitzi - Find divisors: where a core dump is a feature, not a bug

    + + + +

    spinellis - Abusing the rules

    + + + +

    vanschnitz - Towers of Hanoi via the C pre-processor

    + + +
    +

    11th International Obfuscated C Code Contest (1994)

    + + +

    dodsond1 - plays a game of othello

    + + + +

    dodsond2 - Hunt the Wumpus (gziped source)

    + + + +

    horton - Plot cubic equations on a tty

    + + + +

    imc - print a random n by n magic square

    + + + +

    ldb - print a random line from stdin

    + + + +

    schnitzi - flips stdin along a diagonal (source mirrored along diagonal)

    + + + +

    shapiro - print time of day on an tty

    + + + +

    smr - world's smallest self reproducing program

    + + + +

    tvr - interactive fractals for the X Window System

    + + + +

    weisberg - prints prime numbers

    + + + +

    westley - Adventure/Dungeon like game played via the C pre-processor

    + + +
    +

    10th International Obfuscated C Code Contest (1993)

    + + +

    ant - egrep utility with Posix-like documentation

    + + + +

    cmills - X11 program that shatters and bounces windows

    + + + +

    dgibson - plays the game of like using cpp

    + + + +

    ejb - tower of Hanoi and patience pizzle

    + + + +

    jonth - game of Tetris

    + + + +

    leo - game of mastermind (cows & bulls)

    + + + +

    lmfjyh - source is the filename, prints value of __FILE__

    + + + +

    plummer - prints numbers up to a given value

    + + + +

    rince - game state machine language, comes with a number of games

    + + + +

    schnitzi - answers questions about English text in a file

    + + + +

    vanb - calculator that prints in octal

    + + +
    +

    9th International Obfuscated C Code Contest (1992)

    + + +

    adrian - grep-like utility using a state machine transition language

    + + + +

    albert - factors multi-precision numbers with factors < MAX_LONG

    + +
      +
    • Makefile +
    • albert.c +
    • albert.hint +
    • albert.orig.c +
    • Leo Broukhis (leob _at_ mailcom -dot- com) +reported that this entry still has a +bug that results in an infinite loop while checking 10000000001 instead +of finding the factor 101. +Albert van der Horst did send him an unobfuscated (but somewhat limited +since it doesn't check the number for factors 2, 3, 5, 7) +version of his program. Leo used the unobfuscated version, with the +previously mentioned limitation to fix the 10000000001 bug which +may be found in albert.fix.c. +For more details see Leo's EMail message. +
    + +

    ant - make utility

    + + + +

    buzzard.1 - print factorial, gcd or prime test using a Babbage-like engine

    + + + +

    buzzard.2 - forth-like stack machine

    + + + +

    gson - anagram generator

    + + + +

    imc - Mandelbrot/Julia drawer

    + + + +

    kivinen - X11 space invaders, dropout and knockout games

    + + + +

    lush - prints "Hello, World" using error messages

    + + + +

    marangon - game to balance a grid of digits to all 5's

    + + + +

    nathan - obfuscation by (trivial) encryption (source not exported)

    + +
      +
    • Makefile +
    • nathan.c +
    • nathan.hint +
    • +Brian Westley decided +to just ``screw the (US) government'' and make the real +source available. +The source at that site no longer exists. +Around the same time, were were notified by +Nathan Sidwell +(who lives outside the US) that his +source available on the Web as well. +The source at that site also no longer exists. +

      +Update: We were told that Google has a +comp.lang.c +archive with a copy of the source ported by +Nathan Sidwell. +

      +
    + +

    vern - plays chess

    + + + +

    westley - print ASCII world map and mark a location by lat/long

    + + +
    +

    8th International Obfuscated C Code Contest (1991)

    + + +

    ant - compressed vi-like editor

    + + + +

    brnstnd - sorta stack language

    + + + +

    buzzard - walk thru a maze from a first person point of view

    + + + +

    cdupont - prints a message without vowels

    + + + +

    davidguy - plays life on a root window, doesn't need Xlib or include files

    + +
      +
    • ansi.mk +
    • common.mk +
    • davidguy.c +
    • davidguy.hint +
    • davidguy.orig.c +
    • The "doesn't need Xlib or include files" part resulted in significant bit rot of this entry. +Prof. David Applegate took his time to fix it to search for proper socket type, and to allow the entry to run on displays +with 16-bit color. +

      The fix is applied to the original entry; merging it with the presented code is left +as an exercise for the reader. +

      As before, you need to turn off access control of the X11 server, and to use +a window manager that does not obscure the root window. +

    + +

    dds - basic compiler, heavily compressed

    + + + +

    fine - rot13s lines of input

    + + + +

    rince - game with sprites, boulders, dimonds, and keys

    + + + +

    westley - plays tic-tac-toe, compile output for next move, prints board

    + + +
    +

    7th International Obfuscated C Code Contest (1990)

    + + +

    baruch - short prog to solve N-queens problem

    + + + +

    cmills - squished blackjack game

    + + + +

    dds - basic interpreter, heavily compressed

    + + + +

    dg - rot13 done with strange cpp macros

    + + + +

    jaw - compress & atob standins

    + + + +

    pjr - the quick brown fox... cppd, structs of functions

    + + + +

    scjones - trigraph-abusing self-reproducing program

    + + + +

    stig - nested-comment tester (all on command line)

    + + + +

    tbr - simple compressed shell, silly layout

    + + + +

    theorem - numerically solves the equation y'=f(x,y)

    + + + +

    westley - poetic exchange between lovers, prints "luvs me, luvs not"

    + + +
    +

    6th International Obfuscated C Code Contest (1989)

    + + +

    fubar - self-reconstructing, recompiling factorial program

    + + + +

    jar.1 - char*_="Hello world.\n";

    + + + +

    jar.2 - lisp interpreter, compressed

    + + + +

    ovdluhe - monkey-typer following template, 'APE' identifiers

    + + + +

    paul - print fibonacci base 2 by simulating turing machine

    + + + +

    robison - apl-expression interpreter (binary), written in C--

    + + + +

    roemer - prints e, script-pi shaped layout, _31415 identifiers

    + + + +

    tromp - squished tetris

    + + + +

    vanb - one-liner prints all subsets of arguments

    + + + +

    westley - reversible, rot13able program that reverses and/or rot13s.

    + + +
    +

    5th International Obfuscated C Code Contest (1988)

    + + +

    applin - massive #define stuff, includes itself; prints table of primes

    + + + +

    dale - prints command line, using lots of system calls

    + + + +

    isaak - table driven table of the elements; cpp, self-inclusion

    + + + +

    litmaath - sorts each arg using only argc, argv, and 'while(<cond>);'

    + + + +

    phillipps - 'first day of christmas', tables, heavily main() calling

    + + + +

    reddy - prints name of 'char *(*(foo[16])();', compressed

    + + + +

    robison - print e in any base, uses only --, >=, and while()

    + + + +

    spinellis - #include "/dev/tty"

    + + + +

    westley - prints '3.141', circle made of '_-_-_-_' in layout

    + + +
    +

    4th International Obfuscated C Code Contest (1987)

    + + +

    biggar - program: "P;" defined on command line

    + + + +

    heckbert - obfuscated fold program

    + + + +

    hines - counts goto's, all ids anagrams of 'goto', all flow w goto

    + + + +

    korn - one-liner that prints a message on a Un*x system

    + + + +

    lievaart - very good othello player

    + + + +

    wall - roman numeral -> decimal and vice versa conversion

    + + + +

    westley - individually palindromic lines prints a palindrome

    + + +
    +

    3rd International Obfuscated C Code Contest (1986)

    + + +

    applin - hello world works under cc, /bin/sh, and f77

    + + + +

    august - struct-heavy e-computation, memory allocation with sbrk

    + + + +

    bright - hex dump, cpp compressed, uses lost of << for constants

    + + + +

    hague - morse code filter written with 'DIT DAH _DIT DIT_DAH'

    + + + +

    holloway - prints hello world! via a recursive main

    + + + +

    marshall - train engine-shaped program prints "choo choo"

    + + + +

    pawka - prints 'obfuscated?' big, uses xyyyx idents...

    + + + +

    stein - prints HHMMSS in UTC time

    + + + +

    wall - dvorak keyboard emulator

    + + +
    +

    2nd International Obfuscated C Code Contest (1985)

    + + +

    applin - one-liner to print hello world, with execlp

    + + + +

    august - cpp obfuscated, compressed, main-recursive primes in binary

    + + + +

    lycklama - heavily cpped with o_oo identifiers, scrolls text right

    + + + +

    shapiro - two defines, one 7-liner, results in a maze

    + + + +

    sicherman - rot13 with strange #defs that create comment headers etc.

    + + +
    +

    1st International Obfuscated C Code Contest (1984)

    + + +

    anonymous - prints hello world, where read is write

    + + + +

    decot - prints garbage, weird cpp defines (keywords for others)

    + + + +

    laman - prints spiralling numbers, laid out in columns

    + + + +

    mullender - hardcoded vax and pdp-11 code to move :-) across the screen

    + + +
    +

    (all years) (ALL)

    + +
    + + + + + + + + +
    Creative Commons License

    © Copyright 1984-2020, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + + + diff --git a/years.html b/years.html new file mode 100644 index 000000000..bc82c51a0 --- /dev/null +++ b/years.html @@ -0,0 +1,3714 @@ + + + + + +Previous IOCCC Winners + + + + +
    IOCCC
    +
    +
    The International Obfuscated C Code +Contest
    +
    +

    [ The judges | +IOCCC home page | +How to enter | +FAQ | +
    +IOCCC news | +People who have won | +Winning entries ]

    +
    + +
    [ + +2019 | 2018 | 2015 | 2014 | 2013 | 2012 | 2011 | 2006 | 2005 | 2004 | 2001 | 2000 | 1998 | 1996 | 1995 | 1994 | 1993 | 1992 | 1991 | 1990 | 1989 | 1988 | 1987 | 1986 | 1985 | 1984 | ALL ]
    + +
    +
    + +

    Winning Entries

    + +

    This version of the winning entries page does NOT contain +brief explanations of each winning entry. You can check out the +spoiler version of this +page if you don't mind seeing a brief summary of each entry. There +is also a spoiler summary that gives +a summary description of all of the winners.

    + + + + +

    26th International Obfuscated C Code Contest (2019)

    + + +

    adamovsky

    + + + +

    burton

    + + + +

    ciura

    + + + +

    diels-grabsch1

    + + + +

    diels-grabsch2

    + + + +

    dogon

    + + + +

    duble

    + + + +

    endoh

    + + + +

    giles

    + + + +

    karns

    + + + +

    lynn

    + + + +

    mills

    + + + +

    poikola

    + + + +

    yang

    + + +
    +

    25th International Obfuscated C Code Contest (2018)

    + + +

    algmyr

    + + + +

    anderson

    + + + +

    bellard

    + + + +

    burton1

    + + + +

    burton2

    + + + +

    ciura

    + + + +

    endoh1

    + + + +

    endoh2

    + + + +

    ferguson

    + + + +

    giles

    + + + +

    hou

    + + + +

    mills

    + + + +

    poikola

    + + + +

    vokes

    + + + +

    yang

    + + +
    +

    24th International Obfuscated C Code Contest (2015)

    + + +

    burton

    + + + +

    dogon

    + + + +

    duble

    + + + +

    endoh1

    + + + +

    endoh2

    + + + +

    endoh3

    + + + +

    endoh4

    + + + +

    hou

    + + + +

    howe

    + + + +

    mills1

    + + + +

    mills2

    + + + +

    muth

    + + + +

    schweikhardt

    + + + +

    yang

    + + +
    +

    23rd International Obfuscated C Code Contest (2014)

    + + +

    birken

    + + + +

    deak

    + + + +

    endoh1

    + + + +

    endoh2

    + + + +

    maffiodo1

    + + + +

    maffiodo2

    + + + +

    morgan

    + + + +

    sinon

    + + + +

    skeggs

    + + + +

    vik

    + + + +

    wiedijk

    + + +
    +

    22nd International Obfuscated C Code Contest (2013)

    + + +

    birken

    + + + +

    cable1

    + + + +

    cable2

    + + + +

    cable3

    + + + +

    dlowe

    + + + +

    endoh1

    + + + +

    endoh2

    + + + +

    endoh3

    + + + +

    endoh4

    + + + +

    hou

    + + + +

    mills

    + + + +

    misaka

    + + + +

    morgan1

    + + + +

    morgan2

    + + + +

    robison

    + + +
    +

    21st International Obfuscated C Code Contest (2012)

    + + +

    blakely

    + + + +

    deckmyn

    + + + +

    dlowe

    + + + +

    endoh1

    + + + +

    endoh2

    + + + +

    grothe

    + + + +

    hamano

    + + + +

    hou

    + + + +

    kang

    + + + +

    konno

    + + + +

    omoikane

    + + + +

    tromp

    + + + +

    vik

    + + + +

    zeitak

    + + +
    +

    20th International Obfuscated C Code Contest (2011)

    + + +

    akari

    + + + +

    blakely

    + + + +

    borsanyi

    + + + +

    dlowe

    + + + +

    eastman

    + + + +

    fredriksson

    + + + +

    goren

    + + + +

    hamaji

    + + + +

    hou

    + + + +

    konno

    + + + +

    richards

    + + + +

    toledo

    + + + +

    vik

    + + + +

    zucker

    + + +
    +

    19th International Obfuscated C Code Contest (2006)

    + + +

    birken

    + + + +

    borsanyi

    + + + +

    grothe

    + + + +

    hamre

    + + + +

    meyer

    + + + +

    monge

    + + + +

    night

    + + + +

    sloane

    + + + +

    stewart

    + + + +

    sykes1

    + + + +

    sykes2

    + + + +

    toledo1

    + + + +

    toledo2

    + + + +

    toledo3

    + + +
    +

    18th International Obfuscated C Code Contest (2005)

    + + +

    aidan

    + + + +

    anon

    + + + +

    boutines

    + + + +

    chia

    + + + +

    giljade

    + + + +

    jetro

    + + + +

    klausler

    + + + +

    mikeash

    + + + +

    mynx

    + + + +

    persano

    + + + +

    sykes

    + + + +

    timwi

    + + + +

    toledo

    + + + +

    vik

    + + + +

    vince

    + + +
    +

    17th International Obfuscated C Code Contest (2004)

    + + +

    anonymous

    + + + +

    arachnid

    + + + +

    burley

    + + + +

    gavare

    + + + +

    gavin

    + + + +

    hibachi

    + + + +

    hoyle

    + + + +

    jdalbec

    + + + +

    kopczynski

    + + + +

    newbern

    + + + +

    omoikane

    + + + +

    schnitzi

    + + + +

    sds

    + + + +

    vik1

    + + + +

    vik2

    + + +
    +

    16th International Obfuscated C Code Contest (2001)

    + + +

    anonymous

    + + + +

    bellard

    + + + +

    cheong

    + + + +

    coupard

    + + + +

    ctk

    + + + +

    dgbeards

    + + + +

    herrmann1

    + + + +

    herrmann2

    + + + +

    jason

    + + + +

    kev

    + + + +

    ollinger

    + + + +

    rosten

    + + + +

    schweikh

    + + + +

    westley

    + + + +

    williams

    + + +
    +

    15th International Obfuscated C Code Contest (2000)

    + + +

    anderson

    + + + +

    bellard

    + + + +

    bmeyer

    + + + +

    briddlebane

    + + + +

    dhyang

    + + + +

    dlowe

    + + + +

    jarijyrki

    + + + +

    natori

    + + + +

    primenum

    + + + +

    rince

    + + + +

    robison

    + + + +

    schneiderwent

    + + + +

    thadgavin

    + + + +

    tomx

    + + +
    +

    14th International Obfuscated C Code Contest (1998)

    + + +

    banks

    + + + +

    bas1

    + + + +

    bas2

    + + + +

    chaos

    + + + +

    df

    + + + +

    dlowe

    + + + +

    dloweneil

    + + + +

    dorssel

    + + + +

    fanf

    + + + +

    schnitzi

    + + + +

    schweikh1

    + + + +

    schweikh2

    + + + +

    schweikh3

    + + + +

    tomtorfs

    + + +
    +

    13th International Obfuscated C Code Contest (1996)

    + + +

    august

    + + + +

    dalbec

    + + + +

    eldby

    + + + +

    gandalf

    + + + +

    huffman

    + + + +

    jonth

    + + + +

    rcm

    + + + +

    schweikh1

    + + + +

    schweikh2

    + + + +

    schweikh3

    + + + +

    westley

    + + +
    +

    12th International Obfuscated C Code Contest (1995)

    + + +

    cdua

    + + + +

    dodsond1

    + + + +

    dodsond2

    + + + +

    esde

    + + + +

    garry

    + + + +

    heathbar

    + + + +

    leo

    + + + +

    makarios

    + + + +

    savastio

    + + + +

    schnitzi

    + + + +

    spinellis

    + + + +

    vanschnitz

    + + +
    +

    11th International Obfuscated C Code Contest (1994)

    + + +

    dodsond1

    + + + +

    dodsond2

    + + + +

    horton

    + + + +

    imc

    + + + +

    ldb

    + + + +

    schnitzi

    + + + +

    shapiro

    + + + +

    smr

    + + + +

    tvr

    + + + +

    weisberg

    + + + +

    westley

    + + +
    +

    10th International Obfuscated C Code Contest (1993)

    + + +

    ant

    + + + +

    cmills

    + + + +

    dgibson

    + + + +

    ejb

    + + + +

    jonth

    + + + +

    leo

    + + + +

    lmfjyh

    + + + +

    plummer

    + + + +

    rince

    + + + +

    schnitzi

    + + + +

    vanb

    + + +
    +

    9th International Obfuscated C Code Contest (1992)

    + + +

    adrian

    + + + +

    albert

    + + + +

    ant

    + + + +

    buzzard.1

    + + + +

    buzzard.2

    + + + +

    gson

    + + + +

    imc

    + + + +

    kivinen

    + + + +

    lush

    + + + +

    marangon

    + + + +

    nathan

    + + + +

    vern

    + + + +

    westley

    + + +
    +

    8th International Obfuscated C Code Contest (1991)

    + + +

    ant

    + + + +

    brnstnd

    + + + +

    buzzard

    + + + +

    cdupont

    + + + +

    davidguy

    + + + +

    dds

    + + + +

    fine

    + + + +

    rince

    + + + +

    westley

    + + +
    +

    7th International Obfuscated C Code Contest (1990)

    + + +

    baruch

    + + + +

    cmills

    + + + +

    dds

    + + + +

    dg

    + + + +

    jaw

    + + + +

    pjr

    + + + +

    scjones

    + + + +

    stig

    + + + +

    tbr

    + + + +

    theorem

    + + + +

    westley

    + + +
    +

    6th International Obfuscated C Code Contest (1989)

    + + +

    fubar

    + + + +

    jar.1

    + + + +

    jar.2

    + + + +

    ovdluhe

    + + + +

    paul

    + + + +

    robison

    + + + +

    roemer

    + + + +

    tromp

    + + + +

    vanb

    + + + +

    westley

    + + +
    +

    5th International Obfuscated C Code Contest (1988)

    + + +

    applin

    + + + +

    dale

    + + + +

    isaak

    + + + +

    litmaath

    + + + +

    phillipps

    + + + +

    reddy

    + + + +

    robison

    + + + +

    spinellis

    + + + +

    westley

    + + +
    +

    4th International Obfuscated C Code Contest (1987)

    + + +

    biggar

    + + + +

    heckbert

    + + + +

    hines

    + + + +

    korn

    + + + +

    lievaart

    + + + +

    wall

    + + + +

    westley

    + + +
    +

    3rd International Obfuscated C Code Contest (1986)

    + + +

    applin

    + + + +

    august

    + + + +

    bright

    + + + +

    hague

    + + + +

    holloway

    + + + +

    marshall

    + + + +

    pawka

    + + + +

    stein

    + + + +

    wall

    + + +
    +

    2nd International Obfuscated C Code Contest (1985)

    + + +

    applin

    + + + +

    august

    + + + +

    lycklama

    + + + +

    shapiro

    + + + +

    sicherman

    + + +
    +

    1st International Obfuscated C Code Contest (1984)

    + + +

    anonymous

    + + + +

    decot

    + + + +

    laman

    + + + +

    mullender

    + + +
    +

    (all years) (ALL)

    + +
    + + + + + + + + +
    Creative Commons License

    © Copyright 1984-2020, +Leo Broukhis, Simon Cooper, Landon Curt Noll +- All rights reserved
    +This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

     
    + + + +

    +