aboutsummaryrefslogtreecommitdiff
path: root/semestr-2
diff options
context:
space:
mode:
authorFranciszek Malinka <franciszek.malinka@gmail.com>2021-10-05 21:49:54 +0200
committerFranciszek Malinka <franciszek.malinka@gmail.com>2021-10-05 21:49:54 +0200
commitc5fcf7179a83ef65c86c6a4a390029149e518649 (patch)
treed29ffc5b86a0d257453cedcf87d91a13d8bf3b0d /semestr-2
parentf8a88b6a4aba1f66d04711a9330eaba49a50c463 (diff)
Duzy commit ze smieciami
Diffstat (limited to 'semestr-2')
-rw-r--r--semestr-2/algebra/106131081_1151103648602701_2043131207718798221_n.jpgbin0 -> 365667 bytes
-rw-r--r--semestr-2/algebra/32.jpgbin0 -> 206132 bytes
-rw-r--r--semestr-2/algebra/33.jpgbin0 -> 212272 bytes
-rw-r--r--semestr-2/algebra/34.jpgbin0 -> 190004 bytes
-rw-r--r--semestr-2/algebra/35.jpgbin0 -> 220677 bytes
-rw-r--r--semestr-2/algebra/36.jpgbin0 -> 184488 bytes
-rw-r--r--semestr-2/algebra/37.jpgbin0 -> 171842 bytes
-rw-r--r--semestr-2/algebra/38.jpgbin0 -> 197921 bytes
-rw-r--r--semestr-2/algebra/39.jpgbin0 -> 174797 bytes
-rw-r--r--semestr-2/algebra/40.jpgbin0 -> 195910 bytes
-rw-r--r--semestr-2/algebra/41.jpgbin0 -> 173475 bytes
-rw-r--r--semestr-2/algebra/42.jpgbin0 -> 233446 bytes
-rw-r--r--semestr-2/algebra/43.jpgbin0 -> 188791 bytes
-rw-r--r--semestr-2/algebra/44.jpgbin0 -> 197980 bytes
-rw-r--r--semestr-2/algebra/45.jpgbin0 -> 167104 bytes
-rw-r--r--semestr-2/algebra/46.jpgbin0 -> 210398 bytes
-rw-r--r--semestr-2/algebra/47.jpgbin0 -> 190287 bytes
-rw-r--r--semestr-2/algebra/48.jpgbin0 -> 186012 bytes
-rw-r--r--semestr-2/algebra/49.jpgbin0 -> 182485 bytes
-rw-r--r--semestr-2/algebra/50.jpgbin0 -> 193019 bytes
-rw-r--r--semestr-2/algebra/DodatkoweWytłumaczenieDlaKogośKomuNieCheilibyśmyUdzielaćKorepetycji.jpgbin0 -> 34616 bytes
-rw-r--r--semestr-2/algebra/FraMalEgzamin.pdfbin0 -> 963445 bytes
-rw-r--r--semestr-2/algebra/egzamin/z1a.jpgbin0 -> 173901 bytes
-rw-r--r--semestr-2/algebra/egzamin/z1b.jpgbin0 -> 43979 bytes
-rw-r--r--semestr-2/algebra/egzamin/z2a.jpgbin0 -> 43523 bytes
-rw-r--r--semestr-2/algebra/egzamin/z2b.jpgbin0 -> 46691 bytes
-rw-r--r--semestr-2/algebra/egzamin/z2c.jpgbin0 -> 103884 bytes
-rw-r--r--semestr-2/algebra/egzamin/z4a.jpgbin0 -> 40713 bytes
-rw-r--r--semestr-2/algebra/egzamin/z4b.jpgbin0 -> 60338 bytes
-rw-r--r--semestr-2/algebra/egzamin/z4c.jpgbin0 -> 50039 bytes
-rw-r--r--semestr-2/algebra/egzamin/z5a.jpgbin0 -> 39674 bytes
-rw-r--r--semestr-2/algebra/egzamin/z5b.jpgbin0 -> 31446 bytes
-rw-r--r--semestr-2/algebra/egzamin/z6.jpgbin0 -> 39287 bytes
-rw-r--r--semestr-2/algebra/egzamin/z6a.jpgbin0 -> 44221 bytes
-rw-r--r--semestr-2/algebra/egzamin/z6b.jpgbin0 -> 49631 bytes
-rw-r--r--semestr-2/algebra/egzamin/z6c.jpgbin0 -> 47465 bytes
-rw-r--r--semestr-2/algebra/kolokwium/zad1.jpgbin0 -> 311797 bytes
-rw-r--r--semestr-2/algebra/kolokwium/zad2.jpgbin0 -> 63809 bytes
-rw-r--r--semestr-2/algebra/kolokwium/zad2cd.jpgbin0 -> 65841 bytes
-rw-r--r--semestr-2/algebra/kolokwium/zad3.jpgbin0 -> 90572 bytes
-rw-r--r--semestr-2/algebra/kolokwium/zad4.jpgbin0 -> 306994 bytes
-rw-r--r--semestr-2/algebra/kolokwium/zad6.jpgbin0 -> 288908 bytes
-rw-r--r--semestr-2/algebra/lista10/66.pngbin0 -> 391731 bytes
-rw-r--r--semestr-2/algebra/lista10/67.pngbin0 -> 389525 bytes
-rw-r--r--semestr-2/algebra/lista10/68.pngbin0 -> 497884 bytes
-rw-r--r--semestr-2/algebra/lista10/69.pngbin0 -> 424553 bytes
-rw-r--r--semestr-2/algebra/lista10/70.pngbin0 -> 348488 bytes
-rw-r--r--semestr-2/algebra/lista10/71.pngbin0 -> 378907 bytes
-rw-r--r--semestr-2/algebra/lista10/72.pngbin0 -> 385889 bytes
-rw-r--r--semestr-2/algebra/lista10/73.pngbin0 -> 369513 bytes
-rw-r--r--semestr-2/algebra/lista10/74.pngbin0 -> 401320 bytes
-rw-r--r--semestr-2/algebra/lista10/75.pngbin0 -> 327086 bytes
-rw-r--r--semestr-2/algebra/lista10/76.pngbin0 -> 375970 bytes
-rw-r--r--semestr-2/algebra/lista10/77.pngbin0 -> 366403 bytes
-rw-r--r--semestr-2/algebra/lista10/zad1.jpgbin0 -> 204448 bytes
-rw-r--r--semestr-2/algebra/lista10/zad11.jpgbin0 -> 238123 bytes
-rw-r--r--semestr-2/algebra/lista10/zad21A.jpgbin0 -> 194934 bytes
-rw-r--r--semestr-2/algebra/lista10/zad21B.jpgbin0 -> 49197 bytes
-rw-r--r--semestr-2/algebra/lista10/zad21C.jpgbin0 -> 48670 bytes
-rw-r--r--semestr-2/algebra/lista10/zad21D.jpgbin0 -> 309659 bytes
-rw-r--r--semestr-2/algebra/lista10/zad3.jpgbin0 -> 255585 bytes
-rw-r--r--semestr-2/algebra/lista10/zad6.jpgbin0 -> 233281 bytes
-rw-r--r--semestr-2/algebra/lista10/zad7.jpgbin0 -> 258015 bytes
-rw-r--r--semestr-2/algebra/lista11/78.pngbin0 -> 1398319 bytes
-rw-r--r--semestr-2/algebra/lista11/79.pngbin0 -> 1266655 bytes
-rw-r--r--semestr-2/algebra/lista11/80.pngbin0 -> 1424243 bytes
-rw-r--r--semestr-2/algebra/lista11/81.pngbin0 -> 1376070 bytes
-rw-r--r--semestr-2/algebra/lista11/82.pngbin0 -> 1408919 bytes
-rw-r--r--semestr-2/algebra/lista11/83.pngbin0 -> 1391087 bytes
-rw-r--r--semestr-2/algebra/lista11/84.pngbin0 -> 1372672 bytes
-rw-r--r--semestr-2/algebra/lista11/85.pngbin0 -> 1410804 bytes
-rw-r--r--semestr-2/algebra/lista11/86.pngbin0 -> 1368489 bytes
-rw-r--r--semestr-2/algebra/lista11/87.pngbin0 -> 1361263 bytes
-rw-r--r--semestr-2/algebra/lista11/88.pngbin0 -> 1385287 bytes
-rw-r--r--semestr-2/algebra/lista11/89.pngbin0 -> 1404569 bytes
-rw-r--r--semestr-2/algebra/lista11/90.pngbin0 -> 1339680 bytes
-rw-r--r--semestr-2/algebra/lista11/91.pngbin0 -> 1372560 bytes
-rw-r--r--semestr-2/algebra/lista11/92.pngbin0 -> 1404574 bytes
-rw-r--r--semestr-2/algebra/lista11/zad1312.jpgbin0 -> 260095 bytes
-rw-r--r--semestr-2/algebra/lista11/zad2.jpgbin0 -> 327561 bytes
-rw-r--r--semestr-2/algebra/lista11/zad2c.jpgbin0 -> 126523 bytes
-rw-r--r--semestr-2/algebra/lista11/zad6.jpgbin0 -> 122642 bytes
-rw-r--r--semestr-2/algebra/lista11/zad7a.jpgbin0 -> 146024 bytes
-rw-r--r--semestr-2/algebra/lista11/zad7b.jpgbin0 -> 211857 bytes
-rw-r--r--semestr-2/algebra/lista11/zad9.jpgbin0 -> 92369 bytes
-rw-r--r--semestr-2/algebra/lista12/100.pngbin0 -> 345246 bytes
-rw-r--r--semestr-2/algebra/lista12/101.pngbin0 -> 400133 bytes
-rw-r--r--semestr-2/algebra/lista12/102.pngbin0 -> 302152 bytes
-rw-r--r--semestr-2/algebra/lista12/103.pngbin0 -> 410059 bytes
-rw-r--r--semestr-2/algebra/lista12/104.pngbin0 -> 325369 bytes
-rw-r--r--semestr-2/algebra/lista12/105.pngbin0 -> 356252 bytes
-rw-r--r--semestr-2/algebra/lista12/107.pngbin0 -> 376442 bytes
-rw-r--r--semestr-2/algebra/lista12/16.jpgbin0 -> 167273 bytes
-rw-r--r--semestr-2/algebra/lista12/21.jpgbin0 -> 175859 bytes
-rw-r--r--semestr-2/algebra/lista12/7a.jpgbin0 -> 189376 bytes
-rw-r--r--semestr-2/algebra/lista12/7b.jpgbin0 -> 206316 bytes
-rw-r--r--semestr-2/algebra/lista12/8.jpgbin0 -> 193076 bytes
-rw-r--r--semestr-2/algebra/lista12/9.jpgbin0 -> 42985 bytes
-rw-r--r--semestr-2/algebra/lista12/95.pngbin0 -> 341457 bytes
-rw-r--r--semestr-2/algebra/lista12/96.pngbin0 -> 369495 bytes
-rw-r--r--semestr-2/algebra/lista12/97.pngbin0 -> 391960 bytes
-rw-r--r--semestr-2/algebra/lista12/98.pngbin0 -> 340355 bytes
-rw-r--r--semestr-2/algebra/lista12/99.pngbin0 -> 296338 bytes
-rw-r--r--semestr-2/algebra/lista12/unknown.pngbin0 -> 1063866 bytes
-rw-r--r--semestr-2/algebra/lista12/zad5.jpgbin0 -> 24117 bytes
-rw-r--r--semestr-2/algebra/lista13/110.pngbin0 -> 1222766 bytes
-rw-r--r--semestr-2/algebra/lista13/111.pngbin0 -> 1194865 bytes
-rw-r--r--semestr-2/algebra/lista13/112.pngbin0 -> 1189988 bytes
-rw-r--r--semestr-2/algebra/lista13/113.pngbin0 -> 1192181 bytes
-rw-r--r--semestr-2/algebra/lista13/114.pngbin0 -> 1223165 bytes
-rw-r--r--semestr-2/algebra/lista13/115.pngbin0 -> 1197864 bytes
-rw-r--r--semestr-2/algebra/lista13/116.pngbin0 -> 1204290 bytes
-rw-r--r--semestr-2/algebra/lista13/117.pngbin0 -> 1203324 bytes
-rw-r--r--semestr-2/algebra/lista13/118.pngbin0 -> 1200359 bytes
-rw-r--r--semestr-2/algebra/lista13/zad11.jpgbin0 -> 67460 bytes
-rw-r--r--semestr-2/algebra/lista13/zad7.jpgbin0 -> 174903 bytes
-rw-r--r--semestr-2/algebra/lista13/zad8a.jpgbin0 -> 46252 bytes
-rw-r--r--semestr-2/algebra/lista13/zad8b.jpgbin0 -> 70384 bytes
-rw-r--r--semestr-2/algebra/lista14/11.jpgbin0 -> 45816 bytes
-rw-r--r--semestr-2/algebra/lista14/1a.jpgbin0 -> 46431 bytes
-rw-r--r--semestr-2/algebra/lista14/1aa.jpgbin0 -> 45878 bytes
-rw-r--r--semestr-2/algebra/lista14/1c.jpgbin0 -> 89905 bytes
-rw-r--r--semestr-2/algebra/lista14/1cc.jpgbin0 -> 61182 bytes
-rw-r--r--semestr-2/algebra/lista14/7.jpgbin0 -> 64599 bytes
-rw-r--r--semestr-2/algebra/lista14/8.jpgbin0 -> 28811 bytes
-rw-r--r--semestr-2/algebra/lista14/9a.jpgbin0 -> 37695 bytes
-rw-r--r--semestr-2/algebra/lista14/9b.jpgbin0 -> 36484 bytes
-rw-r--r--semestr-2/algebra/lista14/FraMal,z1;7;8;9;11;18.pdfbin0 -> 608041 bytes
-rw-r--r--semestr-2/algebra/lista14/zad18.jpgbin0 -> 40241 bytes
-rw-r--r--semestr-2/algebra/lista9/32.jpgbin0 -> 247003 bytes
-rw-r--r--semestr-2/algebra/lista9/34.jpgbin0 -> 261625 bytes
-rw-r--r--semestr-2/algebra/lista9/36.jpgbin0 -> 215510 bytes
-rw-r--r--semestr-2/algebra/lista9/38.jpgbin0 -> 223506 bytes
-rw-r--r--semestr-2/algebra/lista9/40.jpgbin0 -> 225450 bytes
-rw-r--r--semestr-2/algebra/lista9/42.jpgbin0 -> 280494 bytes
-rw-r--r--semestr-2/algebra/lista9/44.jpgbin0 -> 218826 bytes
-rw-r--r--semestr-2/algebra/lista9/46.jpgbin0 -> 232402 bytes
-rw-r--r--semestr-2/algebra/lista9/48.jpgbin0 -> 223615 bytes
-rw-r--r--semestr-2/algebra/lista9/50.jpgbin0 -> 230537 bytes
-rw-r--r--semestr-2/algebra/lista9/zad10.jpgbin0 -> 161120 bytes
-rw-r--r--semestr-2/algebra/lista9/zad10bpoprawka.jpgbin0 -> 174812 bytes
-rw-r--r--semestr-2/algebra/lista9/zad11.jpgbin0 -> 157934 bytes
-rw-r--r--semestr-2/algebra/lista9/zad12.jpgbin0 -> 110740 bytes
-rw-r--r--semestr-2/algebra/lista9/zad13.jpgbin0 -> 273471 bytes
-rw-r--r--semestr-2/algebra/lista9/zad6.jpgbin0 -> 67937 bytes
-rw-r--r--semestr-2/algebra/lista9/zad8a.jpgbin0 -> 142464 bytes
-rw-r--r--semestr-2/algebra/lista9/zad8b.jpgbin0 -> 88781 bytes
-rw-r--r--semestr-2/algebra/lista9/zad9.jpgbin0 -> 168035 bytes
-rw-r--r--semestr-2/algebra/z1a-skonwertowany.pdfbin0 -> 963445 bytes
-rw-r--r--semestr-2/algebra/zad101213.jpgbin0 -> 185244 bytes
-rw-r--r--semestr-2/algebra/zad14.jpgbin0 -> 146485 bytes
-rw-r--r--semestr-2/algebra/zad2;3;6;7;11;21.pdfbin0 -> 1959170 bytes
-rw-r--r--semestr-2/algebra/zad2;6;7;9.pdfbin0 -> 1171720 bytes
-rw-r--r--semestr-2/algebra/zad5;7;8;9;16.pdfbin0 -> 892151 bytes
-rw-r--r--semestr-2/algebra/zad7;8;11;15.pdfbin0 -> 424939 bytes
-rw-r--r--semestr-2/analiza/Analiza_last_gwiazdka.pdfbin0 -> 155235 bytes
-rw-r--r--semestr-2/analiza/L11Z8,9;L12Z1,2,3,7; PUNTKÓW 18.pdfbin0 -> 693764 bytes
-rw-r--r--semestr-2/analiza/L3Z11;Szwarc26.03;Obie gwiazdki.pdfbin0 -> 457283 bytes
-rw-r--r--semestr-2/analiza/L9Z7;L10Z2,3,4;L11Z1,2,4,5,6;Punktów 34.pdfbin0 -> 1613519 bytes
-rw-r--r--semestr-2/analiza/Lista7;21pkt.pdfbin0 -> 918184 bytes
-rw-r--r--semestr-2/analiza/Lista9;zad3;5;6;8;12;PUNKTÓW 25.pdfbin0 -> 716107 bytes
-rw-r--r--semestr-2/analiza/lista11/LISTA3;zad11.jpgbin0 -> 207637 bytes
-rw-r--r--semestr-2/analiza/lista11/l11z8l12z1.jpgbin0 -> 161554 bytes
-rw-r--r--semestr-2/analiza/lista11/l11z9.jpgbin0 -> 198131 bytes
-rw-r--r--semestr-2/analiza/lista11/l12z2.jpgbin0 -> 161375 bytes
-rw-r--r--semestr-2/analiza/lista11/l12z3.jpgbin0 -> 56891 bytes
-rw-r--r--semestr-2/analiza/lista11/l12z7.jpgbin0 -> 33902 bytes
-rw-r--r--semestr-2/analiza/lista11/szwarc26.06.jpgbin0 -> 75212 bytes
-rw-r--r--semestr-2/analiza/lista11/zad11b.jpgbin0 -> 128041 bytes
-rw-r--r--semestr-2/analiza/lista11/zad1a-e.jpgbin0 -> 166178 bytes
-rw-r--r--semestr-2/analiza/lista11/zad1f2.jpgbin0 -> 177380 bytes
-rw-r--r--semestr-2/analiza/lista11/zad2.jpgbin0 -> 208902 bytes
-rw-r--r--semestr-2/analiza/lista11/zad3.jpgbin0 -> 193499 bytes
-rw-r--r--semestr-2/analiza/lista11/zad4.jpgbin0 -> 151935 bytes
-rw-r--r--semestr-2/analiza/lista11/zad465.jpgbin0 -> 152331 bytes
-rw-r--r--semestr-2/analiza/lista11/zad7a.jpgbin0 -> 206281 bytes
-rw-r--r--semestr-2/analiza/lista11/zad7b.jpgbin0 -> 206293 bytes
-rw-r--r--semestr-2/analiza/zad12.jpgbin0 -> 49660 bytes
-rw-r--r--semestr-2/analiza/zad3;5.jpgbin0 -> 247822 bytes
-rw-r--r--semestr-2/analiza/zad6;8a.jpgbin0 -> 230676 bytes
-rw-r--r--semestr-2/analiza/zad8b1.jpgbin0 -> 19594 bytes
-rw-r--r--semestr-2/analiza/zad8b2.jpgbin0 -> 30323 bytes
-rw-r--r--semestr-2/analiza/zad8c.jpgbin0 -> 56019 bytes
-rw-r--r--semestr-2/racket/cnf.rkt188
-rw-r--r--semestr-2/racket/cw.rkt57
-rw-r--r--semestr-2/racket/deriv.rkt47
-rw-r--r--semestr-2/racket/egzamin/rozw2.txt1
-rw-r--r--semestr-2/racket/egzamin/zad1.bak1
-rw-r--r--semestr-2/racket/egzamin/zad1.rkt300
-rw-r--r--semestr-2/racket/egzamin/zad1a.bak300
-rw-r--r--semestr-2/racket/egzamin/zad1a.rkt314
-rw-r--r--semestr-2/racket/egzamin/zad1b.bak314
-rw-r--r--semestr-2/racket/egzamin/zad1b.rkt482
-rw-r--r--semestr-2/racket/egzamin/zad2.bak119
-rw-r--r--semestr-2/racket/egzamin/zad2.rkt186
-rw-r--r--semestr-2/racket/egzamin/zad3.bak4
-rw-r--r--semestr-2/racket/egzamin/zad3.rkt347
-rw-r--r--semestr-2/racket/egzamin/zad3a.bak298
-rw-r--r--semestr-2/racket/egzamin/zad3a.rkt301
-rw-r--r--semestr-2/racket/l10z18/solution.bak363
-rw-r--r--semestr-2/racket/l10z18/solution.rkt409
-rw-r--r--semestr-2/racket/l11/rozw.bak2
-rw-r--r--semestr-2/racket/l11/rozw.rkt776
-rw-r--r--semestr-2/racket/l11/solution.bak18
-rw-r--r--semestr-2/racket/l11/solution.rkt35
-rw-r--r--semestr-2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.dep1
-rw-r--r--semestr-2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.zobin0 -> 43422 bytes
-rw-r--r--semestr-2/racket/l11z20/graph.bak97
-rw-r--r--semestr-2/racket/l11z20/graph.rkt100
-rw-r--r--semestr-2/racket/l11z20/solution.bak1
-rw-r--r--semestr-2/racket/l11z20/solution.rkt245
-rw-r--r--semestr-2/racket/l13/oceny.txt18
-rw-r--r--semestr-2/racket/l13/rozw.rkt79
-rw-r--r--semestr-2/racket/l13/solution.rkt124
-rw-r--r--semestr-2/racket/l13/zad6.rkt132
-rw-r--r--semestr-2/racket/l14z22/solution.bak70
-rw-r--r--semestr-2/racket/l14z22/solution.rkt87
-rw-r--r--semestr-2/racket/l15/kacp.bak55
-rw-r--r--semestr-2/racket/l15/kacp.rkt59
-rw-r--r--semestr-2/racket/l15/solution.bak7
-rw-r--r--semestr-2/racket/l15/solution.rkt85
-rw-r--r--semestr-2/racket/l7z12/solution.rkt95
-rw-r--r--semestr-2/racket/l7z13/solution.rkt104
-rw-r--r--semestr-2/racket/l8z14/solution.bak155
-rw-r--r--semestr-2/racket/l8z14/solution.rkt201
-rw-r--r--semestr-2/racket/l8z15/solution.bak187
-rw-r--r--semestr-2/racket/l8z15/solution.rkt182
-rw-r--r--semestr-2/racket/l9/zad4.rkt202
-rw-r--r--semestr-2/racket/l9/zad7.rkt340
-rw-r--r--semestr-2/racket/l9z16/solution.rkt42
-rw-r--r--semestr-2/racket/l9z17/solution.rkt266
-rw-r--r--semestr-2/racket/leftist.rkt105
-rw-r--r--semestr-2/racket/lista5/compiled/drracket/errortrace/prop_rkt.dep1
-rw-r--r--semestr-2/racket/lista5/compiled/drracket/errortrace/prop_rkt.zobin0 -> 1709 bytes
-rw-r--r--semestr-2/racket/lista5/compiled/drracket/errortrace/props_rkt.dep1
-rw-r--r--semestr-2/racket/lista5/compiled/drracket/errortrace/props_rkt.zobin0 -> 3273 bytes
-rw-r--r--semestr-2/racket/lista5/compiled/drracket/errortrace/solution_rkt.dep1
-rw-r--r--semestr-2/racket/lista5/compiled/drracket/errortrace/solution_rkt.zobin0 -> 10868 bytes
-rw-r--r--semestr-2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.dep1
-rw-r--r--semestr-2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.zobin0 -> 3273 bytes
-rw-r--r--semestr-2/racket/lista5/julita/props.rkt52
-rw-r--r--semestr-2/racket/lista5/julita/solution.bak164
-rw-r--r--semestr-2/racket/lista5/julita/solution.rkt164
-rw-r--r--semestr-2/racket/lista5/prop.rkt1
-rw-r--r--semestr-2/racket/lista5/props.bak71
-rw-r--r--semestr-2/racket/lista5/props.rkt52
-rw-r--r--semestr-2/racket/lista5/skrr/solution.bak135
-rw-r--r--semestr-2/racket/lista5/skrr/solution.rkt88
-rw-r--r--semestr-2/racket/lista5/sol2.rkt90
-rw-r--r--semestr-2/racket/lista5/solution.bak135
-rw-r--r--semestr-2/racket/lista5/solution.rkt140
-rw-r--r--semestr-2/racket/lista5/xd.bak4
-rw-r--r--semestr-2/racket/lista5/xd.rkt4
-rw-r--r--semestr-2/racket/lista6/lista8/kappa.py13
-rw-r--r--semestr-2/racket/lista6/lista8/zad1.bak98
-rw-r--r--semestr-2/racket/lista6/lista8/zad1.rkt104
-rw-r--r--semestr-2/racket/lista6/lista8/zad4.bak114
-rw-r--r--semestr-2/racket/lista6/lista8/zad4.rkt118
-rw-r--r--semestr-2/racket/lista6/lista8/zad5.bak1
-rw-r--r--semestr-2/racket/lista6/lista8/zad5.rkt151
-rw-r--r--semestr-2/racket/lista6/lista8/zad6.bak151
-rw-r--r--semestr-2/racket/lista6/lista8/zad6.rkt171
-rw-r--r--semestr-2/racket/lista6/lista8/zadanie.rkt98
-rw-r--r--semestr-2/racket/lista6/solution.bak27
-rw-r--r--semestr-2/racket/lista6/solution.rkt73
-rw-r--r--semestr-2/racket/lista6/zad11/solution.bak36
-rw-r--r--semestr-2/racket/lista6/zad11/solution.rkt58
-rw-r--r--semestr-2/racket/luk.rkt137
-rw-r--r--semestr-2/racket/rac.rkt371
-rw-r--r--semestr-2/racket/solution.rkt14
-rw-r--r--semestr-2/topo/106185944_268984110829847_6553948354204680381_n.jpgbin0 -> 63539 bytes
-rw-r--r--semestr-2/topo/106656932_2682289525419459_8890828706710255563_n.jpgbin0 -> 47593 bytes
-rw-r--r--semestr-2/topo/106703086_728253774716175_2262465163427979269_n.jpgbin0 -> 46311 bytes
-rw-r--r--semestr-2/topo/106792000_316914386368237_6535047497894014786_n.jpgbin0 -> 17926 bytes
-rw-r--r--semestr-2/topo/107093323_1187351634957579_7077220020141497805_n.jpgbin0 -> 48979 bytes
-rw-r--r--semestr-2/topo/ACFrOgA9nUCrq9uSc6NvJxX3WRdWzjzunaans9KaKhMQKJdrLr6UW8LvP9BJrKFCP9iw4sZnygGqHO3idi_74KDTN2R91USZQTZz8tzhNReeRj8mm31ZqZfiYsDVgiI=.pdf3629
-rw-r--r--semestr-2/topo/FraMalCzęść1.pdfbin0 -> 270505 bytes
-rw-r--r--semestr-2/topo/FraMalCzęść2.pdfbin0 -> 689315 bytes
-rw-r--r--semestr-2/topo/Topologia2_Franciszek_Malinka.pdfbin0 -> 198792 bytes
-rw-r--r--semestr-2/topo/zad1a.jpgbin0 -> 55456 bytes
-rw-r--r--semestr-2/topo/zad1aa.jpgbin0 -> 49682 bytes
-rw-r--r--semestr-2/topo/zad1b.jpgbin0 -> 63375 bytes
-rw-r--r--semestr-2/topo/zad1c.jpgbin0 -> 46532 bytes
-rw-r--r--semestr-2/topo/zad2a.jpgbin0 -> 42734 bytes
-rw-r--r--semestr-2/topo/zad2bc.jpgbin0 -> 54378 bytes
-rw-r--r--semestr-2/topo/zad2da.jpgbin0 -> 55937 bytes
-rw-r--r--semestr-2/topo/zad2db.jpgbin0 -> 56781 bytes
-rw-r--r--semestr-2/topo/zad2dc.jpgbin0 -> 118128 bytes
-rw-r--r--semestr-2/topo/zad2dd.jpgbin0 -> 36936 bytes
289 files changed, 14369 insertions, 0 deletions
diff --git a/semestr-2/algebra/106131081_1151103648602701_2043131207718798221_n.jpg b/semestr-2/algebra/106131081_1151103648602701_2043131207718798221_n.jpg
new file mode 100644
index 0000000..b0e2f4e
--- /dev/null
+++ b/semestr-2/algebra/106131081_1151103648602701_2043131207718798221_n.jpg
Binary files differ
diff --git a/semestr-2/algebra/32.jpg b/semestr-2/algebra/32.jpg
new file mode 100644
index 0000000..8f66fb0
--- /dev/null
+++ b/semestr-2/algebra/32.jpg
Binary files differ
diff --git a/semestr-2/algebra/33.jpg b/semestr-2/algebra/33.jpg
new file mode 100644
index 0000000..200d044
--- /dev/null
+++ b/semestr-2/algebra/33.jpg
Binary files differ
diff --git a/semestr-2/algebra/34.jpg b/semestr-2/algebra/34.jpg
new file mode 100644
index 0000000..39bb45c
--- /dev/null
+++ b/semestr-2/algebra/34.jpg
Binary files differ
diff --git a/semestr-2/algebra/35.jpg b/semestr-2/algebra/35.jpg
new file mode 100644
index 0000000..ce2008c
--- /dev/null
+++ b/semestr-2/algebra/35.jpg
Binary files differ
diff --git a/semestr-2/algebra/36.jpg b/semestr-2/algebra/36.jpg
new file mode 100644
index 0000000..b776d30
--- /dev/null
+++ b/semestr-2/algebra/36.jpg
Binary files differ
diff --git a/semestr-2/algebra/37.jpg b/semestr-2/algebra/37.jpg
new file mode 100644
index 0000000..18d9384
--- /dev/null
+++ b/semestr-2/algebra/37.jpg
Binary files differ
diff --git a/semestr-2/algebra/38.jpg b/semestr-2/algebra/38.jpg
new file mode 100644
index 0000000..1b90aee
--- /dev/null
+++ b/semestr-2/algebra/38.jpg
Binary files differ
diff --git a/semestr-2/algebra/39.jpg b/semestr-2/algebra/39.jpg
new file mode 100644
index 0000000..6fa2ebb
--- /dev/null
+++ b/semestr-2/algebra/39.jpg
Binary files differ
diff --git a/semestr-2/algebra/40.jpg b/semestr-2/algebra/40.jpg
new file mode 100644
index 0000000..64c2a62
--- /dev/null
+++ b/semestr-2/algebra/40.jpg
Binary files differ
diff --git a/semestr-2/algebra/41.jpg b/semestr-2/algebra/41.jpg
new file mode 100644
index 0000000..f160777
--- /dev/null
+++ b/semestr-2/algebra/41.jpg
Binary files differ
diff --git a/semestr-2/algebra/42.jpg b/semestr-2/algebra/42.jpg
new file mode 100644
index 0000000..e8de627
--- /dev/null
+++ b/semestr-2/algebra/42.jpg
Binary files differ
diff --git a/semestr-2/algebra/43.jpg b/semestr-2/algebra/43.jpg
new file mode 100644
index 0000000..ceffb0c
--- /dev/null
+++ b/semestr-2/algebra/43.jpg
Binary files differ
diff --git a/semestr-2/algebra/44.jpg b/semestr-2/algebra/44.jpg
new file mode 100644
index 0000000..6237e6c
--- /dev/null
+++ b/semestr-2/algebra/44.jpg
Binary files differ
diff --git a/semestr-2/algebra/45.jpg b/semestr-2/algebra/45.jpg
new file mode 100644
index 0000000..1ec6cf1
--- /dev/null
+++ b/semestr-2/algebra/45.jpg
Binary files differ
diff --git a/semestr-2/algebra/46.jpg b/semestr-2/algebra/46.jpg
new file mode 100644
index 0000000..c2cbcc0
--- /dev/null
+++ b/semestr-2/algebra/46.jpg
Binary files differ
diff --git a/semestr-2/algebra/47.jpg b/semestr-2/algebra/47.jpg
new file mode 100644
index 0000000..7a4a73c
--- /dev/null
+++ b/semestr-2/algebra/47.jpg
Binary files differ
diff --git a/semestr-2/algebra/48.jpg b/semestr-2/algebra/48.jpg
new file mode 100644
index 0000000..d27be3d
--- /dev/null
+++ b/semestr-2/algebra/48.jpg
Binary files differ
diff --git a/semestr-2/algebra/49.jpg b/semestr-2/algebra/49.jpg
new file mode 100644
index 0000000..4a626d9
--- /dev/null
+++ b/semestr-2/algebra/49.jpg
Binary files differ
diff --git a/semestr-2/algebra/50.jpg b/semestr-2/algebra/50.jpg
new file mode 100644
index 0000000..06f0fe4
--- /dev/null
+++ b/semestr-2/algebra/50.jpg
Binary files differ
diff --git a/semestr-2/algebra/DodatkoweWytłumaczenieDlaKogośKomuNieCheilibyśmyUdzielaćKorepetycji.jpg b/semestr-2/algebra/DodatkoweWytłumaczenieDlaKogośKomuNieCheilibyśmyUdzielaćKorepetycji.jpg
new file mode 100644
index 0000000..48546c1
--- /dev/null
+++ b/semestr-2/algebra/DodatkoweWytłumaczenieDlaKogośKomuNieCheilibyśmyUdzielaćKorepetycji.jpg
Binary files differ
diff --git a/semestr-2/algebra/FraMalEgzamin.pdf b/semestr-2/algebra/FraMalEgzamin.pdf
new file mode 100644
index 0000000..a4d4941
--- /dev/null
+++ b/semestr-2/algebra/FraMalEgzamin.pdf
Binary files differ
diff --git a/semestr-2/algebra/egzamin/z1a.jpg b/semestr-2/algebra/egzamin/z1a.jpg
new file mode 100644
index 0000000..6bca7ce
--- /dev/null
+++ b/semestr-2/algebra/egzamin/z1a.jpg
Binary files differ
diff --git a/semestr-2/algebra/egzamin/z1b.jpg b/semestr-2/algebra/egzamin/z1b.jpg
new file mode 100644
index 0000000..23fa274
--- /dev/null
+++ b/semestr-2/algebra/egzamin/z1b.jpg
Binary files differ
diff --git a/semestr-2/algebra/egzamin/z2a.jpg b/semestr-2/algebra/egzamin/z2a.jpg
new file mode 100644
index 0000000..81a90c2
--- /dev/null
+++ b/semestr-2/algebra/egzamin/z2a.jpg
Binary files differ
diff --git a/semestr-2/algebra/egzamin/z2b.jpg b/semestr-2/algebra/egzamin/z2b.jpg
new file mode 100644
index 0000000..510ca22
--- /dev/null
+++ b/semestr-2/algebra/egzamin/z2b.jpg
Binary files differ
diff --git a/semestr-2/algebra/egzamin/z2c.jpg b/semestr-2/algebra/egzamin/z2c.jpg
new file mode 100644
index 0000000..361dae8
--- /dev/null
+++ b/semestr-2/algebra/egzamin/z2c.jpg
Binary files differ
diff --git a/semestr-2/algebra/egzamin/z4a.jpg b/semestr-2/algebra/egzamin/z4a.jpg
new file mode 100644
index 0000000..c1a480e
--- /dev/null
+++ b/semestr-2/algebra/egzamin/z4a.jpg
Binary files differ
diff --git a/semestr-2/algebra/egzamin/z4b.jpg b/semestr-2/algebra/egzamin/z4b.jpg
new file mode 100644
index 0000000..85c70c0
--- /dev/null
+++ b/semestr-2/algebra/egzamin/z4b.jpg
Binary files differ
diff --git a/semestr-2/algebra/egzamin/z4c.jpg b/semestr-2/algebra/egzamin/z4c.jpg
new file mode 100644
index 0000000..2196e19
--- /dev/null
+++ b/semestr-2/algebra/egzamin/z4c.jpg
Binary files differ
diff --git a/semestr-2/algebra/egzamin/z5a.jpg b/semestr-2/algebra/egzamin/z5a.jpg
new file mode 100644
index 0000000..b12f4b3
--- /dev/null
+++ b/semestr-2/algebra/egzamin/z5a.jpg
Binary files differ
diff --git a/semestr-2/algebra/egzamin/z5b.jpg b/semestr-2/algebra/egzamin/z5b.jpg
new file mode 100644
index 0000000..50f4883
--- /dev/null
+++ b/semestr-2/algebra/egzamin/z5b.jpg
Binary files differ
diff --git a/semestr-2/algebra/egzamin/z6.jpg b/semestr-2/algebra/egzamin/z6.jpg
new file mode 100644
index 0000000..3ab55a0
--- /dev/null
+++ b/semestr-2/algebra/egzamin/z6.jpg
Binary files differ
diff --git a/semestr-2/algebra/egzamin/z6a.jpg b/semestr-2/algebra/egzamin/z6a.jpg
new file mode 100644
index 0000000..7af963e
--- /dev/null
+++ b/semestr-2/algebra/egzamin/z6a.jpg
Binary files differ
diff --git a/semestr-2/algebra/egzamin/z6b.jpg b/semestr-2/algebra/egzamin/z6b.jpg
new file mode 100644
index 0000000..3c5c3e3
--- /dev/null
+++ b/semestr-2/algebra/egzamin/z6b.jpg
Binary files differ
diff --git a/semestr-2/algebra/egzamin/z6c.jpg b/semestr-2/algebra/egzamin/z6c.jpg
new file mode 100644
index 0000000..f46689f
--- /dev/null
+++ b/semestr-2/algebra/egzamin/z6c.jpg
Binary files differ
diff --git a/semestr-2/algebra/kolokwium/zad1.jpg b/semestr-2/algebra/kolokwium/zad1.jpg
new file mode 100644
index 0000000..f8fa7be
--- /dev/null
+++ b/semestr-2/algebra/kolokwium/zad1.jpg
Binary files differ
diff --git a/semestr-2/algebra/kolokwium/zad2.jpg b/semestr-2/algebra/kolokwium/zad2.jpg
new file mode 100644
index 0000000..7c92bf4
--- /dev/null
+++ b/semestr-2/algebra/kolokwium/zad2.jpg
Binary files differ
diff --git a/semestr-2/algebra/kolokwium/zad2cd.jpg b/semestr-2/algebra/kolokwium/zad2cd.jpg
new file mode 100644
index 0000000..692419a
--- /dev/null
+++ b/semestr-2/algebra/kolokwium/zad2cd.jpg
Binary files differ
diff --git a/semestr-2/algebra/kolokwium/zad3.jpg b/semestr-2/algebra/kolokwium/zad3.jpg
new file mode 100644
index 0000000..1f5304c
--- /dev/null
+++ b/semestr-2/algebra/kolokwium/zad3.jpg
Binary files differ
diff --git a/semestr-2/algebra/kolokwium/zad4.jpg b/semestr-2/algebra/kolokwium/zad4.jpg
new file mode 100644
index 0000000..f04662a
--- /dev/null
+++ b/semestr-2/algebra/kolokwium/zad4.jpg
Binary files differ
diff --git a/semestr-2/algebra/kolokwium/zad6.jpg b/semestr-2/algebra/kolokwium/zad6.jpg
new file mode 100644
index 0000000..be3acea
--- /dev/null
+++ b/semestr-2/algebra/kolokwium/zad6.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista10/66.png b/semestr-2/algebra/lista10/66.png
new file mode 100644
index 0000000..da66007
--- /dev/null
+++ b/semestr-2/algebra/lista10/66.png
Binary files differ
diff --git a/semestr-2/algebra/lista10/67.png b/semestr-2/algebra/lista10/67.png
new file mode 100644
index 0000000..a3992f9
--- /dev/null
+++ b/semestr-2/algebra/lista10/67.png
Binary files differ
diff --git a/semestr-2/algebra/lista10/68.png b/semestr-2/algebra/lista10/68.png
new file mode 100644
index 0000000..9e036f5
--- /dev/null
+++ b/semestr-2/algebra/lista10/68.png
Binary files differ
diff --git a/semestr-2/algebra/lista10/69.png b/semestr-2/algebra/lista10/69.png
new file mode 100644
index 0000000..1c15346
--- /dev/null
+++ b/semestr-2/algebra/lista10/69.png
Binary files differ
diff --git a/semestr-2/algebra/lista10/70.png b/semestr-2/algebra/lista10/70.png
new file mode 100644
index 0000000..9665a37
--- /dev/null
+++ b/semestr-2/algebra/lista10/70.png
Binary files differ
diff --git a/semestr-2/algebra/lista10/71.png b/semestr-2/algebra/lista10/71.png
new file mode 100644
index 0000000..b8874b1
--- /dev/null
+++ b/semestr-2/algebra/lista10/71.png
Binary files differ
diff --git a/semestr-2/algebra/lista10/72.png b/semestr-2/algebra/lista10/72.png
new file mode 100644
index 0000000..756231b
--- /dev/null
+++ b/semestr-2/algebra/lista10/72.png
Binary files differ
diff --git a/semestr-2/algebra/lista10/73.png b/semestr-2/algebra/lista10/73.png
new file mode 100644
index 0000000..27805e2
--- /dev/null
+++ b/semestr-2/algebra/lista10/73.png
Binary files differ
diff --git a/semestr-2/algebra/lista10/74.png b/semestr-2/algebra/lista10/74.png
new file mode 100644
index 0000000..a441e21
--- /dev/null
+++ b/semestr-2/algebra/lista10/74.png
Binary files differ
diff --git a/semestr-2/algebra/lista10/75.png b/semestr-2/algebra/lista10/75.png
new file mode 100644
index 0000000..16dedc1
--- /dev/null
+++ b/semestr-2/algebra/lista10/75.png
Binary files differ
diff --git a/semestr-2/algebra/lista10/76.png b/semestr-2/algebra/lista10/76.png
new file mode 100644
index 0000000..7671d0c
--- /dev/null
+++ b/semestr-2/algebra/lista10/76.png
Binary files differ
diff --git a/semestr-2/algebra/lista10/77.png b/semestr-2/algebra/lista10/77.png
new file mode 100644
index 0000000..ecd5099
--- /dev/null
+++ b/semestr-2/algebra/lista10/77.png
Binary files differ
diff --git a/semestr-2/algebra/lista10/zad1.jpg b/semestr-2/algebra/lista10/zad1.jpg
new file mode 100644
index 0000000..43206e2
--- /dev/null
+++ b/semestr-2/algebra/lista10/zad1.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista10/zad11.jpg b/semestr-2/algebra/lista10/zad11.jpg
new file mode 100644
index 0000000..1f6852c
--- /dev/null
+++ b/semestr-2/algebra/lista10/zad11.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista10/zad21A.jpg b/semestr-2/algebra/lista10/zad21A.jpg
new file mode 100644
index 0000000..2e113b2
--- /dev/null
+++ b/semestr-2/algebra/lista10/zad21A.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista10/zad21B.jpg b/semestr-2/algebra/lista10/zad21B.jpg
new file mode 100644
index 0000000..c457411
--- /dev/null
+++ b/semestr-2/algebra/lista10/zad21B.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista10/zad21C.jpg b/semestr-2/algebra/lista10/zad21C.jpg
new file mode 100644
index 0000000..d6a2eb8
--- /dev/null
+++ b/semestr-2/algebra/lista10/zad21C.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista10/zad21D.jpg b/semestr-2/algebra/lista10/zad21D.jpg
new file mode 100644
index 0000000..2406f53
--- /dev/null
+++ b/semestr-2/algebra/lista10/zad21D.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista10/zad3.jpg b/semestr-2/algebra/lista10/zad3.jpg
new file mode 100644
index 0000000..7c99c84
--- /dev/null
+++ b/semestr-2/algebra/lista10/zad3.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista10/zad6.jpg b/semestr-2/algebra/lista10/zad6.jpg
new file mode 100644
index 0000000..e75f2e2
--- /dev/null
+++ b/semestr-2/algebra/lista10/zad6.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista10/zad7.jpg b/semestr-2/algebra/lista10/zad7.jpg
new file mode 100644
index 0000000..669ccc7
--- /dev/null
+++ b/semestr-2/algebra/lista10/zad7.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista11/78.png b/semestr-2/algebra/lista11/78.png
new file mode 100644
index 0000000..db20401
--- /dev/null
+++ b/semestr-2/algebra/lista11/78.png
Binary files differ
diff --git a/semestr-2/algebra/lista11/79.png b/semestr-2/algebra/lista11/79.png
new file mode 100644
index 0000000..21908b8
--- /dev/null
+++ b/semestr-2/algebra/lista11/79.png
Binary files differ
diff --git a/semestr-2/algebra/lista11/80.png b/semestr-2/algebra/lista11/80.png
new file mode 100644
index 0000000..b2a153f
--- /dev/null
+++ b/semestr-2/algebra/lista11/80.png
Binary files differ
diff --git a/semestr-2/algebra/lista11/81.png b/semestr-2/algebra/lista11/81.png
new file mode 100644
index 0000000..3d65485
--- /dev/null
+++ b/semestr-2/algebra/lista11/81.png
Binary files differ
diff --git a/semestr-2/algebra/lista11/82.png b/semestr-2/algebra/lista11/82.png
new file mode 100644
index 0000000..d90b5b9
--- /dev/null
+++ b/semestr-2/algebra/lista11/82.png
Binary files differ
diff --git a/semestr-2/algebra/lista11/83.png b/semestr-2/algebra/lista11/83.png
new file mode 100644
index 0000000..915574b
--- /dev/null
+++ b/semestr-2/algebra/lista11/83.png
Binary files differ
diff --git a/semestr-2/algebra/lista11/84.png b/semestr-2/algebra/lista11/84.png
new file mode 100644
index 0000000..d2dda41
--- /dev/null
+++ b/semestr-2/algebra/lista11/84.png
Binary files differ
diff --git a/semestr-2/algebra/lista11/85.png b/semestr-2/algebra/lista11/85.png
new file mode 100644
index 0000000..00216c8
--- /dev/null
+++ b/semestr-2/algebra/lista11/85.png
Binary files differ
diff --git a/semestr-2/algebra/lista11/86.png b/semestr-2/algebra/lista11/86.png
new file mode 100644
index 0000000..8f649e3
--- /dev/null
+++ b/semestr-2/algebra/lista11/86.png
Binary files differ
diff --git a/semestr-2/algebra/lista11/87.png b/semestr-2/algebra/lista11/87.png
new file mode 100644
index 0000000..037ebc4
--- /dev/null
+++ b/semestr-2/algebra/lista11/87.png
Binary files differ
diff --git a/semestr-2/algebra/lista11/88.png b/semestr-2/algebra/lista11/88.png
new file mode 100644
index 0000000..94a43c9
--- /dev/null
+++ b/semestr-2/algebra/lista11/88.png
Binary files differ
diff --git a/semestr-2/algebra/lista11/89.png b/semestr-2/algebra/lista11/89.png
new file mode 100644
index 0000000..fa58ac9
--- /dev/null
+++ b/semestr-2/algebra/lista11/89.png
Binary files differ
diff --git a/semestr-2/algebra/lista11/90.png b/semestr-2/algebra/lista11/90.png
new file mode 100644
index 0000000..de92a0a
--- /dev/null
+++ b/semestr-2/algebra/lista11/90.png
Binary files differ
diff --git a/semestr-2/algebra/lista11/91.png b/semestr-2/algebra/lista11/91.png
new file mode 100644
index 0000000..47aff85
--- /dev/null
+++ b/semestr-2/algebra/lista11/91.png
Binary files differ
diff --git a/semestr-2/algebra/lista11/92.png b/semestr-2/algebra/lista11/92.png
new file mode 100644
index 0000000..42d9caf
--- /dev/null
+++ b/semestr-2/algebra/lista11/92.png
Binary files differ
diff --git a/semestr-2/algebra/lista11/zad1312.jpg b/semestr-2/algebra/lista11/zad1312.jpg
new file mode 100644
index 0000000..63674a3
--- /dev/null
+++ b/semestr-2/algebra/lista11/zad1312.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista11/zad2.jpg b/semestr-2/algebra/lista11/zad2.jpg
new file mode 100644
index 0000000..9793c78
--- /dev/null
+++ b/semestr-2/algebra/lista11/zad2.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista11/zad2c.jpg b/semestr-2/algebra/lista11/zad2c.jpg
new file mode 100644
index 0000000..de85e61
--- /dev/null
+++ b/semestr-2/algebra/lista11/zad2c.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista11/zad6.jpg b/semestr-2/algebra/lista11/zad6.jpg
new file mode 100644
index 0000000..582bddc
--- /dev/null
+++ b/semestr-2/algebra/lista11/zad6.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista11/zad7a.jpg b/semestr-2/algebra/lista11/zad7a.jpg
new file mode 100644
index 0000000..944b735
--- /dev/null
+++ b/semestr-2/algebra/lista11/zad7a.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista11/zad7b.jpg b/semestr-2/algebra/lista11/zad7b.jpg
new file mode 100644
index 0000000..1e62ad2
--- /dev/null
+++ b/semestr-2/algebra/lista11/zad7b.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista11/zad9.jpg b/semestr-2/algebra/lista11/zad9.jpg
new file mode 100644
index 0000000..cb0646e
--- /dev/null
+++ b/semestr-2/algebra/lista11/zad9.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista12/100.png b/semestr-2/algebra/lista12/100.png
new file mode 100644
index 0000000..32b2012
--- /dev/null
+++ b/semestr-2/algebra/lista12/100.png
Binary files differ
diff --git a/semestr-2/algebra/lista12/101.png b/semestr-2/algebra/lista12/101.png
new file mode 100644
index 0000000..4eee8ba
--- /dev/null
+++ b/semestr-2/algebra/lista12/101.png
Binary files differ
diff --git a/semestr-2/algebra/lista12/102.png b/semestr-2/algebra/lista12/102.png
new file mode 100644
index 0000000..6c2c8b4
--- /dev/null
+++ b/semestr-2/algebra/lista12/102.png
Binary files differ
diff --git a/semestr-2/algebra/lista12/103.png b/semestr-2/algebra/lista12/103.png
new file mode 100644
index 0000000..d417206
--- /dev/null
+++ b/semestr-2/algebra/lista12/103.png
Binary files differ
diff --git a/semestr-2/algebra/lista12/104.png b/semestr-2/algebra/lista12/104.png
new file mode 100644
index 0000000..3a1522d
--- /dev/null
+++ b/semestr-2/algebra/lista12/104.png
Binary files differ
diff --git a/semestr-2/algebra/lista12/105.png b/semestr-2/algebra/lista12/105.png
new file mode 100644
index 0000000..583e7d6
--- /dev/null
+++ b/semestr-2/algebra/lista12/105.png
Binary files differ
diff --git a/semestr-2/algebra/lista12/107.png b/semestr-2/algebra/lista12/107.png
new file mode 100644
index 0000000..9f715e4
--- /dev/null
+++ b/semestr-2/algebra/lista12/107.png
Binary files differ
diff --git a/semestr-2/algebra/lista12/16.jpg b/semestr-2/algebra/lista12/16.jpg
new file mode 100644
index 0000000..3e7c20c
--- /dev/null
+++ b/semestr-2/algebra/lista12/16.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista12/21.jpg b/semestr-2/algebra/lista12/21.jpg
new file mode 100644
index 0000000..263e8d4
--- /dev/null
+++ b/semestr-2/algebra/lista12/21.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista12/7a.jpg b/semestr-2/algebra/lista12/7a.jpg
new file mode 100644
index 0000000..e84ef5e
--- /dev/null
+++ b/semestr-2/algebra/lista12/7a.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista12/7b.jpg b/semestr-2/algebra/lista12/7b.jpg
new file mode 100644
index 0000000..061543b
--- /dev/null
+++ b/semestr-2/algebra/lista12/7b.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista12/8.jpg b/semestr-2/algebra/lista12/8.jpg
new file mode 100644
index 0000000..94f8206
--- /dev/null
+++ b/semestr-2/algebra/lista12/8.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista12/9.jpg b/semestr-2/algebra/lista12/9.jpg
new file mode 100644
index 0000000..a26d268
--- /dev/null
+++ b/semestr-2/algebra/lista12/9.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista12/95.png b/semestr-2/algebra/lista12/95.png
new file mode 100644
index 0000000..07493f5
--- /dev/null
+++ b/semestr-2/algebra/lista12/95.png
Binary files differ
diff --git a/semestr-2/algebra/lista12/96.png b/semestr-2/algebra/lista12/96.png
new file mode 100644
index 0000000..bb1c592
--- /dev/null
+++ b/semestr-2/algebra/lista12/96.png
Binary files differ
diff --git a/semestr-2/algebra/lista12/97.png b/semestr-2/algebra/lista12/97.png
new file mode 100644
index 0000000..2bf4bee
--- /dev/null
+++ b/semestr-2/algebra/lista12/97.png
Binary files differ
diff --git a/semestr-2/algebra/lista12/98.png b/semestr-2/algebra/lista12/98.png
new file mode 100644
index 0000000..413f7a6
--- /dev/null
+++ b/semestr-2/algebra/lista12/98.png
Binary files differ
diff --git a/semestr-2/algebra/lista12/99.png b/semestr-2/algebra/lista12/99.png
new file mode 100644
index 0000000..32f8997
--- /dev/null
+++ b/semestr-2/algebra/lista12/99.png
Binary files differ
diff --git a/semestr-2/algebra/lista12/unknown.png b/semestr-2/algebra/lista12/unknown.png
new file mode 100644
index 0000000..5556264
--- /dev/null
+++ b/semestr-2/algebra/lista12/unknown.png
Binary files differ
diff --git a/semestr-2/algebra/lista12/zad5.jpg b/semestr-2/algebra/lista12/zad5.jpg
new file mode 100644
index 0000000..fabc22b
--- /dev/null
+++ b/semestr-2/algebra/lista12/zad5.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista13/110.png b/semestr-2/algebra/lista13/110.png
new file mode 100644
index 0000000..2ac2e37
--- /dev/null
+++ b/semestr-2/algebra/lista13/110.png
Binary files differ
diff --git a/semestr-2/algebra/lista13/111.png b/semestr-2/algebra/lista13/111.png
new file mode 100644
index 0000000..6c4fc2d
--- /dev/null
+++ b/semestr-2/algebra/lista13/111.png
Binary files differ
diff --git a/semestr-2/algebra/lista13/112.png b/semestr-2/algebra/lista13/112.png
new file mode 100644
index 0000000..432aec0
--- /dev/null
+++ b/semestr-2/algebra/lista13/112.png
Binary files differ
diff --git a/semestr-2/algebra/lista13/113.png b/semestr-2/algebra/lista13/113.png
new file mode 100644
index 0000000..dad0858
--- /dev/null
+++ b/semestr-2/algebra/lista13/113.png
Binary files differ
diff --git a/semestr-2/algebra/lista13/114.png b/semestr-2/algebra/lista13/114.png
new file mode 100644
index 0000000..ba0a7cb
--- /dev/null
+++ b/semestr-2/algebra/lista13/114.png
Binary files differ
diff --git a/semestr-2/algebra/lista13/115.png b/semestr-2/algebra/lista13/115.png
new file mode 100644
index 0000000..07d838f
--- /dev/null
+++ b/semestr-2/algebra/lista13/115.png
Binary files differ
diff --git a/semestr-2/algebra/lista13/116.png b/semestr-2/algebra/lista13/116.png
new file mode 100644
index 0000000..5e19116
--- /dev/null
+++ b/semestr-2/algebra/lista13/116.png
Binary files differ
diff --git a/semestr-2/algebra/lista13/117.png b/semestr-2/algebra/lista13/117.png
new file mode 100644
index 0000000..faa3b2c
--- /dev/null
+++ b/semestr-2/algebra/lista13/117.png
Binary files differ
diff --git a/semestr-2/algebra/lista13/118.png b/semestr-2/algebra/lista13/118.png
new file mode 100644
index 0000000..572840d
--- /dev/null
+++ b/semestr-2/algebra/lista13/118.png
Binary files differ
diff --git a/semestr-2/algebra/lista13/zad11.jpg b/semestr-2/algebra/lista13/zad11.jpg
new file mode 100644
index 0000000..890377d
--- /dev/null
+++ b/semestr-2/algebra/lista13/zad11.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista13/zad7.jpg b/semestr-2/algebra/lista13/zad7.jpg
new file mode 100644
index 0000000..5ec8064
--- /dev/null
+++ b/semestr-2/algebra/lista13/zad7.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista13/zad8a.jpg b/semestr-2/algebra/lista13/zad8a.jpg
new file mode 100644
index 0000000..c631e11
--- /dev/null
+++ b/semestr-2/algebra/lista13/zad8a.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista13/zad8b.jpg b/semestr-2/algebra/lista13/zad8b.jpg
new file mode 100644
index 0000000..d35585b
--- /dev/null
+++ b/semestr-2/algebra/lista13/zad8b.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista14/11.jpg b/semestr-2/algebra/lista14/11.jpg
new file mode 100644
index 0000000..9197141
--- /dev/null
+++ b/semestr-2/algebra/lista14/11.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista14/1a.jpg b/semestr-2/algebra/lista14/1a.jpg
new file mode 100644
index 0000000..3f25d1c
--- /dev/null
+++ b/semestr-2/algebra/lista14/1a.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista14/1aa.jpg b/semestr-2/algebra/lista14/1aa.jpg
new file mode 100644
index 0000000..dd22bde
--- /dev/null
+++ b/semestr-2/algebra/lista14/1aa.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista14/1c.jpg b/semestr-2/algebra/lista14/1c.jpg
new file mode 100644
index 0000000..9181ea2
--- /dev/null
+++ b/semestr-2/algebra/lista14/1c.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista14/1cc.jpg b/semestr-2/algebra/lista14/1cc.jpg
new file mode 100644
index 0000000..c258f16
--- /dev/null
+++ b/semestr-2/algebra/lista14/1cc.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista14/7.jpg b/semestr-2/algebra/lista14/7.jpg
new file mode 100644
index 0000000..cee2b83
--- /dev/null
+++ b/semestr-2/algebra/lista14/7.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista14/8.jpg b/semestr-2/algebra/lista14/8.jpg
new file mode 100644
index 0000000..877a488
--- /dev/null
+++ b/semestr-2/algebra/lista14/8.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista14/9a.jpg b/semestr-2/algebra/lista14/9a.jpg
new file mode 100644
index 0000000..51fc8fc
--- /dev/null
+++ b/semestr-2/algebra/lista14/9a.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista14/9b.jpg b/semestr-2/algebra/lista14/9b.jpg
new file mode 100644
index 0000000..14345c8
--- /dev/null
+++ b/semestr-2/algebra/lista14/9b.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista14/FraMal,z1;7;8;9;11;18.pdf b/semestr-2/algebra/lista14/FraMal,z1;7;8;9;11;18.pdf
new file mode 100644
index 0000000..bac9a67
--- /dev/null
+++ b/semestr-2/algebra/lista14/FraMal,z1;7;8;9;11;18.pdf
Binary files differ
diff --git a/semestr-2/algebra/lista14/zad18.jpg b/semestr-2/algebra/lista14/zad18.jpg
new file mode 100644
index 0000000..d7cb461
--- /dev/null
+++ b/semestr-2/algebra/lista14/zad18.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/32.jpg b/semestr-2/algebra/lista9/32.jpg
new file mode 100644
index 0000000..66d37a7
--- /dev/null
+++ b/semestr-2/algebra/lista9/32.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/34.jpg b/semestr-2/algebra/lista9/34.jpg
new file mode 100644
index 0000000..14d8458
--- /dev/null
+++ b/semestr-2/algebra/lista9/34.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/36.jpg b/semestr-2/algebra/lista9/36.jpg
new file mode 100644
index 0000000..44cb097
--- /dev/null
+++ b/semestr-2/algebra/lista9/36.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/38.jpg b/semestr-2/algebra/lista9/38.jpg
new file mode 100644
index 0000000..2ad8395
--- /dev/null
+++ b/semestr-2/algebra/lista9/38.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/40.jpg b/semestr-2/algebra/lista9/40.jpg
new file mode 100644
index 0000000..dbb145c
--- /dev/null
+++ b/semestr-2/algebra/lista9/40.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/42.jpg b/semestr-2/algebra/lista9/42.jpg
new file mode 100644
index 0000000..36bcae9
--- /dev/null
+++ b/semestr-2/algebra/lista9/42.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/44.jpg b/semestr-2/algebra/lista9/44.jpg
new file mode 100644
index 0000000..fcf96e2
--- /dev/null
+++ b/semestr-2/algebra/lista9/44.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/46.jpg b/semestr-2/algebra/lista9/46.jpg
new file mode 100644
index 0000000..f04c4ed
--- /dev/null
+++ b/semestr-2/algebra/lista9/46.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/48.jpg b/semestr-2/algebra/lista9/48.jpg
new file mode 100644
index 0000000..988cf50
--- /dev/null
+++ b/semestr-2/algebra/lista9/48.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/50.jpg b/semestr-2/algebra/lista9/50.jpg
new file mode 100644
index 0000000..d4afb6d
--- /dev/null
+++ b/semestr-2/algebra/lista9/50.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/zad10.jpg b/semestr-2/algebra/lista9/zad10.jpg
new file mode 100644
index 0000000..6c7137a
--- /dev/null
+++ b/semestr-2/algebra/lista9/zad10.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/zad10bpoprawka.jpg b/semestr-2/algebra/lista9/zad10bpoprawka.jpg
new file mode 100644
index 0000000..73f79c2
--- /dev/null
+++ b/semestr-2/algebra/lista9/zad10bpoprawka.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/zad11.jpg b/semestr-2/algebra/lista9/zad11.jpg
new file mode 100644
index 0000000..2fb3cb1
--- /dev/null
+++ b/semestr-2/algebra/lista9/zad11.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/zad12.jpg b/semestr-2/algebra/lista9/zad12.jpg
new file mode 100644
index 0000000..152c3a4
--- /dev/null
+++ b/semestr-2/algebra/lista9/zad12.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/zad13.jpg b/semestr-2/algebra/lista9/zad13.jpg
new file mode 100644
index 0000000..6404ef0
--- /dev/null
+++ b/semestr-2/algebra/lista9/zad13.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/zad6.jpg b/semestr-2/algebra/lista9/zad6.jpg
new file mode 100644
index 0000000..e392b4b
--- /dev/null
+++ b/semestr-2/algebra/lista9/zad6.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/zad8a.jpg b/semestr-2/algebra/lista9/zad8a.jpg
new file mode 100644
index 0000000..37a64a5
--- /dev/null
+++ b/semestr-2/algebra/lista9/zad8a.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/zad8b.jpg b/semestr-2/algebra/lista9/zad8b.jpg
new file mode 100644
index 0000000..1864fe6
--- /dev/null
+++ b/semestr-2/algebra/lista9/zad8b.jpg
Binary files differ
diff --git a/semestr-2/algebra/lista9/zad9.jpg b/semestr-2/algebra/lista9/zad9.jpg
new file mode 100644
index 0000000..bababf7
--- /dev/null
+++ b/semestr-2/algebra/lista9/zad9.jpg
Binary files differ
diff --git a/semestr-2/algebra/z1a-skonwertowany.pdf b/semestr-2/algebra/z1a-skonwertowany.pdf
new file mode 100644
index 0000000..a4d4941
--- /dev/null
+++ b/semestr-2/algebra/z1a-skonwertowany.pdf
Binary files differ
diff --git a/semestr-2/algebra/zad101213.jpg b/semestr-2/algebra/zad101213.jpg
new file mode 100644
index 0000000..e3bf7e2
--- /dev/null
+++ b/semestr-2/algebra/zad101213.jpg
Binary files differ
diff --git a/semestr-2/algebra/zad14.jpg b/semestr-2/algebra/zad14.jpg
new file mode 100644
index 0000000..95a8c95
--- /dev/null
+++ b/semestr-2/algebra/zad14.jpg
Binary files differ
diff --git a/semestr-2/algebra/zad2;3;6;7;11;21.pdf b/semestr-2/algebra/zad2;3;6;7;11;21.pdf
new file mode 100644
index 0000000..6eb52f7
--- /dev/null
+++ b/semestr-2/algebra/zad2;3;6;7;11;21.pdf
Binary files differ
diff --git a/semestr-2/algebra/zad2;6;7;9.pdf b/semestr-2/algebra/zad2;6;7;9.pdf
new file mode 100644
index 0000000..1a64f57
--- /dev/null
+++ b/semestr-2/algebra/zad2;6;7;9.pdf
Binary files differ
diff --git a/semestr-2/algebra/zad5;7;8;9;16.pdf b/semestr-2/algebra/zad5;7;8;9;16.pdf
new file mode 100644
index 0000000..c20a41e
--- /dev/null
+++ b/semestr-2/algebra/zad5;7;8;9;16.pdf
Binary files differ
diff --git a/semestr-2/algebra/zad7;8;11;15.pdf b/semestr-2/algebra/zad7;8;11;15.pdf
new file mode 100644
index 0000000..2b1e160
--- /dev/null
+++ b/semestr-2/algebra/zad7;8;11;15.pdf
Binary files differ
diff --git a/semestr-2/analiza/Analiza_last_gwiazdka.pdf b/semestr-2/analiza/Analiza_last_gwiazdka.pdf
new file mode 100644
index 0000000..72d3041
--- /dev/null
+++ b/semestr-2/analiza/Analiza_last_gwiazdka.pdf
Binary files differ
diff --git a/semestr-2/analiza/L11Z8,9;L12Z1,2,3,7; PUNTKÓW 18.pdf b/semestr-2/analiza/L11Z8,9;L12Z1,2,3,7; PUNTKÓW 18.pdf
new file mode 100644
index 0000000..99b3e17
--- /dev/null
+++ b/semestr-2/analiza/L11Z8,9;L12Z1,2,3,7; PUNTKÓW 18.pdf
Binary files differ
diff --git a/semestr-2/analiza/L3Z11;Szwarc26.03;Obie gwiazdki.pdf b/semestr-2/analiza/L3Z11;Szwarc26.03;Obie gwiazdki.pdf
new file mode 100644
index 0000000..b3814dc
--- /dev/null
+++ b/semestr-2/analiza/L3Z11;Szwarc26.03;Obie gwiazdki.pdf
Binary files differ
diff --git a/semestr-2/analiza/L9Z7;L10Z2,3,4;L11Z1,2,4,5,6;Punktów 34.pdf b/semestr-2/analiza/L9Z7;L10Z2,3,4;L11Z1,2,4,5,6;Punktów 34.pdf
new file mode 100644
index 0000000..7c37d85
--- /dev/null
+++ b/semestr-2/analiza/L9Z7;L10Z2,3,4;L11Z1,2,4,5,6;Punktów 34.pdf
Binary files differ
diff --git a/semestr-2/analiza/Lista7;21pkt.pdf b/semestr-2/analiza/Lista7;21pkt.pdf
new file mode 100644
index 0000000..e7328d9
--- /dev/null
+++ b/semestr-2/analiza/Lista7;21pkt.pdf
Binary files differ
diff --git a/semestr-2/analiza/Lista9;zad3;5;6;8;12;PUNKTÓW 25.pdf b/semestr-2/analiza/Lista9;zad3;5;6;8;12;PUNKTÓW 25.pdf
new file mode 100644
index 0000000..82894fd
--- /dev/null
+++ b/semestr-2/analiza/Lista9;zad3;5;6;8;12;PUNKTÓW 25.pdf
Binary files differ
diff --git a/semestr-2/analiza/lista11/LISTA3;zad11.jpg b/semestr-2/analiza/lista11/LISTA3;zad11.jpg
new file mode 100644
index 0000000..19c129d
--- /dev/null
+++ b/semestr-2/analiza/lista11/LISTA3;zad11.jpg
Binary files differ
diff --git a/semestr-2/analiza/lista11/l11z8l12z1.jpg b/semestr-2/analiza/lista11/l11z8l12z1.jpg
new file mode 100644
index 0000000..2766310
--- /dev/null
+++ b/semestr-2/analiza/lista11/l11z8l12z1.jpg
Binary files differ
diff --git a/semestr-2/analiza/lista11/l11z9.jpg b/semestr-2/analiza/lista11/l11z9.jpg
new file mode 100644
index 0000000..b38f822
--- /dev/null
+++ b/semestr-2/analiza/lista11/l11z9.jpg
Binary files differ
diff --git a/semestr-2/analiza/lista11/l12z2.jpg b/semestr-2/analiza/lista11/l12z2.jpg
new file mode 100644
index 0000000..835dd21
--- /dev/null
+++ b/semestr-2/analiza/lista11/l12z2.jpg
Binary files differ
diff --git a/semestr-2/analiza/lista11/l12z3.jpg b/semestr-2/analiza/lista11/l12z3.jpg
new file mode 100644
index 0000000..38e4ac8
--- /dev/null
+++ b/semestr-2/analiza/lista11/l12z3.jpg
Binary files differ
diff --git a/semestr-2/analiza/lista11/l12z7.jpg b/semestr-2/analiza/lista11/l12z7.jpg
new file mode 100644
index 0000000..396f123
--- /dev/null
+++ b/semestr-2/analiza/lista11/l12z7.jpg
Binary files differ
diff --git a/semestr-2/analiza/lista11/szwarc26.06.jpg b/semestr-2/analiza/lista11/szwarc26.06.jpg
new file mode 100644
index 0000000..6d6cb60
--- /dev/null
+++ b/semestr-2/analiza/lista11/szwarc26.06.jpg
Binary files differ
diff --git a/semestr-2/analiza/lista11/zad11b.jpg b/semestr-2/analiza/lista11/zad11b.jpg
new file mode 100644
index 0000000..68ad10b
--- /dev/null
+++ b/semestr-2/analiza/lista11/zad11b.jpg
Binary files differ
diff --git a/semestr-2/analiza/lista11/zad1a-e.jpg b/semestr-2/analiza/lista11/zad1a-e.jpg
new file mode 100644
index 0000000..e1eb2f5
--- /dev/null
+++ b/semestr-2/analiza/lista11/zad1a-e.jpg
Binary files differ
diff --git a/semestr-2/analiza/lista11/zad1f2.jpg b/semestr-2/analiza/lista11/zad1f2.jpg
new file mode 100644
index 0000000..30395f2
--- /dev/null
+++ b/semestr-2/analiza/lista11/zad1f2.jpg
Binary files differ
diff --git a/semestr-2/analiza/lista11/zad2.jpg b/semestr-2/analiza/lista11/zad2.jpg
new file mode 100644
index 0000000..60183a4
--- /dev/null
+++ b/semestr-2/analiza/lista11/zad2.jpg
Binary files differ
diff --git a/semestr-2/analiza/lista11/zad3.jpg b/semestr-2/analiza/lista11/zad3.jpg
new file mode 100644
index 0000000..9be3db6
--- /dev/null
+++ b/semestr-2/analiza/lista11/zad3.jpg
Binary files differ
diff --git a/semestr-2/analiza/lista11/zad4.jpg b/semestr-2/analiza/lista11/zad4.jpg
new file mode 100644
index 0000000..2535e05
--- /dev/null
+++ b/semestr-2/analiza/lista11/zad4.jpg
Binary files differ
diff --git a/semestr-2/analiza/lista11/zad465.jpg b/semestr-2/analiza/lista11/zad465.jpg
new file mode 100644
index 0000000..fcfdda3
--- /dev/null
+++ b/semestr-2/analiza/lista11/zad465.jpg
Binary files differ
diff --git a/semestr-2/analiza/lista11/zad7a.jpg b/semestr-2/analiza/lista11/zad7a.jpg
new file mode 100644
index 0000000..5c045d9
--- /dev/null
+++ b/semestr-2/analiza/lista11/zad7a.jpg
Binary files differ
diff --git a/semestr-2/analiza/lista11/zad7b.jpg b/semestr-2/analiza/lista11/zad7b.jpg
new file mode 100644
index 0000000..5308651
--- /dev/null
+++ b/semestr-2/analiza/lista11/zad7b.jpg
Binary files differ
diff --git a/semestr-2/analiza/zad12.jpg b/semestr-2/analiza/zad12.jpg
new file mode 100644
index 0000000..4da6d95
--- /dev/null
+++ b/semestr-2/analiza/zad12.jpg
Binary files differ
diff --git a/semestr-2/analiza/zad3;5.jpg b/semestr-2/analiza/zad3;5.jpg
new file mode 100644
index 0000000..bacf11a
--- /dev/null
+++ b/semestr-2/analiza/zad3;5.jpg
Binary files differ
diff --git a/semestr-2/analiza/zad6;8a.jpg b/semestr-2/analiza/zad6;8a.jpg
new file mode 100644
index 0000000..eec9653
--- /dev/null
+++ b/semestr-2/analiza/zad6;8a.jpg
Binary files differ
diff --git a/semestr-2/analiza/zad8b1.jpg b/semestr-2/analiza/zad8b1.jpg
new file mode 100644
index 0000000..e16c886
--- /dev/null
+++ b/semestr-2/analiza/zad8b1.jpg
Binary files differ
diff --git a/semestr-2/analiza/zad8b2.jpg b/semestr-2/analiza/zad8b2.jpg
new file mode 100644
index 0000000..224a6e6
--- /dev/null
+++ b/semestr-2/analiza/zad8b2.jpg
Binary files differ
diff --git a/semestr-2/analiza/zad8c.jpg b/semestr-2/analiza/zad8c.jpg
new file mode 100644
index 0000000..91b1be1
--- /dev/null
+++ b/semestr-2/analiza/zad8c.jpg
Binary files differ
diff --git a/semestr-2/racket/cnf.rkt b/semestr-2/racket/cnf.rkt
new file mode 100644
index 0000000..67bd70f
--- /dev/null
+++ b/semestr-2/racket/cnf.rkt
@@ -0,0 +1,188 @@
+#lang racket
+
+(define (var? t) (symbol? t))
+
+(define (neg? t)
+ (and (list? t)
+ (= 2 (length t))
+ (eq? 'neg (car t))))
+
+(define (conj? t)
+ (and (list? t)
+ (= 3 (length t))
+ (eq? 'conj (car t))))
+
+(define (disj? t)
+ (and (list? t)
+ (= 3 (length t))
+ (eq? 'disj (car t))))
+
+(define (lit? t)
+ (or (var? t)
+ (and (neg? t)
+ (var? (neg-subf t)))))
+
+(define (prop? f)
+ (or (var? f)
+ (and (neg? f)
+ (prop? (neg-subf f)))
+ (and (disj? f)
+ (prop? (disj-left f))
+ (prop? (disj-right f)))
+ (and (conj? f)
+ (prop? (conj-left f))
+ (prop? (conj-right f)))))
+
+(define (make-conj left right)
+ (list 'conj left right))
+
+(define (make-disj left right)
+ (list 'disj left right))
+
+(define (make-neg f)
+ (list 'neg f))
+
+(define (conj-left f)
+ (if (conj? f)
+ (cadr f)
+ (error "Złe dane ze znacznikiem -- CONJ-LEFT" f)))
+
+(define (conj-right f)
+ (if (conj? f)
+ (caddr f)
+ (error "Złe dane ze znacznikiem -- CONJ-RIGHT" f)))
+
+(define (disj-left f)
+ (if (disj? f)
+ (cadr f)
+ (error "Złe dane ze znacznikiem -- DISJ-LEFT" f)))
+
+(define (disj-right f)
+ (if (disj? f)
+ (caddr f)
+ (error "Złe dane ze znacznikiem -- DISJ-RIGHT" f)))
+
+(define (neg-subf f)
+ (if (neg? f)
+ (cadr f)
+ (error "Złe dane ze znacznikiem -- NEG-FORM" f)))
+
+(define (lit-var f)
+ (cond [(var? f) f]
+ [(neg? f) (neg-subf f)]
+ [else (error "Złe dane ze znacznikiem -- LIT-VAR" f)]))
+
+(define (free-vars f)
+ (cond [(null? f) null]
+ [(var? f) (list f)]
+ [(neg? f) (free-vars (neg-subf f))]
+ [(conj? f) (append (free-vars (conj-left f))
+ (free-vars (conj-right f)))]
+ [(disj? f) (append (free-vars (disj-left f))
+ (free-vars (disj-right f)))]
+ [else (error "Zła formula -- FREE-VARS" f)]))
+
+(define (gen-vals xs)
+ (if (null? xs)
+ (list null)
+ (let*
+ ((vss (gen-vals (cdr xs)))
+ (x (car xs))
+ (vst (map (λ (vs) (cons (list x true) vs)) vss))
+ (vsf (map (λ (vs) (cons (list x false) vs)) vss)))
+ (append vst vsf))))
+
+(define (eval-formula f evaluation)
+ (cond [(var? f)
+ (let ((val (assoc f evaluation)))
+ (if (not val)
+ (error "Zmienna wolna nie wystepuje w wartościowaniu -- EVAL-FORMULA" f evaluation)
+ (cadr val)))]
+ [(neg? f) (not (eval-formula (neg-subf f) evaluation))]
+ [(disj? f) (or (eval-formula (disj-left f) evaluation)
+ (eval-formula (disj-right f) evaluation))]
+ [(conj? f) (and (eval-formula (conj-left f) evaluation)
+ (eval-formula (conj-right f) evaluation))]
+ [else (error "Zła formuła -- EVAL-FORMULA" f evaluation)]))
+
+(define (falsifable-eval? f)
+ (let* ((evaluations (gen-vals (free-vars f)))
+ (results (map (λ (evaluation) (eval-formula f evaluation)) evaluations)))
+ (ormap false? results)))
+
+(define (nff? f)
+ (cond [(lit? f) true]
+ [(neg? f) false]
+ [(conj? f) (and (nff? (conj-left f))
+ (nff? (conj-right f)))]
+ [(disj? f) (and (nff? (disj-left f))
+ (nff? (disj-right f)))]
+ [else (error "Zła formuła -- NFF?" f)]))
+
+(define (convert-to-nnf f)
+ (cond [(lit? f) f]
+ [(neg? f) (convert-negation (neg-subf f))]
+ [(conj? f) (make-conj (convert-to-nnf (conj-left f))
+ (convert-to-nnf (conj-right f)))]
+ [(disj? f) (make-disj (convert-to-nnf (disj-left f))
+ (convert-to-nnf (disj-right f)))]
+ [else (error "Zła formuła -- CONVERT" f)]))
+
+(define (convert-negation f)
+ (cond [(lit? f)
+ (if (var? f)
+ (make-neg f)
+ (neg-subf f))]
+ [(neg? f) (convert-to-nnf (neg-subf f))]
+ [(conj? f) (make-disj (convert-negation (conj-left f))
+ (convert-negation (conj-right f)))]
+ [(disj? f) (make-conj (convert-negation (disj-left f))
+ (convert-negation (disj-right f)))]
+ [else (error "Zła formuła -- CONVERT-NEGATION" f)]))
+
+(define (clause? x)
+ (and (list? x)
+ (andmap lit? x)))
+
+(define (clause-empty? x)
+ (and (clause? x)
+ (null? x)))
+
+(define (cnf? x)
+ (and (list? x)
+ (andmap clause? x)))
+
+(define (flatmap proc seq)
+ (foldl append null (map proc seq)))
+
+(define (convert-to-cnf f)
+ (define (convert f)
+ (cond [(lit? f) (list (list f))]
+ [(conj? f) (append (convert-to-cnf (conj-left f))
+ (convert-to-cnf (conj-right f)))]
+ [(disj? f)
+ (let ((clause-left (convert-to-cnf (disj-left f)))
+ (clause-right (convert-to-cnf (disj-right f))))
+ (flatmap (λ (clause)
+ (map (λ (clause2)
+ (append clause2 clause)) clause-left))
+ clause-right))]))
+ (convert (convert-to-nnf f)))
+
+(define (falsifable-clause? clause)
+ (cond [(clause-empty? clause) true]
+ [(lit? (findf (λ (l) (equal?
+ l
+ (convert-to-nnf (make-neg (car clause)))))
+ clause)) false]
+ [else (falsifable-clause? (cdr clause))]))
+
+(define (falsifable-cnf? f)
+ (define (neg-value lit)
+ (if (var? lit)
+ (list lit false)
+ (list (neg-subf lit) true)))
+ (ormap (λ (clause) (if (falsifable-clause? clause)
+ (map neg-value clause)
+ false))
+ (convert-to-cnf f))) \ No newline at end of file
diff --git a/semestr-2/racket/cw.rkt b/semestr-2/racket/cw.rkt
new file mode 100644
index 0000000..f1e706f
--- /dev/null
+++ b/semestr-2/racket/cw.rkt
@@ -0,0 +1,57 @@
+#lang racket
+
+(define (accumulate op initial sequence)
+ (if (null? sequence)
+ initial
+ (op (car sequence)
+ (accumulate op initial (cdr sequence)))))
+
+(define (horner-eval x coefficient-sequence)
+ (accumulate (lambda (this-coeff higher-terms)
+ (+ this-coeff (* x higher-terms)))
+ 0
+ coefficient-sequence))
+
+
+(define (accumulate-n op init seqs)
+ (if (null? (car seqs))
+ null
+ (cons (accumulate op init (map car seqs))
+ (accumulate-n op init (map cdr seqs)))))
+
+(define (count-leaves t)
+ (accumulate + 0 (map (lambda (x)
+ (if (not (pair? x))
+ 1
+ (count-leaves x))) t)))
+
+(define (flatmap proc seq)
+ (accumulate append null (map proc seq)))
+
+(define (prime? x) (= (modulo x 2) 1))
+
+(define (prime-sum? pair)
+ (prime? (+ (car pair) (cadr pair))))
+
+(define (make-pair-sum pair)
+ (list (car pair) (cadr pair) (+ (car pair) (cadr pair))))
+
+(define (enumerate-interval low high)
+ (if (> low high)
+ null
+ (cons low (enumerate-interval (+ 1 low) high))))
+
+(define (unique-pairs n)
+ (flatmap (lambda (i)
+ (map (lambda (j) (list j i))
+ (enumerate-interval 1 (- i 1))))
+ (enumerate-interval 1 n)))
+
+(define (prime-sum-pairs n)
+ (map make-pair-sum
+ (filter prime-sum? (unique-pairs n))))
+
+(define (is-eq-s? s triplet)
+ (= s (accumulate + 0 triplet)))
+
+(define \ No newline at end of file
diff --git a/semestr-2/racket/deriv.rkt b/semestr-2/racket/deriv.rkt
new file mode 100644
index 0000000..0eef9d2
--- /dev/null
+++ b/semestr-2/racket/deriv.rkt
@@ -0,0 +1,47 @@
+#lang racket
+
+(define (variable? x) (symbol? x))
+
+(define (same-variable? v1 v2)
+ (and (variable? v1) (variable? v2) (eq? v1 v2)))
+
+(define (=number? exp num)
+ (and (number? exp) (= exp num)))
+
+(define (make-sum a1 a2)
+ (cond ((=number? a1 0) a2)
+ ((=number? a2 0) a1)
+ ((and (number? a1) (number? a2) (+ a1 a2)))
+ (else (list '+ a1 a2))))
+(define (sum? x)
+ (and (pair? x) (eq? (car x) '+)))
+(define (addend s) (cadr s))
+(define (augend s) (caddr s))
+
+(define (make-product m1 m2)
+ (cond ((or (=number? m1 0) (=number? m2 0)) 0)
+ ((=number? m1 1) m2)
+ ((=number? m2 1) m1)
+ ((and (number? m1) (number? m2)) (* m1 m2))
+ (else (list '* m1 m2))))
+(define (product? x)
+ (and (pair? x) (eq? (car x) '*)))
+(define (multiplier p) (cadr p))
+(define (multiplicand p) (caddr p))
+
+(define (deriv exp var)
+ (cond ((number? exp) 0)
+ ((variable? exp)
+ (if (same-variable? exp var) 1 0))
+ ((sum? exp)
+ (make-sum (deriv (addend exp) var)
+ (deriv (augend exp) var)))
+ ((product? exp)
+ (make-sum
+ (make-product (multiplier exp)
+ (deriv (multiplicand exp) var))
+ (make-product (deriv (multiplier exp) var)
+ (multiplicand exp))))
+ (else
+ (error "Nieznany rodzaj wyrazenia -- DERIV" exp))))
+ \ No newline at end of file
diff --git a/semestr-2/racket/egzamin/rozw2.txt b/semestr-2/racket/egzamin/rozw2.txt
new file mode 100644
index 0000000..a70232e
--- /dev/null
+++ b/semestr-2/racket/egzamin/rozw2.txt
@@ -0,0 +1 @@
+Zasada indukcji dla \ No newline at end of file
diff --git a/semestr-2/racket/egzamin/zad1.bak b/semestr-2/racket/egzamin/zad1.bak
new file mode 100644
index 0000000..6f1f7b4
--- /dev/null
+++ b/semestr-2/racket/egzamin/zad1.bak
@@ -0,0 +1 @@
+#lang racket
diff --git a/semestr-2/racket/egzamin/zad1.rkt b/semestr-2/racket/egzamin/zad1.rkt
new file mode 100644
index 0000000..a90d2fd
--- /dev/null
+++ b/semestr-2/racket/egzamin/zad1.rkt
@@ -0,0 +1,300 @@
+#lang racket
+
+;; ZADANIE 1
+;; =========
+
+;; W tym zadaniu rozważamy język WHILE (w formie z grubsza
+;; odpowiadającej tej z wykładu), z blokami deklarującymi zmienne o
+;; lokalnym zakresie.
+
+;; Zadanie polega na dodaniu do języka procedur definiowanych na
+;; zewnątrz głównego polecenia programu (podobnie jak w C, gdzie
+;; główne polecenie odpowiadałoby procedurze main, czy Pascalu) — o
+;; dowolnym wybranym przez siebie modelu działania. W tym celu należy:
+;; · rozszerzyć składnię abstrakcyjną o składnię procedur i rozbudować odpowiednio składnię programów
+;; · rozszerzyć procedurę parsowania
+;; · rozszerzyć ewaluator
+;; · *opisać* wybrany model działania procedur, w tym jego potencjalne zalety lub ograniczenia
+;; Należy rozszerzyć poniższy szablon, a część słowną zadania umieścić
+;; w komentarzu, podobnie jak niniejsze polecenie.
+
+;; Uwaga! Zadanie jest *bardzo* szeroko sformułowane, jest wiele
+;; sensownych rozwiązań które stosowały liczne języki imperatywne w
+;; historii — nie jest treścią zadania znalezienie *najlepszego*,
+;; tylko swojego, które *rozumiecie*. Wybrany model działania procedur
+;; *może* być relatywnie ubogi, jednak jeśli tak się zrobi, warto
+;; pokazać że ma się tego świadomość w słownym opisie jego działania.
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (name) #:transparent)
+(struct call-expr (name args) #:transparent)
+(struct return-expr (val) #:transparent)
+
+(define (operator? x)
+ (member x '(+ * - / > < = >= <=)))
+
+(define (keyword? x)
+ (member x '(skip while if := func call return)))
+
+(define (expr? e)
+ (match e
+ [(const v)
+ (integer? v)]
+ [(var-expr x)
+ (and (symbol? x)
+ (not (keyword? x)))]
+ [(binop op l r)
+ (and (operator? op)
+ (expr? l)
+ (expr? r))]
+ [_ false]))
+
+(struct skip () #:transparent)
+(struct assign (id exp) #:transparent)
+(struct if-cmd (exp ct cf) #:transparent)
+(struct while (exp cmd) #:transparent)
+(struct comp (left right) #:transparent)
+(struct var-in (name expr cmd) #:transparent)
+(struct function (name args cmd) #:transparent)
+
+(define (cmd? c)
+ (match c
+ [(skip) true]
+ [(assign x e) (and (symbol? x) (expr? e))]
+ [(if-cmd e ct cf) (and (expr? e) (cmd? ct) (cmd? cf))]
+ [(while e c) (and (expr? e) (cmd? c))]
+ [(comp c1 c2) (and (cmd? c1) (cmd? c2))]
+ [(var-in x e c) (and (symbol? x) (expr? e) (cmd? c))]
+ [(function f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))]))
+
+(define (prog? p)
+ (cmd? p))
+
+(define (parse-expr p)
+ (cond
+ [(number? p) (const p)]
+ [(and (symbol? p)
+ (not (keyword? p)))
+ (var-expr p)]
+ [(and (list? p)
+ (= 3 (length p))
+ (operator? (car p)))
+ (binop (first p)
+ (parse-expr (second p))
+ (parse-expr (third p)))]
+ [(and (list? p) ; <------ wywołanie funkcji
+ (= (length p) 3)
+ (eq? (first p) 'call)
+ (symbol? (second p))
+ (list? (third p)))
+ (call-expr (second p) (map parse-expr (third p)))]
+ [else false]))
+
+(define (parse-cmd q)
+ (cond
+ [(eq? q 'skip) (skip)]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (second q) ':=))
+ (assign (first q) (parse-expr (third q)))]
+ [(and (list? q)
+ (= (length q) 4)
+ (eq? (first q) 'if))
+ (if-cmd (parse-expr (second q)) (parse-cmd (third q)) (parse-cmd (fourth q)))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'while))
+ (while (parse-expr (second q)) (parse-cmd (third q)))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'var)
+ (list? (second q))
+ (= (length (second q)) 2))
+ (var-in (first (second q))
+ (parse-expr (second (second q)))
+ (parse-cmd (third q)))]
+ [(and (list? q) ; <------ funkcje
+ (= (length q) 4)
+ (eq? (first q) 'func)
+ (symbol? (second q))
+ (list? (third q))
+ (andmap symbol? (third q)))
+ (function (second q) (third q) (parse-cmd (fourth q)))]
+ [(and (list? q)
+ (= (length q) 2)
+ (eq? (first q) 'return))
+ (return-expr (parse-expr (second q)))]
+ [(and (list? q)
+ (>= (length q) 2))
+ (desugar-comp (map parse-cmd q))]
+ [else false]))
+
+(define (desugar-comp cs)
+ (if (null? (cdr cs))
+ (car cs)
+ (comp (car cs)
+ (desugar-comp (cdr cs)))))
+
+(define (value? v)
+ (number? v))
+
+(struct mem (xs) #:transparent)
+
+(define (mem-lookup x m)
+ (define (assoc-lookup xs)
+ (cond
+ [(null? xs) (error "Undefined variable" x)]
+ [(eq? x (caar xs)) (cdar xs)]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (mem-xs m)))
+
+(define (mem-defined? x m) ; <----------- !!! Sprawdz, czy x jest w ogole zdefiniowane
+ (define (assoc-lookup xs)
+ (cond
+ [(null? xs) #f]
+ [(eq? x (caar xs) #t)]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (mem-xs m)))
+
+(define (mem-update x v m)
+ (define (assoc-update xs)
+ (cond
+ [(null? xs) (error "Undefined variable" x)]
+ [(eq? x (caar xs)) (cons (cons x v) (cdr xs))]
+ [else (cons (car xs) (assoc-update (cdr xs)))]))
+ (mem (assoc-update (mem-xs m))))
+
+(define (mem-alloc x v m)
+ (mem (cons (cons x v) (mem-xs m))))
+
+(define (mem-drop-last m)
+ (cond
+ [(null? (mem-xs m))
+ (error "Deallocating from empty memory")]
+ [else
+ (mem (cdr (mem-xs m)))]))
+
+(define empty-mem
+ (mem null))
+
+(define (op->proc op)
+ (match op
+ ['+ +]
+ ['- -]
+ ['* *]
+ ['/ /]
+ ['< (lambda (x y) (if (< x y) 1 0))]
+ ['> (lambda (x y) (if (> x y) 1 0))]
+ ['= (lambda (x y) (if (= x y) 1 0))]
+ ['<= (lambda (x y) (if (<= x y) 1 0))]
+ ['>= (lambda (x y) (if (>= x y) 1 0))]
+ ))
+
+;; zał: (expr? e) i (mem? m) jest prawdą
+;; (value? (eval e m)) jest prawdą
+(define (eval e m)
+ (match e
+ [(const v) v]
+ [(var-expr x) (mem-lookup x m)]
+ [(binop op l r)
+ (let ((vl (eval l m))
+ (vr (eval r m))
+ (p (op->proc op)))
+ (p vl vr))]
+ [(call-expr name args)
+ (match (mem-lookup name m)
+ [(clo func-args cmd)
+ (if (= (length args) (length func-args))
+ (let* ([func-mem (assign-values args func-args m)]
+ [final-mem (eval-cmd cmd func-mem)]
+ [ret (mem-lookup 'RETURN final-mem)])
+ (if ret
+ ret
+ (error "No return statement in function" name)))
+ (error "Arity mismatch, function" name "takes" (length func-args) ", got" (length args)))]
+ [else (error "Undefined function" name)])]))
+
+(define (assign-values args func-args mem)
+ (if (null? args)
+ mem
+ (assign-values (cdr args) (cdr func-args) (mem-alloc (car func-args) (eval (car args) mem) mem))))
+
+
+(struct clo (args cmd))
+
+;; zał: (cmd? c) (mem? m)
+;; (mem? (eval-cmd c m))
+(define (eval-cmd c m)
+ (if (mem-lookup 'RETURN m)
+ m
+ (match c
+ [(skip) m]
+ [(assign x e) (mem-update x (eval e m) m)]
+ [(if-cmd e ct cf) (if (= (eval e m) 0)
+ (eval-cmd cf m)
+ (eval-cmd ct m))]
+ [(while e cw) (if (= (eval e m) 0)
+ m
+ (let* ((m1 (eval-cmd cw m))
+ (m2 (eval-cmd c m1)))
+ m2))]
+ [(comp c1 c2) (let* ((m1 (eval-cmd c1 m))
+ (m2 (eval-cmd c2 m1)))
+ m2)]
+ [(var-in x e c) (let* ((v (eval e m))
+ (m1 (mem-alloc x v m))
+ (m2 (eval-cmd c m1)))
+ (mem-drop-last m2))]
+ [(function name args cmd)
+ (mem-alloc name (clo args cmd) m)]
+ [(return-expr val)
+ (mem-update 'RETURN (eval val m) m)]
+ [_ (error "Unknown command" c "— likely a syntax error")])))
+
+
+(define (eval-prog p m)
+ (let ((final-mem (eval-cmd p (mem-alloc 'RETURN #f m))))
+ (with-handlers ([exn:fail? (lambda (v) (error "Undefined reference to main"))])
+ (match (mem-lookup 'main final-mem)
+ [(clo args cmd) (mem-lookup 'RETURN (eval-cmd cmd final-mem))]))))
+
+(define WHILE_FACT
+ '({func decr (x)
+ {(x := (- x 1))
+ (return x)}}
+ {func main ()
+ {(i := 1)
+ (while (> t 0)
+ {(i := (* i t))
+ (t := (call decr (t)))})
+ (return i)}}
+ ))
+
+(define TEST
+ '({func decr (x) (return (- x 1))}
+ {func main ()
+ (var (x 1)
+ {(x := (+ x 1))
+ (return (call decr (x)))})}))
+
+(define TEST2
+ '({func decr (x) (return (- x 1))}
+ {func main () (return (call decr (3)))}))
+
+(define TEST3
+ '({func sth (x)
+ {(i := -1)
+ (return x)}}
+ {func main ()
+ {(i := 2)
+ (return (call sth (i)))}}))
+
+(define TEST4
+ '(func f ()
+ {return 1}))
+
+(define (fact n)
+ (let* ([init-env (mem-alloc 'i 1 (mem-alloc 't n empty-mem))])
+ (eval-prog (parse-cmd WHILE_FACT) init-env)))
+
diff --git a/semestr-2/racket/egzamin/zad1a.bak b/semestr-2/racket/egzamin/zad1a.bak
new file mode 100644
index 0000000..a90d2fd
--- /dev/null
+++ b/semestr-2/racket/egzamin/zad1a.bak
@@ -0,0 +1,300 @@
+#lang racket
+
+;; ZADANIE 1
+;; =========
+
+;; W tym zadaniu rozważamy język WHILE (w formie z grubsza
+;; odpowiadającej tej z wykładu), z blokami deklarującymi zmienne o
+;; lokalnym zakresie.
+
+;; Zadanie polega na dodaniu do języka procedur definiowanych na
+;; zewnątrz głównego polecenia programu (podobnie jak w C, gdzie
+;; główne polecenie odpowiadałoby procedurze main, czy Pascalu) — o
+;; dowolnym wybranym przez siebie modelu działania. W tym celu należy:
+;; · rozszerzyć składnię abstrakcyjną o składnię procedur i rozbudować odpowiednio składnię programów
+;; · rozszerzyć procedurę parsowania
+;; · rozszerzyć ewaluator
+;; · *opisać* wybrany model działania procedur, w tym jego potencjalne zalety lub ograniczenia
+;; Należy rozszerzyć poniższy szablon, a część słowną zadania umieścić
+;; w komentarzu, podobnie jak niniejsze polecenie.
+
+;; Uwaga! Zadanie jest *bardzo* szeroko sformułowane, jest wiele
+;; sensownych rozwiązań które stosowały liczne języki imperatywne w
+;; historii — nie jest treścią zadania znalezienie *najlepszego*,
+;; tylko swojego, które *rozumiecie*. Wybrany model działania procedur
+;; *może* być relatywnie ubogi, jednak jeśli tak się zrobi, warto
+;; pokazać że ma się tego świadomość w słownym opisie jego działania.
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (name) #:transparent)
+(struct call-expr (name args) #:transparent)
+(struct return-expr (val) #:transparent)
+
+(define (operator? x)
+ (member x '(+ * - / > < = >= <=)))
+
+(define (keyword? x)
+ (member x '(skip while if := func call return)))
+
+(define (expr? e)
+ (match e
+ [(const v)
+ (integer? v)]
+ [(var-expr x)
+ (and (symbol? x)
+ (not (keyword? x)))]
+ [(binop op l r)
+ (and (operator? op)
+ (expr? l)
+ (expr? r))]
+ [_ false]))
+
+(struct skip () #:transparent)
+(struct assign (id exp) #:transparent)
+(struct if-cmd (exp ct cf) #:transparent)
+(struct while (exp cmd) #:transparent)
+(struct comp (left right) #:transparent)
+(struct var-in (name expr cmd) #:transparent)
+(struct function (name args cmd) #:transparent)
+
+(define (cmd? c)
+ (match c
+ [(skip) true]
+ [(assign x e) (and (symbol? x) (expr? e))]
+ [(if-cmd e ct cf) (and (expr? e) (cmd? ct) (cmd? cf))]
+ [(while e c) (and (expr? e) (cmd? c))]
+ [(comp c1 c2) (and (cmd? c1) (cmd? c2))]
+ [(var-in x e c) (and (symbol? x) (expr? e) (cmd? c))]
+ [(function f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))]))
+
+(define (prog? p)
+ (cmd? p))
+
+(define (parse-expr p)
+ (cond
+ [(number? p) (const p)]
+ [(and (symbol? p)
+ (not (keyword? p)))
+ (var-expr p)]
+ [(and (list? p)
+ (= 3 (length p))
+ (operator? (car p)))
+ (binop (first p)
+ (parse-expr (second p))
+ (parse-expr (third p)))]
+ [(and (list? p) ; <------ wywołanie funkcji
+ (= (length p) 3)
+ (eq? (first p) 'call)
+ (symbol? (second p))
+ (list? (third p)))
+ (call-expr (second p) (map parse-expr (third p)))]
+ [else false]))
+
+(define (parse-cmd q)
+ (cond
+ [(eq? q 'skip) (skip)]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (second q) ':=))
+ (assign (first q) (parse-expr (third q)))]
+ [(and (list? q)
+ (= (length q) 4)
+ (eq? (first q) 'if))
+ (if-cmd (parse-expr (second q)) (parse-cmd (third q)) (parse-cmd (fourth q)))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'while))
+ (while (parse-expr (second q)) (parse-cmd (third q)))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'var)
+ (list? (second q))
+ (= (length (second q)) 2))
+ (var-in (first (second q))
+ (parse-expr (second (second q)))
+ (parse-cmd (third q)))]
+ [(and (list? q) ; <------ funkcje
+ (= (length q) 4)
+ (eq? (first q) 'func)
+ (symbol? (second q))
+ (list? (third q))
+ (andmap symbol? (third q)))
+ (function (second q) (third q) (parse-cmd (fourth q)))]
+ [(and (list? q)
+ (= (length q) 2)
+ (eq? (first q) 'return))
+ (return-expr (parse-expr (second q)))]
+ [(and (list? q)
+ (>= (length q) 2))
+ (desugar-comp (map parse-cmd q))]
+ [else false]))
+
+(define (desugar-comp cs)
+ (if (null? (cdr cs))
+ (car cs)
+ (comp (car cs)
+ (desugar-comp (cdr cs)))))
+
+(define (value? v)
+ (number? v))
+
+(struct mem (xs) #:transparent)
+
+(define (mem-lookup x m)
+ (define (assoc-lookup xs)
+ (cond
+ [(null? xs) (error "Undefined variable" x)]
+ [(eq? x (caar xs)) (cdar xs)]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (mem-xs m)))
+
+(define (mem-defined? x m) ; <----------- !!! Sprawdz, czy x jest w ogole zdefiniowane
+ (define (assoc-lookup xs)
+ (cond
+ [(null? xs) #f]
+ [(eq? x (caar xs) #t)]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (mem-xs m)))
+
+(define (mem-update x v m)
+ (define (assoc-update xs)
+ (cond
+ [(null? xs) (error "Undefined variable" x)]
+ [(eq? x (caar xs)) (cons (cons x v) (cdr xs))]
+ [else (cons (car xs) (assoc-update (cdr xs)))]))
+ (mem (assoc-update (mem-xs m))))
+
+(define (mem-alloc x v m)
+ (mem (cons (cons x v) (mem-xs m))))
+
+(define (mem-drop-last m)
+ (cond
+ [(null? (mem-xs m))
+ (error "Deallocating from empty memory")]
+ [else
+ (mem (cdr (mem-xs m)))]))
+
+(define empty-mem
+ (mem null))
+
+(define (op->proc op)
+ (match op
+ ['+ +]
+ ['- -]
+ ['* *]
+ ['/ /]
+ ['< (lambda (x y) (if (< x y) 1 0))]
+ ['> (lambda (x y) (if (> x y) 1 0))]
+ ['= (lambda (x y) (if (= x y) 1 0))]
+ ['<= (lambda (x y) (if (<= x y) 1 0))]
+ ['>= (lambda (x y) (if (>= x y) 1 0))]
+ ))
+
+;; zał: (expr? e) i (mem? m) jest prawdą
+;; (value? (eval e m)) jest prawdą
+(define (eval e m)
+ (match e
+ [(const v) v]
+ [(var-expr x) (mem-lookup x m)]
+ [(binop op l r)
+ (let ((vl (eval l m))
+ (vr (eval r m))
+ (p (op->proc op)))
+ (p vl vr))]
+ [(call-expr name args)
+ (match (mem-lookup name m)
+ [(clo func-args cmd)
+ (if (= (length args) (length func-args))
+ (let* ([func-mem (assign-values args func-args m)]
+ [final-mem (eval-cmd cmd func-mem)]
+ [ret (mem-lookup 'RETURN final-mem)])
+ (if ret
+ ret
+ (error "No return statement in function" name)))
+ (error "Arity mismatch, function" name "takes" (length func-args) ", got" (length args)))]
+ [else (error "Undefined function" name)])]))
+
+(define (assign-values args func-args mem)
+ (if (null? args)
+ mem
+ (assign-values (cdr args) (cdr func-args) (mem-alloc (car func-args) (eval (car args) mem) mem))))
+
+
+(struct clo (args cmd))
+
+;; zał: (cmd? c) (mem? m)
+;; (mem? (eval-cmd c m))
+(define (eval-cmd c m)
+ (if (mem-lookup 'RETURN m)
+ m
+ (match c
+ [(skip) m]
+ [(assign x e) (mem-update x (eval e m) m)]
+ [(if-cmd e ct cf) (if (= (eval e m) 0)
+ (eval-cmd cf m)
+ (eval-cmd ct m))]
+ [(while e cw) (if (= (eval e m) 0)
+ m
+ (let* ((m1 (eval-cmd cw m))
+ (m2 (eval-cmd c m1)))
+ m2))]
+ [(comp c1 c2) (let* ((m1 (eval-cmd c1 m))
+ (m2 (eval-cmd c2 m1)))
+ m2)]
+ [(var-in x e c) (let* ((v (eval e m))
+ (m1 (mem-alloc x v m))
+ (m2 (eval-cmd c m1)))
+ (mem-drop-last m2))]
+ [(function name args cmd)
+ (mem-alloc name (clo args cmd) m)]
+ [(return-expr val)
+ (mem-update 'RETURN (eval val m) m)]
+ [_ (error "Unknown command" c "— likely a syntax error")])))
+
+
+(define (eval-prog p m)
+ (let ((final-mem (eval-cmd p (mem-alloc 'RETURN #f m))))
+ (with-handlers ([exn:fail? (lambda (v) (error "Undefined reference to main"))])
+ (match (mem-lookup 'main final-mem)
+ [(clo args cmd) (mem-lookup 'RETURN (eval-cmd cmd final-mem))]))))
+
+(define WHILE_FACT
+ '({func decr (x)
+ {(x := (- x 1))
+ (return x)}}
+ {func main ()
+ {(i := 1)
+ (while (> t 0)
+ {(i := (* i t))
+ (t := (call decr (t)))})
+ (return i)}}
+ ))
+
+(define TEST
+ '({func decr (x) (return (- x 1))}
+ {func main ()
+ (var (x 1)
+ {(x := (+ x 1))
+ (return (call decr (x)))})}))
+
+(define TEST2
+ '({func decr (x) (return (- x 1))}
+ {func main () (return (call decr (3)))}))
+
+(define TEST3
+ '({func sth (x)
+ {(i := -1)
+ (return x)}}
+ {func main ()
+ {(i := 2)
+ (return (call sth (i)))}}))
+
+(define TEST4
+ '(func f ()
+ {return 1}))
+
+(define (fact n)
+ (let* ([init-env (mem-alloc 'i 1 (mem-alloc 't n empty-mem))])
+ (eval-prog (parse-cmd WHILE_FACT) init-env)))
+
diff --git a/semestr-2/racket/egzamin/zad1a.rkt b/semestr-2/racket/egzamin/zad1a.rkt
new file mode 100644
index 0000000..a587359
--- /dev/null
+++ b/semestr-2/racket/egzamin/zad1a.rkt
@@ -0,0 +1,314 @@
+#lang racket
+
+;; ZADANIE 1
+;; =========
+
+;; W tym zadaniu rozważamy język WHILE (w formie z grubsza
+;; odpowiadającej tej z wykładu), z blokami deklarującymi zmienne o
+;; lokalnym zakresie.
+
+;; Zadanie polega na dodaniu do języka procedur definiowanych na
+;; zewnątrz głównego polecenia programu (podobnie jak w C, gdzie
+;; główne polecenie odpowiadałoby procedurze main, czy Pascalu) — o
+;; dowolnym wybranym przez siebie modelu działania. W tym celu należy:
+;; · rozszerzyć składnię abstrakcyjną o składnię procedur i rozbudować odpowiednio składnię programów
+;; · rozszerzyć procedurę parsowania
+;; · rozszerzyć ewaluator
+;; · *opisać* wybrany model działania procedur, w tym jego potencjalne zalety lub ograniczenia
+;; Należy rozszerzyć poniższy szablon, a część słowną zadania umieścić
+;; w komentarzu, podobnie jak niniejsze polecenie.
+
+;; Uwaga! Zadanie jest *bardzo* szeroko sformułowane, jest wiele
+;; sensownych rozwiązań które stosowały liczne języki imperatywne w
+;; historii — nie jest treścią zadania znalezienie *najlepszego*,
+;; tylko swojego, które *rozumiecie*. Wybrany model działania procedur
+;; *może* być relatywnie ubogi, jednak jeśli tak się zrobi, warto
+;; pokazać że ma się tego świadomość w słownym opisie jego działania.
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (name) #:transparent)
+(struct call-expr (name args) #:transparent)
+(struct return-expr (val) #:transparent)
+
+(define (operator? x)
+ (member x '(+ * - / > < = >= <=)))
+
+(define (keyword? x)
+ (member x '(skip while if := func call return)))
+
+(define (expr? e)
+ (match e
+ [(const v)
+ (integer? v)]
+ [(var-expr x)
+ (and (symbol? x)
+ (not (keyword? x)))]
+ [(binop op l r)
+ (and (operator? op)
+ (expr? l)
+ (expr? r))]
+ [_ false]))
+
+(struct skip () #:transparent)
+(struct assign (id exp) #:transparent)
+(struct if-cmd (exp ct cf) #:transparent)
+(struct while (exp cmd) #:transparent)
+(struct comp (left right) #:transparent)
+(struct var-in (name expr cmd) #:transparent)
+(struct function (name args cmd) #:transparent)
+
+(define (cmd? c)
+ (match c
+ [(skip) true]
+ [(assign x e) (and (symbol? x) (expr? e))]
+ [(if-cmd e ct cf) (and (expr? e) (cmd? ct) (cmd? cf))]
+ [(while e c) (and (expr? e) (cmd? c))]
+ [(comp c1 c2) (and (cmd? c1) (cmd? c2))]
+ [(var-in x e c) (and (symbol? x) (expr? e) (cmd? c))]
+ [(function f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))]))
+
+(define (prog? p)
+ (cmd? p))
+
+(define (parse-expr p)
+ (cond
+ [(number? p) (const p)]
+ [(and (symbol? p)
+ (not (keyword? p)))
+ (var-expr p)]
+ [(and (list? p)
+ (= 3 (length p))
+ (operator? (car p)))
+ (binop (first p)
+ (parse-expr (second p))
+ (parse-expr (third p)))]
+ [(and (list? p) ; <------ wywołanie funkcji
+ (= (length p) 3)
+ (eq? (first p) 'call)
+ (symbol? (second p))
+ (list? (third p)))
+ (call-expr (second p) (map parse-expr (third p)))]
+ [else false]))
+
+(define (parse-cmd q)
+ (cond
+ [(eq? q 'skip) (skip)]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (second q) ':=))
+ (assign (first q) (parse-expr (third q)))]
+ [(and (list? q)
+ (= (length q) 4)
+ (eq? (first q) 'if))
+ (if-cmd (parse-expr (second q)) (parse-cmd (third q)) (parse-cmd (fourth q)))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'while))
+ (while (parse-expr (second q)) (parse-cmd (third q)))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'var)
+ (list? (second q))
+ (= (length (second q)) 2))
+ (var-in (first (second q))
+ (parse-expr (second (second q)))
+ (parse-cmd (third q)))]
+ [(and (list? q) ; <------ funkcje
+ (= (length q) 4)
+ (eq? (first q) 'func)
+ (symbol? (second q))
+ (list? (third q))
+ (andmap symbol? (third q)))
+ (function (second q) (third q) (parse-cmd (fourth q)))]
+ [(and (list? q)
+ (= (length q) 2)
+ (eq? (first q) 'return))
+ (return-expr (parse-expr (second q)))]
+ [(and (list? q)
+ (>= (length q) 2))
+ (desugar-comp (map parse-cmd q))]
+ [else false]))
+
+(define (desugar-comp cs)
+ (if (null? (cdr cs))
+ (car cs)
+ (comp (car cs)
+ (desugar-comp (cdr cs)))))
+
+(define (value? v)
+ (number? v))
+
+(struct mem (xs) #:transparent)
+
+(define (mem-lookup x m)
+ (define (assoc-lookup xs)
+ (cond
+ [(null? xs) (error "Undefined variable" x)]
+ [(eq? x (caar xs)) (cdar xs)]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (mem-xs m)))
+
+(define (mem-defined? x m) ; <----------- !!! Sprawdz, czy x jest w ogole zdefiniowane
+ (define (assoc-lookup xs)
+ (cond
+ [(null? xs) #f]
+ [(eq? x (caar xs) #t)]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (mem-xs m)))
+
+(define (mem-update x v m)
+ (define (assoc-update xs)
+ (cond
+ [(null? xs) (error "Undefined variable" x)]
+ [(eq? x (caar xs)) (cons (cons x v) (cdr xs))]
+ [else (cons (car xs) (assoc-update (cdr xs)))]))
+ (mem (assoc-update (mem-xs m))))
+
+(define (mem-alloc x v m)
+ (mem (cons (cons x v) (mem-xs m))))
+
+(define (mem-drop-last m)
+ (cond
+ [(null? (mem-xs m))
+ (error "Deallocating from empty memory")]
+ [else
+ (mem (cdr (mem-xs m)))]))
+
+(define empty-mem
+ (mem null))
+
+(define (op->proc op)
+ (match op
+ ['+ +]
+ ['- -]
+ ['* *]
+ ['/ /]
+ ['< (lambda (x y) (if (< x y) 1 0))]
+ ['> (lambda (x y) (if (> x y) 1 0))]
+ ['= (lambda (x y) (if (= x y) 1 0))]
+ ['<= (lambda (x y) (if (<= x y) 1 0))]
+ ['>= (lambda (x y) (if (>= x y) 1 0))]
+ ))
+
+;; zał: (expr? e) i (mem? m) jest prawdą
+;; (value? (eval e m)) jest prawdą
+(define (eval e m)
+ (match e
+ [(const v) v]
+ [(var-expr x) (mem-lookup x m)]
+ [(binop op l r)
+ (let ((vl (eval l m))
+ (vr (eval r m))
+ (p (op->proc op)))
+ (p vl vr))]
+ [(call-expr name args)
+ (match (mem-lookup name m)
+ [(clo func-args cmd)
+ (if (= (length args) (length func-args))
+ (let* ([func-mem (assign-values args func-args m)]
+ [final-mem (eval-cmd cmd func-mem)]
+ [ret (mem-lookup 'RETURN final-mem)])
+ (if ret
+ ret
+ (error "No return statement in function" name)))
+ (error "Arity mismatch, function" name "takes" (length func-args) ", got" (length args)))]
+ [else (error "Undefined function" name)])]))
+
+(define (assign-values args func-args mem)
+ (define (iter args func-args new-mem)
+ (if (null? args)
+ new-mem
+ (iter (cdr args) (cdr func-args) (mem-alloc (car func-args) (eval (car args) mem) new-mem))))
+ (iter args func-args mem))
+
+
+(struct clo (args cmd))
+
+;; zał: (cmd? c) (mem? m)
+;; (mem? (eval-cmd c m))
+(define (eval-cmd c m)
+ (if (mem-lookup 'RETURN m)
+ m
+ (match c
+ [(skip) m]
+ [(assign x e) (mem-update x (eval e m) m)]
+ [(if-cmd e ct cf) (if (= (eval e m) 0)
+ (eval-cmd cf m)
+ (eval-cmd ct m))]
+ [(while e cw) (if (= (eval e m) 0)
+ m
+ (let* ((m1 (eval-cmd cw m))
+ (m2 (eval-cmd c m1)))
+ m2))]
+ [(comp c1 c2) (let* ((m1 (eval-cmd c1 m))
+ (m2 (eval-cmd c2 m1)))
+ m2)]
+ [(var-in x e c) (let* ((v (eval e m))
+ (m1 (mem-alloc x v m))
+ (m2 (eval-cmd c m1)))
+ (mem-drop-last m2))]
+ [(function name args cmd)
+ (mem-alloc name (clo args cmd) m)]
+ [(return-expr val)
+ (mem-update 'RETURN (eval val m) m)]
+ [_ (error "Unknown command" c "— likely a syntax error")])))
+
+
+(define (eval-prog p m)
+ (let ((final-mem (eval-cmd p (mem-alloc 'RETURN #f m))))
+ (with-handlers ([exn:fail? (lambda (v) (error "Undefined reference to main"))])
+ (match (mem-lookup 'main final-mem)
+ [(clo args cmd) (mem-lookup 'RETURN (eval-cmd cmd final-mem))]))))
+
+(define WHILE_FACT
+ '({func decr (x)
+ {(x := (- x 1))
+ (return x)}}
+ {func main ()
+ {(i := 1)
+ (while (> t 0)
+ {(i := (* i t))
+ (t := (call decr (t)))})
+ (return i)}}
+ ))
+
+(define (fact n)
+ (let* ([init-env (mem-alloc 'i 1 (mem-alloc 't n empty-mem))])
+ (eval-prog (parse-cmd WHILE_FACT) init-env)))
+
+(define TEST
+ '({func decr (x) (return (- x 1))}
+ {func main ()
+ (var (x 1)
+ {(x := (+ x 1))
+ (return (call decr (x)))})}))
+
+(define TEST2
+ '({func decr (x) (return (- x 1))}
+ {func main () (return (call decr (3)))}))
+
+(define TEST3
+ '({func sth (x)
+ {(i := -1)
+ (return x)}}
+ {func main ()
+ {(i := 2)
+ (return (call sth (i)))}}))
+
+(define TEST4
+ '(func f ()
+ {return 1}))
+
+(define TEST5
+ '({func f1 (x y z)
+ (return y)}
+ {func f2 (x y z)
+ (return (+ (+ x y) z))}
+ {func main ()
+ {(if (> 4 3)
+ (var (x 2)
+ (return (call f1 (1 x 3))))
+ (x := 5))
+ (return (call f2 (x 3 4)))}}))
+ \ No newline at end of file
diff --git a/semestr-2/racket/egzamin/zad1b.bak b/semestr-2/racket/egzamin/zad1b.bak
new file mode 100644
index 0000000..a587359
--- /dev/null
+++ b/semestr-2/racket/egzamin/zad1b.bak
@@ -0,0 +1,314 @@
+#lang racket
+
+;; ZADANIE 1
+;; =========
+
+;; W tym zadaniu rozważamy język WHILE (w formie z grubsza
+;; odpowiadającej tej z wykładu), z blokami deklarującymi zmienne o
+;; lokalnym zakresie.
+
+;; Zadanie polega na dodaniu do języka procedur definiowanych na
+;; zewnątrz głównego polecenia programu (podobnie jak w C, gdzie
+;; główne polecenie odpowiadałoby procedurze main, czy Pascalu) — o
+;; dowolnym wybranym przez siebie modelu działania. W tym celu należy:
+;; · rozszerzyć składnię abstrakcyjną o składnię procedur i rozbudować odpowiednio składnię programów
+;; · rozszerzyć procedurę parsowania
+;; · rozszerzyć ewaluator
+;; · *opisać* wybrany model działania procedur, w tym jego potencjalne zalety lub ograniczenia
+;; Należy rozszerzyć poniższy szablon, a część słowną zadania umieścić
+;; w komentarzu, podobnie jak niniejsze polecenie.
+
+;; Uwaga! Zadanie jest *bardzo* szeroko sformułowane, jest wiele
+;; sensownych rozwiązań które stosowały liczne języki imperatywne w
+;; historii — nie jest treścią zadania znalezienie *najlepszego*,
+;; tylko swojego, które *rozumiecie*. Wybrany model działania procedur
+;; *może* być relatywnie ubogi, jednak jeśli tak się zrobi, warto
+;; pokazać że ma się tego świadomość w słownym opisie jego działania.
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (name) #:transparent)
+(struct call-expr (name args) #:transparent)
+(struct return-expr (val) #:transparent)
+
+(define (operator? x)
+ (member x '(+ * - / > < = >= <=)))
+
+(define (keyword? x)
+ (member x '(skip while if := func call return)))
+
+(define (expr? e)
+ (match e
+ [(const v)
+ (integer? v)]
+ [(var-expr x)
+ (and (symbol? x)
+ (not (keyword? x)))]
+ [(binop op l r)
+ (and (operator? op)
+ (expr? l)
+ (expr? r))]
+ [_ false]))
+
+(struct skip () #:transparent)
+(struct assign (id exp) #:transparent)
+(struct if-cmd (exp ct cf) #:transparent)
+(struct while (exp cmd) #:transparent)
+(struct comp (left right) #:transparent)
+(struct var-in (name expr cmd) #:transparent)
+(struct function (name args cmd) #:transparent)
+
+(define (cmd? c)
+ (match c
+ [(skip) true]
+ [(assign x e) (and (symbol? x) (expr? e))]
+ [(if-cmd e ct cf) (and (expr? e) (cmd? ct) (cmd? cf))]
+ [(while e c) (and (expr? e) (cmd? c))]
+ [(comp c1 c2) (and (cmd? c1) (cmd? c2))]
+ [(var-in x e c) (and (symbol? x) (expr? e) (cmd? c))]
+ [(function f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))]))
+
+(define (prog? p)
+ (cmd? p))
+
+(define (parse-expr p)
+ (cond
+ [(number? p) (const p)]
+ [(and (symbol? p)
+ (not (keyword? p)))
+ (var-expr p)]
+ [(and (list? p)
+ (= 3 (length p))
+ (operator? (car p)))
+ (binop (first p)
+ (parse-expr (second p))
+ (parse-expr (third p)))]
+ [(and (list? p) ; <------ wywołanie funkcji
+ (= (length p) 3)
+ (eq? (first p) 'call)
+ (symbol? (second p))
+ (list? (third p)))
+ (call-expr (second p) (map parse-expr (third p)))]
+ [else false]))
+
+(define (parse-cmd q)
+ (cond
+ [(eq? q 'skip) (skip)]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (second q) ':=))
+ (assign (first q) (parse-expr (third q)))]
+ [(and (list? q)
+ (= (length q) 4)
+ (eq? (first q) 'if))
+ (if-cmd (parse-expr (second q)) (parse-cmd (third q)) (parse-cmd (fourth q)))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'while))
+ (while (parse-expr (second q)) (parse-cmd (third q)))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'var)
+ (list? (second q))
+ (= (length (second q)) 2))
+ (var-in (first (second q))
+ (parse-expr (second (second q)))
+ (parse-cmd (third q)))]
+ [(and (list? q) ; <------ funkcje
+ (= (length q) 4)
+ (eq? (first q) 'func)
+ (symbol? (second q))
+ (list? (third q))
+ (andmap symbol? (third q)))
+ (function (second q) (third q) (parse-cmd (fourth q)))]
+ [(and (list? q)
+ (= (length q) 2)
+ (eq? (first q) 'return))
+ (return-expr (parse-expr (second q)))]
+ [(and (list? q)
+ (>= (length q) 2))
+ (desugar-comp (map parse-cmd q))]
+ [else false]))
+
+(define (desugar-comp cs)
+ (if (null? (cdr cs))
+ (car cs)
+ (comp (car cs)
+ (desugar-comp (cdr cs)))))
+
+(define (value? v)
+ (number? v))
+
+(struct mem (xs) #:transparent)
+
+(define (mem-lookup x m)
+ (define (assoc-lookup xs)
+ (cond
+ [(null? xs) (error "Undefined variable" x)]
+ [(eq? x (caar xs)) (cdar xs)]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (mem-xs m)))
+
+(define (mem-defined? x m) ; <----------- !!! Sprawdz, czy x jest w ogole zdefiniowane
+ (define (assoc-lookup xs)
+ (cond
+ [(null? xs) #f]
+ [(eq? x (caar xs) #t)]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (mem-xs m)))
+
+(define (mem-update x v m)
+ (define (assoc-update xs)
+ (cond
+ [(null? xs) (error "Undefined variable" x)]
+ [(eq? x (caar xs)) (cons (cons x v) (cdr xs))]
+ [else (cons (car xs) (assoc-update (cdr xs)))]))
+ (mem (assoc-update (mem-xs m))))
+
+(define (mem-alloc x v m)
+ (mem (cons (cons x v) (mem-xs m))))
+
+(define (mem-drop-last m)
+ (cond
+ [(null? (mem-xs m))
+ (error "Deallocating from empty memory")]
+ [else
+ (mem (cdr (mem-xs m)))]))
+
+(define empty-mem
+ (mem null))
+
+(define (op->proc op)
+ (match op
+ ['+ +]
+ ['- -]
+ ['* *]
+ ['/ /]
+ ['< (lambda (x y) (if (< x y) 1 0))]
+ ['> (lambda (x y) (if (> x y) 1 0))]
+ ['= (lambda (x y) (if (= x y) 1 0))]
+ ['<= (lambda (x y) (if (<= x y) 1 0))]
+ ['>= (lambda (x y) (if (>= x y) 1 0))]
+ ))
+
+;; zał: (expr? e) i (mem? m) jest prawdą
+;; (value? (eval e m)) jest prawdą
+(define (eval e m)
+ (match e
+ [(const v) v]
+ [(var-expr x) (mem-lookup x m)]
+ [(binop op l r)
+ (let ((vl (eval l m))
+ (vr (eval r m))
+ (p (op->proc op)))
+ (p vl vr))]
+ [(call-expr name args)
+ (match (mem-lookup name m)
+ [(clo func-args cmd)
+ (if (= (length args) (length func-args))
+ (let* ([func-mem (assign-values args func-args m)]
+ [final-mem (eval-cmd cmd func-mem)]
+ [ret (mem-lookup 'RETURN final-mem)])
+ (if ret
+ ret
+ (error "No return statement in function" name)))
+ (error "Arity mismatch, function" name "takes" (length func-args) ", got" (length args)))]
+ [else (error "Undefined function" name)])]))
+
+(define (assign-values args func-args mem)
+ (define (iter args func-args new-mem)
+ (if (null? args)
+ new-mem
+ (iter (cdr args) (cdr func-args) (mem-alloc (car func-args) (eval (car args) mem) new-mem))))
+ (iter args func-args mem))
+
+
+(struct clo (args cmd))
+
+;; zał: (cmd? c) (mem? m)
+;; (mem? (eval-cmd c m))
+(define (eval-cmd c m)
+ (if (mem-lookup 'RETURN m)
+ m
+ (match c
+ [(skip) m]
+ [(assign x e) (mem-update x (eval e m) m)]
+ [(if-cmd e ct cf) (if (= (eval e m) 0)
+ (eval-cmd cf m)
+ (eval-cmd ct m))]
+ [(while e cw) (if (= (eval e m) 0)
+ m
+ (let* ((m1 (eval-cmd cw m))
+ (m2 (eval-cmd c m1)))
+ m2))]
+ [(comp c1 c2) (let* ((m1 (eval-cmd c1 m))
+ (m2 (eval-cmd c2 m1)))
+ m2)]
+ [(var-in x e c) (let* ((v (eval e m))
+ (m1 (mem-alloc x v m))
+ (m2 (eval-cmd c m1)))
+ (mem-drop-last m2))]
+ [(function name args cmd)
+ (mem-alloc name (clo args cmd) m)]
+ [(return-expr val)
+ (mem-update 'RETURN (eval val m) m)]
+ [_ (error "Unknown command" c "— likely a syntax error")])))
+
+
+(define (eval-prog p m)
+ (let ((final-mem (eval-cmd p (mem-alloc 'RETURN #f m))))
+ (with-handlers ([exn:fail? (lambda (v) (error "Undefined reference to main"))])
+ (match (mem-lookup 'main final-mem)
+ [(clo args cmd) (mem-lookup 'RETURN (eval-cmd cmd final-mem))]))))
+
+(define WHILE_FACT
+ '({func decr (x)
+ {(x := (- x 1))
+ (return x)}}
+ {func main ()
+ {(i := 1)
+ (while (> t 0)
+ {(i := (* i t))
+ (t := (call decr (t)))})
+ (return i)}}
+ ))
+
+(define (fact n)
+ (let* ([init-env (mem-alloc 'i 1 (mem-alloc 't n empty-mem))])
+ (eval-prog (parse-cmd WHILE_FACT) init-env)))
+
+(define TEST
+ '({func decr (x) (return (- x 1))}
+ {func main ()
+ (var (x 1)
+ {(x := (+ x 1))
+ (return (call decr (x)))})}))
+
+(define TEST2
+ '({func decr (x) (return (- x 1))}
+ {func main () (return (call decr (3)))}))
+
+(define TEST3
+ '({func sth (x)
+ {(i := -1)
+ (return x)}}
+ {func main ()
+ {(i := 2)
+ (return (call sth (i)))}}))
+
+(define TEST4
+ '(func f ()
+ {return 1}))
+
+(define TEST5
+ '({func f1 (x y z)
+ (return y)}
+ {func f2 (x y z)
+ (return (+ (+ x y) z))}
+ {func main ()
+ {(if (> 4 3)
+ (var (x 2)
+ (return (call f1 (1 x 3))))
+ (x := 5))
+ (return (call f2 (x 3 4)))}}))
+ \ No newline at end of file
diff --git a/semestr-2/racket/egzamin/zad1b.rkt b/semestr-2/racket/egzamin/zad1b.rkt
new file mode 100644
index 0000000..628619f
--- /dev/null
+++ b/semestr-2/racket/egzamin/zad1b.rkt
@@ -0,0 +1,482 @@
+#lang racket
+
+
+
+;; Oświadczam, że rozwiązanie zadania egzaminacyjnego przygotowałem
+;; w pełni samodzielnie, korzystając wyłącznie z materiałów do wykładu,
+;; notatek, podręcznika, oraz materiałów zacytowanych w treści rozwiązania.
+;; Oświadczam że nie korzystałem w żadnej formie z pomocy osób trzecich
+;; w przygotowaniu rozwiązania ani też takiej pomocy nie udzielałem
+;; i nie udostępniałem nikomu swojego rozwiązania.
+
+;; ZADANIE 1
+;; =========
+
+;; W tym zadaniu rozważamy język WHILE (w formie z grubsza
+;; odpowiadającej tej z wykładu), z blokami deklarującymi zmienne o
+;; lokalnym zakresie.
+
+;; Zadanie polega na dodaniu do języka procedur definiowanych na
+;; zewnątrz głównego polecenia programu (podobnie jak w C, gdzie
+;; główne polecenie odpowiadałoby procedurze main, czy Pascalu) — o
+;; dowolnym wybranym przez siebie modelu działania. W tym celu należy:
+;; · rozszerzyć składnię abstrakcyjną o składnię procedur i rozbudować odpowiednio składnię programów
+;; · rozszerzyć procedurę parsowania
+;; · rozszerzyć ewaluator
+;; · *opisać* wybrany model działania procedur, w tym jego potencjalne zalety lub ograniczenia
+;; Należy rozszerzyć poniższy szablon, a część słowną zadania umieścić
+;; w komentarzu, podobnie jak niniejsze polecenie.
+
+;; Uwaga! Zadanie jest *bardzo* szeroko sformułowane, jest wiele
+;; sensownych rozwiązań które stosowały liczne języki imperatywne w
+;; historii — nie jest treścią zadania znalezienie *najlepszego*,
+;; tylko swojego, które *rozumiecie*. Wybrany model działania procedur
+;; *może* być relatywnie ubogi, jednak jeśli tak się zrobi, warto
+;; pokazać że ma się tego świadomość w słownym opisie jego działania.
+
+
+
+
+
+
+
+;; Postanowiłem, że struktura programów w moim języku będzie miała trochę z pythona i trochę z C.
+;; Istotną decyzją którą podjąłem jest to, że wszystkie funkcje w naszym języku muszą zwracać
+;; jakąś wartość (zawsze zwracają inta), łącznie z funkcją main, przy pomocy dyrektywy "return".
+;; To, co zwraca main, jest tym co zwraca
+;; cały program (z małym wyjątkiem, ale o tym później). Okazało się, że takie podejście
+;; do sprawy jest bardzo wygodne -- nie musiałem się dzięki temu nawet przejmować
+;; osobnym implementowaniem funkcji rekurencyjnych, wzajemnie rekurencyjnych
+;; czy nawet zagnieżdżonych, a do tego można definiować funkcje w dowolnej kolejności!
+;; Co więcej, funkcje przyjmują dowolnie wiele argumentów, również 0.
+;; On top of that, do funkcji można przekazywać cokolwiek co ewaluuje się do wartości
+;; Czyli mozna przekazywać wartości zmiennych, jak i dowolne wyrażenia!
+
+;; Oto przykładowy kod, po którym raczej jasno widać w jak wygląda nowa składnia:
+(define BINOM '({func main ()
+ (return (call binom (N K)))}
+ {func fact (t)
+ (if (= t 0)
+ (return 1)
+ ({func decr (x) (return (- x 1))}
+ (return (* t (call fact ((call decr (t))))))))}
+ {func binom (n k)
+ (if (= k 0)
+ (return 1)
+ (var (num (call fact (n)))
+ (var (den (* (call fact (k)) (call fact ((- n k)))))
+ (return (/ num den)))))}
+ ))
+(define (bin n k)
+ (eval-prog (parse-cmd BINOM) (mem-alloc 'i 1 (mem-alloc 'N n (mem-alloc 'K k empty-mem)))))
+;; Specjalnie trochę pokomplikowałem, ale widać featury naszego języka.
+
+;; Jak to w ogóle działa?
+
+;; Za każdym razem, kiedy definiuję funkcję, to do środowiska dodaję parę (nazwa funkcji . clo),
+;; gdzie clo jest takim quasi-domknięciem, jest to po prostu struktura trzymająca nazwy
+;; argumentów funkcji oraz jej ciało. Właśnie takie podejście bardzo dobrze
+;; załatwiło łatwość w definiowaniu funkcji rekurencyjnych oraz wzajemnie rekurencyjnych i
+;; zagnieżdżonych -- żadna funkcja nie zostanie wywołana, dopóki nie wywołam maina,
+;; a tego wywołam dopiero po zewaluowaniu wszystkich definicji (tym samym dodaniu ich do środowiska).
+
+;; Takie podejście ma trochę problemów, chyba największym z nich jest to, że nie ma możliwości
+;; zmiany wartości globalnych wewnątrz funkcji. Tj. możemy je zmieniać, ale zmiany będą
+;; widoczne jedynie w jej lokalnym zakresie.
+;; W zasadzie nie jest to aż tak bolesne -- globalne zmienne możemy traktować po prostu
+;; jak argumenty wywołania funkcji main.
+
+;; Wywoływać funkcję mogę tylko za pomocą specjalnego wyrażenia call,
+;; które jako pierwszy argument
+;; przyjmuje nazwę funkcji, a jako drugi przyjmuje listę argumentów.
+;; Żeby wiedzieć jak działa call, spójrzmy najpierw jak działa return.
+
+;; return napisane jest tak, że jeśli w jakimkolwiek miejscu funkcji
+;; się na niego trafi, to reszta funkcji nie jest już wywoływana
+;; (czyli tak jakbyśmy sie spodziewali). Jak on w sumie działa?
+;; Na samym początku eval-prog, zanim zacznę w ogóle ewaluować definicje funkcji,
+;; dodaje do środowiska specjalną zmienną o nazwie RETURN o wartości #f.
+;; Jeśli w funkcji gdziekolwiek wywołam returna, to
+;; zmieniam wartość RETURN w środowisku na to, co chcę zwrócić.
+;; W eval-cmd za każdym razem sprawdzam jaka jest wartość RETURN.
+;; Jeśli jest to #f, to pracuje jakby nigdy nic, a jeśli jest to coś innego,
+;; to po prostu zwracam aktualne środowisko.
+;; Zatem funkcja zwraca środowisko, w którym zmienna RETURN
+;; ustawiona jest na wynik jej obliczenia.
+
+;; Teraz już prosto widać, że jedyne co robi call, to szuka ciała funkcji
+;; w środowisku i wywołuje ją dla podanych argumentów, dostaje od tej
+;; funkcji środowisko, a następnie odzyskuje wartość RETURN w zwróconym
+;; przez nią środowisku. Dzięki temu po wywołaniu funkcji
+;; wewnątrz innej funkcji nie zmienią się wartości żadnych zmiennych (w tym globalnych).
+;; Jest to dosyć podobne do pythona -- tam inty są immutable i nie można ich wysłać przez
+;; referencję. Ale możemy to robić jeśli się uprzemy np. tak:
+;; {func decr (x)
+;; (return (- x 1))}
+;; {func main ()
+;; {(i := (call decr (i)))
+;; (return i)}
+;; Uruchomienie takiego programu ze zmienną globalną i zwróci oczywiście i-1.
+
+;; Mały problem którego za bardzo nie umiem rozwiązać jest taki, że jeśli gdzieś poza
+;; jakąkolwiek funkcją wywołam return, to wartość którą tam zwrócę będzie
+;; wartością dla całego programu, bo zmienna RETURN w środowisku zmieni swoją wartość
+;; na coś innego od #f i niestety main nawet się nie wykona (na samym wstępie stwierdzi,
+;; że coś zostało już zwrócone). Widać to w TEST10. Generalnie co za tym idzie,
+;; między definicjami funkcji mogą być jakieś instrukcje, które zostaną
+;; wywołane razem z ewaluacją programu, zanim zostanie wywołany main.
+
+;; Dodatkowe informacje umieściłem w komentarzach w odpowiednich miejscach pliku.
+;; Na dole umieściłem kilka testów które pokazują co jak działa.
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (name) #:transparent)
+(struct call-expr (name args) #:transparent) ;; wywołanie funkcji
+
+(define (operator? x)
+ (member x '(+ * - / > < = >= <=)))
+
+(define (keyword? x)
+ (member x '(skip while if := func func-rec call return))) ;; kilka nowych słów kluczowych
+
+(define (expr? e)
+ (match e
+ [(const v)
+ (integer? v)]
+ [(var-expr x)
+ (and (symbol? x)
+ (not (keyword? x)))]
+ [(binop op l r)
+ (and (operator? op)
+ (expr? l)
+ (expr? r))]
+ [(call-expr n a)
+ (and (symbol? n)
+ (list? a)
+ (andmap expr? a))]
+ [_ false]))
+
+(struct skip () #:transparent)
+(struct assign (id exp) #:transparent)
+(struct if-cmd (exp ct cf) #:transparent)
+(struct while (exp cmd) #:transparent)
+(struct comp (left right) #:transparent)
+(struct var-in (name expr cmd) #:transparent)
+(struct function (name args cmd) #:transparent) ;; dodane funkcje, funkcje rekurencyjne oraz return
+(struct funcrec (name args cmd) #:transparent)
+(struct return-stat (exp) #:transparent)
+
+(define (cmd? c)
+ (match c
+ [(skip) true]
+ [(assign x e) (and (symbol? x) (expr? e))]
+ [(if-cmd e ct cf) (and (expr? e) (cmd? ct) (cmd? cf))]
+ [(while e c) (and (expr? e) (cmd? c))]
+ [(comp c1 c2) (and (cmd? c1) (cmd? c2))]
+ [(var-in x e c) (and (symbol? x) (expr? e) (cmd? c))]
+ [(function f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))]
+ [(funcrec f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))]
+ [(return-stat exp) (expr? exp)]))
+
+(define (prog? p)
+ (cmd? p))
+
+(define (parse-expr p)
+ (cond
+ [(number? p) (const p)]
+ [(and (symbol? p)
+ (not (keyword? p)))
+ (var-expr p)]
+ [(and (list? p)
+ (= 3 (length p))
+ (operator? (car p)))
+ (binop (first p)
+ (parse-expr (second p))
+ (parse-expr (third p)))]
+ [(and (list? p) ; <------ wywołanie funkcji
+ (= (length p) 3)
+ (eq? (first p) 'call)
+ (symbol? (second p))
+ (list? (third p)))
+ (call-expr (second p) (map parse-expr (third p)))]
+ [else false]))
+
+(define (parse-cmd q)
+ (cond
+ [(eq? q 'skip) (skip)]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (second q) ':=))
+ (assign (first q) (parse-expr (third q)))]
+ [(and (list? q)
+ (= (length q) 4)
+ (eq? (first q) 'if))
+ (if-cmd (parse-expr (second q)) (parse-cmd (third q)) (parse-cmd (fourth q)))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'while))
+ (while (parse-expr (second q)) (parse-cmd (third q)))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'var)
+ (list? (second q))
+ (= (length (second q)) 2))
+ (var-in (first (second q))
+ (parse-expr (second (second q)))
+ (parse-cmd (third q)))]
+ [(and (list? q) ; <------ funkcje
+ (= (length q) 4)
+ (eq? (first q) 'func)
+ (symbol? (second q))
+ (list? (third q))
+ (andmap symbol? (third q)))
+ (function (second q) (third q) (parse-cmd (fourth q)))]
+ [(and (list? q) ; <------ return
+ (= (length q) 2)
+ (eq? (first q) 'return))
+ (return-stat (parse-expr (second q)))]
+ [(and (list? q)
+ (>= (length q) 2))
+ (desugar-comp (map parse-cmd q))]
+ [else false]))
+
+(define (desugar-comp cs)
+ (if (null? (cdr cs))
+ (car cs)
+ (comp (car cs)
+ (desugar-comp (cdr cs)))))
+
+(define (value? v)
+ (number? v))
+
+(struct mem (xs) #:transparent)
+
+(define (mem-lookup x m)
+ (define (assoc-lookup xs)
+ (cond
+ [(null? xs) (error "Undefined variable" x)]
+ [(eq? x (caar xs)) (cdar xs)]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (mem-xs m)))
+
+(define (mem-update x v m)
+ (define (assoc-update xs)
+ (cond
+ [(null? xs) (error "Undefined variable" x)]
+ [(eq? x (caar xs)) (cons (cons x v) (cdr xs))]
+ [else (cons (car xs) (assoc-update (cdr xs)))]))
+ (mem (assoc-update (mem-xs m))))
+
+(define (mem-alloc x v m)
+ (mem (cons (cons x v) (mem-xs m))))
+
+(define (mem-drop-last m)
+ (cond
+ [(null? (mem-xs m))
+ (error "Deallocating from empty memory")]
+ [else
+ (mem (cdr (mem-xs m)))]))
+
+(define empty-mem
+ (mem null))
+
+(define (op->proc op)
+ (match op
+ ['+ +]
+ ['- -]
+ ['* *]
+ ['/ /]
+ ['< (lambda (x y) (if (< x y) 1 0))]
+ ['> (lambda (x y) (if (> x y) 1 0))]
+ ['= (lambda (x y) (if (= x y) 1 0))]
+ ['<= (lambda (x y) (if (<= x y) 1 0))]
+ ['>= (lambda (x y) (if (>= x y) 1 0))]
+ ))
+
+;; zał: (expr? e) i (mem? m) jest prawdą
+;; (value? (eval e m)) jest prawdą
+(define (eval e m)
+ (match e
+ [(const v) v]
+ [(var-expr x) (mem-lookup x m)]
+ [(binop op l r)
+ (let ((vl (eval l m))
+ (vr (eval r m))
+ (p (op->proc op)))
+ (p vl vr))]
+ [(call-expr name args) ;; <------ ewaluacja wywołania funkcji
+ (match (mem-lookup name m)
+ [(clo func-args cmd)
+ (if (= (length args) (length func-args)) ;; <------ sprawdzanie arnosci
+ (let* ([func-mem (assign-values args func-args m)]
+ [final-mem (eval-cmd cmd func-mem)]
+ [ret (mem-lookup 'RETURN final-mem)])
+ (if ret
+ ret
+ (error "No return statement in function" name)))
+ (error "Arity mismatch, function" name "takes" (length func-args) "arguments, got" (length args)))]
+ [else (error "Undefined function" name)])]))
+
+(define (assign-values args func-args mem) ;; <------ przypisanie wartosci do argumentow funkcji
+ (define (iter args func-args new-mem)
+ (if (null? args)
+ new-mem
+ (iter (cdr args) (cdr func-args) (mem-alloc (car func-args) (eval (car args) mem) new-mem))))
+ (iter args func-args mem))
+
+
+(struct clo (args cmd)) ; <----- tak trzymana jest funkcja w środowisku, tj. jako lista nazw argumentow i cialo funkcji
+
+;; zał: (cmd? c) (mem? m)
+;; (mem? (eval-cmd c m))
+(define (eval-cmd c m)
+ (if (mem-lookup 'RETURN m) ; <----- jeśli RETURN jest na coś ustawione, to chcemy zrwócic pamięc
+ m
+ (match c
+ [(skip) m]
+ [(assign x e) (mem-update x (eval e m) m)]
+ [(if-cmd e ct cf) (if (= (eval e m) 0)
+ (eval-cmd cf m)
+ (eval-cmd ct m))]
+ [(while e cw) (if (= (eval e m) 0)
+ m
+ (let* ((m1 (eval-cmd cw m))
+ (m2 (eval-cmd c m1)))
+ m2))]
+ [(comp c1 c2) (let* ((m1 (eval-cmd c1 m))
+ (m2 (eval-cmd c2 m1)))
+ m2)]
+ [(var-in x e c) (let* ((v (eval e m))
+ (m1 (mem-alloc x v m))
+ (m2 (eval-cmd c m1)))
+ (mem-drop-last m2))]
+ [(function name args cmd) ; <------ dodanie ciała funkcji do środowiska
+ (mem-alloc name (clo args cmd) m)]
+ [(return-stat val) ; <------ zmiana wartości zmiennej RETURN
+ (mem-update 'RETURN (eval val m) m)]
+ [_ (error "Unknown command" c "— likely a syntax error")])))
+
+
+;; program ewaluowany jest tak
+;; ewaluowane są wszystkie definicje funkcji, wtedy
+;; ręcznie szukam definicji main i ewaluuje jej ciało i zwracam to co zwróci main.
+;; zakładam, że main nie przyjmuje żadnych argumentów.
+(define (eval-prog p m)
+ (let ((final-mem (eval-cmd p (mem-alloc 'RETURN #f m))))
+ (match (mem-lookup 'main final-mem)
+ [(clo args cmd)
+ (let ((res (mem-lookup 'RETURN (eval-cmd cmd final-mem))))
+ (if res res (error "No return statement in main")))])))
+
+(define WHILE_FACT
+ '({func decr (x)
+ {(x := (- x 1))
+ (return x)}}
+ {func main ()
+ {(i := 1)
+ (while (> t 0)
+ {(i := (* i t))
+ (t := (call decr (t)))})
+ (return i)}}
+ ))
+
+(define (fact n)
+ (let* ([init-env (mem-alloc 'i 1 (mem-alloc 't n empty-mem))])
+ (eval-prog (parse-cmd WHILE_FACT) init-env)))
+
+(define TEST
+ '({func decr (x) (return (- x 1))}
+ {func main ()
+ (var (x 1)
+ {(x := (+ x 2))
+ (return (call decr (x)))})}))
+(define (test) (eval-prog (parse-cmd TEST) empty-mem))
+
+(define TEST2
+ '({func decr (x) (return (- x 1))}
+ {func main () (return (call decr (3)))}))
+(define (test2) (eval-prog (parse-cmd TEST2) empty-mem))
+
+; nie da się zmienić wartości zmiennej globalnej, zmienne są wysyłane przez kopie
+(define TEST3
+ '({func sth (x)
+ {(i := -1)
+ (return x)}}
+ {func main ()
+ {(i := 2)
+ (return (call sth (i)))}}))
+(define (test3) (eval-prog (parse-cmd TEST3) (mem-alloc 'i 3 empty-mem)))
+
+; nie ma maina, wywala błąd
+(define TEST4
+ '(func f ()
+ {return 1}))
+(define (test4) (eval-prog (parse-cmd TEST4) empty-mem))
+
+; funkcje wieloargumentowe
+(define TEST5
+ '({func f1 (x y z)
+ (return y)}
+ {func f2 (x y z)
+ (return (+ (+ x y) z))}
+ {func main ()
+ {(if (> X 3)
+ (var (x 2)
+ (return (call f1 (1 x 3))))
+ (x := 5))
+ (return (call f2 (x 3 4)))}}))
+(define (test5) (eval-prog (parse-cmd TEST5) (mem-alloc 'x -1 (mem-alloc 'X 4 empty-mem))))
+
+; Działa rekurencja!!
+(define TEST6
+ '({func f (x)
+ (if (= x 0)
+ (return 1)
+ (return (* x (call f ((- x 1))))))}
+ {func main ()
+ (return (call f (X)))}))
+(define (test6) (eval-prog (parse-cmd TEST6) (mem-alloc 'X 5 empty-mem)))
+
+; kolejnośc deklaracji funkcji nie ma znaczenia, można zagnieżdżać funkcje
+(define TEST7
+ '(
+ {func main ()
+ (return (call f (2)))}
+ {func f (x)
+ (return (call f1 (x)))}
+ {func f1 (x)
+ {{func local-fun (x)
+ (return (+ 1 x))}
+ (return (call local-fun (x)))}}))
+(define (test7) (eval-prog (parse-cmd TEST7) empty-mem))
+
+; instrukcje poza jakimikolwiek funkcjami sa wykonywane przed wywołaniem main
+(define TEST8
+ '({func main ()
+ (return i)}
+ (i := 2)))
+(define (test8) (eval-prog (parse-cmd TEST8) (mem-alloc 'i 1 empty-mem)))
+
+; nic nie zwraca main, wywala błąd
+(define TEST9
+ '(func main ()
+ (i := 1)))
+(define (test9) (eval-prog (parse-cmd TEST9) (mem-alloc 'i 1 empty-mem)))
+
+; return poza jakąkolwiek funkcją jest wynikiem programu
+(define TEST10
+ '({func main ()
+ (return i)}
+ (i := 2)
+ (return -1)))
+(define (test10) (eval-prog (parse-cmd TEST10) (mem-alloc 'i 1 empty-mem)))
+
+
+; arity mismatch
+(define TEST11
+ '({func main ()
+ (return (call decr ()))}
+ {func decr (x)
+ (return (- x 1))}))
+(define (test11) (eval-prog (parse-cmd TEST11) empty-mem))
diff --git a/semestr-2/racket/egzamin/zad2.bak b/semestr-2/racket/egzamin/zad2.bak
new file mode 100644
index 0000000..02e2ae0
--- /dev/null
+++ b/semestr-2/racket/egzamin/zad2.bak
@@ -0,0 +1,119 @@
+#lang racket
+
+;; ZADANIE 2
+;; =========
+
+;; W tym zadaniu przyjrzymy się pierwszemu "językowi programowania"
+;; który widzieliśmy na zajęciach: wyrażeniom arytmetycznym. Ich
+;; prostota przejawia się przede wszystkim tym że nie występują w nich
+;; zmienne (a w szczególności ich wiązanie) — dlatego możemy o nich
+;; wnioskować nie używając narzędzi cięższych niż te poznane na
+;; wykładzie.
+
+;; W tym zadaniu będziemy chcieli udowodnić że nasza prosta kompilacja
+;; do odwrotnej notacji polskiej jest poprawna. Konkretniej, należy
+;; · sformułować zasady indukcji dla obydwu typów danych
+;; reprezentujących wyrażenia (expr? i rpn-expr?)
+;; · sformułować i udowodnić twierdzenie mówiące że kompilacja
+;; zachowuje wartość programu, tj. że obliczenie wartości programu
+;; jest równoważne skompilowaniu go do RPN i obliczeniu.
+;; · sformułować i udowodnić twierdzenie mówiące że translacja z RPN
+;; do wyrażeń arytmetycznych (ta która była zadaniem domowym;
+;; implementacja jest poniżej) jest (prawą) odwrotnością translacji
+;; do RPN (czyli że jak zaczniemy od wyrażenia i przetłumaczymy do
+;; RPN i z powrotem, to dostaniemy to samo wyrażenie).
+;; Swoje rozwiązanie należy wpisać na końcu tego szablonu w
+;; komentarzu, podobnie do niniejszej treści zadania; proszę zadbać o
+;; czytelność dowodów!
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+
+(define (operator? x)
+ (member x '(+ * - /)))
+
+(define (expr? e)
+ (match e
+ [(const v)
+ (integer? v)]
+ [(binop op l r)
+ (and (operator? op)
+ (expr? l)
+ (expr? r))]
+ [_ false]))
+
+
+(define (value? v)
+ (number? v))
+
+(define (op->proc op)
+ (match op
+ ['+ +]
+ ['- -]
+ ['* *]
+ ['/ /]))
+
+;; zał: (expr? e) jest prawdą
+;; (value? (eval e)) jest prawdą
+(define (eval e)
+ (match e
+ [(const v) v]
+ [(binop op l r)
+ (let ((vl (eval l))
+ (vr (eval r))
+ (p (op->proc op)))
+ (p vl vr))]))
+
+(define (rpn-expr? e)
+ (and (list? e)
+ (pair? e)
+ (andmap (lambda (x) (or (number? x) (operator? x))) e)))
+
+
+(struct stack (xs))
+
+(define empty-stack (stack null))
+(define (empty-stack? s) (null? (stack-xs s)))
+(define (top s) (car (stack-xs s)))
+(define (push a s) (stack (cons a (stack-xs s))))
+(define (pop s) (stack (cdr (stack-xs s))))
+
+
+(define (eval-am e s)
+ (cond
+ [(null? e) (top s)]
+ [(number? (car e)) (eval-am (cdr e) (push (car e) s))]
+ [(operator? (car e))
+ (let* ((vr (top s))
+ (s (pop s))
+ (vl (top s))
+ (s (pop s))
+ (v ((op->proc (car e)) vl vr)))
+ (eval-am (cdr e) (push v s)))]))
+
+(define (rpn-eval e)
+ (eval-am e empty-stack))
+
+(define (arith->rpn e)
+ (match e
+ [(const v) (list v)]
+ [(binop op l r) (append (arith->rpn l) (arith->rpn r) (list op))]))
+
+(define (rpn-translate e s)
+ (cond
+ [(null? e)
+ (top s)]
+
+ [(number? (car e))
+ (rpn-translate (cdr e) (push (const (car e)) s))]
+
+ [(operator? (car e))
+ (let* ((er (top s))
+ (s (pop s))
+ (el (top s))
+ (s (pop s))
+ (en (binop (car e) el er)))
+ (rpn-translate (cdr e) (push en s)))]))
+
+(define (rpn->arith e)
+ (rpn-translate e empty-stack)) \ No newline at end of file
diff --git a/semestr-2/racket/egzamin/zad2.rkt b/semestr-2/racket/egzamin/zad2.rkt
new file mode 100644
index 0000000..e549f07
--- /dev/null
+++ b/semestr-2/racket/egzamin/zad2.rkt
@@ -0,0 +1,186 @@
+#lang racket
+
+;; Oświadczam, że rozwiązanie zadania egzaminacyjnego przygotowałem
+;; w pełni samodzielnie, korzystając wyłącznie z materiałów do wykładu,
+;; notatek, podręcznika, oraz materiałów zacytowanych w treści rozwiązania.
+;; Oświadczam że nie korzystałem w żadnej formie z pomocy osób trzecich
+;; w przygotowaniu rozwiązania ani też takiej pomocy nie udzielałem
+;; i nie udostępniałem nikomu swojego rozwiązania.
+
+;; ZADANIE 2
+;; =========
+
+;; W tym zadaniu przyjrzymy się pierwszemu "językowi programowania"
+;; który widzieliśmy na zajęciach: wyrażeniom arytmetycznym. Ich
+;; prostota przejawia się przede wszystkim tym że nie występują w nich
+;; zmienne (a w szczególności ich wiązanie) — dlatego możemy o nich
+;; wnioskować nie używając narzędzi cięższych niż te poznane na
+;; wykładzie.
+
+;; W tym zadaniu będziemy chcieli udowodnić że nasza prosta kompilacja
+;; do odwrotnej notacji polskiej jest poprawna. Konkretniej, należy
+;; · sformułować zasady indukcji dla obydwu typów danych
+;; reprezentujących wyrażenia (expr? i rpn-expr?)
+;; · sformułować i udowodnić twierdzenie mówiące że kompilacja
+;; zachowuje wartość programu, tj. że obliczenie wartości programu
+;; jest równoważne skompilowaniu go do RPN i obliczeniu.
+;; · sformułować i udowodnić twierdzenie mówiące że translacja z RPN
+;; do wyrażeń arytmetycznych (ta która była zadaniem domowym;
+;; implementacja jest poniżej) jest (prawą) odwrotnością translacji
+;; do RPN (czyli że jak zaczniemy od wyrażenia i przetłumaczymy do
+;; RPN i z powrotem, to dostaniemy to samo wyrażenie).
+;; Swoje rozwiązanie należy wpisać na końcu tego szablonu w
+;; komentarzu, podobnie do niniejszej treści zadania; proszę zadbać o
+;; czytelność dowodów!
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+
+(define (operator? x)
+ (member x '(+ * - /)))
+
+(define (expr? e)
+ (match e
+ [(const v)
+ (integer? v)]
+ [(binop op l r)
+ (and (operator? op)
+ (expr? l)
+ (expr? r))]
+ [_ false]))
+
+
+(define (value? v)
+ (number? v))
+
+(define (op->proc op)
+ (match op
+ ['+ +]
+ ['- -]
+ ['* *]
+ ['/ /]))
+
+;; zał: (expr? e) jest prawdą
+;; (value? (eval e)) jest prawdą
+(define (eval e)
+ (match e
+ [(const v) v]
+ [(binop op l r)
+ (let ((vl (eval l))
+ (vr (eval r))
+ (p (op->proc op)))
+ (p vl vr))]))
+
+(define (rpn-expr? e)
+ (and (list? e)
+ (pair? e)
+ (andmap (lambda (x) (or (number? x) (operator? x))) e)))
+
+;; mój kod
+(define (parse-expr q)
+ (cond
+ [(integer? q) (const q)]
+ [(and (list? q) (= (length q) 3) (operator? (first q)))
+ (binop (first q) (parse-expr (second q)) (parse-expr (third q)))]))
+
+(struct stack (xs))
+
+(define empty-stack (stack null))
+(define (empty-stack? s) (null? (stack-xs s)))
+(define (top s) (car (stack-xs s)))
+(define (push a s) (stack (cons a (stack-xs s))))
+(define (pop s) (stack (cdr (stack-xs s))))
+
+
+(define (eval-am e s)
+ (cond
+ [(null? e) (top s)]
+ [(number? (car e)) (eval-am (cdr e) (push (car e) s))]
+ [(operator? (car e))
+ (let* ((vr (top s))
+ (s (pop s))
+ (vl (top s))
+ (s (pop s))
+ (v ((op->proc (car e)) vl vr)))
+ (eval-am (cdr e) (push v s)))]))
+
+(define (rpn-eval e)
+ (eval-am e empty-stack))
+
+(define (arith->rpn e)
+ (match e
+ [(const v) (list v)]
+ [(binop op l r) (append (arith->rpn l) (arith->rpn r) (list op))]))
+
+(define (rpn-translate e s)
+ (cond
+ [(null? e)
+ (top s)]
+
+ [(number? (car e))
+ (rpn-translate (cdr e) (push (const (car e)) s))]
+
+ [(operator? (car e))
+ (let* ((er (top s))
+ (s (pop s))
+ (el (top s))
+ (s (pop s))
+ (en (binop (car e) el er)))
+ (rpn-translate (cdr e) (push en s)))]))
+
+(define (rpn->arith e)
+ (rpn-translate e empty-stack))
+
+
+;; W kilku miejscach pozwoliłem sobie zapomnieć że symbol operatora i operator
+;; to nie to samo, ale nie ma to znaczenia w kontekście dowodów.
+;; Przez ES oznaczam empty-stack
+;;
+;; Zasada indukcji dla expr:
+;; Dla dowolnej własności P, jeśli
+;; · zachodzi P((const x)) dla dowolnego x oraz
+;; · dla dowolnych e1, e2 oraz operator op jeśli zachodzi P(e1), P(e2)
+;; to zachodzi P((binop op e1 e2))
+;; to dla dowolnego e, jeśli zachodzi (expr? e) to zachodzi P(e)
+;;
+;; Zasada indukcji dla rpn (ale tego wg rpn-expr?):
+;; Dla dowolnej własności P, jeśli
+;; · zachodzi P(x) dla dowolnej liczby lub opeartora x oraz
+;; · dla dowolnej listy liczb lub operatorów xs oraz dowolnej liczby lub
+;; operatora x, jesli zachodzi P(xs), to zachodzi P((cons x xs))
+;; to dla dowolnej listy xs liczb lub operatorów zachodzi P(xs)
+;;
+;;
+;; Tw. 1: Jeśli spełnione jest (expr? e), to (eval e) ≡ (rpn-eval (arith->rpn e))
+;;
+;; D-d. Skorzystamy z zasady indukcji dla wyrażeń.
+;; · Weźmy dowolną liczbę x. Wtedy jeśli e ≡ (const x), to zachodzi
+;; (eval (const x)) ≡ x ≡ (rpn-eval '(x)) ≡ (rpn-eval (arith->rpn (const x)))
+;; · Weźmy dowolne e1, e2 spełniające naszą tezę oraz jakiś operator op. Wtedy
+;; (eval (binop op e1 e2)) ≡
+;; (op (eval e1) (eval e2)) ≡ [Z definicji eval-am]
+;; (eval-am '() (push (op (eval e1) (eval e2)) ES)) ≡
+;; (eval-am '(op) (push (eval e2) (push (eval e1) ES))) ≡ [Z założenia indukcyjnego]
+;; (eval-am '(op) (push (rpn-eval (arith->rpn e2)) (push (eval e1) ES))) ≡
+;; (eval-am (append (arith->rpn e2) '(op)) (push (eval e1) ES)) ≡ [Z założenia indukcyjnego]
+;; (eval-am (append (arith->rpn e1) (arith->rpn e2) '(op)) ES) ≡
+;; (rpn-eval (append (arith->rpn e1) (arith->rpn e2) '(op))) ≡ [Z definicji arith->rpn]
+;; (rpn-eval (arith->rpn (binop op e1 e2)))
+;; Pokazaliśmy oba warunki indukcji dla wyrażeń, zatem twierdzenie prawdziwe jest
+;; dla dowolnego wyrażenia e spełniającego (expr? e).
+;;
+;; Tw. 2: Jeśli spełnione jest (expr? e), to (rpn->arith (arith->rpn e)) ≡ e
+;;
+;; D-d. Skoryzstamy z indukcji dla wyrażeń.
+;; · Weźmy dowolną liczbę x. Wtedy dla e ≡ (const x) zachodzi
+;; (rpn->arith (arith->rpn e)) ≡ (rpn->arith '(x)) ≡ (const x)
+;; · Weźmy dowolne e1, e2 dla których twierdzenie zachodzi oraz operator op. Wtedy
+;; (rpn->arith (arith->rpn (binop op e1 e2))) ≡ [Z definicji arith->rpn]
+;; (rpn->arith (append (arith->rpn e1) (arith->rpn e2) '(op))) ≡
+;; (rpn-translate (append (arith->rpn e1) (arith->rpn e2) '(op)) ES) ≡ [Z zał. (arith->rpn e1) ewaluuje się do liczby]
+;; (rpn-translate (append (arith->rpn e2) '(op)) (push e1 ES)) ≡ [Z zał. (arith->rpn e2) ewaluuje się do liczby]
+;; (rpn-translate '(op) (push e2 (push e1 ES))) ≡ [Z definicji rpn-translate]
+;; (rpn-translate '() (push (binop op e1 e2) ES)) ≡
+;; (binop op e1 e2)
+;; Pokazaliśmy oba warunki indukcji dla wyrażeń, zatem twierdzenie jest prawdziwe
+;; dla dowolnego e spełniającego (expr? e).
diff --git a/semestr-2/racket/egzamin/zad3.bak b/semestr-2/racket/egzamin/zad3.bak
new file mode 100644
index 0000000..20115e9
--- /dev/null
+++ b/semestr-2/racket/egzamin/zad3.bak
@@ -0,0 +1,4 @@
+#lang racket
+
+
+
diff --git a/semestr-2/racket/egzamin/zad3.rkt b/semestr-2/racket/egzamin/zad3.rkt
new file mode 100644
index 0000000..9bfed02
--- /dev/null
+++ b/semestr-2/racket/egzamin/zad3.rkt
@@ -0,0 +1,347 @@
+#lang racket
+
+;; Oświadczam, że rozwiązanie zadania egzaminacyjnego przygotowałem
+;; w pełni samodzielnie, korzystając wyłącznie z materiałów do wykładu,
+;; notatek, podręcznika, oraz materiałów zacytowanych w treści rozwiązania.
+;; Oświadczam że nie korzystałem w żadnej formie z pomocy osób trzecich
+;; w przygotowaniu rozwiązania ani też takiej pomocy nie udzielałem
+;; i nie udostępniałem nikomu swojego rozwiązania.
+
+;; ZADANIE 3
+;; =========
+
+;; Z gramatykami bezkontekstowymi spotkaliście się już na Wstępie do
+;; Informatyki. W tym zadaniu potraktujemy je jako dane dla naszych
+;; programów.
+
+;; Przypomnijmy, że gramatyka bezkontekstowa składa się z
+;; · skończonego zbioru *symboli nieterminalnych*
+;; · skończonego zbioru *symboli terminalnych*
+;; · wybranego nieterminalnego symbolu startowego
+;; · zbioru *produkcji*, czyli par symbol nieterminalny - lista
+;; (potencjalnie pusta) symboli terminalnych lub nieterminalnych
+
+;; Słowo (ciąg symboli terminalnych) możemy wyprowadzić z gramatyki,
+;; jeśli możemy zacząć od ciągu składającego się z symbolu startowego
+;; możemy użyć skończonej liczby produkcji z gramatyki przepisując
+;; symbol nieterminalny na ciąg symboli mu odpowiadających (w danej
+;; produkcji).
+
+
+;; Przykład: poprawne nawiasowania
+
+;; Gramatyka składa się z jednego symbolu nieterminalnego, S (który
+;; jest oczywiście symbolem startowym) i dwóch symboli terminalnych
+;; "(" i ")", i zawiera następujące produkcje (zwyczajowo zapisywane
+;; przy użyciu strzałki; zwróćcie uwagę że pierwszy ciąg jest pusty!):
+;; S ->
+;; S -> SS
+;; S -> (S)
+
+;; W często spotykanej, bardziej zwięzłej, postaci BNF moglibyśmy tę
+;; gramatykę zapisać tak (dbając trochę bardziej o wizualne
+;; oddzielenie symboli terminalnych i nieterminalnych):
+;; S ::= "" | SS | "(" S ")"
+;; Mamy tu te same produkcje, ale tylko raz zapisujemy każdą z
+;; powtarzających się lewych stron.
+
+;; Z gramatyki tej da się wyprowadzić wszystkie poprawnie rozstawione
+;; ciągi nawiasów — zobaczmy jak wyprowadzić (na jeden ze sposobów)
+;; ciąg "(()())". Zaczynamy, jak zawsze, od słowa złożonego z symbolu
+;; startowego i przepisujemy:
+;; S -> (S) -> (SS) -> ((S)S) -> ((S)(S)) -> (()(S)) -> (()())
+
+
+;; Zadanie cz. 1
+
+;; Zdefiniuj reprezentację gramatyki jako typu danych w
+;; Rackecie. Warto zastanowić się co można uprościć względem definicji
+;; matematycznej — w szczególności możemy założyć że dowolne napisy
+;; (typu string) są ciągami symboli terminalnych, i że nie musimy
+;; podawać jawnie zbioru nieterminali; również reprezentacja produkcji
+;; gramatyki jako worka z parami wejście-wyjście niekoniecznie jest
+;; najwygodniejsza.
+
+;; Uwaga: w tym zadaniu nie wymagamy definiowania składni konkretnej i
+;; parsowania, ale bardzo polecamy wybranie jakiejś formy, żeby móc
+;; sensownie przetestować swoje rozwiązanie!
+
+
+;; "Optymalizacja" gramatyk
+
+;; Gramatyki, podobnie jak programy, piszą ludzie — może więc zdarzyć
+;; się że znajdą się tam śmieci. Mogą one mieć dwojaką formę: symboli
+;; nieterminalnych, których nie da się wyprowadzić z symbolu
+;; startowego, lub symboli nieterminalnych z których nie da się
+;; wyprowadzić żadnego słowa terminalnego (tj. niezawierającego
+;; symboli nieterminalnych). Przykładowo, do naszej gramatyki
+;; moglibyśmy dodać symbole P i Q, i produkcje:
+;; S -> ")(" P
+;; P -> PP "qed"
+;; Q -> "abc"
+
+;; Mimo że nasza gramatyka wygląda inaczej na pierwszy rzut oka, tak
+;; naprawdę się nie zmieniła: do symbolu Q nie możemy dojść z symbolu
+;; S, a więc "abc" nigdy nie wystąpi w słowie wyprowadzalnym z
+;; gramatyki. Analogicznie, z P nie da się wyprowadzić żadnego słowa,
+;; które nie zawierałoby symbolu P — a zatem żadnego słowa złożonego
+;; tylko z symboli terminalnych. To znaczy, że naszą gramatykę możemy
+;; uprościć wyrzucając z niej symbole nieterminalne (i produkcje które
+;; ich używają) do których nie da się dojść (tj. są *nieosiągalne*) i
+;; te, z których nie da się ułożyć słowa terminalnego (tj. są
+;; *nieproduktywne*). Jeśli z naszej rozszerzonej gramatyki wyrzucimy
+;; takie symbole, dostaniemy oczywiście gramatykę początkową.
+
+
+;; Zadanie cz. 2
+
+;; Dla swojej reprezentacji gramatyki z poprzedniej części zadania
+;; napisz dwie procedury: cfg-unreachable, znajdującą symbole
+;; nieterminalne które są nieosiągalne z symbolu startowego, i
+;; cfg-unproductive, znajdującą symbole nieterminalne które nie są
+;; produktywne. Następnie użyj tych procedur żeby zdefiniować
+;; procedurę cfg-optimize, która uprości daną gramatykę usuwając z
+;; niej symbole nieosiągalne i nieproduktywne, a także odpowiednie
+;; produkcje.
+
+;; Rozwiązanie wpisz w poniższym pliku, i opatrz komentarzem
+;; opisującym wybraną reprezentację (i podjęte przy jej projektowaniu
+;; decyzje), a także zaimplementowane w cz. 2. algorytmy.
+
+
+
+
+
+
+;; Zadanie 1
+
+;; Reprezentacja jest docyś prosta, mianowicie stworzyłem struktury
+;; terminal, non-terminal, rule oraz grammar. Dwa pierwsze to
+;; po prostu jednoelementowe struktury utrzymujące nazwę symboli.
+;; grammar to dwuelementowa struktura, jej pierwszym elementem
+;; jest symbol startowy, a następnym produkcja, czyli lista reguł (listof rule),
+;; a reguły to dwuelementowe struktury (symbol niterminalny - lista nonterminali lub termianli).
+;; Generalnie dzięki temu, że mam te struktury terminal oraz non-terminal
+;; to symbol nieterminalne i temrinalne mogą być czykolwiek. Dodatkowo
+;; dla uproszczenia w miejscach, gdzie mam pewność że chodzi mi o
+;; symbol nieterminalny, to nie opakowuję go w strukturę.
+;; Przykładowo rules w gramatyce może wyglądać tak:
+;; (list
+;; (rule 'S (list (terminal "")))
+;; (rule 'S (list (non-terminal 'S) (non-terminal 'S)))
+;; (rule 'S (list (terminal "(") (non-terminal 'S) (terminal ")"))))
+;; Oczywiście symbol nieterminalny nie musi być racketowym symbolem, może być czymkolwiek.
+;; Podobnie z symbolami terminalnymi. Proszę również zauważyć, że dzięki
+;; strukturom non-terminal oraz terminal te same racketowe obiekty mogą być jednocześnie
+;; terminalami oraz nieterminalami!
+;; W tych parach na pierwszym miejscu nie jest non-terminal, tylko po prostu cokolwiek
+;; no i oczywiście mam wtedy pewność że musi być to non-terminal, nie ma potrzeby
+;; żeby pakować go również w tę strukturę.
+
+
+;; Postanowiłem napisać parser (make-cfg q), generuje on gramatyki w bardzo konkretny sposób,
+;; trochę ograniczo to czym mogą być symbole nieterminalne oraz terminalne,
+;; ale nie wydaje mi się że i tak składnia jest bardzo wygodna i mało ograniczająca.
+
+;; Składnia konkretna naszych gramatyk wygląda bardzo podobnie do zapisu
+;; przedstawionego w treści zadania.
+;; np. gramatyka nawiasowania będzie wyglądać następująco:
+;; '(grammar S (S ::= "" -- SS -- "(" S ")"))
+;; ale mogłaby wyglądać też tak:
+;; '(grammar S (S ::= "") (S ::= SS -- "(" S ")"))
+;; a np. ta nieciekawa gramatyka przedstawiona w treści zadania:
+;; '(grammar S (S ::= "] [" P) (P ::= PP "qed") (Q ::= "abc"))
+;; Zatem będzie to lista, która na pierwszym miejscu ma symbol 'grammar
+;; na drugim miejscu ma symbol startowy
+;; następnie następuje lista produkcji w formacie:
+;; <non-terminal> ::= <lista produkcji, produkcje oddzielone są separatorem -->
+;; Zalety:
+;; - rozróżnienie w składni konkretnej symboli nieterminalnych i terminalnych
+;; przez użycie symboli i stringów pozwala na to, aby symbole terminalne nazywały się tak
+;; jak terminalne, tj. "S" nie jest tym samym co 'S.
+;; - składnia wydaje się bardzo wygodna w użyciu, nie ma też problemu, żeby później dopisać
+;; dodatkowe reguły dla jakiegoś nieterminala,
+;; - parser jest całkiem łatwy w implementacji
+;; Wady:
+;; - symbole nieterminalne mogą składać się jedynie z jednego symbolu, zatem nie możemy robić ich
+;; zbyt wiele. Jest tak dlatego, że np. tutaj (S ::= SS) nie chodzi mi o symbol SS, tylko
+;; o sąsiadujące symbole SS (jednak gdyby nie używać parsera to normalnie moglibyśmy
+;; mieć wieloznakowe symbole nieterminalne!).
+
+;; Dla przykładu taka gramatyka:
+;; '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QS -- "[" Q "]"))
+;; będzie reprezentowana następująco:
+;; (grammar
+;; 'S
+;; (list
+;; (rule 'S (list (terminal "")))
+;; (rule 'S (list (non-terminal 'S) (non-terminal 'S)))
+;; (rule 'S (list (terminal "(") (non-terminal 'S) (terminal ")")))
+;; (rule 'S (list (non-terminal 'Q)))
+;; (rule 'Q (list (terminal "")))
+;; (rule 'Q (list (non-terminal 'Q) (non-terminal 'S)))
+;; (rule 'Q (list (terminal "[") (non-terminal 'Q) (terminal "]")))))
+
+;; Cała reprezentacja :D
+(struct non-terminal (sym) #:transparent)
+(struct terminal (sym) #:transparent)
+(struct rule (nt xs) #:transparent)
+(struct grammar (start rules) #:transparent)
+
+
+;; PARSER
+(define SEPARATOR '--)
+
+(define (split-at-symb symb xs)
+ (define (iter left right)
+ (cond
+ [(null? right) (cons left null)]
+ [(eq? symb (car right)) (cons left (cdr right))]
+ [else (iter (cons (car right) left) (cdr right))]))
+ (let ([res (iter null xs)])
+ (cons (reverse (car res)) (cdr res))))
+
+(define (split-by-separator xs)
+ (let ([res (split-at-symb SEPARATOR xs)])
+ (if (null? (cdr res))
+ res
+ (cons (car res) (split-by-separator (cdr res))))))
+
+;; PARSER SKŁADNI KONKRETNEJ DO JEJ REPREZENTACJI
+(define (make-cfg q)
+ (cond
+ [(and (list? q) (eq? 'grammar (first q)))
+ (grammar (second q) (append-map make-cfg (cddr q)))]
+ [(and (list? q) (eq? '::= (second q)))
+ (let ([nt (first q)]
+ [rules (split-by-separator (cddr q))])
+ (map (lambda (x) (rule nt x)) (map make-prod rules)))]))
+
+(define (symbol->list s)
+ (map string->symbol
+ (map string
+ (string->list (symbol->string s)))))
+
+(define (make-prod xs)
+ (cond
+ [(null? xs) null]
+ [(string? (car xs)) (cons (terminal (car xs)) (make-prod (cdr xs)))]
+ [(symbol? (car xs)) (append (map non-terminal (symbol->list (car xs))) (make-prod (cdr xs)))]
+ [else (error "Invalid syntax in production" xs)]))
+
+
+(define sample '(S ::= "" -- SS -- "(" S ")"))
+(define sample2 '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QQ -- "[" Q "]")))
+(define sample3 '(grammar S
+ (S ::= A B -- D E)
+ (A ::= "a")
+ (B ::= "b" C)
+ (C ::= "c")
+ (D ::= "d" F)
+ (E ::= "e")
+ (F ::= "f" D)))
+
+(define (sample-grammar) (make-cfg sample3))
+
+;; zadanie 2
+
+;; korzystam z algorytmów przedstawionych w tej książce:
+;; https://bit.ly/3ev0NUA, konkretnie te ze stron 50-51
+;; Pozwoliłem sobie trochę zmienić przeznaczenie funkcji cfg-unreachable oraz cfg-unproductive
+;; Zamiast zwracać nieproduktywne nieterminale, zwracają właśnie produktywne
+;; i analogicznie w tym drugim. Po prostu taka implementacja jest dla mnie wygodniejsza,
+;; a jest bardzo nieistotną zmianą koncepcyjną.
+;; Stąd zmiana nazwy na cfg-productive oraz cfg-reachable
+
+;; cfg-productive działa w ten sposób:
+;; Jakiś nieterminal nazywamy produktywnym, jeśli ma co najmniej jedną produktywną zasadę
+;; Jakąś regułę nazywamy produktywną, jeśli składa się z terminali lub produktywnych nieterminali
+;; Jasno widać, że wg tej definicji te nieterminale, które nie są produktywne, są nieproduktywne
+;; wg definicji zadania, a cała reszta jest produktwna.
+
+;; Algorytm znajdowania produktywnych nieterminali:
+;; Mamy listę produktywnych nieterminali P, początkowo pustą
+;; 1. Stwórz nową listę P'
+;; 2. Przejdź po liście reguł
+;; -> jeśli dana reguła jest produktywna (wg P), dodaj jej nieterminal do P'
+;; 3. Jeśli P != P', zrób P := P' i wróć do 1.
+;; 4. Zwróć P
+
+;; Fajne w tym algorytmie jest to, że jeśli mamy jakiś nieterminal, którego
+;; używamy w jakiejś regule, ale ten nieterminal nie ma zdefiniowanej żadnej reguły,
+;; to nie zostanie oznaczony jako produktywny, co jest dla nas korzystne.
+
+;; Algorytm znajdowania osiągalnych nieterminali:
+;; Traktujemy nitereminale jak wierzchołki w grafie a reguły jako listy sąsiedztwa.
+;; Terminale są liśćmi, a nieterminale węzłami. Robimy po prostu DFSa z nieterminala
+;; startowego i węzły do których dotrzemy oznaczamy jako osiągalne.
+
+;; Wg papierka który tutaj podałem, jeśli najpierw usuniemy nieproduktywne nieterminale,
+;; a w następnej kolejności nieosiągalne, to nasza gramatyka stanie się regularna.
+;; Wydaje się to w miarę sensowne -- pierszy algorytm to takie odcinanie liści i odcyklanie
+;; grafu, a ten drugi to po prostu DFS.
+
+;; przydatne predykaty -- na productive-nt mam listę symboli niterminalnych
+;; (nie struktury non-terminal, tylko te symbole!)
+;; które wiem że są produktywne.
+;; productive? sprawdza, czy nietermial jest produktywny
+;; to drugie sprawdza czy reguła jest produktywna
+;; (czyli czy składa się z produktywnych nonterminali lub terminali)
+(define (productive? p productive-nt)
+ (or (terminal? p) (member (non-terminal-sym p) productive-nt)))
+(define (rule-productive? r productive-nt)
+ (andmap (lambda (x) (productive? x productive-nt)) r))
+
+;; zwraca listę produktywnych symboli (nie nonterminali!)
+(define (cfg-productive g)
+ (define (find-productive-nt productive-nt rules)
+ (cond
+ [(null? rules) (remove-duplicates productive-nt)]
+ [(rule-productive? (rule-xs (car rules)) productive-nt)
+ (find-productive-nt (cons (rule-nt (car rules)) productive-nt) (cdr rules))]
+ [else (find-productive-nt productive-nt (cdr rules))]))
+ (define (iter productive-nt)
+ (let ([new-prod-nt (find-productive-nt productive-nt (grammar-rules g))])
+ (if (equal? productive-nt new-prod-nt)
+ productive-nt
+ (iter new-prod-nt))))
+ (iter null))
+
+;; zwraca listę osiągalnych symboli
+(define (cfg-reachable g)
+ (define (iter verts vis)
+ (cond
+ [(null? verts) vis]
+ [(member (car verts) vis) (iter (cdr verts) vis)]
+ [else (iter (cdr verts) (dfs (car verts) vis))]))
+ (define (dfs v vis)
+ (let* ([rules (filter (lambda (r) (eq? (rule-nt r) v)) (grammar-rules g))]
+ [verts (append-map (lambda (r) (rule-xs r)) rules)]
+ [verts (filter non-terminal? verts)]
+ [verts (map non-terminal-sym verts)])
+ (iter verts (cons v vis))))
+ (dfs (grammar-start g) null))
+
+
+;; robi z gramatyki g gramatykę regularną
+(define (cfg-optimize g)
+ (let* ([productive-nt (cfg-productive g)]
+ [productive-rules (filter (lambda (r)
+ (rule-productive? (rule-xs r) productive-nt))
+ (grammar-rules g))]
+ [new-g (grammar (grammar-start g) productive-rules)] ; <----- nowa gramatyka, bez nieproduktywnych
+ [reachable-nt (cfg-reachable new-g)] ; reguł i symboli nieterminalnych
+ [res-g (grammar (grammar-start new-g) (filter ; <----- dobra gramatyka
+ (lambda (r) (member (rule-nt r) reachable-nt))
+ (grammar-rules new-g)))])
+ res-g))
+
+(define (test) (cfg-optimize (make-cfg sample3)))
+
+;; Pokazanie że symbole nie muszą być racketowymi symbolami :)
+(define (test2) (cfg-optimize
+ (grammar '()
+ (list (cons '() (list (terminal '())))
+ (cons '() (list (terminal "(") (non-terminal '()) (terminal ")")))
+ (cons '() (list (non-terminal '()) (non-terminal '())))))))
+ \ No newline at end of file
diff --git a/semestr-2/racket/egzamin/zad3a.bak b/semestr-2/racket/egzamin/zad3a.bak
new file mode 100644
index 0000000..81570d0
--- /dev/null
+++ b/semestr-2/racket/egzamin/zad3a.bak
@@ -0,0 +1,298 @@
+#lang racket
+
+;; ZADANIE 3
+;; =========
+
+;; Z gramatykami bezkontekstowymi spotkaliście się już na Wstępie do
+;; Informatyki. W tym zadaniu potraktujemy je jako dane dla naszych
+;; programów.
+
+;; Przypomnijmy, że gramatyka bezkontekstowa składa się z
+;; · skończonego zbioru *symboli nieterminalnych*
+;; · skończonego zbioru *symboli terminalnych*
+;; · wybranego nieterminalnego symbolu startowego
+;; · zbioru *produkcji*, czyli par symbol nieterminalny - lista
+;; (potencjalnie pusta) symboli terminalnych lub nieterminalnych
+
+;; Słowo (ciąg symboli terminalnych) możemy wyprowadzić z gramatyki,
+;; jeśli możemy zacząć od ciągu składającego się z symbolu startowego
+;; możemy użyć skończonej liczby produkcji z gramatyki przepisując
+;; symbol nieterminalny na ciąg symboli mu odpowiadających (w danej
+;; produkcji).
+
+
+;; Przykład: poprawne nawiasowania
+
+;; Gramatyka składa się z jednego symbolu nieterminalnego, S (który
+;; jest oczywiście symbolem startowym) i dwóch symboli terminalnych
+;; "(" i ")", i zawiera następujące produkcje (zwyczajowo zapisywane
+;; przy użyciu strzałki; zwróćcie uwagę że pierwszy ciąg jest pusty!):
+;; S ->
+;; S -> SS
+;; S -> (S)
+
+;; W często spotykanej, bardziej zwięzłej, postaci BNF moglibyśmy tę
+;; gramatykę zapisać tak (dbając trochę bardziej o wizualne
+;; oddzielenie symboli terminalnych i nieterminalnych):
+;; S ::= "" | SS | "(" S ")"
+;; Mamy tu te same produkcje, ale tylko raz zapisujemy każdą z
+;; powtarzających się lewych stron.
+
+;; Z gramatyki tej da się wyprowadzić wszystkie poprawnie rozstawione
+;; ciągi nawiasów — zobaczmy jak wyprowadzić (na jeden ze sposobów)
+;; ciąg "(()())". Zaczynamy, jak zawsze, od słowa złożonego z symbolu
+;; startowego i przepisujemy:
+;; S -> (S) -> (SS) -> ((S)S) -> ((S)(S)) -> (()(S)) -> (()())
+
+
+;; Zadanie cz. 1
+
+;; Zdefiniuj reprezentację gramatyki jako typu danych w
+;; Rackecie. Warto zastanowić się co można uprościć względem definicji
+;; matematycznej — w szczególności możemy założyć że dowolne napisy
+;; (typu string) są ciągami symboli terminalnych, i że nie musimy
+;; podawać jawnie zbioru nieterminali; również reprezentacja produkcji
+;; gramatyki jako worka z parami wejście-wyjście niekoniecznie jest
+;; najwygodniejsza.
+
+;; Uwaga: w tym zadaniu nie wymagamy definiowania składni konkretnej i
+;; parsowania, ale bardzo polecamy wybranie jakiejś formy, żeby móc
+;; sensownie przetestować swoje rozwiązanie!
+
+
+;; "Optymalizacja" gramatyk
+
+;; Gramatyki, podobnie jak programy, piszą ludzie — może więc zdarzyć
+;; się że znajdą się tam śmieci. Mogą one mieć dwojaką formę: symboli
+;; nieterminalnych, których nie da się wyprowadzić z symbolu
+;; startowego, lub symboli nieterminalnych z których nie da się
+;; wyprowadzić żadnego słowa terminalnego (tj. niezawierającego
+;; symboli nieterminalnych). Przykładowo, do naszej gramatyki
+;; moglibyśmy dodać symbole P i Q, i produkcje:
+;; S -> ")(" P
+;; P -> PP "qed"
+;; Q -> "abc"
+
+;; Mimo że nasza gramatyka wygląda inaczej na pierwszy rzut oka, tak
+;; naprawdę się nie zmieniła: do symbolu Q nie możemy dojść z symbolu
+;; S, a więc "abc" nigdy nie wystąpi w słowie wyprowadzalnym z
+;; gramatyki. Analogicznie, z P nie da się wyprowadzić żadnego słowa,
+;; które nie zawierałoby symbolu P — a zatem żadnego słowa złożonego
+;; tylko z symboli terminalnych. To znaczy, że naszą gramatykę możemy
+;; uprościć wyrzucając z niej symbole nieterminalne (i produkcje które
+;; ich używają) do których nie da się dojść (tj. są *nieosiągalne*) i
+;; te, z których nie da się ułożyć słowa terminalnego (tj. są
+;; *nieproduktywne*). Jeśli z naszej rozszerzonej gramatyki wyrzucimy
+;; takie symbole, dostaniemy oczywiście gramatykę początkową.
+
+
+;; Zadanie cz. 2
+
+;; Dla swojej reprezentacji gramatyki z poprzedniej części zadania
+;; napisz dwie procedury: cfg-unreachable, znajdującą symbole
+;; nieterminalne które są nieosiągalne z symbolu startowego, i
+;; cfg-unproductive, znajdującą symbole nieterminalne które nie są
+;; produktywne. Następnie użyj tych procedur żeby zdefiniować
+;; procedurę cfg-optimize, która uprości daną gramatykę usuwając z
+;; niej symbole nieosiągalne i nieproduktywne, a także odpowiednie
+;; produkcje.
+
+;; Rozwiązanie wpisz w poniższym pliku, i opatrz komentarzem
+;; opisującym wybraną reprezentację (i podjęte przy jej projektowaniu
+;; decyzje), a także zaimplementowane w cz. 2. algorytmy.
+
+
+
+
+
+
+;; Zadanie 1
+
+;; Postanowiłem napisać parser, bo bez tego zadanie wydaje mi się dosyć ubogie
+;; Składnia konkretna naszych gramatyk wygląda bardzo podobnie do zapisu
+;; przedstawionego w treści zadania.
+;; np. gramatyka nawiasowania będzie wyglądać następująco:
+;; '(grammar S (S ::= "" -- SS -- "(" S ")"))
+;; ale mogłaby wyglądać też tak:
+;; '(grammar S (S ::= "") (S ::= SS -- "(" S ")"))
+;; a np. ta nieciekawa gramatyka przedstawiona w treści zadania:
+;; '(grammar S (S ::= "] [" P) (P ::= PP "qed") (Q ::= "abc"))
+;; Zatem będzie to lista, która na pierwszym miejscu ma symbol 'grammar
+;; na drugim miejscu ma symbol startowy
+;; następnie następuje lista produkcji w formacie:
+;; <non-terminal> ::= <lista produkcji, produkcje oddzielone są separatorem -->
+;; Zalety:
+;; - rozróżnienie w składni konkretnej symboli nieterminalnych i terminalnych
+;; przez użycie symboli i stringów pozwala na to, aby symbole terminalne nazywały się tak
+;; jak terminalne, tj. "S" nie jest tym samym co 'S.
+;; - składnia wydaje się bardzo wygodna w użyciu, nie ma też problemu, żeby później dopisać
+;; dodatkowe produkcje dla jednego symbolu nieterminalnego, np. (S ::= "") (S ::= SS)
+;; - parser jest łatwy w implementacji
+;; Wady:
+;; - symbole nieterminalne mogą składać się jedynie z jednego symbolu, zatem nie możemy robić ich
+;; zbyt wiele
+
+;; Reprezentacja gramatyki: podczas parsowania gramatyki symbole i stringi wewnątrz produkcji
+;; reprezentowane są przez struktury terminal oraz non-terminal. Cała gramatyka to
+;; struktura dwuelementowa - pierwszym jest symbol startowy, a drugim lista par <symbol . produkcja>
+;; Taka decyzja właśnie pozwoliła na to, że zaproponowana przeze mnie składania konkretna jest
+;; bardzo prosta do sparsowania - wystarczy każdą produkcję podzielić ze względu na separator '--
+;; i do czegoś podobnego do środowisk dodawać po prostu odpowiednie pary.
+;; dla przykładu taka gramatyka:
+;; '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QS -- "[" Q "]"))
+;; będzie reprezentowana następująco:
+;; (grammar
+;; 'S
+;; (production
+;; (list
+;; (list 'S (terminal ""))
+;; (list 'S (non-terminal 'S) (non-terminal 'S))
+;; (list 'S (terminal "(") (non-terminal 'S) (terminal ")"))
+;; (list 'S (non-terminal 'Q))
+;; (list 'Q (terminal ""))
+;; (list 'Q (non-terminal 'Q) (non-terminal 'S))
+;; (list 'Q (terminal "[") (non-terminal 'Q) (terminal "]")))))
+;; Prosze zauważyć, że np. SS zostało zamienione na dwa sąsiednie nieterminalne symbole S
+;; (to właśnie powód, dlaczego symbole nieterminalne mogą być jedynie jednoznakowe).
+
+;; Zdecydowałem się dodać strukturę production, bo wtedy łatwo można na niej operować
+;; pisząc funkcje production-add, czy production-lookup itp.
+
+
+(struct non-terminal (sym) #:transparent)
+(struct terminal (sym) #:transparent)
+(struct grammar (start rules) #:transparent)
+
+(define SEPARATOR '--)
+
+(define (split-at-symb symb xs)
+ (define (iter left right)
+ (cond
+ [(null? right) (cons left null)]
+ [(eq? symb (car right)) (cons left (cdr right))]
+ [else (iter (cons (car right) left) (cdr right))]))
+ (let ([res (iter null xs)])
+ (cons (reverse (car res)) (cdr res))))
+
+(define (split-by-separator xs)
+ (let ([res (split-at-symb SEPARATOR xs)])
+ (if (null? (cdr res))
+ res
+ (cons (car res) (split-by-separator (cdr res))))))
+
+(define (make-cfg q)
+ (cond
+ [(and (list? q) (eq? 'grammar (first q)))
+ (grammar (second q) (append-map make-cfg (cddr q)))]
+ [(and (list? q) (eq? '::= (second q)))
+ (let ([nt (first q)]
+ [rules (split-by-separator (cddr q))])
+ (map (lambda (x) (cons nt x)) (map make-prod rules)))]))
+
+(define (symbol->list s)
+ (map string->symbol
+ (map string
+ (string->list (symbol->string s)))))
+
+(define (make-prod xs)
+ (cond
+ [(null? xs) null]
+ [(string? (car xs)) (cons (terminal (car xs)) (make-prod (cdr xs)))]
+ [(symbol? (car xs)) (append (map non-terminal (symbol->list (car xs))) (make-prod (cdr xs)))]
+ [else (error "Invalid syntax in production" xs)]))
+
+
+(define sample '(S ::= "" -- SS -- "(" S ")"))
+(define sample2 '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QQ -- "[" Q "]")))
+(define sample3 '(grammar S
+ (S ::= A B -- D E)
+ (A ::= "a")
+ (B ::= "b" C)
+ (C ::= "c")
+ (D ::= "d" F)
+ (E ::= "e")
+ (F ::= "f" D)))
+
+;; zadanie 2
+
+;; korzystam z algorytmów przedstawionych w tej książce:
+;; https://bit.ly/3ev0NUA, konkretnie te ze stron 50-51
+;; Pozwoliłem sobie trochę zmienić przeznaczenie funkcji cfg-unreachable oraz cfg-unproductive
+;; Zamiast zwracać nieproduktywne nieterminale, zwracają właśnie produktywne
+;; i analogicznie w tym drugim. Po prostu taka implementacja jest dla mnie wygodniejsza,
+;; a jest bardzo nieistotną zmianą koncepcyjną.
+;; Stąd zmiana nazwy na cfg-productive oraz cfg-reachable
+
+;; cfg-productive działa w ten sposób:
+;; Jakiś nieterminal nazywamy produktywnym, jeśli ma co najmniej jedną produktywną zasadę
+;; Jakąś zasadę nazywamy produktywną, jeśli składa się z terminali oraz produktywnych nieterminali
+;; Jasno widać, że wg tej definicji te nieterminale, które nie są produktywne, są nieproduktywne
+;; wg definicji zadania, a cała reszta jest produktwna.
+
+;; Algorytm znajdowania produktywnych nieterminali:
+;; Mamy listę produktywnych nieterminali P, początkowo pustą
+;; 1. Stwórz nową listę P'
+;; 2. Przejdź po liście produkcji
+;; -> jeśli dana produkcja jest produktywna (wg P), dodaj jej nieterminal do P'
+;; 3. Jeśli P != P', zrób P := P' i wróć do 1.
+;; 4. Zwróć P
+
+;; Fajne w tym algorytmie jest to, że jeśli mamy jakiś nieterminal, którego
+;; używamy w jakiejś produkcji, ale ten nieterminal nie ma zdefiniowanej swojej produkcji
+;; to nie zostanie oznaczony jako produktywny, co jest dla nas korzystne
+
+;; Algorytm znajdowania osiągalnych nieterminali:
+;; Traktujemy nitereminale jak wierzchołki w grafie a zasady jako listy sąsiedztwa.
+;; Terminale są liśćmi, a nieterminale węzłami. Robimy po prostu DFSa z nieterminalu
+;; startowego i węzły do których dotrzemy oznaczamy jako osiągalne.
+
+;; Wg papierka który tutaj podałem, jeśli najpierw usuniemy nieproduktywne nieterminale,
+;; a w następnej kolejności nieosiągalne, to nasza gramatyka stanie się regularna.
+
+(define (productive? p productive-nt)
+ (or (terminal? p) (member (non-terminal-sym p) productive-nt)))
+(define (rule-productive? r productive-nt)
+ (andmap (lambda (x) (productive? x productive-nt)) r))
+
+(define (cfg-productive g)
+ (define (find-productive-nt productive-nt rules)
+ (cond
+ [(null? rules) (remove-duplicates productive-nt)]
+ [(rule-productive? (cdar rules) productive-nt)
+ (find-productive-nt (cons (caar rules) productive-nt) (cdr rules))]
+ [else (find-productive-nt productive-nt (cdr rules))]))
+ (define (iter productive-nt)
+ (let ([new-prod-nt (find-productive-nt productive-nt (grammar-rules g))])
+ (if (equal? productive-nt new-prod-nt)
+ productive-nt
+ (iter new-prod-nt))))
+ (iter null))
+
+(define (cfg-reachable g)
+ (define (iter verts vis)
+ (cond
+ [(null? verts) vis]
+ [(member (car verts) vis) (iter (cdr verts) vis)]
+ [else (iter (cdr verts) (dfs (car verts) vis))]))
+ (define (dfs v vis)
+ (display v)
+ (newline)
+ (let* ([rules (filter (lambda (r) (eq? (car r) v)) (grammar-rules g))]
+ [verts (append-map (lambda (r) (cdr r)) rules)]
+ [verts (filter non-terminal? verts)]
+ [verts (map non-terminal-sym verts)])
+ (iter verts (cons v vis))))
+ (dfs (grammar-start g) null))
+
+(define (cfg-optimize g)
+ (let* ([productive-nt (cfg-productive g)]
+ [productive-rules (filter (lambda (r)
+ (rule-productive? (cdr r) productive-nt))
+ (grammar-rules g))]
+ [new-g (grammar (grammar-start g) productive-rules)]
+ [reachable-nt (cfg-reachable new-g)]
+ [res-g (grammar (grammar-start new-g) (filter
+ (lambda (r) (member (car r) reachable-nt))
+ (grammar-rules new-g)))])
+ res-g))
+ \ No newline at end of file
diff --git a/semestr-2/racket/egzamin/zad3a.rkt b/semestr-2/racket/egzamin/zad3a.rkt
new file mode 100644
index 0000000..eaa6645
--- /dev/null
+++ b/semestr-2/racket/egzamin/zad3a.rkt
@@ -0,0 +1,301 @@
+#lang racket
+
+;; ZADANIE 3
+;; =========
+
+;; Z gramatykami bezkontekstowymi spotkaliście się już na Wstępie do
+;; Informatyki. W tym zadaniu potraktujemy je jako dane dla naszych
+;; programów.
+
+;; Przypomnijmy, że gramatyka bezkontekstowa składa się z
+;; · skończonego zbioru *symboli nieterminalnych*
+;; · skończonego zbioru *symboli terminalnych*
+;; · wybranego nieterminalnego symbolu startowego
+;; · zbioru *produkcji*, czyli par symbol nieterminalny - lista
+;; (potencjalnie pusta) symboli terminalnych lub nieterminalnych
+
+;; Słowo (ciąg symboli terminalnych) możemy wyprowadzić z gramatyki,
+;; jeśli możemy zacząć od ciągu składającego się z symbolu startowego
+;; możemy użyć skończonej liczby produkcji z gramatyki przepisując
+;; symbol nieterminalny na ciąg symboli mu odpowiadających (w danej
+;; produkcji).
+
+
+;; Przykład: poprawne nawiasowania
+
+;; Gramatyka składa się z jednego symbolu nieterminalnego, S (który
+;; jest oczywiście symbolem startowym) i dwóch symboli terminalnych
+;; "(" i ")", i zawiera następujące produkcje (zwyczajowo zapisywane
+;; przy użyciu strzałki; zwróćcie uwagę że pierwszy ciąg jest pusty!):
+;; S ->
+;; S -> SS
+;; S -> (S)
+
+;; W często spotykanej, bardziej zwięzłej, postaci BNF moglibyśmy tę
+;; gramatykę zapisać tak (dbając trochę bardziej o wizualne
+;; oddzielenie symboli terminalnych i nieterminalnych):
+;; S ::= "" | SS | "(" S ")"
+;; Mamy tu te same produkcje, ale tylko raz zapisujemy każdą z
+;; powtarzających się lewych stron.
+
+;; Z gramatyki tej da się wyprowadzić wszystkie poprawnie rozstawione
+;; ciągi nawiasów — zobaczmy jak wyprowadzić (na jeden ze sposobów)
+;; ciąg "(()())". Zaczynamy, jak zawsze, od słowa złożonego z symbolu
+;; startowego i przepisujemy:
+;; S -> (S) -> (SS) -> ((S)S) -> ((S)(S)) -> (()(S)) -> (()())
+
+
+;; Zadanie cz. 1
+
+;; Zdefiniuj reprezentację gramatyki jako typu danych w
+;; Rackecie. Warto zastanowić się co można uprościć względem definicji
+;; matematycznej — w szczególności możemy założyć że dowolne napisy
+;; (typu string) są ciągami symboli terminalnych, i że nie musimy
+;; podawać jawnie zbioru nieterminali; również reprezentacja produkcji
+;; gramatyki jako worka z parami wejście-wyjście niekoniecznie jest
+;; najwygodniejsza.
+
+;; Uwaga: w tym zadaniu nie wymagamy definiowania składni konkretnej i
+;; parsowania, ale bardzo polecamy wybranie jakiejś formy, żeby móc
+;; sensownie przetestować swoje rozwiązanie!
+
+
+;; "Optymalizacja" gramatyk
+
+;; Gramatyki, podobnie jak programy, piszą ludzie — może więc zdarzyć
+;; się że znajdą się tam śmieci. Mogą one mieć dwojaką formę: symboli
+;; nieterminalnych, których nie da się wyprowadzić z symbolu
+;; startowego, lub symboli nieterminalnych z których nie da się
+;; wyprowadzić żadnego słowa terminalnego (tj. niezawierającego
+;; symboli nieterminalnych). Przykładowo, do naszej gramatyki
+;; moglibyśmy dodać symbole P i Q, i produkcje:
+;; S -> ")(" P
+;; P -> PP "qed"
+;; Q -> "abc"
+
+;; Mimo że nasza gramatyka wygląda inaczej na pierwszy rzut oka, tak
+;; naprawdę się nie zmieniła: do symbolu Q nie możemy dojść z symbolu
+;; S, a więc "abc" nigdy nie wystąpi w słowie wyprowadzalnym z
+;; gramatyki. Analogicznie, z P nie da się wyprowadzić żadnego słowa,
+;; które nie zawierałoby symbolu P — a zatem żadnego słowa złożonego
+;; tylko z symboli terminalnych. To znaczy, że naszą gramatykę możemy
+;; uprościć wyrzucając z niej symbole nieterminalne (i produkcje które
+;; ich używają) do których nie da się dojść (tj. są *nieosiągalne*) i
+;; te, z których nie da się ułożyć słowa terminalnego (tj. są
+;; *nieproduktywne*). Jeśli z naszej rozszerzonej gramatyki wyrzucimy
+;; takie symbole, dostaniemy oczywiście gramatykę początkową.
+
+
+;; Zadanie cz. 2
+
+;; Dla swojej reprezentacji gramatyki z poprzedniej części zadania
+;; napisz dwie procedury: cfg-unreachable, znajdującą symbole
+;; nieterminalne które są nieosiągalne z symbolu startowego, i
+;; cfg-unproductive, znajdującą symbole nieterminalne które nie są
+;; produktywne. Następnie użyj tych procedur żeby zdefiniować
+;; procedurę cfg-optimize, która uprości daną gramatykę usuwając z
+;; niej symbole nieosiągalne i nieproduktywne, a także odpowiednie
+;; produkcje.
+
+;; Rozwiązanie wpisz w poniższym pliku, i opatrz komentarzem
+;; opisującym wybraną reprezentację (i podjęte przy jej projektowaniu
+;; decyzje), a także zaimplementowane w cz. 2. algorytmy.
+
+
+
+
+
+
+;; Zadanie 1
+
+;; Postanowiłem napisać parser, bo bez tego zadanie wydaje mi się dosyć ubogie
+;; Składnia konkretna naszych gramatyk wygląda bardzo podobnie do zapisu
+;; przedstawionego w treści zadania.
+;; np. gramatyka nawiasowania będzie wyglądać następująco:
+;; '(grammar S (S ::= "" -- SS -- "(" S ")"))
+;; ale mogłaby wyglądać też tak:
+;; '(grammar S (S ::= "") (S ::= SS -- "(" S ")"))
+;; a np. ta nieciekawa gramatyka przedstawiona w treści zadania:
+;; '(grammar S (S ::= "] [" P) (P ::= PP "qed") (Q ::= "abc"))
+;; Zatem będzie to lista, która na pierwszym miejscu ma symbol 'grammar
+;; na drugim miejscu ma symbol startowy
+;; następnie następuje lista produkcji w formacie:
+;; <non-terminal> ::= <lista produkcji, produkcje oddzielone są separatorem -->
+;; Zalety:
+;; - rozróżnienie w składni konkretnej symboli nieterminalnych i terminalnych
+;; przez użycie symboli i stringów pozwala na to, aby symbole terminalne nazywały się tak
+;; jak terminalne, tj. "S" nie jest tym samym co 'S.
+;; - składnia wydaje się bardzo wygodna w użyciu, nie ma też problemu, żeby później dopisać
+;; dodatkowe produkcje dla jednego symbolu nieterminalnego, np. (S ::= "") (S ::= SS)
+;; - parser jest łatwy w implementacji
+;; Wady:
+;; - symbole nieterminalne mogą składać się jedynie z jednego symbolu, zatem nie możemy robić ich
+;; zbyt wiele
+
+;; Reprezentacja gramatyki: podczas parsowania gramatyki symbole i stringi wewnątrz produkcji
+;; reprezentowane są przez struktury terminal oraz non-terminal. Cała gramatyka to
+;; struktura dwuelementowa - pierwszym jest symbol startowy, a drugim lista par <symbol . produkcja>
+;; Taka decyzja właśnie pozwoliła na to, że zaproponowana przeze mnie składania konkretna jest
+;; bardzo prosta do sparsowania - wystarczy każdą produkcję podzielić ze względu na separator '--
+;; i do czegoś podobnego do środowisk dodawać po prostu odpowiednie pary.
+;; dla przykładu taka gramatyka:
+;; '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QS -- "[" Q "]"))
+;; będzie reprezentowana następująco:
+;; (grammar
+;; 'S
+;; (production
+;; (list
+;; (list 'S (terminal ""))
+;; (list 'S (non-terminal 'S) (non-terminal 'S))
+;; (list 'S (terminal "(") (non-terminal 'S) (terminal ")"))
+;; (list 'S (non-terminal 'Q))
+;; (list 'Q (terminal ""))
+;; (list 'Q (non-terminal 'Q) (non-terminal 'S))
+;; (list 'Q (terminal "[") (non-terminal 'Q) (terminal "]")))))
+;; Prosze zauważyć, że np. SS zostało zamienione na dwa sąsiednie nieterminalne symbole S
+;; (to właśnie powód, dlaczego symbole nieterminalne mogą być jedynie jednoznakowe).
+
+;; Zdecydowałem się dodać strukturę production, bo wtedy łatwo można na niej operować
+;; pisząc funkcje production-add, czy production-lookup itp.
+
+
+(struct non-terminal (sym) #:transparent)
+(struct terminal (sym) #:transparent)
+(struct grammar (start rules) #:transparent)
+
+(define SEPARATOR '--)
+
+(define (make-cfg q)
+ (cond
+ [(and (list? q) (eq? 'grammar (first q)))
+ (grammar (second q) (append-map make-cfg (cddr q)))]
+ [(and (list? q) (eq? '::= (second q)))
+ (let ([nt (first q)]
+ [rules (split-by-separator (cddr q))])
+ (map (lambda (x) (cons nt x)) (map make-rules rules)))]
+ [else (error "MAKE-CFG -- Parse error, unknown token" q)]))
+
+(define (make-cfg start rules)
+ (grammar start (make-rules rules)))
+
+(define (make-rules xs)
+ (cond
+ [(null? xs) null]
+ [(string? (car xs)) (cons (terminal (car xs)) (make-rules (cdr xs)))]
+ [(symbol? (car xs)) (append (map non-terminal (symbol->list (car xs))) (make-rules (cdr xs)))]
+ [else (error "Invalid syntax in production" xs)]))
+
+(define (split-at-symb symb xs)
+ (define (iter left right)
+ (cond
+ [(null? right) (cons left null)]
+ [(eq? symb (car right)) (cons left (cdr right))]
+ [else (iter (cons (car right) left) (cdr right))]))
+ (let ([res (iter null xs)])
+ (cons (reverse (car res)) (cdr res))))
+
+(define (split-by-separator xs)
+ (let ([res (split-at-symb SEPARATOR xs)])
+ (if (null? (cdr res))
+ res
+ (cons (car res) (split-by-separator (cdr res))))))
+
+(define (symbol->list s)
+ (map string->symbol
+ (map string
+ (string->list (symbol->string s)))))
+
+(define sample '(S ::= "" -- SS -- "(" S ")"))
+(define sample2 '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QQ -- "[" Q "]")))
+(define sample3 '(grammar S
+ (S ::= A B -- D E)
+ (A ::= "a")
+ (B ::= "b" C)
+ (C ::= "c")
+ (D ::= "d" F)
+ (E ::= "e")
+ (F ::= "f" D)))
+
+;; zadanie 2
+
+;; korzystam z algorytmów przedstawionych w tej książce:
+;; https://bit.ly/3ev0NUA, konkretnie te ze stron 50-51
+;; Pozwoliłem sobie trochę zmienić przeznaczenie funkcji cfg-unreachable oraz cfg-unproductive
+;; Zamiast zwracać nieproduktywne nieterminale, zwracają właśnie produktywne
+;; i analogicznie w tym drugim. Po prostu taka implementacja jest dla mnie wygodniejsza,
+;; a jest bardzo nieistotną zmianą koncepcyjną.
+;; Stąd zmiana nazwy na cfg-productive oraz cfg-reachable
+
+;; cfg-productive działa w ten sposób:
+;; Jakiś nieterminal nazywamy produktywnym, jeśli ma co najmniej jedną produktywną zasadę
+;; Jakąś zasadę nazywamy produktywną, jeśli składa się z terminali oraz produktywnych nieterminali
+;; Jasno widać, że wg tej definicji te nieterminale, które nie są produktywne, są nieproduktywne
+;; wg definicji zadania, a cała reszta jest produktwna.
+
+;; Algorytm znajdowania produktywnych nieterminali:
+;; Mamy listę produktywnych nieterminali P, początkowo pustą
+;; 1. Stwórz nową listę P'
+;; 2. Przejdź po liście produkcji
+;; -> jeśli dana produkcja jest produktywna (wg P), dodaj jej nieterminal do P'
+;; 3. Jeśli P != P', zrób P := P' i wróć do 1.
+;; 4. Zwróć P
+
+;; Fajne w tym algorytmie jest to, że jeśli mamy jakiś nieterminal, którego
+;; używamy w jakiejś produkcji, ale ten nieterminal nie ma zdefiniowanej swojej produkcji
+;; to nie zostanie oznaczony jako produktywny, co jest dla nas korzystne
+
+;; Algorytm znajdowania osiągalnych nieterminali:
+;; Traktujemy nitereminale jak wierzchołki w grafie a zasady jako listy sąsiedztwa.
+;; Terminale są liśćmi, a nieterminale węzłami. Robimy po prostu DFSa z nieterminalu
+;; startowego i węzły do których dotrzemy oznaczamy jako osiągalne.
+
+;; Wg papierka który tutaj podałem, jeśli najpierw usuniemy nieproduktywne nieterminale,
+;; a w następnej kolejności nieosiągalne, to nasza gramatyka stanie się regularna.
+
+(define (productive? p productive-nt)
+ (or (terminal? p) (member (non-terminal-sym p) productive-nt)))
+(define (rule-productive? r productive-nt)
+ (andmap (lambda (x) (productive? x productive-nt)) r))
+
+(define (cfg-productive g)
+ (define (find-productive-nt productive-nt rules)
+ (cond
+ [(null? rules) (remove-duplicates productive-nt)]
+ [(rule-productive? (cdar rules) productive-nt)
+ (find-productive-nt (cons (caar rules) productive-nt) (cdr rules))]
+ [else (find-productive-nt productive-nt (cdr rules))]))
+ (define (iter productive-nt)
+ (let ([new-prod-nt (find-productive-nt productive-nt (grammar-rules g))])
+ (if (equal? productive-nt new-prod-nt)
+ productive-nt
+ (iter new-prod-nt))))
+ (iter null))
+
+(define (cfg-reachable g)
+ (define (iter verts vis)
+ (cond
+ [(null? verts) vis]
+ [(member (car verts) vis) (iter (cdr verts) vis)]
+ [else (iter (cdr verts) (dfs (car verts) vis))]))
+ (define (dfs v vis)
+ (display v)
+ (newline)
+ (let* ([rules (filter (lambda (r) (eq? (car r) v)) (grammar-rules g))]
+ [verts (append-map (lambda (r) (cdr r)) rules)]
+ [verts (filter non-terminal? verts)]
+ [verts (map non-terminal-sym verts)])
+ (iter verts (cons v vis))))
+ (dfs (grammar-start g) null))
+
+(define (cfg-optimize g)
+ (let* ([productive-nt (cfg-productive g)]
+ [productive-rules (filter (lambda (r)
+ (rule-productive? (cdr r) productive-nt))
+ (grammar-rules g))]
+ [new-g (grammar (grammar-start g) productive-rules)]
+ [reachable-nt (cfg-reachable new-g)]
+ [res-g (grammar (grammar-start new-g) (filter
+ (lambda (r) (member (car r) reachable-nt))
+ (grammar-rules new-g)))])
+ res-g))
+ \ No newline at end of file
diff --git a/semestr-2/racket/l10z18/solution.bak b/semestr-2/racket/l10z18/solution.bak
new file mode 100644
index 0000000..02eb770
--- /dev/null
+++ b/semestr-2/racket/l10z18/solution.bak
@@ -0,0 +1,363 @@
+#lang racket
+
+;; Składnia abstrakcyjna
+(struct const (val) #:transparent)
+(struct var-expr (name) #:transparent)
+(struct let-expr (id bound body) #:transparent)
+(struct letrec-expr (id bound body) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+(struct lambda-expr (arg body) #:transparent)
+(struct app-expr (fun arg) #:transparent)
+
+(define (keyword s)
+ (member s '(true false null and or if cond else lambda let letrec)))
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n)
+ (boolean? n)
+ (null? n)
+ (string? n))]
+ [(var-expr id) (symbol? id)]
+ [(let-expr x e1 e2 ) (and (symbol? x)
+ (expr? e1)
+ (expr? e2))]
+ [(letrec-expr x e1 e2) (and (symbol? x)
+ (expr? e1)
+ (expr? e2))]
+ [(if-expr eb et ef) (and (expr? eb)
+ (expr? et)
+ (expr? ef))]
+ [(lambda-expr x e) (and (symbol? x)
+ (expr? e))]
+ [(app-expr ef ea) (and (expr? ef)
+ (expr? ea))]
+ [_ false]))
+
+;; Parsowanie (zacytowane wyrażenie -> składnia abstrakcyjna)
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(string? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(eq? q 'null) (const null)]
+ [(and (symbol? q)
+ (not (keyword q)))
+ (var-expr q)]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'let)
+ (list? (second q))
+ (= (length (second q)) 2)
+ (symbol? (first (second q))))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'letrec)
+ (list? (second q))
+ (= (length (second q)) 2)
+ (symbol? (first (second q))))
+ (letrec-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q)
+ (= (length q) 4)
+ (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q)
+ (pair? q)
+ (eq? (first q) 'and))
+ (desugar-and (map parse (cdr q)))]
+ [(and (list? q)
+ (pair? q)
+ (eq? (first q) 'or))
+ (desugar-or (map parse (cdr q)))]
+ [(and (list? q)
+ (>= (length q) 2)
+ (eq? (first q) 'cond))
+ (parse-cond (cdr q))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'lambda)
+ (list? (second q))
+ (andmap symbol? (second q))
+ (cons? (second q)))
+ (desugar-lambda (second q) (parse (third q)))]
+ [(and (list? q)
+ (>= (length q) 2))
+ (desugar-app (parse (first q)) (map parse (cdr q)))]
+ [else (error "Unrecognized token:" q)]))
+
+(define (parse-cond qs)
+ (match qs
+ [(list (list 'else q))
+ (parse q)]
+
+ [(list (list q _))
+ (error "Expected 'else' in last branch but found:" q)]
+
+ [(cons (list qb qt) qs)
+ (if-expr (parse qb) (parse qt) (parse-cond qs))]))
+
+(define (desugar-and es)
+ (if (null? es)
+ (const true)
+ (if-expr (car es) (desugar-and (cdr es)) (const false))))
+
+(define (desugar-or es)
+ (if (null? es)
+ (const false)
+ (if-expr (car es) (const true) (desugar-or (cdr es)))))
+
+(define (desugar-lambda xs e)
+ (if (null? xs)
+ e
+ (lambda-expr (car xs) (desugar-lambda (cdr xs) e))))
+
+(define (desugar-app e es)
+ (if (null? es)
+ e
+ (desugar-app (app-expr e (car es)) (cdr es))))
+
+;; Środowiska
+(struct blackhole ())
+(struct environ (xs))
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (mcons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs)
+ (error "Unknown identifier" x)]
+ [(eq? x (mcar (car xs)))
+ (let ((v (mcdr (car xs))))
+ (if (blackhole? v)
+ (error "Jumped into blackhole at" x)
+ v))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+(define (env-update! x v env)
+ (define (assoc-update xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (mcar (car xs)))
+ (set-mcdr! (car xs) v)]
+ [else (assoc-update (cdr xs))]))
+ (assoc-update (environ-xs env)))
+
+;; Domknięcia
+(struct clo (arg body env))
+
+;; Procedury wbudowane, gdzie
+;; proc — Racketowa procedura którą należy uruchomić
+;; args — lista dotychczas dostarczonych argumentów
+;; pnum — liczba brakujących argumentów (> 0)
+;; W ten sposób pozwalamy na częściową aplikację Racketowych procedur
+;; — zauważmy że zawsze znamy pnum, bo w naszym języku arność
+;; procedury jest ustalona z góry
+(struct builtin (proc args pnum) #:transparent)
+
+;; Pomocnicze konstruktory procedur unarnych i binarnych
+(define (builtin/1 p)
+ (builtin (lambda (x) (return (p x))) null 1))
+(define (builtin/2 p)
+ (builtin (lambda (x y) (return (p x y))) null 2))
+
+;; Procedury
+(define (proc? v)
+ (or (and (clo? v)
+ (symbol? (clo-arg v))
+ (expr? (clo-body v))
+ (environ? (clo-env v)))
+ (and (builtin? v)
+ (procedure? (builtin-proc v))
+ (andmap value? (builtin-args v))
+ (natural? (builtin-pnum v))
+ (> (builtin-pnum v) 0))))
+
+;; Definicja typu wartości
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (null? v)
+ (string? v)
+ (and (cons? v)
+ (value? (car v))
+ (value? (cdr v)))
+ (proc? v)))
+
+;; Środowisko początkowe (przypisujące procedury wbudowane ich nazwom)
+
+(define start-env
+ (foldl (lambda (p env) (env-add (first p) (second p) env))
+ env-empty
+ `((+ ,(builtin/2 +))
+ (- ,(builtin/2 -))
+ (* ,(builtin/2 *))
+ (/ ,(builtin/2 /))
+ (~ ,(builtin/1 -))
+ (< ,(builtin/2 <))
+ (> ,(builtin/2 >))
+ (= ,(builtin/2 =))
+ (<= ,(builtin/2 <=))
+ (>= ,(builtin/2 >=))
+ (not ,(builtin/1 not))
+ (cons ,(builtin/2 cons))
+ (car ,(builtin/1 car))
+ (cdr ,(builtin/1 cdr))
+ (pair? ,(builtin/1 cons?))
+ (null? ,(builtin/1 null?))
+ (boolean? ,(builtin/1 boolean?))
+ (number? ,(builtin/1 number?))
+ (procedure? ,(builtin/1 (lambda (x) (or (clo? x) (builtin? x)))))
+ (string? ,(builtin/1 string?))
+ (string-= ,(builtin/2 string=?))
+ ;; and so on, and so on
+ )))
+
+;; Efekt
+
+(define (effect-builtin/1 p)
+ (builtin p null 1))
+(define (effect-builtin/2 p)
+ (builtin p null 2))
+
+(define effect-env
+ (foldl (lambda (p env) (env-add (first p) (second p) env))
+ start-env
+ `((choose ,(effect-builtin/2 (lambda (x y) (list x y))))
+ )))
+
+(define (bind c k) (append-map k c))
+
+(define (return x) (list x))
+
+;; Ewaluator
+(define (eval-env e env)
+ (match e
+ [(const n)
+ (return n)]
+
+ [(var-expr x)
+ (return (env-lookup x env))]
+
+ [(let-expr x e1 e2)
+ (bind (eval-env e1 env) (lambda (v1)
+ (eval-env e2 (env-add x v1 env))))]
+
+ [(letrec-expr f ef eb)
+ (let ((new-env (env-add f (blackhole) env)))
+ (bind (eval-env ef new-env) (lambda (vf)
+ (env-update! f vf new-env)
+ (eval-env eb new-env))))]
+
+ [(if-expr eb et ef)
+ (bind (eval-env eb env) (lambda (vb)
+ (match vb
+ [#t (eval-env et env)]
+ [#f (eval-env ef env)]
+ [v (error "Not a boolean:" v)])))]
+
+ [(lambda-expr x e)
+ (return (clo x e env))]
+
+ [(app-expr ef ea)
+ (bind (eval-env ef env) (lambda (vf)
+ (bind (eval-env ea env) (lambda (va)
+ (match vf
+ [(clo x e env)
+ (eval-env e (env-add x va env))]
+ [(builtin p args nm)
+ (if (= nm 1)
+ (apply p (reverse (cons va args)))
+ (return (builtin p (cons va args) (- nm 1))))]
+ [_ (error "Not a function:" vf)])))))]))
+
+(define (eval e)
+ (eval-env e effect-env))
+
+
+;; Przykladowy program
+
+(define PROGRAM
+ '((if (choose true false) (lambda (x) x) (lambda (x) (+ x 1))) (choose 1 2)))
+
+
+;; REPL — interpreter interaktywny (read-eval-print loop)
+
+;; dodajemy składnię na wiązanie zmiennych "na poziomie interpretera"
+;; i komendę wyjścia "exit" ...
+(struct letrec-repl (id expr))
+(struct let-repl (id expr))
+(struct exit-repl ())
+
+;; ... a także rozszerzoną procedurę parsującą te dodatkowe komendy i
+;; prostą obsługę błędów
+(define (parse-repl q)
+ (with-handlers
+ ([exn? (lambda (exn)
+ (display "Parse error! ")
+ (displayln (exn-message exn)))])
+ (cond
+ [(eq? q 'exit) (exit-repl)]
+ [(and (list? q)
+ (= 3 (length q))
+ (eq? (first q) 'let))
+ (let-repl (second q) (parse (third q)))]
+ [(and (list? q)
+ (= 3 (length q))
+ (eq? (first q) 'letrec))
+ (letrec-repl (second q) (parse (third q)))]
+ [else (parse q)])))
+
+;; trochę zamieszania w procedurze eval-repl wynika z rudymentarnej
+;; obsługi błędów: nie chcemy żeby błąd w interpretowanym programie
+;; kończył działanie całego interpretera!
+(define (eval-repl c env continue)
+ (define (eval-with-err e env)
+ (with-handlers
+ ([exn? (lambda (exn)
+ (display "Error! ")
+ (displayln (exn-message exn)))])
+ (eval-env e env)))
+ (match c
+ [(exit-repl)
+ (void)]
+
+ [(let-repl x e)
+ (let ((v (eval-with-err e env)))
+ (if (void? v)
+ (continue env)
+ (continue (env-add x v env))))]
+
+ [(letrec-repl f e)
+ (let* ((new-env (env-add f (blackhole) env))
+ (v (eval-with-err e new-env)))
+ (if (void? v)
+ (continue env)
+ (begin
+ (env-update! f v new-env)
+ (continue new-env))))]
+
+ [_
+ (let ((v (eval-with-err c env)))
+ (unless (void? v)
+ (displayln v))
+ (continue env))]))
+
+;; I w końcu interaktywny interpreter
+(define (repl)
+ (define (go env)
+ (display "FUN > ")
+ (let* ((q (read))
+ (c (parse-repl q)))
+ (if (void? c)
+ (go env)
+ (eval-repl c env go))))
+ (displayln "Welcome to the FUN functional language interpreter!")
+ (go start-env)) \ No newline at end of file
diff --git a/semestr-2/racket/l10z18/solution.rkt b/semestr-2/racket/l10z18/solution.rkt
new file mode 100644
index 0000000..7adcea4
--- /dev/null
+++ b/semestr-2/racket/l10z18/solution.rkt
@@ -0,0 +1,409 @@
+#lang racket
+
+;; Składnia abstrakcyjna
+(struct const (val) #:transparent)
+(struct var-expr (name) #:transparent)
+(struct let-expr (id bound body) #:transparent)
+(struct letrec-expr (id bound body) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+(struct lambda-expr (arg body) #:transparent)
+(struct app-expr (fun arg) #:transparent)
+
+(provide parse eval norm)
+
+(define (keyword s)
+ (member s '(true false null and or if cond else lambda let letrec)))
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n)
+ (boolean? n)
+ (null? n)
+ (string? n))]
+ [(var-expr id) (symbol? id)]
+ [(let-expr x e1 e2 ) (and (symbol? x)
+ (expr? e1)
+ (expr? e2))]
+ [(letrec-expr x e1 e2) (and (symbol? x)
+ (expr? e1)
+ (expr? e2))]
+ [(if-expr eb et ef) (and (expr? eb)
+ (expr? et)
+ (expr? ef))]
+ [(lambda-expr x e) (and (symbol? x)
+ (expr? e))]
+ [(app-expr ef ea) (and (expr? ef)
+ (expr? ea))]
+ [_ false]))
+
+;; Parsowanie (zacytowane wyrażenie -> składnia abstrakcyjna)
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(string? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(eq? q 'null) (const null)]
+ [(and (symbol? q)
+ (not (keyword q)))
+ (var-expr q)]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'let)
+ (list? (second q))
+ (= (length (second q)) 2)
+ (symbol? (first (second q))))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'letrec)
+ (list? (second q))
+ (= (length (second q)) 2)
+ (symbol? (first (second q))))
+ (letrec-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q)
+ (= (length q) 4)
+ (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q)
+ (pair? q)
+ (eq? (first q) 'and))
+ (desugar-and (map parse (cdr q)))]
+ [(and (list? q)
+ (pair? q)
+ (eq? (first q) 'or))
+ (desugar-or (map parse (cdr q)))]
+ [(and (list? q)
+ (>= (length q) 2)
+ (eq? (first q) 'cond))
+ (parse-cond (cdr q))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'lambda)
+ (list? (second q))
+ (andmap symbol? (second q))
+ (cons? (second q)))
+ (desugar-lambda (second q) (parse (third q)))]
+ [(and (list? q)
+ (>= (length q) 2))
+ (desugar-app (parse (first q)) (map parse (cdr q)))]
+ [else (error "Unrecognized token:" q)]))
+
+(define (parse-cond qs)
+ (match qs
+ [(list (list 'else q))
+ (parse q)]
+
+ [(list (list q _))
+ (error "Expected 'else' in last branch but found:" q)]
+
+ [(cons (list qb qt) qs)
+ (if-expr (parse qb) (parse qt) (parse-cond qs))]))
+
+(define (desugar-and es)
+ (if (null? es)
+ (const true)
+ (if-expr (car es) (desugar-and (cdr es)) (const false))))
+
+(define (desugar-or es)
+ (if (null? es)
+ (const false)
+ (if-expr (car es) (const true) (desugar-or (cdr es)))))
+
+(define (desugar-lambda xs e)
+ (if (null? xs)
+ e
+ (lambda-expr (car xs) (desugar-lambda (cdr xs) e))))
+
+(define (desugar-app e es)
+ (if (null? es)
+ e
+ (desugar-app (app-expr e (car es)) (cdr es))))
+
+;; Środowiska
+(struct blackhole ())
+(struct environ (xs))
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (mcons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs)
+ (error "Unknown identifier" x)]
+ [(eq? x (mcar (car xs)))
+ (let ((v (mcdr (car xs))))
+ (if (blackhole? v)
+ (error "Jumped into blackhole at" x)
+ v))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+(define (env-update! x v env)
+ (define (assoc-update xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (mcar (car xs)))
+ (set-mcdr! (car xs) v)]
+ [else (assoc-update (cdr xs))]))
+ (assoc-update (environ-xs env)))
+
+;; Domknięcia
+(struct clo (arg body env))
+
+;; Procedury wbudowane, gdzie
+;; proc — Racketowa procedura którą należy uruchomić
+;; args — lista dotychczas dostarczonych argumentów
+;; pnum — liczba brakujących argumentów (> 0)
+;; W ten sposób pozwalamy na częściową aplikację Racketowych procedur
+;; — zauważmy że zawsze znamy pnum, bo w naszym języku arność
+;; procedury jest ustalona z góry
+(struct builtin (proc args pnum) #:transparent)
+
+;; Pomocnicze konstruktory procedur unarnych i binarnych
+(define (builtin/1 p)
+ (builtin (lambda (x) (return (p x))) null 1))
+(define (builtin/2 p)
+ (builtin (lambda (x y) (return (p x y))) null 2))
+
+;; Procedury
+(define (proc? v)
+ (or (and (clo? v)
+ (symbol? (clo-arg v))
+ (expr? (clo-body v))
+ (environ? (clo-env v)))
+ (and (builtin? v)
+ (procedure? (builtin-proc v))
+ (andmap value? (builtin-args v))
+ (natural? (builtin-pnum v))
+ (> (builtin-pnum v) 0))))
+
+;; Definicja typu wartości
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (null? v)
+ (string? v)
+ (and (cons? v)
+ (value? (car v))
+ (value? (cdr v)))
+ (proc? v)))
+
+;; Środowisko początkowe (przypisujące procedury wbudowane ich nazwom)
+
+(define start-env
+ (foldl (lambda (p env) (env-add (first p) (second p) env))
+ env-empty
+ `((+ ,(builtin/2 +))
+ (- ,(builtin/2 -))
+ (* ,(builtin/2 *))
+ (/ ,(builtin/2 /))
+ (~ ,(builtin/1 -))
+ (< ,(builtin/2 <))
+ (> ,(builtin/2 >))
+ (= ,(builtin/2 =))
+ (<= ,(builtin/2 <=))
+ (>= ,(builtin/2 >=))
+ (not ,(builtin/1 not))
+ (cons ,(builtin/2 cons))
+ (car ,(builtin/1 car))
+ (cdr ,(builtin/1 cdr))
+ (pair? ,(builtin/1 cons?))
+ (null? ,(builtin/1 null?))
+ (boolean? ,(builtin/1 boolean?))
+ (number? ,(builtin/1 number?))
+ (procedure? ,(builtin/1 (lambda (x) (or (clo? x) (builtin? x)))))
+ (string? ,(builtin/1 string?))
+ (string-= ,(builtin/2 string=?))
+ ;; and so on, and so on
+ )))
+
+;; Efekt
+
+(define (effect-builtin/1 p)
+ (builtin p null 1))
+(define (effect-builtin/2 p)
+ (builtin p null 2))
+(define (effect-builtin/3 p)
+ (builtin p null 3))
+
+
+(define effect-env
+ (foldl (lambda (p env) (env-add (first p) (second p) env))
+ start-env
+ `((flip ,(effect-builtin/3 (lambda (p x y) (list (cons p x) (cons (- 1 p) y)))))
+ (uniform ,(effect-builtin/1 (lambda (x) (let ((l (/ 1 (length x))))
+ (map (lambda (x) (cons l x)) x)))))
+ )))
+
+;; c to lista par (pstwo, wartość)
+;; k to funkcja która przyjmuje wartość i coś z nią robi sobie i zwraca listę par (pstwo, wartość)
+
+(define (bind c k)
+ (append-map
+ (lambda (x) (let ((pstwo (car x))
+ (val (cdr x)))
+ (map
+ (lambda (x) (cons (* pstwo (car x)) (cdr x)))
+ (k (cdr x)))))
+ c))
+
+(define (return x) (list (cons 1 x)))
+
+;; Ewaluator
+(define (eval-env e env)
+ (match e
+ [(const n)
+ (return n)]
+
+ [(var-expr x)
+ (return (env-lookup x env))]
+
+ [(let-expr x e1 e2)
+ (bind (eval-env e1 env) (lambda (v1)
+ (eval-env e2 (env-add x v1 env))))]
+
+ [(letrec-expr f ef eb)
+ (let ((new-env (env-add f (blackhole) env)))
+ (bind (eval-env ef new-env) (lambda (vf)
+ (env-update! f vf new-env)
+ (eval-env eb new-env))))]
+
+ [(if-expr eb et ef)
+ (bind (eval-env eb env) (lambda (vb)
+ (match vb
+ [#t (eval-env et env)]
+ [#f (eval-env ef env)]
+ [v (error "Not a boolean:" v)])))]
+
+ [(lambda-expr x e)
+ (return (clo x e env))]
+
+ [(app-expr ef ea)
+ (bind (eval-env ef env) (lambda (vf)
+ (bind (eval-env ea env) (lambda (va)
+ (match vf
+ [(clo x e env)
+ (eval-env e (env-add x va env))]
+ [(builtin p args nm)
+ (if (= nm 1)
+ (apply p (reverse (cons va args)))
+ (return (builtin p (cons va args) (- nm 1))))]
+ [_ (error "Not a function:" vf)])))))]))
+
+(define (eval e)
+ (eval-env e effect-env))
+
+
+;; Przykladowy program
+
+(define PROGRAM
+ '((if (choose true false) (lambda (x) x) (lambda (x) (+ x 1))) (choose 1 2)))
+
+
+;; REPL — interpreter interaktywny (read-eval-print loop)
+
+;; dodajemy składnię na wiązanie zmiennych "na poziomie interpretera"
+;; i komendę wyjścia "exit" ...
+(struct letrec-repl (id expr))
+(struct let-repl (id expr))
+(struct exit-repl ())
+
+;; ... a także rozszerzoną procedurę parsującą te dodatkowe komendy i
+;; prostą obsługę błędów
+(define (parse-repl q)
+ (with-handlers
+ ([exn? (lambda (exn)
+ (display "Parse error! ")
+ (displayln (exn-message exn)))])
+ (cond
+ [(eq? q 'exit) (exit-repl)]
+ [(and (list? q)
+ (= 3 (length q))
+ (eq? (first q) 'let))
+ (let-repl (second q) (parse (third q)))]
+ [(and (list? q)
+ (= 3 (length q))
+ (eq? (first q) 'letrec))
+ (letrec-repl (second q) (parse (third q)))]
+ [else (parse q)])))
+
+;; trochę zamieszania w procedurze eval-repl wynika z rudymentarnej
+;; obsługi błędów: nie chcemy żeby błąd w interpretowanym programie
+;; kończył działanie całego interpretera!
+(define (eval-repl c env continue)
+ (define (eval-with-err e env)
+ (with-handlers
+ ([exn? (lambda (exn)
+ (display "Error! ")
+ (displayln (exn-message exn)))])
+ (eval-env e env)))
+ (match c
+ [(exit-repl)
+ (void)]
+
+ [(let-repl x e)
+ (let ((v (eval-with-err e env)))
+ (if (void? v)
+ (continue env)
+ (continue (env-add x v env))))]
+
+ [(letrec-repl f e)
+ (let* ((new-env (env-add f (blackhole) env))
+ (v (eval-with-err e new-env)))
+ (if (void? v)
+ (continue env)
+ (begin
+ (env-update! f v new-env)
+ (continue new-env))))]
+
+ [_
+ (let ((v (eval-with-err c env)))
+ (unless (void? v)
+ (displayln v))
+ (continue env))]))
+
+;; I w końcu interaktywny interpreter
+(define (repl)
+ (define (go env)
+ (display "FUN > ")
+ (let* ((q (read))
+ (c (parse-repl q)))
+ (if (void? c)
+ (go env)
+ (eval-repl c env go))))
+ (displayln "Welcome to the FUN functional language interpreter!")
+ (go start-env))
+
+
+(define prog '(if (flip 0.3 true false) "wygrana" "przegrana"))
+
+
+(define (norm xs)
+ (define sum (lambda (xs) (foldl + 0 xs)))
+ (define carlist (lambda (xs) (map car xs)))
+ (define (iter xs res)
+ (cond
+ [(null? xs) res]
+ [(member (cdar xs) (map cdr res)) (iter (cdr xs) res)]
+ [else (let* ((cur (cdar xs))
+ (pstwa (filter (lambda (x) (equal? (cdr x) cur)) xs)))
+ (iter (cdr xs) (cons (cons (sum (carlist pstwa)) cur) res)))]))
+ (iter xs null))
+
+
+(define DICE-MANY
+ '(letrec [from-to (lambda (x n)
+ (cons x
+ (if (= x n)
+ null
+ (from-to (+ 1 x) n))))]
+ (let [dice (lambda (x) (uniform (from-to 1 6)))]
+ (letrec [dice-many (lambda (n) (if (= n 0)
+ 0
+ (+ (dice 0) (dice-many (- n 1)))))]
+ (dice-many (dice 0)))))) \ No newline at end of file
diff --git a/semestr-2/racket/l11/rozw.bak b/semestr-2/racket/l11/rozw.bak
new file mode 100644
index 0000000..cda82ce
--- /dev/null
+++ b/semestr-2/racket/l11/rozw.bak
@@ -0,0 +1,2 @@
+#lang racket
+
diff --git a/semestr-2/racket/l11/rozw.rkt b/semestr-2/racket/l11/rozw.rkt
new file mode 100644
index 0000000..e45e403
--- /dev/null
+++ b/semestr-2/racket/l11/rozw.rkt
@@ -0,0 +1,776 @@
+#reader(lib"read.ss""wxme")WXME0109 ##
+#|
+ This file uses the GRacket editor format.
+ Open this file in DrRacket version 7.6 or later to read it.
+
+ Most likely, it was created by saving a program in DrRacket,
+ and it probably contains a program with non-text elements
+ (such as images or comment boxes).
+
+ http://racket-lang.org/
+|#
+ 33 7 #"wxtext\0"
+3 1 6 #"wxtab\0"
+1 1 8 #"wximage\0"
+2 0 8 #"wxmedia\0"
+4 1 34 #"(lib \"syntax-browser.ss\" \"mrlib\")\0"
+1 0 36 #"(lib \"cache-image-snip.ss\" \"mrlib\")\0"
+1 0 68
+(0
+ #"((lib \"image-core.ss\" \"mrlib\") (lib \"image-core-wxme.rkt\" \"mr"
+ #"lib\"))\0"
+) 1 0 16 #"drscheme:number\0"
+3 0 44 #"(lib \"number-snip.ss\" \"drscheme\" \"private\")\0"
+1 0 36 #"(lib \"comment-snip.ss\" \"framework\")\0"
+1 0 93
+(1
+ #"((lib \"collapsed-snipclass.ss\" \"framework\") (lib \"collapsed-sni"
+ #"pclass-wxme.ss\" \"framework\"))\0"
+) 0 0 43 #"(lib \"collapsed-snipclass.ss\" \"framework\")\0"
+0 0 19 #"drscheme:sexp-snip\0"
+0 0 29 #"drscheme:bindings-snipclass%\0"
+1 0 101
+(2
+ #"((lib \"ellipsis-snip.rkt\" \"drracket\" \"private\") (lib \"ellipsi"
+ #"s-snip-wxme.rkt\" \"drracket\" \"private\"))\0"
+) 2 0 88
+(3
+ #"((lib \"pict-snip.rkt\" \"drracket\" \"private\") (lib \"pict-snip.r"
+ #"kt\" \"drracket\" \"private\"))\0"
+) 0 0 55
+#"((lib \"snip.rkt\" \"pict\") (lib \"snip-wxme.rkt\" \"pict\"))\0"
+1 0 34 #"(lib \"bullet-snip.rkt\" \"browser\")\0"
+0 0 25 #"(lib \"matrix.ss\" \"htdp\")\0"
+1 0 22 #"drscheme:lambda-snip%\0"
+1 0 29 #"drclickable-string-snipclass\0"
+0 0 26 #"drracket:spacer-snipclass\0"
+0 0 57
+#"(lib \"hrule-snip.rkt\" \"macro-debugger\" \"syntax-browser\")\0"
+1 0 26 #"drscheme:pict-value-snip%\0"
+0 0 45 #"(lib \"image-snipr.ss\" \"slideshow\" \"private\")\0"
+1 0 38 #"(lib \"pict-snipclass.ss\" \"slideshow\")\0"
+2 0 55 #"(lib \"vertical-separator-snip.ss\" \"stepper\" \"private\")\0"
+1 0 18 #"drscheme:xml-snip\0"
+1 0 31 #"(lib \"xml-snipclass.ss\" \"xml\")\0"
+1 0 21 #"drscheme:scheme-snip\0"
+2 0 34 #"(lib \"scheme-snipclass.ss\" \"xml\")\0"
+1 0 10 #"text-box%\0"
+1 0 32 #"(lib \"text-snipclass.ss\" \"xml\")\0"
+1 0 1 6 #"wxloc\0"
+ 0 0 81 0 1 #"\0"
+0 75 1 #"\0"
+0 10 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 0 9
+#"Standard\0"
+0 75 12 #"Courier New\0"
+0 16 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 -1 -1 2 24
+#"framework:default-color\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 2
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 150 0 150 0 0 0 -1 -1 2 15
+#"text:ports out\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 34 119 34 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 255 0 0 0 0 0 -1
+-1 2 15 #"text:ports err\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 204 204 0 0 0 -1 -1 2
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 175 0 0 0 -1 -1 2 17
+#"text:ports value\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2
+1 #"\0"
+0 -1 1 #"\0"
+1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1
+-1 2 27 #"Matching Parenthesis Style\0"
+0 -1 1 #"\0"
+1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1
+-1 2 1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 37
+#"framework:syntax-color:scheme:symbol\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2
+38 #"framework:syntax-color:scheme:keyword\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2
+38 #"framework:syntax-color:scheme:comment\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 204 221 170 0 0 0 -1 -1 2
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 37
+#"framework:syntax-color:scheme:string\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2
+35 #"framework:syntax-color:scheme:text\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2
+39 #"framework:syntax-color:scheme:constant\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 49
+#"framework:syntax-color:scheme:hash-colon-keyword\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2
+42 #"framework:syntax-color:scheme:parenthesis\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 178 178 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 36
+#"framework:syntax-color:scheme:error\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 204 204 0 0 0 -1 -1 2
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 36
+#"framework:syntax-color:scheme:other\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2
+16 #"Misspelled Text\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 2
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 81 112 203 0 0 0 -1 -1 2
+38 #"drracket:check-syntax:lexically-bound\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 50 163 255 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 28
+#"drracket:check-syntax:set!d\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 204 204 0 0 0 -1 -1 2
+37 #"drracket:check-syntax:unused-require\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 204 204 0 0 0 -1 -1 2
+36 #"drracket:check-syntax:free-variable\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 204 204 0 0 0 -1 -1 2
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 68 0 203 0 0 0 -1 -1 2 31
+#"drracket:check-syntax:imported\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 166 0 255 0 0 0 -1 -1 2 47
+#"drracket:check-syntax:my-obligation-style-pref\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 192 203 0 0 0 -1 -1 2
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 116 0 0 0 0 -1 -1 2 50
+#"drracket:check-syntax:their-obligation-style-pref\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 50 205 50 0 0 0 -1 -1 2 48
+#"drracket:check-syntax:unk-obligation-style-pref\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 2
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 139 142 28 0 0 0 -1 -1 2
+49 #"drracket:check-syntax:both-obligation-style-pref\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 240 230 140 0 0 0 -1 -1 2
+26 #"plt:htdp:test-coverage-on\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 2
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 2 27
+#"plt:htdp:test-coverage-off\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 205 92 92 0 0 0 -1 -1 4 1
+#"\0"
+0 70 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0
+-1 -1 4 4 #"XML\0"
+0 70 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0
+-1 -1 2 37 #"plt:module-language:test-coverage-on\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 2
+38 #"plt:module-language:test-coverage-off\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 205 92 92 0 0 0 -1 -1 0 36
+#"mrlib/syntax-browser:subtitle-color\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 100 149 237 0 0 0 -1 -1 0
+42 #"mrlib/syntax-browser:focused-syntax-color\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 50 205 50 0 0 0 -1 -1 4 1
+#"\0"
+0 71 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0
+-1 -1 4 1 #"\0"
+0 -1 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 191 255 0 0 0 -1
+-1 4 1 #"\0"
+0 71 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 191 255 0 0 0 -1
+-1 4 1 #"\0"
+0 71 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 152 251 152 0 0 0
+-1 -1 4 32 #"widget.rkt::browser-text% basic\0"
+0 70 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0
+-1 -1 4 59
+#"macro-debugger/syntax-browser/properties color-text% basic\0"
+0 70 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0
+-1 -1 58 1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 190 190 190 0 0 0 -1 -1 2
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 200 0 0 0 0 0 -1 -1 4 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 4
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 4 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 255 0 0 0 -1 -1 4 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 185 220 113 0 0 0 -1 -1 4
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 155 255 155 0 0 0 -1 -1 4
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 116 116 0 0 0 -1 -1 4
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 18 67 155 0 0 0 -1 -1 4 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 30 70 190 0 0 0 -1 -1 4 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 75 135 185 0 0 0 -1 -1 4 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 176 208 208 0 0 0 -1 -1 4
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 116 116 255 0 0 0 -1 -1 4
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 200 125 255 0 0 0 -1 -1 4
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 143 15 223 0 0 0 -1 -1 4 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 165 0 0 0 0 -1 -1 4 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 141 19 5 0 0 0 -1 -1 4 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 244 194 71 0 0 0 -1 -1 4 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 255 127 0 0 0 -1 -1 4
+1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 86 86 86 0 0 0 -1 -1 4 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 255 255 255 0 31 31 -1 -1
+4 1 #"\0"
+0 -1 1 #"\0"
+1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 255 255 0 -1 -1
+ 0 475 0 28 3 12 #"#lang racket"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"("
+0 0 15 3 7 #"require"
+0 0 24 3 1 #" "
+0 0 14 3 15 #"racket/contract"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 17 3 13 #";;; Zadanie 1"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"("
+0 0 15 3 15 #"define/contract"
+0 0 24 3 2 #" ("
+0 0 14 3 8 #"suffixes"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"xs"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" ("
+0 0 14 3 14 #"parametric->/c"
+0 0 24 3 2 #" ["
+0 0 14 3 1 #"a"
+0 0 24 3 3 #"] ("
+0 0 14 3 2 #"->"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"listof"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"a"
+0 0 24 3 3 #") ("
+0 0 14 3 6 #"listof"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"listof"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"a"
+0 0 24 3 5 #")))) "
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" ("
+0 0 14 3 2 #"if"
+0 0 24 3 2 #" ("
+0 0 14 3 5 #"null?"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"xs"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 6 #" "
+0 0 14 3 4 #"null"
+0 0 24 29 1 #"\n"
+0 0 24 3 7 #" ("
+0 0 14 3 4 #"cons"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"xs"
+0 0 24 3 2 #" ("
+0 0 14 3 8 #"suffixes"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"cdr"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"xs"
+0 0 24 3 5 #")))))"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 17 3 13 #";;; Zadanie 2"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"("
+0 0 15 3 15 #"define/contract"
+0 0 24 3 2 #" ("
+0 0 14 3 8 #"sublists"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"xs"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" ("
+0 0 14 3 14 #"parametric->/c"
+0 0 24 3 2 #" ["
+0 0 14 3 1 #"a"
+0 0 24 3 3 #"] ("
+0 0 14 3 2 #"->"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"listof"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"a"
+0 0 24 3 3 #") ("
+0 0 14 3 6 #"listof"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"listof"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"a"
+0 0 24 3 6 #")))) "
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" ("
+0 0 14 3 2 #"if"
+0 0 24 3 2 #" ("
+0 0 14 3 5 #"null?"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"xs"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 7 #" ("
+0 0 14 3 4 #"list"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"null"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 7 #" ("
+0 0 14 3 10 #"append-map"
+0 0 24 29 1 #"\n"
+0 0 24 3 8 #" ("
+0 0 15 3 6 #"lambda"
+0 0 24 3 2 #" ("
+0 0 14 3 2 #"ys"
+0 0 24 3 3 #") ("
+0 0 14 3 4 #"list"
+0 0 24 3 2 #" ("
+0 0 14 3 4 #"cons"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"car"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"xs"
+0 0 24 3 2 #") "
+0 0 14 3 2 #"ys"
+0 0 24 3 2 #") "
+0 0 14 3 2 #"ys"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 3 8 #" ("
+0 0 14 3 8 #"sublists"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"cdr"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"xs"
+0 0 24 3 5 #")))))"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 17 3 13 #";;; Zadanie 3"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"("
+0 0 15 3 15 #"define/contract"
+0 0 24 3 2 #" ("
+0 0 14 3 17 #"autistic-identity"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"x"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" ("
+0 0 14 3 14 #"parametric->/c"
+0 0 24 3 2 #" ["
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"b"
+0 0 24 3 3 #"] ("
+0 0 14 3 2 #"->"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"b"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"a"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 14 3 1 #"x"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"("
+0 0 15 3 15 #"define/contract"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"create"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"comb"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"next"
+0 0 24 3 1 #" "
+0 0 14 3 3 #"beg"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" ("
+0 0 14 3 14 #"parametric->/c"
+0 0 24 3 2 #" ["
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"b"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"c"
+0 0 24 3 3 #"] ("
+0 0 14 3 2 #"->"
+0 0 24 3 2 #" ("
+0 0 14 3 2 #"->"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"b"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"c"
+0 0 24 3 3 #") ("
+0 0 14 3 2 #"->"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"b"
+0 0 24 3 2 #") "
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"c"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 3 4 #" (("
+0 0 14 3 4 #"comb"
+0 0 24 3 2 #" ("
+0 0 14 3 4 #"next"
+0 0 24 3 1 #" "
+0 0 14 3 3 #"beg"
+0 0 24 3 2 #") "
+0 0 14 3 3 #"beg"
+0 0 24 3 3 #")))"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"("
+0 0 15 3 15 #"define/contract"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"compose"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"bc"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"ab"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" ("
+0 0 14 3 14 #"parametric->/c"
+0 0 24 3 2 #" ["
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"b"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"c"
+0 0 24 3 3 #"] ("
+0 0 14 3 2 #"->"
+0 0 24 3 2 #" ("
+0 0 14 3 2 #"->"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"b"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"c"
+0 0 24 3 3 #") ("
+0 0 14 3 2 #"->"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"b"
+0 0 24 3 3 #") ("
+0 0 14 3 2 #"->"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"c"
+0 0 24 3 3 #")))"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" ("
+0 0 15 3 6 #"lambda"
+0 0 24 3 2 #" ("
+0 0 14 3 1 #"x"
+0 0 24 3 3 #") ("
+0 0 14 3 2 #"bc"
+0 0 24 3 2 #" ("
+0 0 14 3 2 #"ab"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"x"
+0 0 24 3 4 #"))))"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"("
+0 0 15 3 15 #"define/contract"
+0 0 24 3 2 #" ("
+0 0 14 3 5 #"ident"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"f"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" ("
+0 0 14 3 14 #"parametric->/c"
+0 0 24 3 2 #" ["
+0 0 14 3 1 #"a"
+0 0 24 3 3 #"] ("
+0 0 14 3 2 #"->"
+0 0 24 3 2 #" ("
+0 0 14 3 2 #"->"
+0 0 24 3 2 #" ("
+0 0 14 3 2 #"->"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"a"
+0 0 24 3 2 #") "
+0 0 14 3 1 #"a"
+0 0 24 3 2 #") "
+0 0 14 3 1 #"a"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" ("
+0 0 14 3 1 #"f"
+0 0 24 3 1 #" "
+0 0 14 3 8 #"identity"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 17 3 13 #";;; Zadanie 4"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"("
+0 0 15 3 15 #"define/contract"
+0 0 24 3 2 #" ("
+0 0 14 3 12 #"broken-contr"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"x"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" ("
+0 0 14 3 14 #"parametric->/c"
+0 0 24 3 2 #" ["
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"b"
+0 0 24 3 3 #"] ("
+0 0 14 3 2 #"->"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"b"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" ("
+0 0 14 3 12 #"broken-contr"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"x"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 17 3 13 #";;; Zadanie 5"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"("
+0 0 15 3 15 #"define/contract"
+0 0 24 3 2 #" ("
+0 0 14 3 9 #"foldl-map"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"f"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"xs"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" ("
+0 0 14 3 14 #"parametric->/c"
+0 0 24 3 2 #" ["
+0 0 14 3 1 #"F"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"A"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"L"
+0 0 24 3 3 #"] ("
+0 0 14 3 2 #"->"
+0 0 24 3 2 #" ("
+0 0 14 3 2 #"->"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"L"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"A"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"cons/c"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"F"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"A"
+0 0 24 3 3 #")) "
+0 0 14 3 1 #"A"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"listof"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"L"
+0 0 24 3 3 #") ("
+0 0 14 3 6 #"cons/c"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"listof"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"F"
+0 0 24 3 2 #") "
+0 0 14 3 1 #"A"
+0 0 24 3 4 #"))) "
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" ("
+0 0 15 3 6 #"define"
+0 0 24 3 2 #" ("
+0 0 14 3 2 #"it"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"xs"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"ys"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 5 #" ("
+0 0 14 3 2 #"if"
+0 0 24 3 2 #" ("
+0 0 14 3 5 #"null?"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"xs"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 9 #" ("
+0 0 14 3 4 #"cons"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"reverse"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"ys"
+0 0 24 3 2 #") "
+0 0 14 3 1 #"a"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 9 #" ("
+0 0 15 3 3 #"let"
+0 0 24 3 3 #" [("
+0 0 14 3 1 #"p"
+0 0 24 3 2 #" ("
+0 0 14 3 1 #"f"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"car"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"xs"
+0 0 24 3 2 #") "
+0 0 14 3 1 #"a"
+0 0 24 3 3 #"))]"
+0 0 24 29 1 #"\n"
+0 0 24 3 11 #" ("
+0 0 14 3 2 #"it"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"cdr"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"p"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 15 #" ("
+0 0 14 3 3 #"cdr"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"xs"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 15 #" ("
+0 0 14 3 4 #"cons"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"car"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"p"
+0 0 24 3 2 #") "
+0 0 14 3 2 #"ys"
+0 0 24 3 5 #")))))"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" ("
+0 0 14 3 2 #"it"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"xs"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"null"
+0 0 24 3 2 #"))"
+0 0
diff --git a/semestr-2/racket/l11/solution.bak b/semestr-2/racket/l11/solution.bak
new file mode 100644
index 0000000..3ae167a
--- /dev/null
+++ b/semestr-2/racket/l11/solution.bak
@@ -0,0 +1,18 @@
+#lang racket
+
+(require racket/contract)
+
+(provide (contract-out [square square/c]))
+(provide square/c)
+
+(define square/c (-> number? (not/c negative?)))
+
+(define (square x) (* x x))
+
+
+(define with-labels/c (parametric->/c [a b] (-> (-> a b))
+
+(define (with-labels f xs)
+ (if (null? xs)
+ null
+ (cons (list (f (car xs)) (car xs)) (with-labels f (cdr xs))))) \ No newline at end of file
diff --git a/semestr-2/racket/l11/solution.rkt b/semestr-2/racket/l11/solution.rkt
new file mode 100644
index 0000000..55e4ba6
--- /dev/null
+++ b/semestr-2/racket/l11/solution.rkt
@@ -0,0 +1,35 @@
+#lang racket
+
+(provide (contract-out
+ [with-labels with-labels/c]
+ [foldr-map foldr-map/c]
+ [pair-from pair-from/c]))
+(provide with-labels/c foldr-map/c pair-from/c)
+
+
+(define with-labels/c (parametric->/c [a b] (-> (-> a b) (listof a) (listof (cons/c b (cons/c a null?))))))
+
+(define (with-labels f xs)
+ (if (null? xs)
+ null
+ (cons (list (f (car xs)) (car xs)) (with-labels f (cdr xs)))))
+
+
+
+(define foldr-map/c (parametric->/c [x a f] (-> (-> x a (cons/c f a)) a (listof x) (cons/c (listof f) a))))
+
+(define (foldr-map f a xs)
+ (define (it a xs ys)
+ (if (null? xs)
+ (cons ys a)
+ (let [(p (f (car xs) a))]
+ (it (cdr p)
+ (cdr xs)
+ (cons (car p) ys)))))
+ (it a (reverse xs) null))
+
+
+(define pair-from/c (parametric->/c [x fx gx] (-> (-> x fx) (-> x gx) (-> x (cons/c fx gx)))))
+
+(define (pair-from f g)
+ (lambda (x) (cons (f x) (g x)))) \ No newline at end of file
diff --git a/semestr-2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.dep b/semestr-2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.dep
new file mode 100644
index 0000000..6d38ce0
--- /dev/null
+++ b/semestr-2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.dep
@@ -0,0 +1 @@
+("7.6" racket ("b51d3a36a64d34c7978bfc22f2a5fe674cee1cb6" . "8314027ed4c1c6fd9c412af77103e94790e59dd2") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt"))
diff --git a/semestr-2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.zo b/semestr-2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.zo
new file mode 100644
index 0000000..ef91f9a
--- /dev/null
+++ b/semestr-2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.zo
Binary files differ
diff --git a/semestr-2/racket/l11z20/graph.bak b/semestr-2/racket/l11z20/graph.bak
new file mode 100644
index 0000000..9f4d79d
--- /dev/null
+++ b/semestr-2/racket/l11z20/graph.bak
@@ -0,0 +1,97 @@
+#lang racket
+
+(provide bag^ graph^ simple-graph@ graph-search^ graph-search@)
+
+;; sygnatura dla struktury danych
+(define-signature bag^
+ ((contracted
+ [bag? (-> any/c boolean?)]
+ [empty-bag (and/c bag? bag-empty?)]
+ [bag-empty? (-> bag? boolean?)]
+ [bag-insert (-> bag? any/c (and/c bag? (not/c bag-empty?)))]
+ [bag-peek (-> (and/c bag? (not/c bag-empty?)) any/c)]
+ [bag-remove (-> (and/c bag? (not/c bag-empty?)) bag?)])))
+
+;; sygnatura: grafy
+(define-signature graph^
+ ((contracted
+ [graph (-> list? (listof edge?) graph?)]
+ [graph? (-> any/c boolean?)]
+ [graph-nodes (-> graph? list?)]
+ [graph-edges (-> graph? (listof edge?))]
+ [edge (-> any/c any/c edge?)]
+ [edge? (-> any/c boolean?)]
+ [edge-start (-> edge? any/c)]
+ [edge-end (-> edge? any/c)]
+ [has-node? (-> graph? any/c boolean?)]
+ [outnodes (-> graph? any/c list?)]
+ [remove-node (-> graph? any/c graph?)]
+ )))
+
+;; prosta implementacja grafów
+(define-unit simple-graph@
+ (import)
+ (export graph^)
+
+ (define (graph? g)
+ (and (list? g)
+ (eq? (length g) 3)
+ (eq? (car g) 'graph)))
+
+ (define (edge? e)
+ (and (list? e)
+ (eq? (length e) 3)
+ (eq? (car e) 'edge)))
+
+ (define (graph-nodes g) (cadr g))
+
+ (define (graph-edges g) (caddr g))
+
+ (define (graph n e) (list 'graph n e))
+
+ (define (edge n1 n2) (list 'edge n1 n2))
+
+ (define (edge-start e) (cadr e))
+
+ (define (edge-end e) (caddr e))
+
+ (define (has-node? g n) (not (not (member n (graph-nodes g)))))
+
+ (define (outnodes g n)
+ (filter-map
+ (lambda (e)
+ (and (eq? (edge-start e) n)
+ (edge-end e)))
+ (graph-edges g)))
+
+ (define (remove-node g n)
+ (graph
+ (remove n (graph-nodes g))
+ (filter
+ (lambda (e)
+ (not (eq? (edge-start e) n)))
+ (graph-edges g)))))
+
+;; sygnatura dla przeszukiwania grafu
+(define-signature graph-search^
+ (search))
+
+;; implementacja przeszukiwania grafu
+;; uzależniona od implementacji grafu i struktury danych
+(define-unit graph-search@
+ (import bag^ graph^)
+ (export graph-search^)
+ (define (search g n)
+ (define (it g b l)
+ (cond
+ [(bag-empty? b) (reverse l)]
+ [(has-node? g (bag-peek b))
+ (it (remove-node g (bag-peek b))
+ (foldl
+ (lambda (n1 b1) (bag-insert b1 n1))
+ (bag-remove b)
+ (outnodes g (bag-peek b)))
+ (cons (bag-peek b) l))]
+ [else (it g (bag-remove b) l)]))
+ (it g (bag-insert empty-bag n) '()))
+ )
diff --git a/semestr-2/racket/l11z20/graph.rkt b/semestr-2/racket/l11z20/graph.rkt
new file mode 100644
index 0000000..ec19576
--- /dev/null
+++ b/semestr-2/racket/l11z20/graph.rkt
@@ -0,0 +1,100 @@
+#lang racket
+
+(provide bag^ graph^ simple-graph@ graph-search^ graph-search@)
+
+;; sygnatura dla struktury danych
+(define-signature bag^
+ ((contracted
+ [bag? (-> any/c boolean?)]
+ [empty-bag (and/c bag? bag-empty?)]
+ [bag-empty? (-> bag? boolean?)]
+ [bag-insert (-> bag? any/c (and/c bag? (not/c bag-empty?)))]
+ [bag-peek (-> (and/c bag? (not/c bag-empty?)) any/c)]
+ [bag-remove (-> (and/c bag? (not/c bag-empty?)) bag?)])))
+
+;; sygnatura: grafy
+(define-signature graph^
+ ((contracted
+ [graph (-> list? (listof edge?) graph?)]
+ [graph? (-> any/c boolean?)]
+ [graph-nodes (-> graph? list?)]
+ [graph-edges (-> graph? (listof edge?))]
+ [edge (-> any/c any/c edge?)]
+ [edge? (-> any/c boolean?)]
+ [edge-start (-> edge? any/c)]
+ [edge-end (-> edge? any/c)]
+ [has-node? (-> graph? any/c boolean?)]
+ [outnodes (-> graph? any/c list?)]
+ [remove-node (-> graph? any/c graph?)]
+ )))
+
+;; prosta implementacja grafów
+(define-unit simple-graph@
+ (import)
+ (export graph^)
+
+ (define (graph? g)
+ (and (list? g)
+ (eq? (length g) 3)
+ (eq? (car g) 'graph)))
+
+ (define (edge? e)
+ (and (list? e)
+ (eq? (length e) 3)
+ (eq? (car e) 'edge)))
+
+ (define (graph-nodes g) (cadr g))
+
+ (define (graph-edges g) (caddr g))
+
+ (define (graph n e) (list 'graph n e))
+
+ (define (edge n1 n2) (list 'edge n1 n2))
+
+ (define (edge-start e) (cadr e))
+
+ (define (edge-end e) (caddr e))
+
+ (define (has-node? g n) (not (not (member n (graph-nodes g)))))
+
+ (define (outnodes g n)
+ (filter-map
+ (lambda (e)
+ (and (eq? (edge-start e) n)
+ (edge-end e)))
+ (graph-edges g)))
+
+ (define (remove-node g n)
+ (graph
+ (remove n (graph-nodes g))
+ (filter
+ (lambda (e)
+ (not (eq? (edge-start e) n)))
+ (graph-edges g)))))
+
+;; sygnatura dla przeszukiwania grafu
+(define-signature graph-search^
+ (search))
+
+;; implementacja przeszukiwania grafu
+;; uzależniona od implementacji grafu i struktury danych
+(define-unit graph-search@
+ (import bag^ graph^)
+ (export graph-search^)
+ (define (search g n)
+ (define (it g b l)
+ (cond
+ [(bag-empty? b) (reverse l)]
+ [(has-node? g (bag-peek b))
+ (it (remove-node g (bag-peek b))
+ (foldl
+ (lambda (n1 b1) (bag-insert b1 n1))
+ (bag-remove b)
+ (outnodes g (bag-peek b)))
+ (cons (bag-peek b) l))]
+ [else (it g (bag-remove b) l)]))
+ (it g (bag-insert empty-bag n) '()))
+ )
+
+;; otwarcie komponentu grafu
+(define-values/invoke-unit/infer simple-graph@) \ No newline at end of file
diff --git a/semestr-2/racket/l11z20/solution.bak b/semestr-2/racket/l11z20/solution.bak
new file mode 100644
index 0000000..6f1f7b4
--- /dev/null
+++ b/semestr-2/racket/l11z20/solution.bak
@@ -0,0 +1 @@
+#lang racket
diff --git a/semestr-2/racket/l11z20/solution.rkt b/semestr-2/racket/l11z20/solution.rkt
new file mode 100644
index 0000000..e3ad81f
--- /dev/null
+++ b/semestr-2/racket/l11z20/solution.rkt
@@ -0,0 +1,245 @@
+#lang racket
+
+(require "graph.rkt")
+(provide bag-stack@ bag-fifo@)
+
+;; struktura danych - stos
+(define-unit bag-stack@
+ (import)
+ (export bag^)
+
+ (define (bag? b)
+ (and (cons? b)
+ (eq? (car b) 'stack)))
+
+ (define empty-bag (cons 'stack null))
+
+ (define (bag-empty? b)
+ (null? (cdr b)))
+
+ (define (bag-insert b val)
+ (cons 'stack (cons val (cdr b))))
+
+ (define (bag-peek b)
+ (cadr b))
+
+ (define (bag-remove b)
+ (cons 'stack (cddr b)))
+)
+
+;; struktura danych - kolejka FIFO
+(define-unit bag-fifo@
+ (import)
+ (export bag^)
+
+ (define (bag? b)
+ (and (list? b)
+ (eq? (length b) 3)
+ (eq? (first b) 'queue)))
+
+ (define empty-bag
+ (list 'queue null null))
+
+ (define (bag-empty? b)
+ (and (null? (second b)) (null? (third b))))
+
+ (define (bag-insert b val)
+ (list 'queue (cons val (second b)) (third b)))
+
+ (define (bag-peek b)
+ (let ((insq (second b))
+ (popq (third b)))
+ (cond
+ [(null? popq) (last insq)]
+ [else (first popq)])))
+
+ (define (bag-remove b)
+ (let ((insq (second b))
+ (popq (third b)))
+ (cond
+ [(null? popq) (list 'queue null (cdr (reverse insq)))]
+ [else (list 'queue insq (cdr popq))])))
+)
+
+;; otwarcie komponentów stosu i kolejki
+
+(define-values/invoke-unit bag-stack@
+ (import)
+ (export (prefix stack: bag^)))
+
+(define-values/invoke-unit bag-fifo@
+ (import)
+ (export (prefix fifo: bag^)))
+
+;; testy w Quickchecku
+(require quickcheck)
+
+;; liczba zapytań na test quickchecka
+(define TESTS 1000)
+
+
+;; TESTY DO KOLEJKI
+
+;; xs to lista jakichś liczb, queries to rodzaj wykonywanych operacji
+;; 0 - popuje na listę pops
+;; 1 - insertuje na queue
+;; jest nie ma nic na kolejce/stosie i dostajemy 0, to nic nie robimy
+;; jesli queries albo xs są puste to po prostu kończymy obsługiwanie zapytań
+;; na koncu sprawdzamy, czy (reverse pops) jest prefiksem xs
+
+
+(define (check-queue xs queries)
+ (define (iter xs queries queue pops)
+ ;; (display queue)
+ ;; (newline)
+ (if (or (null? queries) (null? xs))
+ (reverse pops)
+ (cond
+ [(and (eq? (car queries) 0) (not (fifo:bag-empty? queue)))
+ (iter xs (cdr queries) (fifo:bag-remove queue) (cons (fifo:bag-peek queue) pops))]
+ [else (iter (cdr xs) (cdr queries) (fifo:bag-insert queue (car xs)) pops)])))
+ (define (is-prefix? xs ys)
+ (if (null? xs)
+ #t
+ (and (equal? (car xs) (car ys)) (is-prefix? (cdr xs) (cdr ys)))))
+ (is-prefix? (iter xs queries fifo:empty-bag null) xs))
+
+;; sprawdzenie czy nasza funkcja testująca w ogóle działa
+(define check-queue-test (lambda () (check-queue (list 1 2 3 4 5 6 7 8) (list 0 1 1 1 0 0 0 1 1 0 1 0 1 0 0))))
+
+;; testowanie kolejki
+(define-unit queue-tests@
+ (import bag^)
+ (export)
+
+ (quickcheck
+ (property ([xs (choose-list (choose-real -100000 100000) TESTS)]
+ [ops (choose-list (choose-integer 0 1) TESTS)])
+ (check-queue xs ops))))
+
+(invoke-unit queue-tests@ (import (prefix fifo: bag^)))
+
+
+;; TESTY DO STOSU
+
+;; niestety tutaj nie jest tak kolorowo, na kolejce
+;; dokładnie wiemy jaka jest koljeność popowanych, na stosie to dosyć dowolne.
+;; Z drugiej strony jego implementacja jest dużo prostsza, więc testy też nie muszą
+;; być bardzo rygorystyczne.
+
+(define (check-stack xs)
+ (define (insert-list stack xs)
+ (if (null? xs)
+ stack
+ (insert-list (stack:bag-insert stack (car xs)) (cdr xs))))
+ (define (clear-stack stack pops)
+ (if (stack:bag-empty? stack)
+ pops
+ (clear-stack (stack:bag-remove stack) (cons (stack:bag-peek stack) pops))))
+ (equal? xs (clear-stack (insert-list stack:empty-bag xs) null)))
+
+
+;; testowanie stacka
+(define-unit stack-tests@
+ (import bag^)
+ (export)
+ (quickcheck
+ (property ([xs (choose-list (choose-real -100000 100000) TESTS)])
+ (check-stack xs))))
+
+(invoke-unit stack-tests@ (import (prefix stack: bag^)))
+
+
+
+;; testy kolejek i stosów
+(define-unit bag-tests@
+ (import bag^)
+ (export)
+
+ ;; test przykładowy: jeśli do pustej struktury dodamy element
+ ;; i od razu go usuniemy, wynikowa struktura jest pusta
+ (quickcheck
+ (property ([s arbitrary-symbol])
+ (bag-empty? (bag-remove (bag-insert empty-bag s)))))
+
+ ;; Sprawdzenie własności wspólnych dla obu struktur
+ (quickcheck
+ (property ([s arbitrary-symbol])
+ (equal? s (bag-peek (bag-insert empty-bag s)))))
+)
+
+;; uruchomienie testów dla obu struktur danych
+
+(invoke-unit bag-tests@ (import (prefix stack: bag^)))
+(invoke-unit bag-tests@ (import (prefix fifo: bag^)))
+
+
+
+;; TESTOWANIE PRZESZUKIWAŃ
+
+;; otwarcie komponentu grafu
+(define-values/invoke-unit/infer simple-graph@)
+
+;; otwarcie komponentów przeszukiwania
+;; w głąb i wszerz
+(define-values/invoke-unit graph-search@
+ (import graph^ (prefix stack: bag^))
+ (export (prefix dfs: graph-search^)))
+
+(define-values/invoke-unit graph-search@
+ (import graph^ (prefix fifo: bag^))
+ (export (prefix bfs: graph-search^)))
+
+;; graf testowy
+(define test-graph
+ (graph
+ (list 1 2 3 4)
+ (list (edge 1 3)
+ (edge 1 2)
+ (edge 2 4))))
+
+(define test-graph2
+ (graph (list 1) null))
+
+(define test-graph3
+ (graph (list 1 2 3 4 5 6 7 8 9 10)
+ (list (edge 1 2)
+ (edge 1 3)
+ (edge 2 3)
+ (edge 3 2)
+ (edge 3 5)
+ (edge 6 5)
+ (edge 5 7)
+ (edge 5 8)
+ (edge 7 9)
+ (edge 8 9)
+ (edge 9 10)
+ (edge 1 10)
+ (edge 10 1))))
+
+
+(define test-graph4
+ (graph (list 1 2 3 4 5 6)
+ (list (edge 1 2)
+ (edge 2 3)
+ (edge 3 4)
+ (edge 4 5)
+ (edge 5 6))))
+
+;; uruchomienie przeszukiwania na przykładowym grafie
+(bfs:search test-graph 1)
+(dfs:search test-graph 1)
+
+(bfs:search test-graph2 1)
+(dfs:search test-graph2 1)
+
+(bfs:search test-graph3 1)
+(dfs:search test-graph3 1)
+
+(bfs:search test-graph3 6)
+(dfs:search test-graph3 6)
+
+(bfs:search test-graph4 1)
+(dfs:search test-graph4 1)
+
+
diff --git a/semestr-2/racket/l13/oceny.txt b/semestr-2/racket/l13/oceny.txt
new file mode 100644
index 0000000..9f17cad
--- /dev/null
+++ b/semestr-2/racket/l13/oceny.txt
@@ -0,0 +1,18 @@
+1 sem
+
+MDM - 5 5
+AO - 5
+AM 1 - 5 5
+LDI - 5 5
+MIA - 5
+
+8 * 5
+
+
+2 sem
+
+Topologia - 5 3
+Analiza - 4 4
+MP - 5 5
+PPS - 5
+Algebra - 5 5 \ No newline at end of file
diff --git a/semestr-2/racket/l13/rozw.rkt b/semestr-2/racket/l13/rozw.rkt
new file mode 100644
index 0000000..b4094db
--- /dev/null
+++ b/semestr-2/racket/l13/rozw.rkt
@@ -0,0 +1,79 @@
+#lang typed/racket
+
+
+;;; zadanie 1
+
+(: prefixes (All (a) (-> (Listof a) (Listof (Listof a)))))
+(define (prefixes xs)
+ (if (null? xs)
+ (list null)
+ (cons xs (prefixes (cdr xs)))))
+
+
+
+;;; zadanie 2
+
+(struct vector2 ([x : Real] [y : Real]) #:transparent)
+(struct vector3 ([x : Real] [y : Real] [z : Real]) #:transparent)
+
+(define-type Vector (U vector2 vector3))
+(define-predicate vector? Vector)
+
+
+(: square (-> Real Nonnegative-Real))
+(define (square x)
+ (if (< x 0) (* x x) (* x x)))
+
+
+;;; pierwsza wersja
+
+(: vector-length (-> Vector Nonnegative-Real))
+(define (vector-length v)
+ (if (vector2? v)
+ (match v [(vector2 x y) (sqrt (+ (square x) (square y)))])
+ (match v [(vector3 x y z) (sqrt (+ (square x) (square y) (square z)))])))
+
+
+;;; druga wersja
+
+(: vector-length-match (-> Vector Nonnegative-Real))
+(define (vector-length-match v)
+ (match v
+ [(vector2 x y) (sqrt (+ (square x) (square y)))]
+ [(vector3 x y z) (sqrt (+ (square x) (square y) (square z)))]))
+
+
+
+;;; zadanie 4
+
+(struct leaf () #:transparent)
+(struct [a] node ([v : a] [xs : (Listof (Tree a))]) #:transparent)
+
+(define-type (Tree a) (node a))
+(define-predicate tree? (Tree Any))
+
+
+(: flat-map (All (a) (-> (-> (Tree a) (Listof a)) (Listof (Tree a)) (Listof a))))
+(define (flat-map f xs)
+ (if (null? xs)
+ null
+ (append (f (car xs)) (flat-map f (cdr xs)))))
+
+(: preorder (All (a) (-> (Tree a) (Listof a))))
+(define (preorder t)
+ (match t
+ [(node v xs)
+ (cons v (flat-map preorder xs))]))
+
+;;; (preorder (node 1 (list
+;;; (node 2 (list
+;;; (node 3 '())
+;;; (node 4 '())))
+;;; (node 5 '())
+;;; (node 'x (list
+;;; (node 't (list
+;;; (node 'z '()))))))))
+
+
+;;; zadanie 6
+
diff --git a/semestr-2/racket/l13/solution.rkt b/semestr-2/racket/l13/solution.rkt
new file mode 100644
index 0000000..61804b3
--- /dev/null
+++ b/semestr-2/racket/l13/solution.rkt
@@ -0,0 +1,124 @@
+#lang typed/racket
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(provide parse typecheck)
+
+(define-type Expr (U const binop var-expr let-expr if-expr))
+(define-type Value (U Real Boolean))
+(define-type ArithOp (U '+ '- '/ '* '%))
+;;; (define-type ModOp '%)
+(define-type CompOp (U '= '> '>= '< '<=))
+(define-type LogicOp (U 'and 'or))
+(define-type BinopSym (U ArithOp CompOp LogicOp))
+
+(struct const ([val : Value]) #:transparent)
+(struct binop ([op : BinopSym] [l : Expr] [r : Expr]) #:transparent)
+(struct var-expr ([id : Symbol]) #:transparent)
+(struct let-expr ([id : Symbol] [e1 : Expr] [e2 : Expr]) #:transparent)
+(struct if-expr ([eb : Expr] [et : Expr] [ef : Expr]) #:transparent)
+
+(define-predicate expr? Expr)
+(define-predicate value? Value)
+(define-predicate arith-op? ArithOp)
+;;; (define-predicate mod-op? ModOp)
+(define-predicate comp-op? CompOp)
+(define-predicate logic-op? LogicOp)
+(define-predicate binop-sym? BinopSym)
+(define-predicate let-list? (List Symbol Any))
+
+(: parse (-> Any Expr))
+(define (parse q)
+ (match q
+ [_ #:when (value? q) (const q)]
+ [_ #:when (eq? q 'true) (const true)]
+ [_ #:when (eq? q 'false) (const false)] ; <---------------------------- !!!
+ [_ #:when (symbol? q) (var-expr q)]
+ [`(,s ,e1 ,e2)
+ #:when (and (eq? s 'let) (let-list? e1))
+ (let-expr (car e1)
+ (parse (cadr e1))
+ (parse e2))]
+ [`(,s ,eb ,et ,ef)
+ #:when (eq? s 'if)
+ (if-expr (parse eb)
+ (parse et)
+ (parse ef))]
+ [`(,s ,e1 ,e2)
+ #:when (binop-sym? s)
+ (binop s
+ (parse e1)
+ (parse e2))]
+ [else (error "Parse error" q)]))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(define-type EType (U 'real 'boolean))
+(define-predicate EType? EType)
+
+(struct environ ([xs : (Listof (Pairof Symbol EType))]))
+(define env-empty (environ null))
+
+(: env-add (-> Symbol EType environ environ))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+
+(: env-lookup (-> Symbol environ EType))
+(define (env-lookup x env)
+ (: assoc-lookup (-> (Listof (Pairof Symbol EType)) EType))
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+(: check-op (-> Expr Expr EType EType environ (U EType #f)))
+(define (check-op e1 e2 arg-type ret-type env)
+ (if (and (eq? (typecheck-env e1 env) arg-type)
+ (eq? (typecheck-env e2 env) arg-type))
+ ret-type
+ #f))
+
+(: typecheck-env (-> Expr environ (U EType #f)))
+(define (typecheck-env e env)
+ (match e
+ [(const val)
+ (cond
+ [(real? val) 'real]
+ [(boolean? val) 'boolean])]
+ [(var-expr id) (env-lookup id env)]
+ [(binop op e1 e2)
+ (cond
+ [(arith-op? op) (check-op e1 e2 'real 'real env)]
+ [(comp-op? op) (check-op e1 e2 'real 'boolean env)]
+ [(logic-op? op) (check-op e1 e2 'boolean 'boolean env)])]
+ [(let-expr id e1 e2)
+ (let ((id-type (typecheck-env e1 env)))
+ (if id-type
+ (typecheck-env e2 (env-add id id-type env))
+ #f))]
+ [(if-expr eb et ef)
+ (let ((eb-type (typecheck-env eb env)))
+ (if (not (eq? eb-type 'boolean))
+ #f
+ (let ((et-type (typecheck-env et env))
+ (ef-type (typecheck-env ef env)))
+ (if (eq? et-type ef-type) ;;; nie trzeba sprawdzac czy ktores z nich to #f
+ et-type ;;; jesli tak jest, to i tak sie na pewno zwroci #f
+ #f))))]))
+
+(: typecheck (-> Expr (U EType #f)))
+(define (typecheck e)
+ (typecheck-env e env-empty))
+
+(define program
+ '(if (or (< (% 123 10) 5)
+ true)
+ (+ 2 3)
+ (/ 2 0)))
+
+(define (test-eval) (eval (parse program))) \ No newline at end of file
diff --git a/semestr-2/racket/l13/zad6.rkt b/semestr-2/racket/l13/zad6.rkt
new file mode 100644
index 0000000..1dcfbfc
--- /dev/null
+++ b/semestr-2/racket/l13/zad6.rkt
@@ -0,0 +1,132 @@
+#lang typed/racket
+
+; Do let-env.rkt dodajemy wartosci boolowskie
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(define-type Expr (U const binop var-expr let-expr if-expr))
+(define-type Value (U Real Boolean))
+(define-type BinopSym (U '+ '- '/ '* '% '= '> '>= '< '<= 'and 'or))
+
+(struct const ([val : Value]) #:transparent)
+(struct binop ([op : BinopSym] [l : Expr] [r : Expr]) #:transparent)
+(struct var-expr ([id : Symbol]) #:transparent)
+(struct let-expr ([id : Symbol] [e1 : Expr] [e2 : Expr]) #:transparent)
+(struct if-expr ([eb : Expr] [et : Expr] [ef : Expr]) #:transparent)
+
+
+(define-predicate expr? Expr)
+(define-predicate value? Value)
+(define-predicate binop-sym? BinopSym)
+(define-predicate let-list? (List Symbol Any))
+
+(: parse (-> Any Expr))
+(define (parse q)
+ (match q
+ [_ #:when (value? q) (const q)]
+ [_ #:when (eq? q 'true) (const true)]
+ [_ #:when (eq? q 'false) (const false)] ; <---------------------------- !!!
+ [_ #:when (symbol? q) (var-expr q)]
+ [`(,s ,e1 ,e2)
+ #:when (and (eq? s 'let) (let-list? e1))
+ (let-expr (car e1)
+ (parse (cadr e1))
+ (parse e2))]
+ [`(,s ,eb ,et ,ef)
+ #:when (eq? s 'if)
+ (if-expr (parse eb)
+ (parse et)
+ (parse ef))]
+ [`(,s ,e1 ,e2)
+ #:when (binop-sym? s)
+ (binop s
+ (parse e1)
+ (parse e2))]
+ [else (error "Parse error" q)]))
+
+;;; (define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1))))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct environ ([xs : (Listof (Pairof Symbol Value))]))
+(define env-empty (environ null))
+
+(: env-add (-> Symbol Value environ environ))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+
+(: env-lookup (-> Symbol environ Value))
+(define (env-lookup x env)
+ (: assoc-lookup (-> (Listof (Pairof Symbol Value)) Value))
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(: arith-op (-> (-> Real Real Real) (-> Value Value Value)))
+(define (arith-op op)
+ (lambda (x y) (if (and (real? x) (real? y))
+ (ann (op x y) Value)
+ (error "Wrong args for arithmetic operator" op x y))))
+
+(: mod-op (-> (-> Integer Integer Integer) (-> Value Value Value)))
+(define (mod-op op)
+ (lambda (x y) (if (and (exact-integer? x) (exact-integer? y))
+ (ann (op x y) Value)
+ (error "Wrong args for modulo operator" op x y))))
+
+(: logic-op (-> (-> Boolean Boolean Boolean) (-> Value Value Value)))
+(define (logic-op op)
+ (lambda (x y) (if (and (boolean? x) (boolean? y))
+ (ann (op x y) Value)
+ (error "Wrong args for logic operator" op x y))))
+
+(: comp-op (-> (-> Real Real Boolean) (-> Value Value Value)))
+(define (comp-op op)
+ (lambda (x y) (if (and (real? x) (real? y))
+ (ann (op x y) Value)
+ (error "Wrong args for comparator" op x y))))
+
+
+(: op->proc (-> BinopSym (-> Value Value Value)))
+(define (op->proc op)
+ (match op ['+ (arith-op +)] ['- (arith-op -)] ['* (arith-op *)] ['/ (arith-op /)]
+ ['% (mod-op modulo)]
+ ['= (comp-op =)] ['> (comp-op >)] ['>= (comp-op >=)] ['< (comp-op <)] ['<= (comp-op <=)]
+ ['and (logic-op (lambda (x y) (and x y)))]
+ ['or (logic-op (lambda (x y) (or x y)))]))
+
+(: eval-env (-> Expr environ Value))
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(var-expr x) (env-lookup x env)]
+ [(if-expr eb et ef) (if (eval-env eb env) ; <----------------- !!!
+ (eval-env et env)
+ (eval-env ef env))]))
+
+(: eval (-> Expr Value))
+(define (eval e) (eval-env e env-empty))
+
+(define program
+ '(if (or (< (% 123 10) 5)
+ true)
+ (+ 2 3)
+ (/ 2 0)))
+
+;;; (define (test-eval) (eval (parse program))) \ No newline at end of file
diff --git a/semestr-2/racket/l14z22/solution.bak b/semestr-2/racket/l14z22/solution.bak
new file mode 100644
index 0000000..0d4f164
--- /dev/null
+++ b/semestr-2/racket/l14z22/solution.bak
@@ -0,0 +1,70 @@
+#lang racket
+
+(require racklog)
+
+(provide solve)
+
+;; transpozycja tablicy zakodowanej jako lista list
+(define (transpose xss)
+ (cond [(null? xss) xss]
+ ((null? (car xss)) (transpose (cdr xss)))
+ [else (cons (map car xss)
+ (transpose (map cdr xss)))]))
+
+;; procedura pomocnicza
+;; tworzy listę n-elementową zawierającą wyniki n-krotnego
+;; wywołania procedury f
+(define (repeat-fn n f)
+ (if (eq? 0 n) null
+ (cons (f) (repeat-fn (- n 1) f))))
+
+;; tworzy tablicę n na m elementów, zawierającą świeże
+;; zmienne logiczne
+(define (make-rect n m)
+ (repeat-fn m (lambda () (repeat-fn n _))))
+
+;; predykat binarny
+;; (%row-ok xs ys) oznacza, że xs opisuje wiersz (lub kolumnę) ys
+(define %row-ok
+ (%rel ()
+;; TODO: uzupełnij!
+ ))
+
+;; TODO: napisz potrzebne ci pomocnicze predykaty
+
+;; funkcja rozwiązująca zagadkę
+(define (solve rows cols)
+ (define board (make-rect (length cols) (length rows)))
+ (define tboard (transpose board))
+ (define ret (%which (xss)
+ (%= xss board)
+;; TODO: uzupełnij!
+ ))
+ (and ret (cdar ret)))
+
+;; testy
+(equal? (solve '((2) (1) (1)) '((1 1) (2)))
+ '((* *)
+ (_ *)
+ (* _)))
+
+(equal? (solve '((2) (2 1) (1 1) (2)) '((2) (2 1) (1 1) (2)))
+ '((_ * * _)
+ (* * _ *)
+ (* _ _ *)
+ (_ * * _)))
+
+(equal? (solve '((4) (6) (2 2) (2 2) (6) (4) (2) (2) (2))
+ '((9) (9) (2 2) (2 2) (4) (4)))
+ '((* * * * _ _)
+ (* * * * * *)
+ (* * _ _ * *)
+ (* * _ _ * *)
+ (* * * * * *)
+ (* * * * _ _)
+ (* * _ _ _ _)
+ (* * _ _ _ _)
+ (* * _ _ _ _)))
+
+;; TODO: możesz dodać własne testy
+
diff --git a/semestr-2/racket/l14z22/solution.rkt b/semestr-2/racket/l14z22/solution.rkt
new file mode 100644
index 0000000..480c772
--- /dev/null
+++ b/semestr-2/racket/l14z22/solution.rkt
@@ -0,0 +1,87 @@
+#lang racket
+
+(require racklog)
+
+(provide solve)
+
+;; transpozycja tablicy zakodowanej jako lista list
+(define (transpose xss)
+ (cond [(null? xss) xss]
+ ((null? (car xss)) (transpose (cdr xss)))
+ [else (cons (map car xss)
+ (transpose (map cdr xss)))]))
+
+;; procedura pomocnicza
+;; tworzy listę n-elementową zawierającą wyniki n-krotnego
+;; wywołania procedury f
+(define (repeat-fn n f)
+ (if (eq? 0 n) null
+ (cons (f) (repeat-fn (- n 1) f))))
+
+;; tworzy tablicę n na m elementów, zawierającą świeże
+;; zmienne logiczne
+(define (make-rect n m)
+ (repeat-fn m (lambda () (repeat-fn n _))))
+
+;; predykat binarny
+;; (%row-ok xs ys) oznacza, że xs opisuje wiersz (lub kolumnę) ys
+(define %row-ok
+ (%rel (xs ys zs n)
+ [(null null)]
+ [(xs (cons '_ ys))
+ (%row-ok xs ys)]
+ [((cons n xs) ys)
+ (%stars ys n)
+ (%cut-first-n ys zs n)
+ (%row-ok xs zs)]))
+
+
+(define %suffix
+ (%rel (xs ys x)
+ [(xs xs)]
+ [((cons x xs) ys)
+ (%suffix xs ys)]))
+
+(define %cut-first-n
+ (%rel (xs ys n yl)
+ [(xs xs 0)]
+ [(xs ys n)
+ (%suffix xs ys)
+ (%is #t (= (- (length xs) (length ys)) n))]))
+
+
+;; usun n pierwszych elementow z xs
+(define (suffix xs n)
+ (if (= n 0)
+ xs
+ (suffix (cdr xs) (- n 1))))
+
+
+;; sprawdza czy pierwsze n elementów listy to gwiazdki (dokladnie n)
+(define %stars
+ (%rel (xs m n)
+ [(null 0)]
+ [((cons '_ xs) n)
+ (%is n 0)]
+ [((cons '* xs) n)
+ (%is m (- n 1))
+ (%stars xs m)]))
+
+(define %board-ok
+ (%rel (xss xs yss ys)
+ [(null null)]
+ [((cons xs xss) (cons ys yss))
+ (%row-ok xs ys)
+ (%board-ok xss yss)]))
+
+;; funkcja rozwiązująca zagadkę
+(define (solve rows cols)
+ (define board (make-rect (length cols) (length rows)))
+ (define tboard (transpose board))
+ (define ret (%which (xss)
+ (%= xss board)
+ (%board-ok rows board)
+ (%board-ok cols tboard)))
+ (and ret (cdar ret)))
+
+
diff --git a/semestr-2/racket/l15/kacp.bak b/semestr-2/racket/l15/kacp.bak
new file mode 100644
index 0000000..ff2a2bc
--- /dev/null
+++ b/semestr-2/racket/l15/kacp.bak
@@ -0,0 +1,55 @@
+#lang racket
+
+(define (run-concurrent . thunks)
+ (define threads (map thread thunks))
+ (for-each thread-wait threads))
+
+(define (random-sleep)
+ (sleep (/ (random) 100)))
+
+(define (with-random-sleep proc)
+ (lambda args
+ (random-sleep)
+ (apply proc args)))
+
+(define (make-serializer)
+ (define sem (make-semaphore 1))
+ (lambda (proc)
+ (lambda args
+ (semaphore-wait sem)
+ (define ret (apply proc args))
+ (semaphore-post sem)
+ ret)))
+
+(define (table)
+ (random-sleep)
+ (define forks (list (make-semaphore 1)
+ (make-semaphore 1)
+ (make-semaphore 1)
+ (make-semaphore 1)
+ (make-semaphore 1)))
+ (define (pick-fork i)
+ (random-sleep)
+ (semaphore-wait (list-ref forks i)))
+ (define (put-fork i)
+ (random-sleep)
+ (semaphore-post (list-ref forks i)))
+ (define (dispatch m)
+ (cond [(eq? m 'pick-fork) pick-fork]
+ [(eq? m 'put-fork) put-fork]
+ [else (error "Unknown request -- TABLE"
+ m)]))
+ dispatch)
+
+(define dtable (table))
+
+(define (philosopher dining-table number)
+ (define my-turn (make-serializer))
+ (define (eat)
+ (display number)
+ (newline)
+ ((dining-table 'pick-fork) number)
+ ((dining-table 'put-fork) number)
+ ((dining-table 'pick-fork) (modulo (+ number 1) 5))
+ ((dining-table 'put-fork) (modulo (+ number 1) 5)))
+ (my-turn eat)) \ No newline at end of file
diff --git a/semestr-2/racket/l15/kacp.rkt b/semestr-2/racket/l15/kacp.rkt
new file mode 100644
index 0000000..bd484f1
--- /dev/null
+++ b/semestr-2/racket/l15/kacp.rkt
@@ -0,0 +1,59 @@
+#lang racket
+
+(define (run-concurrent . thunks)
+ (define threads (map thread thunks))
+ (for-each thread-wait threads))
+
+(define (random-sleep)
+ (sleep (/ (random) 100)))
+
+(define (with-random-sleep proc)
+ (lambda args
+ (random-sleep)
+ (apply proc args)))
+
+(define (make-serializer)
+ (define sem (make-semaphore 1))
+ (lambda (proc)
+ (lambda args
+ (semaphore-wait sem)
+ (define ret (apply proc args))
+ (semaphore-post sem)
+ ret)))
+
+(define (table)
+ (random-sleep)
+ (define forks (list (make-semaphore 1)
+ (make-semaphore 1)
+ (make-semaphore 1)
+ (make-semaphore 1)
+ (make-semaphore 1)))
+ (define (pick-fork i)
+ (random-sleep)
+ (semaphore-wait (list-ref forks i)))
+ (define (put-fork i)
+ (random-sleep)
+ (semaphore-post (list-ref forks i)))
+ (define (dispatch m)
+ (cond [(eq? m 'pick-fork) pick-fork]
+ [(eq? m 'put-fork) put-fork]
+ [else (error "Unknown request -- TABLE"
+ m)]))
+ dispatch)
+
+(define dtable (table))
+
+(define (philosopher dining-table number)
+ (define my-turn (make-serializer))
+ (define (eat)
+ (display "Zaczynam ")
+ (display number)
+ (newline)
+ ((dining-table 'pick-fork) number)
+ ((dining-table 'put-fork) number)
+ ((dining-table 'pick-fork) (modulo (+ number 1) 5))
+ ((dining-table 'put-fork) (modulo (+ number 1) 5))
+ (display "Koncze ")
+ (display number)
+ (newline))
+ (my-turn eat)) \ No newline at end of file
diff --git a/semestr-2/racket/l15/solution.bak b/semestr-2/racket/l15/solution.bak
new file mode 100644
index 0000000..03ab86a
--- /dev/null
+++ b/semestr-2/racket/l15/solution.bak
@@ -0,0 +1,7 @@
+#lang racket
+
+
+
+(define (run-concurrent . thunks)
+ (define threads (map thread thunks))
+ (for-each thread-wait threads)) \ No newline at end of file
diff --git a/semestr-2/racket/l15/solution.rkt b/semestr-2/racket/l15/solution.rkt
new file mode 100644
index 0000000..915502e
--- /dev/null
+++ b/semestr-2/racket/l15/solution.rkt
@@ -0,0 +1,85 @@
+#lang racket
+
+(provide philosopher)
+
+;; Do debugu
+
+(define (run-concurrent . thunks)
+ (define threads (map thread thunks))
+ (for-each thread-wait threads))
+
+(define (random-sleep)
+ (sleep (/ (random) 100)))
+
+(define (with-random-sleep proc)
+ (lambda args
+ (random-sleep)
+ (apply proc args)))
+
+(define (make-serializer)
+ (define sem (make-semaphore 1))
+ (lambda (proc)
+ (lambda args
+ (semaphore-wait sem)
+ (define ret (apply proc args))
+ (semaphore-post sem)
+ ret)))
+
+(define (make-table)
+ (define forks (map (lambda (x) (make-semaphore 1)) '(0 1 2 3 4)))
+ (define (get-fork i)
+ (list-ref forks i))
+ (define (pick-fork i)
+ (random-sleep)
+ (semaphore-wait (get-fork i)))
+ (define (put-fork i)
+ (random-sleep)
+ (semaphore-post (get-fork i)))
+ (define (dispatch m)
+ (cond [(eq? m 'pick-fork) pick-fork]
+ [(eq? m 'put-fork) put-fork]
+ [else (error "Unknown request -- MAKE-TABLE" m)]))
+ dispatch)
+
+;(define dining-table (make-table))
+
+;(define (repeat proc n)
+; (if (> n 0)
+; (begin
+; (proc)
+; (repeat proc (- n 1)))
+; #f))
+;
+;(define (hungry nr x)
+; (lambda () (repeat (lambda () (philosopher dining-table nr)) x)))
+
+;; Rozwiązanie:
+
+(define forks-sem (map (lambda (x) (make-semaphore 1)) '(0 0 0 0 0)))
+
+(define (get-fork i)
+ (list-ref forks-sem i))
+
+(define (is-free? i)
+ (semaphore-try-wait? (get-fork i)))
+
+(define (put-fork dining-table i)
+ ((dining-table 'put-fork) i)
+ (semaphore-post (get-fork i)))
+
+(define (philosopher dining-table i)
+ (define left-fork i)
+ (define right-fork (modulo (+ i 1) 5))
+ (define (loop)
+ (if (is-free? left-fork)
+ (if (is-free? right-fork)
+ (begin
+ ((dining-table 'pick-fork) left-fork)
+ ((dining-table 'pick-fork) right-fork)
+ (put-fork dining-table left-fork)
+ (put-fork dining-table right-fork))
+ (loop))
+ (begin
+ (semaphore-post (get-fork left-fork))
+ (loop))))
+ (loop)) \ No newline at end of file
diff --git a/semestr-2/racket/l7z12/solution.rkt b/semestr-2/racket/l7z12/solution.rkt
new file mode 100644
index 0000000..089dee4
--- /dev/null
+++ b/semestr-2/racket/l7z12/solution.rkt
@@ -0,0 +1,95 @@
+#lang racket
+
+(provide (struct-out const)
+ (struct-out binop)
+ (struct-out var-expr)
+ (struct-out let-expr)
+ (struct-out pos)
+ (struct-out var-free)
+ (struct-out var-bound)
+ annotate-expression)
+
+;; ---------------
+;; Jezyk wejsciowy
+;; ---------------
+
+(struct pos (file line col) #:transparent)
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (loc id e1 e2) #:transparent)
+
+(define (expr? e)
+ (match e
+ [(const n) (number? n)]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr loc x e1 e2)
+ (and (pos? loc) (symbol? x) (expr? e1) (expr? e2))]
+ [_ false]))
+
+(define (make-pos s)
+ (pos (syntax-source s)
+ (syntax-line s)
+ (syntax-column s)))
+
+(define (parse e)
+ (let ([r (syntax-e e)])
+ (cond
+ [(number? r) (const r)]
+ [(symbol? r) (var-expr r)]
+ [(and (list? r) (= 3 (length r)))
+ (match (syntax-e (car r))
+ ['let (let* ([e-def (syntax-e (second r))]
+ [x (syntax-e (first e-def))])
+ (let-expr (make-pos (first e-def))
+ (if (symbol? x) x (error "parse error!"))
+ (parse (second e-def))
+ (parse (third r))))]
+ [op (binop op (parse (second r)) (parse (third r)))])]
+ [else (error "parse error!")])))
+
+;; ---------------
+;; Jezyk wyjsciowy
+;; ---------------
+
+(struct var-free (id) #:transparent)
+(struct var-bound (pos id) #:transparent)
+
+(define (expr-annot? e)
+ (match e
+ [(const n) (number? n)]
+ [(binop op l r) (and (symbol? op) (expr-annot? l) (expr-annot? r))]
+ [(var-free x) (symbol? x)]
+ [(var-bound loc x) (and (pos? loc) (symbol? x))]
+ [(let-expr loc x e1 e2)
+ (and (pos? loc) (symbol? x) (expr-annot? e1) (expr-annot? e2))]
+ [_ false]))
+
+(struct environ (xs))
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) false]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+(define (annotate-expression-env e env)
+ (match e
+ [(const r) (const r)]
+ [(binop op l r) (binop op (annotate-expression-env l env) (annotate-expression-env r env))]
+ [(var-expr x) (let ((pos (env-lookup x env)))
+ (if pos
+ (var-bound pos x)
+ (var-free x)))]
+ [(let-expr loc x e1 e2) (let-expr loc x (annotate-expression-env e1 env) (annotate-expression-env e2 (env-add x loc env)))]))
+
+(define (annotate-expression e)
+ (annotate-expression-env e env-empty))
+
+(define (test) (annotate-expression (parse #'(let [x 5] (let [x (* x y)] (+ x y))))))
diff --git a/semestr-2/racket/l7z13/solution.rkt b/semestr-2/racket/l7z13/solution.rkt
new file mode 100644
index 0000000..0a0278a
--- /dev/null
+++ b/semestr-2/racket/l7z13/solution.rkt
@@ -0,0 +1,104 @@
+#lang racket
+
+(provide (struct-out const) (struct-out binop) (struct-out var-expr) (struct-out let-expr) (struct-out var-dead) find-dead-vars)
+
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct var-dead (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+
+(define (expr? e)
+ (match e
+ [(const n) (number? n)]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(var-dead x) (symbol? x)]
+ [(let-expr x e1 e2) (and (symbol? x) (expr? e1) (expr? e2))]
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]))
+
+; ---------------------------------- ;
+; Wyszukaj ostatnie uzycie zmiennych ;
+; ---------------------------------- ;
+
+(struct environ (xs))
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "unbound identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+(define (env-erase x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "unbound identifier" x)]
+ [(eq? x (caar xs)) (cdr xs)]
+ [else (cons (car xs) (assoc-lookup (cdr xs)))]))
+ (if (env-lookup x env)
+ (environ (assoc-lookup (assoc-lookup (environ-xs env))))
+ (environ (assoc-lookup (environ-xs env)))))
+
+
+(define (find-dead-vars-env e env)
+ (match e
+ [(const r) (cons (const r) env)]
+ [(var-expr x) (if (env-lookup x env)
+ (cons (var-expr x) env)
+ (cons (var-dead x) (env-add x true env)))]
+ [(binop op l r) (let* ((right-expr (find-dead-vars-env r env))
+ (r (car right-expr))
+ (env (cdr right-expr))
+ (left-expr (find-dead-vars-env l env))
+ (l (car left-expr))
+ (env (cdr left-expr)))
+ (cons (binop op l r) env))]
+ [(let-expr x e1 e2) (let* ((right-expr (find-dead-vars-env e2 (env-add x false env)))
+ (e2 (car right-expr))
+ (env (env-erase x (cdr right-expr)))
+ (left-expr (find-dead-vars-env e1 env))
+ (e1 (car left-expr))
+ (env (cdr left-expr)))
+ (cons (let-expr x e1 e2) env))]))
+
+(define (find-dead-vars e)
+ (car (find-dead-vars-env e env-empty)))
+
+
+(define (sample2) (find-dead-vars (let-expr 'x (const 3)
+ (binop '+ (var-expr 'x)
+ (let-expr 'x (const 5) (binop '+ (var-expr 'x) (var-expr 'x)))))))
+
+(define (test1) (find-dead-vars (parse '(let (x 3) (let (x (* x (+ x x))) (+ x x))))))
+(define (test2) (find-dead-vars (parse '(let (x 2) (let [x (let [x (+ x 2)] x)] x)))))
+(define (test3) (find-dead-vars (parse '(let [x 2] (+ (let [x (+ 2 x)] (* 3 x)) x)))))
+(define (test4) (find-dead-vars (parse '(let [x 2] (let [x (+ x 3)] (* x x))))))
+(define (test5) (find-dead-vars (parse '(let [x 2] (+ x (let [x (+ 2 x)] x))))))
+(define (test6) (find-dead-vars (parse '(let [x 2]
+ (let [y (let [x (* x (+ x x))]
+ (let [y (* x x)]
+ (+ y 2)))]
+ (+ x (* y y)))))))
+(define (test7) (find-dead-vars (parse '(let [x (let [x (let [x 2] (+ x x))] (+ x x))] (+ x x)))))
+;;; (define (test7) (find-dead-vars (parse '(let [x (let [x (let [x 2] (let (x 2) (+ x x)))] (+ x x))] (+ x x)))))
+(define (test8) (find-dead-vars (parse '(let [x 2] (let [x 2] (+ x x)))))) \ No newline at end of file
diff --git a/semestr-2/racket/l8z14/solution.bak b/semestr-2/racket/l8z14/solution.bak
new file mode 100644
index 0000000..b51383a
--- /dev/null
+++ b/semestr-2/racket/l8z14/solution.bak
@@ -0,0 +1,155 @@
+#lang racket
+
+; Do list.rkt dodajemy procedury
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+(struct cons-expr (e1 e2) #:transparent)
+(struct car-expr (e) #:transparent)
+(struct cdr-expr (e) #:transparent)
+(struct null-expr () #:transparent)
+(struct null?-expr (e) #:transparent)
+(struct app (f e) #:transparent) ; <------------------ !!!
+(struct lam (id e) #:transparent) ; <------------------ !!!
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n))]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef)
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [(cons-expr e1 e2) (and (expr? e1) (expr? e2))]
+ [(car-expr e) (expr? e)]
+ [(cdr-expr e) (expr? e)]
+ [(null-expr) true]
+ [(null?-expr e) (expr? e)]
+ [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!!
+ [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!!
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(eq? q 'null) (null-expr)]
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?))
+ (null?-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons))
+ (cons-expr (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car))
+ (car-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr))
+ (cdr-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; <!!!
+ (parse-lam (second q) (third q))]
+ [(and (list? q) (pair? q) (not (op->proc (car q)))) ; <------- !!!
+ (parse-app q)]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]))
+
+(define (parse-app q) ; <----------------------------------------- !!!
+ (define (parse-app-accum q acc)
+ (cond [(= 1 (length q)) (app acc (parse (car q)))]
+ [else (parse-app-accum (cdr q) (app acc (parse (car q))))]))
+ (parse-app-accum (cdr q) (parse (car q))))
+
+(define (parse-lam pat e) ; <------------------------------------- !!!
+ (cond [(= 1 (length pat))
+ (lam (car pat) (parse e))]
+ [else
+ (lam (car pat) (parse-lam (cdr pat) e))]))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct environ (xs) #:transparent)
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(struct clo (id e env) #:transparent) ; <------------------------- !!!
+
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (and (pair? v) (value? (car v)) (value? (cdr v)))
+ (null? v)
+ (clo? v))) ; <---------------------------------------------- !!!
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo]
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]
+ ['and (lambda (x y) (and x y))]
+ ['or (lambda (x y) (or x y))]
+ [_ false])) ; <--------------------------------------- !!!
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(var-expr x) (env-lookup x env)]
+ [(if-expr eb et ef) (if (eval-env eb env)
+ (eval-env et env)
+ (eval-env ef env))]
+ [(cons-expr e1 e2) (cons (eval-env e1 env)
+ (eval-env e2 env))]
+ [(car-expr e) (car (eval-env e env))]
+ [(cdr-expr e) (cdr (eval-env e env))]
+ [(null-expr) null]
+ [(null?-expr e) (null? (eval-env e env))]
+ [(lam x e) (clo x e env)] ; <--------------------------------- !!!
+ [(app f e) ; <------------------------------------------------ !!!
+ (let ([vf (eval-env f env)]
+ [ve (eval-env e env)])
+ (match vf [(clo x body fun-env)
+ (eval-env body (env-add x ve fun-env))]))]))
+
+(define (eval e) (eval-env e env-empty))
+
+(define program
+ '(let [twice (lambda (f x) (f (f x)))]
+ (let [inc (lambda (x) (+ 1 x))]
+ (twice twice twice twice inc 1))))
+
+
+(define (test-eval) (eval (parse program))) \ No newline at end of file
diff --git a/semestr-2/racket/l8z14/solution.rkt b/semestr-2/racket/l8z14/solution.rkt
new file mode 100644
index 0000000..59556cf
--- /dev/null
+++ b/semestr-2/racket/l8z14/solution.rkt
@@ -0,0 +1,201 @@
+#lang racket
+
+; Do list.rkt dodajemy procedury
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(provide eval parse)
+
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+(struct cons-expr (e1 e2) #:transparent)
+(struct car-expr (e) #:transparent)
+(struct cdr-expr (e) #:transparent)
+(struct null-expr () #:transparent)
+(struct null?-expr (e) #:transparent)
+(struct app (f e) #:transparent) ; <------------------ !!!
+(struct lam (id e) #:transparent) ; <------------------ !!!
+(struct apply-expr (f xs) #:transparent)
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n))]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef)
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [(cons-expr e1 e2) (and (expr? e1) (expr? e2))]
+ [(car-expr e) (expr? e)]
+ [(cdr-expr e) (expr? e)]
+ [(null-expr) true]
+ [(null?-expr e) (expr? e)]
+ [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!!
+ [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!!
+ [(apply-expr f xs) (and (expr? f) (expr? xs))]
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(eq? q 'null) (null-expr)]
+ [(symbol? q) (var-expr q)]
+ [(and (> (length q) 0) (list? q) (eq? (first q) 'list))
+ (parse-list (cdr q))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?))
+ (null?-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'apply))
+ (apply-expr (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons))
+ (cons-expr (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car))
+ (car-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr))
+ (cdr-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; <!!!
+ (parse-lam (second q) (third q))]
+ [(and (list? q) (pair? q) (not (op->proc (car q)))) ; <------- !!!
+ (parse-app q)]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]))
+
+
+(define (parse-app q) ; <----------------------------------------- !!!
+ (define (parse-app-accum q acc)
+ (cond [(= 1 (length q)) (app acc (parse (car q)))]
+ [else (parse-app-accum (cdr q) (app acc (parse (car q))))]))
+ (parse-app-accum (cdr q) (parse (car q))))
+
+(define (parse-lam pat e) ; <------------------------------------- !!!
+ (cond [(= 1 (length pat))
+ (lam (car pat) (parse e))]
+ [else
+ (lam (car pat) (parse-lam (cdr pat) e))]))
+
+(define (parse-list q)
+ (if (null? q)
+ (null-expr)
+ (cons-expr (parse (car q)) (parse-list (cdr q)))))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct environ (xs) #:transparent)
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(struct clo (id e env) #:transparent) ; <------------------------- !!!
+
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (and (pair? v) (value? (car v)) (value? (cdr v)))
+ (null? v)
+ (clo? v))) ; <---------------------------------------------- !!!
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo]
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]
+ ['and (lambda (x y) (and x y))]
+ ['or (lambda (x y) (or x y))]
+ [_ false])) ; <--------------------------------------- !!!
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(var-expr x) (env-lookup x env)]
+ [(if-expr eb et ef) (if (eval-env eb env)
+ (eval-env et env)
+ (eval-env ef env))]
+ [(cons-expr e1 e2) (cons (eval-env e1 env)
+ (eval-env e2 env))]
+ [(car-expr e) (car (eval-env e env))]
+ [(cdr-expr e) (cdr (eval-env e env))]
+ [(null-expr) null]
+ [(null?-expr e) (null? (eval-env e env))]
+ [(apply-expr e1 e2)
+ (let ([xs (eval-env e2 env)])
+ (eval-env (eval-apply e1 (reverse xs)) env))]
+ [(lam x e) (clo x e env)] ; <--------------------------------- !!!
+ [(app f e) ; <------------------------------------------------ !!!
+ (let ([vf (eval-env f env)]
+ [ve (eval-env e env)])
+ (match vf [(clo x body fun-env)
+ (eval-env body (env-add x ve fun-env))]))]))
+
+(define (eval-apply e xs)
+ (if (null? xs)
+ e
+ (app (eval-apply e (cdr xs)) (const (car xs)))))
+
+(define (eval e) (eval-env e env-empty))
+
+;; testy wspólnie z Karolem Ochmanem
+
+(define program1
+ '(apply (lambda (x y) (+ x y))
+ (cons 1 (cons 2 null))))
+(define program2
+ '(apply (lambda (x y z) (+ x (+ y z)))
+ (cons 1 (cons 2 null))))
+(define program3
+ '(apply (lambda (x y) (lambda (z) (+ x (+ y z))))
+ (cons 1 (cons 2 (cons 3 null)))))
+(define program4
+ '(apply (lambda (x y) (+ x y))
+ (cons 1 (cons 2 (cons 3 null)))))
+(define program5
+ '(let [f (lambda (x y z) (+ z (+ x y)))]
+ (apply (f 3) (cons 1 (cons 2 null)))))
+(define program6
+ '(let [f (lambda (x) x)]
+ (apply (f 4) null)))
+(define program7
+ '(apply (lambda (q w e r t y u i o p a s d f g h j k l) 3)
+ (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1
+ (cons 1 (cons 1 (cons 1 (cons 1 (cons 1
+ (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 null)))))))))))))))))))))
+(define program8
+ '(apply (lambda (q w e r t y u i o p a s d f g h j k l) 3)
+ (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1
+ (cons 1 (cons 1 (cons 1 (cons 1 null))))))))))))))) \ No newline at end of file
diff --git a/semestr-2/racket/l8z15/solution.bak b/semestr-2/racket/l8z15/solution.bak
new file mode 100644
index 0000000..cdc84f9
--- /dev/null
+++ b/semestr-2/racket/l8z15/solution.bak
@@ -0,0 +1,187 @@
+#lang racket
+
+; Do list.rkt dodajemy procedury
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+(provide parse eval)
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+(struct cons-expr (e1 e2) #:transparent)
+(struct car-expr (e) #:transparent)
+(struct cdr-expr (e) #:transparent)
+(struct null-expr () #:transparent)
+(struct null?-expr (e) #:transparent)
+(struct app (f e) #:transparent) ; <------------------ !!!
+(struct lam (id e) #:transparent) ; <------------------ !!!
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n))]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef)
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [(cons-expr e1 e2) (and (expr? e1) (expr? e2))]
+ [(car-expr e) (expr? e)]
+ [(cdr-expr e) (expr? e)]
+ [(null-expr) true]
+ [(null?-expr e) (expr? e)]
+ [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!!
+ [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!!
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(eq? q 'null) (null-expr)]
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?))
+ (null?-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons))
+ (cons-expr (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car))
+ (car-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr))
+ (cdr-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; <!!!
+ (parse-lam (second q) (third q))]
+ [(and (list? q) (pair? q) (not (op->proc (car q)))) ; <------- !!!
+ (parse-app q)]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]))
+
+(define (parse-app q) ; <----------------------------------------- !!!
+ (define (parse-app-accum q acc)
+ (cond [(= 1 (length q)) (app acc (parse (car q)))]
+ [else (parse-app-accum (cdr q) (app acc (parse (car q))))]))
+ (parse-app-accum (cdr q) (parse (car q))))
+
+(define (parse-lam pat e) ; <------------------------------------- !!!
+ (cond [(= 1 (length pat))
+ (lam (car pat) (parse e))]
+ [else
+ (lam (car pat) (parse-lam (cdr pat) e))]))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct environ (xs) #:transparent)
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(struct clo (id e env) #:transparent) ; <------------------------- !!!
+(struct odr (e env) #:transparent)
+
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (and (pair? v) (value? (car v)) (value? (cdr v)))
+ (null? v)
+ (clo? v))) ; <---------------------------------------------- !!!
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo]
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]
+ ['and (lambda (x y) (and x y))]
+ ['or (lambda (x y) (or x y))]
+ [_ false])) ; <--------------------------------------- !!!
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(var-expr x) (match (env-lookup x env)
+ [(odr e env) (eval-env e env)]
+ [f f])]
+ [(if-expr eb et ef) (if (eval-env eb env)
+ (eval-env et env)
+ (eval-env ef env))]
+ [(cons-expr e1 e2) (cons (odr e1 env)
+ (odr e2 env))]
+ [(car-expr e) (let ([p (eval-env e env)])
+ (match (car p)
+ [(odr e env) (eval-env e env)]))]
+ [(cdr-expr e) (let ([p (eval-env e env)])
+ (match (cdr p)
+ [(odr e env) (eval-env e env)]))]
+ [(null-expr) null]
+ [(null?-expr e) (null? (eval-env e env))]
+ [(lam x e) (clo x e env)] ; <--------------------------------- !!!
+ [(app f e) ; <------------------------------------------------ !!!
+ (let ([vf (eval-env f env)]
+ [ve (odr e env)])
+ (match vf [(clo x body fun-env)
+ (eval-env body (env-add x ve fun-env))]))]))
+
+(define (eval e) (eval-env e env-empty))
+
+(define program
+ '(let [twice (lambda (f x) (f (f x)))]
+ (let [inc (lambda (x) (+ 1 x))]
+ (twice twice twice twice inc 1))))
+
+
+;;; Testy wspólnie z Karolem Ochmanem
+
+(define (test-eval program) (eval (parse program)))
+
+(define program1
+ '((lambda (x) (+ 3 3)) (/ 5 0)))
+(define program2
+ '(let [if-fun (lambda (b t e) (if b t e))]
+ (if-fun true 4 (/ 5 0))))
+(define program3
+ '(car (cdr (cons 1 (cons 2 (cons 3 (cons 4 null)))))))
+(define program4
+ '(car (cons (+ 3 4) (/ 5 0))))
+(define program5
+ '(cons (+ 5 6) (- 4 3)))
+(define program6
+ '(car (cdr (cdr (car (cons (cons (/ 0 0) (cons (/ 0 0) (cons 1 (/ 0 0)))) (cdr (cons (/ 0 0) null))))))))
+;;; (test-eval program)
+;;; (test-eval program1)
+;;; (test-eval program2)
+;;; (test-eval program3)
+;;; (test-eval program4)
+;;; (test-eval program5)
+;;; (test-eval program6) \ No newline at end of file
diff --git a/semestr-2/racket/l8z15/solution.rkt b/semestr-2/racket/l8z15/solution.rkt
new file mode 100644
index 0000000..54b6cd3
--- /dev/null
+++ b/semestr-2/racket/l8z15/solution.rkt
@@ -0,0 +1,182 @@
+#lang racket
+
+; Do list.rkt dodajemy procedury
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+(provide parse eval)
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+(struct cons-expr (e1 e2) #:transparent)
+(struct car-expr (e) #:transparent)
+(struct cdr-expr (e) #:transparent)
+(struct null-expr () #:transparent)
+(struct null?-expr (e) #:transparent)
+(struct app (f e) #:transparent) ; <------------------ !!!
+(struct lam (id e) #:transparent) ; <------------------ !!!
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n))]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef)
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [(cons-expr e1 e2) (and (expr? e1) (expr? e2))]
+ [(car-expr e) (expr? e)]
+ [(cdr-expr e) (expr? e)]
+ [(null-expr) true]
+ [(null?-expr e) (expr? e)]
+ [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!!
+ [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!!
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(eq? q 'null) (null-expr)]
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?))
+ (null?-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons))
+ (cons-expr (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car))
+ (car-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr))
+ (cdr-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; <!!!
+ (parse-lam (second q) (third q))]
+ [(and (list? q) (pair? q) (not (op->proc (car q)))) ; <------- !!!
+ (parse-app q)]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]))
+
+(define (parse-app q) ; <----------------------------------------- !!!
+ (define (parse-app-accum q acc)
+ (cond [(= 1 (length q)) (app acc (parse (car q)))]
+ [else (parse-app-accum (cdr q) (app acc (parse (car q))))]))
+ (parse-app-accum (cdr q) (parse (car q))))
+
+(define (parse-lam pat e) ; <------------------------------------- !!!
+ (cond [(= 1 (length pat))
+ (lam (car pat) (parse e))]
+ [else
+ (lam (car pat) (parse-lam (cdr pat) e))]))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct environ (xs) #:transparent)
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(struct clo (id e env) #:transparent) ; <------------------------- !!!
+(struct odr (e env) #:transparent)
+
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (and (pair? v) (value? (car v)) (value? (cdr v)))
+ (null? v)
+ (clo? v))) ; <---------------------------------------------- !!!
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo]
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]
+ ['and (lambda (x y) (and x y))]
+ ['or (lambda (x y) (or x y))]
+ [_ false])) ; <--------------------------------------- !!!
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(var-expr x) (match (env-lookup x env)
+ [(odr e env) (eval-env e env)]
+ [f f])]
+ [(if-expr eb et ef) (if (eval-env eb env)
+ (eval-env et env)
+ (eval-env ef env))]
+ [(cons-expr e1 e2) (cons (odr e1 env)
+ (odr e2 env))]
+ [(car-expr e) (let ([p (eval-env e env)])
+ (match (car p)
+ [(odr e env) (eval-env e env)]))]
+ [(cdr-expr e) (let ([p (eval-env e env)])
+ (match (cdr p)
+ [(odr e env) (eval-env e env)]))]
+ [(null-expr) null]
+ [(null?-expr e) (null? (eval-env e env))]
+ [(lam x e) (clo x e env)] ; <--------------------------------- !!!
+ [(app f e) ; <------------------------------------------------ !!!
+ (let ([vf (eval-env f env)]
+ [ve (odr e env)])
+ (match vf [(clo x body fun-env)
+ (eval-env body (env-add x ve fun-env))]))]))
+
+(define (eval e) (eval-env e env-empty))
+
+
+;;; Testy wspólnie z Karolem Ochmanem
+
+(define (test-eval program) (eval (parse program)))
+
+(define program1
+ '((lambda (x) (+ 3 3)) (/ 5 0)))
+(define program2
+ '(let [if-fun (lambda (b t e) (if b t e))]
+ (if-fun true 4 (/ 5 0))))
+(define program3
+ '(car (cdr (cons 1 (cons 2 (cons 3 (cons 4 null)))))))
+(define program4
+ '(car (cons (+ 3 4) (/ 5 0))))
+(define program5
+ '(cons (+ 5 6) (- 4 3)))
+(define program6
+ '(car (cdr (cdr (car (cons (cons (/ 0 0) (cons (/ 0 0) (cons 1 (/ 0 0)))) (cdr (cons (/ 0 0) null))))))))
+;;; (test-eval program)
+;;; (test-eval program1)
+;;; (test-eval program2)
+;;; (test-eval program3)
+;;; (test-eval program4)
+;;; (test-eval program5)
+;;; (test-eval program6) \ No newline at end of file
diff --git a/semestr-2/racket/l9/zad4.rkt b/semestr-2/racket/l9/zad4.rkt
new file mode 100644
index 0000000..7b5e0bc
--- /dev/null
+++ b/semestr-2/racket/l9/zad4.rkt
@@ -0,0 +1,202 @@
+#lang racket
+
+; Do fun.rkt dodajemy rekurencyjne let-y
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct letrec-expr (id e1 e2) #:transparent) ; <----------------- !!!
+(struct if-expr (eb et ef) #:transparent)
+(struct cons-expr (e1 e2) #:transparent)
+(struct car-expr (e) #:transparent)
+(struct cdr-expr (e) #:transparent)
+(struct null-expr () #:transparent)
+(struct null?-expr (e) #:transparent)
+(struct app (f e) #:transparent)
+(struct lam (id e) #:transparent)
+(struct citation (q) #:transparent)
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n))]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(letrec-expr x e1 e2) ; <------------------------------------ !!!
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef)
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [(cons-expr e1 e2) (and (expr? e1) (expr? e2))]
+ [(car-expr e) (expr? e)]
+ [(cdr-expr e) (expr? e)]
+ [(null-expr) true]
+ [(null?-expr e) (expr? e)]
+ [(app f e) (and (expr? f) (expr? e))]
+ [(lam id e) (and (symbol? id) (expr? e))]
+ [(citation q) true]
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(eq? q 'null) (null-expr)]
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? 'quote (first q))) (citation (second q))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?))
+ (null?-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons))
+ (cons-expr (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car))
+ (car-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr))
+ (cdr-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'letrec)) ; <!!!
+ (letrec-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda))
+ (parse-lam (second q) (third q))]
+ [(and (list? q) (pair? q) (not (op->proc (car q))))
+ (parse-app q)]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]))
+
+(define (parse-app q)
+ (define (parse-app-accum q acc)
+ (cond [(= 1 (length q)) (app acc (parse (car q)))]
+ [else (parse-app-accum (cdr q) (app acc (parse (car q))))]))
+ (parse-app-accum (cdr q) (parse (car q))))
+
+(define (parse-lam pat e)
+ (cond [(= 1 (length pat))
+ (lam (car pat) (parse e))]
+ [else
+ (lam (car pat) (parse-lam (cdr pat) e))]))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct blackhole () #:transparent) ; <------------------------- !!!
+(struct environ (xs) #:transparent)
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (mcons x v) (environ-xs env)))) ; <-------------- !!!
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (mcar (car xs))) ; <---------------------------- !!!
+ (match (mcdr (car xs))
+ [(blackhole) (error "Stuck forever in a black hole!")]
+ [x x])]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+(define (env-update! x v xs) ; <---------------------------------- !!!
+ (define (assoc-update! xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (mcar (car xs))) (set-mcdr! (car xs) v)]
+ [else (env-update! x v (cdr xs))]))
+ (assoc-update! (environ-xs xs)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(struct clo (id e env) #:transparent)
+
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (and (pair? v) (value? (car v)) (value? (cdr v)))
+ (null? v)
+ (clo? v)
+ (blackhole? v))) ; <---------------------------------------- !!!
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo]
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]
+ ['and (lambda (x y) (and x y))]
+ ['or (lambda (x y) (or x y))]
+ [_ false]))
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(citation q) q]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(letrec-expr x e1 e2) ; <------------------------------------ !!!
+ (let* ([new-env (env-add x (blackhole) env)]
+ [v (eval-env e1 new-env)])
+ (begin
+ (env-update! x v new-env)
+ (eval-env e2 new-env)))]
+ [(var-expr x) (env-lookup x env)]
+ [(if-expr eb et ef) (if (eval-env eb env)
+ (eval-env et env)
+ (eval-env ef env))]
+ [(cons-expr e1 e2) (cons (eval-env e1 env)
+ (eval-env e2 env))]
+ [(car-expr e) (car (eval-env e env))]
+ [(cdr-expr e) (cdr (eval-env e env))]
+ [(null-expr) null]
+ [(null?-expr e) (null? (eval-env e env))]
+ [(lam x e) (clo x e env)]
+ [(app f e)
+ (let ([vf (eval-env f env)]
+ [ve (eval-env e env)])
+ (match vf [(clo x body fun-env)
+ (eval-env body (env-add x ve fun-env))]))]))
+
+(define (eval e) (eval-env e env-empty))
+
+(define program
+ '(letrec
+ [fact (lambda (n) (if (= n 0) 1 (* n (fact (- n 1)))))]
+ (letrec
+ [even-odd
+ (cons
+ (lambda (x)
+ (if (= x 0) true ((cdr even-odd) (- x 1))))
+ (lambda (x)
+ (if (= x 0) false ((car even-odd) (- x 1)))))]
+ (let [even (car even-odd)]
+ (let [odd (cdr even-odd)]
+ (even (fact 6)))))))
+
+(define PROGRAM
+ '(letrec [from-to (lambda (n k)
+ (if (> n k)
+ null
+ (cons n (from-to (+ n 1) k))))]
+ (letrec [sum (lambda (xs)
+ (if (null? xs)
+ 0
+ (+ (car xs) (sum (cdr xs)))))]
+ (sum (from-to 1 36)))))
+
+(define (test-eval) (eval (parse PROGRAM))) \ No newline at end of file
diff --git a/semestr-2/racket/l9/zad7.rkt b/semestr-2/racket/l9/zad7.rkt
new file mode 100644
index 0000000..207162d
--- /dev/null
+++ b/semestr-2/racket/l9/zad7.rkt
@@ -0,0 +1,340 @@
+#lang racket
+
+;; Składnia abstrakcyjna
+(struct const (val) #:transparent)
+(struct var-expr (name) #:transparent)
+(struct let-expr (id bound body) #:transparent)
+(struct letrec-expr (id bound body) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+(struct lambda-expr (arg body) #:transparent)
+(struct app-expr (fun arg) #:transparent)
+(struct display-expr (e) )
+
+(define (keyword s)
+ (member s '(true false null and or if cond else lambda let letrec display read)))
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n)
+ (boolean? n)
+ (null? n)
+ (string? n))]
+ [(var-expr id) (symbol? id)]
+ [(let-expr x e1 e2 ) (and (symbol? x)
+ (expr? e1)
+ (expr? e2))]
+ [(letrec-expr x e1 e2) (and (symbol? x)
+ (expr? e1)
+ (expr? e2))]
+ [(if-expr eb et ef) (and (expr? eb)
+ (expr? et)
+ (expr? ef))]
+ [(lambda-expr x e) (and (symbol? x)
+ (expr? e))]
+ [(app-expr ef ea) (and (expr? ef)
+ (expr? ea))]
+ [_ false]))
+
+;; Parsowanie (zacytowane wyrażenie -> składnia abstrakcyjna)
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(string? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(eq? q 'null) (const null)]
+ [(and (symbol? q)
+ (not (keyword q)))
+ (var-expr q)]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'let)
+ (list? (second q))
+ (= (length (second q)) 2)
+ (symbol? (first (second q))))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'letrec)
+ (list? (second q))
+ (= (length (second q)) 2)
+ (symbol? (first (second q))))
+ (letrec-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q)
+ (= (length q) 4)
+ (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q)
+ (pair? q)
+ (eq? (first q) 'and))
+ (desugar-and (map parse (cdr q)))]
+ [(and (list? q)
+ (pair? q)
+ (eq? (first q) 'or))
+ (desugar-or (map parse (cdr q)))]
+ [(and (list? q)
+ (>= (length q) 2)
+ (eq? (first q) 'cond))
+ (parse-cond (cdr q))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'lambda)
+ (list? (second q))
+ (andmap symbol? (second q))
+ (cons? (second q)))
+ (desugar-lambda (second q) (parse (third q)))]
+ [(and (list? q)
+ (>= (length q) 2))
+ (desugar-app (parse (first q)) (map parse (cdr q)))]
+ [else (error "Unrecognized token:" q)]))
+
+(define (parse-cond qs)
+ (match qs
+ [(list (list 'else q))
+ (parse q)]
+
+ [(list (list q _))
+ (error "Expected 'else' in last branch but found:" q)]
+
+ [(cons (list qb qt) qs)
+ (if-expr (parse qb) (parse qt) (parse-cond qs))]))
+
+(define (desugar-and es)
+ (if (null? es)
+ (const true)
+ (if-expr (car es) (desugar-and (cdr es)) (const false))))
+
+(define (desugar-or es)
+ (if (null? es)
+ (const false)
+ (if-expr (car es) (const true) (desugar-or (cdr es)))))
+
+(define (desugar-lambda xs e)
+ (if (null? xs)
+ e
+ (lambda-expr (car xs) (desugar-lambda (cdr xs) e))))
+
+(define (desugar-app e es)
+ (if (null? es)
+ e
+ (desugar-app (app-expr e (car es)) (cdr es))))
+
+;; Środowiska
+(struct blackhole ())
+(struct environ (xs))
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (mcons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs)
+ (error "Unknown identifier" x)]
+ [(eq? x (mcar (car xs)))
+ (let ((v (mcdr (car xs))))
+ (if (blackhole? v)
+ (error "Jumped into blackhole at" x)
+ v))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+(define (env-update! x v env)
+ (define (assoc-update xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (mcar (car xs)))
+ (set-mcdr! (car xs) v)]
+ [else (assoc-update (cdr xs))]))
+ (assoc-update (environ-xs env)))
+
+;; Domknięcia
+(struct clo (arg body env))
+
+;; Procedury wbudowane, gdzie
+;; proc — Racketowa procedura którą należy uruchomić
+;; args — lista dotychczas dostarczonych argumentów
+;; pnum — liczba brakujących argumentów (> 0)
+;; W ten sposób pozwalamy na częściową aplikację Racketowych procedur
+;; — zauważmy że zawsze znamy pnum, bo w naszym języku arność
+;; procedury jest ustalona z góry
+(struct builtin (proc args pnum))
+
+;; Pomocnicze konstruktory procedur unarnych i binarnych
+(define (builtin/1 p)
+ (builtin p null 1))
+(define (builtin/2 p)
+ (builtin p null 2))
+
+;; Procedury
+(define (proc? v)
+ (or (and (clo? v)
+ (symbol? (clo-arg v))
+ (expr? (clo-body v))
+ (environ? (clo-env v)))
+ (and (builtin? v)
+ (procedure? (builtin-proc v))
+ (andmap value? (builtin-args v))
+ (natural? (builtin-pnum v))
+ (> (builtin-pnum v) 0))))
+
+;; Definicja typu wartości
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (null? v)
+ (string? v)
+ (and (cons? v)
+ (value? (car v))
+ (value? (cdr v)))
+ (proc? v)))
+
+;; Środowisko początkowe (przypisujące procedury wbudowane ich nazwom)
+
+(define start-env
+ (foldl (lambda (p env) (env-add (first p) (second p) env))
+ env-empty
+ `((+ ,(builtin/2 +))
+ (- ,(builtin/2 -))
+ (* ,(builtin/2 *))
+ (/ ,(builtin/2 /))
+ (~ ,(builtin/1 -))
+ (< ,(builtin/2 <))
+ (> ,(builtin/2 >))
+ (= ,(builtin/2 =))
+ (<= ,(builtin/2 <=))
+ (>= ,(builtin/2 >=))
+ (not ,(builtin/1 not))
+ (cons ,(builtin/2 cons))
+ (car ,(builtin/1 car))
+ (cdr ,(builtin/1 cdr))
+ (pair? ,(builtin/1 cons?))
+ (null? ,(builtin/1 null?))
+ (boolean? ,(builtin/1 boolean?))
+ (number? ,(builtin/1 number?))
+ (procedure? ,(builtin/1 (lambda (x) (or (clo? x) (builtin? x)))))
+ (string? ,(builtin/1 string?))
+ (string-= ,(builtin/2 string=?))
+ ;; and so on, and so on
+ )))
+
+;; Ewaluator
+(define (eval-env e env)
+ (match e
+ [(const n)
+ n]
+
+ [(var-expr x)
+ (env-lookup x env)]
+
+ [(let-expr x e1 e2)
+ (let ((v1 (eval-env e1 env)))
+ (eval-env e2 (env-add x v1 env)))]
+
+ [(letrec-expr f ef eb)
+ (let* ((new-env (env-add f (blackhole) env))
+ (vf (eval-env ef new-env)))
+ (env-update! f vf new-env)
+ (eval-env eb new-env))]
+
+ [(if-expr eb et ef)
+ (match (eval-env eb env)
+ [#t (eval-env et env)]
+ [#f (eval-env ef env)]
+ [v (error "Not a boolean:" v)])]
+
+ [(lambda-expr x e)
+ (clo x e env)]
+
+ [(app-expr ef ea)
+ (let ((vf (eval-env ef env))
+ (va (eval-env ea env)))
+ (match vf
+ [(clo x e env)
+ (eval-env e (env-add x va env))]
+ [(builtin p args nm)
+ (if (= nm 1)
+ (apply p (reverse (cons va args)))
+ (builtin p (cons va args) (- nm 1)))]
+ [_ (error "Not a function:" vf)]))]))
+
+(define (eval e)
+ (eval-env e start-env))
+
+
+;; REPL — interpreter interaktywny (read-eval-print loop)
+
+;; dodajemy składnię na wiązanie zmiennych "na poziomie interpretera"
+;; i komendę wyjścia "exit" ...
+(struct letrec-repl (id expr))
+(struct let-repl (id expr))
+(struct exit-repl ())
+
+;; ... a także rozszerzoną procedurę parsującą te dodatkowe komendy i
+;; prostą obsługę błędów
+(define (parse-repl q)
+ (with-handlers
+ ([exn? (lambda (exn)
+ (display "Parse error! ")
+ (displayln (exn-message exn)))])
+ (cond
+ [(eq? q 'exit) (exit-repl)]
+ [(and (list? q)
+ (= 3 (length q))
+ (eq? (first q) 'let))
+ (let-repl (second q) (parse (third q)))]
+ [(and (list? q)
+ (= 3 (length q))
+ (eq? (first q) 'letrec))
+ (letrec-repl (second q) (parse (third q)))]
+ [else (parse q)])))
+
+;; trochę zamieszania w procedurze eval-repl wynika z rudymentarnej
+;; obsługi błędów: nie chcemy żeby błąd w interpretowanym programie
+;; kończył działanie całego interpretera!
+(define (eval-repl c env continue)
+ (define (eval-with-err e env)
+ (with-handlers
+ ([exn? (lambda (exn)
+ (display "Error! ")
+ (displayln (exn-message exn)))])
+ (eval-env e env)))
+ (match c
+ [(exit-repl)
+ (void)]
+
+ [(let-repl x e)
+ (let ((v (eval-with-err e env)))
+ (if (void? v)
+ (continue env)
+ (continue (env-add x v env))))]
+
+ [(letrec-repl f e)
+ (let* ((new-env (env-add f (blackhole) env))
+ (v (eval-with-err e new-env)))
+ (if (void? v)
+ (continue env)
+ (begin
+ (env-update! f v new-env)
+ (continue new-env))))]
+
+ [_
+ (let ((v (eval-with-err c env)))
+ (unless (void? v)
+ (displayln v))
+ (continue env))]))
+
+;; I w końcu interaktywny interpreter
+(define (repl)
+ (define (go env)
+ (display "FUN > ")
+ (let* ((q (read))
+ (c (parse-repl q)))
+ (if (void? c)
+ (go env)
+ (eval-repl c env go))))
+ (displayln "Welcome to the FUN functional language interpreter!")
+ (go start-env)) \ No newline at end of file
diff --git a/semestr-2/racket/l9z16/solution.rkt b/semestr-2/racket/l9z16/solution.rkt
new file mode 100644
index 0000000..0af169d
--- /dev/null
+++ b/semestr-2/racket/l9z16/solution.rkt
@@ -0,0 +1,42 @@
+#lang racket
+
+(provide lcons lnull lnull? lcar lcdr)
+
+
+(define (lcons x f) (mcons x f))
+
+(define lnull null)
+
+(define lnull? null?)
+
+(define (lcar xs) (mcar xs))
+
+(define (lcdr xs)
+ (let ([x (mcdr xs)])
+ (cond [(not (mpair? x)) (set-mcdr! xs (x))]))
+ (mcdr xs))
+
+(define (from n)
+ (lcons n (lambda () (from (+ n 1)))))
+
+(define nats
+ (from 0))
+
+(define (lnth n xs)
+ (cond [(= n 0) (lcar xs)]
+ [else (lnth (- n 1) (lcdr xs))]))
+
+(define (lfilter p xs)
+ (cond [(lnull? xs) lnull]
+ [(p (lcar xs))
+ (lcons (lcar xs) (lambda () (lfilter p (lcdr xs))))]
+ [else (lfilter p (lcdr xs))]))
+
+(define (prime? n)
+ (define (factors i)
+ (cond [(>= i n) (list n)]
+ [(= (modulo n i) 0) (cons i (factors (+ i 1)))]
+ [else (factors (+ i 1))]))
+ (= (length (factors 1)) 2))
+
+(define primes (lfilter prime? (from 2))) \ No newline at end of file
diff --git a/semestr-2/racket/l9z17/solution.rkt b/semestr-2/racket/l9z17/solution.rkt
new file mode 100644
index 0000000..5e98036
--- /dev/null
+++ b/semestr-2/racket/l9z17/solution.rkt
@@ -0,0 +1,266 @@
+#lang racket
+
+; Do programming.rkt dodajemy instrukcje
+
+(provide eval-while parse-while env-empty env-lookup)
+
+;;; We współpracy z Kacprem Soleckim
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct letrec-expr (id e1 e2) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+(struct cons-expr (e1 e2) #:transparent)
+(struct car-expr (e) #:transparent)
+(struct cdr-expr (e) #:transparent)
+(struct null-expr () #:transparent)
+(struct null?-expr (e) #:transparent)
+(struct app (f e) #:transparent)
+(struct lam (id e) #:transparent)
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n) (string? n))]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(letrec-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef)
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [(cons-expr e1 e2) (and (expr? e1) (expr? e2))]
+ [(car-expr e) (expr? e)]
+ [(cdr-expr e) (expr? e)]
+ [(null-expr) true]
+ [(null?-expr e) (expr? e)]
+ [(app f e) (and (expr? f) (expr? e))]
+ [(lam id e) (and (symbol? id) (expr? e))]
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(eq? q 'null) (null-expr)]
+ [(string? q) (const q)]
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?))
+ (null?-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons))
+ (cons-expr (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car))
+ (car-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr))
+ (cdr-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'letrec))
+ (letrec-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda))
+ (parse-lam (second q) (third q))]
+ [(and (list? q) (pair? q) (not (op->proc (car q))))
+ (parse-app q)]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]))
+
+(define (parse-app q)
+ (define (parse-app-accum q acc)
+ (cond [(= 1 (length q)) (app acc (parse (car q)))]
+ [else (parse-app-accum (cdr q) (app acc (parse (car q))))]))
+ (parse-app-accum (cdr q) (parse (car q))))
+
+(define (parse-lam pat e)
+ (cond [(= 1 (length pat))
+ (lam (car pat) (parse e))]
+ [else
+ (lam (car pat) (parse-lam (cdr pat) e))]))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct blackhole () #:transparent)
+(struct environ (xs) #:transparent)
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (mcons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (mcar (car xs)))
+ (match (mcdr (car xs))
+ [(blackhole) (error "Stuck forever in a black hole!")]
+ [x x])]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+(define (env-update! x v xs)
+ (define (assoc-update! xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (mcar (car xs))) (set-mcdr! (car xs) v)]
+ [else (env-update! x v (cdr xs))]))
+ (assoc-update! (environ-xs xs)))
+(define (env-update x v xs) ; <---------------------------------- !!!
+ (define (assoc-update xs)
+ (cond [(null? xs) (list (mcons x v))]
+ [(eq? x (mcar (car xs))) (cons (mcons x v) (cdr xs))]
+ [else (cons (car xs) (assoc-update (cdr xs)))]))
+ (environ (assoc-update (environ-xs xs))))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(struct clo (id e env) #:transparent)
+(struct let-var (v) #:transparent)
+
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (string? v)
+ (and (pair? v) (value? (car v)) (value? (cdr v)))
+ (null? v)
+ (clo? v)
+ (blackhole? v)))
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo]
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]
+ ['and (lambda (x y) (and x y))]
+ ['or (lambda (x y) (or x y))]
+ ['eq? eq?]
+ [_ false]))
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (let-var (eval-env e1 env)) env))]
+ [(letrec-expr x e1 e2)
+ (let* ([new-env (env-add x (blackhole) env)]
+ [v (eval-env e1 new-env)])
+ (begin
+ (env-update! x v new-env)
+ (eval-env e2 new-env)))]
+ [(var-expr x) (let ((f (env-lookup x env)))
+ (if (let-var? f) (let-var-v f) f))]
+ [(if-expr eb et ef) (if (eval-env eb env)
+ (eval-env et env)
+ (eval-env ef env))]
+ [(cons-expr e1 e2) (cons (eval-env e1 env)
+ (eval-env e2 env))]
+ [(car-expr e) (car (eval-env e env))]
+ [(cdr-expr e) (cdr (eval-env e env))]
+ [(null-expr) null]
+ [(null?-expr e) (null? (eval-env e env))]
+ [(lam x e) (clo x e env)]
+ [(app f e)
+ (let ([vf (eval-env f env)]
+ [ve (eval-env e env)])
+ (match vf [(clo x body fun-env)
+ (eval-env body (env-add x ve (merge-let-vars env fun-env)))]))]))
+
+(define (merge-let-vars env1 env2)
+ (define (iter xs env)
+ (if (null? xs)
+ env
+ (let ((cur-var (car xs)))
+ (if (let-var? (mcdr cur-var))
+ (iter (cdr xs) (env-add (mcar cur-var) (mcdr cur-var) env))
+ (iter (cdr xs) env)))))
+ (iter (reverse (environ-xs env2)) env1))
+
+(define (eval e) (eval-env e env-empty))
+
+; ---------------------------------------------------------------- !!!
+
+(struct skip () #:transparent)
+(struct assign (x e) #:transparent)
+(struct if-cmd (eb ct cf) #:transparent)
+(struct while (eb cb) #:transparent)
+(struct comp (c1 c2) #:transparent)
+
+(define (cmd? c)
+ (match c
+ [(skip) true]
+ [(assign x e) (and (symbol? x) (expr? e))]
+ [(if-cmd eb ct cf) (and (expr? eb) (cmd? ct) (cmd? cf))]
+ [(while eb ct) (and (expr? eb) (cmd? ct))]
+ [else false]))
+
+(define (parse-while q)
+ (cond
+ [(eq? q 'skip) (skip)]
+ [(null? q) (skip)]
+ [(and (list? q) (= (length q) 3) (eq? (second q) ':=))
+ (assign (first q)
+ (parse (third q)))]
+ [(and (list? q) (= (length q) 4) (eq? (car q) 'if))
+ (if-cmd (parse (second q))
+ (parse-while (third q))
+ (parse-while (fourth q)))]
+ [(and (list? q) (= (length q) 3) (eq? (car q) 'while))
+ (while (parse (second q))
+ (parse-while (third q)))]
+ [(and (list? q) (= (length q) 2))
+ (comp (parse-while (first q))
+ (parse-while (second q)))]
+ [(and (list? q) (> (length q) 2))
+ (comp (parse-while (first q))
+ (parse-while (cdr q)))]
+ [else (error "while parse error")]))
+
+(define (eval-while e env)
+ (match e
+ [(skip) env]
+ [(assign x e)
+ (env-update x (eval-env e env) env)]
+ [(if-cmd eb ct cf)
+ (if (eval-env eb env)
+ (eval-while ct env)
+ (eval-while cf env))]
+ [(while eb cb)
+ (if (eval-env eb env)
+ (eval-while e (eval-while cb env))
+ env)]
+ [(comp c1 c2) (eval-while c2 (eval-while c1 env))]))
+
+; zakladamy, ze program startuje z pamiecia w ktorej
+; aktwna jest zmienna t
+(define WHILE_FACT
+ '{(i := 1)
+ (while (> t 0)
+ {(i := (* i t))
+ (t := (- t 1))})})
+
+(define (fact n)
+ (let* ([init-env (env-add 't n env-empty)]
+ [final-env
+ (eval-while (parse-while WHILE_FACT) init-env)])
+ (env-lookup 'i final-env)))
+
+(define prog1 '{(x := 5)
+ (f := (let [x 50] (lambda (y) (+ x y))))
+ (x := 10)
+ (z := (f 0))}) \ No newline at end of file
diff --git a/semestr-2/racket/leftist.rkt b/semestr-2/racket/leftist.rkt
new file mode 100644
index 0000000..78319e4
--- /dev/null
+++ b/semestr-2/racket/leftist.rkt
@@ -0,0 +1,105 @@
+#lang racket
+
+(provide make-elem elem-priority elem-val empty-heap heap-insert heap-merge heap-min heap-pop heap-empty?)
+
+(define (inc n)
+ (+ n 1))
+
+;;; tagged lists
+(define (tagged-list? len-xs tag xs)
+ (and (list? xs)
+ (= len-xs (length xs))
+ (eq? (first xs) tag)))
+
+;;; ordered elements
+(define (make-elem pri val)
+ (cons pri val))
+
+(define (elem-priority x)
+ (car x))
+
+(define (elem-val x)
+ (cdr x))
+
+;;; leftist heaps (after Okasaki)
+
+;; data representation
+(define leaf 'leaf)
+
+(define (leaf? h) (eq? 'leaf h))
+
+(define (hnode? h)
+ (and (tagged-list? 5 'hnode h)
+ (natural? (caddr h))))
+
+(define (make-hnode elem heap-a heap-b)
+ (if (< (rank heap-a) (rank heap-b))
+ (list 'hnode elem (+ (rank heap-a) 1) heap-b heap-a)
+ (list 'hnode elem (+ (rank heap-b) 1) heap-a heap-b)))
+
+(define (hnode-elem h)
+ (second h))
+
+(define (hnode-left h)
+ (fourth h))
+
+(define (hnode-right h)
+ (fifth h))
+
+(define (hnode-rank h)
+ (third h))
+
+(define (hord? p h)
+ (or (leaf? h)
+ (<= p (elem-priority (hnode-elem h)))))
+
+(define (heap? h)
+ (or (leaf? h)
+ (and (hnode? h)
+ (heap? (hnode-left h))
+ (heap? (hnode-right h))
+ (<= (rank (hnode-right h))
+ (rank (hnode-left h)))
+ (= (rank h) (inc (rank (hnode-right h))))
+ (hord? (elem-priority (hnode-elem h))
+ (hnode-left h))
+ (hord? (elem-priority (hnode-elem h))
+ (hnode-right h)))))
+
+(define (rank h)
+ (if (leaf? h)
+ 0
+ (hnode-rank h)))
+
+;; operations
+
+(define empty-heap leaf)
+
+(define (heap-empty? h)
+ (leaf? h))
+
+(define (heap-insert elt heap)
+ (heap-merge heap (make-hnode elt leaf leaf)))
+
+(define (heap-min heap)
+ (hnode-elem heap))
+
+(define (heap-pop heap)
+ (heap-merge (hnode-left heap) (hnode-right heap)))
+
+(define (heap-merge h1 h2)
+ (cond
+ [(leaf? h1) h2]
+ [(leaf? h2) h1]
+ [else (let ((h1-min (heap-min h1))
+ (h2-min (heap-min h2)))
+ (if (< (elem-priority h1-min) (elem-priority h2-min))
+ (make-hnode h1-min (heap-merge (hnode-left h1) (hnode-right h1)) h2)
+ (make-hnode h2-min h1 (heap-merge (hnode-left h2) (hnode-right h2)))))]))
+
+;;; check that a list is sorted (useful for longish lists)
+(define (sorted? xs)
+ (cond [(null? xs) true]
+ [(null? (cdr xs)) true]
+ [(<= (car xs) (cadr xs)) (sorted? (cdr xs))]
+ [else false]))
diff --git a/semestr-2/racket/lista5/compiled/drracket/errortrace/prop_rkt.dep b/semestr-2/racket/lista5/compiled/drracket/errortrace/prop_rkt.dep
new file mode 100644
index 0000000..6e0cfbb
--- /dev/null
+++ b/semestr-2/racket/lista5/compiled/drracket/errortrace/prop_rkt.dep
@@ -0,0 +1 @@
+("7.6" racket ("f0a57e86828cdab35eaad454d5deb80353172518" . "8314027ed4c1c6fd9c412af77103e94790e59dd2") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt"))
diff --git a/semestr-2/racket/lista5/compiled/drracket/errortrace/prop_rkt.zo b/semestr-2/racket/lista5/compiled/drracket/errortrace/prop_rkt.zo
new file mode 100644
index 0000000..748fec9
--- /dev/null
+++ b/semestr-2/racket/lista5/compiled/drracket/errortrace/prop_rkt.zo
Binary files differ
diff --git a/semestr-2/racket/lista5/compiled/drracket/errortrace/props_rkt.dep b/semestr-2/racket/lista5/compiled/drracket/errortrace/props_rkt.dep
new file mode 100644
index 0000000..0926afc
--- /dev/null
+++ b/semestr-2/racket/lista5/compiled/drracket/errortrace/props_rkt.dep
@@ -0,0 +1 @@
+("7.6" racket ("e0347fa7e89f59bc97c197db02b440f666222428" . "8314027ed4c1c6fd9c412af77103e94790e59dd2") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt"))
diff --git a/semestr-2/racket/lista5/compiled/drracket/errortrace/props_rkt.zo b/semestr-2/racket/lista5/compiled/drracket/errortrace/props_rkt.zo
new file mode 100644
index 0000000..eccc7f7
--- /dev/null
+++ b/semestr-2/racket/lista5/compiled/drracket/errortrace/props_rkt.zo
Binary files differ
diff --git a/semestr-2/racket/lista5/compiled/drracket/errortrace/solution_rkt.dep b/semestr-2/racket/lista5/compiled/drracket/errortrace/solution_rkt.dep
new file mode 100644
index 0000000..9810b4c
--- /dev/null
+++ b/semestr-2/racket/lista5/compiled/drracket/errortrace/solution_rkt.dep
@@ -0,0 +1 @@
+("7.6" racket ("ae3a6974cdd4582f480927d9968aad2f495b7fc4" . "33b0c09c14dce6a2115d810ac3d0f25a9dce3205") #"C:\\Users\\franc\\Documents\\lista5\\props.rkt" (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt"))
diff --git a/semestr-2/racket/lista5/compiled/drracket/errortrace/solution_rkt.zo b/semestr-2/racket/lista5/compiled/drracket/errortrace/solution_rkt.zo
new file mode 100644
index 0000000..ca1ab20
--- /dev/null
+++ b/semestr-2/racket/lista5/compiled/drracket/errortrace/solution_rkt.zo
Binary files differ
diff --git a/semestr-2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.dep b/semestr-2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.dep
new file mode 100644
index 0000000..0926afc
--- /dev/null
+++ b/semestr-2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.dep
@@ -0,0 +1 @@
+("7.6" racket ("e0347fa7e89f59bc97c197db02b440f666222428" . "8314027ed4c1c6fd9c412af77103e94790e59dd2") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt"))
diff --git a/semestr-2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.zo b/semestr-2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.zo
new file mode 100644
index 0000000..eccc7f7
--- /dev/null
+++ b/semestr-2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.zo
Binary files differ
diff --git a/semestr-2/racket/lista5/julita/props.rkt b/semestr-2/racket/lista5/julita/props.rkt
new file mode 100644
index 0000000..204b108
--- /dev/null
+++ b/semestr-2/racket/lista5/julita/props.rkt
@@ -0,0 +1,52 @@
+#lang racket
+
+(provide conj conj-left conj-right conj?
+ disj disj-left disj-right disj?
+ neg neg-subf neg?
+ var?)
+
+
+(define (conj p q)
+ (list 'conj p q))
+
+(define (conj-left f)
+ (second f))
+
+(define (conj-right f)
+ (third f))
+
+(define (conj? t)
+ (and (list? t)
+ (= 3 (length t))
+ (eq? 'conj (car t))))
+
+
+(define (disj p q)
+ (list 'disj p q))
+
+(define (disj-left f)
+ (second f))
+
+(define (disj-right f)
+ (third f))
+
+(define (disj? t)
+ (and (list? t)
+ (= 3 (length t))
+ (eq? 'disj (car t))))
+
+
+(define (neg x)
+ (list 'neg x))
+
+(define (neg-subf x)
+ (second x))
+
+(define (neg? t)
+ (and (list? t)
+ (= 2 (length t))
+ (eq? 'neg (car t))))
+
+
+(define (var? t)
+ (symbol? t))
diff --git a/semestr-2/racket/lista5/julita/solution.bak b/semestr-2/racket/lista5/julita/solution.bak
new file mode 100644
index 0000000..b3dda94
--- /dev/null
+++ b/semestr-2/racket/lista5/julita/solution.bak
@@ -0,0 +1,164 @@
+#lang racket
+
+;;Praca grupowa:
+;;Dawid Holewa
+;;Julita Osman
+;;Aleksandra Stępniewska
+
+(require "props.rkt")
+(provide falsifiable-cnf?)
+
+;Ponieważ formuła w cnf to konjunkcja klauzul
+;a klauzula to alternatywa literałów
+;to formuła w tej postaci jest tautologią
+;wtedy i tylko wtedy gdy
+;wszystkie klauzule w niej występujace sa zawsze prawdziwe (też są tautologiami)
+;w przeciwnym razie, formulę taką da się zanegować;
+;zatem nasz pomysł polega na tym, aby
+;1)sprawdzic czy formula jest tautologia
+;2)jesli tak to zwracamy fałsz
+;3)wpp. pierwsza z klauzul, która nie jest tautologia
+;(zatem jest mozliwa do zanegowania i jednocześnie neguje cała formułe w cnf)
+;"przesuwamy" na początek listy reprezentującej cnf
+
+;dodatkowo to czy klauzula jest tautologią nie musimy sprawdzać wykonując wartościowanie
+;możemy skorzystać z własności alternatywy
+;klauzula bedzię zawsze pawdziwa tylko jeśli conajmniej jedna ze zmiennych występuje jednoczesnie ze swoją negacją
+
+;Falsifiable, która sprawdza każde wartościowania
+;sprawdza 2^(ilosc zmiennych w całym wyrażeniu) wartosciowań,
+;podczas gdy
+;falsifiable, która opiera się na strukturze cnf
+;przechodzi po cnf, aż do napotkania pierwszej
+;mozliwej do zanegowania klauzuli
+;zatem w najroszym przypadku przejdziemy po całym cnf
+;ale zawsze wartosciowania negujacego formule szukamy tylko dla jedenej klauzuli
+;zauważmy,ze jeśli formuła jest tautologią to oszczędzamy bardzo dużo czasu nie rozpartując wszystkich wartosciowań, tylko wypisujac odrazu falsz
+
+;Ta druga jest więc efektywniejsza
+
+(define (lit? f);; a lub ~a
+ (or (var? f) ;;a
+ (and (neg? f);;~a
+ (var? (neg-subf f)))))
+
+(define (lit-pos v)
+ v)
+
+(define (lit-neg v)
+ (neg v))
+
+(define (lit-var l) ;;a-->a ~a-->a
+ (if (var? l)
+ l
+ (neg-subf l)))
+
+(define (lit-pos? l)
+ (var? l))
+
+(define (to-nnf f)
+ (cond
+ [(var? f) (lit-pos f)]
+ [(neg? f) (to-nnf-neg (neg-subf f))]
+ [(conj? f) (conj (to-nnf (conj-left f))
+ (to-nnf (conj-right f)))]
+ [(disj? f) (disj (to-nnf (disj-left f))
+ (to-nnf (disj-right f)))]))
+
+(define (to-nnf-neg f)
+ (cond
+ [(var? f) (lit-neg f)]
+ [(neg? f) (to-nnf (neg-subf f))]
+ [(conj? f) (disj (to-nnf-neg (conj-left f))
+ (to-nnf-neg (conj-right f)))]
+ [(disj? f) (conj (to-nnf-neg (disj-left f))
+ (to-nnf-neg (disj-right f)))]))
+
+(define (mk-cnf xss)
+ (cons 'cnf xss))
+
+(define (clause? f)
+ (and (list? f)
+ (andmap lit? f)))
+
+(define (cnf? f)
+ (and (pair? f)
+ (eq? 'cnf (car f))
+ (list? (cdr f))
+ (andmap clause? (cdr f))))
+
+(define (to-cnf f)
+ (define (join xss yss)
+ (apply append (map (lambda (xs) (map (lambda (ys) (append xs ys)) yss)) xss)))
+
+ (define (go f)
+ (cond
+ [(lit? f) (list (list f))]
+ [(conj? f) (append (go (conj-left f))
+ (go (conj-right f)))]
+ [(disj? f) (join (go (disj-left f))
+ (go (disj-right f)))]))
+ (mk-cnf (go f)))
+
+
+(define (contain-both-literals? claus)
+ (define (aux to-check)
+ (cond [(empty? to-check) #f]
+ [(neg? (car to-check))
+ (if (memq (neg-subf (car to-check)) claus)
+ #t
+ (aux (cdr to-check)))]
+ [else (aux (cdr to-check))]))
+ (aux claus))
+
+
+;; sprawdza czy ktorakolwiek z klauzul z listy reprezentujacej cnf
+;; zawiera chociaz jedną parę zmiennej i jej negacji
+;; zwraca liste pusta jesli cnf jest tautologia
+;; zwraca liste z pierwsza klauzule nie bedaca tautologia "przesunieta" na poczatek (possible-to-neg)
+(define (has-both big-set)
+ (define (possible-to-neg big-set x) ;;przesuwa x-ty element listy big-set na poczatek
+ (define x-ty (list-ref big-set x))
+ (append (list x-ty) (remove x-ty big-set)))
+ (define (aux iter big-set)
+ (if (= iter (length big-set))
+ '()
+ (if (contain-both-literals? (list-ref big-set iter)) ;;sprawdzamy czy iter klauzula cnf ma wystapienie a i ~a jednoczesnie
+ (aux (+ iter 1) big-set)
+ (possible-to-neg big-set iter))))
+ (aux 0 (cdr big-set))) ;;(cdr big-set) bo to cnf czyli pierwszy element listy to edykieta 'cnf
+
+
+(define (falsifiable-cnf? t)
+ (define tt (to-cnf (to-nnf t)))
+ (define f (has-both tt))
+ (if (empty? f)
+ #f
+ (find-valuation f)))
+
+
+(define (valuate f sigma)
+ (define (insigma-proc lista result)
+ (cond [(null? lista) result]
+ [(insigma-proc (cdr lista) (append result (list (lit-var(caar lista)))))]))
+ ;; insigma ---> lista zmiennych z wartosciowania pierwszej klauzuli:
+ (define insigma (insigma-proc sigma '()))
+ (define (aux insigma otherclause sigma)
+ (cond [(null? otherclause) sigma]
+ [(if (memq (lit-var (car otherclause)) insigma)
+ (aux insigma (cdr otherclause) sigma)
+ (if(neg? (car otherclause))
+ (aux (append insigma (list(car otherclause)))
+ (cdr otherclause)
+ (append sigma (list(list (lit-var(car otherclause)) 1))))
+ (aux (append insigma (list(car otherclause)))
+ (cdr otherclause)
+ (append sigma (list(list (car otherclause) 0))))))]))
+ (if (empty? f)
+ sigma
+ (valuate (cdr f)
+ (aux insigma (car f) sigma))))
+
+(define (find-valuation f)
+ (valuate f '()))
+
diff --git a/semestr-2/racket/lista5/julita/solution.rkt b/semestr-2/racket/lista5/julita/solution.rkt
new file mode 100644
index 0000000..da87bf9
--- /dev/null
+++ b/semestr-2/racket/lista5/julita/solution.rkt
@@ -0,0 +1,164 @@
+#lang racket
+
+;;Praca grupowa:
+;;Dawid Holewa
+;;Julita Osman
+;;Aleksandra Stępniewska
+
+(require "props.rkt")
+(provide falsifiable-cnf?)
+
+;Ponieważ formuła w cnf to konjunkcja klauzul
+;a klauzula to alternatywa literałów
+;to formuła w tej postaci jest tautologią
+;wtedy i tylko wtedy gdy
+;wszystkie klauzule w niej występujace sa zawsze prawdziwe (też są tautologiami)
+;w przeciwnym razie, formulę taką da się zanegować;
+;zatem nasz pomysł polega na tym, aby
+;1)sprawdzic czy formula jest tautologia
+;2)jesli tak to zwracamy fałsz
+;3)wpp. pierwsza z klauzul, która nie jest tautologia
+;(zatem jest mozliwa do zanegowania i jednocześnie neguje cała formułe w cnf)
+;"przesuwamy" na początek listy reprezentującej cnf
+
+;dodatkowo to czy klauzula jest tautologią nie musimy sprawdzać wykonując wartościowanie
+;możemy skorzystać z własności alternatywy
+;klauzula bedzię zawsze pawdziwa tylko jeśli conajmniej jedna ze zmiennych występuje jednoczesnie ze swoją negacją
+
+;Falsifiable, która sprawdza każde wartościowania
+;sprawdza 2^(ilosc zmiennych w całym wyrażeniu) wartosciowań,
+;podczas gdy
+;falsifiable, która opiera się na strukturze cnf
+;przechodzi po cnf, aż do napotkania pierwszej
+;mozliwej do zanegowania klauzuli
+;zatem w najroszym przypadku przejdziemy po całym cnf
+;ale zawsze wartosciowania negujacego formule szukamy tylko dla jedenej klauzuli
+;zauważmy,ze jeśli formuła jest tautologią to oszczędzamy bardzo dużo czasu nie rozpartując wszystkich wartosciowań, tylko wypisujac odrazu falsz
+
+;Ta druga jest więc efektywniejsza
+
+(define (lit? f);; a lub ~a
+ (or (var? f) ;;a
+ (and (neg? f);;~a
+ (var? (neg-subf f)))))
+
+(define (lit-pos v)
+ v)
+
+(define (lit-neg v)
+ (neg v))
+
+(define (lit-var l) ;;a-->a ~a-->a
+ (if (var? l)
+ l
+ (neg-subf l)))
+
+(define (lit-pos? l)
+ (var? l))
+
+(define (to-nnf f)
+ (cond
+ [(var? f) (lit-pos f)]
+ [(neg? f) (to-nnf-neg (neg-subf f))]
+ [(conj? f) (conj (to-nnf (conj-left f))
+ (to-nnf (conj-right f)))]
+ [(disj? f) (disj (to-nnf (disj-left f))
+ (to-nnf (disj-right f)))]))
+
+(define (to-nnf-neg f)
+ (cond
+ [(var? f) (lit-neg f)]
+ [(neg? f) (to-nnf (neg-subf f))]
+ [(conj? f) (disj (to-nnf-neg (conj-left f))
+ (to-nnf-neg (conj-right f)))]
+ [(disj? f) (conj (to-nnf-neg (disj-left f))
+ (to-nnf-neg (disj-right f)))]))
+
+(define (mk-cnf xss)
+ (cons 'cnf xss))
+
+(define (clause? f)
+ (and (list? f)
+ (andmap lit? f)))
+
+(define (cnf? f)
+ (and (pair? f)
+ (eq? 'cnf (car f))
+ (list? (cdr f))
+ (andmap clause? (cdr f))))
+
+(define (to-cnf f)
+ (define (join xss yss)
+ (apply append (map (lambda (xs) (map (lambda (ys) (append xs ys)) yss)) xss)))
+
+ (define (go f)
+ (cond
+ [(lit? f) (list (list f))]
+ [(conj? f) (append (go (conj-left f))
+ (go (conj-right f)))]
+ [(disj? f) (join (go (disj-left f))
+ (go (disj-right f)))]))
+ (mk-cnf (go f)))
+
+
+(define (contain-both-literals? claus)
+ (define (aux to-check)
+ (cond [(empty? to-check) #f]
+ [(neg? (car to-check))
+ (if (memq (neg-subf (car to-check)) claus)
+ #t
+ (aux (cdr to-check)))]
+ [else (aux (cdr to-check))]))
+ (aux claus))
+
+
+;; sprawdza czy ktorakolwiek z klauzul z listy reprezentujacej cnf
+;; zawiera chociaz jedną parę zmiennej i jej negacji
+;; zwraca liste pusta jesli cnf jest tautologia
+;; zwraca liste z pierwsza klauzule nie bedaca tautologia "przesunieta" na poczatek (possible-to-neg)
+(define (has-both big-set)
+ (define (possible-to-neg big-set x) ;;przesuwa x-ty element listy big-set na poczatek
+ (define x-ty (list-ref big-set x))
+ (append (list x-ty) (remove x-ty big-set)))
+ (define (aux iter big-set)
+ (if (= iter (length big-set))
+ '()
+ (if (contain-both-literals? (list-ref big-set iter)) ;;sprawdzamy czy iter klauzula cnf ma wystapienie a i ~a jednoczesnie
+ (aux (+ iter 1) big-set)
+ (possible-to-neg big-set iter))))
+ (aux 0 (cdr big-set))) ;;(cdr big-set) bo to cnf czyli pierwszy element listy to edykieta 'cnf
+
+
+(define (falsifiable-cnf? t)
+ (define tt (to-cnf (to-nnf t)))
+ (define f (has-both tt))
+ (if (empty? f)
+ #f
+ (find-valuation f)))
+
+
+(define (valuate f sigma)
+ (define (insigma-proc lista result)
+ (cond [(null? lista) result]
+ [(insigma-proc (cdr lista) (append result (list (lit-var(caar lista)))))]))
+ ;; insigma ---> lista zmiennych z wartosciowania pierwszej klauzuli:
+ (define insigma (insigma-proc sigma '()))
+ (define (aux insigma otherclause sigma)
+ (cond [(null? otherclause) sigma]
+ [(if (memq (lit-var (car otherclause)) insigma)
+ (aux insigma (cdr otherclause) sigma)
+ (if(neg? (car otherclause))
+ (aux (append insigma (list(car otherclause)))
+ (cdr otherclause)
+ (append sigma (list(list (lit-var(car otherclause)) true))))
+ (aux (append insigma (list(car otherclause)))
+ (cdr otherclause)
+ (append sigma (list(list (car otherclause) false))))))]))
+ (if (empty? f)
+ sigma
+ (valuate (cdr f)
+ (aux insigma (car f) sigma))))
+
+(define (find-valuation f)
+ (valuate f '()))
+
diff --git a/semestr-2/racket/lista5/prop.rkt b/semestr-2/racket/lista5/prop.rkt
new file mode 100644
index 0000000..6f1f7b4
--- /dev/null
+++ b/semestr-2/racket/lista5/prop.rkt
@@ -0,0 +1 @@
+#lang racket
diff --git a/semestr-2/racket/lista5/props.bak b/semestr-2/racket/lista5/props.bak
new file mode 100644
index 0000000..1a5659a
--- /dev/null
+++ b/semestr-2/racket/lista5/props.bak
@@ -0,0 +1,71 @@
+#lang racket
+
+(provide var?
+ neg?
+ conj?
+ disj?
+ conj
+ disj
+ neg
+ conj-left
+ conj-right
+ disj-right
+ disj-left
+ neg-subf)
+; (require "solution.rkt")
+
+(define (var? t) (symbol? t))
+
+(define (neg? t)
+ (and (list? t)
+ (= 2 (length t))
+ (eq? 'neg (car t))))
+
+(define (conj? t)
+ (and (list? t)
+ (= 3 (length t))
+ (eq? 'conj (car t))))
+
+(define (disj? t)
+ (and (list? t)
+ (= 3 (length t))
+ (eq? 'disj (car t))))
+
+(define (lit? t)
+ (or (var? t)
+ (and (neg? t)
+ (var? (neg-subf t)))))
+
+(define (conj left right)
+ (list 'conj left right))
+
+(define (disj left right)
+ (list 'disj left right))
+
+(define (neg f)
+ (list 'neg f))
+
+(define (conj-left f)
+ (if (conj? f)
+ (cadr f)
+ (error "Złe dane ze znacznikiem -- CONJ-LEFT" f)))
+
+(define (conj-right f)
+ (if (conj? f)
+ (caddr f)
+ (error "Złe dane ze znacznikiem -- CONJ-RIGHT" f)))
+
+(define (disj-left f)
+ (if (disj? f)
+ (cadr f)
+ (error "Złe dane ze znacznikiem -- DISJ-LEFT" f)))
+
+(define (disj-right f)
+ (if (disj? f)
+ (caddr f)
+ (error "Złe dane ze znacznikiem -- DISJ-RIGHT" f)))
+
+(define (neg-subf f)
+ (if (neg? f)
+ (cadr f)
+ (error "Złe dane ze znacznikiem -- NEG-FORM" f)))
diff --git a/semestr-2/racket/lista5/props.rkt b/semestr-2/racket/lista5/props.rkt
new file mode 100644
index 0000000..204b108
--- /dev/null
+++ b/semestr-2/racket/lista5/props.rkt
@@ -0,0 +1,52 @@
+#lang racket
+
+(provide conj conj-left conj-right conj?
+ disj disj-left disj-right disj?
+ neg neg-subf neg?
+ var?)
+
+
+(define (conj p q)
+ (list 'conj p q))
+
+(define (conj-left f)
+ (second f))
+
+(define (conj-right f)
+ (third f))
+
+(define (conj? t)
+ (and (list? t)
+ (= 3 (length t))
+ (eq? 'conj (car t))))
+
+
+(define (disj p q)
+ (list 'disj p q))
+
+(define (disj-left f)
+ (second f))
+
+(define (disj-right f)
+ (third f))
+
+(define (disj? t)
+ (and (list? t)
+ (= 3 (length t))
+ (eq? 'disj (car t))))
+
+
+(define (neg x)
+ (list 'neg x))
+
+(define (neg-subf x)
+ (second x))
+
+(define (neg? t)
+ (and (list? t)
+ (= 2 (length t))
+ (eq? 'neg (car t))))
+
+
+(define (var? t)
+ (symbol? t))
diff --git a/semestr-2/racket/lista5/skrr/solution.bak b/semestr-2/racket/lista5/skrr/solution.bak
new file mode 100644
index 0000000..72c7f36
--- /dev/null
+++ b/semestr-2/racket/lista5/skrr/solution.bak
@@ -0,0 +1,135 @@
+#lang racket
+
+(provide falsifiable-cnf?)
+(require "props.rkt")
+
+(define (prop? f)
+ (or (var? f)
+ (and (neg? f)
+ (prop? (neg-subf f)))
+ (and (disj? f)
+ (prop? (disj-left f))
+ (prop? (disj-right f)))
+ (and (conj? f)
+ (prop? (conj-left f))
+ (prop? (conj-right f)))))
+
+(define (lit-var f)
+ (cond [(var? f) f]
+ [(neg? f) (neg-subf f)]
+ [else (error "Złe dane ze znacznikiem -- LIT-VAR" f)]))
+
+(define (free-vars f)
+ (cond [(null? f) null]
+ [(var? f) (list f)]
+ [(neg? f) (free-vars (neg-subf f))]
+ [(conj? f) (append (free-vars (conj-left f))
+ (free-vars (conj-right f)))]
+ [(disj? f) (append (free-vars (disj-left f))
+ (free-vars (disj-right f)))]
+ [else (error "Zła formula -- FREE-VARS" f)]))
+
+(define (gen-vals xs)
+ (if (null? xs)
+ (list null)
+ (let*
+ ((vss (gen-vals (cdr xs)))
+ (x (car xs))
+ (vst (map (λ (vs) (cons (list x true) vs)) vss))
+ (vsf (map (λ (vs) (cons (list x false) vs)) vss)))
+ (append vst vsf))))
+
+(define (eval-formula f evaluation)
+ (cond [(var? f)
+ (let ((val (assoc f evaluation)))
+ (if (not val)
+ (error "Zmienna wolna nie wystepuje w wartościowaniu -- EVAL-FORMULA" f evaluation)
+ (cadr val)))]
+ [(neg? f) (not (eval-formula (neg-subf f) evaluation))]
+ [(disj? f) (or (eval-formula (disj-left f) evaluation)
+ (eval-formula (disj-right f) evaluation))]
+ [(conj? f) (and (eval-formula (conj-left f) evaluation)
+ (eval-formula (conj-right f) evaluation))]
+ [else (error "Zła formuła -- EVAL-FORMULA" f evaluation)]))
+
+(define (falsifiable-eval? f)
+ (let* ((evaluations (gen-vals (free-vars f)))
+ (results (map (λ (evaluation) (eval-formula f evaluation)) evaluations)))
+ (ormap false? results)))
+
+(define (nff? f)
+ (cond [(lit? f) true]
+ [(neg? f) false]
+ [(conj? f) (and (nff? (conj-left f))
+ (nff? (conj-right f)))]
+ [(disj? f) (and (nff? (disj-left f))
+ (nff? (disj-right f)))]
+ [else (error "Zła formuła -- NFF?" f)]))
+
+(define (convert-to-nnf f)
+ (cond [(lit? f) f]
+ [(neg? f) (convert-negation (neg-subf f))]
+ [(conj? f) (conj (convert-to-nnf (conj-left f))
+ (convert-to-nnf (conj-right f)))]
+ [(disj? f) (disj (convert-to-nnf (disj-left f))
+ (convert-to-nnf (disj-right f)))]
+ [else (error "Zła formuła -- CONVERT" f)]))
+
+(define (convert-negation f)
+ (cond [(lit? f)
+ (if (var? f)
+ (neg f)
+ (neg-subf f))]
+ [(neg? f) (convert-to-nnf (neg-subf f))]
+ [(conj? f) (disj (convert-negation (conj-left f))
+ (convert-negation (conj-right f)))]
+ [(disj? f) (conj (convert-negation (disj-left f))
+ (convert-negation (disj-right f)))]
+ [else (error "Zła formuła -- CONVERT-NEGATION" f)]))
+
+(define (clause? x)
+ (and (list? x)
+ (andmap lit? x)))
+
+(define (clause-empty? x)
+ (and (clause? x)
+ (null? x)))
+
+(define (cnf? x)
+ (and (list? x)
+ (andmap clause? x)))
+
+(define (flatmap proc seq)
+ (foldl append null (map proc seq)))
+
+(define (convert-to-cnf f)
+ (define (convert f)
+ (cond [(lit? f) (list (list f))]
+ [(conj? f) (append (convert-to-cnf (conj-left f))
+ (convert-to-cnf (conj-right f)))]
+ [(disj? f)
+ (let ((clause-left (convert-to-cnf (disj-left f)))
+ (clause-right (convert-to-cnf (disj-right f))))
+ (flatmap (λ (clause)
+ (map (λ (clause2)
+ (append clause2 clause)) clause-left))
+ clause-right))]))
+ (convert (convert-to-nnf f)))
+
+(define (falsifiable-clause? clause)
+ (cond [(clause-empty? clause) true]
+ [(lit? (findf (λ (l) (equal?
+ l
+ (convert-to-nnf (neg (car clause)))))
+ clause)) false]
+ [else (falsifiable-clause? (cdr clause))]))
+
+(define (falsifiable-cnf? f)
+ (define (neg-value lit)
+ (if (var? lit)
+ (list lit false)
+ (list (neg-subf lit) true)))
+ (ormap (λ (clause) (if (falsifiable-clause? clause)
+ (map neg-value clause)
+ false))
+ (convert-to-cnf f))) \ No newline at end of file
diff --git a/semestr-2/racket/lista5/skrr/solution.rkt b/semestr-2/racket/lista5/skrr/solution.rkt
new file mode 100644
index 0000000..e8efbc9
--- /dev/null
+++ b/semestr-2/racket/lista5/skrr/solution.rkt
@@ -0,0 +1,88 @@
+#lang racket
+
+(require "props.rkt")
+(provide falsifiable-cnf?)
+
+(define (lit? f)
+ (or (var? f)
+ (and (neg? f)
+ (var? (neg-subf f)))))
+
+(define (lit-pos v)
+ v)
+
+(define (lit-neg v)
+ (neg v))
+
+(define (lit-var l)
+ (if (var? l)
+ l
+ (neg-subf l)))
+
+(define (lit-pos? l)
+ (var? l))
+
+(define (to-nnf f)
+ (cond
+ [(var? f) (lit-pos f)]
+ [(neg? f) (to-nnf-neg (neg-subf f))]
+ [(conj? f) (conj (to-nnf (conj-left f))
+ (to-nnf (conj-right f)))]
+ [(disj? f) (disj (to-nnf (disj-left f))
+ (to-nnf (disj-right f)))]))
+
+(define (to-nnf-neg f)
+ (cond
+ [(var? f) (lit-neg f)]
+ [(neg? f) (to-nnf (neg-subf f))]
+ [(conj? f) (disj (to-nnf-neg (conj-left f))
+ (to-nnf-neg (conj-right f)))]
+ [(disj? f) (conj (to-nnf-neg (disj-left f))
+ (to-nnf-neg (disj-right f)))]))
+
+(define (mk-cnf xss)
+ (cons 'cnf xss))
+
+(define (clause? f)
+ (and (list? f)
+ (andmap lit? f)))
+
+(define (cnf? f)
+ (and (pair? f)
+ (eq? 'cnf (car f))
+ (list? (cdr f))
+ (andmap clause? (cdr f))))
+
+(define (to-cnf f)
+ (define (join xss yss)
+ (apply append (map (lambda (xs) (map (lambda (ys) (append xs ys)) yss)) xss)))
+ (define (go f)
+ (cond
+ [(lit? f) (list (list f))]
+ [(conj? f) (append (go (conj-left f))
+ (go (conj-right f)))]
+ [(disj? f) (join (go (disj-left f))
+ (go (disj-right f)))]))
+ (mk-cnf (go f)))
+
+(define (clause-empty? x)
+ (and (clause? x)
+ (null? x)))
+
+(define (falsifiable-clause? clause)
+ (cond [(clause-empty? clause) true]
+ [(lit? (findf (λ (l) (equal?
+ l
+ (to-nnf (neg (car clause)))))
+ clause)) false]
+ [else (falsifiable-clause? (cdr clause))]))
+
+(define (falsifiable-cnf? f)
+ (define (neg-value lit)
+ (if (var? lit)
+ (list lit false)
+ (list (neg-subf lit) true)))
+ (ormap (λ (clause) (if (falsifiable-clause? clause)
+ (map neg-value clause)
+ false))
+ (convert-to-cnf f))) \ No newline at end of file
diff --git a/semestr-2/racket/lista5/sol2.rkt b/semestr-2/racket/lista5/sol2.rkt
new file mode 100644
index 0000000..d037472
--- /dev/null
+++ b/semestr-2/racket/lista5/sol2.rkt
@@ -0,0 +1,90 @@
+#lang racket
+(provide falsifiable-cnf?) (require "props.rkt")
+
+
+(define (falsifiable-cnf? p)
+ ;literał
+ (define (lit? p)
+ (or (var? p)
+ (and (neg? p) (var? (neg-subf p)))
+ ))
+
+ (define (lit-pos? p)
+ (if (lit? p)
+ (var? p)
+ (error "not a literal" p)
+ ))
+
+ (define (lit-var p)
+ (cond
+ [(not (lit? p)) (error "not a literal" p)]
+ [(lit-pos? p) p]
+ [else (neg-subf p)]
+ ))
+
+ (define (contr p)
+ (if (lit? p)
+ (if (neg? p) (neg-subf p) (neg p))
+ (error "not a literal" p)
+ ))
+
+ ;konwertowanie
+ (define (convert-to-cnf p)
+ (define (convert-to-nnf p)
+ (cond
+ [(lit? p) p]
+ [(and (neg? p) (conj? (neg-subf p)))
+ (let ((A (neg-subf p)))
+ (disj (convert-to-nnf (neg (conj-left A))) (convert-to-nnf (neg (conj-right A)))))]
+ [(and (neg? p) (disj? (neg-subf p)))
+ (let ((A (neg-subf p)))
+ (conj (convert-to-nnf (neg (disj-left A))) (convert-to-nnf (neg (disj-right A)))))]
+ [(and (neg? p) (neg? (neg-subf p))) (convert-to-nnf (neg-subf (neg-subf p)))]
+ [(conj? p) (conj (convert-to-nnf (conj-right p)) (convert-to-nnf (conj-left p)))]
+ [(disj? p) (disj (convert-to-nnf (disj-right p)) (convert-to-nnf (disj-left p)))]
+ [else (error "not a proposition" p)]))
+
+ (define (flatmap proc seq)
+ (foldr append null (map proc seq)))
+
+ (define (merge a b)
+ (flatmap (lambda (c) (map (lambda (c2) (append c c2)) b)) a))
+
+ (define (convert p)
+ (cond
+ [(lit? p) (list (list p))]
+ [(conj? p) (append (convert (conj-left p)) (convert (conj-right p)))]
+ [(disj? p) (let* ((L (convert (disj-left p))) (R (convert (disj-right p))))
+ (merge L R))]
+ [else (error "it should never be here" p)]
+ ))
+
+ (map (lambda (c) (remove-duplicates c)) (convert (convert-to-nnf p))))
+
+ ;prawdziwa funkcja
+ (define cnf (convert-to-cnf p))
+
+ (define (falsifiable-clause? c)
+ (cond
+ [(null? c) #t]
+ [(eq? #f (member (contr (car c)) c)) (falsifiable-clause? (cdr c))]
+ [else #f]
+ ))
+
+ (define (falsified-clause c)
+ (if (null? c)
+ null
+ (cons (list (lit-var (car c)) (not (lit-pos? (car c)))) (falsified-clause (cdr c)))
+ ))
+
+ (define (falsified-val p)
+ (cond
+ [(null? p) false]
+ [(falsifiable-clause? (car p)) (falsified-clause (car p))]
+ [else (falsified-val (cdr p))]
+ )
+ )
+ (falsified-val cnf))
+
+
+;złożoność wykładnicza tak jak falsible-eval ale często w praktyce szybsza jak nie ma za dużo alternatyw. \ No newline at end of file
diff --git a/semestr-2/racket/lista5/solution.bak b/semestr-2/racket/lista5/solution.bak
new file mode 100644
index 0000000..72c7f36
--- /dev/null
+++ b/semestr-2/racket/lista5/solution.bak
@@ -0,0 +1,135 @@
+#lang racket
+
+(provide falsifiable-cnf?)
+(require "props.rkt")
+
+(define (prop? f)
+ (or (var? f)
+ (and (neg? f)
+ (prop? (neg-subf f)))
+ (and (disj? f)
+ (prop? (disj-left f))
+ (prop? (disj-right f)))
+ (and (conj? f)
+ (prop? (conj-left f))
+ (prop? (conj-right f)))))
+
+(define (lit-var f)
+ (cond [(var? f) f]
+ [(neg? f) (neg-subf f)]
+ [else (error "Złe dane ze znacznikiem -- LIT-VAR" f)]))
+
+(define (free-vars f)
+ (cond [(null? f) null]
+ [(var? f) (list f)]
+ [(neg? f) (free-vars (neg-subf f))]
+ [(conj? f) (append (free-vars (conj-left f))
+ (free-vars (conj-right f)))]
+ [(disj? f) (append (free-vars (disj-left f))
+ (free-vars (disj-right f)))]
+ [else (error "Zła formula -- FREE-VARS" f)]))
+
+(define (gen-vals xs)
+ (if (null? xs)
+ (list null)
+ (let*
+ ((vss (gen-vals (cdr xs)))
+ (x (car xs))
+ (vst (map (λ (vs) (cons (list x true) vs)) vss))
+ (vsf (map (λ (vs) (cons (list x false) vs)) vss)))
+ (append vst vsf))))
+
+(define (eval-formula f evaluation)
+ (cond [(var? f)
+ (let ((val (assoc f evaluation)))
+ (if (not val)
+ (error "Zmienna wolna nie wystepuje w wartościowaniu -- EVAL-FORMULA" f evaluation)
+ (cadr val)))]
+ [(neg? f) (not (eval-formula (neg-subf f) evaluation))]
+ [(disj? f) (or (eval-formula (disj-left f) evaluation)
+ (eval-formula (disj-right f) evaluation))]
+ [(conj? f) (and (eval-formula (conj-left f) evaluation)
+ (eval-formula (conj-right f) evaluation))]
+ [else (error "Zła formuła -- EVAL-FORMULA" f evaluation)]))
+
+(define (falsifiable-eval? f)
+ (let* ((evaluations (gen-vals (free-vars f)))
+ (results (map (λ (evaluation) (eval-formula f evaluation)) evaluations)))
+ (ormap false? results)))
+
+(define (nff? f)
+ (cond [(lit? f) true]
+ [(neg? f) false]
+ [(conj? f) (and (nff? (conj-left f))
+ (nff? (conj-right f)))]
+ [(disj? f) (and (nff? (disj-left f))
+ (nff? (disj-right f)))]
+ [else (error "Zła formuła -- NFF?" f)]))
+
+(define (convert-to-nnf f)
+ (cond [(lit? f) f]
+ [(neg? f) (convert-negation (neg-subf f))]
+ [(conj? f) (conj (convert-to-nnf (conj-left f))
+ (convert-to-nnf (conj-right f)))]
+ [(disj? f) (disj (convert-to-nnf (disj-left f))
+ (convert-to-nnf (disj-right f)))]
+ [else (error "Zła formuła -- CONVERT" f)]))
+
+(define (convert-negation f)
+ (cond [(lit? f)
+ (if (var? f)
+ (neg f)
+ (neg-subf f))]
+ [(neg? f) (convert-to-nnf (neg-subf f))]
+ [(conj? f) (disj (convert-negation (conj-left f))
+ (convert-negation (conj-right f)))]
+ [(disj? f) (conj (convert-negation (disj-left f))
+ (convert-negation (disj-right f)))]
+ [else (error "Zła formuła -- CONVERT-NEGATION" f)]))
+
+(define (clause? x)
+ (and (list? x)
+ (andmap lit? x)))
+
+(define (clause-empty? x)
+ (and (clause? x)
+ (null? x)))
+
+(define (cnf? x)
+ (and (list? x)
+ (andmap clause? x)))
+
+(define (flatmap proc seq)
+ (foldl append null (map proc seq)))
+
+(define (convert-to-cnf f)
+ (define (convert f)
+ (cond [(lit? f) (list (list f))]
+ [(conj? f) (append (convert-to-cnf (conj-left f))
+ (convert-to-cnf (conj-right f)))]
+ [(disj? f)
+ (let ((clause-left (convert-to-cnf (disj-left f)))
+ (clause-right (convert-to-cnf (disj-right f))))
+ (flatmap (λ (clause)
+ (map (λ (clause2)
+ (append clause2 clause)) clause-left))
+ clause-right))]))
+ (convert (convert-to-nnf f)))
+
+(define (falsifiable-clause? clause)
+ (cond [(clause-empty? clause) true]
+ [(lit? (findf (λ (l) (equal?
+ l
+ (convert-to-nnf (neg (car clause)))))
+ clause)) false]
+ [else (falsifiable-clause? (cdr clause))]))
+
+(define (falsifiable-cnf? f)
+ (define (neg-value lit)
+ (if (var? lit)
+ (list lit false)
+ (list (neg-subf lit) true)))
+ (ormap (λ (clause) (if (falsifiable-clause? clause)
+ (map neg-value clause)
+ false))
+ (convert-to-cnf f))) \ No newline at end of file
diff --git a/semestr-2/racket/lista5/solution.rkt b/semestr-2/racket/lista5/solution.rkt
new file mode 100644
index 0000000..67964d8
--- /dev/null
+++ b/semestr-2/racket/lista5/solution.rkt
@@ -0,0 +1,140 @@
+#lang racket
+
+(provide falsifiable-cnf?)
+(require "props.rkt")
+
+(define (prop? f)
+ (or (var? f)
+ (and (neg? f)
+ (prop? (neg-subf f)))
+ (and (disj? f)
+ (prop? (disj-left f))
+ (prop? (disj-right f)))
+ (and (conj? f)
+ (prop? (conj-left f))
+ (prop? (conj-right f)))))
+
+(define (lit? t)
+ (or (var? t)
+ (and (neg? t)
+ (var? (neg-subf t)))))
+
+(define (lit-var f)
+ (cond [(var? f) f]
+ [(neg? f) (neg-subf f)]
+ [else (error "Złe dane ze znacznikiem -- LIT-VAR" f)]))
+
+(define (free-vars f)
+ (cond [(null? f) null]
+ [(var? f) (list f)]
+ [(neg? f) (free-vars (neg-subf f))]
+ [(conj? f) (append (free-vars (conj-left f))
+ (free-vars (conj-right f)))]
+ [(disj? f) (append (free-vars (disj-left f))
+ (free-vars (disj-right f)))]
+ [else (error "Zła formula -- FREE-VARS" f)]))
+
+(define (gen-vals xs)
+ (if (null? xs)
+ (list null)
+ (let*
+ ((vss (gen-vals (cdr xs)))
+ (x (car xs))
+ (vst (map (λ (vs) (cons (list x true) vs)) vss))
+ (vsf (map (λ (vs) (cons (list x false) vs)) vss)))
+ (append vst vsf))))
+
+(define (eval-formula f evaluation)
+ (cond [(var? f)
+ (let ((val (assoc f evaluation)))
+ (if (not val)
+ (error "Zmienna wolna nie wystepuje w wartościowaniu -- EVAL-FORMULA" f evaluation)
+ (cadr val)))]
+ [(neg? f) (not (eval-formula (neg-subf f) evaluation))]
+ [(disj? f) (or (eval-formula (disj-left f) evaluation)
+ (eval-formula (disj-right f) evaluation))]
+ [(conj? f) (and (eval-formula (conj-left f) evaluation)
+ (eval-formula (conj-right f) evaluation))]
+ [else (error "Zła formuła -- EVAL-FORMULA" f evaluation)]))
+
+(define (falsifiable-eval? f)
+ (let* ((evaluations (gen-vals (free-vars f)))
+ (results (map (λ (evaluation) (eval-formula f evaluation)) evaluations)))
+ (ormap false? results)))
+
+(define (nff? f)
+ (cond [(lit? f) true]
+ [(neg? f) false]
+ [(conj? f) (and (nff? (conj-left f))
+ (nff? (conj-right f)))]
+ [(disj? f) (and (nff? (disj-left f))
+ (nff? (disj-right f)))]
+ [else (error "Zła formuła -- NFF?" f)]))
+
+(define (convert-to-nnf f)
+ (cond [(lit? f) f]
+ [(neg? f) (convert-negation (neg-subf f))]
+ [(conj? f) (conj (convert-to-nnf (conj-left f))
+ (convert-to-nnf (conj-right f)))]
+ [(disj? f) (disj (convert-to-nnf (disj-left f))
+ (convert-to-nnf (disj-right f)))]
+ [else (error "Zła formuła -- CONVERT" f)]))
+
+(define (convert-negation f)
+ (cond [(lit? f)
+ (if (var? f)
+ (neg f)
+ (neg-subf f))]
+ [(neg? f) (convert-to-nnf (neg-subf f))]
+ [(conj? f) (disj (convert-negation (conj-left f))
+ (convert-negation (conj-right f)))]
+ [(disj? f) (conj (convert-negation (disj-left f))
+ (convert-negation (disj-right f)))]
+ [else (error "Zła formuła -- CONVERT-NEGATION" f)]))
+
+(define (clause? x)
+ (and (list? x)
+ (andmap lit? x)))
+
+(define (clause-empty? x)
+ (and (clause? x)
+ (null? x)))
+
+(define (cnf? x)
+ (and (list? x)
+ (andmap clause? x)))
+
+(define (flatmap proc seq)
+ (foldl append null (map proc seq)))
+
+(define (convert-to-cnf f)
+ (define (convert f)
+ (cond [(lit? f) (list (list f))]
+ [(conj? f) (append (convert-to-cnf (conj-left f))
+ (convert-to-cnf (conj-right f)))]
+ [(disj? f)
+ (let ((clause-left (convert-to-cnf (disj-left f)))
+ (clause-right (convert-to-cnf (disj-right f))))
+ (flatmap (λ (clause)
+ (map (λ (clause2)
+ (append clause2 clause)) clause-left))
+ clause-right))]))
+ (map (lambda (clause) (remove-duplicates clause)) (convert (convert-to-nnf f))))
+
+(define (falsifiable-clause? clause)
+ (cond [(clause-empty? clause) true]
+ [(lit? (findf (λ (l) (equal?
+ l
+ (convert-to-nnf (neg (car clause)))))
+ clause)) false]
+ [else (falsifiable-clause? (cdr clause))]))
+
+(define (falsifiable-cnf? f)
+ (define (neg-value lit)
+ (if (var? lit)
+ (list lit false)
+ (list (neg-subf lit) true)))
+ (ormap (λ (clause) (if (falsifiable-clause? clause)
+ (map neg-value clause)
+ false))
+ (convert-to-cnf f))) \ No newline at end of file
diff --git a/semestr-2/racket/lista5/xd.bak b/semestr-2/racket/lista5/xd.bak
new file mode 100644
index 0000000..d814e10
--- /dev/null
+++ b/semestr-2/racket/lista5/xd.bak
@@ -0,0 +1,4 @@
+#lang racket
+
+(require "solution.rkt")
+
diff --git a/semestr-2/racket/lista5/xd.rkt b/semestr-2/racket/lista5/xd.rkt
new file mode 100644
index 0000000..64ce78c
--- /dev/null
+++ b/semestr-2/racket/lista5/xd.rkt
@@ -0,0 +1,4 @@
+#lang racket
+
+(require "solution.rkt")
+(require "props.rkt")
diff --git a/semestr-2/racket/lista6/lista8/kappa.py b/semestr-2/racket/lista6/lista8/kappa.py
new file mode 100644
index 0000000..f359d5c
--- /dev/null
+++ b/semestr-2/racket/lista6/lista8/kappa.py
@@ -0,0 +1,13 @@
+import pylab
+
+a = int(input("podaj liczbe: "))
+b = int(input("podaj liczbe: "))
+
+x = range(-10, 11)
+y = []
+for i in x:
+ y.append(a * i + b)
+pylab.plot(x, y)
+pylab.title('Wykres f(x) = a*x - b')
+pylab.grid(True)
+pylab.show()
diff --git a/semestr-2/racket/lista6/lista8/zad1.bak b/semestr-2/racket/lista6/lista8/zad1.bak
new file mode 100644
index 0000000..0960f21
--- /dev/null
+++ b/semestr-2/racket/lista6/lista8/zad1.bak
@@ -0,0 +1,98 @@
+#lang racket
+
+; Do let-env.rkt dodajemy wartosci boolowskie
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n))] ; <----------------- !!!
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef) ; <--------------------------------------- !!!
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)] ; <---------------------------- !!!
+ [(eq? q 'false) (const false)] ; <---------------------------- !!!
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) ; <--- !!!
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]))
+
+(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1))))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct environ (xs))
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(define (value? v)
+ (or (number? v) (boolean? v)))
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] ; <----------- !!!
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]
+ ['and (lambda (x y) (and x y))]
+ ['or (lambda (x y) (or x y))]))
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(var-expr x) (env-lookup x env)]
+ [(if-expr eb et ef) (if (eval-env eb env) ; <----------------- !!!
+ (eval-env et env)
+ (eval-env ef env))]))
+
+(define (eval e) (eval-env e env-empty))
+
+(define program
+ '(if (or (< (% 123 10) 5)
+ true)
+ (+ 2 3)
+ (/ 2 0)))
+
+(define (test-eval) (eval (parse program))) \ No newline at end of file
diff --git a/semestr-2/racket/lista6/lista8/zad1.rkt b/semestr-2/racket/lista6/lista8/zad1.rkt
new file mode 100644
index 0000000..1cd6b0b
--- /dev/null
+++ b/semestr-2/racket/lista6/lista8/zad1.rkt
@@ -0,0 +1,104 @@
+#lang racket
+
+; Do let-env.rkt dodajemy wartosci boolowskie
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n))] ; <----------------- !!!
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef) ; <--------------------------------------- !!!
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)] ; <---------------------------- !!!
+ [(eq? q 'false) (const false)] ; <---------------------------- !!!
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) ; <--- !!!
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'and))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (const false))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'or))
+ (if-expr (parse (second q))
+ (const true)
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]))
+
+(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1))))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct environ (xs))
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(define (value? v)
+ (or (number? v) (boolean? v)))
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] ; <----------- !!!
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]))
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(var-expr x) (env-lookup x env)]
+ [(if-expr eb et ef) (if (eval-env eb env) ; <----------------- !!!
+ (eval-env et env)
+ (eval-env ef env))]))
+
+(define (eval e) (eval-env e env-empty))
+
+(define program
+ '(if (or (< (% 123 10) 5)
+ true)
+ (+ 2 3)
+ (/ 2 0)))
+
+(define (test-eval) (eval (parse program))) \ No newline at end of file
diff --git a/semestr-2/racket/lista6/lista8/zad4.bak b/semestr-2/racket/lista6/lista8/zad4.bak
new file mode 100644
index 0000000..503099d
--- /dev/null
+++ b/semestr-2/racket/lista6/lista8/zad4.bak
@@ -0,0 +1,114 @@
+#lang racket
+
+; Do boolean.rkt dodajemy pary
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+(struct cons-expr (e1 e2) #:transparent) ; <------------------- !!!
+(struct car-expr (e) #:transparent) ; <------------------- !!!
+(struct cdr-expr (e) #:transparent) ; <------------------- !!!
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n))]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef)
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] ; <----------- !!!
+ [(car-expr e) (expr? e)] ; <---------------------------------- !!!
+ [(cdr-expr e) (expr? e)] ; <---------------------------------- !!!
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) ; <- !!!
+ (cons-expr (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car)) ; <-- !!!
+ (car-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr)) ; <-- !!!
+ (cdr-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]))
+
+(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1))))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct environ (xs))
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (and (pair? v) (value? (car v)) (value? (cdr v)))))
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo]
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]
+ ['and (lambda (x y) (and x y))]
+ ['or (lambda (x y) (or x y))]))
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(var-expr x) (env-lookup x env)]
+ [(if-expr eb et ef) (if (eval-env eb env)
+ (eval-env et env)
+ (eval-env ef env))]
+ [(cons-expr e1 e2) (cons (eval-env e1 env) ; <---------------- !!!
+ (eval-env e2 env))]
+ [(car-expr e) (car (eval-env e env))] ; <--------------------- !!!
+ [(cdr-expr e) (cdr (eval-env e env))])) ; <------------------- !!!
+
+(define (eval e) (eval-env e env-empty))
+
+(define program
+ '(car (if true (cons 1 2) false)))
+
+(define (test-eval) (eval (parse program))) \ No newline at end of file
diff --git a/semestr-2/racket/lista6/lista8/zad4.rkt b/semestr-2/racket/lista6/lista8/zad4.rkt
new file mode 100644
index 0000000..7934435
--- /dev/null
+++ b/semestr-2/racket/lista6/lista8/zad4.rkt
@@ -0,0 +1,118 @@
+#lang racket
+
+; Do boolean.rkt dodajemy pary
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+(struct cons-expr (e1 e2) #:transparent) ; <------------------- !!!
+(struct car-expr (e) #:transparent) ; <------------------- !!!
+(struct cdr-expr (e) #:transparent) ; <------------------- !!!
+(struct is-pair (e) #:transparent)
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n))]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef)
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] ; <----------- !!!
+ [(car-expr e) (expr? e)] ; <---------------------------------- !!!
+ [(cdr-expr e) (expr? e)] ; <---------------------------------- !!!
+ [(is-pair e) (expr? e)]
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) ; <- !!!
+ (cons-expr (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car)) ; <-- !!!
+ (car-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr)) ; <-- !!!
+ (cdr-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'pair?))
+ (is-pair (parse (second q)))]))
+
+(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1))))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct environ (xs))
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (and (pair? v) (value? (car v)) (value? (cdr v)))))
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo]
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]
+ ['and (lambda (x y) (and x y))]
+ ['or (lambda (x y) (or x y))]))
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(var-expr x) (env-lookup x env)]
+ [(if-expr eb et ef) (if (eval-env eb env)
+ (eval-env et env)
+ (eval-env ef env))]
+ [(cons-expr e1 e2) (cons (eval-env e1 env) ; <---------------- !!!
+ (eval-env e2 env))]
+ [(car-expr e) (car (eval-env e env))] ; <--------------------- !!!
+ [(cdr-expr e) (cdr (eval-env e env))] ; <------------------- !!!
+ [(is-pair e) (cons? (eval-env e env))]))
+(define (eval e) (eval-env e env-empty))
+
+(define program
+ '(car (if true (cons 1 2) false)))
+
+(define (test-eval) (eval (parse program))) \ No newline at end of file
diff --git a/semestr-2/racket/lista6/lista8/zad5.bak b/semestr-2/racket/lista6/lista8/zad5.bak
new file mode 100644
index 0000000..6f1f7b4
--- /dev/null
+++ b/semestr-2/racket/lista6/lista8/zad5.bak
@@ -0,0 +1 @@
+#lang racket
diff --git a/semestr-2/racket/lista6/lista8/zad5.rkt b/semestr-2/racket/lista6/lista8/zad5.rkt
new file mode 100644
index 0000000..721f5bf
--- /dev/null
+++ b/semestr-2/racket/lista6/lista8/zad5.rkt
@@ -0,0 +1,151 @@
+#lang racket
+
+; Do list.rkt dodajemy procedury
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct unop (op e) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+(struct cons-expr (e1 e2) #:transparent)
+(struct null-expr () #:transparent)
+(struct null?-expr (e) #:transparent)
+(struct app (f e) #:transparent) ; <------------------ !!!
+(struct lam (id e) #:transparent) ; <------------------ !!!
+
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n))]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef)
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [(cons-expr e1 e2) (and (expr? e1) (expr? e2))]
+ [(null-expr) true]
+ [(null?-expr e) (expr? e)]
+ [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!!
+ [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!!
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(eq? q 'null) (null-expr)]
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?))
+ (null?-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons))
+ (cons-expr (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; <!!!
+ (parse-lam (second q) (third q))]
+ [(and (list? q) (pair? q) (not (op->proc (car q)))) ; <------- !!!
+ (parse-app q)]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 2) (symbol? (first q)))
+ (unop (first q) (parse (second q)))]))
+
+(define (parse-app q) ; <----------------------------------------- !!!
+ (define (parse-app-accum q acc)
+ (cond [(= 1 (length q)) (app acc (parse (car q)))]
+ [else (parse-app-accum (cdr q) (app acc (parse (car q))))]))
+ (parse-app-accum (cdr q) (parse (car q))))
+
+(define (parse-lam pat e) ; <------------------------------------- !!!
+ (cond [(= 1 (length pat))
+ (lam (car pat) (parse e))]
+ [else
+ (lam (car pat) (parse-lam (cdr pat) e))]))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct environ (xs) #:transparent)
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(struct clo (id e env) #:transparent) ; <------------------------- !!!
+
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (and (pair? v) (value? (car v)) (value? (cdr v)))
+ (null? v)
+ (clo? v))) ; <---------------------------------------------- !!!
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo]
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]
+ ['and (lambda (x y) (and x y))]
+ ['or (lambda (x y) (or x y))]
+ ['not not] ['car car] ['cdr cdr]
+ [_ false])) ; <--------------------------------------- !!!
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(unop op e) ((op->proc op) (eval-env e env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(var-expr x) (env-lookup x env)]
+ [(if-expr eb et ef) (if (eval-env eb env)
+ (eval-env et env)
+ (eval-env ef env))]
+ [(cons-expr e1 e2) (cons (eval-env e1 env)
+ (eval-env e2 env))]
+ [(null-expr) null]
+ [(null?-expr e) (null? (eval-env e env))]
+ [(lam x e) (clo x e env)] ; <--------------------------------- !!!
+ [(app f e) ; <------------------------------------------------ !!!
+ (let ([vf (eval-env f env)]
+ [ve (eval-env e env)])
+ (match vf [(clo x body fun-env)
+ (eval-env body (env-add x ve fun-env))]))]))
+
+(define (eval e) (eval-env e env-empty))
+
+(define program
+ '(let [twice (lambda (f x) (f (f x)))]
+ (let [inc (lambda (x) (+ 1 x))]
+ (twice twice twice twice inc 1))))
+
+
+(define (test-eval) (eval (parse program))) \ No newline at end of file
diff --git a/semestr-2/racket/lista6/lista8/zad6.bak b/semestr-2/racket/lista6/lista8/zad6.bak
new file mode 100644
index 0000000..721f5bf
--- /dev/null
+++ b/semestr-2/racket/lista6/lista8/zad6.bak
@@ -0,0 +1,151 @@
+#lang racket
+
+; Do list.rkt dodajemy procedury
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct unop (op e) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+(struct cons-expr (e1 e2) #:transparent)
+(struct null-expr () #:transparent)
+(struct null?-expr (e) #:transparent)
+(struct app (f e) #:transparent) ; <------------------ !!!
+(struct lam (id e) #:transparent) ; <------------------ !!!
+
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n))]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef)
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [(cons-expr e1 e2) (and (expr? e1) (expr? e2))]
+ [(null-expr) true]
+ [(null?-expr e) (expr? e)]
+ [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!!
+ [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!!
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(eq? q 'null) (null-expr)]
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?))
+ (null?-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons))
+ (cons-expr (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; <!!!
+ (parse-lam (second q) (third q))]
+ [(and (list? q) (pair? q) (not (op->proc (car q)))) ; <------- !!!
+ (parse-app q)]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 2) (symbol? (first q)))
+ (unop (first q) (parse (second q)))]))
+
+(define (parse-app q) ; <----------------------------------------- !!!
+ (define (parse-app-accum q acc)
+ (cond [(= 1 (length q)) (app acc (parse (car q)))]
+ [else (parse-app-accum (cdr q) (app acc (parse (car q))))]))
+ (parse-app-accum (cdr q) (parse (car q))))
+
+(define (parse-lam pat e) ; <------------------------------------- !!!
+ (cond [(= 1 (length pat))
+ (lam (car pat) (parse e))]
+ [else
+ (lam (car pat) (parse-lam (cdr pat) e))]))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct environ (xs) #:transparent)
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(struct clo (id e env) #:transparent) ; <------------------------- !!!
+
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (and (pair? v) (value? (car v)) (value? (cdr v)))
+ (null? v)
+ (clo? v))) ; <---------------------------------------------- !!!
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo]
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]
+ ['and (lambda (x y) (and x y))]
+ ['or (lambda (x y) (or x y))]
+ ['not not] ['car car] ['cdr cdr]
+ [_ false])) ; <--------------------------------------- !!!
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(unop op e) ((op->proc op) (eval-env e env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(var-expr x) (env-lookup x env)]
+ [(if-expr eb et ef) (if (eval-env eb env)
+ (eval-env et env)
+ (eval-env ef env))]
+ [(cons-expr e1 e2) (cons (eval-env e1 env)
+ (eval-env e2 env))]
+ [(null-expr) null]
+ [(null?-expr e) (null? (eval-env e env))]
+ [(lam x e) (clo x e env)] ; <--------------------------------- !!!
+ [(app f e) ; <------------------------------------------------ !!!
+ (let ([vf (eval-env f env)]
+ [ve (eval-env e env)])
+ (match vf [(clo x body fun-env)
+ (eval-env body (env-add x ve fun-env))]))]))
+
+(define (eval e) (eval-env e env-empty))
+
+(define program
+ '(let [twice (lambda (f x) (f (f x)))]
+ (let [inc (lambda (x) (+ 1 x))]
+ (twice twice twice twice inc 1))))
+
+
+(define (test-eval) (eval (parse program))) \ No newline at end of file
diff --git a/semestr-2/racket/lista6/lista8/zad6.rkt b/semestr-2/racket/lista6/lista8/zad6.rkt
new file mode 100644
index 0000000..c7ea9f0
--- /dev/null
+++ b/semestr-2/racket/lista6/lista8/zad6.rkt
@@ -0,0 +1,171 @@
+#lang racket
+
+; Do list.rkt dodajemy procedury
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct unop (op e) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+(struct cons-expr (e1 e2) #:transparent)
+(struct null-expr () #:transparent)
+(struct null?-expr (e) #:transparent)
+(struct app (f e) #:transparent) ; <------------------ !!!
+(struct lam (id e) #:transparent) ; <------------------ !!!
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n))]
+ [(unop op e) (and (symbol? op) (expr? e))]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef)
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [(cons-expr e1 e2) (and (expr? e1) (expr? e2))]
+ [(null-expr) true]
+ [(null?-expr e) (expr? e)]
+ [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!!
+ [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!!
+ [_ false]))
+
+(define (cedar? f)
+ (let ((letters (string->list (symbol->string f))))
+ (and (> (length letters) 2)
+ (eq? (first letters) #\c)
+ (eq? (first (reverse letters)) #\r)
+ (andmap (lambda (x) (or (eq? x #\a) (eq? x #\d)))
+ (cdr letters)))))
+
+(define (get-cedar letters xs)
+ (cond [(eq? (car letters) #\r) xs]
+ [(eq? (car letters) #\a) (unop 'car (get-cedar (cdr letters) xs))]
+ [(eq? (car letters) #\d) (unop 'cdr (get-cedar (cdr letters) xs))]))
+
+(define (cedar f xs)
+ (let ((letters (string->list (symbol->string f))))
+ (get-cedar (cdr (reverse letters)) xs)))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(eq? q 'null) (null-expr)]
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?))
+ (null?-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons))
+ (cons-expr (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; <!!!
+ (parse-lam (second q) (third q))]
+ [(and (list? q) (eq? (length q) 2) (symbol? (first q))
+ (cedar? (first q)))
+ (cedar (first q) (parse (second q)))]
+ [(and (list? q) (pair? q) (not (op->proc (car q)))) ; <------- !!!
+ (parse-app q)]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 2) (symbol? (first q)))
+ (unop (first q) (parse (second q)))]))
+
+(define (parse-app q) ; <----------------------------------------- !!!
+ (define (parse-app-accum q acc)
+ (cond [(= 1 (length q)) (app acc (parse (car q)))]
+ [else (parse-app-accum (cdr q) (app acc (parse (car q))))]))
+ (parse-app-accum (cdr q) (parse (car q))))
+
+(define (parse-lam pat e) ; <------------------------------------- !!!
+ (cond [(= 1 (length pat))
+ (lam (car pat) (parse e))]
+ [else
+ (lam (car pat) (parse-lam (cdr pat) e))]))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct environ (xs) #:transparent)
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(struct clo (id e env) #:transparent) ; <------------------------- !!!
+
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (and (pair? v) (value? (car v)) (value? (cdr v)))
+ (null? v)
+ (clo? v))) ; <---------------------------------------------- !!!
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo]
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]
+ ['and (lambda (x y) (and x y))]
+ ['or (lambda (x y) (or x y))]
+ ['not not] ['car car] ['cdr cdr]
+ [_ false])) ; <--------------------------------------- !!!
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(unop op e) ((op->proc op) (eval-env e env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(var-expr x) (env-lookup x env)]
+ [(if-expr eb et ef) (if (eval-env eb env)
+ (eval-env et env)
+ (eval-env ef env))]
+ [(cons-expr e1 e2) (cons (eval-env e1 env)
+ (eval-env e2 env))]
+ [(null-expr) null]
+ [(null?-expr e) (null? (eval-env e env))]
+ [(lam x e) (clo x e env)] ; <--------------------------------- !!!
+ [(app f e) ; <------------------------------------------------ !!!
+ (let ([vf (eval-env f env)]
+ [ve (eval-env e env)])
+ (match vf [(clo x body fun-env)
+ (eval-env body (env-add x ve fun-env))]))]))
+
+(define (eval e) (eval-env e env-empty))
+
+(define program
+ '(let [twice (lambda (f x) (f (f x)))]
+ (let [inc (lambda (x) (+ 1 x))]
+ (twice twice twice twice inc 1))))
+
+
+(define (test-eval) (eval (parse program))) \ No newline at end of file
diff --git a/semestr-2/racket/lista6/lista8/zadanie.rkt b/semestr-2/racket/lista6/lista8/zadanie.rkt
new file mode 100644
index 0000000..0960f21
--- /dev/null
+++ b/semestr-2/racket/lista6/lista8/zadanie.rkt
@@ -0,0 +1,98 @@
+#lang racket
+
+; Do let-env.rkt dodajemy wartosci boolowskie
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n))] ; <----------------- !!!
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef) ; <--------------------------------------- !!!
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)] ; <---------------------------- !!!
+ [(eq? q 'false) (const false)] ; <---------------------------- !!!
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) ; <--- !!!
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]))
+
+(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1))))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct environ (xs))
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(define (value? v)
+ (or (number? v) (boolean? v)))
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] ; <----------- !!!
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]
+ ['and (lambda (x y) (and x y))]
+ ['or (lambda (x y) (or x y))]))
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(var-expr x) (env-lookup x env)]
+ [(if-expr eb et ef) (if (eval-env eb env) ; <----------------- !!!
+ (eval-env et env)
+ (eval-env ef env))]))
+
+(define (eval e) (eval-env e env-empty))
+
+(define program
+ '(if (or (< (% 123 10) 5)
+ true)
+ (+ 2 3)
+ (/ 2 0)))
+
+(define (test-eval) (eval (parse program))) \ No newline at end of file
diff --git a/semestr-2/racket/lista6/solution.bak b/semestr-2/racket/lista6/solution.bak
new file mode 100644
index 0000000..0805991
--- /dev/null
+++ b/semestr-2/racket/lista6/solution.bak
@@ -0,0 +1,27 @@
+#lang racket
+
+(provide (struct-out complex) parse eval)
+
+(struct complex (re im) #:transparent)
+
+(define value?
+ complex?)
+
+;; Ponizej znajduje sie interpreter zwyklych wyrazen arytmetycznych.
+;; Zadanie to zmodyfikowac go tak, by dzialal z liczbami zespolonymi.
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /]))
+
+(define (eval e)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval l) (eval r))]))
+
+(define (parse q)
+ (cond [(number? q) (const q)]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q) (parse (second q)) (parse (third q)))])) \ No newline at end of file
diff --git a/semestr-2/racket/lista6/solution.rkt b/semestr-2/racket/lista6/solution.rkt
new file mode 100644
index 0000000..59bdecd
--- /dev/null
+++ b/semestr-2/racket/lista6/solution.rkt
@@ -0,0 +1,73 @@
+#lang racket
+
+(provide (struct-out complex) parse eval)
+
+(struct complex (re im) #:transparent)
+
+(define value?
+ complex?)
+
+(define (comp-plus x y)
+ (let ((x-re (complex-re x))
+ (x-im (complex-im x))
+ (y-re (complex-re y))
+ (y-im (complex-im y)))
+ (complex (+ x-re y-re) (+ x-im y-im))))
+
+(define (comp-minus x y)
+ (let ((x-re (complex-re x))
+ (x-im (complex-im x))
+ (y-re (complex-re y))
+ (y-im (complex-im y)))
+ (complex (- x-re y-re) (- x-im y-im))))
+
+(define (comp-mult x y)
+ (let ((x-re (complex-re x))
+ (x-im (complex-im x))
+ (y-re (complex-re y))
+ (y-im (complex-im y)))
+ (complex (- (* x-re y-re) (* x-im y-im)) (+ (* x-re y-im) (* x-im y-re)))))
+
+(define (comp-mod2 x)
+ (let ((x-re (complex-re x))
+ (x-im (complex-im x)))
+ (complex (+ (* x-re x-re) (* x-im x-im)) 0)))
+
+(define (comp-mod x)
+ (let ((mod2 (comp-mod2 x))
+ (x-re (complex-re x)))
+ (complex (sqrt x-re) 0)))
+
+(define (comp-div x y)
+ (let* ((mod2 (complex-re (comp-mod2 y)))
+ (x-re (complex-re x))
+ (x-im (complex-im x))
+ (y-re (complex-re y))
+ (y-im (complex-im y))
+ (real (+ (* x-re y-re) (* x-im y-im)))
+ (imag (- (* x-im y-re) (* x-re y-im))))
+ (complex (/ real mod2) (/ imag mod2))))
+
+
+;; Ponizej znajduje sie interpreter zwyklych wyrazen arytmetycznych.
+;; Zadanie to zmodyfikowac go tak, by dzialal z liczbami zespolonymi.
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+
+(define (imaginary-unit? c)
+ (eq? c 'i))
+
+(define (op->proc op)
+ (match op ['+ comp-plus] ['- comp-minus] ['* comp-mult] ['/ comp-div]))
+
+(define (eval e)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval l) (eval r))]))
+
+(define (parse q)
+ (cond [(number? q) (const (complex q 0))]
+ [(imaginary-unit? q) (const (complex 0 1))]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q) (parse (second q)) (parse (third q)))])) \ No newline at end of file
diff --git a/semestr-2/racket/lista6/zad11/solution.bak b/semestr-2/racket/lista6/zad11/solution.bak
new file mode 100644
index 0000000..f449481
--- /dev/null
+++ b/semestr-2/racket/lista6/zad11/solution.bak
@@ -0,0 +1,36 @@
+#lang racket
+
+(provide (struct-out const) (struct-out binop) rpn->arith)
+
+;; -------------------------------
+;; Wyrazenia w odwr. not. polskiej
+;; -------------------------------
+
+(define (rpn-expr? e)
+ (and (list? e)
+ (pair? e)
+ (andmap (lambda (x) (or (number? x) (member x '(+ - * /))))
+ e)))
+
+;; ----------------------
+;; Wyrazenia arytmetyczne
+;; ----------------------
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+
+(define (arith-expr? e)
+ (match e
+ [(const n) (number? n)]
+ [(binop op l r)
+ (and (symbol? op) (arith-expr? l) (arith-expr? r))]
+ [_ false]))
+
+;; ----------
+;; Kompilacja
+;; ----------
+
+(define (rpn->arith e)
+ (error "TODO: Uzupelnij tutaj"))
+
+; Mozesz tez dodac jakies procedury pomocnicze i testy \ No newline at end of file
diff --git a/semestr-2/racket/lista6/zad11/solution.rkt b/semestr-2/racket/lista6/zad11/solution.rkt
new file mode 100644
index 0000000..a44afe4
--- /dev/null
+++ b/semestr-2/racket/lista6/zad11/solution.rkt
@@ -0,0 +1,58 @@
+#lang racket
+
+(provide (struct-out const) (struct-out binop) rpn->arith)
+
+;; -------------------------------
+;; Wyrazenia w odwr. not. polskiej
+;; -------------------------------
+
+(define (rpn-expr? e)
+ (and (list? e)
+ (pair? e)
+ (andmap (lambda (x) (or (number? x) (member x '(+ - * /))))
+ e)))
+
+;; ----------------------
+;; Wyrazenia arytmetyczne
+;; ----------------------
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+
+(define (arith-expr? e)
+ (match e
+ [(const n) (number? n)]
+ [(binop op l r)
+ (and (symbol? op) (arith-expr? l) (arith-expr? r))]
+ [_ false]))
+
+;; ----------
+;; Kompilacja
+;; ----------
+
+(struct stack (xs))
+
+(define empty-stack (stack null))
+(define (empty-stack? s) (null? (stack-xs s)))
+(define (top s) (car (stack-xs s)))
+(define (push a s) (stack (cons a (stack-xs s))))
+(define (pop s) (stack (cdr (stack-xs s))))
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /]))
+
+(define (eval-am e s)
+ (cond [(null? e)
+ (top s)]
+ [(number? (car e))
+ (eval-am (cdr e) (push (const (car e)) s))]
+ [(symbol? (car e))
+ (eval-am (cdr e)
+ (push (binop (car e) (top (pop s)) (top s))
+ (pop (pop s))))]))
+
+(define (rpn->arith e)
+ (eval-am e empty-stack))
+
+
+; Mozesz tez dodac jakies procedury pomocnicze i testy \ No newline at end of file
diff --git a/semestr-2/racket/luk.rkt b/semestr-2/racket/luk.rkt
new file mode 100644
index 0000000..cc319a5
--- /dev/null
+++ b/semestr-2/racket/luk.rkt
@@ -0,0 +1,137 @@
+#lang typed/racket
+
+; Do let-env.rkt dodajemy wartosci boolowskie
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+(provide parse typecheck)
+
+(define-type Value (U Boolean Real))
+(define-type Expr (U const binop var-expr let-expr if-expr))
+(define-type ArithSymbol (U '+ '- '* '/))
+(define-type LogicSymbol (U 'and 'or))
+(define-type CompSymbol (U '< '= '> '<= '>=))
+(define-type BinomSymbol (U ArithSymbol LogicSymbol CompSymbol))
+
+(define-type Binop-list (List BinomSymbol Any Any))
+(define-type Let-list (List 'let (List Symbol Any) Any))
+(define-type If-list (List 'if Any Any Any))
+
+(define-predicate Binop-list? Binop-list)
+(define-predicate Let-list? Let-list)
+(define-predicate If-list? If-list)
+
+(struct const ([val : Value]) #:transparent)
+(struct binop ([op : BinomSymbol] [l : Expr] [r : Expr]) #:transparent)
+(struct var-expr ([id : Symbol]) #:transparent)
+(struct let-expr ([id : Symbol] [e1 : Expr] [e2 : Expr]) #:transparent)
+(struct if-expr ([eb : Expr] [et : Expr] [ef : Expr]) #:transparent)
+
+(define-predicate Value? Value)
+(define-predicate Expr? Expr)
+(define-predicate BinomSymbol? BinomSymbol)
+(define-predicate ArithSymbol? ArithSymbol)
+(define-predicate LogicSymbol? LogicSymbol)
+(define-predicate CompSymbol? CompSymbol)
+(define-predicate BinomValue? BinomValue)
+
+
+
+(: parse (-> Any Expr))
+(define (parse q)
+ (cond
+ [(real? q) (const q)]
+ [(eq? q 'true) (const true)] ; <---------------------------- !!!
+ [(eq? q 'false) (const false)] ; <---------------------------- !!!
+ [(symbol? q) (var-expr q)]
+ [(Let-list? q)
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(If-list? q) ; <--- !!!
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(Binop-list? q)
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]
+ [else (error "Blad parsowania" q)]))
+
+
+
+
+(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1))))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+(define-type EType ( U 'real 'boolean ) )
+(define-type Env (Listof (Pairof Symbol EType)))
+(define-predicate Env? Env)
+(struct environ ([xs : Env]))
+
+(: env-empty environ)
+(define env-empty (environ null))
+(: env-add (-> Symbol EType environ environ))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(: env-lookup (-> Symbol environ (U EType #f)))
+(define (env-lookup x env)
+ (: assoc-lookup (-> Env EType))
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+
+(: typecheck (-> Expr (U EType #f)))
+(define (typecheck q)
+ (: give (-> Expr environ (U EType #f)))
+ (define (give q envi)
+ (cond
+ [(const? q) (if (boolean? (const-val q)) 'boolean 'real)]
+ [(var-expr? q) (env-lookup (var-expr-id q) envi)]
+ [(let-expr? q)
+ (let ([p (give (let-expr-e1 q) envi)]) (if (false? p) #f (give (let-expr-e2 q) (env-add (let-expr-id q) p envi))))]
+ [(binop? q)
+ (cond
+ ([ArithSymbol? (binop-op q)] (if (and (eq? 'real (give (binop-l q) envi)) (eq? 'real (give (binop-r q) envi))) 'real #f))
+ ([LogicSymbol? (binop-op q)] (if (and (eq? 'boolean (give (binop-l q) envi)) (eq? 'boolean (give (binop-r q) envi))) 'boolean #f))
+ ([CompSymbol? (binop-op q)] (if (and (eq? 'real (give (binop-l q) envi)) (eq? 'real (give (binop-r q) envi))) 'boolean #f))
+ [else #f])]
+ [(if-expr? q)
+ (if (and (eq? 'real (if-expr-eb q))
+ (eq? (give (if-expr-et q) envi) (give (if-expr-ef q) envi)))
+ (give (if-expr-et q) envi)
+ #f)]
+ [else #f]))
+
+
+ (give q env-empty))
+
+
+
+(define program2
+ '(if true
+ (let [x 5] (+ 5 false))
+ (/ 2 2)))
+
+(define program3
+ '(let [x (+ 2 3)]
+ (let [y (< 2 3)]
+ (+ x y))))
+
+(define program4
+ '(let [x (and true true)] x))
+
+(define wtf
+ '(and true true))
+
+(typecheck (parse program2))
+(typecheck (parse program3))
+(typecheck (parse program4))
diff --git a/semestr-2/racket/rac.rkt b/semestr-2/racket/rac.rkt
new file mode 100644
index 0000000..8300208
--- /dev/null
+++ b/semestr-2/racket/rac.rkt
@@ -0,0 +1,371 @@
+#reader(lib"read.ss""wxme")WXME0109 ##
+#|
+ This file uses the GRacket editor format.
+ Open this file in DrRacket version 7.6 or later to read it.
+
+ Most likely, it was created by saving a program in DrRacket,
+ and it probably contains a program with non-text elements
+ (such as images or comment boxes).
+
+ http://racket-lang.org/
+|#
+ 33 7 #"wxtext\0"
+3 1 6 #"wxtab\0"
+1 1 8 #"wximage\0"
+2 0 8 #"wxmedia\0"
+4 1 34 #"(lib \"syntax-browser.ss\" \"mrlib\")\0"
+1 0 36 #"(lib \"cache-image-snip.ss\" \"mrlib\")\0"
+1 0 68
+(0
+ #"((lib \"image-core.ss\" \"mrlib\") (lib \"image-core-wxme.rkt\" \"mr"
+ #"lib\"))\0"
+) 1 0 16 #"drscheme:number\0"
+3 0 44 #"(lib \"number-snip.ss\" \"drscheme\" \"private\")\0"
+1 0 36 #"(lib \"comment-snip.ss\" \"framework\")\0"
+1 0 93
+(1
+ #"((lib \"collapsed-snipclass.ss\" \"framework\") (lib \"collapsed-sni"
+ #"pclass-wxme.ss\" \"framework\"))\0"
+) 0 0 43 #"(lib \"collapsed-snipclass.ss\" \"framework\")\0"
+0 0 19 #"drscheme:sexp-snip\0"
+0 0 29 #"drscheme:bindings-snipclass%\0"
+1 0 101
+(2
+ #"((lib \"ellipsis-snip.rkt\" \"drracket\" \"private\") (lib \"ellipsi"
+ #"s-snip-wxme.rkt\" \"drracket\" \"private\"))\0"
+) 2 0 88
+(3
+ #"((lib \"pict-snip.rkt\" \"drracket\" \"private\") (lib \"pict-snip.r"
+ #"kt\" \"drracket\" \"private\"))\0"
+) 0 0 55
+#"((lib \"snip.rkt\" \"pict\") (lib \"snip-wxme.rkt\" \"pict\"))\0"
+1 0 34 #"(lib \"bullet-snip.rkt\" \"browser\")\0"
+0 0 25 #"(lib \"matrix.ss\" \"htdp\")\0"
+1 0 22 #"drscheme:lambda-snip%\0"
+1 0 29 #"drclickable-string-snipclass\0"
+0 0 26 #"drracket:spacer-snipclass\0"
+0 0 57
+#"(lib \"hrule-snip.rkt\" \"macro-debugger\" \"syntax-browser\")\0"
+1 0 26 #"drscheme:pict-value-snip%\0"
+0 0 45 #"(lib \"image-snipr.ss\" \"slideshow\" \"private\")\0"
+1 0 38 #"(lib \"pict-snipclass.ss\" \"slideshow\")\0"
+2 0 55 #"(lib \"vertical-separator-snip.ss\" \"stepper\" \"private\")\0"
+1 0 18 #"drscheme:xml-snip\0"
+1 0 31 #"(lib \"xml-snipclass.ss\" \"xml\")\0"
+1 0 21 #"drscheme:scheme-snip\0"
+2 0 34 #"(lib \"scheme-snipclass.ss\" \"xml\")\0"
+1 0 10 #"text-box%\0"
+1 0 32 #"(lib \"text-snipclass.ss\" \"xml\")\0"
+1 0 1 6 #"wxloc\0"
+ 0 0 64 0 1 #"\0"
+0 75 1 #"\0"
+0 10 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 0 9
+#"Standard\0"
+0 75 12 #"Courier New\0"
+0 26 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 -1 -1 2 24
+#"framework:default-color\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 150 0 150 0 0 0 -1 -1 2 15
+#"text:ports out\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 150 0 150 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 255 0 0 0 0 0 -1
+-1 2 15 #"text:ports err\0"
+0 -1 1 #"\0"
+1 0 -1 -1 93 -1 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 175 0 0 0 -1 -1 2 17
+#"text:ports value\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 175 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1
+-1 2 27 #"Matching Parenthesis Style\0"
+0 -1 1 #"\0"
+1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1
+-1 2 1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 37
+#"framework:syntax-color:scheme:symbol\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 38
+#"framework:syntax-color:scheme:keyword\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2
+38 #"framework:syntax-color:scheme:comment\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 37
+#"framework:syntax-color:scheme:string\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 35
+#"framework:syntax-color:scheme:text\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 39
+#"framework:syntax-color:scheme:constant\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 49
+#"framework:syntax-color:scheme:hash-colon-keyword\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 42
+#"framework:syntax-color:scheme:parenthesis\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 36
+#"framework:syntax-color:scheme:error\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 36
+#"framework:syntax-color:scheme:other\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 16
+#"Misspelled Text\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 81 112 203 0 0 0 -1 -1 2
+38 #"drracket:check-syntax:lexically-bound\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 81 112 203 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 28
+#"drracket:check-syntax:set!d\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 37
+#"drracket:check-syntax:unused-require\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 36
+#"drracket:check-syntax:free-variable\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 68 0 203 0 0 0 -1 -1 2 31
+#"drracket:check-syntax:imported\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 68 0 203 0 0 0 -1 -1 2 47
+#"drracket:check-syntax:my-obligation-style-pref\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 116 0 0 0 0 -1 -1 2 50
+#"drracket:check-syntax:their-obligation-style-pref\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 116 0 0 0 0 -1 -1 2 48
+#"drracket:check-syntax:unk-obligation-style-pref\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 139 142 28 0 0 0 -1 -1 2
+49 #"drracket:check-syntax:both-obligation-style-pref\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 139 142 28 0 0 0 -1 -1 2
+26 #"plt:htdp:test-coverage-on\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 2 27
+#"plt:htdp:test-coverage-off\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 4 1
+#"\0"
+0 70 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0
+-1 -1 4 4 #"XML\0"
+0 70 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0
+-1 -1 2 37 #"plt:module-language:test-coverage-on\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 38
+#"plt:module-language:test-coverage-off\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 0 36
+#"mrlib/syntax-browser:subtitle-color\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 36 36 140 255 255 255 -1
+-1 0 42 #"mrlib/syntax-browser:focused-syntax-color\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 34 139 34 255 255 255 -1
+-1 4 1 #"\0"
+0 71 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0
+-1 -1 4 1 #"\0"
+0 -1 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 0 255 0 0 0 -1
+-1 4 1 #"\0"
+0 71 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 0 255 0 0 0 -1
+-1 4 1 #"\0"
+0 71 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 100 0 0 0 0 -1
+-1 4 1 #"\0"
+0 71 1 #"\0"
+1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 255 0 0 0 0 0 -1
+-1 2 1 #"\0"
+0 70 1 #"\0"
+1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 148 0 211 0 0 0 -1
+-1 2 1 #"\0"
+0 -1 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 0 255 0 0 0 -1
+-1 0 1 #"\0"
+0 -1 1 #"\0"
+0 12 -1 -1 -1 -1 -1 -1 0 0 1 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0
+-1 -1 2 1 #"\0"
+0 -1 1 #"\0"
+0 12 -1 -1 -1 -1 -1 -1 0 0 1 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0
+-1 -1 2 1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 200 0 0 0 0 0 -1 -1 4 1
+#"\0"
+0 -1 1 #"\0"
+1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 255 255 0 -1 -1
+ 0 122 0 28 3 12 #"#lang racket"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"("
+0 0 15 3 6 #"define"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"fringe"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"tree"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" ("
+0 0 15 3 4 #"cond"
+0 0 24 3 3 #" (("
+0 0 14 3 5 #"null?"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"tree"
+0 0 24 3 2 #") "
+0 0 14 3 4 #"null"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 10 #" (("
+0 0 14 3 3 #"not"
+0 0 24 3 2 #" ("
+0 0 14 3 5 #"pair?"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"tree"
+0 0 24 3 4 #")) ("
+0 0 14 3 4 #"list"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"tree"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 3 9 #" ("
+0 0 14 3 4 #"else"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"append"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"fringe"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"car"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"tree"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 3 23 #" ("
+0 0 14 3 6 #"fringe"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"cdr"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"tree"
+0 0 24 3 6 #"))))))"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"("
+0 0 15 3 6 #"define"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"subsets"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"s"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" ("
+0 0 14 3 2 #"if"
+0 0 24 3 2 #" ("
+0 0 14 3 5 #"null?"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"s"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 7 #" ("
+0 0 14 3 4 #"list"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"null"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 7 #" ("
+0 0 15 3 3 #"let"
+0 0 24 3 3 #" (("
+0 0 14 3 4 #"rest"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"subsets"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"cdr"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"s"
+0 0 24 3 4 #"))))"
+0 0 24 29 1 #"\n"
+0 0 24 3 9 #" ("
+0 0 14 3 7 #"display"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"s"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 9 #" ("
+0 0 14 3 7 #"newline"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 9 #" ("
+0 0 14 3 6 #"append"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"rest"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"map"
+0 0 24 3 2 #" ("
+0 0 15 3 6 #"lambda"
+0 0 24 3 2 #" ("
+0 0 14 3 1 #"x"
+0 0 24 3 3 #") ("
+0 0 14 3 4 #"cons"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"car"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"s"
+0 0 24 3 2 #") "
+0 0 14 3 1 #"x"
+0 0 24 3 3 #")) "
+0 0 14 3 4 #"rest"
+0 0 24 3 5 #")))))"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0
diff --git a/semestr-2/racket/solution.rkt b/semestr-2/racket/solution.rkt
new file mode 100644
index 0000000..3643668
--- /dev/null
+++ b/semestr-2/racket/solution.rkt
@@ -0,0 +1,14 @@
+#lang racket
+
+(provide heapsort) (require "leftist.rkt")
+
+(define (heapsort xs)
+ (define (create-heap xs res)
+ (if (null? xs)
+ res
+ (create-heap (cdr xs) (heap-insert (cons (car xs) (car xs)) res))))
+ (define (heap-to-list h)
+ (if (heap-empty? h)
+ null
+ (cons (elem-val (heap-min h)) (heap-to-list (heap-pop h)))))
+ (heap-to-list (create-heap xs empty-heap))) \ No newline at end of file
diff --git a/semestr-2/topo/106185944_268984110829847_6553948354204680381_n.jpg b/semestr-2/topo/106185944_268984110829847_6553948354204680381_n.jpg
new file mode 100644
index 0000000..3e15629
--- /dev/null
+++ b/semestr-2/topo/106185944_268984110829847_6553948354204680381_n.jpg
Binary files differ
diff --git a/semestr-2/topo/106656932_2682289525419459_8890828706710255563_n.jpg b/semestr-2/topo/106656932_2682289525419459_8890828706710255563_n.jpg
new file mode 100644
index 0000000..cf85459
--- /dev/null
+++ b/semestr-2/topo/106656932_2682289525419459_8890828706710255563_n.jpg
Binary files differ
diff --git a/semestr-2/topo/106703086_728253774716175_2262465163427979269_n.jpg b/semestr-2/topo/106703086_728253774716175_2262465163427979269_n.jpg
new file mode 100644
index 0000000..d650007
--- /dev/null
+++ b/semestr-2/topo/106703086_728253774716175_2262465163427979269_n.jpg
Binary files differ
diff --git a/semestr-2/topo/106792000_316914386368237_6535047497894014786_n.jpg b/semestr-2/topo/106792000_316914386368237_6535047497894014786_n.jpg
new file mode 100644
index 0000000..824dacf
--- /dev/null
+++ b/semestr-2/topo/106792000_316914386368237_6535047497894014786_n.jpg
Binary files differ
diff --git a/semestr-2/topo/107093323_1187351634957579_7077220020141497805_n.jpg b/semestr-2/topo/107093323_1187351634957579_7077220020141497805_n.jpg
new file mode 100644
index 0000000..8ce9801
--- /dev/null
+++ b/semestr-2/topo/107093323_1187351634957579_7077220020141497805_n.jpg
Binary files differ
diff --git a/semestr-2/topo/ACFrOgA9nUCrq9uSc6NvJxX3WRdWzjzunaans9KaKhMQKJdrLr6UW8LvP9BJrKFCP9iw4sZnygGqHO3idi_74KDTN2R91USZQTZz8tzhNReeRj8mm31ZqZfiYsDVgiI=.pdf b/semestr-2/topo/ACFrOgA9nUCrq9uSc6NvJxX3WRdWzjzunaans9KaKhMQKJdrLr6UW8LvP9BJrKFCP9iw4sZnygGqHO3idi_74KDTN2R91USZQTZz8tzhNReeRj8mm31ZqZfiYsDVgiI=.pdf
new file mode 100644
index 0000000..468dd99
--- /dev/null
+++ b/semestr-2/topo/ACFrOgA9nUCrq9uSc6NvJxX3WRdWzjzunaans9KaKhMQKJdrLr6UW8LvP9BJrKFCP9iw4sZnygGqHO3idi_74KDTN2R91USZQTZz8tzhNReeRj8mm31ZqZfiYsDVgiI=.pdf
@@ -0,0 +1,3629 @@
+%PDF-1.7
+%
+1 0 obj
+<<
+/AcroForm 2 0 R
+/Lang (pl-PL)
+/MarkInfo <<
+/Marked true
+>>
+/Metadata 3 0 R
+/Pages 4 0 R
+/StructTreeRoot 5 0 R
+/Type /Catalog
+/ViewerPreferences 6 0 R
+/OpenAction 7 0 R
+>>
+endobj
+8 0 obj
+<<
+/Author (Kkudalla)
+/CreationDate (D:20200706133743+02'00')
+/Creator <4D6963726F736F6674AE20576F726420646C61204D6963726F736F667420333635>
+/ModDate (D:20200706133807+02'00')
+/Producer <4D6963726F736F6674AE20576F726420646C61204D6963726F736F667420333635>
+>>
+endobj
+2 0 obj
+<<
+/DA (/Helv 0 Tf 0 g )
+/DR <<
+/Encoding <<
+/PDFDocEncoding 9 0 R
+>>
+/Font <<
+/Helv 10 0 R
+/MyriadPro-Regular 11 0 R
+/ZaDb 12 0 R
+>>
+>>
+/Fields [13 0 R]
+/SigFlags 3
+>>
+endobj
+3 0 obj
+<<
+/Length 3324
+/Subtype /XML
+/Type /Metadata
+>>
+stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c017 91.164374, 2020/03/05-20:41:30 ">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about=""
+ xmlns:pdf="http://ns.adobe.com/pdf/1.3/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+ xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">
+ <pdf:Producer>Microsoft® Word dla Microsoft 365</pdf:Producer>
+ <dc:format>application/pdf</dc:format>
+ <dc:creator>
+ <rdf:Seq>
+ <rdf:li>Kkudalla</rdf:li>
+ </rdf:Seq>
+ </dc:creator>
+ <xmp:CreatorTool>Microsoft® Word dla Microsoft 365</xmp:CreatorTool>
+ <xmp:CreateDate>2020-07-06T13:37:43+02:00</xmp:CreateDate>
+ <xmp:ModifyDate>2020-07-06T13:38:07+02:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2020-07-06T13:38:07+02:00</xmp:MetadataDate>
+ <xmpMM:DocumentID>uuid:AF6C3520-A81E-46E5-BE7E-22ACA2CA4797</xmpMM:DocumentID>
+ <xmpMM:InstanceID>uuid:39ce6e44-37dc-4684-94d5-a1c3cb352be5</xmpMM:InstanceID>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end="w"?>
+endstream
+endobj
+4 0 obj
+<<
+/Count 2
+/Kids [14 0 R 15 0 R]
+/Type /Pages
+>>
+endobj
+5 0 obj
+<<
+/IDTree 16 0 R
+/K [17 0 R]
+/ParentTree 18 0 R
+/ParentTreeNextKey 2
+/RoleMap 19 0 R
+/Type /StructTreeRoot
+>>
+endobj
+6 0 obj
+<<
+/DisplayDocTitle true
+>>
+endobj
+7 0 obj
+<<
+/Type /Action
+/S /JavaScript
+/JS (this.print\({bUI:true,bSilent:false,bShrinkToFit:true}\);)
+>>
+endobj
+9 0 obj
+<<
+/Differences [24 /breve /caron /circumflex /dotaccent /hungarumlaut /ogonek /ring /tilde 39
+/quotesingle 96 /grave 128 /bullet /dagger /daggerdbl /ellipsis /emdash /endash
+/florin /fraction /guilsinglleft /guilsinglright /minus /perthousand /quotedblbase /quotedblleft /quotedblright /quoteleft
+/quoteright /quotesinglbase /trademark /fi /fl /Lslash /OE /Scaron /Ydieresis /Zcaron
+/dotlessi /lslash /oe /scaron /zcaron 160 /Euro 164 /currency 166
+/brokenbar 168 /dieresis /copyright /ordfeminine 172 /logicalnot /.notdef /registered /macron
+/degree /plusminus /twosuperior /threesuperior /acute /mu 183 /periodcentered /cedilla /onesuperior
+/ordmasculine 188 /onequarter /onehalf /threequarters 192 /Agrave /Aacute /Acircumflex /Atilde
+/Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute
+/Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute
+/acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis
+/igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde
+/odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis]
+/Type /Encoding
+>>
+endobj
+10 0 obj
+<<
+/BaseFont /Helvetica
+/Encoding 9 0 R
+/Name /Helv
+/Subtype /Type1
+/Type /Font
+>>
+endobj
+11 0 obj
+<<
+/BaseFont /MyriadPro-Regular
+/Encoding /WinAnsiEncoding
+/FirstChar 0
+/FontDescriptor 20 0 R
+/LastChar 255
+/Subtype /Type1
+/Type /Font
+/Widths [500 500 500 500 500 500 500 500 500 500
+500 500 500 500 500 500 500 500 500 500
+500 500 500 500 500 500 500 500 500 500
+500 500 212 230 337 497 513 792 605 188
+284 284 415 596 207 307 207 343 513 513
+513 513 513 513 513 513 513 513 207 207
+596 596 596 406 737 612 542 580 666 492
+487 646 652 239 370 542 472 804 658 689
+532 689 538 493 497 647 558 846 571 541
+553 284 341 284 596 500 300 482 569 448
+564 501 292 559 555 234 243 469 236 834
+555 549 569 563 327 396 331 551 481 736
+463 471 428 284 239 284 596 282 513 282
+207 513 356 1000 500 500 300 1156 493 255
+894 282 553 282 282 207 207 354 354 282
+500 1000 300 619 396 255 863 282 428 541
+212 230 513 513 513 513 239 519 300 677
+346 419 596 307 419 300 318 596 311 305
+300 553 512 207 300 244 355 419 759 759
+759 406 612 612 612 612 612 612 788 580
+492 492 492 492 239 239 239 239 671 658
+689 689 689 689 689 596 689 647 647 647
+647 541 531 548 482 482 482 482 482 482
+773 448 501 501 501 501 234 234 234 234
+541 555 549 549 549 549 549 596 549 551
+551 551 551 471 569 471]
+>>
+endobj
+12 0 obj
+<<
+/BaseFont /ZapfDingbats
+/Name /ZaDb
+/Subtype /Type1
+/Type /Font
+>>
+endobj
+13 0 obj
+<<
+/AP <<
+/N 21 0 R
+>>
+/DA (/MyriadPro-Regular 0 Tf 0 Tz 0 g)
+/F 132
+/FT /Sig
+/MK <<
+>>
+/P 15 0 R
+/Rect [415.34 499.989 518.347 549.339]
+/Subtype /Widget
+/T (Signature2)
+/Type /Annot
+/V 22 0 R
+>>
+endobj
+14 0 obj
+<<
+/Contents [23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R]
+/CropBox [0 0 595.2 841.8]
+/Group <<
+/CS /DeviceRGB
+/S /Transparency
+/Type /Group
+>>
+/MediaBox [0 0 595.2 841.8]
+/Parent 4 0 R
+/Resources <<
+/ExtGState <<
+/GS10 31 0 R
+/GS11 32 0 R
+>>
+/Font <<
+/F1 33 0 R
+/F2 34 0 R
+/F3 35 0 R
+/F4 36 0 R
+/F5 37 0 R
+/F6 38 0 R
+/F7 39 0 R
+>>
+/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+>>
+/Rotate 0
+/StructParents 0
+/Tabs /S
+/Type /Page
+>>
+endobj
+15 0 obj
+<<
+/Annots [13 0 R]
+/Contents 40 0 R
+/CropBox [0 0 595.2 841.8]
+/Group <<
+/CS /DeviceRGB
+/S /Transparency
+/Type /Group
+>>
+/MediaBox [0 0 595.2 841.8]
+/Parent 4 0 R
+/Resources <<
+/ExtGState <<
+/GS10 31 0 R
+/GS11 32 0 R
+>>
+/Font <<
+/F1 33 0 R
+/F2 34 0 R
+/F3 35 0 R
+/F4 36 0 R
+/F5 37 0 R
+/F7 39 0 R
+>>
+/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+>>
+/Rotate 0
+/StructParents 1
+/Tabs /S
+/Type /Page
+>>
+endobj
+16 0 obj
+<<
+/Names [(Note 1) 41 0 R]
+>>
+endobj
+17 0 obj
+<<
+/K [42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R
+52 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R 61 0 R
+62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 41 0 R 68 0 R 69 0 R 70 0 R
+71 0 R 72 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R
+81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R
+91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R]
+/P 5 0 R
+/S /Document
+/Type /StructElem
+>>
+endobj
+18 0 obj
+<<
+/Nums [0 [100 0 R 101 0 R 102 0 R 103 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R
+51 0 R 52 0 R 53 0 R 104 0 R 105 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R
+60 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 106 0 R 107 0 R 108 0 R
+109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R
+119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 68 0 R 69 0 R 70 0 R
+71 0 R 126 0 R 127 0 R 73 0 R 74 0 R 75 0 R 128 0 R 76 0 R 129 0 R 77 0 R
+130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R]
+ 1 [136 0 R 137 0 R 78 0 R 79 0 R 80 0 R 138 0 R 139 0 R 140 0 R 82 0 R 83 0 R
+84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 141 0 R 142 0 R 90 0 R 91 0 R 92 0 R
+93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R]
+]
+>>
+endobj
+19 0 obj
+<<
+/Annotation /Sect
+/Artifact /Sect
+/Chart /Sect
+/Chartsheet /Part
+/Diagram /Figure
+/Dialogsheet /Part
+/Endnote /Note
+/Footer /Sect
+/Footnote /Note
+/Header /Sect
+/InlineShape /Sect
+/Macrosheet /Part
+/Slide /Part
+/Textbox /Sect
+/Workbook /Document
+/Worksheet /Part
+>>
+endobj
+20 0 obj
+<<
+/Ascent 952
+/CapHeight 674
+/CharSet (/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/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/bracketleft/backslash/bracketright/asciicircum/underscore/grave/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/braceleft/bar/braceright/asciitilde/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis)
+/Descent -250
+/Flags 32
+/FontBBox [-157 -250 1126 952]
+/FontFamily (Myriad Pro)
+/FontFile3 143 0 R
+/FontName /MyriadPro-Regular
+/FontStretch /Normal
+/FontWeight 400
+/ItalicAngle 0
+/StemV 88
+/Type /FontDescriptor
+/XHeight 484
+>>
+endobj
+21 0 obj
+<<
+/Length 7
+/BBox [0.0 0.0 103.007 49.3506]
+/Resources <<
+/XObject <<
+/FRM 144 0 R
+>>
+>>
+/Subtype /Form
+/Type /XObject
+>>
+stream
+/FRM Do
+endstream
+endobj
+22 0 obj
+<<
+/ByteRange [0 148276 206888 135679]
+/Contents <30826F0406092A864886F70D010702A0826EF530826EF1020101310F300D06096086480165030402010500300B06092A864886F70D010701A0820DAD308206943082047CA00302010202141A5734B0D472D251E1D37CFE3D796AC117102490300D06092A864886F70D01010D0500306F310B300906035504061302504C311D301B060355040A0C144E61726F646F77792042616E6B20506F6C736B693126302406035504030C1D4E61726F646F77652043656E7472756D20436572747966696B61636A693119301706035504610C10564154504C2D35323530303038313938301E170D3137303231343132323631395A170D3238303231343233353935395A306F3119301706035504610C10564154504C2D39353132333532333739310B300906035504061302504C311C301A060355040A0C134575726F436572742053702E207A206F2E6F2E3127302506035504030C1E43656E7472756D204B77616C6966696B6F77616E65204575726F4365727430820222300D06092A864886F70D01010105000382020F003082020A0282020100D0F7EAC0E3C610864FF50A76823A98316BAB7F62BAE9ACC87C6BCACBD45CDE6539990F480FC14CBC2578762236229D8C7A0A96BB19DE7DD6B24C4AF83F7CD22A8DDD67C61FA595D711B92C33089C6274AF15CBF99AAFF628C3035CF3381BF9D343B7AB54861E812D6D0BD606AAB494FF3213B35D0E3DDF25B8282D301B0B19748548DDC4CA00B597D89E606FB6AA46386CC4F6574D77F26B5A93C4024905415D30D89AF4FD45C3E577C0E3A09BC89CE95FB350AD44BBF156053F2269BA4958230AA8C7E3A3F83C1A1F5691941371F28AD0539B621A2AD239E8BB744275CDA956D6519D726091782F58A91081DE53CC8ABAEC72B0DA8F4ADAE0D1047883EE0D831016C709319A76A8D4E6FE6F088E5D9E5C42413D79F7C9392F2C6D19EEFC054D6685CE8089D2E1C5CCD2EBD47F0966CB6701CF05E012C84EAD6D00FA7F797956E2A55BBF8019EF1CFE1C0401979ED852ACB789B26453DE8BA56416A2E2836231457C0A002302979BA7F73D322C5B71B5444315D0323D0F50AD0AEC5F47F6F88B14FCFA6A6EB5841D42130B5B6112B380F45B8DD7B0C9FF6EBA0DE17CC4F17F560A39D120A6DB06A731E88E45013C14210A841300C096D3A647050341A252933360AEC26EB6DE2E419791B74B4EA1FF1A0280B30EB904BB427E92ACCC6C36F19960C87557A0AC2DE74EBD682816EB38A1FDA4C6EB7B9D0C66E28028C58D9A761B0203010001A382012630820122300F0603551D130101FF040530030101FF3081AC0603551D230481A43081A1801429B3C8C4DFA387F866051258FD462AB8980D7987A173A471306F310B300906035504061302504C311D301B060355040A0C144E61726F646F77792042616E6B20506F6C736B693126302406035504030C1D4E61726F646F77652043656E7472756D20436572747966696B61636A693119301706035504610C10564154504C2D35323530303038313938821440F8F78AB0E364105691C8D9E02CF8C1C6400A4630310603551D200101FF0427302530230604551D2000301B301906082B06010505070201160D7777772E6E63636572742E706C300E0603551D0F0101FF040403020106301D0603551D0E0416041474627099FF1B603BC464B5841FA3150C5CCB5FBD300D06092A864886F70D01010D050003820201007FA1A8393E66C6D57B7A372DB71A7CB0335A77A5C394660F6C3D33931E42A25FA7ACD09F5751276C6840A5FD787468A795B68A8C44F2D195FAA3BFFE48AEB100495DB87AEC76F87B0AE5F8992B217C31C8E3C4EAF9CCEF41AFF0F5B214CEBD22F2ED9FB94C77E947F58D22F9063D3B2A8B8E55B478AA4DAEED3571C70AC31836A3EBECB2F5B5C6590817F1FB629FAF0699FE4CC1312FB01D50EE8D1A8F352582AB69AAA14FDE77C824D51BC722A092BFDB94737A001E3F4521F7268611ABEE5F6F423B8788AAD3496660809564452C174583AFAE84297E460EB56FDE4A47534D946255A3DA43862BEE8EC265013C0260ED039D76A7EF0EB35411EB997A47BB5C7BB1763B458CAD98B5CC3457150576231263EE3D6EACC2DF24C888DF9CC135088BE1B25E51CB031F739A5542815658BABC4DD3EE120A8DC77837E43ED3CA03382916363D5939FBDADD13AB04B20EFB1A956604CBD53EE66461442CA65D55B52A05D50E9BE575F9BB6E96EB9B21A33254E6A87ED5248670BFC11DD7ABEE4F38555C9FE3D8896A49D201768F031ED506589A5DE3B4205B58BDB96A5E68AE3CAE57A3181AC697B9C4F0FE654BBE8D5C9B453BE021F38A3E524C2321EE7D1B908791472F8E7E12803D1BC08CBCE5843FA69CABE0B2137CFDC6FB00E1FBED8B6274CA377D851F41EF3655DB229F778C004DB027A5F805DF844C7B0CB09F21FAC5E1D130820711308204F9A003020102020B51434130335F0200040400300D06092A864886F70D01010B0500306F3119301706035504610C10564154504C2D39353132333532333739310B300906035504061302504C311C301A060355040A0C134575726F436572742053702E207A206F2E6F2E3127302506035504030C1E43656E7472756D204B77616C6966696B6F77616E65204575726F43657274301E170D3139303831393039323932375A170D3231303831383039323932375A30733122302006035504030C1941445249414E41204557454C494E41204D454459C583534B41311A301806035504050C11504E4F504C2D38303037313130383036353112301006035504040C094D454459C583534B413110300E060355042A0C0741445249414E41310B300906035504060C02504C308201A2300D06092A864886F70D01010105000382018F003082018A028201810097B18BD986A1CC9EF8163917F6ECC60D9D3EAC7266A4562EC61011591BE7118EB1BA94D3A86100BF05D410876698C1AD52F382358A28EF00F26F3E6AF26F86F78EF4EE24B96F4395DC408E6E18FAADA9F09EC5F3C47B007709FBB22783818C084C34B6E05F2C3EFBF3E5131F43F6FFEDC31750D911F753D7A9AD3AD4C6B3C0C1C379B7F5B93908D7EE5691C1E0D0C0E334943C65B47AFEA66EE5CB81A86461BBA4BB92363266A35B1D6B903F7BD342EB1B5463E90D6FEDED6E9B6F7382945FB0B88F8D8AB7AD4852CD4406CD2FD9FC9CBE99449BEBE608EC05A363BB0FF9147B066157E045C7A965852F379F2F7A36674F1894D57ACA5417074E0DAAA27D008477C0778C38CA88DAD6A6DEE9FE110F5CC5004D40274DB3CE8F084324E8E371518349339E19DE449A97AEE4517ADF5A4BD44F0595D1660575A1619EBFC77E9FA3261CCFEE30B0E508E1470719F93C148DE5A0821074AE7468E40B1E04B7320F4D2A60787B5D7BA679666E44AB7580111579FB17DE2E6948CB88C5C38C0695E4EB0203010001A382022830820224301F0603551D2304183016801474627099FF1B603BC464B5841FA3150C5CCB5FBD301D0603551D0E041604149B410D4D610FB58C12AF87E64658A00A50F02DBB300F0603551D130101FF04053003010100300E0603551D0F0101FF0404030206403081D70603551D200101FF0481CC3081C93081B1060A2A84680186F87F0102023081A2303006082B060105050702011624687474703A2F2F7777772E6575726F636572742E706C2F7265706F7A79746F7269756D2F306E06082B0601050507020230620C60436572747966696B617420777973746177696F6E79207A676F646E6965207A207A61736164616D69206F706973616E796D69207720646F6B756D656E63696520506F6C6974796B6120436572747966696B61636A6920776572736A6120322E303009060704008BEC4001023008060604008F7A010230310603551D1F042A30283026A024A0228620687474703A2F2F63726C2E6575726F636572742E706C2F71636130332E63726C307B06082B06010505070101046F306D302806082B06010505073001861C687474703A2F2F63726C2E6575726F636572742E706C2F4F4353502F304106082B06010505073002863568747470733A2F2F6575726F636572742E706C2F7075622F507261776F2F51434130335F4575726F636572745F323031372E646572303706082B06010505070103042B30293008060604008E4601013008060604008E4601043013060604008E4601063009060704008E46010601300D06092A864886F70D01010B05000382020100A383702A04DD1450F0B2B864D20CC314D405F80400F730A8D5B2E655AF12E656EFE76CAD4FA528E7CDE08C8688FFC33149132B18C10801EAF095C221EDB494CEF54643EAA0474FEBDCE4F4AE8ECCA634D162E0C0584C58357CF643FA00CF6A8318A3CCE94AFB26B79DB3D8FDA6AF6A5954376CB888789A2C681E430510B09F526A05C437B742D2986490E867BBB630260CB38ACFEDB1914E4148B29F40BA937171B2526D8E3BCE3E8F0F2475E22D45B45A3213E69A23DB126B0CE635D63D86145807B17C14F37500B147B3FFE26A5C6BBCEB8976083285F3D0C1982E3A162CD7E8702D172DADD4204BC94D131F8C2CDDF152361F15CE73E33177996BEE537AB9ED4B6B46F8C3509BC309468BC1012CA68D7C8BDA8870C5855440FF01318B5F955BA513B1454C80F4651C2A329836FEF680106EF47DF0CC70EE8A101B061BC50A9CDDD5C936FC5CC119137E89B17BD9A7DB936E74B9E8CDBBB728953B7831A2DD954EF92148C3BCA8C22006D1CBA79D383F9A5C915B6C721D46134C307BE59026F779D90DD2F69DC8D4F6E1E072855FF2368D611627F3925C3706D491D58C35E1809866D1A8C6D89D887D381D8828BEBBE16A39310387EDC94D6B6AD2150DE7134036FB7A4BA34761ABE66A2EC42D86F53ACA59A277ACA40C5C292E6919DCB55B6B04D87D60BE1436EC62F57FBE3DC941F2FB5ACE402D5203AE60F97B004EB7933182611B30826117020101307E306F3119301706035504610C10564154504C2D39353132333532333739310B300906035504061302504C311C301A060355040A0C134575726F436572742053702E207A206F2E6F2E3127302506035504030C1E43656E7472756D204B77616C6966696B6F77616E65204575726F43657274020B51434130335F0200040400300D06096086480165030402010500A0825EEE301806092A864886F70D010903310B06092A864886F70D010701302F06092A864886F70D010904312204202185C186075BD6983C93408D3816E6C8D99987A15F2BEB7666EA73EC13645AFB30825E9F06092A864886F72F01010831825E9030825E8CA0825E8830825E8430825E8030825C68020101300D06092A864886F70D01010B0500306F3119301706035504610C10564154504C2D39353132333532333739310B300906035504061302504C311C301A060355040A0C134575726F436572742053702E207A206F2E6F2E3127302506035504030C1E43656E7472756D204B77616C6966696B6F77616E65204575726F43657274170D3230303730363035303030315A170D3230303730373035303030315A30825B91302402023634170D3138303230313130313333395A300F300D0603551D1501010004030A0105302402023633170D3138303230313130313335325A300F300D0603551D1501010004030A0105302402023639170D3138303230323132303031375A300F300D0603551D1501010004030A010130250203313132170D3138303532323134303633335A300F300D0603551D1501010004030A010530250203313936170D3138303730333130323735375A300F300D0603551D1501010004030A010130250203333239170D3138303730393134323634375A300F300D0603551D1501010004030A01053026020431313332170D3138303732353037343532345A300F300D0603551D1501010004030A01053026020431313238170D3138303732353037343634315A300F300D0603551D1501010004030A010530250203353436170D3138303930333038343531395A300F300D0603551D1501010004030A01033026020431383237170D3138303930353134333731355A300F300D0603551D1501010004030A01003026020431383236170D3138303930363037313634355A300F300D0603551D1501010004030A01043026020431383235170D3138303930363037313734355A300F300D0603551D1501010004030A01043026020431343437170D3138303931323131343733345A300F300D0603551D1501010004030A010430250203343739170D3138303931333035343032305A300F300D0603551D1501010004030A01053026020432343935170D3138303931393035313935385A300F300D0603551D1501010004030A01043026020433373330170D3138313032393132333432375A300F300D0603551D1501010004030A01043026020432373439170D3138313130353038313334305A300F300D0603551D1501010004030A01053026020433383134170D3138313130383132323533335A300F300D0603551D1501010004030A01043026020431303633170D3138313130383132323534305A300F300D0603551D1501010004030A01043026020436353436170D3139303131313132333931355A300F300D0603551D1501010004030A01043026020434363939170D3139303131353138313632325A300F300D0603551D1501010004030A01013026020433333232170D3139303131363133343735325A300F300D0603551D1501010004030A0105302402023833170D3139303133303133343033355A300F300D0603551D1501010004030A010530250203353139170D3139303230373130353331355A300F300D0603551D1501010004030A01013026020433343632170D3139303230383130343235315A300F300D0603551D1501010004030A01013026020437383832170D3139303232323038343332395A300F300D0603551D1501010004030A01013026020439363937170D3139303232373133343833315A300F300D0603551D1501010004030A01013026020435373232170D3139303331353039313030355A300F300D0603551D1501010004030A01043026020435373234170D3139303331353039313034305A300F300D0603551D1501010004030A0104302702053130313839170D3139303331353039313132355A300F300D0603551D1501010004030A0104302702053130363835170D3139303331353039313235305A300F300D0603551D1501010004030A01053026020439303233170D3139303331353039313435335A300F300D0603551D1501010004030A010530250203333832170D3139303332373039333133395A300F300D0603551D1501010004030A0101302D020B51434130335F0104070205170D3139303431353038303431395A300F300D0603551D1501010004030A01043026020435393133170D3139303431353038303534345A300F300D0603551D1501010004030A0104302D020B51434130335F0101050908170D3139303431363131333035345A300F300D0603551D1501010004030A0105302D020B51434130335F0105000409170D3139303432393039333635335A300F300D0603551D1501010004030A0101302D020B51434130335F0104060106170D3139303530373037303833335A300F300D0603551D1501010004030A0101302D020B51434130335F0104050800170D3139303530383131353634375A300F300D0603551D1501010004030A0104302D020B51434130335F0105050803170D3139303530383131353734315A300F300D0603551D1501010004030A0101302D020B51434130335F0105040801170D3139303530383131353830345A300F300D0603551D1501010004030A0101302D020B51434130335F0104070907170D3139303530383131353832325A300F300D0603551D1501010004030A0101302D020B51434130335F0104060806170D3139303530383131353930385A300F300D0603551D1501010004030A0101302D020B51434130335F0104020407170D3139303530383131353935345A300F300D0603551D1501010004030A0101302D020B51434130335F0104020103170D3139303530383132303032355A300F300D0603551D1501010004030A0105302D020B51434130335F0104020606170D3139303530383132303034375A300F300D0603551D1501010004030A01013026020431373734170D3139303530383132303131335A300F300D0603551D1501010004030A01013026020431373736170D3139303530383132303133315A300F300D0603551D1501010004030A01013026020433383434170D3139303530383133303235325A300F300D0603551D1501010004030A01013026020435333432170D3139303530393038343934395A300F300D0603551D1501010004030A01013026020432343631170D3139303531333131333432355A300F300D0603551D1501010004030A0101302702053130373836170D3139303532393039323435325A300F300D0603551D1501010004030A01043026020436323332170D3139303630373038323032305A300F300D0603551D1501010004030A01013026020431343332170D3139303631383039303333315A300F300D0603551D1501010004030A0101302D020B51434130335F0108010704170D3139303731353038323834305A300F300D0603551D1501010004030A0105302D020B51434130335F0108010505170D3139303731353038323834395A300F300D0603551D1501010004030A0105302D020B51434130335F0108060605170D3139303830313132343132335A300F300D0603551D1501010004030A0104302D020B51434130335F0106010108170D3139303830313132343432365A300F300D0603551D1501010004030A0101302D020B51434130335F0109070406170D3139303830313132343533375A300F300D0603551D1501010004030A0104302D020B51434130335F0109070302170D3139303830313132343630315A300F300D0603551D1501010004030A0104302D020B51434130335F0102010609170D3139303830313132343633345A300F300D0603551D1501010004030A0105302702053130343036170D3139303830313132343835375A300F300D0603551D1501010004030A0104302D020B51434130335F0105080608170D3139303830323131313635315A300F300D0603551D1501010004030A0104302D020B51434130335F0101060503170D3139303830353132313632385A300F300D0603551D1501010004030A0105302D020B51434130335F0108010707170D3139303830363037313835325A300F300D0603551D1501010004030A0101302D020B51434130335F0107090503170D3139303832393130333335375A300F300D0603551D1501010004030A0101302D020B51434130335F0103020407170D3139303833303133313435365A300F300D0603551D1501010004030A0104302D020B51434130335F0101090500170D3139303932343037323532375A300F300D0603551D1501010004030A0101302D020B51434130335F0201070703170D3139303932373039303835345A300F300D0603551D1501010004030A0101302D020B51434130335F0103040508170D3139313030383039323735325A300F300D0603551D1501010004030A01053026020439343537170D3139313032333039303430345A300F300D0603551D1501010004030A0105302D020B51434130335F0202040602170D3139313032333039303735305A300F300D0603551D1501010004030A0105302D020B51434130335F0106000304170D3139313032333039313033355A300F300D0603551D1501010004030A0101302D020B51434130335F0202000105170D3139313032333039313430395A300F300D0603551D1501010004030A0104302D020B51434130335F0107020008170D3139313130383037353532385A300F300D0603551D1501010004030A0105302D020B51434130335F0202070308170D3139313130383037353535385A300F300D0603551D1501010004030A0101302D020B51434130335F0108040708170D3139313130383037353632355A300F300D0603551D1501010004030A01033026020431383437170D3139313131353131313835375A300F300D0603551D1501010004030A01043026020431323233170D3139313131353131313930355A300F300D0603551D1501010004030A01043026020433353234170D3139313131353131323330315A300F300D0603551D1501010004030A01053026020433353531170D3139313131353131323331305A300F300D0603551D1501010004030A0105302D020B51434130335F0105060807170D3139313132303131303531375A300F300D0603551D1501010004030A0101302D020B51434130335F0103000405170D3139313132353134343532345A300F300D0603551D1501010004030A01013026020437353436170D3139313132383039303834305A300F300D0603551D1501010004030A0105302D020B51434130335F0107020606170D3139313231323133303635345A300F300D0603551D1501010004030A0101302D020B51434130335F0203040609170D3139313231333039333933335A300F300D0603551D1501010004030A0105302D020B51434130335F0200030900170D3139313231373134333234315A300F300D0603551D1501010004030A0105302D020B51434130335F0201020704170D3139313231373134333332365A300F300D0603551D1501010004030A0105302D020B51434130335F0201060100170D3139313231383131323634355A300F300D0603551D1501010004030A0105302D020B51434130335F0201070309170D3139313233303130303732375A300F300D0603551D1501010004030A0101302D020B51434130335F0201070306170D3139313233303130303831395A300F300D0603551D1501010004030A01013026020433333233170D3139313233303130303931385A300F300D0603551D1501010004030A0105302D020B51434130335F0103070606170D3139313233303130303935375A300F300D0603551D1501010004030A0101302D020B51434130335F0203030509170D3139313233303130313132355A300F300D0603551D1501010004030A0104302D020B51434130335F0203090705170D3230303130333131303234315A300F300D0603551D1501010004030A0105302D020B51434130335F0204010605170D3230303130333131303330315A300F300D0603551D1501010004030A0103302D020B51434130335F0200090606170D3230303131303130313132315A300F300D0603551D1501010004030A0104302D020B51434130335F0105080501170D3230303131343132303733305A300F300D0603551D1501010004030A0101302702053131343630170D3230303131343132323832395A300F300D0603551D1501010004030A01013026020437383430170D3230303131373039333633385A300F300D0603551D1501010004030A0101302D020B51434130335F0108040302170D3230303132303037313333375A300F300D0603551D1501010004030A01013026020436303130170D3230303132303133353433345A300F300D0603551D1501010004030A0101302D020B51434130335F0203020404170D3230303132303231343730395A300F300D0603551D1501010004030A0101302D020B51434130335F0203020500170D3230303132303231343731305A300F300D0603551D1501010004030A0101302D020B51434130335F0203020501170D3230303132303231343731305A300F300D0603551D1501010004030A0101302D020B51434130335F0203020508170D3230303132303231343731305A300F300D0603551D1501010004030A0101302D020B51434130335F0203020605170D3230303132303231343731315A300F300D0603551D1501010004030A0101302D020B51434130335F0203020800170D3230303132303231343731315A300F300D0603551D1501010004030A0101302D020B51434130335F0203020805170D3230303132303231343731315A300F300D0603551D1501010004030A0101302D020B51434130335F0203020807170D3230303132303231343731325A300F300D0603551D1501010004030A0101302D020B51434130335F0203020809170D3230303132303231343731325A300F300D0603551D1501010004030A0101302D020B51434130335F0203020900170D3230303132303231343731325A300F300D0603551D1501010004030A0101302D020B51434130335F0203020901170D3230303132303231343731335A300F300D0603551D1501010004030A0101302D020B51434130335F0203020902170D3230303132303231343731335A300F300D0603551D1501010004030A0101302D020B51434130335F0203030002170D3230303132303231343731335A300F300D0603551D1501010004030A0101302D020B51434130335F0203030005170D3230303132303231343731345A300F300D0603551D1501010004030A0101302D020B51434130335F0203030103170D3230303132303231343731345A300F300D0603551D1501010004030A0101302D020B51434130335F0203030107170D3230303132303231343731345A300F300D0603551D1501010004030A0101302D020B51434130335F0203030200170D3230303132303231343731355A300F300D0603551D1501010004030A0101302D020B51434130335F0203030205170D3230303132303231343731355A300F300D0603551D1501010004030A0101302D020B51434130335F0203030206170D3230303132303231343731355A300F300D0603551D1501010004030A0101302D020B51434130335F0203030302170D3230303132303231343731365A300F300D0603551D1501010004030A0101302D020B51434130335F0203030504170D3230303132303231343731365A300F300D0603551D1501010004030A0101302D020B51434130335F0203030608170D3230303132303231343731375A300F300D0603551D1501010004030A0101302D020B51434130335F0203030609170D3230303132303231343731375A300F300D0603551D1501010004030A0101302D020B51434130335F0203030700170D3230303132303231343731375A300F300D0603551D1501010004030A0101302D020B51434130335F0203030802170D3230303132303231343731385A300F300D0603551D1501010004030A0101302D020B51434130335F0203030808170D3230303132303231343731385A300F300D0603551D1501010004030A0101302D020B51434130335F0203030909170D3230303132303231343731385A300F300D0603551D1501010004030A0101302D020B51434130335F0203040002170D3230303132303231343731395A300F300D0603551D1501010004030A0101302D020B51434130335F0203040004170D3230303132303231343731395A300F300D0603551D1501010004030A0101302D020B51434130335F0203040101170D3230303132303231343731395A300F300D0603551D1501010004030A0101302D020B51434130335F0203040200170D3230303132303231343732305A300F300D0603551D1501010004030A0101302D020B51434130335F0203040206170D3230303132303231343732305A300F300D0603551D1501010004030A0101302D020B51434130335F0203040208170D3230303132303231343732305A300F300D0603551D1501010004030A0101302D020B51434130335F0203040306170D3230303132303231343732315A300F300D0603551D1501010004030A0101302D020B51434130335F0203040309170D3230303132303231343732315A300F300D0603551D1501010004030A0101302D020B51434130335F0203040400170D3230303132303231343732315A300F300D0603551D1501010004030A0101302D020B51434130335F0203040401170D3230303132303231343732325A300F300D0603551D1501010004030A0101302D020B51434130335F0203040403170D3230303132303231343732325A300F300D0603551D1501010004030A0101302D020B51434130335F0203040404170D3230303132303231343732325A300F300D0603551D1501010004030A0101302D020B51434130335F0203040405170D3230303132303231343732335A300F300D0603551D1501010004030A0101302D020B51434130335F0203040407170D3230303132303231343732335A300F300D0603551D1501010004030A0101302D020B51434130335F0203040409170D3230303132303231343732345A300F300D0603551D1501010004030A0101302D020B51434130335F0203040509170D3230303132303231343732345A300F300D0603551D1501010004030A0101302D020B51434130335F0203040602170D3230303132303231343732345A300F300D0603551D1501010004030A0101302D020B51434130335F0203040607170D3230303132303231343732355A300F300D0603551D1501010004030A0101302D020B51434130335F0203040608170D3230303132303231343732355A300F300D0603551D1501010004030A0101302D020B51434130335F0203040700170D3230303132303231343732355A300F300D0603551D1501010004030A0101302D020B51434130335F0203040702170D3230303132303231343732365A300F300D0603551D1501010004030A0101302D020B51434130335F0203040708170D3230303132303231343732365A300F300D0603551D1501010004030A0101302D020B51434130335F0203040709170D3230303132303231343732365A300F300D0603551D1501010004030A0101302D020B51434130335F0203040803170D3230303132303231343732375A300F300D0603551D1501010004030A0101302D020B51434130335F0203040900170D3230303132303231343732375A300F300D0603551D1501010004030A0101302D020B51434130335F0203040902170D3230303132303231343732375A300F300D0603551D1501010004030A0101302D020B51434130335F0203040905170D3230303132303231343732385A300F300D0603551D1501010004030A0101302D020B51434130335F0203050004170D3230303132303231343732385A300F300D0603551D1501010004030A0101302D020B51434130335F0203050108170D3230303132303231343732385A300F300D0603551D1501010004030A0101302D020B51434130335F0203050203170D3230303132303231343732395A300F300D0603551D1501010004030A0101302D020B51434130335F0203050207170D3230303132303231343732395A300F300D0603551D1501010004030A0101302D020B51434130335F0203050300170D3230303132303231343733305A300F300D0603551D1501010004030A0101302D020B51434130335F0203050401170D3230303132303231343733305A300F300D0603551D1501010004030A0101302D020B51434130335F0203050404170D3230303132303231343733305A300F300D0603551D1501010004030A0101302D020B51434130335F0203050405170D3230303132303231343733315A300F300D0603551D1501010004030A0101302D020B51434130335F0203050503170D3230303132303231343733315A300F300D0603551D1501010004030A0101302D020B51434130335F0203050509170D3230303132303231343733315A300F300D0603551D1501010004030A0101302D020B51434130335F0203050600170D3230303132303231343733325A300F300D0603551D1501010004030A0101302D020B51434130335F0203050605170D3230303132303231343733325A300F300D0603551D1501010004030A0101302D020B51434130335F0203050607170D3230303132303231343733325A300F300D0603551D1501010004030A0101302D020B51434130335F0203050706170D3230303132303231343733335A300F300D0603551D1501010004030A0101302D020B51434130335F0203050707170D3230303132303231343733335A300F300D0603551D1501010004030A0101302D020B51434130335F0203050708170D3230303132303231343733335A300F300D0603551D1501010004030A0101302D020B51434130335F0203050800170D3230303132303231343733345A300F300D0603551D1501010004030A0101302D020B51434130335F0203050801170D3230303132303231343733345A300F300D0603551D1501010004030A0101302D020B51434130335F0203050807170D3230303132303231343733345A300F300D0603551D1501010004030A0101302D020B51434130335F0203050808170D3230303132303231343733355A300F300D0603551D1501010004030A0101302D020B51434130335F0203050900170D3230303132303231343733355A300F300D0603551D1501010004030A0101302D020B51434130335F0203050901170D3230303132303231343733355A300F300D0603551D1501010004030A0101302D020B51434130335F0203050905170D3230303132303231343733365A300F300D0603551D1501010004030A0101302D020B51434130335F0203050907170D3230303132303231343733365A300F300D0603551D1501010004030A0101302D020B51434130335F0203050908170D3230303132303231343733375A300F300D0603551D1501010004030A0101302D020B51434130335F0203050909170D3230303132303231343733375A300F300D0603551D1501010004030A0101302D020B51434130335F0203060000170D3230303132303231343733375A300F300D0603551D1501010004030A0101302D020B51434130335F0203060003170D3230303132303231343733385A300F300D0603551D1501010004030A0101302D020B51434130335F0203060007170D3230303132303231343733385A300F300D0603551D1501010004030A0101302D020B51434130335F0203060009170D3230303132303231343733385A300F300D0603551D1501010004030A0101302D020B51434130335F0203060102170D3230303132303231343733395A300F300D0603551D1501010004030A0101302D020B51434130335F0203060103170D3230303132303231343733395A300F300D0603551D1501010004030A0101302D020B51434130335F0203060200170D3230303132303231343733395A300F300D0603551D1501010004030A0101302D020B51434130335F0203060301170D3230303132303231343734305A300F300D0603551D1501010004030A0101302D020B51434130335F0203060306170D3230303132303231343734305A300F300D0603551D1501010004030A0101302D020B51434130335F0203060401170D3230303132303231343734305A300F300D0603551D1501010004030A0101302D020B51434130335F0203060403170D3230303132303231343734315A300F300D0603551D1501010004030A0101302D020B51434130335F0203060405170D3230303132303231343734315A300F300D0603551D1501010004030A0101302D020B51434130335F0203060406170D3230303132303231343734325A300F300D0603551D1501010004030A0101302D020B51434130335F0203060601170D3230303132303231343734325A300F300D0603551D1501010004030A0101302D020B51434130335F0203060604170D3230303132303231343734325A300F300D0603551D1501010004030A0101302D020B51434130335F0203060605170D3230303132303231343734335A300F300D0603551D1501010004030A0101302D020B51434130335F0203060608170D3230303132303231343734335A300F300D0603551D1501010004030A0101302D020B51434130335F0203060609170D3230303132303231343734335A300F300D0603551D1501010004030A0101302D020B51434130335F0203060700170D3230303132303231343734345A300F300D0603551D1501010004030A0101302D020B51434130335F0203060705170D3230303132303231343734345A300F300D0603551D1501010004030A0101302D020B51434130335F0203060806170D3230303132303231343734345A300F300D0603551D1501010004030A0101302D020B51434130335F0203060807170D3230303132303231343734355A300F300D0603551D1501010004030A0101302D020B51434130335F0203060808170D3230303132303231343734355A300F300D0603551D1501010004030A0101302D020B51434130335F0203060900170D3230303132303231343734355A300F300D0603551D1501010004030A0101302D020B51434130335F0203060908170D3230303132303231343734365A300F300D0603551D1501010004030A0101302D020B51434130335F0203070003170D3230303132303231343734365A300F300D0603551D1501010004030A0101302D020B51434130335F0203070005170D3230303132303231343734375A300F300D0603551D1501010004030A0101302D020B51434130335F0203070007170D3230303132303231343734375A300F300D0603551D1501010004030A0101302D020B51434130335F0203070009170D3230303132303231343734375A300F300D0603551D1501010004030A0101302D020B51434130335F0203070102170D3230303132303231343734385A300F300D0603551D1501010004030A0101302D020B51434130335F0203070107170D3230303132303231343734385A300F300D0603551D1501010004030A0101302D020B51434130335F0203070200170D3230303132303231343734385A300F300D0603551D1501010004030A0101302D020B51434130335F0203070201170D3230303132303231343734395A300F300D0603551D1501010004030A0101302D020B51434130335F0203070206170D3230303132303231343734395A300F300D0603551D1501010004030A0101302D020B51434130335F0203070306170D3230303132303231343734395A300F300D0603551D1501010004030A0101302D020B51434130335F0203070308170D3230303132303231343735305A300F300D0603551D1501010004030A0101302D020B51434130335F0203070400170D3230303132303231343735305A300F300D0603551D1501010004030A0101302D020B51434130335F0203070403170D3230303132303231343735315A300F300D0603551D1501010004030A0101302D020B51434130335F0203070508170D3230303132303231343735315A300F300D0603551D1501010004030A0101302D020B51434130335F0203070601170D3230303132303231343735315A300F300D0603551D1501010004030A0101302D020B51434130335F0203070605170D3230303132303231343735325A300F300D0603551D1501010004030A0101302D020B51434130335F0203070701170D3230303132303231343735325A300F300D0603551D1501010004030A0101302D020B51434130335F0203070705170D3230303132303231343735325A300F300D0603551D1501010004030A0101302D020B51434130335F0203070706170D3230303132303231343735335A300F300D0603551D1501010004030A0101302D020B51434130335F0203070709170D3230303132303231343735335A300F300D0603551D1501010004030A0101302D020B51434130335F0203070800170D3230303132303231343735335A300F300D0603551D1501010004030A0101302D020B51434130335F0203070802170D3230303132303231343735345A300F300D0603551D1501010004030A0101302D020B51434130335F0203070803170D3230303132303231343735345A300F300D0603551D1501010004030A0101302D020B51434130335F0203070806170D3230303132303231343735355A300F300D0603551D1501010004030A0101302D020B51434130335F0203070808170D3230303132303231343735355A300F300D0603551D1501010004030A0101302D020B51434130335F0203070901170D3230303132303231343735355A300F300D0603551D1501010004030A0101302D020B51434130335F0203070904170D3230303132303231343735365A300F300D0603551D1501010004030A0101302D020B51434130335F0203080000170D3230303132303231343735365A300F300D0603551D1501010004030A0101302D020B51434130335F0203080002170D3230303132303231343735365A300F300D0603551D1501010004030A0101302D020B51434130335F0203080009170D3230303132303231343735375A300F300D0603551D1501010004030A0101302D020B51434130335F0203080100170D3230303132303231343735375A300F300D0603551D1501010004030A0101302D020B51434130335F0203080103170D3230303132303231343735375A300F300D0603551D1501010004030A0101302D020B51434130335F0203080104170D3230303132303231343735385A300F300D0603551D1501010004030A0101302D020B51434130335F0203080108170D3230303132303231343735385A300F300D0603551D1501010004030A0101302D020B51434130335F0203080200170D3230303132303231343735395A300F300D0603551D1501010004030A0101302D020B51434130335F0203080203170D3230303132303231343735395A300F300D0603551D1501010004030A0101302D020B51434130335F0203080205170D3230303132303231343735395A300F300D0603551D1501010004030A0101302D020B51434130335F0203080206170D3230303132303231343830305A300F300D0603551D1501010004030A0101302D020B51434130335F0203080207170D3230303132303231343830305A300F300D0603551D1501010004030A0101302D020B51434130335F0203080208170D3230303132303231343830305A300F300D0603551D1501010004030A0101302D020B51434130335F0203080304170D3230303132303231343830315A300F300D0603551D1501010004030A0101302D020B51434130335F0203080308170D3230303132303231343830315A300F300D0603551D1501010004030A0101302D020B51434130335F0203080400170D3230303132303231343830315A300F300D0603551D1501010004030A0101302D020B51434130335F0203080402170D3230303132303231343830325A300F300D0603551D1501010004030A0101302D020B51434130335F0203080505170D3230303132303231343830325A300F300D0603551D1501010004030A0101302D020B51434130335F0203080507170D3230303132303231343830335A300F300D0603551D1501010004030A0101302D020B51434130335F0203080602170D3230303132303231343830335A300F300D0603551D1501010004030A0101302D020B51434130335F0203080604170D3230303132303231343830335A300F300D0603551D1501010004030A0101302D020B51434130335F0203080608170D3230303132303231343830345A300F300D0603551D1501010004030A0101302D020B51434130335F0203080701170D3230303132303231343830345A300F300D0603551D1501010004030A0101302D020B51434130335F0203080704170D3230303132303231343830345A300F300D0603551D1501010004030A0101302D020B51434130335F0203080706170D3230303132303231343830355A300F300D0603551D1501010004030A0101302D020B51434130335F0203080902170D3230303132303231343830355A300F300D0603551D1501010004030A0101302D020B51434130335F0203080904170D3230303132303231343830355A300F300D0603551D1501010004030A0101302D020B51434130335F0203080906170D3230303132303231343830365A300F300D0603551D1501010004030A0101302D020B51434130335F0203090005170D3230303132303231343830365A300F300D0603551D1501010004030A0101302D020B51434130335F0203090101170D3230303132303231343830375A300F300D0603551D1501010004030A0101302D020B51434130335F0203090106170D3230303132303231343830375A300F300D0603551D1501010004030A0101302D020B51434130335F0203090107170D3230303132303231343830375A300F300D0603551D1501010004030A0101302D020B51434130335F0203090204170D3230303132303231343830385A300F300D0603551D1501010004030A0101302D020B51434130335F0203090206170D3230303132303231343830385A300F300D0603551D1501010004030A0101302D020B51434130335F0203090207170D3230303132303231343830385A300F300D0603551D1501010004030A0101302D020B51434130335F0203090301170D3230303132303231343830395A300F300D0603551D1501010004030A0101302D020B51434130335F0203090303170D3230303132303231343830395A300F300D0603551D1501010004030A0101302D020B51434130335F0203090400170D3230303132303231343831305A300F300D0603551D1501010004030A0101302D020B51434130335F0203090404170D3230303132303231343831305A300F300D0603551D1501010004030A0101302D020B51434130335F0203090407170D3230303132303231343831305A300F300D0603551D1501010004030A0101302D020B51434130335F0203090509170D3230303132303231343831315A300F300D0603551D1501010004030A0101302D020B51434130335F0203090600170D3230303132303231343831315A300F300D0603551D1501010004030A0101302D020B51434130335F0203090702170D3230303132303231343831315A300F300D0603551D1501010004030A0101302D020B51434130335F0203090704170D3230303132303231343831325A300F300D0603551D1501010004030A0101302D020B51434130335F0203090800170D3230303132303231343831325A300F300D0603551D1501010004030A0101302D020B51434130335F0203090805170D3230303132303231343831325A300F300D0603551D1501010004030A0101302D020B51434130335F0203090902170D3230303132303231343831335A300F300D0603551D1501010004030A0101302D020B51434130335F0203090903170D3230303132303231343831335A300F300D0603551D1501010004030A0101302D020B51434130335F0203090905170D3230303132303231343831345A300F300D0603551D1501010004030A0101302D020B51434130335F0203090906170D3230303132303231343831345A300F300D0603551D1501010004030A0101302D020B51434130335F0203090909170D3230303132303231343831345A300F300D0603551D1501010004030A0101302D020B51434130335F0204000003170D3230303132303231343831355A300F300D0603551D1501010004030A0101302D020B51434130335F0204000103170D3230303132303231343831355A300F300D0603551D1501010004030A0101302D020B51434130335F0204000104170D3230303132303231343831355A300F300D0603551D1501010004030A0101302D020B51434130335F0204000106170D3230303132303231343831365A300F300D0603551D1501010004030A0101302D020B51434130335F0204000109170D3230303132303231343831365A300F300D0603551D1501010004030A0101302D020B51434130335F0204000200170D3230303132303231343831375A300F300D0603551D1501010004030A0101302D020B51434130335F0204000207170D3230303132303231343831375A300F300D0603551D1501010004030A0101302D020B51434130335F0204000304170D3230303132303231343831375A300F300D0603551D1501010004030A0101302D020B51434130335F0204000305170D3230303132303231343831385A300F300D0603551D1501010004030A0101302D020B51434130335F0204000306170D3230303132303231343831385A300F300D0603551D1501010004030A0101302D020B51434130335F0204000307170D3230303132303231343831385A300F300D0603551D1501010004030A0101302D020B51434130335F0204000308170D3230303132303231343831395A300F300D0603551D1501010004030A0101302D020B51434130335F0204000401170D3230303132303231343831395A300F300D0603551D1501010004030A0101302D020B51434130335F0204000403170D3230303132303231343832305A300F300D0603551D1501010004030A0101302D020B51434130335F0204000404170D3230303132303231343832305A300F300D0603551D1501010004030A0101302D020B51434130335F0204000406170D3230303132303231343832305A300F300D0603551D1501010004030A0101302D020B51434130335F0204000409170D3230303132303231343832315A300F300D0603551D1501010004030A0101302D020B51434130335F0204000500170D3230303132303231343832315A300F300D0603551D1501010004030A0101302D020B51434130335F0204000501170D3230303132303231343832315A300F300D0603551D1501010004030A0101302D020B51434130335F0204000505170D3230303132303231343832325A300F300D0603551D1501010004030A0101302D020B51434130335F0204000507170D3230303132303231343832325A300F300D0603551D1501010004030A0101302D020B51434130335F0204000606170D3230303132303231343832335A300F300D0603551D1501010004030A0101302D020B51434130335F0204000608170D3230303132303231343832335A300F300D0603551D1501010004030A0101302D020B51434130335F0204000609170D3230303132303231343832335A300F300D0603551D1501010004030A0101302D020B51434130335F0204000702170D3230303132303231343832345A300F300D0603551D1501010004030A0101302D020B51434130335F0204000705170D3230303132303231343832345A300F300D0603551D1501010004030A0101302D020B51434130335F0204000708170D3230303132303231343832345A300F300D0603551D1501010004030A0101302D020B51434130335F0204000806170D3230303132303231343832355A300F300D0603551D1501010004030A0101302D020B51434130335F0204000809170D3230303132303231343832355A300F300D0603551D1501010004030A0101302D020B51434130335F0204000900170D3230303132303231343832365A300F300D0603551D1501010004030A0101302D020B51434130335F0204000901170D3230303132303231343832365A300F300D0603551D1501010004030A0101302D020B51434130335F0204000907170D3230303132303231343832365A300F300D0603551D1501010004030A0101302D020B51434130335F0204000908170D3230303132303231343832375A300F300D0603551D1501010004030A0101302D020B51434130335F0204000909170D3230303132303231343832375A300F300D0603551D1501010004030A0101302D020B51434130335F0204010003170D3230303132303231343832375A300F300D0603551D1501010004030A0101302D020B51434130335F0204010004170D3230303132303231343832385A300F300D0603551D1501010004030A0101302D020B51434130335F0204010006170D3230303132303231343832385A300F300D0603551D1501010004030A0101302D020B51434130335F0204010100170D3230303132303231343832395A300F300D0603551D1501010004030A0101302D020B51434130335F0204010203170D3230303132303231343832395A300F300D0603551D1501010004030A0101302D020B51434130335F0204010206170D3230303132303231343832395A300F300D0603551D1501010004030A0101302D020B51434130335F0204010209170D3230303132303231343833305A300F300D0603551D1501010004030A0101302D020B51434130335F0204010300170D3230303132303231343833305A300F300D0603551D1501010004030A0101302D020B51434130335F0204010303170D3230303132303231343833305A300F300D0603551D1501010004030A0101302D020B51434130335F0204010305170D3230303132303231343833315A300F300D0603551D1501010004030A0101302D020B51434130335F0204010308170D3230303132303231343833315A300F300D0603551D1501010004030A0101302D020B51434130335F0204010406170D3230303132303231343833325A300F300D0603551D1501010004030A0101302D020B51434130335F0204010500170D3230303132303231343833325A300F300D0603551D1501010004030A0101302D020B51434130335F0204010503170D3230303132303231343833325A300F300D0603551D1501010004030A0101302D020B51434130335F0204010505170D3230303132303231343833335A300F300D0603551D1501010004030A0101302D020B51434130335F0204010601170D3230303132303231343833335A300F300D0603551D1501010004030A0101302D020B51434130335F0204010602170D3230303132303231343833335A300F300D0603551D1501010004030A0101302D020B51434130335F0204010604170D3230303132303231343833345A300F300D0603551D1501010004030A0101302D020B51434130335F0204010608170D3230303132303231343833345A300F300D0603551D1501010004030A0101302D020B51434130335F0204010700170D3230303132303231343833355A300F300D0603551D1501010004030A0101302D020B51434130335F0204010801170D3230303132303231343833355A300F300D0603551D1501010004030A0101302D020B51434130335F0204010805170D3230303132303231343833355A300F300D0603551D1501010004030A0101302D020B51434130335F0204010900170D3230303132303231343833365A300F300D0603551D1501010004030A0101302D020B51434130335F0204010905170D3230303132303231343833365A300F300D0603551D1501010004030A0101302D020B51434130335F0204010908170D3230303132303231343833365A300F300D0603551D1501010004030A0101302D020B51434130335F0204020007170D3230303132303231343833375A300F300D0603551D1501010004030A0101302D020B51434130335F0204020100170D3230303132303231343833375A300F300D0603551D1501010004030A0101302D020B51434130335F0204020102170D3230303132303231343833385A300F300D0603551D1501010004030A0101302D020B51434130335F0204020105170D3230303132303231343833385A300F300D0603551D1501010004030A0101302D020B51434130335F0204020106170D3230303132303231343833385A300F300D0603551D1501010004030A0101302D020B51434130335F0204020207170D3230303132303231343833395A300F300D0603551D1501010004030A0101302D020B51434130335F0204020209170D3230303132303231343833395A300F300D0603551D1501010004030A0101302D020B51434130335F0204020302170D3230303132303231343834305A300F300D0603551D1501010004030A0101302D020B51434130335F0204020304170D3230303132303231343834305A300F300D0603551D1501010004030A0101302D020B51434130335F0204020308170D3230303132303231343834305A300F300D0603551D1501010004030A0101302D020B51434130335F0204020309170D3230303132303231343834315A300F300D0603551D1501010004030A0101302D020B51434130335F0204020401170D3230303132303231343834315A300F300D0603551D1501010004030A0101302D020B51434130335F0204020406170D3230303132303231343834315A300F300D0603551D1501010004030A0101302D020B51434130335F0204020501170D3230303132303231343834325A300F300D0603551D1501010004030A0101302D020B51434130335F0204020503170D3230303132303231343834325A300F300D0603551D1501010004030A0101302D020B51434130335F0204020504170D3230303132303231343834335A300F300D0603551D1501010004030A0101302D020B51434130335F0204020602170D3230303132303231343834335A300F300D0603551D1501010004030A0101302D020B51434130335F0204020603170D3230303132303231343834335A300F300D0603551D1501010004030A0101302D020B51434130335F0204020605170D3230303132303231343834345A300F300D0603551D1501010004030A0101302D020B51434130335F0204020607170D3230303132303231343834345A300F300D0603551D1501010004030A0101302D020B51434130335F0204020609170D3230303132303231343834345A300F300D0603551D1501010004030A0101302D020B51434130335F0204020701170D3230303132303231343834355A300F300D0603551D1501010004030A0101302D020B51434130335F0204020702170D3230303132303231343834355A300F300D0603551D1501010004030A0101302D020B51434130335F0204020704170D3230303132303231343834365A300F300D0603551D1501010004030A0101302D020B51434130335F0204020706170D3230303132303231343834365A300F300D0603551D1501010004030A0101302D020B51434130335F0204020709170D3230303132303231343834365A300F300D0603551D1501010004030A0101302D020B51434130335F0204020805170D3230303132303231343834375A300F300D0603551D1501010004030A0101302D020B51434130335F0204020807170D3230303132303231343834375A300F300D0603551D1501010004030A0101302D020B51434130335F0204020902170D3230303132303231343834385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030001170D3230303132303231343834385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030002170D3230303132303231343834385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030003170D3230303132303231343834395A300F300D0603551D1501010004030A0101302D020B51434130335F0204030005170D3230303132303231343834395A300F300D0603551D1501010004030A0101302D020B51434130335F0204030006170D3230303132303231343834395A300F300D0603551D1501010004030A0101302D020B51434130335F0204030102170D3230303132303231343835305A300F300D0603551D1501010004030A0101302D020B51434130335F0204030106170D3230303132303231343835305A300F300D0603551D1501010004030A0101302D020B51434130335F0204030200170D3230303132303231343835315A300F300D0603551D1501010004030A0101302D020B51434130335F0204030202170D3230303132303231343835315A300F300D0603551D1501010004030A0101302D020B51434130335F0204030205170D3230303132303231343835315A300F300D0603551D1501010004030A0101302D020B51434130335F0204030207170D3230303132303231343835325A300F300D0603551D1501010004030A0101302D020B51434130335F0204030208170D3230303132303231343835325A300F300D0603551D1501010004030A0101302D020B51434130335F0204030301170D3230303132303231343835335A300F300D0603551D1501010004030A0101302D020B51434130335F0204030303170D3230303132303231343835335A300F300D0603551D1501010004030A0101302D020B51434130335F0204030402170D3230303132303231343835335A300F300D0603551D1501010004030A0101302D020B51434130335F0204030403170D3230303132303231343835345A300F300D0603551D1501010004030A0101302D020B51434130335F0204030409170D3230303132303231343835345A300F300D0603551D1501010004030A0101302D020B51434130335F0204030500170D3230303132303231343835355A300F300D0603551D1501010004030A0101302D020B51434130335F0204030503170D3230303132303231343835355A300F300D0603551D1501010004030A0101302D020B51434130335F0204030505170D3230303132303231343835355A300F300D0603551D1501010004030A0101302D020B51434130335F0204030506170D3230303132303231343835365A300F300D0603551D1501010004030A0101302D020B51434130335F0204030602170D3230303132303231343835365A300F300D0603551D1501010004030A0101302D020B51434130335F0204030604170D3230303132303231343835365A300F300D0603551D1501010004030A0101302D020B51434130335F0204030700170D3230303132303231343835375A300F300D0603551D1501010004030A0101302D020B51434130335F0204030702170D3230303132303231343835375A300F300D0603551D1501010004030A0101302D020B51434130335F0204030704170D3230303132303231343835385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030708170D3230303132303231343835385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030802170D3230303132303231343835385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030908170D3230303132303231343835395A300F300D0603551D1501010004030A0101302D020B51434130335F0204040001170D3230303132303231343835395A300F300D0603551D1501010004030A0101302D020B51434130335F0204040003170D3230303132303231343930305A300F300D0603551D1501010004030A0101302D020B51434130335F0204040005170D3230303132303231343930305A300F300D0603551D1501010004030A0101302D020B51434130335F0204040006170D3230303132303231343930305A300F300D0603551D1501010004030A0101302D020B51434130335F0204040008170D3230303132303231343930315A300F300D0603551D1501010004030A0101302D020B51434130335F0204040009170D3230303132303231343930315A300F300D0603551D1501010004030A0101302D020B51434130335F0204040100170D3230303132303231343930325A300F300D0603551D1501010004030A0101302D020B51434130335F0204040103170D3230303132303231343930325A300F300D0603551D1501010004030A0101302D020B51434130335F0204040106170D3230303132303231343930325A300F300D0603551D1501010004030A0101302D020B51434130335F0204040206170D3230303132303231343930335A300F300D0603551D1501010004030A0101302D020B51434130335F0204040301170D3230303132303231343930335A300F300D0603551D1501010004030A0101302D020B51434130335F0204040302170D3230303132303231343930335A300F300D0603551D1501010004030A0101302D020B51434130335F0204040305170D3230303132303231343930345A300F300D0603551D1501010004030A0101302D020B51434130335F0204040306170D3230303132303231343930345A300F300D0603551D1501010004030A0101302D020B51434130335F0204040404170D3230303132303231343930355A300F300D0603551D1501010004030A0101302D020B51434130335F0204040407170D3230303132303231343930355A300F300D0603551D1501010004030A0101302D020B51434130335F0204040501170D3230303132303231343930355A300F300D0603551D1501010004030A0101302D020B51434130335F0204040504170D3230303132303231343930365A300F300D0603551D1501010004030A0101302D020B51434130335F0204040602170D3230303132303231343930365A300F300D0603551D1501010004030A0101302D020B51434130335F0204040604170D3230303132303231343930375A300F300D0603551D1501010004030A0101302D020B51434130335F0204040605170D3230303132303231343930375A300F300D0603551D1501010004030A0101302D020B51434130335F0204040606170D3230303132303231343930375A300F300D0603551D1501010004030A0101302D020B51434130335F0204040700170D3230303132303231343930385A300F300D0603551D1501010004030A0101302D020B51434130335F0204040705170D3230303132303231343930385A300F300D0603551D1501010004030A0101302D020B51434130335F0204040803170D3230303132303231343930395A300F300D0603551D1501010004030A0101302D020B51434130335F0204040909170D3230303132303231343930395A300F300D0603551D1501010004030A0101302D020B51434130335F0204050001170D3230303132303231343930395A300F300D0603551D1501010004030A0101302D020B51434130335F0204050006170D3230303132303231343931305A300F300D0603551D1501010004030A0101302D020B51434130335F0204050102170D3230303132303231343931305A300F300D0603551D1501010004030A0101302D020B51434130335F0204050104170D3230303132303231343931305A300F300D0603551D1501010004030A0101302D020B51434130335F0204050109170D3230303132303231343931315A300F300D0603551D1501010004030A0101302D020B51434130335F0204050200170D3230303132303231343931315A300F300D0603551D1501010004030A0101302D020B51434130335F0204050508170D3230303132303231343931325A300F300D0603551D1501010004030A0101302D020B51434130335F0204050609170D3230303132303231353031325A300F300D0603551D1501010004030A0101302702053130313437170D3230303133313039313331335A300F300D0603551D1501010004030A0101302D020B51434130335F0204080005170D3230303231303131343733375A300F300D0603551D1501010004030A0104302D020B51434130335F0106000309170D3230303231303133343535315A300F300D0603551D1501010004030A0101302D020B51434130335F0105080600170D3230303231343038323133355A300F300D0603551D1501010004030A01043026020439383139170D3230303231373039333332385A300F300D0603551D1501010004030A0101302D020B51434130335F0206080005170D3230303231383131323031335A300F300D0603551D1501010004030A01013026020437303233170D3230303231383131323133375A300F300D0603551D1501010004030A0101302D020B51434130335F0102020100170D3230303231383135313534375A300F300D0603551D1501010004030A0104302D020B51434130335F0109070001170D3230303231393230333135345A300F300D0603551D1501010004030A0105302D020B51434130335F0207070501170D3230303232313039323832365A300F300D0603551D1501010004030A0101302D020B51434130335F0206020709170D3230303330323132313533375A300F300D0603551D1501010004030A0104302D020B51434130335F0103020900170D3230303330323132313634385A300F300D0603551D1501010004030A0104302D020B51434130335F0206070000170D3230303330323132313830315A300F300D0603551D1501010004030A01053026020436323036170D3230303330353130323932375A300F300D0603551D1501010004030A01013026020433333235170D3230303330353130323933385A300F300D0603551D1501010004030A01013026020431323035170D3230303330353130323934395A300F300D0603551D1501010004030A01013026020431323732170D3230303330353130333030325A300F300D0603551D1501010004030A0101302702053130323039170D3230303330353130333031385A300F300D0603551D1501010004030A0101302D020B51434130335F0203020704170D3230303330353130333033385A300F300D0603551D1501010004030A0101302D020B51434130335F0204080705170D3230303330353130333035395A300F300D0603551D1501010004030A01013026020431323833170D3230303330353130343634335A300F300D0603551D1501010004030A01013026020431333333170D3230303330353130343635345A300F300D0603551D1501010004030A01013026020431323939170D3230303330353130343730345A300F300D0603551D1501010004030A0101302D020B51434130335F0105020401170D3230303330353130343731335A300F300D0603551D1501010004030A0101302D020B51434130335F0105090800170D3230303330353130343733325A300F300D0603551D1501010004030A0101302D020B51434130335F0106040907170D3230303330353130343734335A300F300D0603551D1501010004030A0101302D020B51434130335F0200060802170D3230303330353130343735345A300F300D0603551D1501010004030A0101302D020B51434130335F0200070807170D3230303330353130343830345A300F300D0603551D1501010004030A0101302D020B51434130335F0105080905170D3230303330353131333834315A300F300D0603551D1501010004030A01053026020436393333170D3230303330353131343034355A300F300D0603551D1501010004030A0105302D020B51434130335F0207050607170D3230303330363133343135375A300F300D0603551D1501010004030A0104302D020B51434130335F0103070504170D3230303330393039303030315A300F300D0603551D1501010004030A0101302D020B51434130335F0208070608170D3230303331363135323330305A300F300D0603551D1501010004030A01043026020432343134170D3230303331393038353132305A300F300D0603551D1501010004030A0101302D020B51434130335F0105030106170D3230303331393038353132375A300F300D0603551D1501010004030A0101302D020B51434130335F0209070202170D3230303430373131313031305A300F300D0603551D1501010004030A0105302D020B51434130335F0209080109170D3230303430383030333430335A300F300D0603551D1501010004030A0104302702053131303333170D3230303431323131313931315A300F300D0603551D1501010004030A0105302D020B51434130335F0208060309170D3230303431323131333335305A300F300D0603551D1501010004030A0101302D020B51434130335F0106090001170D3230303431323131333535355A300F300D0603551D1501010004030A0101302702053131313538170D3230303431323131333730315A300F300D0603551D1501010004030A0101302D020B51434130335F0105020707170D3230303431323131333732305A300F300D0603551D1501010004030A0101302D020B51434130335F0200030708170D3230303431353133333330365A300F300D0603551D1501010004030A0105302D020B51434130335F0108010702170D3230303432303039353232335A300F300D0603551D1501010004030A0104302702053131333736170D3230303432323132343231325A300F300D0603551D1501010004030A0101302D020B51434130335F0203060707170D3230303432383133313330315A300F300D0603551D1501010004030A0101302D020B51434130335F0205010707170D3230303530383039343634305A300F300D0603551D1501010004030A01013026020437303835170D3230303531393037333931395A300F300D0603551D1501010004030A01053026020437303932170D3230303531393037333932375A300F300D0603551D1501010004030A0105302D020B51434130335F0105050604170D3230303532383037323033365A300F300D0603551D1501010004030A0105302D020B51434130335F0104040300170D3230303532393131343635315A300F300D0603551D1501010004030A0101302D020B51434130335F0105010403170D3230303532393132343230385A300F300D0603551D1501010004030A0101302D020B51434130335F0302020006170D3230303630313132353830385A300F300D0603551D1501010004030A01013026020433313837170D3230303630313133313231335A300F300D0603551D1501010004030A0101302D020B51434130335F0103050403170D3230303630313133313433315A300F300D0603551D1501010004030A0101302D020B51434130335F0209030900170D3230303630323039333530315A300F300D0603551D1501010004030A0101302D020B51434130335F0109000401170D3230303630383038353930395A300F300D0603551D1501010004030A0105302D020B51434130335F0207070604170D3230303630383039303130335A300F300D0603551D1501010004030A0105302D020B51434130335F0203080803170D3230303630383039353435355A300F300D0603551D1501010004030A0105302D020B51434130335F0200000909170D3230303631363133313333355A300F300D0603551D1501010004030A0104302D020B51434130335F0202060504170D3230303631363133323231365A300F300D0603551D1501010004030A0101302D020B51434130335F0302070509170D3230303631393038313130355A300F300D0603551D1501010004030A01013026020437343930170D3230303631393132313034335A300F300D0603551D1501010004030A0101302D020B51434130335F0103030104170D3230303632353037353830355A300F300D0603551D1501010004030A0101302D020B51434130335F0105060003170D3230303632363039303433355A300F300D0603551D1501010004030A0101302D020B51434130335F0204090804170D3230303632363133313435315A300F300D0603551D1501010004030A0105302D020B51434130335F0202040901170D3230303633303039313234345A300F300D0603551D1501010004030A0101302D020B51434130335F0107010409170D3230303730313131323230345A300F300D0603551D1501010004030A0101302D020B51434130335F0107010408170D3230303730313131323233325A300F300D0603551D1501010004030A0101302702053130393830170D3230303730323039353032345A300F300D0603551D1501010004030A0101302D020B51434130335F0208090202170D3230303730323039353131305A300F300D0603551D1501010004030A0101302D020B51434130335F0301010703170D3230303730323039353132305A300F300D0603551D1501010004030A0101302D020B51434130335F0302070008170D3230303730323131303333305A300F300D0603551D1501010004030A01013026020432373035170D3230303730323134343234395A300F300D0603551D1501010004030A0101A030302E301F0603551D2304183016801474627099FF1B603BC464B5841FA3150C5CCB5FBD300B0603551D140404020209E2300D06092A864886F70D01010B050003820201009ACB2F9ED10767FEEF30E615A6B24AD45AE5F648B45F9D3B15C3CEB331585B3C6077CD116CC689CDD3DC3812A6E4E1C5395FB8C2F5CE97F3AD24D090FA3E3B5841C7C5610F72625D609B91DB193F5ED1931637DD819454E911501E15DDC4F4E1C4D9E08EC760191A9A8DFE823758D02ED8C98D0B66D0FA28E79CCA5B1C9A931CF5F93B411B2468090C0C84E6129A86938E09CBF02B750602E2E397CCB6365C2585F7A0FBB575C101A938B2C52A009D0F2F3BFEC05F891132159667D359EF5117F51B6458C7D68DECFEBF7E04683002F0797B444E02A50EC2A8ACFADF5A3A743CCEF17214F2657439A02DFEA66F5EF8CA4C576C8F7FF8EC4CA08F9FC3A46A0C10343CDF28B092CE03905E87BFC19B23C49F655AA99198CF58F80D0E3AB1800494D21CB610CE155230987A673F8E3580012E363F9A8103ADFA5EB6A0DD5575E78EC93A626585877FA2A91A39AC32BF3AD7E3D82824ADF1157B2E8B79285B08C5800FA6FF97AAE6194B1BB9A92E27D57BF7F439AC2D32612BA7B6775E6EE05389DEA2976896BA57EC4577EBC27B2CAE7716391EA73B9E1E2F8C158DED624383533129691AFB9C8CEEF16F29988DED179886060FCFE5C1A843D94555EE4A9B1F24C7D4D4B0581621E75E6A963334B37C57EB369D3DC27B348B8CD8686E1D2059BBDCD61D9C6E0FED2BFAA32847F33E84FEA3056381199B7766DDF123FD148942C8C0300D06092A864886F70D01010B0500048201802ACBFB8158F5D6D5D44714C61B26A8CF619A9243B4E7A40FAEA7A8988994F67E17056D4D58BFD8BF3B56B4D88F4A86658F2B0CBC83376E1B25975DC2928353C3D0B8C1C5F6A3304AF60D8A64D552E2D48A5EED88C0FA9FC5E97D255DF8730A2EA207EA58033D00387916359EC6049E8577C0009467F4F801A8B4D0A3289282D11B8B4E237F5F3F104DFBF18B1C00145073CD9E0113646C73C347E8F121D33530A3D80C3E965E523EA368C6A9D9DA71FE1B3A5A0DEA901733356B4099F0F9859D567EFC3B27B8D09030D441067A7F68898AF59D0998CC57B8D9D4BE12477B86E3B5EF5628F0255F377F4F0E15F849EB683123A89AD04836D111715C051DA54FE396B1565B09DBE0FECC33E41373CDB186A97509FD92FE22DAFF2F43240D2B9F57D29C8958585AC60B68A686F457945388DA9983DFB48EF0D2179115424B509977B68722F0576C989ADA21B6563D30A6B104427C355281B0EE6FE88E65A3063B09527F8A93A07D2A4323BCD492DC598DA4FB460868F198BC25FB36B1432FFE053D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000>
+/Filter /Adobe.PPKLite
+/M (D:20200706133807+02'00')
+/Name <FEFF00410044005200490041004E00410020004500570045004C0049004E00410020004D00450044005901430053004B0041>
+/Prop_Build <<
+/App <<
+/Name /Adobe#20Acrobat#20Reader#20DC
+/OS [/Win]
+/R 1313024
+/REx (2020.009.20067)
+/TrustedMode true
+>>
+/Filter <<
+/Date (May 4 2020 00:13:06)
+/Name /Adobe.PPKLite
+/R 131104
+/V 2
+>>
+/PubSec <<
+/Date (May 4 2020 00:13:06)
+/NonEFontNoWarn true
+/R 131105
+>>
+>>
+/SubFilter /adbe.pkcs7.detached
+/Type /Sig
+>>
+endobj
+23 0 obj
+<<
+/Length 2094
+/Filter /FlateDecode
+>>
+stream
+HWKo7 {MFh@j7#q#w#o_*cD аf+v]__X11na_^.{`&.={xsyػˋˋ=0˃e?]^
+99PiS2fX
+fOqf YӮ[3w1 :u1efNcB~Ɍ"+nUa%|-,Uuf<F9
+\ 0c!!)
+P *#C'NkO:7:zeQLGuܔtmX< oTHXd!b} :bHF HYr?:JnȒ8~ X &`JaG6##Gd)y/6tMl'
+v1,(
+
+4n\ьm˺T&Q heLI\܅DV!6Lk`´ah->Dƃ
+LbBUaJQUDA*l*_pRI 2SEL"q5l{BJ#Psp4YLќ]+FH‹4F(GZF"q\HT`3U+8 >:kbcf^j`ӟyJNH-ŒA(jȖ$*$Z<rJ.k/JmGA9+C7`nAr_%n-LܠEM@&*j$>>qyQ7Mb~
+i NҶ,'qgsLG]oP3jݏY
+־8k<N{0v]__Xa3[g vcU\o|6wyS
+endstream
+endobj
+24 0 obj
+<<
+/Length 1924
+/Filter /FlateDecode
+>>
+stream
+HW[o6~7GiX)ı +aPH$] h~9$m6fڠIQhl)f ,Xa\v~u4hXhooGPh/ @z#yn/f~bG2
+Z=pD Lyj7Ubsƞd^=c ;=RVM(k<}Aۆ{İC-v iRZiMIZr;A~1C֒#n᭎>otAS. cCx_۾vin\d4;liFh&O)⽹'z[9EHfMEQ:ɯfJzYxQYJUN_50ޔ{Rj/ߴo/[\6˶s- \_;xÇwemgⵏBѭd:.icR&ٱ(K8
+tB?vpUDn$h=JWS澮;)EwT) Mm)5(h(p.( -d⋙+[ٺڼ4 ڰk( `אElI
+Tab)IQjqT__3rI5bI$Am +m׹vm4^GO7ZYw856Ix]Pʥk-|ǀcO6 n3,Dj'G-W7FA,L% Ӭ+
+I5gL5{FV⚪Bmrmf+5*(6ZDA䭖[]
+}a뀴u#+or\WÌG[_U5~a~&/v?\Ӱ4l U%{LQ$We_b\WI)$T?DI)4%^yJ̨|Ʊ:@x 
+F}NW rSzVR
+RhATq@b
+:7].+cKzō.1?m E2ﱾ?_L9tj~njyv/Of.Бfu< !,D[M"$3aS<BH4d2e‰OFd|?pNy Dx2,j[ILOG
+endstream
+endobj
+25 0 obj
+<<
+/Length 1762
+/Filter /FlateDecode
+>>
+stream
+HWKo6/AUe"X d::wҒ^ g87srqr\\\PBi-ECeፑr\Ca8駧Du傁(mX`a\b_Y5wZꈝ[q(a c;ƚ4`cV\ki<q@%P܁gͺ_|6k=xN(w)߬vNLwS-mtփ6JĪ6TNƹόh}[-sOni]q:;Hq}ɾx^oTJRk]gQ?!D䨳imX>F!zwc0c_T~Lv` N:Spnq NfJ7$LfB;޸jsM0ZWOrw~T톍\mӥ=$%cD]k
+FeNV޶z훯X}F{WqKƞW8d(18NOOeu \>F E .~Fk
+n6kP
+Jsnr,%z&M+9ہʦ{R֦"@um) Ĩb>m3c9M9 E*/irrnGn&]$ ϐ$-̈́H9|;LnQq=>uo7ޢE4Om={vo6q8919\T9@:~('`0i{G.$du~ ~e:#%<8Avo2M6^~-w˜2mh>(܇{3w̡rkAe„,RP9S%vR-IA5ѥ |&QI,˵b6iY0z0.ḷU:<.
+}Ji\rLA+VIƕڥdJ`lҼFȾ ]iU֝9DQ1o H^~0Y Cc>'92֯'0D
+endstream
+endobj
+26 0 obj
+<<
+/Length 1859
+/Filter /FlateDecode
+>>
+stream
+HW[k7~_ǙQt3`@ <y8'MSL뫣*%k6a3ڣs9tvsqLeAJ̐jynΜC
+[._n7ԉD+&XStީCIKݘ퇛WFV^ϗ|'<'1%r!] 1N-GzB޵JXKֲedі<o+R]NI/G/ZAԝG\`K6.!wnIHXwnFwz{AekK+ "˖ 51$O{q/4N(=mg=mA/ӄ6Nl=9\-OCl"Z1qeNj)y {/Hʱ0D+I*eEZM\+qn%#SR4~, R|'.w= <zrh[tvޡ1aaj> V
+tiҨƒd5.V׵n`ܼQ}{f oE7Vn4Q3
+~unaהUo~e7Lp[0w{`{ o#<£y&9߃GaVT*a"k+Ҿj통)W҇>Bȱ\sge\ޥDaͷѕk7!gh=t]r#b39Y5lOa 3]"Qĕ,I#Iܱ$ml<m?O#2 ~p2AҩpNfed]৞,4OOB(~ٔjݾo]prEj:jUic:?BB /GZPkOG:*%&hitU~G.<S3^R.M=%N%~=PbOnV N[RTa+_J 2NF3 3Zޒ-iK$׷T;lG*7ch6v,Z݂8c-t+itd,]XrDOBPLep*бhl؂xA#^o@c{!Glj.sC<6,Q](\ ~8<L
+Nq<
+x5eEWݜ+Ρnv}F'luӄ.x&r? QzMTvRXAH 3JyT:0& /Ϝ'P׊%ͮ%#1ϗ{qe3N\&@3:p߾.īczG6 R; 2+f 
+endstream
+endobj
+27 0 obj
+<<
+/Length 1950
+/Filter /FlateDecode
+>>
+stream
+HWmk9nGzY 9zh!>J[wzF/+i%Ǎ7)4w%hgm:ܮWo֫׫61# QCXBWW%v~\,m#RЖD%8a^lOw
+>Ilx^e[u}Kl
+
+-.j&
+o<ׅ>x lNa,9g cwcb3
+@F^ΐ#܈Mp(J0)#qQWjTk5cGᾩo"(SRܟ3L;UIlB~16yΕTn|!A^Ny+XIeuEߣB*mh+J#k<
+s)*VA>!@kryyq3ړ{rȹnI-mdmZz* TPevg)[Hvg6}݊Nn_chV=9*LR>xya}At 0ˆ ׇd>PQUVFEm%?08BOGˢ4Lu0u-/qј*a5c_m }ڪ͇-JJn>ov6ߡڽ[Ĵ+8
++Au->=N2~le:]vZY:tIM0-dyOFM9采k>Nt
+SFеi<޿(ZE[ 
+vg{۟ٲnZqT_\A}Zg-x
+lygIT%SThbjcp\ Jzh=egH{kH&1f\ʊ# e '%^˩ħ-(=l6SFH09Q0G='d=rS/D)[)(4f?<֋(݆yo9^޳`07J FŚyxb є젰bʝ!aFW2sS "΄ %VlY$ 菖0HZx^ZP-3Gnv"Ȑ&+PqA'\@3$AF?B}O)U$B8],2@ɱOCm,F|6J }>.Y[
+bGc>~8(:ł~Cp~HSbƌފY Υ'fr=FX*_)% D"ܐT,As#ێ''"5]N
+endstream
+endobj
+28 0 obj
+<<
+/Length 1978
+/Filter /FlateDecode
+>>
+stream
+HW[O7~_Ǚc|[B#V)R&4&=xC`\;: !vPJ᳗#~uLç2Q _.χ/GˣͯG5&GkeAH̐khtw9[6
+]y XPĹ&uԮaלӪswDn8(e>ܜ=|q>[8:vKǪ=n83XTeu.^F''ǯƟϑÀGt1$pkC ݣ뷍<r׭ XÚ V$X;y<
+’Tm[]kkZ׽؈C\hzyklmO@
+8O/tU^ wٺN">
+<tWv X;"9#3~ KhN5$X ,E 0jS\nWpp0B!r1\ ]312㺌u%9BF_WHa@g#:\0<yvԁa{tyQɒJV*egoX{j+;=CIFTOr%9+GЭ'=Ѝn]JD_̮@'6֊LDgtyJ9QqZ BDzTWd5 Ɉ»L䱚ĝ't.ݙBvGJj.YxeܟphiN6S=lv{bxo3U32'Y4&ºB{G.*8^;Mx>($EUN ހip,m595}!P@ 7A1S r–a+R*z p/ ų!ɪ t3(ާ(%GPZeg
+6kJ%tvKX T*q*q޺zY<y2AZ'A\fߟ.@,EKȳ+O_&/r
+ӧ.GU9B䜽2QbQtŔᎧ#CY)G CUaH6 w~jQ.mDd٬@OUhSF
+OLqq>%j`> ; a/xkjXy
+M a)kts{dЊ~hI@3pk^s13YŔ«醹[U"M}))m{ξd3OC޿köƭ"F_`?B|XZ
+꽟YA
+endstream
+endobj
+29 0 obj
+<<
+/Length 2000
+/Filter /FlateDecode
+>>
+stream
+HWnF}G
+٢FgV 5iC|+:nICjhzNp{kRsjr5k~C7?-V`gA7?" l20)Gk,П⮬T|/kɊJKUˊeR+hЃ}>ٔŻRTiTVמrw8IuʋNڪrB:!\-J(TP_ZjZFWWAW-: &0lx&b`3=.fkV =/nYMfGA̚
+rV#lIT`-1 jy9Mh$Vz⍥?>>
+K 2=^?! 3j0ln`ƆL1-U!+ A~x= xxѾP%ϹY})pljH@9 C`H\"['î.*"" #YM7I,';"FuK} ^n0OenRT-˥*o
+wl xV [~B3ޛX̻RMc#v7x^GLpVbt}sP=QNU锲)l)<-x`1MXqO#]H7NZ@0xn,hsVZUAW-: #*im7J sUfEMV.].IW=JW{2-}`t0ؗ ۮ1:v܂}"oJ_JJVJG)ҙRv gC85K$; rU{8o쀗jDID:PEd-dHc.3Jok9/ hU5+b2 ʯ,AaٿByitdz'oy_(؞7nIC ݓmCB\=r餿>,v</ Q)
+J2ҍ!5rf4{nw<3HpI7cf I2,
+endstream
+endobj
+30 0 obj
+<<
+/Length 1872
+/Filter /FlateDecode
+>>
+stream
+HW[k7~_0;#2 {[bHЇqBnH׉ 8rsVo_W|,](u]-
+Z4}Cx!kFdq^GYѲa(Nb:ډB-.ޮW ӂ!u
+NK6{U3rXS{x6(Z>5Uë̅7ߚ*; U=D+6;e^w4hus Ypu*{V1'o
+Fi U@AܲYr_MDĐ*[A_MDM#QU6*i0\']&H&FWZTfqlZ Ű ^aRX%J043~Tsמ8m褭k#zF $Zrr H5Q8rgbғr6@a|]@&h75w:Y#ŋz"aKW
+\vcb?㨉ȺEK6LYZSݺ((UMѥjcάy&B5 ߪ)v'59Tsc<֢'5gC<pHjT*ǗgEˇ8= ykR4#Hh2M1FGAbq’fH_H=Ĉ,Ɂ@8X#
+sn٤ZǯޗpO:xijŌ+8*YD/fUqU'L=l20~ࢉ0
+$BSzaI\ClRv-=r[Gx@dZ| '@6 kX6QڡFw.{"Hܹފ Cw4XOΚpNGN=zKN4r$8FԎc`mgp
+c 6ʣs ha#CuCP3 5iLENXU95mЗgB䵉0N5%L锇|%*L'؄P.6%L()/qxF 9<oSN(`,3z ~4dHgs*k|'w^,wiOǕ)\&~6^, $ciǀyd55H2GX,;MM'R\蠮+:VgQ/…fȼu01tzIlTwKN5yzh~}8#٨23bJ<5״#AlD֤~ ;0|Ak 3 "\Vrs ,0( Rn-z7cYw| k_?< pC^VL|/PFKå ~s G-^R *?gq{ǘ: =yuԌ ?qѩ$z])d>~餆4
+endstream
+endobj
+31 0 obj
+<<
+/BM /Normal
+/Type /ExtGState
+/ca 1
+>>
+endobj
+32 0 obj
+<<
+/BM /Normal
+/CA 1
+/Type /ExtGState
+>>
+endobj
+33 0 obj
+<<
+/BaseFont /BCDEEE+Calibri-Bold
+/DescendantFonts [145 0 R]
+/Encoding /Identity-H
+/Subtype /Type0
+/ToUnicode 146 0 R
+/Type /Font
+>>
+endobj
+34 0 obj
+<<
+/BaseFont /BCDFEE+Calibri-Bold
+/Encoding /WinAnsiEncoding
+/FirstChar 32
+/FontDescriptor 147 0 R
+/LastChar 122
+/Name /F2
+/Subtype /TrueType
+/Type /Font
+/Widths [226 0 0 0 0 0 0 0 0 0
+0 0 258 306 267 0 507 507 507 507
+507 507 507 507 507 0 276 0 0 0
+0 0 0 606 0 529 0 488 459 637
+0 0 0 547 423 874 659 676 532 0
+0 473 495 0 0 906 0 520 0 0
+0 0 0 0 0 494 0 418 537 503
+0 474 0 246 255 480 246 813 537 538
+0 537 355 399 347 537 0 745 0 474
+397]
+>>
+endobj
+35 0 obj
+<<
+/BaseFont /BCDGEE+Calibri
+/Encoding /WinAnsiEncoding
+/FirstChar 32
+/FontDescriptor 148 0 R
+/LastChar 122
+/Name /F3
+/Subtype /TrueType
+/Type /Font
+/Widths [226 0 0 0 0 0 0 0 303 303
+0 0 250 306 252 0 507 507 507 507
+507 507 507 507 507 507 268 268 0 0
+0 0 0 0 0 0 0 488 0 631
+0 252 0 0 0 0 646 662 517 0
+543 459 487 0 0 890 0 0 0 0
+0 0 0 0 0 479 525 423 525 498
+305 471 525 230 239 455 230 799 525 527
+525 0 349 391 335 525 0 715 0 453
+395]
+>>
+endobj
+36 0 obj
+<<
+/BaseFont /BCDHEE+Calibri
+/DescendantFonts [149 0 R]
+/Encoding /Identity-H
+/Subtype /Type0
+/ToUnicode 150 0 R
+/Type /Font
+>>
+endobj
+37 0 obj
+<<
+/BaseFont /ArialMT
+/Encoding /WinAnsiEncoding
+/FirstChar 32
+/FontDescriptor 151 0 R
+/LastChar 32
+/Name /F5
+/Subtype /TrueType
+/Type /Font
+/Widths [278]
+>>
+endobj
+38 0 obj
+<<
+/BaseFont /BCDIEE+Wingdings-Regular
+/DescendantFonts [152 0 R]
+/Encoding /Identity-H
+/Subtype /Type0
+/ToUnicode 153 0 R
+/Type /Font
+>>
+endobj
+39 0 obj
+<<
+/BaseFont /TimesNewRomanPSMT
+/Encoding /WinAnsiEncoding
+/FirstChar 32
+/FontDescriptor 154 0 R
+/LastChar 32
+/Name /F7
+/Subtype /TrueType
+/Type /Font
+/Widths [250]
+>>
+endobj
+40 0 obj
+<<
+/Length 4181
+/Filter /FlateDecode
+>>
+stream
+x]o.@~+ orQA|m4E Eu__]@rwp2L_|ӄWO鿷7a'<Y :iN>yۛ/lhOd3rRl4[6w_~y{3Z|we79D8X X߭3h%-Z(po /l1Lp7㧇;{53ω4<dC\Lcbս}yPAl[ r;q :0/m6ϘP~.^*75 F[KF082D`tk9z%+(4h9ԛU[/UvY3t6{r0T2H] L~,A$lh
+VDS$yCHj{Ò]` 3w \F@Bʀijxzr8z͡JK3]{T0uGhN",DYmj4 }OZ)
+ '&0HHY-.8F CĎTKVa*
+Z"'07InM]Jaƃ^CW @lHR
+w"v%`ux[]"C}%.7ƌAVYNI ;stSgZ}0N߻)a-Wd5=.frlPDD̯%ڝ>Xi}-V_?]!kO ehF"h<$ ˱<-sEE]"J,lۄ-1Zh8eX< c}<4EWXcx\YP HhqThq s)_ֺ!,]h~TŝBUYR5pMYWsXuX m'z`݇A&&>cdpXt͓ج☉bS0Eu>h*@f"FxqCy`3ko|ke B#d8mw*RfiCoNP@x"Kf${d_HWwԏCʮ$-tvrʠ{[i^[F2Upjk";ƪ41y!}W^=y:JfC}XH@
+\!L99WJȧk" hWseChj \“ WLPgKS 4t98@eKCb} R5@ftD\ZX+s[;T(`$$k.K%#ǩN! L]\-*A˴աVX]h5iyJ~6^$}EFRtjiEgq2x1Y"BWS瑘I]ݮ j8BKcY+gb=dE2k7JYu׸uٟBֵ3AnGl
+Z]:KJf`AiџhVMUlJDC5p95 fѪٝ7fj{uK|(yG#Po%]=ߋfF u@*8wk
+>v^bP$N3[PfNɒY:].d&G4ƦY/1#Vf3N?
+ lıT6 Si#EmX[n 4k`hqQ̸Cl|2qeVӃо]Ah&桐h>`NjPba;tw,n
+嚉o~+c=%Y}~xc~dǥ28/?$iX{pv9<rTӵ{Xu`UkNnF[zm"ŢӪ<, :VY*kW`ǑaޘŝIlx(VI٤C?%;G$&BI G'&8%'xqR,Ȟ>"뷠WG86gԝ[JaȢJ?!–M&Aqf _>UgXcXdzkgvMOT]X;?σL5v Vz:
+mb{G|f{IRx&!+loҽXV0Y
+W٘ ͆0 gNpA;A0ће-jk>zܹIg
+$NM C
+
+endstream
+endobj
+41 0 obj
+<<
+/ID (Note 1)
+/K [131 0 R 132 0 R 133 0 R 134 0 R 135 0 R]
+/P 17 0 R
+/Pg 14 0 R
+/S /Footnote
+/Type /StructElem
+>>
+endobj
+42 0 obj
+<<
+/K [100 0 R 101 0 R]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+43 0 obj
+<<
+/K [102 0 R]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+44 0 obj
+<<
+/K [103 0 R]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+45 0 obj
+<<
+/K [4]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+46 0 obj
+<<
+/K [5]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+47 0 obj
+<<
+/K [6]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+48 0 obj
+<<
+/K [7]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+49 0 obj
+<<
+/K [8]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+50 0 obj
+<<
+/K [9]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+51 0 obj
+<<
+/K [10]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+52 0 obj
+<<
+/K [11]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+53 0 obj
+<<
+/K [12]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+54 0 obj
+<<
+/K [104 0 R 105 0 R]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+55 0 obj
+<<
+/K [15]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+56 0 obj
+<<
+/K [16]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+57 0 obj
+<<
+/K [17]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+58 0 obj
+<<
+/K [18]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+59 0 obj
+<<
+/K [19]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+60 0 obj
+<<
+/K [20]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+61 0 obj
+<<
+/K [21]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+62 0 obj
+<<
+/K [22]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+63 0 obj
+<<
+/K [23]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+64 0 obj
+<<
+/K [24]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+65 0 obj
+<<
+/K [25]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+66 0 obj
+<<
+/K [26]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+67 0 obj
+<<
+/A 155 0 R
+/K [156 0 R 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R 163 0 R 164 0 R 165 0 R
+166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R 172 0 R]
+/P 17 0 R
+/Pg 14 0 R
+/S /L
+/Type /StructElem
+>>
+endobj
+68 0 obj
+<<
+/K [47]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+69 0 obj
+<<
+/K [48]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+70 0 obj
+<<
+/K [49]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+71 0 obj
+<<
+/K [50]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+72 0 obj
+<<
+/A 173 0 R
+/K [174 0 R 175 0 R]
+/P 17 0 R
+/Pg 14 0 R
+/S /L
+/Type /StructElem
+>>
+endobj
+73 0 obj
+<<
+/K [53]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+74 0 obj
+<<
+/K [54]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+75 0 obj
+<<
+/K [55]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+76 0 obj
+<<
+/K [57]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+77 0 obj
+<<
+/K [59]
+/P 17 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+78 0 obj
+<<
+/K [2]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+79 0 obj
+<<
+/K [3]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+80 0 obj
+<<
+/K [4]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+81 0 obj
+<<
+/A 176 0 R
+/K [177 0 R 178 0 R 179 0 R]
+/P 17 0 R
+/Pg 15 0 R
+/S /L
+/Type /StructElem
+>>
+endobj
+82 0 obj
+<<
+/K [8]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+83 0 obj
+<<
+/K [9]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+84 0 obj
+<<
+/K [10]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+85 0 obj
+<<
+/K [11]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+86 0 obj
+<<
+/K [12]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+87 0 obj
+<<
+/K [13]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+88 0 obj
+<<
+/K [14]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+89 0 obj
+<<
+/A 180 0 R
+/K [181 0 R 182 0 R]
+/P 17 0 R
+/Pg 15 0 R
+/S /L
+/Type /StructElem
+>>
+endobj
+90 0 obj
+<<
+/K [17]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+91 0 obj
+<<
+/K [18]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+92 0 obj
+<<
+/K [19]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+93 0 obj
+<<
+/K [20]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+94 0 obj
+<<
+/K [21]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+95 0 obj
+<<
+/K [22]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+96 0 obj
+<<
+/K [23]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+97 0 obj
+<<
+/K [24]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+98 0 obj
+<<
+/K [25]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+99 0 obj
+<<
+/K [26]
+/P 17 0 R
+/Pg 15 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+100 0 obj
+<<
+/K 0
+/P 42 0 R
+/Pg 14 0 R
+/S /Span
+/Type /StructElem
+>>
+endobj
+101 0 obj
+<<
+/ActualText ( )
+/K [1]
+/P 42 0 R
+/Pg 14 0 R
+/S /Span
+/Type /StructElem
+>>
+endobj
+102 0 obj
+<<
+/ActualText ( )
+/K [2]
+/P 43 0 R
+/Pg 14 0 R
+/S /Span
+/Type /StructElem
+>>
+endobj
+103 0 obj
+<<
+/ActualText ( )
+/K [3]
+/P 44 0 R
+/Pg 14 0 R
+/S /Span
+/Type /StructElem
+>>
+endobj
+104 0 obj
+<<
+/K 13
+/P 54 0 R
+/Pg 14 0 R
+/S /Span
+/Type /StructElem
+>>
+endobj
+105 0 obj
+<<
+/ActualText ( )
+/K [14]
+/P 54 0 R
+/Pg 14 0 R
+/S /Span
+/Type /StructElem
+>>
+endobj
+106 0 obj
+<<
+/K [27]
+/P 156 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+107 0 obj
+<<
+/K [28]
+/P 157 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+108 0 obj
+<<
+/K [29]
+/P 158 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+109 0 obj
+<<
+/K [30]
+/P 159 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+110 0 obj
+<<
+/K [31]
+/P 160 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+111 0 obj
+<<
+/K [32]
+/P 161 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+112 0 obj
+<<
+/K [33]
+/P 162 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+113 0 obj
+<<
+/K 34
+/P 183 0 R
+/Pg 14 0 R
+/S /Span
+/Type /StructElem
+>>
+endobj
+114 0 obj
+<<
+/K [35]
+/P 184 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+115 0 obj
+<<
+/K [36]
+/P 185 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+116 0 obj
+<<
+/K [37]
+/P 186 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+117 0 obj
+<<
+/K [38]
+/P 164 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+118 0 obj
+<<
+/K [39]
+/P 165 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+119 0 obj
+<<
+/K [40]
+/P 166 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+120 0 obj
+<<
+/K [41]
+/P 167 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+121 0 obj
+<<
+/K [42]
+/P 168 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+122 0 obj
+<<
+/K [43]
+/P 169 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+123 0 obj
+<<
+/K [44]
+/P 170 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+124 0 obj
+<<
+/K [45]
+/P 171 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+125 0 obj
+<<
+/K [46]
+/P 172 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+126 0 obj
+<<
+/K [51]
+/P 174 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+127 0 obj
+<<
+/K 52
+/P 187 0 R
+/Pg 14 0 R
+/S /Span
+/Type /StructElem
+>>
+endobj
+128 0 obj
+<<
+/K 56
+/P 188 0 R
+/Pg 14 0 R
+/S /Span
+/Type /StructElem
+>>
+endobj
+129 0 obj
+<<
+/K 58
+/P 189 0 R
+/Pg 14 0 R
+/S /Span
+/Type /StructElem
+>>
+endobj
+130 0 obj
+<<
+/K 60
+/P 190 0 R
+/Pg 14 0 R
+/S /Span
+/Type /StructElem
+>>
+endobj
+131 0 obj
+<<
+/K [61]
+/P 41 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+132 0 obj
+<<
+/K [62]
+/P 41 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+133 0 obj
+<<
+/K [63]
+/P 41 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+134 0 obj
+<<
+/K [64]
+/P 41 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+135 0 obj
+<<
+/K [65]
+/P 41 0 R
+/Pg 14 0 R
+/S /P
+/Type /StructElem
+>>
+endobj
+136 0 obj
+<<
+/K [0]
+/P 191 0 R
+/Pg 15 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+137 0 obj
+<<
+/K [1]
+/P 192 0 R
+/Pg 15 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+138 0 obj
+<<
+/K [5]
+/P 177 0 R
+/Pg 15 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+139 0 obj
+<<
+/K [6]
+/P 178 0 R
+/Pg 15 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+140 0 obj
+<<
+/K [7]
+/P 179 0 R
+/Pg 15 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+141 0 obj
+<<
+/K [15]
+/P 181 0 R
+/Pg 15 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+142 0 obj
+<<
+/K [16]
+/P 182 0 R
+/Pg 15 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+143 0 obj
+<<
+/Length 55207
+/Filter /FlateDecode
+/Subtype /Type1C
+>>
+stream
+H\V t׼_wvb)j!$<HB18M'̈́ٙdv$DkQQz* RSBAJ)(H"E<jyH)̝YIf̢H(
+j E1r"J_ <NGn`Af¶tN!>E0DX Cad$RLEJH5R#" iFd$t iEC N/Q4r P[hzZA2ځ>cY/-m;ww]Iyڿοٿf
+ LM-p/8kՠ/( `O/JpKpOp!4Bq}PWКжо{ X!6Ucc  ۀbاE5I6|8>
+/Yxށw=c*x?߅GgWB!NB<b! B#SDKb=-#q8B'+u%q%#d9YBN%+r.9mdI|#_&_'7oȷCQy<G~N^#oP(ER5HMSUTu%QF^j%<OP;=A0u:E.S7уBN 8m^z2^Oo;?{}}0!}>EB/We(f3Ōg1̴1bQf9$yyg^a~żlb2ۙf/9aN2+
+~aU! 
+'3?/
+`q8R-+N9bCQU1%.{ŕ/u-O~xTxA"~)/
+3pIpk3dxMx{)ȑ"/D6GG>\ DQ:*FFGGESYhKԈvGWD<fY%f6K<?)cK␗D-NWbԮLCooMwyyUuKSפؗ6B`ҶT61)UJV PK2&j<evnlvxE-zeI.RrD\$+VEi.1Y%D-i gD4pLhN ;a 6f%hp'b{,gB8ppT2<:oU=)u'x9tY6RJ"uJ['L6mqcIAC\`n }"DŽ,d]ӓIEoܤmLv[ߛ\vɰWry\Ekqfc[CY\7rȑEPndf#72rݤ-7 2r:< Z/u-8bB9dkv-:j:]u(#ŎrfҶve犹)#?.kzRѲxB<m'< C@G<8㉇q\_Klg<8㍷έqD9&&ɸF]1UJNFrR7aY/0)z@]Պ:Jײ )&g7Bnb&-sb ~ɆI;Ғj%ckwPMi}MR-+V!VySԸbmc!YqIMc˪)%ԮHٰҤdJu.Vu bŗ#NrWb0UW8pU8*\DqIITԸlb3s˪*wUSʩZTRupp">*QdqcKjak$\8~BXך1IUJuN:چ[ks!倊#O-).m== pFX1W1XFJI5ZḊ1dܷu.(+`y`46k/gv 6wǻcw}5Z"&*DIS
+ITIQi+RJmRTU+4j@Q:s?{wJ0̹={h4-"F#,Q1d$&ܘɤ&3+垏W<:( 1D:k '&xR'gsp lB:x-Xt:ӳ9)Xg5+BF, ˺M<!u2?2YξBw2ǝ.Œ倈=9q1KQUܻ t?Mԝhu,XV:񸡚ct) *xJcNX= =#ց1EtZv3zl/qK[iKl
+N]ݩ3stSE@4s0\Ɛ3٘[K&=A$D%b~~ L[Lf)[
+M6r3
+gzvAEQvfEvBd̝On龍iQ9/_|."v)pPs6',6XA㥑i|4
+&@LBiQi4&,CC /A^y %K /A^!#G<y>|#G<y>|)))))))))))))))) 'O ?A~ 'O? AVN5Ԭ+#y׽%^v2o4'Wo4
+MFхQSSSSSSSӨӨӨӨӨӨӨӨ Q.D]u!Bԅөөөөөөөө S LAxh44A&DO@JJJJJJJFFFFFFFF]u!Bԅ Q.DNNNNNNNN]0a
+A=]V۸mCva(w|X.SAlFx.'s2D>2CX𪳪ȝfTQM><)Lzf?^_qU棟I2Z7wHc4;sn'hy#,v,7cv='{;1qJnvȂ.\ӾQS1L8M;_&CSpD'SV,\^qmd#L{2|sdN)#cFDB)Ғsp0S'dZ,%`98I9g1#5*HAIVRrrII˽v[fZ2&'-(;̤,37)js1ytn`@'(*Ŝ0w;^܏QTc(!AQ\zQu⻘g`ދ`(Y'Q&`Aǂ>7h^9X۰/cQZ.Q',i’XrqKXKkKϠeQ$~Pve(߉(GXփeOa<,?`EVXq+`e
+Pщ?XkbX;)*O-ۅuX*W`/AC6njQ T@4{~kPmTjZPӅQ| 5PV6Z AU~x Gl
+b(6}Ӹ||[4PE.ԟB4 .4@MSyx
+d7[8|A9  *_C @!pͧ| -}hy0bQl;ma
+|y3z+у+߃2w,,~I,cK7,sbTgsxVسb"+βҁ[Xi6 +UXuCXšI!`6'xZ+ֺv ko#PO`$̺1+'hA۲>\ʆlxleL,&濳ًWbÖil`
+9?pK.bK^RH]Hj!iCG.R<]˥\q'Wΐ#}yd##̿U-Wݹj KETJv'"'G\kVJ]ɝIn9\wF'gEy#! 7sc?(\Ma87fnS$:sk2
+c=)؉Ps<wSҏԊ@J([@Y e{q(_Ey]Tb*QTQL|*7PYŃq<8ăTj<UG)<<# Q=x'x2'x򔿾 -^F]~$>55f:5!ԤQS3O? /y񌗿W*u0- ovv8o <xw e% ~KΝ4}
+ʨq,>S'䉸fl4{,J\QG>.cĢX<ar(H+%oic&mmki{TMv5bW։UhƋ&GY/*0[:/ytrNyb*yW. (DKtwk/6b)b{IlŮ ;w*ݮ}{׋vZNڋP-QQ#q8qrLqT-=HXFzႱ4mhn sR+!tiRMT귙׫mbe!)F25&zsK[1]ouYiTWz*㵻>^]>*iQNxgci
+6U$ź!pS*M:D4pj[\LP2w4l)ڽV2٘B1ĆeT7ruFɣow[C箲oMVۭ_~׭*ҳݳUj(hk_G\**=Ir⏘gs}WF45#~ wdQ3K?[djha8'6}h*͛8%ʌTEJLjt27*@XX+W\zj Fo긱`di<Mcֵ.hjԈ>^ǎ}o-;|N3\'ѪE宮2~otjrvlt:499}MΟd*mpZϝNiu|]_fyf{_8\
+cEWJuddXA,R ^uZT<1`'1BwmLAЎfMLh-`R1SP'6 !P
+A`8:Iy o;5WcMsb8H?C (O2 '1Xe($Q#m*Z&D%Ÿ$?Y$W@\
+^ [wQ? DVkE cHikE `qo/8H"`5Z:>t/` l)(x֔:2;g ~乑K:pCB.\?$+ /D:s;LdVާ_yElWnrIwV2aQrV>aE诣l|MG3KdѸWrhmqc]D@
+5맖o@J ⱐ[`юR1M"ebTk
+"2rsܜ,JT
+)Jf;<36v` |MRLyg%Lha@ Բv] 6 P VX z܊:`67vs۶ͤf_P(عIѽFQgqD<M"wٲ@S%~s˄<ˠpA7L4
+'). O $1gaS
+FA *j`jHs85 r65_ûix0+æe<J.۔I33P3V=p|)Uvٕ7ڥ.?Ndf\*Ty@ȰLQo",ȱb>I؟k
+,x´Y+xޅ%?Y7W ?'fSQ;OhmX>hap4q
+T3{'
+bq)"|("$C;{Cc~!"<Ϟ bp|;\hp'nMh!ofq?=#ȩnjb]M:ANdS@cK/'.]ؕҊr+n3BS'QڊFL_)kո3|㺲[51%l`o5yd8;E%_$C].gE.ӻEo{×/Hu1V*tcM\(uLv`^ʺ'd.aCc8φ%oNOc%Owre 7sT': Z6=(iRejVjqIvЍZS # qEׅثNf$+ :b!0 0z74d _n<78׍
+:|'4ꆃn-g2@~7F`n*4U&Ssb4]IUeIîvh EY"*4 68idQ&Ȫ"F (7;hH#
+q9㭞מ3s2U{wؐc9} @,O<ȧ
+y@,A霥>x0@o>0߹BQꄴHZF߁Wwx@ب h]}rġ?^`YDy
+8QhxMB^
+iPM$H4řl?E5s 0Fξc\MG$#d 0X( _{]W{z)JGlc/9lIW8_o
+[p s%{=S~!’3#XsoXA^b׍rDT;\0|uijCl"SKOaFpfٽƝX]W Q/qYU̳
+\_dϬJ=gˮe:˖~k:C}~v;F?j-Zףlc7/64!o]6=iM:qu=,WA;-wnpt?x<lw\t;m+) )3^$ՊXA ~\Q9"f ` fOLV"dam+|V"*54;IG@R0IDGtw杖k8}оqK. !s#/|kVIU>z=<
+֕7R,|𹎤#zJ
+7䞸b~I:2-n8v& IX6}]B/狅e /  r!r
+W[q:eeT#8JI؊Ÿ ~#V{DWR,NGNJ?8$1aK~#}P@Wck"o- MRU{
+j9 55ZgӶ0&22aq5W5 :PMHd\&
+i O~
+߭
+O[;W7 @),1oѻH <|Lqt
+ͲE.yl 3wknVj'.7^C"'S8!=)-37},uJ-'w’jT C8̂bX Vdh !kd=fv.,8ϪZP㴬>p-1igtButW=!<pfvgD}%ũ)l^'HXirQ( ,;إ= +ᕄZI=Zd7t\fQ;+.3m#[0͝uW';A(J=x7:S~΋UTܺ{3N~^p@B6;)#Q%x/"5 ,?6_zvC xեo“Ul*&&!\MNX§(c_TW{PSWo6t:Y{Am}퀏
+uO B
+"H 1H@%+H<ް,
+Vj"[Cw93;;;q
+ۃEMݭ=+{Z>t(JK,hk<BCDtNg>>yF5 :7mx\ >`8 >ؼ#Wk?,oۏ?|+3cʷD3? xO^W
+(pỏhm;4kB4'!¼.mv}rWdd\鲫1oƔo b|
+K+|#n7X"M-S)Ҡ_ÐG/
+3+
+pOa &RU^'W\ˇ008ZgO{" :b(IDr
+38@Gp|dfA,nKB4
+\-L#'(wsB yv曙
+;&_puCvϙ\*"G8%c[Єtj2I&y&`r9kX# v !>d7,Y )-.ʝ`BuA7ԅ $T]LOq#\=ÚfMg]v?`: sy| U%7UHϔ$<Բa$y”SL͇^!v|[0;xx*53LEU- %'KH=wSrm K-G^~6#̅*Ef hD[sq>d{ Z4xXjq9[
+ C@Hnz~⛽Ƽ
+!jy&3;$ -pp +kjD#CXA.Cz$ȭP+
+y
+kf=w/)ڛSyƺJ-hoh1WϏ7' x_vY?)V"XP%DBҫߦ8X/RMҢsyIZeӲeRefYe67"1R6yǶ=$5& e;?jQ4Q}`E&ミ̖%DSgP' u=Վ`UC;K%"ᙺ;֌IJ1
+,:F =dal Sy NM@>Ť\whMS2#X8(zy̅RG+6D.8lpLA2}-1g;M. h)hͷd5qb/\i%knOTaH]{*Jxf7Nks"rG<c@$xïIݤ,''{g[K Dm~V j ڝ~
+Mg'zQz) &MKRT+ڵ y^ :V48 el>=0[<FI]1ro,-
+l<=cg0A.~jTi꒎^]=NC
+RS^Wnx8m$+^uI58Qd\ <-EN<4n1x=6؏Z+-;(rٟc9~Ud@p׉ cb]QMY<i{nAh.zj[i(HSZyPAkw "򐧀j־YO;Ós2};ݹw2oNUR}Jj$_jn:xIJ{:%$褢OAE`4#8ɕ> Q/e*<NU=wgAt{p7c5eء.8y%#ލ2G8|W'*׭_}ۆhcES,IPxp+['WTaJ":\HCVd=*2A9O=3Fxy#^ 7_ @H4_$ 'c"x?uX
+DZ`0|-)ryNdWLbuڏJK(EN-pt@sHbzX9b+)gܛ\+,Tvg6xć;}]6HTV/}o.26qxj7O)xL
+ pLA>M2 |`UO=D P
+ /B4G1<OX_֤ZEE%UHơ^>׸ylweR)<嗡`P;khK6]ł?==ݞnn;\XצR%*~!! 賍jEEت\qnŢYTh=T¯Ewje13Aid6/#7᤯Jpk̾/e[835f35朶$|xӉ/BFB Y٫qqc!0vjh]`
+t]l0e
+FsYd6t=: #
+Wq}ۇ{n RN"43bFfD9ӌzPlXuW0g7<y^Jʉ<e91n8pZ%ßĝ)Y&S%N_ w ҆WWkϚ{o HIEflKQ*ow߱^v]J~"6WlSP\\J8'_rAFDȖB 40p;cS `6F["#7-[F&=b}35Q\?}6=+79i26uaBI[9zgG5N&g'ceS:>]ZNΥ@LPuv~E(nڹŖ1V*}$&Г 'c#*7HKU谈½3_~Owt?ã-08<`[RYZ~]E?oos(^fSkس<]YyAThhldV ?XN{:46LW{TtJ΋E=uي6vX.//`@ N^Ds qq_?O'ɎK%U9 DqL*ggLlom$]-|!Y[
+oӅ7G\ 'F!(NPF"4 3nDT]($4B9{$} z{q:tcdz 屐"_0~"*,@7Ӈbp4bh*L$e'˙S^ Fd޹FFyJ['>:&Y#qT|('"i_*+z#<<c'v`yY' &D%E_ X/s@Z3 '^W?PzA=Jws߽Wz客\#v93HĢo_ra!etj*1.Ec
+bI\>Yh 2(.(`r#MU%0 pHcayEd˓pJo
+ph
+hw%v9"[}4P{ sZ<^zXZb{P):.8tJeϺz DO-`)FU+|W)
+W
+Faj*?_H%$(
+y.$= Uъw4(<E
+>|L@V&Obq060~[<"hdolKcMe_W"=z4bwz?R mZXy{h5/>GR
+xdeaq.{\ r̋C&T =${P)Cq37Sxh&zACwoЏ:-CZ7";4m![&0 W|~AB
+$)
+\5SM;)Z?UQȀ{2ֽB[G
+>g9ӐQV^F^VLR&*D&:>3<
+(\V(  Ԇs0l g_LN-^߆6>-`"(ON!y$qQsvC:&{I2%7#+MIL a)'‘.?!WC,<f?;X%"sENMOwk;gK\G[+GJ}8}bw(7`n
+wvͲ~Y)Una~sI̭cEprb;j..o Qg"D+Jiw;tIm-}ۼ#*:T ;0!`1ZP/ )<CL=nuTE ]Qa2 G+_zq:Jgdgε
+A]}_͍z!L6"K ON[G9_tVԹ\NN(76t8dLj HLJ 4u{9Ttdd `%l/l_<2ӏ#7ٴȝ'SA--j' R
+p~&=N:joma/qE=EhWRމEGAB훆[!
+^җK C7%>jp-p(s.>x{ouD4݋SVc
+ jlDx{#ė}Ty'yʜn<zvHL:F]z#T608RQ-)7J:K*kQgJjFgNt~߷}
+㑶ojɋ;bX╢k 4e
+i(˥ ocV:q^)x5`#NpΨ*zٹGK5xE[Aޱ;rwN NCKY28p! 1L!8a 5!FF``7Ff/KYNFh꿂aQI|D%/%[G6%XT13`dr@&7[K;\&~7
+{SL[<AasGe(8bD+~KT# MЗRqtL:=h5U&0y:=6{テ~lzH{>ۋg÷/Ctp<U|#e?bHAkX دŅ*'ELINqy
+4m ?d*ȔF BU޹x*j98;FLg)JM)UH W *pkd sE0۠me;rr^!Js2 < dnbdΔ89SyYm4~>cȨ [#E<<e^Yg[A/(E c9c;LWCx+ljz+=Bk<׍LtL
+uT*(d#%҃4,7:c.ғ^ W/@;RK#qm#FWNl{Xay|y>'='3ik|}uv¹ںؔ42!CklPcCv[4/c Ӊ=(ك~9"gIJ8˫†ÔWm "ū{NazRfȒb,_+hQY 1Ӯ "WΧ]&đbMcaTŖCfA!I
+/>stiƹ̣q% fJD
+nCB6vg=MndاĀX&kQ;G^I9r‡Q|l%{aGaC`D V:eh!Vuyޣ6rFa9a'kMVҶjgɣt*(}j*v4t}\KkZY+v$a*v7BkJ L
+٫TmU* j*EC*M b27.m#؊hقphGDe7- "
+ȾE@iȈaiE1<bZa.|wsjŲP 5SIڪ&m k$_Tim~1ϡJ,cn| szOdW%zߓMzCi ҅.Gh/a`VD j:ca>͔BJ|8e$!ħFW,aBSϞI CTwQ,n04Jl:ɲgV"@5|mƦ7l:.qE6wVSy3
+Z!\][lG;0~5D $%
+fh2gHx:&h<%EA}ᗇ6*YIJM7,/z,t~s[{aLZwf5q˱>gr%kJr{r%}մWAgż]$5
+9\ {tYƲ# MHI1N><B Gua#1o[r>MR%^jc3ұ|4ȋiMl0E98WV+:%67`YA kqKՔmexT‚bՋ#Ѽx"QQ,ťIdҡe0vUc|҄j>-i^""iJ5P|7~ؿ;9-K ~0X
+Ga1sQ]%soN dfbZy[V "v/VkƃUS{P<`>GfR$R;ݦdhw[8_UɗIۥDf
+?[7.f/>Dg$
+
+w+n2w?fC)*MQV(8{Q"3ŽjU7fʣߚLIZdo)!tf":"T
+V&*i܄BDv]9jWScc[xT_1I7h.#B$5rLME:#=%A~~tj/h%{_?5ThyyDG0T߽KO+F\ }F0&a8! 37h
+&v-pߩwPƬyHJ9/!>8m~i %hD_ˠU}G{~Qu9&KsVLebAn,k7b}F\cM`TV@+j}Z]K*, tZpHTk]iDLPH/jBV֌|TIӀb eHY~8c4LFYlp+1:_a旒d5cky^bo<q<rS«4*+ CHUD0T.2L4,
+ ϥѱEI'Sb8j< M DPbDf`F<'!(VGjc~c^0 ;Zpx
+"9x7\BcBY殢yK^gd #b3DUҴ~~Usϩ"#j<8
+ ix ,ߚ[];ǠO6# Bp ջ˾G]<.4`? g/tONU'Ծ1 à?6CTG*ӦvHCN1OGp_uk8/>SUwɕ4]V#"ѻjӦvàHgujzgu3hy iKbl!蝖]i@֗F= Ym{ 6x.<~j`~,{HLp="g 3+c0m33wX+Zz6qa܃(Süb`k,n3ɽ.u.@Ȉ6t̻,P9tBU1.XrjihR<}qqal!/oc?-ݸ@,)3)#=a>f<e
+(U
+h@~
+?0q]&oa^;_+݁mZԖ| u$ R~2}Xa=Cr/{oA{SGxn/.s^B?۫)j^7w_@z:6L
+BwEɛļ%y}/͵l
+)8D$p @ue-7I9x2Im`1G֜%=ị]4Mv#[ x5,>,BKG[Ƨ&?dM \psVWX1|&>e1(Ѯ~n\KZP11'm^2Ml˕VqD-) F#>v$r?BYY8?2- +M#&;r 0CcBMOA>]Ǭ$e )hn:IzMX>,#1: ìF6
+3cF x0փޫ)PHV#àeº'JHXU'qSlS`xf<t)cn,1p;@lcH$^bE9A)G"lĚh~4;1@* E?DYU3mq!AIK3
+P/(B8Be3aZMƩ`'):.=.wq;`#kr "aNT]"J]݃-ZLMH${PSWp$Z:rwŶlgv}QPA@ 
+k›(O1`F^ԲʶElkgC=77DQG&ssOrr>F%^/kԆMjڰqeA)x
+Kq<Nf]B0̒șB&q騫?Q_7vӶ]>v2Yv|$LTЁcGNE Û<L`
+y`R6*X*N,Q;U*n/U-j
+
+Iu| ?JRUrRE[Z8G; "S`INXR3!cNNu.)SD|hFłT2VΨZb^16 V9$Ui-G`[_ZVj(,bUHHΪ|U)vVYYujQsZ ,P di;33Vh&mZz95x#!*ikm 5&Ծs?g88
+-&cQ S!sj11RX`̆^ h֘q0RV71Lm6<L98IaKMܑiq ;إQZ-.!%|2V귗b)UPJ(C~B ,9C `M[zKPV3SA1Lţ0T`)MH1LjԶVQ%jxo{XSא %8'i(Oȓ)r#Ou'0O`ZE{<I榬]6
++,xѨq^Td(NHGHE0i$s6p6_<N\-g@ֵb)pi4&&(v &3?()`"i1p MYfiQ4tpć}bEW@qjx
++0d SSe SX+zL+0f<,(>aZ#aMG?;fYwf8%,('f<`Y<YocGB\ \ax,PATPRbYbRl5G-yUb+V4EUy <SPYcHMy4/_Ix 'W{tB$=꓄H!!(zFiP,J2ϛVGIxbc:z}ix4b"(D@ȕh$dșhJ=%I M]+IXI6ع
+=Y-ZkP'뀉ͮ_tp`F7q==hO]jtV;Ц3FU)R4 d
+Xv{I/1dp"
+d"0la[|!@C%6$g}?鞶Z',-px*p^P Yjօ;+V?0T{6T㷮SYߺ!noĉ;[-( "؇Z'Jۘ)͎1QMMt[oYϞS]P"3 ejj=I8mVUjcϮmGuy q+20[9GT`0f9+VW(AiԜ ~FOe^l^,׈"-+_ŃKS[ϼ(}!πߧ➌r*^NW=ZRR蓩td}J&_*.O<u<޲"./Q5h /S/. ,¿"H3  3A_
+5+1 *8 YWc3_R*EfVRzahNE 1
+D9<E$#H.ᨉ p-V>$dЄH8Er)ʐY" 6V}7ҙ^WB$dj]Z隨 XIeLAtYV5!؝ƆٞF#!mm:TȵG)IED05*}sIou>[ztq#?ګ4(+ XcC/yE\&3j4FpP 8T\ @d]ATn#MPtd@Qy UsTƱj]}}9'mT jЦQpX . "bl*h , |.]Po͍j-|v/uzU;`,]f _0z>k{յ7np+kLFzB:Z]V!iiWtz}] gcr#2v+:h
+M<Iޠ3;lPfQ> щq߹PLѢ]^*^yͅrpg<OEFq^ۉԠ4 !7KM"al]b`ceILLlHH4'2NRktrVyJhdw5 >ת b%fGqiwW >i+Li
+>|742O"e+~T#B{7$'e΁n8A~)hj!v{7h%EV*]|Ą7O+1GB8N JDx>S!v䄅PTe- M:<I5I#4$V$IݛbhOD
+e4r@ ᷮHFH)^ׇ!^ AG84 1kgg5FaÎQ``<d ̐fۢ36OH׀Kqj}#'&DY BQQ9ǐ2dlJPll?W BBC."=(L1vT?UU וftSA].⨲l.`ٮRF6>*R$e]=AuvDz0K9k։耼21l>C9Zʙ/9!2 1ēU*8$q1q
+V7'ؗimm6%#e&tidM=~]Ȟ!RB'7b{"&844zccu;2B|>mQh W4sH@ד[fZ4ޚˑ?(u/CklRJilVEGj3
+d )g9qI+,`8.+W8i4ڒAj>]&\xE>|HłPK!V*Ho ‡T9LmΠ5˞Ar[tyjR!G县&$V)+hj`ar O /I#}"4$ "T;:]d [ nr>Fѷ&0d4/gf?N_'R[Z!԰5l(Ϝ{`HNˏ*ghh! ж:(g(DU$qEࠢc
+ (&ޛ D7 e)o$YzTW)Z~ N`Trk,j kkw߈~ fN!qsEeeY\ "B9iWbu9Ysiſ uL FXqB>F{H^W. qXs{!G*gQ rA,Zr Wd;3÷ΕpGe1mQn#{Bߔ<0\n/ uTry ];
+:M7Eut\q6O"3IW[i04Z'cѭb[* 籌ǞWSKU"zڨp[pѬHYbQNMKa*R[B9+p;ᐱ.n^H
+SAAZ ^$TJP!?u_w=NqQJ-SO wD$p
+{*#!ؔ[@}EܠznwacE|q?ܯ0'$עoҨ|.
+.Q SO`cbkk,tRcRbJl(F@ȶ_ZX#f'j}BU=~B㡦k~mA_ (*s {?+-.7Q]>f
+aK<{agx0f'<XB[ilՐOx4H6w`LX;R&0 UNOh|0{t*6*i03ǔ1B~ws03ʭ9kiEC:O:P.93V;$x)J~VyB ?
+9Il,RztRPKT|( }PU/aЅv/\<vfXViXr @ȷv}-iU2'';P
+a١UcKӄ[{OT],H,Rn$K<${F<}V5Ü7JU~
+i;ѤpÀ0p&;Pt&QF.grI\Ɛ/}On"_&';Qᙟ,<MLWvrP੣7pz/('mZ ޢc/V*W8R:l,[au;Z! ռPPtg8Ca^ >c%/^Edn'BsBeF#ӥ>zfXy zD&7covb_p@|]EV X] :!BDPFaXht")T
+N0I%F=NxDFǼ=$뚼Hio^Wˍֿ(>?$U$R˸". ]IJYj±cx(]֣IITrGEe9I{ذT(O_ګ4(+J&8<iP$m*
+Zj2 (
+
+4݀ 4fX]dPd]@h!fk2SsVcj,gWwι;S슔t:qLQVܥ UToH5Da\3z
+aN>4Aaz;MB%ґH*?ƶG+Ϸ}|S^[Ewaø ;Q: vA3?XtH_cO}B%_ts_W(;D?oXB4 -FMaQIeb FWȘh!ɣa4kr6'֒T%/hmd}XMfD'dˏ0/Q ;'O){zgj`YYyR!S_浪5&4T?c Sd#[浳grp)i
+QY_hzEctpdhD(G޳ykOO\^`ȣdrVA(xS,ח! 0nH~HI=
+h y56F]<+;|yJПi<q3'v] 'B|DNgawa
+r@x0+&U4ԗc2 wɗiY8d
+&?#*n<PMGr:`K.7a!82H]| ;
+KWH2bKћIdhv9OYkpܙ\]Vfv>E"b}T@AdmflkyL?Z
+1v`;& Dr߫$?|Q)΢eBG+8``8H Q;zCϿ2!\KŔU[GDSSrW]g{U wROӔh4P6QFW#bu6|8oByS"Wi5є:} 9tnt^sfj7GUw648.~IKXGogh+CXoR\MpT\˳^ţ5TҸ=Ly} `NRcI䝪KN~B
++PRϤPV3fY]a>G8(룻`[$k`Ψ_Mw!UYVWU4c4
+dϋ.a
+a 1D! Ihގc;/2rIu09C4,{i=Op5[FFn"z,z?rUi蔤*80/Hg#[cu`8SMDhK'Պy^\kÐoAMe͕fxK|ryqDCOe#j
+awC f7΢:$.pBsހDl>!hG$ ыќ$v<ބ`D Y宫9m$fB\\-a?^//m+;YH46VDJF]5 ӊs偙\3Mu VKs0KDwǖxOxUkAM5{%lb|"}EaχTa}mkn0F/Y#,`
+n7I0Is$yHBNT+c|cXv:M,ZZTrQ=+=S{5ufqp/g{٘k:>ve+n[BҭA "/*/MWE@A
+]Vc잛pfDDpqG==;ww% lQ^..qr\a~悼PG++S&G܃qF; u۵x@dʄŞPlxW(+BT)ijQ;q (@~:[7)n N}9(0/zWzf\F~z|I_ 4uERq&>.tAZ{yx4# e`hFVB.2<DD(H&Kh5ZPZ@:X_ĚIbƱKēz$qytczϖaF.|Gc<6AUFͤZy%·d w5Dgx&_ _=qVǟlqOqŴ? њ^ -l6Z\a6=@aϦ%I:7s{|'/:eArͲ&,.l쪛* u"1V74 f[37cVŋjՠ[tɚ6N{bh?e,[_z"'W%yzzOƨ Ŋ:nnq/<ck4sa נ72~D5db`T01B^P٪k>aDuIwRGHXv-^%5M-!_Oڣvv)#sEsqz;)tw:F_bctINAQ2_ȕ2L,rp'n<ǰ5 |_12'u妚7N5I1XmL\Hw<Xw^W_Z
+4"}Dh*w]U5v&1;HYlB,cSsd$!6`O'""ig&iK4Ɩi(EPpga腭-uE#6qcP+w8 ӏ \hPͥiJqRoOvtIv~q
+ˉR0KLtQ0WeB^Y$`9v (dpn`a.ǿ,RgAL?XQvS2c 7>?=[AjCÂ4+}jG2r̳<R"Sfg(z&;T=k š?]\yEZ9.͖+| %&~k}#<EntyXGf*M^VtT^yw<Fń TӠ \sM&قdI`rʺ=G]fB^$Bv$
+ydG
+82[ZD~d-H᭫ҕoCU3<6я;PdU%جN!-aIf $Q#,a1ƬQ\̝hʒ[`!gɮe4>(5L{d.0
+NW'T pOV
+t*,y?j97G`&а vb6/61Ƀ4_tk a~
+%4کfhgɓ< ڌCs 52X>h@H$ACd pŖqۿ<#<*7HXJLK6MoNXo֫=tdge'k2RMH"]MJfL.!vm+ 1%!*J2 nvFcηyη3s8ggZ.St0֌8R#^"oE V[G; uT/~u7q+^d
+˘ܕaz)O(_0C9II^&-Cݏ&÷ cb ^M &)9iMh=<M{mE0CZaCV} re+㧏4:pAmrW0 |:üS#&8!tF0Y;j>*p5V5$+05É&x yH~r×mUEL%G,%NqlQzΉ7M]Wmܚ
+c
+ 8j;zaJ6@jBA/=H،NhT[HW5Xj
+3$̐q^yfs0יJzsKra&]CpXG0 jZ?]}=Ba-Lm=e oNWA@+J"G2uC ƙa-
+CJI! :GCچX4Iz2T'(a:^xW`hpFa#$?O$7ldH8"0 fvB<M8atiB G#ڋxWb0 e0UA/ka_僄j[nLa{|{0
+^Ҙj0YJ5[ߐn) #
+S8߆Z7 [z΍J5̼,ZSzy[PР,>웋yKf#U!똵_!VNi.!L<LtET4w2ԛ+]zXur,9^Nfe$g>&R[g0}FۼՆnb5%ߧd{`,fg'9!LjU߈
+b@`r*k$'eOkڬ L7LsZfK.$T)\fq4 z(jZglfmmB_
+R`7S5JM΅]IMdM=\A f1r B"ڰヅd+}\uhҨ$L8mU0nW\]EEWE ( ""DdQ#ƠM5zKΙ]3'vWn}_]u4JnnY7DjLh0"DT2mI^p,x17xi1Fqv6D RSSuYHEyk^8<QVhQIIWE_gm:!K͔ޢ?&$KִzobDv /Q5:a1a{3^a+Ŷ4K| Ah<?} s*A }Y]vV|,D|9ЇvR!!Xw$#6#.΄d1b,=g31DxَҰQC
+AvU]`hǣO֞
+ MKjʊwDd1? I=Nb4zb_|9h4l=( =Ra~ tjLJ㙺> yk[WA0ኇ|8FRc,Дxw0N҇ԋR㙈0rƲ??}!)47:j^c'6#k8wn@zڸ}H<wfOhvmans(?6=1E6SjØeY.Ͻ*9'BJda̍¸#b5GYjlL .mu`x`/-C$IBe
+ 0AUrlj 桩r0I8D75$R&-0<議
+k"Ck;&#y4
+I4VGšH LpwBjɈt, |XʊHDߺ_UEmLkģCs'jrd)bSQ}X|6bU q) 9V^X4kȚ6ҝ5ePduYS
+k݉4T ]<OƎU;0o]0~-vb/N;U5L9!cAqa䗃}_O~Ȫ G:/9H) !sG|Kw-pd;+ =}AEw%A~X +WU ǚ;(_578`m*:?۲8
+
+R9ήj.zݗ\vGUlD. MTrv];Hʯ8 #vF̕^;MUm }) HJ>- xǩ"Tr׀w՚B(d2Ki֠ld iʼ;y.l-[䧤{WHARYVF#Vx`$eD
+!
+Fj@j>sB!pBy {axn߻
+ݺ]F 9burfI 5=L}
+#<;P|/GބukQ1: *EQvX%2!`hQŅa e?8Ev8T
+ꌶ7̏/*SxΜ9+y{?
+GBR2|Q$PN8SC6MJUJH`C+
+v{;MY[+-6NT3XJU0Q[Zwlagw#YkWՏ7VDP9]u/- f}hcka2c"*erˆ7N8%d4|H<爮zW EUFi
+LJAP(~4Q_fUn@<(JFYHY*2ryno_Zǟ`81 nBӓZбTeWg2١}GZ8j/v~L81 wZ.րCUe[1.9Ȧјg;2硉gA"#B尘k "7w5`6Fy"*戹{ixE C9jbSqYtCrGa<YX~<J|ϵO,꧇J%2[ɀXy>#*//ԝO`(Ln3;ڀ%y6>%Dw$'_:ᒾsn$"t$N |?
+QDDz;\ JwZʵRLMV'#qehC%n|,&ơ(C'@ᐺL0`t# ׀
++b
+Y"W_aQ3(~7
+amõ[)}k@S^UYSX] g7+
+ܾw].{ TtYP h?fd'7!5;6\݊YGc>?%kV O23Uﭒǩ:ӭm~#5l # 
+d.n񒐌h'@HyĖLB_eߩ OXf#ZRάHb&g0n΍C&QQOmA;ߑYe5{<6CMCДKQN<&]-K*I"ȳu^
+DC3o|_@ryccNlZzSe=֌})I'h*ӟo!9H-hbse2/yh}3HaFS/Ӡc?h `hNb~: 'kx^ҨBYonyoZfPoXZ%{2g %D \0g ߜ7H,dD<_:Bĵ`jp,^$~3
+Zb6Dza#}8P^}v5x\Td:\Ozb\AfboɦiVއo uWӫW E}MAZ+Q"{yXo7mE#<a.f 9p<090/ᣥB;[ǰcskF[qd:!ð^a6IUK5?ӫ 5j*nω/fā{bnfOeZ)#Ω}eO Ʃ1T,w`)Xߪ25Tq&nP:??
++\Tr)`@V4*]}ѱ_jwѿ2g&}b =5xy.4M)y.yk4`6Wd&2,5zaӤ\
+f.m)ڨa">|W?̯ x*I1{>
+cx 4~h?{7it7 _[Ghvc~1Y%GK8*;. r;dA=M7VcD l 8XP}J5׊-\q38q3==>~?[uOzʒSԓ'beZE 4cǼᓇ` '&>T72,4ŨbJQ<?D!.q`cf"Ve9zݦ.d(|˶]s
+d^B8q+C$A<&zyohI.ي| 4 )s*g33$se~7s<lE00[,P}>XmmV`R`b~xQّʓ}'^]pCmDE^愈 :d<'LiJb k$ ?WM-snnS]N)#% ~z%U 925Zu<V,Ʃil/k^8T.ȟ.89T+* Ȥ#[9Ovf&T`H|C+n1&*e}7lm?2/=8:q~M>B9Zhl~}5e((<_zSJZ~Sl2e÷ ^j ܇g+NUk7u h<hu5z ~:'|Ȝl9}
+=W
+%Bd o>q࢜M|C?8̱ӊ+7UwI5&- +ˎ ǃFbEhXrrEY(II QSv::_=~4N:iKX7 Chvt`C=QkfwIMG3fӿEj!д9˂ѦzBڔ)oeQ=
+!%в~XK̠نp J Ip _v">ɉkt?hu6\U/oX[TSتRSWFqFn0#9jI]v^xێjuM𚜽NBed
+0-_%?Kf@ŨmPwarI76nSoetT% -4o>^uiAD%Q[ؚ\\>#C!:5G1  r$J֕JHj) L.ن50R*ːgoՖ8Ik.!vՆ\12,GXevQ
+  f.c(]GL@v_TjU+&Hg>%(Q%"5(LZEfEF9; cl?lĀm7XMЎI#2䀬_[a&z3akD9o._XN+>Yۋ74/b;hxO&B0i2r
+(ªm]Zm}TRB $ 
+(!(<*7@|Tef~t߽nk3;o>GLIU j`udRpxIpi1n?ΦoOyw寳W~Oopu.W JD^#Q` +z`C:xEg(ccB1->TqޗVK0lZu2-CpK+ݓw.̛Gy`ex9c;hfnˍ@֝i)8qs/(&lk\
+LW3"l M=7TژƀގěZNu;fZD>jEjē#<L`ѯ!@"CvB.vy~톹Nݷf?e%٪  zg&=مLI-v=aa7)-hNTSes|v]ZWhS@t ^9|* =R#,)m6V$6an ڍ!L{DW/ܲH;Sa{3S((8KU!򂈲TL]Omc'l[T? }}htoT[V۫
+CQ \0-I-j8jzm|
+IUaq6{`&|e}}e#'7`$egs5;%+TFa!Gky "Ô_ptMY\N8ξ9F?Lxvzx^ZyibCp$2G[YHqư 'a1#`Sĸ5<}9 omr!NŖ ĝjjSxԦIJɌR|fr!Y$dWә*,6 ՐV{?YC 3X,<EdՖd,&B[aj
+*+<7|g$HONȢ3xFl1iE<k<M1"ʉ
+j.GWs׈:; A-!IOkҥ_P4I_FT^
+޳!"Ww`g8e&{Jz7
+spY{;PUOzKH')Խ![xRİ-$g1)kj#b+ ƲIrc}R023<V^RH7""B谽!RL"-V PI4p0 {CcF긺_n~dl&5˷gɝrqT&Pmv؈R0<{8 gA}.p杻/b
+*O%X.:3XO3݋LdMyc}18*nZvY*5PxA#K4Yݠ
+oJZ^Qû{ߏo^Z]>}1Z wsV0í밿g.e(.Aѫ/sRI}F\0~淝BSMZsU.;U0
+=dcX[ &>=>r$"<S^2YtUvo I$yTkb`Bwru?LX'˅e
+}/zVU$hh' a2³iUv饃$
+~⇆
+(eWp\;e7@z 4AAhb5Ϟ? 쌶q{JJq&Ch\G06>H;;۫gFlk3+}9{`95S6r4nt(7u)P0f.}U>kϚc] &^Sm<7n\W D[^#]a2Z;O0n|)(wV0pϛUm`
+?g
+|ǎ]By@welCrf< 9%:͌ΈV@9Sy6b=%^HJKbcshmn
+-kjzPNBΖB=!bZ{-to%gEԑs"~v3#PͣG9EC1dz`Ko%&-bȀ1LTIB#ڃ0d՘F-vE8XFN66
+U. 8`x tX6@] Vq85w]8L'{wN#f$d6Ty^AVB؃ȰÞ1'׎^l8
+_wNnAթSuU+f-IIΊȣ1GKt iFF8@KI(STq+F\M2![&xl:.;N{fn9gfnf!z+b{?mwϥމ!Ľf
+UVr&:^f 0kn^n067q
+< EbIUwѺ_akf7 ƴ~imDk)4=EVr&W4Iò@_NH!0yKмjKР
+v 7^2J7ܔ:TJo65^gs2XzhdaYaz-ѐ* rhe[-bEMI\qܖE0|+? 1@0 0eK`:-hnQ2֐& ,"YE*êN+pRsp;LUH!ƎdR4OX+UpLX)Zugk
+WJo&D-\ed?
+fz WVX9lYGt:!ce)Jjj]Jqת4G~aŮ!%Horb^4PIA_hU+"F!{ISH^>R
+N֭wk+UDQ|<TDD+!(mO+c !hTȣP0_CX>8M:?{(2`*80Gl
+lx7.8z9UH|b(n+q{X=(Z=54mxˮ |28U5^Gn//EnԱ2JV--; ,z8_'hmnl؉@_jO+Ot!<"|`~bJWhp B^
+EQnj }0!-0~J v8{I_^[*=%+ح.* eX|e\?3޴;L+A&1IR
+QuuG/,|-b0#sFcl+CNItߴFV
+lnմ7hyo1@,8V!,-dOg$[b -rLimtMP V*_SF?2#,we|$;>; 8Lv/g&%G1Ў-Eh 0&0pJEEij,َ BS@_wzME:GH 1'm \ݑ8Y<F_,T9$LLKԺ{۫γ"̈́dS_] rOMgHi187k묃1oV`3Rw/_к-fƛh^G 
+J2[Y꥚U`1=42N'Lٿ,&#c-;"}?oy ~nޯV93.829{!+ERyruWF
+c Ι§y90 :YEQ!8"Gۺ:#yqa!dيwTKxx@wlC9_^vM'ܹe zM]S |_ErP,.ZfX/32]zrhR™h>!҆5#`^ȏ}'1A M?GCR?Pk'#@&aYM%& EMX-?xc!6>%Ec~Dq,p"QAixx+VT*q$ 6#3mGYr
+endstream
+endobj
+144 0 obj
+<<
+/Length 36
+/BBox [0.0 0.0 103.007 49.3506]
+/Filter /FlateDecode
+/Resources <<
+/XObject <<
+/n0 193 0 R
+/n2 194 0 R
+>>
+>>
+/Subtype /Form
+/Type /XObject
+>>
+stream
+H*T0T0
+
+endstream
+endobj
+145 0 obj
+<<
+/BaseFont /BCDEEE+Calibri-Bold
+/CIDSystemInfo 195 0 R
+/CIDToGIDMap /Identity
+/DW 1000
+/FontDescriptor 196 0 R
+/Subtype /CIDFontType2
+/Type /Font
+/W [0 [507]
+ 3 [226 606]
+ 14 [606]
+ 18 [529]
+ 28 [488]
+38 [459 637]
+ 47 [267]
+ 58 [331]
+ 60 [547]
+ 62 [423]
+68 [874 659]
+ 75 [676]
+ 87 [532]
+ 90 [563]
+ 94 [473]
+100 [495]
+ 104 [653]
+ 116 [906]
+ 122 [520]
+ 127 [478]
+258 [494]
+ 268 [494]
+ 271 [537 418]
+ 282 [537]
+ 286 [503]
+295 [503]
+ 336 [474]
+ 349 [246]
+ 361 [255]
+ 364 [480]
+367 [246]
+ 371 [264]
+ 373 [813 537 537]
+ 381 [538]
+ 393 [537]
+395 [537 355]
+ 400 [399]
+ 410 [347]
+ 437 [537]
+ 449 [745]
+455 [474]
+ 460 [397]
+ 463 [397]
+ 853 [258]
+ 855 [276 267]
+863 [435]
+ 867 [435]
+ 882 [306]
+ 884 [498]
+ 913 [498]
+1004 [507 507 507 507 507 507 507 507 507]
+]
+>>
+endobj
+146 0 obj
+<<
+/Length 516
+/Filter /FlateDecode
+>>
+stream
+x}K0^޻JƎcP$ C]UwC#$2a='G*)X;mw]86m쥻ʊ=5mDsQ70V粏b]{޵.Z,DO^wO˺;(j$~{kg"\})ي^voۋy_[! b+ۓr'l[OǨ}e˜R =S:ۄuD $9Z9sU=JjmymtŽZ6 (f (5ԇ3qm'mT'J8*OKD>AvBIdbiDŽaL` JcOLȩ )\Q͠$ h3|L4'@A.A-
+}7p_9@ UYdЯ]RzcrH'{ɄּW@&f؛C|>_޺Buu7nB BhZ֧QD
+endstream
+endobj
+147 0 obj
+<<
+/Ascent 750
+/AvgWidth 536
+/CapHeight 750
+/Descent -250
+/Flags 32
+/FontBBox [-519 -250 1263 750]
+/FontFile2 197 0 R
+/FontName /BCDFEE+Calibri-Bold
+/FontWeight 700
+/ItalicAngle 0
+/MaxWidth 1781
+/StemV 53
+/Type /FontDescriptor
+/XHeight 250
+>>
+endobj
+148 0 obj
+<<
+/Ascent 750
+/AvgWidth 521
+/CapHeight 750
+/Descent -250
+/Flags 32
+/FontBBox [-503 -250 1240 750]
+/FontFile2 198 0 R
+/FontName /BCDGEE+Calibri
+/FontWeight 400
+/ItalicAngle 0
+/MaxWidth 1743
+/StemV 52
+/Type /FontDescriptor
+/XHeight 250
+>>
+endobj
+149 0 obj
+<<
+/BaseFont /BCDHEE+Calibri
+/CIDSystemInfo 199 0 R
+/CIDToGIDMap /Identity
+/DW 1000
+/FontDescriptor 200 0 R
+/Subtype /CIDFontType2
+/Type /Font
+/W [0 [507]
+ 3 [226]
+ 28 [488]
+ 38 [459 631]
+ 47 [252]
+60 [520]
+ 62 [420]
+ 69 [646]
+ 75 [662]
+ 87 [517]
+90 [543]
+ 94 [459]
+ 100 [487]
+ 104 [642]
+ 115 [567 890]
+127 [468]
+ 258 [479]
+ 268 [479]
+ 271 [525 423 423]
+ 282 [525]
+286 [498]
+ 295 [498 305]
+ 336 [471]
+ 346 [525]
+ 349 [230]
+361 [239]
+ 364 [455]
+ 367 [230]
+ 371 [248]
+ 373 [799 525 525]
+381 [527]
+ 383 [527]
+ 393 [525]
+ 396 [349]
+ 400 [391 391]
+410 [335]
+ 437 [525]
+ 448 [452 715]
+ 455 [453]
+ 460 [395]
+463 [395]
+ 853 [250 268 268 252]
+ 863 [418]
+ 867 [418]
+ 882 [306]
+884 [498]
+ 894 [303 303 307 307]
+ 913 [498]
+ 1004 [507 507 507 507 507 507 507 507 507 507]
+]
+>>
+endobj
+150 0 obj
+<<
+/Length 585
+/Filter /FlateDecode
+>>
+stream
+xUˮ0^. EH R}iWUD}7P %щg̜avz`ᗾ-v`纩z{kҲM V}ע B|{=46XYކ^6U{s_پn.{vtu6Aʞ]EZrpu>,;$adʶ(m_4{Rݓft.=Y+g͹dX=J 3C?>(G9tD*2BQ bh$%Vt J7wZdP!%!-@ BpEB!^G@^?!Dtzx{f3g}`;Q 퀨BEz 4Y@l 07H5/(Ƨ>+$j85OIHϋS<dwFŀ' XO1Sd]|9B)3A/EzbL
+W(AgT#bG\Z]VtR̆FYvI2"5+c-ٛ3_f*z\R9ǝ9B.b[7n?
+endstream
+endobj
+151 0 obj
+<<
+/Ascent 905
+/AvgWidth 441
+/CapHeight 728
+/Descent -210
+/Flags 32
+/FontBBox [-665 -210 2000 728]
+/FontName /ArialMT
+/FontWeight 400
+/ItalicAngle 0
+/Leading 33
+/MaxWidth 2665
+/StemV 44
+/Type /FontDescriptor
+/XHeight 250
+>>
+endobj
+152 0 obj
+<<
+/BaseFont /BCDIEE+Wingdings-Regular
+/CIDSystemInfo 201 0 R
+/CIDToGIDMap /Identity
+/DW 1000
+/FontDescriptor 202 0 R
+/Subtype /CIDFontType2
+/Type /Font
+/W [0 [500]
+ 131 [458]
+]
+>>
+endobj
+153 0 obj
+<<
+/Length 226
+/Filter /FlateDecode
+>>
+stream
+x]Mj0 >̔B!M{
+ gKԑO9VNԩmڻrD%T]qIua;!{uqFJP z1`ΉvEsOalpDc MJYQHSh^燶-=s{Pve<e%H ok!f*oF
+endstream
+endobj
+154 0 obj
+<<
+/Ascent 891
+/AvgWidth 401
+/CapHeight 693
+/Descent -216
+/Flags 32
+/FontBBox [-568 -216 2046 693]
+/FontName /TimesNewRomanPSMT
+/FontWeight 400
+/ItalicAngle 0
+/Leading 42
+/MaxWidth 2614
+/StemV 40
+/Type /FontDescriptor
+/XHeight 250
+>>
+endobj
+155 0 obj
+<<
+/ListNumbering /Decimal
+/O /List
+>>
+endobj
+156 0 obj
+<<
+/K [106 0 R]
+/P 67 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+157 0 obj
+<<
+/K [107 0 R]
+/P 67 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+158 0 obj
+<<
+/K [108 0 R]
+/P 67 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+159 0 obj
+<<
+/K [109 0 R]
+/P 67 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+160 0 obj
+<<
+/K [110 0 R]
+/P 67 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+161 0 obj
+<<
+/K [111 0 R]
+/P 67 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+162 0 obj
+<<
+/K [112 0 R]
+/P 67 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+163 0 obj
+<<
+/K [183 0 R]
+/P 67 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+164 0 obj
+<<
+/K [117 0 R]
+/P 67 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+165 0 obj
+<<
+/K [118 0 R]
+/P 67 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+166 0 obj
+<<
+/K [119 0 R]
+/P 67 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+167 0 obj
+<<
+/K [120 0 R]
+/P 67 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+168 0 obj
+<<
+/K [121 0 R]
+/P 67 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+169 0 obj
+<<
+/K [122 0 R]
+/P 67 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+170 0 obj
+<<
+/K [123 0 R]
+/P 67 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+171 0 obj
+<<
+/K [124 0 R]
+/P 67 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+172 0 obj
+<<
+/K [125 0 R]
+/P 67 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+173 0 obj
+<<
+/ListNumbering /Decimal
+/O /List
+>>
+endobj
+174 0 obj
+<<
+/K [126 0 R]
+/P 72 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+175 0 obj
+<<
+/K [187 0 R]
+/P 72 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+176 0 obj
+<<
+/ListNumbering /Decimal
+/O /List
+>>
+endobj
+177 0 obj
+<<
+/K [138 0 R]
+/P 81 0 R
+/Pg 15 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+178 0 obj
+<<
+/K [139 0 R]
+/P 81 0 R
+/Pg 15 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+179 0 obj
+<<
+/K [140 0 R]
+/P 81 0 R
+/Pg 15 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+180 0 obj
+<<
+/ListNumbering /Decimal
+/O /List
+>>
+endobj
+181 0 obj
+<<
+/K [141 0 R]
+/P 89 0 R
+/Pg 15 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+182 0 obj
+<<
+/K [142 0 R]
+/P 89 0 R
+/Pg 15 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+183 0 obj
+<<
+/K [113 0 R 203 0 R]
+/P 163 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+184 0 obj
+<<
+/K [114 0 R]
+/P 203 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+185 0 obj
+<<
+/K [115 0 R]
+/P 203 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+186 0 obj
+<<
+/K [116 0 R]
+/P 203 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+187 0 obj
+<<
+/K [127 0 R 204 0 R]
+/P 175 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+188 0 obj
+<<
+/K [128 0 R 205 0 R]
+/P 206 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+189 0 obj
+<<
+/K [129 0 R 207 0 R]
+/P 208 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+190 0 obj
+<<
+/K [130 0 R 209 0 R]
+/P 210 0 R
+/Pg 14 0 R
+/S /LBody
+/Type /StructElem
+>>
+endobj
+191 0 obj
+<<
+/K [136 0 R]
+/P 209 0 R
+/Pg 15 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+192 0 obj
+<<
+/K [137 0 R]
+/P 209 0 R
+/Pg 15 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+193 0 obj
+<<
+/Length 10
+/BBox [0.0 0.0 100.0 100.0]
+/Resources <<
+>>
+/Subtype /Form
+/Type /XObject
+>>
+stream
+% DSBlank
+
+endstream
+endobj
+194 0 obj
+<<
+/Length 308
+/BBox [1.0 1.0 102.007 48.3506]
+/Filter /FlateDecode
+/Resources <<
+/ColorSpace <<
+/CS0 [/ICCBased 211 0 R]
+>>
+/Font <<
+/C0_0 212 0 R
+/T1_0 11 0 R
+>>
+/ProcSet [/PDF /Text /ImageC]
+/XObject <<
+/Im0 213 0 R
+>>
+>>
+/Subtype /Form
+/Type /XObject
+>>
+stream
+HdQ[K0~ϯ8osri> /x *խ뺉_o:.B Hr4rڒ͏fkݕmQ6|m4Dz:Cz7@dlؽ5ӂk@,WV2\_*do5^L^rE+<}e~BB3z m-8[vUWEWW%w78KSm+C8Ifm<
+9Ƈ$tNPG\!?
+endstream
+endobj
+195 0 obj
+<<
+/Ordering (Identity)
+/Registry (Adobe)
+/Supplement 0
+>>
+endobj
+196 0 obj
+<<
+/Ascent 750
+/AvgWidth 536
+/CapHeight 750
+/Descent -250
+/Flags 32
+/FontBBox [-519 -250 1263 750]
+/FontFile2 197 0 R
+/FontName /BCDEEE+Calibri-Bold
+/FontWeight 700
+/ItalicAngle 0
+/MaxWidth 1781
+/StemV 53
+/Type /FontDescriptor
+/XHeight 250
+>>
+endobj
+197 0 obj
+<<
+/Length 51744
+/Filter /FlateDecode
+/Length1 133000
+>>
+stream
+x \T> fx000 /QPaD@M >KTQ4+er51-nyǽeIYi Y37`kZ{} 
+Fg7> ׿-,JGAu_N8K' _{6; CpJ7Zb0s3\[T~Мf[0l'UbTW*Gߪe
+FZ_gg }㩶Sz_k}.* =ro_xT^[Ҩ3YvlSVi^<"mg Q8Oǹzf_l6(-Ex
+c0^("%(wYĖhvagxiz
+z `; :W%#ϰh,m)y_ H@ ":clxG^O)l,L{wo *={Dj=;Ez>X;-9$m4%Bu ՉZZZ:X[.17BxR)b L_8R7@%cPkPNE-G:RzhmP,},
+;]`3
+M-,z͠΃a)["= 3hb8}S`x \1t(r&,c/&aJƳq1\ H a~$  H@$  H@g?ge9S|xY93  H@$  H@#H@r&a#H@$  H@$  H@z924*A1֡CjGFZZxއh H@$  H@$  H@$  H@.'$ >$%cx?:5d$ @ 0 ƀ΅0fB3,`d
+rX)+cwr%&vzsdn2/6Lo,_a,_ ll}/~?lly>\-&xozӠQRx}_ ~yPV}uɯUiNӫ?5#lxԳKsyBV)]JVH;hCFJ^0 f
+,g ezLly]ĖkulgKl3BV"6BRJ*)H
+ԒFJ:P؉S_$ ;9 }s.~-~#jopZ+
+ʍ<cXƝr$|c1hlȦIds6.H10xܖ幤nVK}
+Y-X[ԺՖnKJnW`Q Ϥz S\`dEޤu%7%V:ij_:qG0>px]U:ܶe;[rR# .\f+uS:y;Pi)e6Vޑ%̒+ߛx+SƱA,Fbgu$Ghz3F[tdGd.+>-1USm ~oIE/9`zGdJ_ ckpYLu,ƓZnIn]<-AKV.ֶy,I&},7&wƆS }NdsKK
+ ]`! P!xN̆;PD;LC]z
+Ro%ńË́RPB(& )G";EQ<p'^TQńZ4jh9Q*pB%aPN(#$hfB"DH 8B,!Mr܁@qԟqBcGQU[QOP?Ec\P_A}A} EP>چW PW_/#\B1EIaANFh$L%4 S   u\8PKl꾄,B&!NH#X 6) AA"A 0#q/ҋډ-Կ@} Կ蝨WW+-6p.\t2feUD2#eLyIRś:KEś95fgmgGňi 5@m{6GX+oh"\fI͚ 6wJ g3!{>3~^[秤Wp~*;Vs6m=o޼6{fb5-uTu~4n z=#:7B
+)9U
+_wp[d,,~,
+\Љ{@
+Zvq</\r#;tn1ͰRX b,c:XzX7pup3mp;;0wݰWw-r)/G`3>a? , ->Vm[ ׌\'`r'. OӸ{pemϟٓ^x^/W>k. Ͻ7p[6Op>.| г=ɏ|ޗK[8ug,1NS|nWvyչ_3_-+P<1~ דxzo5GV?~GUPw/K<U#{Փ[t¿PdgãO.Euxٻ?a4WJ|w? G[<O-G0wTˏ qnSJ:_0D<:iUb
+3-352 JuJpZ`Y,1# YKVUb Ka(flWD"f2c:~?+DK_b˲e
+s aJ=B$l-ce0"!ŕ9`b2h*yKǽY(ō >F% A0
+΁ݠcw^^VVW4f0W .G$K?*0DJ?x/
+/
+ڳs! kDR)d/Z[,˷ZCٖ_пX5 bR,<eXޑ",IX`щAAbIge)HSHAJQJ+(8H~UF&#;SNr\nBWqrN#(J7E҅!xU!Dݧh::5.>1#=.=d )/iBHK GOjuD(FmIVda5?u:L hYզ%X,&.
+,1aNbJJJ¢  )'ŵXI1s]w/;y%s s yYEk&&BDKZПBE,bԪUF +4is;J~Q-y+ 6ojJH1#$\#)XK QD.lZM@()3m%w 7 tL'#G )EFcF7΅J;cA0PzJ֌Q7Z̏M5) qIq8k2H?ҐdڱGȄ0mJ K/
+KMϊgѧ#2ĭ1IdhǷޯ$‚w쵴<@ k$v\%FjcwˎlG8\%6c;gԥFmVPpouPI+*Q%ˮz1?`̨V:$86|zŨ%,1ܮSkذ蔤K>qZKY/)c@\'[<N1jKknr q1:Nܓ>}BFY6cۘN'zPIggldv{Xaݮ@Hlg/K€ɁL2ɩC;.J7I:8DP`:s5<ܹ3
+ީooAY1W0$`]QUɷ)xƥ mdž#Ϝcw|{m2V*ON2dC=2("e-Fk4QqG_urt5>+nCK2fsɸ՟Z!,d7L\kZI֫JH/S؛=,t8[oB,c،1rHc#v>ϯ#uS0&^140'EDNcJ73!|57QfV7u!qvF M-DPsg 4g [XgZXL^ܚ&s8 2mlZozA(,I[r޼m1i7JgTI,R\)]0禥'jb;bWDi [ѱ}^C+xG j jCJZcGTp:F!бDu8y03~yg*y`&6<[caq|{FA+OA6͡egGj[LL\0m[JVH)jbv
+21:_ /7/h{!O/<CNz,|d4q!GRy&!;5%;^+t^+%f''g' mf-X.1c@j1-mp3
+ov/+Cd}RBChS`JDZdElӀ<aVadF-Y)FƖ,F?|SL<d 3)qM#LyzxMbtv&K^fzlEт$i-N?}5?#%tkEm-% I-&,Xfd5݇j:]g֙YS3&raZU(x
+0{HHp|ט?" j=4oK }7b\ϖ<
+ݞjSVU;C-Uk?uTa I2\)rOgt s-2|}{dqI%.^ >܅Gg`H2*ZK[ׇ6Yȏd[|oʖS߅$y$]Ԋ9'6'j.lϮtQ ^j u6v?vUtS\}4Ó;}.2Mo3dw /dC׷ԭG`apx‘T?I)5=.g7cjI&ӂm
+o(oMZd*퓛F81_WuZ{Ujy˫}/J%y.o`;@a 63g"b cOhҁl!t_2!Vi},K6Izf(>U\w=?9` ;БdiGnC%oUP寴tk;Od&2f'R2#>4u4?8ݼ`ܗ-Dy-FEO0:uο ) .g w1N\xF(4|Vm[ 4cL\+8V&Ae%ag ͬFsua W1T,NEdž֞;ִi$4Bl+mٹ;1 Mק ٶsp }pw61:Pg<k_䣓ު\FȘ&Γ+~@ѯW;ZFD 7+E *!5,0w :>}QO=9DJGo`8[w$5c[ S0ͿK|0 2;8XZCcI0 Y,^si G_?҉!Tޱim?&Ҿ/܋u*f@3jE֜4J1H[,ƀݹ^q tN3XE㋤.0ICT/YCAz *[/9Ų H.fx^?&TW+V$&*lOE~@=c)f&i35!5cYx%NSP\K{I*,z<u
+]niN}ŁPLd$ z f,zY
+2}\YM#46L]%ic]a6_Դ#I9?}H5volwo{I*yLƪn8$ςUGbz֮WNem)gЕ9ʴ/#WY|SX*Q
+?/s
+,a[X 3}oI1Ol6G5*ĊjƊO7S؊, `*a |QT~Z)s F;>pyln֢d}:Z7A
+ç;QB".Tz@G-53hخ3ֳ+bj܉Q=W5k)E#kUw غMCVuM>ON|GLJ^hͫ =U d?8>Gy˴4=ړ%٢ >v:QCs)vJؓQf-O?*$xP6j(] *#zOb<UVD 5ep5p\"wMgNu3zֿoœ1+Z"U:dȦë"Z.i:O(i3 :w'`4$^;k3 d7夕)e6G.
+ߝAe
+޴oU3 ӭ,0X*@NU|q.!]mU[]OS쉩l16 ]IIVmwIv8"qb_|_ݘuM,e {d`3\k<)z]N{ Sr "Gaou< Xzv=S]+._Om tdӖѬV% D6uxZ:_Ě._뎏FV'X1> 1Gҭ\ۏ߳:,*g|z4:|Ɂ9g`:HtFkj1M l/l`Gl'i`>6mF ˱&B`]U&%;7nKd"2 I;rJNAD.A #^z OSչ8h]Ou~`;cIx`YۚDJi3mF9[Z?} ]1<>6YÃTL h#_*sjs9IO*
+͉1IXf3
+tȢgђHrRKS"}Z V:U''7N
+KA(n]mE;A-װ&mBJS }j+ֹu(
+/ {[w=)M Mk#69+nO@g@cvF^gs[\V?VL9%X> ZDV#N=t㦎,r*+c} Ill P(ө\\ S- "]eSV&Q ʊ:[M]aMSxAaH `MNYwH6]Kt͍P)=Q/.W™U0+FԼϯn>s'M~9v{%6$#|ۄpH{0'E8AZ!6d|eCJϑZ U&
+ ;/wV 5-VjDR[>~SxxMV@10޼o#}?*=IC,lm k_|D^ɷ7 pJAZHY#'dwf_ n3ro"MnSf_t!zWoy$8MxH}IKn`B}U5N%P*U'Ȏߒ[|&5O[vdj0ˤѥWF6w'^>![
+.'{oLB %%B"Oέ_
+rXc؏|܇܋95`O#r 1G'ۓ#qPï稃C[^HVhmFRdiy{ oZ.̠擒J8NVQ3 mw@4 bQkmڶ.;=1U~9ҪUb%!h=;5jOx9[JbuzVK>5tǢ\5L|to Ŝ)匘k;z&tT*jYWíuV7me9W$0mF `D[diOUmʞY(v{R;D hG!'SB`IN%*m!
+EV;BnH
+pZ>8}Wkǝoߴ165`Pv˩֩*Ak*z79l>V<ZA!cӌu䙶^Q\6
+ٔNnvR) Kћ&uD0[nkdu6F˘Q$(N}b$q:ȣApFJ#ϸEVD?A0qT?8XSpܦ |~CK&o8T$mn 3“@L药pэ*w 5 3y`U]ϲ~=ՁMu{xWWÿewiթO9Fh`ovD-m-JԤ-x2
+J q|=|zm)RBz
+aoT* \sf6J6_o[v5b\bZLdVƎAEm\@:ܺHT)k?[o?Sj
+]k~luZ*as,
+Gƒk 5c"B2Y*
+JW'b
+t6#j~=O%wA{)0e-ctTl;jk5`r_5܊
+
+I~]
+Φ395bNɍ.-`7;B%!O"""E۰nqq
+֮.B"JǐaxCas|?~w;cX.~t\W3IiIP_ga67jl
+6v"?Qh(,SS ?$
+g<gKőBSz\-~,%44PoĦ5NAߴ3۷>)Z34vR32;9d#]c+"@oXpƘ/a[gWC>g,Xy,T+0B=FDZ'*R)k#0:Yð[d7dо|xr
+s e0?;*
+̇=F\ѴypOysb[Ahk,@iy(U/ Г$] R
+M<omʃv`Se,EE7`
+SZÁTH$.%0M6,kB  VV"i,蕏5bY($P hLB&_׎Y2 xy
+5'! F
+]ipw|F؀=v. csX'~Tz/? w@>hojFP/M
+n}-㾺YtW`jS
+&L'UB<?$^\`QT/āeV X3FS(7vQd4>h
+)+ٲ^tZ{qC~bJ(B\Fpy604y\KWp%vKMF'hvopq'ۙ4?WX4Bƚm-gt<v߫:j[{wb1?ÚG8PlF{yz*}/Ŷ3GWƚ>63ϹDT&P^F[m>A^XS06ִמ[|&%NhT)xLhJ9 <^{6bvF>PWqb ,3m|pfe?K<Kh+|Z_"/\yƂe"U)\$H{UO4LvE(TΤ-Y"3sJG9(9Nm5i(Q742RHZ,d4m Y`X8Urf~Y؛z]c |7.**#a7ml/D{lЇm~=MJZ_jmJ$j2\D!.pbυ-H/YbX9'NY8⯀/Ee~SA^ari41 <{,SO>HXަ㏆G-<O-AQtmQfkSC{H$ط`̗t  Eb;Rq,QhI{X+eFIBa1d>٧ {Kibr"{}YY>ݻ\!zriUQk$A4 JS^7
+&~$$# q6,6luy7 o70
+`kcjXJOU/Z?-į+t`W}dLXdփkC֊F}cdaok6 MW=!5FmoA3W']}^]{t2ȍt hN9 )G3xؘ_a2')s$?/g7y5/&Q-(k:w\ N՘U}"ktN6,R}/tvs&o1cROl범`R[q
+N8D|>ĘܡOy}1A}zާ̴M8)\&S{&_6m~V<PRbv~^~5:b@˔WEwD1M)6yuWx]ifE5}/_-;45ͮ$#3*N2vn>Nm3 WR9WT"L9a+[vXY
+) ߟNQserQRRb]oEVvp23Qp%,l #ѥ$e m~W_
+G} RamvIMj8jyc#l2**ա7dL"/;`_y2(¢3@5JǞf=/ksT
+ ?]@3u,H.+G*ۯiV W o.$l67_rPd(l=reIYҡq
+ct%ЂΔYFNfG8u>iս69b>9x!*CN.C#>wR{8-P8ǩd_qMKᴎ^
+j_д~㔊QMڷ" r
+Qt:h<>x/[_}ZbK8N0eS+cA\Dia'`b#N]5mcJ--Sh _3*RTIq'#l3~AX3O( HLO '.ы_!1%b)&Xԛuҹ#ő֑BCrOs[׈`Nɾ[Ƭ>S7lS-/sm8FnG'"`+O+IeH k|8Q_
+*3
+e]*T#B?/ ;
+<bߟ mhAjN+aغl쎘WErFZH$mY{:OCkHi; *TWz4VK9jgoFWE2V.̂'XF4Z1h_ſUr<Y9[yMnyR.M%ђĨQ-7h w\Q8>6xxN r{̃j~еFȺXvU_}OWÑVm.
+p]$Bͣib6VhhNٞ+w,_V>:^n_,U-< G,yOFc||ڊnΪ }X{b
+_{e1W!yO \+kN
+QZ _8\Wʆ8Rՠ1'G6S>c6K<m72ŨCWgښV7wyXG l{IdܤFu Z+=)w®BoeǦn[m:*8a (EoY`l^^nvUրpturdi_oٵ( ,+LA։!K+2K KaMkQ([-?4.:"->-hbu_[%ߠyhZNgTwhq
+`Î$q\156W~uó댝iOHu:5<uꌭG] ]֗]Չ_'}]>߽&޴eZF-䢎FevXe9c]KvTmajj]HxT0mW"89P+
+JQ?Xg΂2[NG@ո0.~E`P CdGiٱ,/02U(yyGid >}w>MB&i(f擋Ң$9aň'Bm gҋ^t2T+lRm3<魀i
+h~Ƶ ^
+"s_eǶt\l'$ \L$925bOTdv'l-$oN,J%&ʼnun k<~lwY{ȰeiGUv۱=f3ooSZ
+%UIv`!Tog3e*3*qr^Fnn/V͍JSzw&i)7.+*b#?q&8czKt\r۬%loi6ezX ߃ 5id@*_>Ťd] fA2ګ,W-sFp׫q@j7[ܷCMѢ#]7vK2\e넦.k~4Hoi`{e_۸le-9ɬ[eu/[ww u;ɘ9|i_)ْgxt)1ym!j?'sjk{g؉;5Xiм8!bpwÇ/~Wߵ*Z~
+x#$ YںY,?[pvN 0^YlO!_hDQ^u J/g|Ixh(\fܤ ulVdķN)I.79(AqLUᘶ`~a%C=|ZSuBGnw5qyf[Eh&T
+5C-7HƟ0K]퉡궢TX:d_z}u\_q4*lY,^.eB mB\|oXE;: sK+;.rеZ&9#7VyzvMttޖ5%ݱuiV!*/Zls޲нkq)k9-dM,%lHρ%u 0wP4ks&d+y"oԱ<{ 3 ćd̡LPNX[҇H/j
+ ѮXsD?1Uwπrs,<:4r.}P&f
+XnAX[˙s 43˯%onP~bCZhG`΄&Z6tzm-oCyǿ=-w<3:_Dm&yy<xr}A[
+fe#gKg4D+3Xͼ
+?y@
+є+ҜhkE8!1x20]|96Y;&U/p{ըn]'"RӯOrI1T(2 m+w~ducj]~+
+!+ϧF[DsfȖջ捻}_thD/*
+ʌk+S3 I xwd%t ҖjƠd(Giuƛ{*n/hK&^dj͙)StPՉ9 giWUh>l?։jpa7=Y6`7N|y^
+(NG@ޜTM! J*n׺C=>n ,
+K2f-{,M!N4N׎cY3,Xc dzj*F5>%]';
+8DE@
+Tž.(> 9J P,F>C$Rsi2;KD"#5om] ,@lnM[> WRbv?l)9nYbn@_w;@6ᮦC. [XΡwS{h=ot%=hWۢA?oC%Zt}v8Fh%}c1 HMs|>n#[ns-3xzI/ƽ\j\z:6]{`pw>QWd]v֮(GkYCSOr;a&x"?/H/9IrW8I$_~Y;7$`Q)$7X(k
+sPU%OۗIQ9[UuuUwW/Ll 3 3# "kHr㻆h\eP4h>͋7k_јD<{Nu0H;hW>;o;մ`4z߄yFڳW".,1#}.""N?m(脗ymdu乑^}VW;ώ߾d/TS{n/\y˲xowwỶd"rܙX ώWu.ؑtT{f:;=)Xp4:Zj#5Do=9dq,O->f9Kn*=7?ugo4.rG'}{yev {7c[\5eCuVfh/C\$Qz!_߄!)`崇HJ ZjDnbk?A=WMbe[] l%`UHb{ jѫgٻ:ky^8}+栵ֶ/
+Xzh)6^ v vAmyߑ_Fw}>VgS^mnKdm!-jUrx{+wvmZ\mHgN/aMxa \:^65hdwM+v^7Ujejfmd@JD?Ԉ+dJhag5ʙۆ;ΫH*3OT
+{Ҋn ^tHwb9/Rw
+\1\0q1 dFNl`o`W%.KN&%et11'4zay. 2 ̤?{pR󑇶RM8kkmV39_]t$kԪIEzg#c{>Y;rG
+[iduF*a9m-E`.cRMȍ߂-2%s r 4g>ϞL<ţ7fsU_u%B>B,F+O].<>%q9fHObI%֚#v8┰(jR
+f"P[X7p B6#!<눥rDSOW1Uu@3祉OͺWV+P5E6}kco{zP!ҙt4sw;*Buӽ?{҄=7{V{PZb@
+b)=>(
+!Ϧ|ɡɔASpWb}& 6J
+,-Xpt"$٬k"]˘lQߠ~#3R28~3?p-wN"JQYS PQ > R@-j
+T @)G3<%}D~. p^NmLf@Y9"(\O;Xm5#wS eeRḄSzS3& Ã ƃ6 J6a5$l9Ou^:0s ̈́\b1[uVVH}םź>X|{Pkn75cA^ yOse^L_yTjSN4q%;C^!ڕ-f>؟)m-$ŴuOh6r:{ސJ!;]`(MsV
+t8)VsuNR+ `%xig8f4)=Rъ[A׷DzJSk5Gxf*/5<B-<2}]Oڿqn?#$>c7[:Z1&?j<K)'?|yrU .t:b+P̙v\34~mjkfax,jc)#7Y#X
+IԚ<b"r7 }HSD('C6>+qxoGA3s S`bYs p_bƾ}vYXp|{>1h=r{fiag+EΈ.tW|ĪKb*-Je 3CW_If%EM!qCDSwq~R8sĊW^x_9bXJ8n`qz5N>+ȵz cR: {cD'aDɣ
+~鴶<$kCͪ8wS7|8H>rޢM}N+/=h4ZWت۵,[zks2%=\>/[3 f֖Gꌕ8Q^I~h`Ra~]kz10Q5}PE ^;hV!y@S
+pۃnUjv&cMc;ϋPNTQQ◽yF ]m^cF[2sf+5ƟsE_60n5j@-^1p&
+H{1bj[r$'CzQ#/2 G_(q/~u|Vno)֍~@կuytgz}ݼʚ{RZ艻AcV{Q=_ܚG|)=調s>Jii$
+/LVqn520Zg>D<v50֫5UUM`P׼A1w"g'S`=] Fr'w ҧnD 8K8Fb}|͕W0#ƫ?|2oI2YFQ}3`盜h:zV=!(˛70+, )3/;\Q(L3V?LIDoҞ;vGz[[w87$JY˛Ƌ]0za`~tn<o5#AݍZBzuʁZ,JK5@[J^7F*ҒER*G-o9V|5kp1YK,S]Khb+HeF Kqbq9q5qy_kWlnpupvp63ͫg
+}WovyrshӖ[zٿ3wecbq1lVw)CjwR݋.۹E^&ϥ%5˝oxRB>Q&hU5gy<s8<t#_
+{l>?~= kOr 
+Y #J(o$bk x4.Dnd
+Ы\Р7᯽\R |z xB]]mJT&,r`w1u jDl x85b'&,.IF$EN<[^AW|Q7gU YO$cB҂TȲ[VT#qyqמ"/,eūgVf^+ GF7>'
+O&u֬f>UlG?yp`o|/<Oc^pc I$"]@FtDmς̉cy
+OT QM/Si+ϪߗkD?B
+$ MgݾyՃ ,]K+e܍n7T_%|noY \B#2,aE ~J ,Z6O
+*J5TXr <o1%\Y();ė[ yJy4+[` 8Tze5"JWZU*7\kT*C`G~Py 1A
+@;Ws"y:um\{=ռI\@Fz3xl'Դp{"`᛬eR1bDW&ыlYPfUs'). e{I5Iޜ.xh!YcK6$?@oyzH AFâOÑt!2I1&
+ch4U#FfaOL*<0?X)D8PĻѝp;HA_ q;|~Š1t)D 9lbb΅y"IN){Dfkf&bТ)HX.ZQ`PE]c${h ~FKi#hńqA ǣ5{mߊa4 F ccV qx1Ā_"6/jM/K 3="ڪ`6܊Ϗ{? G33,#Uj]VO<VoW
+XZqm4
+ŶA^h|e0zSc<&\[O2xˁRlsJ$(jO9)S*ۡzvѬ2xѵnč2.dc18h'D|/k#s/pH3e93śX
+a#b^2akGʼn'mʀ{LƇ1<$?4ےߒ^Lfx+"Bx_\T-?)hMt1OEfR\((f͜&vOx޶Fm3J
+:w{ޤ|v'p3*5eu ݴc+/2kE@RA^QG4#4̄PcєggY{|ᨫk5X5{125;w3[Źlɪv^e65bx S{aHՇE,fJ;xb֭bХCtZ{052|Wf6DBYf:W 4KQUY>Gvp^CU]HCsHq'Ѹ#ʃͣqn59P|{wsޚYgkXӟhPFg̕k
+p`QԻQ*ϵ}&`34Ӹe zV5ow]鲀#3]v|d7N$W rw-޼:ɻ)dAGi7pm/s%)thtY)K`2HJ-&B8˙8ꠍ>{v/C#"A qN$w&!IRhle4F :o50Dq0-%ִړVjᬻopqJPݕŪWۿt \?(9#1;Nc\,ML(o4.Cϯ-UEx(,
+B"]C]]kP9M?6#hMϼ~5YO*f g`t$ol\nw4+frI S
+BB7i-S#tpziZVk']sI)`>c ./ؓ_iew:FWUe B{v.4kHFb:;F蔂)5Чg'B˪s.,xߊLQ14M35v*s:%]}E fWJ#8f$Pι w%N
+B< C:::φΦIt l~ IVh?-Ho/0jdBM{U+}2Y:,GJ) Ȇй^CY؜nU nݲ9sKBI]|Ggl%{UΜ_Rk2/4D)(a3 0:L3ݬݶfݶmftڌ|7ʲ&&Ιy3 y~};qjnd(}i)f%O>1wIg?K2 .V&.yԣl$L,c"a@KM0Y3v攱?wQٜ>aTq?Np8qԤcGJTϞ0-wȷS<Ӧ7O&CHv%~̈́_6DQw.arˈrTyT鈊ZȢMDwsf_u6*5o&ƜM""ӎIBqEbVa0ȨyBcrbSN LI,cbiYN3Q9tsX9q'O˄'e|{1IL:&.LVH:kY;kgTs3eS?arQYst2hk#91,37R,ߓ$??k+g]r>-Toꗖ\ #ig]sHޜ?z9;g\.3yH d3 syN2ĈDܺc7rgY ![v^y^<E=zS/>Wl90֍6u/y-d璝 [liһn_}Y _Zk+[|DQb(S2dZIjI /xtBeƲ}R>|uV8Vt\rcCn⁊*vVx⭊qח I* *|
+|e{ʷ*߭<XY7c6jYr#o͋K\PnG}tjHŻWO^]5A*!5-\{M%.q˿̋K\%.qK\24؞AUKu$;suĵqK\%.qK\q˿p5KqGG7k@l 'V_j \qBR[wR[mP%Hm-wWR[ljۤ^-[Om)A'XS[9^{Z9R[)Jm;|VrF=R[#R[3R[-0Km-7F/ef 3Ε&pFNCqJpfm3k3Y gf86Ùάpfm3k3Yڦxf8?̉\:gҸLsn8O5XZOqR0y "WsAs 7݉&.*(6tsM%rtGZ5?>iµbf 7i^LCkEk>D[/]^-Fl= F)Ǹ9=[~fȨ0G'y*]16
+W= N.JkE:1u9zQ?|Vqe(Pow;~pc{RHڱjBCU6(_7k$9^KƩF#$)A%M}bXiV.+_w/YHݕ R [ff ɄZ)sUuXk!Xy0c8z%|*2jqGFzz=)ќNQ Mzx2 程ƚd? FZDo=/X6Dd9BP7/8`OB?ONNn5rσtTgE֟8C'NbH\l=vH&̲.O;5X2U8$ʼҼ-Yᣖ R!N-Ir.&C54Hl0j cY+6 1]#h湟P#Q{DfȄ"іW˵!sdY痲"v)^f0-.o괋V7YWE퐣<<b!
+?F#>$T%`'bN$Oord@qrP>Y䩛2C9Ř<v$qn_ Y;63;D#rv zRkALO/B݈^ZG'}HVzޙW]Oꓓmn0=dV(^)2Q2C1w޹%IU7z|:dfu2|5 gBҰueiIT#`<*\;vΐ;ٚt:@?LGCucqݱxS$?vYySD$œ`=
+7^)t^F,}GO9S\^~XDS nn;%:o/5t; M<=##gSC,NZ}ґW\ݒU7W{蓂{߲]{(k'dN~b#Ofr!~LVs2-.餪2JRx"6ȼK'j ϼ=itc?G4O WNN+1gGG1N|RK}fωjЫVXUI~|O@ R/Xt?Yl1^NR:R1U3+h.FcE4?FCXqLG)ދЯ5.ia}tk܅t+ѕTrUZG
+I{ l"\Ş!
+3YZq1P
+莲e+|i6 >b??"vIfSf3]%XWFϦ>3kygXdWR!1"B^eS 5QrK0[NOb\K=-Y%̈E*zCP%䢽?K"ؕwfKiU*_C+=+"R,Kwhe ɣˬQc ۏ69"ϯ"}<.l ,4閴Lq}!1M=]S
++L1廪7]bW=CtMrH4[fȯd׊vXѥZ_ }kA<n#J;bA_} K:]1Tnt-.誫r9.at~
+ݞ`J
+v BK]-Vܞ&U!K [4Õ^'
+QA!Zhx| b-u~#$b` p |b/_X审F!Wc׻RDAm);| QNm#AF,]D
+A]UJNIF5!xߑ zG(\L7@jݎ#Ȗ$ Fc2&!`(v7(Z@Hrc
+Ɋ|@>yP(CK%rH4JHpHp8
+X
+墯
+K@b-{A >N<C쬦=@&hX&UfP"8Z2nRiy&DdR䷋⯇CZJX' A)Ka*HݬTFxlH#!Mh/qQN(e,H~o>Kq C ʰh2E
+֒35Gd`F"Ϗ@oˊ+KbAXRZ ך+N.CzXQP_\ĊJ8O.& KJeebqXEKŸg{"PRU`-#ʖ[Ks^\PXP^,yP-d(.KVY}.brkQ9"֕eمtڗS\RYZ$\/.̵bpe/.TNavd17{y+ZJ2ɺ|+~S^P\D).*/E7^G.((&٥eb'pbY8$"XB+ʬQ[rمUF.]b4h6р?xE/A#GWC?&щT Q
+M4s^
+_s|~c/rc"dכLd`;dd׏E֫SN!Oѣ^)7t?T<MC!.梔ZPnGh~íp/l7
+GF{n>ďq|?Kb~51~#[ =eokn~ %N#w|Bw)_+& KӄB"KPDX(B@V)\M&s/w _)z;Ê׊}7·O#>
+$ F06&\
+l6kf?9lzAl
+V \ l~ l~l6C`5l`3؜l*`6Jn61l͗~XܩP`c6`6mz`s;5y<lؼ
+`6A`ln66
+b",
+l~l6ہS`*lo+v>GN|!!|)$ `lV
+S3"`ج6F`s5l6W`)9&TJBaV8]pf!o3R`Sl&l
+5?)QLW+rxf l
+oE·ʵ_S6 G
+N+VJ{jh*9JZիqZփ#owkС`[tW3J{Dk_WW_wWWlpoy̨-Ŵ
+
+׵˻rb}jV8,&Z'0pd n`jusw?ݫSp:@1  Nٸ<L5gj-.y1S..xݥQ B;Y-pje¬[z4AKP5n&4t蕽^\P.j*xj3JaP!
+NM)ԃZӭT* (=Supݵ^A൪m۶RY-IHVbYtfn75ͽZ ?Tb![U$2‹-R p0,.j["L?ѡUZM|,'N`,;5|=T[DO㵆9kuQNQtI ']ը5rZc⳹!-FYZ#!E?:5R L&ՠ?nX$LDZzNm8J̄nAvEFhPkAF#K젥&Ӄb@[8'HS:FX%pR{$DO #H4#O#"et-lY'hEgl4@'Cj'n^كL[!
+0eNH?iy1R]aKޘ>:N@]>XQZaVSn!pH_IuIN8e^4֪֚
+%e^X)4eRՃ{\fHf36?B!V9h2I{,lQ-QўYf6yN EgPʌ3dіGz#7Bna쭛   iВElPX~pa)#!u{.}A'{DYYȩz!鄴҉([wIrun ~G::G/[ZN4K/ˏ~"OܥnRU5;1l1[enJZ4 3=M3o6hxxZtSHF:kXz7lD2'&HwaP`Pm%(Q::hAI2
+1i86oqy,5PT ;I L4f7 Q"f㳲<vم-=4R,ccdf28#ͦQrFqrK=htA/1]-20ߴf5P``F[ؠ M=׺JG 8;Y j[t+޾]{;` ==i⍭olݷiFZ z`$ajaIab;:۩o= Z;Ji֡J!7~Wwy葑i1-(͒VPL951JrІæt6Bs݀t wն t7[ qesh)%
+\ٍ
+Kk ~L(큁C4ehLLyڗVsA_/n22A{!<٠<
+TY
+{0O%15lݭBϙLpd<j!1iyt!>lΤ^ 6M ؓI0g*Teq6fNdƄFUlA!;Тg3)xӐ댼.qx`7<n"{*#E"!/}p {B)Eu'ŝrAy4 Ufs+Ҫl3($tIbPNȤF2)h"HTR/X !7iIFKZ
+%]4Z΄TetlkRZwV4YJzscV;t#b-4T芄HM-FVLlw'o-퇚ִ$AI њڤ&O-4pz5R;%+I;;`Jud1)I|{
+hG+Z&󦍲$AhMY:&ZƓ#~u/meF:׬/d[&nJg9ג17sUft-?XfȼaryqIit٬;ћYEkYt[2ζLaѣ2(KV,¼DzEswⷞvi߱y3گi}ãkZmybےok.jݕ7.x>}OoznYW{c/Vl_~v_Gi4~};{+Růڳ{/2/=XSfrSu杧zޣ~8{cxCKLދ~zFzuϘoU>z켥?}?vV`ʜ}в<7ޓS_m~<c|WOymW|~p xQY&
+e4lѢU
+aHLqܛr{_s=7ެny(t/;jr'O?>4v,xuuҴC)ƪܚ}Noc~Jٷ־忿'K'~;'eޑ*mWOkjʗwf<է|;噳_yiɳ]n=7]w)'/޻,Xe.>6_~ی%2y'[ɼ$ka]mE>>V$S7o&\niS(cĔ?o% 2r,jx,"2~R%kX 4Z2,iiV͢]KgON0vNm֦lkvܖ=kM?;eM7?<߱qϸ>{#ǔJ?xޯk{eIWޒsc|1ι|Ug)/,wlxHo^%~1񡹇/]恛>8pڮ9g'?rfU~l_޸W&~~=B=.a횹U~hW:xߙ8>]_gC5}=RWxg\tWo|3fVn&&r2jSrgՕl~:X7_}gGoSEYb?iXIW5zfl%-}#2j>kιUsfI9+sY̹isCJ`Qꭶߞq֎^Wz8b
+"]b$0ߵm%c%@{L \aJL r-B#1|4*x>JgMs&[)]}?G\+8nnd'YK7Pɾ˒[CY2HgedeYoIɖ.
+%=Cʽyuyrs^tkQ>oʴNcPj
+np)y]?6*@1*_ɬR3ѦgŅ?K&ZʶT02c*Y.JtQ k
+Cݭ44"u:O  3k!-PИm"S)vq+Ght峍5\Z Btȣ bǐq0±h2n+ي["p%fBj5́C/bs݄Nw O:~~]OSGvjݘ'zİsQ>wf p o9ui.n>~n^dˢ0 uYTt*>kTdml5 |{W\X <u@{nϤ_ji>Wɡ=Q<+ {XgւJ-9G]QEo*韗VOmHS\j>J
+杝ֿIhxBR"ֹk/`o4M*#`pH3cIr/IIWi 塌7XWijMw5rNi0Θ|F=^ĬF _0lx i"Ș
+Nǡ,#AY<czJl xS"eW AIt+T3bB|ښdSoII#_w=a0`āWBn!N]D(@f+|c}Hg~37B &>@O=ta.G%7#"?O=W*;)gR~4U
+i Y͚/zsܻ+GżxQ9*bzCh׋z2׫sUۣF]qn('ъӉuS5=w1*pBLIu^?˔(VAIm<#yK=Cs QA1.^E:m ß%o(8<Yo~pA
+ԃ+mGd= CfRUv?!TtzV\ 3&Utm/˃h+^9E9rXErIzp;ܿmz܆S V#g6&RxnX>ДДeB܊Ox-‚ZrH81\+ӓI'KYv*n#U+*R.J|7O9&tuƲC޵vqQ -~G8aD`rG=DL)yP9vGl (X( /? |8ohPA6P
+ٽnan4ә'0@Q u4&[|L 6kfv,=x?JFs+F*][3 C :("VحW0vU/,4`.`ʲc1j~i^~K V۳iYR*^٠w?n(:n $v?Ӽ^60a:2M|jd*_?9zHRF?6[ԉx
+mg
+ O/O'?M$gKJ
+fCҙS2UCZm>OaMJzN4k\u,(Saih6LriKgjqW Ejh{ހTnuLt5V_XZ0XSUbJn<1%1OK#>}2l%qUS։F%#S" #  d&f 9q(yGtOU|ma) u&V8;twQ_2%-LĪi8xǛ=D┲6[c6^cV7V8Y"cf/:LXS_R
+zJEckY~󈛢iTYr>&}lxz5VG)3L]pX@~~nPg4/ZЏ76=ku21\󳲙:߆n+>oABgOTl  hd9͡ 3R hIv_m+!:₹FjwEkPmϯhG/ _8J
+
+8B0LBa?=Cg'6S@d\?Е
+endstream
+endobj
+198 0 obj
+<<
+/Length 63774
+/Filter /FlateDecode
+/Length1 158956
+>>
+stream
+x}|TU{LʐI%d3ɐ
+UڗHBԁP_Gibk֢;hoORIOs͇$_
+TP5h9ZszBM hJݫ>}WZFVN^AQI?Lԍ0LYWTK h!&]$./D%< qX/1x^E^WtI6Ma&j
+7E"MQ&-(,ɐւL6.iS_2?x3pemg͍4j>;؍ߙ)D+0[L7U/mWF#֧7x+eY:;Bgǿzvx֮YΩ}Ƭڙ3jOZ>erY[2qBqcǜV4zy=9Nzʐكݫg4gR|=nM&gϨ2#Giw%m~\c
+#>҃GDz8s(R]CihB"ʊ}ݥ.^C1)HؐHME WARm/*\EM92"ϝWѫ'5GDBFB7Ä!C5d~=?WHM-5|g[\dBWsϝMizEfTrϯWP^t?&Ý$ ӝ_t ~sjy==AOX'R4!_iBC/5UMGX㴋;,k2gIʜFsx;U>$tW};wU+k<o%>'SkAs,WV`4Yxw.`DQ$X秊`)VA엫";(rvP]?~P2
+|3
+G5 ϑbJݾRvh.h(-VOsi*ć;w(2x\FR>ܡ.p
+C+Ճ7RfhHGji*ot9omSC}v5*ov v~jr. U>Α*KO΅OC5K>$ƻ|wk3'&xEEe>iWIIgsOV -k0ӡa%G=JeeIOK, aλ?.ퟞNճJQ%yث8܅n *[Z75{<M *j`_4GU7':Op,mR(*EU6q2;_@Z^EnisWv<W^ LȚ& a5;<DFpAϪ|Z4ٹ !U-&h|V5rt`9v
+
+Gh=$X)O%
+=r#kd"2,"oʨ1fiF:<sR:/H(T `v5J硫21YMq Mp/);mdAߖ>o7. ;[C02X.Zȣ08ZZp/Mmc8;O?rFҦ#əzZ wSv<_V!6Zz|+3֛@*ݣ F%pѱ}R]ե2
+]oe mkڨ~J`ffdd.ȳk +S'jrC(<BжǪ囎Ŏ
+ +
+28ms3U}!xPqU(:+`<g|qUlKpS)u-x1ͨq 'Ͼ)mn>n$|tW+ y1n.?"3܄#oSFդ
+e<JRQ2U80<]\nI?1erը=W!~L1rbBOS`U9di_+Q~,PcCF80==IԞ
+K^[ස& _?
+~0!?PT5p+:`٨IP$ |Xl
+4id140(r9o80paL2 SpLL2 3ZNfԇ+bz1dd:Swn\uS:ٕ͔U2 S
+Sg&Sr y,SR y#S";yvhvv`1Eq^$SS8Y,LaNA@bIg)DVF8_3p3S c i"N}ӷ f˴bcLsgSpcvsއL}0.é
+t<f$L5W^azC^bz/0=ӳ |I'v1#cL;GfCL2=#s~1m $ɠf&?ӽL[a̴@"kqr'w;mL2t3MLnnZgejr w'K9o=%L3c#/TL3Ǵ6P ZH:iu a ^Pc XHZɴ/rg1- $Tr%L150-dZUs3@󸲹9i6L\-L .^T͑ULә**1MAsϦ0MAqեܐt$n˵0MdTe ry į !ELQ4@y@*P^ - g00 .N@L)!43ebFb|2
+O%2%031r.`gg4S&SGFrd;ÙL04s:$=)q0y +~`~O
+-2"_ysB? SY'm'l3PϨq1Ӻ
+r`p'$b∙u9/ùFOwg;Wl9Fٛ++7F++VbӊVxb"{yڴ̻ԻػdbZ .557,llD~ 4j7zM^_X7]QhiݹѥY^o睿iw93Y3fzgdW{k6U{{++Ӳ˽S7{dy'o*f#~Rv׻;1;aSw\XXdyOT=;jHBoO]u 9DnDZDcCNv&k=;qļN:]INz)I$Yv)ӱGBJ'91%3`ՙ(N t[M$8 uA3 J2Z4o?/O2~M5 qq; xK%Fzͺu[O 7x *5!4sꂆ>ϩ;=QKv-:ZDGFkht>&?Z;}Fۜ6M~D 9nQK
+#7'r\+DSx8qr˙ cꂅ7RA&3W~/Xj0Ҕai ` soO7Gw7yjR88hV+r,`X, B`p&0
+`0(
+  ` 0
+
+Ol:PٳΥ5xjto.8Bbz]z|]Jz@tŵt+ 5t݈5#.FC܇Iнt1U55/399XncŇfk%.iSbQpejDr-d-+#{oy|\ff5RR= rVՍnPF#} JYa({nDuXU[IO۩Vޱ[!z
+yvy_0| ?#-8$=Yz ^4>Fez^ >O Ǐ`ƿ?3s2%_ZxJ">ppRcm?Sk=xs7dƩ@NLch,]_{l$q} ^Gpȅ;D4aQ-׶:s|pŬWdٿ{1fpV^o'>ٶE 19'.ǣYա3_|1d[*bRc w,0wZom@<L?ÝA3|;+0MeaJwΤ~.09)tC{XtKnZM++H{kƦ$&Xg{syStկj.IN:%uԤ8)2hDuϟr`mBgYGx^/-r֛~.ƀd?o2Oxx+E"[cؙ!^a\w5P4ϬɊ<8+
+?9è 2D6Y|[8LVC x9ILZ.FԴ1K&#acVl0Mp豚"L#bVg79ݜXG|#zp{d`_kCKͭW7Zm̗%.8_q W\pϖB]R,ָNa-ִN^ Ԭ]1J i2x[shE5fԬ% c4JNJbF
+ ﮸Hݑ ?f1a"'#iE9's$;-?0⤈(0$6lh7VM,Y-g):8KfI-"b[ZaG`ѳ9k\M^ÓV3zy.VpKu_'+1Zg"zl<1KCUƲڕvF1r/'w8(F.3yiieʞl݋r
+U3_1Gk#c#bL^=L*k$GƥY3zgmzd槤i]
+9go|s:xoG3L:: Z Eܞ D'Y<s};N,2x9 |Nr'voMXw
+_~hraIGTFoDFȵmBj15:>UDI
+DFF7spb a!_,iwDj$9Plcjr+b=8H8+ںZzE-nYڒYEA$Y)cCY C! ɐ=&ؖ-p3<f>3y^yHbcUj/@2{s99VxA=k P:p/\Zx%k6w`R%fUjPX5(V
+++q1Ҍ*YIt1~U6ҔY[8aOg*8A Z239\'zTy)`ZA6j'uutZ_p4q99998}zC롇CZ==Pҋ'THa7?1_%i*!b
+ѳY1H:ZN{Pfb4Xb }80NPj@]{us0e~q\8b4p受?]] qi_^*jNڰ f;z7kF.ݢnA{a/Œ#pI^"`1}9N9:00_r: E SJ6H{6V~e̹ᰵ5!_b]c޸+L[;m
+x`o 5X|J8;
+=GB6ɀ)lxC,i`RZӾeO פ;]{]7 5 -&}#tOvc&a#2ހgHcK;gF-TEg8lXK$X9;/=bN N NujvՅT [LAć#Hw;`[7t?nA/<Q}a7bN/vjYć08r
+1sG91'Z!t+l`ikkk^QP*5! P˲_,\-gƎ)$˦Ni]/ d4X> /MN.Ν-v ){ضe[=25>*AƐhnY+?8BL(斷gWku C<2 {u]孙lۊݐᚁ9Xg!;s`t!B܏@F'#H$K/uFK0j&({ޗR !+[0
+c
+M¦Aa{ ?lEƄ1N8@SSTEH0 /Թ+-rKUx{VN^q[GSo|깻o? uTg
+XX
+<t8̡XHw.8{lbHMʗ9uА"HA~XA36(3"ϐŵ,.%BQF#FL,8RlnEFx^gr
+Z^alV<qpDDQ
+zHZ87њīn?M R@8j9ViVtKqY.!
+hEj5.Z6nu5,)hqqg BFՑ_]A|+\"r3Ml~l* h]D G0ޠv\!a~]D|",s7MfJZJMiJ>f.U2 ..⏿tWĪ)?jOtc4_|~+Pfp|&0jlMVfr@8aq*~^W<3րU98E{GW(QU0Q^x ΁CLq#>
+:FpK.Yt
+Lf,]Y?{pFL$lso6RV,)[?f2RsmϞfz^c^MLOp'Z:VʞS5U\
+vP\3G&AK{IFs$ϸ"1 wQ)i@Ϥv[%ȐGR=A$&g^xƮC!x`pc(ک ) 0%e1
+&@]PU菫؈w.C 鮅Jl& S\`+YI\z|`lb{>o9_~ߩuzG >mjjŐ~_A a#J:R HTCFc8\?ch75&0Z)l [:y<tΥ7Y[`QoGn~lf͊eH.0wX~ُW Kcl<|1Uh(JdfT #վ\^t,?g@ SoV gf,3hee4^.6ߗzX!>fh"j3 h.@pGjKcX# @G4"  04o_z&kXv@OۦVqutJMciC.!HcX;%z
+aϰ Gq~G9DŽlQxDg˩іZTQy6[Ѧ"u&gco ox-h=ecgU;fj\I!T'~ 8w\rJFXѥjnx&l;jkM,K.dLkjB zIBKjln4+T2R n
+'#p:s(ꠃÓg3h'^}P>J(
+ ~T9Wo%VZGYlm'5'4. [.Cu J0 WX 22o f͒ 5*
+§`NtU(zIkQ&JoCU*~̑?laH<C
+R]bрa1CX
+9Y6k?Z6@X5nn_A  ko7 <m;Ɏ m
+ǫ;;?AT u&gLX"se=kXֆEUAFߨhV VK~ඦֶT
+=[{j2WN :q<-~RZJc}ܬz'޹KoS1mMηÉ#
+dv^)ܰJQJs$uZ%ee
+eg6n\<sq<ƂPpmHhi&
+CDPP_TzAn!ӐI ŅkbBa
+0ƩSAt;S>s!'QSg:t^)߁t"=~Û:^,`&^ei ;x"b^&<=HZ<'oau}w( $mA24FyM: [Ǒ ʃ˭ղRmɞƐl\ֶ Ný*x!#kV-_:C3Au&%_}*8% -Ƴ:`2t`^_^^X u+nǦ1h B(GwrqbO=P ie}ɑ$QRh!-ɖڳѳˆ!
++
+MD2*T"z^W$-@/P+j*eG(p|DF!+egK;Lt+J/W13pz<ףM$cW@ӪE.JoH1pC(>_VU/t/vb(6BBύ@w`ȶeG^Kl4c#cDTa0 pr7g~`UٚlJTn/(H!3 uLj<#)a
+([
+Fܣ1
+sżnD᪺d]0W/+)럭ST/22?.>B\L
+
+h~{EJ-We7@5ЊB3ЦϮVJ65SKFsWkZ
+n(`tX-1NS/mܤ>Ar/"o-o_BֲVwm|r3#c''Je6M<yW`|z^)w,GG ߒrp4"o;FR+NxXM44
+2T>ޔe;g{z [ Ml+3{$g8p}qWe\}9H=PsX6(QxCz{fzXhp+w񁴆w jJk&YZ4_}?LF6"؎ܶgj `{?X>-װZa1L^
+|^DV4;8=g(W@.y9YXڴ*k@܊r+&/նcT+`Q&v2茸7
+Cwu#KJWOJF[T
+'QOј'>"ȏk%!l y=BudlAXy-˾gO:XIT
+S@|M
++)t:1% 򛔿ŊLLmUd*ڛ2}eYǍÃ_yYWω}O֫񣓄NJ7#LLlNs{!uO>rѣ۪,y6P֋B H,Ls$XuFvcc58~|ȲQ4 -U̼O Q>ʾJ:-F)W*tt>TrŃ
+K|p9B) DԸ1G DCE XhxW Dc1=)|"4 swMul=o,d~u7@ޟ"pλ뉪sjֶ<m5[®C.Xޞ}KØ2PP ;#]Nڰ;8qִJX~sMZ|Ǎ^tq'7b
+G-|M,Y56@4Cާas"hߔԯ^R (֯}5+IװmJ 7w^oy
+0⽟,? c9I=U#B*x7H1/YA
+q]H7ӖzDϗMD{?D !yO-zG!ĴVЭI1d~`*^sW[^hX.4+*ʾ9ҳ\EhptjoU
+*?k)Z:o䈲@ԊM7{<A=thQƶz:T>m=+
+*݁8돛1f.6'Kh(2 y,.L+fRu]F1O/J
+~(3
+@VAew)Mx8GxTGx*ܦ«m-@ϛUjI#FjXY6
+{5t`
+xW{`ԏ;ncd]gOkLȠnFP}|4
+K%+#K\L qWm495XLi󄭎\wh5gG] HU*ҒZ޾g4f jJM ^04fKSrfw%aDm^ղjQPg($ 0Yr9Q 5Te Q0^If~٫~øٸ۸`$6 ?Ƙybm6`/ 30#mI=)`90F1dl
+5.C)c^ k+t *R'OI_.׽ƉֈCJڟ*ʞ;y}\4~}
++ ZSݧ$T6ԡW % uW]iă*r QI%^"R(À;}CSH(;']0jcduǶoy6)Ո2((uD<>4k}@EEX I d@3nc2_boB11ⱡ-Xq>+!P!3\ Kti iXmfsWW51hŠݸbh2FJOx'hr>Ao#KU9h:{ЇZLC9j8*!m4*}
+mެP&0y6Q>j,:Ia]eUsWm7=xlzԮ6xo'
+Hn™&n7J%̶^)y'Hb2>;ek*ٲ 6\6QAL*ڨLW۵&
+p\.܎>v<1PNPkq6.8[`g$1`>I B0@ [G%|EAt.~#!?Wa7hQQ8N-7Q m=^N]OJ YCAi}?%Œn-);#FQ7,8K5"TExbh|Yv:qS9eiSR|e 'h3G4F[>U 4
+,B 㠉,b-3Fns>]@A3D.ƞEw2X?un Qe!rwYO3x.Su&yT4|%IX9Á3S3ȐZ\wG94PI(X-\RlkHZ((gd?5㋏s#[uhd0UL}FOB*U
+jtHI:2L֙Ɛl==ٻ1
+ґn[kj3S,}" jYOETc,l
+Wf<ֳ<gXLs)E؊vp3^`9V4cN |,xԦ\P@>>j
+`;vL:=gQ75Z޳zOHe,r#o| *G,`4`69Td)f֋|w$&,j _R.Z- ;#cg n*g
+¨x5v[k_y g٩VN%Q<C)e$L5
+WnU0À#X;i2@߿e4e2US~XʞxĿ:c?&[Z2>4e
+'zHbNdX` _}*Hڤ>M/?KןxxhKH=O /(S/ LS1KzWA0ysW`:!]<{$jQU|b@邹L ZLJ9A_vx#'-\ 1`?;bpy!Y<N
+'zKFSE˞8G!.f=Li04J`5F
+ ' fP& 
+vHL5i.l˰㟁
+Xy-jE`O8j@WR˾V!mÀos Vš]WA1ͼ߁!j2(
+M6wB|fy3aׂ;3Ywԡ o(VJ6s럊-m@|\j4)Nr$
+
+hJf0՞P5.
+8
+;f+Y N)
+@+u%7AkZ61wfcIFթ7F-u 7dg"zI [Oc!_ b64#Y
+K/Ko~'ʵcg9l֜G#QUZ_a#@sßo{FN33gT.SI3vvQRR2qd| ӘM
+fScHE&l Fn
+RRi8]8I~,#F6*ĭvX nFL^ZZ@Ӛ&дZ
+i'% ?]mA\J۴ۖP,sf$[vۇ'3sf9sYޡkg{bJZoݩS;Raw3Z\ҩfō6FCW|CPlx,Ƣ$ƪBOczV$0Id4`(F!~#\ݑD?=gӂ5,(LSQr7/lS;M~4
+<7\2ւH<K%-S\]ӻ;ӅSTnЏ䱥/{Ӳwot9e2HB#!9bNciR]å,ϑ918㞅2ĥ}X:U\Z:Zaʵ
+1n5)}wy$) RYs: M c*vy2z)H^mB+?p ˽FŘjח"a`(4VK#S(YVA0xYz6hdX,aެ\Mr,O݃;bAD d3L THJbho[ e@]Jc%1l)o/~  CЧ
+p]崌( ._I})b7mnSɂt1zQL Xq:נ~_EuJ
+2??'lxE໎%:-ͷ S8,r
+5M
+7@?&Nd O\!4` W]Q*|G?V3л\_
+0兄`V"/
+|6
+1R8'/+>Zn"˄
+v|^*J¢Kh)S =<+dlHhpG+z!3Fե U2#
+-0(ƀ o WKzl\IAg3QnEc)
+g󉓫9u 6#[[e ,,,9A;v>qǶ(?A $?V11#JȩG'ӤޛI7m@HJ3Ab N*d6-NRֱV~1e6r Z"ZhUP蛤Ҁl~̄h\m[ X=P1>K*IߜiCf-@(XK6us[LݗIpA )(fSH/@Z=5YvUoo96m|Avigk{&޼nڿt;ж#}y7mu:uJkkW-=ѱo]u7:\0:9 f
+EEQr' .gE7?3HCRȭWkz&N9X)Whvj菷݇9&3s8 z
+pҫ1a DLh0aELhHcB߄ W<Ԧgzjs-[kUц &
+Ą?8+Sъק`>cDkҌ1 Aݟf60]?F&l_\J+E?F*܀LPPHz v!Pd=\ (o 0A yz) "?E, `T*$ 0
+5Nq`r^˄Qhw>8B2h3hmf
+o)Ŋ7w-@<"ěDh: ,1|D
+
+
+Uݹ
+nm-8! @iK
+@GqZ 3 y\目0Aߣ)I2E0yQL?a0 W(SH}D1RLqǷ\Cwo4Er_[S$'7|ego;{HJ>wZHZPYDk(󗬍-1B·Wzo3}Oy
+%`=hjL=]Mh݆p~C
+=`ЮEv巩| K~D+)l\Q jQBe wGK;cJ BY) j>LQɘO׀\QqB|4.EyR\ޅsOblhoPE%;̹n;gКo࢓BHRY!wݱ
+ v
+VA c(9dgX𶂱
+Ȑ&2\?dÎ>m[/Ys3PgYcͯ_LkZy=o$^ՉLLȚW8oyh;ޜ[07eQ
+x=ː'pز
+ƂM
+Ij>JO[~?WXѪ|.@C
+y' ,xzA?
+eKi~[bykX^sS`֢ݫܨ4ڒ?|[pˣ-;ז߱.i)<~{{jNeҚX%C il>,΃EΩZ[\busH'H;:,
+@ 7};C>R.w{wrOSk3;祇ǟrtNx2ɳRpVsI}0:I'}~bdULbQ3tߠ_ttE,
+Y:Ws9M 5n;
+! ~
+vXR~ 3kjX
+[ rx#NLsXFWdKPXC!1G0 ECcw[!QKHj^ ԓBA! Tx=ͿKNe1c%') *4VCTN_Iszj01*ǂC8-[:P b WatBҠ?JL3#ʫ꺏tօT@alao0Ȓulclv񎟍1 6Fn fwTY?тO/;{wtXq\Vzt>Z,}߮=-GsShG ՄH\yp:)\
+(h{ÜE.LAg+1~uկr1Հ6K`b0QTӥU 艌qrlFiHW #aL5 n KF?yYU))4 ECķdnFoѮd슫Do﶑]1
+φ& 6<{}}t},RdƃFU
+4<"II/^E 쫑E'
+ZJ S@ a7@P>AD
+4 r_+}iJЉXQ||N٩ W<(՞2bBAo*g%4JOA F$@5l00,*Z2Y͟_ ɟ`HA!:{3kpcm68[
+ؾ)R{NJVO8 ߝ/)ޑȇj&Wh䳤ܧ~[R~ {4Z=4)RcXc<y}Nl)LE˂Bͥ
+Sb4߈7_$oR6gr庵oTmbePCjl~yF;t-a z RS~Ơ%|<W^<^YXʙ.JNA]F+vl9zԬFo?XFCCP;I;T=ΑıyBʾл_*PMv\5M^ E=֛}ڻ7#pM^bL|U5oe Ѭ JG .
+А<^Y06Xt';fә;/yld,.B fm_9j[%vv#[YHzr Yx[wO]oRhr~ڐuhc<mӳhk jِso{۝/ԣ~Aޏq#xRWj1?RMDR ;PZa:,CzY Z
+<NZ_nE"x_pyjٵCޖY!qLu#ޓ%!9\<ckhKMkZ9U64g4!2:@k̟z^ 킞)|ƯEuE9i̲Mo2J13U섑(EN&Tyns ~DheWTsPnB[\|=;BYOkC:b$k -&ݶa8ֶSmV),8uU9
+0. H2H6")4qT?+s/Hu &W *ߺߜFkjo3$HIQ P5MAoТNߢܨS;D'qPM%q?}p6p'$d gJP#$n{1Tmґ*9Ӯn*ܥuQl\ZvVO"B``t3Muk+n ]0[\<<u=BM?ݜAm} V(j/22è0ZM$ǕIE2_^QIs!g T*6IUuɹfTY4W3mK7!Mf#n[Rtl$U mtGwcEp~
+P%MHrϳ7 iMhfLd6++΢*moTwMCMŠMX;֣qXaXaXa603=,NzoFTw^Rg$cc 0P -vwInhj(MCw >t"<ƔttȱXadFx8XO|haŶVlt-(rGGBdDZ -!8t ɄvaTdraCL_E^ Fǘ>aǨۑ
+ٕ7/LMȘ5dED1Ɋedah H\ӊ0,>c>|>O
+ID</,[}"鞰;zVQxh5~+%>>_]6PdZk|J7F
+=LD?g+TFA뎃^HC~
+=)v5E`%IMɣ<V
+ơdQJJ~ʩSǥQǭQ_N48NѬ,"tC-Jd6& bqq,o%vu7n mՏ,0/ *6[[ۺ`XX[::=v;En:0t 5WxWRۘH}v_;^yt"s6sSfBg
+>7 \.ş81l1\/㛵u]|(GP{P]@'+݌>w#ljy1[L$W$kOkmó5Ry( f1 B-N3-M;s2:56͞##-t4z.gnT#dF ^F# [9# ޠV<80J4ApHwSsьw~[~A^@G/r$_Bu6_%Ġ|2YCPwU,)0{N'<iW /l)l18{xU}4eSi#0SzIu9:k81AxV\yi79&_4)#Wh
+iuC&^4MBwͻCc0ycuυ\?ӱ\tFN3io-Nh2yZ"ΈρӠ[*j]m.ߢ>0HN$Thz@ S(w-iQh%]SMz9$@"cvDfh$3ΟFZOfF6&CHv"i"*^G^QNYӚky*0-G8Ϸ-tUs:vK̰/`ik%bOڳ6-l8X[Hwxh~w:~kT܊˺г*Qo% E@$uL[PNF. 8\9]%"@D8PFk欓-fِ6]NwR
+j?}ʧf
+LHd1vff%ZgԾZyID"E@ c)Lgf?9tAte0NW3t5354Ҟfm2W839
+ ~&#b X6l5Y1v+9y9$5lKP "}
+T3h8bwfm;<L8dlwoT{XKs]!q"*<*^f( Q7t:v`WERΩZZ<#zc
+Lf@[&gkgY12FyR-9Yog ,
+Z!KLguѺRYV c%fHZ~}91l^J]4Z :q&gN
+w2ZYNjŶ]qSa
+<+/LyI;X5
+.3_&yٹK h· Fx$1!+@yveL_eN(dlq`<%ZJ[O7$vXkK}H]fQE3h$mgr{NmI ;װaujRkZsQyDs"ofwv.4[6<|U?>_>H-ֵHpqBZAABZ98m܈A16,l NW`P^Hq|o\1_:srdJ\ R[?ΈACGZIW{.wQQ"J ( '=D2:'[Zɝ&8e[;qi?:lq
+={sB0T't1YAc&W~YYˢ3= w;M$s1OxLf$'qsK!@u /mKE٠LŽ)$ZўlȬwo<j$_<qܫ-=yܳz骧h+#,᎕O#a_?S{`8 ʧbX"I  ?$!Owb;zҥXO]Ş:MfTLT5Yuu 9
+V4kYG,G帝V\83~_jŅE3 ^"𼡂hN>C%PɲA<{Gȥ<R= @Z :'א&Gy&x;4݇.~ZEQ/)1Ze!bv#Exh
+@kg7.c,A\-1ʱU
+>U?&zd]@\޻db7wĞAͶBo1Ló-}חw;8̭7D(\6
+5Ud.,viR
+Bg
+$3h8>ikkljCF6}Rd3zI|d[pƝfg m<__ 8,ʵ S?vYu ,q ]spVZZPv6Jñލ=>f>p T% _oY9\vuU2l6&б ]fWݨGѨm<l 9@c3k 
+az4ʈϠÙL
+'F SϨ`Nŷ6|㊖M]N-a,=Ri:Ngؽpgm<MI%0,m
+hFCInNd8f ,lܯ tBu@{hN.y4Jq>1W\YyxU b|-L\h &n L;'7t8"dǺzTO[Ɠ(6uzS%b8\׾f{pk@.l&) (yDUPAyNW ?dw63f޳r3 əe'ܒpD1:T."FD0Dd|Ϙi4;KuI%Kv_Z~p+w n\}c pɍX7۱cTt@xϓoOŞV)Y+ ቶ>B,q4n˞\ \T8k BPAdQH_f3hwg-x3RUG-һm#Kpu|s`Jc5zx9:i5ى+;PeMKP9ifc_%3?g0 2Ae~F(5jQWyCڒY^?з܁)> j '[}&hY|h]>вŷ\獍l)-7(:PGnC6ulhk?Žskk:YlüEgzLk<-z[6Po&^xNF?z. DMMج\@oa#7XE3&
+:"KdrNSR!Tk첆,EWm銖NJuR=hM<m;BVxmEkIjޙGU.$ aM3d!ldYLf&dfDY4b@AMVPZҚm]+wιw|yvC<{9:DLlڴ <\|n7-˸csPUMO ~1&Kزd˲ ЕBAӫ͸tҵ9[.LhXQ[>]:+99 ;X5tYE^4sƲŗNhyK>#q㹌QӣxK9fjugG4Sfd{ͩ⒉?y)Ր*_:~b:9K@m27U4{vVhVAMrv;Cuk;kO~^~i˭V/*YWV»6n_g)_j,ɞBZrϹfϴ.c;ϫ'ul2aŽmm^3aVeI
+/0}%[MpKJ]βNȴk-Iix^Zђ>uҲڕ|Ku%Sl]vĥ3 ?
+4a) K66{r1M#֟zLcc G+(T\?7m ӦOZw@{`ѾXR%Κ0DMxO|~p(D센8yjl?>Nv1OS)G W+10=b")d- RoLTNSD3!wC^g򻋮h{TxS&[wFI&.S'NΨʻϕ;L^?"S &N yɌãec4tq~qΕK:W2LgO$'=wVTSDѲpEfo"%uKV-}o٘,*s%
+*eT,Wr+G^?-+_^k,㊬P)ª-)n񼒩%K^Yz PvYqO~6kmd]/;+TqR9r}垤$ K|YUՓZ?Se#dxjMڛkQ7j߮ &uƤ>"q;ŏ6ͷn\uWmmr nh8cSߵukߤoJoyrvg;?odzvyo5>Wofu`B`zু} 0x2Lׂ 2\2۞ٱz;.8ɤs\knu;T{^tݛw;v{vN^מ/X^ /,\.WW]ֽ^q{]{[<$%)IIʿt @v\sw~/t웾u߳7T%%)IIJRo'$%)IIJRW=={C,8p'.7ƗVۇ6OrSR$%)IIJR$%)I җ
+,.&)
+f"a*߅KU"7G\VōQseM\ۡ\qջ岞]r E ڻ岉)bg*c
+%yN;"N"q\VōQs;&]˭x@. s岞3g! |ut4l&L%Ser91"ǓuMHˌ3+3ά8*n ʚvƙgVfYqfeƙgVNI͐.ˌ-,B.
+9
+WR#Z\\;FTA :NZrh6:fj/t^e)j[L~;Zvhcy혇ppkQkA+m}zkמ&AVވjJt6:z7@[0IIhom\l"t>/庂#\\+$$[h{([
+7 B!]]_YcsH^hcՉZ;J!Ae)@YY&Ŵ؜^"Kg }*҄m`u{kb,+j_nWfi㗭t)dF?] -CxBĪVcy^+~͘Y>zu(F:2fqz[vshf&J5tRmrV+{2Y?ۗ
+N4$>,>ټyFevAi,fJ4<4X˞N,ckg6lポ|>9+Zd%l-iAɕ蓇^G])={W|Urs˹!#=4GY;ӮD;;̙d/]' rWgӝӲSFё5*/hnOndWh#1B˕u^5*wΓ7-bO5t@6JGCItOw xO9s =f^b+{6]s@>}
+\,̯Gtع)?:"JNN\c!?k{g>o6oQM<9qe-{TvS؏C
+ܣ֭{EM$R0S[RwyyĝFjK>ڢ{K;Qڠu/]82IvʱG4ho+'Nq#qgGS1N[ZK唉?SΉrJ]A+^5̵gGzvEo\1JPۈӲMBAԊZL3NmP)3J7WINj0Ƚtbh#k
+g<QzIy ͂lJ!3YZv)D茊e@k2O/ʨ%6ʈh&: aQ9zƸZ:Y[IP~bj9G^+Gl{!U(RjM_!~Vr z Q;Jk)bYm9VvP% Pך(R-FgRrUv^ly/k:FϺzb1e+zH ^fl8K|domQZaZzyB(bWmtiFl/-,̗*܎/k
+I>odxwsK((ո3'pKU~흾5 ;$ٲX˖jTj:|h]kJm <z|iv=<#0.n6B-.N*w;\ޠkt$Wkt9%k#9 =ƀaZ}Py MRݡ)򸤀0
+CCVu@
+s䲇pap`\v?6OJo[+AW*JAv.
+:Bٽݕ# JvohÖ2 >/ XK$D]VOfbxȇ KK؀V6qG=
+؝V{`;YҨg64;|X
+攷9yEiM B\iU N9`tgd(Fz` ,{pҗ#mX
+g%[reKNwf~ڱ@;N*
+~ (&2Ck8l;po6G
+! *VPYn̂ $@"kz|vg"=;Cr}# 8]ddLO$eɆi!R`rD 1YF-5ڃf
+ed_pys~msI-#s<l/u DIp<x`ڇ54%ŝ& ʄDRM6'Hc3[j
+ A 6c̈́1XaGqkD(v?U@!eyCvO"V+ʙy"'͆lG,isl݈J ?es]vRaDd$OoÂ-4`o4^bAI>eSIS#[|Fm/qQNr(j#8X̏N7 őv\/DB%sS` 9] k[hL آi
+m5Ru}MuUm1/ʲʒR\Q\Y#mRTR[y9Vk}U՛j֔IUEh\] lˋTXTa"[*UӻXZL0 
+ʪ*2
+*jP*kꢷn,-Ζl5eHIM*}L A-%z}mq̖b[9tՒ$?H~,&?},`_ɏ5?`x @y#ď:ɏ $?&_1bǍdp.A%\⿗z5Mi2#l))d{x o6 Nk/tq?M#UZMK96+p+:$lGq7!u-#>DN{>'^'YW rJ~ x}ow;|IK . 4=aV% 9aQ(*ū:!lS WG#ϋ{ۄo
+?~&-*#8$| +{Y8]8_|_?aBH܀*
+f0~fYqH4YE`
+l9i^c
+Zl>Y cj;u `0̎` >^ϧ0*0[f!n0}`v}̾ fOl|`$L+#
+
+̶`v l?f78=
+f?'e0{>m M1S|K\*-*0kl?f_`#0{38fi`6Y`D ̾70{~7lgY&-B0l;]fK`v=fOK`& {_fY.
+'<_ 4N_(_:UXtj {rǐN _/R'O{#JG7:!YVz{6MCo*{tjNEt+
+NUTe6댜-uKkk!RXJg35:zzZXC&ԨxO,vAtg8Щb 4ކgHtIr 1 qD'Jlx)&z@jtSq).yv\~kx35]Fyj24pbԪ8Ykz[4jN驮${=z<^ VU=Bx'z5g0q FG0T4<äq;L]]݇<ɋJ5k8A:D/VI\ GOUXg_o5*p>%EJC?,D+~NfTWQ{AXeXg64<h)ũ*ӉVة,7
+VyҎ^z^g<>rB11̴N_ԅ Z
+3Ӆup|iX]4HGCPqzX(;Ob#X`[Dq42*hnmO6-n󅛑 aFJ֣5r2뇫 ,LC%sG9VcX̡9Tb1Gz1G{S ƜU-rUnppFz-?յ G^fM(]z7Epez3NusVz/F$ GZOO7UՐZN=k/jbzN'
+lx#>4F^B $"&Yג[4A5? N~ti?RT:jx-9τ; *Πƥ#ڝd;Б4 },85o ,6!>ZqjL!nŨneZj*;}HkhezAbJ,T &HT",Nk,Y燉 :$nĭ Jq"*`zVְX0 ݰ*5gД /* ڳ)"oPKq+R`Le0q5DKFRjm) U*ޠ%Ǵ&DZ4,H$Zc5dmFVViiN /IJNւ`fLG|tt>3 h31\j0 ?Hшt҆M{V+zorv6y` )HZa0DŠ*%"۠ FCq T= k-oг*ZJLAs3c|.09㈑ݒrƢ#ňj'|ڨ$4]+;SFx-v0 ڙ yҖcƸ,AOg'ku8˰Jָ%qqԺT_{)6E>b5Iq`
+_dmnɀ"4/eZ0h{U*zV;7r
+Έ&Z݉Xe/ahFe%lH+r&lgL
+>9yԩ8o7#C"! G#'"&#oJ]ɣ" k"39:4p\?YD)옖ќ08~$#vQK"c\*d67T)7Мstl:tj%WtdX2,&='̇EN1qB؎gw7ƫ_GT@E\+i
+U ` pDh
+D ٍ;v?ESTEkV-Į-'ӧN 7]zO{u/ثe-KҘ2h)ni2y8It<ibͧ@q,LS#vK e4d4A7N{ƔaI<Y") @yA K"}F6|ѫ h& jj-kjj:գ y<ӽWkx\Ff6(a`$_6%k$\Cid/ 3vL>Ew\4Pvd8m9
+,x
+h'K庸.1\k!tFƔ} kQ^LǸqd(M; /Ivy1u
+4]t\⒁r1<r%eT}Rm.Q9ai[vpGe6ΐrW;#.'g_{nU<BY{t7i(9p&TPO6#kO(bUElqT5{Ixn/C!K("qÉ͑3k"zlB^\\wl/mzx
+#bհݻpE7I*\w v X=F7$k]hzpeiCk/RLz)UlXvv!_d
+=/*k@n|r JTl%T~
+tMA PB\?Ucga * (3O=í0)Pbc J}Gj*aޗI%ϛ)smZ,PsS& ~QRթ8թu}1ęׁ6n.$q];;pRVf+WrZ`.٢,Mj!k\ ҽxIz6 t:vMݩ%[n@ {=~S$Td#T>r0z;Oh>R}Ihlxr3xE|lJ33#!]/g.ߨο-ZyrV/UCuucw~?k`50/Oy;_aj0"POlhp<-gc7U d+J4:^$­ۄnw4SL0J;`i\ lME?A9꜔toàWلw<ṛ9sBzXv~Xz'4֤Go e i\B
+
+VTе95"(Oa 6~VUB!oX4|Xqo;':y[1Xs@A;ǖ
+T`<R&
+8r?K 
+_kr =B0;47%TP&n1Q ֣
+B l1t
+Prwd| ^T^ejY =^ӄ\긽23"egh* VWH d(Ue}2\)kٵV5tՏnyQ<͟V}ݨ%HࢳT.;1q6Aevs1$5`MRvn_e+:<R s@U=FwwzW'tx
+)0 tB|+O#hfCy3[0ӌ`~AOZPNPb`,.B.NJ߁Ð`D/z>5\zKIL$N}-oi fAOiJL-Ob^^C0L..( ~5~RϦL‰(
+o={_\
+endstream
+endobj
+199 0 obj
+<<
+/Ordering (Identity)
+/Registry (Adobe)
+/Supplement 0
+>>
+endobj
+200 0 obj
+<<
+/Ascent 750
+/AvgWidth 521
+/CapHeight 750
+/Descent -250
+/Flags 32
+/FontBBox [-503 -250 1240 750]
+/FontFile2 198 0 R
+/FontName /BCDHEE+Calibri
+/FontWeight 400
+/ItalicAngle 0
+/MaxWidth 1743
+/StemV 52
+/Type /FontDescriptor
+/XHeight 250
+>>
+endobj
+201 0 obj
+<<
+/Ordering (Identity)
+/Registry (Adobe)
+/Supplement 0
+>>
+endobj
+202 0 obj
+<<
+/Ascent 899
+/AvgWidth 890
+/CapHeight 771
+/Descent 205
+/Flags 32
+/FontBBox [0 205 1359 771]
+/FontFile2 214 0 R
+/FontName /BCDIEE+Wingdings-Regular
+/FontWeight 400
+/ItalicAngle 0
+/MaxWidth 1359
+/StemV 89
+/Type /FontDescriptor
+/XHeight 250
+>>
+endobj
+203 0 obj
+<<
+/A 215 0 R
+/K [184 0 R 185 0 R 186 0 R]
+/P 183 0 R
+/Pg 14 0 R
+/S /L
+/Type /StructElem
+>>
+endobj
+204 0 obj
+<<
+/A 216 0 R
+/K [206 0 R]
+/P 187 0 R
+/Pg 14 0 R
+/S /L
+/Type /StructElem
+>>
+endobj
+205 0 obj
+<<
+/A 217 0 R
+/K [208 0 R]
+/P 188 0 R
+/Pg 14 0 R
+/S /L
+/Type /StructElem
+>>
+endobj
+206 0 obj
+<<
+/K [188 0 R]
+/P 204 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+207 0 obj
+<<
+/A 218 0 R
+/K [210 0 R]
+/P 189 0 R
+/Pg 14 0 R
+/S /L
+/Type /StructElem
+>>
+endobj
+208 0 obj
+<<
+/K [189 0 R]
+/P 205 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+209 0 obj
+<<
+/A 219 0 R
+/K [191 0 R 192 0 R]
+/P 190 0 R
+/Pg 15 0 R
+/S /L
+/Type /StructElem
+>>
+endobj
+210 0 obj
+<<
+/K [190 0 R]
+/P 207 0 R
+/Pg 14 0 R
+/S /LI
+/Type /StructElem
+>>
+endobj
+211 0 obj
+<<
+/Length 2612
+/Alternate /DeviceRGB
+/Filter /FlateDecode
+/N 3
+>>
+stream
+xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺
+E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI
+6'~khu_
+Ⱦhs2z \nLA"S dr%,߄lt
+4.0,` 3p
+A1vjp
+K0ށiABZyCAP8C@&*CP=#t] 4}a
+ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8
+FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK
+.3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 <y}'ZZ։6i{L{ӝ-?|gKϑ9w~Bƅ:Wt>ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc'
+O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf
+endstream
+endobj
+212 0 obj
+<<
+/BaseFont /UAQXCA+MyriadPro-Regular
+/DescendantFonts [220 0 R]
+/Encoding /Identity-H
+/Subtype /Type0
+/ToUnicode 221 0 R
+/Type /Font
+>>
+endobj
+213 0 obj
+<<
+/Length 65922
+/BitsPerComponent 8
+/ColorSpace [/ICCBased 211 0 R]
+/Filter /DCTDecode
+/Height 540
+/Interpolate true
+/Subtype /Image
+/Type /XObject
+/Width 1182
+>>
+stream
+
+
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
+
+$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
+`pP 㞴APEPE1QK7
+(H')9#</^sQE
+1B'(=~
+9
+(
+(
+)h֟@R@B'j
+("Ee\-PEPE48)
+IɧE
+*=_ 3jp ~\P
+ke*)
+6lb(RE
+ZjlN(((KE
+()%v%@{oJMܻqJhi1Ө(ٷt Ҟ^AC(`T
+()k޷u
+(
+(?(h qN+[(%y1]ۜ
+(
+("UC1& ʻtIӊ!dv'Zec$NGt,@#PKp52i@(T1q
+
+12p;(J{sN
+ae\q>
+u
+J
+y97HF$r:}
+(
+(
+z"C=M/:3$([va_wL830 pB
+H>d "9\=hj(E
+; SCpzuE
+B28
+r1O~uvݭ "Gfg! rrI|-|9wm).@FNrTlpqN>4PFJ;Gj(68'>v
+@{R@Q@Q@惜 P
+
+M|9SFFZiTƲ`JF=O
+B)h((0J}Pij4WԔ
+6u<F$c8c5ko&eaL1I<حzRn1~Až}kL^
+
+ cAx>x](P@'
+(ݎM--
+(
+(
+(1P$B)8'(>{4=
+
+,V$ zRs|zI}.pr:k{AOY[셜ݘ@ܧ޹cweˍIS+z
+(
+Ջ.
+{Nӯ|/k$f5B6A s^ai-p'
+8 Hz
+KWu>zP6zv=?u=
+F$ <2M
+(
+(
+(PHsN
+(
+cH\=Pߵ5
+(
+(
+(
+(E
+(
+)r0i
+=G_
+\``
+
+ ݐzt_ٛ:pLrw\qg
+8
+)|si
+Z
+j:)(X0sS袀=:S
+(
+(
+NԴ
+Q,j<,v&{'خ<[wFvʖ<>3[X&A67Ic$c?~+yc޾H~}qO ,_Gl1 cc
+~3Z&bP Y?9\a=T9=+ޫ7Eѵ=CS?o7ڙPl+I\_Cqg2Ļ
+*
+(
+()hJZ
+ Xgojs€IKE
+L?1NÀH@XzW^$^֠nT,\{c5|F-㨭屾80n|Z嗉P]FhUP(с2P<rog\i=P{{(!""а\
+v 4QE
+(
+NԴPEPEPEPEP(LRQ:q^yGR@W ?rJO{U({x;}֯Ɲv:6 8 sg]Dɡ[\[D$Kt=f:{׿O5dG n$n;HX9|K_saž
+O-㞵xI4k}H]V'
+q 1ؑ˫N㝤OZV|\+B+HF@c;ofߌVi,FUdn]܎KwIG @A;zvl˒\
+ m
+(
+*7ʡ2qҮ'rE p
+ʥ?U&sLhwW` 'CO4
+*]F>S
+z`
+(
+j''֝E
+(
+(
+(
+@sKE
+z_&8fڥ"e-20@:֠)-Z xmC)yK\4"p11Sr?JZ(M+z=SDVT'=RRq
+
+1Ǹfc4 
+(
+(
+(G:(5p'X9
++?Fh~B_qۮ1__A-4'F -A9W$# :! AK Yԫ];I }s
+ @6qj9_j
+LR@Q@v @MxCFz@\(k9
+ܣp d)<_o6 l_?<}%[%zʱ|3
+`k
+pkڿ,ͮ}V}.T\@4k{B=G-L  G
+|F~-Zjow,ooR0H!'
+4h~6u(@!
+(
+(
+(
+w#֥
+(E
+٬hVyx`s^7^fK!
+ʪqN o 񝖡YOmǴ$TrN
+0pdC~T`0)W/٣/e?/3 3VA8_$w.O"3b#6G@ ?ZJ##ʡxRDtaÍ(ٵ me-K  )Ԝmlw_jf[Yգ4=F0I"oY<KŖM3M
+6Kc+D1\F , =?
+Hx
+C
+(
+(
+(-PL)NsDv
+,FeKD"3@=Z4} a]j-w,d@'~aMAf08Ag
+HG,r;N=E
+AuixmWT\淖Pssa_KMY5ܣΙw Xu぀8{Sj8Ҵ G6̱&9` =?ּ?ktב*̩ 67 `t$:=>kb2EQ,@@ cI9}񖶞!5-:r Yx=V;iG1-ԕbIڄa\`85"d 9b2{=M
+re 9þ!𰍭VS߸
+.Fr}YGbi4뤘!
+(
+wϳs?:
+C;j1qGקOZ3x~2:+>kW^̈́lkn^}(ԼtxtxX bAP#_ռ\S4[p1?xg/ o v@9\B5~̚ЫIo8v fg23@UM֝@Q@ zЪN#߸'
+
+O[Z|km]P
+b=8&-֠),
+oMrI
+nm}LUɄTr7|p=5KƷn֬rIprG_
+AΏ6 ƎM!،
+]א '$tw/ēwЋ C
+G'ndhq
+:J3&21־j79*v#]bXs;4io#^B-rr^H־̂xI gWNȹ arC+)T}σ(mi.)V2\z (ָ4Q@܌4
+e
+z`TI u3E
+7jlid207;g,zxOuc{p_eAw:hpӢU\}zn\gE< ֥yTLj؍PT)
+
+;GUb%QEA{
+Gi
+ 9G#f&\#GpsӚb'u ^}> G-S.
+:M:(5@n0˞+MgG4Ǖ6E?p
+y$qj*2`B8-֕֏28 ;h
+-Z'I; f"̹`/#$Ҽ55}Vf9(\gf=-UZ}@!'T kn-ĖN$<0'=ը.<:7p3Hb@#$~f5)t RCeul"\+rI*;dRIᑂH
+(
+( uhݏߧN?((
+(4PI8KE
+ qQW+/l[ǑA]'8
+
+MGMGKR1Ce)
+l rs_U]chb6Eɹ(:d9 +A;آ-A<)"r˗0{OEPUA,/V(Mx-=ϵKQJ`8(ׄ-|m~;1PT
+`gWM>h)#2@h' q
+^%b
+DYswҾIDY2oƍb֛ o.y':M扡[iyBdr$
+֏M6+>dgA( d`ޓŨ<a
+ILPv+O|*skoٌNT~9VӓtNdmlE*J
+!\+<ZjDd1.
+8
+r
+" 8}kSiZ٦vKGln 7
+
+A8=k
+xXϱ ̸ 6鑌 u ,…Lr52a֗KLKtAA@Zda;>9?V~-o&Ą A~;zk$Q{d$ m8]2H=L5 BNoX̹S90O?^h3g.4_
+#qR[]8+P9.w#L3e=:8W^eG2p,ɒ1 A0z~L7M"C8#I2x$lg-Xpz⾭<A
+(
+){z&4eGuR($}X!,5Soy
+CUPqzTF0o`Bnչ٦g! X 32rpq
+͵u4q5I ,intw2' #*Z\KGッz^]LƅuH|<#@xWXӼ?nɛ(.ۇ%N:g#h/Y,aA.Hf<qII=J·v]/GoM{wǠ$԰ԧH>uK)@?h#[kĻuUvp9pJ ;dyk;=B35:(Yx 㸯uK\^[cb! O@={w_Z]f[hKiQb@/U݂#}?ThWImlQ;++)\dAȯuf<Mah? 4M_D5j$G[!rN?1?^ٯ/
+Rgsc`pGՒU^8ԕ$ҾP_+'c<`2)
+}.<Ymỻ6*VF9°遑#>ƿfe\; Q+.#\q^SfaZZl-A;7
+=n}9Eх,\gV l€>A~a!w
+T
+G#=0|%<jxWa{Lzs ki8}Gy
+H d̀u<p "XM&ˏ3n8<c~jtH5:5Iu@[L6
+ ^
+fX
+u9%-$UKH8v<]9EGCTdp987Կg/><jbd
+u-:楱].G5Lɇ~}G
+NT߃ Gu;cH%w !q:Wt ?6T
+
+Lap3QHr
+0gӞh1⑜ zmﭚ!,nۀ8'<d}kjO
+
+3;sw
++ɒ
+Ir<OJ
+9pI:^Eo'U
+n@ Vڭ9<]X2F1gJ
+?QxRZn{,
+In sOL`P_xj-kڏo iyVy['Nkٓᗈ>oZ.!x&
+hP@N9{oR$xv
+G8
+̖t1\RA9W
+2cIQ@2XC 7ln'=:q~7_n4aL:}ko]7xjދ}X
+x#$)U8-獅XBQ?J洝CZ`!ӵ+VXGJB6  9#2j]FCe铴rZ2[2(v`YpH#+/ VYad!cTyG99=SOOBa-&h'rb
+7E|]Μd*ŗw#
+
+|vF%<O_xP,H"F OR0FOi~ |ggskuR8F
+'`6z P6=F}x%bIfT>?ᗁl)=K*bc'83c'&@sK@VbR
+`sAT
+Z
+,}ps0=(w.v7Yv$cbk"l7n"@&P#=3_X@?\or@ S>f?U
+
+AKE
+2@
+[;{@Vj
+>2OZҚFF4E~ξ*ݕaaf Ch~vVzgY&9ʄ=(n
+p[i#88~y/l 'Z
+vemḺ'<U(((( &BxYO0A?UַF@#9q뚱ޡ0 62p}(j)di
+ n--KE
+/!&:22ɯ ovͺn/!WϓCd+EqE1F离jܾƁQPm
+~Kqፚ\H`8O  d䌜WDѫ'Ҁ?'<O_Ne- 9ԐTz
+S qkS_֋;6լ⸍l8 r<u<Z˘'
+
+
+(
+*<1`Au%
+%
+Gt 3K bC0:u 
+Z
+j[1,YUX,Ar
+?fKZ^*,J* s@ ȯ! qL*@88MYm(Z(
+(
+(n
+9
+*V`q9OʮPEPEPEPE0 1ot
+ʬrӭ}
+]GtF]IⴿxՉT7 }G ὇L(
+(t
+(
+(=N
+NPEPEPMfUn;S(((ʬ[xQ@ H1(7{ԜRQX_
+ǭKUQ), 4 Cn`dtC!\5Ԁ>
+) 35n$ 1@QE
+t=jJ9
+SAҀ=o>ڶw\$Ld޾WĽoZ4cV`
+(
+(
+(
+(
+)"
+k0PXT3ES%s~t33H#5vqN(
+BW-%(B|~AX[jzj$qހ)iN(o6㚒
+:QE
+w II
+(RGz
+C959ba g
+^B  ׌xAk;pd-
+
+@Q@Q@Q@3sd$N_vG
+E
+
++*
+(#(d|Av=]N*J2 AuNkvTh\_
+(
+)~PEPM #Ҡi,;xac>4
+(
+CqKE
+t:W
+O>
+x4dg#o֧%aE>P9
+9q@ M{zSr8!ԁJ:R@Q@ y)Q@Q@Q@Q@Q@4 өh64(((u
+Z
+(
+)`:
+(
+(
+(#7zT
+Zit[/#Ig
+ ɑG瓟ҤbAP;w8FbH['Ҁ's:OU.m-8I
+8 0Ak?_u_z$9\.6gy<Nk>[KXmGq6HR'VH/!$'
+el _ĺgror, S #$@`եY[h܁`
+(
+(
+(2R3
+FCKak8<r$O=MZ >RrCOOś{[hao"GRFldK=O:󙣖AfG 1 kce;hs$)pͿf@!NA ׼CamtԞ[b""^@c׹vm
+(
+(
+(
+(
+@sA
+(?((RE
+nI8$O˜V)@9M:
+(H##-
+(
+(
+*$$mcT
+v}p+NjtmfC
+UHsАk摦C;~'g?1Tlq
+(
+(
+(
+(
+(8돥
+(
+(
+(
+(
+(
+) u
+((h *rzqM9PEPG9
+(
+A3KM
+ϵ. owQr@$=rzV^64"d|+oN@#PWōwۙ#bN\#ڼWPOEz
+r
+(
+*6#
+((
+(
+(
+(
+(
+(
+*!"L] ?K@Q@R`@ PG֟E
+(
+(QE
+(=8lqޝQ!ރ<J(
+E
+(
+(+(Qݾӏ<S?LT0(_3ܟV(
+(
+16g>((#Q@Q@(
+(
+(
+(?
+endstream
+endobj
+214 0 obj
+<<
+/Length 6918
+/Filter /FlateDecode
+/Length1 14180
+>>
+stream
+x; tǵ3V⿍`1X6 N+imm,i!G i܆~6 I!Ik8iB{i{ھ4ѓ6Ρӗ3+`rrN^w;3wB2kzu\G`ZO@
+~.&cyDO=P̭i Yvdփ6` /? h-_ 2)/#ĽW=gwـ4E$_ w~DykR@>*"tUfH Gfڐ ~HC`)̧oGߎf^k˟=oջV Ǐ7Mڟ>UtOo:fR|@+M q&1c<ctHr(9heh 82#+M"//fĕ-\ŋOZcNYBc5hsZ%:tEr^q{_<S'ie(+@<ip)T J JtYʱtS;p^,r!!\^.>93E[7P)ڥZr5l^P_W Q|YҊ%6qW/).*,͙f,faw 񊁸¾qc5%R" uƉMK0] ӕ9*!vw |>I
+ovc
+!
+0KN%VѺzZb-X9lk5jZ&+g(wsݽqwevz8}uq}=uK+~&1?wgId'3wSdV'Z
+nd*TɭmS>ùʿm>?Ln z_& 5@a>FЧ݁
+BnwhZLiit w;͝kf
+w| sut̝D?%!-+ē\b?C/
+
+<{эfZni>0:AOc.GA;q ow>{ |
+f3.o^~'/<ݼO?lh:lz536ǩ,,҄aƒ7kP1
+Eb(5B+= iҔ4-݁o^/wD<xM<Iq?MN^\ 5zOCݦh'=|:æ3|z=./$=?-Ą >On-D_`EE8pYYkgEQ0i/ wFTFh1 G~#Bp@]c[jg9's&ڷ]Wېk-hj/+ΑZ6Ϝ1O _ =4Yiy%6{[ƷjKߗ[|\*nr .eiaE3g.)_fiBbYedaunN\q޻p[qtdsjj%gܼbe08IG[\qK]m1EP+⦆BPTHGM+*싅fټ_.ss3*1&Njuʦ,yY掬VoXUP?4o4 <֛*ҹ[gǪnN87'U~U 23-ed,%z?ذNVmGУkq+Jvvً ֘'eλ6 %^}z.G;/Xغ|Rۚ}=%]٣%K%tM' U;'[@I+nq 9SM<n K+.h\'ւ`),(.* }1`51E TuЇiz.,tDصܰ˄9 cwx¢k9^x >Wpn UnC[T\;V`zUC_ ZEWgL}<fimgVXvMRo5Emcv|ֽ*+_g'<Gg[hDU"wjF˖-wԚy(3liUM]}ÊƦ-m,ܺ,+.ߗW$ВYKWf4V/[^նjgd5pwe,7f#R]xہҜtP޹@"c3jq0Z)
+9/g]% bɛ,!i%67
+q M4f
+*7@NQZBJ6dCQ(ThH(+,GDuPTLKH=#@Rq` J ʄWBYñpD0Ue2SҤO
+'(̤~yw$8'*Й G U"[&s7LdϰK
+FIeJ HCwY[3~0xC <bMC:(j/ )@<CŢTD;
+VɜaI "j!c79Ȫ L
+%(5bl# Rb7rY/Ř*i'Ԭ%a'ʯx ai„`%ف3Dp*$ZbPD/)I #2QIī?[N38*#
+ Q/@D^xk~
+p  ( upENW[ |QhC Ɔ´'C+x{s;0[=H#tRj
+ L{L"«S2U.}ETZԦc#uT,N!JQz 8s)]*T"0F9jyD|0ht̋tU
+1F,ۥg=,(5#ܔ_?MYKVd6;>chq.ͅu &0DF:Qgŝ+$V-N&C)Cv %[Rs~CVDnZ5n~j~v9K}VR!:›-e5oĚgj#Nvw9~A_ N5E?Aݒv\_#_htD
+ᾟ&$iJ?~NBb2yE$ $.ڒtT"
+endstream
+endobj
+215 0 obj
+<<
+/ListNumbering /Square
+/O /List
+>>
+endobj
+216 0 obj
+<<
+/ListNumbering /Decimal
+/O /List
+>>
+endobj
+217 0 obj
+<<
+/ListNumbering /Decimal
+/O /List
+>>
+endobj
+218 0 obj
+<<
+/ListNumbering /LowerAlpha
+/O /List
+>>
+endobj
+219 0 obj
+<<
+/ListNumbering /LowerAlpha
+/O /List
+>>
+endobj
+220 0 obj
+<<
+/BaseFont /UAQXCA+MyriadPro-Regular
+/CIDSystemInfo 222 0 R
+/DW 1000
+/FontDescriptor 223 0 R
+/Subtype /CIDFontType0
+/Type /Font
+/W [425 [658]
+]
+>>
+endobj
+221 0 obj
+<<
+/Length 231
+/Filter /FlateDecode
+>>
+stream
+H\j0 ~
+Cq21aXpl%3,QC~:?[Ҽ4'8-B'Uy.v4QieJ86UU?E/;^+;dOnvc)Au {ftݧ ̿kܗalp8Ec BUVHAߨ߆]]OWNPvf<y9C֣~
+endstream
+endobj
+222 0 obj
+<<
+/Ordering (Identity)
+/Registry (Adobe)
+/Supplement 0
+>>
+endobj
+223 0 obj
+<<
+/Ascent 952
+/CIDSet 224 0 R
+/CapHeight 674
+/Descent -250
+/Flags 4
+/FontBBox [-157 -250 1126 952]
+/FontFamily (Myriad Pro)
+/FontFile3 225 0 R
+/FontName /UAQXCA+MyriadPro-Regular
+/FontStretch /Normal
+/FontWeight 400
+/ItalicAngle 0
+/StemV 88
+/Type /FontDescriptor
+/XHeight 484
+>>
+endobj
+224 0 obj
+<<
+/Length 15
+/Filter /FlateDecode
+>>
+stream
+Hj` 8
+endstream
+endobj
+225 0 obj
+<<
+/Length 520
+/Filter /FlateDecode
+/Subtype /CIDFontType0C
+>>
+stream
+H|OhAgjv5bA]R{1?J5`,j,Ke۝k0MRW#DA APE Bj($"^>}= 2
+endstream
+endobj
+226 0 obj
+<<
+/Length 597
+/ID [<20356CAF1EA8E546BE7E22ACA2CA4797> <A6C79E772A68E946B1318464DC3158E1>]
+/Info 8 0 R
+/Root 1 0 R
+/Type /XRef
+/Size 227
+/Index [0 226]
+/W [1 3 0]
+/Filter /FlateDecode
+>>
+stream
+x ]hu9f;i624Z 1@g۳gE7V,<laJ *Th<:^n뺯w_!@~%OKujV$<*$ۄ';ByT* ϔ6K(!<_PRcPlmr viû[u j>NCK9= GKqnƙ=c/_ uG}}ګZt:S+5
+mоKe=g=g=w:tD?|M_kvCjwгQ|MizSN?B_2/~?U\t ~}8aw~çdwu F5QgNk8i78Ym^fo'9Ήω #SĦ??[Ɖ=;mYb{fB̽Z&v3Z$va%vmV~&voT~"lP/o_޾^zktQDo}E(RZ 2m!M$Ud2I_)kj[e$%GnT'ڡ.r]#]iЙ
+endstream
+endobj
+startxref
+360498
+%%EOF
diff --git a/semestr-2/topo/FraMalCzęść1.pdf b/semestr-2/topo/FraMalCzęść1.pdf
new file mode 100644
index 0000000..1be118c
--- /dev/null
+++ b/semestr-2/topo/FraMalCzęść1.pdf
Binary files differ
diff --git a/semestr-2/topo/FraMalCzęść2.pdf b/semestr-2/topo/FraMalCzęść2.pdf
new file mode 100644
index 0000000..4b52abf
--- /dev/null
+++ b/semestr-2/topo/FraMalCzęść2.pdf
Binary files differ
diff --git a/semestr-2/topo/Topologia2_Franciszek_Malinka.pdf b/semestr-2/topo/Topologia2_Franciszek_Malinka.pdf
new file mode 100644
index 0000000..299d001
--- /dev/null
+++ b/semestr-2/topo/Topologia2_Franciszek_Malinka.pdf
Binary files differ
diff --git a/semestr-2/topo/zad1a.jpg b/semestr-2/topo/zad1a.jpg
new file mode 100644
index 0000000..062fa49
--- /dev/null
+++ b/semestr-2/topo/zad1a.jpg
Binary files differ
diff --git a/semestr-2/topo/zad1aa.jpg b/semestr-2/topo/zad1aa.jpg
new file mode 100644
index 0000000..7a56efb
--- /dev/null
+++ b/semestr-2/topo/zad1aa.jpg
Binary files differ
diff --git a/semestr-2/topo/zad1b.jpg b/semestr-2/topo/zad1b.jpg
new file mode 100644
index 0000000..6cc23fa
--- /dev/null
+++ b/semestr-2/topo/zad1b.jpg
Binary files differ
diff --git a/semestr-2/topo/zad1c.jpg b/semestr-2/topo/zad1c.jpg
new file mode 100644
index 0000000..62722b9
--- /dev/null
+++ b/semestr-2/topo/zad1c.jpg
Binary files differ
diff --git a/semestr-2/topo/zad2a.jpg b/semestr-2/topo/zad2a.jpg
new file mode 100644
index 0000000..d3c8cd4
--- /dev/null
+++ b/semestr-2/topo/zad2a.jpg
Binary files differ
diff --git a/semestr-2/topo/zad2bc.jpg b/semestr-2/topo/zad2bc.jpg
new file mode 100644
index 0000000..1feefd1
--- /dev/null
+++ b/semestr-2/topo/zad2bc.jpg
Binary files differ
diff --git a/semestr-2/topo/zad2da.jpg b/semestr-2/topo/zad2da.jpg
new file mode 100644
index 0000000..fad050d
--- /dev/null
+++ b/semestr-2/topo/zad2da.jpg
Binary files differ
diff --git a/semestr-2/topo/zad2db.jpg b/semestr-2/topo/zad2db.jpg
new file mode 100644
index 0000000..ca8122c
--- /dev/null
+++ b/semestr-2/topo/zad2db.jpg
Binary files differ
diff --git a/semestr-2/topo/zad2dc.jpg b/semestr-2/topo/zad2dc.jpg
new file mode 100644
index 0000000..bd8ee14
--- /dev/null
+++ b/semestr-2/topo/zad2dc.jpg
Binary files differ
diff --git a/semestr-2/topo/zad2dd.jpg b/semestr-2/topo/zad2dd.jpg
new file mode 100644
index 0000000..709e10c
--- /dev/null
+++ b/semestr-2/topo/zad2dd.jpg
Binary files differ